diff --git a/ASSET-LICENSE.md b/ASSET-LICENSE.md index 9519836..c438995 100644 --- a/ASSET-LICENSE.md +++ b/ASSET-LICENSE.md @@ -1,15 +1,15 @@ -# straywild Asset License 1.1 +# NETfishing Asset License 1.1 Copyright © 2026 Woofmeow. All rights reserved except for the permissions expressly granted below. ## 1. Scope -This license applies to original straywild artwork, graphics, textures, +This license applies to original NETfishing artwork, graphics, textures, models, animations, music, sound recordings, narrative content, visual -designs, characters, and other creative assets owned by the straywild owners +designs, characters, and other creative assets owned by the NETfishing owners or licensed to them with authority to sublicense, publishing as Woofmeow (the -**“straywild Assets”**). +**“NETfishing Assets”**). It does not apply to: @@ -17,77 +17,77 @@ It does not apply to: - third-party material identified in the source repository's `docs/ATTRIBUTION.md` or the packaged `ATTRIBUTION.md` notice; - material accompanied by a different license; or -- the straywild and Woofmeow names and logos, which are addressed in +- the NETfishing and Woofmeow names and logos, which are addressed in `TRADEMARKS.md`. Repository location alone does not change third-party ownership or licensing. ## 2. Definitions -**Official straywild Software** means: +**Official NETfishing Software** means: -- an unmodified binary release published by the straywild owners through an - official straywild distribution channel; or -- a build made from an unmodified official straywild source release or tagged +- an unmodified binary release published by the NETfishing owners through an + official NETfishing distribution channel; or +- a build made from an unmodified official NETfishing source release or tagged revision. **Mod** means a non-standalone add-on created to operate with Official -straywild Software. A Mod may add, replace, or alter content loaded by the -Official straywild Software, but it may not redistribute a replacement copy +NETfishing Software. A Mod may add, replace, or alter content loaded by the +Official NETfishing Software, but it may not redistribute a replacement copy of the game or represent a fork, clone, sequel, or separate game. **Contribution Fork** means a source-control fork or clone of an official -straywild source repository that is created and maintained in good faith +NETfishing source repository that is created and maintained in good faith primarily to prepare, test, review, or submit changes for possible inclusion -in Official straywild Software. It does not include a fork presented or +in Official NETfishing Software. It does not include a fork presented or developed as an independent game, community edition, replacement distribution, -or ongoing product separate from the official straywild project. +or ongoing product separate from the official NETfishing project. ## 3. Permission to use the official game -You may reproduce straywild Assets as technically necessary to install, run, -back up, and privately modify a lawfully obtained copy of Official straywild +You may reproduce NETfishing Assets as technically necessary to install, run, +back up, and privately modify a lawfully obtained copy of Official NETfishing Software. You may capture, publish, and monetize screenshots, gameplay videos, livestreams, reviews, tutorials, and similar commentary showing a lawfully -obtained copy of straywild. This permission does not authorize redistribution +obtained copy of NETfishing. This permission does not authorize redistribution of the source asset files or imply endorsement. ## 4. Community Mod license -Subject to this license, you may create, modify, and distribute straywild -Assets solely as part of a Mod for Official straywild Software. +Subject to this license, you may create, modify, and distribute NETfishing +Assets solely as part of a Mod for Official NETfishing Software. This permission is worldwide, nonexclusive, royalty-free, and available for as long as you comply with this license. It permits only the copies of -straywild Assets reasonably necessary for the Mod to function. It does not +NETfishing Assets reasonably necessary for the Mod to function. It does not permit distributing the original game, a substantially complete collection of its assets, or a general-purpose asset pack. A distributed Mod must: -1. require a separately obtained copy of Official straywild Software; +1. require a separately obtained copy of Official NETfishing Software; 2. be presented as unofficial community content; 3. include the following notice in its documentation or distribution page: - > Contains or adapts straywild assets © 2026 Woofmeow, used under the - > straywild Asset License 1.1. This Mod is unofficial and is not endorsed + > Contains or adapts NETfishing assets © 2026 Woofmeow, used under the + > NETfishing Asset License 1.1. This Mod is unofficial and is not endorsed > by Woofmeow. -4. identify material created by the Mod author separately from straywild +4. identify material created by the Mod author separately from NETfishing Assets; and 5. comply with `TRADEMARKS.md`. Mods may be shared without charge and may accept voluntary donations that do not purchase access, features, or preferential treatment. Selling a Mod, -charging for access to it, licensing it commercially, or using straywild +charging for access to it, licensing it commercially, or using NETfishing Assets in paid products requires separate written permission from both -straywild owners. +NETfishing owners. ## 5. Contribution Fork license -Subject to this license, you may reproduce, modify, and distribute straywild +Subject to this license, you may reproduce, modify, and distribute NETfishing Assets within a Contribution Fork. You may also make the nonpublic builds reasonably necessary to develop, test, and review its proposed contribution. @@ -99,8 +99,8 @@ fork are permitted distributions. A Contribution Fork must: 1. remain primarily directed toward preparing changes for possible inclusion - in the official straywild project; -2. preserve this license and the official straywild project's applicable + in the official NETfishing project; +2. preserve this license and the official NETfishing project's applicable attribution, third-party license, and copyright notices; 3. remain visibly linked to or identified as a fork of the official source repository and not be presented as official or endorsed; @@ -109,63 +109,63 @@ A Contribution Fork must: contribution; 5. not publish general-audience binaries, releases, packages, or downloads, operate a persistent public alternative service, or monetize access; -6. not distribute the straywild Assets as a standalone extraction, archive, +6. not distribute the NETfishing Assets as a standalone extraction, archive, or general-purpose asset pack; and 7. comply with `TRADEMARKS.md`. Temporary access-controlled servers may be operated when reasonably necessary to test a proposed contribution. They may not be promoted or maintained as a -public alternative to Official straywild Software or its services. +public alternative to Official NETfishing Software or its services. Submitting work from a Contribution Fork is governed separately by -`CONTRIBUTOR-TERMS.md` and does not require the straywild owners to accept the +`CONTRIBUTOR-TERMS.md` and does not require the NETfishing owners to accept the work. Declining or closing a proposed contribution does not retroactively invalidate good-faith use under this section. A compliant Contribution Fork may remain publicly accessible as an archival development record, but it may not be repurposed for continued development or distribution of a separate -product containing straywild Assets. +product containing NETfishing Assets. ## 6. Uses not permitted Except as expressly permitted by Sections 3, 4, and 5 or by separate written -permission from both straywild owners, you may not use or distribute -straywild Assets: +permission from both NETfishing owners, you may not use or distribute +NETfishing Assets: - in a fork, clone, remake, sequel, or standalone game that is not a qualifying Contribution Fork; -- with a modified distribution of the GPL-covered straywild code that is not - Official straywild Software, except for nonpublic contribution-testing +- with a modified distribution of the GPL-covered NETfishing code that is not + Official NETfishing Software, except for nonpublic contribution-testing builds permitted by Section 5; - in another game, application, asset library, template, or merchandise; - as a substantially complete asset extraction or archive; - in a way that implies sponsorship, endorsement, or official status; - to register a confusingly similar trademark, domain, account, or product identity; or -- under terms that claim ownership of the straywild Assets themselves. +- under terms that claim ownership of the NETfishing Assets themselves. The GPL permits forks and redistribution of the GPL-covered code. Except for a qualifying Contribution Fork under Section 5, this asset license does not -permit those forks to carry straywild Assets. A code fork that is not a -Contribution Fork must remove or replace the straywild Assets and reserved +permit those forks to carry NETfishing Assets. A code fork that is not a +Contribution Fork must remove or replace the NETfishing Assets and reserved branding unless both owners grant separate written permission. ## 7. Ownership of Mods and contribution work You retain ownership of your original Mod material and original material -created in a Contribution Fork. The straywild owners retain ownership of the -straywild Assets and adaptations of those assets to the extent provided by +created in a Contribution Fork. The NETfishing owners retain ownership of the +NETfishing Assets and adaptations of those assets to the extent provided by applicable law. This license does not require you to assign or submit your original material. -It also does not grant you ownership of the underlying straywild Assets. If -you intentionally submit material for inclusion in straywild, +It also does not grant you ownership of the underlying NETfishing Assets. If +you intentionally submit material for inclusion in NETfishing, `CONTRIBUTOR-TERMS.md` applies separately. ## 8. Termination and cure Your permissions under this license terminate automatically if you violate its terms. They are reinstated provisionally when you stop the violation and -permanently if both straywild owners do not notify you of the violation +permanently if both NETfishing owners do not notify you of the violation within sixty days after it has been cured. Termination does not limit remedies available for activity outside this @@ -173,15 +173,15 @@ license. ## 9. No warranty -THE straywild ASSETS ARE PROVIDED “AS IS,” WITHOUT WARRANTY OF ANY KIND, +THE NETFISHING ASSETS ARE PROVIDED “AS IS,” WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, OR NON-INFRINGEMENT. TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE OWNERS WILL NOT BE LIABLE FOR ANY CLAIM, DAMAGES, OR -OTHER LIABILITY ARISING FROM THIS LICENSE OR USE OF THE straywild ASSETS. +OTHER LIABILITY ARISING FROM THIS LICENSE OR USE OF THE NETFISHING ASSETS. ## 10. Additional permission -Uses not granted here require written permission from both straywild owners. +Uses not granted here require written permission from both NETfishing owners. A permission granted to one person or project does not amend this license for others. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2dc5724..7017110 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contribution policy -straywild is an owner-directed Woofmeow project and is not accepting +NETfishing is an owner-directed Woofmeow project and is not accepting unsolicited contributions. Please do not submit pull requests, patches, code, artwork, models, audio, writing, documentation, translations, designs, or other implementation work. Pull requests are disabled for the official @@ -17,7 +17,7 @@ work; it is not a standing invitation to contribute. ## Contribution forks -The [straywild Asset License](ASSET-LICENSE.md) contains limited permissions +The [NETfishing Asset License](ASSET-LICENSE.md) contains limited permissions for qualifying Contribution Forks. Those permissions do not promise review or acceptance and do not override the policy above. Keep the hosting platform's fork relationship visible, preserve all license and attribution notices, and @@ -79,4 +79,4 @@ using display strings as persistent identifiers. New standalone source files should use `SPDX-License-Identifier: GPL-3.0-or-later` where the file format permits comments. Do not add that -identifier to asset files governed by the straywild Asset License. +identifier to asset files governed by the NETfishing Asset License. diff --git a/CONTRIBUTOR-TERMS.md b/CONTRIBUTOR-TERMS.md index 261de60..e0d801a 100644 --- a/CONTRIBUTOR-TERMS.md +++ b/CONTRIBUTOR-TERMS.md @@ -1,6 +1,6 @@ -# straywild contributor terms +# NETfishing contributor terms -straywild does not accept unsolicited contributions. These terms are retained +NETfishing does not accept unsolicited contributions. These terms are retained as the governing record for contributions previously accepted after their publication and for specific future work that both Owners expressly invite in writing before submission. They are not a request or standing invitation for @@ -9,9 +9,9 @@ patches, pull requests, assets, or other material. These terms do not retroactively change ownership of earlier work or replace a separately signed agreement. -“Owners” means the two straywild co-owners who publish the Project as +“Owners” means the two NETfishing co-owners who publish the Project as Woofmeow and are publicly credited as Voyager and Endeavour. “Project” means -the official straywild game, its servers, tools, documentation, websites, +the official NETfishing game, its servers, tools, documentation, websites, ports, updates, and promotional materials. ## 1. Your ownership and authority @@ -56,8 +56,8 @@ royalty-free, transferable, and sublicensable license to: - license it to Project users under `ASSET-LICENSE.md` or a later Project asset license jointly approved by the Owners. -This grant is limited to straywild, its promotion, and official successor or -derived straywild products. It does not transfer your copyright or authorize +This grant is limited to NETfishing, its promotion, and official successor or +derived NETfishing products. It does not transfer your copyright or authorize the Owners to sell your contribution as an unrelated standalone asset. ## 4. Documentation accompanying code @@ -78,7 +78,7 @@ or release. ## 6. No automatic ownership, employment, or payment -Submitting a contribution does not provide ownership of straywild, create an +Submitting a contribution does not provide ownership of NETfishing, create an employment, agency, partnership, or fiduciary relationship, or create a right to compensation. Any payment, ownership, or employment arrangement requires a separate written agreement signed by the appropriate parties. diff --git a/README.md b/README.md index e228e7b..132b3f8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# straywild +# NETfishing -straywild is a multiplayer-first fishing game built with Godot 4.7. The +NETfishing is a multiplayer-first fishing game built with Godot 4.7. The current pre-alpha includes host-authoritative fishing and economy flows, freshwater and saltwater habitats, persistent player data, social features, customization, jobs, and a controller-aware interface. @@ -8,39 +8,39 @@ customization, jobs, and a controller-aware interface. The project is under active development. Interfaces, balance, content, and save migrations may continue to change before a stable release. -straywild is developed and published by **Woofmeow**, the independent team of +NETfishing is developed and published by **Woofmeow**, the independent team of co-owners publicly credited as Voyager and Endeavour. ## Links Patreon: https://www.patreon.com/cw/woofmeowgames -Steam: https://store.steampowered.com/app/5068950/straywild/ +Steam: https://store.steampowered.com/app/5068950/NETfishing/ -Itch.io: https://sol6-vi.itch.io/straywild +Itch.io: https://sol6-vi.itch.io/netfishing Discord: https://discord.gg/5gP22447kc -Matrix: https://matrix.to/#/#straywild:matrix.makearmy.io +Matrix: https://matrix.to/#/#netfishing:matrix.makearmy.io -Repo: https://forge.makearmy.io/woofmeow/straywild +Repo: https://forge.makearmy.io/woofmeow/netfishing -Releases: https://forge.makearmy.io/woofmeow/straywild/releases +Releases: https://forge.makearmy.io/woofmeow/netfishing/releases ## Installing release builds Download and extract the archive for your platform from the official release -page, then run straywild from the extracted platform folder. +page, then run NETfishing from the extracted platform folder. ### macOS Current macOS builds are not signed or notarized. macOS may block the first -launch because it cannot verify the developer. Control-click the straywild +launch because it cannot verify the developer. Control-click the NETfishing application, choose **Open**, then confirm **Open**. If that option is not available, attempt to open the application once, then use **System Settings → Privacy & Security → Open Anyway**. -Only bypass this warning for a straywild build downloaded from an official +Only bypass this warning for a NETfishing build downloaded from an official project release. ## Requirements @@ -110,10 +110,10 @@ world and UI authoring, and testing are consolidated in - Project-owned software code is licensed under [GPL-3.0-or-later](LICENSE). - Project-owned artwork, models, music, and other creative assets are covered - by the [straywild Asset License](ASSET-LICENSE.md). It permits community - Mods for official straywild software and narrowly scoped contribution forks, + by the [NETfishing Asset License](ASSET-LICENSE.md). It permits community + Mods for official NETfishing software and narrowly scoped contribution forks, but not independent forks, clones, or unrelated products. -- The straywild and Woofmeow names and branding are reserved as described in +- The NETfishing and Woofmeow names and branding are reserved as described in [TRADEMARKS.md](TRADEMARKS.md). - Third-party materials retain their own terms; see the consolidated [credits, notices, and provenance record](docs/ATTRIBUTION.md). diff --git a/TRADEMARKS.md b/TRADEMARKS.md index fbf49d5..363248b 100644 --- a/TRADEMARKS.md +++ b/TRADEMARKS.md @@ -1,7 +1,7 @@ -# straywild and Woofmeow branding +# NETfishing and Woofmeow branding -The straywild and Woofmeow names, logos, icons, trade dress, and other source -identifiers are reserved by the straywild owners, publishing as Woofmeow. +The NETfishing and Woofmeow names, logos, icons, trade dress, and other source +identifiers are reserved by the NETfishing owners, publishing as Woofmeow. Their presence in a GPL-licensed repository does not grant trademark rights or imply permission to represent another product as official. @@ -10,30 +10,30 @@ exist through use and other law. ## Permitted references -You may use the names straywild and Woofmeow truthfully to: +You may use the names NETfishing and Woofmeow truthfully to: - refer to the official game or development team; -- state that software interoperates with or is a Mod for straywild; +- state that software interoperates with or is a Mod for NETfishing; - link to an official repository or distribution page; and - discuss, review, criticize, or report on the Project. Use only the amount of branding reasonably necessary to identify the Project. Do not imply sponsorship, certification, endorsement, or official status. -An unofficial Mod may use wording such as “Example Mod for straywild” if its +An unofficial Mod may use wording such as “Example Mod for NETfishing” if its name and presentation remain clearly distinct and it displays an unofficial notice. ## Contribution forks A qualifying Contribution Fork under `ASSET-LICENSE.md` may retain the -straywild and Woofmeow names, logos, icons, and trade dress already present in +NETfishing and Woofmeow names, logos, icons, and trade dress already present in the official source repository solely as necessary to reproduce, modify, and test the Project while preparing a proposed contribution. The source-control host's visible fork relationship or an equivalent repository notice must make its unofficial contribution purpose clear. -This permission does not allow a Contribution Fork to use straywild or +This permission does not allow a Contribution Fork to use NETfishing or Woofmeow branding to advertise a public build, release, service, community edition, or independent product. It does not imply acceptance, sponsorship, endorsement, or official status. @@ -44,7 +44,7 @@ The GNU GPL permits forks and redistribution of covered code. A fork or modified distribution that is not a qualifying Contribution Fork must: - use a distinct product name; -- remove straywild and Woofmeow logos, icons, and official trade dress; +- remove NETfishing and Woofmeow logos, icons, and official trade dress; - avoid confusingly similar names, domains, package identifiers, and account names; and - clearly identify itself as independent and unofficial. @@ -53,4 +53,4 @@ These branding terms do not limit rights granted by the GPL to the software code or lawful nominative, descriptive, comparative, or fair use. Permission for broader branding use must be obtained in writing from both -straywild owners. +NETfishing owners. diff --git a/addons/netfishing_shoreline_baker/plugin.cfg b/addons/netfishing_shoreline_baker/plugin.cfg new file mode 100644 index 0000000..c8c4d06 --- /dev/null +++ b/addons/netfishing_shoreline_baker/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="NETfishing Shoreline Auto-Baker" +description="Rebuilds configured static shoreline ribbons after authored terrain reimports." +author="woofmeow" +version="1.0.0" +script="shoreline_auto_baker.gd" diff --git a/addons/netfishing_shoreline_baker/shoreline_auto_baker.gd b/addons/netfishing_shoreline_baker/shoreline_auto_baker.gd new file mode 100644 index 0000000..18da4af --- /dev/null +++ b/addons/netfishing_shoreline_baker/shoreline_auto_baker.gd @@ -0,0 +1,66 @@ +@tool +extends EditorPlugin + +const TERRAIN_RESOURCE := ( + "res://art/exported/environment/terrain/starter_island.glb" +) +const REGION_SCENE := "res://world/regions/starter_island_region.tscn" + +var _bake_pending := false + + +func _enter_tree() -> void: + var filesystem := get_editor_interface().get_resource_filesystem() + if not filesystem.resources_reimported.is_connected(_on_resources_reimported): + filesystem.resources_reimported.connect(_on_resources_reimported) + + +func _exit_tree() -> void: + var filesystem := get_editor_interface().get_resource_filesystem() + if filesystem.resources_reimported.is_connected(_on_resources_reimported): + filesystem.resources_reimported.disconnect(_on_resources_reimported) + + +func _on_resources_reimported(resources: PackedStringArray) -> void: + if not resources.has(TERRAIN_RESOURCE) or _bake_pending: + return + _bake_pending = true + call_deferred("_bake_configured_shorelines") + + +func _bake_configured_shorelines() -> void: + _bake_pending = false + var packed_region := ResourceLoader.load( + REGION_SCENE, + "PackedScene", + ResourceLoader.CACHE_MODE_REPLACE, + ) as PackedScene + if packed_region == null: + push_error("Shoreline auto-bake could not load %s." % REGION_SCENE) + return + var region := packed_region.instantiate() as Node3D + add_child(region) + var baker := region.get_node_or_null( + "ShorelineRibbonBaker" + ) as ShorelineRibbonBaker + if baker == null: + push_error("Shoreline auto-bake found no configured baker.") + region.queue_free() + return + var results := baker.rebuild_all() + for result: Dictionary in results: + if result.get("skipped", false): + continue + var output_path: String = result.get("output_path", "") + if not output_path.is_empty(): + ResourceLoader.load( + output_path, + "ArrayMesh", + ResourceLoader.CACHE_MODE_REPLACE, + ) + print( + "Shoreline auto-bake: %s, %d loops, %d triangles" + % [output_path, result.loop_count, result.triangle_count] + ) + region.queue_free() + get_editor_interface().get_resource_filesystem().scan() diff --git a/addons/netfishing_shoreline_baker/shoreline_auto_baker.gd.uid b/addons/netfishing_shoreline_baker/shoreline_auto_baker.gd.uid new file mode 100644 index 0000000..a143fcb --- /dev/null +++ b/addons/netfishing_shoreline_baker/shoreline_auto_baker.gd.uid @@ -0,0 +1 @@ +uid://cbk4xpalei5v3 diff --git a/art/exported/characters/base/straywild_base_character.glb b/art/exported/characters/base/netfishing_base_character.glb similarity index 100% rename from art/exported/characters/base/straywild_base_character.glb rename to art/exported/characters/base/netfishing_base_character.glb diff --git a/art/exported/characters/base/straywild_base_character.glb.import b/art/exported/characters/base/netfishing_base_character.glb.import similarity index 77% rename from art/exported/characters/base/straywild_base_character.glb.import rename to art/exported/characters/base/netfishing_base_character.glb.import index 96925de..b1409e1 100644 --- a/art/exported/characters/base/straywild_base_character.glb.import +++ b/art/exported/characters/base/netfishing_base_character.glb.import @@ -4,12 +4,12 @@ importer="scene" importer_version=1 type="PackedScene" uid="uid://w7n4gjqq1juc" -path="res://.godot/imported/straywild_base_character.glb-65021653e51a906d3b4a3494f170317f.scn" +path="res://.godot/imported/netfishing_base_character.glb-0167c087f16181d405afb962dc877d2c.scn" [deps] -source_file="res://art/exported/characters/base/straywild_base_character.glb" -dest_files=["res://.godot/imported/straywild_base_character.glb-65021653e51a906d3b4a3494f170317f.scn"] +source_file="res://art/exported/characters/base/netfishing_base_character.glb" +dest_files=["res://.godot/imported/netfishing_base_character.glb-0167c087f16181d405afb962dc877d2c.scn"] [params] diff --git a/art/exported/characters/base/straywild_base_character_eyes_simple_shine.png b/art/exported/characters/base/netfishing_base_character_eyes_simple_shine.png similarity index 100% rename from art/exported/characters/base/straywild_base_character_eyes_simple_shine.png rename to art/exported/characters/base/netfishing_base_character_eyes_simple_shine.png diff --git a/art/exported/characters/base/straywild_base_character_eyes_simple_shine.png.import b/art/exported/characters/base/netfishing_base_character_eyes_simple_shine.png.import similarity index 58% rename from art/exported/characters/base/straywild_base_character_eyes_simple_shine.png.import rename to art/exported/characters/base/netfishing_base_character_eyes_simple_shine.png.import index ddf8bb7..4141bca 100644 --- a/art/exported/characters/base/straywild_base_character_eyes_simple_shine.png.import +++ b/art/exported/characters/base/netfishing_base_character_eyes_simple_shine.png.import @@ -3,8 +3,8 @@ importer="texture" type="CompressedTexture2D" uid="uid://dyjwgkgw0syo8" -path.s3tc="res://.godot/imported/straywild_base_character_eyes_simple_shine.png-200a946ddace2078bbe44addb4e4524c.s3tc.ctex" -path.etc2="res://.godot/imported/straywild_base_character_eyes_simple_shine.png-200a946ddace2078bbe44addb4e4524c.etc2.ctex" +path.s3tc="res://.godot/imported/netfishing_base_character_eyes_simple_shine.png-140bfa3aa0b6f662e8ff9e5721213a61.s3tc.ctex" +path.etc2="res://.godot/imported/netfishing_base_character_eyes_simple_shine.png-140bfa3aa0b6f662e8ff9e5721213a61.etc2.ctex" metadata={ "imported_formats": ["s3tc_bptc", "etc2_astc"], "vram_texture": true @@ -15,8 +15,8 @@ generator_parameters={ [deps] -source_file="res://art/exported/characters/base/straywild_base_character_eyes_simple_shine.png" -dest_files=["res://.godot/imported/straywild_base_character_eyes_simple_shine.png-200a946ddace2078bbe44addb4e4524c.s3tc.ctex", "res://.godot/imported/straywild_base_character_eyes_simple_shine.png-200a946ddace2078bbe44addb4e4524c.etc2.ctex"] +source_file="res://art/exported/characters/base/netfishing_base_character_eyes_simple_shine.png" +dest_files=["res://.godot/imported/netfishing_base_character_eyes_simple_shine.png-140bfa3aa0b6f662e8ff9e5721213a61.s3tc.ctex", "res://.godot/imported/netfishing_base_character_eyes_simple_shine.png-140bfa3aa0b6f662e8ff9e5721213a61.etc2.ctex"] [params] diff --git a/art/exported/characters/base/straywild_base_character_mouth_three.png b/art/exported/characters/base/netfishing_base_character_mouth_three.png similarity index 100% rename from art/exported/characters/base/straywild_base_character_mouth_three.png rename to art/exported/characters/base/netfishing_base_character_mouth_three.png diff --git a/art/exported/characters/base/straywild_base_character_mouth_three.png.import b/art/exported/characters/base/netfishing_base_character_mouth_three.png.import similarity index 59% rename from art/exported/characters/base/straywild_base_character_mouth_three.png.import rename to art/exported/characters/base/netfishing_base_character_mouth_three.png.import index ba0ec2c..10d0721 100644 --- a/art/exported/characters/base/straywild_base_character_mouth_three.png.import +++ b/art/exported/characters/base/netfishing_base_character_mouth_three.png.import @@ -3,8 +3,8 @@ importer="texture" type="CompressedTexture2D" uid="uid://dt5gitdtjdvcd" -path.s3tc="res://.godot/imported/straywild_base_character_mouth_three.png-5bcf329b31a11eff496760a63e62d0e2.s3tc.ctex" -path.etc2="res://.godot/imported/straywild_base_character_mouth_three.png-5bcf329b31a11eff496760a63e62d0e2.etc2.ctex" +path.s3tc="res://.godot/imported/netfishing_base_character_mouth_three.png-90b4a98403d2a291a56a8ed42aaa8473.s3tc.ctex" +path.etc2="res://.godot/imported/netfishing_base_character_mouth_three.png-90b4a98403d2a291a56a8ed42aaa8473.etc2.ctex" metadata={ "imported_formats": ["s3tc_bptc", "etc2_astc"], "vram_texture": true @@ -15,8 +15,8 @@ generator_parameters={ [deps] -source_file="res://art/exported/characters/base/straywild_base_character_mouth_three.png" -dest_files=["res://.godot/imported/straywild_base_character_mouth_three.png-5bcf329b31a11eff496760a63e62d0e2.s3tc.ctex", "res://.godot/imported/straywild_base_character_mouth_three.png-5bcf329b31a11eff496760a63e62d0e2.etc2.ctex"] +source_file="res://art/exported/characters/base/netfishing_base_character_mouth_three.png" +dest_files=["res://.godot/imported/netfishing_base_character_mouth_three.png-90b4a98403d2a291a56a8ed42aaa8473.s3tc.ctex", "res://.godot/imported/netfishing_base_character_mouth_three.png-90b4a98403d2a291a56a8ed42aaa8473.etc2.ctex"] [params] diff --git a/art/exported/characters/base/straywild_base_character_nose_dog_round.png b/art/exported/characters/base/netfishing_base_character_nose_dog_round.png similarity index 100% rename from art/exported/characters/base/straywild_base_character_nose_dog_round.png rename to art/exported/characters/base/netfishing_base_character_nose_dog_round.png diff --git a/art/exported/characters/base/straywild_base_character_nose_dog_round.png.import b/art/exported/characters/base/netfishing_base_character_nose_dog_round.png.import similarity index 59% rename from art/exported/characters/base/straywild_base_character_nose_dog_round.png.import rename to art/exported/characters/base/netfishing_base_character_nose_dog_round.png.import index cb2c573..71d25b6 100644 --- a/art/exported/characters/base/straywild_base_character_nose_dog_round.png.import +++ b/art/exported/characters/base/netfishing_base_character_nose_dog_round.png.import @@ -3,8 +3,8 @@ importer="texture" type="CompressedTexture2D" uid="uid://bmho1ryst3smt" -path.s3tc="res://.godot/imported/straywild_base_character_nose_dog_round.png-e6909a2c139cf4a2748c2b79d1e12d92.s3tc.ctex" -path.etc2="res://.godot/imported/straywild_base_character_nose_dog_round.png-e6909a2c139cf4a2748c2b79d1e12d92.etc2.ctex" +path.s3tc="res://.godot/imported/netfishing_base_character_nose_dog_round.png-0008adff5271dd0403e610ef13dd52cf.s3tc.ctex" +path.etc2="res://.godot/imported/netfishing_base_character_nose_dog_round.png-0008adff5271dd0403e610ef13dd52cf.etc2.ctex" metadata={ "imported_formats": ["s3tc_bptc", "etc2_astc"], "vram_texture": true @@ -15,8 +15,8 @@ generator_parameters={ [deps] -source_file="res://art/exported/characters/base/straywild_base_character_nose_dog_round.png" -dest_files=["res://.godot/imported/straywild_base_character_nose_dog_round.png-e6909a2c139cf4a2748c2b79d1e12d92.s3tc.ctex", "res://.godot/imported/straywild_base_character_nose_dog_round.png-e6909a2c139cf4a2748c2b79d1e12d92.etc2.ctex"] +source_file="res://art/exported/characters/base/netfishing_base_character_nose_dog_round.png" +dest_files=["res://.godot/imported/netfishing_base_character_nose_dog_round.png-0008adff5271dd0403e610ef13dd52cf.s3tc.ctex", "res://.godot/imported/netfishing_base_character_nose_dog_round.png-0008adff5271dd0403e610ef13dd52cf.etc2.ctex"] [params] diff --git a/art/exported/creatures/101.png b/art/exported/creatures/101.png deleted file mode 100644 index e6e431c..0000000 Binary files a/art/exported/creatures/101.png and /dev/null differ diff --git a/art/exported/creatures/101.png.import b/art/exported/creatures/101.png.import deleted file mode 100644 index 3dc8865..0000000 --- a/art/exported/creatures/101.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://x5e744k11k70" -path.s3tc="res://.godot/imported/101.png-81f7f90e29292575c1a9727aa6060fa0.s3tc.ctex" -path.etc2="res://.godot/imported/101.png-81f7f90e29292575c1a9727aa6060fa0.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/101.png" -dest_files=["res://.godot/imported/101.png-81f7f90e29292575c1a9727aa6060fa0.s3tc.ctex", "res://.godot/imported/101.png-81f7f90e29292575c1a9727aa6060fa0.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/102.png b/art/exported/creatures/102.png deleted file mode 100644 index b1b66a6..0000000 Binary files a/art/exported/creatures/102.png and /dev/null differ diff --git a/art/exported/creatures/102.png.import b/art/exported/creatures/102.png.import deleted file mode 100644 index c958e5f..0000000 --- a/art/exported/creatures/102.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://1kla4jewitot" -path.s3tc="res://.godot/imported/102.png-2ab8ac9408a482b1042b6ba3cd3bd718.s3tc.ctex" -path.etc2="res://.godot/imported/102.png-2ab8ac9408a482b1042b6ba3cd3bd718.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/102.png" -dest_files=["res://.godot/imported/102.png-2ab8ac9408a482b1042b6ba3cd3bd718.s3tc.ctex", "res://.godot/imported/102.png-2ab8ac9408a482b1042b6ba3cd3bd718.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/103.png b/art/exported/creatures/103.png deleted file mode 100644 index 98dd618..0000000 Binary files a/art/exported/creatures/103.png and /dev/null differ diff --git a/art/exported/creatures/103.png.import b/art/exported/creatures/103.png.import deleted file mode 100644 index 2972cde..0000000 --- a/art/exported/creatures/103.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cfdsg4tevv0jm" -path.s3tc="res://.godot/imported/103.png-f8985f10e04b19499cd6f5ffbadc83c9.s3tc.ctex" -path.etc2="res://.godot/imported/103.png-f8985f10e04b19499cd6f5ffbadc83c9.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/103.png" -dest_files=["res://.godot/imported/103.png-f8985f10e04b19499cd6f5ffbadc83c9.s3tc.ctex", "res://.godot/imported/103.png-f8985f10e04b19499cd6f5ffbadc83c9.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/104.png b/art/exported/creatures/104.png deleted file mode 100644 index 09eec3c..0000000 Binary files a/art/exported/creatures/104.png and /dev/null differ diff --git a/art/exported/creatures/104.png.import b/art/exported/creatures/104.png.import deleted file mode 100644 index 01a9393..0000000 --- a/art/exported/creatures/104.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://pgm364g5qlgs" -path.s3tc="res://.godot/imported/104.png-e164f67032648af2cc0a545d2a861c7d.s3tc.ctex" -path.etc2="res://.godot/imported/104.png-e164f67032648af2cc0a545d2a861c7d.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/104.png" -dest_files=["res://.godot/imported/104.png-e164f67032648af2cc0a545d2a861c7d.s3tc.ctex", "res://.godot/imported/104.png-e164f67032648af2cc0a545d2a861c7d.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/105.png b/art/exported/creatures/105.png deleted file mode 100644 index 3ba1000..0000000 Binary files a/art/exported/creatures/105.png and /dev/null differ diff --git a/art/exported/creatures/105.png.import b/art/exported/creatures/105.png.import deleted file mode 100644 index de797a7..0000000 --- a/art/exported/creatures/105.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dwanip2j561n7" -path.s3tc="res://.godot/imported/105.png-a2b440912e59b3375c6e61e17d08287b.s3tc.ctex" -path.etc2="res://.godot/imported/105.png-a2b440912e59b3375c6e61e17d08287b.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/105.png" -dest_files=["res://.godot/imported/105.png-a2b440912e59b3375c6e61e17d08287b.s3tc.ctex", "res://.godot/imported/105.png-a2b440912e59b3375c6e61e17d08287b.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/106.png b/art/exported/creatures/106.png deleted file mode 100644 index 4227b44..0000000 Binary files a/art/exported/creatures/106.png and /dev/null differ diff --git a/art/exported/creatures/106.png.import b/art/exported/creatures/106.png.import deleted file mode 100644 index 3032c38..0000000 --- a/art/exported/creatures/106.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cr7tc11ievso5" -path.s3tc="res://.godot/imported/106.png-306ce449448588714e5a0e883ae441ac.s3tc.ctex" -path.etc2="res://.godot/imported/106.png-306ce449448588714e5a0e883ae441ac.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/106.png" -dest_files=["res://.godot/imported/106.png-306ce449448588714e5a0e883ae441ac.s3tc.ctex", "res://.godot/imported/106.png-306ce449448588714e5a0e883ae441ac.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/107.png b/art/exported/creatures/107.png deleted file mode 100644 index c843bbe..0000000 Binary files a/art/exported/creatures/107.png and /dev/null differ diff --git a/art/exported/creatures/107.png.import b/art/exported/creatures/107.png.import deleted file mode 100644 index c4d28e8..0000000 --- a/art/exported/creatures/107.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c8rf4tnxx8mov" -path.s3tc="res://.godot/imported/107.png-062740d0bdad6e3ac4ecc1cf92ee6b9d.s3tc.ctex" -path.etc2="res://.godot/imported/107.png-062740d0bdad6e3ac4ecc1cf92ee6b9d.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/107.png" -dest_files=["res://.godot/imported/107.png-062740d0bdad6e3ac4ecc1cf92ee6b9d.s3tc.ctex", "res://.godot/imported/107.png-062740d0bdad6e3ac4ecc1cf92ee6b9d.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/201.png b/art/exported/creatures/201.png deleted file mode 100644 index 3994912..0000000 Binary files a/art/exported/creatures/201.png and /dev/null differ diff --git a/art/exported/creatures/201.png.import b/art/exported/creatures/201.png.import deleted file mode 100644 index 9d5decf..0000000 --- a/art/exported/creatures/201.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c0q8o1sc8hlv0" -path.s3tc="res://.godot/imported/201.png-1b2063c63e42271e8f3910da8e3f1277.s3tc.ctex" -path.etc2="res://.godot/imported/201.png-1b2063c63e42271e8f3910da8e3f1277.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/201.png" -dest_files=["res://.godot/imported/201.png-1b2063c63e42271e8f3910da8e3f1277.s3tc.ctex", "res://.godot/imported/201.png-1b2063c63e42271e8f3910da8e3f1277.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/2502.png b/art/exported/creatures/2502.png deleted file mode 100644 index 467431b..0000000 Binary files a/art/exported/creatures/2502.png and /dev/null differ diff --git a/art/exported/creatures/2502.png.import b/art/exported/creatures/2502.png.import deleted file mode 100644 index 17bcad9..0000000 --- a/art/exported/creatures/2502.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://busj0feq2dncu" -path.s3tc="res://.godot/imported/2502.png-3922e306611b91541a86520cf32cbdbd.s3tc.ctex" -path.etc2="res://.godot/imported/2502.png-3922e306611b91541a86520cf32cbdbd.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/2502.png" -dest_files=["res://.godot/imported/2502.png-3922e306611b91541a86520cf32cbdbd.s3tc.ctex", "res://.godot/imported/2502.png-3922e306611b91541a86520cf32cbdbd.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/2504.png b/art/exported/creatures/2504.png deleted file mode 100644 index d0279d8..0000000 Binary files a/art/exported/creatures/2504.png and /dev/null differ diff --git a/art/exported/creatures/2504.png.import b/art/exported/creatures/2504.png.import deleted file mode 100644 index 73fa801..0000000 --- a/art/exported/creatures/2504.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://4a7c1aat4777" -path.s3tc="res://.godot/imported/2504.png-c9f47ab152b933d8158b8c058ec5fcc2.s3tc.ctex" -path.etc2="res://.godot/imported/2504.png-c9f47ab152b933d8158b8c058ec5fcc2.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/2504.png" -dest_files=["res://.godot/imported/2504.png-c9f47ab152b933d8158b8c058ec5fcc2.s3tc.ctex", "res://.godot/imported/2504.png-c9f47ab152b933d8158b8c058ec5fcc2.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/2505.png b/art/exported/creatures/2505.png deleted file mode 100644 index 7463c25..0000000 Binary files a/art/exported/creatures/2505.png and /dev/null differ diff --git a/art/exported/creatures/2505.png.import b/art/exported/creatures/2505.png.import deleted file mode 100644 index 130cedb..0000000 --- a/art/exported/creatures/2505.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://b8u3lw242yr3c" -path.s3tc="res://.godot/imported/2505.png-fe14d70a6372dbe0cc4a8275d0816cad.s3tc.ctex" -path.etc2="res://.godot/imported/2505.png-fe14d70a6372dbe0cc4a8275d0816cad.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/2505.png" -dest_files=["res://.godot/imported/2505.png-fe14d70a6372dbe0cc4a8275d0816cad.s3tc.ctex", "res://.godot/imported/2505.png-fe14d70a6372dbe0cc4a8275d0816cad.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/2508.png b/art/exported/creatures/2508.png deleted file mode 100644 index 4cefefd..0000000 Binary files a/art/exported/creatures/2508.png and /dev/null differ diff --git a/art/exported/creatures/2508.png.import b/art/exported/creatures/2508.png.import deleted file mode 100644 index 0fdbbe4..0000000 --- a/art/exported/creatures/2508.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c2k6ghkng6081" -path.s3tc="res://.godot/imported/2508.png-0478df4a4cb2af8e08ada8086efda0c3.s3tc.ctex" -path.etc2="res://.godot/imported/2508.png-0478df4a4cb2af8e08ada8086efda0c3.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/2508.png" -dest_files=["res://.godot/imported/2508.png-0478df4a4cb2af8e08ada8086efda0c3.s3tc.ctex", "res://.godot/imported/2508.png-0478df4a4cb2af8e08ada8086efda0c3.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/2601.png b/art/exported/creatures/2601.png deleted file mode 100644 index f7565d8..0000000 Binary files a/art/exported/creatures/2601.png and /dev/null differ diff --git a/art/exported/creatures/2601.png.import b/art/exported/creatures/2601.png.import deleted file mode 100644 index 7444643..0000000 --- a/art/exported/creatures/2601.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://d14jvhurcfryb" -path.s3tc="res://.godot/imported/2601.png-912942ea4c6b2c66982e089ee46fde12.s3tc.ctex" -path.etc2="res://.godot/imported/2601.png-912942ea4c6b2c66982e089ee46fde12.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/2601.png" -dest_files=["res://.godot/imported/2601.png-912942ea4c6b2c66982e089ee46fde12.s3tc.ctex", "res://.godot/imported/2601.png-912942ea4c6b2c66982e089ee46fde12.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/2801.png b/art/exported/creatures/2801.png deleted file mode 100644 index ad8294d..0000000 Binary files a/art/exported/creatures/2801.png and /dev/null differ diff --git a/art/exported/creatures/2801.png.import b/art/exported/creatures/2801.png.import deleted file mode 100644 index 512f812..0000000 --- a/art/exported/creatures/2801.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cc7el34sfad78" -path.s3tc="res://.godot/imported/2801.png-d1c5df9faa2d1eb1cc3453c8e18d4049.s3tc.ctex" -path.etc2="res://.godot/imported/2801.png-d1c5df9faa2d1eb1cc3453c8e18d4049.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/2801.png" -dest_files=["res://.godot/imported/2801.png-d1c5df9faa2d1eb1cc3453c8e18d4049.s3tc.ctex", "res://.godot/imported/2801.png-d1c5df9faa2d1eb1cc3453c8e18d4049.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/2802.png b/art/exported/creatures/2802.png deleted file mode 100644 index 4190610..0000000 Binary files a/art/exported/creatures/2802.png and /dev/null differ diff --git a/art/exported/creatures/2802.png.import b/art/exported/creatures/2802.png.import deleted file mode 100644 index 4d014d1..0000000 --- a/art/exported/creatures/2802.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bawecr4tv52p1" -path.s3tc="res://.godot/imported/2802.png-6319ce264fbd950e232fd0b428319265.s3tc.ctex" -path.etc2="res://.godot/imported/2802.png-6319ce264fbd950e232fd0b428319265.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/2802.png" -dest_files=["res://.godot/imported/2802.png-6319ce264fbd950e232fd0b428319265.s3tc.ctex", "res://.godot/imported/2802.png-6319ce264fbd950e232fd0b428319265.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/2803.png b/art/exported/creatures/2803.png deleted file mode 100644 index 6360f26..0000000 Binary files a/art/exported/creatures/2803.png and /dev/null differ diff --git a/art/exported/creatures/2803.png.import b/art/exported/creatures/2803.png.import deleted file mode 100644 index 5096057..0000000 --- a/art/exported/creatures/2803.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cjwm07240ehr2" -path.s3tc="res://.godot/imported/2803.png-c2e31a8adbab3bf9899bc74b3feb4abb.s3tc.ctex" -path.etc2="res://.godot/imported/2803.png-c2e31a8adbab3bf9899bc74b3feb4abb.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/2803.png" -dest_files=["res://.godot/imported/2803.png-c2e31a8adbab3bf9899bc74b3feb4abb.s3tc.ctex", "res://.godot/imported/2803.png-c2e31a8adbab3bf9899bc74b3feb4abb.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/2804.png b/art/exported/creatures/2804.png deleted file mode 100644 index 90952fd..0000000 Binary files a/art/exported/creatures/2804.png and /dev/null differ diff --git a/art/exported/creatures/2804.png.import b/art/exported/creatures/2804.png.import deleted file mode 100644 index e6147c2..0000000 --- a/art/exported/creatures/2804.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dgcrfxo1k4juj" -path.s3tc="res://.godot/imported/2804.png-f86c52a01f04302b057cf526a498e87a.s3tc.ctex" -path.etc2="res://.godot/imported/2804.png-f86c52a01f04302b057cf526a498e87a.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/2804.png" -dest_files=["res://.godot/imported/2804.png-f86c52a01f04302b057cf526a498e87a.s3tc.ctex", "res://.godot/imported/2804.png-f86c52a01f04302b057cf526a498e87a.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/2806.png b/art/exported/creatures/2806.png deleted file mode 100644 index acb930e..0000000 Binary files a/art/exported/creatures/2806.png and /dev/null differ diff --git a/art/exported/creatures/2806.png.import b/art/exported/creatures/2806.png.import deleted file mode 100644 index 9d444cd..0000000 --- a/art/exported/creatures/2806.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c5be8db5ppkq4" -path.s3tc="res://.godot/imported/2806.png-ed0484fec72605166ddb723c1a1bc7d0.s3tc.ctex" -path.etc2="res://.godot/imported/2806.png-ed0484fec72605166ddb723c1a1bc7d0.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/2806.png" -dest_files=["res://.godot/imported/2806.png-ed0484fec72605166ddb723c1a1bc7d0.s3tc.ctex", "res://.godot/imported/2806.png-ed0484fec72605166ddb723c1a1bc7d0.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/2807.png b/art/exported/creatures/2807.png deleted file mode 100644 index 5c2a6da..0000000 Binary files a/art/exported/creatures/2807.png and /dev/null differ diff --git a/art/exported/creatures/2807.png.import b/art/exported/creatures/2807.png.import deleted file mode 100644 index af51ff5..0000000 --- a/art/exported/creatures/2807.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bdus4qo0ebs3e" -path.s3tc="res://.godot/imported/2807.png-aceaf0f586f975d29e318a9513fc3125.s3tc.ctex" -path.etc2="res://.godot/imported/2807.png-aceaf0f586f975d29e318a9513fc3125.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/2807.png" -dest_files=["res://.godot/imported/2807.png-aceaf0f586f975d29e318a9513fc3125.s3tc.ctex", "res://.godot/imported/2807.png-aceaf0f586f975d29e318a9513fc3125.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/3002.png b/art/exported/creatures/3002.png deleted file mode 100644 index 2ae7e73..0000000 Binary files a/art/exported/creatures/3002.png and /dev/null differ diff --git a/art/exported/creatures/3002.png.import b/art/exported/creatures/3002.png.import deleted file mode 100644 index e193cfd..0000000 --- a/art/exported/creatures/3002.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://b68vlgtclvkfg" -path.s3tc="res://.godot/imported/3002.png-a87d71158798b43b6bf702a6e1664b4d.s3tc.ctex" -path.etc2="res://.godot/imported/3002.png-a87d71158798b43b6bf702a6e1664b4d.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/3002.png" -dest_files=["res://.godot/imported/3002.png-a87d71158798b43b6bf702a6e1664b4d.s3tc.ctex", "res://.godot/imported/3002.png-a87d71158798b43b6bf702a6e1664b4d.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/3102.png b/art/exported/creatures/3102.png deleted file mode 100644 index fe4d8fb..0000000 Binary files a/art/exported/creatures/3102.png and /dev/null differ diff --git a/art/exported/creatures/3102.png.import b/art/exported/creatures/3102.png.import deleted file mode 100644 index 47e9c80..0000000 --- a/art/exported/creatures/3102.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c4d3f28rf86bb" -path.s3tc="res://.godot/imported/3102.png-951ca90331737e3057749e1bdbd88c44.s3tc.ctex" -path.etc2="res://.godot/imported/3102.png-951ca90331737e3057749e1bdbd88c44.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/3102.png" -dest_files=["res://.godot/imported/3102.png-951ca90331737e3057749e1bdbd88c44.s3tc.ctex", "res://.godot/imported/3102.png-951ca90331737e3057749e1bdbd88c44.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/3103.png b/art/exported/creatures/3103.png deleted file mode 100644 index 3d3d615..0000000 Binary files a/art/exported/creatures/3103.png and /dev/null differ diff --git a/art/exported/creatures/3103.png.import b/art/exported/creatures/3103.png.import deleted file mode 100644 index 9743e89..0000000 --- a/art/exported/creatures/3103.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cjtncgnb0hcsj" -path.s3tc="res://.godot/imported/3103.png-f3b4b5bb43b7611f7c448dbdfff36375.s3tc.ctex" -path.etc2="res://.godot/imported/3103.png-f3b4b5bb43b7611f7c448dbdfff36375.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/3103.png" -dest_files=["res://.godot/imported/3103.png-f3b4b5bb43b7611f7c448dbdfff36375.s3tc.ctex", "res://.godot/imported/3103.png-f3b4b5bb43b7611f7c448dbdfff36375.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/3104.png b/art/exported/creatures/3104.png deleted file mode 100644 index 425932e..0000000 Binary files a/art/exported/creatures/3104.png and /dev/null differ diff --git a/art/exported/creatures/3104.png.import b/art/exported/creatures/3104.png.import deleted file mode 100644 index fbc70d7..0000000 --- a/art/exported/creatures/3104.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dlme86lrrhyg8" -path.s3tc="res://.godot/imported/3104.png-fa31dd69bf22b484cf3ac0d99197b886.s3tc.ctex" -path.etc2="res://.godot/imported/3104.png-fa31dd69bf22b484cf3ac0d99197b886.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/3104.png" -dest_files=["res://.godot/imported/3104.png-fa31dd69bf22b484cf3ac0d99197b886.s3tc.ctex", "res://.godot/imported/3104.png-fa31dd69bf22b484cf3ac0d99197b886.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/3107.png b/art/exported/creatures/3107.png deleted file mode 100644 index 7dee611..0000000 Binary files a/art/exported/creatures/3107.png and /dev/null differ diff --git a/art/exported/creatures/3107.png.import b/art/exported/creatures/3107.png.import deleted file mode 100644 index 241bac9..0000000 --- a/art/exported/creatures/3107.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://csv1dsgvifh4l" -path.s3tc="res://.godot/imported/3107.png-5b981d56f7094a29a92b2f5035a47b11.s3tc.ctex" -path.etc2="res://.godot/imported/3107.png-5b981d56f7094a29a92b2f5035a47b11.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/3107.png" -dest_files=["res://.godot/imported/3107.png-5b981d56f7094a29a92b2f5035a47b11.s3tc.ctex", "res://.godot/imported/3107.png-5b981d56f7094a29a92b2f5035a47b11.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/3201.png b/art/exported/creatures/3201.png deleted file mode 100644 index bcc639b..0000000 Binary files a/art/exported/creatures/3201.png and /dev/null differ diff --git a/art/exported/creatures/3201.png.import b/art/exported/creatures/3201.png.import deleted file mode 100644 index a8d6a43..0000000 --- a/art/exported/creatures/3201.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cd8u0ow8cqsbh" -path.s3tc="res://.godot/imported/3201.png-846cb0fbb88950bb70d5b03c50a88457.s3tc.ctex" -path.etc2="res://.godot/imported/3201.png-846cb0fbb88950bb70d5b03c50a88457.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/3201.png" -dest_files=["res://.godot/imported/3201.png-846cb0fbb88950bb70d5b03c50a88457.s3tc.ctex", "res://.godot/imported/3201.png-846cb0fbb88950bb70d5b03c50a88457.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/3401.png b/art/exported/creatures/3401.png deleted file mode 100644 index c14c2ae..0000000 Binary files a/art/exported/creatures/3401.png and /dev/null differ diff --git a/art/exported/creatures/3401.png.import b/art/exported/creatures/3401.png.import deleted file mode 100644 index 096d0fb..0000000 --- a/art/exported/creatures/3401.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://begsj5tj035e1" -path.s3tc="res://.godot/imported/3401.png-cd8c7ec154f8248110ec396b3f8a76c9.s3tc.ctex" -path.etc2="res://.godot/imported/3401.png-cd8c7ec154f8248110ec396b3f8a76c9.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/3401.png" -dest_files=["res://.godot/imported/3401.png-cd8c7ec154f8248110ec396b3f8a76c9.s3tc.ctex", "res://.godot/imported/3401.png-cd8c7ec154f8248110ec396b3f8a76c9.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/3902.png b/art/exported/creatures/3902.png deleted file mode 100644 index d231239..0000000 Binary files a/art/exported/creatures/3902.png and /dev/null differ diff --git a/art/exported/creatures/3902.png.import b/art/exported/creatures/3902.png.import deleted file mode 100644 index a8e5440..0000000 --- a/art/exported/creatures/3902.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ddc556gcby50v" -path.s3tc="res://.godot/imported/3902.png-485bc4f9f1a505225bdc037111e32499.s3tc.ctex" -path.etc2="res://.godot/imported/3902.png-485bc4f9f1a505225bdc037111e32499.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/3902.png" -dest_files=["res://.godot/imported/3902.png-485bc4f9f1a505225bdc037111e32499.s3tc.ctex", "res://.godot/imported/3902.png-485bc4f9f1a505225bdc037111e32499.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/3906.png b/art/exported/creatures/3906.png deleted file mode 100644 index 6cc1d1b..0000000 Binary files a/art/exported/creatures/3906.png and /dev/null differ diff --git a/art/exported/creatures/3906.png.import b/art/exported/creatures/3906.png.import deleted file mode 100644 index 9bce5e4..0000000 --- a/art/exported/creatures/3906.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bdmm1jfod7gq0" -path.s3tc="res://.godot/imported/3906.png-39cc349a6d3e716822bc9e12bd0ac7a2.s3tc.ctex" -path.etc2="res://.godot/imported/3906.png-39cc349a6d3e716822bc9e12bd0ac7a2.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/3906.png" -dest_files=["res://.godot/imported/3906.png-39cc349a6d3e716822bc9e12bd0ac7a2.s3tc.ctex", "res://.godot/imported/3906.png-39cc349a6d3e716822bc9e12bd0ac7a2.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/403.png b/art/exported/creatures/403.png deleted file mode 100644 index a1eb283..0000000 Binary files a/art/exported/creatures/403.png and /dev/null differ diff --git a/art/exported/creatures/403.png.import b/art/exported/creatures/403.png.import deleted file mode 100644 index da790e8..0000000 --- a/art/exported/creatures/403.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bypagdb0ollh0" -path.s3tc="res://.godot/imported/403.png-57b9dd64545d97bbd63b86e7f3d61562.s3tc.ctex" -path.etc2="res://.godot/imported/403.png-57b9dd64545d97bbd63b86e7f3d61562.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/403.png" -dest_files=["res://.godot/imported/403.png-57b9dd64545d97bbd63b86e7f3d61562.s3tc.ctex", "res://.godot/imported/403.png-57b9dd64545d97bbd63b86e7f3d61562.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/4101.png b/art/exported/creatures/4101.png deleted file mode 100644 index 74a068b..0000000 Binary files a/art/exported/creatures/4101.png and /dev/null differ diff --git a/art/exported/creatures/4101.png.import b/art/exported/creatures/4101.png.import deleted file mode 100644 index d906da5..0000000 --- a/art/exported/creatures/4101.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bahd6nks2g7ik" -path.s3tc="res://.godot/imported/4101.png-163a8880f3559279d2acc129509430bc.s3tc.ctex" -path.etc2="res://.godot/imported/4101.png-163a8880f3559279d2acc129509430bc.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/4101.png" -dest_files=["res://.godot/imported/4101.png-163a8880f3559279d2acc129509430bc.s3tc.ctex", "res://.godot/imported/4101.png-163a8880f3559279d2acc129509430bc.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/4401.png b/art/exported/creatures/4401.png deleted file mode 100644 index d043f4c..0000000 Binary files a/art/exported/creatures/4401.png and /dev/null differ diff --git a/art/exported/creatures/4401.png.import b/art/exported/creatures/4401.png.import deleted file mode 100644 index 809a146..0000000 --- a/art/exported/creatures/4401.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://7dbcbicxwvlo" -path.s3tc="res://.godot/imported/4401.png-0fd242cb090b49614af9b4d07503b2db.s3tc.ctex" -path.etc2="res://.godot/imported/4401.png-0fd242cb090b49614af9b4d07503b2db.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/4401.png" -dest_files=["res://.godot/imported/4401.png-0fd242cb090b49614af9b4d07503b2db.s3tc.ctex", "res://.godot/imported/4401.png-0fd242cb090b49614af9b4d07503b2db.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/4701.png b/art/exported/creatures/4701.png deleted file mode 100644 index afd6a85..0000000 Binary files a/art/exported/creatures/4701.png and /dev/null differ diff --git a/art/exported/creatures/4701.png.import b/art/exported/creatures/4701.png.import deleted file mode 100644 index 5f4ed32..0000000 --- a/art/exported/creatures/4701.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://do6hcv3omivv5" -path.s3tc="res://.godot/imported/4701.png-dcb44d4ce6dfdc812a2e185e7f9511be.s3tc.ctex" -path.etc2="res://.godot/imported/4701.png-dcb44d4ce6dfdc812a2e185e7f9511be.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/4701.png" -dest_files=["res://.godot/imported/4701.png-dcb44d4ce6dfdc812a2e185e7f9511be.s3tc.ctex", "res://.godot/imported/4701.png-dcb44d4ce6dfdc812a2e185e7f9511be.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/5001.png b/art/exported/creatures/5001.png deleted file mode 100644 index cf39422..0000000 Binary files a/art/exported/creatures/5001.png and /dev/null differ diff --git a/art/exported/creatures/5001.png.import b/art/exported/creatures/5001.png.import deleted file mode 100644 index c87c852..0000000 --- a/art/exported/creatures/5001.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://byil5mr6w3j1q" -path.s3tc="res://.godot/imported/5001.png-ebe37fb8bd4263bb83e36bb5890b5641.s3tc.ctex" -path.etc2="res://.godot/imported/5001.png-ebe37fb8bd4263bb83e36bb5890b5641.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/5001.png" -dest_files=["res://.godot/imported/5001.png-ebe37fb8bd4263bb83e36bb5890b5641.s3tc.ctex", "res://.godot/imported/5001.png-ebe37fb8bd4263bb83e36bb5890b5641.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/5702.png b/art/exported/creatures/5702.png deleted file mode 100644 index aba6b80..0000000 Binary files a/art/exported/creatures/5702.png and /dev/null differ diff --git a/art/exported/creatures/5702.png.import b/art/exported/creatures/5702.png.import deleted file mode 100644 index 527c367..0000000 --- a/art/exported/creatures/5702.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dxwr7yv5h30s" -path.s3tc="res://.godot/imported/5702.png-b0cead42bd9a5851c3f6775a7d0e469e.s3tc.ctex" -path.etc2="res://.godot/imported/5702.png-b0cead42bd9a5851c3f6775a7d0e469e.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/5702.png" -dest_files=["res://.godot/imported/5702.png-b0cead42bd9a5851c3f6775a7d0e469e.s3tc.ctex", "res://.godot/imported/5702.png-b0cead42bd9a5851c3f6775a7d0e469e.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/5901.png b/art/exported/creatures/5901.png deleted file mode 100644 index a75039f..0000000 Binary files a/art/exported/creatures/5901.png and /dev/null differ diff --git a/art/exported/creatures/5901.png.import b/art/exported/creatures/5901.png.import deleted file mode 100644 index e52ad8c..0000000 --- a/art/exported/creatures/5901.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dovitajskavmi" -path.s3tc="res://.godot/imported/5901.png-10c9e77992ad31ce54d34b95a6db6f61.s3tc.ctex" -path.etc2="res://.godot/imported/5901.png-10c9e77992ad31ce54d34b95a6db6f61.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/5901.png" -dest_files=["res://.godot/imported/5901.png-10c9e77992ad31ce54d34b95a6db6f61.s3tc.ctex", "res://.godot/imported/5901.png-10c9e77992ad31ce54d34b95a6db6f61.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/5902.png b/art/exported/creatures/5902.png deleted file mode 100644 index 809057d..0000000 Binary files a/art/exported/creatures/5902.png and /dev/null differ diff --git a/art/exported/creatures/5902.png.import b/art/exported/creatures/5902.png.import deleted file mode 100644 index 2c8a5fb..0000000 --- a/art/exported/creatures/5902.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://0k4qnt7wusam" -path.s3tc="res://.godot/imported/5902.png-e3a13a1e827488fa86f34c2aad883127.s3tc.ctex" -path.etc2="res://.godot/imported/5902.png-e3a13a1e827488fa86f34c2aad883127.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/5902.png" -dest_files=["res://.godot/imported/5902.png-e3a13a1e827488fa86f34c2aad883127.s3tc.ctex", "res://.godot/imported/5902.png-e3a13a1e827488fa86f34c2aad883127.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/5903.png b/art/exported/creatures/5903.png deleted file mode 100644 index 74a8af6..0000000 Binary files a/art/exported/creatures/5903.png and /dev/null differ diff --git a/art/exported/creatures/5903.png.import b/art/exported/creatures/5903.png.import deleted file mode 100644 index 22946e8..0000000 --- a/art/exported/creatures/5903.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bjb8gqbta2oxw" -path.s3tc="res://.godot/imported/5903.png-44743c2e322f48eefaeedcd3defec27d.s3tc.ctex" -path.etc2="res://.godot/imported/5903.png-44743c2e322f48eefaeedcd3defec27d.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/5903.png" -dest_files=["res://.godot/imported/5903.png-44743c2e322f48eefaeedcd3defec27d.s3tc.ctex", "res://.godot/imported/5903.png-44743c2e322f48eefaeedcd3defec27d.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/5904.png b/art/exported/creatures/5904.png deleted file mode 100644 index 924ba4b..0000000 Binary files a/art/exported/creatures/5904.png and /dev/null differ diff --git a/art/exported/creatures/5904.png.import b/art/exported/creatures/5904.png.import deleted file mode 100644 index 23458ae..0000000 --- a/art/exported/creatures/5904.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dtapwjgdbcgr7" -path.s3tc="res://.godot/imported/5904.png-e43ba3245eadac7081a6a23e64ccc940.s3tc.ctex" -path.etc2="res://.godot/imported/5904.png-e43ba3245eadac7081a6a23e64ccc940.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/5904.png" -dest_files=["res://.godot/imported/5904.png-e43ba3245eadac7081a6a23e64ccc940.s3tc.ctex", "res://.godot/imported/5904.png-e43ba3245eadac7081a6a23e64ccc940.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/6001.png b/art/exported/creatures/6001.png deleted file mode 100644 index 9219597..0000000 Binary files a/art/exported/creatures/6001.png and /dev/null differ diff --git a/art/exported/creatures/6001.png.import b/art/exported/creatures/6001.png.import deleted file mode 100644 index a63cf85..0000000 --- a/art/exported/creatures/6001.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c0164i40101lq" -path.s3tc="res://.godot/imported/6001.png-6fd8c3ef0885c466baece687cd24d38d.s3tc.ctex" -path.etc2="res://.godot/imported/6001.png-6fd8c3ef0885c466baece687cd24d38d.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/6001.png" -dest_files=["res://.godot/imported/6001.png-6fd8c3ef0885c466baece687cd24d38d.s3tc.ctex", "res://.godot/imported/6001.png-6fd8c3ef0885c466baece687cd24d38d.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/6103.png b/art/exported/creatures/6103.png deleted file mode 100644 index f45e607..0000000 Binary files a/art/exported/creatures/6103.png and /dev/null differ diff --git a/art/exported/creatures/6103.png.import b/art/exported/creatures/6103.png.import deleted file mode 100644 index ac97dac..0000000 --- a/art/exported/creatures/6103.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://k3ser2dy6wj7" -path.s3tc="res://.godot/imported/6103.png-5fc95bf908f801d5397114bde5081f55.s3tc.ctex" -path.etc2="res://.godot/imported/6103.png-5fc95bf908f801d5397114bde5081f55.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/6103.png" -dest_files=["res://.godot/imported/6103.png-5fc95bf908f801d5397114bde5081f55.s3tc.ctex", "res://.godot/imported/6103.png-5fc95bf908f801d5397114bde5081f55.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/6406.png b/art/exported/creatures/6406.png deleted file mode 100644 index 15c3b83..0000000 Binary files a/art/exported/creatures/6406.png and /dev/null differ diff --git a/art/exported/creatures/6406.png.import b/art/exported/creatures/6406.png.import deleted file mode 100644 index ac060ee..0000000 --- a/art/exported/creatures/6406.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://gnlehenln3kp" -path.s3tc="res://.godot/imported/6406.png-67ebebdd8d13cd88e0a209b3ed00024c.s3tc.ctex" -path.etc2="res://.godot/imported/6406.png-67ebebdd8d13cd88e0a209b3ed00024c.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/6406.png" -dest_files=["res://.godot/imported/6406.png-67ebebdd8d13cd88e0a209b3ed00024c.s3tc.ctex", "res://.godot/imported/6406.png-67ebebdd8d13cd88e0a209b3ed00024c.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/6601.png b/art/exported/creatures/6601.png deleted file mode 100644 index 93c05c0..0000000 Binary files a/art/exported/creatures/6601.png and /dev/null differ diff --git a/art/exported/creatures/6601.png.import b/art/exported/creatures/6601.png.import deleted file mode 100644 index f5facf7..0000000 --- a/art/exported/creatures/6601.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://jauudro8rgay" -path.s3tc="res://.godot/imported/6601.png-7d5f9459e449f3aa7ae72a9e069e6a21.s3tc.ctex" -path.etc2="res://.godot/imported/6601.png-7d5f9459e449f3aa7ae72a9e069e6a21.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/6601.png" -dest_files=["res://.godot/imported/6601.png-7d5f9459e449f3aa7ae72a9e069e6a21.s3tc.ctex", "res://.godot/imported/6601.png-7d5f9459e449f3aa7ae72a9e069e6a21.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/6801.png b/art/exported/creatures/6801.png deleted file mode 100644 index bcdf70b..0000000 Binary files a/art/exported/creatures/6801.png and /dev/null differ diff --git a/art/exported/creatures/6801.png.import b/art/exported/creatures/6801.png.import deleted file mode 100644 index c257a50..0000000 --- a/art/exported/creatures/6801.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cuik8y4tqqetk" -path.s3tc="res://.godot/imported/6801.png-f771f612f1db1d1b99cb446dfebc4992.s3tc.ctex" -path.etc2="res://.godot/imported/6801.png-f771f612f1db1d1b99cb446dfebc4992.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/6801.png" -dest_files=["res://.godot/imported/6801.png-f771f612f1db1d1b99cb446dfebc4992.s3tc.ctex", "res://.godot/imported/6801.png-f771f612f1db1d1b99cb446dfebc4992.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/6804.png b/art/exported/creatures/6804.png deleted file mode 100644 index 14cc738..0000000 Binary files a/art/exported/creatures/6804.png and /dev/null differ diff --git a/art/exported/creatures/6804.png.import b/art/exported/creatures/6804.png.import deleted file mode 100644 index 12be7af..0000000 --- a/art/exported/creatures/6804.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://b5ejex5wtfoun" -path.s3tc="res://.godot/imported/6804.png-28bcc10060d656f6d7f080ea81e2d1d3.s3tc.ctex" -path.etc2="res://.godot/imported/6804.png-28bcc10060d656f6d7f080ea81e2d1d3.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/6804.png" -dest_files=["res://.godot/imported/6804.png-28bcc10060d656f6d7f080ea81e2d1d3.s3tc.ctex", "res://.godot/imported/6804.png-28bcc10060d656f6d7f080ea81e2d1d3.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/6807.png b/art/exported/creatures/6807.png deleted file mode 100644 index 270004f..0000000 Binary files a/art/exported/creatures/6807.png and /dev/null differ diff --git a/art/exported/creatures/6807.png.import b/art/exported/creatures/6807.png.import deleted file mode 100644 index 026d3d9..0000000 --- a/art/exported/creatures/6807.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cu5s2rxrc0dh5" -path.s3tc="res://.godot/imported/6807.png-35d499aa8b3f10cc974cc7df8b70f89e.s3tc.ctex" -path.etc2="res://.godot/imported/6807.png-35d499aa8b3f10cc974cc7df8b70f89e.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/6807.png" -dest_files=["res://.godot/imported/6807.png-35d499aa8b3f10cc974cc7df8b70f89e.s3tc.ctex", "res://.godot/imported/6807.png-35d499aa8b3f10cc974cc7df8b70f89e.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/6901.png b/art/exported/creatures/6901.png deleted file mode 100644 index 0c34e37..0000000 Binary files a/art/exported/creatures/6901.png and /dev/null differ diff --git a/art/exported/creatures/6901.png.import b/art/exported/creatures/6901.png.import deleted file mode 100644 index 651f116..0000000 --- a/art/exported/creatures/6901.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://umjy47x208xb" -path.s3tc="res://.godot/imported/6901.png-f9ff2d1fc8e00eabd73822b5031f91d8.s3tc.ctex" -path.etc2="res://.godot/imported/6901.png-f9ff2d1fc8e00eabd73822b5031f91d8.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/6901.png" -dest_files=["res://.godot/imported/6901.png-f9ff2d1fc8e00eabd73822b5031f91d8.s3tc.ctex", "res://.godot/imported/6901.png-f9ff2d1fc8e00eabd73822b5031f91d8.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/6902.png b/art/exported/creatures/6902.png deleted file mode 100644 index 3d4517e..0000000 Binary files a/art/exported/creatures/6902.png and /dev/null differ diff --git a/art/exported/creatures/6902.png.import b/art/exported/creatures/6902.png.import deleted file mode 100644 index 35f84df..0000000 --- a/art/exported/creatures/6902.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://csdl6u3uvft45" -path.s3tc="res://.godot/imported/6902.png-f8899611759244b42c6c786ff118dcba.s3tc.ctex" -path.etc2="res://.godot/imported/6902.png-f8899611759244b42c6c786ff118dcba.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/6902.png" -dest_files=["res://.godot/imported/6902.png-f8899611759244b42c6c786ff118dcba.s3tc.ctex", "res://.godot/imported/6902.png-f8899611759244b42c6c786ff118dcba.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/6904.png b/art/exported/creatures/6904.png deleted file mode 100644 index f2e8a7b..0000000 Binary files a/art/exported/creatures/6904.png and /dev/null differ diff --git a/art/exported/creatures/6904.png.import b/art/exported/creatures/6904.png.import deleted file mode 100644 index 75051e3..0000000 --- a/art/exported/creatures/6904.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bqh7d4v8jrbpr" -path.s3tc="res://.godot/imported/6904.png-38739e4e48fbb83e3f65074a93d681bb.s3tc.ctex" -path.etc2="res://.godot/imported/6904.png-38739e4e48fbb83e3f65074a93d681bb.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/6904.png" -dest_files=["res://.godot/imported/6904.png-38739e4e48fbb83e3f65074a93d681bb.s3tc.ctex", "res://.godot/imported/6904.png-38739e4e48fbb83e3f65074a93d681bb.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/6905.png b/art/exported/creatures/6905.png deleted file mode 100644 index 296848e..0000000 Binary files a/art/exported/creatures/6905.png and /dev/null differ diff --git a/art/exported/creatures/6905.png.import b/art/exported/creatures/6905.png.import deleted file mode 100644 index f267dc2..0000000 --- a/art/exported/creatures/6905.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c4d8x6qyhahvn" -path.s3tc="res://.godot/imported/6905.png-a52c1647421059618698e17d7a3f8f98.s3tc.ctex" -path.etc2="res://.godot/imported/6905.png-a52c1647421059618698e17d7a3f8f98.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/6905.png" -dest_files=["res://.godot/imported/6905.png-a52c1647421059618698e17d7a3f8f98.s3tc.ctex", "res://.godot/imported/6905.png-a52c1647421059618698e17d7a3f8f98.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/701.png b/art/exported/creatures/701.png deleted file mode 100644 index 4f7d8f8..0000000 Binary files a/art/exported/creatures/701.png and /dev/null differ diff --git a/art/exported/creatures/701.png.import b/art/exported/creatures/701.png.import deleted file mode 100644 index 7598ee8..0000000 --- a/art/exported/creatures/701.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://jw5xt0cfjn1d" -path.s3tc="res://.godot/imported/701.png-8a66c28a9f49fa465ce3b5342fa08dbc.s3tc.ctex" -path.etc2="res://.godot/imported/701.png-8a66c28a9f49fa465ce3b5342fa08dbc.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/701.png" -dest_files=["res://.godot/imported/701.png-8a66c28a9f49fa465ce3b5342fa08dbc.s3tc.ctex", "res://.godot/imported/701.png-8a66c28a9f49fa465ce3b5342fa08dbc.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/704.png b/art/exported/creatures/704.png deleted file mode 100644 index 526d090..0000000 Binary files a/art/exported/creatures/704.png and /dev/null differ diff --git a/art/exported/creatures/704.png.import b/art/exported/creatures/704.png.import deleted file mode 100644 index e80e19e..0000000 --- a/art/exported/creatures/704.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bonpxkp6uwxq6" -path.s3tc="res://.godot/imported/704.png-649669246217a14c9609a7e929841827.s3tc.ctex" -path.etc2="res://.godot/imported/704.png-649669246217a14c9609a7e929841827.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/704.png" -dest_files=["res://.godot/imported/704.png-649669246217a14c9609a7e929841827.s3tc.ctex", "res://.godot/imported/704.png-649669246217a14c9609a7e929841827.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/7101.png b/art/exported/creatures/7101.png deleted file mode 100644 index 93a13af..0000000 Binary files a/art/exported/creatures/7101.png and /dev/null differ diff --git a/art/exported/creatures/7101.png.import b/art/exported/creatures/7101.png.import deleted file mode 100644 index 2d312b3..0000000 --- a/art/exported/creatures/7101.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dd5lpjei8ix4d" -path.s3tc="res://.godot/imported/7101.png-9be787a05b48075222e923e556de87ac.s3tc.ctex" -path.etc2="res://.godot/imported/7101.png-9be787a05b48075222e923e556de87ac.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/7101.png" -dest_files=["res://.godot/imported/7101.png-9be787a05b48075222e923e556de87ac.s3tc.ctex", "res://.godot/imported/7101.png-9be787a05b48075222e923e556de87ac.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/7403.png b/art/exported/creatures/7403.png deleted file mode 100644 index ad73c17..0000000 Binary files a/art/exported/creatures/7403.png and /dev/null differ diff --git a/art/exported/creatures/7403.png.import b/art/exported/creatures/7403.png.import deleted file mode 100644 index bef32c4..0000000 --- a/art/exported/creatures/7403.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bl7ru6gm5xnpb" -path.s3tc="res://.godot/imported/7403.png-54b51089a6ff5c2091372d659ba4bdc7.s3tc.ctex" -path.etc2="res://.godot/imported/7403.png-54b51089a6ff5c2091372d659ba4bdc7.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/7403.png" -dest_files=["res://.godot/imported/7403.png-54b51089a6ff5c2091372d659ba4bdc7.s3tc.ctex", "res://.godot/imported/7403.png-54b51089a6ff5c2091372d659ba4bdc7.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/7506.png b/art/exported/creatures/7506.png deleted file mode 100644 index 7e8c5b2..0000000 Binary files a/art/exported/creatures/7506.png and /dev/null differ diff --git a/art/exported/creatures/7506.png.import b/art/exported/creatures/7506.png.import deleted file mode 100644 index c2c99a0..0000000 --- a/art/exported/creatures/7506.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c6qm3sujp8xvg" -path.s3tc="res://.godot/imported/7506.png-5c0f871c623e61a890015626ea315de9.s3tc.ctex" -path.etc2="res://.godot/imported/7506.png-5c0f871c623e61a890015626ea315de9.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/7506.png" -dest_files=["res://.godot/imported/7506.png-5c0f871c623e61a890015626ea315de9.s3tc.ctex", "res://.godot/imported/7506.png-5c0f871c623e61a890015626ea315de9.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/7508.png b/art/exported/creatures/7508.png deleted file mode 100644 index 27f1a59..0000000 Binary files a/art/exported/creatures/7508.png and /dev/null differ diff --git a/art/exported/creatures/7508.png.import b/art/exported/creatures/7508.png.import deleted file mode 100644 index a14d42f..0000000 --- a/art/exported/creatures/7508.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bnw0dw14iyxbh" -path.s3tc="res://.godot/imported/7508.png-555eff33a2cb66622ccca9d7f063522e.s3tc.ctex" -path.etc2="res://.godot/imported/7508.png-555eff33a2cb66622ccca9d7f063522e.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/7508.png" -dest_files=["res://.godot/imported/7508.png-555eff33a2cb66622ccca9d7f063522e.s3tc.ctex", "res://.godot/imported/7508.png-555eff33a2cb66622ccca9d7f063522e.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/801.png b/art/exported/creatures/801.png deleted file mode 100644 index f2e6390..0000000 Binary files a/art/exported/creatures/801.png and /dev/null differ diff --git a/art/exported/creatures/801.png.import b/art/exported/creatures/801.png.import deleted file mode 100644 index 3721440..0000000 --- a/art/exported/creatures/801.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dkocdkoyy2udh" -path.s3tc="res://.godot/imported/801.png-b0324ef8c10934464b8be69cb9eca981.s3tc.ctex" -path.etc2="res://.godot/imported/801.png-b0324ef8c10934464b8be69cb9eca981.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/801.png" -dest_files=["res://.godot/imported/801.png-b0324ef8c10934464b8be69cb9eca981.s3tc.ctex", "res://.godot/imported/801.png-b0324ef8c10934464b8be69cb9eca981.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/802.png b/art/exported/creatures/802.png deleted file mode 100644 index f786031..0000000 Binary files a/art/exported/creatures/802.png and /dev/null differ diff --git a/art/exported/creatures/802.png.import b/art/exported/creatures/802.png.import deleted file mode 100644 index f7e4cc6..0000000 --- a/art/exported/creatures/802.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://b6pkx1koopl7p" -path.s3tc="res://.godot/imported/802.png-1e79f95b56c444a9c7183dada8a14dc3.s3tc.ctex" -path.etc2="res://.godot/imported/802.png-1e79f95b56c444a9c7183dada8a14dc3.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/802.png" -dest_files=["res://.godot/imported/802.png-1e79f95b56c444a9c7183dada8a14dc3.s3tc.ctex", "res://.godot/imported/802.png-1e79f95b56c444a9c7183dada8a14dc3.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/805.png b/art/exported/creatures/805.png deleted file mode 100644 index 727793c..0000000 Binary files a/art/exported/creatures/805.png and /dev/null differ diff --git a/art/exported/creatures/805.png.import b/art/exported/creatures/805.png.import deleted file mode 100644 index db359af..0000000 --- a/art/exported/creatures/805.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cyo0ihvopej4" -path.s3tc="res://.godot/imported/805.png-f508211dd3f15d8b9090675eef9939f7.s3tc.ctex" -path.etc2="res://.godot/imported/805.png-f508211dd3f15d8b9090675eef9939f7.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/805.png" -dest_files=["res://.godot/imported/805.png-f508211dd3f15d8b9090675eef9939f7.s3tc.ctex", "res://.godot/imported/805.png-f508211dd3f15d8b9090675eef9939f7.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/806.png b/art/exported/creatures/806.png deleted file mode 100644 index a8acdb1..0000000 Binary files a/art/exported/creatures/806.png and /dev/null differ diff --git a/art/exported/creatures/806.png.import b/art/exported/creatures/806.png.import deleted file mode 100644 index 8078cb6..0000000 --- a/art/exported/creatures/806.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c31dw2wqjat40" -path.s3tc="res://.godot/imported/806.png-640099ab90a2d2daf3c4e7229634452c.s3tc.ctex" -path.etc2="res://.godot/imported/806.png-640099ab90a2d2daf3c4e7229634452c.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/806.png" -dest_files=["res://.godot/imported/806.png-640099ab90a2d2daf3c4e7229634452c.s3tc.ctex", "res://.godot/imported/806.png-640099ab90a2d2daf3c4e7229634452c.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/808.png b/art/exported/creatures/808.png deleted file mode 100644 index e218b8e..0000000 Binary files a/art/exported/creatures/808.png and /dev/null differ diff --git a/art/exported/creatures/808.png.import b/art/exported/creatures/808.png.import deleted file mode 100644 index 1126876..0000000 --- a/art/exported/creatures/808.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://x2d4nglo0rlk" -path.s3tc="res://.godot/imported/808.png-bc683347c2e3b627379b7eb047e12a89.s3tc.ctex" -path.etc2="res://.godot/imported/808.png-bc683347c2e3b627379b7eb047e12a89.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/808.png" -dest_files=["res://.godot/imported/808.png-bc683347c2e3b627379b7eb047e12a89.s3tc.ctex", "res://.godot/imported/808.png-bc683347c2e3b627379b7eb047e12a89.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/creatures/fish_placeholder.png b/art/exported/creatures/fish_placeholder.png deleted file mode 100644 index de69afb..0000000 Binary files a/art/exported/creatures/fish_placeholder.png and /dev/null differ diff --git a/art/exported/creatures/fish_placeholder.png.import b/art/exported/creatures/fish_placeholder.png.import deleted file mode 100644 index 87111f4..0000000 --- a/art/exported/creatures/fish_placeholder.png.import +++ /dev/null @@ -1,42 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://d08ce7q8vmlfs" -path.s3tc="res://.godot/imported/fish_placeholder.png-41ecfc07b87417338ce888ac1e2c2362.s3tc.ctex" -path.etc2="res://.godot/imported/fish_placeholder.png-41ecfc07b87417338ce888ac1e2c2362.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/creatures/fish_placeholder.png" -dest_files=["res://.godot/imported/fish_placeholder.png-41ecfc07b87417338ce888ac1e2c2362.s3tc.ctex", "res://.godot/imported/fish_placeholder.png-41ecfc07b87417338ce888ac1e2c2362.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/items/equipment/net.glb b/art/exported/items/equipment/net.glb deleted file mode 100644 index db4fa34..0000000 Binary files a/art/exported/items/equipment/net.glb and /dev/null differ diff --git a/art/exported/items/equipment/net.glb.import b/art/exported/items/equipment/net.glb.import deleted file mode 100644 index 28667d6..0000000 --- a/art/exported/items/equipment/net.glb.import +++ /dev/null @@ -1,45 +0,0 @@ -[remap] - -importer="scene" -importer_version=1 -type="PackedScene" -uid="uid://dsa6yss1sxfcy" -path="res://.godot/imported/net.glb-cbbc53905aec6a50c4a3322ca7a93b1e.scn" - -[deps] - -source_file="res://art/exported/items/equipment/net.glb" -dest_files=["res://.godot/imported/net.glb-cbbc53905aec6a50c4a3322ca7a93b1e.scn"] - -[params] - -nodes/root_type="" -nodes/root_name="" -nodes/root_script=null -mesh_library/use_node_names_as_mesh_names=false -array_mesh/deduplicate_surfaces=true -nodes/apply_root_scale=true -nodes/root_scale=1.0 -nodes/import_as_skeleton_bones=false -nodes/use_name_suffixes=true -nodes/use_node_type_suffixes=true -meshes/ensure_tangents=true -meshes/generate_lods=true -meshes/create_shadow_meshes=true -meshes/light_baking=1 -meshes/lightmap_texel_size=0.2 -meshes/force_disable_compression=false -skins/use_named_skins=true -animation/import=true -animation/fps=30 -animation/trimming=false -animation/remove_immutable_tracks=true -animation/import_rest_as_RESET=false -import_script/path="" -materials/extract=0 -materials/extract_format=0 -materials/extract_path="" -_subresources={} -gltf/naming_version=2 -gltf/embedded_image_handling=1 -gltf/texture_map_mode=1 diff --git a/art/exported/items/equipment/net_Material.png b/art/exported/items/equipment/net_Material.png deleted file mode 100644 index bd5eff2..0000000 Binary files a/art/exported/items/equipment/net_Material.png and /dev/null differ diff --git a/art/exported/items/equipment/net_Material.png.import b/art/exported/items/equipment/net_Material.png.import deleted file mode 100644 index 0723973..0000000 --- a/art/exported/items/equipment/net_Material.png.import +++ /dev/null @@ -1,45 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://binoqhg45vgbs" -path.s3tc="res://.godot/imported/net_Material.png-f4c4b0400561bc2751fe719b6b1a1e1a.s3tc.ctex" -path.etc2="res://.godot/imported/net_Material.png-f4c4b0400561bc2751fe719b6b1a1e1a.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} -generator_parameters={ -"md5": "ef2c2ae657c9460c90eb808ba5217f39" -} - -[deps] - -source_file="res://art/exported/items/equipment/net_Material.png" -dest_files=["res://.godot/imported/net_Material.png-f4c4b0400561bc2751fe719b6b1a1e1a.s3tc.ctex", "res://.godot/imported/net_Material.png-f4c4b0400561bc2751fe719b6b1a1e1a.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/items/equipment/net_Plane Base Color.png b/art/exported/items/equipment/net_Plane Base Color.png deleted file mode 100644 index 795d0a3..0000000 Binary files a/art/exported/items/equipment/net_Plane Base Color.png and /dev/null differ diff --git a/art/exported/items/equipment/net_Plane Base Color.png.import b/art/exported/items/equipment/net_Plane Base Color.png.import deleted file mode 100644 index 61077be..0000000 --- a/art/exported/items/equipment/net_Plane Base Color.png.import +++ /dev/null @@ -1,45 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cdsabucjy5rpk" -path.s3tc="res://.godot/imported/net_Plane Base Color.png-3875ae3dd186ddf319c55aabb13e663f.s3tc.ctex" -path.etc2="res://.godot/imported/net_Plane Base Color.png-3875ae3dd186ddf319c55aabb13e663f.etc2.ctex" -metadata={ -"imported_formats": ["s3tc_bptc", "etc2_astc"], -"vram_texture": true -} -generator_parameters={ -"md5": "a6001c381d4c8e16bd2d64ea74ccff82" -} - -[deps] - -source_file="res://art/exported/items/equipment/net_Plane Base Color.png" -dest_files=["res://.godot/imported/net_Plane Base Color.png-3875ae3dd186ddf319c55aabb13e663f.s3tc.ctex", "res://.godot/imported/net_Plane Base Color.png-3875ae3dd186ddf319c55aabb13e663f.etc2.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/system_icons/netfishing.ico b/art/exported/system_icons/netfishing.ico new file mode 100644 index 0000000..dc5bdae Binary files /dev/null and b/art/exported/system_icons/netfishing.ico differ diff --git a/art/exported/system_icons/netfishing_1024.png b/art/exported/system_icons/netfishing_1024.png new file mode 100644 index 0000000..a433e80 Binary files /dev/null and b/art/exported/system_icons/netfishing_1024.png differ diff --git a/art/exported/system_icons/straywild_1024.png.import b/art/exported/system_icons/netfishing_1024.png.import similarity index 74% rename from art/exported/system_icons/straywild_1024.png.import rename to art/exported/system_icons/netfishing_1024.png.import index dea156a..08aa925 100644 --- a/art/exported/system_icons/straywild_1024.png.import +++ b/art/exported/system_icons/netfishing_1024.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://bkh5hw8wwu8pc" -path="res://.godot/imported/straywild_1024.png-b9b5c159c9fcecc21b04324370d4522f.ctex" +path="res://.godot/imported/netfishing_1024.png-7c53a099ed2743b4a623c258641b1d29.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://art/exported/system_icons/straywild_1024.png" -dest_files=["res://.godot/imported/straywild_1024.png-b9b5c159c9fcecc21b04324370d4522f.ctex"] +source_file="res://art/exported/system_icons/netfishing_1024.png" +dest_files=["res://.godot/imported/netfishing_1024.png-7c53a099ed2743b4a623c258641b1d29.ctex"] [params] diff --git a/art/exported/system_icons/netfishing_256.png b/art/exported/system_icons/netfishing_256.png new file mode 100644 index 0000000..1e7be72 Binary files /dev/null and b/art/exported/system_icons/netfishing_256.png differ diff --git a/art/exported/system_icons/straywild_256.png.import b/art/exported/system_icons/netfishing_256.png.import similarity index 74% rename from art/exported/system_icons/straywild_256.png.import rename to art/exported/system_icons/netfishing_256.png.import index 5726347..34d5d27 100644 --- a/art/exported/system_icons/straywild_256.png.import +++ b/art/exported/system_icons/netfishing_256.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://cty16m8ydla06" -path="res://.godot/imported/straywild_256.png-87b7e62e710eae4d3e3ed24a8454ca6d.ctex" +path="res://.godot/imported/netfishing_256.png-d9dfc9c7871ac38bc73d09d00df679be.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://art/exported/system_icons/straywild_256.png" -dest_files=["res://.godot/imported/straywild_256.png-87b7e62e710eae4d3e3ed24a8454ca6d.ctex"] +source_file="res://art/exported/system_icons/netfishing_256.png" +dest_files=["res://.godot/imported/netfishing_256.png-d9dfc9c7871ac38bc73d09d00df679be.ctex"] [params] diff --git a/art/exported/system_icons/straywild.ico b/art/exported/system_icons/straywild.ico deleted file mode 100644 index c03de8e..0000000 Binary files a/art/exported/system_icons/straywild.ico and /dev/null differ diff --git a/art/exported/system_icons/straywild_1024.png b/art/exported/system_icons/straywild_1024.png deleted file mode 100644 index 2a3b204..0000000 Binary files a/art/exported/system_icons/straywild_1024.png and /dev/null differ diff --git a/art/exported/system_icons/straywild_256.png b/art/exported/system_icons/straywild_256.png deleted file mode 100644 index 98275eb..0000000 Binary files a/art/exported/system_icons/straywild_256.png and /dev/null differ diff --git a/art/source/characters/base/straywild_base_character.blend b/art/source/characters/base/netfishing_base_character.blend similarity index 100% rename from art/source/characters/base/straywild_base_character.blend rename to art/source/characters/base/netfishing_base_character.blend diff --git a/art/source/characters/base/straywild_base_character.blend.import b/art/source/characters/base/netfishing_base_character.blend.import similarity index 84% rename from art/source/characters/base/straywild_base_character.blend.import rename to art/source/characters/base/netfishing_base_character.blend.import index 2cab53c..f6df489 100644 --- a/art/source/characters/base/straywild_base_character.blend.import +++ b/art/source/characters/base/netfishing_base_character.blend.import @@ -4,12 +4,12 @@ importer="scene" importer_version=1 type="PackedScene" uid="uid://cb4bcakhoprm8" -path="res://.godot/imported/straywild_base_character.blend-02abbfdb9b1d393f1bd3cfface615e27.scn" +path="res://.godot/imported/netfishing_base_character.blend-65bf3bc5b77cc1a37fa3f81ebd808d37.scn" [deps] -source_file="res://art/source/characters/base/straywild_base_character.blend" -dest_files=["res://.godot/imported/straywild_base_character.blend-02abbfdb9b1d393f1bd3cfface615e27.scn"] +source_file="res://art/source/characters/base/netfishing_base_character.blend" +dest_files=["res://.godot/imported/netfishing_base_character.blend-65bf3bc5b77cc1a37fa3f81ebd808d37.scn"] [params] diff --git a/art/source/characters/base/straywild_base_character.glb.import b/art/source/characters/base/netfishing_base_character.glb.import similarity index 77% rename from art/source/characters/base/straywild_base_character.glb.import rename to art/source/characters/base/netfishing_base_character.glb.import index bda93c0..5a38b76 100644 --- a/art/source/characters/base/straywild_base_character.glb.import +++ b/art/source/characters/base/netfishing_base_character.glb.import @@ -4,12 +4,12 @@ importer="scene" importer_version=1 type="PackedScene" uid="uid://bfhnup14638r7" -path="res://.godot/imported/straywild_base_character.glb-c9650c715a1b5b9ae0d8541191f7d7a9.scn" +path="res://.godot/imported/netfishing_base_character.glb-cbdc33eaa4fcd1d2d2a8f4a463b228d6.scn" [deps] -source_file="res://art/source/characters/base/straywild_base_character.glb" -dest_files=["res://.godot/imported/straywild_base_character.glb-c9650c715a1b5b9ae0d8541191f7d7a9.scn"] +source_file="res://art/source/characters/base/netfishing_base_character.glb" +dest_files=["res://.godot/imported/netfishing_base_character.glb-cbdc33eaa4fcd1d2d2a8f4a463b228d6.scn"] [params] diff --git a/art/source/characters/base/straywild_character_source.blend b/art/source/characters/base/netfishing_character_source.blend similarity index 100% rename from art/source/characters/base/straywild_character_source.blend rename to art/source/characters/base/netfishing_character_source.blend diff --git a/art/source/characters/base/straywild_character_source.blend.import b/art/source/characters/base/netfishing_character_source.blend.import similarity index 84% rename from art/source/characters/base/straywild_character_source.blend.import rename to art/source/characters/base/netfishing_character_source.blend.import index 741c389..8288280 100644 --- a/art/source/characters/base/straywild_character_source.blend.import +++ b/art/source/characters/base/netfishing_character_source.blend.import @@ -4,12 +4,12 @@ importer="scene" importer_version=1 type="PackedScene" uid="uid://d38y8blk2w5c5" -path="res://.godot/imported/straywild_character_source.blend-0e7b8a87008f88e309ad73a63561ef5b.scn" +path="res://.godot/imported/netfishing_character_source.blend-1d18c95606937d4c8bcb87e334e02ee5.scn" [deps] -source_file="res://art/source/characters/base/straywild_character_source.blend" -dest_files=["res://.godot/imported/straywild_character_source.blend-0e7b8a87008f88e309ad73a63561ef5b.scn"] +source_file="res://art/source/characters/base/netfishing_character_source.blend" +dest_files=["res://.godot/imported/netfishing_character_source.blend-1d18c95606937d4c8bcb87e334e02ee5.scn"] [params] diff --git a/art/source/characters/base/straywild_character_source.glb.import b/art/source/characters/base/netfishing_character_source.glb.import similarity index 76% rename from art/source/characters/base/straywild_character_source.glb.import rename to art/source/characters/base/netfishing_character_source.glb.import index bbcee6a..61158c5 100644 --- a/art/source/characters/base/straywild_character_source.glb.import +++ b/art/source/characters/base/netfishing_character_source.glb.import @@ -4,12 +4,12 @@ importer="scene" importer_version=1 type="PackedScene" uid="uid://3uq4cxiomttt" -path="res://.godot/imported/straywild_character_source.glb-3a8ccc55dbe60da1b70b62110b206353.scn" +path="res://.godot/imported/netfishing_character_source.glb-9c98ee44b142c5b3d06f0838b7d2c9c4.scn" [deps] -source_file="res://art/source/characters/base/straywild_character_source.glb" -dest_files=["res://.godot/imported/straywild_character_source.glb-3a8ccc55dbe60da1b70b62110b206353.scn"] +source_file="res://art/source/characters/base/netfishing_character_source.glb" +dest_files=["res://.godot/imported/netfishing_character_source.glb-9c98ee44b142c5b3d06f0838b7d2c9c4.scn"] [params] diff --git a/art/source/characters/base/straywild_character_source_eyes1_eyebrows1.png b/art/source/characters/base/netfishing_character_source_eyes1_eyebrows1.png similarity index 100% rename from art/source/characters/base/straywild_character_source_eyes1_eyebrows1.png rename to art/source/characters/base/netfishing_character_source_eyes1_eyebrows1.png diff --git a/art/source/characters/base/straywild_character_source_eyes1_eyebrows1.png.import b/art/source/characters/base/netfishing_character_source_eyes1_eyebrows1.png.import similarity index 58% rename from art/source/characters/base/straywild_character_source_eyes1_eyebrows1.png.import rename to art/source/characters/base/netfishing_character_source_eyes1_eyebrows1.png.import index dba5a5f..e7aade1 100644 --- a/art/source/characters/base/straywild_character_source_eyes1_eyebrows1.png.import +++ b/art/source/characters/base/netfishing_character_source_eyes1_eyebrows1.png.import @@ -3,8 +3,8 @@ importer="texture" type="CompressedTexture2D" uid="uid://bdomsntfeovnc" -path.s3tc="res://.godot/imported/straywild_character_source_eyes1_eyebrows1.png-3c638377e631a94b998336d0ca1d8b8e.s3tc.ctex" -path.etc2="res://.godot/imported/straywild_character_source_eyes1_eyebrows1.png-3c638377e631a94b998336d0ca1d8b8e.etc2.ctex" +path.s3tc="res://.godot/imported/netfishing_character_source_eyes1_eyebrows1.png-a0b9f287e407afd9688e141dc5f2b801.s3tc.ctex" +path.etc2="res://.godot/imported/netfishing_character_source_eyes1_eyebrows1.png-a0b9f287e407afd9688e141dc5f2b801.etc2.ctex" metadata={ "imported_formats": ["s3tc_bptc", "etc2_astc"], "vram_texture": true @@ -15,8 +15,8 @@ generator_parameters={ [deps] -source_file="res://art/source/characters/base/straywild_character_source_eyes1_eyebrows1.png" -dest_files=["res://.godot/imported/straywild_character_source_eyes1_eyebrows1.png-3c638377e631a94b998336d0ca1d8b8e.s3tc.ctex", "res://.godot/imported/straywild_character_source_eyes1_eyebrows1.png-3c638377e631a94b998336d0ca1d8b8e.etc2.ctex"] +source_file="res://art/source/characters/base/netfishing_character_source_eyes1_eyebrows1.png" +dest_files=["res://.godot/imported/netfishing_character_source_eyes1_eyebrows1.png-a0b9f287e407afd9688e141dc5f2b801.s3tc.ctex", "res://.godot/imported/netfishing_character_source_eyes1_eyebrows1.png-a0b9f287e407afd9688e141dc5f2b801.etc2.ctex"] [params] diff --git a/art/source/characters/base/straywild_character_source_eyes_simple_shine.png b/art/source/characters/base/netfishing_character_source_eyes_simple_shine.png similarity index 100% rename from art/source/characters/base/straywild_character_source_eyes_simple_shine.png rename to art/source/characters/base/netfishing_character_source_eyes_simple_shine.png diff --git a/art/source/characters/base/straywild_character_source_eyes_simple_shine.png.import b/art/source/characters/base/netfishing_character_source_eyes_simple_shine.png.import similarity index 58% rename from art/source/characters/base/straywild_character_source_eyes_simple_shine.png.import rename to art/source/characters/base/netfishing_character_source_eyes_simple_shine.png.import index 8b99f72..e49d401 100644 --- a/art/source/characters/base/straywild_character_source_eyes_simple_shine.png.import +++ b/art/source/characters/base/netfishing_character_source_eyes_simple_shine.png.import @@ -3,8 +3,8 @@ importer="texture" type="CompressedTexture2D" uid="uid://du4u6meapay05" -path.s3tc="res://.godot/imported/straywild_character_source_eyes_simple_shine.png-97500ad873e0da3aaf0e9e3c3198e38a.s3tc.ctex" -path.etc2="res://.godot/imported/straywild_character_source_eyes_simple_shine.png-97500ad873e0da3aaf0e9e3c3198e38a.etc2.ctex" +path.s3tc="res://.godot/imported/netfishing_character_source_eyes_simple_shine.png-965743f3716320bbc385096956ffef2d.s3tc.ctex" +path.etc2="res://.godot/imported/netfishing_character_source_eyes_simple_shine.png-965743f3716320bbc385096956ffef2d.etc2.ctex" metadata={ "imported_formats": ["s3tc_bptc", "etc2_astc"], "vram_texture": true @@ -15,8 +15,8 @@ generator_parameters={ [deps] -source_file="res://art/source/characters/base/straywild_character_source_eyes_simple_shine.png" -dest_files=["res://.godot/imported/straywild_character_source_eyes_simple_shine.png-97500ad873e0da3aaf0e9e3c3198e38a.s3tc.ctex", "res://.godot/imported/straywild_character_source_eyes_simple_shine.png-97500ad873e0da3aaf0e9e3c3198e38a.etc2.ctex"] +source_file="res://art/source/characters/base/netfishing_character_source_eyes_simple_shine.png" +dest_files=["res://.godot/imported/netfishing_character_source_eyes_simple_shine.png-965743f3716320bbc385096956ffef2d.s3tc.ctex", "res://.godot/imported/netfishing_character_source_eyes_simple_shine.png-965743f3716320bbc385096956ffef2d.etc2.ctex"] [params] diff --git a/art/source/characters/base/straywild_character_source_mouth1.png b/art/source/characters/base/netfishing_character_source_mouth1.png similarity index 100% rename from art/source/characters/base/straywild_character_source_mouth1.png rename to art/source/characters/base/netfishing_character_source_mouth1.png diff --git a/art/source/characters/base/straywild_character_source_mouth1.png.import b/art/source/characters/base/netfishing_character_source_mouth1.png.import similarity index 60% rename from art/source/characters/base/straywild_character_source_mouth1.png.import rename to art/source/characters/base/netfishing_character_source_mouth1.png.import index 5dd84f4..8ff49a4 100644 --- a/art/source/characters/base/straywild_character_source_mouth1.png.import +++ b/art/source/characters/base/netfishing_character_source_mouth1.png.import @@ -3,8 +3,8 @@ importer="texture" type="CompressedTexture2D" uid="uid://css0k0virgoph" -path.s3tc="res://.godot/imported/straywild_character_source_mouth1.png-ff2ed280ca7e84bdd0749ed5b5b16f54.s3tc.ctex" -path.etc2="res://.godot/imported/straywild_character_source_mouth1.png-ff2ed280ca7e84bdd0749ed5b5b16f54.etc2.ctex" +path.s3tc="res://.godot/imported/netfishing_character_source_mouth1.png-b323b9153acd3f552f35c1d1108567c8.s3tc.ctex" +path.etc2="res://.godot/imported/netfishing_character_source_mouth1.png-b323b9153acd3f552f35c1d1108567c8.etc2.ctex" metadata={ "imported_formats": ["s3tc_bptc", "etc2_astc"], "vram_texture": true @@ -15,8 +15,8 @@ generator_parameters={ [deps] -source_file="res://art/source/characters/base/straywild_character_source_mouth1.png" -dest_files=["res://.godot/imported/straywild_character_source_mouth1.png-ff2ed280ca7e84bdd0749ed5b5b16f54.s3tc.ctex", "res://.godot/imported/straywild_character_source_mouth1.png-ff2ed280ca7e84bdd0749ed5b5b16f54.etc2.ctex"] +source_file="res://art/source/characters/base/netfishing_character_source_mouth1.png" +dest_files=["res://.godot/imported/netfishing_character_source_mouth1.png-b323b9153acd3f552f35c1d1108567c8.s3tc.ctex", "res://.godot/imported/netfishing_character_source_mouth1.png-b323b9153acd3f552f35c1d1108567c8.etc2.ctex"] [params] diff --git a/art/source/characters/base/straywild_character_source_mouth_three.png b/art/source/characters/base/netfishing_character_source_mouth_three.png similarity index 100% rename from art/source/characters/base/straywild_character_source_mouth_three.png rename to art/source/characters/base/netfishing_character_source_mouth_three.png diff --git a/art/source/characters/base/straywild_character_source_mouth_three.png.import b/art/source/characters/base/netfishing_character_source_mouth_three.png.import similarity index 59% rename from art/source/characters/base/straywild_character_source_mouth_three.png.import rename to art/source/characters/base/netfishing_character_source_mouth_three.png.import index 4b2413d..6abae09 100644 --- a/art/source/characters/base/straywild_character_source_mouth_three.png.import +++ b/art/source/characters/base/netfishing_character_source_mouth_three.png.import @@ -3,8 +3,8 @@ importer="texture" type="CompressedTexture2D" uid="uid://di20c1x8vksi1" -path.s3tc="res://.godot/imported/straywild_character_source_mouth_three.png-adf40ee30e725bafadf6a8fa4dbd8abf.s3tc.ctex" -path.etc2="res://.godot/imported/straywild_character_source_mouth_three.png-adf40ee30e725bafadf6a8fa4dbd8abf.etc2.ctex" +path.s3tc="res://.godot/imported/netfishing_character_source_mouth_three.png-6bf79d4c9c660d30fb7fc365f0039313.s3tc.ctex" +path.etc2="res://.godot/imported/netfishing_character_source_mouth_three.png-6bf79d4c9c660d30fb7fc365f0039313.etc2.ctex" metadata={ "imported_formats": ["s3tc_bptc", "etc2_astc"], "vram_texture": true @@ -15,8 +15,8 @@ generator_parameters={ [deps] -source_file="res://art/source/characters/base/straywild_character_source_mouth_three.png" -dest_files=["res://.godot/imported/straywild_character_source_mouth_three.png-adf40ee30e725bafadf6a8fa4dbd8abf.s3tc.ctex", "res://.godot/imported/straywild_character_source_mouth_three.png-adf40ee30e725bafadf6a8fa4dbd8abf.etc2.ctex"] +source_file="res://art/source/characters/base/netfishing_character_source_mouth_three.png" +dest_files=["res://.godot/imported/netfishing_character_source_mouth_three.png-6bf79d4c9c660d30fb7fc365f0039313.s3tc.ctex", "res://.godot/imported/netfishing_character_source_mouth_three.png-6bf79d4c9c660d30fb7fc365f0039313.etc2.ctex"] [params] diff --git a/art/source/characters/base/straywild_character_source_nose1.2.png b/art/source/characters/base/netfishing_character_source_nose1.2.png similarity index 100% rename from art/source/characters/base/straywild_character_source_nose1.2.png rename to art/source/characters/base/netfishing_character_source_nose1.2.png diff --git a/art/source/characters/base/straywild_character_source_nose1.2.png.import b/art/source/characters/base/netfishing_character_source_nose1.2.png.import similarity index 60% rename from art/source/characters/base/straywild_character_source_nose1.2.png.import rename to art/source/characters/base/netfishing_character_source_nose1.2.png.import index e0c3667..2fbb165 100644 --- a/art/source/characters/base/straywild_character_source_nose1.2.png.import +++ b/art/source/characters/base/netfishing_character_source_nose1.2.png.import @@ -3,8 +3,8 @@ importer="texture" type="CompressedTexture2D" uid="uid://7dwa0bfev1rk" -path.s3tc="res://.godot/imported/straywild_character_source_nose1.2.png-0a8355472731651768eaa5fc2ee168d4.s3tc.ctex" -path.etc2="res://.godot/imported/straywild_character_source_nose1.2.png-0a8355472731651768eaa5fc2ee168d4.etc2.ctex" +path.s3tc="res://.godot/imported/netfishing_character_source_nose1.2.png-ef4dd456c5b0f0db73b3dc063bfba941.s3tc.ctex" +path.etc2="res://.godot/imported/netfishing_character_source_nose1.2.png-ef4dd456c5b0f0db73b3dc063bfba941.etc2.ctex" metadata={ "imported_formats": ["s3tc_bptc", "etc2_astc"], "vram_texture": true @@ -15,8 +15,8 @@ generator_parameters={ [deps] -source_file="res://art/source/characters/base/straywild_character_source_nose1.2.png" -dest_files=["res://.godot/imported/straywild_character_source_nose1.2.png-0a8355472731651768eaa5fc2ee168d4.s3tc.ctex", "res://.godot/imported/straywild_character_source_nose1.2.png-0a8355472731651768eaa5fc2ee168d4.etc2.ctex"] +source_file="res://art/source/characters/base/netfishing_character_source_nose1.2.png" +dest_files=["res://.godot/imported/netfishing_character_source_nose1.2.png-ef4dd456c5b0f0db73b3dc063bfba941.s3tc.ctex", "res://.godot/imported/netfishing_character_source_nose1.2.png-ef4dd456c5b0f0db73b3dc063bfba941.etc2.ctex"] [params] diff --git a/art/source/characters/base/straywild_character_source_nose_dog_round.png b/art/source/characters/base/netfishing_character_source_nose_dog_round.png similarity index 100% rename from art/source/characters/base/straywild_character_source_nose_dog_round.png rename to art/source/characters/base/netfishing_character_source_nose_dog_round.png diff --git a/art/source/characters/base/straywild_character_source_nose_dog_round.png.import b/art/source/characters/base/netfishing_character_source_nose_dog_round.png.import similarity index 59% rename from art/source/characters/base/straywild_character_source_nose_dog_round.png.import rename to art/source/characters/base/netfishing_character_source_nose_dog_round.png.import index 5fe079e..12333e8 100644 --- a/art/source/characters/base/straywild_character_source_nose_dog_round.png.import +++ b/art/source/characters/base/netfishing_character_source_nose_dog_round.png.import @@ -3,8 +3,8 @@ importer="texture" type="CompressedTexture2D" uid="uid://b0p55hwdry2cr" -path.s3tc="res://.godot/imported/straywild_character_source_nose_dog_round.png-d1ea0db61e41dfeeed3b599286ffb82c.s3tc.ctex" -path.etc2="res://.godot/imported/straywild_character_source_nose_dog_round.png-d1ea0db61e41dfeeed3b599286ffb82c.etc2.ctex" +path.s3tc="res://.godot/imported/netfishing_character_source_nose_dog_round.png-1c89150861ebff3f930698c1747a0369.s3tc.ctex" +path.etc2="res://.godot/imported/netfishing_character_source_nose_dog_round.png-1c89150861ebff3f930698c1747a0369.etc2.ctex" metadata={ "imported_formats": ["s3tc_bptc", "etc2_astc"], "vram_texture": true @@ -15,8 +15,8 @@ generator_parameters={ [deps] -source_file="res://art/source/characters/base/straywild_character_source_nose_dog_round.png" -dest_files=["res://.godot/imported/straywild_character_source_nose_dog_round.png-d1ea0db61e41dfeeed3b599286ffb82c.s3tc.ctex", "res://.godot/imported/straywild_character_source_nose_dog_round.png-d1ea0db61e41dfeeed3b599286ffb82c.etc2.ctex"] +source_file="res://art/source/characters/base/netfishing_character_source_nose_dog_round.png" +dest_files=["res://.godot/imported/netfishing_character_source_nose_dog_round.png-1c89150861ebff3f930698c1747a0369.s3tc.ctex", "res://.godot/imported/netfishing_character_source_nose_dog_round.png-1c89150861ebff3f930698c1747a0369.etc2.ctex"] [params] diff --git a/art/source/items/equipment/net.blend b/art/source/items/equipment/net.blend deleted file mode 100644 index 0a7ba4c..0000000 Binary files a/art/source/items/equipment/net.blend and /dev/null differ diff --git a/docs/ATTRIBUTION.md b/docs/ATTRIBUTION.md index e4ab55b..2eac3e5 100644 --- a/docs/ATTRIBUTION.md +++ b/docs/ATTRIBUTION.md @@ -7,19 +7,19 @@ prove authorship or licensing. ## Ownership and credits -straywild is jointly owned, developed, and published by its creators, +NETfishing is jointly owned, developed, and published by its creators, publicly credited as Voyager and Endeavour and operating collectively as the independent team Woofmeow. - Voyager: co-owner, developer, project director, creator of the game's - provisional fish placeholder artwork and original 3D work except where - another creator is credited, and composer of the original title track + current provisional fish artwork and original 3D work except where another + creator is credited, and composer of the original title track `audio/music/title/as_in_four_wolves.ogg`, dusk/world track `audio/music/world/craft.mp3`, and the synthesized robot animalese tones. - Endeavour: co-owner, developer, and 2D artist. Her incorporated work includes - character pattern/channel-map art, environment and UI art, item art, and - finished fish and creature artwork. Planned work is not described as - incorporated until its files enter the project. + character pattern/channel-map art, environment and UI art, and item art. + Planned work is not described as incorporated until its files enter the + project. - chillnfill: contributor of original 3D models for the character bodies and arms, ears and tails, and multiple world props and decorative assets, including trees and bridges. The contributor requested to be credited as @@ -31,7 +31,7 @@ independent team Woofmeow. Voyager is also the original catalog porter credit in PortMaster metadata. Third-party creators are credited with their individual records below. Those -credits do not imply endorsement of straywild, Woofmeow, or its owners. +credits do not imply endorsement of NETfishing, Woofmeow, or its owners. ## License map @@ -41,7 +41,7 @@ Do not describe the complete repository as covered only by the GPL. | --- | --- | | Project-owned software code, shaders, code-oriented scene/resource configuration, tests, build tooling, and server software | GPL-3.0-or-later; source-root `LICENSE` and packaged `GPL-3.0-or-later.txt` | | Project-owned artwork, textures, models, animation, music, audio, narrative content, characters, and other creative assets | Source-root or packaged `ASSET-LICENSE.md` | -| straywild and Woofmeow names, logos, icons, and official identity | Source-root or packaged `TRADEMARKS.md` | +| NETfishing and Woofmeow names, logos, icons, and official identity | Source-root or packaged `TRADEMARKS.md` | | Third-party engines, fonts, sounds, and other external material | Their original terms, recorded below and in adjacent license texts where applicable | | Previously accepted or expressly invited outside contributions | Source-root `CONTRIBUTOR-TERMS.md` plus any separately signed agreement | @@ -50,22 +50,22 @@ the terms of their source material or generating code. Repository location alone does not relicense third-party material. The GPL permits study, modification, redistribution, and forks of covered -code. It does not grant rights to straywild creative assets or branding. The -straywild Asset License separately permits qualifying noncommercial add-on -Mods for official straywild software and narrowly scoped Contribution Forks +code. It does not grant rights to NETfishing creative assets or branding. The +NETfishing Asset License separately permits qualifying noncommercial add-on +Mods for official NETfishing software and narrowly scoped Contribution Forks used to prepare changes for possible upstream inclusion. It does not permit those assets to accompany independent code forks, clones, standalone games, unrelated products, or general-purpose asset packs. A GPL fork that is not a -qualifying Contribution Fork must replace straywild assets and reserved +qualifying Contribution Fork must replace NETfishing assets and reserved branding with independently licensed material and a distinct identity. Project-wide code, asset, branding, or contributor-license changes require -written approval from both straywild owners under their private joint +written approval from both NETfishing owners under their private joint ownership agreement. ## Godot Engine notice -straywild uses Godot Engine under the MIT License: +NETfishing uses Godot Engine under the MIT License: > Copyright (c) 2014-present Godot Engine contributors. > Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. @@ -103,7 +103,7 @@ FreeType for font rendering; portions are copyright The FreeType Project Runtime file: `ui/fonts/seattle_avenue.otf`; source, hash, and original notice: `ui/fonts/Seattle-Avenue-LICENSE.txt`. -Public-domain fonts are not governed by the straywild Asset License. +Public-domain fonts are not governed by the NETfishing Asset License. ## Intake policy @@ -122,7 +122,7 @@ owners' private project records. This public document should contain the credits and license notices needed by recipients; it should not duplicate a changing file inventory that can be derived from the repository itself. -straywild does not accept unsolicited contributions. For work expressly +NETfishing does not accept unsolicited contributions. For work expressly invited by both Owners, maintainers must obtain affirmative agreement to the source-root `CONTRIBUTOR-TERMS.md` and retain the written invitation and agreement in a durable Project record. @@ -132,20 +132,17 @@ locations only and must never appear in scenes or resources. ## Project-created artwork and music -Fish entries without finished replacement artwork use provisional placeholder -artwork by Voyager. Incorporated finished fish and creature artwork is by -Endeavour; work that has not entered this repository is not presented here as -part of the game or attributed as a shipped asset. +The current in-game fish images are provisional artwork by Voyager. Endeavour +is creating replacement fish artwork, but work that has not been incorporated +into this repository is not presented here as part of the game or attributed +as a shipped asset. Endeavour's incorporated 2D contributions include the inventory notepad, -environment and UI artwork, item artwork, finished fish and creature artwork, -and character customization pattern and channel-map artwork. Voyager's -incorporated original work includes 3D assets, the provisional fish -placeholder artwork, the title and dusk music identified above, and the robot -animalese tones. The current starter motorcoach exterior was supplied by a -contributing artist who released its copyright to the project; the original -and cleaned source files are retained in the owners' source-work archive. -Specific contributor exceptions are recorded below and in the in-game credits. +environment and UI artwork, item artwork, and character customization pattern +and channel-map artwork. Voyager's incorporated original work includes 3D +assets, the provisional fish artwork, the title and dusk music identified +above, and the robot animalese tones. Specific contributor exceptions are +recorded below and in the in-game credits. These credits intentionally describe work by creator and contribution family instead of maintaining a second file-by-file asset catalog. Runtime resources @@ -161,8 +158,8 @@ against the repository when this record was revised. | Material | Runtime location | Credit or terms | | --- | --- | --- | -| Kat animalese alphabet and number sounds | `sound/dialogue/animalese/alphanumeric/` | Project-processed derivatives of the original source voice recording supplied by straywild community member kat. | -| Kim animalese alphabet and number sounds | `sound/dialogue/animalese/kim/` | Project-processed derivatives of the original source voice recording supplied by straywild community member kim. | +| Kat animalese alphabet and number sounds | `sound/dialogue/animalese/alphanumeric/` | Project-processed derivatives of the original source voice recording supplied by NETfishing community member kat. | +| Kim animalese alphabet and number sounds | `sound/dialogue/animalese/kim/` | Project-processed derivatives of the original source voice recording supplied by NETfishing community member kim. | | Tuffy font | `ui/fonts/Tuffy_Bold.otf` | Public-domain dedication in `ui/fonts/Tuffy-LICENSE.txt`. | | Seattle Avenue font | `ui/fonts/seattle_avenue.otf` | Public-domain font by JLH Fonts; notice in `ui/fonts/Seattle-Avenue-LICENSE.txt`. | | Fishing fight loop | `audio/sfx/fishing/fighting.wav` | Edited from “Spinning reel.wav” by Freesound user tosha73, sound 509902, CC0. | @@ -195,10 +192,9 @@ https://creativecommons.org/licenses/by/3.0/legalcode. ### Endeavour 2D contribution record Endeavour created the incorporated character customization patterns and -channel maps as well as additional UI, environment, item, fish, and creature -artwork. Voyager's provisional fish placeholder is not part of this credit. -New or replacement art is added to this record only after it is accepted into -the repository. +channel maps as well as additional UI, environment, and item artwork. The +current provisional fish artwork is not part of this credit. New or replacement +art is added to this record only after it is accepted into the repository. The exact current filenames and bytes are intentionally not copied into this document. The character appearance resources and Git history are the @@ -309,9 +305,9 @@ revision-specific inventory. ## Generated resources -Godot `.import` sidecars and other deterministic generated resources are -derived repository resources, not original artwork. `.godot/imported/`, editor -caches, captures, exports, and temporary test data are not tracked. +Godot `.import` sidecars and deterministic shoreline `.tres` meshes are derived +repository resources, not original artwork. `.godot/imported/`, editor caches, +captures, exports, and temporary test data are not tracked. ## Release gate diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 25d3549..9fbd5b9 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -1,6 +1,6 @@ # Development reference -This is the authoritative reference for straywild architecture, engineering +This is the authoritative reference for NETfishing architecture, engineering decisions, content policy, authoring, and validation. ## Architecture @@ -38,16 +38,12 @@ node names, connect persistent and networked state to that data. network services validate and replicate bounded domains such as fishing, sales, shops, item use, profiles, jobs, mail, chat, drawings, time, and weather. -`DiscoveryClient` is an optional directory layer beside `NetworkSession`. A -player host cycles its discovery control through `private`, `direct`, and -`relay`. Private leaves the room unlisted, direct discovery discloses the host -route only after an explicit Join, and relay discovery allocates a UDP privacy -route without making discovery a gameplay authority. Relay joins fail closed -and never silently downgrade to direct. Dedicated servers are always direct: -the game forces direct advertisements and discovery independently rejects a -dedicated relay request. Public room browsing never receives a host address. -The base URL comes from -`network/discovery/base_url`, with `straywild_DISCOVERY_URL` available as a +`DiscoveryClient` is an optional directory layer beside `NetworkSession`. An +open host may publish a short-lived room lease, and the shared Join Game page +may browse compatible leases before handing the selected address back to the +existing direct ENet connection flow. The directory does not carry gameplay +traffic or become a gameplay authority. Its base URL comes from +`network/discovery/base_url`, with `NETFISHING_DISCOVERY_URL` available as a development/deployment override. Friendships are local identity relationships shared across save slots. A live, @@ -57,9 +53,8 @@ friendship; unblocking does not recreate it. Discovery may publish opt-in, short-lived friend presence and deliver invitations only while both games are online. It stores hashed capability identifiers rather than identity fingerprints or a complete friend graph, keeps no durable social records, and -provides no offline delivery. Public joins still use the existing verified -server-identity and ENet connection path. Discovery endpoints remain transient: -they are not shown, added to recent servers, or persisted in the trust store. +provides no offline delivery. Direct joins still use the existing verified +public-room and ENet connection path. The host is authoritative. Clients submit requests or evidence; the host derives trusted context from registered peers, authoritative regions, and @@ -233,10 +228,12 @@ materials local to the scene. ### Shoreline presentation -The visible shoreline treatment is produced entirely by the water materials. -It does not require supplemental shoreline meshes or generation tooling. Keep -shoreline foam and edge-effect work in the water materials rather than adding -terrain-authoring requirements. +The visible shoreline treatment is currently produced by the water materials. +The older smooth-ribbon baker and generated starter-island ribbon resource are +retained as development history/tooling, but the ribbon mesh is disabled and +is not part of the current rendered shoreline. Do not treat a ribbon rebuild +as a normal terrain-authoring requirement or re-enable the mesh as incidental +cleanup. ### Facial-feature textures @@ -264,11 +261,9 @@ copies of the entire customization catalog. ### Texture sampling -straywild artwork uses nearest-neighbor sampling. Do not enable linear, -bilinear, trilinear, or anisotropic texture filtering. Shader samplers must -declare `filter_nearest`. The three canonical repeating terrain textures are -the sole mipmap exception: their projected shader uses nearest-filtered -mipmaps to prevent distance aliasing without smoothing nearby pixels. The +NETfishing artwork always uses nearest-neighbor sampling. Do not enable linear, +bilinear, trilinear, or anisotropic texture filtering, and do not generate +mipmaps. Shader samplers must declare `filter_nearest`. The `TextureSamplingPolicy` autoload applies nearest sampling to 2D canvas items, Sprite3D presentations, imported 3D materials, and dynamically constructed mesh materials at runtime. @@ -282,35 +277,6 @@ godot --headless --path . --script scripts/normalize_texture_imports.gd \ godot --headless --path . --script tests/texture_sampling_validation.gd ``` -### Surface artwork runtime - -Art Kit cells are authoritative palette and author planes, not per-cell nodes -or dictionaries. Keep `SurfaceDrawingCellBuffer` as the live representation; -materialize the legacy cell-array view only for inspection and tests. Finished -artwork uses a full-resolution nearest-neighbor texture on a coarse, -surface-conforming mesh. It discards guide and brush transforms, receives a -distance visibility range, and unloads its render node when far from the local -player while retaining compact session state. - -`surface_drawing_v3` snapshots carry packed palette and participant-index -planes. The host sends late-join snapshots over multiple frames, prioritizing -active and nearby canvases, so adding finished work must not restore a -single-frame snapshot burst. Active editing and finalized artwork have -separate bounded budgets; finalizing a canvas frees active-grid capacity. - -The finalized budget holds 512 maximum-size (128 x 128) canvases. At the -current 0.075-meter cell size, 441 canvases can tile the full 200 x 200-meter -generated-world footprint. If the generated world grows, update the finalized -canvas and cell budgets together and rerun the artwork performance validation. - -Run both focused validations after changing this path: - -```sh -godot --headless --path . --script tests/surface_drawing_validation.gd -godot --headless --path . \ - --script tests/surface_drawing_performance_validation.gd -``` - ### Importing animalese voice sets Animalese clips use one deterministic runtime level and format: -18 dBFS RMS @@ -383,10 +349,10 @@ godot --headless --path . --script tests/fish_catalog_content_validation.gd rm -rf -- "$test_root" ``` -Do not point `straywild_DATA_DIR` at an arbitrary empty directory; it is an +Do not point `NETFISHING_DATA_DIR` at an arbitrary empty directory; it is an explicit portable-data override and must identify a valid data root. The PortMaster launcher is the narrow exception: it also sets -`straywild_CREATE_DATA_DIR=1`, allowing the game to initialize its known empty +`NETFISHING_CREATE_DATA_DIR=1`, allowing the game to initialize its known empty external save directory on first launch. Headless tests cannot prove visual alignment, mouse routing, shader appearance, diff --git a/docs/PORTMASTER.md b/docs/PORTMASTER.md index 374ca22..e8c24f6 100644 --- a/docs/PORTMASTER.md +++ b/docs/PORTMASTER.md @@ -1,15 +1,15 @@ # PortMaster reference -straywild's PortMaster release is a canonical PortMaster package, not a +NETfishing's PortMaster release is a canonical PortMaster package, not a version-named generic ZIP. The installer-facing archive must be named -`straywild.zip`, and its root must contain exactly: +`netfishing.zip`, and its root must contain exactly: ```text -straywild.sh -straywild/ +NETfishing.sh +netfishing/ ``` -`port.json` belongs at `straywild/port.json` in the distributable archive. +`port.json` belongs at `netfishing/port.json` in the distributable archive. The upstream source-submission layout keeps it beside the launcher and port directory, but PortMaster's release builder relocates it into the declared port directory. Do not copy the source-submission layout directly into a @@ -17,7 +17,7 @@ release ZIP. HarbourMaster's installer also relocates recognized non-script files found at an archive root into the detected port directory. That compatibility behavior -masked straywild's former root-level `port.json` during auto-install tests. +masked NETfishing's former root-level `port.json` during auto-install tests. Directly extracting the same archive into `/ports` did not perform the repair. Do not rely on installer relocation; build the distributable layout correctly. @@ -26,34 +26,30 @@ directory. The templates in `scripts/portmaster/` are authoritative. ## Release contract -- `port.json` uses schema version 4, names `straywild.zip`, and marks the +- `port.json` uses schema version 4, names `netfishing.zip`, and marks the self-contained package ready to run. -- `straywild.sh` does not contain a `# PORTMASTER:` signature in the source or +- `NETfishing.sh` does not contain a `# PORTMASTER:` signature in the source or distributable archive. HarbourMaster adds that installation marker when it installs the port. -- The executable is `straywild/straywild.aarch64`. +- The executable is `netfishing/NETfishing.aarch64`. - The package declares AArch64, two analog sticks, GLIBC 2.28, and `weston_pkg_0.2.squashfs`. -- The launcher starts GPTOKEYB with the explicit `straywild.gptk` no-op map. +- The launcher starts GPTOKEYB with the explicit `netfishing.gptk` no-op map. Every keyboard and mouse binding is disabled, leaving only GPTOKEYB's - device-specific force-quit chord while Godot and straywild's controller + device-specific force-quit chord while Godot and NETfishing's controller mapping manager handle gameplay input. The explicit map also avoids the anomalous controller behavior observed on ROCKNIX without a passthrough map. - The launcher calls `pm_platform_helper` for the game executable after starting GPTOKEYB and calls `pm_finish` after the game exits. -- straywild automatically creates player data for new installations under - `ports/saves/straywild/` and does not present the in-game folder picker. +- NETfishing automatically creates player data for new installations under + `ports/saves/netfishing/` and does not present the in-game folder picker. - Existing installations with a selected data root keep that location when upgraded. Device-local data, configuration, and cache remain under - `straywild/conf/data`, `straywild/conf/config`, and - `straywild/conf/cache`. -- A rebrand upgrade copies an existing `netfishing/conf/` tree into the new - `straywild/conf/` tree when the latter does not exist. It also reuses an - existing `ports/saves/netfishing/` data root rather than creating an empty - replacement. New installations use straywild paths exclusively. + `netfishing/conf/data`, `netfishing/conf/config`, and + `netfishing/conf/cache`. - The archive must not contain `conf/`, saves, identities, logs, source files, `.git`, or `.godot` content. -- Release downloads must publish only the canonical `straywild.zip` for this +- Release downloads must publish only the canonical `netfishing.zip` for this platform. Do not also publish a byte-identical versioned PortMaster ZIP; HarbourMaster identifies the port by its canonical archive name and the Forgejo release tag already supplies the version. @@ -67,20 +63,15 @@ are pinned to the same clean `main` commit: bash scripts/build_portmaster.sh ``` -The script deletes and regenerates a PortMaster-specific ARM64 export in -`builds/v/portmaster-arm64/`, stages the package, validates its -structure, and writes: +The script deletes and regenerates the Linux ARM64 export, stages the package, +validates its structure, and writes: ```text -builds/v/straywild.zip +builds/v/netfishing.zip ``` -`--package-only` is reserved for repackaging an already validated -PortMaster-specific ARM64 export. It does not rebuild game content, and verifies -the tagged-export marker written by a prior full build so a generic Linux ARM64 -binary cannot accidentally be repackaged as PortMaster. The standard Linux -ARM64 release staging directory remains separate so building PortMaster cannot -replace the normal Linux ARM64 payload with reduced assets. +`--package-only` is reserved for repackaging an already validated ARM64 export. +It does not rebuild game content. For a packaging-only correction to an already published game release, commit only PortMaster launcher, packaging-script, or PortMaster documentation changes @@ -92,7 +83,7 @@ bash scripts/build_portmaster.sh --package-only --hotfix The hotfix keeps the game executable and PCK tied to the release tag while recording the newer packaging commit separately in `BUILD-INFO.txt`. Replace -the release's existing `straywild.zip`; never move the game release tag. +the release's existing `netfishing.zip`; never move the game release tag. ## Local muOS installation @@ -102,22 +93,22 @@ The muOS auto-install directory is: /mnt/mmc/MUOS/PortMaster/autoinstall/ ``` -For an explicit offline installation test, copy `straywild.zip` to a temporary +For an explicit offline installation test, copy `netfishing.zip` to a temporary device directory and run: ```bash /mnt/mmc/MUOS/PortMaster/harbourmaster \ - --offline --no-check install ./straywild.zip + --offline --no-check install ./netfishing.zip ``` -Before upgrading an existing installation, preserve either the current -`/mnt/mmc/ports/straywild/` paths or the former `/mnt/mmc/ports/netfishing/` -paths on the device. After installation: +Before upgrading an existing installation, preserve +`/mnt/mmc/ports/netfishing/conf/` and `/mnt/mmc/ports/saves/netfishing/` on the +device. After installation: 1. Confirm the installed executable and PCK hashes match the staged release. 2. Confirm HarbourMaster added its `# PORTMASTER:` installation signature to the installed launcher, then confirm the launcher starts GPTOKEYB with - `straywild.gptk` and calls `pm_platform_helper` for the game executable. + `netfishing.gptk` and calls `pm_platform_helper` for the game executable. 3. Confirm `conf/` and the external save directory were not replaced or removed. 4. Launch the installed port through the normal muOS menu. @@ -126,7 +117,7 @@ paths on the device. After installation: Start+Select on most devices. Installing the public PortMaster catalog entry can still install an older -catalog build until the upstream `straywild.zip` is updated. A local release +catalog build until the upstream `netfishing.zip` is updated. A local release test must install the generated local archive explicitly. ## Template provenance @@ -139,7 +130,7 @@ f24daae48f543b3a270a5aa46b5e73a31904bf0c7216d4c8a9e15a8dc48a5eed screenshot.png ``` The remaining catalog metadata assets were copied from the installed official -`straywild.zip` package and are intentionally preserved byte-for-byte: +`netfishing.zip` package and are intentionally preserved byte-for-byte: ```text e2a9d132744684c67865c01eca027a8c9946b4c5a19da57c82f1af0373dc83b7 gameinfo.xml @@ -169,7 +160,7 @@ The device-verified Godot mapping is: - left-stick click `b9`, left trigger `b10`, right trigger `b11`, right-stick click `b12` - D-pad `h0`; left and right sticks `a0..a3` -`scripts/portmaster/straywild.sh` must replace the incompatible SDL2 entry +`scripts/portmaster/NETfishing.sh` must replace the incompatible SDL2 entry with the Godot entry when that SDL2 GUID is selected. Do not append the two entries with a newline. WestonPack reconstructs the wrapped game command through a shell, so raw mapping values passed in that command can be split into @@ -178,14 +169,14 @@ this failure with the `GO-Super Gamepad` mapping. The outer Weston environment also does not reliably preserve the corrected muOS mapping for the game. Write the exact selected mapping to `conf/cache/controller_mapping.txt` before -starting Weston. Weston must launch `launch-straywild.sh`, which reads that +starting Weston. Weston must launch `launch-netfishing.sh`, which reads that file, exports `SDL_GAMECONTROLLERCONFIG`, and immediately replaces itself with the game process. This applies the mapping at the same point as the working 0.10.1 launcher without passing its raw text through WestonPack's command reconstruction. Do not move the mapping back to either side of `westonwrap.sh`. -Always pass `straywild.gptk`, which explicitly unassigns every direct and +Always pass `netfishing.gptk`, which explicitly unassigns every direct and hotkey binding with GPTOKEYB's `\"` value. This keeps GPTOKEYB from injecting keyboard or mouse events on top of Godot's native controller input and retains the device-specific kill chord. Supplying the explicit passthrough map also @@ -218,12 +209,8 @@ The light profile passes these Godot options: - `--max-fps 30` - `--audio-output-latency 40` -It also passes `straywild_PERFORMANCE_PROFILE=light` and -`straywild_LOW_END=1`. Those selectors are honored only by the dedicated -PortMaster export, which carries the immutable `straywild_portmaster` Godot -feature tag; desktop, Android, macOS, generic ARM64, and dedicated-server -builds always use the full presentation even if those environment variables -are present. The game renders the 3D world at 37.5% linear +It also passes `NETFISHING_PERFORMANCE_PROFILE=light` and +`NETFISHING_LOW_END=1`. The game renders the 3D world at 37.5% linear resolution with nearest-neighbor scaling, reducing 3D pixel work by about 86% while the separately rendered UI retains its canonical resolution. The light profile also: @@ -235,7 +222,7 @@ profile also: - keeps the title water and full-window menu patterns static; - replaces the animated cooler water and decorative bubbles with flat water; - disables decorative title-screen fish and bubbles; -- retains title and dusk music while omitting rain ambience; +- retains title and dusk music while omitting rain and shoreline ambience; - reduces rain to 48 particles simulated at 8 FPS; and - replaces procedural sky clouds and 81 moving local cloud patches with one flat cloud ceiling. @@ -257,7 +244,7 @@ omitted ambience or replace the micro textures with desktop-resolution assets. The normal profile otherwise retains the full visual presentation. To opt a capable device into the normal profile, create the persistent file -`straywild/conf/performance_profile` containing exactly: +`netfishing/conf/performance_profile` containing exactly: ```text normal @@ -266,14 +253,13 @@ normal On a typical muOS installation, the full path is: ```text -/mnt/mmc/ports/straywild/conf/performance_profile +/mnt/mmc/ports/netfishing/conf/performance_profile ``` -Set the file to `light`, or remove it, to restore the default. Within the -PortMaster package, an externally provided -`straywild_PERFORMANCE_PROFILE=normal` or `light` environment value takes -precedence over the persistent file. Invalid values safely fall back to the -light profile and are reported in `straywild/log.txt`. +Set the file to `light`, or remove it, to restore the default. An externally +provided `NETFISHING_PERFORMANCE_PROFILE=normal` or `light` environment value +takes precedence over the persistent file. Invalid values safely fall back to +the light profile and are reported in `netfishing/log.txt`. Do not use Godot's low processor mode for the light profile. It reduces idle CPU usage by sleeping between updates and is not a game-performance diff --git a/docs/README-PLAYTEST.txt b/docs/README-PLAYTEST.txt index 98e2029..7b7e285 100644 --- a/docs/README-PLAYTEST.txt +++ b/docs/README-PLAYTEST.txt @@ -1,31 +1,26 @@ -straywild -v0.20.4-alpha -Alpha 0.20.4 +NETfishing +v0.17.1-alpha +Alpha 0.17.1 -Thank you for supporting this private testing release. +Thank you for trying this early private playtest. -straywild is an early multiplayer fishing game. This alpha includes local +NETfishing is an early multiplayer fishing game. This alpha includes local progression, player-hosted and dedicated multiplayer sessions, public room -discovery, player-selected direct or privacy-relayed hosting, and optional -direct UDP connections. Player hosts can cycle discovery through private, -direct, and relay. Dedicated servers are always direct and cannot use the -shared relay. The relay hides peers' addresses from one another but not from -the relay operator. Direct connections expose public IP addresses to the -remote peer and are clearly labeled in game. Expect rough edges and please -keep a backup of any save or identity data you care about. +discovery, and direct UDP connections. Expect rough edges and please keep a +backup of any save or identity data you care about. INSTALLATION 1. Extract the entire ZIP into a new folder. -2. Keep the executable and straywild.pck together. -3. Launch straywild.exe on Windows or straywild on Linux. +2. Keep the executable and netfishing.pck together. +3. Launch netfishing.exe on Windows or netfishing on Linux. Windows may show a warning for an unsigned application. This private build is not code signed. Only run a copy received from the playtest organizer. Linux users may need to allow execution: - chmod +x straywild + chmod +x netfishing CONTROLS @@ -88,8 +83,6 @@ FEATURES TO TRY - Fishing, net gathering, and beach digging - Equipment and consumable use from the hotbar - Fishing Shop sell tray, wallet updates, and persistent upgrades -- Portable RV homes, multiplayer visits, RV storage, and the early decor - purchasing and placement prototype - Seeded generated worlds and the authored starter-island layout - Generated beaches, ponds, lakes, complete rivers, denser forests, varied elevation, and closed coastal cliffs @@ -120,11 +113,9 @@ Please include: KNOWN ALPHA LIMITATIONS -- Direct public sessions may fail behind restrictive NAT or carrier-grade - networks. Player-hosted relay sessions add an extra network hop and may have - more latency. Dedicated servers are direct-only. +- Public sessions remain direct connections; restrictive NAT or carrier-grade + networks may prevent some players from joining. - Multiplayer, dedicated-server deployment, UI, and balance are still alpha. - Some fish and character artwork remains temporary. -- RV exteriors and decor use temporary prototype geometry and presentation. - There is no installer or automatic updater. - Windows builds are unsigned. diff --git a/docs/README.md b/docs/README.md index 444ebc7..05ac0b4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,4 @@ -# straywild documentation +# NETfishing documentation This directory is the single home for maintained project documentation. Start here instead of searching feature, asset, world, or script directories @@ -17,10 +17,10 @@ for local README files. ## Related repositories -- [Discovery service API](https://forge.makearmy.io/woofmeow/straywild-discovery-server/src/branch/main/docs/API.md) +- [Discovery service API](https://forge.makearmy.io/woofmeow/netfishing-discovery-server/src/branch/main/docs/API.md) stays with the service implementation and defines its versioned HTTP contract. -- [Dedicated-server packaging](https://forge.makearmy.io/woofmeow/straywild-dedicated-server/src/branch/main/README.md) +- [Dedicated-server packaging](https://forge.makearmy.io/woofmeow/netfishing-dedicated-server/src/branch/main/README.md) stays with its installer and update scripts. It consumes this repository's attribution and legal notices from the exact pinned game commit instead of maintaining copies. diff --git a/drawing/surface_drawing_canvas.gd b/drawing/surface_drawing_canvas.gd index aaec6f4..01d34d7 100644 --- a/drawing/surface_drawing_canvas.gd +++ b/drawing/surface_drawing_canvas.gd @@ -5,9 +5,6 @@ const GUIDED_PIXEL_FILL: float = 0.88 const SURFACE_OFFSET: float = 0.012 const LAYER_OFFSET_STEP: float = 0.0002 const SURFACE_SAMPLE_DEPTH: float = 0.45 -const FINALIZED_VISIBILITY_RANGE: float = 96.0 -const FINALIZED_VISIBILITY_MARGIN: float = 12.0 -const FINALIZED_MAX_SUBDIVISIONS: int = 32 var canvas_id: String = "" var grid_width: int = 0 @@ -21,7 +18,7 @@ var _surface_origin: Vector3 var _surface_normal: Vector3 var _surface_tangent: Vector3 var _surface_bitangent: Vector3 -var _cell_buffer: SurfaceDrawingCellBuffer +var _cells: Dictionary[int, Dictionary] = {} var _cell_surface_transforms: Array[Transform3D] = [] var _pixel_image: Image var _pixel_texture: ImageTexture @@ -39,15 +36,8 @@ func setup( data: Dictionary, relationships: PlayerRelationshipStore, solid_surface_mask: int = 1, - cell_buffer: SurfaceDrawingCellBuffer = null, ) -> bool: - if ( - (cell_buffer == null and not SurfaceDrawingProtocol.validate_canvas_state(data)) - or ( - cell_buffer != null - and not SurfaceDrawingProtocol.validate_canvas_metadata(data) - ) - ): + if not SurfaceDrawingProtocol.validate_canvas_state(data): return false canvas_id = str(data["canvas_id"]) grid_width = int(data["width"]) @@ -55,6 +45,7 @@ func setup( cell_size = float(data["cell_size"]) revision = int(data["revision"]) creator_fingerprint = str(data["creator_fingerprint"]) + participant_fingerprints = _participants_from_state(data) _finalized = bool(data.get("finalized", false)) _guide_visible = bool(data.get("guide_visible", true)) and not _finalized _layer = int(data.get("layer", 0)) @@ -73,20 +64,12 @@ func setup( _surface_bitangent = _surface_normal.cross(_surface_tangent).normalized() _relationships = relationships _solid_surface_mask = solid_surface_mask - _cell_buffer = cell_buffer - if _cell_buffer == null: - _cell_buffer = SurfaceDrawingCellBuffer.new() - if not _cell_buffer.configure_from_state(data, true): - return false - elif _cell_buffer.width != grid_width or _cell_buffer.height != grid_height: - return false - participant_fingerprints = _cell_buffer.get_participants() - if _finalized: - _build_finalized_pixel_renderer() - else: - var samples: Dictionary = _sample_grid_vertices() - _build_grid(samples) - _build_pixel_renderer(samples) + _cells.clear() + for cell_value: Variant in data["cells"]: + var cell: Dictionary = cell_value + _cells[_cell_key(int(cell["x"]), int(cell["y"]))] = cell.duplicate(true) + _build_grid() + _build_pixel_renderer() return true @@ -97,25 +80,16 @@ func apply_update(data: Dictionary) -> bool: or int(data["revision"]) <= revision ): return false - if _cell_buffer == null or not _cell_buffer.apply_edits(data["edits"]): - return false - return _finish_buffered_update(data) - - -func apply_buffered_update(data: Dictionary) -> bool: - if ( - not SurfaceDrawingProtocol.validate_canvas_update(data) - or str(data["canvas_id"]) != canvas_id - or int(data["revision"]) <= revision - or _cell_buffer == null - ): - return false - return _finish_buffered_update(data) - - -func _finish_buffered_update(data: Dictionary) -> bool: - _cell_buffer.ensure_participants(data.get("participant_fingerprints", [])) - participant_fingerprints = _cell_buffer.get_participants() + for edit_value: Variant in data["edits"]: + var edit: Dictionary = edit_value + var key: int = _cell_key(int(edit["x"]), int(edit["y"])) + if str(edit["color_id"]).is_empty(): + _cells.erase(key) + else: + _cells[key] = edit.duplicate(true) + participant_fingerprints = _participants_from_update( + data, participant_fingerprints + ) revision = int(data["revision"]) if is_hidden_by_relationship(): _rebuild_pixel_image() @@ -136,18 +110,12 @@ func apply_guide_update(data: Dictionary) -> bool: participant_fingerprints = _participants_from_update( data, participant_fingerprints ) - if _cell_buffer != null: - _cell_buffer.ensure_participants(participant_fingerprints) - participant_fingerprints = _cell_buffer.get_participants() _finalized = bool(data["finalized"]) _guide_visible = bool(data["guide_visible"]) and not _finalized if _finalized: _destroy_grid() - _cell_surface_transforms.clear() - _build_finalized_pixel_renderer() else: _refresh_grid_visibility() - _configure_render_distance() return true @@ -187,7 +155,11 @@ func get_rendered_pixel_size() -> float: func get_rendered_pixel_count() -> int: if is_hidden_by_relationship(): return 0 - return _cell_buffer.get_painted_count() if _cell_buffer != null else 0 + var count: int = 0 + for cell: Dictionary in _cells.values(): + if not _visible_cell_color(cell).is_equal_approx(Color.TRANSPARENT): + count += 1 + return count func get_export_image() -> Image: @@ -283,10 +255,18 @@ func get_cell_surface_transform( func get_authoritative_cells() -> Array[Dictionary]: - return _cell_buffer.to_cells() if _cell_buffer != null else [] + var result: Array[Dictionary] = [] + for value: Dictionary in _cells.values(): + result.append(value.duplicate(true)) + result.sort_custom(func(a: Dictionary, b: Dictionary) -> bool: + var a_key: int = _cell_key(int(a["x"]), int(a["y"])) + var b_key: int = _cell_key(int(b["x"]), int(b["y"])) + return a_key < b_key + ) + return result -func _build_grid(samples: Dictionary) -> void: +func _build_grid() -> void: if _grid_instance != null: _grid_instance.queue_free() _grid_instance = null @@ -299,14 +279,50 @@ func _build_grid(samples: Dictionary) -> void: material.albedo_color = Color(0.75, 0.94, 0.96, 0.38) material.no_depth_test = false immediate.surface_begin(Mesh.PRIMITIVE_LINES, material) + var half_width: float = float(grid_width) * cell_size * 0.5 + var half_height: float = float(grid_height) * cell_size * 0.5 + var sampled_vertices: Dictionary[Vector2i, Dictionary] = {} for x: int in range(grid_width + 1): + var horizontal: float = -half_width + float(x) * cell_size for y_segment: int in range(grid_height): - _add_grid_vertex(immediate, x, y_segment, samples) - _add_grid_vertex(immediate, x, y_segment + 1, samples) + var start_vertical: float = ( + -half_height + float(y_segment) * cell_size + ) + _add_grid_vertex( + immediate, + _surface_origin + _surface_tangent * horizontal + + _surface_bitangent * start_vertical, + Vector2i(x, y_segment), + sampled_vertices, + ) + _add_grid_vertex( + immediate, + _surface_origin + _surface_tangent * horizontal + + _surface_bitangent * (start_vertical + cell_size), + Vector2i(x, y_segment + 1), + sampled_vertices, + ) for y: int in range(grid_height + 1): + var vertical: float = -half_height + float(y) * cell_size for x_segment: int in range(grid_width): - _add_grid_vertex(immediate, x_segment, y, samples) - _add_grid_vertex(immediate, x_segment + 1, y, samples) + var start_horizontal: float = ( + -half_width + float(x_segment) * cell_size + ) + _add_grid_vertex( + immediate, + _surface_origin + _surface_tangent * start_horizontal + + _surface_bitangent * vertical, + Vector2i(x_segment, y), + sampled_vertices, + ) + _add_grid_vertex( + immediate, + _surface_origin + + _surface_tangent * (start_horizontal + cell_size) + + _surface_bitangent * vertical, + Vector2i(x_segment + 1, y), + sampled_vertices, + ) immediate.surface_end() _grid_instance = MeshInstance3D.new() _grid_instance.name = "PixelGrid" @@ -318,56 +334,63 @@ func _build_grid(samples: Dictionary) -> void: func _add_grid_vertex( immediate: ImmediateMesh, - x: int, - y: int, - samples: Dictionary, + world_point: Vector3, + grid_point: Vector2i, + sampled_vertices: Dictionary[Vector2i, Dictionary], ) -> void: + var sampled: Dictionary = sampled_vertices.get(grid_point, {}) + if sampled.is_empty(): + sampled = _sample_surface(world_point) + sampled_vertices[grid_point] = sampled + var point: Vector3 = sampled["position"] + var normal: Vector3 = sampled["normal"] immediate.surface_add_vertex( - _sample_position(samples, x, y, _surface_offset() * 1.5) + to_local(point + normal * (_surface_offset() * 1.5)) ) -func _build_pixel_renderer(samples: Dictionary) -> void: +func _build_pixel_renderer() -> void: if _pixel_instance != null: _pixel_instance.queue_free() _pixel_instance = null - var vertex_width: int = grid_width + 1 - var vertex_count: int = vertex_width * (grid_height + 1) var cell_count: int = grid_width * grid_height var vertices := PackedVector3Array() var texture_coordinates := PackedVector2Array() var indices := PackedInt32Array() - vertices.resize(vertex_count) - texture_coordinates.resize(vertex_count) + vertices.resize(cell_count * 4) + texture_coordinates.resize(cell_count * 4) indices.resize(cell_count * 6) _cell_surface_transforms.clear() - if not _finalized: - _cell_surface_transforms.resize(cell_count) - for y: int in range(grid_height + 1): - for x: int in range(grid_width + 1): - var vertex_index: int = y * vertex_width + x - vertices[vertex_index] = _sample_position( - samples, x, y, _surface_offset() - ) - texture_coordinates[vertex_index] = Vector2( - float(x) / float(grid_width), - 1.0 - float(y) / float(grid_height), - ) + _cell_surface_transforms.resize(cell_count) for y: int in range(grid_height): for x: int in range(grid_width): var cell_index: int = _cell_key(x, y) - if not _finalized: - _cell_surface_transforms[cell_index] = _transform_from_samples( - samples, x, y - ) - var vertex_offset: int = y * vertex_width + x + var surface_transform := _sample_cell_transform(x, y, 1.0) + _cell_surface_transforms[cell_index] = surface_transform + var center: Vector3 = surface_transform.origin + var horizontal: Vector3 = surface_transform.basis.x * 0.5 + var vertical: Vector3 = surface_transform.basis.y * 0.5 + var vertex_offset: int = cell_index * 4 + vertices[vertex_offset] = center - horizontal - vertical + vertices[vertex_offset + 1] = center + horizontal - vertical + vertices[vertex_offset + 2] = center + horizontal + vertical + vertices[vertex_offset + 3] = center - horizontal + vertical + var image_row: int = _image_y(y) + var u_min: float = float(x) / float(grid_width) + var u_max: float = float(x + 1) / float(grid_width) + var v_min: float = float(image_row) / float(grid_height) + var v_max: float = float(image_row + 1) / float(grid_height) + texture_coordinates[vertex_offset] = Vector2(u_min, v_max) + texture_coordinates[vertex_offset + 1] = Vector2(u_max, v_max) + texture_coordinates[vertex_offset + 2] = Vector2(u_max, v_min) + texture_coordinates[vertex_offset + 3] = Vector2(u_min, v_min) var index_offset: int = cell_index * 6 indices[index_offset] = vertex_offset indices[index_offset + 1] = vertex_offset + 1 - indices[index_offset + 2] = vertex_offset + vertex_width + 1 + indices[index_offset + 2] = vertex_offset + 2 indices[index_offset + 3] = vertex_offset - indices[index_offset + 4] = vertex_offset + vertex_width + 1 - indices[index_offset + 5] = vertex_offset + vertex_width + indices[index_offset + 4] = vertex_offset + 2 + indices[index_offset + 5] = vertex_offset + 3 _rebuild_pixel_image() var arrays: Array = [] arrays.resize(Mesh.ARRAY_MAX) @@ -391,103 +414,21 @@ func _build_pixel_renderer(samples: Dictionary) -> void: _pixel_instance.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF add_child(_pixel_instance) _pixel_instance.visible = not is_hidden_by_relationship() - _configure_render_distance() - - -func _build_finalized_pixel_renderer() -> void: - if _pixel_instance != null: - _pixel_instance.queue_free() - _pixel_instance = null - var step: int = maxi( - 1, - ceili(float(grid_width) / float(FINALIZED_MAX_SUBDIVISIONS)), - ) - var coordinates := PackedInt32Array() - var coordinate: int = 0 - while coordinate < grid_width: - coordinates.append(coordinate) - coordinate += step - if coordinates.is_empty() or coordinates[-1] != grid_width: - coordinates.append(grid_width) - var vertex_width: int = coordinates.size() - var vertices := PackedVector3Array() - var texture_coordinates := PackedVector2Array() - var indices := PackedInt32Array() - vertices.resize(vertex_width * vertex_width) - texture_coordinates.resize(vertex_width * vertex_width) - indices.resize((vertex_width - 1) * (vertex_width - 1) * 6) - var half_width: float = float(grid_width) * cell_size * 0.5 - var half_height: float = float(grid_height) * cell_size * 0.5 - for lattice_y: int in vertex_width: - var cell_y: int = coordinates[lattice_y] - var vertical: float = -half_height + float(cell_y) * cell_size - for lattice_x: int in vertex_width: - var cell_x: int = coordinates[lattice_x] - var horizontal: float = -half_width + float(cell_x) * cell_size - var expected: Vector3 = ( - _surface_origin - + _surface_tangent * horizontal - + _surface_bitangent * vertical - ) - var sampled: Dictionary = _sample_surface(expected) - var vertex_index: int = lattice_y * vertex_width + lattice_x - var point: Vector3 = sampled["position"] - var normal: Vector3 = sampled["normal"] - vertices[vertex_index] = to_local( - point + normal * _surface_offset() - ) - texture_coordinates[vertex_index] = Vector2( - float(cell_x) / float(grid_width), - 1.0 - float(cell_y) / float(grid_height), - ) - for lattice_y: int in range(vertex_width - 1): - for lattice_x: int in range(vertex_width - 1): - var cell_index: int = lattice_y * (vertex_width - 1) + lattice_x - var vertex_offset: int = lattice_y * vertex_width + lattice_x - var index_offset: int = cell_index * 6 - indices[index_offset] = vertex_offset - indices[index_offset + 1] = vertex_offset + 1 - indices[index_offset + 2] = vertex_offset + vertex_width + 1 - indices[index_offset + 3] = vertex_offset - indices[index_offset + 4] = vertex_offset + vertex_width + 1 - indices[index_offset + 5] = vertex_offset + vertex_width - if _pixel_image == null or _pixel_texture == null: - _rebuild_pixel_image() - var arrays: Array = [] - arrays.resize(Mesh.ARRAY_MAX) - arrays[Mesh.ARRAY_VERTEX] = vertices - arrays[Mesh.ARRAY_TEX_UV] = texture_coordinates - arrays[Mesh.ARRAY_INDEX] = indices - var mesh := ArrayMesh.new() - mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays) - var material := StandardMaterial3D.new() - material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED - material.albedo_color = Color.WHITE - material.albedo_texture = _pixel_texture - material.texture_filter = BaseMaterial3D.TEXTURE_FILTER_NEAREST - material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA_SCISSOR - material.alpha_scissor_threshold = 0.5 - material.cull_mode = BaseMaterial3D.CULL_DISABLED - mesh.surface_set_material(0, material) - _pixel_instance = MeshInstance3D.new() - _pixel_instance.name = "ArtworkTexture" - _pixel_instance.mesh = mesh - _pixel_instance.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF - add_child(_pixel_instance) - _pixel_instance.visible = not is_hidden_by_relationship() - _configure_render_distance() func _rebuild_pixel_image() -> void: - if _cell_buffer == null: - return - _pixel_image = Image.create_from_data( - grid_width, - grid_height, - false, - Image.FORMAT_RGBA8, - _cell_buffer.to_rgba8_data(is_hidden_by_relationship()), - ) + if ( + _pixel_image == null + or _pixel_image.get_width() != grid_width + or _pixel_image.get_height() != grid_height + ): + _pixel_image = Image.create( + grid_width, grid_height, false, Image.FORMAT_RGBA8 + ) + _pixel_image.fill(Color.TRANSPARENT) + if not is_hidden_by_relationship(): + for cell: Dictionary in _cells.values(): + _set_image_cell(int(cell["x"]), int(cell["y"]), cell) if _pixel_texture == null: _pixel_texture = ImageTexture.create_from_image(_pixel_image) else: @@ -502,7 +443,7 @@ func _apply_pixel_edits(edits: Array) -> void: var edit: Dictionary = edit_value var x: int = int(edit["x"]) var y: int = int(edit["y"]) - var cell: Dictionary = _cell_buffer.get_cell(x, y) + var cell: Dictionary = _cells.get(_cell_key(x, y), {}) _set_image_cell(x, y, cell) _pixel_texture.update(_pixel_image) @@ -534,78 +475,6 @@ func _image_y(cell_y: int) -> int: return grid_height - 1 - cell_y -func _sample_grid_vertices() -> Dictionary: - var vertex_width: int = grid_width + 1 - var vertex_count: int = vertex_width * (grid_height + 1) - var positions := PackedVector3Array() - var normals := PackedVector3Array() - positions.resize(vertex_count) - normals.resize(vertex_count) - var half_width: float = float(grid_width) * cell_size * 0.5 - var half_height: float = float(grid_height) * cell_size * 0.5 - var inverse_basis: Basis = global_basis.inverse() - for y: int in range(grid_height + 1): - var vertical: float = -half_height + float(y) * cell_size - for x: int in range(grid_width + 1): - var horizontal: float = -half_width + float(x) * cell_size - var expected: Vector3 = ( - _surface_origin - + _surface_tangent * horizontal - + _surface_bitangent * vertical - ) - var sampled: Dictionary = _sample_surface(expected) - var index: int = y * vertex_width + x - positions[index] = to_local(sampled["position"]) - normals[index] = ( - inverse_basis * (sampled["normal"] as Vector3) - ).normalized() - return {"positions": positions, "normals": normals} - - -func _sample_position( - samples: Dictionary, - x: int, - y: int, - offset: float, -) -> Vector3: - var index: int = y * (grid_width + 1) + x - var positions: PackedVector3Array = samples["positions"] - var normals: PackedVector3Array = samples["normals"] - return positions[index] + normals[index] * offset - - -func _transform_from_samples( - samples: Dictionary, - x: int, - y: int, -) -> Transform3D: - var bottom_left: Vector3 = _sample_position( - samples, x, y, _surface_offset() - ) - var bottom_right: Vector3 = _sample_position( - samples, x + 1, y, _surface_offset() - ) - var top_left: Vector3 = _sample_position( - samples, x, y + 1, _surface_offset() - ) - var top_right: Vector3 = _sample_position( - samples, x + 1, y + 1, _surface_offset() - ) - var horizontal: Vector3 = ( - (bottom_right - bottom_left) + (top_right - top_left) - ) * 0.5 - var vertical: Vector3 = ( - (top_left - bottom_left) + (top_right - bottom_right) - ) * 0.5 - var normal: Vector3 = horizontal.cross(vertical).normalized() - if horizontal.is_zero_approx() or vertical.is_zero_approx() or normal.is_zero_approx(): - return _sample_cell_transform(x, y, 1.0) - var center: Vector3 = ( - bottom_left + bottom_right + top_left + top_right - ) * 0.25 - return Transform3D(Basis(horizontal, vertical, normal), center) - - func _sample_cell_transform( x: int, y: int, @@ -680,17 +549,6 @@ func _refresh_grid_visibility() -> void: ) -func _configure_render_distance() -> void: - if _pixel_instance == null: - return - _pixel_instance.visibility_range_end = ( - FINALIZED_VISIBILITY_RANGE if _finalized else 0.0 - ) - _pixel_instance.visibility_range_end_margin = ( - FINALIZED_VISIBILITY_MARGIN if _finalized else 0.0 - ) - - func _participants_from_state(data: Dictionary) -> Array[String]: var result: Array[String] = [] _append_participant(result, str(data.get("creator_fingerprint", ""))) diff --git a/drawing/surface_drawing_cell_buffer.gd b/drawing/surface_drawing_cell_buffer.gd deleted file mode 100644 index ca2e7b3..0000000 --- a/drawing/surface_drawing_cell_buffer.gd +++ /dev/null @@ -1,284 +0,0 @@ -# SPDX-License-Identifier: GPL-3.0-or-later -class_name SurfaceDrawingCellBuffer -extends RefCounted - -const ENCODING := "palette_author_planes_v1" - -var width: int = 0 -var height: int = 0 - -var _color_indices := PackedByteArray() -var _author_indices := PackedInt32Array() -var _participants: Array[String] = [] -var _participant_slots: Dictionary[String, int] = {} -var _author_masks: Dictionary[int, PackedByteArray] = {} -var _painted_count: int = 0 - - -func configure_from_state( - data: Dictionary, - already_validated: bool = false, -) -> bool: - if not already_validated and not SurfaceDrawingProtocol.validate_canvas_state(data): - return false - width = int(data["width"]) - height = int(data["height"]) - _reset_planes() - for value: Variant in data.get("participant_fingerprints", []): - _add_participant(str(value)) - _add_participant(str(data.get("creator_fingerprint", ""))) - if str(data.get("cell_encoding", "")) == ENCODING: - return _configure_packed( - data.get("cell_colors", PackedByteArray()), - data.get("cell_authors", PackedInt32Array()), - ) - for value: Variant in data.get("cells", []): - if typeof(value) != TYPE_DICTIONARY or not _apply_edit(value): - return false - return true - - -func apply_edits(edits: Array) -> bool: - for value: Variant in edits: - if typeof(value) != TYPE_DICTIONARY or not _apply_edit(value): - return false - return true - - -func ensure_participants(values: Array) -> bool: - for value: Variant in values: - if _add_participant(str(value)) <= 0: - return false - return true - - -func get_cell(x: int, y: int) -> Dictionary: - var key: int = _key(x, y) - if key < 0 or _color_indices[key] == 0: - return {} - var author_slot: int = _author_indices[key] - return { - "x": x, - "y": y, - "color_id": str( - SurfaceDrawingPalette.id_for_palette_index(_color_indices[key]) - ), - "author_fingerprint": ( - _participants[author_slot - 1] - if author_slot > 0 and author_slot <= _participants.size() - else "" - ), - } - - -func get_cell_value(x: int, y: int) -> Dictionary: - var cell: Dictionary = get_cell(x, y) - if cell.is_empty(): - return {} - return { - "color_id": cell["color_id"], - "author_fingerprint": cell["author_fingerprint"], - } - - -func get_painted_count() -> int: - return _painted_count - - -func get_participants() -> Array[String]: - return _participants.duplicate() - - -func get_author_cell_keys(fingerprint: String) -> PackedInt32Array: - var slot: int = int(_participant_slots.get(fingerprint, 0)) - var mask: PackedByteArray = _author_masks.get(slot, PackedByteArray()) - var result := PackedInt32Array() - if slot <= 0 or mask.is_empty(): - return result - for key: int in width * height: - if _mask_has(mask, key): - result.append(key) - return result - - -func to_cells() -> Array[Dictionary]: - var result: Array[Dictionary] = [] - for key: int in width * height: - if _color_indices[key] == 0: - continue - result.append(get_cell(key % width, floori(float(key) / float(width)))) - return result - - -func to_compact_fields() -> Dictionary: - return { - "cell_encoding": ENCODING, - "cell_colors": _color_indices.duplicate(), - "cell_authors": _author_indices.duplicate(), - "participant_fingerprints": get_participants(), - } - - -func to_rgba8_data(hidden: bool = false) -> PackedByteArray: - var result := PackedByteArray() - result.resize(width * height * 4) - # Match Image.fill(Color.TRANSPARENT): transparent texels retain white RGB, - # preventing dark fringes if filtering is ever changed by a platform driver. - for pixel_index: int in width * height: - var offset: int = pixel_index * 4 - result[offset] = 255 - result[offset + 1] = 255 - result[offset + 2] = 255 - if hidden: - return result - for key: int in width * height: - var palette_index: int = _color_indices[key] - if palette_index == 0: - continue - var x: int = key % width - var y: int = floori(float(key) / float(width)) - var image_key: int = (height - 1 - y) * width + x - var offset: int = image_key * 4 - var color: Color = SurfaceDrawingPalette.color_for_palette_index( - palette_index - ) - result[offset] = roundi(color.r * 255.0) - result[offset + 1] = roundi(color.g * 255.0) - result[offset + 2] = roundi(color.b * 255.0) - result[offset + 3] = roundi(color.a * 255.0) - return result - - -func estimated_storage_bytes() -> int: - var masks_size: int = 0 - for mask: PackedByteArray in _author_masks.values(): - masks_size += mask.size() - return _color_indices.size() + _author_indices.size() * 4 + masks_size - - -func _configure_packed(colors: Variant, authors: Variant) -> bool: - if ( - typeof(colors) != TYPE_PACKED_BYTE_ARRAY - or typeof(authors) != TYPE_PACKED_INT32_ARRAY - ): - return false - var packed_colors: PackedByteArray = colors - var packed_authors: PackedInt32Array = authors - if ( - packed_colors.size() != width * height - or packed_authors.size() != width * height - ): - return false - _color_indices = packed_colors.duplicate() - _author_indices = packed_authors.duplicate() - _painted_count = 0 - for key: int in width * height: - var color_index: int = _color_indices[key] - var author_slot: int = _author_indices[key] - if color_index == 0: - if author_slot != 0: - return false - continue - if ( - color_index > SurfaceDrawingPalette.COLORS.size() - or author_slot <= 0 - or author_slot > _participants.size() - ): - return false - _painted_count += 1 - _set_author_mask_bit(author_slot, key, true) - return true - - -func _apply_edit(value: Dictionary) -> bool: - var x: int = int(value.get("x", -1)) - var y: int = int(value.get("y", -1)) - var key: int = _key(x, y) - if key < 0: - return false - var color_id := StringName(str(value.get("color_id", ""))) - var next_color_index: int = ( - SurfaceDrawingPalette.palette_index_for_id(color_id) - if not color_id.is_empty() - else 0 - ) - if not color_id.is_empty() and next_color_index <= 0: - return false - var next_author_slot: int = 0 - if next_color_index > 0: - next_author_slot = _add_participant( - str(value.get("author_fingerprint", "")) - ) - if next_author_slot <= 0: - return false - var previous_color_index: int = _color_indices[key] - var previous_author_slot: int = _author_indices[key] - if previous_color_index == next_color_index and previous_author_slot == next_author_slot: - return true - if previous_author_slot > 0: - _set_author_mask_bit(previous_author_slot, key, false) - if previous_color_index == 0 and next_color_index > 0: - _painted_count += 1 - elif previous_color_index > 0 and next_color_index == 0: - _painted_count -= 1 - _color_indices[key] = next_color_index - _author_indices[key] = next_author_slot - if next_author_slot > 0: - _set_author_mask_bit(next_author_slot, key, true) - return true - - -func _reset_planes() -> void: - _color_indices.resize(width * height) - _color_indices.fill(0) - _author_indices.resize(width * height) - _author_indices.fill(0) - _participants.clear() - _participant_slots.clear() - _author_masks.clear() - _painted_count = 0 - - -func _add_participant(fingerprint: String) -> int: - var existing: int = int(_participant_slots.get(fingerprint, 0)) - if existing > 0: - return existing - if not NetworkIdentityCrypto.valid_fingerprint(fingerprint): - return 0 - if _participants.size() >= SurfaceDrawingProtocol.MAX_PARTICIPANTS: - return 0 - _participants.append(fingerprint) - var slot: int = _participants.size() - _participant_slots[fingerprint] = slot - return slot - - -func _set_author_mask_bit(slot: int, key: int, enabled: bool) -> void: - if slot <= 0 or key < 0: - return - var mask: PackedByteArray = _author_masks.get(slot, PackedByteArray()) - var required_size: int = ceili(float(width * height) / 8.0) - if mask.size() != required_size: - mask.resize(required_size) - var byte_index: int = floori(float(key) / 8.0) - var bit: int = 1 << (key % 8) - if enabled: - mask[byte_index] = mask[byte_index] | bit - else: - mask[byte_index] = mask[byte_index] & (~bit & 0xff) - _author_masks[slot] = mask - - -func _mask_has(mask: PackedByteArray, key: int) -> bool: - var byte_index: int = floori(float(key) / 8.0) - return ( - byte_index >= 0 - and byte_index < mask.size() - and (mask[byte_index] & (1 << (key % 8))) != 0 - ) - - -func _key(x: int, y: int) -> int: - if x < 0 or x >= width or y < 0 or y >= height: - return -1 - return y * width + x diff --git a/drawing/surface_drawing_cell_buffer.gd.uid b/drawing/surface_drawing_cell_buffer.gd.uid deleted file mode 100644 index 1910bdf..0000000 --- a/drawing/surface_drawing_cell_buffer.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b4clw478edbnk diff --git a/drawing/surface_drawing_palette.gd b/drawing/surface_drawing_palette.gd index 4a3b734..c8bfc8e 100644 --- a/drawing/surface_drawing_palette.gd +++ b/drawing/surface_drawing_palette.gd @@ -45,31 +45,6 @@ static func get_color_ids() -> Array[StringName]: return result -static func palette_index_for_id(color_id: StringName) -> int: - for index: int in COLORS.size(): - if StringName(COLORS[index].get("id", &"")) == color_id: - return index + 1 - return 0 - - -static func id_for_palette_index(palette_index: int) -> StringName: - var index: int = palette_index - 1 - return ( - StringName(COLORS[index].get("id", &"")) - if index >= 0 and index < COLORS.size() - else StringName() - ) - - -static func color_for_palette_index(palette_index: int) -> Color: - var index: int = palette_index - 1 - return ( - COLORS[index].get("color", Color.TRANSPARENT) - if index >= 0 and index < COLORS.size() - else Color.TRANSPARENT - ) - - static func filter_unlocked_ids( unlocked_ids: Array[StringName], ) -> Array[StringName]: diff --git a/drawing/surface_drawing_placement.gd b/drawing/surface_drawing_placement.gd index 7fb0e25..bfa1abc 100644 --- a/drawing/surface_drawing_placement.gd +++ b/drawing/surface_drawing_placement.gd @@ -25,7 +25,7 @@ static func resolve( } var nearest_distance: float = SNAP_DISTANCE for state: Dictionary in canvas_states: - if not SurfaceDrawingProtocol.validate_canvas_metadata(state): + if not SurfaceDrawingProtocol.validate_canvas_state(state): continue var anchor_normal: Vector3 = SurfaceDrawingProtocol.array_to_vector( state["normal"] diff --git a/drawing/surface_drawing_protocol.gd b/drawing/surface_drawing_protocol.gd index b31d9c0..ff132f8 100644 --- a/drawing/surface_drawing_protocol.gd +++ b/drawing/surface_drawing_protocol.gd @@ -1,7 +1,7 @@ class_name SurfaceDrawingProtocol extends RefCounted -const CAPABILITY: StringName = &"surface_drawing_v3" +const CAPABILITY: StringName = &"surface_drawing_v2" const RELIABLE_CHANNEL: int = NetworkProtocol.DRAWING_RELIABLE_CHANNEL const GRID_SIZES: Array[int] = [16, 32, 64, 128] const DEFAULT_GRID_SIZE: int = 16 @@ -11,12 +11,8 @@ const GRID_WIDTH: int = DEFAULT_GRID_SIZE const GRID_HEIGHT: int = DEFAULT_GRID_SIZE const CELL_SIZE: float = 0.075 const MAX_ACTIVE_CANVASES: int = 24 -const MAX_FINALIZED_CANVASES: int = 512 -const MAX_CANVASES: int = MAX_ACTIVE_CANVASES + MAX_FINALIZED_CANVASES -const MAX_ACTIVE_GRID_CELLS: int = 49152 -const MAX_FINALIZED_GRID_CELLS: int = 8 * 1024 * 1024 -# Compatibility alias for code concerned only with live editing capacity. -const MAX_SESSION_GRID_CELLS: int = MAX_ACTIVE_GRID_CELLS +const MAX_CANVASES: int = 48 +const MAX_SESSION_GRID_CELLS: int = 49152 const MAX_EDITS_PER_REQUEST: int = 16 const MAX_CANVAS_ID_LENGTH: int = 64 const MAX_REQUEST_ID_LENGTH: int = 64 @@ -26,7 +22,6 @@ const MAX_SESSION_ID_LENGTH: int = 96 # for a complete room turnover while never accepting unattributed edits. const MAX_PARTICIPANTS: int = 256 const MAX_COORDINATE: float = 10000.0 -const CELL_ENCODING := "palette_author_planes_v1" static func validate_canvas_request(data: Variant) -> bool: @@ -127,91 +122,57 @@ static func validate_canvas_state(data: Variant) -> bool: if typeof(data) != TYPE_DICTIONARY: return false var value: Dictionary = data - if not validate_canvas_metadata(value): - return false - var participants: Array = value.get("participant_fingerprints", []) - if not participants.is_empty() and str(value["creator_fingerprint"]) not in participants: - return false - if typeof(value.get("cells")) == TYPE_ARRAY: - var cells: Array = value["cells"] - var grid_width: int = int(value["width"]) - var grid_height: int = int(value["height"]) - if cells.size() > grid_width * grid_height: - return false - for cell_value: Variant in cells: - if ( - not validate_authoritative_cell(cell_value) - or int((cell_value as Dictionary)["x"]) >= grid_width - or int((cell_value as Dictionary)["y"]) >= grid_height - ): - return false - if ( - not participants.is_empty() - and str((cell_value as Dictionary)["author_fingerprint"]) - not in participants - ): - return false - return true if ( - str(value.get("cell_encoding", "")) != CELL_ENCODING - or typeof(value.get("cell_colors")) != TYPE_PACKED_BYTE_ARRAY - or typeof(value.get("cell_authors")) != TYPE_PACKED_INT32_ARRAY - or participants.is_empty() - ): - return false - var colors: PackedByteArray = value["cell_colors"] - var authors: PackedInt32Array = value["cell_authors"] - var expected_size: int = int(value["width"]) * int(value["height"]) - if colors.size() != expected_size or authors.size() != expected_size: - return false - for index: int in expected_size: - var color_index: int = colors[index] - var author_slot: int = authors[index] - if color_index == 0: - if author_slot != 0: - return false - elif ( - color_index > SurfaceDrawingPalette.COLORS.size() - or author_slot <= 0 - or author_slot > participants.size() - ): - return false - return true - - -static func validate_canvas_metadata(data: Variant) -> bool: - if typeof(data) != TYPE_DICTIONARY: - return false - var value: Dictionary = data - return ( - typeof(value.get("session_id")) == TYPE_STRING - and not str(value["session_id"]).is_empty() - and str(value["session_id"]).length() <= MAX_SESSION_ID_LENGTH - and typeof(value.get("canvas_id")) == TYPE_STRING - and not str(value["canvas_id"]).is_empty() - and str(value["canvas_id"]).length() <= MAX_CANVAS_ID_LENGTH - and _valid_vector(value.get("origin")) - and _valid_vector(value.get("normal")) - and _valid_vector(value.get("tangent")) - and typeof(value.get("width")) == TYPE_INT - and int(value["width"]) in GRID_SIZES - and typeof(value.get("height")) == TYPE_INT - and int(value["height"]) == int(value["width"]) - and typeof(value.get("cell_size")) in [TYPE_FLOAT, TYPE_INT] - and is_equal_approx(float(value["cell_size"]), CELL_SIZE) - and typeof(value.get("revision")) == TYPE_INT - and int(value["revision"]) >= 0 - and typeof(value.get("guide_visible", true)) == TYPE_BOOL - and typeof(value.get("finalized", false)) == TYPE_BOOL - and typeof(value.get("layer", 0)) == TYPE_INT - and int(value.get("layer", 0)) >= 0 - and NetworkIdentityCrypto.valid_fingerprint( + typeof(value.get("session_id")) != TYPE_STRING + or str(value["session_id"]).is_empty() + or str(value["session_id"]).length() > MAX_SESSION_ID_LENGTH + or typeof(value.get("canvas_id")) != TYPE_STRING + or str(value["canvas_id"]).is_empty() + or str(value["canvas_id"]).length() > MAX_CANVAS_ID_LENGTH + or not _valid_vector(value.get("origin")) + or not _valid_vector(value.get("normal")) + or not _valid_vector(value.get("tangent")) + or typeof(value.get("width")) != TYPE_INT + or int(value["width"]) not in GRID_SIZES + or typeof(value.get("height")) != TYPE_INT + or int(value["height"]) != int(value["width"]) + or typeof(value.get("cell_size")) not in [TYPE_FLOAT, TYPE_INT] + or not is_equal_approx(float(value["cell_size"]), CELL_SIZE) + or typeof(value.get("revision")) != TYPE_INT + or int(value["revision"]) < 0 + or typeof(value.get("guide_visible", true)) != TYPE_BOOL + or typeof(value.get("finalized", false)) != TYPE_BOOL + or typeof(value.get("layer", 0)) != TYPE_INT + or int(value.get("layer", 0)) < 0 + or not NetworkIdentityCrypto.valid_fingerprint( value.get("creator_fingerprint") ) - and _valid_participant_fingerprints( + or not _valid_participant_fingerprints( value.get("participant_fingerprints", []) ) - ) + or typeof(value.get("cells")) != TYPE_ARRAY + ): + return false + var cells: Array = value["cells"] + var grid_width: int = int(value["width"]) + var grid_height: int = int(value["height"]) + if cells.size() > grid_width * grid_height: + return false + for cell_value: Variant in cells: + if ( + not validate_authoritative_cell(cell_value) + or int((cell_value as Dictionary)["x"]) >= grid_width + or int((cell_value as Dictionary)["y"]) >= grid_height + ): + return false + var participants: Array = value.get("participant_fingerprints", []) + if not participants.is_empty(): + if str(value["creator_fingerprint"]) not in participants: + return false + for cell_value: Variant in cells: + if str((cell_value as Dictionary)["author_fingerprint"]) not in participants: + return false + return true static func validate_guide_update(data: Variant) -> bool: diff --git a/economy/item_resale_policy.gd b/economy/item_resale_policy.gd index bfc5944..299fc48 100644 --- a/economy/item_resale_policy.gd +++ b/economy/item_resale_policy.gd @@ -18,4 +18,4 @@ static func get_unit_value(item: ItemDataType) -> int: if not is_sellable(item): return -1 var purchase_price := FishingShopStockType.get_price(item.item_id) - return int(float(purchase_price) / 2.0) if purchase_price >= 0 else -1 + return purchase_price / 2 if purchase_price >= 0 else -1 diff --git a/export_presets.cfg b/export_presets.cfg index c7dbaa9..cc5d56a 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -9,7 +9,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.4-alpha/windows-x86_64/straywild.exe" +export_path="builds/v0.17.1-alpha/windows-x86_64/NETfishing.exe" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -32,16 +32,16 @@ codesign/digest_algorithm=1 codesign/description="" codesign/custom_options=PackedStringArray() application/modify_resources=true -application/icon="res://art/exported/system_icons/straywild.ico" +application/icon="res://art/exported/system_icons/netfishing.ico" application/console_wrapper_icon="" -application/icon_interpolation=0 -application/file_version="0.20.4.0" -application/product_version="0.20.4.0" +application/icon_interpolation=4 +application/file_version="0.17.1.0" +application/product_version="0.17.1.0" application/company_name="Woofmeow" -application/product_name="straywild" -application/file_description="straywild v0.20.4-alpha" +application/product_name="NETfishing" +application/file_description="NETfishing v0.17.1-alpha" application/copyright="Copyright © 2026 Woofmeow" -application/trademarks="straywild and Woofmeow branding is reserved; see TRADEMARKS.md" +application/trademarks="NETfishing and Woofmeow branding is reserved; see TRADEMARKS.md" application/export_angle=0 ssh_remote_deploy/enabled=false ssh_remote_deploy/host="user@host_ip" @@ -62,7 +62,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.4-alpha/linux-arm64/straywild.arm64" +export_path="builds/v0.17.1-alpha/linux-arm64/NETfishing.arm64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -92,7 +92,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.4-alpha/macos/straywild.zip" +export_path="builds/v0.17.1-alpha/macos/NETfishing.zip" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -106,10 +106,10 @@ script_export_mode=2 custom_template/debug="" custom_template/release="" application/bundle_identifier="io.woofmeow.netfishing" -application/icon="res://art/exported/system_icons/straywild_1024.png" +application/icon="res://art/exported/system_icons/netfishing_1024.png" application/icon_interpolation=0 -application/short_version="0.20.4" -application/version="0.20.4" +application/short_version="0.17.1" +application/version="0.17.1" application/architecture="universal" codesign/enable=false notarization/enable=false @@ -125,7 +125,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*,tests/*" -export_path="builds/v0.20.4-alpha/server-linux-x86_64/straywildServer.x86_64" +export_path="builds/v0.17.1-alpha/server-linux-x86_64/NETfishingServer.x86_64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -155,7 +155,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.4-alpha/android/straywild.apk" +export_path="builds/v0.17.1-alpha/android/NETfishing.apk" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -176,10 +176,10 @@ architectures/armeabi-v7a=false architectures/arm64-v8a=true architectures/x86=false architectures/x86_64=false -version/code=200400 -version/name="v0.20.4-alpha" +version/code=170100 +version/name="v0.17.1-alpha" package/unique_name="io.woofmeow.netfishing" -package/name="straywild" +package/name="NETfishing" package/signed=true package/app_category=0 package/retain_data_on_uninstall=false @@ -187,7 +187,7 @@ package/exclude_from_recents=false package/show_in_android_tv=false package/show_in_app_library=true package/show_as_launcher_app=true -launcher_icons/main_192x192="res://art/exported/system_icons/straywild_256.png" +launcher_icons/main_192x192="res://art/exported/system_icons/netfishing_256.png" graphics/opengl_debug=false screen/immersive_mode=true screen/edge_to_edge=false @@ -214,7 +214,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.4-alpha/linux-x86_64/straywild.x86_64" +export_path="builds/v0.17.1-alpha/linux-x86_64/NETfishing.x86_64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -239,33 +239,3 @@ ssh_remote_deploy/extra_args_ssh="" ssh_remote_deploy/extra_args_scp="" ssh_remote_deploy/run_script="#!/usr/bin/env bash\nexport DISPLAY=:0\nunzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"\nchmod +x \"{temp_dir}/{exe_name}\"\n\"{temp_dir}/{exe_name}\" {cmd_args}" ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash\nkill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")\nrm -rf \"{temp_dir}\"" - -[preset.6] - -name="PortMaster ARM64" -platform="Linux" -runnable=false -advanced_options=false -dedicated_server=false -custom_features="straywild_portmaster" -export_filter="all_resources" -include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" -exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.4-alpha/portmaster-arm64/straywild.arm64" -patches=PackedStringArray() -encryption_include_filters="" -encryption_exclude_filters="" -seed=0 -encrypt_pck=false -encrypt_directory=false -script_export_mode=2 - -[preset.6.options] - -custom_template/debug="" -custom_template/release="" -debug/export_console_wrapper=0 -binary_format/embed_pck=false -binary_format/architecture="arm64" -texture_format/s3tc_bptc=false -texture_format/etc2_astc=true diff --git a/fish/pools/generated_lake_pool.tres b/fish/pools/generated_lake_pool.tres index c0ff343..ac095b8 100644 --- a/fish/pools/generated_lake_pool.tres +++ b/fish/pools/generated_lake_pool.tres @@ -1,27 +1,13 @@ -[gd_resource type="Resource" load_steps=22 format=3] +[gd_resource type="Resource" load_steps=8 format=3] [ext_resource type="Script" path="res://fish/fish_pool.gd" id="1_pool"] -[ext_resource type="Resource" path="res://fish/species/sturgeon_lake/sturgeon_lake.tres" id="2_sturgeon_lake"] -[ext_resource type="Resource" path="res://fish/species/burbot/burbot.tres" id="3_burbot"] -[ext_resource type="Resource" path="res://fish/species/cisco/cisco.tres" id="4_cisco"] -[ext_resource type="Resource" path="res://fish/species/whitefish_lake/whitefish_lake.tres" id="5_whitefish_lake"] -[ext_resource type="Resource" path="res://fish/species/char_arctic/char_arctic.tres" id="6_char_arctic"] -[ext_resource type="Resource" path="res://fish/species/trout_golden/trout_golden.tres" id="7_trout_golden"] -[ext_resource type="Resource" path="res://fish/species/axolotl/axolotl.tres" id="8_axolotl"] -[ext_resource type="Resource" path="res://fish/species/bream_common/bream_common.tres" id="9_bream_common"] -[ext_resource type="Resource" path="res://fish/species/muskellunge/muskellunge.tres" id="10_muskellunge"] -[ext_resource type="Resource" path="res://fish/species/shiner_emerald/shiner_emerald.tres" id="11_shiner_emerald"] -[ext_resource type="Resource" path="res://fish/species/chub_lake/chub_lake.tres" id="12_chub_lake"] -[ext_resource type="Resource" path="res://fish/species/crappie_white/crappie_white.tres" id="13_crappie_white"] -[ext_resource type="Resource" path="res://fish/species/yellow_perch/yellow_perch.tres" id="14_yellow_perch"] -[ext_resource type="Resource" path="res://fish/species/pike_northern/pike_northern.tres" id="15_pike_northern"] -[ext_resource type="Resource" path="res://fish/species/saugeye/saugeye.tres" id="16_saugeye"] -[ext_resource type="Resource" path="res://fish/species/walleye/walleye.tres" id="17_walleye"] -[ext_resource type="Resource" path="res://fish/species/goby_round/goby_round.tres" id="18_goby_round"] -[ext_resource type="Resource" path="res://fish/species/smelt_rainbow/smelt_rainbow.tres" id="19_smelt_rainbow"] -[ext_resource type="Resource" path="res://fish/species/gourami_giant/gourami_giant.tres" id="20_gourami_giant"] -[ext_resource type="Resource" path="res://fish/species/tilapia_nile/tilapia_nile.tres" id="21_tilapia_nile"] +[ext_resource type="Resource" path="res://fish/species/sturgeon_lake/sturgeon_lake.tres" id="2_sturgeon"] +[ext_resource type="Resource" path="res://fish/species/trout_golden/trout_golden.tres" id="3_trout"] +[ext_resource type="Resource" path="res://fish/species/chub_lake/chub_lake.tres" id="4_chub"] +[ext_resource type="Resource" path="res://fish/species/saugeye/saugeye.tres" id="5_saugeye"] +[ext_resource type="Resource" path="res://fish/species/walleye/walleye.tres" id="6_walleye"] +[ext_resource type="Resource" path="res://fish/species/goby_round/goby_round.tres" id="7_goby"] [resource] script = ExtResource("1_pool") -candidates = [ExtResource("2_sturgeon_lake"), ExtResource("3_burbot"), ExtResource("4_cisco"), ExtResource("5_whitefish_lake"), ExtResource("6_char_arctic"), ExtResource("7_trout_golden"), ExtResource("8_axolotl"), ExtResource("9_bream_common"), ExtResource("10_muskellunge"), ExtResource("11_shiner_emerald"), ExtResource("12_chub_lake"), ExtResource("13_crappie_white"), ExtResource("14_yellow_perch"), ExtResource("15_pike_northern"), ExtResource("16_saugeye"), ExtResource("17_walleye"), ExtResource("18_goby_round"), ExtResource("19_smelt_rainbow"), ExtResource("20_gourami_giant"), ExtResource("21_tilapia_nile")] +candidates = [ExtResource("2_sturgeon"), ExtResource("3_trout"), ExtResource("4_chub"), ExtResource("5_saugeye"), ExtResource("6_walleye"), ExtResource("7_goby")] diff --git a/fish/pools/generated_pond_pool.tres b/fish/pools/generated_pond_pool.tres index 9da4ed5..2b01e7d 100644 --- a/fish/pools/generated_pond_pool.tres +++ b/fish/pools/generated_pond_pool.tres @@ -1,40 +1,16 @@ -[gd_resource type="Resource" load_steps=35 format=3] +[gd_resource type="Resource" load_steps=11 format=3] [ext_resource type="Script" path="res://fish/fish_pool.gd" id="1_pool"] [ext_resource type="Resource" path="res://fish/species/bowfin/bowfin.tres" id="2_bowfin"] [ext_resource type="Resource" path="res://fish/species/gar_spotted/gar_spotted.tres" id="3_gar_spotted"] -[ext_resource type="Resource" path="res://fish/species/lungfish_west_african/lungfish_west_african.tres" id="4_lungfish_west_african"] -[ext_resource type="Resource" path="res://fish/species/guppy/guppy.tres" id="5_guppy"] -[ext_resource type="Resource" path="res://fish/species/tetra_neon/tetra_neon.tres" id="6_tetra_neon"] -[ext_resource type="Resource" path="res://fish/species/danio_zebra/danio_zebra.tres" id="7_danio_zebra"] -[ext_resource type="Resource" path="res://fish/species/largemouth_bass/largemouth_bass.tres" id="8_largemouth_bass"] -[ext_resource type="Resource" path="res://fish/species/bullhead_black/bullhead_black.tres" id="9_bullhead_black"] -[ext_resource type="Resource" path="res://fish/species/bullhead_brown/bullhead_brown.tres" id="10_bullhead_brown"] -[ext_resource type="Resource" path="res://fish/species/catfish_channel/catfish_channel.tres" id="11_catfish_channel"] -[ext_resource type="Resource" path="res://fish/species/catfish_white/catfish_white.tres" id="12_catfish_white"] -[ext_resource type="Resource" path="res://fish/species/bullhead_yellow/bullhead_yellow.tres" id="13_bullhead_yellow"] -[ext_resource type="Resource" path="res://fish/species/carp/carp.tres" id="14_carp"] -[ext_resource type="Resource" path="res://fish/species/roach_common/roach_common.tres" id="15_roach_common"] -[ext_resource type="Resource" path="res://fish/species/rudd/rudd.tres" id="16_rudd"] -[ext_resource type="Resource" path="res://fish/species/tench/tench.tres" id="17_tench"] -[ext_resource type="Resource" path="res://fish/species/crayfish_red_swamp/crayfish_red_swamp.tres" id="18_crayfish_red_swamp"] -[ext_resource type="Resource" path="res://fish/species/minnow_fathead/minnow_fathead.tres" id="19_minnow_fathead"] -[ext_resource type="Resource" path="res://fish/species/shiner_golden/shiner_golden.tres" id="20_shiner_golden"] -[ext_resource type="Resource" path="res://fish/species/loach_weather/loach_weather.tres" id="21_loach_weather"] -[ext_resource type="Resource" path="res://fish/species/goldfish_bubbleeye/goldfish_bubbleeye.tres" id="22_goldfish_bubbleeye"] -[ext_resource type="Resource" path="res://fish/species/goldfish/goldfish.tres" id="23_goldfish"] -[ext_resource type="Resource" path="res://fish/species/koi/koi.tres" id="24_koi"] -[ext_resource type="Resource" path="res://fish/species/crappie_black/crappie_black.tres" id="25_crappie_black"] -[ext_resource type="Resource" path="res://fish/species/bluegill/bluegill.tres" id="26_bluegill"] -[ext_resource type="Resource" path="res://fish/species/green_sunfish/green_sunfish.tres" id="27_green_sunfish"] -[ext_resource type="Resource" path="res://fish/species/pumpkinseed/pumpkinseed.tres" id="28_pumpkinseed"] -[ext_resource type="Resource" path="res://fish/species/redear_sunfish/redear_sunfish.tres" id="29_redear_sunfish"] -[ext_resource type="Resource" path="res://fish/species/warmouth/warmouth.tres" id="30_warmouth"] -[ext_resource type="Resource" path="res://fish/species/pickerel_chain/pickerel_chain.tres" id="31_pickerel_chain"] -[ext_resource type="Resource" path="res://fish/species/pickerel_grass/pickerel_grass.tres" id="32_pickerel_grass"] -[ext_resource type="Resource" path="res://fish/species/betta_siamese/betta_siamese.tres" id="33_betta_siamese"] -[ext_resource type="Resource" path="res://fish/species/catfish_walking/catfish_walking.tres" id="34_catfish_walking"] +[ext_resource type="Resource" path="res://fish/species/lungfish_west_african/lungfish_west_african.tres" id="4_lungfish"] +[ext_resource type="Resource" path="res://fish/species/catfish_channel/catfish_channel.tres" id="5_catfish_channel"] +[ext_resource type="Resource" path="res://fish/species/catfish_white/catfish_white.tres" id="6_catfish_white"] +[ext_resource type="Resource" path="res://fish/species/carp/carp.tres" id="7_carp"] +[ext_resource type="Resource" path="res://fish/species/goldfish_bubbleeye/goldfish_bubbleeye.tres" id="8_bubbleeye"] +[ext_resource type="Resource" path="res://fish/species/goldfish/goldfish.tres" id="9_goldfish"] +[ext_resource type="Resource" path="res://fish/species/bluegill/bluegill.tres" id="10_bluegill"] [resource] script = ExtResource("1_pool") -candidates = [ExtResource("2_bowfin"), ExtResource("3_gar_spotted"), ExtResource("4_lungfish_west_african"), ExtResource("5_guppy"), ExtResource("6_tetra_neon"), ExtResource("7_danio_zebra"), ExtResource("8_largemouth_bass"), ExtResource("9_bullhead_black"), ExtResource("10_bullhead_brown"), ExtResource("11_catfish_channel"), ExtResource("12_catfish_white"), ExtResource("13_bullhead_yellow"), ExtResource("14_carp"), ExtResource("15_roach_common"), ExtResource("16_rudd"), ExtResource("17_tench"), ExtResource("18_crayfish_red_swamp"), ExtResource("19_minnow_fathead"), ExtResource("20_shiner_golden"), ExtResource("21_loach_weather"), ExtResource("22_goldfish_bubbleeye"), ExtResource("23_goldfish"), ExtResource("24_koi"), ExtResource("25_crappie_black"), ExtResource("26_bluegill"), ExtResource("27_green_sunfish"), ExtResource("28_pumpkinseed"), ExtResource("29_redear_sunfish"), ExtResource("30_warmouth"), ExtResource("31_pickerel_chain"), ExtResource("32_pickerel_grass"), ExtResource("33_betta_siamese"), ExtResource("34_catfish_walking")] +candidates = [ExtResource("2_bowfin"), ExtResource("3_gar_spotted"), ExtResource("4_lungfish"), ExtResource("5_catfish_channel"), ExtResource("6_catfish_white"), ExtResource("7_carp"), ExtResource("8_bubbleeye"), ExtResource("9_goldfish"), ExtResource("10_bluegill")] diff --git a/fish/pools/generated_river_pool.tres b/fish/pools/generated_river_pool.tres index 66102ef..34b8f72 100644 --- a/fish/pools/generated_river_pool.tres +++ b/fish/pools/generated_river_pool.tres @@ -1,60 +1,18 @@ -[gd_resource type="Resource" load_steps=55 format=3] +[gd_resource type="Resource" load_steps=13 format=3] [ext_resource type="Script" path="res://fish/fish_pool.gd" id="1_pool"] -[ext_resource type="Resource" path="res://fish/species/gar_longnose/gar_longnose.tres" id="2_gar_longnose"] +[ext_resource type="Resource" path="res://fish/species/gar_longnose/gar_longnose.tres" id="2_gar"] [ext_resource type="Resource" path="res://fish/species/paddlefish/paddlefish.tres" id="3_paddlefish"] -[ext_resource type="Resource" path="res://fish/species/sturgeon_shovelnose/sturgeon_shovelnose.tres" id="4_sturgeon_shovelnose"] -[ext_resource type="Resource" path="res://fish/species/foureyes_largescale/foureyes_largescale.tres" id="5_foureyes_largescale"] -[ext_resource type="Resource" path="res://fish/species/grayling_arctic/grayling_arctic.tres" id="6_grayling_arctic"] -[ext_resource type="Resource" path="res://fish/species/trout_brown/trout_brown.tres" id="7_trout_brown"] -[ext_resource type="Resource" path="res://fish/species/trout_cutthroat/trout_cutthroat.tres" id="8_trout_cutthroat"] -[ext_resource type="Resource" path="res://fish/species/trout_rainbow/trout_rainbow.tres" id="9_trout_rainbow"] -[ext_resource type="Resource" path="res://fish/species/hellbender/hellbender.tres" id="10_hellbender"] -[ext_resource type="Resource" path="res://fish/species/smallmouth_bass/smallmouth_bass.tres" id="11_smallmouth_bass"] -[ext_resource type="Resource" path="res://fish/species/buffalo_bigmouth/buffalo_bigmouth.tres" id="12_buffalo_bigmouth"] -[ext_resource type="Resource" path="res://fish/species/redhorse_golden/redhorse_golden.tres" id="13_redhorse_golden"] -[ext_resource type="Resource" path="res://fish/species/quillback/quillback.tres" id="14_quillback"] -[ext_resource type="Resource" path="res://fish/species/buffalo_smallmouth/buffalo_smallmouth.tres" id="15_buffalo_smallmouth"] -[ext_resource type="Resource" path="res://fish/species/sucker_white/sucker_white.tres" id="16_sucker_white"] -[ext_resource type="Resource" path="res://fish/species/catfish_blue/catfish_blue.tres" id="17_catfish_blue"] -[ext_resource type="Resource" path="res://fish/species/catfish_flathead/catfish_flathead.tres" id="18_catfish_flathead"] -[ext_resource type="Resource" path="res://fish/species/madtom_tadpole/madtom_tadpole.tres" id="19_madtom_tadpole"] -[ext_resource type="Resource" path="res://fish/species/barbel_common/barbel_common.tres" id="20_barbel_common"] -[ext_resource type="Resource" path="res://fish/species/chub_european/chub_european.tres" id="21_chub_european"] -[ext_resource type="Resource" path="res://fish/species/fallfish/fallfish.tres" id="22_fallfish"] -[ext_resource type="Resource" path="res://fish/species/ide/ide.tres" id="23_ide"] -[ext_resource type="Resource" path="res://fish/species/gar_alligator/gar_alligator.tres" id="24_gar_alligator"] -[ext_resource type="Resource" path="res://fish/species/arapaima/arapaima.tres" id="25_arapaima"] -[ext_resource type="Resource" path="res://fish/species/tigerfish_goliath/tigerfish_goliath.tres" id="26_tigerfish_goliath"] -[ext_resource type="Resource" path="res://fish/species/shiner_common/shiner_common.tres" id="27_shiner_common"] -[ext_resource type="Resource" path="res://fish/species/chub_creek/chub_creek.tres" id="28_chub_creek"] -[ext_resource type="Resource" path="res://fish/species/chub_flame/chub_flame.tres" id="29_chub_flame"] -[ext_resource type="Resource" path="res://fish/species/electric_eel/electric_eel.tres" id="30_electric_eel"] -[ext_resource type="Resource" path="res://fish/species/freshwater_drum/freshwater_drum.tres" id="31_freshwater_drum"] -[ext_resource type="Resource" path="res://fish/species/goldeye/goldeye.tres" id="32_goldeye"] -[ext_resource type="Resource" path="res://fish/species/mooneye/mooneye.tres" id="33_mooneye"] -[ext_resource type="Resource" path="res://fish/species/sauger/sauger.tres" id="34_sauger"] -[ext_resource type="Resource" path="res://fish/species/eel_american/eel_american.tres" id="35_eel_american"] -[ext_resource type="Resource" path="res://fish/species/eel_european/eel_european.tres" id="36_eel_european"] -[ext_resource type="Resource" path="res://fish/species/smelt_eulachon/smelt_eulachon.tres" id="37_smelt_eulachon"] -[ext_resource type="Resource" path="res://fish/species/sturgeon_white/sturgeon_white.tres" id="38_sturgeon_white"] -[ext_resource type="Resource" path="res://fish/species/trout_steelhead/trout_steelhead.tres" id="39_trout_steelhead"] -[ext_resource type="Resource" path="res://fish/species/stingray_ocellate_river/stingray_ocellate_river.tres" id="40_stingray_ocellate_river"] -[ext_resource type="Resource" path="res://fish/species/white_perch/white_perch.tres" id="41_white_perch"] -[ext_resource type="Resource" path="res://fish/species/barramundi/barramundi.tres" id="42_barramundi"] -[ext_resource type="Resource" path="res://fish/species/knifefish_clown/knifefish_clown.tres" id="43_knifefish_clown"] -[ext_resource type="Resource" path="res://fish/species/loach_clown/loach_clown.tres" id="44_loach_clown"] -[ext_resource type="Resource" path="res://fish/species/discus/discus.tres" id="45_discus"] -[ext_resource type="Resource" path="res://fish/species/angelfish_freshwater/angelfish_freshwater.tres" id="46_angelfish_freshwater"] -[ext_resource type="Resource" path="res://fish/species/oscar/oscar.tres" id="47_oscar"] -[ext_resource type="Resource" path="res://fish/species/tambaqui/tambaqui.tres" id="48_tambaqui"] -[ext_resource type="Resource" path="res://fish/species/snakehead_giant/snakehead_giant.tres" id="49_snakehead_giant"] -[ext_resource type="Resource" path="res://fish/species/dorado_golden/dorado_golden.tres" id="50_dorado_golden"] -[ext_resource type="Resource" path="res://fish/species/mahseer_golden/mahseer_golden.tres" id="51_mahseer_golden"] -[ext_resource type="Resource" path="res://fish/species/peacock_bass/peacock_bass.tres" id="52_peacock_bass"] -[ext_resource type="Resource" path="res://fish/species/piranha_red_bellied/piranha_red_bellied.tres" id="53_piranha_red_bellied"] -[ext_resource type="Resource" path="res://fish/species/arowana_silver/arowana_silver.tres" id="54_arowana_silver"] +[ext_resource type="Resource" path="res://fish/species/sturgeon_shovelnose/sturgeon_shovelnose.tres" id="4_sturgeon"] +[ext_resource type="Resource" path="res://fish/species/trout_cutthroat/trout_cutthroat.tres" id="5_cutthroat"] +[ext_resource type="Resource" path="res://fish/species/trout_rainbow/trout_rainbow.tres" id="6_rainbow"] +[ext_resource type="Resource" path="res://fish/species/catfish_blue/catfish_blue.tres" id="7_blue_catfish"] +[ext_resource type="Resource" path="res://fish/species/catfish_flathead/catfish_flathead.tres" id="8_flathead"] +[ext_resource type="Resource" path="res://fish/species/chub_european/chub_european.tres" id="9_chub_european"] +[ext_resource type="Resource" path="res://fish/species/chub_flame/chub_flame.tres" id="10_chub_flame"] +[ext_resource type="Resource" path="res://fish/species/sauger/sauger.tres" id="11_sauger"] +[ext_resource type="Resource" path="res://fish/species/trout_steelhead/trout_steelhead.tres" id="12_steelhead"] [resource] script = ExtResource("1_pool") -candidates = [ExtResource("2_gar_longnose"), ExtResource("3_paddlefish"), ExtResource("4_sturgeon_shovelnose"), ExtResource("5_foureyes_largescale"), ExtResource("6_grayling_arctic"), ExtResource("7_trout_brown"), ExtResource("8_trout_cutthroat"), ExtResource("9_trout_rainbow"), ExtResource("10_hellbender"), ExtResource("11_smallmouth_bass"), ExtResource("12_buffalo_bigmouth"), ExtResource("13_redhorse_golden"), ExtResource("14_quillback"), ExtResource("15_buffalo_smallmouth"), ExtResource("16_sucker_white"), ExtResource("17_catfish_blue"), ExtResource("18_catfish_flathead"), ExtResource("19_madtom_tadpole"), ExtResource("20_barbel_common"), ExtResource("21_chub_european"), ExtResource("22_fallfish"), ExtResource("23_ide"), ExtResource("24_gar_alligator"), ExtResource("25_arapaima"), ExtResource("26_tigerfish_goliath"), ExtResource("27_shiner_common"), ExtResource("28_chub_creek"), ExtResource("29_chub_flame"), ExtResource("30_electric_eel"), ExtResource("31_freshwater_drum"), ExtResource("32_goldeye"), ExtResource("33_mooneye"), ExtResource("34_sauger"), ExtResource("35_eel_american"), ExtResource("36_eel_european"), ExtResource("37_smelt_eulachon"), ExtResource("38_sturgeon_white"), ExtResource("39_trout_steelhead"), ExtResource("40_stingray_ocellate_river"), ExtResource("41_white_perch"), ExtResource("42_barramundi"), ExtResource("43_knifefish_clown"), ExtResource("44_loach_clown"), ExtResource("45_discus"), ExtResource("46_angelfish_freshwater"), ExtResource("47_oscar"), ExtResource("48_tambaqui"), ExtResource("49_snakehead_giant"), ExtResource("50_dorado_golden"), ExtResource("51_mahseer_golden"), ExtResource("52_peacock_bass"), ExtResource("53_piranha_red_bellied"), ExtResource("54_arowana_silver")] +candidates = [ExtResource("2_gar"), ExtResource("3_paddlefish"), ExtResource("4_sturgeon"), ExtResource("5_cutthroat"), ExtResource("6_rainbow"), ExtResource("7_blue_catfish"), ExtResource("8_flathead"), ExtResource("9_chub_european"), ExtResource("10_chub_flame"), ExtResource("11_sauger"), ExtResource("12_steelhead")] diff --git a/fish/pools/starter_ocean_pool.tres b/fish/pools/starter_ocean_pool.tres index 274b58d..1e47a2b 100644 --- a/fish/pools/starter_ocean_pool.tres +++ b/fish/pools/starter_ocean_pool.tres @@ -1,211 +1,41 @@ -[gd_resource type="Resource" load_steps=206 format=3] +[gd_resource type="Resource" load_steps=36 format=3] [ext_resource type="Script" path="res://fish/fish_pool.gd" id="1_pool"] -[ext_resource type="Resource" path="res://fish/species/mudskipper_atlantic/mudskipper_atlantic.tres" id="2_mudskipper_atlantic"] -[ext_resource type="Resource" path="res://fish/species/mullet_red/mullet_red.tres" id="3_mullet_red"] -[ext_resource type="Resource" path="res://fish/species/plaice_european/plaice_european.tres" id="4_plaice_european"] -[ext_resource type="Resource" path="res://fish/species/flounder_summer/flounder_summer.tres" id="5_flounder_summer"] -[ext_resource type="Resource" path="res://fish/species/flounder_winter/flounder_winter.tres" id="6_flounder_winter"] -[ext_resource type="Resource" path="res://fish/species/dugong/dugong.tres" id="7_dugong"] -[ext_resource type="Resource" path="res://fish/species/seal_harbor/seal_harbor.tres" id="8_seal_harbor"] -[ext_resource type="Resource" path="res://fish/species/sea_otter/sea_otter.tres" id="9_sea_otter"] -[ext_resource type="Resource" path="res://fish/species/walrus/walrus.tres" id="10_walrus"] -[ext_resource type="Resource" path="res://fish/species/manatee_west_indian/manatee_west_indian.tres" id="11_manatee_west_indian"] -[ext_resource type="Resource" path="res://fish/species/pipefish_bay/pipefish_bay.tres" id="12_pipefish_bay"] -[ext_resource type="Resource" path="res://fish/species/seahorse_lined/seahorse_lined.tres" id="13_seahorse_lined"] -[ext_resource type="Resource" path="res://fish/species/monkfish/monkfish.tres" id="14_monkfish"] -[ext_resource type="Resource" path="res://fish/species/tripletail/tripletail.tres" id="15_tripletail"] -[ext_resource type="Resource" path="res://fish/species/mackerel_atlantic/mackerel_atlantic.tres" id="16_mackerel_atlantic"] -[ext_resource type="Resource" path="res://fish/species/bluefish/bluefish.tres" id="17_bluefish"] -[ext_resource type="Resource" path="res://fish/species/mackerel_cero/mackerel_cero.tres" id="18_mackerel_cero"] -[ext_resource type="Resource" path="res://fish/species/mackerel_chub/mackerel_chub.tres" id="19_mackerel_chub"] -[ext_resource type="Resource" path="res://fish/species/jack_crevalle/jack_crevalle.tres" id="20_jack_crevalle"] +[ext_resource type="Resource" path="res://fish/species/bass/bass.tres" id="2_bass"] +[ext_resource type="Resource" path="res://fish/species/sunfish/sunfish.tres" id="3_sunfish"] +[ext_resource type="Resource" path="res://fish/species/tuna_albacore/tuna_albacore.tres" id="4_tuna_albacore"] +[ext_resource type="Resource" path="res://fish/species/tuna_bigeye/tuna_bigeye.tres" id="5_tuna_bigeye"] +[ext_resource type="Resource" path="res://fish/species/tuna_bluefin/tuna_bluefin.tres" id="6_tuna_bluefin"] +[ext_resource type="Resource" path="res://fish/species/tuna_skipjack/tuna_skipjack.tres" id="7_tuna_skipjack"] +[ext_resource type="Resource" path="res://fish/species/tuna_yellowfin/tuna_yellowfin.tres" id="8_tuna_yellowfin"] +[ext_resource type="Resource" path="res://fish/species/salmon_atlantic/salmon_atlantic.tres" id="9_salmon_atlantic"] +[ext_resource type="Resource" path="res://fish/species/salmon_chum/salmon_chum.tres" id="10_salmon_chum"] +[ext_resource type="Resource" path="res://fish/species/salmon_coho/salmon_coho.tres" id="11_salmon_coho"] +[ext_resource type="Resource" path="res://fish/species/salmon_pink/salmon_pink.tres" id="12_salmon_pink"] +[ext_resource type="Resource" path="res://fish/species/salmon_sockeye/salmon_sockeye.tres" id="13_salmon_sockeye"] +[ext_resource type="Resource" path="res://fish/species/anchovy_european/anchovy_european.tres" id="14_anchovy_european"] +[ext_resource type="Resource" path="res://fish/species/anchovy_northern/anchovy_northern.tres" id="15_anchovy_northern"] +[ext_resource type="Resource" path="res://fish/species/grouper_gulf/grouper_gulf.tres" id="16_grouper_gulf"] +[ext_resource type="Resource" path="res://fish/species/grouper_red/grouper_red.tres" id="17_grouper_red"] +[ext_resource type="Resource" path="res://fish/species/mackerel_atlantic/mackerel_atlantic.tres" id="18_mackerel_atlantic"] +[ext_resource type="Resource" path="res://fish/species/mackerel_cero/mackerel_cero.tres" id="19_mackerel_cero"] +[ext_resource type="Resource" path="res://fish/species/mackerel_chub/mackerel_chub.tres" id="20_mackerel_chub"] [ext_resource type="Resource" path="res://fish/species/mackerel_king/mackerel_king.tres" id="21_mackerel_king"] [ext_resource type="Resource" path="res://fish/species/mackerel_spanish/mackerel_spanish.tres" id="22_mackerel_spanish"] -[ext_resource type="Resource" path="res://fish/species/queenfish_talang/queenfish_talang.tres" id="23_queenfish_talang"] -[ext_resource type="Resource" path="res://fish/species/sand_lance_american/sand_lance_american.tres" id="24_sand_lance_american"] -[ext_resource type="Resource" path="res://fish/species/menhaden_atlantic/menhaden_atlantic.tres" id="25_menhaden_atlantic"] +[ext_resource type="Resource" path="res://fish/species/marlin_black/marlin_black.tres" id="23_marlin_black"] +[ext_resource type="Resource" path="res://fish/species/marlin_blue/marlin_blue.tres" id="24_marlin_blue"] +[ext_resource type="Resource" path="res://fish/species/marlin_white/marlin_white.tres" id="25_marlin_white"] [ext_resource type="Resource" path="res://fish/species/pomfret_black/pomfret_black.tres" id="26_pomfret_black"] [ext_resource type="Resource" path="res://fish/species/pomfret_chinese/pomfret_chinese.tres" id="27_pomfret_chinese"] -[ext_resource type="Resource" path="res://fish/species/anchovy_european/anchovy_european.tres" id="28_anchovy_european"] -[ext_resource type="Resource" path="res://fish/species/sardine_european/sardine_european.tres" id="29_sardine_european"] -[ext_resource type="Resource" path="res://fish/species/pomfret_golden/pomfret_golden.tres" id="30_pomfret_golden"] -[ext_resource type="Resource" path="res://fish/species/anchovy_northern/anchovy_northern.tres" id="31_anchovy_northern"] -[ext_resource type="Resource" path="res://fish/species/sardine_pacific/sardine_pacific.tres" id="32_sardine_pacific"] -[ext_resource type="Resource" path="res://fish/species/pomfret_white/pomfret_white.tres" id="33_pomfret_white"] -[ext_resource type="Resource" path="res://fish/species/shark_blacktip/shark_blacktip.tres" id="34_shark_blacktip"] -[ext_resource type="Resource" path="res://fish/species/shark_great_hammerhead/shark_great_hammerhead.tres" id="35_shark_great_hammerhead"] -[ext_resource type="Resource" path="res://fish/species/shark_great_white/shark_great_white.tres" id="36_shark_great_white"] -[ext_resource type="Resource" path="res://fish/species/shark_tiger/shark_tiger.tres" id="37_shark_tiger"] -[ext_resource type="Resource" path="res://fish/species/shark_whale/shark_whale.tres" id="38_shark_whale"] -[ext_resource type="Resource" path="res://fish/species/wolffish_atlantic/wolffish_atlantic.tres" id="39_wolffish_atlantic"] -[ext_resource type="Resource" path="res://fish/species/cusk/cusk.tres" id="40_cusk"] -[ext_resource type="Resource" path="res://fish/species/wolffish_spotted/wolffish_spotted.tres" id="41_wolffish_spotted"] -[ext_resource type="Resource" path="res://fish/species/herring_atlantic/herring_atlantic.tres" id="42_herring_atlantic"] -[ext_resource type="Resource" path="res://fish/species/capelin/capelin.tres" id="43_capelin"] -[ext_resource type="Resource" path="res://fish/species/sprat_european/sprat_european.tres" id="44_sprat_european"] -[ext_resource type="Resource" path="res://fish/species/herring_pacific/herring_pacific.tres" id="45_herring_pacific"] -[ext_resource type="Resource" path="res://fish/species/pollock_alaska/pollock_alaska.tres" id="46_pollock_alaska"] -[ext_resource type="Resource" path="res://fish/species/cod_atlantic/cod_atlantic.tres" id="47_cod_atlantic"] -[ext_resource type="Resource" path="res://fish/species/pollock_atlantic/pollock_atlantic.tres" id="48_pollock_atlantic"] -[ext_resource type="Resource" path="res://fish/species/sole_dover/sole_dover.tres" id="49_sole_dover"] -[ext_resource type="Resource" path="res://fish/species/haddock/haddock.tres" id="50_haddock"] -[ext_resource type="Resource" path="res://fish/species/cod_pacific/cod_pacific.tres" id="51_cod_pacific"] -[ext_resource type="Resource" path="res://fish/species/hake_pacific/hake_pacific.tres" id="52_hake_pacific"] -[ext_resource type="Resource" path="res://fish/species/hake_silver/hake_silver.tres" id="53_hake_silver"] -[ext_resource type="Resource" path="res://fish/species/nautilus_chambered/nautilus_chambered.tres" id="54_nautilus_chambered"] -[ext_resource type="Resource" path="res://fish/species/cuttlefish_common/cuttlefish_common.tres" id="55_cuttlefish_common"] -[ext_resource type="Resource" path="res://fish/species/cuttlefish_flamboyant/cuttlefish_flamboyant.tres" id="56_cuttlefish_flamboyant"] -[ext_resource type="Resource" path="res://fish/species/tilefish_blueline/tilefish_blueline.tres" id="57_tilefish_blueline"] -[ext_resource type="Resource" path="res://fish/species/tilefish_golden/tilefish_golden.tres" id="58_tilefish_golden"] -[ext_resource type="Resource" path="res://fish/species/ocean_perch_pacific/ocean_perch_pacific.tres" id="59_ocean_perch_pacific"] -[ext_resource type="Resource" path="res://fish/species/sea_bass_chilean/sea_bass_chilean.tres" id="60_sea_bass_chilean"] -[ext_resource type="Resource" path="res://fish/species/sablefish/sablefish.tres" id="61_sablefish"] -[ext_resource type="Resource" path="res://fish/species/wreckfish/wreckfish.tres" id="62_wreckfish"] -[ext_resource type="Resource" path="res://fish/species/oarfish_giant/oarfish_giant.tres" id="63_oarfish_giant"] -[ext_resource type="Resource" path="res://fish/species/coelacanth_west_indian/coelacanth_west_indian.tres" id="64_coelacanth_west_indian"] -[ext_resource type="Resource" path="res://fish/species/anglerfish_black_seadevil/anglerfish_black_seadevil.tres" id="65_anglerfish_black_seadevil"] -[ext_resource type="Resource" path="res://fish/species/fangtooth_common/fangtooth_common.tres" id="66_fangtooth_common"] -[ext_resource type="Resource" path="res://fish/species/gulper_eel/gulper_eel.tres" id="67_gulper_eel"] -[ext_resource type="Resource" path="res://fish/species/barreleye_pacific/barreleye_pacific.tres" id="68_barreleye_pacific"] -[ext_resource type="Resource" path="res://fish/species/blobfish_smooth_head/blobfish_smooth_head.tres" id="69_blobfish_smooth_head"] -[ext_resource type="Resource" path="res://fish/species/lanternfish_spotted/lanternfish_spotted.tres" id="70_lanternfish_spotted"] -[ext_resource type="Resource" path="res://fish/species/sea_star_crown_of_thorns/sea_star_crown_of_thorns.tres" id="71_sea_star_crown_of_thorns"] -[ext_resource type="Resource" path="res://fish/species/sea_cucumber_giant_california/sea_cucumber_giant_california.tres" id="72_sea_cucumber_giant_california"] -[ext_resource type="Resource" path="res://fish/species/urchin_purple/urchin_purple.tres" id="73_urchin_purple"] -[ext_resource type="Resource" path="res://fish/species/sand_dollar/sand_dollar.tres" id="74_sand_dollar"] -[ext_resource type="Resource" path="res://fish/species/sea_star_sunflower/sea_star_sunflower.tres" id="75_sea_star_sunflower"] -[ext_resource type="Resource" path="res://fish/species/jelly_crystal/jelly_crystal.tres" id="76_jelly_crystal"] -[ext_resource type="Resource" path="res://fish/species/jelly_lions_mane/jelly_lions_mane.tres" id="77_jelly_lions_mane"] -[ext_resource type="Resource" path="res://fish/species/jelly_moon/jelly_moon.tres" id="78_jelly_moon"] -[ext_resource type="Resource" path="res://fish/species/jelly_pacific_sea_nettle/jelly_pacific_sea_nettle.tres" id="79_jelly_pacific_sea_nettle"] -[ext_resource type="Resource" path="res://fish/species/jelly_sea_wasp/jelly_sea_wasp.tres" id="80_jelly_sea_wasp"] -[ext_resource type="Resource" path="res://fish/species/pompano_african/pompano_african.tres" id="81_pompano_african"] -[ext_resource type="Resource" path="res://fish/species/cobia/cobia.tres" id="82_cobia"] -[ext_resource type="Resource" path="res://fish/species/trevally_giant/trevally_giant.tres" id="83_trevally_giant"] -[ext_resource type="Resource" path="res://fish/species/amberjack_greater/amberjack_greater.tres" id="84_amberjack_greater"] -[ext_resource type="Resource" path="res://fish/species/amberjack_lesser/amberjack_lesser.tres" id="85_amberjack_lesser"] -[ext_resource type="Resource" path="res://fish/species/halibut_atlantic/halibut_atlantic.tres" id="86_halibut_atlantic"] -[ext_resource type="Resource" path="res://fish/species/halibut_pacific/halibut_pacific.tres" id="87_halibut_pacific"] -[ext_resource type="Resource" path="res://fish/species/turbot/turbot.tres" id="88_turbot"] -[ext_resource type="Resource" path="res://fish/species/lobster_american/lobster_american.tres" id="89_lobster_american"] -[ext_resource type="Resource" path="res://fish/species/krill_antarctic/krill_antarctic.tres" id="90_krill_antarctic"] -[ext_resource type="Resource" path="res://fish/species/lobster_caribbean_spiny/lobster_caribbean_spiny.tres" id="91_lobster_caribbean_spiny"] -[ext_resource type="Resource" path="res://fish/species/shrimp_peacock_mantis/shrimp_peacock_mantis.tres" id="92_shrimp_peacock_mantis"] -[ext_resource type="Resource" path="res://fish/species/shrimp_skunk_cleaner/shrimp_skunk_cleaner.tres" id="93_shrimp_skunk_cleaner"] -[ext_resource type="Resource" path="res://fish/species/crab_japanese_spider/crab_japanese_spider.tres" id="94_crab_japanese_spider"] -[ext_resource type="Resource" path="res://fish/species/crab_red_king/crab_red_king.tres" id="95_crab_red_king"] -[ext_resource type="Resource" path="res://fish/species/salmon_atlantic/salmon_atlantic.tres" id="96_salmon_atlantic"] -[ext_resource type="Resource" path="res://fish/species/salmon_chum/salmon_chum.tres" id="97_salmon_chum"] -[ext_resource type="Resource" path="res://fish/species/salmon_coho/salmon_coho.tres" id="98_salmon_coho"] -[ext_resource type="Resource" path="res://fish/species/salmon_pink/salmon_pink.tres" id="99_salmon_pink"] -[ext_resource type="Resource" path="res://fish/species/salmon_sockeye/salmon_sockeye.tres" id="100_salmon_sockeye"] -[ext_resource type="Resource" path="res://fish/species/marlin_black/marlin_black.tres" id="101_marlin_black"] -[ext_resource type="Resource" path="res://fish/species/marlin_blue/marlin_blue.tres" id="102_marlin_blue"] -[ext_resource type="Resource" path="res://fish/species/sailfish/sailfish.tres" id="103_sailfish"] -[ext_resource type="Resource" path="res://fish/species/swordfish/swordfish.tres" id="104_swordfish"] -[ext_resource type="Resource" path="res://fish/species/marlin_white/marlin_white.tres" id="105_marlin_white"] -[ext_resource type="Resource" path="res://fish/species/mahi_mahi/mahi_mahi.tres" id="106_mahi_mahi"] -[ext_resource type="Resource" path="res://fish/species/opah/opah.tres" id="107_opah"] -[ext_resource type="Resource" path="res://fish/species/wahoo/wahoo.tres" id="108_wahoo"] -[ext_resource type="Resource" path="res://fish/species/tuna_albacore/tuna_albacore.tres" id="109_tuna_albacore"] -[ext_resource type="Resource" path="res://fish/species/tuna_bigeye/tuna_bigeye.tres" id="110_tuna_bigeye"] -[ext_resource type="Resource" path="res://fish/species/tuna_bluefin/tuna_bluefin.tres" id="111_tuna_bluefin"] -[ext_resource type="Resource" path="res://fish/species/tuna_skipjack/tuna_skipjack.tres" id="112_tuna_skipjack"] -[ext_resource type="Resource" path="res://fish/species/tuna_yellowfin/tuna_yellowfin.tres" id="113_tuna_yellowfin"] -[ext_resource type="Resource" path="res://fish/species/octopus_common/octopus_common.tres" id="114_octopus_common"] -[ext_resource type="Resource" path="res://fish/species/octopus_day/octopus_day.tres" id="115_octopus_day"] -[ext_resource type="Resource" path="res://fish/species/octopus_giant_pacific/octopus_giant_pacific.tres" id="116_octopus_giant_pacific"] -[ext_resource type="Resource" path="res://fish/species/octopus_greater_blue_ringed/octopus_greater_blue_ringed.tres" id="117_octopus_greater_blue_ringed"] -[ext_resource type="Resource" path="res://fish/species/sunfish/sunfish.tres" id="118_sunfish"] -[ext_resource type="Resource" path="res://fish/species/skate_barndoor/skate_barndoor.tres" id="119_skate_barndoor"] -[ext_resource type="Resource" path="res://fish/species/manta_ray_giant/manta_ray_giant.tres" id="120_manta_ray_giant"] -[ext_resource type="Resource" path="res://fish/species/sawfish_largetooth/sawfish_largetooth.tres" id="121_sawfish_largetooth"] -[ext_resource type="Resource" path="res://fish/species/stingray_southern/stingray_southern.tres" id="122_stingray_southern"] -[ext_resource type="Resource" path="res://fish/species/lionfish_red/lionfish_red.tres" id="123_lionfish_red"] -[ext_resource type="Resource" path="res://fish/species/scorpionfish_red/scorpionfish_red.tres" id="124_scorpionfish_red"] -[ext_resource type="Resource" path="res://fish/species/moray_green/moray_green.tres" id="125_moray_green"] -[ext_resource type="Resource" path="res://fish/species/flounder_peacock/flounder_peacock.tres" id="126_flounder_peacock"] -[ext_resource type="Resource" path="res://fish/species/surgeonfish_blue/surgeonfish_blue.tres" id="127_surgeonfish_blue"] -[ext_resource type="Resource" path="res://fish/species/parrotfish_rainbow/parrotfish_rainbow.tres" id="128_parrotfish_rainbow"] -[ext_resource type="Resource" path="res://fish/species/parrotfish_stoplight/parrotfish_stoplight.tres" id="129_parrotfish_stoplight"] -[ext_resource type="Resource" path="res://fish/species/tang_yellow/tang_yellow.tres" id="130_tang_yellow"] -[ext_resource type="Resource" path="res://fish/species/trumpetfish_atlantic/trumpetfish_atlantic.tres" id="131_trumpetfish_atlantic"] -[ext_resource type="Resource" path="res://fish/species/triggerfish_gray/triggerfish_gray.tres" id="132_triggerfish_gray"] -[ext_resource type="Resource" path="res://fish/species/pufferfish_guineafowl/pufferfish_guineafowl.tres" id="133_pufferfish_guineafowl"] -[ext_resource type="Resource" path="res://fish/species/cowfish_longhorn/cowfish_longhorn.tres" id="134_cowfish_longhorn"] -[ext_resource type="Resource" path="res://fish/species/triggerfish_queen/triggerfish_queen.tres" id="135_triggerfish_queen"] -[ext_resource type="Resource" path="res://fish/species/cornetfish_red/cornetfish_red.tres" id="136_cornetfish_red"] -[ext_resource type="Resource" path="res://fish/species/porcupinefish_spotted/porcupinefish_spotted.tres" id="137_porcupinefish_spotted"] -[ext_resource type="Resource" path="res://fish/species/boxfish_yellow/boxfish_yellow.tres" id="138_boxfish_yellow"] -[ext_resource type="Resource" path="res://fish/species/butterflyfish_copperband/butterflyfish_copperband.tres" id="139_butterflyfish_copperband"] -[ext_resource type="Resource" path="res://fish/species/clownfish_ocellaris/clownfish_ocellaris.tres" id="140_clownfish_ocellaris"] -[ext_resource type="Resource" path="res://fish/species/angelfish_queen/angelfish_queen.tres" id="141_angelfish_queen"] -[ext_resource type="Resource" path="res://fish/species/grouper_atlantic_goliath/grouper_atlantic_goliath.tres" id="142_grouper_atlantic_goliath"] -[ext_resource type="Resource" path="res://fish/species/trevally_bluefin/trevally_bluefin.tres" id="143_trevally_bluefin"] -[ext_resource type="Resource" path="res://fish/species/grouper_giant/grouper_giant.tres" id="144_grouper_giant"] -[ext_resource type="Resource" path="res://fish/species/barracuda_great/barracuda_great.tres" id="145_barracuda_great"] -[ext_resource type="Resource" path="res://fish/species/grouper_gulf/grouper_gulf.tres" id="146_grouper_gulf"] -[ext_resource type="Resource" path="res://fish/species/grouper_nassau/grouper_nassau.tres" id="147_grouper_nassau"] -[ext_resource type="Resource" path="res://fish/species/grouper_red/grouper_red.tres" id="148_grouper_red"] -[ext_resource type="Resource" path="res://fish/species/chromis_blue_green/chromis_blue_green.tres" id="149_chromis_blue_green"] -[ext_resource type="Resource" path="res://fish/species/grunt_bluestriped/grunt_bluestriped.tres" id="150_grunt_bluestriped"] -[ext_resource type="Resource" path="res://fish/species/grunt_french/grunt_french.tres" id="151_grunt_french"] -[ext_resource type="Resource" path="res://fish/species/damselfish_sergeant_major/damselfish_sergeant_major.tres" id="152_damselfish_sergeant_major"] -[ext_resource type="Resource" path="res://fish/species/snapper_lane/snapper_lane.tres" id="153_snapper_lane"] -[ext_resource type="Resource" path="res://fish/species/snapper_mangrove/snapper_mangrove.tres" id="154_snapper_mangrove"] -[ext_resource type="Resource" path="res://fish/species/snapper_mutton/snapper_mutton.tres" id="155_snapper_mutton"] -[ext_resource type="Resource" path="res://fish/species/snapper_red/snapper_red.tres" id="156_snapper_red"] -[ext_resource type="Resource" path="res://fish/species/wrasse_ballan/wrasse_ballan.tres" id="157_wrasse_ballan"] -[ext_resource type="Resource" path="res://fish/species/wrasse_cleaner/wrasse_cleaner.tres" id="158_wrasse_cleaner"] -[ext_resource type="Resource" path="res://fish/species/hogfish/hogfish.tres" id="159_hogfish"] -[ext_resource type="Resource" path="res://fish/species/turtle_green/turtle_green.tres" id="160_turtle_green"] -[ext_resource type="Resource" path="res://fish/species/turtle_hawksbill/turtle_hawksbill.tres" id="161_turtle_hawksbill"] -[ext_resource type="Resource" path="res://fish/species/turtle_leatherback/turtle_leatherback.tres" id="162_turtle_leatherback"] -[ext_resource type="Resource" path="res://fish/species/turtle_loggerhead/turtle_loggerhead.tres" id="163_turtle_loggerhead"] -[ext_resource type="Resource" path="res://fish/species/seadragon_leafy/seadragon_leafy.tres" id="164_seadragon_leafy"] -[ext_resource type="Resource" path="res://fish/species/seadragon_weedy/seadragon_weedy.tres" id="165_seadragon_weedy"] -[ext_resource type="Resource" path="res://fish/species/oyster_black_lip_pearl/oyster_black_lip_pearl.tres" id="166_oyster_black_lip_pearl"] -[ext_resource type="Resource" path="res://fish/species/clam_giant/clam_giant.tres" id="167_clam_giant"] -[ext_resource type="Resource" path="res://fish/species/clam_geoduck/clam_geoduck.tres" id="168_clam_geoduck"] -[ext_resource type="Resource" path="res://fish/species/conch_queen/conch_queen.tres" id="169_conch_queen"] -[ext_resource type="Resource" path="res://fish/species/abalone_red/abalone_red.tres" id="170_abalone_red"] -[ext_resource type="Resource" path="res://fish/species/squid_bigfin_reef/squid_bigfin_reef.tres" id="171_squid_bigfin_reef"] -[ext_resource type="Resource" path="res://fish/species/squid_colossal/squid_colossal.tres" id="172_squid_colossal"] -[ext_resource type="Resource" path="res://fish/species/squid_giant/squid_giant.tres" id="173_squid_giant"] -[ext_resource type="Resource" path="res://fish/species/squid_humboldt/squid_humboldt.tres" id="174_squid_humboldt"] -[ext_resource type="Resource" path="res://fish/species/halfbeak_ballyhoo/halfbeak_ballyhoo.tres" id="175_halfbeak_ballyhoo"] -[ext_resource type="Resource" path="res://fish/species/needlefish_hound/needlefish_hound.tres" id="176_needlefish_hound"] -[ext_resource type="Resource" path="res://fish/species/flyingfish_tropical/flyingfish_tropical.tres" id="177_flyingfish_tropical"] -[ext_resource type="Resource" path="res://fish/species/bass/bass.tres" id="178_bass"] -[ext_resource type="Resource" path="res://fish/species/croaker_atlantic/croaker_atlantic.tres" id="179_croaker_atlantic"] -[ext_resource type="Resource" path="res://fish/species/black_drum/black_drum.tres" id="180_black_drum"] -[ext_resource type="Resource" path="res://fish/species/red_drum/red_drum.tres" id="181_red_drum"] -[ext_resource type="Resource" path="res://fish/species/mullet_striped/mullet_striped.tres" id="182_mullet_striped"] -[ext_resource type="Resource" path="res://fish/species/weakfish/weakfish.tres" id="183_weakfish"] -[ext_resource type="Resource" path="res://fish/species/croaker_yellowfin/croaker_yellowfin.tres" id="184_croaker_yellowfin"] -[ext_resource type="Resource" path="res://fish/species/rockfish_black/rockfish_black.tres" id="185_rockfish_black"] -[ext_resource type="Resource" path="res://fish/species/sea_bass_black/sea_bass_black.tres" id="186_sea_bass_black"] -[ext_resource type="Resource" path="res://fish/species/rockfish_canary/rockfish_canary.tres" id="187_rockfish_canary"] -[ext_resource type="Resource" path="res://fish/species/porgy_scup/porgy_scup.tres" id="188_porgy_scup"] -[ext_resource type="Resource" path="res://fish/species/sheepshead/sheepshead.tres" id="189_sheepshead"] -[ext_resource type="Resource" path="res://fish/species/tautog/tautog.tres" id="190_tautog"] -[ext_resource type="Resource" path="res://fish/species/rockfish_yelloweye/rockfish_yelloweye.tres" id="191_rockfish_yelloweye"] -[ext_resource type="Resource" path="res://fish/species/lingcod/lingcod.tres" id="192_lingcod"] -[ext_resource type="Resource" path="res://fish/species/milkfish/milkfish.tres" id="193_milkfish"] -[ext_resource type="Resource" path="res://fish/species/roosterfish/roosterfish.tres" id="194_roosterfish"] -[ext_resource type="Resource" path="res://fish/species/tarpon_atlantic/tarpon_atlantic.tres" id="195_tarpon_atlantic"] -[ext_resource type="Resource" path="res://fish/species/snook_common/snook_common.tres" id="196_snook_common"] -[ext_resource type="Resource" path="res://fish/species/bonefish/bonefish.tres" id="197_bonefish"] -[ext_resource type="Resource" path="res://fish/species/pompano_florida/pompano_florida.tres" id="198_pompano_florida"] -[ext_resource type="Resource" path="res://fish/species/ladyfish/ladyfish.tres" id="199_ladyfish"] -[ext_resource type="Resource" path="res://fish/species/permit/permit.tres" id="200_permit"] -[ext_resource type="Resource" path="res://fish/species/whale_blue/whale_blue.tres" id="201_whale_blue"] -[ext_resource type="Resource" path="res://fish/species/dolphin_bottlenose/dolphin_bottlenose.tres" id="202_dolphin_bottlenose"] -[ext_resource type="Resource" path="res://fish/species/whale_humpback/whale_humpback.tres" id="203_whale_humpback"] -[ext_resource type="Resource" path="res://fish/species/whale_killer/whale_killer.tres" id="204_whale_killer"] -[ext_resource type="Resource" path="res://fish/species/whale_sperm/whale_sperm.tres" id="205_whale_sperm"] +[ext_resource type="Resource" path="res://fish/species/pomfret_golden/pomfret_golden.tres" id="28_pomfret_golden"] +[ext_resource type="Resource" path="res://fish/species/pomfret_white/pomfret_white.tres" id="29_pomfret_white"] +[ext_resource type="Resource" path="res://fish/species/sailfish/sailfish.tres" id="30_sailfish"] +[ext_resource type="Resource" path="res://fish/species/snapper_lane/snapper_lane.tres" id="31_snapper_lane"] +[ext_resource type="Resource" path="res://fish/species/snapper_mangrove/snapper_mangrove.tres" id="32_snapper_mangrove"] +[ext_resource type="Resource" path="res://fish/species/snapper_mutton/snapper_mutton.tres" id="33_snapper_mutton"] +[ext_resource type="Resource" path="res://fish/species/snapper_red/snapper_red.tres" id="34_snapper_red"] +[ext_resource type="Resource" path="res://fish/species/swordfish/swordfish.tres" id="35_swordfish"] [resource] script = ExtResource("1_pool") -candidates = [ExtResource("2_mudskipper_atlantic"), ExtResource("3_mullet_red"), ExtResource("4_plaice_european"), ExtResource("5_flounder_summer"), ExtResource("6_flounder_winter"), ExtResource("7_dugong"), ExtResource("8_seal_harbor"), ExtResource("9_sea_otter"), ExtResource("10_walrus"), ExtResource("11_manatee_west_indian"), ExtResource("12_pipefish_bay"), ExtResource("13_seahorse_lined"), ExtResource("14_monkfish"), ExtResource("15_tripletail"), ExtResource("16_mackerel_atlantic"), ExtResource("17_bluefish"), ExtResource("18_mackerel_cero"), ExtResource("19_mackerel_chub"), ExtResource("20_jack_crevalle"), ExtResource("21_mackerel_king"), ExtResource("22_mackerel_spanish"), ExtResource("23_queenfish_talang"), ExtResource("24_sand_lance_american"), ExtResource("25_menhaden_atlantic"), ExtResource("26_pomfret_black"), ExtResource("27_pomfret_chinese"), ExtResource("28_anchovy_european"), ExtResource("29_sardine_european"), ExtResource("30_pomfret_golden"), ExtResource("31_anchovy_northern"), ExtResource("32_sardine_pacific"), ExtResource("33_pomfret_white"), ExtResource("34_shark_blacktip"), ExtResource("35_shark_great_hammerhead"), ExtResource("36_shark_great_white"), ExtResource("37_shark_tiger"), ExtResource("38_shark_whale"), ExtResource("39_wolffish_atlantic"), ExtResource("40_cusk"), ExtResource("41_wolffish_spotted"), ExtResource("42_herring_atlantic"), ExtResource("43_capelin"), ExtResource("44_sprat_european"), ExtResource("45_herring_pacific"), ExtResource("46_pollock_alaska"), ExtResource("47_cod_atlantic"), ExtResource("48_pollock_atlantic"), ExtResource("49_sole_dover"), ExtResource("50_haddock"), ExtResource("51_cod_pacific"), ExtResource("52_hake_pacific"), ExtResource("53_hake_silver"), ExtResource("54_nautilus_chambered"), ExtResource("55_cuttlefish_common"), ExtResource("56_cuttlefish_flamboyant"), ExtResource("57_tilefish_blueline"), ExtResource("58_tilefish_golden"), ExtResource("59_ocean_perch_pacific"), ExtResource("60_sea_bass_chilean"), ExtResource("61_sablefish"), ExtResource("62_wreckfish"), ExtResource("63_oarfish_giant"), ExtResource("64_coelacanth_west_indian"), ExtResource("65_anglerfish_black_seadevil"), ExtResource("66_fangtooth_common"), ExtResource("67_gulper_eel"), ExtResource("68_barreleye_pacific"), ExtResource("69_blobfish_smooth_head"), ExtResource("70_lanternfish_spotted"), ExtResource("71_sea_star_crown_of_thorns"), ExtResource("72_sea_cucumber_giant_california"), ExtResource("73_urchin_purple"), ExtResource("74_sand_dollar"), ExtResource("75_sea_star_sunflower"), ExtResource("76_jelly_crystal"), ExtResource("77_jelly_lions_mane"), ExtResource("78_jelly_moon"), ExtResource("79_jelly_pacific_sea_nettle"), ExtResource("80_jelly_sea_wasp"), ExtResource("81_pompano_african"), ExtResource("82_cobia"), ExtResource("83_trevally_giant"), ExtResource("84_amberjack_greater"), ExtResource("85_amberjack_lesser"), ExtResource("86_halibut_atlantic"), ExtResource("87_halibut_pacific"), ExtResource("88_turbot"), ExtResource("89_lobster_american"), ExtResource("90_krill_antarctic"), ExtResource("91_lobster_caribbean_spiny"), ExtResource("92_shrimp_peacock_mantis"), ExtResource("93_shrimp_skunk_cleaner"), ExtResource("94_crab_japanese_spider"), ExtResource("95_crab_red_king"), ExtResource("96_salmon_atlantic"), ExtResource("97_salmon_chum"), ExtResource("98_salmon_coho"), ExtResource("99_salmon_pink"), ExtResource("100_salmon_sockeye"), ExtResource("101_marlin_black"), ExtResource("102_marlin_blue"), ExtResource("103_sailfish"), ExtResource("104_swordfish"), ExtResource("105_marlin_white"), ExtResource("106_mahi_mahi"), ExtResource("107_opah"), ExtResource("108_wahoo"), ExtResource("109_tuna_albacore"), ExtResource("110_tuna_bigeye"), ExtResource("111_tuna_bluefin"), ExtResource("112_tuna_skipjack"), ExtResource("113_tuna_yellowfin"), ExtResource("114_octopus_common"), ExtResource("115_octopus_day"), ExtResource("116_octopus_giant_pacific"), ExtResource("117_octopus_greater_blue_ringed"), ExtResource("118_sunfish"), ExtResource("119_skate_barndoor"), ExtResource("120_manta_ray_giant"), ExtResource("121_sawfish_largetooth"), ExtResource("122_stingray_southern"), ExtResource("123_lionfish_red"), ExtResource("124_scorpionfish_red"), ExtResource("125_moray_green"), ExtResource("126_flounder_peacock"), ExtResource("127_surgeonfish_blue"), ExtResource("128_parrotfish_rainbow"), ExtResource("129_parrotfish_stoplight"), ExtResource("130_tang_yellow"), ExtResource("131_trumpetfish_atlantic"), ExtResource("132_triggerfish_gray"), ExtResource("133_pufferfish_guineafowl"), ExtResource("134_cowfish_longhorn"), ExtResource("135_triggerfish_queen"), ExtResource("136_cornetfish_red"), ExtResource("137_porcupinefish_spotted"), ExtResource("138_boxfish_yellow"), ExtResource("139_butterflyfish_copperband"), ExtResource("140_clownfish_ocellaris"), ExtResource("141_angelfish_queen"), ExtResource("142_grouper_atlantic_goliath"), ExtResource("143_trevally_bluefin"), ExtResource("144_grouper_giant"), ExtResource("145_barracuda_great"), ExtResource("146_grouper_gulf"), ExtResource("147_grouper_nassau"), ExtResource("148_grouper_red"), ExtResource("149_chromis_blue_green"), ExtResource("150_grunt_bluestriped"), ExtResource("151_grunt_french"), ExtResource("152_damselfish_sergeant_major"), ExtResource("153_snapper_lane"), ExtResource("154_snapper_mangrove"), ExtResource("155_snapper_mutton"), ExtResource("156_snapper_red"), ExtResource("157_wrasse_ballan"), ExtResource("158_wrasse_cleaner"), ExtResource("159_hogfish"), ExtResource("160_turtle_green"), ExtResource("161_turtle_hawksbill"), ExtResource("162_turtle_leatherback"), ExtResource("163_turtle_loggerhead"), ExtResource("164_seadragon_leafy"), ExtResource("165_seadragon_weedy"), ExtResource("166_oyster_black_lip_pearl"), ExtResource("167_clam_giant"), ExtResource("168_clam_geoduck"), ExtResource("169_conch_queen"), ExtResource("170_abalone_red"), ExtResource("171_squid_bigfin_reef"), ExtResource("172_squid_colossal"), ExtResource("173_squid_giant"), ExtResource("174_squid_humboldt"), ExtResource("175_halfbeak_ballyhoo"), ExtResource("176_needlefish_hound"), ExtResource("177_flyingfish_tropical"), ExtResource("178_bass"), ExtResource("179_croaker_atlantic"), ExtResource("180_black_drum"), ExtResource("181_red_drum"), ExtResource("182_mullet_striped"), ExtResource("183_weakfish"), ExtResource("184_croaker_yellowfin"), ExtResource("185_rockfish_black"), ExtResource("186_sea_bass_black"), ExtResource("187_rockfish_canary"), ExtResource("188_porgy_scup"), ExtResource("189_sheepshead"), ExtResource("190_tautog"), ExtResource("191_rockfish_yelloweye"), ExtResource("192_lingcod"), ExtResource("193_milkfish"), ExtResource("194_roosterfish"), ExtResource("195_tarpon_atlantic"), ExtResource("196_snook_common"), ExtResource("197_bonefish"), ExtResource("198_pompano_florida"), ExtResource("199_ladyfish"), ExtResource("200_permit"), ExtResource("201_whale_blue"), ExtResource("202_dolphin_bottlenose"), ExtResource("203_whale_humpback"), ExtResource("204_whale_killer"), ExtResource("205_whale_sperm")] +candidates = [ExtResource("2_bass"), ExtResource("3_sunfish"), ExtResource("4_tuna_albacore"), ExtResource("5_tuna_bigeye"), ExtResource("6_tuna_bluefin"), ExtResource("7_tuna_skipjack"), ExtResource("8_tuna_yellowfin"), ExtResource("9_salmon_atlantic"), ExtResource("10_salmon_chum"), ExtResource("11_salmon_coho"), ExtResource("12_salmon_pink"), ExtResource("13_salmon_sockeye"), ExtResource("14_anchovy_european"), ExtResource("15_anchovy_northern"), ExtResource("16_grouper_gulf"), ExtResource("17_grouper_red"), ExtResource("18_mackerel_atlantic"), ExtResource("19_mackerel_cero"), ExtResource("20_mackerel_chub"), ExtResource("21_mackerel_king"), ExtResource("22_mackerel_spanish"), ExtResource("23_marlin_black"), ExtResource("24_marlin_blue"), ExtResource("25_marlin_white"), ExtResource("26_pomfret_black"), ExtResource("27_pomfret_chinese"), ExtResource("28_pomfret_golden"), ExtResource("29_pomfret_white"), ExtResource("30_sailfish"), ExtResource("31_snapper_lane"), ExtResource("32_snapper_mangrove"), ExtResource("33_snapper_mutton"), ExtResource("34_snapper_red"), ExtResource("35_swordfish")] diff --git a/fish/pools/starter_pond_pool.tres b/fish/pools/starter_pond_pool.tres index e9718d9..f7976fc 100644 --- a/fish/pools/starter_pond_pool.tres +++ b/fish/pools/starter_pond_pool.tres @@ -1,113 +1,33 @@ -[gd_resource type="Resource" load_steps=108 format=3] +[gd_resource type="Resource" load_steps=28 format=3] [ext_resource type="Script" path="res://fish/fish_pool.gd" id="1_pool"] -[ext_resource type="Resource" path="res://fish/species/bowfin/bowfin.tres" id="2_bowfin"] -[ext_resource type="Resource" path="res://fish/species/gar_spotted/gar_spotted.tres" id="3_gar_spotted"] -[ext_resource type="Resource" path="res://fish/species/lungfish_west_african/lungfish_west_african.tres" id="4_lungfish_west_african"] -[ext_resource type="Resource" path="res://fish/species/guppy/guppy.tres" id="5_guppy"] -[ext_resource type="Resource" path="res://fish/species/tetra_neon/tetra_neon.tres" id="6_tetra_neon"] -[ext_resource type="Resource" path="res://fish/species/danio_zebra/danio_zebra.tres" id="7_danio_zebra"] -[ext_resource type="Resource" path="res://fish/species/largemouth_bass/largemouth_bass.tres" id="8_largemouth_bass"] -[ext_resource type="Resource" path="res://fish/species/bullhead_black/bullhead_black.tres" id="9_bullhead_black"] -[ext_resource type="Resource" path="res://fish/species/bullhead_brown/bullhead_brown.tres" id="10_bullhead_brown"] -[ext_resource type="Resource" path="res://fish/species/catfish_channel/catfish_channel.tres" id="11_catfish_channel"] -[ext_resource type="Resource" path="res://fish/species/catfish_white/catfish_white.tres" id="12_catfish_white"] -[ext_resource type="Resource" path="res://fish/species/bullhead_yellow/bullhead_yellow.tres" id="13_bullhead_yellow"] -[ext_resource type="Resource" path="res://fish/species/carp/carp.tres" id="14_carp"] -[ext_resource type="Resource" path="res://fish/species/roach_common/roach_common.tres" id="15_roach_common"] -[ext_resource type="Resource" path="res://fish/species/rudd/rudd.tres" id="16_rudd"] -[ext_resource type="Resource" path="res://fish/species/tench/tench.tres" id="17_tench"] -[ext_resource type="Resource" path="res://fish/species/crayfish_red_swamp/crayfish_red_swamp.tres" id="18_crayfish_red_swamp"] -[ext_resource type="Resource" path="res://fish/species/minnow_fathead/minnow_fathead.tres" id="19_minnow_fathead"] -[ext_resource type="Resource" path="res://fish/species/shiner_golden/shiner_golden.tres" id="20_shiner_golden"] -[ext_resource type="Resource" path="res://fish/species/loach_weather/loach_weather.tres" id="21_loach_weather"] -[ext_resource type="Resource" path="res://fish/species/goldfish_bubbleeye/goldfish_bubbleeye.tres" id="22_goldfish_bubbleeye"] -[ext_resource type="Resource" path="res://fish/species/goldfish/goldfish.tres" id="23_goldfish"] -[ext_resource type="Resource" path="res://fish/species/koi/koi.tres" id="24_koi"] -[ext_resource type="Resource" path="res://fish/species/crappie_black/crappie_black.tres" id="25_crappie_black"] -[ext_resource type="Resource" path="res://fish/species/bluegill/bluegill.tres" id="26_bluegill"] -[ext_resource type="Resource" path="res://fish/species/green_sunfish/green_sunfish.tres" id="27_green_sunfish"] -[ext_resource type="Resource" path="res://fish/species/pumpkinseed/pumpkinseed.tres" id="28_pumpkinseed"] -[ext_resource type="Resource" path="res://fish/species/redear_sunfish/redear_sunfish.tres" id="29_redear_sunfish"] -[ext_resource type="Resource" path="res://fish/species/warmouth/warmouth.tres" id="30_warmouth"] -[ext_resource type="Resource" path="res://fish/species/pickerel_chain/pickerel_chain.tres" id="31_pickerel_chain"] -[ext_resource type="Resource" path="res://fish/species/pickerel_grass/pickerel_grass.tres" id="32_pickerel_grass"] -[ext_resource type="Resource" path="res://fish/species/betta_siamese/betta_siamese.tres" id="33_betta_siamese"] -[ext_resource type="Resource" path="res://fish/species/catfish_walking/catfish_walking.tres" id="34_catfish_walking"] -[ext_resource type="Resource" path="res://fish/species/sturgeon_lake/sturgeon_lake.tres" id="35_sturgeon_lake"] -[ext_resource type="Resource" path="res://fish/species/burbot/burbot.tres" id="36_burbot"] -[ext_resource type="Resource" path="res://fish/species/cisco/cisco.tres" id="37_cisco"] -[ext_resource type="Resource" path="res://fish/species/whitefish_lake/whitefish_lake.tres" id="38_whitefish_lake"] -[ext_resource type="Resource" path="res://fish/species/char_arctic/char_arctic.tres" id="39_char_arctic"] -[ext_resource type="Resource" path="res://fish/species/trout_golden/trout_golden.tres" id="40_trout_golden"] -[ext_resource type="Resource" path="res://fish/species/axolotl/axolotl.tres" id="41_axolotl"] -[ext_resource type="Resource" path="res://fish/species/bream_common/bream_common.tres" id="42_bream_common"] -[ext_resource type="Resource" path="res://fish/species/muskellunge/muskellunge.tres" id="43_muskellunge"] -[ext_resource type="Resource" path="res://fish/species/shiner_emerald/shiner_emerald.tres" id="44_shiner_emerald"] -[ext_resource type="Resource" path="res://fish/species/chub_lake/chub_lake.tres" id="45_chub_lake"] -[ext_resource type="Resource" path="res://fish/species/crappie_white/crappie_white.tres" id="46_crappie_white"] -[ext_resource type="Resource" path="res://fish/species/yellow_perch/yellow_perch.tres" id="47_yellow_perch"] -[ext_resource type="Resource" path="res://fish/species/pike_northern/pike_northern.tres" id="48_pike_northern"] -[ext_resource type="Resource" path="res://fish/species/saugeye/saugeye.tres" id="49_saugeye"] -[ext_resource type="Resource" path="res://fish/species/walleye/walleye.tres" id="50_walleye"] -[ext_resource type="Resource" path="res://fish/species/goby_round/goby_round.tres" id="51_goby_round"] -[ext_resource type="Resource" path="res://fish/species/smelt_rainbow/smelt_rainbow.tres" id="52_smelt_rainbow"] -[ext_resource type="Resource" path="res://fish/species/gourami_giant/gourami_giant.tres" id="53_gourami_giant"] -[ext_resource type="Resource" path="res://fish/species/tilapia_nile/tilapia_nile.tres" id="54_tilapia_nile"] -[ext_resource type="Resource" path="res://fish/species/gar_longnose/gar_longnose.tres" id="55_gar_longnose"] -[ext_resource type="Resource" path="res://fish/species/paddlefish/paddlefish.tres" id="56_paddlefish"] -[ext_resource type="Resource" path="res://fish/species/sturgeon_shovelnose/sturgeon_shovelnose.tres" id="57_sturgeon_shovelnose"] -[ext_resource type="Resource" path="res://fish/species/foureyes_largescale/foureyes_largescale.tres" id="58_foureyes_largescale"] -[ext_resource type="Resource" path="res://fish/species/grayling_arctic/grayling_arctic.tres" id="59_grayling_arctic"] -[ext_resource type="Resource" path="res://fish/species/trout_brown/trout_brown.tres" id="60_trout_brown"] -[ext_resource type="Resource" path="res://fish/species/trout_cutthroat/trout_cutthroat.tres" id="61_trout_cutthroat"] -[ext_resource type="Resource" path="res://fish/species/trout_rainbow/trout_rainbow.tres" id="62_trout_rainbow"] -[ext_resource type="Resource" path="res://fish/species/hellbender/hellbender.tres" id="63_hellbender"] -[ext_resource type="Resource" path="res://fish/species/smallmouth_bass/smallmouth_bass.tres" id="64_smallmouth_bass"] -[ext_resource type="Resource" path="res://fish/species/buffalo_bigmouth/buffalo_bigmouth.tres" id="65_buffalo_bigmouth"] -[ext_resource type="Resource" path="res://fish/species/redhorse_golden/redhorse_golden.tres" id="66_redhorse_golden"] -[ext_resource type="Resource" path="res://fish/species/quillback/quillback.tres" id="67_quillback"] -[ext_resource type="Resource" path="res://fish/species/buffalo_smallmouth/buffalo_smallmouth.tres" id="68_buffalo_smallmouth"] -[ext_resource type="Resource" path="res://fish/species/sucker_white/sucker_white.tres" id="69_sucker_white"] -[ext_resource type="Resource" path="res://fish/species/catfish_blue/catfish_blue.tres" id="70_catfish_blue"] -[ext_resource type="Resource" path="res://fish/species/catfish_flathead/catfish_flathead.tres" id="71_catfish_flathead"] -[ext_resource type="Resource" path="res://fish/species/madtom_tadpole/madtom_tadpole.tres" id="72_madtom_tadpole"] -[ext_resource type="Resource" path="res://fish/species/barbel_common/barbel_common.tres" id="73_barbel_common"] -[ext_resource type="Resource" path="res://fish/species/chub_european/chub_european.tres" id="74_chub_european"] -[ext_resource type="Resource" path="res://fish/species/fallfish/fallfish.tres" id="75_fallfish"] -[ext_resource type="Resource" path="res://fish/species/ide/ide.tres" id="76_ide"] -[ext_resource type="Resource" path="res://fish/species/gar_alligator/gar_alligator.tres" id="77_gar_alligator"] -[ext_resource type="Resource" path="res://fish/species/arapaima/arapaima.tres" id="78_arapaima"] -[ext_resource type="Resource" path="res://fish/species/tigerfish_goliath/tigerfish_goliath.tres" id="79_tigerfish_goliath"] -[ext_resource type="Resource" path="res://fish/species/shiner_common/shiner_common.tres" id="80_shiner_common"] -[ext_resource type="Resource" path="res://fish/species/chub_creek/chub_creek.tres" id="81_chub_creek"] -[ext_resource type="Resource" path="res://fish/species/chub_flame/chub_flame.tres" id="82_chub_flame"] -[ext_resource type="Resource" path="res://fish/species/electric_eel/electric_eel.tres" id="83_electric_eel"] -[ext_resource type="Resource" path="res://fish/species/freshwater_drum/freshwater_drum.tres" id="84_freshwater_drum"] -[ext_resource type="Resource" path="res://fish/species/goldeye/goldeye.tres" id="85_goldeye"] -[ext_resource type="Resource" path="res://fish/species/mooneye/mooneye.tres" id="86_mooneye"] -[ext_resource type="Resource" path="res://fish/species/sauger/sauger.tres" id="87_sauger"] -[ext_resource type="Resource" path="res://fish/species/eel_american/eel_american.tres" id="88_eel_american"] -[ext_resource type="Resource" path="res://fish/species/eel_european/eel_european.tres" id="89_eel_european"] -[ext_resource type="Resource" path="res://fish/species/smelt_eulachon/smelt_eulachon.tres" id="90_smelt_eulachon"] -[ext_resource type="Resource" path="res://fish/species/sturgeon_white/sturgeon_white.tres" id="91_sturgeon_white"] -[ext_resource type="Resource" path="res://fish/species/trout_steelhead/trout_steelhead.tres" id="92_trout_steelhead"] -[ext_resource type="Resource" path="res://fish/species/stingray_ocellate_river/stingray_ocellate_river.tres" id="93_stingray_ocellate_river"] -[ext_resource type="Resource" path="res://fish/species/white_perch/white_perch.tres" id="94_white_perch"] -[ext_resource type="Resource" path="res://fish/species/barramundi/barramundi.tres" id="95_barramundi"] -[ext_resource type="Resource" path="res://fish/species/knifefish_clown/knifefish_clown.tres" id="96_knifefish_clown"] -[ext_resource type="Resource" path="res://fish/species/loach_clown/loach_clown.tres" id="97_loach_clown"] -[ext_resource type="Resource" path="res://fish/species/discus/discus.tres" id="98_discus"] -[ext_resource type="Resource" path="res://fish/species/angelfish_freshwater/angelfish_freshwater.tres" id="99_angelfish_freshwater"] -[ext_resource type="Resource" path="res://fish/species/oscar/oscar.tres" id="100_oscar"] -[ext_resource type="Resource" path="res://fish/species/tambaqui/tambaqui.tres" id="101_tambaqui"] -[ext_resource type="Resource" path="res://fish/species/snakehead_giant/snakehead_giant.tres" id="102_snakehead_giant"] -[ext_resource type="Resource" path="res://fish/species/dorado_golden/dorado_golden.tres" id="103_dorado_golden"] -[ext_resource type="Resource" path="res://fish/species/mahseer_golden/mahseer_golden.tres" id="104_mahseer_golden"] -[ext_resource type="Resource" path="res://fish/species/peacock_bass/peacock_bass.tres" id="105_peacock_bass"] -[ext_resource type="Resource" path="res://fish/species/piranha_red_bellied/piranha_red_bellied.tres" id="106_piranha_red_bellied"] -[ext_resource type="Resource" path="res://fish/species/arowana_silver/arowana_silver.tres" id="107_arowana_silver"] +[ext_resource type="Resource" path="res://fish/species/bluegill/bluegill.tres" id="2_bluegill"] +[ext_resource type="Resource" path="res://fish/species/carp/carp.tres" id="3_carp"] +[ext_resource type="Resource" path="res://fish/species/catfish_blue/catfish_blue.tres" id="4_catfish_blue"] +[ext_resource type="Resource" path="res://fish/species/catfish_channel/catfish_channel.tres" id="5_catfish_channel"] +[ext_resource type="Resource" path="res://fish/species/catfish_flathead/catfish_flathead.tres" id="6_catfish_flathead"] +[ext_resource type="Resource" path="res://fish/species/catfish_white/catfish_white.tres" id="7_catfish_white"] +[ext_resource type="Resource" path="res://fish/species/goby_round/goby_round.tres" id="8_goby_round"] +[ext_resource type="Resource" path="res://fish/species/chub_european/chub_european.tres" id="9_chub_european"] +[ext_resource type="Resource" path="res://fish/species/chub_flame/chub_flame.tres" id="10_chub_flame"] +[ext_resource type="Resource" path="res://fish/species/chub_lake/chub_lake.tres" id="11_chub_lake"] +[ext_resource type="Resource" path="res://fish/species/goldfish/goldfish.tres" id="12_goldfish"] +[ext_resource type="Resource" path="res://fish/species/goldfish_bubbleeye/goldfish_bubbleeye.tres" id="13_goldfish_bubbleeye"] +[ext_resource type="Resource" path="res://fish/species/sauger/sauger.tres" id="14_sauger"] +[ext_resource type="Resource" path="res://fish/species/saugeye/saugeye.tres" id="15_saugeye"] +[ext_resource type="Resource" path="res://fish/species/trout_cutthroat/trout_cutthroat.tres" id="16_trout_cutthroat"] +[ext_resource type="Resource" path="res://fish/species/trout_golden/trout_golden.tres" id="17_trout_golden"] +[ext_resource type="Resource" path="res://fish/species/trout_rainbow/trout_rainbow.tres" id="18_trout_rainbow"] +[ext_resource type="Resource" path="res://fish/species/trout_steelhead/trout_steelhead.tres" id="19_trout_steelhead"] +[ext_resource type="Resource" path="res://fish/species/walleye/walleye.tres" id="20_walleye"] +[ext_resource type="Resource" path="res://fish/species/bowfin/bowfin.tres" id="21_bowfin"] +[ext_resource type="Resource" path="res://fish/species/sturgeon_lake/sturgeon_lake.tres" id="22_sturgeon_lake"] +[ext_resource type="Resource" path="res://fish/species/gar_longnose/gar_longnose.tres" id="23_gar_longnose"] +[ext_resource type="Resource" path="res://fish/species/paddlefish/paddlefish.tres" id="24_paddlefish"] +[ext_resource type="Resource" path="res://fish/species/sturgeon_shovelnose/sturgeon_shovelnose.tres" id="25_sturgeon_shovelnose"] +[ext_resource type="Resource" path="res://fish/species/gar_spotted/gar_spotted.tres" id="26_gar_spotted"] +[ext_resource type="Resource" path="res://fish/species/lungfish_west_african/lungfish_west_african.tres" id="27_lungfish_west_african"] [resource] script = ExtResource("1_pool") -candidates = [ExtResource("2_bowfin"), ExtResource("3_gar_spotted"), ExtResource("4_lungfish_west_african"), ExtResource("5_guppy"), ExtResource("6_tetra_neon"), ExtResource("7_danio_zebra"), ExtResource("8_largemouth_bass"), ExtResource("9_bullhead_black"), ExtResource("10_bullhead_brown"), ExtResource("11_catfish_channel"), ExtResource("12_catfish_white"), ExtResource("13_bullhead_yellow"), ExtResource("14_carp"), ExtResource("15_roach_common"), ExtResource("16_rudd"), ExtResource("17_tench"), ExtResource("18_crayfish_red_swamp"), ExtResource("19_minnow_fathead"), ExtResource("20_shiner_golden"), ExtResource("21_loach_weather"), ExtResource("22_goldfish_bubbleeye"), ExtResource("23_goldfish"), ExtResource("24_koi"), ExtResource("25_crappie_black"), ExtResource("26_bluegill"), ExtResource("27_green_sunfish"), ExtResource("28_pumpkinseed"), ExtResource("29_redear_sunfish"), ExtResource("30_warmouth"), ExtResource("31_pickerel_chain"), ExtResource("32_pickerel_grass"), ExtResource("33_betta_siamese"), ExtResource("34_catfish_walking"), ExtResource("35_sturgeon_lake"), ExtResource("36_burbot"), ExtResource("37_cisco"), ExtResource("38_whitefish_lake"), ExtResource("39_char_arctic"), ExtResource("40_trout_golden"), ExtResource("41_axolotl"), ExtResource("42_bream_common"), ExtResource("43_muskellunge"), ExtResource("44_shiner_emerald"), ExtResource("45_chub_lake"), ExtResource("46_crappie_white"), ExtResource("47_yellow_perch"), ExtResource("48_pike_northern"), ExtResource("49_saugeye"), ExtResource("50_walleye"), ExtResource("51_goby_round"), ExtResource("52_smelt_rainbow"), ExtResource("53_gourami_giant"), ExtResource("54_tilapia_nile"), ExtResource("55_gar_longnose"), ExtResource("56_paddlefish"), ExtResource("57_sturgeon_shovelnose"), ExtResource("58_foureyes_largescale"), ExtResource("59_grayling_arctic"), ExtResource("60_trout_brown"), ExtResource("61_trout_cutthroat"), ExtResource("62_trout_rainbow"), ExtResource("63_hellbender"), ExtResource("64_smallmouth_bass"), ExtResource("65_buffalo_bigmouth"), ExtResource("66_redhorse_golden"), ExtResource("67_quillback"), ExtResource("68_buffalo_smallmouth"), ExtResource("69_sucker_white"), ExtResource("70_catfish_blue"), ExtResource("71_catfish_flathead"), ExtResource("72_madtom_tadpole"), ExtResource("73_barbel_common"), ExtResource("74_chub_european"), ExtResource("75_fallfish"), ExtResource("76_ide"), ExtResource("77_gar_alligator"), ExtResource("78_arapaima"), ExtResource("79_tigerfish_goliath"), ExtResource("80_shiner_common"), ExtResource("81_chub_creek"), ExtResource("82_chub_flame"), ExtResource("83_electric_eel"), ExtResource("84_freshwater_drum"), ExtResource("85_goldeye"), ExtResource("86_mooneye"), ExtResource("87_sauger"), ExtResource("88_eel_american"), ExtResource("89_eel_european"), ExtResource("90_smelt_eulachon"), ExtResource("91_sturgeon_white"), ExtResource("92_trout_steelhead"), ExtResource("93_stingray_ocellate_river"), ExtResource("94_white_perch"), ExtResource("95_barramundi"), ExtResource("96_knifefish_clown"), ExtResource("97_loach_clown"), ExtResource("98_discus"), ExtResource("99_angelfish_freshwater"), ExtResource("100_oscar"), ExtResource("101_tambaqui"), ExtResource("102_snakehead_giant"), ExtResource("103_dorado_golden"), ExtResource("104_mahseer_golden"), ExtResource("105_peacock_bass"), ExtResource("106_piranha_red_bellied"), ExtResource("107_arowana_silver")] +candidates = [ExtResource("2_bluegill"), ExtResource("3_carp"), ExtResource("4_catfish_blue"), ExtResource("5_catfish_channel"), ExtResource("6_catfish_flathead"), ExtResource("7_catfish_white"), ExtResource("8_goby_round"), ExtResource("9_chub_european"), ExtResource("10_chub_flame"), ExtResource("11_chub_lake"), ExtResource("12_goldfish"), ExtResource("13_goldfish_bubbleeye"), ExtResource("14_sauger"), ExtResource("15_saugeye"), ExtResource("16_trout_cutthroat"), ExtResource("17_trout_golden"), ExtResource("18_trout_rainbow"), ExtResource("19_trout_steelhead"), ExtResource("20_walleye"), ExtResource("21_bowfin"), ExtResource("22_sturgeon_lake"), ExtResource("23_gar_longnose"), ExtResource("24_paddlefish"), ExtResource("25_sturgeon_shovelnose"), ExtResource("26_gar_spotted"), ExtResource("27_lungfish_west_african")] diff --git a/fish/species/abalone_red/abalone_red.tres b/fish/species/abalone_red/abalone_red.tres index 6efe784..f454905 100644 --- a/fish/species/abalone_red/abalone_red.tres +++ b/fish/species/abalone_red/abalone_red.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"abalone_red" display_name = "red abalone" -active = true +active = false catalog_number = 6405 collection_group = &"Shellfish" logbook_fact = "red abalones cling to pacific rocks with broad muscular feet. rows of shell holes release water that has passed over the gills." @@ -29,4 +28,3 @@ weight_max_lb = 12.0 sell_value_min = 24 sell_value_max = 56 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/amberjack_greater/amberjack_greater.tres b/fish/species/amberjack_greater/amberjack_greater.tres index b0e40b8..2a7c794 100644 --- a/fish/species/amberjack_greater/amberjack_greater.tres +++ b/fish/species/amberjack_greater/amberjack_greater.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"amberjack_greater" display_name = "greater amberjack" -active = true +active = false catalog_number = 3604 collection_group = &"Large coastal predators" logbook_fact = "greater amberjacks circle reefs, wrecks, and offshore platforms. a dark stripe crosses the eye of their sturdy torpedo-shaped bodies." @@ -27,4 +26,3 @@ weight_max_lb = 90.0 sell_value_min = 15 sell_value_max = 42 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/amberjack_lesser/amberjack_lesser.tres b/fish/species/amberjack_lesser/amberjack_lesser.tres index 1d5983c..0f82f2f 100644 --- a/fish/species/amberjack_lesser/amberjack_lesser.tres +++ b/fish/species/amberjack_lesser/amberjack_lesser.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"amberjack_lesser" display_name = "lesser amberjack" -active = true +active = false catalog_number = 3605 collection_group = &"Large coastal predators" logbook_fact = "lesser amberjacks school around deep reefs and floating objects. an enlarged eye suits their preference for dimmer water." @@ -27,4 +26,3 @@ weight_max_lb = 20.0 sell_value_min = 7 sell_value_max = 18 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/anchovy_european/anchovy_european.tres b/fish/species/anchovy_european/anchovy_european.tres index 0a7d122..4e442e7 100644 --- a/fish/species/anchovy_european/anchovy_european.tres +++ b/fish/species/anchovy_european/anchovy_european.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/805.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://debgohfsg4ec7" path="res://fish/species/anchovy_european/fish_anchovy_european.png" id="4_texture"] [sub_resource type="Resource" id="AnchovyEuropeanAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/anchovy_northern/anchovy_northern.tres b/fish/species/anchovy_northern/anchovy_northern.tres index e2c7fa0..37c52f7 100644 --- a/fish/species/anchovy_northern/anchovy_northern.tres +++ b/fish/species/anchovy_northern/anchovy_northern.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/808.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://6sikqc8eivta" path="res://fish/species/anchovy_northern/fish_anchovy_northern.png" id="4_texture"] [sub_resource type="Resource" id="AnchovyNorthernAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/angelfish_freshwater/angelfish_freshwater.tres b/fish/species/angelfish_freshwater/angelfish_freshwater.tres index 7a58450..63d818b 100644 --- a/fish/species/angelfish_freshwater/angelfish_freshwater.tres +++ b/fish/species/angelfish_freshwater/angelfish_freshwater.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"angelfish_freshwater" display_name = "freshwater angelfish" -active = true +active = false catalog_number = 7504 collection_group = &"Tropical freshwater fish" logbook_fact = "freshwater angelfish slip between tall plants on narrow triangular bodies. long fins and vertical bars resemble stems and shadows." @@ -28,4 +27,3 @@ weight_max_lb = 0.5 sell_value_min = 10 sell_value_max = 22 sell_value_curve = 0.95 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/angelfish_queen/angelfish_queen.tres b/fish/species/angelfish_queen/angelfish_queen.tres index 5a15f5b..70706d8 100644 --- a/fish/species/angelfish_queen/angelfish_queen.tres +++ b/fish/species/angelfish_queen/angelfish_queen.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"angelfish_queen" display_name = "queen angelfish" -active = true +active = false catalog_number = 5703 collection_group = &"Reef ornamentals" logbook_fact = "queen angelfish graze sponges from warm atlantic reefs. a blue-ringed spot on the forehead resembles a tiny crown." @@ -28,4 +27,3 @@ weight_max_lb = 2.0 sell_value_min = 11 sell_value_max = 25 sell_value_curve = 0.94 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/anglerfish_black_seadevil/anglerfish_black_seadevil.tres b/fish/species/anglerfish_black_seadevil/anglerfish_black_seadevil.tres index 83b1fb3..4ac947e 100644 --- a/fish/species/anglerfish_black_seadevil/anglerfish_black_seadevil.tres +++ b/fish/species/anglerfish_black_seadevil/anglerfish_black_seadevil.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"anglerfish_black_seadevil" display_name = "black seadevil" -active = true +active = false catalog_number = 1801 collection_group = &"Deep-sea oddities" logbook_fact = "black seadevils lure prey with a glowing organ suspended above the mouth. tiny males permanently attach to much larger females." @@ -28,4 +27,3 @@ weight_max_lb = 2.0 sell_value_min = 48 sell_value_max = 105 sell_value_curve = 0.92 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/arapaima/arapaima.tres b/fish/species/arapaima/arapaima.tres index b43e3bd..6561920 100644 --- a/fish/species/arapaima/arapaima.tres +++ b/fish/species/arapaima/arapaima.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"arapaima" display_name = "arapaima" -active = true +active = false catalog_number = 2702 collection_group = &"Freshwater giants" logbook_fact = "arapaima must surface frequently to gulp air through a specialized swim bladder. large armored scales protect their long river-going bodies." @@ -28,4 +27,3 @@ weight_max_lb = 400.0 sell_value_min = 60 sell_value_max = 140 sell_value_curve = 0.78 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/arowana_silver/arowana_silver.tres b/fish/species/arowana_silver/arowana_silver.tres index 42baf33..054b94d 100644 --- a/fish/species/arowana_silver/arowana_silver.tres +++ b/fish/species/arowana_silver/arowana_silver.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"arowana_silver" display_name = "silver arowana" -active = true +active = false catalog_number = 7606 collection_group = &"Tropical freshwater predators" logbook_fact = "silver arowanas patrol the surface with upturned mouths and long bodies. powerful jumps capture insects and small animals above the water." @@ -29,4 +28,3 @@ weight_max_lb = 15.0 sell_value_min = 25 sell_value_max = 56 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/axolotl/axolotl.tres b/fish/species/axolotl/axolotl.tres index c201f9c..f67de61 100644 --- a/fish/species/axolotl/axolotl.tres +++ b/fish/species/axolotl/axolotl.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"axolotl" display_name = "axolotl" -active = true +active = false catalog_number = 2001 collection_group = &"Freshwater amphibians" logbook_fact = "axolotls remain aquatic and keep feathery external gills throughout adulthood. lost limbs and parts of several organs can regenerate." @@ -29,4 +28,3 @@ weight_max_lb = 0.7 sell_value_min = 36 sell_value_max = 78 sell_value_curve = 0.96 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/barbel_common/barbel_common.tres b/fish/species/barbel_common/barbel_common.tres index 9cbafff..4e1711b 100644 --- a/fish/species/barbel_common/barbel_common.tres +++ b/fish/species/barbel_common/barbel_common.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"barbel_common" display_name = "common barbel" -active = true +active = false catalog_number = 2501 collection_group = &"Freshwater coarse fish" logbook_fact = "common barbels hold close to fast river bottoms with streamlined bodies and broad fins. four mouth barbels locate food among stones." @@ -29,4 +28,3 @@ weight_max_lb = 25.0 sell_value_min = 13 sell_value_max = 31 sell_value_curve = 0.85 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/barracuda_great/barracuda_great.tres b/fish/species/barracuda_great/barracuda_great.tres index f15092c..0039cef 100644 --- a/fish/species/barracuda_great/barracuda_great.tres +++ b/fish/species/barracuda_great/barracuda_great.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"barracuda_great" display_name = "great barracuda" -active = true +active = false catalog_number = 5804 collection_group = &"Reef predators" logbook_fact = "great barracudas hover motionless before accelerating toward prey. long jaws carry two distinct rows of sharp teeth." @@ -29,4 +28,3 @@ weight_max_lb = 80.0 sell_value_min = 28 sell_value_max = 65 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/barramundi/barramundi.tres b/fish/species/barramundi/barramundi.tres index 705001d..0b98fe4 100644 --- a/fish/species/barramundi/barramundi.tres +++ b/fish/species/barramundi/barramundi.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"barramundi" display_name = "barramundi" -active = true +active = false catalog_number = 7302 collection_group = &"Tropical estuary" logbook_fact = "barramundi move between rivers and coasts and can breathe in low-oxygen water. many mature first as males and later become females." @@ -29,4 +28,3 @@ weight_max_lb = 45.0 sell_value_min = 15 sell_value_max = 38 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/barreleye_pacific/barreleye_pacific.tres b/fish/species/barreleye_pacific/barreleye_pacific.tres index c0705dd..d1d9fc8 100644 --- a/fish/species/barreleye_pacific/barreleye_pacific.tres +++ b/fish/species/barreleye_pacific/barreleye_pacific.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"barreleye_pacific" display_name = "Pacific barreleye" -active = true +active = false catalog_number = 1804 collection_group = &"Deep-sea oddities" logbook_fact = "pacific barreleyes peer upward through transparent shields covering the head. tubular eyes rotate forward when the fish turns to feed." @@ -29,4 +28,3 @@ weight_max_lb = 2.5 sell_value_min = 42 sell_value_max = 88 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/bass/bass.tres b/fish/species/bass/bass.tres index 9d52609..eeb6df5 100644 --- a/fish/species/bass/bass.tres +++ b/fish/species/bass/bass.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/bass_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://dvh6s86asl4ix" path="res://fish/species/bass/fish_bass_striped.png" id="4_texture"] [sub_resource type="Resource" id="BassAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/betta_siamese/betta_siamese.tres b/fish/species/betta_siamese/betta_siamese.tres index 4c9ca3c..276ecfb 100644 --- a/fish/species/betta_siamese/betta_siamese.tres +++ b/fish/species/betta_siamese/betta_siamese.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/7508.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"betta_siamese" display_name = "Siamese fighting fish" -active = true +active = false catalog_number = 7508 collection_group = &"Tropical freshwater fish" logbook_fact = "siamese fighting fish breathe surface air with a labyrinth organ. males build bubble nests and guard the eggs beneath them." @@ -29,4 +28,3 @@ weight_max_lb = 0.15 sell_value_min = 5 sell_value_max = 10 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/black_drum/black_drum.tres b/fish/species/black_drum/black_drum.tres index b542327..46d7db4 100644 --- a/fish/species/black_drum/black_drum.tres +++ b/fish/species/black_drum/black_drum.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"black_drum" display_name = "black drum" -active = true +active = false catalog_number = 6802 collection_group = &"Temperate estuary" logbook_fact = "black drum crush oysters and crabs with rounded throat teeth. large adults develop dark vertical bars that fade with age." @@ -28,4 +27,3 @@ weight_max_lb = 70.0 sell_value_min = 8 sell_value_max = 27 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/blobfish_smooth_head/blobfish_smooth_head.tres b/fish/species/blobfish_smooth_head/blobfish_smooth_head.tres index 4245304..41846aa 100644 --- a/fish/species/blobfish_smooth_head/blobfish_smooth_head.tres +++ b/fish/species/blobfish_smooth_head/blobfish_smooth_head.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"blobfish_smooth_head" display_name = "smooth-head blobfish" -active = true +active = false catalog_number = 1805 collection_group = &"Deep-sea oddities" logbook_fact = "smooth-head blobfish rest on deep slopes where pressure supports their soft bodies. they conserve energy by waiting for edible matter nearby." @@ -29,4 +28,3 @@ weight_max_lb = 5.0 sell_value_min = 42 sell_value_max = 90 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/bluefish/bluefish.tres b/fish/species/bluefish/bluefish.tres index d8888f7..f36c898 100644 --- a/fish/species/bluefish/bluefish.tres +++ b/fish/species/bluefish/bluefish.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"bluefish" display_name = "bluefish" -active = true +active = false catalog_number = 702 collection_group = &"Coastal pelagic fish" logbook_fact = "bluefish race in coordinated schools while pursuing smaller fish. sharp teeth and powerful jaws make their feeding bursts especially fierce." @@ -28,4 +27,3 @@ weight_max_lb = 25.0 sell_value_min = 7 sell_value_max = 19 sell_value_curve = 0.85 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/bluegill/bluegill.tres b/fish/species/bluegill/bluegill.tres index 181b969..e32fdcb 100644 --- a/fish/species/bluegill/bluegill.tres +++ b/fish/species/bluegill/bluegill.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Resource" path="res://fish/day_availability.tres" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/3102.png" id="4_texture"] +[ext_resource type="Texture2D" path="res://fish/species/bluegill/fish_bluegill.png" id="4_texture"] [resource] script = ExtResource("1_fish_data") diff --git a/fish/species/bonefish/bonefish.tres b/fish/species/bonefish/bonefish.tres index b2949d2..fe4def7 100644 --- a/fish/species/bonefish/bonefish.tres +++ b/fish/species/bonefish/bonefish.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"bonefish" display_name = "bonefish" -active = true +active = false catalog_number = 7401 collection_group = &"Tropical flats fish" logbook_fact = "bonefish sweep tropical flats in silvery schools and root for buried prey. their speed and pale bodies make them difficult to follow in shallow water." @@ -29,4 +28,3 @@ weight_max_lb = 15.0 sell_value_min = 13 sell_value_max = 31 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/bowfin/bowfin.tres b/fish/species/bowfin/bowfin.tres index 7b2881f..dc76fd9 100644 --- a/fish/species/bowfin/bowfin.tres +++ b/fish/species/bowfin/bowfin.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/101.png" id="4_texture"] +[ext_resource type="Texture2D" path="res://fish/species/bowfin/bowfin.png" id="4_texture"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/boxfish_yellow/boxfish_yellow.tres b/fish/species/boxfish_yellow/boxfish_yellow.tres index aeda5ad..040e8fc 100644 --- a/fish/species/boxfish_yellow/boxfish_yellow.tres +++ b/fish/species/boxfish_yellow/boxfish_yellow.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"boxfish_yellow" display_name = "yellow boxfish" -active = true +active = false catalog_number = 5608 collection_group = &"Reef oddities" logbook_fact = "yellow boxfish juveniles are bright cubes covered in black spots. rigid body armor leaves small fins to provide careful steering." @@ -28,4 +27,3 @@ weight_max_lb = 0.8 sell_value_min = 10 sell_value_max = 22 sell_value_curve = 0.96 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/bream_common/bream_common.tres b/fish/species/bream_common/bream_common.tres index cc44fef..38d9015 100644 --- a/fish/species/bream_common/bream_common.tres +++ b/fish/species/bream_common/bream_common.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/2502.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"bream_common" display_name = "common bream" -active = true +active = false catalog_number = 2502 collection_group = &"Freshwater coarse fish" logbook_fact = "common bream gather in slow rivers and lakes with silvery, deep-sided bodies. protruding mouths sift insect larvae from soft bottoms." @@ -27,4 +26,3 @@ weight_max_lb = 15.0 sell_value_min = 4 sell_value_max = 12 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/buffalo_bigmouth/buffalo_bigmouth.tres b/fish/species/buffalo_bigmouth/buffalo_bigmouth.tres index bae0473..6292951 100644 --- a/fish/species/buffalo_bigmouth/buffalo_bigmouth.tres +++ b/fish/species/buffalo_bigmouth/buffalo_bigmouth.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"buffalo_bigmouth" display_name = "bigmouth buffalo" -active = true +active = false catalog_number = 2301 collection_group = &"Freshwater bottom fish" logbook_fact = "bigmouth buffalo filter plankton with fine gill rakers instead of rooting for prey. some individuals survive for more than a century." @@ -28,4 +27,3 @@ weight_max_lb = 80.0 sell_value_min = 28 sell_value_max = 63 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/buffalo_smallmouth/buffalo_smallmouth.tres b/fish/species/buffalo_smallmouth/buffalo_smallmouth.tres index 2756035..d590ec6 100644 --- a/fish/species/buffalo_smallmouth/buffalo_smallmouth.tres +++ b/fish/species/buffalo_smallmouth/buffalo_smallmouth.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"buffalo_smallmouth" display_name = "smallmouth buffalo" -active = true +active = false catalog_number = 2304 collection_group = &"Freshwater bottom fish" logbook_fact = "smallmouth buffalo use thick lips to graze bottom-dwelling food in warm rivers. their deep, heavy bodies form a pronounced arch behind the head." @@ -27,4 +26,3 @@ weight_max_lb = 45.0 sell_value_min = 14 sell_value_max = 34 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/bullhead_black/bullhead_black.tres b/fish/species/bullhead_black/bullhead_black.tres index 1d904bd..f10fa87 100644 --- a/fish/species/bullhead_black/bullhead_black.tres +++ b/fish/species/bullhead_black/bullhead_black.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"bullhead_black" display_name = "black bullhead" -active = true +active = false catalog_number = 2401 collection_group = &"Freshwater catfish" logbook_fact = "black bullheads tolerate warm, cloudy water with little oxygen. stout spines protect the dorsal and pectoral fins from predators." @@ -28,4 +27,3 @@ weight_max_lb = 6.0 sell_value_min = 5 sell_value_max = 11 sell_value_curve = 0.92 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/bullhead_brown/bullhead_brown.tres b/fish/species/bullhead_brown/bullhead_brown.tres index b3651b2..a2c81f9 100644 --- a/fish/species/bullhead_brown/bullhead_brown.tres +++ b/fish/species/bullhead_brown/bullhead_brown.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"bullhead_brown" display_name = "brown bullhead" -active = true +active = false catalog_number = 2403 collection_group = &"Freshwater catfish" logbook_fact = "brown bullheads search muddy bottoms with eight sensitive barbels. males guard nests and herd newly hatched young in a dark moving ball." @@ -28,4 +27,3 @@ weight_max_lb = 4.0 sell_value_min = 3 sell_value_max = 7 sell_value_curve = 0.95 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/bullhead_yellow/bullhead_yellow.tres b/fish/species/bullhead_yellow/bullhead_yellow.tres index 4dce589..b00df0d 100644 --- a/fish/species/bullhead_yellow/bullhead_yellow.tres +++ b/fish/species/bullhead_yellow/bullhead_yellow.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"bullhead_yellow" display_name = "yellow bullhead" -active = true +active = false catalog_number = 2408 collection_group = &"Freshwater catfish" logbook_fact = "yellow bullheads use pale chin barbels to distinguish food in murky shallows. both parents may guard the nest and schooling young." @@ -29,4 +28,3 @@ weight_max_lb = 3.5 sell_value_min = 3 sell_value_max = 7 sell_value_curve = 0.95 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/burbot/burbot.tres b/fish/species/burbot/burbot.tres index e46006c..189f076 100644 --- a/fish/species/burbot/burbot.tres +++ b/fish/species/burbot/burbot.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"burbot" display_name = "burbot" -active = true +active = false catalog_number = 1001 collection_group = &"Cold freshwater fish" logbook_fact = "burbot are the only freshwater members of the cod family. they become most active in cold darkness and may spawn beneath winter ice." @@ -29,4 +28,3 @@ weight_max_lb = 18.0 sell_value_min = 12 sell_value_max = 28 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/butterflyfish_copperband/butterflyfish_copperband.tres b/fish/species/butterflyfish_copperband/butterflyfish_copperband.tres index 7a7c112..8ef5d2e 100644 --- a/fish/species/butterflyfish_copperband/butterflyfish_copperband.tres +++ b/fish/species/butterflyfish_copperband/butterflyfish_copperband.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"butterflyfish_copperband" display_name = "copperband butterflyfish" -active = true +active = false catalog_number = 5701 collection_group = &"Reef ornamentals" logbook_fact = "copperband butterflyfish probe reef cracks with long narrow snouts. bold orange bands and a false eyespot confuse predators." @@ -29,4 +28,3 @@ weight_max_lb = 0.4 sell_value_min = 9 sell_value_max = 21 sell_value_curve = 0.98 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/capelin/capelin.tres b/fish/species/capelin/capelin.tres index 5759cb8..7f1b9ba 100644 --- a/fish/species/capelin/capelin.tres +++ b/fish/species/capelin/capelin.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"capelin" display_name = "capelin" -active = true +active = false catalog_number = 1302 collection_group = &"Cold schooling fish" logbook_fact = "capelin are small polar fish that feed whales, seabirds, and larger fish. many schools roll onto beaches or shallows to release their eggs." @@ -28,4 +27,3 @@ weight_max_lb = 0.2 sell_value_min = 4 sell_value_max = 8 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/carp/carp.tres b/fish/species/carp/carp.tres index 24b50e7..37cff52 100644 --- a/fish/species/carp/carp.tres +++ b/fish/species/carp/carp.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/carp_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://c6pa1gqwv1a5s" path="res://fish/species/carp/fish_carp_common.png" id="4_texture"] [sub_resource type="Resource" id="CarpAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/catfish_blue/catfish_blue.tres b/fish/species/catfish_blue/catfish_blue.tres index 8df5866..595db08 100644 --- a/fish/species/catfish_blue/catfish_blue.tres +++ b/fish/species/catfish_blue/catfish_blue.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/bass_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://7f1dtcou8moe" path="res://fish/species/catfish_blue/fish_catfish_blue.png" id="4_texture"] [sub_resource type="Resource" id="BlueCatfishAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/catfish_channel/catfish_channel.tres b/fish/species/catfish_channel/catfish_channel.tres index e72fdb0..5d265ef 100644 --- a/fish/species/catfish_channel/catfish_channel.tres +++ b/fish/species/catfish_channel/catfish_channel.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://dvxpk2ltt3blb" path="res://fish/species/catfish_channel/fish_catfish_channel.png" id="4_texture"] [sub_resource type="Resource" id="ChannelCatfishAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/catfish_flathead/catfish_flathead.tres b/fish/species/catfish_flathead/catfish_flathead.tres index de0e5f6..b4df9d5 100644 --- a/fish/species/catfish_flathead/catfish_flathead.tres +++ b/fish/species/catfish_flathead/catfish_flathead.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/bass_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://bacx63lp0yh7t" path="res://fish/species/catfish_flathead/fish_catfish_flathead.png" id="4_texture"] [sub_resource type="Resource" id="FlatheadCatfishAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/catfish_walking/catfish_walking.tres b/fish/species/catfish_walking/catfish_walking.tres index fe36cee..c0de099 100644 --- a/fish/species/catfish_walking/catfish_walking.tres +++ b/fish/species/catfish_walking/catfish_walking.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"catfish_walking" display_name = "walking catfish" -active = true +active = false catalog_number = 7510 collection_group = &"Tropical freshwater fish" logbook_fact = "walking catfish wriggle across wet ground using stiff pectoral spines for support. an air-breathing organ helps them survive the journey." @@ -29,4 +28,3 @@ weight_max_lb = 5.0 sell_value_min = 11 sell_value_max = 24 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/catfish_white/catfish_white.tres b/fish/species/catfish_white/catfish_white.tres index 86b799f..4612c4f 100644 --- a/fish/species/catfish_white/catfish_white.tres +++ b/fish/species/catfish_white/catfish_white.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://bf6kiawwekv7g" path="res://fish/species/catfish_white/fish_catfish_white.png" id="4_texture"] [sub_resource type="Resource" id="WhiteCatfishAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/char_arctic/char_arctic.tres b/fish/species/char_arctic/char_arctic.tres index 17d08d1..85bcac1 100644 --- a/fish/species/char_arctic/char_arctic.tres +++ b/fish/species/char_arctic/char_arctic.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ forbid_rain = true script = ExtResource("1_fish_data") id = &"char_arctic" display_name = "arctic char" -active = true +active = false catalog_number = 1101 collection_group = &"Cold freshwater salmonids" logbook_fact = "arctic char thrive farther north than any other freshwater fish. some remain in lakes while others migrate between rivers and the sea." @@ -28,4 +27,3 @@ weight_max_lb = 25.0 sell_value_min = 14 sell_value_max = 32 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/chromis_blue_green/chromis_blue_green.tres b/fish/species/chromis_blue_green/chromis_blue_green.tres index 65f35b4..cec319e 100644 --- a/fish/species/chromis_blue_green/chromis_blue_green.tres +++ b/fish/species/chromis_blue_green/chromis_blue_green.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/5901.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"chromis_blue_green" display_name = "blue-green chromis" -active = true +active = false catalog_number = 5901 collection_group = &"Reef schooling fish" logbook_fact = "blue-green chromis form loose clouds above branching coral. the school dives into narrow shelter whenever a predator approaches." @@ -28,4 +27,3 @@ weight_max_lb = 0.25 sell_value_min = 2 sell_value_max = 4 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/chub_creek/chub_creek.tres b/fish/species/chub_creek/chub_creek.tres index 778e9da..acd5351 100644 --- a/fish/species/chub_creek/chub_creek.tres +++ b/fish/species/chub_creek/chub_creek.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/2802.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"chub_creek" display_name = "creek chub" -active = true +active = false catalog_number = 2802 collection_group = &"Freshwater minnows" logbook_fact = "creek chubs gather around pools and undercut banks in small streams. males build gravel ridges where several fish may spawn." @@ -28,4 +27,3 @@ weight_max_lb = 0.8 sell_value_min = 2 sell_value_max = 4 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/chub_european/chub_european.tres b/fish/species/chub_european/chub_european.tres index 16f43a1..aded2f7 100644 --- a/fish/species/chub_european/chub_european.tres +++ b/fish/species/chub_european/chub_european.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/2505.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://c04wtbyslmpll" path="res://fish/species/chub_european/fish_chub_european.png" id="4_texture"] [sub_resource type="Resource" id="ChubEuropeanAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/chub_flame/chub_flame.tres b/fish/species/chub_flame/chub_flame.tres index 2bf815c..941c734 100644 --- a/fish/species/chub_flame/chub_flame.tres +++ b/fish/species/chub_flame/chub_flame.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://bla6pc21imxsi" path="res://fish/species/chub_flame/fish_chub_flame.png" id="4_texture"] [sub_resource type="Resource" id="ChubFlameAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/chub_lake/chub_lake.tres b/fish/species/chub_lake/chub_lake.tres index 1dc2d9a..788df16 100644 --- a/fish/species/chub_lake/chub_lake.tres +++ b/fish/species/chub_lake/chub_lake.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/2807.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://w8cjrpnv350h" path="res://fish/species/chub_lake/fish_chub_lake.png" id="4_texture"] [sub_resource type="Resource" id="ChubLakeAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/cisco/cisco.tres b/fish/species/cisco/cisco.tres index 1bc53b0..2a91382 100644 --- a/fish/species/cisco/cisco.tres +++ b/fish/species/cisco/cisco.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"cisco" display_name = "cisco" -active = true +active = false catalog_number = 1002 collection_group = &"Cold freshwater fish" logbook_fact = "cisco school in the cool open water of northern lakes. these slim relatives of salmon feed on plankton and become prey for larger fish." @@ -28,4 +27,3 @@ weight_max_lb = 3.0 sell_value_min = 3 sell_value_max = 7 sell_value_curve = 0.95 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/clam_geoduck/clam_geoduck.tres b/fish/species/clam_geoduck/clam_geoduck.tres index 492113c..5add347 100644 --- a/fish/species/clam_geoduck/clam_geoduck.tres +++ b/fish/species/clam_geoduck/clam_geoduck.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"clam_geoduck" display_name = "Pacific geoduck" -active = true +active = false catalog_number = 6403 collection_group = &"Shellfish" logbook_fact = "pacific geoducks bury their shells deep while a long siphon reaches the seafloor. these clams can survive for well over a century." @@ -29,4 +28,3 @@ weight_max_lb = 15.0 sell_value_min = 14 sell_value_max = 34 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/clam_giant/clam_giant.tres b/fish/species/clam_giant/clam_giant.tres index 2b4f59d..cf31a65 100644 --- a/fish/species/clam_giant/clam_giant.tres +++ b/fish/species/clam_giant/clam_giant.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"clam_giant" display_name = "giant clam" -active = true +active = false catalog_number = 6402 collection_group = &"Shellfish" logbook_fact = "giant clams host photosynthetic algae inside brightly colored mantles. heavy shells remain anchored to one reef spot throughout adulthood." @@ -29,4 +28,3 @@ weight_max_lb = 500.0 sell_value_min = 28 sell_value_max = 72 sell_value_curve = 0.8 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/clam_manila/clam_manila.tres b/fish/species/clam_manila/clam_manila.tres index 2b3fe73..20e3f8a 100644 --- a/fish/species/clam_manila/clam_manila.tres +++ b/fish/species/clam_manila/clam_manila.tres @@ -2,7 +2,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/6406.png" id="3_texture"] +[ext_resource type="Texture2D" path="res://fish/species/clam_manila/clam_manila.png" id="3_texture"] [resource] script = ExtResource("1_fish_data") diff --git a/fish/species/clownfish_ocellaris/clownfish_ocellaris.tres b/fish/species/clownfish_ocellaris/clownfish_ocellaris.tres index 16566cb..ac9a95e 100644 --- a/fish/species/clownfish_ocellaris/clownfish_ocellaris.tres +++ b/fish/species/clownfish_ocellaris/clownfish_ocellaris.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/5702.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"clownfish_ocellaris" display_name = "ocellaris clownfish" -active = true +active = false catalog_number = 5702 collection_group = &"Reef ornamentals" logbook_fact = "ocellaris clownfish shelter safely among stinging anemone tentacles. each group is led by a female that develops from the largest male." @@ -28,4 +27,3 @@ weight_max_lb = 0.15 sell_value_min = 5 sell_value_max = 10 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/cobia/cobia.tres b/fish/species/cobia/cobia.tres index 51dec82..1cde907 100644 --- a/fish/species/cobia/cobia.tres +++ b/fish/species/cobia/cobia.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"cobia" display_name = "cobia" -active = true +active = false catalog_number = 3602 collection_group = &"Large coastal predators" logbook_fact = "cobia often follow sharks, rays, and floating structures in warm seas. a broad dark stripe runs along their long, powerful bodies." @@ -28,4 +27,3 @@ weight_max_lb = 80.0 sell_value_min = 15 sell_value_max = 40 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/cod_atlantic/cod_atlantic.tres b/fish/species/cod_atlantic/cod_atlantic.tres index 640ccaa..e799724 100644 --- a/fish/species/cod_atlantic/cod_atlantic.tres +++ b/fish/species/cod_atlantic/cod_atlantic.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"cod_atlantic" display_name = "atlantic cod" -active = true +active = false catalog_number = 1402 collection_group = &"Cold shelf fish" logbook_fact = "atlantic cod carry a pale lateral line and one chin barbel. they search cold seafloors for crustaceans, mollusks, and smaller fish." @@ -27,4 +26,3 @@ weight_max_lb = 55.0 sell_value_min = 5 sell_value_max = 18 sell_value_curve = 0.85 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/cod_pacific/cod_pacific.tres b/fish/species/cod_pacific/cod_pacific.tres index 729acc1..89eb39f 100644 --- a/fish/species/cod_pacific/cod_pacific.tres +++ b/fish/species/cod_pacific/cod_pacific.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"cod_pacific" display_name = "pacific cod" -active = true +active = false catalog_number = 1406 collection_group = &"Cold shelf fish" logbook_fact = "pacific cod use a chin barbel to investigate cold shelf bottoms. seasonal schools follow prey between deeper water and coastal spawning grounds." @@ -27,4 +26,3 @@ weight_max_lb = 45.0 sell_value_min = 5 sell_value_max = 17 sell_value_curve = 0.85 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/coelacanth_west_indian/coelacanth_west_indian.tres b/fish/species/coelacanth_west_indian/coelacanth_west_indian.tres index 8b7bf18..3da9f04 100644 --- a/fish/species/coelacanth_west_indian/coelacanth_west_indian.tres +++ b/fish/species/coelacanth_west_indian/coelacanth_west_indian.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"coelacanth_west_indian" display_name = "West Indian Ocean coelacanth" -active = true +active = false catalog_number = 1702 collection_group = &"Deep-sea legends" logbook_fact = "west indian ocean coelacanths shelter in deep volcanic caves by day. fleshy lobed fins move in an alternating, limb-like rhythm." @@ -29,4 +28,3 @@ weight_max_lb = 200.0 sell_value_min = 65 sell_value_max = 145 sell_value_curve = 0.8 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/conch_queen/conch_queen.tres b/fish/species/conch_queen/conch_queen.tres index 045012b..bac9eb6 100644 --- a/fish/species/conch_queen/conch_queen.tres +++ b/fish/species/conch_queen/conch_queen.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"conch_queen" display_name = "queen conch" -active = true +active = false catalog_number = 6404 collection_group = &"Shellfish" logbook_fact = "queen conchs graze algae with a long flexible snout. adults develop a broad flared shell lip and move by vaulting on one muscular foot." @@ -29,4 +28,3 @@ weight_max_lb = 5.0 sell_value_min = 15 sell_value_max = 36 sell_value_curve = 0.91 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/cornetfish_red/cornetfish_red.tres b/fish/species/cornetfish_red/cornetfish_red.tres index ea750bd..600d189 100644 --- a/fish/species/cornetfish_red/cornetfish_red.tres +++ b/fish/species/cornetfish_red/cornetfish_red.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"cornetfish_red" display_name = "red cornetfish" -active = true +active = false catalog_number = 5606 collection_group = &"Reef oddities" logbook_fact = "red cornetfish stalk reefs with extremely long bodies and tubular snouts. a trailing filament extends from the center of the tail." @@ -29,4 +28,3 @@ weight_max_lb = 4.0 sell_value_min = 24 sell_value_max = 55 sell_value_curve = 0.92 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/cowfish_longhorn/cowfish_longhorn.tres b/fish/species/cowfish_longhorn/cowfish_longhorn.tres index 2a848a7..8d3e4b2 100644 --- a/fish/species/cowfish_longhorn/cowfish_longhorn.tres +++ b/fish/species/cowfish_longhorn/cowfish_longhorn.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"cowfish_longhorn" display_name = "longhorn cowfish" -active = true +active = false catalog_number = 5604 collection_group = &"Reef oddities" logbook_fact = "longhorn cowfish wear a rigid box of fused scales with horns above the eyes. small fins steer the angular body with surprising precision." @@ -29,4 +28,3 @@ weight_max_lb = 2.0 sell_value_min = 23 sell_value_max = 52 sell_value_curve = 0.94 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/crab_blue/crab_blue.tres b/fish/species/crab_blue/crab_blue.tres index b715522..2ee3279 100644 --- a/fish/species/crab_blue/crab_blue.tres +++ b/fish/species/crab_blue/crab_blue.tres @@ -1,11 +1,9 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/3902.png" id="99_creature_texture"] - [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") allow_night = false @@ -14,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"crab_blue" display_name = "blue crab" -active = true +active = false catalog_number = 3902 collection_group = &"Marine crabs" logbook_fact = "blue crabs swim with flattened rear legs shaped like paddles. bright blue claws and an olive shell conceal a quick, defensive temperament." @@ -32,5 +30,3 @@ weight_max_lb = 1.1 sell_value_min = 3 sell_value_max = 8 sell_value_curve = 0.95 - -display_texture = ExtResource("99_creature_texture") diff --git a/fish/species/crab_brown/crab_brown.tres b/fish/species/crab_brown/crab_brown.tres index 7dec427..8f31b9c 100644 --- a/fish/species/crab_brown/crab_brown.tres +++ b/fish/species/crab_brown/crab_brown.tres @@ -2,7 +2,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/3906.png" id="3_texture"] +[ext_resource type="Texture2D" path="res://fish/species/crab_brown/crab_brown.png" id="3_texture"] [resource] script = ExtResource("1_fish_data") diff --git a/fish/species/crab_japanese_spider/crab_japanese_spider.tres b/fish/species/crab_japanese_spider/crab_japanese_spider.tres index 33ffbff..d09f4cd 100644 --- a/fish/species/crab_japanese_spider/crab_japanese_spider.tres +++ b/fish/species/crab_japanese_spider/crab_japanese_spider.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"crab_japanese_spider" display_name = "Japanese spider crab" -active = true +active = false catalog_number = 3904 collection_group = &"Marine crabs" logbook_fact = "japanese spider crabs carry the longest leg span of any living arthropod. adults roam deep seafloors around japan." @@ -28,4 +27,3 @@ weight_max_lb = 44.0 sell_value_min = 38 sell_value_max = 88 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/crab_red_king/crab_red_king.tres b/fish/species/crab_red_king/crab_red_king.tres index c82579a..3a1a326 100644 --- a/fish/species/crab_red_king/crab_red_king.tres +++ b/fish/species/crab_red_king/crab_red_king.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"crab_red_king" display_name = "red king crab" -active = true +active = false catalog_number = 3905 collection_group = &"Marine crabs" logbook_fact = "red king crabs stride over cold northern bottoms on long armored legs. despite the name, they are closer to hermit crabs than true crabs." @@ -29,4 +28,3 @@ weight_max_lb = 24.0 sell_value_min = 24 sell_value_max = 58 sell_value_curve = 0.85 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/crappie_black/crappie_black.tres b/fish/species/crappie_black/crappie_black.tres index 0359a2c..bfa949b 100644 --- a/fish/species/crappie_black/crappie_black.tres +++ b/fish/species/crappie_black/crappie_black.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"crappie_black" display_name = "black crappie" -active = true +active = false catalog_number = 3101 collection_group = &"Freshwater panfish" logbook_fact = "black crappie gather around submerged wood and vegetation in clear water. irregular dark speckles scatter across their deep silver bodies." @@ -28,4 +27,3 @@ weight_max_lb = 4.0 sell_value_min = 5 sell_value_max = 11 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/crappie_white/crappie_white.tres b/fish/species/crappie_white/crappie_white.tres index 6766f1e..021000b 100644 --- a/fish/species/crappie_white/crappie_white.tres +++ b/fish/species/crappie_white/crappie_white.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/3107.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"crappie_white" display_name = "white crappie" -active = true +active = false catalog_number = 3107 collection_group = &"Freshwater panfish" logbook_fact = "white crappie favor warm, cloudy water and gather around structure. vertical bars cross their silver sides instead of scattered speckles." @@ -28,4 +27,3 @@ weight_max_lb = 4.5 sell_value_min = 4 sell_value_max = 9 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/crayfish_red_swamp/crayfish_red_swamp.tres b/fish/species/crayfish_red_swamp/crayfish_red_swamp.tres index 6c055d2..c3bd2df 100644 --- a/fish/species/crayfish_red_swamp/crayfish_red_swamp.tres +++ b/fish/species/crayfish_red_swamp/crayfish_red_swamp.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/2601.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"crayfish_red_swamp" display_name = "red swamp crayfish" -active = true +active = false catalog_number = 2601 collection_group = &"Freshwater crustaceans" logbook_fact = "red swamp crayfish burrow into wet ground when water recedes. adaptable populations feed on plants, carrion, and small aquatic animals." @@ -29,4 +28,3 @@ weight_max_lb = 0.25 sell_value_min = 3 sell_value_max = 7 sell_value_curve = 0.98 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/croaker_atlantic/croaker_atlantic.tres b/fish/species/croaker_atlantic/croaker_atlantic.tres index d0fb147..b8ebf09 100644 --- a/fish/species/croaker_atlantic/croaker_atlantic.tres +++ b/fish/species/croaker_atlantic/croaker_atlantic.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/6801.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"croaker_atlantic" display_name = "atlantic croaker" -active = true +active = false catalog_number = 6801 collection_group = &"Temperate estuary" logbook_fact = "atlantic croakers vibrate muscles against the swim bladder to make a croaking sound. chin barbels locate worms in sandy bays." @@ -29,4 +28,3 @@ weight_max_lb = 5.0 sell_value_min = 3 sell_value_max = 8 sell_value_curve = 0.92 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/croaker_yellowfin/croaker_yellowfin.tres b/fish/species/croaker_yellowfin/croaker_yellowfin.tres index 1e282da..e2a6105 100644 --- a/fish/species/croaker_yellowfin/croaker_yellowfin.tres +++ b/fish/species/croaker_yellowfin/croaker_yellowfin.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/6807.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"croaker_yellowfin" display_name = "yellowfin croaker" -active = true +active = false catalog_number = 6807 collection_group = &"Temperate estuary" logbook_fact = "yellowfin croakers search sandy surf zones with a small chin barbel. internal muscles produce croaks and drumming calls." @@ -27,4 +26,3 @@ weight_max_lb = 4.0 sell_value_min = 3 sell_value_max = 8 sell_value_curve = 0.92 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/cusk/cusk.tres b/fish/species/cusk/cusk.tres index b223ba1..6e69dd6 100644 --- a/fish/species/cusk/cusk.tres +++ b/fish/species/cusk/cusk.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"cusk" display_name = "cusk" -active = true +active = false catalog_number = 1202 collection_group = &"Cold reef fish" logbook_fact = "cusk move slowly across cold rocky bottoms, sheltering in cracks and caves. a single long fin runs around much of the rear body." @@ -28,4 +27,3 @@ weight_max_lb = 30.0 sell_value_min = 7 sell_value_max = 19 sell_value_curve = 0.85 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/cuttlefish_common/cuttlefish_common.tres b/fish/species/cuttlefish_common/cuttlefish_common.tres index c1ef5ec..f6b678a 100644 --- a/fish/species/cuttlefish_common/cuttlefish_common.tres +++ b/fish/species/cuttlefish_common/cuttlefish_common.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"cuttlefish_common" display_name = "common cuttlefish" -active = true +active = false catalog_number = 1502 collection_group = &"Cuttlefish and nautiluses" logbook_fact = "common cuttlefish flash changing colors and patterns through specialized skin cells. an internal cuttlebone controls buoyancy." @@ -28,4 +27,3 @@ weight_max_lb = 12.0 sell_value_min = 7 sell_value_max = 17 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/cuttlefish_flamboyant/cuttlefish_flamboyant.tres b/fish/species/cuttlefish_flamboyant/cuttlefish_flamboyant.tres index 496ade9..1af0669 100644 --- a/fish/species/cuttlefish_flamboyant/cuttlefish_flamboyant.tres +++ b/fish/species/cuttlefish_flamboyant/cuttlefish_flamboyant.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"cuttlefish_flamboyant" display_name = "flamboyant cuttlefish" -active = true +active = false catalog_number = 1503 collection_group = &"Cuttlefish and nautiluses" logbook_fact = "flamboyant cuttlefish walk along the seafloor on their arms and fins. vivid displays warn predators of potent toxins." @@ -29,4 +28,3 @@ weight_max_lb = 0.4 sell_value_min = 26 sell_value_max = 58 sell_value_curve = 0.96 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/damselfish_sergeant_major/damselfish_sergeant_major.tres b/fish/species/damselfish_sergeant_major/damselfish_sergeant_major.tres index b758404..0e605c0 100644 --- a/fish/species/damselfish_sergeant_major/damselfish_sergeant_major.tres +++ b/fish/species/damselfish_sergeant_major/damselfish_sergeant_major.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/5904.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"damselfish_sergeant_major" display_name = "sergeant major" -active = true +active = false catalog_number = 5904 collection_group = &"Reef schooling fish" logbook_fact = "sergeant majors guard purple egg patches on hard reef surfaces. five dark bars cross their yellow and silver bodies." @@ -28,4 +27,3 @@ weight_max_lb = 0.5 sell_value_min = 2 sell_value_max = 5 sell_value_curve = 0.98 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/danio_zebra/danio_zebra.tres b/fish/species/danio_zebra/danio_zebra.tres index 0f73935..285687e 100644 --- a/fish/species/danio_zebra/danio_zebra.tres +++ b/fish/species/danio_zebra/danio_zebra.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"danio_zebra" display_name = "zebrafish" -active = true +active = false catalog_number = 2103 collection_group = &"Freshwater aquarium fish" logbook_fact = "zebrafish carry horizontal blue stripes from gill to tail. hardy schools thrive in shallow streams, flooded fields, and quiet pools." @@ -28,4 +27,3 @@ weight_max_lb = 0.12 sell_value_min = 2 sell_value_max = 5 sell_value_curve = 0.98 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/discus/discus.tres b/fish/species/discus/discus.tres index 9803f77..4fcd169 100644 --- a/fish/species/discus/discus.tres +++ b/fish/species/discus/discus.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"discus" display_name = "discus" -active = true +active = false catalog_number = 7503 collection_group = &"Tropical freshwater fish" logbook_fact = "discus move through quiet amazon backwaters with round, flattened bodies. parents feed newly hatched young with nutrient-rich skin mucus." @@ -29,4 +28,3 @@ weight_max_lb = 1.0 sell_value_min = 24 sell_value_max = 52 sell_value_curve = 0.92 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/dolphin_bottlenose/dolphin_bottlenose.tres b/fish/species/dolphin_bottlenose/dolphin_bottlenose.tres index 2b410ea..abbc37f 100644 --- a/fish/species/dolphin_bottlenose/dolphin_bottlenose.tres +++ b/fish/species/dolphin_bottlenose/dolphin_bottlenose.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"dolphin_bottlenose" display_name = "common bottlenose dolphin" -active = true +active = false catalog_number = 7702 collection_group = &"Whales and dolphins" logbook_fact = "common bottlenose dolphins coordinate with whistles, clicks, and body signals. echolocation reveals prey hidden in dark or cloudy water." @@ -29,4 +28,3 @@ weight_max_lb = 1400.0 sell_value_min = 75 sell_value_max = 180 sell_value_curve = 0.76 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/dorado_golden/dorado_golden.tres b/fish/species/dorado_golden/dorado_golden.tres index e22f7c9..4110ebe 100644 --- a/fish/species/dorado_golden/dorado_golden.tres +++ b/fish/species/dorado_golden/dorado_golden.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"dorado_golden" display_name = "golden dorado" -active = true +active = false catalog_number = 7602 collection_group = &"Tropical freshwater predators" logbook_fact = "golden dorado chase fish through powerful south american rivers. muscular tails, heavy jaws, and golden scales suit life in fast current." @@ -29,4 +28,3 @@ weight_max_lb = 55.0 sell_value_min = 29 sell_value_max = 66 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/dugong/dugong.tres b/fish/species/dugong/dugong.tres index 0c81d2e..3225a52 100644 --- a/fish/species/dugong/dugong.tres +++ b/fish/species/dugong/dugong.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"dugong" display_name = "dugong" -active = true +active = false catalog_number = 501 collection_group = &"Coastal marine mammals" logbook_fact = "dugongs graze seagrass meadows with a downturned, bristled snout. they are the only fully marine members of the sirenian family." @@ -29,4 +28,3 @@ weight_max_lb = 1100.0 sell_value_min = 72 sell_value_max = 165 sell_value_curve = 0.77 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/eel_american/eel_american.tres b/fish/species/eel_american/eel_american.tres index a433afa..b1f4b8e 100644 --- a/fish/species/eel_american/eel_american.tres +++ b/fish/species/eel_american/eel_american.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"eel_american" display_name = "american eel" -active = true +active = false catalog_number = 4001 collection_group = &"Migratory eels" logbook_fact = "american eels hatch far out in the sargasso sea before entering freshwater rivers. adults later reverse the journey to spawn once." @@ -29,4 +28,3 @@ weight_max_lb = 8.0 sell_value_min = 12 sell_value_max = 27 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/eel_european/eel_european.tres b/fish/species/eel_european/eel_european.tres index 7683d92..4ef5246 100644 --- a/fish/species/eel_european/eel_european.tres +++ b/fish/species/eel_european/eel_european.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"eel_european" display_name = "european eel" -active = true +active = false catalog_number = 4002 collection_group = &"Migratory eels" logbook_fact = "european eels cross the atlantic as transparent larvae before entering rivers and lakes. mature silver eels return to sea to reproduce." @@ -29,4 +28,3 @@ weight_max_lb = 10.0 sell_value_min = 13 sell_value_max = 30 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/electric_eel/electric_eel.tres b/fish/species/electric_eel/electric_eel.tres index ef5b6df..7792d81 100644 --- a/fish/species/electric_eel/electric_eel.tres +++ b/fish/species/electric_eel/electric_eel.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"electric_eel" display_name = "electric eel" -active = true +active = false catalog_number = 2901 collection_group = &"Freshwater oddities" logbook_fact = "electric eels navigate and hunt with electrical pulses produced along most of the body. they must surface regularly to breathe air." @@ -29,4 +28,3 @@ weight_max_lb = 44.0 sell_value_min = 25 sell_value_max = 60 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/fallfish/fallfish.tres b/fish/species/fallfish/fallfish.tres index 53ef7b6..02c6bbe 100644 --- a/fish/species/fallfish/fallfish.tres +++ b/fish/species/fallfish/fallfish.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"fallfish" display_name = "fallfish" -active = true +active = false catalog_number = 2506 collection_group = &"Freshwater coarse fish" logbook_fact = "fallfish are large minnows that build broad stone nests in flowing water. other stream fish often reuse the gravel mounds for spawning." @@ -29,4 +28,3 @@ weight_max_lb = 3.5 sell_value_min = 5 sell_value_max = 10 sell_value_curve = 0.92 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/fangtooth_common/fangtooth_common.tres b/fish/species/fangtooth_common/fangtooth_common.tres index 1004279..c7312b0 100644 --- a/fish/species/fangtooth_common/fangtooth_common.tres +++ b/fish/species/fangtooth_common/fangtooth_common.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"fangtooth_common" display_name = "common fangtooth" -active = true +active = false catalog_number = 1802 collection_group = &"Deep-sea oddities" logbook_fact = "common fangtooths carry outsized teeth that fit into pockets in the roof of the mouth. they migrate upward from deep water after dark." @@ -28,4 +27,3 @@ weight_max_lb = 0.5 sell_value_min = 25 sell_value_max = 56 sell_value_curve = 0.96 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/flounder_peacock/flounder_peacock.tres b/fish/species/flounder_peacock/flounder_peacock.tres index 3d096df..50bd7dc 100644 --- a/fish/species/flounder_peacock/flounder_peacock.tres +++ b/fish/species/flounder_peacock/flounder_peacock.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"flounder_peacock" display_name = "peacock flounder" -active = true +active = false catalog_number = 5401 collection_group = &"Reef flatfish" logbook_fact = "peacock flounders change their spots and colors to match tropical sand. both eyes scan above while the flat body remains concealed." @@ -28,4 +27,3 @@ weight_max_lb = 5.0 sell_value_min = 11 sell_value_max = 24 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/flounder_summer/flounder_summer.tres b/fish/species/flounder_summer/flounder_summer.tres index 680738d..b5bb969 100644 --- a/fish/species/flounder_summer/flounder_summer.tres +++ b/fish/species/flounder_summer/flounder_summer.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"flounder_summer" display_name = "summer flounder" -active = true +active = false catalog_number = 402 collection_group = &"Coastal flatfish" logbook_fact = "summer flounder bury themselves in sand with only their eyes exposed. a sudden burst carries them upward to seize passing prey." @@ -28,4 +27,3 @@ weight_max_lb = 15.0 sell_value_min = 6 sell_value_max = 16 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/flounder_winter/flounder_winter.tres b/fish/species/flounder_winter/flounder_winter.tres index c3ae09b..1297bcb 100644 --- a/fish/species/flounder_winter/flounder_winter.tres +++ b/fish/species/flounder_winter/flounder_winter.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/403.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_rain = true script = ExtResource("1_fish_data") id = &"flounder_winter" display_name = "winter flounder" -active = true +active = false catalog_number = 403 collection_group = &"Coastal flatfish" logbook_fact = "winter flounder favor cool bays and estuaries where they rest on muddy bottoms. their eyes sit on the right side of the body." @@ -29,4 +28,3 @@ weight_max_lb = 8.0 sell_value_min = 4 sell_value_max = 9 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/flyingfish_tropical/flyingfish_tropical.tres b/fish/species/flyingfish_tropical/flyingfish_tropical.tres index 12fd4bb..6376ead 100644 --- a/fish/species/flyingfish_tropical/flyingfish_tropical.tres +++ b/fish/species/flyingfish_tropical/flyingfish_tropical.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_rain = true script = ExtResource("1_fish_data") id = &"flyingfish_tropical" display_name = "tropical flyingfish" -active = true +active = false catalog_number = 6603 collection_group = &"Surface ocean fish" logbook_fact = "tropical flyingfish accelerate underwater before spreading enlarged fins above the surface. glides help them escape pursuing predators." @@ -29,4 +28,3 @@ weight_max_lb = 1.5 sell_value_min = 10 sell_value_max = 22 sell_value_curve = 0.94 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/foureyes_largescale/foureyes_largescale.tres b/fish/species/foureyes_largescale/foureyes_largescale.tres index 7ebba2f..a2e5361 100644 --- a/fish/species/foureyes_largescale/foureyes_largescale.tres +++ b/fish/species/foureyes_largescale/foureyes_largescale.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"foureyes_largescale" display_name = "largescale foureyes" -active = true +active = false catalog_number = 202 collection_group = &"Brackish oddities" logbook_fact = "largescale foureyes cruise with each eye divided across the waterline. one half watches above while the other scans below." @@ -28,4 +27,3 @@ weight_max_lb = 1.0 sell_value_min = 10 sell_value_max = 23 sell_value_curve = 0.95 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/freshwater_drum/freshwater_drum.tres b/fish/species/freshwater_drum/freshwater_drum.tres index f52f9fe..5d710f3 100644 --- a/fish/species/freshwater_drum/freshwater_drum.tres +++ b/fish/species/freshwater_drum/freshwater_drum.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"freshwater_drum" display_name = "freshwater drum" -active = true +active = false catalog_number = 2902 collection_group = &"Freshwater oddities" logbook_fact = "freshwater drum crush snails and mussels with powerful throat teeth. muscles vibrating against the swim bladder produce a low drumming sound." @@ -29,4 +28,3 @@ weight_max_lb = 35.0 sell_value_min = 7 sell_value_max = 20 sell_value_curve = 0.85 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/gar_alligator/gar_alligator.tres b/fish/species/gar_alligator/gar_alligator.tres index f5439a4..5a00da6 100644 --- a/fish/species/gar_alligator/gar_alligator.tres +++ b/fish/species/gar_alligator/gar_alligator.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"gar_alligator" display_name = "alligator gar" -active = true +active = false catalog_number = 2701 collection_group = &"Freshwater giants" logbook_fact = "alligator gar combine a broad tooth-filled snout with heavy armor-like scales. a vascular swim bladder lets them breathe air at the surface." @@ -28,4 +27,3 @@ weight_max_lb = 300.0 sell_value_min = 55 sell_value_max = 125 sell_value_curve = 0.8 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/gar_longnose/gar_longnose.tres b/fish/species/gar_longnose/gar_longnose.tres index aaabbfe..ff1d808 100644 --- a/fish/species/gar_longnose/gar_longnose.tres +++ b/fish/species/gar_longnose/gar_longnose.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/103.png" id="4_texture"] +[ext_resource type="Texture2D" path="res://fish/species/gar_longnose/gar_longnose.png" id="4_texture"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/gar_spotted/gar_spotted.tres b/fish/species/gar_spotted/gar_spotted.tres index 3405ee9..25f92cd 100644 --- a/fish/species/gar_spotted/gar_spotted.tres +++ b/fish/species/gar_spotted/gar_spotted.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/106.png" id="4_texture"] +[ext_resource type="Texture2D" path="res://fish/species/gar_spotted/gar_spotted.png" id="4_texture"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/goby_round/goby_round.tres b/fish/species/goby_round/goby_round.tres index 3a8ffee..af135e0 100644 --- a/fish/species/goby_round/goby_round.tres +++ b/fish/species/goby_round/goby_round.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/3401.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://bdhywe0r1xcio" path="res://fish/species/goby_round/fish_goby_round.png" id="4_texture"] [sub_resource type="Resource" id="RoundGobyAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/goldeye/goldeye.tres b/fish/species/goldeye/goldeye.tres index 1d09b7c..69b28a1 100644 --- a/fish/species/goldeye/goldeye.tres +++ b/fish/species/goldeye/goldeye.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"goldeye" display_name = "goldeye" -active = true +active = false catalog_number = 2903 collection_group = &"Freshwater oddities" logbook_fact = "goldeye patrol turbid rivers with large light-sensitive eyes and a toothed tongue. they rise toward the surface to hunt insects and small fish." @@ -29,4 +28,3 @@ weight_max_lb = 6.0 sell_value_min = 12 sell_value_max = 25 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/goldfish/goldfish.tres b/fish/species/goldfish/goldfish.tres index 58c7934..e27ede5 100644 --- a/fish/species/goldfish/goldfish.tres +++ b/fish/species/goldfish/goldfish.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/3002.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://c6uth7aob03kg" path="res://fish/species/goldfish/fish_goldfish.png" id="4_texture"] [sub_resource type="Resource" id="GoldfishAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/goldfish_bubbleeye/goldfish_bubbleeye.tres b/fish/species/goldfish_bubbleeye/goldfish_bubbleeye.tres index d88719c..beecd5b 100644 --- a/fish/species/goldfish_bubbleeye/goldfish_bubbleeye.tres +++ b/fish/species/goldfish_bubbleeye/goldfish_bubbleeye.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://brjjnxr6n7olr" path="res://fish/species/goldfish_bubbleeye/fish_goldfish_bubbleeye.png" id="4_texture"] [sub_resource type="Resource" id="GoldfishBubbleeyeAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/gourami_giant/gourami_giant.tres b/fish/species/gourami_giant/gourami_giant.tres index b4f8f52..5cc9eee 100644 --- a/fish/species/gourami_giant/gourami_giant.tres +++ b/fish/species/gourami_giant/gourami_giant.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"gourami_giant" display_name = "giant gourami" -active = true +active = false catalog_number = 7505 collection_group = &"Tropical freshwater fish" logbook_fact = "giant gouramis breathe surface air through a specialized labyrinth organ. adults graze plants but also investigate insects and small animals." @@ -28,4 +27,3 @@ weight_max_lb = 20.0 sell_value_min = 13 sell_value_max = 31 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/grayling_arctic/grayling_arctic.tres b/fish/species/grayling_arctic/grayling_arctic.tres index ae6321a..ee7902a 100644 --- a/fish/species/grayling_arctic/grayling_arctic.tres +++ b/fish/species/grayling_arctic/grayling_arctic.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"grayling_arctic" display_name = "arctic grayling" -active = true +active = false catalog_number = 1102 collection_group = &"Cold freshwater salmonids" logbook_fact = "arctic grayling carry a tall, colorful dorsal fin like a sail. they feed on drifting insects in cold, clear rivers and lakes." @@ -29,4 +28,3 @@ weight_max_lb = 6.0 sell_value_min = 6 sell_value_max = 14 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/green_sunfish/green_sunfish.tres b/fish/species/green_sunfish/green_sunfish.tres index 1733035..37db5fc 100644 --- a/fish/species/green_sunfish/green_sunfish.tres +++ b/fish/species/green_sunfish/green_sunfish.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/3103.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"green_sunfish" display_name = "green sunfish" -active = true +active = false catalog_number = 3103 collection_group = &"Freshwater panfish" logbook_fact = "green sunfish tolerate small, warm, cloudy pools better than many relatives. a large mouth lets them tackle insects, crayfish, and fish." @@ -28,4 +27,3 @@ weight_max_lb = 1.5 sell_value_min = 2 sell_value_max = 5 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/grouper_atlantic_goliath/grouper_atlantic_goliath.tres b/fish/species/grouper_atlantic_goliath/grouper_atlantic_goliath.tres index eb2d2bf..7bb6179 100644 --- a/fish/species/grouper_atlantic_goliath/grouper_atlantic_goliath.tres +++ b/fish/species/grouper_atlantic_goliath/grouper_atlantic_goliath.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"grouper_atlantic_goliath" display_name = "Atlantic goliath grouper" -active = true +active = false catalog_number = 5801 collection_group = &"Reef predators" logbook_fact = "atlantic goliath groupers occupy reefs, wrecks, and mangrove roots. enormous mouths pull prey inward with a sudden pressure drop." @@ -28,4 +27,3 @@ weight_max_lb = 800.0 sell_value_min = 50 sell_value_max = 125 sell_value_curve = 0.78 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/grouper_giant/grouper_giant.tres b/fish/species/grouper_giant/grouper_giant.tres index 9051115..7ca4c07 100644 --- a/fish/species/grouper_giant/grouper_giant.tres +++ b/fish/species/grouper_giant/grouper_giant.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"grouper_giant" display_name = "giant grouper" -active = true +active = false catalog_number = 5803 collection_group = &"Reef predators" logbook_fact = "giant groupers become massive ambush predators around indo-pacific reefs. juveniles carry bold black-and-yellow markings." @@ -28,4 +27,3 @@ weight_max_lb = 880.0 sell_value_min = 52 sell_value_max = 128 sell_value_curve = 0.78 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/grouper_gulf/grouper_gulf.tres b/fish/species/grouper_gulf/grouper_gulf.tres index ec4b583..f8aaca6 100644 --- a/fish/species/grouper_gulf/grouper_gulf.tres +++ b/fish/species/grouper_gulf/grouper_gulf.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://ctu8xd5or7v3h" path="res://fish/species/grouper_gulf/fish_grouper_gulf.png" id="4_texture"] [sub_resource type="Resource" id="GrouperGulfAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/grouper_nassau/grouper_nassau.tres b/fish/species/grouper_nassau/grouper_nassau.tres index de4b0fd..fe6ad35 100644 --- a/fish/species/grouper_nassau/grouper_nassau.tres +++ b/fish/species/grouper_nassau/grouper_nassau.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"grouper_nassau" display_name = "Nassau grouper" -active = true +active = false catalog_number = 5806 collection_group = &"Reef predators" logbook_fact = "nassau groupers shift their bars and colors with mood and surroundings. adults gather at traditional reef sites to spawn." @@ -28,4 +27,3 @@ weight_max_lb = 55.0 sell_value_min = 25 sell_value_max = 62 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/grouper_red/grouper_red.tres b/fish/species/grouper_red/grouper_red.tres index d746cc2..55f8379 100644 --- a/fish/species/grouper_red/grouper_red.tres +++ b/fish/species/grouper_red/grouper_red.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://jjcc78tffxhb" path="res://fish/species/grouper_red/fish_grouper_red.png" id="4_texture"] [sub_resource type="Resource" id="GrouperRedAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/grunt_bluestriped/grunt_bluestriped.tres b/fish/species/grunt_bluestriped/grunt_bluestriped.tres index 5f247a8..91771a6 100644 --- a/fish/species/grunt_bluestriped/grunt_bluestriped.tres +++ b/fish/species/grunt_bluestriped/grunt_bluestriped.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/5902.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"grunt_bluestriped" display_name = "bluestriped grunt" -active = true +active = false catalog_number = 5902 collection_group = &"Reef schooling fish" logbook_fact = "bluestriped grunts shelter on reefs by day and spread over seagrass to feed at night. grinding throat teeth produce audible grunts." @@ -28,4 +27,3 @@ weight_max_lb = 3.0 sell_value_min = 3 sell_value_max = 7 sell_value_curve = 0.94 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/grunt_french/grunt_french.tres b/fish/species/grunt_french/grunt_french.tres index 8e8161e..20b1a62 100644 --- a/fish/species/grunt_french/grunt_french.tres +++ b/fish/species/grunt_french/grunt_french.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/5903.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"grunt_french" display_name = "French grunt" -active = true +active = false catalog_number = 5903 collection_group = &"Reef schooling fish" logbook_fact = "french grunts gather in yellow-striped schools around reefs and wrecks. they travel into nearby sand and grass beds after dark." @@ -28,4 +27,3 @@ weight_max_lb = 3.5 sell_value_min = 3 sell_value_max = 7 sell_value_curve = 0.94 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/gulper_eel/gulper_eel.tres b/fish/species/gulper_eel/gulper_eel.tres index 11245c9..d24bcb8 100644 --- a/fish/species/gulper_eel/gulper_eel.tres +++ b/fish/species/gulper_eel/gulper_eel.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"gulper_eel" display_name = "gulper eel" -active = true +active = false catalog_number = 1803 collection_group = &"Deep-sea oddities" logbook_fact = "gulper eels unfold enormous mouths to engulf prey in the deep sea. a whip-like tail ends in a small light-producing organ." @@ -29,4 +28,3 @@ weight_max_lb = 18.0 sell_value_min = 44 sell_value_max = 92 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/guppy/guppy.tres b/fish/species/guppy/guppy.tres index 9771dfb..fe4877c 100644 --- a/fish/species/guppy/guppy.tres +++ b/fish/species/guppy/guppy.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"guppy" display_name = "guppy" -active = true +active = false catalog_number = 2101 collection_group = &"Freshwater aquarium fish" logbook_fact = "guppies are livebearers whose young arrive ready to swim. males display bright colors while females often favor larger, less flashy bodies." @@ -28,4 +27,3 @@ weight_max_lb = 0.15 sell_value_min = 2 sell_value_max = 5 sell_value_curve = 0.98 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/haddock/haddock.tres b/fish/species/haddock/haddock.tres index ec5db7d..19c674b 100644 --- a/fish/species/haddock/haddock.tres +++ b/fish/species/haddock/haddock.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"haddock" display_name = "haddock" -active = true +active = false catalog_number = 1405 collection_group = &"Cold shelf fish" logbook_fact = "haddock are recognized by a dark shoulder mark and black lateral line. schools forage over cold seafloors for small bottom animals." @@ -28,4 +27,3 @@ weight_max_lb = 20.0 sell_value_min = 4 sell_value_max = 11 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/hake_pacific/hake_pacific.tres b/fish/species/hake_pacific/hake_pacific.tres index 2a7293b..24ddb93 100644 --- a/fish/species/hake_pacific/hake_pacific.tres +++ b/fish/species/hake_pacific/hake_pacific.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"hake_pacific" display_name = "pacific hake" -active = true +active = false catalog_number = 1407 collection_group = &"Cold shelf fish" logbook_fact = "pacific hake rise from deep water at night to feed on krill and fish. large schools migrate along the west coast with changing seasons." @@ -28,4 +27,3 @@ weight_max_lb = 8.0 sell_value_min = 3 sell_value_max = 9 sell_value_curve = 0.92 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/hake_silver/hake_silver.tres b/fish/species/hake_silver/hake_silver.tres index ffb42ff..cbce843 100644 --- a/fish/species/hake_silver/hake_silver.tres +++ b/fish/species/hake_silver/hake_silver.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"hake_silver" display_name = "silver hake" -active = true +active = false catalog_number = 1408 collection_group = &"Cold shelf fish" logbook_fact = "silver hake hunt fish and crustaceans over sandy atlantic shelves. they move upward after dark and return toward the bottom by day." @@ -28,4 +27,3 @@ weight_max_lb = 5.0 sell_value_min = 3 sell_value_max = 8 sell_value_curve = 0.92 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/halfbeak_ballyhoo/halfbeak_ballyhoo.tres b/fish/species/halfbeak_ballyhoo/halfbeak_ballyhoo.tres index 6d7fe32..88df91f 100644 --- a/fish/species/halfbeak_ballyhoo/halfbeak_ballyhoo.tres +++ b/fish/species/halfbeak_ballyhoo/halfbeak_ballyhoo.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/6601.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"halfbeak_ballyhoo" display_name = "ballyhoo" -active = true +active = false catalog_number = 6601 collection_group = &"Surface ocean fish" logbook_fact = "ballyhoo skim warm ocean surfaces with an extended lower jaw. tight schools scatter into quick leaps when predators strike." @@ -28,4 +27,3 @@ weight_max_lb = 1.0 sell_value_min = 2 sell_value_max = 5 sell_value_curve = 0.98 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/halibut_atlantic/halibut_atlantic.tres b/fish/species/halibut_atlantic/halibut_atlantic.tres index ead724a..332c9ef 100644 --- a/fish/species/halibut_atlantic/halibut_atlantic.tres +++ b/fish/species/halibut_atlantic/halibut_atlantic.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"halibut_atlantic" display_name = "atlantic halibut" -active = true +active = false catalog_number = 3701 collection_group = &"Large flatfish" logbook_fact = "atlantic halibut are immense right-eyed flatfish of cold northern seas. adults ambush fish and squid from deep rocky or sandy bottoms." @@ -27,4 +26,3 @@ weight_max_lb = 300.0 sell_value_min = 32 sell_value_max = 82 sell_value_curve = 0.8 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/halibut_pacific/halibut_pacific.tres b/fish/species/halibut_pacific/halibut_pacific.tres index 3856b5a..5bdb5cb 100644 --- a/fish/species/halibut_pacific/halibut_pacific.tres +++ b/fish/species/halibut_pacific/halibut_pacific.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"halibut_pacific" display_name = "pacific halibut" -active = true +active = false catalog_number = 3702 collection_group = &"Large flatfish" logbook_fact = "pacific halibut lie camouflaged on cold continental shelves. powerful flat bodies can travel long distances between feeding and spawning grounds." @@ -27,4 +26,3 @@ weight_max_lb = 350.0 sell_value_min = 34 sell_value_max = 86 sell_value_curve = 0.8 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/hellbender/hellbender.tres b/fish/species/hellbender/hellbender.tres index 2c55863..44c050a 100644 --- a/fish/species/hellbender/hellbender.tres +++ b/fish/species/hellbender/hellbender.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"hellbender" display_name = "hellbender" -active = true +active = false catalog_number = 2002 collection_group = &"Freshwater amphibians" logbook_fact = "hellbenders hide beneath large rocks in cool, clean rivers. folds of loose skin absorb oxygen while the flattened body grips the current." @@ -29,4 +28,3 @@ weight_max_lb = 5.5 sell_value_min = 24 sell_value_max = 54 sell_value_curve = 0.91 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/herring_atlantic/herring_atlantic.tres b/fish/species/herring_atlantic/herring_atlantic.tres index e193dcc..6cea5a6 100644 --- a/fish/species/herring_atlantic/herring_atlantic.tres +++ b/fish/species/herring_atlantic/herring_atlantic.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"herring_atlantic" display_name = "atlantic herring" -active = true +active = false catalog_number = 1301 collection_group = &"Cold schooling fish" logbook_fact = "atlantic herring gather in immense schools that move between feeding and spawning grounds. they filter plankton with fine gill rakers." @@ -27,4 +26,3 @@ weight_max_lb = 1.5 sell_value_min = 2 sell_value_max = 5 sell_value_curve = 0.98 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/herring_pacific/herring_pacific.tres b/fish/species/herring_pacific/herring_pacific.tres index 7d8e754..4b20d90 100644 --- a/fish/species/herring_pacific/herring_pacific.tres +++ b/fish/species/herring_pacific/herring_pacific.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"herring_pacific" display_name = "pacific herring" -active = true +active = false catalog_number = 1304 collection_group = &"Cold schooling fish" logbook_fact = "pacific herring return to coastal shallows to coat plants and rocks with eggs. their oily schools support entire marine food webs." @@ -28,4 +27,3 @@ weight_max_lb = 1.5 sell_value_min = 2 sell_value_max = 5 sell_value_curve = 0.98 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/hogfish/hogfish.tres b/fish/species/hogfish/hogfish.tres index 0e94a20..0bbd835 100644 --- a/fish/species/hogfish/hogfish.tres +++ b/fish/species/hogfish/hogfish.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/6103.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"hogfish" display_name = "hogfish" -active = true +active = false catalog_number = 6103 collection_group = &"Reef wrasses" logbook_fact = "hogfish root through sand with long pig-like snouts in search of shellfish. adults can change from female to male as social groups shift." @@ -28,4 +27,3 @@ weight_max_lb = 20.0 sell_value_min = 12 sell_value_max = 30 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/ide/ide.tres b/fish/species/ide/ide.tres index aea8907..63be3b3 100644 --- a/fish/species/ide/ide.tres +++ b/fish/species/ide/ide.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"ide" display_name = "ide" -active = true +active = false catalog_number = 2507 collection_group = &"Freshwater coarse fish" logbook_fact = "ide move between rivers, lakes, and brackish coastal water in loose schools. adults eat insects, crustaceans, plants, and small fish." @@ -28,4 +27,3 @@ weight_max_lb = 9.0 sell_value_min = 6 sell_value_max = 14 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/jack_crevalle/jack_crevalle.tres b/fish/species/jack_crevalle/jack_crevalle.tres index 4110dcc..e2e3dc8 100644 --- a/fish/species/jack_crevalle/jack_crevalle.tres +++ b/fish/species/jack_crevalle/jack_crevalle.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"jack_crevalle" display_name = "crevalle jack" -active = true +active = false catalog_number = 705 collection_group = &"Coastal pelagic fish" logbook_fact = "crevalle jacks patrol warm coasts in fast-moving schools. their deep bodies and forked tails deliver long, powerful runs." @@ -29,4 +28,3 @@ weight_max_lb = 35.0 sell_value_min = 7 sell_value_max = 20 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/jelly_crystal/jelly_crystal.tres b/fish/species/jelly_crystal/jelly_crystal.tres index f8746fa..9abd34d 100644 --- a/fish/species/jelly_crystal/jelly_crystal.tres +++ b/fish/species/jelly_crystal/jelly_crystal.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"jelly_crystal" display_name = "crystal jelly" -active = true +active = false catalog_number = 3501 collection_group = &"Jellies" logbook_fact = "crystal jellies are nearly transparent except for glowing points around the bell. their green fluorescent protein transformed biological research." @@ -29,4 +28,3 @@ weight_max_lb = 4.0 sell_value_min = 15 sell_value_max = 34 sell_value_curve = 0.93 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/jelly_lions_mane/jelly_lions_mane.tres b/fish/species/jelly_lions_mane/jelly_lions_mane.tres index c7c6fbb..4bfa8b3 100644 --- a/fish/species/jelly_lions_mane/jelly_lions_mane.tres +++ b/fish/species/jelly_lions_mane/jelly_lions_mane.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"jelly_lions_mane" display_name = "lion's mane jelly" -active = true +active = false catalog_number = 3502 collection_group = &"Jellies" logbook_fact = "lion's mane jellies trail dense curtains of tentacles through cold seas. the bell darkens from yellow to deep red as the animal grows." @@ -29,4 +28,3 @@ weight_max_lb = 200.0 sell_value_min = 24 sell_value_max = 58 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/jelly_moon/jelly_moon.tres b/fish/species/jelly_moon/jelly_moon.tres index 378c11d..2c72f03 100644 --- a/fish/species/jelly_moon/jelly_moon.tres +++ b/fish/species/jelly_moon/jelly_moon.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"jelly_moon" display_name = "moon jelly" -active = true +active = false catalog_number = 3503 collection_group = &"Jellies" logbook_fact = "moon jellies pulse gently with four horseshoe-shaped organs visible through the bell. short tentacles sweep plankton toward the mouth." @@ -28,4 +27,3 @@ weight_max_lb = 5.0 sell_value_min = 6 sell_value_max = 14 sell_value_curve = 0.94 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/jelly_pacific_sea_nettle/jelly_pacific_sea_nettle.tres b/fish/species/jelly_pacific_sea_nettle/jelly_pacific_sea_nettle.tres index b31f4b3..9e559ec 100644 --- a/fish/species/jelly_pacific_sea_nettle/jelly_pacific_sea_nettle.tres +++ b/fish/species/jelly_pacific_sea_nettle/jelly_pacific_sea_nettle.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"jelly_pacific_sea_nettle" display_name = "Pacific sea nettle" -active = true +active = false catalog_number = 3504 collection_group = &"Jellies" logbook_fact = "pacific sea nettles carry rust-colored stripes across pale bells. long tentacles and frilled mouth arms capture plankton and small fish." @@ -29,4 +28,3 @@ weight_max_lb = 12.0 sell_value_min = 14 sell_value_max = 32 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/jelly_sea_wasp/jelly_sea_wasp.tres b/fish/species/jelly_sea_wasp/jelly_sea_wasp.tres index 29bed0a..a68cb4a 100644 --- a/fish/species/jelly_sea_wasp/jelly_sea_wasp.tres +++ b/fish/species/jelly_sea_wasp/jelly_sea_wasp.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"jelly_sea_wasp" display_name = "sea wasp" -active = true +active = false catalog_number = 3505 collection_group = &"Jellies" logbook_fact = "sea wasps have box-shaped bells and clusters of eyes along the lower edge. their long tentacles deliver exceptionally potent venom." @@ -29,4 +28,3 @@ weight_max_lb = 6.0 sell_value_min = 42 sell_value_max = 90 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/knifefish_clown/knifefish_clown.tres b/fish/species/knifefish_clown/knifefish_clown.tres index c83b877..3ba5b63 100644 --- a/fish/species/knifefish_clown/knifefish_clown.tres +++ b/fish/species/knifefish_clown/knifefish_clown.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"knifefish_clown" display_name = "clown knifefish" -active = true +active = false catalog_number = 7501 collection_group = &"Tropical freshwater fish" logbook_fact = "clown knifefish undulate one long belly fin to glide forward or backward. dark eye-like spots line their silver nocturnal bodies." @@ -29,4 +28,3 @@ weight_max_lb = 25.0 sell_value_min = 16 sell_value_max = 38 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/koi/koi.tres b/fish/species/koi/koi.tres index 58c7c29..91b465c 100644 --- a/fish/species/koi/koi.tres +++ b/fish/species/koi/koi.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"koi" display_name = "koi" -active = true +active = false catalog_number = 3003 collection_group = &"Freshwater ornamental" logbook_fact = "koi are colorful domesticated forms of common carp selected over many generations. each fish carries a distinctive arrangement of patches and scales." @@ -29,4 +28,3 @@ weight_max_lb = 35.0 sell_value_min = 14 sell_value_max = 34 sell_value_curve = 0.87 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/krill_antarctic/krill_antarctic.tres b/fish/species/krill_antarctic/krill_antarctic.tres index 8cdf8e6..3651f23 100644 --- a/fish/species/krill_antarctic/krill_antarctic.tres +++ b/fish/species/krill_antarctic/krill_antarctic.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"krill_antarctic" display_name = "Antarctic krill" -active = true +active = false catalog_number = 3802 collection_group = &"Lobsters and shrimp" logbook_fact = "antarctic krill form enormous swarms beneath southern seas and ice. these small crustaceans feed whales, seals, penguins, and fish." @@ -28,4 +27,3 @@ weight_max_lb = 0.01 sell_value_min = 10 sell_value_max = 22 sell_value_curve = 0.99 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/ladyfish/ladyfish.tres b/fish/species/ladyfish/ladyfish.tres index 57c277c..57029f5 100644 --- a/fish/species/ladyfish/ladyfish.tres +++ b/fish/species/ladyfish/ladyfish.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/7403.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"ladyfish" display_name = "ladyfish" -active = true +active = false catalog_number = 7403 collection_group = &"Tropical flats fish" logbook_fact = "ladyfish race through warm shallows after schooling prey and often leap when pursued. a deeply forked tail powers their slender bodies." @@ -29,4 +28,3 @@ weight_max_lb = 8.0 sell_value_min = 4 sell_value_max = 10 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/lanternfish_spotted/lanternfish_spotted.tres b/fish/species/lanternfish_spotted/lanternfish_spotted.tres index 28446b7..c0725d1 100644 --- a/fish/species/lanternfish_spotted/lanternfish_spotted.tres +++ b/fish/species/lanternfish_spotted/lanternfish_spotted.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"lanternfish_spotted" display_name = "spotted lanternfish" -active = true +active = false catalog_number = 1806 collection_group = &"Deep-sea oddities" logbook_fact = "spotted lanternfish carry rows of light-producing organs along their bodies. immense schools rise toward the surface each night." @@ -28,4 +27,3 @@ weight_max_lb = 0.5 sell_value_min = 14 sell_value_max = 30 sell_value_curve = 0.95 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/largemouth_bass/largemouth_bass.tres b/fish/species/largemouth_bass/largemouth_bass.tres index aa89d04..04d157a 100644 --- a/fish/species/largemouth_bass/largemouth_bass.tres +++ b/fish/species/largemouth_bass/largemouth_bass.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"largemouth_bass" display_name = "largemouth bass" -active = true +active = false catalog_number = 2201 collection_group = &"Freshwater bass" logbook_fact = "largemouth bass wait among weeds and timber before lunging at prey. the upper jaw extends beyond the eye when the mouth is closed." @@ -27,4 +26,3 @@ weight_max_lb = 18.0 sell_value_min = 4 sell_value_max = 12 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/lingcod/lingcod.tres b/fish/species/lingcod/lingcod.tres index 807dc8b..92d4a81 100644 --- a/fish/species/lingcod/lingcod.tres +++ b/fish/species/lingcod/lingcod.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"lingcod" display_name = "lingcod" -active = true +active = false catalog_number = 7001 collection_group = &"Temperate reef predators" logbook_fact = "lingcod guard rocky dens and ambush fish with a huge tooth-lined mouth. despite the name, they are greenling relatives rather than cod." @@ -27,4 +26,3 @@ weight_max_lb = 60.0 sell_value_min = 14 sell_value_max = 38 sell_value_curve = 0.83 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/lionfish_red/lionfish_red.tres b/fish/species/lionfish_red/lionfish_red.tres index f3c3b3b..564e243 100644 --- a/fish/species/lionfish_red/lionfish_red.tres +++ b/fish/species/lionfish_red/lionfish_red.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"lionfish_red" display_name = "red lionfish" -active = true +active = false catalog_number = 5201 collection_group = &"Reef ambush fish" logbook_fact = "red lionfish spread ornate venomous spines when threatened. broad fins herd smaller fish into corners before a rapid gulp." @@ -28,4 +27,3 @@ weight_max_lb = 3.0 sell_value_min = 11 sell_value_max = 25 sell_value_curve = 0.92 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/loach_clown/loach_clown.tres b/fish/species/loach_clown/loach_clown.tres index f99a1be..ba24335 100644 --- a/fish/species/loach_clown/loach_clown.tres +++ b/fish/species/loach_clown/loach_clown.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"loach_clown" display_name = "clown loach" -active = true +active = false catalog_number = 7502 collection_group = &"Tropical freshwater fish" logbook_fact = "clown loaches rest in groups and make clicking sounds while feeding. orange bodies carry three broad black bands and small eye spines." @@ -29,4 +28,3 @@ weight_max_lb = 2.0 sell_value_min = 10 sell_value_max = 22 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/loach_weather/loach_weather.tres b/fish/species/loach_weather/loach_weather.tres index cc7afef..fa2ae34 100644 --- a/fish/species/loach_weather/loach_weather.tres +++ b/fish/species/loach_weather/loach_weather.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"loach_weather" display_name = "weather loach" -active = true +active = false catalog_number = 2905 collection_group = &"Freshwater oddities" logbook_fact = "weather loaches gulp air and pass it through the intestine when oxygen runs low. restless activity often increases as air pressure falls." @@ -28,4 +27,3 @@ weight_max_lb = 0.7 sell_value_min = 5 sell_value_max = 11 sell_value_curve = 0.95 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/lobster_american/lobster_american.tres b/fish/species/lobster_american/lobster_american.tres index b70b809..b89e992 100644 --- a/fish/species/lobster_american/lobster_american.tres +++ b/fish/species/lobster_american/lobster_american.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"lobster_american" display_name = "American lobster" -active = true +active = false catalog_number = 3801 collection_group = &"Lobsters and shrimp" logbook_fact = "american lobsters shelter in rocky crevices and emerge to forage along the bottom. one claw crushes while the other cuts and grips." @@ -29,4 +28,3 @@ weight_max_lb = 44.0 sell_value_min = 16 sell_value_max = 42 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/lobster_caribbean_spiny/lobster_caribbean_spiny.tres b/fish/species/lobster_caribbean_spiny/lobster_caribbean_spiny.tres index cdd828c..eb9fdde 100644 --- a/fish/species/lobster_caribbean_spiny/lobster_caribbean_spiny.tres +++ b/fish/species/lobster_caribbean_spiny/lobster_caribbean_spiny.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"lobster_caribbean_spiny" display_name = "Caribbean spiny lobster" -active = true +active = false catalog_number = 3803 collection_group = &"Lobsters and shrimp" logbook_fact = "caribbean spiny lobsters rely on long antennae and a thorny shell instead of large claws. groups march together across the seafloor." @@ -29,4 +28,3 @@ weight_max_lb = 26.0 sell_value_min = 15 sell_value_max = 38 sell_value_curve = 0.87 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/lungfish_west_african/lungfish_west_african.tres b/fish/species/lungfish_west_african/lungfish_west_african.tres index f049cff..6ae8db6 100644 --- a/fish/species/lungfish_west_african/lungfish_west_african.tres +++ b/fish/species/lungfish_west_african/lungfish_west_african.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/107.png" id="4_texture"] +[ext_resource type="Texture2D" path="res://fish/species/lungfish_west_african/lungfish_west_african.png" id="4_texture"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/mackerel_atlantic/mackerel_atlantic.tres b/fish/species/mackerel_atlantic/mackerel_atlantic.tres index ba6e0d8..f90a01b 100644 --- a/fish/species/mackerel_atlantic/mackerel_atlantic.tres +++ b/fish/species/mackerel_atlantic/mackerel_atlantic.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/701.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://breyc8fqq8lq3" path="res://fish/species/mackerel_atlantic/fish_mackerel_atlantic.png" id="4_texture"] [sub_resource type="Resource" id="MackerelAtlanticAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/mackerel_cero/mackerel_cero.tres b/fish/species/mackerel_cero/mackerel_cero.tres index 25cd4c5..598f01b 100644 --- a/fish/species/mackerel_cero/mackerel_cero.tres +++ b/fish/species/mackerel_cero/mackerel_cero.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://g8qanq47g1b8" path="res://fish/species/mackerel_cero/fish_mackerel_cero.png" id="4_texture"] [sub_resource type="Resource" id="MackerelCeroAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/mackerel_chub/mackerel_chub.tres b/fish/species/mackerel_chub/mackerel_chub.tres index 891abe4..7eeefb2 100644 --- a/fish/species/mackerel_chub/mackerel_chub.tres +++ b/fish/species/mackerel_chub/mackerel_chub.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/704.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://b7q2t02oo2bcp" path="res://fish/species/mackerel_chub/fish_mackerel_chub.png" id="4_texture"] [sub_resource type="Resource" id="MackerelChubAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/mackerel_king/mackerel_king.tres b/fish/species/mackerel_king/mackerel_king.tres index 9c00470..a167660 100644 --- a/fish/species/mackerel_king/mackerel_king.tres +++ b/fish/species/mackerel_king/mackerel_king.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://b2fag3xemyx5s" path="res://fish/species/mackerel_king/fish_mackerel_king.png" id="4_texture"] [sub_resource type="Resource" id="MackerelKingAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/mackerel_spanish/mackerel_spanish.tres b/fish/species/mackerel_spanish/mackerel_spanish.tres index 1f0bcf4..3dbc07c 100644 --- a/fish/species/mackerel_spanish/mackerel_spanish.tres +++ b/fish/species/mackerel_spanish/mackerel_spanish.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://cy2hmpenpkee2" path="res://fish/species/mackerel_spanish/fish_mackerel_spanish.png" id="4_texture"] [sub_resource type="Resource" id="MackerelSpanishAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/madtom_tadpole/madtom_tadpole.tres b/fish/species/madtom_tadpole/madtom_tadpole.tres index d0a5545..3c50b22 100644 --- a/fish/species/madtom_tadpole/madtom_tadpole.tres +++ b/fish/species/madtom_tadpole/madtom_tadpole.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"madtom_tadpole" display_name = "tadpole madtom" -active = true +active = false catalog_number = 2406 collection_group = &"Freshwater catfish" logbook_fact = "tadpole madtoms are tiny nocturnal catfish that shelter beneath vegetation and debris. venomous fin spines discourage larger predators." @@ -28,4 +27,3 @@ weight_max_lb = 0.15 sell_value_min = 8 sell_value_max = 16 sell_value_curve = 0.95 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/mahi_mahi/mahi_mahi.tres b/fish/species/mahi_mahi/mahi_mahi.tres index 691a52a..1d688a3 100644 --- a/fish/species/mahi_mahi/mahi_mahi.tres +++ b/fish/species/mahi_mahi/mahi_mahi.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/4701.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"mahi_mahi" display_name = "mahi-mahi" -active = true +active = false catalog_number = 4701 collection_group = &"Oceanic pelagic fish" logbook_fact = "mahi-mahi flash brilliant blue, green, and gold while chasing prey near the surface. they grow quickly and gather around floating objects." @@ -29,4 +28,3 @@ weight_max_lb = 50.0 sell_value_min = 15 sell_value_max = 38 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/mahseer_golden/mahseer_golden.tres b/fish/species/mahseer_golden/mahseer_golden.tres index 1459de1..dd2bd95 100644 --- a/fish/species/mahseer_golden/mahseer_golden.tres +++ b/fish/species/mahseer_golden/mahseer_golden.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"mahseer_golden" display_name = "golden mahseer" -active = true +active = false catalog_number = 7603 collection_group = &"Tropical freshwater predators" logbook_fact = "golden mahseer migrate through swift mountain rivers to reach spawning grounds. large scales shine bronze beneath reddish fins." @@ -29,4 +28,3 @@ weight_max_lb = 90.0 sell_value_min = 32 sell_value_max = 72 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/manatee_west_indian/manatee_west_indian.tres b/fish/species/manatee_west_indian/manatee_west_indian.tres index 7154157..8c47efe 100644 --- a/fish/species/manatee_west_indian/manatee_west_indian.tres +++ b/fish/species/manatee_west_indian/manatee_west_indian.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"manatee_west_indian" display_name = "West Indian manatee" -active = true +active = false catalog_number = 505 collection_group = &"Coastal marine mammals" logbook_fact = "west indian manatees graze aquatic plants in warm coastal water and rivers. they surface regularly to breathe through nostrils atop the snout." @@ -29,4 +28,3 @@ weight_max_lb = 1300.0 sell_value_min = 70 sell_value_max = 160 sell_value_curve = 0.77 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/manta_ray_giant/manta_ray_giant.tres b/fish/species/manta_ray_giant/manta_ray_giant.tres index 13eef47..ad96bd2 100644 --- a/fish/species/manta_ray_giant/manta_ray_giant.tres +++ b/fish/species/manta_ray_giant/manta_ray_giant.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"manta_ray_giant" display_name = "giant manta ray" -active = true +active = false catalog_number = 5102 collection_group = &"Rays and skates" logbook_fact = "giant manta rays funnel plankton into wide mouths with two flexible head fins. each belly carries a unique pattern of dark spots." @@ -29,4 +28,3 @@ weight_max_lb = 1000.0 sell_value_min = 65 sell_value_max = 150 sell_value_curve = 0.76 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/marlin_black/marlin_black.tres b/fish/species/marlin_black/marlin_black.tres index 26f506a..3c2f6f4 100644 --- a/fish/species/marlin_black/marlin_black.tres +++ b/fish/species/marlin_black/marlin_black.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://dkdctr2o52vrb" path="res://fish/species/marlin_black/fish_marlin_black.png" id="4_texture"] [sub_resource type="Resource" id="MarlinBlackAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/marlin_blue/marlin_blue.tres b/fish/species/marlin_blue/marlin_blue.tres index c8ee35d..92d76d7 100644 --- a/fish/species/marlin_blue/marlin_blue.tres +++ b/fish/species/marlin_blue/marlin_blue.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://de35fjoytbomu" path="res://fish/species/marlin_blue/fish_marlin_blue.png" id="4_texture"] [sub_resource type="Resource" id="MarlinBlueAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/marlin_white/marlin_white.tres b/fish/species/marlin_white/marlin_white.tres index a69d01d..1039aa7 100644 --- a/fish/species/marlin_white/marlin_white.tres +++ b/fish/species/marlin_white/marlin_white.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://bdvy4ujx2htcy" path="res://fish/species/marlin_white/fish_marlin_white.png" id="4_texture"] [sub_resource type="Resource" id="MarlinWhiteAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/menhaden_atlantic/menhaden_atlantic.tres b/fish/species/menhaden_atlantic/menhaden_atlantic.tres index 53b4d6e..e19f95b 100644 --- a/fish/species/menhaden_atlantic/menhaden_atlantic.tres +++ b/fish/species/menhaden_atlantic/menhaden_atlantic.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/802.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"menhaden_atlantic" display_name = "atlantic menhaden" -active = true +active = false catalog_number = 802 collection_group = &"Coastal schooling fish" logbook_fact = "atlantic menhaden strain plankton from coastal water with fine gill rakers. dense schools feed whales, seabirds, and predatory fish." @@ -28,4 +27,3 @@ weight_max_lb = 1.5 sell_value_min = 2 sell_value_max = 5 sell_value_curve = 0.98 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/milkfish/milkfish.tres b/fish/species/milkfish/milkfish.tres index 9c8362a..b7cbf82 100644 --- a/fish/species/milkfish/milkfish.tres +++ b/fish/species/milkfish/milkfish.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/7101.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"milkfish" display_name = "milkfish" -active = true +active = false catalog_number = 7101 collection_group = &"Tropical coastal fish" logbook_fact = "milkfish graze algae and tiny organisms in warm coastal shallows. deeply forked tails drive large schools through lagoons and estuaries." @@ -28,4 +27,3 @@ weight_max_lb = 25.0 sell_value_min = 4 sell_value_max = 12 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/minnow_fathead/minnow_fathead.tres b/fish/species/minnow_fathead/minnow_fathead.tres index c4a3aff..630b8c5 100644 --- a/fish/species/minnow_fathead/minnow_fathead.tres +++ b/fish/species/minnow_fathead/minnow_fathead.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/2804.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"minnow_fathead" display_name = "fathead minnow" -active = true +active = false catalog_number = 2804 collection_group = &"Freshwater minnows" logbook_fact = "fathead minnows tolerate warm, muddy ponds where many fish struggle. males guard eggs laid beneath rocks, logs, and other cover." @@ -28,4 +27,3 @@ weight_max_lb = 0.2 sell_value_min = 1 sell_value_max = 2 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/monkfish/monkfish.tres b/fish/species/monkfish/monkfish.tres index d485570..82319f8 100644 --- a/fish/species/monkfish/monkfish.tres +++ b/fish/species/monkfish/monkfish.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"monkfish" display_name = "monkfish" -active = true +active = false catalog_number = 603 collection_group = &"Coastal oddities" logbook_fact = "monkfish hide against the bottom and wave a fleshy lure above a cavernous mouth. a sudden gulp draws fish and crustaceans inward." @@ -29,4 +28,3 @@ weight_max_lb = 55.0 sell_value_min = 14 sell_value_max = 35 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/mooneye/mooneye.tres b/fish/species/mooneye/mooneye.tres index 3dff8a1..c04be25 100644 --- a/fish/species/mooneye/mooneye.tres +++ b/fish/species/mooneye/mooneye.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"mooneye" display_name = "mooneye" -active = true +active = false catalog_number = 2904 collection_group = &"Freshwater oddities" logbook_fact = "mooneyes flash silver in clear rivers and lakes while feeding near the surface. their large eyes suit evening hunts for insects and small fish." @@ -28,4 +27,3 @@ weight_max_lb = 4.0 sell_value_min = 5 sell_value_max = 11 sell_value_curve = 0.92 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/moray_green/moray_green.tres b/fish/species/moray_green/moray_green.tres index e0d49ae..48258b5 100644 --- a/fish/species/moray_green/moray_green.tres +++ b/fish/species/moray_green/moray_green.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"moray_green" display_name = "green moray" -active = true +active = false catalog_number = 5301 collection_group = &"Reef eels" logbook_fact = "green morays appear green because yellow mucus coats blue-gray skin. a second set of jaws pulls captured prey deeper into the throat." @@ -28,4 +27,3 @@ weight_max_lb = 30.0 sell_value_min = 13 sell_value_max = 32 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/mudskipper_atlantic/mudskipper_atlantic.tres b/fish/species/mudskipper_atlantic/mudskipper_atlantic.tres index 7df958a..477183a 100644 --- a/fish/species/mudskipper_atlantic/mudskipper_atlantic.tres +++ b/fish/species/mudskipper_atlantic/mudskipper_atlantic.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/201.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"mudskipper_atlantic" display_name = "atlantic mudskipper" -active = true +active = false catalog_number = 201 collection_group = &"Brackish oddities" logbook_fact = "atlantic mudskippers use sturdy fins to hop and crawl across exposed mud. moist skin and mouth linings let them breathe out of water." @@ -29,4 +28,3 @@ weight_max_lb = 0.5 sell_value_min = 5 sell_value_max = 11 sell_value_curve = 0.95 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/mullet_red/mullet_red.tres b/fish/species/mullet_red/mullet_red.tres index 67a35fa..ed17234 100644 --- a/fish/species/mullet_red/mullet_red.tres +++ b/fish/species/mullet_red/mullet_red.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"mullet_red" display_name = "red mullet" -active = true +active = false catalog_number = 301 collection_group = &"Coastal bottom fish" logbook_fact = "red mullet comb sandy bottoms with two chin barbels that taste hidden prey. their foraging leaves winding trails in the sediment." @@ -28,4 +27,3 @@ weight_max_lb = 3.0 sell_value_min = 5 sell_value_max = 11 sell_value_curve = 0.92 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/mullet_striped/mullet_striped.tres b/fish/species/mullet_striped/mullet_striped.tres index a285ee7..2affb1b 100644 --- a/fish/species/mullet_striped/mullet_striped.tres +++ b/fish/species/mullet_striped/mullet_striped.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/6804.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"mullet_striped" display_name = "striped mullet" -active = true +active = false catalog_number = 6804 collection_group = &"Temperate estuary" logbook_fact = "striped mullet leap clear of the water and travel in coastal schools. they graze algae and detritus with specialized digestive systems." @@ -28,4 +27,3 @@ weight_max_lb = 8.0 sell_value_min = 3 sell_value_max = 8 sell_value_curve = 0.92 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/muskellunge/muskellunge.tres b/fish/species/muskellunge/muskellunge.tres index e747d07..6bb8997 100644 --- a/fish/species/muskellunge/muskellunge.tres +++ b/fish/species/muskellunge/muskellunge.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"muskellunge" display_name = "muskellunge" -active = true +active = false catalog_number = 2704 collection_group = &"Freshwater giants" logbook_fact = "muskellunge wait motionless among weeds before exploding toward prey. pale bodies carry bars or spots that fade into broken underwater light." @@ -29,4 +28,3 @@ weight_max_lb = 60.0 sell_value_min = 32 sell_value_max = 72 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/nautilus_chambered/nautilus_chambered.tres b/fish/species/nautilus_chambered/nautilus_chambered.tres index 562f16b..b38815d 100644 --- a/fish/species/nautilus_chambered/nautilus_chambered.tres +++ b/fish/species/nautilus_chambered/nautilus_chambered.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"nautilus_chambered" display_name = "chambered nautilus" -active = true +active = false catalog_number = 1501 collection_group = &"Cuttlefish and nautiluses" logbook_fact = "chambered nautiluses regulate buoyancy with gas-filled shell chambers. dozens of small tentacles feel for food in dark reef slopes." @@ -29,4 +28,3 @@ weight_max_lb = 3.0 sell_value_min = 34 sell_value_max = 76 sell_value_curve = 0.92 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/needlefish_hound/needlefish_hound.tres b/fish/species/needlefish_hound/needlefish_hound.tres index 5d97670..4eda89e 100644 --- a/fish/species/needlefish_hound/needlefish_hound.tres +++ b/fish/species/needlefish_hound/needlefish_hound.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"needlefish_hound" display_name = "houndfish" -active = true +active = false catalog_number = 6602 collection_group = &"Surface ocean fish" logbook_fact = "houndfish hunt near the surface with long jaws filled with fine teeth. powerful leaps can carry their narrow bodies far above the water." @@ -28,4 +27,3 @@ weight_max_lb = 10.0 sell_value_min = 11 sell_value_max = 25 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/oarfish_giant/oarfish_giant.tres b/fish/species/oarfish_giant/oarfish_giant.tres index 2bcd4ab..3687f0f 100644 --- a/fish/species/oarfish_giant/oarfish_giant.tres +++ b/fish/species/oarfish_giant/oarfish_giant.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"oarfish_giant" display_name = "giant oarfish" -active = true +active = false catalog_number = 1701 collection_group = &"Deep-sea legends" logbook_fact = "giant oarfish drift vertically through deep open water, rowing with a crimson dorsal fin. their ribbon-like bodies can reach remarkable lengths." @@ -29,4 +28,3 @@ weight_max_lb = 600.0 sell_value_min = 60 sell_value_max = 140 sell_value_curve = 0.78 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/ocean_perch_pacific/ocean_perch_pacific.tres b/fish/species/ocean_perch_pacific/ocean_perch_pacific.tres index 6b0cdcc..e02db9a 100644 --- a/fish/species/ocean_perch_pacific/ocean_perch_pacific.tres +++ b/fish/species/ocean_perch_pacific/ocean_perch_pacific.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"ocean_perch_pacific" display_name = "Pacific ocean perch" -active = true +active = false catalog_number = 1603 collection_group = &"Deep shelf fish" logbook_fact = "pacific ocean perch hover around deep rocky reefs in the north pacific. these slow-growing fish give birth to live young." @@ -27,4 +26,3 @@ weight_max_lb = 12.0 sell_value_min = 7 sell_value_max = 17 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/octopus_common/octopus_common.tres b/fish/species/octopus_common/octopus_common.tres index e379010..66278ee 100644 --- a/fish/species/octopus_common/octopus_common.tres +++ b/fish/species/octopus_common/octopus_common.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"octopus_common" display_name = "common octopus" -active = true +active = false catalog_number = 4901 collection_group = &"Octopuses" logbook_fact = "common octopuses squeeze through narrow cracks and solve problems while hunting reefs. skin cells rapidly change color and texture." @@ -28,4 +27,3 @@ weight_max_lb = 22.0 sell_value_min = 7 sell_value_max = 18 sell_value_curve = 0.87 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/octopus_day/octopus_day.tres b/fish/species/octopus_day/octopus_day.tres index 4384f38..6251fe8 100644 --- a/fish/species/octopus_day/octopus_day.tres +++ b/fish/species/octopus_day/octopus_day.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"octopus_day" display_name = "day octopus" -active = true +active = false catalog_number = 4902 collection_group = &"Octopuses" logbook_fact = "day octopuses forage across tropical reefs while the sun is high. shifting bars and spots communicate alarm, camouflage, and threat." @@ -29,4 +28,3 @@ weight_max_lb = 15.0 sell_value_min = 15 sell_value_max = 36 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/octopus_giant_pacific/octopus_giant_pacific.tres b/fish/species/octopus_giant_pacific/octopus_giant_pacific.tres index 1091088..438eb60 100644 --- a/fish/species/octopus_giant_pacific/octopus_giant_pacific.tres +++ b/fish/species/octopus_giant_pacific/octopus_giant_pacific.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"octopus_giant_pacific" display_name = "giant Pacific octopus" -active = true +active = false catalog_number = 4903 collection_group = &"Octopuses" logbook_fact = "giant pacific octopuses explore cold rocky dens with thousands of arm suckers. females guard their eggs without feeding until they hatch." @@ -29,4 +28,3 @@ weight_max_lb = 200.0 sell_value_min = 28 sell_value_max = 70 sell_value_curve = 0.81 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/octopus_greater_blue_ringed/octopus_greater_blue_ringed.tres b/fish/species/octopus_greater_blue_ringed/octopus_greater_blue_ringed.tres index f2a21d9..9b538f2 100644 --- a/fish/species/octopus_greater_blue_ringed/octopus_greater_blue_ringed.tres +++ b/fish/species/octopus_greater_blue_ringed/octopus_greater_blue_ringed.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"octopus_greater_blue_ringed" display_name = "greater blue-ringed octopus" -active = true +active = false catalog_number = 4904 collection_group = &"Octopuses" logbook_fact = "greater blue-ringed octopuses reveal vivid rings when threatened. a tiny beak can deliver venom strong enough to stop breathing." @@ -29,4 +28,3 @@ weight_max_lb = 0.3 sell_value_min = 38 sell_value_max = 82 sell_value_curve = 0.96 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/opah/opah.tres b/fish/species/opah/opah.tres index f9b202a..a7d3fd1 100644 --- a/fish/species/opah/opah.tres +++ b/fish/species/opah/opah.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"opah" display_name = "opah" -active = true +active = false catalog_number = 4702 collection_group = &"Oceanic pelagic fish" logbook_fact = "opah circulate warm blood through much of the body, an unusual trait among fish. round silver flanks glow with red fins and pale spots." @@ -29,4 +28,3 @@ weight_max_lb = 600.0 sell_value_min = 36 sell_value_max = 88 sell_value_curve = 0.8 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/oscar/oscar.tres b/fish/species/oscar/oscar.tres index 8e780cb..bf44caa 100644 --- a/fish/species/oscar/oscar.tres +++ b/fish/species/oscar/oscar.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"oscar" display_name = "oscar" -active = true +active = false catalog_number = 7507 collection_group = &"Tropical freshwater fish" logbook_fact = "oscars are large south american cichlids that recognize routines and defend territories. a tail eyespot may redirect attacks away from the head." @@ -28,4 +27,3 @@ weight_max_lb = 4.0 sell_value_min = 6 sell_value_max = 14 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/oyster_black_lip_pearl/oyster_black_lip_pearl.tres b/fish/species/oyster_black_lip_pearl/oyster_black_lip_pearl.tres index 776218d..74a99d7 100644 --- a/fish/species/oyster_black_lip_pearl/oyster_black_lip_pearl.tres +++ b/fish/species/oyster_black_lip_pearl/oyster_black_lip_pearl.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"oyster_black_lip_pearl" display_name = "black-lip pearl oyster" -active = true +active = false catalog_number = 6401 collection_group = &"Shellfish" logbook_fact = "black-lip pearl oysters line their shells with dark-edged nacre. a trapped irritant can become coated in the same pearly material." @@ -28,4 +27,3 @@ weight_max_lb = 5.0 sell_value_min = 14 sell_value_max = 40 sell_value_curve = 0.91 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/paddlefish/paddlefish.tres b/fish/species/paddlefish/paddlefish.tres index 498730b..27d1696 100644 --- a/fish/species/paddlefish/paddlefish.tres +++ b/fish/species/paddlefish/paddlefish.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/104.png" id="4_texture"] +[ext_resource type="Texture2D" path="res://fish/species/paddlefish/paddlefish.png" id="4_texture"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/parrotfish_rainbow/parrotfish_rainbow.tres b/fish/species/parrotfish_rainbow/parrotfish_rainbow.tres index c0b0dc2..06df938 100644 --- a/fish/species/parrotfish_rainbow/parrotfish_rainbow.tres +++ b/fish/species/parrotfish_rainbow/parrotfish_rainbow.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"parrotfish_rainbow" display_name = "rainbow parrotfish" -active = true +active = false catalog_number = 5502 collection_group = &"Reef grazers" logbook_fact = "rainbow parrotfish scrape algae from reefs with fused beak-like teeth. crushed coral passes through them and returns to the reef as sand." @@ -28,4 +27,3 @@ weight_max_lb = 40.0 sell_value_min = 25 sell_value_max = 58 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/parrotfish_stoplight/parrotfish_stoplight.tres b/fish/species/parrotfish_stoplight/parrotfish_stoplight.tres index 50962f4..3cc5389 100644 --- a/fish/species/parrotfish_stoplight/parrotfish_stoplight.tres +++ b/fish/species/parrotfish_stoplight/parrotfish_stoplight.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"parrotfish_stoplight" display_name = "stoplight parrotfish" -active = true +active = false catalog_number = 5503 collection_group = &"Reef grazers" logbook_fact = "stoplight parrotfish change color dramatically as they mature. powerful dental plates bite algae from hard reef surfaces." @@ -28,4 +27,3 @@ weight_max_lb = 15.0 sell_value_min = 12 sell_value_max = 29 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/peacock_bass/peacock_bass.tres b/fish/species/peacock_bass/peacock_bass.tres index 7cfbb5d..eaae159 100644 --- a/fish/species/peacock_bass/peacock_bass.tres +++ b/fish/species/peacock_bass/peacock_bass.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"peacock_bass" display_name = "peacock bass" -active = true +active = false catalog_number = 7604 collection_group = &"Tropical freshwater predators" logbook_fact = "peacock bass are aggressive south american cichlids rather than true bass. adults guard nests and hunt fish in warm clear water." @@ -28,4 +27,3 @@ weight_max_lb = 25.0 sell_value_min = 15 sell_value_max = 36 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/permit/permit.tres b/fish/species/permit/permit.tres index f58283c..f9c0d95 100644 --- a/fish/species/permit/permit.tres +++ b/fish/species/permit/permit.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_rain = true script = ExtResource("1_fish_data") id = &"permit" display_name = "permit" -active = true +active = false catalog_number = 7404 collection_group = &"Tropical flats fish" logbook_fact = "permit browse tropical flats for crabs and shellfish with rubbery mouths. tall silver bodies carry long sickle-shaped dorsal and anal fins." @@ -29,4 +28,3 @@ weight_max_lb = 50.0 sell_value_min = 27 sell_value_max = 62 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/pickerel_chain/pickerel_chain.tres b/fish/species/pickerel_chain/pickerel_chain.tres index db02b7f..eec103a 100644 --- a/fish/species/pickerel_chain/pickerel_chain.tres +++ b/fish/species/pickerel_chain/pickerel_chain.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"pickerel_chain" display_name = "chain pickerel" -active = true +active = false catalog_number = 3301 collection_group = &"Freshwater predators" logbook_fact = "chain pickerel hover among vegetation before darting at fish and frogs. a chain-like pattern breaks up their green flanks." @@ -29,4 +28,3 @@ weight_max_lb = 9.0 sell_value_min = 6 sell_value_max = 15 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/pickerel_grass/pickerel_grass.tres b/fish/species/pickerel_grass/pickerel_grass.tres index 9ef8952..1a25625 100644 --- a/fish/species/pickerel_grass/pickerel_grass.tres +++ b/fish/species/pickerel_grass/pickerel_grass.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"pickerel_grass" display_name = "grass pickerel" -active = true +active = false catalog_number = 3302 collection_group = &"Freshwater predators" logbook_fact = "grass pickerel remain small enough to hunt in narrow, weedy creeks and marshes. dark bars camouflage their slim bodies among stems." @@ -28,4 +27,3 @@ weight_max_lb = 1.5 sell_value_min = 2 sell_value_max = 6 sell_value_curve = 0.95 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/pike_northern/pike_northern.tres b/fish/species/pike_northern/pike_northern.tres index 05f1ed7..b7594d1 100644 --- a/fish/species/pike_northern/pike_northern.tres +++ b/fish/species/pike_northern/pike_northern.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"pike_northern" display_name = "northern pike" -active = true +active = false catalog_number = 3303 collection_group = &"Freshwater predators" logbook_fact = "northern pike are solitary ambush hunters built for sudden acceleration. pale bean-shaped spots cover their long green bodies." @@ -28,4 +27,3 @@ weight_max_lb = 30.0 sell_value_min = 8 sell_value_max = 24 sell_value_curve = 0.85 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/pipefish_bay/pipefish_bay.tres b/fish/species/pipefish_bay/pipefish_bay.tres index 0436a8a..3bc3407 100644 --- a/fish/species/pipefish_bay/pipefish_bay.tres +++ b/fish/species/pipefish_bay/pipefish_bay.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"pipefish_bay" display_name = "bay pipefish" -active = true +active = false catalog_number = 601 collection_group = &"Coastal oddities" logbook_fact = "bay pipefish hide upright among seagrass, matching the blades with their slender bodies. males carry developing eggs in a brood pouch." @@ -28,4 +27,3 @@ weight_max_lb = 0.04 sell_value_min = 4 sell_value_max = 9 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/piranha_red_bellied/piranha_red_bellied.tres b/fish/species/piranha_red_bellied/piranha_red_bellied.tres index ebc9fab..ea52350 100644 --- a/fish/species/piranha_red_bellied/piranha_red_bellied.tres +++ b/fish/species/piranha_red_bellied/piranha_red_bellied.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"piranha_red_bellied" display_name = "red-bellied piranha" -active = true +active = false catalog_number = 7605 collection_group = &"Tropical freshwater predators" logbook_fact = "red-bellied piranhas communicate with barks and drum-like sounds. schools provide protection as they search for fish, insects, and carrion." @@ -28,4 +27,3 @@ weight_max_lb = 4.0 sell_value_min = 12 sell_value_max = 27 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/plaice_european/plaice_european.tres b/fish/species/plaice_european/plaice_european.tres index e66f162..17ea57f 100644 --- a/fish/species/plaice_european/plaice_european.tres +++ b/fish/species/plaice_european/plaice_european.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"plaice_european" display_name = "European plaice" -active = true +active = false catalog_number = 401 collection_group = &"Coastal flatfish" logbook_fact = "european plaice lie flat on the seafloor with both eyes on the same side. orange spots help distinguish them from neighboring flatfish." @@ -28,4 +27,3 @@ weight_max_lb = 10.0 sell_value_min = 4 sell_value_max = 10 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/pollock_alaska/pollock_alaska.tres b/fish/species/pollock_alaska/pollock_alaska.tres index e9add13..aebdcf4 100644 --- a/fish/species/pollock_alaska/pollock_alaska.tres +++ b/fish/species/pollock_alaska/pollock_alaska.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"pollock_alaska" display_name = "Alaska pollock" -active = true +active = false catalog_number = 1401 collection_group = &"Cold shelf fish" logbook_fact = "alaska pollock form vast schools over cold northern shelves. they feed on plankton and fish while supporting many larger predators." @@ -27,4 +26,3 @@ weight_max_lb = 8.0 sell_value_min = 3 sell_value_max = 8 sell_value_curve = 0.92 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/pollock_atlantic/pollock_atlantic.tres b/fish/species/pollock_atlantic/pollock_atlantic.tres index 494dd23..9e3c322 100644 --- a/fish/species/pollock_atlantic/pollock_atlantic.tres +++ b/fish/species/pollock_atlantic/pollock_atlantic.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"pollock_atlantic" display_name = "Atlantic pollock" -active = true +active = false catalog_number = 1403 collection_group = &"Cold shelf fish" logbook_fact = "atlantic pollock are swift relatives of cod with dark backs and pale lateral lines. adults gather around rocky banks and wrecks." @@ -29,4 +28,3 @@ weight_max_lb = 35.0 sell_value_min = 7 sell_value_max = 18 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/pomfret_black/pomfret_black.tres b/fish/species/pomfret_black/pomfret_black.tres index a3c9e54..517e5d5 100644 --- a/fish/species/pomfret_black/pomfret_black.tres +++ b/fish/species/pomfret_black/pomfret_black.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://ch3y6xdo22j1o" path="res://fish/species/pomfret_black/fish_pomfret_black.png" id="4_texture"] [sub_resource type="Resource" id="PomfretBlackAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/pomfret_chinese/pomfret_chinese.tres b/fish/species/pomfret_chinese/pomfret_chinese.tres index e3f236c..313c0bf 100644 --- a/fish/species/pomfret_chinese/pomfret_chinese.tres +++ b/fish/species/pomfret_chinese/pomfret_chinese.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://cijr0gseldncc" path="res://fish/species/pomfret_chinese/fish_pomfret_chinese.png" id="4_texture"] [sub_resource type="Resource" id="PomfretChineseAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/pomfret_golden/pomfret_golden.tres b/fish/species/pomfret_golden/pomfret_golden.tres index 162a2e7..bcd2469 100644 --- a/fish/species/pomfret_golden/pomfret_golden.tres +++ b/fish/species/pomfret_golden/pomfret_golden.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://7rjv7k60bv7q" path="res://fish/species/pomfret_golden/fish_pomfret_golden.png" id="4_texture"] [sub_resource type="Resource" id="PomfretGoldenAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/pomfret_white/pomfret_white.tres b/fish/species/pomfret_white/pomfret_white.tres index 8652e63..c4114db 100644 --- a/fish/species/pomfret_white/pomfret_white.tres +++ b/fish/species/pomfret_white/pomfret_white.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://c3fr0x4e1nfe0" path="res://fish/species/pomfret_white/fish_pomfret_white.png" id="4_texture"] [sub_resource type="Resource" id="PomfretWhiteAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/pompano_african/pompano_african.tres b/fish/species/pompano_african/pompano_african.tres index 598da61..d0f6559 100644 --- a/fish/species/pompano_african/pompano_african.tres +++ b/fish/species/pompano_african/pompano_african.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"pompano_african" display_name = "African pompano" -active = true +active = false catalog_number = 3601 collection_group = &"Large coastal predators" logbook_fact = "african pompano develop long streaming fin rays while young. adults become deep-bodied silver hunters around reefs and offshore structure." @@ -27,4 +26,3 @@ weight_max_lb = 50.0 sell_value_min = 14 sell_value_max = 35 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/pompano_florida/pompano_florida.tres b/fish/species/pompano_florida/pompano_florida.tres index b21035c..7ef5dd2 100644 --- a/fish/species/pompano_florida/pompano_florida.tres +++ b/fish/species/pompano_florida/pompano_florida.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"pompano_florida" display_name = "Florida pompano" -active = true +active = false catalog_number = 7402 collection_group = &"Tropical flats fish" logbook_fact = "florida pompano search warm surf for crabs, clams, and sand fleas. short blunt snouts lead into deep, silvery bodies." @@ -29,4 +28,3 @@ weight_max_lb = 9.0 sell_value_min = 7 sell_value_max = 16 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/porcupinefish_spotted/porcupinefish_spotted.tres b/fish/species/porcupinefish_spotted/porcupinefish_spotted.tres index 93d5dca..1e03d89 100644 --- a/fish/species/porcupinefish_spotted/porcupinefish_spotted.tres +++ b/fish/species/porcupinefish_spotted/porcupinefish_spotted.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"porcupinefish_spotted" display_name = "spotted porcupinefish" -active = true +active = false catalog_number = 5607 collection_group = &"Reef oddities" logbook_fact = "spotted porcupinefish inflate until long spines stand outward. fused teeth form a strong beak for crushing shelled prey." @@ -29,4 +28,3 @@ weight_max_lb = 7.0 sell_value_min = 24 sell_value_max = 54 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/porgy_scup/porgy_scup.tres b/fish/species/porgy_scup/porgy_scup.tres index ad96831..ebf9b50 100644 --- a/fish/species/porgy_scup/porgy_scup.tres +++ b/fish/species/porgy_scup/porgy_scup.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/6904.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"porgy_scup" display_name = "scup" -active = true +active = false catalog_number = 6904 collection_group = &"Temperate reef fish" logbook_fact = "scup use small strong teeth to crush shellfish and other bottom prey. deep silver bodies gather around piers, reefs, and eelgrass." @@ -28,4 +27,3 @@ weight_max_lb = 5.0 sell_value_min = 3 sell_value_max = 8 sell_value_curve = 0.92 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/pufferfish_guineafowl/pufferfish_guineafowl.tres b/fish/species/pufferfish_guineafowl/pufferfish_guineafowl.tres index 754cf4d..e75ee2d 100644 --- a/fish/species/pufferfish_guineafowl/pufferfish_guineafowl.tres +++ b/fish/species/pufferfish_guineafowl/pufferfish_guineafowl.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"pufferfish_guineafowl" display_name = "guineafowl puffer" -active = true +active = false catalog_number = 5603 collection_group = &"Reef oddities" logbook_fact = "guineafowl puffers swallow water to inflate when threatened. adults may shift from a spotted dark pattern to a vivid yellow form." @@ -28,4 +27,3 @@ weight_max_lb = 5.0 sell_value_min = 11 sell_value_max = 26 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/pumpkinseed/pumpkinseed.tres b/fish/species/pumpkinseed/pumpkinseed.tres index 7a4f090..d0ddcd3 100644 --- a/fish/species/pumpkinseed/pumpkinseed.tres +++ b/fish/species/pumpkinseed/pumpkinseed.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/3104.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"pumpkinseed" display_name = "pumpkinseed" -active = true +active = false catalog_number = 3104 collection_group = &"Freshwater panfish" logbook_fact = "pumpkinseeds use compact teeth to crush snails and other hard prey. blue facial lines and an orange gill spot brighten their round bodies." @@ -28,4 +27,3 @@ weight_max_lb = 1.3 sell_value_min = 2 sell_value_max = 5 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/queenfish_talang/queenfish_talang.tres b/fish/species/queenfish_talang/queenfish_talang.tres index d6ee3be..145d0de 100644 --- a/fish/species/queenfish_talang/queenfish_talang.tres +++ b/fish/species/queenfish_talang/queenfish_talang.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"queenfish_talang" display_name = "talang queenfish" -active = true +active = false catalog_number = 708 collection_group = &"Coastal pelagic fish" logbook_fact = "talang queenfish chase schooling prey near warm coasts and estuaries. hooked teeth and a deeply forked tail suit their rapid attacks." @@ -28,4 +27,3 @@ weight_max_lb = 20.0 sell_value_min = 7 sell_value_max = 18 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/quillback/quillback.tres b/fish/species/quillback/quillback.tres index 2ca6399..6f59e17 100644 --- a/fish/species/quillback/quillback.tres +++ b/fish/species/quillback/quillback.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"quillback" display_name = "quillback" -active = true +active = false catalog_number = 2303 collection_group = &"Freshwater bottom fish" logbook_fact = "quillbacks carry a long first dorsal ray that rises like a quill. small mouths gather insect larvae and other food from river and lake bottoms." @@ -28,4 +27,3 @@ weight_max_lb = 15.0 sell_value_min = 6 sell_value_max = 16 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/red_drum/red_drum.tres b/fish/species/red_drum/red_drum.tres index 393a002..7cbaecc 100644 --- a/fish/species/red_drum/red_drum.tres +++ b/fish/species/red_drum/red_drum.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"red_drum" display_name = "red drum" -active = true +active = false catalog_number = 6803 collection_group = &"Temperate estuary" logbook_fact = "red drum use powerful tails to patrol surf and estuaries. one or more black spots near the tail may confuse predators about which end is the head." @@ -28,4 +27,3 @@ weight_max_lb = 45.0 sell_value_min = 8 sell_value_max = 23 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/redear_sunfish/redear_sunfish.tres b/fish/species/redear_sunfish/redear_sunfish.tres index 6078d20..44a3729 100644 --- a/fish/species/redear_sunfish/redear_sunfish.tres +++ b/fish/species/redear_sunfish/redear_sunfish.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"redear_sunfish" display_name = "redear sunfish" -active = true +active = false catalog_number = 3105 collection_group = &"Freshwater panfish" logbook_fact = "redear sunfish specialize in snails, crushing shells with strong throat teeth. a red or orange margin marks the dark flap behind the gill." @@ -28,4 +27,3 @@ weight_max_lb = 3.0 sell_value_min = 4 sell_value_max = 9 sell_value_curve = 0.95 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/redhorse_golden/redhorse_golden.tres b/fish/species/redhorse_golden/redhorse_golden.tres index 5ba103b..44ae38f 100644 --- a/fish/species/redhorse_golden/redhorse_golden.tres +++ b/fish/species/redhorse_golden/redhorse_golden.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"redhorse_golden" display_name = "golden redhorse" -active = true +active = false catalog_number = 2302 collection_group = &"Freshwater bottom fish" logbook_fact = "golden redhorses probe flowing river bottoms with fleshy, downward-facing mouths. coppery scales and reddish fins give them a warm glow." @@ -28,4 +27,3 @@ weight_max_lb = 8.0 sell_value_min = 6 sell_value_max = 14 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/roach_common/roach_common.tres b/fish/species/roach_common/roach_common.tres index c12d380..ce38873 100644 --- a/fish/species/roach_common/roach_common.tres +++ b/fish/species/roach_common/roach_common.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/2504.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"roach_common" display_name = "common roach" -active = true +active = false catalog_number = 2504 collection_group = &"Freshwater coarse fish" logbook_fact = "common roach thrive in many lakes and rivers, often schooling near vegetation. red fins and a red-orange eye brighten their silver bodies." @@ -27,4 +26,3 @@ weight_max_lb = 4.0 sell_value_min = 2 sell_value_max = 6 sell_value_curve = 0.95 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/rockfish_black/rockfish_black.tres b/fish/species/rockfish_black/rockfish_black.tres index c37b427..21cd186 100644 --- a/fish/species/rockfish_black/rockfish_black.tres +++ b/fish/species/rockfish_black/rockfish_black.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/6901.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"rockfish_black" display_name = "black rockfish" -active = true +active = false catalog_number = 6901 collection_group = &"Temperate reef fish" logbook_fact = "black rockfish gather above reefs and kelp along the north pacific coast. like other rockfish, they give birth to live young." @@ -27,4 +26,3 @@ weight_max_lb = 10.0 sell_value_min = 4 sell_value_max = 11 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/rockfish_canary/rockfish_canary.tres b/fish/species/rockfish_canary/rockfish_canary.tres index 1e65d72..e20e655 100644 --- a/fish/species/rockfish_canary/rockfish_canary.tres +++ b/fish/species/rockfish_canary/rockfish_canary.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"rockfish_canary" display_name = "canary rockfish" -active = true +active = false catalog_number = 6903 collection_group = &"Temperate reef fish" logbook_fact = "canary rockfish glow orange-yellow over deep pacific reefs. these long-lived fish mature slowly and give birth to live young." @@ -28,4 +27,3 @@ weight_max_lb = 12.0 sell_value_min = 7 sell_value_max = 17 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/rockfish_yelloweye/rockfish_yelloweye.tres b/fish/species/rockfish_yelloweye/rockfish_yelloweye.tres index 89aab8e..79e8d75 100644 --- a/fish/species/rockfish_yelloweye/rockfish_yelloweye.tres +++ b/fish/species/rockfish_yelloweye/rockfish_yelloweye.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"rockfish_yelloweye" display_name = "yelloweye rockfish" -active = true +active = false catalog_number = 6907 collection_group = &"Temperate reef fish" logbook_fact = "yelloweye rockfish can live for more than a century on deep pacific reefs. bright golden eyes stand out against orange-red bodies." @@ -28,4 +27,3 @@ weight_max_lb = 35.0 sell_value_min = 28 sell_value_max = 64 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/roosterfish/roosterfish.tres b/fish/species/roosterfish/roosterfish.tres index 388dd70..19c009c 100644 --- a/fish/species/roosterfish/roosterfish.tres +++ b/fish/species/roosterfish/roosterfish.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"roosterfish" display_name = "roosterfish" -active = true +active = false catalog_number = 7201 collection_group = &"Tropical coastal predators" logbook_fact = "roosterfish raise seven long dorsal spines while chasing prey through tropical surf. dark bands cross their sleek silver bodies." @@ -28,4 +27,3 @@ weight_max_lb = 100.0 sell_value_min = 30 sell_value_max = 70 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/rudd/rudd.tres b/fish/species/rudd/rudd.tres index 5de8d57..6ef01aa 100644 --- a/fish/species/rudd/rudd.tres +++ b/fish/species/rudd/rudd.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/2508.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"rudd" display_name = "rudd" -active = true +active = false catalog_number = 2508 collection_group = &"Freshwater coarse fish" logbook_fact = "rudd feed near the surface with an upturned mouth and red fins. golden-green bodies disappear easily among warm, weedy shallows." @@ -28,4 +27,3 @@ weight_max_lb = 4.5 sell_value_min = 3 sell_value_max = 7 sell_value_curve = 0.95 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sablefish/sablefish.tres b/fish/species/sablefish/sablefish.tres index e481e52..28daaf3 100644 --- a/fish/species/sablefish/sablefish.tres +++ b/fish/species/sablefish/sablefish.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"sablefish" display_name = "sablefish" -active = true +active = false catalog_number = 1605 collection_group = &"Deep shelf fish" logbook_fact = "sablefish roam deep north pacific slopes and can live for many decades. soft dark bodies conceal rich, oil-filled flesh." @@ -28,4 +27,3 @@ weight_max_lb = 40.0 sell_value_min = 15 sell_value_max = 36 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sailfish/sailfish.tres b/fish/species/sailfish/sailfish.tres index 98e958d..7826b0b 100644 --- a/fish/species/sailfish/sailfish.tres +++ b/fish/species/sailfish/sailfish.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://8rlcnfqx8or0" path="res://fish/species/sailfish/fish_sailfish.png" id="4_texture"] [sub_resource type="Resource" id="SailfishAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/salmon_atlantic/salmon_atlantic.tres b/fish/species/salmon_atlantic/salmon_atlantic.tres index 1c77325..802c177 100644 --- a/fish/species/salmon_atlantic/salmon_atlantic.tres +++ b/fish/species/salmon_atlantic/salmon_atlantic.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/bass_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/4401.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://ddbclfu5wtd5r" path="res://fish/species/salmon_atlantic/fish_salmon_atlantic.png" id="4_texture"] [sub_resource type="Resource" id="AtlanticSalmonAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/salmon_chum/salmon_chum.tres b/fish/species/salmon_chum/salmon_chum.tres index 8fcabd0..a41a410 100644 --- a/fish/species/salmon_chum/salmon_chum.tres +++ b/fish/species/salmon_chum/salmon_chum.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/bass_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://dqjkmd6l1a2i4" path="res://fish/species/salmon_chum/fish_salmon_chum.png" id="4_texture"] [sub_resource type="Resource" id="ChumSalmonAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/salmon_coho/salmon_coho.tres b/fish/species/salmon_coho/salmon_coho.tres index b1160b1..89d1ea5 100644 --- a/fish/species/salmon_coho/salmon_coho.tres +++ b/fish/species/salmon_coho/salmon_coho.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/bass_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://c4c4e43lbr88c" path="res://fish/species/salmon_coho/fish_salmon_coho.png" id="4_texture"] [sub_resource type="Resource" id="CohoSalmonAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/salmon_pink/salmon_pink.tres b/fish/species/salmon_pink/salmon_pink.tres index bdfa32e..94e2f32 100644 --- a/fish/species/salmon_pink/salmon_pink.tres +++ b/fish/species/salmon_pink/salmon_pink.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/bass_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://bk27bsdrtlqap" path="res://fish/species/salmon_pink/fish_salmon_pink.png" id="4_texture"] [sub_resource type="Resource" id="PinkSalmonAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/salmon_sockeye/salmon_sockeye.tres b/fish/species/salmon_sockeye/salmon_sockeye.tres index 7bd4b1a..dd440e1 100644 --- a/fish/species/salmon_sockeye/salmon_sockeye.tres +++ b/fish/species/salmon_sockeye/salmon_sockeye.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/bass_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://cmokm3sra4ai8" path="res://fish/species/salmon_sockeye/fish_salmon_sockeye.png" id="4_texture"] [sub_resource type="Resource" id="SockeyeSalmonAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/sand_dollar/sand_dollar.tres b/fish/species/sand_dollar/sand_dollar.tres index f780203..3d1b523 100644 --- a/fish/species/sand_dollar/sand_dollar.tres +++ b/fish/species/sand_dollar/sand_dollar.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"sand_dollar" display_name = "sand dollar" -active = true +active = false catalog_number = 1904 collection_group = &"Echinoderms" logbook_fact = "sand dollars burrow just beneath sandy seafloors and filter tiny food particles. the familiar star pattern marks their five-part body plan." @@ -29,4 +28,3 @@ weight_max_lb = 0.2 sell_value_min = 4 sell_value_max = 10 sell_value_curve = 0.98 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sand_lance_american/sand_lance_american.tres b/fish/species/sand_lance_american/sand_lance_american.tres index 18f16be..7080235 100644 --- a/fish/species/sand_lance_american/sand_lance_american.tres +++ b/fish/species/sand_lance_american/sand_lance_american.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/801.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"sand_lance_american" display_name = "American sand lance" -active = true +active = false catalog_number = 801 collection_group = &"Coastal schooling fish" logbook_fact = "american sand lance dive headfirst into loose sand when danger approaches. immense schools carry energy from plankton to larger predators." @@ -28,4 +27,3 @@ weight_max_lb = 0.4 sell_value_min = 1 sell_value_max = 3 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sardine_european/sardine_european.tres b/fish/species/sardine_european/sardine_european.tres index 54008f8..87a64c2 100644 --- a/fish/species/sardine_european/sardine_european.tres +++ b/fish/species/sardine_european/sardine_european.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/806.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"sardine_european" display_name = "European pilchard" -active = true +active = false catalog_number = 806 collection_group = &"Coastal schooling fish" logbook_fact = "european pilchards form shimmering schools along atlantic and mediterranean coasts. they feed mainly on plankton near the surface." @@ -27,4 +26,3 @@ weight_max_lb = 0.6 sell_value_min = 2 sell_value_max = 4 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sardine_pacific/sardine_pacific.tres b/fish/species/sardine_pacific/sardine_pacific.tres index bea772d..41c98a0 100644 --- a/fish/species/sardine_pacific/sardine_pacific.tres +++ b/fish/species/sardine_pacific/sardine_pacific.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"sardine_pacific" display_name = "Pacific sardine" -active = true +active = false catalog_number = 809 collection_group = &"Coastal schooling fish" logbook_fact = "pacific sardines follow cool, productive water in enormous schools. their movements shift as currents and plankton supplies change." @@ -27,4 +26,3 @@ weight_max_lb = 0.5 sell_value_min = 2 sell_value_max = 4 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sauger/sauger.tres b/fish/species/sauger/sauger.tres index 3248bcb..3ed1fc2 100644 --- a/fish/species/sauger/sauger.tres +++ b/fish/species/sauger/sauger.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://8k7qkk4juciy" path="res://fish/species/sauger/fish_sauger.png" id="4_texture"] [sub_resource type="Resource" id="SaugerAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/saugeye/saugeye.tres b/fish/species/saugeye/saugeye.tres index d6f09cf..63ea616 100644 --- a/fish/species/saugeye/saugeye.tres +++ b/fish/species/saugeye/saugeye.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://lom25y0eqcw3" path="res://fish/species/saugeye/fish_saugeye.png" id="4_texture"] [sub_resource type="Resource" id="SaugeyeAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/sawfish_largetooth/sawfish_largetooth.tres b/fish/species/sawfish_largetooth/sawfish_largetooth.tres index ac4680b..ce5602d 100644 --- a/fish/species/sawfish_largetooth/sawfish_largetooth.tres +++ b/fish/species/sawfish_largetooth/sawfish_largetooth.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"sawfish_largetooth" display_name = "largetooth sawfish" -active = true +active = false catalog_number = 5103 collection_group = &"Rays and skates" logbook_fact = "largetooth sawfish detect hidden prey with a long sensory rostrum. a swift sideways sweep stuns fish and exposes animals buried in mud." @@ -29,4 +28,3 @@ weight_max_lb = 1300.0 sell_value_min = 58 sell_value_max = 135 sell_value_curve = 0.78 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/scorpionfish_red/scorpionfish_red.tres b/fish/species/scorpionfish_red/scorpionfish_red.tres index baf9046..4848d54 100644 --- a/fish/species/scorpionfish_red/scorpionfish_red.tres +++ b/fish/species/scorpionfish_red/scorpionfish_red.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"scorpionfish_red" display_name = "red scorpionfish" -active = true +active = false catalog_number = 5202 collection_group = &"Reef ambush fish" logbook_fact = "red scorpionfish vanish against rocky reefs through mottled color and skin flaps. venomous dorsal spines punish careless predators." @@ -28,4 +27,3 @@ weight_max_lb = 7.0 sell_value_min = 11 sell_value_max = 25 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sea_bass_black/sea_bass_black.tres b/fish/species/sea_bass_black/sea_bass_black.tres index 7a5b567..54581d8 100644 --- a/fish/species/sea_bass_black/sea_bass_black.tres +++ b/fish/species/sea_bass_black/sea_bass_black.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/6902.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"sea_bass_black" display_name = "black sea bass" -active = true +active = false catalog_number = 6902 collection_group = &"Temperate reef fish" logbook_fact = "black sea bass shelter around reefs, piers, and wrecks. many begin life as female and later become male." @@ -28,4 +27,3 @@ weight_max_lb = 8.0 sell_value_min = 4 sell_value_max = 10 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sea_bass_chilean/sea_bass_chilean.tres b/fish/species/sea_bass_chilean/sea_bass_chilean.tres index dd9afac..15cf997 100644 --- a/fish/species/sea_bass_chilean/sea_bass_chilean.tres +++ b/fish/species/sea_bass_chilean/sea_bass_chilean.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"sea_bass_chilean" display_name = "Patagonian toothfish" -active = true +active = false catalog_number = 1604 collection_group = &"Deep shelf fish" logbook_fact = "patagonian toothfish patrol cold, deep southern water with large canine teeth. natural antifreeze proteins protect their blood from freezing." @@ -28,4 +27,3 @@ weight_max_lb = 220.0 sell_value_min = 32 sell_value_max = 78 sell_value_curve = 0.8 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sea_cucumber_giant_california/sea_cucumber_giant_california.tres b/fish/species/sea_cucumber_giant_california/sea_cucumber_giant_california.tres index bc1ca41..7118382 100644 --- a/fish/species/sea_cucumber_giant_california/sea_cucumber_giant_california.tres +++ b/fish/species/sea_cucumber_giant_california/sea_cucumber_giant_california.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"sea_cucumber_giant_california" display_name = "giant California sea cucumber" -active = true +active = false catalog_number = 1902 collection_group = &"Echinoderms" logbook_fact = "giant california sea cucumbers sweep organic particles from the seafloor with branching tentacles. soft tube feet anchor their long bodies." @@ -29,4 +28,3 @@ weight_max_lb = 5.0 sell_value_min = 13 sell_value_max = 29 sell_value_curve = 0.93 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sea_otter/sea_otter.tres b/fish/species/sea_otter/sea_otter.tres index c5f4bfc..7cf9ebe 100644 --- a/fish/species/sea_otter/sea_otter.tres +++ b/fish/species/sea_otter/sea_otter.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"sea_otter" display_name = "sea otter" -active = true +active = false catalog_number = 503 collection_group = &"Coastal marine mammals" logbook_fact = "sea otters float on their backs while opening shellfish with stones. dense fur traps insulating air because they lack a thick blubber layer." @@ -28,4 +27,3 @@ weight_max_lb = 100.0 sell_value_min = 55 sell_value_max = 125 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sea_star_crown_of_thorns/sea_star_crown_of_thorns.tres b/fish/species/sea_star_crown_of_thorns/sea_star_crown_of_thorns.tres index 5e73beb..37ecb8d 100644 --- a/fish/species/sea_star_crown_of_thorns/sea_star_crown_of_thorns.tres +++ b/fish/species/sea_star_crown_of_thorns/sea_star_crown_of_thorns.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"sea_star_crown_of_thorns" display_name = "crown-of-thorns sea star" -active = true +active = false catalog_number = 1901 collection_group = &"Echinoderms" logbook_fact = "crown-of-thorns sea stars crawl over reefs and digest coral tissue outside the body. venomous spines discourage many predators." @@ -29,4 +28,3 @@ weight_max_lb = 7.0 sell_value_min = 23 sell_value_max = 52 sell_value_curve = 0.91 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sea_star_sunflower/sea_star_sunflower.tres b/fish/species/sea_star_sunflower/sea_star_sunflower.tres index 6bf1dc2..c1f60eb 100644 --- a/fish/species/sea_star_sunflower/sea_star_sunflower.tres +++ b/fish/species/sea_star_sunflower/sea_star_sunflower.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"sea_star_sunflower" display_name = "sunflower sea star" -active = true +active = false catalog_number = 1905 collection_group = &"Echinoderms" logbook_fact = "sunflower sea stars move quickly on thousands of tube feet and may carry many arms. they hunt urchins, clams, and other bottom animals." @@ -29,4 +28,3 @@ weight_max_lb = 13.0 sell_value_min = 14 sell_value_max = 32 sell_value_curve = 0.89 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/seadragon_leafy/seadragon_leafy.tres b/fish/species/seadragon_leafy/seadragon_leafy.tres index 1481d73..0033d9c 100644 --- a/fish/species/seadragon_leafy/seadragon_leafy.tres +++ b/fish/species/seadragon_leafy/seadragon_leafy.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"seadragon_leafy" display_name = "leafy seadragon" -active = true +active = false catalog_number = 6301 collection_group = &"Seahorses and seadragons" logbook_fact = "leafy seadragons drift among seaweed with elaborate skin lobes that resemble leaves. males carry eggs beneath the tail." @@ -29,4 +28,3 @@ weight_max_lb = 0.5 sell_value_min = 24 sell_value_max = 55 sell_value_curve = 0.94 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/seadragon_weedy/seadragon_weedy.tres b/fish/species/seadragon_weedy/seadragon_weedy.tres index bc1768b..1b99790 100644 --- a/fish/species/seadragon_weedy/seadragon_weedy.tres +++ b/fish/species/seadragon_weedy/seadragon_weedy.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"seadragon_weedy" display_name = "weedy seadragon" -active = true +active = false catalog_number = 6302 collection_group = &"Seahorses and seadragons" logbook_fact = "weedy seadragons rely on slender bodies and small leaf-like lobes for camouflage. males brood rows of eggs on the underside of the tail." @@ -29,4 +28,3 @@ weight_max_lb = 0.6 sell_value_min = 16 sell_value_max = 38 sell_value_curve = 0.93 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/seahorse_lined/seahorse_lined.tres b/fish/species/seahorse_lined/seahorse_lined.tres index 0121fab..1f533a0 100644 --- a/fish/species/seahorse_lined/seahorse_lined.tres +++ b/fish/species/seahorse_lined/seahorse_lined.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_rain = true script = ExtResource("1_fish_data") id = &"seahorse_lined" display_name = "lined seahorse" -active = true +active = false catalog_number = 602 collection_group = &"Coastal oddities" logbook_fact = "lined seahorses anchor to grass and coral with curling tails. the male broods eggs in a pouch and releases fully formed young." @@ -29,4 +28,3 @@ weight_max_lb = 0.05 sell_value_min = 9 sell_value_max = 20 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/seal_harbor/seal_harbor.tres b/fish/species/seal_harbor/seal_harbor.tres index 5689a14..bdc0e46 100644 --- a/fish/species/seal_harbor/seal_harbor.tres +++ b/fish/species/seal_harbor/seal_harbor.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"seal_harbor" display_name = "harbor seal" -active = true +active = false catalog_number = 502 collection_group = &"Coastal marine mammals" logbook_fact = "harbor seals rest on rocky shores and sandbars between hunting trips. sensitive whiskers can trace the water trails left by moving fish." @@ -29,4 +28,3 @@ weight_max_lb = 370.0 sell_value_min = 60 sell_value_max = 140 sell_value_curve = 0.79 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/shark_blacktip/shark_blacktip.tres b/fish/species/shark_blacktip/shark_blacktip.tres index e7fc4e6..b5d4ca9 100644 --- a/fish/species/shark_blacktip/shark_blacktip.tres +++ b/fish/species/shark_blacktip/shark_blacktip.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"shark_blacktip" display_name = "blacktip shark" -active = true +active = false catalog_number = 901 collection_group = &"Coastal sharks" logbook_fact = "blacktip sharks are named for the dark markings on their fins. they hunt schooling fish in warm shallows and sometimes leap clear of the water." @@ -29,4 +28,3 @@ weight_max_lb = 150.0 sell_value_min = 32 sell_value_max = 75 sell_value_curve = 0.8 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/shark_great_hammerhead/shark_great_hammerhead.tres b/fish/species/shark_great_hammerhead/shark_great_hammerhead.tres index a9b612e..a2edcf0 100644 --- a/fish/species/shark_great_hammerhead/shark_great_hammerhead.tres +++ b/fish/species/shark_great_hammerhead/shark_great_hammerhead.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"shark_great_hammerhead" display_name = "great hammerhead shark" -active = true +active = false catalog_number = 902 collection_group = &"Coastal sharks" logbook_fact = "great hammerheads sweep their wide heads over the bottom while searching for rays. widely spaced senses help pinpoint hidden prey." @@ -29,4 +28,3 @@ weight_max_lb = 1000.0 sell_value_min = 62 sell_value_max = 145 sell_value_curve = 0.78 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/shark_great_white/shark_great_white.tres b/fish/species/shark_great_white/shark_great_white.tres index afd1cd0..80688cd 100644 --- a/fish/species/shark_great_white/shark_great_white.tres +++ b/fish/species/shark_great_white/shark_great_white.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"shark_great_white" display_name = "great white shark" -active = true +active = false catalog_number = 903 collection_group = &"Coastal sharks" logbook_fact = "great white sharks conserve heat in their swimming muscles while crossing cool seas. rows of serrated teeth are replaced throughout life." @@ -28,4 +27,3 @@ weight_max_lb = 1000.0 sell_value_min = 70 sell_value_max = 150 sell_value_curve = 0.76 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/shark_tiger/shark_tiger.tres b/fish/species/shark_tiger/shark_tiger.tres index 72e2577..a7a9bcf 100644 --- a/fish/species/shark_tiger/shark_tiger.tres +++ b/fish/species/shark_tiger/shark_tiger.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"shark_tiger" display_name = "tiger shark" -active = true +active = false catalog_number = 904 collection_group = &"Coastal sharks" logbook_fact = "tiger sharks carry dark vertical bars that fade as they mature. broad jaws let them investigate an unusually varied range of prey." @@ -29,4 +28,3 @@ weight_max_lb = 1000.0 sell_value_min = 50 sell_value_max = 120 sell_value_curve = 0.8 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/shark_whale/shark_whale.tres b/fish/species/shark_whale/shark_whale.tres index 81739db..7c78314 100644 --- a/fish/species/shark_whale/shark_whale.tres +++ b/fish/species/shark_whale/shark_whale.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"shark_whale" display_name = "whale shark" -active = true +active = false catalog_number = 905 collection_group = &"Coastal sharks" logbook_fact = "whale sharks are enormous filter feeders covered in unique spot patterns. they cruise with open mouths to collect plankton and tiny fish." @@ -29,4 +28,3 @@ weight_max_lb = 45000.0 sell_value_min = 70 sell_value_max = 160 sell_value_curve = 0.76 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sheepshead/sheepshead.tres b/fish/species/sheepshead/sheepshead.tres index d4b8cfa..d323533 100644 --- a/fish/species/sheepshead/sheepshead.tres +++ b/fish/species/sheepshead/sheepshead.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/6905.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"sheepshead" display_name = "sheepshead" -active = true +active = false catalog_number = 6905 collection_group = &"Temperate reef fish" logbook_fact = "sheepshead carry flat human-like front teeth for biting barnacles and crabs. dark bars cross their high silver bodies." @@ -28,4 +27,3 @@ weight_max_lb = 20.0 sell_value_min = 7 sell_value_max = 18 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/shiner_common/shiner_common.tres b/fish/species/shiner_common/shiner_common.tres index 5a8a2f3..303a4b3 100644 --- a/fish/species/shiner_common/shiner_common.tres +++ b/fish/species/shiner_common/shiner_common.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/2801.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"shiner_common" display_name = "common shiner" -active = true +active = false catalog_number = 2801 collection_group = &"Freshwater minnows" logbook_fact = "common shiners flash silver in clear streams and small rivers. breeding males develop rosy fins and a blue-violet sheen." @@ -28,4 +27,3 @@ weight_max_lb = 0.3 sell_value_min = 1 sell_value_max = 3 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/shiner_emerald/shiner_emerald.tres b/fish/species/shiner_emerald/shiner_emerald.tres index 8a39e5c..5d654a4 100644 --- a/fish/species/shiner_emerald/shiner_emerald.tres +++ b/fish/species/shiner_emerald/shiner_emerald.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/2803.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"shiner_emerald" display_name = "emerald shiner" -active = true +active = false catalog_number = 2803 collection_group = &"Freshwater minnows" logbook_fact = "emerald shiners form bright surface schools in large lakes and rivers. slender bodies feed on plankton and drifting insects." @@ -27,4 +26,3 @@ weight_max_lb = 0.25 sell_value_min = 1 sell_value_max = 3 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/shiner_golden/shiner_golden.tres b/fish/species/shiner_golden/shiner_golden.tres index af57441..8eb64bb 100644 --- a/fish/species/shiner_golden/shiner_golden.tres +++ b/fish/species/shiner_golden/shiner_golden.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/2806.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"shiner_golden" display_name = "golden shiner" -active = true +active = false catalog_number = 2806 collection_group = &"Freshwater minnows" logbook_fact = "golden shiners school around dense vegetation in warm water. an upturned mouth takes insects and plankton from near the surface." @@ -28,4 +27,3 @@ weight_max_lb = 1.0 sell_value_min = 2 sell_value_max = 4 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/shrimp_peacock_mantis/shrimp_peacock_mantis.tres b/fish/species/shrimp_peacock_mantis/shrimp_peacock_mantis.tres index daf7662..d7be4a6 100644 --- a/fish/species/shrimp_peacock_mantis/shrimp_peacock_mantis.tres +++ b/fish/species/shrimp_peacock_mantis/shrimp_peacock_mantis.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"shrimp_peacock_mantis" display_name = "peacock mantis shrimp" -active = true +active = false catalog_number = 3804 collection_group = &"Lobsters and shrimp" logbook_fact = "peacock mantis shrimp strike hard-shelled prey with club-like limbs. complex eyes move independently and detect colors beyond human vision." @@ -29,4 +28,3 @@ weight_max_lb = 0.4 sell_value_min = 22 sell_value_max = 50 sell_value_curve = 0.96 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/shrimp_skunk_cleaner/shrimp_skunk_cleaner.tres b/fish/species/shrimp_skunk_cleaner/shrimp_skunk_cleaner.tres index fdd6730..fe9de65 100644 --- a/fish/species/shrimp_skunk_cleaner/shrimp_skunk_cleaner.tres +++ b/fish/species/shrimp_skunk_cleaner/shrimp_skunk_cleaner.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"shrimp_skunk_cleaner" display_name = "skunk cleaner shrimp" -active = true +active = false catalog_number = 3805 collection_group = &"Lobsters and shrimp" logbook_fact = "skunk cleaner shrimp advertise at reef cleaning stations with bright white antennae. visiting fish pause while parasites are picked away." @@ -29,4 +28,3 @@ weight_max_lb = 0.15 sell_value_min = 5 sell_value_max = 11 sell_value_curve = 0.98 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/skate_barndoor/skate_barndoor.tres b/fish/species/skate_barndoor/skate_barndoor.tres index 5ccb967..b9c8a5d 100644 --- a/fish/species/skate_barndoor/skate_barndoor.tres +++ b/fish/species/skate_barndoor/skate_barndoor.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"skate_barndoor" display_name = "barndoor skate" -active = true +active = false catalog_number = 5101 collection_group = &"Rays and skates" logbook_fact = "barndoor skates glide over cold atlantic bottoms with broad wing-like fins. rows of thorny spines protect the back and tail." @@ -28,4 +27,3 @@ weight_max_lb = 150.0 sell_value_min = 28 sell_value_max = 68 sell_value_curve = 0.8 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/smallmouth_bass/smallmouth_bass.tres b/fish/species/smallmouth_bass/smallmouth_bass.tres index d840f32..e198b2a 100644 --- a/fish/species/smallmouth_bass/smallmouth_bass.tres +++ b/fish/species/smallmouth_bass/smallmouth_bass.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"smallmouth_bass" display_name = "smallmouth bass" -active = true +active = false catalog_number = 2202 collection_group = &"Freshwater bass" logbook_fact = "smallmouth bass favor clear water with rock and moving current. bronze flanks and dark vertical bars distinguish them from largemouth bass." @@ -28,4 +27,3 @@ weight_max_lb = 12.0 sell_value_min = 6 sell_value_max = 15 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/smelt_eulachon/smelt_eulachon.tres b/fish/species/smelt_eulachon/smelt_eulachon.tres index f3be455..923d467 100644 --- a/fish/species/smelt_eulachon/smelt_eulachon.tres +++ b/fish/species/smelt_eulachon/smelt_eulachon.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"smelt_eulachon" display_name = "eulachon" -active = true +active = false catalog_number = 4201 collection_group = &"Ocean-run forage fish" logbook_fact = "eulachon return from the pacific to spawn in coastal rivers. their oil-rich bodies once served as candles when dried and fitted with wicks." @@ -29,4 +28,3 @@ weight_max_lb = 0.5 sell_value_min = 4 sell_value_max = 9 sell_value_curve = 0.98 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/smelt_rainbow/smelt_rainbow.tres b/fish/species/smelt_rainbow/smelt_rainbow.tres index 34691f9..6275187 100644 --- a/fish/species/smelt_rainbow/smelt_rainbow.tres +++ b/fish/species/smelt_rainbow/smelt_rainbow.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/4101.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"smelt_rainbow" display_name = "rainbow smelt" -active = true +active = false catalog_number = 4101 collection_group = &"Migratory forage fish" logbook_fact = "rainbow smelt move between coastal water and rivers, though some remain landlocked. cucumber-like aromas cling to freshly caught fish." @@ -28,4 +27,3 @@ weight_max_lb = 0.8 sell_value_min = 2 sell_value_max = 5 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/snakehead_giant/snakehead_giant.tres b/fish/species/snakehead_giant/snakehead_giant.tres index 069d723..8efb4d3 100644 --- a/fish/species/snakehead_giant/snakehead_giant.tres +++ b/fish/species/snakehead_giant/snakehead_giant.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"snakehead_giant" display_name = "giant snakehead" -active = true +active = false catalog_number = 7601 collection_group = &"Tropical freshwater predators" logbook_fact = "giant snakeheads breathe air and guard schools of young near the surface. long bodies launch sudden attacks from flooded vegetation." @@ -29,4 +28,3 @@ weight_max_lb = 45.0 sell_value_min = 28 sell_value_max = 64 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/snapper_lane/snapper_lane.tres b/fish/species/snapper_lane/snapper_lane.tres index d91444f..441107c 100644 --- a/fish/species/snapper_lane/snapper_lane.tres +++ b/fish/species/snapper_lane/snapper_lane.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/6001.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://d3d8s30bxq4tp" path="res://fish/species/snapper_lane/fish_snapper_lane.png" id="4_texture"] [sub_resource type="Resource" id="SnapperLaneAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/snapper_mangrove/snapper_mangrove.tres b/fish/species/snapper_mangrove/snapper_mangrove.tres index 9a0ede5..8767a3f 100644 --- a/fish/species/snapper_mangrove/snapper_mangrove.tres +++ b/fish/species/snapper_mangrove/snapper_mangrove.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://v34sdv1v7c2x" path="res://fish/species/snapper_mangrove/fish_snapper_mangrove.png" id="4_texture"] [sub_resource type="Resource" id="SnapperMangroveAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/snapper_mutton/snapper_mutton.tres b/fish/species/snapper_mutton/snapper_mutton.tres index 7c5aee9..4f343c3 100644 --- a/fish/species/snapper_mutton/snapper_mutton.tres +++ b/fish/species/snapper_mutton/snapper_mutton.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://cawvpo8aysw5i" path="res://fish/species/snapper_mutton/fish_snapper_mutton.png" id="4_texture"] [sub_resource type="Resource" id="SnapperMuttonAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/snapper_red/snapper_red.tres b/fish/species/snapper_red/snapper_red.tres index 247edc0..7c26926 100644 --- a/fish/species/snapper_red/snapper_red.tres +++ b/fish/species/snapper_red/snapper_red.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://ei5scljuqklk" path="res://fish/species/snapper_red/fish_snapper_red.png" id="4_texture"] [sub_resource type="Resource" id="SnapperRedAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/snook_common/snook_common.tres b/fish/species/snook_common/snook_common.tres index 5b84e99..676e3f4 100644 --- a/fish/species/snook_common/snook_common.tres +++ b/fish/species/snook_common/snook_common.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"snook_common" display_name = "common snook" -active = true +active = false catalog_number = 7303 collection_group = &"Tropical estuary" logbook_fact = "common snook wait around mangrove roots and current seams to ambush prey. a bold black lateral line divides their silver flanks." @@ -29,4 +28,3 @@ weight_max_lb = 30.0 sell_value_min = 13 sell_value_max = 32 sell_value_curve = 0.85 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sole_dover/sole_dover.tres b/fish/species/sole_dover/sole_dover.tres index 2b522a0..6083d96 100644 --- a/fish/species/sole_dover/sole_dover.tres +++ b/fish/species/sole_dover/sole_dover.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"sole_dover" display_name = "Dover sole" -active = true +active = false catalog_number = 1404 collection_group = &"Cold shelf fish" logbook_fact = "dover sole glide over deep muddy bottoms of the eastern pacific. both eyes migrate to the right side as the young fish becomes flat." @@ -28,4 +27,3 @@ weight_max_lb = 8.0 sell_value_min = 6 sell_value_max = 14 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sprat_european/sprat_european.tres b/fish/species/sprat_european/sprat_european.tres index 82f4876..61daa00 100644 --- a/fish/species/sprat_european/sprat_european.tres +++ b/fish/species/sprat_european/sprat_european.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"sprat_european" display_name = "European sprat" -active = true +active = false catalog_number = 1303 collection_group = &"Cold schooling fish" logbook_fact = "european sprat form compact schools in northern coastal seas. these tiny herring relatives feed on plankton near the surface." @@ -27,4 +26,3 @@ weight_max_lb = 0.3 sell_value_min = 1 sell_value_max = 3 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/squid_bigfin_reef/squid_bigfin_reef.tres b/fish/species/squid_bigfin_reef/squid_bigfin_reef.tres index 68f8993..d6b1201 100644 --- a/fish/species/squid_bigfin_reef/squid_bigfin_reef.tres +++ b/fish/species/squid_bigfin_reef/squid_bigfin_reef.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"squid_bigfin_reef" display_name = "bigfin reef squid" -active = true +active = false catalog_number = 6501 collection_group = &"Squid" logbook_fact = "bigfin reef squid hover in coordinated groups around warm reefs. shifting colors and body patterns signal to nearby squid." @@ -29,4 +28,3 @@ weight_max_lb = 5.0 sell_value_min = 13 sell_value_max = 30 sell_value_curve = 0.91 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/squid_colossal/squid_colossal.tres b/fish/species/squid_colossal/squid_colossal.tres index 4e38896..115ab10 100644 --- a/fish/species/squid_colossal/squid_colossal.tres +++ b/fish/species/squid_colossal/squid_colossal.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"squid_colossal" display_name = "colossal squid" -active = true +active = false catalog_number = 6502 collection_group = &"Squid" logbook_fact = "colossal squid carry swiveling hooks on their arms and tentacles. enormous eyes gather faint light in the deep southern ocean." @@ -29,4 +28,3 @@ weight_max_lb = 1100.0 sell_value_min = 82 sell_value_max = 190 sell_value_curve = 0.76 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/squid_giant/squid_giant.tres b/fish/species/squid_giant/squid_giant.tres index 4f76512..b95efe9 100644 --- a/fish/species/squid_giant/squid_giant.tres +++ b/fish/species/squid_giant/squid_giant.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"squid_giant" display_name = "giant squid" -active = true +active = false catalog_number = 6503 collection_group = &"Squid" logbook_fact = "giant squid hunt deep ocean prey with two long feeding tentacles. the largest eyes in the animal world watch for movement in darkness." @@ -29,4 +28,3 @@ weight_max_lb = 600.0 sell_value_min = 70 sell_value_max = 165 sell_value_curve = 0.77 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/squid_humboldt/squid_humboldt.tres b/fish/species/squid_humboldt/squid_humboldt.tres index 14abcfb..e9a7d2f 100644 --- a/fish/species/squid_humboldt/squid_humboldt.tres +++ b/fish/species/squid_humboldt/squid_humboldt.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"squid_humboldt" display_name = "Humboldt squid" -active = true +active = false catalog_number = 6504 collection_group = &"Squid" logbook_fact = "humboldt squid flash red and white while hunting in large groups. powerful beaks and grasping suckers handle fish and other squid." @@ -28,4 +27,3 @@ weight_max_lb = 110.0 sell_value_min = 26 sell_value_max = 64 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/stingray_ocellate_river/stingray_ocellate_river.tres b/fish/species/stingray_ocellate_river/stingray_ocellate_river.tres index 10bf3dc..fce4905 100644 --- a/fish/species/stingray_ocellate_river/stingray_ocellate_river.tres +++ b/fish/species/stingray_ocellate_river/stingray_ocellate_river.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"stingray_ocellate_river" display_name = "ocellate river stingray" -active = true +active = false catalog_number = 5104 collection_group = &"Rays and skates" logbook_fact = "ocellate river stingrays carry bright eye-like spots across a round disc. they hide beneath sand in south american rivers." @@ -29,4 +28,3 @@ weight_max_lb = 35.0 sell_value_min = 28 sell_value_max = 65 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/stingray_southern/stingray_southern.tres b/fish/species/stingray_southern/stingray_southern.tres index c0b03f0..947cf4d 100644 --- a/fish/species/stingray_southern/stingray_southern.tres +++ b/fish/species/stingray_southern/stingray_southern.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"stingray_southern" display_name = "southern stingray" -active = true +active = false catalog_number = 5105 collection_group = &"Rays and skates" logbook_fact = "southern stingrays bury in warm sand with only their eyes and spiracles visible. crushing plates break open clams and crustaceans." @@ -28,4 +27,3 @@ weight_max_lb = 80.0 sell_value_min = 15 sell_value_max = 40 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sturgeon_lake/sturgeon_lake.tres b/fish/species/sturgeon_lake/sturgeon_lake.tres index eef7789..e4e69a6 100644 --- a/fish/species/sturgeon_lake/sturgeon_lake.tres +++ b/fish/species/sturgeon_lake/sturgeon_lake.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/102.png" id="4_texture"] +[ext_resource type="Texture2D" path="res://fish/species/sturgeon_lake/sturgeon_lake.png" id="4_texture"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/sturgeon_shovelnose/sturgeon_shovelnose.tres b/fish/species/sturgeon_shovelnose/sturgeon_shovelnose.tres index 9f02593..4e078d0 100644 --- a/fish/species/sturgeon_shovelnose/sturgeon_shovelnose.tres +++ b/fish/species/sturgeon_shovelnose/sturgeon_shovelnose.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/105.png" id="4_texture"] +[ext_resource type="Texture2D" path="res://fish/species/sturgeon_shovelnose/sturgeon_shovelnose.png" id="4_texture"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/sturgeon_white/sturgeon_white.tres b/fish/species/sturgeon_white/sturgeon_white.tres index 961411d..91cab98 100644 --- a/fish/species/sturgeon_white/sturgeon_white.tres +++ b/fish/species/sturgeon_white/sturgeon_white.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"sturgeon_white" display_name = "white sturgeon" -active = true +active = false catalog_number = 4301 collection_group = &"Ocean-run giants" logbook_fact = "white sturgeon are the largest freshwater fish in north america. armored plates line bodies built for long lives in rivers and estuaries." @@ -28,4 +27,3 @@ weight_max_lb = 500.0 sell_value_min = 58 sell_value_max = 135 sell_value_curve = 0.78 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sucker_white/sucker_white.tres b/fish/species/sucker_white/sucker_white.tres index ff48770..25e09c2 100644 --- a/fish/species/sucker_white/sucker_white.tres +++ b/fish/species/sucker_white/sucker_white.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"sucker_white" display_name = "white sucker" -active = true +active = false catalog_number = 2305 collection_group = &"Freshwater bottom fish" logbook_fact = "white suckers vacuum insects and organic matter from cool freshwater bottoms. spring runs carry large groups into shallow streams." @@ -27,4 +26,3 @@ weight_max_lb = 8.0 sell_value_min = 3 sell_value_max = 8 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/sunfish/sunfish.tres b/fish/species/sunfish/sunfish.tres index 5efd181..f0ced78 100644 --- a/fish/species/sunfish/sunfish.tres +++ b/fish/species/sunfish/sunfish.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Resource" path="res://fish/day_availability.tres" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/5001.png" id="4_texture"] +[ext_resource type="Texture2D" path="res://fish/species/sunfish/fish_sunfish.png" id="4_texture"] [resource] script = ExtResource("1_fish_data") diff --git a/fish/species/surgeonfish_blue/surgeonfish_blue.tres b/fish/species/surgeonfish_blue/surgeonfish_blue.tres index d0a903e..3708547 100644 --- a/fish/species/surgeonfish_blue/surgeonfish_blue.tres +++ b/fish/species/surgeonfish_blue/surgeonfish_blue.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"surgeonfish_blue" display_name = "blue tang" -active = true +active = false catalog_number = 5501 collection_group = &"Reef grazers" logbook_fact = "blue tangs graze algae from coral reefs with small close-set teeth. sharp folding spines near the tail give surgeonfish their name." @@ -28,4 +27,3 @@ weight_max_lb = 1.5 sell_value_min = 5 sell_value_max = 11 sell_value_curve = 0.95 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/swordfish/swordfish.tres b/fish/species/swordfish/swordfish.tres index 24319f1..ea765a3 100644 --- a/fish/species/swordfish/swordfish.tres +++ b/fish/species/swordfish/swordfish.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://cs1qmm4galac4" path="res://fish/species/swordfish/fish_swordfish.png" id="4_texture"] [sub_resource type="Resource" id="SwordfishAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/tambaqui/tambaqui.tres b/fish/species/tambaqui/tambaqui.tres index 4bfd4a1..fd8d92f 100644 --- a/fish/species/tambaqui/tambaqui.tres +++ b/fish/species/tambaqui/tambaqui.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"tambaqui" display_name = "tambaqui" -active = true +active = false catalog_number = 7509 collection_group = &"Tropical freshwater fish" logbook_fact = "tambaqui follow seasonal floods into forests to feed on fruit and seeds. strong square teeth crack tough plant material." @@ -29,4 +28,3 @@ weight_max_lb = 80.0 sell_value_min = 30 sell_value_max = 68 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/tang_yellow/tang_yellow.tres b/fish/species/tang_yellow/tang_yellow.tres index 501f2a3..92ee455 100644 --- a/fish/species/tang_yellow/tang_yellow.tres +++ b/fish/species/tang_yellow/tang_yellow.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_rain = true script = ExtResource("1_fish_data") id = &"tang_yellow" display_name = "yellow tang" -active = true +active = false catalog_number = 5504 collection_group = &"Reef grazers" logbook_fact = "yellow tangs browse algae across hawaiian reefs during daylight. at night their bright bodies darken and show a pale horizontal stripe." @@ -29,4 +28,3 @@ weight_max_lb = 0.8 sell_value_min = 9 sell_value_max = 20 sell_value_curve = 0.96 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/tarpon_atlantic/tarpon_atlantic.tres b/fish/species/tarpon_atlantic/tarpon_atlantic.tres index 0b8c6aa..1aeda05 100644 --- a/fish/species/tarpon_atlantic/tarpon_atlantic.tres +++ b/fish/species/tarpon_atlantic/tarpon_atlantic.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"tarpon_atlantic" display_name = "atlantic tarpon" -active = true +active = false catalog_number = 7301 collection_group = &"Tropical estuary" logbook_fact = "atlantic tarpon gulp air with a lung-like swim bladder when coastal water runs low on oxygen. giant silver scales flash during leaps." @@ -28,4 +27,3 @@ weight_max_lb = 180.0 sell_value_min = 34 sell_value_max = 82 sell_value_curve = 0.8 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/tautog/tautog.tres b/fish/species/tautog/tautog.tres index 7028401..57bbe3c 100644 --- a/fish/species/tautog/tautog.tres +++ b/fish/species/tautog/tautog.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"tautog" display_name = "tautog" -active = true +active = false catalog_number = 6906 collection_group = &"Temperate reef fish" logbook_fact = "tautog pry mussels and crabs from rocky structure with thick lips and strong teeth. adults return to familiar shelters year after year." @@ -28,4 +27,3 @@ weight_max_lb = 20.0 sell_value_min = 7 sell_value_max = 18 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/tench/tench.tres b/fish/species/tench/tench.tres index 7ffe273..377db0f 100644 --- a/fish/species/tench/tench.tres +++ b/fish/species/tench/tench.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"tench" display_name = "tench" -active = true +active = false catalog_number = 2509 collection_group = &"Freshwater coarse fish" logbook_fact = "tench browse quiet, muddy bottoms with two small mouth barbels. a thick coat of slime protects their olive-green scales." @@ -29,4 +28,3 @@ weight_max_lb = 12.0 sell_value_min = 7 sell_value_max = 17 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/tetra_neon/tetra_neon.tres b/fish/species/tetra_neon/tetra_neon.tres index da42e36..265cb39 100644 --- a/fish/species/tetra_neon/tetra_neon.tres +++ b/fish/species/tetra_neon/tetra_neon.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"tetra_neon" display_name = "neon tetra" -active = true +active = false catalog_number = 2102 collection_group = &"Freshwater aquarium fish" logbook_fact = "neon tetras school through shaded forest streams. an iridescent blue stripe remains visible in the dim, tannin-stained water." @@ -28,4 +27,3 @@ weight_max_lb = 0.08 sell_value_min = 4 sell_value_max = 8 sell_value_curve = 0.98 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/tigerfish_goliath/tigerfish_goliath.tres b/fish/species/tigerfish_goliath/tigerfish_goliath.tres index f34d449..89e2525 100644 --- a/fish/species/tigerfish_goliath/tigerfish_goliath.tres +++ b/fish/species/tigerfish_goliath/tigerfish_goliath.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"tigerfish_goliath" display_name = "goliath tigerfish" -active = true +active = false catalog_number = 2703 collection_group = &"Freshwater giants" logbook_fact = "goliath tigerfish patrol powerful african rivers with interlocking dagger-like teeth. a muscular forked tail drives sudden attacks." @@ -28,4 +27,3 @@ weight_max_lb = 150.0 sell_value_min = 58 sell_value_max = 132 sell_value_curve = 0.8 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/tilapia_nile/tilapia_nile.tres b/fish/species/tilapia_nile/tilapia_nile.tres index d7a2eed..5d4ccac 100644 --- a/fish/species/tilapia_nile/tilapia_nile.tres +++ b/fish/species/tilapia_nile/tilapia_nile.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/7506.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"tilapia_nile" display_name = "Nile tilapia" -active = true +active = false catalog_number = 7506 collection_group = &"Tropical freshwater fish" logbook_fact = "nile tilapia thrive in warm lakes and rivers on a varied diet. females protect eggs and young inside their mouths." @@ -28,4 +27,3 @@ weight_max_lb = 8.0 sell_value_min = 3 sell_value_max = 9 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/tilefish_blueline/tilefish_blueline.tres b/fish/species/tilefish_blueline/tilefish_blueline.tres index aff98b6..13ea387 100644 --- a/fish/species/tilefish_blueline/tilefish_blueline.tres +++ b/fish/species/tilefish_blueline/tilefish_blueline.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"tilefish_blueline" display_name = "blueline tilefish" -active = true +active = false catalog_number = 1601 collection_group = &"Deep shelf fish" logbook_fact = "blueline tilefish shelter in burrows and rocky openings along deep shelves. a narrow blue stripe traces the edge of the dorsal fin." @@ -28,4 +27,3 @@ weight_max_lb = 20.0 sell_value_min = 7 sell_value_max = 18 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/tilefish_golden/tilefish_golden.tres b/fish/species/tilefish_golden/tilefish_golden.tres index ed203c8..1875b08 100644 --- a/fish/species/tilefish_golden/tilefish_golden.tres +++ b/fish/species/tilefish_golden/tilefish_golden.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"tilefish_golden" display_name = "golden tilefish" -active = true +active = false catalog_number = 1602 collection_group = &"Deep shelf fish" logbook_fact = "golden tilefish excavate burrows in soft clay along deep ocean slopes. their bright yellow spots contrast with blue-green backs." @@ -28,4 +27,3 @@ weight_max_lb = 50.0 sell_value_min = 15 sell_value_max = 37 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/trevally_bluefin/trevally_bluefin.tres b/fish/species/trevally_bluefin/trevally_bluefin.tres index 3cf8dee..46971e6 100644 --- a/fish/species/trevally_bluefin/trevally_bluefin.tres +++ b/fish/species/trevally_bluefin/trevally_bluefin.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"trevally_bluefin" display_name = "bluefin trevally" -active = true +active = false catalog_number = 5802 collection_group = &"Reef predators" logbook_fact = "bluefin trevally hunt reef fish in coordinated groups. electric blue fins and scattered blue spots contrast with a golden body." @@ -29,4 +28,3 @@ weight_max_lb = 25.0 sell_value_min = 14 sell_value_max = 32 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/trevally_giant/trevally_giant.tres b/fish/species/trevally_giant/trevally_giant.tres index 62ee42b..43453d5 100644 --- a/fish/species/trevally_giant/trevally_giant.tres +++ b/fish/species/trevally_giant/trevally_giant.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"trevally_giant" display_name = "giant trevally" -active = true +active = false catalog_number = 3603 collection_group = &"Large coastal predators" logbook_fact = "giant trevally hunt reef edges with bursts of speed and force. large individuals sometimes charge prey from surf and shallow lagoons." @@ -28,4 +27,3 @@ weight_max_lb = 150.0 sell_value_min = 32 sell_value_max = 78 sell_value_curve = 0.8 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/triggerfish_gray/triggerfish_gray.tres b/fish/species/triggerfish_gray/triggerfish_gray.tres index 0b205a2..90f96b8 100644 --- a/fish/species/triggerfish_gray/triggerfish_gray.tres +++ b/fish/species/triggerfish_gray/triggerfish_gray.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"triggerfish_gray" display_name = "gray triggerfish" -active = true +active = false catalog_number = 5602 collection_group = &"Reef oddities" logbook_fact = "gray triggerfish lock a stout dorsal spine upright when wedged into shelter. strong teeth crack barnacles, crabs, and shellfish." @@ -28,4 +27,3 @@ weight_max_lb = 12.0 sell_value_min = 7 sell_value_max = 17 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/triggerfish_queen/triggerfish_queen.tres b/fish/species/triggerfish_queen/triggerfish_queen.tres index e747f25..d57ede3 100644 --- a/fish/species/triggerfish_queen/triggerfish_queen.tres +++ b/fish/species/triggerfish_queen/triggerfish_queen.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"triggerfish_queen" display_name = "queen triggerfish" -active = true +active = false catalog_number = 5605 collection_group = &"Reef oddities" logbook_fact = "queen triggerfish blow jets of water to uncover buried prey and flip sea urchins. vivid blue lines radiate across the face." @@ -29,4 +28,3 @@ weight_max_lb = 15.0 sell_value_min = 14 sell_value_max = 32 sell_value_curve = 0.88 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/tripletail/tripletail.tres b/fish/species/tripletail/tripletail.tres index 7bb151b..552e15b 100644 --- a/fish/species/tripletail/tripletail.tres +++ b/fish/species/tripletail/tripletail.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"tripletail" display_name = "tripletail" -active = true +active = false catalog_number = 604 collection_group = &"Coastal oddities" logbook_fact = "tripletail often drift sideways near floating debris, resembling a loose leaf. rounded rear fins create the three-tailed silhouette." @@ -29,4 +28,3 @@ weight_max_lb = 30.0 sell_value_min = 13 sell_value_max = 31 sell_value_curve = 0.85 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/trout_brown/trout_brown.tres b/fish/species/trout_brown/trout_brown.tres index 6beb1ba..01a28d5 100644 --- a/fish/species/trout_brown/trout_brown.tres +++ b/fish/species/trout_brown/trout_brown.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_day = false script = ExtResource("1_fish_data") id = &"trout_brown" display_name = "brown trout" -active = true +active = false catalog_number = 1103 collection_group = &"Cold freshwater salmonids" logbook_fact = "brown trout often shelter by day and hunt more freely after dark. adaptable populations occupy streams, lakes, and even coastal water." @@ -28,4 +27,3 @@ weight_max_lb = 25.0 sell_value_min = 7 sell_value_max = 20 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/trout_cutthroat/trout_cutthroat.tres b/fish/species/trout_cutthroat/trout_cutthroat.tres index 6ea9bff..38c90a7 100644 --- a/fish/species/trout_cutthroat/trout_cutthroat.tres +++ b/fish/species/trout_cutthroat/trout_cutthroat.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://nowggrl8wmr" path="res://fish/species/trout_cutthroat/fish_trout_cutthroat.png" id="4_texture"] [sub_resource type="Resource" id="TroutCutthroatAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/trout_golden/trout_golden.tres b/fish/species/trout_golden/trout_golden.tres index bb6732b..d455e21 100644 --- a/fish/species/trout_golden/trout_golden.tres +++ b/fish/species/trout_golden/trout_golden.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://b64w3kwf3wins" path="res://fish/species/trout_golden/fish_trout_golden.png" id="4_texture"] [sub_resource type="Resource" id="TroutGoldenAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/trout_rainbow/trout_rainbow.tres b/fish/species/trout_rainbow/trout_rainbow.tres index 69d40bd..3b9e9aa 100644 --- a/fish/species/trout_rainbow/trout_rainbow.tres +++ b/fish/species/trout_rainbow/trout_rainbow.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://mfxehkoxea21" path="res://fish/species/trout_rainbow/fish_trout_rainbow.png" id="4_texture"] [sub_resource type="Resource" id="TroutRainbowAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/trout_steelhead/trout_steelhead.tres b/fish/species/trout_steelhead/trout_steelhead.tres index ed052d9..3bc9698 100644 --- a/fish/species/trout_steelhead/trout_steelhead.tres +++ b/fish/species/trout_steelhead/trout_steelhead.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://cabbpc55sf2gw" path="res://fish/species/trout_steelhead/fish_trout_steelhead.png" id="4_texture"] [sub_resource type="Resource" id="TroutSteelheadAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/trumpetfish_atlantic/trumpetfish_atlantic.tres b/fish/species/trumpetfish_atlantic/trumpetfish_atlantic.tres index 3ff3cc3..eb58032 100644 --- a/fish/species/trumpetfish_atlantic/trumpetfish_atlantic.tres +++ b/fish/species/trumpetfish_atlantic/trumpetfish_atlantic.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"trumpetfish_atlantic" display_name = "atlantic trumpetfish" -active = true +active = false catalog_number = 5601 collection_group = &"Reef oddities" logbook_fact = "atlantic trumpetfish hover head-down among corals and sea fans. long tubular snouts expand suddenly to draw in small fish." @@ -28,4 +27,3 @@ weight_max_lb = 2.0 sell_value_min = 10 sell_value_max = 24 sell_value_curve = 0.94 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/tuna_albacore/tuna_albacore.tres b/fish/species/tuna_albacore/tuna_albacore.tres index c8cdfdf..69ad32d 100644 --- a/fish/species/tuna_albacore/tuna_albacore.tres +++ b/fish/species/tuna_albacore/tuna_albacore.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/bass_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://bxebn81i552fg" path="res://fish/species/tuna_albacore/fish_tuna_albacore.png" id="4_texture"] [sub_resource type="Resource" id="AlbacoreAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/tuna_bigeye/tuna_bigeye.tres b/fish/species/tuna_bigeye/tuna_bigeye.tres index 1c31d1a..6794a75 100644 --- a/fish/species/tuna_bigeye/tuna_bigeye.tres +++ b/fish/species/tuna_bigeye/tuna_bigeye.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/bass_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://bypnhqmkhnm2c" path="res://fish/species/tuna_bigeye/fish_tuna_bigeye.png" id="4_texture"] [sub_resource type="Resource" id="BigeyeAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/tuna_bluefin/tuna_bluefin.tres b/fish/species/tuna_bluefin/tuna_bluefin.tres index 4bf5033..7d6f810 100644 --- a/fish/species/tuna_bluefin/tuna_bluefin.tres +++ b/fish/species/tuna_bluefin/tuna_bluefin.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/bass_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://dg7nafydp4flx" path="res://fish/species/tuna_bluefin/fish_tuna_bluefin.png" id="4_texture"] [sub_resource type="Resource" id="BluefinAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/tuna_skipjack/tuna_skipjack.tres b/fish/species/tuna_skipjack/tuna_skipjack.tres index cc1988e..cb16b70 100644 --- a/fish/species/tuna_skipjack/tuna_skipjack.tres +++ b/fish/species/tuna_skipjack/tuna_skipjack.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/bass_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://vvtr81d2aojs" path="res://fish/species/tuna_skipjack/fish_tuna_skipjack.png" id="4_texture"] [sub_resource type="Resource" id="SkipjackAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/tuna_yellowfin/tuna_yellowfin.tres b/fish/species/tuna_yellowfin/tuna_yellowfin.tres index 665228e..90f9017 100644 --- a/fish/species/tuna_yellowfin/tuna_yellowfin.tres +++ b/fish/species/tuna_yellowfin/tuna_yellowfin.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/bass_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://bwpdgagaysdsf" path="res://fish/species/tuna_yellowfin/fish_tuna_yellowfin.png" id="4_texture"] [sub_resource type="Resource" id="YellowfinAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/turbot/turbot.tres b/fish/species/turbot/turbot.tres index c3ab7bd..9e3e6f3 100644 --- a/fish/species/turbot/turbot.tres +++ b/fish/species/turbot/turbot.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"turbot" display_name = "turbot" -active = true +active = false catalog_number = 3703 collection_group = &"Large flatfish" logbook_fact = "turbot have broad, nearly circular bodies covered with bony bumps instead of scales. they bury into sand before ambushing fish and crustaceans." @@ -28,4 +27,3 @@ weight_max_lb = 35.0 sell_value_min = 14 sell_value_max = 34 sell_value_curve = 0.85 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/turtle_green/turtle_green.tres b/fish/species/turtle_green/turtle_green.tres index b1e8e71..b473dad 100644 --- a/fish/species/turtle_green/turtle_green.tres +++ b/fish/species/turtle_green/turtle_green.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"turtle_green" display_name = "green sea turtle" -active = true +active = false catalog_number = 6201 collection_group = &"Sea turtles" logbook_fact = "green sea turtles graze seagrass meadows with finely serrated jaws. adults migrate long distances between feeding and nesting grounds." @@ -29,4 +28,3 @@ weight_max_lb = 500.0 sell_value_min = 62 sell_value_max = 145 sell_value_curve = 0.78 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/turtle_hawksbill/turtle_hawksbill.tres b/fish/species/turtle_hawksbill/turtle_hawksbill.tres index 5b5a5c8..a13910f 100644 --- a/fish/species/turtle_hawksbill/turtle_hawksbill.tres +++ b/fish/species/turtle_hawksbill/turtle_hawksbill.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"turtle_hawksbill" display_name = "hawksbill sea turtle" -active = true +active = false catalog_number = 6202 collection_group = &"Sea turtles" logbook_fact = "hawksbill sea turtles reach into reef crevices with narrow hooked beaks. a diet rich in sponges helps shape coral communities." @@ -29,4 +28,3 @@ weight_max_lb = 250.0 sell_value_min = 66 sell_value_max = 150 sell_value_curve = 0.8 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/turtle_leatherback/turtle_leatherback.tres b/fish/species/turtle_leatherback/turtle_leatherback.tres index 3a8acf3..a19b310 100644 --- a/fish/species/turtle_leatherback/turtle_leatherback.tres +++ b/fish/species/turtle_leatherback/turtle_leatherback.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"turtle_leatherback" display_name = "leatherback sea turtle" -active = true +active = false catalog_number = 6203 collection_group = &"Sea turtles" logbook_fact = "leatherback sea turtles cross entire oceans while hunting jellies. a flexible ridged shell and internal heat help them enter cold water." @@ -29,4 +28,3 @@ weight_max_lb = 2000.0 sell_value_min = 75 sell_value_max = 175 sell_value_curve = 0.76 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/turtle_loggerhead/turtle_loggerhead.tres b/fish/species/turtle_loggerhead/turtle_loggerhead.tres index e4bd898..0317591 100644 --- a/fish/species/turtle_loggerhead/turtle_loggerhead.tres +++ b/fish/species/turtle_loggerhead/turtle_loggerhead.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"turtle_loggerhead" display_name = "loggerhead sea turtle" -active = true +active = false catalog_number = 6204 collection_group = &"Sea turtles" logbook_fact = "loggerhead sea turtles crush crabs and mollusks with massive jaws. females often return near their birth beaches to nest." @@ -28,4 +27,3 @@ weight_max_lb = 1200.0 sell_value_min = 68 sell_value_max = 155 sell_value_curve = 0.77 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/urchin_purple/urchin_purple.tres b/fish/species/urchin_purple/urchin_purple.tres index 6546627..884055b 100644 --- a/fish/species/urchin_purple/urchin_purple.tres +++ b/fish/species/urchin_purple/urchin_purple.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"urchin_purple" display_name = "purple sea urchin" -active = true +active = false catalog_number = 1903 collection_group = &"Echinoderms" logbook_fact = "purple sea urchins scrape algae from rocks with a five-toothed feeding structure. dense groups can clear kelp from entire reefs." @@ -28,4 +27,3 @@ weight_max_lb = 1.0 sell_value_min = 5 sell_value_max = 12 sell_value_curve = 0.96 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/wahoo/wahoo.tres b/fish/species/wahoo/wahoo.tres index 9e045de..cc8488d 100644 --- a/fish/species/wahoo/wahoo.tres +++ b/fish/species/wahoo/wahoo.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"wahoo" display_name = "wahoo" -active = true +active = false catalog_number = 4703 collection_group = &"Oceanic pelagic fish" logbook_fact = "wahoo are streamlined open-ocean hunters with rows of sharp teeth. blue vertical bars flicker across their sides during fast pursuits." @@ -28,4 +27,3 @@ weight_max_lb = 100.0 sell_value_min = 30 sell_value_max = 70 sell_value_curve = 0.82 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/walleye/walleye.tres b/fish/species/walleye/walleye.tres index 277b3d8..a08adac 100644 --- a/fish/species/walleye/walleye.tres +++ b/fish/species/walleye/walleye.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" uid="uid://c10j6jv6fv32r" path="res://fish/species/walleye/fish_walleye.png" id="4_texture"] [sub_resource type="Resource" id="WalleyeAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/walrus/walrus.tres b/fish/species/walrus/walrus.tres index ff74bf6..180fe27 100644 --- a/fish/species/walrus/walrus.tres +++ b/fish/species/walrus/walrus.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"walrus" display_name = "walrus" -active = true +active = false catalog_number = 504 collection_group = &"Coastal marine mammals" logbook_fact = "walruses sweep the seafloor for clams and other soft-bodied prey. long tusks help them haul onto ice and settle disputes." @@ -29,4 +28,3 @@ weight_max_lb = 3700.0 sell_value_min = 74 sell_value_max = 170 sell_value_curve = 0.76 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/warmouth/warmouth.tres b/fish/species/warmouth/warmouth.tres index c58e8c5..d93c506 100644 --- a/fish/species/warmouth/warmouth.tres +++ b/fish/species/warmouth/warmouth.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"warmouth" display_name = "warmouth" -active = true +active = false catalog_number = 3106 collection_group = &"Freshwater panfish" logbook_fact = "warmouth hide in weeds, roots, and murky backwaters before ambushing prey. red eyes and dark cheek stripes frame a notably large mouth." @@ -29,4 +28,3 @@ weight_max_lb = 2.0 sell_value_min = 5 sell_value_max = 10 sell_value_curve = 0.95 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/weakfish/weakfish.tres b/fish/species/weakfish/weakfish.tres index 83a5f11..6f94da3 100644 --- a/fish/species/weakfish/weakfish.tres +++ b/fish/species/weakfish/weakfish.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"weakfish" display_name = "weakfish" -active = true +active = false catalog_number = 6805 collection_group = &"Temperate estuary" logbook_fact = "weakfish are named for delicate mouth tissue that tears easily around a hook. iridescent spots scatter across their bronze backs." @@ -29,4 +28,3 @@ weight_max_lb = 18.0 sell_value_min = 12 sell_value_max = 29 sell_value_curve = 0.86 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/whale_blue/whale_blue.tres b/fish/species/whale_blue/whale_blue.tres index 415008e..50f2c53 100644 --- a/fish/species/whale_blue/whale_blue.tres +++ b/fish/species/whale_blue/whale_blue.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"whale_blue" display_name = "blue whale" -active = true +active = false catalog_number = 7701 collection_group = &"Whales and dolphins" logbook_fact = "blue whales are the largest animals known to have lived. pleated throats expand around vast mouthfuls of water that baleen filters for krill." @@ -29,4 +28,3 @@ weight_max_lb = 330000.0 sell_value_min = 120 sell_value_max = 300 sell_value_curve = 0.72 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/whale_humpback/whale_humpback.tres b/fish/species/whale_humpback/whale_humpback.tres index 7ad7161..7c99516 100644 --- a/fish/species/whale_humpback/whale_humpback.tres +++ b/fish/species/whale_humpback/whale_humpback.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"whale_humpback" display_name = "humpback whale" -active = true +active = false catalog_number = 7703 collection_group = &"Whales and dolphins" logbook_fact = "humpback whales use long pectoral fins while turning and feeding. males produce layered songs that change across breeding seasons." @@ -29,4 +28,3 @@ weight_max_lb = 90000.0 sell_value_min = 105 sell_value_max = 260 sell_value_curve = 0.73 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/whale_killer/whale_killer.tres b/fish/species/whale_killer/whale_killer.tres index 7952089..a1197cd 100644 --- a/fish/species/whale_killer/whale_killer.tres +++ b/fish/species/whale_killer/whale_killer.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_rain = true script = ExtResource("1_fish_data") id = &"whale_killer" display_name = "killer whale" -active = true +active = false catalog_number = 7704 collection_group = &"Whales and dolphins" logbook_fact = "killer whales live in close family groups with distinct calls and hunting traditions. different populations specialize in different prey." @@ -29,4 +28,3 @@ weight_max_lb = 12000.0 sell_value_min = 95 sell_value_max = 230 sell_value_curve = 0.74 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/whale_sperm/whale_sperm.tres b/fish/species/whale_sperm/whale_sperm.tres index eef3aed..019088b 100644 --- a/fish/species/whale_sperm/whale_sperm.tres +++ b/fish/species/whale_sperm/whale_sperm.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"whale_sperm" display_name = "sperm whale" -active = true +active = false catalog_number = 7705 collection_group = &"Whales and dolphins" logbook_fact = "sperm whales make deep dives to hunt squid with powerful echolocation clicks. their enormous square heads contain a waxy spermaceti organ." @@ -29,4 +28,3 @@ weight_max_lb = 125000.0 sell_value_min = 115 sell_value_max = 280 sell_value_curve = 0.72 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/white_perch/white_perch.tres b/fish/species/white_perch/white_perch.tres index 5543307..2b45610 100644 --- a/fish/species/white_perch/white_perch.tres +++ b/fish/species/white_perch/white_perch.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"white_perch" display_name = "white perch" -active = true +active = false catalog_number = 6806 collection_group = &"Temperate estuary" logbook_fact = "white perch tolerate fresh and brackish water along the atlantic coast. deep silver bodies gather in schools around river mouths." @@ -27,4 +26,3 @@ weight_max_lb = 3.5 sell_value_min = 5 sell_value_max = 11 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/whitefish_lake/whitefish_lake.tres b/fish/species/whitefish_lake/whitefish_lake.tres index 51246f5..f50e27b 100644 --- a/fish/species/whitefish_lake/whitefish_lake.tres +++ b/fish/species/whitefish_lake/whitefish_lake.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -12,7 +11,7 @@ script = ExtResource("3_availability") script = ExtResource("1_fish_data") id = &"whitefish_lake" display_name = "lake whitefish" -active = true +active = false catalog_number = 1003 collection_group = &"Cold freshwater fish" logbook_fact = "lake whitefish browse deep, cold bottoms with small downward-pointing mouths. large schools move toward shallows to spawn in autumn." @@ -27,4 +26,3 @@ weight_max_lb = 12.0 sell_value_min = 4 sell_value_max = 11 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/wolffish_atlantic/wolffish_atlantic.tres b/fish/species/wolffish_atlantic/wolffish_atlantic.tres index ca67a92..a4c29c1 100644 --- a/fish/species/wolffish_atlantic/wolffish_atlantic.tres +++ b/fish/species/wolffish_atlantic/wolffish_atlantic.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ forbid_rain = true script = ExtResource("1_fish_data") id = &"wolffish_atlantic" display_name = "atlantic wolffish" -active = true +active = false catalog_number = 1201 collection_group = &"Cold reef fish" logbook_fact = "atlantic wolffish use heavy jaws and blunt teeth to crush shellfish and urchins. natural antifreeze proteins help them endure icy water." @@ -28,4 +27,3 @@ weight_max_lb = 40.0 sell_value_min = 14 sell_value_max = 34 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/wolffish_spotted/wolffish_spotted.tres b/fish/species/wolffish_spotted/wolffish_spotted.tres index 36b4575..aa498e6 100644 --- a/fish/species/wolffish_spotted/wolffish_spotted.tres +++ b/fish/species/wolffish_spotted/wolffish_spotted.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"wolffish_spotted" display_name = "spotted wolffish" -active = true +active = false catalog_number = 1203 collection_group = &"Cold reef fish" logbook_fact = "spotted wolffish crush hard-shelled prey with broad molar-like teeth. their pale spots stand out against a dark cold-water body." @@ -28,4 +27,3 @@ weight_max_lb = 50.0 sell_value_min = 26 sell_value_max = 60 sell_value_curve = 0.84 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/wrasse_ballan/wrasse_ballan.tres b/fish/species/wrasse_ballan/wrasse_ballan.tres index a1beebc..b25f40d 100644 --- a/fish/species/wrasse_ballan/wrasse_ballan.tres +++ b/fish/species/wrasse_ballan/wrasse_ballan.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"wrasse_ballan" display_name = "ballan wrasse" -active = true +active = false catalog_number = 6101 collection_group = &"Reef wrasses" logbook_fact = "ballan wrasse crush shellfish and sea urchins with strong throat teeth. thick lips and mottled colors suit rocky european reefs." @@ -28,4 +27,3 @@ weight_max_lb = 10.0 sell_value_min = 6 sell_value_max = 15 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/wrasse_cleaner/wrasse_cleaner.tres b/fish/species/wrasse_cleaner/wrasse_cleaner.tres index 85db0fc..3f21ff7 100644 --- a/fish/species/wrasse_cleaner/wrasse_cleaner.tres +++ b/fish/species/wrasse_cleaner/wrasse_cleaner.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -14,7 +13,7 @@ forbid_fog = true script = ExtResource("1_fish_data") id = &"wrasse_cleaner" display_name = "cleaner wrasse" -active = true +active = false catalog_number = 6102 collection_group = &"Reef wrasses" logbook_fact = "cleaner wrasses advertise with a bright stripe and dance at reef stations. larger fish wait while parasites are picked from skin and gills." @@ -29,4 +28,3 @@ weight_max_lb = 0.2 sell_value_min = 9 sell_value_max = 20 sell_value_curve = 1.0 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/wreckfish/wreckfish.tres b/fish/species/wreckfish/wreckfish.tres index 345d274..0c258a9 100644 --- a/fish/species/wreckfish/wreckfish.tres +++ b/fish/species/wreckfish/wreckfish.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ require_fog = true script = ExtResource("1_fish_data") id = &"wreckfish" display_name = "wreckfish" -active = true +active = false catalog_number = 1606 collection_group = &"Deep shelf fish" logbook_fact = "wreckfish gather around caves, ledges, and shipwrecks in deep water. powerful jaws let them ambush fish and large crustaceans." @@ -28,4 +27,3 @@ weight_max_lb = 180.0 sell_value_min = 31 sell_value_max = 76 sell_value_curve = 0.8 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fish/species/yellow_perch/yellow_perch.tres b/fish/species/yellow_perch/yellow_perch.tres index 3e0501f..311280e 100644 --- a/fish/species/yellow_perch/yellow_perch.tres +++ b/fish/species/yellow_perch/yellow_perch.tres @@ -1,9 +1,8 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/3201.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") @@ -13,7 +12,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"yellow_perch" display_name = "yellow perch" -active = true +active = false catalog_number = 3201 collection_group = &"Freshwater perch" logbook_fact = "yellow perch travel in schools through cool lakes and slow rivers. dark vertical bars and orange lower fins make them easy to recognize." @@ -28,4 +27,3 @@ weight_max_lb = 4.0 sell_value_min = 3 sell_value_max = 8 sell_value_curve = 0.9 -display_texture = ExtResource("99_fish_placeholder") diff --git a/fishing/fishing_spot.gd b/fishing/fishing_spot.gd index fdfad53..0fdc5f7 100644 --- a/fishing/fishing_spot.gd +++ b/fishing/fishing_spot.gd @@ -41,6 +41,8 @@ const FishingSurfaceSampleType = preload( const FishingSurfaceResolverType = preload( "res://fishing/fishing_surface_resolver.gd" ) +const ArtShopStockType = preload("res://economy/art_shop_stock.gd") +const FishingShopStockType = preload("res://economy/fishing_shop_stock.gd") const WorldTimeServiceType = preload("res://world/world_time_service.gd") const WorldWeatherServiceType = preload( "res://world/world_weather_service.gd" @@ -132,7 +134,6 @@ const ALTERNATE_REEL_ACTION: StringName = &"reel_alternate" var state: FishingState = FishingState.READY var _external_input_blocked: bool = false var _gameplay_input_enabled: bool = false -var _fishing_environment_enabled: bool = true var _local_menu_input_owners: Dictionary[StringName, bool] = {} var _local_player: PlayerType var _local_inventory: FishInventoryType @@ -149,7 +150,6 @@ var _network_session: NetworkSessionType var _network_fishing: NetworkFishingServiceType var _world_time: WorldTimeServiceType var _world_weather: WorldWeatherServiceType -var _fishable_water_regions_resolver := Callable() var _active_player: PlayerType var _state_time_remaining: float = 0.0 var _cast_charge: float = 0.0 @@ -222,7 +222,6 @@ func setup( network_fishing: NetworkFishingServiceType = null, world_time: WorldTimeServiceType = null, world_weather: WorldWeatherServiceType = null, - fishable_water_regions_resolver: Callable = Callable(), ) -> void: _local_player = local_player _local_inventory = local_inventory @@ -243,7 +242,6 @@ func setup( _network_fishing = network_fishing _world_time = world_time _world_weather = world_weather - _fishable_water_regions_resolver = fishable_water_regions_resolver if ( _network_session != null and not _network_session.state_changed.is_connected( @@ -398,22 +396,6 @@ func set_gameplay_input_enabled(enabled: bool) -> void: reset_transient_state() -func set_fishing_environment_enabled(enabled: bool) -> void: - if _fishing_environment_enabled == enabled: - return - _fishing_environment_enabled = enabled - if enabled: - _new_cast_press_armed = not Input.is_action_pressed("fish_primary") - return - if _network_fishing != null and _network_fishing.has_local_attempt(): - _network_fishing.cancel_local_attempt("") - reset_transient_state() - - -func is_fishing_environment_enabled() -> bool: - return _fishing_environment_enabled - - func reset_transient_state(restore_movement: bool = true) -> void: var local_state_was_active: bool = ( state != FishingState.READY or _active_player != null @@ -548,7 +530,6 @@ func _process(delta: float) -> void: func _unhandled_input(event: InputEvent) -> void: if ( not _gameplay_input_enabled - or not _fishing_environment_enabled or _external_input_blocked or not _local_menu_input_owners.is_empty() ): @@ -561,23 +542,51 @@ func _unhandled_input(event: InputEvent) -> void: alternate_reel and state == FishingState.FIGHTING ): return - # Fishing owns the primary action only after a rod starts a cast, or while - # completing an already-active fishing sequence. An empty hand, decor, - # gathering tools, and other items must remain available to their own world - # interaction controllers. - if state == FishingState.READY and not has_active_fishing_rod(): - return # A held keyboard key emits echo events. Treat the alternate reel exactly # like a mouse button: one barrier hit per physical press, while the normal # held-input path continues driving free reeling between barriers. if event is InputEventKey and event.echo: get_viewport().set_input_as_handled() return + var selected_item: ItemDataType = _get_active_item() + if ( + state == FishingState.READY + and selected_item != null + and FishingShopStockType.is_gathering_tool(selected_item.item_id) + ): + return if event.is_pressed(): match state: FishingState.READY: if not _new_cast_press_armed: return + var active_item: ItemDataType = _get_active_item() + if ( + active_item != null + and ( + active_item.category == ItemDataType.Category.CONSUMABLE + or ( + active_item.item_id == PlayerItemEffectsType.FISH_FINDER_ID + ) + ) + ): + if _network_item_use != null: + _network_item_use.request_use(active_item.item_id) + elif _item_effects.use_item(active_item, _local_bag): + status_changed.emit(_item_effects.get_feedback( + active_item.item_id + )) + elif ( + active_item.item_id == PlayerItemEffectsType.FISH_FINDER_ID + ): + local_speech_requested.emit( + PlayerItemEffectsType.FISH_FINDER_DEAD_MESSAGE + ) + get_viewport().set_input_as_handled() + return + if not has_active_fishing_rod(): + get_viewport().set_input_as_handled() + return if ( _is_inventory_full() ): @@ -649,34 +658,6 @@ func _unhandled_input(event: InputEvent) -> void: get_viewport().set_input_as_handled() -func try_use_active_non_fishing_item() -> bool: - if ( - not _gameplay_input_enabled - or _external_input_blocked - or not _local_menu_input_owners.is_empty() - or state != FishingState.READY - ): - return false - var active_item: ItemDataType = _get_active_item() - if ( - active_item == null - or ( - active_item.category != ItemDataType.Category.CONSUMABLE - and active_item.item_id != PlayerItemEffectsType.FISH_FINDER_ID - ) - ): - return false - if _network_item_use != null: - _network_item_use.request_use(active_item.item_id) - elif _item_effects.use_item(active_item, _local_bag): - status_changed.emit(_item_effects.get_feedback(active_item.item_id)) - elif active_item.item_id == PlayerItemEffectsType.FISH_FINDER_ID: - local_speech_requested.emit( - PlayerItemEffectsType.FISH_FINDER_DEAD_MESSAGE - ) - return true - - func _is_reel_input_pressed() -> bool: return ( Input.is_action_pressed("fish_primary") @@ -684,10 +665,6 @@ func _is_reel_input_pressed() -> bool: ) -func is_reel_input_active() -> bool: - return state == FishingState.FIGHTING and _is_reel_input_pressed() - - func _begin_aiming(player: PlayerType) -> void: if state != FishingState.READY or _active_player != null: return @@ -804,10 +781,7 @@ func confirm_pending_bite() -> void: func _set_bite_confirmation_pending(is_pending: bool) -> void: if is_pending: - # The Standby deliberately pauses before the fight begins. Keep chat and - # menus available during that pause; fishing only owns input once the - # player confirms the bite and enters the actual minigame. - _set_fishing_input_priority(false) + _set_fishing_input_priority(true) if _bite_confirmation_pending == is_pending: if not is_pending: _bite_confirmation_requested = false @@ -1168,6 +1142,7 @@ func _activate_bite(confirmation_override: bool = false) -> void: ): _cancel_attempt() return + _set_fishing_input_priority(true) if ( not confirmation_override and _active_lure_has_effect(&"deferred_fight") @@ -1180,7 +1155,6 @@ func _activate_bite(confirmation_override: bool = false) -> void: _presentation.show_bite() return - _set_fishing_input_priority(true) _set_bite_confirmation_pending(false) _pending_catch = _fish_selector.create_catch(_selected_fish) if _pending_catch == null or not _pending_catch.is_valid(): @@ -1687,47 +1661,6 @@ func build_network_context( return _build_fishing_context(region) -func is_species_available_now(fish: FishDataType) -> bool: - if fish == null or not fish.is_selectable(): - return false - var season := ( - _world_time.get_season() - if _world_time != null - else CalendarSeason.UNKNOWN - ) - if not fish.is_available_in_season(season): - return false - if fish.collection_method != FishDataType.CollectionMethod.FISHING: - return true - for region: FishableWaterRegionType in _get_logbook_water_regions(): - if ( - region == null - or region.fish_pool == null - or region.fish_pool.get_fish_by_id(fish.id) == null - ): - continue - var context := _build_fishing_context(region) - if not fish.is_allowed_in_water(context.water_type): - continue - if fish.availability == null or fish.availability.is_available(context): - return true - return false - - -func _get_logbook_water_regions() -> Array[FishableWaterRegionType]: - var regions: Array[FishableWaterRegionType] = [] - if not _fishable_water_regions_resolver.is_valid(): - return regions - var resolved: Variant = _fishable_water_regions_resolver.call() - if resolved is not Array: - return regions - for value: Variant in resolved: - var region := value as FishableWaterRegionType - if region != null and is_instance_valid(region): - regions.append(region) - return regions - - func _get_active_bait_tags() -> Array[StringName]: if _local_player == null or _item_catalog == null: return [] diff --git a/fishing/remote_fishing_presentation.gd b/fishing/remote_fishing_presentation.gd index d813503..380afdf 100644 --- a/fishing/remote_fishing_presentation.gd +++ b/fishing/remote_fishing_presentation.gd @@ -57,10 +57,6 @@ func show_cast( ): return _kill_cast_tween() - # A previous attempt can finish its fighting presentation immediately before - # a replacement cast is reconstructed. Reset the owning avatar as well as our - # local bookkeeping so fighting cannot continue to outrank the release pose. - _owner.set_fighting_visual(false) _active = true _attempt_id = attempt_id _observer_fighting_active = false @@ -260,7 +256,6 @@ func _on_return_finished() -> void: _showcase_tween.tween_interval(2.5) _showcase_tween.finished.connect(_on_showcase_finished) return - _restore_owner_after_return() return_completed.emit() @@ -276,18 +271,6 @@ func _on_showcase_put_away_finished() -> void: return_completed.emit() -func _restore_owner_after_return() -> void: - # Return completion owns the transition out of the observer-only fishing - # poses. This must happen before completion listeners queue_free this node; - # otherwise an escape or withdrawal leaves RETRACT selected indefinitely and - # masks every later locomotion animation on this observer. - _observer_fighting_active = false - if _owner == null or not is_instance_valid(_owner): - return - _owner.set_fighting_visual(false) - _owner.set_fishing_visual(false) - - func _kill_cast_tween() -> void: if _cast_tween != null and _cast_tween.is_valid(): _cast_tween.kill() diff --git a/gathering/catalog/beetle_stag_common.tres b/gathering/catalog/beetle_stag_common.tres index c8b7d85..118d733 100644 --- a/gathering/catalog/beetle_stag_common.tres +++ b/gathering/catalog/beetle_stag_common.tres @@ -10,8 +10,6 @@ catch_data = ExtResource("2_catch") required_tool_id = &"crab_net" spawn_anchor_set_id = &"starter_reachable_tree_trunks" population = 3 -spawn_anchor_occupancy_ratio = 0.35 -maximum_anchor_population = 64 requires_sneaking = false movement_speed = 0.0 roam_radius = 0.1 @@ -19,7 +17,7 @@ scare_radius = 0.1 capture_radius = 0.34 interaction_range = 2.8 charge_duration = 1.0 -sprite_pixel_size = 0.0075 +sprite_pixel_size = 0.005 sprite_tilt_degrees = 0.0 capture_respawn_min_seconds = 90.0 capture_respawn_max_seconds = 150.0 diff --git a/gathering/catalog/crab_blue.tres b/gathering/catalog/crab_blue.tres index 8e19b2b..1ccabe8 100644 --- a/gathering/catalog/crab_blue.tres +++ b/gathering/catalog/crab_blue.tres @@ -10,9 +10,5 @@ catch_data = ExtResource("2_catch") required_tool_id = &"crab_net" surface_materials = Array[StringName]([&"sand"]) minimum_surface_y = -0.8 -surface_water_relation = 2 population = 4 -surface_population_per_100_square_meters = 0.4 -maximum_surface_population = 16 -sprite_pixel_size = 0.01 -sprite_surface_offset = 0.11 +sprite_pixel_size = 0.0005 diff --git a/gathering/catalog/crab_brown.tres b/gathering/catalog/crab_brown.tres index 042e3d2..83d20c8 100644 --- a/gathering/catalog/crab_brown.tres +++ b/gathering/catalog/crab_brown.tres @@ -10,18 +10,14 @@ catch_data = ExtResource("2_catch") required_tool_id = &"crab_net" surface_materials = Array[StringName]([&"sand"]) minimum_surface_y = -0.44 -surface_water_relation = 1 population = 2 -surface_population_per_100_square_meters = 0.15 -maximum_surface_population = 24 movement_speed = 0.35 roam_radius = 3.5 scare_radius = 2.8 capture_radius = 0.7 interaction_range = 2.6 charge_duration = 2.0 -sprite_pixel_size = 0.01 -sprite_surface_offset = 0.11 +sprite_pixel_size = 0.0005 sprite_tilt_degrees = -45.0 capture_respawn_min_seconds = 480.0 capture_respawn_max_seconds = 720.0 diff --git a/gathering/catalog/crab_dungeness.tres b/gathering/catalog/crab_dungeness.tres index cee4c45..12eb7a6 100644 --- a/gathering/catalog/crab_dungeness.tres +++ b/gathering/catalog/crab_dungeness.tres @@ -11,5 +11,4 @@ required_tool_id = &"crab_net" surface_materials = Array[StringName]([&"sand"]) minimum_surface_y = -0.5 population = 4 -sprite_pixel_size = 0.01 -sprite_surface_offset = 0.11 +sprite_pixel_size = 0.0005 diff --git a/gathering/catalog/crab_ghost.tres b/gathering/catalog/crab_ghost.tres index 13241da..62ce103 100644 --- a/gathering/catalog/crab_ghost.tres +++ b/gathering/catalog/crab_ghost.tres @@ -11,5 +11,4 @@ required_tool_id = &"crab_net" surface_materials = Array[StringName]([&"sand"]) minimum_surface_y = 0.08 population = 4 -sprite_pixel_size = 0.01 -sprite_surface_offset = 0.11 +sprite_pixel_size = 0.0005 diff --git a/gathering/gatherable_data.gd b/gathering/gatherable_data.gd index 608c2be..9f984cf 100644 --- a/gathering/gatherable_data.gd +++ b/gathering/gatherable_data.gd @@ -10,12 +10,6 @@ enum PresentationMode { WATER_SPURT, } -enum SurfaceWaterRelation { - ANY, - ABOVE_SALT_WATER, - BELOW_SALT_WATER, -} - @export var type_id: StringName @export var catch_data: FishDataType @export var required_tool_id: StringName @@ -23,20 +17,7 @@ enum SurfaceWaterRelation { @export var diggable_area_id: StringName @export var spawn_anchor_set_id: StringName @export_range(-100.0, 100.0, 0.01) var minimum_surface_y: float = 0.08 -@export_range(-100.0, 100.0, 0.01) var maximum_surface_y: float = 100.0 -@export var surface_water_relation := SurfaceWaterRelation.ANY -@export_range(0.0, 2.0, 0.01) var waterline_margin: float = 0.01 @export_range(0, 64, 1) var population: int = 0 -## Anchored gatherables can scale with authored/generated attachment geometry. -## Zero preserves the fixed population above. -@export_range(0.0, 1.0, 0.01) var spawn_anchor_occupancy_ratio := 0.0 -## Zero leaves the anchor count as the only ceiling. -@export_range(0, 256, 1) var maximum_anchor_population := 0 -## Optional density scaling for large generated surfaces. The authored -## population remains the minimum while the maximum keeps large maps bounded. -@export_range(0.0, 8.0, 0.01) -var surface_population_per_100_square_meters := 0.0 -@export_range(0, 256, 1) var maximum_surface_population := 0 @export var presentation_mode: PresentationMode = PresentationMode.VISIBLE_CREATURE @export var requires_sneaking: bool = true @export_range(0.0, 120.0, 0.1) var active_lifetime_seconds: float = 0.0 @@ -61,7 +42,6 @@ var surface_population_per_100_square_meters := 0.0 @export_range(0.1, 10.0, 0.05) var interaction_range: float = 2.6 @export_range(0.1, 10.0, 0.05) var charge_duration: float = 2.0 @export_range(0.0001, 0.01, 0.00005) var sprite_pixel_size: float = 0.001 -@export_range(-2.0, 2.0, 0.01) var sprite_surface_offset: float = 0.11 @export_range(-90.0, 90.0, 1.0) var sprite_tilt_degrees: float = -45.0 @export_category("Respawn Budget") @export_range(0.0, 3600.0, 1.0) var capture_respawn_min_seconds: float = 480.0 @@ -92,21 +72,12 @@ func is_valid() -> bool: or uses_spawn_anchors or not surface_materials.is_empty() ) - and maximum_surface_y >= minimum_surface_y and ( not uses_diggable_area or catch_data.collection_method == FishDataType.CollectionMethod.DIGGING ) and population > 0 - and ( - maximum_anchor_population == 0 - or maximum_anchor_population >= population - ) - and ( - maximum_surface_population == 0 - or maximum_surface_population >= population - ) and movement_parameters_valid and _quality_multipliers_are_valid( quality_movement_speed_multipliers @@ -118,7 +89,6 @@ func is_valid() -> bool: and interaction_range > 0.0 and charge_duration > 0.0 and sprite_pixel_size > 0.0 - and is_finite(sprite_surface_offset) and capture_respawn_max_seconds >= capture_respawn_min_seconds and scare_respawn_max_seconds >= scare_respawn_min_seconds ) @@ -132,39 +102,6 @@ func is_stationary_spawn() -> bool: return is_stationary_hotspot() or not spawn_anchor_set_id.is_empty() -func target_population_for_anchor_count(anchor_count: int) -> int: - if spawn_anchor_set_id.is_empty() or spawn_anchor_occupancy_ratio <= 0.0: - return population - if anchor_count <= 0: - return 0 - var target := maxi( - population, - ceili(float(anchor_count) * spawn_anchor_occupancy_ratio), - ) - target = mini(target, anchor_count) - if maximum_anchor_population > 0: - target = mini(target, maximum_anchor_population) - return target - - -func target_population_for_surface_area(surface_area: float) -> int: - if surface_population_per_100_square_meters <= 0.0: - return population - if surface_area <= 0.0: - return 0 - var target := maxi( - population, - ceili( - surface_area - * surface_population_per_100_square_meters - / 100.0 - ), - ) - if maximum_surface_population > 0: - target = mini(target, maximum_surface_population) - return target - - func can_be_scared() -> bool: return not is_stationary_spawn() and scare_radius > 0.0 diff --git a/gathering/gathering_controller.gd b/gathering/gathering_controller.gd index 36aa2d5..2859145 100644 --- a/gathering/gathering_controller.gd +++ b/gathering/gathering_controller.gd @@ -262,10 +262,10 @@ func _cast_marker_ray(from: Vector3, to: Vector3) -> Dictionary: func _apply_marker_surface(hit: Dictionary, facing: Vector3) -> bool: if hit.is_empty(): return false - var surface_position: Variant = hit.get("position") + var position: Variant = hit.get("position") var normal_value: Variant = hit.get("normal") if ( - typeof(surface_position) != TYPE_VECTOR3 + typeof(position) != TYPE_VECTOR3 or typeof(normal_value) != TYPE_VECTOR3 ): return false @@ -274,7 +274,7 @@ func _apply_marker_surface(hit: Dictionary, facing: Vector3) -> bool: return false surface_normal = surface_normal.normalized() _marker_position = ( - (surface_position as Vector3) + surface_normal * marker_surface_offset + (position as Vector3) + surface_normal * marker_surface_offset ) _marker.global_position = _marker_position _marker.global_basis = marker_basis_for_surface(surface_normal, facing) @@ -341,12 +341,10 @@ func _build_marker() -> void: _marker_invalid_material.albedo_color = MARKER_INVALID_COLOR _marker_invalid_material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED _marker_invalid_material.roughness = 1.0 - _marker_invalid_material.no_depth_test = true _marker_valid_material = StandardMaterial3D.new() _marker_valid_material.albedo_color = MARKER_VALID_COLOR _marker_valid_material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED _marker_valid_material.roughness = 1.0 - _marker_valid_material.no_depth_test = true var disc := CylinderMesh.new() disc.top_radius = marker_radius disc.bottom_radius = marker_radius diff --git a/gathering/world_gatherable.gd b/gathering/world_gatherable.gd index 3a2219d..8a07ba0 100644 --- a/gathering/world_gatherable.gd +++ b/gathering/world_gatherable.gd @@ -2,6 +2,8 @@ class_name WorldGatherable extends Node3D const GatherableDataType = preload("res://gathering/gatherable_data.gd") +const REFERENCE_SPRITE_PIXEL_SIZE: float = 0.001 +const REFERENCE_SPRITE_HEIGHT: float = 0.22 const WATER_SPURT_INTERVAL_SECONDS: float = 1.15 const WATER_SPURT_COLOR := Color(0.48, 0.82, 0.84, 1.0) const WATER_SPURT_HOLE_COLOR := Color(0.23, 0.27, 0.24, 1.0) @@ -21,22 +23,18 @@ var _despawning: bool = false func configure( configured_entity_id: String, configured_data: GatherableDataType, - network_position: Vector3, + position: Vector3, yaw: float, ) -> void: entity_id = configured_entity_id data = configured_data type_id = data.type_id if data != null else StringName() - # Establish the authoritative transform before constructing transient visuals. - # Effects emitted before this point would begin at the default world origin. - apply_network_state(network_position, yaw, true) if data != null and data.is_stationary_hotspot(): _ensure_water_spurt_visual() _water_spurt_elapsed = ( float(abs(hash(entity_id)) % 1000) / 1000.0 * WATER_SPURT_INTERVAL_SECONDS ) - _emit_water_spurt() else: _ensure_visual() if data != null and data.catch_data != null and _sprite != null: @@ -45,22 +43,27 @@ func configure( _sprite.position.y = ( 0.0 if not data.spawn_anchor_set_id.is_empty() - else data.sprite_surface_offset + else ( + REFERENCE_SPRITE_HEIGHT + * data.sprite_pixel_size + / REFERENCE_SPRITE_PIXEL_SIZE + ) ) _sprite.rotation_degrees.x = data.sprite_tilt_degrees + apply_network_state(position, yaw, true) func apply_network_state( - network_position: Vector3, + position: Vector3, yaw: float, immediate: bool = false, ) -> void: - if _despawning or not network_position.is_finite() or not is_finite(yaw): + if _despawning or not position.is_finite() or not is_finite(yaw): return - _target_position = network_position + _target_position = position _target_yaw = yaw if immediate or not _has_state: - global_position = network_position + global_position = position rotation.y = yaw _has_state = true @@ -112,6 +115,7 @@ func _ensure_visual() -> void: return _sprite = Sprite3D.new() _sprite.name = "GatherableSprite" + _sprite.position.y = REFERENCE_SPRITE_HEIGHT _sprite.shaded = false _sprite.double_sided = true _sprite.billboard = BaseMaterial3D.BILLBOARD_ENABLED @@ -143,6 +147,7 @@ func _ensure_water_spurt_visual() -> void: hole.mesh = hole_mesh hole.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF _water_spurt_root.add_child(hole) + _emit_water_spurt() func _emit_water_spurt() -> void: @@ -154,7 +159,6 @@ func _emit_water_spurt() -> void: particles.amount = 6 particles.lifetime = 0.42 particles.one_shot = true - particles.local_coords = true particles.explosiveness = 1.0 particles.direction = Vector3.UP particles.spread = 32.0 diff --git a/homes/assets/starter_motorcoach.glb b/homes/assets/starter_motorcoach.glb deleted file mode 100644 index becd54e..0000000 Binary files a/homes/assets/starter_motorcoach.glb and /dev/null differ diff --git a/homes/assets/starter_motorcoach.glb.import b/homes/assets/starter_motorcoach.glb.import deleted file mode 100644 index 5cba35b..0000000 --- a/homes/assets/starter_motorcoach.glb.import +++ /dev/null @@ -1,45 +0,0 @@ -[remap] - -importer="scene" -importer_version=1 -type="PackedScene" -uid="uid://bhph22caipcj6" -path="res://.godot/imported/starter_motorcoach.glb-153681ef1e622a556fba4df576dc6f84.scn" - -[deps] - -source_file="res://homes/assets/starter_motorcoach.glb" -dest_files=["res://.godot/imported/starter_motorcoach.glb-153681ef1e622a556fba4df576dc6f84.scn"] - -[params] - -nodes/root_type="" -nodes/root_name="" -nodes/root_script=null -mesh_library/use_node_names_as_mesh_names=false -array_mesh/deduplicate_surfaces=true -nodes/apply_root_scale=true -nodes/root_scale=1.0 -nodes/import_as_skeleton_bones=false -nodes/use_name_suffixes=true -nodes/use_node_type_suffixes=true -meshes/ensure_tangents=true -meshes/generate_lods=true -meshes/create_shadow_meshes=true -meshes/light_baking=1 -meshes/lightmap_texel_size=0.2 -meshes/force_disable_compression=false -skins/use_named_skins=true -animation/import=true -animation/fps=30 -animation/trimming=false -animation/remove_immutable_tracks=true -animation/import_rest_as_RESET=false -import_script/path="" -materials/extract=0 -materials/extract_format=0 -materials/extract_path="" -_subresources={} -gltf/naming_version=2 -gltf/embedded_image_handling=1 -gltf/texture_map_mode=1 diff --git a/homes/assets/starter_rv_interior.glb b/homes/assets/starter_rv_interior.glb deleted file mode 100644 index 21608ea..0000000 Binary files a/homes/assets/starter_rv_interior.glb and /dev/null differ diff --git a/homes/assets/starter_rv_interior.glb.import b/homes/assets/starter_rv_interior.glb.import deleted file mode 100644 index 947870a..0000000 --- a/homes/assets/starter_rv_interior.glb.import +++ /dev/null @@ -1,45 +0,0 @@ -[remap] - -importer="scene" -importer_version=1 -type="PackedScene" -uid="uid://b815y7svs3ern" -path="res://.godot/imported/starter_rv_interior.glb-9ad8a345e9e831e82874b4b276341224.scn" - -[deps] - -source_file="res://homes/assets/starter_rv_interior.glb" -dest_files=["res://.godot/imported/starter_rv_interior.glb-9ad8a345e9e831e82874b4b276341224.scn"] - -[params] - -nodes/root_type="" -nodes/root_name="" -nodes/root_script=null -mesh_library/use_node_names_as_mesh_names=false -array_mesh/deduplicate_surfaces=true -nodes/apply_root_scale=true -nodes/root_scale=1.0 -nodes/import_as_skeleton_bones=false -nodes/use_name_suffixes=true -nodes/use_node_type_suffixes=true -meshes/ensure_tangents=true -meshes/generate_lods=true -meshes/create_shadow_meshes=true -meshes/light_baking=1 -meshes/lightmap_texel_size=0.2 -meshes/force_disable_compression=false -skins/use_named_skins=true -animation/import=true -animation/fps=30 -animation/trimming=false -animation/remove_immutable_tracks=true -animation/import_rest_as_RESET=false -import_script/path="" -materials/extract=0 -materials/extract_format=0 -materials/extract_path="" -_subresources={} -gltf/naming_version=2 -gltf/embedded_image_handling=1 -gltf/texture_map_mode=1 diff --git a/homes/assets/tent_interior.glb b/homes/assets/tent_interior.glb deleted file mode 100644 index 3ba2b76..0000000 Binary files a/homes/assets/tent_interior.glb and /dev/null differ diff --git a/homes/assets/tent_interior.glb.import b/homes/assets/tent_interior.glb.import deleted file mode 100644 index fc01ba7..0000000 --- a/homes/assets/tent_interior.glb.import +++ /dev/null @@ -1,45 +0,0 @@ -[remap] - -importer="scene" -importer_version=1 -type="PackedScene" -uid="uid://dkfqs051shmxe" -path="res://.godot/imported/tent_interior.glb-576cc47c2c633f7ae635651598663518.scn" - -[deps] - -source_file="res://homes/assets/tent_interior.glb" -dest_files=["res://.godot/imported/tent_interior.glb-576cc47c2c633f7ae635651598663518.scn"] - -[params] - -nodes/root_type="" -nodes/root_name="" -nodes/root_script=null -mesh_library/use_node_names_as_mesh_names=false -array_mesh/deduplicate_surfaces=true -nodes/apply_root_scale=true -nodes/root_scale=1.0 -nodes/import_as_skeleton_bones=false -nodes/use_name_suffixes=true -nodes/use_node_type_suffixes=true -meshes/ensure_tangents=true -meshes/generate_lods=true -meshes/create_shadow_meshes=true -meshes/light_baking=1 -meshes/lightmap_texel_size=0.2 -meshes/force_disable_compression=false -skins/use_named_skins=true -animation/import=true -animation/fps=30 -animation/trimming=false -animation/remove_immutable_tracks=true -animation/import_rest_as_RESET=false -import_script/path="" -materials/extract=0 -materials/extract_format=0 -materials/extract_path="" -_subresources={} -gltf/naming_version=2 -gltf/embedded_image_handling=1 -gltf/texture_map_mode=1 diff --git a/homes/decor_catalog.gd b/homes/decor_catalog.gd deleted file mode 100644 index 14e5e29..0000000 --- a/homes/decor_catalog.gd +++ /dev/null @@ -1,59 +0,0 @@ -class_name DecorCatalog -extends RefCounted - -const BASIC_CUBE_ID: StringName = &"basic_cube" -const MAX_OWNED_PER_PRODUCT: int = 32 - -const _PRODUCTS: Dictionary = { - BASIC_CUBE_ID: { - "display_name": "basic cube", - "description": "a simple piece of decor for testing your RV layout.", - "price": 1, - "footprint": Vector2(1.0, 0.8), - "height": 0.8, - }, -} - - -static func get_product_ids() -> Array[StringName]: - var ids: Array[StringName] = [] - for value: Variant in _PRODUCTS.keys(): - ids.append(StringName(str(value))) - ids.sort_custom(func(first: StringName, second: StringName) -> bool: - return String(first) < String(second) - ) - return ids - - -static func has_product(product_id: StringName) -> bool: - return _PRODUCTS.has(product_id) - - -static func get_product(product_id: StringName) -> Dictionary: - var value: Variant = _PRODUCTS.get(product_id) - return ( - (value as Dictionary).duplicate(true) - if typeof(value) == TYPE_DICTIONARY - else {} - ) - - -static func get_display_name(product_id: StringName) -> String: - return str(get_product(product_id).get("display_name", product_id)) - - -static func get_description(product_id: StringName) -> String: - return str(get_product(product_id).get("description", "")) - - -static func get_price(product_id: StringName) -> int: - return int(get_product(product_id).get("price", -1)) - - -static func get_footprint(product_id: StringName) -> Vector2: - var value: Variant = get_product(product_id).get("footprint", Vector2.ZERO) - return value as Vector2 if value is Vector2 else Vector2.ZERO - - -static func get_height(product_id: StringName) -> float: - return float(get_product(product_id).get("height", 0.0)) diff --git a/homes/decor_catalog.gd.uid b/homes/decor_catalog.gd.uid deleted file mode 100644 index 10d2530..0000000 --- a/homes/decor_catalog.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bvgwmexas2gps diff --git a/homes/home_decor_controller.gd b/homes/home_decor_controller.gd deleted file mode 100644 index 380bdae..0000000 --- a/homes/home_decor_controller.gd +++ /dev/null @@ -1,516 +0,0 @@ -class_name HomeDecorController -extends Node - -signal exit_requested - -const DecorCatalogType = preload("res://homes/decor_catalog.gd") -const DRAG_RESPONSE: float = 22.0 -const DRAG_POSITION_EPSILON: float = 0.005 - -var _player: Player -var _hotbar: PlayerHotbar -var _bag: PlayerBag -var _home_state: PlayerHomeState -var _network_home: NetworkHomeService -var _home_world: HomeWorldService -var _fishing_spot: FishingSpot -var _toolbar: HomeDecorToolbar -var _mode: PlayerHomeState.PlacementMode = PlayerHomeState.PlacementMode.GRID -var _selected_instance_id: String = "" -var _drag_instance_id: String = "" -var _drag_owner_fingerprint: String = "" -var _drag_pointer_offset: Vector3 = Vector3.ZERO -var _drag_original_position: Vector3 = Vector3.ZERO -var _drag_original_yaw: float = 0.0 -var _drag_target_position: Vector3 = Vector3.ZERO -var _drag_target_yaw: float = 0.0 -var _drag_target_valid: bool = false - - -func setup( - player: Player, - hotbar: PlayerHotbar, - bag: PlayerBag, - home_state: PlayerHomeState, - network_home: NetworkHomeService, - home_world: HomeWorldService, - fishing_spot: FishingSpot, - toolbar: HomeDecorToolbar, -) -> void: - _player = player - _hotbar = hotbar - _bag = bag - _home_state = home_state - _network_home = network_home - _home_world = home_world - _fishing_spot = fishing_spot - _toolbar = toolbar - if not _network_home.local_space_changed.is_connected( - _on_local_space_changed - ): - _network_home.local_space_changed.connect(_on_local_space_changed) - if not _network_home.local_manifest_rejected.is_connected( - _on_local_manifest_rejected - ): - _network_home.local_manifest_rejected.connect( - _on_local_manifest_rejected - ) - if not _home_state.changed.is_connected(_on_home_changed): - _home_state.changed.connect(_on_home_changed) - if not _toolbar.placement_mode_requested.is_connected( - _on_placement_mode_requested - ): - _toolbar.placement_mode_requested.connect( - _on_placement_mode_requested - ) - _toolbar.rotate_requested.connect(_rotate_selected) - _toolbar.store_requested.connect(_store_selected) - _toolbar.cancel_requested.connect(_clear_selection) - if not _toolbar.exit_requested.is_connected(exit_requested.emit): - _toolbar.exit_requested.connect(exit_requested.emit) - _toolbar.set_mode(_mode) - _refresh_toolbar() - - -func begin_decorating() -> void: - _refresh_toolbar() - if _toolbar.visible: - _toolbar.report_status( - "use held decor to place it; click or drag placed decor" - ) - - -func _input(event: InputEvent) -> void: - if _drag_instance_id.is_empty(): - return - var pointer_motion := event as InputEventMouseMotion - if pointer_motion != null: - _update_drag(pointer_motion.position) - get_viewport().set_input_as_handled() - return - var pointer_button := event as InputEventMouseButton - if ( - pointer_button != null - and pointer_button.button_index == MOUSE_BUTTON_LEFT - and not pointer_button.pressed - ): - # A gameplay menu can take ownership between the press and release. Do - # not let that release finalize decor behind the menu; preserve the - # original transform instead. - if _can_decorate(): - _finish_drag() - else: - _cancel_drag() - get_viewport().set_input_as_handled() - - -func _unhandled_input(event: InputEvent) -> void: - var pointer_button := event as InputEventMouseButton - if ( - pointer_button != null - and pointer_button.button_index == MOUSE_BUTTON_LEFT - ): - if not pointer_button.pressed or not _can_decorate(): - return - if _begin_drag(pointer_button.position): - get_viewport().set_input_as_handled() - return - var pointer_decor_id: StringName = _get_selected_decor_id() - if ( - not pointer_decor_id.is_empty() - and _bag.get_quantity(pointer_decor_id) > 0 - ): - _place_carried_decor(pointer_decor_id) - get_viewport().set_input_as_handled() - return - if not _can_decorate() or not event.is_action_pressed("fish_primary"): - return - if event is InputEventKey and event.echo: - return - var decor_id: StringName = _get_selected_decor_id() - if not decor_id.is_empty() and _bag.get_quantity(decor_id) > 0: - _place_carried_decor(decor_id) - get_viewport().set_input_as_handled() - - -func _process(delta: float) -> void: - if _toolbar != null and _toolbar.visible: - _toolbar.set_interactive(_can_decorate()) - if _drag_instance_id.is_empty(): - return - # Menus and other gameplay input handoffs must cancel an active drag before - # evaluating a held/released pointer. This prevents a same-frame TAB press - # followed by left-button release from committing a move behind the UI. - if not _can_decorate(): - _cancel_drag() - return - if not Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): - _finish_drag() - return - if not _drag_target_valid: - return - var current: Dictionary = _home_world.get_decor_preview_transform( - _drag_owner_fingerprint, _drag_instance_id - ) - if current.is_empty(): - _cancel_drag() - return - var current_position: Vector3 = current["position"] - var current_yaw: float = float(current["yaw"]) - var blend: float = 1.0 - exp(-DRAG_RESPONSE * delta) - _home_world.set_decor_preview_transform( - _drag_owner_fingerprint, - _drag_instance_id, - current_position.lerp(_drag_target_position, blend), - lerp_angle(current_yaw, _drag_target_yaw, blend), - ) - - -func _begin_drag(screen_position: Vector2) -> bool: - if _network_home.has_pending_local_decor_mutation(): - _toolbar.report_status("waiting for the previous decor update") - return false - var owner_fingerprint: String = ( - _network_home.get_local_home_owner_fingerprint() - ) - var camera: Camera3D = _player.get_active_gameplay_camera() - var clicked_instance: String = _home_world.find_decor_instance_at_screen( - owner_fingerprint, camera, screen_position - ) - if clicked_instance.is_empty(): - return false - var placement: Dictionary = _home_state.get_placement(clicked_instance) - if placement.is_empty(): - return false - var original_position: Vector3 = _placement_position(placement) - if not original_position.is_finite(): - return false - if not _home_world.set_decor_manipulation_active( - owner_fingerprint, clicked_instance, true - ): - return false - var pointer_position: Vector3 = _home_world.get_floor_position_from_screen( - owner_fingerprint, camera, screen_position - ) - _drag_instance_id = clicked_instance - _drag_owner_fingerprint = owner_fingerprint - _drag_original_position = original_position - _drag_original_yaw = float(placement.get("yaw", 0.0)) - _drag_target_position = original_position - _drag_target_yaw = _drag_original_yaw - _drag_target_valid = true - _drag_pointer_offset = ( - original_position - pointer_position - if pointer_position.is_finite() - else Vector3.ZERO - ) - _drag_pointer_offset.y = 0.0 - _select_instance(clicked_instance) - _toolbar.report_status("drag decor, then release to place it") - return true - - -func _update_drag(screen_position: Vector2) -> void: - if not _can_decorate(): - _cancel_drag() - return - var camera: Camera3D = _player.get_active_gameplay_camera() - var pointer_position: Vector3 = _home_world.get_floor_position_from_screen( - _drag_owner_fingerprint, camera, screen_position - ) - if not pointer_position.is_finite(): - # Keep the most recent valid target when the pointer briefly leaves the - # RV floor. Releasing there should place at that target, not throw the - # decor all the way back to where the drag began. - _toolbar.report_status("keep the pointer over the RV floor") - return - var placement: Dictionary = _home_state.get_placement(_drag_instance_id) - if placement.is_empty(): - _clear_selection() - return - var candidate: Vector3 = pointer_position + _drag_pointer_offset - candidate.y = 0.0 - var normalized: Dictionary = _network_home.get_valid_local_decor_transform( - _drag_instance_id, - candidate, - float(placement.get("yaw", _drag_original_yaw)), - _mode, - ) - if normalized.is_empty(): - # A densely furnished area may have no nearby solution. Preserve the - # last valid preview so the interaction remains stable while the player - # moves the pointer toward open space. - _toolbar.report_status("holding at the nearest available position") - return - _drag_target_position = normalized["position"] - _drag_target_yaw = float(normalized["yaw"]) - _drag_target_valid = true - _toolbar.report_status("release to place decor") - - -func _finish_drag() -> void: - var instance_id: String = _drag_instance_id - var owner_fingerprint: String = _drag_owner_fingerprint - var original_position: Vector3 = _drag_original_position - var original_yaw: float = _drag_original_yaw - var target_position: Vector3 = _drag_target_position - var target_yaw: float = _drag_target_yaw - var target_valid: bool = _drag_target_valid - var placement: Dictionary = _home_state.get_placement(instance_id) - var decor_id := StringName(str(placement.get("decor_id", ""))) - if ( - not target_valid - or decor_id.is_empty() - or not _home_world.is_decor_placement_clear_of_players( - owner_fingerprint, decor_id, target_position, target_yaw - ) - ): - _home_world.set_decor_preview_transform( - owner_fingerprint, - instance_id, - original_position, - original_yaw, - ) - _home_world.set_decor_manipulation_active( - owner_fingerprint, instance_id, false - ) - _reset_drag_state() - _toolbar.report_status( - "a player is in the way" - if target_valid - else "that space is not available" - ) - return - _home_world.set_decor_preview_transform( - owner_fingerprint, instance_id, target_position, target_yaw - ) - if ( - original_position.distance_to(target_position) - <= DRAG_POSITION_EPSILON - and is_zero_approx(angle_difference(original_yaw, target_yaw)) - ): - _home_world.set_decor_manipulation_active( - owner_fingerprint, instance_id, false - ) - _reset_drag_state() - _select_instance(instance_id) - return - if _network_home.update_local_decor( - instance_id, target_position, target_yaw, _mode - ): - _home_world.set_decor_manipulation_active( - owner_fingerprint, instance_id, false - ) - _reset_drag_state() - _toolbar.report_status("decor moved") - return - _home_world.set_decor_preview_transform( - owner_fingerprint, - instance_id, - original_position, - original_yaw, - ) - _home_world.set_decor_manipulation_active( - owner_fingerprint, instance_id, false - ) - _reset_drag_state() - _toolbar.report_status("that space is not available") - - -func _cancel_drag() -> void: - if _drag_instance_id.is_empty(): - return - _home_world.set_decor_preview_transform( - _drag_owner_fingerprint, - _drag_instance_id, - _drag_original_position, - _drag_original_yaw, - ) - _home_world.set_decor_manipulation_active( - _drag_owner_fingerprint, _drag_instance_id, false - ) - _reset_drag_state() - - -func _reset_drag_state() -> void: - _drag_instance_id = "" - _drag_owner_fingerprint = "" - _drag_pointer_offset = Vector3.ZERO - _drag_original_position = Vector3.ZERO - _drag_original_yaw = 0.0 - _drag_target_position = Vector3.ZERO - _drag_target_yaw = 0.0 - _drag_target_valid = false - - -static func _placement_position(placement: Dictionary) -> Vector3: - if placement.is_empty(): - return Vector3.INF - var values: Array = placement.get("position", []) - if values.size() != 3: - return Vector3.INF - return Vector3( - float(values[0]), float(values[1]), float(values[2]) - ) - - -func _place_carried_decor(decor_id: StringName) -> void: - if _network_home.has_pending_local_decor_mutation(): - _toolbar.report_status("waiting for the previous decor update") - return - var owner_fingerprint: String = ( - _network_home.get_local_home_owner_fingerprint() - ) - # RV transitions keep the gameplay root axis-aligned so its transform can be - # synchronized independently from the presentation. Use the visual facing - # direction instead; otherwise carried decor is always placed along world -Z - # instead of in front of the character the player sees. - var forward: Vector3 = _player.get_facing_direction() - var global_position: Vector3 = _player.global_position + forward * 1.45 - var local_position: Vector3 = _home_world.interior_global_to_local( - owner_fingerprint, global_position - ) - var placement_yaw: float = atan2(-forward.x, -forward.z) - var instance_id: String = _network_home.place_local_decor( - decor_id, local_position, placement_yaw, _mode - ) - if instance_id.is_empty(): - _toolbar.report_status("make room in front of you to place this decor") - return - # A local host can reject its own optimistic manifest synchronously. Do not - # claim success after that rollback or leave the player looking for decor that - # was never accepted into the room. - if _home_state.get_placement(instance_id).is_empty(): - _toolbar.report_status("decor placement was not accepted") - return - _select_instance(instance_id) - _toolbar.report_status("decor placed") - - -func _select_instance(instance_id: String) -> void: - var placement: Dictionary = _home_state.get_placement(instance_id) - if placement.is_empty(): - _clear_selection() - return - _selected_instance_id = instance_id - var decor_id := StringName(str(placement.get("decor_id", ""))) - _toolbar.set_selection( - instance_id, DecorCatalogType.get_display_name(decor_id) - ) - - -func _rotate_selected() -> void: - if not _can_decorate() or _selected_instance_id.is_empty(): - return - if _network_home.has_pending_local_decor_mutation(): - _toolbar.report_status("waiting for the previous decor update") - return - var placement: Dictionary = _home_state.get_placement( - _selected_instance_id - ) - if placement.is_empty(): - _clear_selection() - return - var values: Array = placement.get("position", []) - if values.size() != 3: - return - var position := Vector3( - float(values[0]), float(values[1]), float(values[2]) - ) - if _network_home.update_local_decor( - _selected_instance_id, - position, - float(placement.get("yaw", 0.0)) + PI * 0.5, - _mode, - ): - _toolbar.report_status("decor rotated") - else: - _toolbar.report_status("not enough room to rotate here") - - -func _store_selected() -> void: - if _selected_instance_id.is_empty(): - return - if _network_home.has_pending_local_decor_mutation(): - _toolbar.report_status("waiting for the previous decor update") - return - if _network_home.remove_local_decor(_selected_instance_id): - _clear_selection() - _toolbar.report_status("decor packed into storage") - else: - _toolbar.report_status("inventory and storage are full") - - -func _clear_selection() -> void: - _cancel_drag() - _selected_instance_id = "" - if _toolbar != null: - _toolbar.set_selection("") - - -func _on_placement_mode_requested(mode: int) -> void: - _mode = mode as PlayerHomeState.PlacementMode - - -func _on_local_space_changed( - _space_id: StringName, - _owner_fingerprint: String, -) -> void: - _clear_selection() - _refresh_toolbar() - - -func _on_local_manifest_rejected(message: String) -> void: - _clear_selection() - if _toolbar != null and _toolbar.visible: - _toolbar.report_status(message) - - -func _on_home_changed() -> void: - if ( - not _selected_instance_id.is_empty() - and _home_state.get_placement(_selected_instance_id).is_empty() - ): - _clear_selection() - _refresh_toolbar() - - -func _refresh_toolbar() -> void: - if _toolbar == null: - return - var inside_home: bool = _is_inside_home_space() - _toolbar.set_active(inside_home) - _toolbar.set_interactive(_can_decorate()) - if not _toolbar.visible: - _clear_selection() - elif not _can_decorate(): - _toolbar.report_status("decor tools pause while another menu is open") - - -func _is_inside_home_space() -> bool: - return ( - _network_home != null - and String(_network_home.get_local_space()).begins_with("rv:") - ) - - -func _can_decorate() -> bool: - return ( - _player != null - and _network_home != null - and _network_home.can_local_decorate() - and _fishing_spot != null - and _fishing_spot.can_open_fishing_shop() - and _player.is_movement_enabled() - ) - - -func _get_selected_decor_id() -> StringName: - if ( - _hotbar == null - or _hotbar.get_selected_assignment_kind() - != PlayerHotbar.AssignmentKind.ITEM - ): - return StringName() - var item_id: StringName = _hotbar.get_selected_item_id() - return item_id if DecorCatalogType.has_product(item_id) else StringName() diff --git a/homes/home_decor_controller.gd.uid b/homes/home_decor_controller.gd.uid deleted file mode 100644 index 1778125..0000000 --- a/homes/home_decor_controller.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b5j0mqcvhmi54 diff --git a/homes/home_world_service.gd b/homes/home_world_service.gd deleted file mode 100644 index 1309339..0000000 --- a/homes/home_world_service.gd +++ /dev/null @@ -1,1575 +0,0 @@ -class_name HomeWorldService -extends Node3D - -const NetworkHomeProtocolType = preload( - "res://network/network_home_protocol.gd" -) -const PlayerHomeStateType = preload("res://homes/player_home_state.gd") -const DecorCatalogType = preload("res://homes/decor_catalog.gd") -const STARTER_MOTORCOACH_SCENE: PackedScene = preload( - "res://homes/assets/starter_motorcoach.glb" -) -const TENT_INTERIOR_SCENE: PackedScene = preload( - "res://homes/assets/tent_interior.glb" -) -const STARTER_RV_INTERIOR_SCENE: PackedScene = preload( - "res://homes/assets/starter_rv_interior.glb" -) -const HOME_PROMPT_FONT: Font = preload("res://ui/fonts/Tuffy_Bold.otf") - -const RV_EXTERIOR_BODY_SIZE := Vector3(11.2, 5.0, 4.7) -const RV_EXTERIOR_BODY_CENTER_Y: float = 2.7 -const RV_EXTERIOR_DOOR_LOCAL := Vector3(-0.4, 1.7, 2.96) -const RV_EXTERIOR_SPAWN_LOCAL := Vector3(-0.4, 0.25, 3.95) -const TENT_EXTERIOR_BODY_SIZE := Vector3(4.6, 3.0, 4.6) -const TENT_EXTERIOR_BODY_CENTER_Y: float = 1.5 -const TENT_EXTERIOR_DOOR_LOCAL := Vector3(0.0, 1.0, 2.3) -const TENT_EXTERIOR_SPAWN_LOCAL := Vector3(0.0, 0.25, 3.3) -const RV_EXTERIOR_PROMPT_LOCAL := Vector3(-0.4, 3.72, 3.02) -const TENT_EXTERIOR_PROMPT_LOCAL := Vector3(0.0, 2.48, 2.36) -const HOME_PROMPT_SIZE := Vector2(0.95, 0.28) -const HOME_PROMPT_CORNER_RADIUS: float = 0.08 -const HOME_PROMPT_TEXT_PIXEL_SIZE: float = 0.0045 -const HOME_PROMPT_TEXT_COLOR := Color("c3dfe6") -const HOME_PROMPT_BACKGROUND_COLOR := Color("0a2d3a") -const EXTERIOR_INTERACTION_DISTANCE: float = 2.7 -const INTERIOR_EXIT_DISTANCE: float = 2.1 -const INTERIOR_ORIGIN := Vector3(1000.0, 300.0, 1000.0) -const INTERIOR_SPACING: float = 14.0 -const INTERIOR_MAX_SPAWN_SLOTS: int = 64 -const TENT_INTERIOR_SIZE := Vector2(4.0, 4.0) -const STARTER_RV_INTERIOR_SIZE := Vector2(4.0, 6.0) -const STARTER_RV_EXIT_LOCAL_X: float = 1.45 -const INTERIOR_EXIT_LOCAL_Y: float = 0.35 -const INTERIOR_EXIT_DOORWAY_HALF_WIDTH: float = 0.48 -const INTERIOR_EXIT_TRIGGER_DEPTH: float = 0.45 -const INTERIOR_SHELL_COLLISION_META: StringName = ( - &"home_interior_shell_collision" -) -const MIN_EXTERIOR_TRIANGLE_AREA: float = 1.0 -const MIN_EXTERIOR_SEPARATION: float = 14.6 -const EXTERIOR_FOOTPRINT_HALF_EXTENTS := Vector2(6.65, 3.73) -const EXTERIOR_SURFACE_INDEX_CELL_SIZE: float = 5.0 -const EXTERIOR_MAX_SURFACE_HEIGHT_DELTA: float = 0.24 -const EXTERIOR_CLEARANCE_HEIGHT: float = 5.5 -const WORLD_GEOMETRY_COLLISION_LAYER: int = 1 -const DECOR_SELECTION_COLLISION_LAYER: int = 1 << 8 -# Includes the player's 0.45 m capsule radius plus enough movement margin for -# a full low-tick-rate frame before a newly solid placement can be reached. -const PLAYER_DECOR_CLEARANCE_RADIUS: float = 0.8 -const BASIC_CUBE_SIZE := Vector3(1.0, 0.8, 0.8) - -var _world: TestWorld -var _spawn_service: PlayerSpawnService -var _session: NetworkSession -var _dedicated_runtime: bool = false -var _exteriors_root: Node3D -var _interiors_root: Node3D -var _presentations_by_fingerprint: Dictionary[String, Dictionary] = {} -var _local_space: StringName = NetworkHomeProtocolType.WORLD_SPACE -var _decor_under_manipulation: Dictionary[String, bool] = {} -var _pending_solid_decor: Dictionary[String, Dictionary] = {} - - -func setup( - world: TestWorld, - spawn_service: PlayerSpawnService, - session: NetworkSession, - dedicated_runtime: bool, -) -> void: - _world = world - _spawn_service = spawn_service - _session = session - _dedicated_runtime = dedicated_runtime - _ensure_roots() - set_process(true) - - -func is_world_ready() -> bool: - return _world != null and _world.is_world_ready() - - -func clear_presentations() -> void: - _presentations_by_fingerprint.clear() - _decor_under_manipulation.clear() - _pending_solid_decor.clear() - if is_instance_valid(_exteriors_root): - for child: Node in _exteriors_root.get_children(): - child.queue_free() - if is_instance_valid(_interiors_root): - for child: Node in _interiors_root.get_children(): - child.queue_free() - - -func remove_presentation(owner_fingerprint: String) -> void: - var presentation: Dictionary = _presentations_by_fingerprint.get( - owner_fingerprint, {} - ) - if presentation.is_empty(): - return - _clear_decor_collision_tracking(owner_fingerprint) - _free_presentation_nodes(presentation) - _presentations_by_fingerprint.erase(owner_fingerprint) - - -func apply_manifest(data: Dictionary) -> bool: - if ( - not is_world_ready() - or not NetworkHomeProtocolType.validate_manifest_broadcast(data) - ): - return false - _ensure_roots() - var fingerprint: String = str(data["owner_fingerprint"]) - var prior: Dictionary = _presentations_by_fingerprint.get(fingerprint, {}) - var prior_instance_ids: Dictionary[String, bool] = {} - if not prior.is_empty(): - var prior_home: Dictionary = prior.get("home", {}) - for value: Variant in prior_home.get("placements", []): - if typeof(value) == TYPE_DICTIONARY: - prior_instance_ids[str( - (value as Dictionary).get("instance_id", "") - )] = true - if not prior.is_empty(): - _clear_decor_collision_tracking(fingerprint) - _free_presentation_nodes(prior) - var exterior_transform := NetworkHomeProtocolType.array_to_transform( - data["exterior_transform"] - ) - var interior_index: int = int(data["interior_index"]) - var home_data: Dictionary = PlayerHomeStateType.sanitize_save_data( - data["home"] - ) - var exterior := _build_exterior( - fingerprint, exterior_transform, home_data - ) - var interior := _build_interior(fingerprint, interior_index, home_data) - var presentation: Dictionary = { - "owner_peer_id": int(data["owner_peer_id"]), - "fingerprint": fingerprint, - "home": home_data, - "exterior_transform": exterior_transform, - "interior_index": interior_index, - "exterior": exterior, - "interior": interior, - } - _presentations_by_fingerprint[fingerprint] = presentation - _refresh_local_visibility() - if not prior.is_empty(): - for value: Variant in home_data.get("placements", []): - if typeof(value) != TYPE_DICTIONARY: - continue - var instance_id: String = str( - (value as Dictionary).get("instance_id", "") - ) - if not instance_id.is_empty() and not prior_instance_ids.has( - instance_id - ): - call_deferred( - "_spawn_decor_poof", fingerprint, instance_id - ) - return true - - -func choose_exterior_transform( - owner_peer_id: int, - reserved_transforms: Array[Transform3D], -) -> Transform3D: - var spawn_transform: Transform3D = ( - _world.get_player_spawn_transform() - if _world != null else Transform3D.IDENTITY - ) - var triangles: Array[PackedVector3Array] = ( - _world.get_spawn_surface_triangles( - [&"grass_lite", &"grass", &"sand"], -0.5 - ) - if _world != null else [] - ) - if not triangles.is_empty(): - var surface_index: Dictionary = _build_surface_index(triangles) - var strict_result: Transform3D = _find_exterior_transform( - owner_peer_id, - triangles, - surface_index, - spawn_transform, - reserved_transforms, - true, - true, - ) - if strict_result != Transform3D.IDENTITY: - return strict_result - var relaxed_result: Transform3D = _find_exterior_transform( - owner_peer_id, - triangles, - surface_index, - spawn_transform, - reserved_transforms, - false, - true, - ) - if relaxed_result != Transform3D.IDENTITY: - return relaxed_result - var dry_result: Transform3D = _find_exterior_transform( - owner_peer_id, - triangles, - surface_index, - spawn_transform, - reserved_transforms, - false, - false, - ) - if dry_result != Transform3D.IDENTITY: - push_warning( - "Home exterior used a dry fallback with obstructed clearance." - ) - return dry_result - var emergency_result: Transform3D = _find_exterior_transform( - owner_peer_id, - triangles, - surface_index, - spawn_transform, - [], - false, - false, - ) - if emergency_result != Transform3D.IDENTITY: - push_warning( - "Home exterior used an accessible emergency placement." - ) - return emergency_result - push_error("No dry, level home exterior footprint was available.") - # The authored spawn is the only universally reachable point. Never strand - # a home on an unchecked elevation when malformed terrain offers no site. - return spawn_transform - - -func _find_exterior_transform( - owner_peer_id: int, - triangles: Array[PackedVector3Array], - surface_index: Dictionary, - spawn_transform: Transform3D, - reserved_transforms: Array[Transform3D], - require_spawn_clearance: bool, - require_obstacle_clearance: bool, -) -> Transform3D: - var triangle_count: int = triangles.size() - var start: int = posmod(owner_peer_id * 37, triangle_count) - var step: int = _coprime_step(triangle_count, 29) - for offset: int in triangle_count: - var triangle: PackedVector3Array = triangles[ - (start + offset * step) % triangle_count - ] - if not _is_exterior_candidate_triangle(triangle): - continue - var candidate_position: Vector3 = ( - triangle[0] + triangle[1] + triangle[2] - ) / 3.0 - if ( - require_spawn_clearance - and candidate_position.distance_to(spawn_transform.origin) < 9.0 - ): - continue - if _too_close_to_reserved(candidate_position, reserved_transforms): - continue - var yaw: float = float(posmod(owner_peer_id + offset, 4)) * PI * 0.5 - var grounded_position: Vector3 = _ground_exterior_footprint( - candidate_position, yaw, triangles, surface_index - ) - if not grounded_position.is_finite(): - continue - if ( - _world != null - and not _world.is_home_exterior_position_accessible( - grounded_position - ) - ): - continue - if ( - require_obstacle_clearance - and not _exterior_volume_is_clear(grounded_position, yaw) - ): - continue - return Transform3D(Basis(Vector3.UP, yaw), grounded_position) - return Transform3D.IDENTITY - - -func _is_exterior_candidate_triangle(triangle: PackedVector3Array) -> bool: - if triangle.size() != 3: - return false - var normal: Vector3 = (triangle[1] - triangle[0]).cross( - triangle[2] - triangle[0] - ) - var area: float = normal.length() * 0.5 - return ( - area >= MIN_EXTERIOR_TRIANGLE_AREA - and absf(normal.normalized().y) >= 0.94 - ) - - -func _ground_exterior_footprint( - candidate_position: Vector3, - yaw: float, - triangles: Array[PackedVector3Array], - surface_index: Dictionary, -) -> Vector3: - var heights: Array[float] = [] - for local_sample: Vector2 in _exterior_footprint_samples(): - var rotated_sample: Vector3 = Vector3( - local_sample.x, 0.0, local_sample.y - ).rotated(Vector3.UP, yaw) - var sample := Vector2( - candidate_position.x + rotated_sample.x, - candidate_position.z + rotated_sample.z, - ) - var height: float = _surface_height_at( - sample, candidate_position.y, triangles, surface_index - ) - if not is_finite(height): - return Vector3.INF - heights.append(height) - var minimum_height: float = heights.min() - var maximum_height: float = heights.max() - if maximum_height - minimum_height > EXTERIOR_MAX_SURFACE_HEIGHT_DELTA: - return Vector3.INF - return Vector3( - candidate_position.x, maximum_height, candidate_position.z - ) - - -func _exterior_footprint_samples() -> Array[Vector2]: - var samples: Array[Vector2] = [] - for x_factor: float in [-1.0, -0.5, 0.0, 0.5, 1.0]: - for z_factor: float in [-1.0, 0.0, 1.0]: - samples.append(Vector2( - EXTERIOR_FOOTPRINT_HALF_EXTENTS.x * x_factor, - EXTERIOR_FOOTPRINT_HALF_EXTENTS.y * z_factor, - )) - return samples - - -func _build_surface_index( - triangles: Array[PackedVector3Array], -) -> Dictionary: - var result: Dictionary = {} - for triangle_index: int in triangles.size(): - var triangle: PackedVector3Array = triangles[triangle_index] - if triangle.size() != 3: - continue - var minimum_x: float = minf( - triangle[0].x, minf(triangle[1].x, triangle[2].x) - ) - var maximum_x: float = maxf( - triangle[0].x, maxf(triangle[1].x, triangle[2].x) - ) - var minimum_z: float = minf( - triangle[0].z, minf(triangle[1].z, triangle[2].z) - ) - var maximum_z: float = maxf( - triangle[0].z, maxf(triangle[1].z, triangle[2].z) - ) - var minimum_cell := Vector2i( - floori(minimum_x / EXTERIOR_SURFACE_INDEX_CELL_SIZE), - floori(minimum_z / EXTERIOR_SURFACE_INDEX_CELL_SIZE), - ) - var maximum_cell := Vector2i( - floori(maximum_x / EXTERIOR_SURFACE_INDEX_CELL_SIZE), - floori(maximum_z / EXTERIOR_SURFACE_INDEX_CELL_SIZE), - ) - for cell_x: int in range(minimum_cell.x, maximum_cell.x + 1): - for cell_y: int in range(minimum_cell.y, maximum_cell.y + 1): - var cell := Vector2i(cell_x, cell_y) - var bucket: Array = result.get(cell, []) - bucket.append(triangle_index) - result[cell] = bucket - return result - - -func _surface_height_at( - point: Vector2, - preferred_height: float, - triangles: Array[PackedVector3Array], - surface_index: Dictionary, -) -> float: - var cell := Vector2i( - floori(point.x / EXTERIOR_SURFACE_INDEX_CELL_SIZE), - floori(point.y / EXTERIOR_SURFACE_INDEX_CELL_SIZE), - ) - var best_height: float = INF - var best_delta: float = INF - for value: Variant in surface_index.get(cell, []): - var triangle: PackedVector3Array = triangles[int(value)] - var height: float = _triangle_height_at(point, triangle) - if not is_finite(height): - continue - var delta: float = absf(height - preferred_height) - if delta < best_delta: - best_delta = delta - best_height = height - return best_height - - -func _triangle_height_at( - point: Vector2, - triangle: PackedVector3Array, -) -> float: - var a := Vector2(triangle[0].x, triangle[0].z) - var b := Vector2(triangle[1].x, triangle[1].z) - var c := Vector2(triangle[2].x, triangle[2].z) - var denominator: float = ( - (b.y - c.y) * (a.x - c.x) - + (c.x - b.x) * (a.y - c.y) - ) - if absf(denominator) <= 0.000001: - return INF - var weight_a: float = ( - (b.y - c.y) * (point.x - c.x) - + (c.x - b.x) * (point.y - c.y) - ) / denominator - var weight_b: float = ( - (c.y - a.y) * (point.x - c.x) - + (a.x - c.x) * (point.y - c.y) - ) / denominator - var weight_c: float = 1.0 - weight_a - weight_b - const EDGE_EPSILON: float = 0.001 - if ( - weight_a < -EDGE_EPSILON - or weight_b < -EDGE_EPSILON - or weight_c < -EDGE_EPSILON - ): - return INF - return ( - weight_a * triangle[0].y - + weight_b * triangle[1].y - + weight_c * triangle[2].y - ) - - -func _exterior_volume_is_clear( - candidate_position: Vector3, yaw: float -) -> bool: - if not is_inside_tree() or get_world_3d() == null: - return true - var shape := BoxShape3D.new() - shape.size = Vector3( - EXTERIOR_FOOTPRINT_HALF_EXTENTS.x * 2.0, - EXTERIOR_CLEARANCE_HEIGHT, - EXTERIOR_FOOTPRINT_HALF_EXTENTS.y * 2.0, - ) - var query := PhysicsShapeQueryParameters3D.new() - query.shape = shape - query.transform = Transform3D( - Basis(Vector3.UP, yaw), - candidate_position - + Vector3.UP * (EXTERIOR_CLEARANCE_HEIGHT * 0.5 + 0.2), - ) - query.collision_mask = 1 - query.collide_with_areas = false - query.collide_with_bodies = true - return get_world_3d().direct_space_state.intersect_shape(query, 1).is_empty() - - -func _coprime_step(value: int, preferred_step: int) -> int: - var step: int = mini(preferred_step, maxi(value - 1, 1)) - while step > 1 and _greatest_common_divisor(step, value) != 1: - step -= 1 - return step - - -func _greatest_common_divisor(first: int, second: int) -> int: - var a: int = absi(first) - var b: int = absi(second) - while b != 0: - var remainder: int = a % b - a = b - b = remainder - return a - - -func get_exterior_transform(owner_fingerprint: String) -> Transform3D: - var presentation: Dictionary = _presentations_by_fingerprint.get( - owner_fingerprint, {} - ) - return presentation.get("exterior_transform", Transform3D.IDENTITY) - - -func get_exterior_prompt_position(owner_fingerprint: String) -> Vector3: - return get_exterior_transform(owner_fingerprint) * ( - _exterior_prompt_local(owner_fingerprint) - ) - - -func set_exterior_prompt_visible( - owner_fingerprint: String, - requested_visible: bool, - action_text: String = "enter home", -) -> void: - for fingerprint: String in _presentations_by_fingerprint: - var presentation: Dictionary = _presentations_by_fingerprint[fingerprint] - var exterior: Node3D = presentation.get("exterior") - if not is_instance_valid(exterior): - continue - var prompt := exterior.get_node_or_null("DoorPrompt") as Node3D - if prompt == null: - continue - prompt.visible = ( - requested_visible - and fingerprint == owner_fingerprint - and not _dedicated_runtime - ) - if prompt.visible: - var label := prompt.get_node_or_null("Message") as Label3D - if label != null: - label.text = action_text - - -func get_exterior_spawn_transform(owner_fingerprint: String) -> Transform3D: - var exterior_transform: Transform3D = get_exterior_transform( - owner_fingerprint - ) - # Exterior local +Z leads away from the doorway. Player visuals face local - # -Z, so turn the authoritative spawn basis around to start the day facing - # outward instead of looking back into the home. - var outward_spawn_basis: Basis = ( - exterior_transform.basis * Basis(Vector3.UP, PI) - ) - return Transform3D( - outward_spawn_basis, - exterior_transform * _exterior_spawn_local(owner_fingerprint), - ) - - -func get_interior_spawn_transform( - owner_fingerprint: String, - visitor_offset: int = 0, -) -> Transform3D: - # `visitor_offset` is allocated by the host as a compact room-local slot. - # Keep it bounded as a last line of defense if a future caller accidentally - # supplies an engine peer ID instead of a slot. - var visitor_slot: int = posmod(visitor_offset, INTERIOR_MAX_SPAWN_SLOTS) - var exit_direction: Vector3 = get_interior_exit_direction(owner_fingerprint) - var lane_offset: float = ( - float(posmod(visitor_slot, 4)) - 1.5 - ) * 0.28 - var row_offset: float = ( - float(floori(float(visitor_slot) / 4.0)) * 0.28 - ) - # Spawn just through the authored doorway. Local presentation then walks the - # avatar farther into the room before returning movement control. - var spawn_origin: Vector3 = ( - get_interior_exit_position(owner_fingerprint) - + exit_direction * 0.42 - - exit_direction * row_offset - + Vector3(0.0, 0.0, lane_offset) - ) - spawn_origin.y = get_interior_anchor(owner_fingerprint).y - return Transform3D(Basis.IDENTITY, spawn_origin) - - -func get_interior_anchor(owner_fingerprint: String) -> Vector3: - var presentation: Dictionary = _presentations_by_fingerprint.get( - owner_fingerprint, {} - ) - var index: int = int(presentation.get("interior_index", 0)) - return INTERIOR_ORIGIN + Vector3(float(index) * INTERIOR_SPACING, 0.0, 0.0) - - -func is_avatar_near_exterior(avatar: Player, owner_fingerprint: String) -> bool: - if avatar == null or not _presentations_by_fingerprint.has(owner_fingerprint): - return false - var exterior_transform: Transform3D = get_exterior_transform( - owner_fingerprint - ) - var door_position: Vector3 = ( - exterior_transform * _exterior_door_local(owner_fingerprint) - ) - return avatar.global_position.distance_to(door_position) <= ( - EXTERIOR_INTERACTION_DISTANCE - ) - - -func is_avatar_near_interior_exit( - avatar: Player, - owner_fingerprint: String, -) -> bool: - if avatar == null: - return false - for exit_position: Vector3 in get_interior_exit_positions( - owner_fingerprint - ): - if avatar.global_position.distance_to(exit_position) <= ( - INTERIOR_EXIT_DISTANCE - ): - return true - return false - - -func has_avatar_crossed_interior_exit_threshold( - avatar: Player, - owner_fingerprint: String, -) -> bool: - if avatar == null: - return false - var local_position: Vector3 = interior_global_to_local( - owner_fingerprint, avatar.global_position - ) - for exit_position: Vector3 in get_interior_exit_positions( - owner_fingerprint - ): - var threshold_position: Vector3 = interior_global_to_local( - owner_fingerprint, exit_position - ) - var exit_direction: Vector3 = get_interior_exit_direction_near( - owner_fingerprint, exit_position - ) - var outward_distance: float = ( - (local_position - threshold_position).dot(exit_direction) - ) - if ( - outward_distance >= 0.0 - and outward_distance <= INTERIOR_EXIT_TRIGGER_DEPTH - and absf(local_position.z - threshold_position.z) - <= INTERIOR_EXIT_DOORWAY_HALF_WIDTH - and local_position.y >= -0.25 - and local_position.y <= 2.25 - ): - return true - return false - - -func get_interior_exit_direction(owner_fingerprint: String) -> Vector3: - return ( - Vector3.LEFT - if _home_tier(owner_fingerprint) - >= PlayerHomeStateType.STARTER_RV_TIER - else Vector3.RIGHT - ) - - -func get_interior_exit_position(owner_fingerprint: String) -> Vector3: - return get_interior_exit_positions(owner_fingerprint)[0] - - -func get_interior_exit_positions( - owner_fingerprint: String, -) -> Array[Vector3]: - var anchor: Vector3 = get_interior_anchor(owner_fingerprint) - if _home_tier(owner_fingerprint) >= PlayerHomeStateType.STARTER_RV_TIER: - return [ - anchor + Vector3( - -STARTER_RV_EXIT_LOCAL_X, INTERIOR_EXIT_LOCAL_Y, 0.0 - ), - anchor + Vector3( - STARTER_RV_EXIT_LOCAL_X, INTERIOR_EXIT_LOCAL_Y, 0.0 - ), - ] - return [ - anchor + Vector3( - TENT_INTERIOR_SIZE.x * 0.5 - 0.55, - INTERIOR_EXIT_LOCAL_Y, - 0.0, - ), - ] - - -func get_interior_exit_direction_near( - owner_fingerprint: String, - world_position: Vector3, -) -> Vector3: - if _home_tier(owner_fingerprint) < PlayerHomeStateType.STARTER_RV_TIER: - return Vector3.RIGHT - return ( - Vector3.RIGHT - if world_position.x >= get_interior_anchor(owner_fingerprint).x - else Vector3.LEFT - ) - - -func get_interior_prompt_position(owner_fingerprint: String) -> Vector3: - return get_interior_exit_position(owner_fingerprint) + Vector3.UP * 1.2 - - -func interior_local_to_global( - owner_fingerprint: String, - local_position: Vector3, -) -> Vector3: - return get_interior_anchor(owner_fingerprint) + local_position - - -func interior_global_to_local( - owner_fingerprint: String, - world_position: Vector3, -) -> Vector3: - return world_position - get_interior_anchor(owner_fingerprint) - - -func get_floor_position_from_screen( - owner_fingerprint: String, - camera: Camera3D, - screen_position: Vector2, -) -> Vector3: - if camera == null or owner_fingerprint.is_empty(): - return Vector3.INF - var ray_origin: Vector3 = camera.project_ray_origin(screen_position) - var ray_direction: Vector3 = camera.project_ray_normal(screen_position) - if absf(ray_direction.y) <= 0.0001: - return Vector3.INF - var floor_y: float = get_interior_anchor(owner_fingerprint).y + 0.1 - var distance: float = (floor_y - ray_origin.y) / ray_direction.y - if distance <= 0.0: - return Vector3.INF - return interior_global_to_local( - owner_fingerprint, - ray_origin + ray_direction * distance, - ) - - -func find_decor_instance_at_screen( - owner_fingerprint: String, - camera: Camera3D, - screen_position: Vector2, -) -> String: - if camera == null or owner_fingerprint.is_empty(): - return "" - var ray_origin: Vector3 = camera.project_ray_origin(screen_position) - var ray_end: Vector3 = ray_origin + camera.project_ray_normal( - screen_position - ) * 50.0 - var query := PhysicsRayQueryParameters3D.create(ray_origin, ray_end) - query.collision_mask = DECOR_SELECTION_COLLISION_LAYER - query.collide_with_areas = false - var result: Dictionary = camera.get_world_3d().direct_space_state.intersect_ray( - query - ) - var collider: Object = result.get("collider") - if collider is Node and (collider as Node).has_meta(&"decor_instance_id"): - if str((collider as Node).get_meta(&"decor_owner_fingerprint")) == ( - owner_fingerprint - ): - return str((collider as Node).get_meta(&"decor_instance_id")) - return "" - - -func get_decor_preview_transform( - owner_fingerprint: String, - instance_id: String, -) -> Dictionary: - var decor: Node3D = _get_decor_presentation( - owner_fingerprint, instance_id - ) - if decor == null: - return {} - return { - "position": Vector3(decor.position.x, 0.0, decor.position.z), - "yaw": decor.rotation.y, - } - - -func set_decor_preview_transform( - owner_fingerprint: String, - instance_id: String, - decor_position: Vector3, - yaw_radians: float, -) -> bool: - var decor: Node3D = _get_decor_presentation( - owner_fingerprint, instance_id - ) - if ( - decor == null - or not decor_position.is_finite() - or not is_finite(yaw_radians) - ): - return false - decor.position = Vector3(decor_position.x, 0.18, decor_position.z) - decor.rotation.y = yaw_radians - return true - - -func set_decor_manipulation_active( - owner_fingerprint: String, - instance_id: String, - active: bool, -) -> bool: - var decor: Node3D = _get_decor_presentation( - owner_fingerprint, instance_id - ) - if decor == null: - return false - var body: StaticBody3D = decor.get_node_or_null( - "BasicCubeCollision" - ) as StaticBody3D - if body == null: - return false - var key: String = _decor_collision_key( - owner_fingerprint, instance_id - ) - if active: - _decor_under_manipulation[key] = true - _pending_solid_decor.erase(key) - body.collision_layer = DECOR_SELECTION_COLLISION_LAYER - return true - _decor_under_manipulation.erase(key) - _queue_decor_world_collision( - owner_fingerprint, - instance_id, - StringName(str(decor.get_meta(&"decor_id", ""))), - body, - ) - return true - - -func is_decor_placement_clear_of_players( - owner_fingerprint: String, - decor_id: StringName, - local_position: Vector3, - yaw_radians: float, -) -> bool: - if ( - owner_fingerprint.is_empty() - or not DecorCatalogType.has_product(decor_id) - or not local_position.is_finite() - or not is_finite(yaw_radians) - ): - return false - if _spawn_service == null: - return true - var global_center: Vector3 = interior_local_to_global( - owner_fingerprint, local_position - ) - var half_size: Vector2 = DecorCatalogType.get_footprint(decor_id) * 0.5 - for peer_id: int in _spawn_service.get_peer_ids(): - var avatar: Player = _spawn_service.get_avatar(peer_id) - if avatar == null or not is_instance_valid(avatar): - continue - var offset := Vector2( - avatar.global_position.x - global_center.x, - avatar.global_position.z - global_center.z, - ).rotated(-yaw_radians) - var nearest := Vector2( - clampf(offset.x, -half_size.x, half_size.x), - clampf(offset.y, -half_size.y, half_size.y), - ) - if offset.distance_squared_to(nearest) < ( - PLAYER_DECOR_CLEARANCE_RADIUS - * PLAYER_DECOR_CLEARANCE_RADIUS - ): - return false - return true - - -func _get_decor_presentation( - owner_fingerprint: String, - instance_id: String, -) -> Node3D: - if owner_fingerprint.is_empty() or instance_id.is_empty(): - return null - var presentation: Dictionary = _presentations_by_fingerprint.get( - owner_fingerprint, {} - ) - var interior: Node3D = presentation.get("interior") - if not is_instance_valid(interior): - return null - return interior.get_node_or_null( - "Decor/%s" % instance_id - ) as Node3D - - -func find_nearby_exterior_owner(avatar: Player) -> String: - if avatar == null: - return "" - var closest: String = "" - var closest_distance: float = EXTERIOR_INTERACTION_DISTANCE - for fingerprint: String in _presentations_by_fingerprint: - var exterior_transform: Transform3D = get_exterior_transform( - fingerprint - ) - var distance: float = avatar.global_position.distance_to( - exterior_transform * _exterior_door_local(fingerprint) - ) - if distance <= closest_distance: - closest = fingerprint - closest_distance = distance - return closest - - -func _home_tier(owner_fingerprint: String) -> int: - var presentation: Dictionary = _presentations_by_fingerprint.get( - owner_fingerprint, {} - ) - var home_data: Dictionary = presentation.get("home", {}) - return int(home_data.get("tier", PlayerHomeStateType.STARTER_TIER)) - - -func _exterior_door_local(owner_fingerprint: String) -> Vector3: - return ( - RV_EXTERIOR_DOOR_LOCAL - if _home_tier(owner_fingerprint) - >= PlayerHomeStateType.STARTER_RV_TIER - else TENT_EXTERIOR_DOOR_LOCAL - ) - - -func _exterior_spawn_local(owner_fingerprint: String) -> Vector3: - return ( - RV_EXTERIOR_SPAWN_LOCAL - if _home_tier(owner_fingerprint) - >= PlayerHomeStateType.STARTER_RV_TIER - else TENT_EXTERIOR_SPAWN_LOCAL - ) - - -func _exterior_prompt_local(owner_fingerprint: String) -> Vector3: - return ( - RV_EXTERIOR_PROMPT_LOCAL - if _home_tier(owner_fingerprint) - >= PlayerHomeStateType.STARTER_RV_TIER - else TENT_EXTERIOR_PROMPT_LOCAL - ) - - -func set_local_space(space_id: StringName) -> void: - _local_space = space_id - _refresh_local_visibility() - - -func get_manifest(owner_fingerprint: String) -> Dictionary: - var presentation: Dictionary = _presentations_by_fingerprint.get( - owner_fingerprint, {} - ) - return (presentation.get("home", {}) as Dictionary).duplicate(true) - - -func _process(_delta: float) -> void: - _refresh_pending_decor_collisions() - if not _dedicated_runtime: - _refresh_nearest_wall() - - -func _queue_decor_world_collision( - owner_fingerprint: String, - instance_id: String, - decor_id: StringName, - body: StaticBody3D, -) -> void: - if ( - owner_fingerprint.is_empty() - or instance_id.is_empty() - or not DecorCatalogType.has_product(decor_id) - or body == null - ): - return - var key: String = _decor_collision_key( - owner_fingerprint, instance_id - ) - body.collision_layer = DECOR_SELECTION_COLLISION_LAYER - _pending_solid_decor[key] = { - "owner_fingerprint": owner_fingerprint, - "instance_id": instance_id, - "decor_id": decor_id, - "body": body, - } - - -func _refresh_pending_decor_collisions() -> void: - if _pending_solid_decor.is_empty(): - return - var keys: Array[String] = [] - keys.assign(_pending_solid_decor.keys()) - for key: String in keys: - if _decor_under_manipulation.has(key): - continue - var pending: Dictionary = _pending_solid_decor.get(key, {}) - var body: StaticBody3D = pending.get("body") as StaticBody3D - var owner_fingerprint: String = str( - pending.get("owner_fingerprint", "") - ) - var instance_id: String = str(pending.get("instance_id", "")) - var decor_id := StringName(str(pending.get("decor_id", ""))) - var decor: Node3D = _get_decor_presentation( - owner_fingerprint, instance_id - ) - if body == null or decor == null or not is_instance_valid(body): - _pending_solid_decor.erase(key) - continue - if not is_decor_placement_clear_of_players( - owner_fingerprint, - decor_id, - Vector3(decor.position.x, 0.0, decor.position.z), - decor.rotation.y, - ): - continue - body.collision_layer = ( - WORLD_GEOMETRY_COLLISION_LAYER - | DECOR_SELECTION_COLLISION_LAYER - ) - _pending_solid_decor.erase(key) - - -func _clear_decor_collision_tracking(owner_fingerprint: String) -> void: - var prefix: String = "%s/" % owner_fingerprint - for key: String in _decor_under_manipulation.keys(): - if key.begins_with(prefix): - _decor_under_manipulation.erase(key) - for key: String in _pending_solid_decor.keys(): - if key.begins_with(prefix): - _pending_solid_decor.erase(key) - - -static func _decor_collision_key( - owner_fingerprint: String, - instance_id: String, -) -> String: - return "%s/%s" % [owner_fingerprint, instance_id] - - -func _ensure_roots() -> void: - if not is_instance_valid(_exteriors_root): - _exteriors_root = Node3D.new() - _exteriors_root.name = "RVExteriors" - add_child(_exteriors_root) - if not is_instance_valid(_interiors_root): - _interiors_root = Node3D.new() - _interiors_root.name = "RVInteriors" - add_child(_interiors_root) - - -func _build_exterior( - fingerprint: String, - world_transform: Transform3D, - home_data: Dictionary, -) -> Node3D: - var root := Node3D.new() - root.name = "Home_%s" % fingerprint.left(8) - _exteriors_root.add_child(root) - root.global_transform = world_transform - var tier: int = int(home_data.get( - "tier", PlayerHomeStateType.STARTER_TIER - )) - if tier >= PlayerHomeStateType.STARTER_RV_TIER: - if not _dedicated_runtime: - var motorcoach: Node3D = ( - STARTER_MOTORCOACH_SCENE.instantiate() as Node3D - ) - if motorcoach != null: - motorcoach.name = "StarterMotorcoach" - root.add_child(motorcoach) - else: - push_error( - "The starter motorcoach exterior could not be instantiated." - ) - _add_box_collision( - root, - "Body", - RV_EXTERIOR_BODY_SIZE, - Vector3(0.0, RV_EXTERIOR_BODY_CENTER_Y, 0.0), - ) - else: - if not _dedicated_runtime: - _add_tent_exterior(root) - _add_box_collision( - root, - "Body", - TENT_EXTERIOR_BODY_SIZE, - Vector3(0.0, TENT_EXTERIOR_BODY_CENTER_Y, 0.0), - ) - if not _dedicated_runtime: - _add_exterior_prompt(root, tier) - root.visible = not _dedicated_runtime - return root - - -func _build_interior( - fingerprint: String, - interior_index: int, - home_data: Dictionary, -) -> Node3D: - var root := Node3D.new() - root.name = "HomeInterior_%s" % fingerprint.left(8) - root.position = INTERIOR_ORIGIN + Vector3( - float(interior_index) * INTERIOR_SPACING, 0.0, 0.0 - ) - _interiors_root.add_child(root) - var tier: int = int(home_data.get( - "tier", PlayerHomeStateType.STARTER_TIER - )) - var scene: PackedScene = ( - STARTER_RV_INTERIOR_SCENE - if tier >= PlayerHomeStateType.STARTER_RV_TIER - else TENT_INTERIOR_SCENE - ) - var shell: Node3D = scene.instantiate() as Node3D - if shell == null: - push_error("The home interior shell could not be instantiated.") - else: - shell.name = "InteriorShell" - root.add_child(shell) - _prepare_imported_interior(shell) - var decor := Node3D.new() - decor.name = "Decor" - root.add_child(decor) - _rebuild_decor(decor, home_data, fingerprint) - root.visible = false - if _dedicated_runtime: - _set_geometry_visible(root, false) - return root - - -func _add_tent_exterior(parent: Node3D) -> void: - var tent := MeshInstance3D.new() - tent.name = "StarterTent" - var mesh := CylinderMesh.new() - mesh.top_radius = 0.0 - mesh.bottom_radius = 3.05 - mesh.height = 3.0 - mesh.radial_segments = 4 - mesh.rings = 1 - mesh.cap_top = false - mesh.material = _material(Color("9a7049")) - tent.mesh = mesh - tent.position.y = 1.5 - tent.rotation.y = PI * 0.25 - parent.add_child(tent) - _add_box( - parent, - "TentDoor", - Vector3(1.25, 1.85, 0.04), - Vector3(0.0, 0.95, 2.18), - Color("173b32"), - false, - ) - - -func _add_exterior_prompt(parent: Node3D, tier: int) -> void: - var prompt := Node3D.new() - prompt.name = "DoorPrompt" - prompt.position = ( - RV_EXTERIOR_PROMPT_LOCAL - if tier >= PlayerHomeStateType.STARTER_RV_TIER - else TENT_EXTERIOR_PROMPT_LOCAL - ) - prompt.visible = false - parent.add_child(prompt) - - var background := MeshInstance3D.new() - background.name = "Background" - background.mesh = _rounded_rectangle_mesh( - HOME_PROMPT_SIZE, - HOME_PROMPT_CORNER_RADIUS, - ) - background.material_override = _prompt_material( - HOME_PROMPT_BACKGROUND_COLOR - ) - prompt.add_child(background) - - var label := Label3D.new() - label.name = "Message" - label.text = "enter home" - label.position.z = 0.012 - label.font = HOME_PROMPT_FONT - label.font_size = 28 - label.pixel_size = HOME_PROMPT_TEXT_PIXEL_SIZE - label.modulate = HOME_PROMPT_TEXT_COLOR - label.outline_size = 0 - label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER - label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER - label.width = HOME_PROMPT_SIZE.x / HOME_PROMPT_TEXT_PIXEL_SIZE - label.double_sided = true - prompt.add_child(label) - - -func _rounded_rectangle_mesh(size: Vector2, radius: float) -> ArrayMesh: - var half_size: Vector2 = size * 0.5 - var clamped_radius: float = minf( - radius, - minf(half_size.x, half_size.y), - ) - var corners: Array[Vector2] = [ - Vector2(half_size.x - clamped_radius, half_size.y - clamped_radius), - Vector2(-half_size.x + clamped_radius, half_size.y - clamped_radius), - Vector2(-half_size.x + clamped_radius, -half_size.y + clamped_radius), - Vector2(half_size.x - clamped_radius, -half_size.y + clamped_radius), - ] - var start_angles: Array[float] = [0.0, PI * 0.5, PI, PI * 1.5] - var perimeter: Array[Vector2] = [] - const CORNER_SEGMENTS: int = 4 - for corner_index: int in corners.size(): - for segment_index: int in range(CORNER_SEGMENTS + 1): - var angle: float = start_angles[corner_index] + ( - PI * 0.5 * float(segment_index) / float(CORNER_SEGMENTS) - ) - perimeter.append( - corners[corner_index] - + Vector2(cos(angle), sin(angle)) * clamped_radius - ) - var surface := SurfaceTool.new() - surface.begin(Mesh.PRIMITIVE_TRIANGLES) - for index: int in perimeter.size(): - var first: Vector2 = perimeter[index] - var second: Vector2 = perimeter[(index + 1) % perimeter.size()] - for point: Vector2 in [Vector2.ZERO, first, second]: - surface.set_normal(Vector3.FORWARD) - surface.add_vertex(Vector3(point.x, point.y, 0.0)) - return surface.commit() - - -func _prompt_material(color: Color) -> StandardMaterial3D: - var material := StandardMaterial3D.new() - material.albedo_color = color - material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED - material.roughness = 1.0 - material.metallic = 0.0 - material.cull_mode = BaseMaterial3D.CULL_DISABLED - return material - - -func _prepare_imported_interior(shell: Node3D) -> void: - for value: Node in shell.find_children("*", "MeshInstance3D", true, false): - var mesh_instance := value as MeshInstance3D - if mesh_instance == null or mesh_instance.mesh == null: - continue - for surface_index: int in mesh_instance.mesh.get_surface_count(): - var source_material: Material = mesh_instance.get_active_material( - surface_index - ) - var material := source_material as StandardMaterial3D - if material == null: - continue - var flat_material := material.duplicate() as StandardMaterial3D - flat_material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED - flat_material.texture_filter = BaseMaterial3D.TEXTURE_FILTER_NEAREST - flat_material.roughness = 1.0 - flat_material.metallic = 0.0 - mesh_instance.set_surface_override_material( - surface_index, flat_material - ) - _add_imported_mesh_collision(mesh_instance) - - -func _add_imported_mesh_collision(mesh_instance: MeshInstance3D) -> void: - var parent: Node = mesh_instance.get_parent() - if parent == null or mesh_instance.mesh == null: - return - var shape: ConcavePolygonShape3D = mesh_instance.mesh.create_trimesh_shape() - if shape == null: - return - # Imported room shells are authored to render from both sides, but concave - # collision defaults to front faces only. Interior walls therefore need - # back-face collision or the player can walk through their inward side. - shape.backface_collision = true - var body := StaticBody3D.new() - body.name = "%sCollision" % mesh_instance.name - body.transform = mesh_instance.transform - body.set_meta(INTERIOR_SHELL_COLLISION_META, true) - var collision := CollisionShape3D.new() - collision.shape = shape - body.add_child(collision) - parent.add_child(body) - - -func _rebuild_decor( - parent: Node3D, - home_data: Dictionary, - owner_fingerprint: String, -) -> void: - for value: Variant in home_data.get("placements", []): - if typeof(value) != TYPE_DICTIONARY: - continue - var placement: Dictionary = value - var decor_id := StringName(str(placement["decor_id"])) - if decor_id != DecorCatalogType.BASIC_CUBE_ID: - continue - var position_values: Array = placement["position"] - var placement_root := Node3D.new() - placement_root.name = str(placement["instance_id"]) - placement_root.position = Vector3( - float(position_values[0]), 0.18, float(position_values[2]) - ) - placement_root.rotation.y = float(placement["yaw"]) - placement_root.set_meta( - &"decor_instance_id", str(placement["instance_id"]) - ) - placement_root.set_meta( - &"decor_owner_fingerprint", owner_fingerprint - ) - placement_root.set_meta(&"decor_id", String(decor_id)) - parent.add_child(placement_root) - var body := _add_box( - placement_root, "BasicCube", BASIC_CUBE_SIZE, - Vector3(0.0, BASIC_CUBE_SIZE.y * 0.5, 0.0), - Color("b77a55"), true, - ) - if body != null: - body.collision_layer = DECOR_SELECTION_COLLISION_LAYER - body.set_meta( - &"decor_instance_id", str(placement["instance_id"]) - ) - body.set_meta( - &"decor_owner_fingerprint", owner_fingerprint - ) - body.set_meta(&"decor_id", String(decor_id)) - _queue_decor_world_collision( - owner_fingerprint, - str(placement["instance_id"]), - decor_id, - body, - ) - _add_box( - placement_root, - "BasicCubeFront", - Vector3(BASIC_CUBE_SIZE.x * 0.82, BASIC_CUBE_SIZE.y * 0.68, 0.025), - Vector3( - 0.0, - BASIC_CUBE_SIZE.y * 0.5, - -BASIC_CUBE_SIZE.z * 0.5 - 0.013, - ), - Color("2897a8"), - false, - ) - - -func _add_wall( - parent: Node3D, - node_name: String, - size: Vector3, - local_position: Vector3, -) -> void: - _add_box(parent, node_name, size, local_position, Color("d6caaa"), true) - - -func _add_box( - parent: Node3D, - node_name: String, - size: Vector3, - local_position: Vector3, - color: Color, - with_collision: bool, - invert_faces: bool = false, -) -> StaticBody3D: - var mesh_instance := MeshInstance3D.new() - mesh_instance.name = node_name - var mesh := BoxMesh.new() - mesh.size = size - mesh.material = _material(color) - if invert_faces: - mesh.flip_faces = true - mesh_instance.mesh = mesh - mesh_instance.position = local_position - parent.add_child(mesh_instance) - if with_collision: - return _add_box_collision(parent, node_name, size, local_position) - return null - - -func _add_box_collision( - parent: Node3D, - node_name: String, - size: Vector3, - local_position: Vector3, -) -> StaticBody3D: - var body := StaticBody3D.new() - body.name = "%sCollision" % node_name - body.position = local_position - var collision := CollisionShape3D.new() - var shape := BoxShape3D.new() - shape.size = size - collision.shape = shape - body.add_child(collision) - parent.add_child(body) - return body - - -func _spawn_decor_poof( - owner_fingerprint: String, - instance_id: String, -) -> void: - var presentation: Dictionary = _presentations_by_fingerprint.get( - owner_fingerprint, {} - ) - var interior: Node3D = presentation.get("interior") - if not is_instance_valid(interior): - return - var placement_root: Node3D = interior.get_node_or_null( - "Decor/%s" % instance_id - ) - if placement_root == null: - return - var poof := CPUParticles3D.new() - poof.name = "DecorPoof" - poof.amount = 12 - poof.lifetime = 0.45 - poof.one_shot = true - poof.explosiveness = 0.9 - poof.direction = Vector3.UP - poof.spread = 80.0 - poof.initial_velocity_min = 0.7 - poof.initial_velocity_max = 1.5 - poof.scale_amount_min = 0.08 - poof.scale_amount_max = 0.16 - var particle_mesh := SphereMesh.new() - particle_mesh.radius = 0.06 - particle_mesh.height = 0.12 - particle_mesh.material = _material(Color("d9c5a3")) - poof.mesh = particle_mesh - placement_root.add_child(poof) - poof.emitting = true - get_tree().create_timer(poof.lifetime + 0.1).timeout.connect( - poof.queue_free - ) - - -func _material(color: Color) -> StandardMaterial3D: - var material := StandardMaterial3D.new() - material.albedo_color = color - material.roughness = 1.0 - material.shading_mode = BaseMaterial3D.SHADING_MODE_PER_VERTEX - return material - - -func _free_presentation_nodes(presentation: Dictionary) -> void: - for key: String in ["exterior", "interior"]: - var node: Node = presentation.get(key) - if is_instance_valid(node): - node.queue_free() - - -func _refresh_local_visibility() -> void: - var active_fingerprint: String = "" - if String(_local_space).begins_with("rv:"): - active_fingerprint = String(_local_space).trim_prefix("rv:") - if _world != null: - _world.set_local_home_interior_presentation_active( - not active_fingerprint.is_empty() - ) - for fingerprint: String in _presentations_by_fingerprint: - var presentation: Dictionary = _presentations_by_fingerprint[fingerprint] - var interior: Node3D = presentation.get("interior") - if is_instance_valid(interior): - interior.visible = ( - not _dedicated_runtime and fingerprint == active_fingerprint - ) - var exterior: Node3D = presentation.get("exterior") - if is_instance_valid(exterior): - exterior.visible = ( - not _dedicated_runtime and active_fingerprint.is_empty() - ) - var local_player: Player = ( - _spawn_service.get_local_player() - if _spawn_service != null else null - ) - if local_player == null: - return - var excluded_wall_rids: Array[RID] = [] - if not active_fingerprint.is_empty(): - var active: Dictionary = _presentations_by_fingerprint.get( - active_fingerprint, {} - ) - var active_interior: Node3D = active.get("interior") - if is_instance_valid(active_interior): - for wall_name: String in [ - "WallNorth", "WallSouth", "WallWest", "WallEast", - ]: - var body := active_interior.find_child( - "%sCollision" % wall_name, true, false - ) as StaticBody3D - if body != null: - excluded_wall_rids.append(body.get_rid()) - local_player.set_rv_interior_camera_mode( - not active_fingerprint.is_empty(), excluded_wall_rids - ) - - -func _refresh_nearest_wall() -> void: - if not String(_local_space).begins_with("rv:") or _spawn_service == null: - return - var fingerprint: String = String(_local_space).trim_prefix("rv:") - var presentation: Dictionary = _presentations_by_fingerprint.get( - fingerprint, {} - ) - var interior: Node3D = presentation.get("interior") - var player: Player = _spawn_service.get_local_player() - if not is_instance_valid(interior) or player == null: - return - var camera: Camera3D = player.get_active_gameplay_camera() - if camera == null: - return - var local_camera: Vector3 = interior.to_local(camera.global_position) - var local_view_direction: Vector3 = ( - interior.global_basis.inverse() * -camera.global_basis.z - ).normalized() - var horizontal_view_weight: float = absf(local_view_direction.x) - var depth_view_weight: float = absf(local_view_direction.z) - var tier: int = int((presentation.get("home", {}) as Dictionary).get( - "tier", PlayerHomeStateType.STARTER_TIER - )) - var interior_size: Vector2 = ( - STARTER_RV_INTERIOR_SIZE - if tier >= PlayerHomeStateType.STARTER_RV_TIER - else TENT_INTERIOR_SIZE - ) - var hidden_walls: Dictionary[String, bool] = {} - var outside_horizontal_wall: bool = ( - absf(local_camera.x) >= interior_size.x * 0.5 - 0.05 - ) - var outside_depth_wall: bool = ( - absf(local_camera.z) >= interior_size.y * 0.5 - 0.05 - ) - # At a diagonal, both near walls occupy the view. Use the camera's viewing - # direction to hide both instead of choosing only the dominant position - # axis and leaving the adjacent wall across the screen. - if ( - outside_horizontal_wall - and horizontal_view_weight >= depth_view_weight * 0.35 - ): - hidden_walls[ - "WallEast" if local_camera.x >= 0.0 else "WallWest" - ] = true - if ( - outside_depth_wall - and depth_view_weight >= horizontal_view_weight * 0.35 - ): - hidden_walls[ - "WallSouth" if local_camera.z >= 0.0 else "WallNorth" - ] = true - if hidden_walls.is_empty(): - var fallback_wall: String = ( - "WallEast" if local_camera.x >= 0.0 else "WallWest" - ) - if depth_view_weight > horizontal_view_weight: - fallback_wall = ( - "WallSouth" if local_camera.z >= 0.0 else "WallNorth" - ) - hidden_walls[fallback_wall] = true - for wall_name: String in [ - "WallNorth", "WallSouth", "WallWest", "WallEast", - ]: - var wall := interior.find_child( - wall_name, true, false - ) as MeshInstance3D - if wall != null: - wall.visible = not hidden_walls.has(wall_name) - for child: Node in interior.find_children( - "%s*" % wall_name, "GeometryInstance3D", true, false - ): - if ( - child is GeometryInstance3D - and String(child.name).begins_with(wall_name) - ): - (child as GeometryInstance3D).visible = ( - not hidden_walls.has(wall_name) - ) - - -func _too_close_to_reserved( - candidate_position: Vector3, - reserved_transforms: Array[Transform3D], -) -> bool: - for reserved_transform: Transform3D in reserved_transforms: - if ( - candidate_position.distance_to(reserved_transform.origin) - < MIN_EXTERIOR_SEPARATION - ): - return true - return false - - -func _set_geometry_visible(root: Node, should_show: bool) -> void: - for node: Node in root.find_children("*", "GeometryInstance3D", true, false): - (node as GeometryInstance3D).visible = should_show diff --git a/homes/home_world_service.gd.uid b/homes/home_world_service.gd.uid deleted file mode 100644 index 5505d06..0000000 --- a/homes/home_world_service.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cy2kjoxhwxujd diff --git a/homes/player_home_state.gd b/homes/player_home_state.gd deleted file mode 100644 index 87643c1..0000000 --- a/homes/player_home_state.gd +++ /dev/null @@ -1,841 +0,0 @@ -class_name PlayerHomeState -extends Node - -signal changed - -const DecorCatalogType = preload("res://homes/decor_catalog.gd") - -const HOME_SCHEMA_VERSION: int = 1 -const STARTER_TIER: int = 0 -const STARTER_EXTERIOR_ID: StringName = &"starter_tent" -const STARTER_RV_TIER: int = 1 -const STARTER_RV_EXTERIOR_ID: StringName = &"starter_motorcoach" -const MAX_TIER: int = STARTER_RV_TIER -const HOME_UPGRADE_COSTS: Array[int] = [50] -const STORAGE_CAPACITIES: Array[int] = [9, 18] -const MAX_PLACEMENTS: int = 128 -const MAX_INSTANCE_ID_LENGTH: int = 96 -const MAX_REVISION: int = 2147483647 -const GRID_SIZE: float = 0.5 -const FREE_PLACEMENT_SEARCH_STEP: float = 0.1 -const FREE_PLACEMENT_SEARCH_ANGLES: int = 24 -const NEAREST_PLACEMENT_SEARCH_DISTANCE: float = 2.0 -const TENT_INTERIOR_HALF_EXTENTS := Vector2(1.91, 1.91) -const STARTER_RV_INTERIOR_HALF_EXTENTS := Vector2(1.91, 2.91) -const PLACEMENT_EDGE_PADDING: float = 0.02 - -enum Privacy { - OPEN, - CLOSED, -} - -enum PlacementMode { - GRID, - FREE, -} - -var _tier: int = STARTER_TIER -var _exterior_id: StringName = STARTER_EXTERIOR_ID -var _privacy: Privacy = Privacy.OPEN -var _owned_decor: Dictionary[StringName, int] = {} -var _placements: Array[Dictionary] = [] -var _revision: int = 0 -var _next_instance_sequence: int = 1 - - -func get_tier() -> int: - return _tier - - -func get_exterior_id() -> StringName: - return _exterior_id - - -func get_storage_capacity() -> int: - return storage_capacity_for_tier(_tier) - - -func get_next_upgrade_cost() -> int: - if _tier >= MAX_TIER: - return -1 - return HOME_UPGRADE_COSTS[_tier] - - -func get_next_storage_capacity() -> int: - if _tier >= MAX_TIER: - return -1 - return storage_capacity_for_tier(_tier + 1) - - -func upgrade_to_next_tier() -> bool: - if _tier >= MAX_TIER: - return false - _tier += 1 - _exterior_id = exterior_id_for_tier(_tier) - _touch() - return true - - -static func exterior_id_for_tier(tier: int) -> StringName: - return ( - STARTER_RV_EXTERIOR_ID - if tier >= STARTER_RV_TIER - else STARTER_EXTERIOR_ID - ) - - -static func storage_capacity_for_tier(tier: int) -> int: - return STORAGE_CAPACITIES[clampi(tier, STARTER_TIER, MAX_TIER)] - - -static func interior_half_extents_for_tier(tier: int) -> Vector2: - return ( - STARTER_RV_INTERIOR_HALF_EXTENTS - if tier >= STARTER_RV_TIER - else TENT_INTERIOR_HALF_EXTENTS - ) - - -func get_privacy() -> Privacy: - return _privacy - - -func get_revision() -> int: - return _revision - - -func get_owned_count(decor_id: StringName) -> int: - return int(_owned_decor.get(decor_id, 0)) - - -func get_placed_count(decor_id: StringName) -> int: - var count: int = 0 - for placement: Dictionary in _placements: - if StringName(str(placement.get("decor_id", ""))) == decor_id: - count += 1 - return count - - -func get_available_count(decor_id: StringName) -> int: - return maxi( - get_owned_count(decor_id) - get_placed_count(decor_id), - 0, - ) - - -func get_owned_decor() -> Dictionary[StringName, int]: - return _owned_decor.duplicate() - - -func get_placements() -> Array[Dictionary]: - var result: Array[Dictionary] = [] - for placement: Dictionary in _placements: - result.append(placement.duplicate(true)) - return result - - -func get_placement(instance_id: String) -> Dictionary: - var index: int = _placement_index(instance_id) - return _placements[index].duplicate(true) if index >= 0 else {} - - -func can_place_decor( - decor_id: StringName, - position: Vector3, - yaw_radians: float, - mode: PlacementMode, -) -> bool: - if ( - get_available_count(decor_id) <= 0 - or _placements.size() >= MAX_PLACEMENTS - or not _valid_mode(mode) - ): - return false - return not get_nearest_valid_placement_transform( - decor_id, - position, - yaw_radians, - mode, - "", - ).is_empty() - - -func set_privacy(value: Privacy) -> bool: - if value < Privacy.OPEN or value > Privacy.CLOSED: - return false - if _privacy == value: - return true - _privacy = value - _touch() - return true - - -func add_owned_decor( - decor_id: StringName, - quantity: int = 1, -) -> bool: - if ( - not DecorCatalogType.has_product(decor_id) - or quantity <= 0 - ): - return false - var current: int = get_owned_count(decor_id) - if current + quantity > DecorCatalogType.MAX_OWNED_PER_PRODUCT: - return false - _owned_decor[decor_id] = current + quantity - _touch() - return true - - -func remove_owned_decor( - decor_id: StringName, - quantity: int = 1, -) -> bool: - if quantity <= 0: - return false - var current: int = get_owned_count(decor_id) - if current - quantity < get_placed_count(decor_id): - return false - var remaining: int = current - quantity - if remaining < 0: - return false - if remaining == 0: - _owned_decor.erase(decor_id) - else: - _owned_decor[decor_id] = remaining - _touch() - return true - - -func place_decor( - decor_id: StringName, - position: Vector3, - yaw_radians: float, - mode: PlacementMode, -) -> String: - if ( - get_available_count(decor_id) <= 0 - or _placements.size() >= MAX_PLACEMENTS - or not _valid_mode(mode) - ): - return "" - var normalized := get_nearest_valid_placement_transform( - decor_id, - position, - yaw_radians, - mode, - "", - ) - if normalized.is_empty(): - return "" - var instance_id := _make_instance_id() - var placement: Dictionary = { - "instance_id": instance_id, - "decor_id": String(decor_id), - "mode": int(mode), - "position": _vector3_to_array(normalized["position"]), - "yaw": float(normalized["yaw"]), - } - _placements.append(placement) - _touch() - return instance_id - - -func update_placement( - instance_id: String, - position: Vector3, - yaw_radians: float, - mode: PlacementMode, -) -> bool: - var index: int = _placement_index(instance_id) - var normalized: Dictionary = get_valid_update_transform( - instance_id, position, yaw_radians, mode - ) - if index < 0 or normalized.is_empty(): - return false - var placement: Dictionary = _placements[index].duplicate(true) - placement["mode"] = int(mode) - placement["position"] = _vector3_to_array(normalized["position"]) - placement["yaw"] = float(normalized["yaw"]) - _placements[index] = placement - _touch() - return true - - -func get_valid_update_transform( - instance_id: String, - position: Vector3, - yaw_radians: float, - mode: PlacementMode, - candidate_validator: Callable = Callable(), -) -> Dictionary: - var index: int = _placement_index(instance_id) - if index < 0 or not _valid_mode(mode): - return {} - var decor_id := StringName( - str(_placements[index].get("decor_id", "")) - ) - return get_nearest_valid_placement_transform( - decor_id, - position, - yaw_radians, - mode, - instance_id, - candidate_validator, - ) - - -func get_nearest_valid_placement_transform( - decor_id: StringName, - position: Vector3, - yaw_radians: float, - mode: PlacementMode, - ignored_instance_id: String = "", - candidate_validator: Callable = Callable(), -) -> Dictionary: - var normalized: Dictionary = normalized_placement_transform( - decor_id, position, yaw_radians, mode, _tier - ) - if normalized.is_empty(): - return {} - if ( - not _overlaps_existing( - decor_id, normalized, ignored_instance_id - ) - and _candidate_is_accepted(normalized, candidate_validator) - ): - return normalized - return ( - _find_nearest_grid_transform( - decor_id, - normalized, - ignored_instance_id, - candidate_validator, - ) - if mode == PlacementMode.GRID - else _find_nearest_free_transform( - decor_id, - normalized, - ignored_instance_id, - candidate_validator, - ) - ) - - -func remove_placement(instance_id: String) -> bool: - var index: int = _placement_index(instance_id) - if index < 0: - return false - _placements.remove_at(index) - _touch() - return true - - -func reset_to_defaults() -> void: - _tier = STARTER_TIER - _exterior_id = STARTER_EXTERIOR_ID - _privacy = Privacy.OPEN - _owned_decor.clear() - _placements.clear() - _revision = 0 - _next_instance_sequence = 1 - changed.emit() - - -func to_save_data() -> Dictionary: - var owned: Dictionary = {} - var ids: Array[StringName] = [] - ids.assign(_owned_decor.keys()) - ids.sort_custom(func(first: StringName, second: StringName) -> bool: - return String(first) < String(second) - ) - for decor_id: StringName in ids: - owned[String(decor_id)] = _owned_decor[decor_id] - return { - "schema_version": HOME_SCHEMA_VERSION, - "tier": _tier, - "exterior_id": String(_exterior_id), - "privacy": int(_privacy), - "owned_decor": owned, - "placements": get_placements(), - "revision": _revision, - "next_instance_sequence": _next_instance_sequence, - } - - -func restore_from_save_data(data: Dictionary) -> bool: - var sanitized: Dictionary = sanitize_save_data(data) - if sanitized.is_empty(): - return false - _tier = int(sanitized["tier"]) - _exterior_id = exterior_id_for_tier(_tier) - _privacy = int(sanitized["privacy"]) as Privacy - _owned_decor.clear() - for key: Variant in (sanitized["owned_decor"] as Dictionary): - _owned_decor[StringName(str(key))] = int( - (sanitized["owned_decor"] as Dictionary)[key] - ) - _placements.clear() - for value: Variant in sanitized["placements"] as Array: - _placements.append((value as Dictionary).duplicate(true)) - _revision = int(sanitized["revision"]) - _next_instance_sequence = int(sanitized["next_instance_sequence"]) - changed.emit() - return true - - -static func default_save_data() -> Dictionary: - return { - "schema_version": HOME_SCHEMA_VERSION, - "tier": STARTER_TIER, - "exterior_id": String(STARTER_EXTERIOR_ID), - "privacy": int(Privacy.OPEN), - "owned_decor": {}, - "placements": [], - "revision": 0, - "next_instance_sequence": 1, - } - - -static func sanitize_save_data(data: Dictionary) -> Dictionary: - if ( - not _is_integer_value(data.get("schema_version")) - or int(data.get("schema_version", -1)) != HOME_SCHEMA_VERSION - or not _is_integer_value(data.get("tier")) - or typeof(data.get("exterior_id")) not in [ - TYPE_STRING, TYPE_STRING_NAME, - ] - or not _is_integer_value(data.get("privacy")) - or typeof(data.get("owned_decor")) != TYPE_DICTIONARY - or typeof(data.get("placements")) != TYPE_ARRAY - or not _is_integer_value(data.get("revision")) - or not _is_integer_value(data.get("next_instance_sequence")) - ): - return {} - var tier: int = int(data["tier"]) - var exterior_id: String = str(data["exterior_id"]) - var privacy: int = int(data["privacy"]) - var revision: int = int(data["revision"]) - var next_sequence: int = int(data["next_instance_sequence"]) - if ( - tier < STARTER_TIER - or tier > MAX_TIER - or exterior_id.is_empty() - or exterior_id.length() > 96 - or privacy < Privacy.OPEN - or privacy > Privacy.CLOSED - or revision < 0 - or revision > MAX_REVISION - or next_sequence < 1 - or next_sequence > MAX_REVISION - ): - return {} - exterior_id = String(exterior_id_for_tier(tier)) - var sanitized_owned: Dictionary = {} - var owned: Dictionary = data["owned_decor"] - for key: Variant in owned: - if typeof(key) not in [TYPE_STRING, TYPE_STRING_NAME]: - return {} - var decor_id := StringName(str(key)) - var quantity_value: Variant = owned[key] - if ( - not DecorCatalogType.has_product(decor_id) - or not _is_integer_value(quantity_value) - or int(quantity_value) <= 0 - or int(quantity_value) > DecorCatalogType.MAX_OWNED_PER_PRODUCT - ): - return {} - sanitized_owned[String(decor_id)] = int(quantity_value) - var values: Array = data["placements"] - if values.size() > MAX_PLACEMENTS: - return {} - var sanitized_placements: Array[Dictionary] = [] - var seen_instance_ids: Dictionary[String, bool] = {} - var placed_counts: Dictionary[StringName, int] = {} - for value: Variant in values: - if typeof(value) != TYPE_DICTIONARY: - return {} - var sanitized: Dictionary = sanitize_placement(value, tier) - if sanitized.is_empty(): - return {} - var instance_id: String = str(sanitized["instance_id"]) - var decor_id := StringName(str(sanitized["decor_id"])) - if seen_instance_ids.has(instance_id): - return {} - seen_instance_ids[instance_id] = true - placed_counts[decor_id] = int( - placed_counts.get(decor_id, 0) - ) + 1 - if ( - int(placed_counts[decor_id]) - > int(sanitized_owned.get(String(decor_id), 0)) - ): - return {} - for previous: Dictionary in sanitized_placements: - if placements_overlap(previous, sanitized): - return {} - sanitized_placements.append(sanitized) - return { - "schema_version": HOME_SCHEMA_VERSION, - "tier": tier, - "exterior_id": exterior_id, - "privacy": privacy, - "owned_decor": sanitized_owned, - "placements": sanitized_placements, - "revision": revision, - "next_instance_sequence": next_sequence, - } - - -static func sanitize_placement( - value: Dictionary, - home_tier: int = STARTER_TIER, -) -> Dictionary: - for key: String in [ - "instance_id", "decor_id", "mode", "position", "yaw", - ]: - if not value.has(key): - return {} - if ( - typeof(value["instance_id"]) != TYPE_STRING - or typeof(value["decor_id"]) not in [ - TYPE_STRING, TYPE_STRING_NAME, - ] - or not _is_integer_value(value["mode"]) - or typeof(value["position"]) != TYPE_ARRAY - or typeof(value["yaw"]) not in [TYPE_FLOAT, TYPE_INT] - ): - return {} - var instance_id: String = value["instance_id"] - var decor_id := StringName(str(value["decor_id"])) - var mode: int = int(value["mode"]) - var position_values: Array = value["position"] - var yaw: float = float(value["yaw"]) - if ( - instance_id.is_empty() - or instance_id.length() > MAX_INSTANCE_ID_LENGTH - or not DecorCatalogType.has_product(decor_id) - or not _valid_mode(mode) - or position_values.size() != 3 - or not is_finite(yaw) - ): - return {} - for component: Variant in position_values: - if typeof(component) not in [TYPE_FLOAT, TYPE_INT]: - return {} - var position := Vector3( - float(position_values[0]), - float(position_values[1]), - float(position_values[2]), - ) - var normalized := normalized_placement_transform( - decor_id, - position, - yaw, - mode as PlacementMode, - home_tier, - ) - if normalized.is_empty(): - return {} - return { - "instance_id": instance_id, - "decor_id": String(decor_id), - "mode": mode, - "position": _vector3_to_array(normalized["position"]), - "yaw": float(normalized["yaw"]), - } - - -static func _is_integer_value(value: Variant) -> bool: - if typeof(value) == TYPE_INT: - return true - if typeof(value) != TYPE_FLOAT: - return false - var number: float = float(value) - return is_finite(number) and is_equal_approx(number, roundf(number)) - - -static func normalized_placement_transform( - decor_id: StringName, - position: Vector3, - yaw_radians: float, - mode: PlacementMode, - home_tier: int = STARTER_TIER, -) -> Dictionary: - if ( - not DecorCatalogType.has_product(decor_id) - or not position.is_finite() - or not is_finite(yaw_radians) - or not _valid_mode(mode) - ): - return {} - var normalized_position := Vector3(position.x, 0.0, position.z) - var normalized_yaw: float = wrapf(yaw_radians, -PI, PI) - if mode == PlacementMode.GRID: - normalized_position.x = snappedf(normalized_position.x, GRID_SIZE) - normalized_position.z = snappedf(normalized_position.z, GRID_SIZE) - normalized_yaw = snappedf(normalized_yaw, PI * 0.5) - var footprint: Vector2 = DecorCatalogType.get_footprint(decor_id) - var cosine: float = absf(cos(normalized_yaw)) - var sine: float = absf(sin(normalized_yaw)) - var half_size := Vector2( - (footprint.x * cosine + footprint.y * sine) * 0.5, - (footprint.x * sine + footprint.y * cosine) * 0.5, - ) - var interior_half_extents := interior_half_extents_for_tier(home_tier) - var maximum_x: float = ( - interior_half_extents.x - half_size.x - PLACEMENT_EDGE_PADDING - ) - var maximum_z: float = ( - interior_half_extents.y - half_size.y - PLACEMENT_EDGE_PADDING - ) - if maximum_x < 0.0 or maximum_z < 0.0: - return {} - # Clamp after grid snapping so a grid-placed item can still sit flush at a - # wall even when the wall itself is not on an exact grid interval. - normalized_position.x = clampf( - normalized_position.x, -maximum_x, maximum_x - ) - normalized_position.z = clampf( - normalized_position.z, -maximum_z, maximum_z - ) - return { - "position": normalized_position, - "yaw": normalized_yaw, - } - - -func _find_nearest_grid_transform( - decor_id: StringName, - origin: Dictionary, - ignored_instance_id: String, - candidate_validator: Callable, -) -> Dictionary: - var origin_position: Vector3 = origin["position"] - var yaw: float = float(origin["yaw"]) - var maximum_ring: int = ceili( - NEAREST_PLACEMENT_SEARCH_DISTANCE / GRID_SIZE - ) - var seen: Dictionary[String, bool] = {} - for ring: int in range(1, maximum_ring + 1): - var nearest: Dictionary = {} - var nearest_distance_squared: float = INF - for x_offset: int in range(-ring, ring + 1): - for z_offset: int in range(-ring, ring + 1): - if maxi(absi(x_offset), absi(z_offset)) != ring: - continue - var candidate: Dictionary = normalized_placement_transform( - decor_id, - origin_position + Vector3( - float(x_offset) * GRID_SIZE, - 0.0, - float(z_offset) * GRID_SIZE, - ), - yaw, - PlacementMode.GRID, - _tier, - ) - if candidate.is_empty() or not _mark_candidate_unseen( - candidate, seen - ): - continue - if _overlaps_existing( - decor_id, candidate, ignored_instance_id - ) or not _candidate_is_accepted( - candidate, candidate_validator - ): - continue - var candidate_position: Vector3 = candidate["position"] - var distance_squared: float = origin_position.distance_squared_to( - candidate_position - ) - if distance_squared < nearest_distance_squared: - nearest = candidate - nearest_distance_squared = distance_squared - if not nearest.is_empty(): - return nearest - return {} - - -func _find_nearest_free_transform( - decor_id: StringName, - origin: Dictionary, - ignored_instance_id: String, - candidate_validator: Callable, -) -> Dictionary: - var origin_position: Vector3 = origin["position"] - var yaw: float = float(origin["yaw"]) - var maximum_ring: int = ceili( - NEAREST_PLACEMENT_SEARCH_DISTANCE / FREE_PLACEMENT_SEARCH_STEP - ) - var seen: Dictionary[String, bool] = {} - for ring: int in range(1, maximum_ring + 1): - var radius: float = float(ring) * FREE_PLACEMENT_SEARCH_STEP - var nearest: Dictionary = {} - var nearest_distance_squared: float = INF - for angle_index: int in FREE_PLACEMENT_SEARCH_ANGLES: - var angle: float = ( - TAU * float(angle_index) / float(FREE_PLACEMENT_SEARCH_ANGLES) - ) - var candidate: Dictionary = normalized_placement_transform( - decor_id, - origin_position + Vector3( - cos(angle) * radius, 0.0, sin(angle) * radius - ), - yaw, - PlacementMode.FREE, - _tier, - ) - if candidate.is_empty() or not _mark_candidate_unseen( - candidate, seen - ): - continue - if _overlaps_existing( - decor_id, candidate, ignored_instance_id - ) or not _candidate_is_accepted( - candidate, candidate_validator - ): - continue - var candidate_position: Vector3 = candidate["position"] - var distance_squared: float = origin_position.distance_squared_to( - candidate_position - ) - if distance_squared < nearest_distance_squared: - nearest = candidate - nearest_distance_squared = distance_squared - if not nearest.is_empty(): - return nearest - return {} - - -static func _mark_candidate_unseen( - candidate: Dictionary, - seen: Dictionary[String, bool], -) -> bool: - var position: Vector3 = candidate["position"] - var key := "%d:%d" % [ - roundi(position.x * 10000.0), - roundi(position.z * 10000.0), - ] - if seen.has(key): - return false - seen[key] = true - return true - - -static func _candidate_is_accepted( - candidate: Dictionary, - validator: Callable, -) -> bool: - return not validator.is_valid() or bool(validator.call(candidate)) - - -static func placements_overlap(first: Dictionary, second: Dictionary) -> bool: - var first_id := StringName(str(first.get("decor_id", ""))) - var second_id := StringName(str(second.get("decor_id", ""))) - if ( - not DecorCatalogType.has_product(first_id) - or not DecorCatalogType.has_product(second_id) - ): - return true - var first_position: Vector3 = _array_to_vector3(first.get("position", [])) - var second_position: Vector3 = _array_to_vector3(second.get("position", [])) - var first_yaw: float = float(first.get("yaw", 0.0)) - var second_yaw: float = float(second.get("yaw", 0.0)) - var first_half: Vector2 = ( - DecorCatalogType.get_footprint(first_id) * 0.5 - ) - var second_half: Vector2 = ( - DecorCatalogType.get_footprint(second_id) * 0.5 - ) - var first_axes: Array[Vector2] = _placement_axes(first_yaw) - var second_axes: Array[Vector2] = _placement_axes(second_yaw) - var delta := Vector2( - second_position.x - first_position.x, - second_position.z - first_position.z, - ) - for axis: Vector2 in [ - first_axes[0], first_axes[1], second_axes[0], second_axes[1], - ]: - var first_radius: float = ( - absf(axis.dot(first_axes[0])) * first_half.x - + absf(axis.dot(first_axes[1])) * first_half.y - ) - var second_radius: float = ( - absf(axis.dot(second_axes[0])) * second_half.x - + absf(axis.dot(second_axes[1])) * second_half.y - ) - if absf(delta.dot(axis)) >= ( - first_radius + second_radius - 0.001 - ): - return false - return true - - -func _make_instance_id() -> String: - var result := "decor-%d-%d" % [ - Time.get_ticks_usec(), - _next_instance_sequence, - ] - _next_instance_sequence = mini( - _next_instance_sequence + 1, - MAX_REVISION, - ) - return result - - -func _placement_index(instance_id: String) -> int: - if instance_id.is_empty(): - return -1 - for index: int in _placements.size(): - if str(_placements[index].get("instance_id", "")) == instance_id: - return index - return -1 - - -func _overlaps_existing( - decor_id: StringName, - normalized: Dictionary, - ignored_instance_id: String, -) -> bool: - var candidate: Dictionary = { - "decor_id": String(decor_id), - "position": _vector3_to_array(normalized["position"]), - "yaw": float(normalized["yaw"]), - } - for placement: Dictionary in _placements: - if str(placement.get("instance_id", "")) == ignored_instance_id: - continue - if placements_overlap(candidate, placement): - return true - return false - - -func _touch() -> void: - _revision = mini(_revision + 1, MAX_REVISION) - changed.emit() - - -static func _valid_mode(value: int) -> bool: - return value >= PlacementMode.GRID and value <= PlacementMode.FREE - - -static func _vector3_to_array(value: Vector3) -> Array[float]: - return [value.x, value.y, value.z] - - -static func _array_to_vector3(value: Variant) -> Vector3: - if typeof(value) != TYPE_ARRAY or (value as Array).size() != 3: - return Vector3.INF - var components: Array = value - return Vector3( - float(components[0]), - float(components[1]), - float(components[2]), - ) - - -static func _placement_axes(yaw: float) -> Array[Vector2]: - var cosine: float = cos(yaw) - var sine: float = sin(yaw) - return [Vector2(cosine, sine), Vector2(-sine, cosine)] diff --git a/homes/player_home_state.gd.uid b/homes/player_home_state.gd.uid deleted file mode 100644 index 37836c6..0000000 --- a/homes/player_home_state.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ggfdoak2ixxx diff --git a/inventory/player_bag.gd b/inventory/player_bag.gd index 89feff4..e33f1e4 100644 --- a/inventory/player_bag.gd +++ b/inventory/player_bag.gd @@ -4,7 +4,6 @@ extends Node const ItemCatalogType = preload("res://items/item_catalog.gd") const ItemDataType = preload("res://items/item_data.gd") const OwnedItemType = preload("res://items/owned_item.gd") -const DecorCatalogType = preload("res://homes/decor_catalog.gd") const DEFAULT_UNLOCKED_BAIT_IDS: Array[StringName] = [&"worms"] const MIN_STORAGE_SLOT_COUNT: int = 15 @@ -61,67 +60,11 @@ func add_item(item_id: StringName, quantity: int = 1) -> bool: return true -func add_item_to_storage(item_id: StringName, quantity: int = 1) -> bool: - var existing: OwnedItemType = get_owned_item(item_id) - var item: ItemDataType = _resolve_available_item(item_id) - if item != null and DecorCatalogType.has_product(item_id): - if ( - not _can_own_quantity(item, existing, quantity) - or _inventory_layout == null - or not _inventory_layout.can_accept_item_in_storage( - item_id, quantity - ) - ): - return false - for _unit: int in quantity: - if not _inventory_layout.prepare_new_item_in_first_free( - item_id, - PlayerInventoryLayout.InventoryContainer.STORAGE, - ): - _inventory_layout.cancel_prepared_item_placement(item_id) - return false - if existing != null: - existing.quantity += quantity - else: - var owned := OwnedItemType.new() - owned.item_id = item_id - owned.quantity = quantity - owned.storage_slot = _first_available_storage_slot(item, _items) - _items.append(owned) - contents_changed.emit() - return true - if existing != null: - return add_item(item_id, quantity) - if ( - item == null - or quantity <= 0 - or quantity > (item.max_stack if item.stackable else 1) - or _inventory_layout == null - or not _inventory_layout.can_accept_item_in_storage(item_id) - ): - return false - var owned := OwnedItemType.new() - owned.item_id = item_id - owned.quantity = quantity - owned.storage_slot = _first_available_storage_slot(item, _items) - _items.append(owned) - contents_changed.emit() - return true - - func can_add_item(item_id: StringName, quantity: int = 1) -> bool: var item: ItemDataType = _resolve_available_item(item_id) if item == null or quantity <= 0: return false var existing: OwnedItemType = get_owned_item(item_id) - if DecorCatalogType.has_product(item_id): - return ( - _can_own_quantity(item, existing, quantity) - and ( - _inventory_layout == null - or _inventory_layout.can_accept_item(item_id, quantity) - ) - ) if existing != null: return ( item.stackable @@ -261,7 +204,7 @@ func replace_all_items(items: Array[OwnedItemType]) -> bool: var item: ItemDataType = _resolve_valid_item(owned.item_id) if item == null: return false - var maximum: int = _maximum_owned_quantity(item) + var maximum: int = item.max_stack if item.stackable else 1 if owned.quantity > maximum: return false seen[owned.item_id] = true @@ -354,22 +297,3 @@ func _resolve_valid_item(item_id: StringName) -> ItemDataType: func _resolve_available_item(item_id: StringName) -> ItemDataType: var item: ItemDataType = _resolve_valid_item(item_id) return item if item != null and item.active else null - - -func _can_own_quantity( - item: ItemDataType, - existing: OwnedItemType, - quantity: int, -) -> bool: - if item == null or quantity <= 0: - return false - var current: int = existing.quantity if existing != null else 0 - return current + quantity <= _maximum_owned_quantity(item) - - -func _maximum_owned_quantity(item: ItemDataType) -> int: - if item == null: - return 0 - if DecorCatalogType.has_product(item.item_id): - return mini(item.max_stack, DecorCatalogType.MAX_OWNED_PER_PRODUCT) - return item.max_stack if item.stackable else 1 diff --git a/inventory/player_hotbar.gd b/inventory/player_hotbar.gd index 36068ea..b7d5197 100644 --- a/inventory/player_hotbar.gd +++ b/inventory/player_hotbar.gd @@ -314,25 +314,6 @@ func get_fish_slots() -> Array[StringName]: return _fish_slots.duplicate() -func find_item_slot(item_id: StringName) -> int: - return _slots.find(item_id) - - -func find_first_empty_slot() -> int: - for slot_index: int in SLOT_COUNT: - if get_assignment_kind(slot_index) != AssignmentKind.EMPTY: - continue - if ( - _inventory_layout == null - or _inventory_layout.get_key_at( - PlayerInventoryLayout.InventoryContainer.HOTBAR, - slot_index, - ).is_empty() - ): - return slot_index - return -1 - - func replace_state( slots: Array[StringName], selected_slot: int, diff --git a/inventory/player_inventory_layout.gd b/inventory/player_inventory_layout.gd index 3f96270..244e10b 100644 --- a/inventory/player_inventory_layout.gd +++ b/inventory/player_inventory_layout.gd @@ -9,7 +9,6 @@ const PlayerCoolerCapacityType = preload( "res://progression/player_cooler_capacity.gd" ) const PlayerWalletType = preload("res://economy/player_wallet.gd") -const DecorCatalogType = preload("res://homes/decor_catalog.gd") const INVENTORY_COLUMNS: int = 9 const INVENTORY_CAPACITIES: Array[int] = [9, 18, 27, 36] @@ -38,7 +37,6 @@ var _fish_inventory: FishInventoryType var _item_catalog: ItemCatalogType var _storage_capacity: PlayerCoolerCapacityType var _placements: Dictionary[String, Dictionary] = {} -var _prepared_item_placements: Dictionary[StringName, Array] = {} var _reconciling: bool = false var _backpack_level: int = 0 @@ -70,88 +68,11 @@ func setup( _reconcile(true) -func can_accept_item(item_id: StringName, quantity: int = 1) -> bool: +func can_accept_item(item_id: StringName) -> bool: if not is_managed_item(item_id): return true - if quantity <= 0: - return false - if _uses_individual_item_slots(item_id): - var available: int = _available_new_item_slots( - item_id, InventoryContainer.INVENTORY - ) - for value: Variant in _prepared_item_placements.get(item_id, []): - if typeof(value) != TYPE_DICTIONARY: - continue - var placement := value as Dictionary - if ( - int(placement.get("container", -1)) - != InventoryContainer.INVENTORY - and _prepared_item_placement_available(placement) - ): - available += 1 - return available >= quantity - var key := _find_entry_key(EntryKind.ITEM, item_id) - return ( - not key.is_empty() - or _has_available_prepared_item_placement(item_id) - or _first_available_slot(InventoryContainer.INVENTORY) >= 0 - ) - - -func prepare_new_item_placement( - item_id: StringName, - target_container: InventoryContainer, - target_slot: int, -) -> bool: - if not is_managed_item(item_id): - return false - if ( - (not _uses_individual_item_slots(item_id) - and not _find_entry_key(EntryKind.ITEM, item_id).is_empty()) - or not _is_slot_valid(target_container, target_slot) - or not _key_at(target_container, target_slot).is_empty() - or _prepared_slot_is_occupied(target_container, target_slot) - ): - return false - var prepared: Array = _prepared_item_placements.get(item_id, []) - prepared.append({ - "container": int(target_container), - "slot": target_slot, - }) - _prepared_item_placements[item_id] = prepared - return true - - -func cancel_prepared_item_placement(item_id: StringName) -> void: - _prepared_item_placements.erase(item_id) - - -func prepare_new_item_in_first_free( - item_id: StringName, - target_container: InventoryContainer, -) -> bool: - var slot := _first_available_slot(target_container) - return slot >= 0 and prepare_new_item_placement( - item_id, target_container, slot - ) - - -func can_accept_item_in_storage( - item_id: StringName, - quantity: int = 1, -) -> bool: - if not is_managed_item(item_id): - return true - if quantity <= 0: - return false - if _uses_individual_item_slots(item_id): - return _available_new_item_slots( - item_id, InventoryContainer.STORAGE - ) >= quantity - return ( - not _find_entry_key(EntryKind.ITEM, item_id).is_empty() - or _first_available_slot(InventoryContainer.STORAGE) >= 0 - ) + var key := item_key(item_id) + return _placements.has(key) or _first_free_slot(InventoryContainer.INVENTORY) >= 0 func can_accept_catch(catch_id: StringName = StringName()) -> bool: @@ -169,23 +90,19 @@ func is_managed_item(item_id: StringName) -> bool: func is_item_in_inventory(item_id: StringName) -> bool: - return _has_entry_in_container( - EntryKind.ITEM, item_id, InventoryContainer.INVENTORY - ) + return _is_entry_in_container(item_key(item_id), InventoryContainer.INVENTORY) func is_catch_in_inventory(catch_id: StringName) -> bool: - return _has_entry_in_container( - EntryKind.CATCH, catch_id, InventoryContainer.INVENTORY - ) + return _is_entry_in_container(catch_key(catch_id), InventoryContainer.INVENTORY) func is_item_carried(item_id: StringName) -> bool: - return _has_carried_entry(EntryKind.ITEM, item_id) + return _is_entry_carried(item_key(item_id)) func is_catch_carried(catch_id: StringName) -> bool: - return _has_carried_entry(EntryKind.CATCH, catch_id) + return _is_entry_carried(catch_key(catch_id)) func get_inventory_count() -> int: @@ -268,9 +185,7 @@ func get_entries(container: InventoryContainer) -> Array[Dictionary]: func get_entry(kind: EntryKind, identity: StringName) -> Dictionary: - var key := _find_entry_key(kind, identity) - if key.is_empty(): - return {} + var key := _entry_key(kind, identity) return _placements.get(key, {}).duplicate(true) @@ -299,17 +214,7 @@ func move_entry( target_container: InventoryContainer, target_slot: int, ) -> bool: - var key := _find_entry_key_for_move( - kind, identity, target_container, target_slot - ) - return move_entry_by_key(key, target_container, target_slot) - - -func move_entry_by_key( - key: String, - target_container: InventoryContainer, - target_slot: int, -) -> bool: + var key := _entry_key(kind, identity) if not _placements.has(key) or not _is_slot_valid(target_container, target_slot): return false var source: Dictionary = _placements[key] @@ -342,20 +247,15 @@ func move_entry_to_first_free( return slot >= 0 and move_entry(kind, identity, target_container, slot) -func move_entry_key_to_first_free( - key: String, - target_container: InventoryContainer, -) -> bool: - var slot := _first_free_slot(target_container) - return slot >= 0 and move_entry_by_key(key, target_container, slot) - - func return_hotbar_entry_to_inventory(slot: int) -> bool: var key := _key_at(InventoryContainer.HOTBAR, slot) if key.is_empty(): return true - return move_entry_key_to_first_free( - key, InventoryContainer.INVENTORY + var placement: Dictionary = _placements[key] + return move_entry_to_first_free( + int(placement.get("kind", -1)) as EntryKind, + StringName(str(placement.get("identity", ""))), + InventoryContainer.INVENTORY, ) @@ -364,8 +264,10 @@ func return_all_hotbar_entries_to_inventory() -> bool: if get_inventory_count() + entries.size() > get_inventory_capacity(): return false for entry: Dictionary in entries: - if not move_entry_key_to_first_free( - str(entry.get("key", "")), InventoryContainer.INVENTORY + if not move_entry_to_first_free( + int(entry.get("kind", -1)) as EntryKind, + StringName(str(entry.get("identity", ""))), + InventoryContainer.INVENTORY, ): return false return true @@ -381,7 +283,6 @@ func to_save_data() -> Dictionary: serialized.append({ "kind": int(placement.get("kind", EntryKind.ITEM)), "identity": str(placement.get("identity", "")), - "unit": int(placement.get("unit", -1)), "container": int(placement.get("container", InventoryContainer.INVENTORY)), "slot": int(placement.get("slot", -1)), }) @@ -400,7 +301,6 @@ func restore_from_save_data(data: Dictionary) -> bool: return false _backpack_level = clampi(int(level_value), 0, MAX_BACKPACK_LEVEL) var restored: Dictionary[String, Dictionary] = {} - var restored_item_units: Dictionary[StringName, Dictionary] = {} var values: Variant = data.get("placements", []) if typeof(values) != TYPE_ARRAY: return false @@ -423,31 +323,15 @@ func restore_from_save_data(data: Dictionary) -> bool: or not _is_slot_valid(container as InventoryContainer, slot) ): continue - var unit: int = -1 - var key: String - if ( - kind == EntryKind.ITEM - and _uses_individual_item_slots(identity) - ): - var used_units: Dictionary = restored_item_units.get(identity, {}) - unit = int(record.get("unit", -1)) - if unit < 0 or used_units.has(unit): - unit = _first_unused_unit(used_units) - used_units[unit] = true - restored_item_units[identity] = used_units - key = item_unit_key(identity, unit) - else: - key = _entry_key(kind as EntryKind, identity) + var key := _entry_key(kind as EntryKind, identity) if restored.has(key) or _placement_slot_occupied(restored, container, slot): continue restored[key] = { "kind": kind, "identity": identity, - "unit": unit, "container": container, "slot": slot, } - _prepared_item_placements.clear() _placements = restored _reconcile(true) return true @@ -456,7 +340,6 @@ func restore_from_save_data(data: Dictionary) -> bool: func reset_to_defaults() -> void: var capacity_changed := _backpack_level != 0 _backpack_level = 0 - _prepared_item_placements.clear() _placements.clear() _reconcile(true) if capacity_changed: @@ -467,10 +350,6 @@ static func item_key(item_id: StringName) -> String: return "item:%s" % String(item_id) -static func item_unit_key(item_id: StringName, unit: int) -> String: - return "%s:unit:%d" % [item_key(item_id), unit] - - static func catch_key(catch_id: StringName) -> String: return "catch:%s" % String(catch_id) @@ -479,27 +358,15 @@ func _entry_key(kind: EntryKind, identity: StringName) -> String: return item_key(identity) if kind == EntryKind.ITEM else catch_key(identity) -func _has_entry_in_container( - kind: EntryKind, - identity: StringName, - container: InventoryContainer, -) -> bool: - for key: String in _placements: - var placement: Dictionary = _placements[key] - if ( - int(placement.get("kind", -1)) == int(kind) - and StringName(str(placement.get("identity", ""))) == identity - and int(placement.get("container", -1)) == int(container) - ): - return true - return false +func _is_entry_in_container(key: String, container: InventoryContainer) -> bool: + var placement: Dictionary = _placements.get(key, {}) + return int(placement.get("container", -1)) == int(container) -func _has_carried_entry(kind: EntryKind, identity: StringName) -> bool: - return ( - _has_entry_in_container(kind, identity, InventoryContainer.INVENTORY) - or _has_entry_in_container(kind, identity, InventoryContainer.HOTBAR) - ) +func _is_entry_carried(key: String) -> bool: + var placement: Dictionary = _placements.get(key, {}) + var container: int = int(placement.get("container", -1)) + return container in [InventoryContainer.INVENTORY, InventoryContainer.HOTBAR] func _on_contents_changed() -> void: @@ -518,17 +385,8 @@ func _reconcile(force_signal: bool) -> void: for owned in _bag.get_all_items(): if owned == null or not is_managed_item(owned.item_id): continue - if _uses_individual_item_slots(owned.item_id): - _add_expected_individual_items( - expected, owned.item_id, owned.quantity - ) - else: - var key := item_key(owned.item_id) - expected[key] = { - "kind": EntryKind.ITEM, - "identity": owned.item_id, - "unit": -1, - } + var key := item_key(owned.item_id) + expected[key] = {"kind": EntryKind.ITEM, "identity": owned.item_id} for fish_catch in _fish_inventory.get_all_catches(): if fish_catch == null or not fish_catch.is_valid(): continue @@ -544,17 +402,8 @@ func _reconcile(force_signal: bool) -> void: for key: String in expected: if _placements.has(key): continue - var identity := StringName(str(expected[key].get("identity", ""))) - var prepared: Dictionary = _take_prepared_item_placement(identity) var target_container := InventoryContainer.INVENTORY - var target_slot: int = -1 - if not prepared.is_empty(): - target_container = int( - prepared["container"] - ) as InventoryContainer - target_slot = int(prepared["slot"]) - if target_slot < 0: - target_slot = _first_free_slot(target_container) + var target_slot := _first_free_slot(target_container) if target_slot < 0: target_container = InventoryContainer.STORAGE target_slot = _first_free_slot(target_container) @@ -571,59 +420,6 @@ func _reconcile(force_signal: bool) -> void: layout_changed.emit() -func _add_expected_individual_items( - expected: Dictionary[String, Dictionary], - item_id: StringName, - quantity: int, -) -> void: - var existing_keys: Array[String] = _item_entry_keys(item_id) - existing_keys.sort_custom( - func(left: String, right: String) -> bool: - return _placement_preservation_priority(left) < ( - _placement_preservation_priority(right) - ) - ) - var used_units: Dictionary[int, bool] = {} - var retained: int = 0 - for key: String in existing_keys: - if retained >= quantity: - break - var placement: Dictionary = _placements[key] - var unit: int = int(placement.get("unit", -1)) - if unit < 0 or used_units.has(unit): - continue - used_units[unit] = true - expected[key] = { - "kind": EntryKind.ITEM, - "identity": item_id, - "unit": unit, - } - retained += 1 - while retained < quantity: - var unit := _first_unused_unit(used_units) - used_units[unit] = true - var key := item_unit_key(item_id, unit) - expected[key] = { - "kind": EntryKind.ITEM, - "identity": item_id, - "unit": unit, - } - retained += 1 - - -func _placement_preservation_priority(key: String) -> int: - var placement: Dictionary = _placements.get(key, {}) - var container: int = int(placement.get("container", -1)) - match container: - InventoryContainer.HOTBAR: - return 0 - InventoryContainer.INVENTORY: - return 1 - InventoryContainer.STORAGE: - return 2 - return 3 - - func _normalize_existing_placements() -> void: var occupied_inventory: Dictionary[int, bool] = {} var occupied_storage: Dictionary[int, bool] = {} @@ -683,189 +479,11 @@ func _first_free_slot(container: InventoryContainer) -> int: else get_storage_capacity() ) for slot: int in capacity: - if ( - _key_at(container, slot).is_empty() - and not _prepared_slot_is_occupied(container, slot) - ): + if _key_at(container, slot).is_empty(): return slot return -1 -func _first_available_slot(container: InventoryContainer) -> int: - var capacity := ( - get_inventory_capacity() if container == InventoryContainer.INVENTORY - else HOTBAR_SLOT_COUNT if container == InventoryContainer.HOTBAR - else get_storage_capacity() - ) - for slot: int in capacity: - if ( - _key_at(container, slot).is_empty() - and not _prepared_slot_is_occupied(container, slot) - ): - return slot - return -1 - - -func _has_available_prepared_item_placement(item_id: StringName) -> bool: - for value: Variant in _prepared_item_placements.get(item_id, []): - if typeof(value) != TYPE_DICTIONARY: - continue - if _prepared_item_placement_available(value as Dictionary): - return true - return false - - -func _take_prepared_item_placement(item_id: StringName) -> Dictionary: - var prepared: Array = _prepared_item_placements.get(item_id, []) - while not prepared.is_empty(): - var value: Variant = prepared.pop_front() - if prepared.is_empty(): - _prepared_item_placements.erase(item_id) - else: - _prepared_item_placements[item_id] = prepared - if ( - typeof(value) == TYPE_DICTIONARY - and _prepared_item_placement_available(value as Dictionary) - ): - return (value as Dictionary).duplicate(true) - return {} - - -func _prepared_item_placement_available(placement: Dictionary) -> bool: - var container: int = int(placement.get("container", -1)) - var slot: int = int(placement.get("slot", -1)) - if ( - container not in [ - InventoryContainer.INVENTORY, - InventoryContainer.STORAGE, - InventoryContainer.HOTBAR, - ] - or not _is_slot_valid(container as InventoryContainer, slot) - ): - return false - return _key_at(container as InventoryContainer, slot).is_empty() - - -func _prepared_slot_is_occupied( - container: InventoryContainer, - slot: int, -) -> bool: - for prepared: Array in _prepared_item_placements.values(): - for value: Variant in prepared: - if typeof(value) != TYPE_DICTIONARY: - continue - var placement := value as Dictionary - if ( - int(placement.get("container", -1)) == int(container) - and int(placement.get("slot", -1)) == slot - ): - return true - return false - - -func _available_new_item_slots( - item_id: StringName, - container: InventoryContainer, -) -> int: - var available: int = 0 - for value: Variant in _prepared_item_placements.get(item_id, []): - if typeof(value) != TYPE_DICTIONARY: - continue - var placement := value as Dictionary - if ( - int(placement.get("container", -1)) == int(container) - and _prepared_item_placement_available(placement) - ): - available += 1 - var capacity := ( - get_inventory_capacity() if container == InventoryContainer.INVENTORY - else HOTBAR_SLOT_COUNT if container == InventoryContainer.HOTBAR - else get_storage_capacity() - ) - for slot: int in capacity: - if ( - _key_at(container, slot).is_empty() - and not _prepared_slot_is_occupied(container, slot) - ): - available += 1 - return available - - -func _uses_individual_item_slots(item_id: StringName) -> bool: - return DecorCatalogType.has_product(item_id) - - -func _item_entry_keys(item_id: StringName) -> Array[String]: - var result: Array[String] = [] - for key: String in _placements: - var placement: Dictionary = _placements[key] - if ( - int(placement.get("kind", -1)) == EntryKind.ITEM - and StringName(str(placement.get("identity", ""))) == item_id - ): - result.append(key) - return result - - -func _find_entry_key(kind: EntryKind, identity: StringName) -> String: - var preferred_key: String = "" - var preferred_priority: int = 99 - for key: String in _placements: - var placement: Dictionary = _placements[key] - if ( - int(placement.get("kind", -1)) != int(kind) - or StringName(str(placement.get("identity", ""))) != identity - ): - continue - var priority := _placement_preservation_priority(key) - if priority < preferred_priority: - preferred_key = key - preferred_priority = priority - return preferred_key - - -func _find_entry_key_for_move( - kind: EntryKind, - identity: StringName, - target_container: InventoryContainer, - target_slot: int, -) -> String: - var target_key := _key_at(target_container, target_slot) - if not target_key.is_empty(): - var target: Dictionary = _placements[target_key] - if ( - int(target.get("kind", -1)) == int(kind) - and StringName(str(target.get("identity", ""))) == identity - ): - return target_key - var preferred_key: String = "" - var preferred_priority: int = 99 - for key: String in _placements: - var placement: Dictionary = _placements[key] - if ( - int(placement.get("kind", -1)) != int(kind) - or StringName(str(placement.get("identity", ""))) != identity - ): - continue - var container: int = int(placement.get("container", -1)) - var priority: int = ( - 0 if container == InventoryContainer.INVENTORY - else 1 if container == InventoryContainer.STORAGE - else 2 - ) - if priority < preferred_priority: - preferred_key = key - preferred_priority = priority - return preferred_key - - -func _first_unused_unit(used_units: Dictionary) -> int: - var unit: int = 0 - while used_units.has(unit): - unit += 1 - return unit - - func _key_at(container: InventoryContainer, slot: int) -> String: for key: String in _placements: var placement: Dictionary = _placements[key] diff --git a/items/catalog/basic_cube.tres b/items/catalog/basic_cube.tres deleted file mode 100644 index 54dfb15..0000000 --- a/items/catalog/basic_cube.tres +++ /dev/null @@ -1,17 +0,0 @@ -[gd_resource type="Resource" script_class="ItemData" load_steps=3 format=3] - -[ext_resource type="Script" path="res://items/item_data.gd" id="1_item"] -[ext_resource type="Texture2D" path="res://ui/icons/pictograms/x_light.png" id="2_icon"] - -[resource] -script = ExtResource("1_item") -item_id = &"basic_cube" -display_name = "basic cube" -description = "a simple piece of decor for testing your RV layout." -category = 6 -icon = ExtResource("2_icon") -stackable = false -max_stack = 32 -usable = false -equippable = true -hotbar_allowed = true diff --git a/items/catalog/item_catalog.tres b/items/catalog/item_catalog.tres index 2f15e0a..63ef3ea 100644 --- a/items/catalog/item_catalog.tres +++ b/items/catalog/item_catalog.tres @@ -1,4 +1,4 @@ -[gd_resource type="Resource" script_class="ItemCatalog" load_steps=42 format=3] +[gd_resource type="Resource" script_class="ItemCatalog" load_steps=41 format=3] [ext_resource type="Script" path="res://items/item_catalog.gd" id="1_script"] [ext_resource type="Resource" path="res://items/catalog/basic_fishing_rod.tres" id="2_rod"] @@ -40,8 +40,7 @@ [ext_resource type="Resource" path="res://items/catalog/crab_net.tres" id="39_crab_net"] [ext_resource type="Resource" path="res://items/catalog/standard_shovel.tres" id="40_shovel"] [ext_resource type="Resource" path="res://items/catalog/fishing_net.tres" id="41_fishing_net"] -[ext_resource type="Resource" path="res://items/catalog/basic_cube.tres" id="42_basic_cube"] [resource] script = ExtResource("1_script") -items = [ExtResource("2_rod"), ExtResource("3_coffee"), ExtResource("4_energy"), ExtResource("5_snack"), ExtResource("6_finder"), ExtResource("8_art_kit"), ExtResource("9_worms"), ExtResource("10_snails"), ExtResource("11_shrimp"), ExtResource("12_squid"), ExtResource("14_sardine"), ExtResource("13_anchovy"), ExtResource("15_roe"), ExtResource("16_standby"), ExtResource("17_batteries"), ExtResource("18_cardboard"), ExtResource("19_pond"), ExtResource("20_river"), ExtResource("21_lake"), ExtResource("22_salt"), ExtResource("23_whisker"), ExtResource("24_reef"), ExtResource("25_moonbeam"), ExtResource("26_sun"), ExtResource("27_rain"), ExtResource("28_fog"), ExtResource("29_guide"), ExtResource("30_small"), ExtResource("31_heavy"), ExtResource("32_rocket"), ExtResource("33_lucky"), ExtResource("34_showboat"), ExtResource("35_deep"), ExtResource("36_oddity"), ExtResource("37_aurora"), ExtResource("38_magnet"), ExtResource("39_crab_net"), ExtResource("40_shovel"), ExtResource("41_fishing_net"), ExtResource("42_basic_cube")] +items = [ExtResource("2_rod"), ExtResource("3_coffee"), ExtResource("4_energy"), ExtResource("5_snack"), ExtResource("6_finder"), ExtResource("8_art_kit"), ExtResource("9_worms"), ExtResource("10_snails"), ExtResource("11_shrimp"), ExtResource("12_squid"), ExtResource("14_sardine"), ExtResource("13_anchovy"), ExtResource("15_roe"), ExtResource("16_standby"), ExtResource("17_batteries"), ExtResource("18_cardboard"), ExtResource("19_pond"), ExtResource("20_river"), ExtResource("21_lake"), ExtResource("22_salt"), ExtResource("23_whisker"), ExtResource("24_reef"), ExtResource("25_moonbeam"), ExtResource("26_sun"), ExtResource("27_rain"), ExtResource("28_fog"), ExtResource("29_guide"), ExtResource("30_small"), ExtResource("31_heavy"), ExtResource("32_rocket"), ExtResource("33_lucky"), ExtResource("34_showboat"), ExtResource("35_deep"), ExtResource("36_oddity"), ExtResource("37_aurora"), ExtResource("38_magnet"), ExtResource("39_crab_net"), ExtResource("40_shovel"), ExtResource("41_fishing_net")] diff --git a/items/item_data.gd b/items/item_data.gd index 1f126a9..72ac0d6 100644 --- a/items/item_data.gd +++ b/items/item_data.gd @@ -36,6 +36,7 @@ func is_valid() -> bool: not item_id.is_empty() and not display_name.strip_edges().is_empty() and max_stack >= 1 + and (stackable or max_stack == 1) ) diff --git a/jobs/job_catalog.gd b/jobs/job_catalog.gd index b88fcbf..eb3ea02 100644 --- a/jobs/job_catalog.gd +++ b/jobs/job_catalog.gd @@ -28,10 +28,6 @@ const WEATHER_SEGMENT_COUNT: int = ( ) const LEGACY_WEATHER_SEGMENT_HOURS: float = 2.0 const LEGACY_WEATHER_SEGMENT_COUNT: int = 12 -const SUNNY_WEATHER_WEIGHT: float = 0.48 -const CLOUDY_WEATHER_WEIGHT: float = 0.29 -const RAINY_WEATHER_WEIGHT: float = 0.19 -const FOGGY_WEATHER_WEIGHT: float = 0.04 const MAX_JOB_REWARD_COINS: int = 100000 const MAX_JOB_REWARD_EXPERIENCE: int = 10000 @@ -163,21 +159,13 @@ static func generate_weather_schedule( rng.seed = plan_id.hash() ^ 0x57454154 var weather_values: Array[int] = [] for index: int in WEATHER_SEGMENT_COUNT: - var total_weight: float = ( - SUNNY_WEATHER_WEIGHT - + CLOUDY_WEATHER_WEIGHT - + RAINY_WEATHER_WEIGHT - + FOGGY_WEATHER_WEIGHT - ) - var roll: float = rng.randf() * total_weight + var roll: float = rng.randf() var weather: int = int(WorldWeatherService.Weather.SUNNY) - var cloudy_end: float = SUNNY_WEATHER_WEIGHT + CLOUDY_WEATHER_WEIGHT - var rainy_end: float = cloudy_end + RAINY_WEATHER_WEIGHT - if roll >= SUNNY_WEATHER_WEIGHT and roll < cloudy_end: + if roll >= 0.42 and roll < 0.70: weather = int(WorldWeatherService.Weather.CLOUDY) - elif roll >= cloudy_end and roll < rainy_end: + elif roll >= 0.70 and roll < 0.88: weather = int(WorldWeatherService.Weather.RAINY) - elif roll >= rainy_end: + elif roll >= 0.88: weather = int(WorldWeatherService.Weather.FOGGY) weather_values.append(weather) for requirement_index: int in required.size(): diff --git a/main/main.gd b/main/main.gd index 6cacbca..1724bd9 100644 --- a/main/main.gd +++ b/main/main.gd @@ -37,12 +37,6 @@ const FishingShopType = preload("res://ui/fishing_shop.gd") const FishingShopInteractionType = preload( "res://world/fishing_shop_interaction.gd" ) -const DecorShopInteractionType = preload( - "res://world/decor_shop_interaction.gd" -) -const RVUpgradeInteractionType = preload( - "res://world/rv_upgrade_interaction.gd" -) const PlayerStorageInteractionType = preload( "res://world/player_storage_interaction.gd" ) @@ -76,7 +70,6 @@ const NetworkFishingServiceType = preload( "res://network/network_fishing_service.gd" ) const PlayerHotbarType = preload("res://inventory/player_hotbar.gd") -const DecorCatalogType = preload("res://homes/decor_catalog.gd") const NetworkSaleServiceType = preload( "res://network/network_sale_service.gd" ) @@ -119,9 +112,6 @@ const NetworkWorldWeatherServiceType = preload( "res://network/network_world_weather_service.gd" ) const RainAmbienceType = preload("res://world/rain_ambience.gd") -const RainPuddlePresentationType = preload( - "res://world/rain_puddle_presentation.gd" -) const PlayerJobServiceType = preload("res://jobs/player_job_service.gd") const NetworkJobServiceType = preload("res://network/network_job_service.gd") const GatherableCatalogType = preload( @@ -133,14 +123,6 @@ const GatheringControllerType = preload( const NetworkWorldSpawnServiceType = preload( "res://network/network_world_spawn_service.gd" ) -const PlayerHomeStateType = preload("res://homes/player_home_state.gd") -const HomeWorldServiceType = preload("res://homes/home_world_service.gd") -const NetworkHomeServiceType = preload( - "res://network/network_home_service.gd" -) -const HomeDecorControllerType = preload( - "res://homes/home_decor_controller.gd" -) const TITLE_MUSIC_SILENCE_DB: float = -80.0 const TITLE_MUSIC_PATH: String = ( @@ -149,18 +131,11 @@ const TITLE_MUSIC_PATH: String = ( const NEW_GAME_MUSIC_PATH: String = "res://audio/music/world/tulips.wav" const DUSK_MUSIC_PATH: String = "res://audio/music/world/craft.mp3" const TIME_CROSSING_EPSILON_HOURS: float = 0.000001 -const RAIN_VISUAL_MOTION_MULTIPLIER: float = 2.0 +const PLAYER_MENU_PATTERN_SCALE: float = 0.85 +const PLAYER_MENU_PATTERN_SCROLL_VELOCITY := Vector2(-7.0, -5.0) +const SHOP_PATTERN_SCALE: float = 1.75 const DEDICATED_IDLE_PHYSICS_TICKS_PER_SECOND: int = 10 const DEDICATED_ACTIVE_PHYSICS_TICKS_PER_SECOND: int = 30 -const HOME_ENTRY_INPUT_OWNER: StringName = &"home_entry_transition" -const HOME_EXIT_INPUT_OWNER: StringName = &"home_exit_transition" -const HOME_EXIT_FADE_GENERATION: int = -104729 -const HOME_ENTRY_WALK_DISTANCE: float = 1.05 -const HOME_ENTRY_WALK_DURATION: float = 0.55 -const HOME_EXIT_WALK_DISTANCE: float = 1.25 -const HOME_EXIT_WALK_DURATION: float = 0.62 -const SHOP_NPC_HANDOFF_HYSTERESIS_METERS: float = 0.1 -const SHOP_NPC_CONVERSATION_INPUT_OWNER: StringName = &"shop_npc_conversation" @export var fish_catalog: FishPoolType @export var pelican_buyer_profile: FishBuyerProfileType @@ -178,7 +153,6 @@ const SHOP_NPC_CONVERSATION_INPUT_OWNER: StringName = &"shop_npc_conversation" @onready var _game_ui: GameUIType = %GameUI @onready var _water_recovery: WaterRecoveryControllerType = %WaterRecovery @onready var _save_manager: PlayerSaveManagerType = %PlayerSaveManager -@onready var _home_state: PlayerHomeStateType = %PlayerHomeState @onready var _settings_manager: PlayerSettingsManagerType = %PlayerSettingsManager @onready var _controller_mapping_manager: ControllerMappingManagerType = ( %ControllerMappingManager @@ -238,10 +212,6 @@ const SHOP_NPC_CONVERSATION_INPUT_OWNER: StringName = &"shop_npc_conversation" ) @onready var _network_sale: NetworkSaleServiceType = %NetworkSaleService @onready var _network_shop: NetworkShopServiceType = %NetworkShopService -@onready var _network_home: NetworkHomeServiceType = %NetworkHomeService -@onready var _home_decor_controller: HomeDecorControllerType = ( - %HomeDecorController -) @onready var _network_item_use: NetworkItemUseServiceType = ( %NetworkItemUseService ) @@ -264,18 +234,13 @@ const SHOP_NPC_CONVERSATION_INPUT_OWNER: StringName = &"shop_npc_conversation" @onready var _players_root: Node3D = $Players @onready var _surface_drawings_root: Node3D = $SurfaceDrawings @onready var _world_gatherables_root: Node3D = $WorldGatherables -@onready var _home_world: HomeWorldServiceType = %HomeWorldService @onready var _title_background: ColorRect = %TitleBackground +@onready var _player_menu_backdrop: ColorRect = %PlayerMenuBackdrop +@onready var _shop_backdrop: ColorRect = %ShopBackdrop var _gameplay_started: bool = false var _save_slots := PlayerSaveSlotCatalogType.new() var _shop_interaction: FishingShopInteractionType -var _decor_shop_interaction: DecorShopInteractionType -var _rv_upgrade_shop_interaction: RVUpgradeInteractionType -var _active_shop_npc_interaction: FishingShopInteractionType -var _engaged_shop_npc_interaction: FishingShopInteractionType -var _shop_conversation_shop_opened: bool = false -var _shop_conversation_camera_restoring: bool = false var _storage_interaction: PlayerStorageInteractionType var _title_music_tween: Tween var _title_music_transition_generation: int = 0 @@ -284,6 +249,8 @@ var _dusk_music_played_for_natural_day: bool = false var _quit_in_progress: bool = false var _join_requested_from_title: bool = false var _join_requested_from_pause: bool = false +var _player_menu_backdrop_tween: Tween +var _shop_backdrop_tween: Tween var _pending_join_endpoint: String = "" var _social_prompt_queue: Array[Dictionary] = [] var _active_social_prompt: Dictionary = {} @@ -304,20 +271,12 @@ var _pending_existing_root_path := "" var _local_recovery_attempt_id: String = "" var _dedicated_runtime: bool = false var _dedicated_metrics_accumulator: float = 0.0 -var _home_exit_transition_active: bool = false -var _home_exit_waiting_for_network: bool = false -var _home_exit_start_position: Vector3 = Vector3.ZERO -var _home_exit_walk_tween: Tween -var _home_entry_transition_active: bool = false -var _home_entry_walk_tween: Tween -var _observed_cancel_input_frame: int = -1 +@onready var _shoreline_ambience: ShorelineAmbience = %ShorelineAmbience var _rain_ambience: RainAmbienceType -var _rain_puddles: RainPuddlePresentationType func _ready() -> void: - _data_root.prepare_legacy_user_data() _performance_profile = RuntimePerformanceProfileType.from_environment() _dedicated_runtime = _is_dedicated_server_runtime() if _dedicated_runtime: @@ -335,15 +294,18 @@ func _ready() -> void: _configure_presentation_performance_profile( _performance_profile.is_light() ) - DisplayServer.window_set_title("straywild") + DisplayServer.window_set_title("NETfishing") _rain_ambience = RainAmbienceType.new() _rain_ambience.name = "RainAmbience" add_child(_rain_ambience) _rain_ambience.configure(_world_weather) - _rain_puddles = RainPuddlePresentationType.new() - _rain_puddles.name = "RainPuddlePresentation" - add_child(_rain_puddles) _configure_audio_performance_profile(_performance_profile.is_light()) + _shoreline_ambience.configure( + _player, + _test_world.get_saltwater_shoreline_mesh(), + ) + get_window().size_changed.connect(_resize_native_overlays) + _resize_native_overlays() if not _settings_manager.settings_changed.is_connected( _apply_runtime_settings ): @@ -362,15 +324,52 @@ func _ready() -> void: func _configure_presentation_performance_profile(light_profile: bool) -> void: + _game_ui.get_title_screen().set_minimal_presentation(light_profile) _game_ui.set_light_performance_profile(light_profile) - var title_background_material := ( - _title_background.material as ShaderMaterial - ) - if title_background_material != null: - title_background_material.set_shader_parameter( + var title_water_material := _title_background.material as ShaderMaterial + if title_water_material != null: + title_water_material.set_shader_parameter( "animation_enabled", not light_profile, ) + var menu_pattern_material := ( + _player_menu_backdrop.material as ShaderMaterial + ) + if menu_pattern_material != null: + menu_pattern_material.set_shader_parameter( + "animation_enabled", + not light_profile, + ) + menu_pattern_material.set_shader_parameter( + "display_scale", + PLAYER_MENU_PATTERN_SCALE, + ) + menu_pattern_material.set_shader_parameter( + "scroll_velocity_pixels", + ( + Vector2.ZERO + if light_profile + else PLAYER_MENU_PATTERN_SCROLL_VELOCITY + ), + ) + var shop_pattern_material := _shop_backdrop.material as ShaderMaterial + if shop_pattern_material != null: + shop_pattern_material.set_shader_parameter( + "animation_enabled", + not light_profile, + ) + shop_pattern_material.set_shader_parameter( + "display_scale", + SHOP_PATTERN_SCALE, + ) + shop_pattern_material.set_shader_parameter( + "scroll_velocity_pixels", + ( + Vector2.ZERO + if light_profile + else PLAYER_MENU_PATTERN_SCROLL_VELOCITY + ), + ) func _configure_audio_performance_profile(light_profile: bool) -> void: @@ -378,30 +377,13 @@ func _configure_audio_performance_profile(light_profile: bool) -> void: _new_game_music.stream = _load_optional_audio_stream(NEW_GAME_MUSIC_PATH) _dusk_music.stream = _load_optional_audio_stream(DUSK_MUSIC_PATH) if light_profile: + _shoreline_ambience.set_audio_enabled(false) _rain_ambience.set_audio_enabled(false) return + _shoreline_ambience.set_audio_enabled(true) _rain_ambience.set_audio_enabled(true) -func _on_world_weather_changed( - weather: WorldWeatherService.Weather, - _seconds_remaining: float, -) -> void: - _apply_weather_visual_motion(weather) - - -func _apply_weather_visual_motion( - weather: WorldWeatherService.Weather, -) -> void: - var multiplier: float = ( - RAIN_VISUAL_MOTION_MULTIPLIER - if weather == WorldWeatherService.Weather.RAINY - else 1.0 - ) - _test_world.set_foliage_wind_strength_multiplier(multiplier) - _test_world.set_water_motion_strength_multiplier(multiplier) - - func _load_optional_audio_stream(path: String) -> AudioStream: if not ResourceLoader.exists(path, "AudioStream"): return null @@ -417,6 +399,8 @@ func _is_dedicated_server_runtime() -> bool: func _disable_dedicated_presentation_tree() -> void: for path: NodePath in [ NodePath("TitleBackgroundLayer"), + NodePath("PlayerMenuBackdrop"), + NodePath("ShopBackdrop"), NodePath("WorldPixelationPostprocess"), NodePath("UIPresentation"), NodePath("PixelationResetOverlay"), @@ -439,6 +423,7 @@ func _disable_dedicated_presentation_tree() -> void: NodePath("TitleMusic"), NodePath("NewGameMusic"), NodePath("DuskMusic"), + NodePath("ShorelineAmbience"), ]: var audio_node: Node = get_node_or_null(audio_path) if audio_node == null: @@ -476,7 +461,7 @@ func _print_dedicated_metrics() -> void: metrics["gatherables"] = _network_world_spawns.call( "get_network_metrics" ) - print("straywild server metrics: %s" % JSON.stringify(metrics)) + print("NETfishing server metrics: %s" % JSON.stringify(metrics)) func _start_dedicated_server() -> void: @@ -485,7 +470,10 @@ func _start_dedicated_server() -> void: _fail_dedicated_server(config.error_message) return var data_path: String = config.data_directory - if not _data_root.has_data_manifest(data_path): + var manifest_path: String = data_path.path_join( + PlayerDataRoot.MANIFEST_FILENAME + ) + if not FileAccess.file_exists(manifest_path): var created: Dictionary = _data_root.create_unbound_root(data_path) if not bool(created.get("ok", false)): _fail_dedicated_server(str(created.get( @@ -568,7 +556,7 @@ func _start_dedicated_server() -> void: _fail_dedicated_server(_discovery.get_host_status_message()) return print( - "straywild dedicated server ready: %s on %s:%d (%d players, %s, timezone %s)" + "NETfishing dedicated server ready: %s on %s:%d (%d players, %s, timezone %s)" % [ config.server_name, config.bind_address, @@ -673,17 +661,6 @@ func _initialize_application(dedicated: bool) -> void: Callable(_player, "get_active_gameplay_camera"), _performance_profile.is_light(), ) - _rain_puddles.configure( - _test_world, - _world_weather, - _player, - _performance_profile.is_light(), - ) - if not _world_weather.weather_changed.is_connected( - _on_world_weather_changed - ): - _world_weather.weather_changed.connect(_on_world_weather_changed) - _apply_weather_visual_motion(_world_weather.get_weather()) if not _world_time.natural_time_advanced.is_connected( _on_natural_time_advanced ): @@ -748,7 +725,6 @@ func _initialize_application(dedicated: bool) -> void: _player.wallet, _asset_reservations ) - _player.cooler_capacity.bind_home_state(_home_state) _player.bag.setup(item_catalog) _player.inventory_layout.setup( _player.bag, @@ -765,25 +741,14 @@ func _initialize_application(dedicated: bool) -> void: _player.inventory_layout, ) _shop_interaction = _test_world.get_fishing_shop() - _decor_shop_interaction = _test_world.get_decor_shop() - _rv_upgrade_shop_interaction = _test_world.get_rv_upgrade_shop() - _active_shop_npc_interaction = null _storage_interaction = _test_world.get_player_storage() if not dedicated: - if not _home_state.changed.is_connected(_on_home_state_changed): - _home_state.changed.connect(_on_home_state_changed) _shop_interaction.setup_local_player(_player) _shop_interaction.local_player_range_changed.connect( _on_shop_range_changed ) - _refresh_shop_npc_speech_state() - _decor_shop_interaction.setup_local_player(_player) - _decor_shop_interaction.local_player_range_changed.connect( - _on_decor_shop_range_changed - ) - _rv_upgrade_shop_interaction.setup_local_player(_player) - _rv_upgrade_shop_interaction.local_player_range_changed.connect( - _on_rv_upgrade_shop_range_changed + _game_ui.set_shop_npc_player_in_range( + _shop_interaction.is_local_player_in_range() ) _storage_interaction.setup_local_player(_player) _storage_interaction.local_player_range_changed.connect( @@ -806,25 +771,6 @@ func _initialize_application(dedicated: bool) -> void: _world_weather, _player_jobs, _player, - _home_state, - _network_profile if not dedicated else null, - _appearance_store if not dedicated else null, - ) - _home_world.setup( - _test_world, - _player_spawn_service, - _network_session, - dedicated, - ) - _network_home.setup( - _network_session, - _player_spawn_service, - _home_state, - _save_manager, - _home_world, - _player.bag, - _player.inventory_layout, - _player.hotbar, ) _player_jobs.set_save_manager(_save_manager) _save_manager.set_autosave_enabled(false) @@ -958,10 +904,6 @@ func _initialize_application(dedicated: bool) -> void: _save_manager, _asset_reservations, _player.inventory_layout, - _home_state, - _network_home, - _decor_shop_interaction, - _rv_upgrade_shop_interaction, ) _fishing_spot.setup( _player, @@ -979,7 +921,6 @@ func _initialize_application(dedicated: bool) -> void: _network_fishing, _world_time, _world_weather, - Callable(_test_world, "get_fishable_water_regions"), ) if dedicated: return @@ -1001,14 +942,11 @@ func _initialize_application(dedicated: bool) -> void: _player.fishing_upgrades, _shop_interaction, _storage_interaction, - _decor_shop_interaction, - _rv_upgrade_shop_interaction, _player.item_effects, _player.cooler_capacity, _network_session, _network_sale, _network_shop, - _home_state, _network_chat, _network_profile, _player_spawn_service, @@ -1026,30 +964,6 @@ func _initialize_application(dedicated: bool) -> void: _test_world.get_world_environment(), _test_world.get_sun(), ) - _home_decor_controller.setup( - _player, - _player.hotbar, - _player.bag, - _home_state, - _network_home, - _home_world, - _fishing_spot, - _game_ui.get_home_decor_toolbar(), - ) - _home_decor_controller.exit_requested.connect( - _on_home_toolbar_exit_requested - ) - _game_ui.get_player_storage().decorate_requested.connect( - _home_decor_controller.begin_decorating - ) - _network_home.local_space_changed.connect(_on_local_home_space_changed) - _network_home.local_transition_finished.connect( - _on_local_home_transition_finished - ) - _game_ui.get_screen_fade().transition_completed.connect( - _on_home_exit_fade_transition_completed - ) - _game_ui.rv_storage_requested.connect(_on_rv_storage_requested) _game_ui.setup_data_and_identity( _data_root, _identity_backups, @@ -1058,7 +972,6 @@ func _initialize_application(dedicated: bool) -> void: _network_session, _interface_fonts, ) - _game_ui.data_root_changed.connect(_on_data_root_changed) _game_ui.setup_controller_mapping(_controller_mapping_manager) _ui_pixelation.setup_controller_mapping(_controller_mapping_manager) _game_ui.setup_keyboard_mouse_mapping(_keyboard_mouse_mapping_manager) @@ -1093,8 +1006,7 @@ func _initialize_application(dedicated: bool) -> void: _game_ui, _game_ui.get_screen_fade(), _test_world.get_player_water_triggers(), - _test_world.get_safe_respawn_points(), - Callable(_test_world, "get_water_recovery_position"), + _test_world.get_safe_respawn_points() ) _ui_pixelation.effective_pixel_size_changed.connect( _on_effective_ui_pixel_size_changed @@ -1111,19 +1023,12 @@ func _initialize_application(dedicated: bool) -> void: _game_ui.passive_pointer_ui_changed.connect( _ui_pixelation.set_passive_pointer_ui_enabled ) - _game_ui.get_node("%PlayerMenu").connect( - &"menu_visibility_changed", - _on_player_menu_conversation_visibility_changed + _game_ui.player_menu_backdrop_visibility_changed.connect( + _set_player_menu_backdrop_visible + ) + _game_ui.shop_backdrop_visibility_changed.connect( + _set_shop_backdrop_visible ) - for shop_menu: Node in [ - _game_ui.get_fishing_shop(), - _game_ui.get_decor_shop(), - _game_ui.get_rv_upgrade_shop(), - ]: - shop_menu.connect( - &"menu_visibility_changed", - _on_shop_conversation_menu_visibility_changed - ) _pixelation_reset.return_to_settings_requested.connect( _game_ui.focus_open_settings_back_button ) @@ -1168,9 +1073,6 @@ func _initialize_application(dedicated: bool) -> void: pause_menu.menu_visibility_changed.connect( _game_ui.set_system_menu_open ) - pause_menu.menu_visibility_changed.connect( - _on_pause_menu_conversation_visibility_changed - ) _player.hotbar.selected_assignment_changed.connect( _on_active_hotbar_item_changed ) @@ -1194,7 +1096,7 @@ func _initialize_application(dedicated: bool) -> void: func _show_data_root_setup() -> void: if _data_setup_dialog == null: _data_setup_dialog = ConfirmationDialog.new() - _data_setup_dialog.title = "straywild player data" + _data_setup_dialog.title = "NETfishing player data" _data_setup_dialog.ok_button_text = "Use This Folder" _data_setup_dialog.cancel_button_text = "Quit" _data_setup_dialog.confirmed.connect(_use_default_data_root) @@ -1211,14 +1113,14 @@ func _show_data_root_setup() -> void: var default_path: String = _data_root.default_visible_path() var legacy: bool = PortableDataMigration.legacy_files_present() _data_setup_dialog.dialog_text = ( - ("Move your existing straywild data to an easy-to-find folder." - if legacy else "Choose where straywild stores your player data.") + ("Move your existing NETfishing data to an easy-to-find folder." + if legacy else "Choose where NETfishing stores your player data.") + "\n\n%s\n\nYou can choose a Syncthing folder." % (default_path if not default_path.is_empty() else "Choose a folder") ) _data_setup_dialog.ok_button_text = ( ( - "Move to Documents/straywild" + "Move to Documents/NETFISHING" if legacy else "Use This Folder" ) if not default_path.is_empty() @@ -1227,7 +1129,7 @@ func _show_data_root_setup() -> void: _data_setup_current_button.visible = not default_path.is_empty() if not _data_root.error_message.is_empty(): _data_setup_dialog.dialog_text = ( - "Your straywild data folder is unavailable.\n\n%s" + "Your NETfishing data folder is unavailable.\n\n%s" % _data_root.error_message ) _data_setup_dialog.popup_centered(Vector2i(640, 360)) @@ -1363,11 +1265,11 @@ func _activate_selected_data_path(path: String, app_data: bool = false) -> void: func _show_existing_root_choice(path: String) -> void: _pending_existing_root_path = path var dialog: ConfirmationDialog = ConfirmationDialog.new() - dialog.title = "Existing straywild data" + dialog.title = "Existing NETfishing data" dialog.ok_button_text = "Use Data Already in Selected Folder" dialog.cancel_button_text = "Cancel" dialog.dialog_text = ( - "This folder already contains straywild player data.\n\n" + "This folder already contains NETfishing player data.\n\n" + "Choose which complete data set to use. Data is never merged automatically." ) dialog.add_button( @@ -1441,25 +1343,6 @@ func _on_data_root_status(message: String) -> void: _configure_popup_dialog.call_deferred(dialog, dialog.get_ok_button()) -func _on_data_root_changed() -> void: - _save_manager.set_autosave_enabled(false) - _save_manager.cancel_pending_autosave() - _configure_portable_stores() - var profile_reloaded: bool = ( - _network_profile_service.reload_persisted_profile() - ) - if not profile_reloaded: - push_warning("The selected data folder's player profile could not be loaded.") - else: - _save_manager.capture_legacy_character_fallback() - if not _save_manager.load_character_profile(): - push_warning("The active save's character profile could not be loaded.") - _network_session.set_local_appearance_snapshot( - _appearance_store.get_snapshot() - ) - _game_ui.get_title_screen().refresh_after_data_root_change() - - func _on_server_trust_required( endpoint: String, expected_fingerprint: String, @@ -1552,31 +1435,6 @@ func _configure_popup_dialog( func _input(event: InputEvent) -> void: - # The exit walk and its authoritative relocation own gameplay input until the - # return fade completes. This also keeps a late cancel/pause press from - # manipulating a menu while the world space is changing. - if _home_exit_transition_active: - get_viewport().set_input_as_handled() - return - # While dialogue is active the conversation owns the complete input stream. - # The second interaction press advances into the shop; cancel safely leaves - # the conversation without opening another menu behind it. - if ( - is_instance_valid(_engaged_shop_npc_interaction) - and not _shop_conversation_shop_opened - ): - if ( - event.is_action_pressed("interact") - and not (event is InputEventKey and event.echo) - ): - _open_engaged_shop() - elif ( - event.is_action_pressed("ui_cancel") - or event.is_action_pressed("open_system_menu") - ): - _end_shop_npc_conversation(false) - get_viewport().set_input_as_handled() - return # Do not let controller aliases close or manipulate the world/menu behind # the modal on-screen keyboard. The keyboard consumes the event itself. if _game_ui.is_controller_text_entry_open(): @@ -1594,8 +1452,6 @@ func _input(event: InputEvent) -> void: or (event is InputEventKey and event.echo) ): return - if event.is_action_pressed("ui_cancel"): - _observed_cancel_input_frame = Engine.get_process_frames() var pause_open_requested: bool = _is_pause_open_request(event) var title_screen: TitleScreenType = _game_ui.get_title_screen() if title_screen.visible or not _gameplay_started: @@ -1605,12 +1461,6 @@ func _input(event: InputEvent) -> void: if _game_ui.get_player_storage().consume_escape(): get_viewport().set_input_as_handled() return - if _game_ui.get_decor_shop().consume_escape(): - get_viewport().set_input_as_handled() - return - if _game_ui.get_rv_upgrade_shop().consume_escape(): - get_viewport().set_input_as_handled() - return if fishing_shop.consume_escape(): get_viewport().set_input_as_handled() return @@ -1709,51 +1559,28 @@ func _is_pause_open_request(event: InputEvent) -> bool: func _unhandled_input(event: InputEvent) -> void: - if _home_exit_transition_active: - get_viewport().set_input_as_handled() - return - if ( - _gameplay_started - and event.is_action_pressed("fish_primary") - and not (event is InputEventKey and event.echo) - and _fishing_spot.try_use_active_non_fishing_item() - ): - get_viewport().set_input_as_handled() - return if ( not _gameplay_started or not event.is_action_pressed("interact") or (event is InputEventKey and event.echo) ): return - var home_owner: String = _network_home.get_local_home_owner_fingerprint() - if not home_owner.is_empty(): - if ( - _network_home.can_local_decorate() - and _fishing_spot.can_open_fishing_shop() - and _game_ui.get_player_storage().open_storage_from_home(true) - ): - _refresh_home_door_prompt({}) - get_viewport().set_input_as_handled() - return - var nearby_home_owner: String = _home_world.find_nearby_exterior_owner( - _player - ) - if not nearby_home_owner.is_empty(): - if _network_home.request_enter(nearby_home_owner): - _refresh_home_door_prompt({}) - get_viewport().set_input_as_handled() - return - # All shop prompts and interactions resolve through the same nearest-NPC - # selection. This prevents overlapping trigger margins from making a fixed - # shop priority open (or speak for) someone the player is not facing. - _refresh_shop_npc_speech_state() - var active_shop_interaction := _get_active_shop_npc_interaction() if ( - active_shop_interaction != null + _storage_interaction != null + and _storage_interaction.is_local_player_in_range() and _fishing_spot.can_open_fishing_shop() + and _game_ui.get_player_storage().open_storage() ): - _begin_shop_npc_conversation(active_shop_interaction) + _game_ui.set_storage_prompt_visible(false) + get_viewport().set_input_as_handled() + return + if ( + _shop_interaction != null + and _shop_interaction.is_local_player_in_range() + and _fishing_spot.can_open_fishing_shop() + and _game_ui.get_fishing_shop().open_shop() + ): + _game_ui.set_shop_prompt_visible(false) get_viewport().set_input_as_handled() @@ -1767,78 +1594,37 @@ func _process(delta: float) -> void: ) _print_dedicated_metrics() return - # Native Godot tooltip popups can take ownership of Escape before this - # scene's _input callback sees it. Poll the action once as a fallback so a - # visible tooltip never forces a second Escape press to close its menu. - if ( - Input.is_action_just_pressed("ui_cancel") - and _observed_cancel_input_frame != Engine.get_process_frames() - ): - _consume_tooltip_captured_escape() - _maybe_begin_home_exit_transition() - # Shop close animations/signals may finish after the input frame that asked - # for them. Keep the cinematic held until the UI is actually gone. - if ( - _shop_conversation_shop_opened - and is_instance_valid(_engaged_shop_npc_interaction) - and not _is_any_shop_menu_visible() - ): - _end_shop_npc_conversation(false) - # Re-evaluate while moving, not only when an Area3D emits enter/exit. This - # gives overlapping edge cases an immediate nearest-character handoff. - _refresh_shop_npc_speech_state() - var active_shop_interaction := _get_active_shop_npc_interaction() - var show_shop_prompt := _can_show_active_shop_prompt( - active_shop_interaction - ) + var show_shop_prompt := _can_show_shop_prompt() var shop_prompt_anchor := ( - active_shop_interaction.get_prompt_anchor_position() - if active_shop_interaction != null else Vector3.ZERO + _shop_interaction.get_prompt_anchor_position() + if _shop_interaction != null + else Vector3.ZERO ) _game_ui.set_shop_prompt_visible( show_shop_prompt, shop_prompt_anchor, ) - var home_prompt := _get_home_prompt() - _refresh_home_door_prompt(home_prompt) - _game_ui.set_rv_storage_button_visible( - _can_show_rv_storage_button() + var show_storage_prompt := _can_show_storage_prompt() + var storage_prompt_anchor := ( + _storage_interaction.get_prompt_anchor_position() + if _storage_interaction != null + else Vector3.ZERO + ) + _game_ui.set_storage_prompt_visible( + show_storage_prompt, + storage_prompt_anchor, ) - - -func _consume_tooltip_captured_escape() -> bool: - if ( - not _gameplay_started - or _game_ui.get_title_screen().visible - or _home_exit_transition_active - or _game_ui.is_controller_text_entry_open() - or _game_ui.is_input_mapping_capturing() - ): - return false - if _game_ui.get_player_storage().consume_escape(): - return true - if _game_ui.get_decor_shop().consume_escape(): - return true - if _game_ui.get_rv_upgrade_shop().consume_escape(): - return true - if _game_ui.get_fishing_shop().consume_escape(): - return true - if _game_ui.get_pause_menu().handle_escape(): - return true - return _game_ui.consume_player_menu_escape() func _apply_runtime_settings(settings: PlayerSettingsType) -> void: if settings == null: return - var current_window_mode: DisplayServer.WindowMode = ( - DisplayServer.window_get_mode() + var requested_window_mode: DisplayServer.WindowMode = ( + DisplayServer.WINDOW_MODE_FULLSCREEN + if settings.fullscreen_enabled + else DisplayServer.WINDOW_MODE_WINDOWED ) - var requested_window_mode: DisplayServer.WindowMode = resolve_window_mode( - settings.fullscreen_enabled, - current_window_mode, - ) - if current_window_mode != requested_window_mode: + if DisplayServer.window_get_mode() != requested_window_mode: DisplayServer.window_set_mode(requested_window_mode) _apply_world_pixelation(settings.world_pixel_size) _ui_pixelation.set_pixel_size(settings.ui_pixel_size) @@ -1865,25 +1651,6 @@ func _apply_runtime_settings(settings: PlayerSettingsType) -> void: ) -static func resolve_window_mode( - fullscreen_enabled: bool, - current_mode: DisplayServer.WindowMode, -) -> DisplayServer.WindowMode: - var is_fullscreen: bool = current_mode in [ - DisplayServer.WINDOW_MODE_FULLSCREEN, - DisplayServer.WINDOW_MODE_EXCLUSIVE_FULLSCREEN, - ] - if fullscreen_enabled: - return ( - current_mode - if is_fullscreen - else DisplayServer.WINDOW_MODE_FULLSCREEN - ) - if is_fullscreen: - return DisplayServer.WINDOW_MODE_WINDOWED - return current_mode - - func _apply_world_pixelation(pixel_size: int) -> void: var root_viewport: Viewport = get_viewport() root_viewport.scaling_3d_mode = Viewport.SCALING_3D_MODE_NEAREST @@ -1913,26 +1680,9 @@ func _reset_pixelation() -> void: func _set_gameplay_active(active: bool) -> void: var was_gameplay_started: bool = _gameplay_started - if not active and was_gameplay_started and _save_manager.is_dirty(): - # Session teardown can mutate transient multiplayer state immediately - # before this method runs. Preserve any real progression first, then - # discard teardown-only dirty notifications once gameplay is inactive. - _save_manager.save_if_dirty() _gameplay_started = active - # Session loss, a world switch, or a return to title can interrupt the home - # handoff before its fade callback runs. Do not carry its input suppressors - # or black screen into the next gameplay session. - if not active: - if ( - is_instance_valid(_engaged_shop_npc_interaction) - or _shop_conversation_camera_restoring - or _player.is_shop_conversation_camera_active() - ): - _end_shop_npc_conversation(true) - _cancel_home_entry_transition() - _cancel_home_exit_transition(true) + _shoreline_ambience.set_active(active) _rain_ambience.set_active(active) - _rain_puddles.set_active(active) if active and not was_gameplay_started: var current_hour: float = _world_time.get_time_hours() _dusk_music_played_for_natural_day = ( @@ -1959,7 +1709,8 @@ func _set_gameplay_active(active: bool) -> void: _refresh_active_hotbar_item() else: _player_jobs.end_progression_session() - _save_manager.cancel_pending_autosave() + _set_player_menu_backdrop_visible(false) + _set_shop_backdrop_visible(false) func _on_natural_time_advanced(advanced_hours: float) -> void: @@ -2010,6 +1761,85 @@ static func _natural_interval_crosses_hour( ) +func _set_player_menu_backdrop_visible(requested_visible: bool) -> void: + if _player_menu_backdrop_tween != null: + _player_menu_backdrop_tween.kill() + _player_menu_backdrop_tween = null + var should_show: bool = requested_visible and _gameplay_started + if should_show: + var was_visible: bool = _player_menu_backdrop.visible + _player_menu_backdrop.visible = true + if not was_visible: + _player_menu_backdrop.modulate.a = 0.0 + _player_menu_backdrop_tween = create_tween() + _player_menu_backdrop_tween.tween_property( + _player_menu_backdrop, + "modulate:a", + 1.0, + UIMotion.PLAYER_MENU_ENTER_DURATION, + ).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT) + return + if not _player_menu_backdrop.visible: + return + _player_menu_backdrop_tween = create_tween() + _player_menu_backdrop_tween.tween_property( + _player_menu_backdrop, + "modulate:a", + 0.0, + UIMotion.PLAYER_MENU_EXIT_DURATION, + ).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN) + _player_menu_backdrop_tween.finished.connect( + func() -> void: + _player_menu_backdrop.visible = false + _player_menu_backdrop.modulate.a = 1.0 + _player_menu_backdrop_tween = null + ) + + +func _set_shop_backdrop_visible(requested_visible: bool) -> void: + if _shop_backdrop_tween != null: + _shop_backdrop_tween.kill() + _shop_backdrop_tween = null + var should_show: bool = requested_visible and _gameplay_started + if should_show: + var was_visible: bool = _shop_backdrop.visible + _shop_backdrop.visible = true + if not was_visible: + _shop_backdrop.modulate.a = 0.0 + _shop_backdrop_tween = create_tween() + _shop_backdrop_tween.tween_property( + _shop_backdrop, + "modulate:a", + 1.0, + UIMotion.PLAYER_MENU_ENTER_DURATION, + ).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT) + return + if not _shop_backdrop.visible: + return + _shop_backdrop_tween = create_tween() + _shop_backdrop_tween.tween_property( + _shop_backdrop, + "modulate:a", + 0.0, + UIMotion.PLAYER_MENU_EXIT_DURATION, + ).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN) + _shop_backdrop_tween.finished.connect( + func() -> void: + _shop_backdrop.visible = false + _shop_backdrop.modulate.a = 1.0 + _shop_backdrop_tween = null + ) + + +func _resize_native_overlays() -> void: + if not is_node_ready(): + return + _player_menu_backdrop.position = Vector2.ZERO + _player_menu_backdrop.size = Vector2(get_window().size) + _shop_backdrop.position = Vector2.ZERO + _shop_backdrop.size = Vector2(get_window().size) + + func _on_new_game_requested( world_layout: StringName, world_seed: int, @@ -2017,15 +1847,6 @@ func _on_new_game_requested( if _gameplay_started or _quit_in_progress: return _start_new_game_music() - if ( - not _save_manager.delete_progression_save() - or not _save_manager.initialize_new_game(world_seed, world_layout) - ): - _show_title_music(true) - _game_ui.get_title_screen().report_network_error( - "Could not initialize local progression. Existing data was preserved where possible." - ) - return if not _apply_world(world_layout, world_seed, true): _show_title_music(true) _game_ui.get_title_screen().report_network_error( @@ -2041,6 +1862,16 @@ func _on_new_game_requested( if not _prepare_private_host(): _show_title_music(true) return + if ( + not _save_manager.delete_progression_save() + or not _save_manager.initialize_new_game(world_seed, world_layout) + ): + _network_session.disconnect_session("New Game setup failed.") + _show_title_music(true) + _game_ui.get_title_screen().report_network_error( + "Could not initialize local progression. Existing data was preserved where possible." + ) + return _enter_gameplay() @@ -2129,18 +1960,6 @@ func _on_new_slot_requested( _on_slot_play_requested(slot_id) return _start_new_game_music() - # Reset progression before the private session publishes its first home - # manifest. Doing this after hosting allowed the previous slot's RV tier to - # be announced and spawned into an otherwise brand-new save. - if ( - not _save_manager.delete_progression_save() - or not _save_manager.initialize_new_game(world_seed, world_layout) - ): - _show_title_music(true) - _game_ui.get_title_screen().report_network_error( - "Could not initialize local progression." - ) - return if not _apply_world(world_layout, world_seed, true): _show_title_music(true) _game_ui.get_title_screen().report_network_error( @@ -2156,6 +1975,16 @@ func _on_new_slot_requested( if not _prepare_private_host(): _show_title_music(true) return + if ( + not _save_manager.delete_progression_save() + or not _save_manager.initialize_new_game(world_seed, world_layout) + ): + _network_session.disconnect_session("New Game setup failed.") + _show_title_music(true) + _game_ui.get_title_screen().report_network_error( + "Could not initialize local progression." + ) + return _save_slots.mark_played(slot_id) _enter_gameplay() @@ -2213,52 +2042,27 @@ func _on_return_to_title_requested() -> void: _show_title_music(true) -func _on_title_join_game_requested(requested_route: Variant) -> void: +func _on_title_join_game_requested(endpoint: String) -> void: if _quit_in_progress or _gameplay_started: return - var route := _coerce_connection_route(requested_route) - if route == null: + var active_slot: Dictionary = _save_slots.ensure_active_slot() + if not bool(active_slot.get("ok", false)): _game_ui.get_title_screen().report_network_error( - "That connection address is invalid." - ) - return - var online_slot: Dictionary = _save_slots.ensure_online_slot() - if not bool(online_slot.get("ok", false)): - _game_ui.get_title_screen().report_network_error( - str(online_slot.get( - "message", "Online progression is unavailable." - )) - ) - return - if not _save_manager.load_character_profile(): - _game_ui.get_title_screen().report_network_error( - "The selected online character could not be loaded." + str(active_slot.get("message", "Local progression is unavailable.")) ) return if _network_session.state != NetworkSessionType.State.INACTIVE: _network_session.disconnect_session("Preparing direct connection.") _join_requested_from_title = true _join_requested_from_pause = false - _pending_join_endpoint = ( - route.direct_endpoint.normalized_display - if route != null - and not route.is_discovery_join() - and route.direct_endpoint != null - else "" - ) - if not _network_session.join_route(route): + _pending_join_endpoint = endpoint + if not _network_session.join_direct(endpoint): _join_requested_from_title = false -func _on_pause_join_game_requested(requested_route: Variant) -> void: +func _on_pause_join_game_requested(endpoint: String) -> void: if _quit_in_progress or not _gameplay_started: return - var route := _coerce_connection_route(requested_route) - if route == null: - _game_ui.get_pause_menu().report_network_error( - "That connection address is invalid." - ) - return if not _save_manager.save_world_time_checkpoint(): _game_ui.get_pause_menu().report_network_error( "Could not save progression before leaving this session." @@ -2266,36 +2070,20 @@ func _on_pause_join_game_requested(requested_route: Variant) -> void: return _join_requested_from_pause = true _join_requested_from_title = false - _pending_join_endpoint = ( - route.direct_endpoint.normalized_display - if route != null - and not route.is_discovery_join() - and route.direct_endpoint != null - else "" - ) + _pending_join_endpoint = endpoint _game_ui.get_pause_menu().close_for_title_transition() var preserved_public_join: bool = ( _discovery.preserve_public_join_for_session_switch() ) _network_session.disconnect_session("Connecting to another game.") - if not _network_session.join_route(route): + if not _network_session.join_direct(endpoint): if preserved_public_join: _discovery.cancel_pending_public_join() _handle_failed_session_switch( - "Could not begin the connection." + "Could not begin the direct connection." ) -func _coerce_connection_route(value: Variant) -> ConnectionRoute: - if value is ConnectionRoute: - var supplied_route := value as ConnectionRoute - return supplied_route if supplied_route.is_valid() else null - if typeof(value) != TYPE_STRING: - return null - var endpoint := EndpointParser.parse(str(value)) - return ConnectionRoute.direct(endpoint) if endpoint.is_valid() else null - - func _on_friend_request_received( request_id: String, fingerprint: String, @@ -2342,9 +2130,7 @@ func _show_next_social_prompt() -> void: _active_social_prompt = _social_prompt_queue.pop_front() var kind := str(_active_social_prompt.get("kind", "")) var display_name := str( - _active_social_prompt.get( - "display_name", NetworkProfilePreferences.DEFAULT_DISPLAY_NAME - ) + _active_social_prompt.get("display_name", "Player") ) var shown: bool = false if kind == "friend_request": @@ -2357,17 +2143,8 @@ func _show_next_social_prompt() -> void: elif kind == "friend_invite": var room: Dictionary = _active_social_prompt.get("room", {}) var room_name := str(room.get("room_name", "their room")) - var relayed := str(room.get("connection_mode", "")) == "relay" - var privacy_message := ( - "This join uses a privacy relay; the relay service still handles " - + "both network addresses." - if relayed - else "This is a direct connection. Joining shares your public IP " - + "address with the host." - ) shown = _game_ui.show_social_prompt( - "%s invited you to join %s.\n%s" - % [display_name, room_name, privacy_message], + "%s invited you to join %s." % [display_name, room_name], "join", "not now", ) @@ -2406,16 +2183,16 @@ func _on_social_prompt_declined() -> void: call_deferred("_show_next_social_prompt") -func _on_social_public_join_prepared(route: ConnectionRoute) -> void: +func _on_social_public_join_prepared(endpoint: String) -> void: if not _pending_social_invite_join: return var from_gameplay := _pending_social_invite_gameplay _pending_social_invite_join = false _pending_social_invite_gameplay = false if from_gameplay: - _on_pause_join_game_requested(route) + _on_pause_join_game_requested(endpoint) else: - _on_title_join_game_requested(route) + _on_title_join_game_requested(endpoint) func _on_social_public_join_status_changed( @@ -2443,7 +2220,7 @@ func _on_network_join_authenticated() -> void: var server_metadata: Dictionary = ( _network_session.get_last_server_metadata() ) - if connected_endpoint != null and not _network_session.is_current_route_discovery(): + if connected_endpoint != null: _saved_servers.record_successful_connection( connected_endpoint, int(server_metadata.get("max_players", 0)), @@ -2456,11 +2233,7 @@ func _on_network_join_authenticated() -> void: var progression_ready: bool = ( _save_manager.load_player_data() if inspection.can_continue() - else _save_manager.initialize_new_game( - PlayerSaveManager.DEFAULT_WORLD_SEED, - WorldLayout.GENERATED, - false, - ) + else _save_manager.initialize_new_game() ) if not progression_ready: _network_session.disconnect_session( @@ -2490,7 +2263,7 @@ func _on_network_connection_error(message: String) -> void: var failed_endpoint: ConnectionEndpoint = ( _network_session.get_current_endpoint() ) - if failed_endpoint != null and not _network_session.is_current_route_discovery(): + if failed_endpoint != null: _saved_servers.record_connection_failure( failed_endpoint, _connection_result_code(message), @@ -2549,7 +2322,6 @@ func _on_local_respawn_completed(entry_position: Vector3) -> void: func _on_remote_recovery_requested( peer_id: int, entry_position: Vector3, - recovery_input_sequence: int, ) -> void: if not _network_session.is_host(): return @@ -2560,12 +2332,17 @@ func _on_remote_recovery_requested( peer_id, "Fishing attempt ended." ) - avatar.neutralize_authoritative_input_for_relocation( - recovery_input_sequence - ) - var target_position := _test_world.get_water_recovery_position( - entry_position - ) + var target_position: Vector3 = _test_world.get_player_spawn_transform().origin + var nearest_distance: float = INF + for point: SafeRespawnPoint in _test_world.get_safe_respawn_points(): + if point == null or not point.enabled: + continue + var distance: float = point.get_horizontal_distance_squared( + entry_position + ) + if distance < nearest_distance: + nearest_distance = distance + target_position = point.global_position target_position.y += _water_recovery.respawn_height_offset avatar.global_position = target_position avatar.velocity = Vector3.ZERO @@ -2638,25 +2415,20 @@ func _apply_world( if _application_initialized: _refresh_active_world_bindings() _network_world_spawns.refresh_world_context() - _network_home.refresh_world_presentations() if _application_initialized and not _dedicated_runtime: _water_recovery.update_world_context( spawn_transform, _test_world.get_player_water_triggers(), _test_world.get_safe_respawn_points(), - Callable(_test_world, "get_water_recovery_position"), ) - _rain_puddles.refresh_world() + _shoreline_ambience.configure( + _player, + _test_world.get_saltwater_shoreline_mesh(), + ) return true func _refresh_active_world_bindings() -> void: - if ( - is_instance_valid(_engaged_shop_npc_interaction) - or _shop_conversation_camera_restoring - or _player.is_shop_conversation_camera_active() - ): - _end_shop_npc_conversation(true) if is_instance_valid(_shop_interaction): if _shop_interaction.local_player_range_changed.is_connected( _on_shop_range_changed @@ -2671,31 +2443,10 @@ func _refresh_active_world_bindings() -> void: _storage_interaction.local_player_range_changed.disconnect( _on_storage_range_changed ) - if is_instance_valid(_decor_shop_interaction): - if _decor_shop_interaction.local_player_range_changed.is_connected( - _on_decor_shop_range_changed - ): - _decor_shop_interaction.local_player_range_changed.disconnect( - _on_decor_shop_range_changed - ) - if is_instance_valid(_rv_upgrade_shop_interaction): - if _rv_upgrade_shop_interaction.local_player_range_changed.is_connected( - _on_rv_upgrade_shop_range_changed - ): - _rv_upgrade_shop_interaction.local_player_range_changed.disconnect( - _on_rv_upgrade_shop_range_changed - ) _shop_interaction = _test_world.get_fishing_shop() - _decor_shop_interaction = _test_world.get_decor_shop() - _rv_upgrade_shop_interaction = _test_world.get_rv_upgrade_shop() - _active_shop_npc_interaction = null _storage_interaction = _test_world.get_player_storage() _network_sale.set_shop_interaction(_shop_interaction) _network_shop.set_shop_interaction(_shop_interaction) - _network_shop.set_decor_shop_interaction(_decor_shop_interaction) - _network_shop.set_rv_upgrade_shop_interaction( - _rv_upgrade_shop_interaction - ) if _dedicated_runtime: return if _shop_interaction != null: @@ -2708,21 +2459,9 @@ func _refresh_active_world_bindings() -> void: _storage_interaction.local_player_range_changed.connect( _on_storage_range_changed ) - if _decor_shop_interaction != null: - _decor_shop_interaction.setup_local_player(_player) - _decor_shop_interaction.local_player_range_changed.connect( - _on_decor_shop_range_changed - ) - if _rv_upgrade_shop_interaction != null: - _rv_upgrade_shop_interaction.setup_local_player(_player) - _rv_upgrade_shop_interaction.local_player_range_changed.connect( - _on_rv_upgrade_shop_range_changed - ) _game_ui.set_world_interactions( _shop_interaction, _storage_interaction, - _decor_shop_interaction, - _rv_upgrade_shop_interaction, ) _on_shop_range_changed( _shop_interaction != null @@ -2732,23 +2471,9 @@ func _refresh_active_world_bindings() -> void: _storage_interaction != null and _storage_interaction.is_local_player_in_range() ) - _on_decor_shop_range_changed( - _decor_shop_interaction != null - and _decor_shop_interaction.is_local_player_in_range() - ) - _on_rv_upgrade_shop_range_changed( - _rv_upgrade_shop_interaction != null - and _rv_upgrade_shop_interaction.is_local_player_in_range() - ) func _on_water_recovery_starting() -> void: - if ( - is_instance_valid(_engaged_shop_npc_interaction) - or _shop_conversation_camera_restoring - or _player.is_shop_conversation_camera_active() - ): - _end_shop_npc_conversation(true) _local_recovery_attempt_id = ( "recovery:%s" % Crypto.new().generate_random_bytes(16).hex_encode() @@ -2759,8 +2484,6 @@ func _on_water_recovery_starting() -> void: _game_ui.close_player_menu_for_water_recovery() _game_ui.get_pause_menu().close_for_water_recovery() _game_ui.get_fishing_shop().close_for_water_recovery() - _game_ui.get_decor_shop().close_for_water_recovery() - _game_ui.get_rv_upgrade_shop().close_for_water_recovery() _game_ui.get_player_storage().close_for_water_recovery() @@ -2809,7 +2532,6 @@ func _on_active_hotbar_item_changed( and item != null and item.is_available() and _player.bag.owns_item(item_id) - and not String(_network_home.get_local_space()).begins_with("rv:") ) var active_is_catching_net: bool = ( item_id == FishingShopStockType.CRAB_NET_ID @@ -2823,12 +2545,6 @@ func _on_active_hotbar_item_changed( and item.is_available() and _player.bag.owns_item(item_id) ) - var active_is_decor: bool = ( - DecorCatalogType.has_product(item_id) - and item != null - and item.is_available() - and _player.bag.owns_item(item_id) - ) _player.set_active_fishing_rod( item as FishingRodDataType if active_is_rod else null, true, @@ -2839,7 +2555,6 @@ func _on_active_hotbar_item_changed( ) _player.set_active_catching_net(active_is_catching_net) _player.set_active_shovel(active_is_shovel) - _player.set_active_decor_package(active_is_decor) _game_ui.set_surface_drawing_hotbar_selected(active_is_art_kit) _network_item_use.submit_local_equipped(item_id, active_is_rod or ( item != null and _player.bag.owns_item(item_id) @@ -2959,17 +2674,6 @@ func _finish_quit() -> void: func _exit_tree() -> void: - if ( - is_instance_valid(_player) - and ( - is_instance_valid(_engaged_shop_npc_interaction) - or _shop_conversation_camera_restoring - or _player.is_shop_conversation_camera_active() - ) - ): - _end_shop_npc_conversation(true) - _cancel_home_entry_transition() - _cancel_home_exit_transition(true) if _dedicated_runtime and _network_session != null: _network_session.disconnect_session("Dedicated server stopping.") if _title_music_tween != null: @@ -2987,560 +2691,36 @@ func _exit_tree() -> void: func _on_shop_range_changed(in_range: bool) -> void: - # Speech ownership is resolved once per frame after all Area3D enter/exit - # signals have settled, avoiding a one-frame clear during zone handoffs. + _game_ui.set_shop_npc_player_in_range(in_range) if not in_range: _game_ui.get_fishing_shop().close_for_range_exit() - if ( - _engaged_shop_npc_interaction == _shop_interaction - and not _shop_conversation_shop_opened - ): - _end_shop_npc_conversation(false) + _game_ui.set_shop_prompt_visible(_can_show_shop_prompt()) func _on_storage_range_changed(in_range: bool) -> void: if not in_range: _game_ui.get_player_storage().close_for_range_exit() - var prompt := _get_home_prompt() - _refresh_home_door_prompt(prompt) - _game_ui.set_rv_storage_button_visible( - _can_show_rv_storage_button() - ) - - -func _on_decor_shop_range_changed(in_range: bool) -> void: - if not in_range: - _game_ui.get_decor_shop().close_for_range_exit() - if ( - _engaged_shop_npc_interaction == _decor_shop_interaction - and not _shop_conversation_shop_opened - ): - _end_shop_npc_conversation(false) - - -func _on_rv_upgrade_shop_range_changed(in_range: bool) -> void: - if not in_range: - _game_ui.get_rv_upgrade_shop().close_for_range_exit() - if ( - _engaged_shop_npc_interaction == _rv_upgrade_shop_interaction - and not _shop_conversation_shop_opened - ): - _end_shop_npc_conversation(false) - - -func _on_home_state_changed() -> void: - _refresh_shop_npc_speech_state() - - -func _on_local_home_space_changed( - space_id: StringName, - owner_fingerprint: String, -) -> void: - var inside_rv: bool = String(space_id).begins_with("rv:") - _world_time_visuals.set_local_home_interior_active(inside_rv) - _rain_ambience.set_suppressed(inside_rv) - _rain_puddles.set_suppressed(inside_rv) - _surface_drawings_root.visible = not inside_rv - _world_gatherables_root.visible = not inside_rv - _refresh_active_hotbar_item() - _fishing_spot.set_fishing_environment_enabled(not inside_rv) - _game_ui.set_rv_interior_camera_mode( - inside_rv - ) - _game_ui.set_rv_storage_button_visible( - _can_show_rv_storage_button() - ) - if inside_rv and not _home_exit_transition_active: - _begin_home_entry_transition(owner_fingerprint) - elif not inside_rv and _home_entry_transition_active: - _cancel_home_entry_transition() - - -func _begin_home_entry_transition(owner_fingerprint: String) -> void: - if owner_fingerprint.is_empty() or _home_entry_transition_active: - return - _home_entry_transition_active = true - _refresh_home_door_prompt({}) - _player.set_local_input_suppressed(HOME_ENTRY_INPUT_OWNER, true) - _player.set_camera_input_suppressed(HOME_ENTRY_INPUT_OWNER, true) - var inward_direction: Vector3 = ( - -_home_world.get_interior_exit_direction(owner_fingerprint) - ) - _player.face_world_direction(inward_direction) - _player.begin_animation_action(PlayerType.CHARACTER_WALKING_ANIMATION) - _home_entry_walk_tween = create_tween() - _home_entry_walk_tween.set_trans(Tween.TRANS_SINE) - _home_entry_walk_tween.set_ease(Tween.EASE_IN_OUT) - _home_entry_walk_tween.tween_property( - _player, - "global_position", - _player.global_position + inward_direction * HOME_ENTRY_WALK_DISTANCE, - HOME_ENTRY_WALK_DURATION, - ) - _home_entry_walk_tween.finished.connect( - _cancel_home_entry_transition, - CONNECT_ONE_SHOT, - ) - - -func _cancel_home_entry_transition() -> void: - if _home_entry_walk_tween != null and _home_entry_walk_tween.is_valid(): - _home_entry_walk_tween.kill() - _home_entry_walk_tween = null - if is_instance_valid(_player): - _player.end_animation_action() - _player.set_local_input_suppressed(HOME_ENTRY_INPUT_OWNER, false) - _player.set_camera_input_suppressed(HOME_ENTRY_INPUT_OWNER, false) - _home_entry_transition_active = false - - -func _maybe_begin_home_exit_transition() -> void: - if ( - _home_exit_transition_active - or _home_entry_transition_active - or not _gameplay_started - or _water_recovery.is_recovery_active() - or not _fishing_spot.can_open_fishing_shop() - or _game_ui.get_player_storage().visible - or _game_ui.get_fishing_shop().visible - or _game_ui.get_decor_shop().visible - or _game_ui.get_rv_upgrade_shop().visible - ): - return - var owner_fingerprint: String = ( - _network_home.get_local_home_owner_fingerprint() - ) - if ( - owner_fingerprint.is_empty() - or not _home_world.has_avatar_crossed_interior_exit_threshold( - _player, - owner_fingerprint, - ) - ): - return - _begin_home_exit_transition(owner_fingerprint) - - -func _begin_home_exit_transition( - owner_fingerprint: String, - skip_walk: bool = false, -) -> void: - if owner_fingerprint.is_empty() or _home_exit_transition_active: - return - _home_exit_transition_active = true - _home_exit_waiting_for_network = false - _home_exit_start_position = _player.global_position - _refresh_home_door_prompt({}) - _player.set_local_input_suppressed(HOME_EXIT_INPUT_OWNER, true) - _player.set_camera_input_suppressed(HOME_EXIT_INPUT_OWNER, true) - # A same-frame interact can otherwise open home storage after the threshold - # was crossed. The exit suppressor is already active, so restoring storage's - # base snapshot cannot return effective control before the transition ends. - _game_ui.get_player_storage().close_storage() - _game_ui.set_rv_storage_button_visible(false) - _game_ui.set_gameplay_input_locked(true) - if skip_walk: - _on_home_exit_walk_finished() - return - var exit_direction: Vector3 = _home_world.get_interior_exit_direction_near( - owner_fingerprint, _player.global_position - ) - _player.face_world_direction(exit_direction) - _player.begin_animation_action(PlayerType.CHARACTER_WALKING_ANIMATION) - _home_exit_walk_tween = create_tween() - _home_exit_walk_tween.set_trans(Tween.TRANS_SINE) - _home_exit_walk_tween.set_ease(Tween.EASE_IN_OUT) - _home_exit_walk_tween.tween_property( - _player, - "global_position", - _player.global_position + exit_direction * HOME_EXIT_WALK_DISTANCE, - HOME_EXIT_WALK_DURATION, - ) - _home_exit_walk_tween.finished.connect( - _on_home_exit_walk_finished, - CONNECT_ONE_SHOT, - ) - - -func _on_home_toolbar_exit_requested() -> void: - if _home_exit_transition_active: - return - var owner_fingerprint: String = ( - _network_home.get_local_home_owner_fingerprint() - ) - if owner_fingerprint.is_empty(): - return - if _home_entry_transition_active: - _cancel_home_entry_transition() - _begin_home_exit_transition(owner_fingerprint, true) - - -func _on_home_exit_walk_finished() -> void: - _home_exit_walk_tween = null - if not _home_exit_transition_active: - return - # End the walking action on the same frame translation ends. The fade and - # authoritative relocation may take longer, but a stationary avatar must - # never keep cycling its walk animation during that wait. - _player.end_animation_action() - _game_ui.get_screen_fade().fade_to_black(HOME_EXIT_FADE_GENERATION) - - -func _on_home_exit_fade_transition_completed( - generation: int, - faded_to_black: bool, -) -> void: - if ( - generation != HOME_EXIT_FADE_GENERATION - or not _home_exit_transition_active - ): - return - if faded_to_black: - # A local host can apply the authoritative transition synchronously from - # request_exit(). Mark this first so its completion signal is not lost. - _home_exit_waiting_for_network = true - var request_started: bool = _network_home.request_exit() - if not request_started: - _home_exit_waiting_for_network = false - _player.global_position = _home_exit_start_position - _game_ui.get_screen_fade().fade_from_black( - HOME_EXIT_FADE_GENERATION - ) - return - _cancel_home_exit_transition(false) - - -func _on_local_home_transition_finished( - accepted: bool, - _message: String, -) -> void: - if ( - not _home_exit_transition_active - or not _home_exit_waiting_for_network - ): - return - _home_exit_waiting_for_network = false - if not accepted: - _player.global_position = _home_exit_start_position - _game_ui.get_screen_fade().fade_from_black(HOME_EXIT_FADE_GENERATION) - - -func _cancel_home_exit_transition(reset_fade: bool) -> void: - if _home_exit_walk_tween != null and _home_exit_walk_tween.is_valid(): - _home_exit_walk_tween.kill() - _home_exit_walk_tween = null - if is_instance_valid(_player): - _player.end_animation_action() - _player.set_local_input_suppressed(HOME_EXIT_INPUT_OWNER, false) - _player.set_camera_input_suppressed(HOME_EXIT_INPUT_OWNER, false) - if ( - reset_fade - and is_instance_valid(_game_ui) - and is_instance_valid(_game_ui.get_screen_fade()) - ): - _game_ui.get_screen_fade().reset_immediately() - _home_exit_transition_active = false - _home_exit_waiting_for_network = false - _home_exit_start_position = Vector3.ZERO - if is_instance_valid(_game_ui): - _game_ui.set_gameplay_input_locked(false) - _game_ui.set_rv_storage_button_visible( - _can_show_rv_storage_button() - ) - - -func _on_rv_storage_requested() -> void: - if not _can_show_rv_storage_button(): - return - _game_ui.get_player_storage().open_storage_from_home(true) + _game_ui.set_storage_prompt_visible(_can_show_storage_prompt()) func _can_show_shop_prompt() -> bool: - return ( - _get_active_shop_npc_interaction() == _shop_interaction - and _can_show_active_shop_prompt(_shop_interaction) - ) - - -func _can_show_decor_shop_prompt() -> bool: - return ( - _get_active_shop_npc_interaction() == _decor_shop_interaction - and _can_show_active_shop_prompt(_decor_shop_interaction) - ) - - -func _can_show_rv_upgrade_shop_prompt() -> bool: - return ( - _get_active_shop_npc_interaction() == _rv_upgrade_shop_interaction - and _can_show_active_shop_prompt(_rv_upgrade_shop_interaction) - ) - - -func _can_show_active_shop_prompt( - interaction: FishingShopInteractionType, -) -> bool: return ( _gameplay_started - and not _shop_conversation_camera_restoring - and interaction != null - and interaction.is_local_player_in_range() - and not _game_ui.get_rv_upgrade_shop().visible + and _shop_interaction != null + and _shop_interaction.is_local_player_in_range() and not _game_ui.get_fishing_shop().visible - and not _game_ui.get_decor_shop().visible and not _water_recovery.is_recovery_active() and _fishing_spot.can_open_fishing_shop() ) -func _can_show_any_shop_prompt() -> bool: - return _can_show_active_shop_prompt( - _get_active_shop_npc_interaction() - ) - - -func _is_any_shop_npc_in_range() -> bool: - return ( - ( - _shop_interaction != null - and _shop_interaction.is_local_player_in_range() - ) - or ( - _decor_shop_interaction != null - and _decor_shop_interaction.is_local_player_in_range() - ) - or ( - _rv_upgrade_shop_interaction != null - and _rv_upgrade_shop_interaction.is_local_player_in_range() - ) - ) - - -func _refresh_shop_npc_speech_state() -> void: - if ( - _engaged_shop_npc_interaction != null - and ( - not is_instance_valid(_engaged_shop_npc_interaction) - or not _engaged_shop_npc_interaction.is_local_player_in_range() - ) - ): - if _shop_conversation_shop_opened and _is_any_shop_menu_visible(): - _game_ui.set_shop_npc_player_in_range(false) - return - _end_shop_npc_conversation(false) - var interaction := _get_active_shop_npc_interaction() - var dialogue_text: String = "" - if interaction != null: - dialogue_text = interaction.get_dialogue_text(_home_state.get_tier()) - _game_ui.set_shop_npc_player_in_range( - interaction != null and not _shop_conversation_shop_opened, - dialogue_text, - interaction.get_instance_id() if interaction != null else 0, - interaction == _engaged_shop_npc_interaction - and not _shop_conversation_shop_opened, - ) - - -func _get_active_shop_npc_interaction() -> FishingShopInteractionType: - if ( - is_instance_valid(_engaged_shop_npc_interaction) - and _engaged_shop_npc_interaction.is_local_player_in_range() - ): - _active_shop_npc_interaction = _engaged_shop_npc_interaction - return _active_shop_npc_interaction - var candidates: Array[FishingShopInteractionType] = [] - if _shop_interaction != null: - candidates.append(_shop_interaction) - if _decor_shop_interaction != null: - candidates.append(_decor_shop_interaction) - if _rv_upgrade_shop_interaction != null: - candidates.append(_rv_upgrade_shop_interaction) - var nearest: FishingShopInteractionType - var nearest_distance_squared: float = INF - for interaction: FishingShopInteractionType in candidates: - if not interaction.is_local_player_in_range(): - continue - var distance_squared := interaction.get_local_player_distance_squared() - if distance_squared < nearest_distance_squared: - nearest = interaction - nearest_distance_squared = distance_squared - if ( - nearest != null - and nearest != _active_shop_npc_interaction - and is_instance_valid(_active_shop_npc_interaction) - and _active_shop_npc_interaction.is_local_player_in_range() - ): - var active_distance_squared := ( - _active_shop_npc_interaction.get_local_player_distance_squared() - ) - # Require a small, visible distance advantage before ownership switches. - # This keeps a player standing on the zone seam from chattering between - # two NPCs while still handing off well before the old compact zone ends. - if ( - sqrt(nearest_distance_squared) - + SHOP_NPC_HANDOFF_HYSTERESIS_METERS - >= sqrt(active_distance_squared) - ): - nearest = _active_shop_npc_interaction - _active_shop_npc_interaction = nearest - return _active_shop_npc_interaction - - -func _begin_shop_npc_conversation( - interaction: FishingShopInteractionType, -) -> bool: - if ( - _shop_conversation_camera_restoring - or is_instance_valid(_engaged_shop_npc_interaction) - or interaction == null - or not interaction.is_local_player_in_range() - or not _fishing_spot.can_open_fishing_shop() - ): - return false - _engaged_shop_npc_interaction = interaction - _active_shop_npc_interaction = interaction - _shop_conversation_shop_opened = false - interaction.set_engaged(true) - _player.begin_shop_conversation_camera( - interaction.get_shopkeeper_position() - ) - _player.set_local_input_suppressed( - SHOP_NPC_CONVERSATION_INPUT_OWNER, true - ) - _player.set_camera_input_suppressed( - SHOP_NPC_CONVERSATION_INPUT_OWNER, true - ) - _refresh_shop_npc_speech_state() - return true - - -func _open_engaged_shop() -> bool: - var interaction := _engaged_shop_npc_interaction - if ( - interaction == null - or not is_instance_valid(interaction) - or not interaction.is_local_player_in_range() - or _shop_conversation_shop_opened - ): - return false - var opened: bool = false - if interaction == _rv_upgrade_shop_interaction: - opened = _game_ui.get_rv_upgrade_shop().open_shop() - elif interaction == _decor_shop_interaction: - opened = _game_ui.get_decor_shop().open_shop() - elif interaction == _shop_interaction: - opened = _game_ui.get_fishing_shop().open_shop() - if not opened: - return false - _shop_conversation_shop_opened = true - _game_ui.set_shop_prompt_visible(false) - _refresh_shop_npc_speech_state() - return true - - -func _end_shop_npc_conversation(immediate_camera: bool = false) -> void: - if _shop_conversation_camera_restoring and not immediate_camera: - return - var interaction := _engaged_shop_npc_interaction - if is_instance_valid(interaction): - interaction.set_engaged(false) - _engaged_shop_npc_interaction = null - _shop_conversation_shop_opened = false - _game_ui.set_shop_npc_player_in_range(false) - var camera_was_active := _player.is_shop_conversation_camera_active() - _shop_conversation_camera_restoring = camera_was_active and not immediate_camera - _player.restore_shop_conversation_camera( - immediate_camera, - _finish_shop_npc_conversation_restore, - ) - - -func _finish_shop_npc_conversation_restore() -> void: - _player.set_local_input_suppressed( - SHOP_NPC_CONVERSATION_INPUT_OWNER, false - ) - _player.set_camera_input_suppressed( - SHOP_NPC_CONVERSATION_INPUT_OWNER, false - ) - _shop_conversation_camera_restoring = false - if _gameplay_started and is_instance_valid(_game_ui): - _refresh_shop_npc_speech_state() - - -func _is_any_shop_menu_visible() -> bool: - return ( - _game_ui.get_fishing_shop().visible - or _game_ui.get_decor_shop().visible - or _game_ui.get_rv_upgrade_shop().visible - ) - - -func _on_shop_conversation_menu_visibility_changed(is_open: bool) -> void: - if ( - not is_open - and _shop_conversation_shop_opened - and not _is_any_shop_menu_visible() - ): - _end_shop_npc_conversation(false) - - -func _on_pause_menu_conversation_visibility_changed(is_open: bool) -> void: - if is_open and is_instance_valid(_engaged_shop_npc_interaction): - _end_shop_npc_conversation(false) - - -func _on_player_menu_conversation_visibility_changed(is_open: bool) -> void: - if is_open and is_instance_valid(_engaged_shop_npc_interaction): - _end_shop_npc_conversation(false) - - func _can_show_storage_prompt() -> bool: - return not _get_home_prompt().is_empty() - - -func _refresh_home_door_prompt(prompt: Dictionary) -> void: - # Home entry belongs to the doorway in world space. Keep the retired HUD - # prompt hidden so it cannot overlap the compact door-mounted sign. - _game_ui.set_storage_prompt_visible(false) - _home_world.set_exterior_prompt_visible( - str(prompt.get("owner_fingerprint", "")), - not prompt.is_empty(), - str(prompt.get("label", "enter home")), - ) - - -func _can_show_rv_storage_button() -> bool: return ( _gameplay_started - and not _home_exit_transition_active - and not _network_home.get_local_home_owner_fingerprint().is_empty() - and _network_home.can_local_decorate() + and _storage_interaction != null + and _storage_interaction.is_local_player_in_range() + and not _game_ui.get_player_storage().visible + and not _game_ui.get_fishing_shop().visible and not _water_recovery.is_recovery_active() and _fishing_spot.can_open_fishing_shop() ) - - -func _get_home_prompt() -> Dictionary: - if ( - not _gameplay_started - or _home_exit_transition_active - or _game_ui.get_player_storage().visible - or _game_ui.get_fishing_shop().visible - or _game_ui.get_decor_shop().visible - or _game_ui.get_rv_upgrade_shop().visible - or _water_recovery.is_recovery_active() - or not _fishing_spot.can_open_fishing_shop() - ): - return {} - var owner_fingerprint: String = ( - _network_home.get_local_home_owner_fingerprint() - ) - if not owner_fingerprint.is_empty(): - return {} - var nearby_owner: String = _home_world.find_nearby_exterior_owner(_player) - if nearby_owner.is_empty(): - return {} - return { - "label": "enter home", - "anchor": _home_world.get_exterior_prompt_position(nearby_owner), - "owner_fingerprint": nearby_owner, - } diff --git a/main/main.tscn b/main/main.tscn index a86500f..b9ad6fb 100644 --- a/main/main.tscn +++ b/main/main.tscn @@ -38,8 +38,10 @@ [ext_resource type="Script" uid="uid://dpiv6wttry0j4" path="res://network/player_data_root.gd" id="37_data_root"] [ext_resource type="Script" uid="uid://bu5q4a8jfvxkf" path="res://network/identity_backup_service.gd" id="38_identity_backup"] [ext_resource type="Script" uid="uid://djmxy6jibi5y3" path="res://ui/interface_font_controller.gd" id="39_fonts"] -[ext_resource type="Texture2D" uid="uid://doju2lbj2ghwa" path="res://world/generation/chunks/assets/chunk_0000_grass_lite.png" id="40_title_grass"] +[ext_resource type="Shader" uid="uid://c8s1g7tn771du" path="res://ui/title_water_background.gdshader" id="40_title_water"] +[ext_resource type="Texture2D" uid="uid://f8a0cs0s7ler" path="res://art/patterns/pattern_tealdot.png" id="41_menu_pattern"] [ext_resource type="Shader" uid="uid://byw3iub66qvog" path="res://ui/player_menu_pattern.gdshader" id="42_menu_pattern"] +[ext_resource type="Texture2D" uid="uid://b6xws1d2dnbnn" path="res://art/patterns/pattern_moneyfish.png" id="43_shop_pattern"] [ext_resource type="Script" uid="uid://m4n0bn38f34i" path="res://network/network_fish_showcase_service.gd" id="45_fish_showcase"] [ext_resource type="Script" uid="uid://bkiepgu8j5r6t" path="res://network/network_surface_drawing_service.gd" id="46_surface_drawing"] [ext_resource type="Script" uid="uid://5lceyulaglpf" path="res://world/world_time_service.gd" id="47_world_time"] @@ -49,23 +51,40 @@ [ext_resource type="Script" uid="uid://llj46fx0oco7" path="res://network/network_world_weather_service.gd" id="51_network_world_weather"] [ext_resource type="Script" uid="uid://daqtje84gqgu0" path="res://jobs/player_job_service.gd" id="52_player_jobs"] [ext_resource type="Script" uid="uid://drlyytr2o3uw8" path="res://network/network_job_service.gd" id="53_network_jobs"] +[ext_resource type="Script" uid="uid://b0c3o2vy76fg3" path="res://world/shoreline_ambience.gd" id="54_shoreline_ambience"] [ext_resource type="Script" uid="uid://c80x8jkdnx0xy" path="res://settings/controller_mapping_manager.gd" id="56_controller_mapping"] [ext_resource type="Script" path="res://settings/keyboard_mouse_mapping_manager.gd" id="keyboard_mouse_mapping"] [ext_resource type="Script" uid="uid://d0jv8n2nfqia0" path="res://network/discovery_client.gd" id="57_discovery"] [ext_resource type="Resource" path="res://gathering/catalog/gatherable_catalog.tres" id="58_gatherable_catalog"] [ext_resource type="Script" path="res://network/network_world_spawn_service.gd" id="59_world_spawns"] [ext_resource type="Script" path="res://gathering/gathering_controller.gd" id="60_gathering_controller"] -[ext_resource type="Script" path="res://homes/player_home_state.gd" id="61_home_state"] -[ext_resource type="Script" path="res://homes/home_world_service.gd" id="62_home_world"] -[ext_resource type="Script" path="res://network/network_home_service.gd" id="63_network_home"] -[ext_resource type="Script" path="res://homes/home_decor_controller.gd" id="64_home_decor_controller"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_title_grass_native"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_title_water_native"] +shader = ExtResource("40_title_water") +shader_parameter/surface_color = Color(0.1, 0.45, 0.62, 1) +shader_parameter/middle_color = Color(0.055, 0.285, 0.4, 1) +shader_parameter/depth_color = Color(0.02, 0.16, 0.27, 1) +shader_parameter/virtual_pixel_density = Vector2(320, 180) +shader_parameter/color_step_count = 14.0 +shader_parameter/continuous_depth_blend = 0.12 +shader_parameter/wave_speed = 0.1 +shader_parameter/wave_scale = 2.4 +shader_parameter/wave_strength = 0.012 +shader_parameter/caustic_strength = 0.018 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_player_menu_pattern"] shader = ExtResource("42_menu_pattern") -shader_parameter/pattern_texture = ExtResource("40_title_grass") +shader_parameter/pattern_texture = ExtResource("41_menu_pattern") shader_parameter/source_tile_size = Vector2(128, 128) -shader_parameter/display_scale = 1.0 -shader_parameter/scroll_velocity_pixels = Vector2(-7.5, -7.5) +shader_parameter/display_scale = 0.85 +shader_parameter/scroll_velocity_pixels = Vector2(-7, -5) + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_shop_pattern"] +shader = ExtResource("42_menu_pattern") +shader_parameter/pattern_texture = ExtResource("43_shop_pattern") +shader_parameter/source_tile_size = Vector2(64, 64) +shader_parameter/display_scale = 1.75 +shader_parameter/scroll_velocity_pixels = Vector2(-7, -5) [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_hifdc"] data = PackedVector3Array(-13.598646, -21.527378, 3.4402227, -13.598646, -21.04931, 3.716229, -13.64679, -21.345833, 3.1714065, -13.64679, -21.345833, 3.1714065, -13.598646, -21.04931, 3.716229, -13.598646, -21.04931, 3.1642165, -13.598646, -21.601322, 3.716229, -13.598646, -21.04931, 3.716229, -13.598646, -21.527378, 3.4402227, -13.598646, -21.04931, 3.1642165, -13.598646, -21.04931, 3.716229, -13.598646, -20.773304, 3.238161, -13.604641, -21.54901, 3.9200878, -13.598646, -21.04931, 3.716229, -13.598646, -21.601322, 3.716229, -13.598646, -20.773304, 3.238161, -13.598646, -21.04931, 3.716229, -13.598646, -20.571243, 3.4402227, -13.598646, -21.325317, 4.194297, -13.598646, -21.04931, 3.716229, -13.604641, -21.54901, 3.9200878, -13.598646, -20.571243, 3.4402227, -13.598646, -21.04931, 3.716229, -13.598646, -20.4973, 3.716229, -13.602205, -21.078318, 4.268241, -13.598646, -21.04931, 3.716229, -13.598646, -21.325317, 4.194297, -13.598646, -20.4973, 3.716229, -13.598646, -21.04931, 3.716229, -13.598646, -20.571243, 3.992235, -13.598646, -20.773304, 4.194297, -13.598646, -21.04931, 3.716229, -13.602205, -21.078318, 4.268241, -13.598646, -20.571243, 3.992235, -13.598646, -21.04931, 3.716229, -13.598646, -20.773304, 4.194297, -19.042458, -21.325317, 3.2381601, -19.042458, -21.04931, 3.716228, -19.042458, -21.527378, 3.4402218, -19.042458, -21.527378, 3.4402218, -19.042458, -21.04931, 3.716228, -19.042458, -21.601322, 3.716228, -19.042458, -21.04931, 3.1642156, -19.042458, -21.04931, 3.716228, -19.042458, -21.325317, 3.2381601, -19.042458, -21.601322, 3.716228, -19.042458, -21.04931, 3.716228, -19.042458, -21.527378, 3.992234, -19.042458, -20.773304, 3.2381601, -19.042458, -21.04931, 3.716228, -19.042458, -21.04931, 3.1642156, -19.042458, -21.527378, 3.992234, -19.042458, -21.04931, 3.716228, -19.042458, -21.325317, 4.194296, -18.784327, -20.60149, 3.4511306, -19.042458, -21.04931, 3.716228, -19.042458, -20.773304, 3.2381601, -19.042458, -21.325317, 4.194296, -19.042458, -21.04931, 3.716228, -19.042458, -21.04931, 4.26824, -19.042458, -20.4973, 3.716228, -19.042458, -21.04931, 3.716228, -18.784327, -20.60149, 3.4511306, -19.042458, -21.04931, 4.26824, -19.042458, -21.04931, 3.716228, -19.042458, -20.773304, 4.194296, -19.042458, -20.571243, 3.992234, -19.042458, -21.04931, 3.716228, -19.042458, -20.4973, 3.716228, -19.042458, -20.773304, 4.194296, -19.042458, -21.04931, 3.716228, -19.042458, -20.571243, 3.992234, -14.534702, -21.32513, 3.238533, -17.467253, -21.04931, 3.1645257, -17.467253, -21.32513, 3.2384703, -17.467253, -21.32513, 3.2384703, -19.084044, -21.586075, 3.4063175, -17.467253, -21.52707, 3.440408, -17.467253, -21.32513, 3.2384703, -19.084044, -21.35922, 3.1794631, -19.084044, -21.586075, 3.4063175, -17.467253, -21.04931, 3.1645257, -19.084044, -21.35922, 3.1794631, -17.467253, -21.32513, 3.2384703, -17.467253, -21.32513, 3.2384703, -17.467253, -21.52707, 3.440408, -14.516907, -21.527006, 3.4404085, -17.467253, -21.32513, 3.2384703, -14.516907, -21.527006, 3.4404085, -14.534702, -21.32513, 3.238533, -17.467253, -21.04931, 3.1645257, -19.084044, -21.04931, 3.0964072, -19.084044, -21.35922, 3.1794631, -13.605204, -21.379738, 3.1126475, -14.534702, -21.32513, 3.238533, -14.516907, -21.527006, 3.4404085, -13.605204, -21.379738, 3.1126475, -14.516907, -21.527006, 3.4404085, -13.55706, -21.586075, 3.4063187, -13.55706, -21.04931, 3.0964081, -14.534702, -21.32513, 3.238533, -13.605204, -21.379738, 3.1126475, -13.55706, -21.04931, 3.0964081, -14.519905, -21.04931, 3.1645882, -14.534702, -21.32513, 3.238533, -14.534702, -21.32513, 3.238533, -14.519905, -21.04931, 3.1645882, -17.467253, -21.04931, 3.1645257, -13.55706, -20.7394, 3.179464, -14.519905, -21.04931, 3.1645882, -13.55706, -21.04931, 3.0964081, -17.467253, -20.77349, 3.2384703, -19.084044, -21.04931, 3.0964072, -17.467253, -21.04931, 3.1645257, -17.467253, -20.77349, 3.2384703, -17.467253, -21.04931, 3.1645257, -14.519905, -21.04931, 3.1645882, -17.467253, -20.77349, 3.2384703, -19.084044, -20.7394, 3.1794631, -19.084044, -21.04931, 3.0964072, -17.467253, -20.571552, 3.440408, -19.084044, -20.7394, 3.1794631, -17.467253, -20.77349, 3.2384703, -17.467253, -20.571552, 3.440408, -18.82591, -20.542793, 3.4172263, -19.084044, -20.7394, 3.1794631, -17.467253, -20.77349, 3.2384703, -14.519905, -21.04931, 3.1645882, -14.509039, -20.77349, 3.238533, -17.467253, -20.571552, 3.440408, -17.467253, -20.77349, 3.2384703, -14.509039, -20.77349, 3.238533, -13.55706, -20.7394, 3.179464, -14.509039, -20.77349, 3.238533, -14.519905, -21.04931, 3.1645882, -17.467253, -20.571552, 3.440408, -14.509039, -20.77349, 3.238533, -14.509039, -20.571615, 3.4404085, -13.55706, -20.512547, 3.4063187, -14.509039, -20.77349, 3.238533, -13.55706, -20.7394, 3.179464, -13.55706, -20.512547, 3.4063187, -14.509039, -20.571615, 3.4404085, -14.509039, -20.77349, 3.238533, -17.467253, -21.52707, 3.440408, -14.509039, -21.60095, 3.7162287, -14.516907, -21.527006, 3.4404085, -13.55706, -21.586075, 3.4063187, -14.516907, -21.527006, 3.4404085, -14.509039, -21.60095, 3.7162287, -13.55706, -21.586075, 3.4063187, -14.509039, -21.60095, 3.7162287, -13.55706, -21.669132, 3.716229, -13.55706, -21.669132, 3.716229, -14.509039, -21.60095, 3.7162287, -14.511475, -21.527006, 3.992049, -13.55706, -21.669132, 3.716229, -14.511475, -21.527006, 3.992049, -13.563242, -21.607708, 3.9539921, -17.467253, -21.601013, 3.7162282, -14.511475, -21.527006, 3.992049, -14.509039, -21.60095, 3.7162287, -17.467253, -21.52707, 3.440408, -17.467253, -21.601013, 3.7162282, -14.509039, -21.60095, 3.7162287, -17.467253, -21.601013, 3.7162282, -17.467253, -21.52707, 3.9920485, -14.511475, -21.527006, 3.992049, -17.467253, -21.601013, 3.7162282, -19.084044, -21.586075, 4.0261383, -17.467253, -21.52707, 3.9920485, -17.467253, -21.601013, 3.7162282, -19.084044, -21.669132, 3.716228, -19.084044, -21.586075, 4.0261383, -17.467253, -21.52707, 3.440408, -19.084044, -21.669132, 3.716228, -17.467253, -21.601013, 3.7162282, -17.467253, -21.52707, 3.440408, -19.084044, -21.586075, 3.4063175, -19.084044, -21.669132, 3.716228, -17.467253, -21.52707, 3.9920485, -14.509039, -21.32513, 4.1939244, -14.511475, -21.527006, 3.992049, -13.563242, -21.607708, 3.9539921, -14.511475, -21.527006, 3.992049, -14.509039, -21.32513, 4.1939244, -13.563242, -21.607708, 3.9539921, -14.509039, -21.32513, 4.1939244, -13.557062, -21.35922, 4.2529936, -13.557062, -21.35922, 4.2529936, -14.509039, -21.32513, 4.1939244, -14.510912, -21.04931, 4.267869, -13.557062, -21.35922, 4.2529936, -14.510912, -21.04931, 4.267869, -13.560621, -21.078318, 4.3360496, -17.467253, -21.52707, 3.9920485, -17.467253, -21.32513, 4.193986, -14.509039, -21.32513, 4.1939244, -17.467253, -21.32513, 4.193986, -14.510912, -21.04931, 4.267869, -14.509039, -21.32513, 4.1939244, -17.467253, -21.52707, 3.9920485, -19.084044, -21.35922, 4.2529926, -17.467253, -21.32513, 4.193986, -17.467253, -21.52707, 3.9920485, -19.084044, -21.586075, 4.0261383, -19.084044, -21.35922, 4.2529926, -17.467253, -21.32513, 4.193986, -19.084044, -21.35922, 4.2529926, -19.084044, -21.04931, 4.3360486, -17.467253, -21.32513, 4.193986, -19.084044, -21.04931, 4.3360486, -17.467253, -21.04931, 4.2679305, -17.467253, -21.32513, 4.193986, -17.467253, -21.04931, 4.2679305, -14.510912, -21.04931, 4.267869, -17.467253, -21.04931, 4.2679305, -19.084044, -21.04931, 4.3360486, -19.084044, -20.7394, 4.2529926, -13.560621, -21.078318, 4.3360496, -14.510912, -21.04931, 4.267869, -14.510912, -20.795122, 4.1217775, -17.467253, -21.04931, 4.2679305, -14.510912, -20.795122, 4.1217775, -14.510912, -21.04931, 4.267869, -13.560621, -21.078318, 4.3360496, -14.510912, -20.795122, 4.1217775, -13.557062, -20.7394, 4.2529936, -17.467253, -21.04931, 4.2679305, -19.084044, -20.7394, 4.2529926, -17.467253, -20.77349, 4.193986, -17.467253, -21.04931, 4.2679305, -17.467253, -20.77349, 4.193986, -14.510912, -20.795122, 4.1217775, -17.467253, -20.77349, 4.193986, -19.084044, -20.7394, 4.2529926, -19.084044, -20.512547, 4.0261383, -17.467253, -20.77349, 4.193986, -19.084044, -20.512547, 4.0261383, -17.467253, -20.571552, 3.9920485, -17.467253, -20.77349, 4.193986, -17.467253, -20.571552, 3.9920485, -14.509039, -20.571615, 3.992049, -17.467253, -20.77349, 4.193986, -14.509039, -20.571615, 3.992049, -14.510912, -20.795122, 4.1217775, -13.557062, -20.7394, 4.2529936, -14.510912, -20.795122, 4.1217775, -14.509039, -20.571615, 3.992049, -13.557062, -20.7394, 4.2529936, -14.509039, -20.571615, 3.992049, -13.55706, -20.512547, 4.0261393, -17.467253, -20.571552, 3.9920485, -14.509039, -20.497732, 3.7162287, -14.509039, -20.571615, 3.992049, -13.55706, -20.512547, 4.0261393, -14.509039, -20.571615, 3.992049, -14.509039, -20.497732, 3.7162287, -13.55706, -20.512547, 4.0261393, -14.509039, -20.497732, 3.7162287, -13.55706, -20.42949, 3.716229, -13.55706, -20.42949, 3.716229, -14.509039, -20.497732, 3.7162287, -14.509039, -20.571615, 3.4404085, -13.55706, -20.42949, 3.716229, -14.509039, -20.571615, 3.4404085, -13.55706, -20.512547, 3.4063187, -17.467253, -20.497608, 3.7162282, -14.509039, -20.571615, 3.4404085, -14.509039, -20.497732, 3.7162287, -17.467253, -20.571552, 3.9920485, -17.467253, -20.497608, 3.7162282, -14.509039, -20.497732, 3.7162287, -17.467253, -20.497608, 3.7162282, -17.467253, -20.571552, 3.440408, -14.509039, -20.571615, 3.4404085, -17.467253, -20.497608, 3.7162282, -18.82591, -20.542793, 3.4172263, -17.467253, -20.571552, 3.440408, -17.467253, -20.497608, 3.7162282, -19.084044, -20.42949, 3.716228, -18.82591, -20.542793, 3.4172263, -17.467253, -20.571552, 3.9920485, -19.084044, -20.42949, 3.716228, -17.467253, -20.497608, 3.7162282, -17.467253, -20.571552, 3.9920485, -19.084044, -20.512547, 4.0261383, -19.084044, -20.42949, 3.716228, -19.084044, -21.35922, 3.1794631, -19.084044, -21.586075, 3.4063175, -19.084044, -21.586075, 3.4063175, -19.084044, -21.586075, 3.4063175, -19.084044, -21.586075, 3.4063175, -19.084044, -21.669132, 3.716228, -19.084044, -21.35922, 3.1794631, -19.084044, -21.35922, 3.1794631, -19.084044, -21.586075, 3.4063175, -19.084044, -21.04931, 3.0964072, -19.084044, -21.35922, 3.1794631, -19.084044, -21.35922, 3.1794631, -19.084044, -21.04931, 3.0964072, -19.084044, -21.04931, 3.0964072, -19.084044, -21.35922, 3.1794631, -19.084044, -21.586075, 3.4063175, -19.084044, -21.669132, 3.716228, -19.084044, -21.669132, 3.716228, -19.084044, -21.669132, 3.716228, -19.084044, -21.669132, 3.716228, -19.084044, -21.586075, 4.0261383, -19.084044, -21.669132, 3.716228, -19.084044, -21.586075, 4.0261383, -19.084044, -21.586075, 4.0261383, -19.084044, -21.586075, 4.0261383, -19.084044, -21.586075, 4.0261383, -19.084044, -21.35922, 4.2529926, -19.084044, -21.586075, 4.0261383, -19.084044, -21.35922, 4.2529926, -19.084044, -21.35922, 4.2529926, -19.084044, -21.35922, 4.2529926, -19.084044, -21.35922, 4.2529926, -19.084044, -21.04931, 4.3360486, -19.084044, -21.35922, 4.2529926, -19.084044, -21.04931, 4.3360486, -19.084044, -21.04931, 4.3360486, -19.084044, -21.04931, 4.3360486, -19.084044, -21.04931, 4.3360486, -19.084044, -20.7394, 4.2529926, -19.084044, -21.04931, 4.3360486, -19.084044, -20.7394, 4.2529926, -19.084044, -20.7394, 4.2529926, -19.084044, -20.7394, 4.2529926, -19.084044, -20.7394, 4.2529926, -19.084044, -20.512547, 4.0261383, -19.084044, -20.7394, 4.2529926, -19.084044, -20.512547, 4.0261383, -19.084044, -20.512547, 4.0261383, -19.084044, -20.512547, 4.0261383, -19.084044, -20.512547, 4.0261383, -19.084044, -20.42949, 3.716228, -19.084044, -20.512547, 4.0261383, -19.084044, -20.42949, 3.716228, -19.084044, -20.42949, 3.716228, -19.084044, -20.42949, 3.716228, -19.084044, -20.42949, 3.716228, -18.82591, -20.542793, 3.4172263, -19.084044, -20.42949, 3.716228, -18.82591, -20.542793, 3.4172263, -18.82591, -20.542793, 3.4172263, -18.82591, -20.542793, 3.4172263, -19.084044, -20.7394, 3.1794631, -19.084044, -20.7394, 3.1794631, -18.82591, -20.542793, 3.4172263, -18.82591, -20.542793, 3.4172263, -19.084044, -20.7394, 3.1794631, -19.084044, -20.7394, 3.1794631, -19.084044, -21.04931, 3.0964072, -19.084044, -21.04931, 3.0964072, -19.084044, -20.7394, 3.1794631, -19.084044, -20.7394, 3.1794631, -19.084044, -21.04931, 3.0964072, -13.55706, -21.586075, 3.4063187, -13.605204, -21.345833, 3.1714065, -13.605204, -21.379738, 3.1126475, -13.605204, -21.379738, 3.1126475, -13.605204, -21.345833, 3.1714065, -13.55706, -21.04931, 3.1642165, -13.55706, -21.586075, 3.4063187, -13.55706, -21.527378, 3.4402227, -13.605204, -21.345833, 3.1714065, -13.605204, -21.379738, 3.1126475, -13.55706, -21.04931, 3.1642165, -13.55706, -21.04931, 3.0964081, -13.55706, -21.669132, 3.716229, -13.55706, -21.527378, 3.4402227, -13.55706, -21.586075, 3.4063187, -13.55706, -21.04931, 3.0964081, -13.55706, -21.04931, 3.1642165, -13.55706, -20.773304, 3.238161, -13.55706, -21.669132, 3.716229, -13.55706, -21.601322, 3.716229, -13.55706, -21.527378, 3.4402227, -13.55706, -21.04931, 3.0964081, -13.55706, -20.773304, 3.238161, -13.55706, -20.7394, 3.179464, -13.563242, -21.607708, 3.9539921, -13.55706, -21.601322, 3.716229, -13.55706, -21.669132, 3.716229, -13.55706, -20.7394, 3.179464, -13.55706, -20.773304, 3.238161, -13.55706, -20.571243, 3.4402227, -13.563242, -21.607708, 3.9539921, -13.563242, -21.54901, 3.9200878, -13.55706, -21.601322, 3.716229, -13.55706, -20.7394, 3.179464, -13.55706, -20.571243, 3.4402227, -13.55706, -20.512547, 3.4063187, -13.557062, -21.35922, 4.2529936, -13.563242, -21.54901, 3.9200878, -13.563242, -21.607708, 3.9539921, -13.55706, -20.512547, 3.4063187, -13.55706, -20.571243, 3.4402227, -13.55706, -20.4973, 3.716229, -13.557062, -21.35922, 4.2529936, -13.55706, -21.325317, 4.194297, -13.563242, -21.54901, 3.9200878, -13.55706, -20.512547, 3.4063187, -13.55706, -20.4973, 3.716229, -13.55706, -20.42949, 3.716229, -13.560621, -21.078318, 4.3360496, -13.55706, -21.325317, 4.194297, -13.557062, -21.35922, 4.2529936, -13.55706, -20.42949, 3.716229, -13.55706, -20.4973, 3.716229, -13.55706, -20.571243, 3.9922352, -13.560621, -21.078318, 4.3360496, -13.560621, -21.078318, 4.268241, -13.55706, -21.325317, 4.194297, -13.55706, -20.42949, 3.716229, -13.55706, -20.571243, 3.9922352, -13.55706, -20.512547, 4.0261393, -13.557062, -20.7394, 4.2529936, -13.560621, -21.078318, 4.268241, -13.560621, -21.078318, 4.3360496, -13.55706, -20.512547, 4.0261393, -13.55706, -20.571243, 3.9922352, -13.55706, -20.773304, 4.194297, -13.557062, -20.7394, 4.2529936, -13.55706, -20.773304, 4.194297, -13.560621, -21.078318, 4.268241, -13.55706, -20.512547, 4.0261393, -13.55706, -20.773304, 4.194297, -13.557062, -20.7394, 4.2529936, -19.084044, -21.35922, 3.1794631, -19.084044, -21.527378, 3.4402218, -19.084044, -21.586075, 3.4063175, -19.084044, -21.586075, 3.4063175, -19.084044, -21.527378, 3.4402218, -19.084044, -21.601322, 3.716228, -19.084044, -21.35922, 3.1794631, -19.084044, -21.325317, 3.2381601, -19.084044, -21.527378, 3.4402218, -19.084044, -21.586075, 3.4063175, -19.084044, -21.601322, 3.716228, -19.084044, -21.669132, 3.716228, -19.084044, -21.04931, 3.0964072, -19.084044, -21.325317, 3.2381601, -19.084044, -21.35922, 3.1794631, -19.084044, -21.669132, 3.716228, -19.084044, -21.601322, 3.716228, -19.084044, -21.527378, 3.992234, -19.084044, -21.04931, 3.0964072, -19.084044, -21.04931, 3.1642156, -19.084044, -21.325317, 3.2381601, -19.084044, -21.669132, 3.716228, -19.084044, -21.527378, 3.992234, -19.084044, -21.586075, 4.0261383, -19.084044, -20.7394, 3.1794631, -19.084044, -21.04931, 3.1642156, -19.084044, -21.04931, 3.0964072, -19.084044, -21.586075, 4.0261383, -19.084044, -21.527378, 3.992234, -19.084044, -21.325317, 4.194296, -19.084044, -20.7394, 3.1794631, -19.084044, -20.773304, 3.2381601, -19.084044, -21.04931, 3.1642156, -19.084044, -21.586075, 4.0261383, -19.084044, -21.325317, 4.194296, -19.084044, -21.35922, 4.2529926, -18.82591, -20.542793, 3.4172263, -19.084044, -20.773304, 3.2381601, -19.084044, -20.7394, 3.1794631, -19.084044, -21.35922, 4.2529926, -19.084044, -21.325317, 4.194296, -19.084044, -21.04931, 4.26824, -18.82591, -20.542793, 3.4172263, -18.82591, -20.60149, 3.4511306, -19.084044, -20.773304, 3.2381601, -19.084044, -21.35922, 4.2529926, -19.084044, -21.04931, 4.26824, -19.084044, -21.04931, 4.3360486, -19.084044, -20.42949, 3.716228, -18.82591, -20.60149, 3.4511306, -18.82591, -20.542793, 3.4172263, -19.084044, -21.04931, 4.3360486, -19.084044, -21.04931, 4.26824, -19.084044, -20.773304, 4.194296, -19.084044, -20.42949, 3.716228, -19.084044, -20.4973, 3.716228, -18.82591, -20.60149, 3.4511306, -19.084044, -21.04931, 4.3360486, -19.084044, -20.773304, 4.194296, -19.084044, -20.7394, 4.2529926, -19.084044, -20.512547, 4.0261383, -19.084044, -20.4973, 3.716228, -19.084044, -20.42949, 3.716228, -19.084044, -20.7394, 4.2529926, -19.084044, -20.773304, 4.194296, -19.084044, -20.571243, 3.992234, -19.084044, -20.512547, 4.0261383, -19.084044, -20.571243, 3.992234, -19.084044, -20.4973, 3.716228, -19.084044, -20.7394, 4.2529926, -19.084044, -20.571243, 3.992234, -19.084044, -20.512547, 4.0261383, -13.55706, -21.527378, 3.4402227, -13.64679, -21.345833, 3.1714065, -13.605204, -21.345833, 3.1714065, -13.55706, -21.527378, 3.4402227, -13.598646, -21.527378, 3.4402227, -13.64679, -21.345833, 3.1714065, -13.55706, -21.601322, 3.716229, -13.598646, -21.527378, 3.4402227, -13.55706, -21.527378, 3.4402227, -13.55706, -21.601322, 3.716229, -13.598646, -21.601322, 3.716229, -13.598646, -21.527378, 3.4402227, -13.563242, -21.54901, 3.9200878, -13.598646, -21.601322, 3.716229, -13.55706, -21.601322, 3.716229, -13.563242, -21.54901, 3.9200878, -13.604641, -21.54901, 3.9200878, -13.598646, -21.601322, 3.716229, -13.55706, -21.325317, 4.194297, -13.604641, -21.54901, 3.9200878, -13.563242, -21.54901, 3.9200878, -13.55706, -21.325317, 4.194297, -13.598646, -21.325317, 4.194297, -13.604641, -21.54901, 3.9200878, -13.560621, -21.078318, 4.268241, -13.598646, -21.325317, 4.194297, -13.55706, -21.325317, 4.194297, -13.560621, -21.078318, 4.268241, -13.602205, -21.078318, 4.268241, -13.598646, -21.325317, 4.194297, -13.55706, -20.773304, 4.194297, -13.602205, -21.078318, 4.268241, -13.560621, -21.078318, 4.268241, -13.55706, -20.773304, 4.194297, -13.598646, -20.773304, 4.194297, -13.602205, -21.078318, 4.268241, -13.55706, -20.571243, 3.9922352, -13.598646, -20.773304, 4.194297, -13.55706, -20.773304, 4.194297, -13.55706, -20.571243, 3.9922352, -13.598646, -20.571243, 3.992235, -13.598646, -20.773304, 4.194297, -13.55706, -20.4973, 3.716229, -13.598646, -20.571243, 3.992235, -13.55706, -20.571243, 3.9922352, -13.55706, -20.4973, 3.716229, -13.598646, -20.4973, 3.716229, -13.598646, -20.571243, 3.992235, -13.55706, -20.571243, 3.4402227, -13.598646, -20.4973, 3.716229, -13.55706, -20.4973, 3.716229, -13.55706, -20.571243, 3.4402227, -13.598646, -20.571243, 3.4402227, -13.598646, -20.4973, 3.716229, -13.55706, -20.773304, 3.238161, -13.598646, -20.571243, 3.4402227, -13.55706, -20.571243, 3.4402227, -13.55706, -20.773304, 3.238161, -13.598646, -20.773304, 3.238161, -13.598646, -20.571243, 3.4402227, -13.55706, -21.04931, 3.1642165, -13.598646, -20.773304, 3.238161, -13.55706, -20.773304, 3.238161, -13.55706, -21.04931, 3.1642165, -13.598646, -21.04931, 3.1642165, -13.598646, -20.773304, 3.238161, -13.605204, -21.345833, 3.1714065, -13.598646, -21.04931, 3.1642165, -13.55706, -21.04931, 3.1642165, -13.605204, -21.345833, 3.1714065, -13.64679, -21.345833, 3.1714065, -13.598646, -21.04931, 3.1642165, -19.084044, -21.325317, 3.2381601, -19.042458, -21.527378, 3.4402218, -19.084044, -21.527378, 3.4402218, -19.084044, -21.325317, 3.2381601, -19.042458, -21.325317, 3.2381601, -19.042458, -21.527378, 3.4402218, -19.084044, -21.527378, 3.4402218, -19.042458, -21.601322, 3.716228, -19.084044, -21.601322, 3.716228, -19.084044, -21.527378, 3.4402218, -19.042458, -21.527378, 3.4402218, -19.042458, -21.601322, 3.716228, -19.084044, -21.601322, 3.716228, -19.042458, -21.527378, 3.992234, -19.084044, -21.527378, 3.992234, -19.084044, -21.601322, 3.716228, -19.042458, -21.601322, 3.716228, -19.042458, -21.527378, 3.992234, -19.084044, -21.527378, 3.992234, -19.042458, -21.325317, 4.194296, -19.084044, -21.325317, 4.194296, -19.084044, -21.527378, 3.992234, -19.042458, -21.527378, 3.992234, -19.042458, -21.325317, 4.194296, -19.084044, -21.325317, 4.194296, -19.042458, -21.04931, 4.26824, -19.084044, -21.04931, 4.26824, -19.084044, -21.325317, 4.194296, -19.042458, -21.325317, 4.194296, -19.042458, -21.04931, 4.26824, -19.084044, -21.04931, 4.26824, -19.042458, -21.04931, 4.26824, -19.042458, -20.773304, 4.194296, -19.084044, -21.04931, 4.26824, -19.042458, -20.773304, 4.194296, -19.084044, -20.773304, 4.194296, -19.084044, -20.773304, 4.194296, -19.042458, -20.571243, 3.992234, -19.084044, -20.571243, 3.992234, -19.084044, -20.773304, 4.194296, -19.042458, -20.773304, 4.194296, -19.042458, -20.571243, 3.992234, -19.084044, -20.571243, 3.992234, -19.042458, -20.4973, 3.716228, -19.084044, -20.4973, 3.716228, -19.084044, -20.571243, 3.992234, -19.042458, -20.571243, 3.992234, -19.042458, -20.4973, 3.716228, -19.084044, -20.4973, 3.716228, -18.784327, -20.60149, 3.4511306, -18.82591, -20.60149, 3.4511306, -19.084044, -20.4973, 3.716228, -19.042458, -20.4973, 3.716228, -18.784327, -20.60149, 3.4511306, -18.82591, -20.60149, 3.4511306, -19.042458, -20.773304, 3.2381601, -19.084044, -20.773304, 3.2381601, -18.82591, -20.60149, 3.4511306, -18.784327, -20.60149, 3.4511306, -19.042458, -20.773304, 3.2381601, -19.084044, -20.773304, 3.2381601, -19.042458, -21.04931, 3.1642156, -19.084044, -21.04931, 3.1642156, -19.084044, -20.773304, 3.2381601, -19.042458, -20.773304, 3.2381601, -19.042458, -21.04931, 3.1642156, -19.084044, -21.04931, 3.1642156, -19.042458, -21.04931, 3.1642156, -19.042458, -21.325317, 3.2381601, -19.084044, -21.04931, 3.1642156, -19.042458, -21.325317, 3.2381601, -19.084044, -21.325317, 3.2381601, -0.49230337, 3.2260702, -2.5408025, -0.2174604, 3.7041378, -2.5661154, -0.75557137, 3.4076157, -2.4682097, -0.75557137, 3.4076157, -2.4682097, -0.2174604, 3.7041378, -2.5661154, -0.7671461, 3.7041378, -2.5154896, -0.2174604, 3.1521254, -2.5661154, -0.2174604, 3.7041378, -2.5661154, -0.49230337, 3.2260702, -2.5408025, -0.7671461, 3.7041378, -2.5154896, -0.2174604, 3.7041378, -2.5661154, -0.6935134, 3.980144, -2.5222712, -0.01391077, 3.2044384, -2.5788422, -0.2174604, 3.7041378, -2.5661154, -0.2174604, 3.1521254, -2.5661154, -0.6935134, 3.980144, -2.5222712, -0.2174604, 3.7041378, -2.5661154, -0.49230337, 4.1822057, -2.5408025, 0.2585926, 3.4281316, -2.6099591, -0.2174604, 3.7041378, -2.5661154, -0.01391077, 3.2044384, -2.5788422, -0.49230337, 4.1822057, -2.5408025, -0.2174604, 3.7041378, -2.5661154, -0.2174604, 4.2561502, -2.5661154, 0.33255196, 3.6751301, -2.6131968, -0.2174604, 3.7041378, -2.5661154, 0.2585926, 3.4281316, -2.6099591, -0.2174604, 4.2561502, -2.5661154, -0.2174604, 3.7041378, -2.5661154, 0.057382584, 4.1822057, -2.5914283, 0.2585926, 3.980144, -2.6099591, -0.2174604, 3.7041378, -2.5661154, 0.33255196, 3.6751301, -2.6131968, 0.057382584, 4.1822057, -2.5914283, -0.2174604, 3.7041378, -2.5661154, 0.2585926, 3.980144, -2.6099591, -0.19425559, 3.4281316, 2.8985977, 0.2817974, 3.7041378, 2.8547535, 0.0069544315, 3.2260702, 2.8800664, 0.0069544315, 3.2260702, 2.8800664, 0.2817974, 3.7041378, 2.8547535, 0.2817974, 3.1521254, 2.8547535, -0.26788855, 3.7041378, 2.9053793, 0.2817974, 3.7041378, 2.8547535, -0.19425559, 3.4281316, 2.8985977, 0.2817974, 3.1521254, 2.8547535, 0.2817974, 3.7041378, 2.8547535, 0.55664027, 3.2260702, 2.8294406, -0.19425559, 3.980144, 2.8985977, 0.2817974, 3.7041378, 2.8547535, -0.26788855, 3.7041378, 2.9053793, 0.55664027, 3.2260702, 2.8294406, 0.2817974, 3.7041378, 2.8547535, 0.75785017, 3.4281316, 2.8109093, -0.0058562756, 4.1519585, 2.6220222, 0.2817974, 3.7041378, 2.8547535, -0.19425559, 3.980144, 2.8985977, 0.75785017, 3.4281316, 2.8109093, 0.2817974, 3.7041378, 2.8547535, 0.8314831, 3.7041378, 2.8041277, 0.2817974, 4.2561502, 2.8547535, 0.2817974, 3.7041378, 2.8547535, -0.0058562756, 4.1519585, 2.6220222, 0.8314831, 3.7041378, 2.8041277, 0.2817974, 3.7041378, 2.8547535, 0.75785017, 3.980144, 2.8109093, 0.55664027, 4.1822057, 2.8294406, 0.2817974, 3.7041378, 2.8547535, 0.2817974, 4.2561502, 2.8547535, 0.75785017, 3.980144, 2.8109093, 0.2817974, 3.7041378, 2.8547535, 0.55664027, 4.1822057, 2.8294406, -0.6072962, 3.4283175, -1.5901942, -0.41204357, 3.7041378, 1.3367851, -0.33841062, 3.4283175, 1.3300035, -0.33841062, 3.4283175, 1.3300035, -0.022993088, 3.1673732, 2.9245868, -0.1373241, 3.2263799, 1.3114836, -0.33841062, 3.4283175, 1.3300035, -0.24889135, 3.3942275, 2.9453917, -0.022993088, 3.1673732, 2.9245868, -0.41204357, 3.7041378, 1.3367851, -0.24889135, 3.3942275, 2.9453917, -0.33841062, 3.4283175, 1.3300035, -0.33841062, 3.4283175, 1.3300035, -0.1373241, 3.2263799, 1.3114836, -0.40790343, 3.2264419, -1.6264291, -0.33841062, 3.4283175, 1.3300035, -0.40790343, 3.2264419, -1.6264291, -0.6072962, 3.4283175, -1.5901942, -0.41204357, 3.7041378, 1.3367851, -0.33159733, 3.7041378, 2.9530087, -0.24889135, 3.3942275, 2.9453917, -0.81789684, 3.3737113, -2.5042315, -0.6072962, 3.4283175, -1.5901942, -0.40790343, 3.2264419, -1.6264291, -0.81789684, 3.3737113, -2.5042315, -0.40790343, 3.2264419, -1.6264291, -0.5298786, 3.1673732, -2.5791035, -0.83848286, 3.7041378, -2.5506816, -0.6072962, 3.4283175, -1.5901942, -0.81789684, 3.3737113, -2.5042315, -0.83848286, 3.7041378, -2.5506816, -0.6822865, 3.7041378, -1.5981488, -0.6072962, 3.4283175, -1.5901942, -0.6072962, 3.4283175, -1.5901942, -0.6822865, 3.7041378, -1.5981488, -0.41204357, 3.7041378, 1.3367851, -0.7557769, 4.014048, -2.5582986, -0.6822865, 3.7041378, -1.5981488, -0.83848286, 3.7041378, -2.5506816, -0.33841062, 3.979958, 1.3300035, -0.33159733, 3.7041378, 2.9530087, -0.41204357, 3.7041378, 1.3367851, -0.33841062, 3.979958, 1.3300035, -0.41204357, 3.7041378, 1.3367851, -0.6822865, 3.7041378, -1.5981488, -0.33841062, 3.979958, 1.3300035, -0.24889135, 4.014048, 2.9453917, -0.33159733, 3.7041378, 2.9530087, -0.1373241, 4.1818957, 1.3114836, -0.24889135, 4.014048, 2.9453917, -0.33841062, 3.979958, 1.3300035, -0.1373241, 4.1818957, 1.3114836, -0.035803795, 4.210655, 2.666542, -0.24889135, 4.014048, 2.9453917, -0.33841062, 3.979958, 1.3300035, -0.6822865, 3.7041378, -1.5981488, -0.6096499, 3.979958, -1.6157494, -0.1373241, 4.1818957, 1.3114836, -0.33841062, 3.979958, 1.3300035, -0.6096499, 3.979958, -1.6157494, -0.7557769, 4.014048, -2.5582986, -0.6096499, 3.979958, -1.6157494, -0.6822865, 3.7041378, -1.5981488, -0.1373241, 4.1818957, 1.3114836, -0.6096499, 3.979958, -1.6157494, -0.40862513, 4.1818337, -1.6342635, -0.5298786, 4.2409024, -2.5791035, -0.6096499, 3.979958, -1.6157494, -0.7557769, 4.014048, -2.5582986, -0.5298786, 4.2409024, -2.5791035, -0.40862513, 4.1818337, -1.6342635, -0.6096499, 3.979958, -1.6157494, -0.1373241, 3.2263799, 1.3114836, -0.13396716, 3.1524973, -1.6595592, -0.40790343, 3.2264419, -1.6264291, -0.5298786, 3.1673732, -2.5791035, -0.40790343, 3.2264419, -1.6264291, -0.13396716, 3.1524973, -1.6595592, -0.5298786, 3.1673732, -2.5791035, -0.13396716, 3.1524973, -1.6595592, -0.22127414, 3.0843172, -2.6075258, -0.22127414, 3.0843172, -2.6075258, -0.13396716, 3.1524973, -1.6595592, 0.14091396, 3.2264419, -1.68243, -0.22127414, 3.0843172, -2.6075258, 0.14091396, 3.2264419, -1.68243, 0.016053915, 3.1457415, -2.6231756, 0.13733363, 3.1524353, 1.2861879, 0.14091396, 3.2264419, -1.68243, -0.13396716, 3.1524973, -1.6595592, -0.1373241, 3.2263799, 1.3114836, 0.13733363, 3.1524353, 1.2861879, -0.13396716, 3.1524973, -1.6595592, 0.13733363, 3.1524353, 1.2861879, 0.4119916, 3.2263799, 1.2608922, 0.14091396, 3.2264419, -1.68243, 0.13733363, 3.1524353, 1.2861879, 0.5942155, 3.1673732, 2.867742, 0.4119916, 3.2263799, 1.2608922, 0.13733363, 3.1524353, 1.2861879, 0.28561115, 3.0843172, 2.8961644, 0.5942155, 3.1673732, 2.867742, -0.1373241, 3.2263799, 1.3114836, 0.28561115, 3.0843172, 2.8961644, 0.13733363, 3.1524353, 1.2861879, -0.1373241, 3.2263799, 1.3114836, -0.022993088, 3.1673732, 2.9245868, 0.28561115, 3.0843172, 2.8961644, 0.4119916, 3.2263799, 1.2608922, 0.34171534, 3.4283175, -1.7033694, 0.14091396, 3.2264419, -1.68243, 0.016053915, 3.1457415, -2.6231756, 0.14091396, 3.2264419, -1.68243, 0.34171534, 3.4283175, -1.7033694, 0.016053915, 3.1457415, -2.6231756, 0.34171534, 3.4283175, -1.7033694, 0.31322837, 3.3942275, -2.656753, 0.31322837, 3.3942275, -2.656753, 0.34171534, 3.4283175, -1.7033694, 0.4155202, 3.7041378, -1.7082856, 0.31322837, 3.3942275, -2.656753, 0.4155202, 3.7041378, -1.7082856, 0.39626074, 3.6751301, -2.6608262, 0.4119916, 3.2263799, 1.2608922, 0.613078, 3.4283175, 1.2423723, 0.34171534, 3.4283175, -1.7033694, 0.613078, 3.4283175, 1.2423723, 0.4155202, 3.7041378, -1.7082856, 0.34171534, 3.4283175, -1.7033694, 0.4119916, 3.2263799, 1.2608922, 0.8201138, 3.3942275, 2.8469372, 0.613078, 3.4283175, 1.2423723, 0.4119916, 3.2263799, 1.2608922, 0.5942155, 3.1673732, 2.867742, 0.8201138, 3.3942275, 2.8469372, 0.613078, 3.4283175, 1.2423723, 0.8201138, 3.3942275, 2.8469372, 0.90281975, 3.7041378, 2.8393202, 0.613078, 3.4283175, 1.2423723, 0.90281975, 3.7041378, 2.8393202, 0.68671095, 3.7041378, 1.2355907, 0.613078, 3.4283175, 1.2423723, 0.68671095, 3.7041378, 1.2355907, 0.4155202, 3.7041378, -1.7082856, 0.68671095, 3.7041378, 1.2355907, 0.90281975, 3.7041378, 2.8393202, 0.8201138, 4.014048, 2.8469372, 0.39626074, 3.6751301, -2.6608262, 0.4155202, 3.7041378, -1.7082856, 0.2700441, 3.9583263, -1.6948872, 0.68671095, 3.7041378, 1.2355907, 0.2700441, 3.9583263, -1.6948872, 0.4155202, 3.7041378, -1.7082856, 0.39626074, 3.6751301, -2.6608262, 0.2700441, 3.9583263, -1.6948872, 0.31322837, 4.014048, -2.656753, 0.68671095, 3.7041378, 1.2355907, 0.8201138, 4.014048, 2.8469372, 0.613078, 3.979958, 1.2423723, 0.68671095, 3.7041378, 1.2355907, 0.613078, 3.979958, 1.2423723, 0.2700441, 3.9583263, -1.6948872, 0.613078, 3.979958, 1.2423723, 0.8201138, 4.014048, 2.8469372, 0.5942155, 4.2409024, 2.867742, 0.613078, 3.979958, 1.2423723, 0.5942155, 4.2409024, 2.867742, 0.4119916, 4.1818957, 1.2608922, 0.613078, 3.979958, 1.2423723, 0.4119916, 4.1818957, 1.2608922, 0.14069057, 4.1818337, -1.684855, 0.613078, 3.979958, 1.2423723, 0.14069057, 4.1818337, -1.684855, 0.2700441, 3.9583263, -1.6948872, 0.31322837, 4.014048, -2.656753, 0.2700441, 3.9583263, -1.6948872, 0.14069057, 4.1818337, -1.684855, 0.31322837, 4.014048, -2.656753, 0.14069057, 4.1818337, -1.684855, 0.0873301, 4.2409024, -2.6359482, 0.4119916, 4.1818957, 1.2608922, -0.13396716, 4.2557163, -1.6595592, 0.14069057, 4.1818337, -1.684855, 0.0873301, 4.2409024, -2.6359482, 0.14069057, 4.1818337, -1.684855, -0.13396716, 4.2557163, -1.6595592, 0.0873301, 4.2409024, -2.6359482, -0.13396716, 4.2557163, -1.6595592, -0.22127414, 4.3239584, -2.6075258, -0.22127414, 4.3239584, -2.6075258, -0.13396716, 4.2557163, -1.6595592, -0.40862513, 4.1818337, -1.6342635, -0.22127414, 4.3239584, -2.6075258, -0.40862513, 4.1818337, -1.6342635, -0.5298786, 4.2409024, -2.5791035, 0.13733363, 4.2558403, 1.2861879, -0.40862513, 4.1818337, -1.6342635, -0.13396716, 4.2557163, -1.6595592, 0.4119916, 4.1818957, 1.2608922, 0.13733363, 4.2558403, 1.2861879, -0.13396716, 4.2557163, -1.6595592, 0.13733363, 4.2558403, 1.2861879, -0.1373241, 4.1818957, 1.3114836, -0.40862513, 4.1818337, -1.6342635, 0.13733363, 4.2558403, 1.2861879, -0.035803795, 4.210655, 2.666542, -0.1373241, 4.1818957, 1.3114836, 0.13733363, 4.2558403, 1.2861879, 0.28561115, 4.3239584, 2.8961644, -0.035803795, 4.210655, 2.666542, 0.4119916, 4.1818957, 1.2608922, 0.28561115, 4.3239584, 2.8961644, 0.13733363, 4.2558403, 1.2861879, 0.4119916, 4.1818957, 1.2608922, 0.5942155, 4.2409024, 2.867742, 0.28561115, 4.3239584, 2.8961644, -0.24889135, 3.3942275, 2.9453917, -0.022993088, 3.1673732, 2.9245868, -0.022993088, 3.1673732, 2.9245868, -0.022993088, 3.1673732, 2.9245868, -0.022993088, 3.1673732, 2.9245868, 0.28561115, 3.0843172, 2.8961644, -0.24889135, 3.3942275, 2.9453917, -0.24889135, 3.3942275, 2.9453917, -0.022993088, 3.1673732, 2.9245868, -0.33159733, 3.7041378, 2.9530087, -0.24889135, 3.3942275, 2.9453917, -0.24889135, 3.3942275, 2.9453917, -0.33159733, 3.7041378, 2.9530087, -0.33159733, 3.7041378, 2.9530087, -0.24889135, 3.3942275, 2.9453917, -0.022993088, 3.1673732, 2.9245868, 0.28561115, 3.0843172, 2.8961644, 0.28561115, 3.0843172, 2.8961644, 0.28561115, 3.0843172, 2.8961644, 0.28561115, 3.0843172, 2.8961644, 0.5942155, 3.1673732, 2.867742, 0.28561115, 3.0843172, 2.8961644, 0.5942155, 3.1673732, 2.867742, 0.5942155, 3.1673732, 2.867742, 0.5942155, 3.1673732, 2.867742, 0.5942155, 3.1673732, 2.867742, 0.8201138, 3.3942275, 2.8469372, 0.5942155, 3.1673732, 2.867742, 0.8201138, 3.3942275, 2.8469372, 0.8201138, 3.3942275, 2.8469372, 0.8201138, 3.3942275, 2.8469372, 0.8201138, 3.3942275, 2.8469372, 0.90281975, 3.7041378, 2.8393202, 0.8201138, 3.3942275, 2.8469372, 0.90281975, 3.7041378, 2.8393202, 0.90281975, 3.7041378, 2.8393202, 0.90281975, 3.7041378, 2.8393202, 0.90281975, 3.7041378, 2.8393202, 0.8201138, 4.014048, 2.8469372, 0.90281975, 3.7041378, 2.8393202, 0.8201138, 4.014048, 2.8469372, 0.8201138, 4.014048, 2.8469372, 0.8201138, 4.014048, 2.8469372, 0.8201138, 4.014048, 2.8469372, 0.5942155, 4.2409024, 2.867742, 0.8201138, 4.014048, 2.8469372, 0.5942155, 4.2409024, 2.867742, 0.5942155, 4.2409024, 2.867742, 0.5942155, 4.2409024, 2.867742, 0.5942155, 4.2409024, 2.867742, 0.28561115, 4.3239584, 2.8961644, 0.5942155, 4.2409024, 2.867742, 0.28561115, 4.3239584, 2.8961644, 0.28561115, 4.3239584, 2.8961644, 0.28561115, 4.3239584, 2.8961644, 0.28561115, 4.3239584, 2.8961644, -0.035803795, 4.210655, 2.666542, 0.28561115, 4.3239584, 2.8961644, -0.035803795, 4.210655, 2.666542, -0.035803795, 4.210655, 2.666542, -0.035803795, 4.210655, 2.666542, -0.24889135, 4.014048, 2.9453917, -0.24889135, 4.014048, 2.9453917, -0.035803795, 4.210655, 2.666542, -0.035803795, 4.210655, 2.666542, -0.24889135, 4.014048, 2.9453917, -0.24889135, 4.014048, 2.9453917, -0.33159733, 3.7041378, 2.9530087, -0.33159733, 3.7041378, 2.9530087, -0.24889135, 4.014048, 2.9453917, -0.24889135, 4.014048, 2.9453917, -0.33159733, 3.7041378, 2.9530087, -0.5298786, 3.1673732, -2.5791035, -0.75938535, 3.4076157, -2.5096202, -0.81789684, 3.3737113, -2.5042315, -0.81789684, 3.3737113, -2.5042315, -0.75938535, 3.4076157, -2.5096202, -0.7709601, 3.7041378, -2.5569, -0.5298786, 3.1673732, -2.5791035, -0.49611712, 3.2260702, -2.582213, -0.75938535, 3.4076157, -2.5096202, -0.81789684, 3.3737113, -2.5042315, -0.7709601, 3.7041378, -2.5569, -0.83848286, 3.7041378, -2.5506816, -0.22127414, 3.0843172, -2.6075258, -0.49611712, 3.2260702, -2.582213, -0.5298786, 3.1673732, -2.5791035, -0.83848286, 3.7041378, -2.5506816, -0.7709601, 3.7041378, -2.5569, -0.69732714, 3.980144, -2.5636816, -0.22127414, 3.0843172, -2.6075258, -0.22127414, 3.1521254, -2.6075258, -0.49611712, 3.2260702, -2.582213, -0.83848286, 3.7041378, -2.5506816, -0.69732714, 3.980144, -2.5636816, -0.7557769, 4.014048, -2.5582986, 0.016053915, 3.1457415, -2.6231756, -0.22127414, 3.1521254, -2.6075258, -0.22127414, 3.0843172, -2.6075258, -0.7557769, 4.014048, -2.5582986, -0.69732714, 3.980144, -2.5636816, -0.49611712, 4.1822057, -2.582213, 0.016053915, 3.1457415, -2.6231756, -0.017707348, 3.2044384, -2.6200662, -0.22127414, 3.1521254, -2.6075258, -0.7557769, 4.014048, -2.5582986, -0.49611712, 4.1822057, -2.582213, -0.5298786, 4.2409024, -2.5791035, 0.31322837, 3.3942275, -2.656753, -0.017707348, 3.2044384, -2.6200662, 0.016053915, 3.1457415, -2.6231756, -0.5298786, 4.2409024, -2.5791035, -0.49611712, 4.1822057, -2.582213, -0.22127414, 4.2561502, -2.6075258, 0.31322837, 3.3942275, -2.656753, 0.25477862, 3.4281316, -2.65137, -0.017707348, 3.2044384, -2.6200662, -0.5298786, 4.2409024, -2.5791035, -0.22127414, 4.2561502, -2.6075258, -0.22127414, 4.3239584, -2.6075258, 0.39626074, 3.6751301, -2.6608262, 0.25477862, 3.4281316, -2.65137, 0.31322837, 3.3942275, -2.656753, -0.22127414, 4.3239584, -2.6075258, -0.22127414, 4.2561502, -2.6075258, 0.05356884, 4.1822057, -2.6328387, 0.39626074, 3.6751301, -2.6608262, 0.32873797, 3.6751301, -2.6546073, 0.25477862, 3.4281316, -2.65137, -0.22127414, 4.3239584, -2.6075258, 0.05356884, 4.1822057, -2.6328387, 0.0873301, 4.2409024, -2.6359482, 0.31322837, 4.014048, -2.656753, 0.32873797, 3.6751301, -2.6546073, 0.39626074, 3.6751301, -2.6608262, 0.0873301, 4.2409024, -2.6359482, 0.05356884, 4.1822057, -2.6328387, 0.25477862, 3.980144, -2.65137, 0.31322837, 4.014048, -2.656753, 0.25477862, 3.980144, -2.65137, 0.32873797, 3.6751301, -2.6546073, 0.0873301, 4.2409024, -2.6359482, 0.25477862, 3.980144, -2.65137, 0.31322837, 4.014048, -2.656753, -0.24889135, 3.3942275, 2.9453917, 0.010768175, 3.2260702, 2.9214773, -0.022993088, 3.1673732, 2.9245868, -0.022993088, 3.1673732, 2.9245868, 0.010768175, 3.2260702, 2.9214773, 0.28561115, 3.1521254, 2.8961644, -0.24889135, 3.3942275, 2.9453917, -0.19044161, 3.4281316, 2.9400086, 0.010768175, 3.2260702, 2.9214773, -0.022993088, 3.1673732, 2.9245868, 0.28561115, 3.1521254, 2.8961644, 0.28561115, 3.0843172, 2.8961644, -0.33159733, 3.7041378, 2.9530087, -0.19044161, 3.4281316, 2.9400086, -0.24889135, 3.3942275, 2.9453917, 0.28561115, 3.0843172, 2.8961644, 0.28561115, 3.1521254, 2.8961644, 0.56045413, 3.2260702, 2.8708515, -0.33159733, 3.7041378, 2.9530087, -0.2640748, 3.7041378, 2.9467902, -0.19044161, 3.4281316, 2.9400086, 0.28561115, 3.0843172, 2.8961644, 0.56045413, 3.2260702, 2.8708515, 0.5942155, 3.1673732, 2.867742, -0.24889135, 4.014048, 2.9453917, -0.2640748, 3.7041378, 2.9467902, -0.33159733, 3.7041378, 2.9530087, 0.5942155, 3.1673732, 2.867742, 0.56045413, 3.2260702, 2.8708515, 0.76166415, 3.4281316, 2.8523202, -0.24889135, 4.014048, 2.9453917, -0.19044161, 3.980144, 2.9400086, -0.2640748, 3.7041378, 2.9467902, 0.5942155, 3.1673732, 2.867742, 0.76166415, 3.4281316, 2.8523202, 0.8201138, 3.3942275, 2.8469372, -0.035803795, 4.210655, 2.666542, -0.19044161, 3.980144, 2.9400086, -0.24889135, 4.014048, 2.9453917, 0.8201138, 3.3942275, 2.8469372, 0.76166415, 3.4281316, 2.8523202, 0.8352971, 3.7041378, 2.8455386, -0.035803795, 4.210655, 2.666542, -0.002042532, 4.1519585, 2.6634326, -0.19044161, 3.980144, 2.9400086, 0.8201138, 3.3942275, 2.8469372, 0.8352971, 3.7041378, 2.8455386, 0.90281975, 3.7041378, 2.8393202, 0.28561115, 4.3239584, 2.8961644, -0.002042532, 4.1519585, 2.6634326, -0.035803795, 4.210655, 2.666542, 0.90281975, 3.7041378, 2.8393202, 0.8352971, 3.7041378, 2.8455386, 0.76166415, 3.980144, 2.8523202, 0.28561115, 4.3239584, 2.8961644, 0.28561115, 4.2561502, 2.8961644, -0.002042532, 4.1519585, 2.6634326, 0.90281975, 3.7041378, 2.8393202, 0.76166415, 3.980144, 2.8523202, 0.8201138, 4.014048, 2.8469372, 0.5942155, 4.2409024, 2.867742, 0.28561115, 4.2561502, 2.8961644, 0.28561115, 4.3239584, 2.8961644, 0.8201138, 4.014048, 2.8469372, 0.76166415, 3.980144, 2.8523202, 0.56045413, 4.1822057, 2.8708515, 0.5942155, 4.2409024, 2.867742, 0.56045413, 4.1822057, 2.8708515, 0.28561115, 4.2561502, 2.8961644, 0.8201138, 4.014048, 2.8469372, 0.56045413, 4.1822057, 2.8708515, 0.5942155, 4.2409024, 2.867742, -0.49611712, 3.2260702, -2.582213, -0.75557137, 3.4076157, -2.4682097, -0.75938535, 3.4076157, -2.5096202, -0.49611712, 3.2260702, -2.582213, -0.49230337, 3.2260702, -2.5408025, -0.75557137, 3.4076157, -2.4682097, -0.22127414, 3.1521254, -2.6075258, -0.49230337, 3.2260702, -2.5408025, -0.49611712, 3.2260702, -2.582213, -0.22127414, 3.1521254, -2.6075258, -0.2174604, 3.1521254, -2.5661154, -0.49230337, 3.2260702, -2.5408025, -0.017707348, 3.2044384, -2.6200662, -0.2174604, 3.1521254, -2.5661154, -0.22127414, 3.1521254, -2.6075258, -0.017707348, 3.2044384, -2.6200662, -0.01391077, 3.2044384, -2.5788422, -0.2174604, 3.1521254, -2.5661154, 0.25477862, 3.4281316, -2.65137, -0.01391077, 3.2044384, -2.5788422, -0.017707348, 3.2044384, -2.6200662, 0.25477862, 3.4281316, -2.65137, 0.2585926, 3.4281316, -2.6099591, -0.01391077, 3.2044384, -2.5788422, 0.32873797, 3.6751301, -2.6546073, 0.2585926, 3.4281316, -2.6099591, 0.25477862, 3.4281316, -2.65137, 0.32873797, 3.6751301, -2.6546073, 0.33255196, 3.6751301, -2.6131968, 0.2585926, 3.4281316, -2.6099591, 0.25477862, 3.980144, -2.65137, 0.33255196, 3.6751301, -2.6131968, 0.32873797, 3.6751301, -2.6546073, 0.25477862, 3.980144, -2.65137, 0.2585926, 3.980144, -2.6099591, 0.33255196, 3.6751301, -2.6131968, 0.05356884, 4.1822057, -2.6328387, 0.2585926, 3.980144, -2.6099591, 0.25477862, 3.980144, -2.65137, 0.05356884, 4.1822057, -2.6328387, 0.057382584, 4.1822057, -2.5914283, 0.2585926, 3.980144, -2.6099591, -0.22127414, 4.2561502, -2.6075258, 0.057382584, 4.1822057, -2.5914283, 0.05356884, 4.1822057, -2.6328387, -0.22127414, 4.2561502, -2.6075258, -0.2174604, 4.2561502, -2.5661154, 0.057382584, 4.1822057, -2.5914283, -0.49611712, 4.1822057, -2.582213, -0.2174604, 4.2561502, -2.5661154, -0.22127414, 4.2561502, -2.6075258, -0.49611712, 4.1822057, -2.582213, -0.49230337, 4.1822057, -2.5408025, -0.2174604, 4.2561502, -2.5661154, -0.69732714, 3.980144, -2.5636816, -0.49230337, 4.1822057, -2.5408025, -0.49611712, 4.1822057, -2.582213, -0.69732714, 3.980144, -2.5636816, -0.6935134, 3.980144, -2.5222712, -0.49230337, 4.1822057, -2.5408025, -0.7709601, 3.7041378, -2.5569, -0.6935134, 3.980144, -2.5222712, -0.69732714, 3.980144, -2.5636816, -0.7709601, 3.7041378, -2.5569, -0.7671461, 3.7041378, -2.5154896, -0.6935134, 3.980144, -2.5222712, -0.75938535, 3.4076157, -2.5096202, -0.7671461, 3.7041378, -2.5154896, -0.7709601, 3.7041378, -2.5569, -0.75938535, 3.4076157, -2.5096202, -0.75557137, 3.4076157, -2.4682097, -0.7671461, 3.7041378, -2.5154896, -0.19044161, 3.4281316, 2.9400086, 0.0069544315, 3.2260702, 2.8800664, 0.010768175, 3.2260702, 2.9214773, -0.19044161, 3.4281316, 2.9400086, -0.19425559, 3.4281316, 2.8985977, 0.0069544315, 3.2260702, 2.8800664, 0.010768175, 3.2260702, 2.9214773, 0.2817974, 3.1521254, 2.8547535, 0.28561115, 3.1521254, 2.8961644, 0.010768175, 3.2260702, 2.9214773, 0.0069544315, 3.2260702, 2.8800664, 0.2817974, 3.1521254, 2.8547535, 0.28561115, 3.1521254, 2.8961644, 0.55664027, 3.2260702, 2.8294406, 0.56045413, 3.2260702, 2.8708515, 0.28561115, 3.1521254, 2.8961644, 0.2817974, 3.1521254, 2.8547535, 0.55664027, 3.2260702, 2.8294406, 0.56045413, 3.2260702, 2.8708515, 0.75785017, 3.4281316, 2.8109093, 0.76166415, 3.4281316, 2.8523202, 0.56045413, 3.2260702, 2.8708515, 0.55664027, 3.2260702, 2.8294406, 0.75785017, 3.4281316, 2.8109093, 0.76166415, 3.4281316, 2.8523202, 0.8314831, 3.7041378, 2.8041277, 0.8352971, 3.7041378, 2.8455386, 0.76166415, 3.4281316, 2.8523202, 0.75785017, 3.4281316, 2.8109093, 0.8314831, 3.7041378, 2.8041277, 0.8352971, 3.7041378, 2.8455386, 0.8314831, 3.7041378, 2.8041277, 0.75785017, 3.980144, 2.8109093, 0.8352971, 3.7041378, 2.8455386, 0.75785017, 3.980144, 2.8109093, 0.76166415, 3.980144, 2.8523202, 0.76166415, 3.980144, 2.8523202, 0.55664027, 4.1822057, 2.8294406, 0.56045413, 4.1822057, 2.8708515, 0.76166415, 3.980144, 2.8523202, 0.75785017, 3.980144, 2.8109093, 0.55664027, 4.1822057, 2.8294406, 0.56045413, 4.1822057, 2.8708515, 0.2817974, 4.2561502, 2.8547535, 0.28561115, 4.2561502, 2.8961644, 0.56045413, 4.1822057, 2.8708515, 0.55664027, 4.1822057, 2.8294406, 0.2817974, 4.2561502, 2.8547535, 0.28561115, 4.2561502, 2.8961644, -0.0058562756, 4.1519585, 2.6220222, -0.002042532, 4.1519585, 2.6634326, 0.28561115, 4.2561502, 2.8961644, 0.2817974, 4.2561502, 2.8547535, -0.0058562756, 4.1519585, 2.6220222, -0.002042532, 4.1519585, 2.6634326, -0.19425559, 3.980144, 2.8985977, -0.19044161, 3.980144, 2.9400086, -0.002042532, 4.1519585, 2.6634326, -0.0058562756, 4.1519585, 2.6220222, -0.19425559, 3.980144, 2.8985977, -0.19044161, 3.980144, 2.9400086, -0.26788855, 3.7041378, 2.9053793, -0.2640748, 3.7041378, 2.9467902, -0.19044161, 3.980144, 2.9400086, -0.19425559, 3.980144, 2.8985977, -0.26788855, 3.7041378, 2.9053793, -0.2640748, 3.7041378, 2.9467902, -0.26788855, 3.7041378, 2.9053793, -0.19425559, 3.4281316, 2.8985977, -0.2640748, 3.7041378, 2.9467902, -0.19425559, 3.4281316, 2.8985977, -0.19044161, 3.4281316, 2.9400086, -5.555945, -21.30843, 0.44781768, -3.54707, -21.129436, 0.3570392, -5.555945, -21.129436, 0.44781768, -5.555945, -21.30843, 0.44781768, -3.54707, -21.30843, 0.3570392, -3.54707, -21.129436, 0.3570392, -7.629112, -21.129436, 0.3570392, -5.555945, -21.30843, 0.44781768, -5.555945, -21.129436, 0.44781768, -7.629112, -21.129436, 0.3570392, -7.629112, -21.30843, 0.3570392, -5.555945, -21.30843, 0.44781768, -5.555945, -21.30843, 0.9271282, -3.54707, -21.30843, 0.3570392, -5.555945, -21.30843, 0.44781768, -5.555945, -21.30843, 0.9271282, -3.54707, -21.30843, 0.7632997, -3.54707, -21.30843, 0.3570392, -5.555945, -21.30843, 0.44781768, -7.629112, -21.30843, 0.91196275, -5.555945, -21.30843, 0.9271282, -5.555945, -21.30843, 0.44781768, -7.629112, -21.30843, 0.62980187, -7.629112, -21.30843, 0.91196275, -7.629112, -21.30843, 0.62980187, -5.555945, -21.30843, 0.44781768, -7.629112, -21.30843, 0.3570392, -3.54707, -21.30843, 0.7632997, -3.54707, -21.129436, 0.3570392, -3.54707, -21.30843, 0.3570392, -3.54707, -21.30843, 0.7632997, -3.54707, -21.129435, 0.7632997, -3.54707, -21.129436, 0.3570392, -7.629112, -21.129436, 0.5971217, -7.5507226, -21.183048, 0.6447537, -7.629112, -21.30843, 0.62980187, -5.555945, -21.129435, 0.80730057, -5.555945, -21.174292, 0.9271282, -6.0741305, -21.129435, 0.92328346, -5.555945, -21.129435, 0.80730057, -5.0537796, -21.129435, 0.8861177, -5.555945, -21.174292, 0.9271282, -5.555945, -21.129435, 0.80730057, -3.54707, -21.129435, 0.7632997, -5.0537796, -21.129435, 0.8861177, -5.555945, -21.129435, 0.80730057, -3.54707, -21.129436, 0.3570392, -3.54707, -21.129435, 0.7632997, -3.54707, -21.129436, 0.3570392, -5.555945, -21.129435, 0.80730057, -5.555945, -21.129436, 0.44781768, -6.0741305, -21.129435, 0.92328346, -5.555945, -21.129436, 0.44781768, -5.555945, -21.129435, 0.80730057, -5.555945, -21.129436, 0.44781768, -7.629112, -21.129436, 0.5971217, -7.629112, -21.129436, 0.3570392, -5.555945, -21.129436, 0.44781768, -7.2726197, -21.129435, 0.6462488, -7.629112, -21.129436, 0.5971217, -6.0741305, -21.129435, 0.92328346, -7.2726197, -21.129435, 0.6462488, -5.555945, -21.129436, 0.44781768, -7.5507226, -21.183048, 0.6447537, -7.629112, -21.129436, 0.5971217, -7.2726197, -21.129435, 0.6462488, -7.629112, -21.129435, 0.7325418, -7.5507226, -21.183048, 0.6447537, -7.2726197, -21.129435, 0.6462488, -7.2726197, -21.129435, 0.6462488, -6.0741305, -21.129435, 0.92328346, -7.629112, -21.129435, 0.7325418, -7.629112, -21.129435, 0.7325418, -6.0741305, -21.129435, 0.92328346, -7.629112, -21.129435, 0.91196275, -7.629112, -21.30843, 0.3570392, -7.629112, -21.129436, 0.5971217, -7.629112, -21.30843, 0.62980187, -7.629112, -21.30843, 0.3570392, -7.629112, -21.129436, 0.3570392, -7.629112, -21.129436, 0.5971217, -7.629112, -21.129435, 0.7325418, -7.629112, -21.30843, 0.91196275, -7.629112, -21.30843, 0.62980187, -7.629112, -21.129435, 0.7325418, -7.629112, -21.129435, 0.91196275, -7.629112, -21.30843, 0.91196275, -7.5507226, -21.183048, 0.6447537, -7.629112, -21.129435, 0.7325418, -7.629112, -21.30843, 0.62980187, -7.629112, -21.129435, 0.91196275, -5.555945, -21.30843, 0.9271282, -7.629112, -21.30843, 0.91196275, -5.555945, -21.30843, 0.9271282, -7.629112, -21.129435, 0.91196275, -6.0741305, -21.129435, 0.92328346, -5.555945, -21.30843, 0.9271282, -6.0741305, -21.129435, 0.92328346, -5.555945, -21.174292, 0.9271282, -5.555945, -21.174292, 0.9271282, -3.54707, -21.30843, 0.7632997, -5.555945, -21.30843, 0.9271282, -5.555945, -21.174292, 0.9271282, -3.54707, -21.129435, 0.7632997, -3.54707, -21.30843, 0.7632997, -3.54707, -21.129435, 0.7632997, -5.555945, -21.174292, 0.9271282, -5.0537796, -21.129435, 0.8861177, -3.988361, -21.129435, 2.1034038, -3.54707, -21.30843, 2.1130157, -3.988361, -21.30843, 2.1034038, -3.988361, -21.129435, 2.1034038, -3.54707, -21.129435, 2.1130157, -3.54707, -21.30843, 2.1130157, -3.988361, -21.30843, 2.1034038, -6.7189775, -21.129435, 2.110666, -3.988361, -21.129435, 2.1034038, -3.988361, -21.30843, 2.1034038, -7.629112, -21.17429, 2.1130157, -6.7189775, -21.129435, 2.110666, -7.629112, -21.17429, 2.1130157, -3.988361, -21.30843, 2.1034038, -7.629112, -21.30843, 2.1130157, -3.54707, -21.129435, 1.6317828, -3.988361, -21.129435, 2.1034038, -3.988361, -21.129435, 1.6206758, -6.7189775, -21.129435, 2.110666, -3.988361, -21.129435, 1.6206758, -3.988361, -21.129435, 2.1034038, -6.7189775, -21.129435, 2.110666, -7.629112, -21.129435, 1.7067552, -3.988361, -21.129435, 1.6206758, -7.629112, -21.129435, 1.7067552, -6.7189775, -21.129435, 2.110666, -7.629112, -21.129435, 2.0113437, -7.629112, -21.129435, 2.0113437, -6.7189775, -21.129435, 2.110666, -7.629112, -21.17429, 2.1130157, -3.988361, -21.129435, 2.1034038, -3.54707, -21.129435, 1.6317828, -3.78224, -21.129435, 1.8853219, -3.78224, -21.129435, 1.8853219, -3.54707, -21.129435, 1.6317828, -3.54707, -21.129435, 1.8257284, -3.54707, -21.129435, 1.8257284, -3.5872264, -21.197786, 1.8791275, -3.78224, -21.129435, 1.8853219, -3.5872264, -21.197786, 1.8791275, -3.54707, -21.129435, 1.959867, -3.78224, -21.129435, 1.8853219, -3.988361, -21.129435, 2.1034038, -3.78224, -21.129435, 1.8853219, -3.54707, -21.129435, 1.959867, -3.988361, -21.129435, 2.1034038, -3.54707, -21.129435, 1.959867, -3.54707, -21.129435, 2.1130157, -3.988361, -21.30843, 1.6206758, -3.54707, -21.129435, 1.6317828, -3.988361, -21.129435, 1.6206758, -3.988361, -21.30843, 1.6206758, -3.54707, -21.30843, 1.6317829, -3.54707, -21.129435, 1.6317828, -7.629112, -21.129435, 1.7067552, -3.988361, -21.30843, 1.6206758, -3.988361, -21.129435, 1.6206758, -7.629112, -21.129435, 1.7067552, -7.629112, -21.30843, 1.7067553, -3.988361, -21.30843, 1.6206758, -3.54707, -21.30843, 2.1130157, -3.988361, -21.30843, 1.6206758, -3.988361, -21.30843, 2.1034038, -3.988361, -21.30843, 1.6206758, -3.54707, -21.30843, 2.1130157, -3.54707, -21.30843, 1.8528552, -3.988361, -21.30843, 1.6206758, -3.54707, -21.30843, 1.8528552, -3.54707, -21.30843, 1.6317829, -7.629112, -21.30843, 1.7067553, -3.988361, -21.30843, 2.1034038, -3.988361, -21.30843, 1.6206758, -7.629112, -21.30843, 1.7067553, -7.629112, -21.30843, 2.1130157, -3.988361, -21.30843, 2.1034038, -3.54707, -21.129435, 1.959867, -3.5872264, -21.197786, 1.8791275, -3.54707, -21.30843, 1.8528552, -3.5872264, -21.197786, 1.8791275, -3.54707, -21.129435, 1.8257284, -3.54707, -21.30843, 1.8528552, -3.54707, -21.30843, 2.1130157, -3.54707, -21.129435, 1.959867, -3.54707, -21.30843, 1.8528552, -3.54707, -21.30843, 2.1130157, -3.54707, -21.129435, 2.1130157, -3.54707, -21.129435, 1.959867, -3.54707, -21.129435, 1.8257284, -3.54707, -21.30843, 1.6317829, -3.54707, -21.30843, 1.8528552, -3.54707, -21.129435, 1.8257284, -3.54707, -21.129435, 1.6317828, -3.54707, -21.30843, 1.6317829, -7.629112, -21.129435, 1.7067552, -7.629112, -21.30843, 2.1130157, -7.629112, -21.30843, 1.7067553, -7.629112, -21.30843, 2.1130157, -7.629112, -21.129435, 1.7067552, -7.629112, -21.129435, 2.0113437, -7.629112, -21.30843, 2.1130157, -7.629112, -21.129435, 2.0113437, -7.629112, -21.17429, 2.1130157, -3.9170194, -21.320818, -0.44629717, -3.8958735, -21.335342, -0.95978284, -3.8958735, -21.34047, -0.43775296, -3.9170194, -21.320818, -0.44629717, -3.9170194, -21.31612, -0.95081186, -3.8958735, -21.335342, -0.95978284, -3.9170194, -21.31612, -0.95081186, -3.8958735, -21.210388, -0.979434, -3.8958735, -21.335342, -0.95978284, -3.9170194, -21.31612, -0.95081186, -3.9170194, -21.215515, -0.9587152, -3.8958735, -21.210388, -0.979434, -3.8958735, -21.34047, -0.43775296, -3.9170194, -21.35478, -0.9687538, -3.9170194, -21.36012, -0.4289956, -3.8958735, -21.34047, -0.43775296, -3.8958735, -21.335342, -0.95978284, -3.9170194, -21.35478, -0.9687538, -3.8958735, -21.335342, -0.95978284, -3.9170194, -21.205263, -1.0001528, -3.9170194, -21.35478, -0.9687538, -3.8958735, -21.335342, -0.95978284, -3.8958735, -21.210388, -0.979434, -3.9170194, -21.205263, -1.0001528, -3.9170194, -21.36012, -0.4289956, -3.9385924, -21.335342, -0.95978284, -3.9385924, -21.34047, -0.43775296, -3.9170194, -21.36012, -0.4289956, -3.9170194, -21.35478, -0.9687538, -3.9385924, -21.335342, -0.95978284, -3.9170194, -21.35478, -0.9687538, -3.9385924, -21.210388, -0.979434, -3.9385924, -21.335342, -0.95978284, -3.9170194, -21.35478, -0.9687538, -3.9170194, -21.205263, -1.0001528, -3.9385924, -21.210388, -0.979434, -3.9385924, -21.34047, -0.43775296, -3.9170194, -21.31612, -0.95081186, -3.9170194, -21.320818, -0.44629717, -3.9385924, -21.34047, -0.43775296, -3.9385924, -21.335342, -0.95978284, -3.9170194, -21.31612, -0.95081186, -3.9385924, -21.335342, -0.95978284, -3.9170194, -21.215515, -0.9587152, -3.9170194, -21.31612, -0.95081186, -3.9385924, -21.335342, -0.95978284, -3.9385924, -21.210388, -0.979434, -3.9170194, -21.215515, -0.9587152, -3.9170194, -21.215515, -0.9587152, -3.8958735, -21.105513, -0.94718075, -3.8958735, -21.210388, -0.979434, -3.9170194, -21.215515, -0.9587152, -3.9170194, -21.126446, -0.9426954, -3.8958735, -21.105513, -0.94718075, -3.9170194, -21.126446, -0.9426954, -3.8958735, -21.10359, -0.44181156, -3.8958735, -21.105513, -0.94718075, -3.9170194, -21.126446, -0.9426954, -3.9170194, -21.12431, -0.44693804, -3.8958735, -21.10359, -0.44181156, -3.9170194, -21.12431, -0.44693804, -3.8958735, -21.219788, -0.39460683, -3.8958735, -21.10359, -0.44181156, -3.9170194, -21.12431, -0.44693804, -3.9170194, -21.22406, -0.4155395, -3.8958735, -21.219788, -0.39460683, -3.8958735, -21.210388, -0.979434, -3.9170194, -21.084795, -0.95188, -3.9170194, -21.205263, -1.0001528, -3.8958735, -21.210388, -0.979434, -3.8958735, -21.105513, -0.94718075, -3.9170194, -21.084795, -0.95188, -3.8958735, -21.105513, -0.94718075, -3.9170194, -21.082659, -0.43668532, -3.9170194, -21.084795, -0.95188, -3.8958735, -21.105513, -0.94718075, -3.8958735, -21.10359, -0.44181156, -3.9170194, -21.082659, -0.43668532, -3.8958735, -21.10359, -0.44181156, -3.9170194, -21.215515, -0.3736744, -3.9170194, -21.082659, -0.43668532, -3.8958735, -21.10359, -0.44181156, -3.8958735, -21.219788, -0.39460683, -3.9170194, -21.215515, -0.3736744, -3.9170194, -21.205263, -1.0001528, -3.9385924, -21.105513, -0.94718075, -3.9385924, -21.210388, -0.979434, -3.9170194, -21.205263, -1.0001528, -3.9170194, -21.084795, -0.95188, -3.9385924, -21.105513, -0.94718075, -3.9385924, -21.210388, -0.979434, -3.9170194, -21.126446, -0.9426954, -3.9170194, -21.215515, -0.9587152, -3.9385924, -21.210388, -0.979434, -3.9385924, -21.105513, -0.94718075, -3.9170194, -21.126446, -0.9426954, -3.9385924, -21.105513, -0.94718075, -3.9170194, -21.12431, -0.44693804, -3.9170194, -21.126446, -0.9426954, -3.9385924, -21.105513, -0.94718075, -3.9385924, -21.10359, -0.44181156, -3.9170194, -21.12431, -0.44693804, -3.9385924, -21.10359, -0.44181156, -3.9170194, -21.22406, -0.4155395, -3.9170194, -21.12431, -0.44693804, -3.9385924, -21.10359, -0.44181156, -3.9385924, -21.219788, -0.39460683, -3.9170194, -21.22406, -0.4155395, -3.9170194, -21.084795, -0.95188, -3.9385924, -21.10359, -0.44181156, -3.9385924, -21.105513, -0.94718075, -3.9170194, -21.084795, -0.95188, -3.9170194, -21.082659, -0.43668532, -3.9385924, -21.10359, -0.44181156, -3.9170194, -21.082659, -0.43668532, -3.9385924, -21.219788, -0.39460683, -3.9385924, -21.10359, -0.44181156, -3.9170194, -21.082659, -0.43668532, -3.9170194, -21.215515, -0.3736744, -3.9385924, -21.219788, -0.39460683, -3.9170194, -21.22406, -0.4155395, -3.8958735, -21.34047, -0.43775296, -3.8958735, -21.219788, -0.39460683, -3.9170194, -21.22406, -0.4155395, -3.9170194, -21.320818, -0.44629717, -3.8958735, -21.34047, -0.43775296, -3.8958735, -21.219788, -0.39460683, -3.9170194, -21.36012, -0.4289956, -3.9170194, -21.215515, -0.3736744, -3.8958735, -21.219788, -0.39460683, -3.8958735, -21.34047, -0.43775296, -3.9170194, -21.36012, -0.4289956, -3.9170194, -21.215515, -0.3736744, -3.9385924, -21.34047, -0.43775296, -3.9385924, -21.219788, -0.39460683, -3.9170194, -21.215515, -0.3736744, -3.9170194, -21.36012, -0.4289956, -3.9385924, -21.34047, -0.43775296, -3.9385924, -21.219788, -0.39460683, -3.9170194, -21.320818, -0.44629717, -3.9170194, -21.22406, -0.4155395, -3.9385924, -21.219788, -0.39460683, -3.9385924, -21.34047, -0.43775296, -3.9170194, -21.320818, -0.44629717, -7.464643, -21.40476, 5.450674, -7.3512235, -21.359264, 5.450674, -7.3512235, -21.40476, 5.450674, -7.464643, -21.40476, 5.450674, -7.464643, -21.359264, 5.450674, -7.3512235, -21.359264, 5.450674, -7.464643, -21.359264, 5.450674, -7.3512235, -21.359266, -1.0281336, -7.3512235, -21.359264, 5.450674, -7.464643, -21.359264, 5.450674, -7.464643, -21.359266, -1.0281336, -7.3512235, -21.359266, -1.0281336, -7.464643, -21.359266, -1.0281336, -7.3512235, -21.404762, -1.0281336, -7.3512235, -21.359266, -1.0281336, -7.464643, -21.359266, -1.0281336, -7.464643, -21.404762, -1.0281336, -7.3512235, -21.404762, -1.0281336, -7.464643, -21.404762, -1.0281336, -7.3512235, -21.40476, 5.450674, -7.3512235, -21.404762, -1.0281336, -7.464643, -21.404762, -1.0281336, -7.464643, -21.40476, 5.450674, -7.3512235, -21.40476, 5.450674, -7.3512235, -21.40476, 5.450674, -7.3512235, -21.359266, -1.0281336, -7.3512235, -21.404762, -1.0281336, -7.3512235, -21.40476, 5.450674, -7.3512235, -21.359264, 5.450674, -7.3512235, -21.359266, -1.0281336, -7.464643, -21.404762, -1.0281336, -7.464643, -21.359264, 5.450674, -7.464643, -21.40476, 5.450674, -7.464643, -21.404762, -1.0281336, -7.464643, -21.359266, -1.0281336, -7.464643, -21.359264, 5.450674, -6.9564967, -21.30843, -0.21347666, -3.4046016, -21.129436, -0.29165316, -6.9564967, -21.129436, -0.2134769, -6.9564967, -21.30843, -0.21347666, -3.4046016, -21.30843, -0.29165292, -3.4046016, -21.129436, -0.29165316, -7.7713675, -21.129436, -0.21689463, -6.9564967, -21.30843, -0.21347666, -6.9564967, -21.129436, -0.2134769, -7.7713675, -21.129436, -0.21689463, -7.7713675, -21.30843, -0.21689439, -6.9564967, -21.30843, -0.21347666, -6.9564967, -21.30843, 0.28014445, -3.4046016, -21.30843, -0.29165292, -6.9564967, -21.30843, -0.21347666, -6.9564967, -21.30843, 0.28014445, -3.4046016, -21.30843, 0.1893661, -3.4046016, -21.30843, -0.29165292, -7.7713675, -21.30843, -0.21689439, -6.9564967, -21.30843, 0.28014445, -6.9564967, -21.30843, -0.21347666, -7.7713675, -21.30843, -0.21689439, -7.7713675, -21.30843, 0.1893661, -6.9564967, -21.30843, 0.28014445, -7.7713675, -21.30843, -0.21689439, -7.7713675, -21.129436, 0.18936586, -7.7713675, -21.30843, 0.1893661, -7.7713675, -21.30843, -0.21689439, -7.7713675, -21.129436, -0.21689463, -7.7713675, -21.129436, 0.18936586, -6.9564967, -21.129436, 0.15668559, -6.9564967, -21.174292, 0.28014445, -7.1602683, -21.129436, 0.25750327, -6.9564967, -21.129436, 0.15668559, -6.0685763, -21.129436, 0.25750327, -6.9564967, -21.174292, 0.28014445, -6.9564967, -21.129436, 0.15668559, -4.0705953, -21.129436, 0.20624006, -6.0685763, -21.129436, 0.25750327, -7.1602683, -21.129436, 0.25750327, -6.9564967, -21.129436, -0.2134769, -6.9564967, -21.129436, 0.15668559, -7.1602683, -21.129436, 0.25750327, -7.7713675, -21.129436, -0.21689463, -6.9564967, -21.129436, -0.2134769, -7.7713675, -21.129436, -0.21689463, -7.1602683, -21.129436, 0.25750327, -7.7713675, -21.129436, 0.18936586, -3.4046016, -21.129436, -0.29165316, -6.9564967, -21.129436, 0.15668559, -6.9564967, -21.129436, -0.2134769, -6.9564967, -21.129436, 0.15668559, -3.4046016, -21.129436, -0.29165316, -4.0705953, -21.129436, 0.20624006, -4.0705953, -21.129436, 0.20624006, -3.4046016, -21.129436, -0.29165316, -3.4046016, -21.129436, 0.06911111, -4.0705953, -21.129436, 0.20624006, -3.4046016, -21.129436, 0.06911111, -3.4046016, -21.174292, 0.18936586, -7.7713675, -21.129436, 0.18936586, -6.9564967, -21.30843, 0.28014445, -7.7713675, -21.30843, 0.1893661, -6.9564967, -21.30843, 0.28014445, -7.7713675, -21.129436, 0.18936586, -7.1602683, -21.129436, 0.25750327, -6.9564967, -21.30843, 0.28014445, -7.1602683, -21.129436, 0.25750327, -6.9564967, -21.174292, 0.28014445, -6.9564967, -21.174292, 0.28014445, -3.4046016, -21.30843, 0.1893661, -6.9564967, -21.30843, 0.28014445, -6.9564967, -21.174292, 0.28014445, -4.0705953, -21.129436, 0.20624006, -3.4046016, -21.30843, 0.1893661, -3.4046016, -21.30843, 0.1893661, -4.0705953, -21.129436, 0.20624006, -3.4046016, -21.174292, 0.18936586, -4.0705953, -21.129436, 0.20624006, -6.9564967, -21.174292, 0.28014445, -6.0685763, -21.129436, 0.25750327, -3.4046016, -21.174292, 0.18936586, -3.4046016, -21.30843, -0.29165292, -3.4046016, -21.30843, 0.1893661, -3.4046016, -21.30843, -0.29165292, -3.4046016, -21.174292, 0.18936586, -3.4046016, -21.129436, 0.06911111, -3.4046016, -21.30843, -0.29165292, -3.4046016, -21.129436, 0.06911111, -3.4046016, -21.129436, -0.29165316, -7.7320657, -21.3975, -1.0330465, -7.351437, -19.082968, -0.9484632, -7.4360213, -21.3975, -1.0330465, -7.7320657, -21.3975, -1.0330465, -7.81665, -19.082968, -0.9484632, -7.351437, -19.082968, -0.9484632, -7.81665, -19.082968, -0.9484632, -7.351437, -19.082968, -1.4134626, -7.351437, -19.082968, -0.9484632, -7.81665, -19.082968, -0.9484632, -7.81665, -19.082968, -1.4134626, -7.351437, -19.082968, -1.4134626, -7.81665, -19.082968, -1.4134626, -7.4360213, -21.3975, -1.3288774, -7.351437, -19.082968, -1.4134626, -7.81665, -19.082968, -1.4134626, -7.7320657, -21.3975, -1.3288774, -7.4360213, -21.3975, -1.3288774, -7.7320657, -21.3975, -1.3288774, -7.4360213, -21.3975, -1.0330465, -7.4360213, -21.3975, -1.3288774, -7.7320657, -21.3975, -1.3288774, -7.7320657, -21.3975, -1.0330465, -7.4360213, -21.3975, -1.0330465, -7.4360213, -21.3975, -1.0330465, -7.351437, -19.082968, -1.4134626, -7.4360213, -21.3975, -1.3288774, -7.4360213, -21.3975, -1.0330465, -7.351437, -19.082968, -0.9484632, -7.351437, -19.082968, -1.4134626, -7.7320657, -21.3975, -1.3288774, -7.81665, -19.082968, -0.9484632, -7.7320657, -21.3975, -1.0330465, -7.7320657, -21.3975, -1.3288774, -7.81665, -19.082968, -1.4134626, -7.81665, -19.082968, -0.9484632, -3.988361, -21.129436, -0.4571905, -3.54707, -21.30843, -0.4477923, -3.988361, -21.30843, -0.45719028, -3.988361, -21.129436, -0.4571905, -3.54707, -21.129436, -0.44779253, -3.54707, -21.30843, -0.4477923, -3.988361, -21.30843, -0.45719028, -6.7189775, -21.129436, -0.4501419, -3.988361, -21.129436, -0.4571905, -3.988361, -21.30843, -0.45719028, -7.629112, -21.174292, -0.44779253, -6.7189775, -21.129436, -0.4501419, -7.629112, -21.174292, -0.44779253, -3.988361, -21.30843, -0.45719028, -7.629112, -21.30843, -0.4477923, -3.54707, -21.129436, -0.92881155, -3.988361, -21.129436, -0.4571905, -3.988361, -21.129436, -0.9401324, -6.7189775, -21.129436, -0.4501419, -3.988361, -21.129436, -0.9401324, -3.988361, -21.129436, -0.4571905, -6.7189775, -21.129436, -0.4501419, -7.629112, -21.129436, -0.8540528, -3.988361, -21.129436, -0.9401324, -7.629112, -21.129436, -0.8540528, -6.7189775, -21.129436, -0.4501419, -7.629112, -21.129436, -0.5492506, -7.629112, -21.129436, -0.5492506, -6.7189775, -21.129436, -0.4501419, -7.629112, -21.174292, -0.44779253, -3.988361, -21.129436, -0.4571905, -3.54707, -21.129436, -0.92881155, -3.78224, -21.129436, -0.6754861, -3.78224, -21.129436, -0.6754861, -3.54707, -21.129436, -0.92881155, -3.54707, -21.129436, -0.7350795, -3.54707, -21.129436, -0.7350795, -3.5872264, -21.197786, -0.68168044, -3.78224, -21.129436, -0.6754861, -3.5872264, -21.197786, -0.68168044, -3.54707, -21.129436, -0.6009412, -3.78224, -21.129436, -0.6754861, -3.988361, -21.129436, -0.4571905, -3.78224, -21.129436, -0.6754861, -3.54707, -21.129436, -0.6009412, -3.988361, -21.129436, -0.4571905, -3.54707, -21.129436, -0.6009412, -3.54707, -21.129436, -0.44779253, -3.988361, -21.30843, -0.94013214, -3.54707, -21.129436, -0.92881155, -3.988361, -21.129436, -0.9401324, -3.988361, -21.30843, -0.94013214, -3.54707, -21.30843, -0.9288113, -3.54707, -21.129436, -0.92881155, -7.629112, -21.129436, -0.8540528, -3.988361, -21.30843, -0.94013214, -3.988361, -21.129436, -0.9401324, -7.629112, -21.129436, -0.8540528, -7.629112, -21.30843, -0.85405254, -3.988361, -21.30843, -0.94013214, -3.54707, -21.30843, -0.4477923, -3.988361, -21.30843, -0.94013214, -3.988361, -21.30843, -0.45719028, -3.988361, -21.30843, -0.94013214, -3.54707, -21.30843, -0.4477923, -3.54707, -21.30843, -0.7079525, -3.988361, -21.30843, -0.94013214, -3.54707, -21.30843, -0.7079525, -3.54707, -21.30843, -0.9288113, -7.629112, -21.30843, -0.85405254, -3.988361, -21.30843, -0.45719028, -3.988361, -21.30843, -0.94013214, -7.629112, -21.30843, -0.85405254, -7.629112, -21.30843, -0.4477923, -3.988361, -21.30843, -0.45719028, -3.54707, -21.129436, -0.6009412, -3.5872264, -21.197786, -0.68168044, -3.54707, -21.30843, -0.7079525, -3.5872264, -21.197786, -0.68168044, -3.54707, -21.129436, -0.7350795, -3.54707, -21.30843, -0.7079525, -3.54707, -21.30843, -0.4477923, -3.54707, -21.129436, -0.6009412, -3.54707, -21.30843, -0.7079525, -3.54707, -21.30843, -0.4477923, -3.54707, -21.129436, -0.44779253, -3.54707, -21.129436, -0.6009412, -3.54707, -21.129436, -0.7350795, -3.54707, -21.30843, -0.9288113, -3.54707, -21.30843, -0.7079525, -3.54707, -21.129436, -0.7350795, -3.54707, -21.129436, -0.92881155, -3.54707, -21.30843, -0.9288113, -7.629112, -21.129436, -0.8540528, -7.629112, -21.30843, -0.4477923, -7.629112, -21.30843, -0.85405254, -7.629112, -21.30843, -0.4477923, -7.629112, -21.129436, -0.8540528, -7.629112, -21.129436, -0.5492506, -7.629112, -21.30843, -0.4477923, -7.629112, -21.129436, -0.5492506, -7.629112, -21.174292, -0.44779253, -3.8766494, -21.129435, 2.6811824, -3.4046016, -21.308428, 2.6905806, -3.8766494, -21.308428, 2.6811824, -3.8766494, -21.129435, 2.6811824, -3.4046016, -21.129435, 2.6905804, -3.4046016, -21.308428, 2.6905806, -3.8766494, -21.308428, 2.6811824, -6.797795, -21.129435, 2.688231, -3.8766494, -21.129435, 2.6811824, -3.8766494, -21.308428, 2.6811824, -7.7713675, -21.17429, 2.6905804, -6.797795, -21.129435, 2.688231, -7.7713675, -21.17429, 2.6905804, -3.8766494, -21.308428, 2.6811824, -7.7713675, -21.308428, 2.6905806, -3.4046016, -21.129435, 2.2095613, -3.8766494, -21.129435, 2.6811824, -3.8766494, -21.129435, 2.1984541, -6.797795, -21.129435, 2.688231, -3.8766494, -21.129435, 2.1984541, -3.8766494, -21.129435, 2.6811824, -6.797795, -21.129435, 2.688231, -7.7713675, -21.129435, 2.28432, -3.8766494, -21.129435, 2.1984541, -7.7713675, -21.129435, 2.28432, -6.797795, -21.129435, 2.688231, -7.7713675, -21.129435, 2.5891223, -7.7713675, -21.129435, 2.5891223, -6.797795, -21.129435, 2.688231, -7.7713675, -21.17429, 2.6905804, -3.8766494, -21.129435, 2.6811824, -3.4046016, -21.129435, 2.2095613, -3.656218, -21.129435, 2.4631002, -3.656218, -21.129435, 2.4631002, -3.4046016, -21.129435, 2.2095613, -3.4046016, -21.129435, 2.4032931, -3.4046016, -21.129435, 2.4032931, -3.4477482, -21.197786, 2.4566922, -3.656218, -21.129435, 2.4631002, -3.4477482, -21.197786, 2.4566922, -3.4046016, -21.129435, 2.5376453, -3.656218, -21.129435, 2.4631002, -3.8766494, -21.129435, 2.6811824, -3.656218, -21.129435, 2.4631002, -3.4046016, -21.129435, 2.5376453, -3.8766494, -21.129435, 2.6811824, -3.4046016, -21.129435, 2.5376453, -3.4046016, -21.129435, 2.6905804, -3.8766494, -21.30843, 2.1984544, -3.4046016, -21.129435, 2.2095613, -3.8766494, -21.129435, 2.1984541, -3.8766494, -21.30843, 2.1984544, -3.4046016, -21.30843, 2.2095613, -3.4046016, -21.129435, 2.2095613, -7.7713675, -21.129435, 2.28432, -3.8766494, -21.30843, 2.1984544, -3.8766494, -21.129435, 2.1984541, -7.7713675, -21.129435, 2.28432, -7.7713675, -21.30843, 2.28432, -3.8766494, -21.30843, 2.1984544, -3.4046016, -21.308428, 2.6905806, -3.8766494, -21.30843, 2.1984544, -3.8766494, -21.308428, 2.6811824, -3.8766494, -21.30843, 2.1984544, -3.4046016, -21.308428, 2.6905806, -3.4046016, -21.308428, 2.4306335, -3.8766494, -21.30843, 2.1984544, -3.4046016, -21.308428, 2.4306335, -3.4046016, -21.30843, 2.2095613, -7.7713675, -21.30843, 2.28432, -3.8766494, -21.308428, 2.6811824, -3.8766494, -21.30843, 2.1984544, -7.7713675, -21.30843, 2.28432, -7.7713675, -21.308428, 2.6905806, -3.8766494, -21.308428, 2.6811824, -3.4046016, -21.129435, 2.5376453, -3.4477482, -21.197786, 2.4566922, -3.4046016, -21.308428, 2.4306335, -3.4477482, -21.197786, 2.4566922, -3.4046016, -21.129435, 2.4032931, -3.4046016, -21.308428, 2.4306335, -3.4046016, -21.308428, 2.6905806, -3.4046016, -21.129435, 2.5376453, -3.4046016, -21.308428, 2.4306335, -3.4046016, -21.308428, 2.6905806, -3.4046016, -21.129435, 2.6905804, -3.4046016, -21.129435, 2.5376453, -3.4046016, -21.129435, 2.4032931, -3.4046016, -21.30843, 2.2095613, -3.4046016, -21.308428, 2.4306335, -3.4046016, -21.129435, 2.4032931, -3.4046016, -21.129435, 2.2095613, -3.4046016, -21.30843, 2.2095613, -7.7713675, -21.129435, 2.28432, -7.7713675, -21.308428, 2.6905806, -7.7713675, -21.30843, 2.28432, -7.7713675, -21.308428, 2.6905806, -7.7713675, -21.129435, 2.28432, -7.7713675, -21.129435, 2.5891223, -7.7713675, -21.308428, 2.6905806, -7.7713675, -21.129435, 2.5891223, -7.7713675, -21.17429, 2.6905804, -5.5538087, -21.308428, 2.944333, -3.4046016, -21.129435, 2.853768, -5.5538087, -21.129435, 2.944333, -5.5538087, -21.308428, 2.944333, -3.4046016, -21.308428, 2.8537683, -3.4046016, -21.129435, 2.853768, -7.7713675, -21.129435, 2.853768, -5.5538087, -21.308428, 2.944333, -5.5538087, -21.129435, 2.944333, -7.7713675, -21.129435, 2.853768, -7.7713675, -21.308428, 2.8537683, -5.5538087, -21.308428, 2.944333, -5.5538087, -21.308428, 3.4236436, -3.4046016, -21.308428, 2.8537683, -5.5538087, -21.308428, 2.944333, -5.5538087, -21.308428, 3.4236436, -3.4046016, -21.308428, 3.2600288, -3.4046016, -21.308428, 2.8537683, -5.5538087, -21.308428, 2.944333, -7.7713675, -21.308428, 3.4084783, -5.5538087, -21.308428, 3.4236436, -5.5538087, -21.308428, 2.944333, -7.7713675, -21.308428, 3.126531, -7.7713675, -21.308428, 3.4084783, -7.7713675, -21.308428, 3.126531, -5.5538087, -21.308428, 2.944333, -7.7713675, -21.308428, 2.8537683, -3.4046016, -21.308428, 3.2600288, -3.4046016, -21.129435, 2.853768, -3.4046016, -21.308428, 2.8537683, -3.4046016, -21.308428, 3.2600288, -3.4046016, -21.129435, 3.2600288, -3.4046016, -21.129435, 2.853768, -7.7713675, -21.129435, 3.0938506, -7.687638, -21.183048, 3.1414826, -7.7713675, -21.308428, 3.126531, -5.5538087, -21.129435, 3.3038158, -5.5538087, -21.17429, 3.4236436, -6.108092, -21.129435, 3.4197989, -5.5538087, -21.129435, 3.3038158, -5.0164003, -21.129435, 3.3828466, -5.5538087, -21.17429, 3.4236436, -5.5538087, -21.129435, 3.3038158, -3.4046016, -21.129435, 3.2600288, -5.0164003, -21.129435, 3.3828466, -5.5538087, -21.129435, 3.3038158, -3.4046016, -21.129435, 2.853768, -3.4046016, -21.129435, 3.2600288, -3.4046016, -21.129435, 2.853768, -5.5538087, -21.129435, 3.3038158, -5.5538087, -21.129435, 2.944333, -6.108092, -21.129435, 3.4197989, -5.5538087, -21.129435, 2.944333, -5.5538087, -21.129435, 3.3038158, -5.5538087, -21.129435, 2.944333, -7.7713675, -21.129435, 3.0938506, -7.7713675, -21.129435, 2.853768, -5.5538087, -21.129435, 2.944333, -7.3903117, -21.129435, 3.142764, -7.7713675, -21.129435, 3.0938506, -6.108092, -21.129435, 3.4197989, -7.3903117, -21.129435, 3.142764, -5.5538087, -21.129435, 2.944333, -7.687638, -21.183048, 3.1414826, -7.7713675, -21.129435, 3.0938506, -7.3903117, -21.129435, 3.142764, -7.7713675, -21.129435, 3.2290573, -7.687638, -21.183048, 3.1414826, -7.3903117, -21.129435, 3.142764, -7.3903117, -21.129435, 3.142764, -6.108092, -21.129435, 3.4197989, -7.7713675, -21.129435, 3.2290573, -7.7713675, -21.129435, 3.2290573, -6.108092, -21.129435, 3.4197989, -7.7713675, -21.129435, 3.4084783, -7.7713675, -21.308428, 2.8537683, -7.7713675, -21.129435, 3.0938506, -7.7713675, -21.308428, 3.126531, -7.7713675, -21.308428, 2.8537683, -7.7713675, -21.129435, 2.853768, -7.7713675, -21.129435, 3.0938506, -7.7713675, -21.129435, 3.2290573, -7.7713675, -21.308428, 3.4084783, -7.7713675, -21.308428, 3.126531, -7.7713675, -21.129435, 3.2290573, -7.7713675, -21.129435, 3.4084783, -7.7713675, -21.308428, 3.4084783, -7.687638, -21.183048, 3.1414826, -7.7713675, -21.129435, 3.2290573, -7.7713675, -21.308428, 3.126531, -7.7713675, -21.129435, 3.4084783, -5.5538087, -21.308428, 3.4236436, -7.7713675, -21.308428, 3.4084783, -5.5538087, -21.308428, 3.4236436, -7.7713675, -21.129435, 3.4084783, -6.108092, -21.129435, 3.4197989, -5.5538087, -21.308428, 3.4236436, -6.108092, -21.129435, 3.4197989, -5.5538087, -21.17429, 3.4236436, -5.5538087, -21.17429, 3.4236436, -3.4046016, -21.308428, 3.2600288, -5.5538087, -21.308428, 3.4236436, -5.5538087, -21.17429, 3.4236436, -3.4046016, -21.129435, 3.2600288, -3.4046016, -21.308428, 3.2600288, -3.4046016, -21.129435, 3.2600288, -5.5538087, -21.17429, 3.4236436, -5.0164003, -21.129435, 3.3828466, -3.988361, -21.129435, 4.050549, -3.54707, -21.308428, 4.0599475, -3.988361, -21.308428, 4.050549, -3.988361, -21.129435, 4.050549, -3.54707, -21.129435, 4.0599475, -3.54707, -21.308428, 4.0599475, -3.988361, -21.308428, 4.050549, -6.7189775, -21.129435, 4.057598, -3.988361, -21.129435, 4.050549, -3.988361, -21.308428, 4.050549, -7.629112, -21.17429, 4.0599475, -6.7189775, -21.129435, 4.057598, -7.629112, -21.17429, 4.0599475, -3.988361, -21.308428, 4.050549, -7.629112, -21.308428, 4.0599475, -3.54707, -21.129435, 3.5789282, -3.988361, -21.129435, 4.050549, -3.988361, -21.129435, 3.567821, -6.7189775, -21.129435, 4.057598, -3.988361, -21.129435, 3.567821, -3.988361, -21.129435, 4.050549, -6.7189775, -21.129435, 4.057598, -7.629112, -21.129435, 3.653687, -3.988361, -21.129435, 3.567821, -7.629112, -21.129435, 3.653687, -6.7189775, -21.129435, 4.057598, -7.629112, -21.129435, 3.958489, -7.629112, -21.129435, 3.958489, -6.7189775, -21.129435, 4.057598, -7.629112, -21.17429, 4.0599475, -3.988361, -21.129435, 4.050549, -3.54707, -21.129435, 3.5789282, -3.78224, -21.129435, 3.8322535, -3.78224, -21.129435, 3.8322535, -3.54707, -21.129435, 3.5789282, -3.54707, -21.129435, 3.7726603, -3.54707, -21.129435, 3.7726603, -3.5872264, -21.197784, 3.8260593, -3.78224, -21.129435, 3.8322535, -3.5872264, -21.197784, 3.8260593, -3.54707, -21.129435, 3.9070125, -3.78224, -21.129435, 3.8322535, -3.988361, -21.129435, 4.050549, -3.78224, -21.129435, 3.8322535, -3.54707, -21.129435, 3.9070125, -3.988361, -21.129435, 4.050549, -3.54707, -21.129435, 3.9070125, -3.54707, -21.129435, 4.0599475, -3.988361, -21.308428, 3.567821, -3.54707, -21.129435, 3.5789282, -3.988361, -21.129435, 3.567821, -3.988361, -21.308428, 3.567821, -3.54707, -21.308428, 3.5789282, -3.54707, -21.129435, 3.5789282, -7.629112, -21.129435, 3.653687, -3.988361, -21.308428, 3.567821, -3.988361, -21.129435, 3.567821, -7.629112, -21.129435, 3.653687, -7.629112, -21.308428, 3.653687, -3.988361, -21.308428, 3.567821, -3.54707, -21.308428, 4.0599475, -3.988361, -21.308428, 3.567821, -3.988361, -21.308428, 4.050549, -3.988361, -21.308428, 3.567821, -3.54707, -21.308428, 4.0599475, -3.54707, -21.308428, 3.799787, -3.988361, -21.308428, 3.567821, -3.54707, -21.308428, 3.799787, -3.54707, -21.308428, 3.5789282, -7.629112, -21.308428, 3.653687, -3.988361, -21.308428, 4.050549, -3.988361, -21.308428, 3.567821, -7.629112, -21.308428, 3.653687, -7.629112, -21.308428, 4.0599475, -3.988361, -21.308428, 4.050549, -3.54707, -21.129435, 3.9070125, -3.5872264, -21.197784, 3.8260593, -3.54707, -21.308428, 3.799787, -3.5872264, -21.197784, 3.8260593, -3.54707, -21.129435, 3.7726603, -3.54707, -21.308428, 3.799787, -3.54707, -21.308428, 4.0599475, -3.54707, -21.129435, 3.9070125, -3.54707, -21.308428, 3.799787, -3.54707, -21.308428, 4.0599475, -3.54707, -21.129435, 4.0599475, -3.54707, -21.129435, 3.9070125, -3.54707, -21.129435, 3.7726603, -3.54707, -21.308428, 3.5789282, -3.54707, -21.308428, 3.799787, -3.54707, -21.129435, 3.7726603, -3.54707, -21.129435, 3.5789282, -3.54707, -21.308428, 3.5789282, -7.629112, -21.129435, 3.653687, -7.629112, -21.308428, 4.0599475, -7.629112, -21.308428, 3.653687, -7.629112, -21.308428, 4.0599475, -7.629112, -21.129435, 3.653687, -7.629112, -21.129435, 3.958489, -7.629112, -21.308428, 4.0599475, -7.629112, -21.129435, 3.958489, -7.629112, -21.17429, 4.0599475, -3.950554, -21.3975, -1.0022886, -3.6320815, -19.082968, -1.0409505, -3.5934205, -21.3975, -1.0022886, -3.950554, -21.3975, -1.0022886, -3.911893, -19.082968, -1.0409505, -3.6320815, -19.082968, -1.0409505, -3.911893, -19.082968, -1.0409505, -3.6320815, -19.082968, -1.3209753, -3.6320815, -19.082968, -1.0409505, -3.911893, -19.082968, -1.0409505, -3.911893, -19.082968, -1.3209753, -3.6320815, -19.082968, -1.3209753, -3.911893, -19.082968, -1.3209753, -3.5934205, -21.3975, -1.3596354, -3.6320815, -19.082968, -1.3209753, -3.911893, -19.082968, -1.3209753, -3.950554, -21.3975, -1.3596354, -3.5934205, -21.3975, -1.3596354, -3.950554, -21.3975, -1.3596354, -3.5934205, -21.3975, -1.0022886, -3.5934205, -21.3975, -1.3596354, -3.950554, -21.3975, -1.3596354, -3.950554, -21.3975, -1.0022886, -3.5934205, -21.3975, -1.0022886, -3.5934205, -21.3975, -1.0022886, -3.6320815, -19.082968, -1.3209753, -3.5934205, -21.3975, -1.3596354, -3.5934205, -21.3975, -1.0022886, -3.6320815, -19.082968, -1.0409505, -3.6320815, -19.082968, -1.3209753, -3.950554, -21.3975, -1.3596354, -3.911893, -19.082968, -1.0409505, -3.950554, -21.3975, -1.0022886, -3.950554, -21.3975, -1.3596354, -3.911893, -19.082968, -1.3209753, -3.911893, -19.082968, -1.0409505, -7.8010573, -21.397497, 5.803108, -7.4439244, -19.082966, 5.8031073, -7.4439244, -21.397497, 5.803108, -7.8010573, -21.397497, 5.803108, -7.8010573, -19.082966, 5.8031073, -7.4439244, -19.082966, 5.8031073, -7.8010573, -21.397497, 5.4459753, -7.4439244, -21.397497, 5.803108, -7.4439244, -21.397497, 5.4459753, -7.8010573, -21.397497, 5.4459753, -7.8010573, -21.397497, 5.803108, -7.4439244, -21.397497, 5.803108, -7.4439244, -21.397497, 5.803108, -7.4439244, -19.082966, 5.4459743, -7.4439244, -21.397497, 5.4459753, -7.4439244, -21.397497, 5.803108, -7.4439244, -19.082966, 5.8031073, -7.4439244, -19.082966, 5.4459743, -7.8010573, -19.661598, 5.4459743, -7.7117743, -19.082966, 5.4459743, -7.8010573, -19.082966, 5.5352573, -7.8010573, -21.397497, 5.803108, -7.8010573, -19.661598, 5.4459743, -7.8010573, -19.082966, 5.5352573, -7.8010573, -19.661598, 5.4459743, -7.8010573, -21.397497, 5.803108, -7.8010573, -21.397497, 5.4459753, -7.8010573, -21.397497, 5.803108, -7.8010573, -19.082966, 5.5352573, -7.8010573, -19.082966, 5.8031073, -7.8010573, -19.082966, 5.5352573, -7.4439244, -19.082966, 5.8031073, -7.8010573, -19.082966, 5.8031073, -7.4439244, -19.082966, 5.8031073, -7.8010573, -19.082966, 5.5352573, -7.7117743, -19.082966, 5.4459743, -7.4439244, -19.082966, 5.8031073, -7.7117743, -19.082966, 5.4459743, -7.4439244, -19.082966, 5.4459743, -7.8010573, -21.397497, 5.4459753, -7.7117743, -19.082966, 5.4459743, -7.8010573, -19.661598, 5.4459743, -7.7117743, -19.082966, 5.4459743, -7.8010573, -21.397497, 5.4459753, -7.4439244, -21.397497, 5.4459753, -7.7117743, -19.082966, 5.4459743, -7.4439244, -21.397497, 5.4459753, -7.4439244, -19.082966, 5.4459743, -5.555945, -21.308428, 4.955558, -3.54707, -21.129435, 4.8647785, -5.555945, -21.129435, 4.9555573, -5.555945, -21.308428, 4.955558, -3.54707, -21.308428, 4.864779, -3.54707, -21.129435, 4.8647785, -7.629112, -21.129435, 4.8647785, -5.555945, -21.308428, 4.955558, -5.555945, -21.129435, 4.9555573, -7.629112, -21.129435, 4.8647785, -7.629112, -21.308428, 4.864779, -5.555945, -21.308428, 4.955558, -5.555945, -21.308428, 5.434868, -3.54707, -21.308428, 4.864779, -5.555945, -21.308428, 4.955558, -5.555945, -21.308428, 5.434868, -3.54707, -21.308428, 5.2710395, -3.54707, -21.308428, 4.864779, -5.555945, -21.308428, 4.955558, -7.629112, -21.308428, 5.4197025, -5.555945, -21.308428, 5.434868, -5.555945, -21.308428, 4.955558, -7.629112, -21.308428, 5.137542, -7.629112, -21.308428, 5.4197025, -7.629112, -21.308428, 5.137542, -5.555945, -21.308428, 4.955558, -7.629112, -21.308428, 4.864779, -3.54707, -21.308428, 5.2710395, -3.54707, -21.129435, 4.8647785, -3.54707, -21.308428, 4.864779, -3.54707, -21.308428, 5.2710395, -3.54707, -21.129435, 5.271039, -3.54707, -21.129435, 4.8647785, -7.629112, -21.129435, 5.1048613, -7.5507226, -21.183046, 5.1524935, -7.629112, -21.308428, 5.137542, -5.555945, -21.129435, 5.31504, -5.555945, -21.17429, 5.434868, -6.0741305, -21.129435, 5.431023, -5.555945, -21.129435, 5.31504, -5.0537796, -21.129435, 5.3940706, -5.555945, -21.17429, 5.434868, -5.555945, -21.129435, 5.31504, -3.54707, -21.129435, 5.271039, -5.0537796, -21.129435, 5.3940706, -5.555945, -21.129435, 5.31504, -3.54707, -21.129435, 4.8647785, -3.54707, -21.129435, 5.271039, -3.54707, -21.129435, 4.8647785, -5.555945, -21.129435, 5.31504, -5.555945, -21.129435, 4.9555573, -6.0741305, -21.129435, 5.431023, -5.555945, -21.129435, 4.9555573, -5.555945, -21.129435, 5.31504, -5.555945, -21.129435, 4.9555573, -7.629112, -21.129435, 5.1048613, -7.629112, -21.129435, 4.8647785, -5.555945, -21.129435, 4.9555573, -7.2726197, -21.129435, 5.1539884, -7.629112, -21.129435, 5.1048613, -6.0741305, -21.129435, 5.431023, -7.2726197, -21.129435, 5.1539884, -5.555945, -21.129435, 4.9555573, -7.5507226, -21.183046, 5.1524935, -7.629112, -21.129435, 5.1048613, -7.2726197, -21.129435, 5.1539884, -7.629112, -21.129435, 5.240281, -7.5507226, -21.183046, 5.1524935, -7.2726197, -21.129435, 5.1539884, -7.2726197, -21.129435, 5.1539884, -6.0741305, -21.129435, 5.431023, -7.629112, -21.129435, 5.240281, -7.629112, -21.129435, 5.240281, -6.0741305, -21.129435, 5.431023, -7.629112, -21.129435, 5.4197025, -7.629112, -21.308428, 4.864779, -7.629112, -21.129435, 5.1048613, -7.629112, -21.308428, 5.137542, -7.629112, -21.308428, 4.864779, -7.629112, -21.129435, 4.8647785, -7.629112, -21.129435, 5.1048613, -7.629112, -21.129435, 5.240281, -7.629112, -21.308428, 5.4197025, -7.629112, -21.308428, 5.137542, -7.629112, -21.129435, 5.240281, -7.629112, -21.129435, 5.4197025, -7.629112, -21.308428, 5.4197025, -7.5507226, -21.183046, 5.1524935, -7.629112, -21.129435, 5.240281, -7.629112, -21.308428, 5.137542, -7.629112, -21.129435, 5.4197025, -5.555945, -21.308428, 5.434868, -7.629112, -21.308428, 5.4197025, -5.555945, -21.308428, 5.434868, -7.629112, -21.129435, 5.4197025, -6.0741305, -21.129435, 5.431023, -5.555945, -21.308428, 5.434868, -6.0741305, -21.129435, 5.431023, -5.555945, -21.17429, 5.434868, -5.555945, -21.17429, 5.434868, -3.54707, -21.308428, 5.2710395, -5.555945, -21.308428, 5.434868, -5.555945, -21.17429, 5.434868, -3.54707, -21.129435, 5.271039, -3.54707, -21.308428, 5.2710395, -3.54707, -21.129435, 5.271039, -5.555945, -21.17429, 5.434868, -5.0537796, -21.129435, 5.3940706, -6.926807, -21.30843, 1.0420431, -3.4520202, -21.129435, 0.96386683, -6.926807, -21.129435, 1.0420431, -6.926807, -21.30843, 1.0420431, -3.4520202, -21.30843, 0.96386683, -3.4520202, -21.129435, 0.96386683, -7.723949, -21.129435, 1.0386255, -6.926807, -21.30843, 1.0420431, -6.926807, -21.129435, 1.0420431, -7.723949, -21.129435, 1.0386255, -7.723949, -21.30843, 1.0386255, -6.926807, -21.30843, 1.0420431, -6.926807, -21.30843, 1.5358781, -3.4520202, -21.30843, 0.96386683, -6.926807, -21.30843, 1.0420431, -6.926807, -21.30843, 1.5358781, -3.4520202, -21.30843, 1.444886, -3.4520202, -21.30843, 0.96386683, -7.723949, -21.30843, 1.0386255, -6.926807, -21.30843, 1.5358781, -6.926807, -21.30843, 1.0420431, -7.723949, -21.30843, 1.0386255, -7.723949, -21.30843, 1.444886, -6.926807, -21.30843, 1.5358781, -7.723949, -21.30843, 1.0386255, -7.723949, -21.129435, 1.444886, -7.723949, -21.30843, 1.444886, -7.723949, -21.30843, 1.0386255, -7.723949, -21.129435, 1.0386255, -7.723949, -21.129435, 1.444886, -6.926807, -21.129435, 1.4124193, -6.926807, -21.17429, 1.5358781, -7.1260924, -21.129435, 1.5130231, -6.926807, -21.129435, 1.4124193, -6.0581107, -21.129435, 1.5130231, -6.926807, -21.17429, 1.5358781, -6.926807, -21.129435, 1.4124193, -4.1037025, -21.129435, 1.4619737, -6.0581107, -21.129435, 1.5130231, -7.1260924, -21.129435, 1.5130231, -6.926807, -21.129435, 1.0420431, -6.926807, -21.129435, 1.4124193, -7.1260924, -21.129435, 1.5130231, -7.723949, -21.129435, 1.0386255, -6.926807, -21.129435, 1.0420431, -7.723949, -21.129435, 1.0386255, -7.1260924, -21.129435, 1.5130231, -7.723949, -21.129435, 1.444886, -3.4520202, -21.129435, 0.96386683, -6.926807, -21.129435, 1.4124193, -6.926807, -21.129435, 1.0420431, -6.926807, -21.129435, 1.4124193, -3.4520202, -21.129435, 0.96386683, -4.1037025, -21.129435, 1.4619737, -4.1037025, -21.129435, 1.4619737, -3.4520202, -21.129435, 0.96386683, -3.4520202, -21.129435, 1.3246312, -4.1037025, -21.129435, 1.4619737, -3.4520202, -21.129435, 1.3246312, -3.4520202, -21.17429, 1.444886, -7.723949, -21.129435, 1.444886, -6.926807, -21.30843, 1.5358781, -7.723949, -21.30843, 1.444886, -6.926807, -21.30843, 1.5358781, -7.723949, -21.129435, 1.444886, -7.1260924, -21.129435, 1.5130231, -6.926807, -21.30843, 1.5358781, -7.1260924, -21.129435, 1.5130231, -6.926807, -21.17429, 1.5358781, -6.926807, -21.17429, 1.5358781, -3.4520202, -21.30843, 1.444886, -6.926807, -21.30843, 1.5358781, -6.926807, -21.17429, 1.5358781, -4.1037025, -21.129435, 1.4619737, -3.4520202, -21.30843, 1.444886, -3.4520202, -21.30843, 1.444886, -4.1037025, -21.129435, 1.4619737, -3.4520202, -21.17429, 1.444886, -4.1037025, -21.129435, 1.4619737, -6.926807, -21.17429, 1.5358781, -6.0581107, -21.129435, 1.5130231, -3.4520202, -21.17429, 1.444886, -3.4520202, -21.30843, 0.96386683, -3.4520202, -21.30843, 1.444886, -3.4520202, -21.30843, 0.96386683, -3.4520202, -21.17429, 1.444886, -3.4520202, -21.129435, 1.3246312, -3.4520202, -21.30843, 0.96386683, -3.4520202, -21.129435, 1.3246312, -3.4520202, -21.129435, 0.96386683, -6.9564967, -21.308428, 4.294263, -3.4046016, -21.129435, 4.2160864, -6.9564967, -21.129435, 4.294263, -6.9564967, -21.308428, 4.294263, -3.4046016, -21.308428, 4.2160864, -3.4046016, -21.129435, 4.2160864, -7.7713675, -21.129435, 4.290845, -6.9564967, -21.308428, 4.294263, -6.9564967, -21.129435, 4.294263, -7.7713675, -21.129435, 4.290845, -7.7713675, -21.308428, 4.2908454, -6.9564967, -21.308428, 4.294263, -6.9564967, -21.308428, 4.787884, -3.4046016, -21.308428, 4.2160864, -6.9564967, -21.308428, 4.294263, -6.9564967, -21.308428, 4.787884, -3.4046016, -21.308428, 4.6971054, -3.4046016, -21.308428, 4.2160864, -7.7713675, -21.308428, 4.2908454, -6.9564967, -21.308428, 4.787884, -6.9564967, -21.308428, 4.294263, -7.7713675, -21.308428, 4.2908454, -7.7713675, -21.308428, 4.6971054, -6.9564967, -21.308428, 4.787884, -7.7713675, -21.308428, 4.2908454, -7.7713675, -21.129435, 4.6971054, -7.7713675, -21.308428, 4.6971054, -7.7713675, -21.308428, 4.2908454, -7.7713675, -21.129435, 4.290845, -7.7713675, -21.129435, 4.6971054, -6.9564967, -21.129435, 4.6646385, -6.9564967, -21.17429, 4.7878838, -7.1602683, -21.129435, 4.7652426, -6.9564967, -21.129435, 4.6646385, -6.0685763, -21.129435, 4.7652426, -6.9564967, -21.17429, 4.7878838, -6.9564967, -21.129435, 4.6646385, -4.0705953, -21.129435, 4.7141933, -6.0685763, -21.129435, 4.7652426, -7.1602683, -21.129435, 4.7652426, -6.9564967, -21.129435, 4.294263, -6.9564967, -21.129435, 4.6646385, -7.1602683, -21.129435, 4.7652426, -7.7713675, -21.129435, 4.290845, -6.9564967, -21.129435, 4.294263, -7.7713675, -21.129435, 4.290845, -7.1602683, -21.129435, 4.7652426, -7.7713675, -21.129435, 4.6971054, -3.4046016, -21.129435, 4.2160864, -6.9564967, -21.129435, 4.6646385, -6.9564967, -21.129435, 4.294263, -6.9564967, -21.129435, 4.6646385, -3.4046016, -21.129435, 4.2160864, -4.0705953, -21.129435, 4.7141933, -4.0705953, -21.129435, 4.7141933, -3.4046016, -21.129435, 4.2160864, -3.4046016, -21.129435, 4.576851, -4.0705953, -21.129435, 4.7141933, -3.4046016, -21.129435, 4.576851, -3.4046016, -21.17429, 4.6971054, -7.7713675, -21.129435, 4.6971054, -6.9564967, -21.308428, 4.787884, -7.7713675, -21.308428, 4.6971054, -6.9564967, -21.308428, 4.787884, -7.7713675, -21.129435, 4.6971054, -7.1602683, -21.129435, 4.7652426, -6.9564967, -21.308428, 4.787884, -7.1602683, -21.129435, 4.7652426, -6.9564967, -21.17429, 4.7878838, -6.9564967, -21.17429, 4.7878838, -3.4046016, -21.308428, 4.6971054, -6.9564967, -21.308428, 4.787884, -6.9564967, -21.17429, 4.7878838, -4.0705953, -21.129435, 4.7141933, -3.4046016, -21.308428, 4.6971054, -3.4046016, -21.308428, 4.6971054, -4.0705953, -21.129435, 4.7141933, -3.4046016, -21.17429, 4.6971054, -4.0705953, -21.129435, 4.7141933, -6.9564967, -21.17429, 4.7878838, -6.0685763, -21.129435, 4.7652426, -3.4046016, -21.17429, 4.6971054, -3.4046016, -21.308428, 4.2160864, -3.4046016, -21.308428, 4.6971054, -3.4046016, -21.308428, 4.2160864, -3.4046016, -21.17429, 4.6971054, -3.4046016, -21.129435, 4.576851, -3.4046016, -21.308428, 4.2160864, -3.4046016, -21.129435, 4.576851, -3.4046016, -21.129435, 4.2160864, -3.8851933, -21.397497, 5.744369, -3.5280604, -19.082966, 5.744368, -3.5280604, -21.397497, 5.744369, -3.8851933, -21.397497, 5.744369, -3.8851933, -19.351458, 5.7443686, -3.5280604, -19.082966, 5.744368, -3.8851933, -19.351458, 5.7443686, -3.5280604, -19.082966, 5.387021, -3.5280604, -19.082966, 5.744368, -3.8851933, -19.351458, 5.7443686, -3.8851933, -19.082966, 5.387021, -3.5280604, -19.082966, 5.387021, -3.8851933, -19.082966, 5.387021, -3.5280604, -21.397497, 5.387022, -3.5280604, -19.082966, 5.387021, -3.8851933, -19.082966, 5.387021, -3.8851933, -21.397497, 5.387022, -3.5280604, -21.397497, 5.387022, -3.8851933, -21.397497, 5.387022, -3.5280604, -21.397497, 5.744369, -3.5280604, -21.397497, 5.387022, -3.8851933, -21.397497, 5.387022, -3.8851933, -21.397497, 5.744369, -3.5280604, -21.397497, 5.744369, -3.5280604, -21.397497, 5.744369, -3.5280604, -19.082966, 5.387021, -3.5280604, -21.397497, 5.387022, -3.5280604, -21.397497, 5.744369, -3.5280604, -19.082966, 5.744368, -3.5280604, -19.082966, 5.387021, -3.8851933, -21.397497, 5.387022, -3.8851933, -19.351458, 5.7443686, -3.8851933, -21.397497, 5.744369, -3.8851933, -21.397497, 5.387022, -3.8851933, -19.082966, 5.387021, -3.8851933, -19.351458, 5.7443686, -3.8144932, -21.40476, 5.450674, -3.7010732, -21.359264, 5.450674, -3.7010732, -21.40476, 5.450674, -3.8144932, -21.40476, 5.450674, -3.8144932, -21.359264, 5.450674, -3.7010732, -21.359264, 5.450674, -3.8144932, -21.359264, 5.450674, -3.7010732, -21.359266, -1.0281336, -3.7010732, -21.359264, 5.450674, -3.8144932, -21.359264, 5.450674, -3.8144932, -21.359266, -1.0281336, -3.7010732, -21.359266, -1.0281336, -3.8144932, -21.359266, -1.0281336, -3.7010732, -21.404762, -1.0281336, -3.7010732, -21.359266, -1.0281336, -3.8144932, -21.359266, -1.0281336, -3.8144932, -21.404762, -1.0281336, -3.7010732, -21.404762, -1.0281336, -3.8144932, -21.404762, -1.0281336, -3.7010732, -21.40476, 5.450674, -3.7010732, -21.404762, -1.0281336, -3.8144932, -21.404762, -1.0281336, -3.8144932, -21.40476, 5.450674, -3.7010732, -21.40476, 5.450674, -3.7010732, -21.40476, 5.450674, -3.7010732, -21.359266, -1.0281336, -3.7010732, -21.404762, -1.0281336, -3.7010732, -21.40476, 5.450674, -3.7010732, -21.359264, 5.450674, -3.7010732, -21.359266, -1.0281336, -3.8144932, -21.404762, -1.0281336, -3.8144932, -21.359264, 5.450674, -3.8144932, -21.40476, 5.450674, -3.8144932, -21.404762, -1.0281336, -3.8144932, -21.359266, -1.0281336, -3.8144932, -21.359264, 5.450674, -7.4172244, -21.333633, 0.22268713, -7.393088, -21.35008, -0.25406027, -7.393088, -21.355635, 0.23059022, -7.4172244, -21.333633, 0.22268713, -7.4172244, -21.328295, -0.24551606, -7.393088, -21.35008, -0.25406027, -7.4172244, -21.328295, -0.24551606, -7.393088, -21.208893, -0.27221608, -7.393088, -21.35008, -0.25406027, -7.4172244, -21.328295, -0.24551606, -7.4172244, -21.21466, -0.25277877, -7.393088, -21.208893, -0.27221608, -7.393088, -21.355635, 0.23059022, -7.4172244, -21.371868, -0.26239038, -7.4172244, -21.377848, 0.2384932, -7.393088, -21.355635, 0.23059022, -7.393088, -21.35008, -0.25406027, -7.4172244, -21.371868, -0.26239038, -7.393088, -21.35008, -0.25406027, -7.4172244, -21.20334, -0.29122615, -7.4172244, -21.371868, -0.26239038, -7.393088, -21.35008, -0.25406027, -7.393088, -21.208893, -0.27221608, -7.4172244, -21.20334, -0.29122615, -7.4172244, -21.377848, 0.2384932, -7.441361, -21.35008, -0.25406027, -7.441361, -21.355635, 0.23059022, -7.4172244, -21.377848, 0.2384932, -7.4172244, -21.371868, -0.26239038, -7.441361, -21.35008, -0.25406027, -7.4172244, -21.371868, -0.26239038, -7.441361, -21.208893, -0.27221608, -7.441361, -21.35008, -0.25406027, -7.4172244, -21.371868, -0.26239038, -7.4172244, -21.20334, -0.29122615, -7.441361, -21.208893, -0.27221608, -7.441361, -21.355635, 0.23059022, -7.4172244, -21.328295, -0.24551606, -7.4172244, -21.333633, 0.22268713, -7.441361, -21.355635, 0.23059022, -7.441361, -21.35008, -0.25406027, -7.4172244, -21.328295, -0.24551606, -7.441361, -21.35008, -0.25406027, -7.4172244, -21.21466, -0.25277877, -7.4172244, -21.328295, -0.24551606, -7.441361, -21.35008, -0.25406027, -7.441361, -21.208893, -0.27221608, -7.4172244, -21.21466, -0.25277877, -7.4172244, -21.21466, -0.25277877, -7.393088, -21.090775, -0.24231243, -7.393088, -21.208893, -0.27221608, -7.4172244, -21.21466, -0.25277877, -7.4172244, -21.114271, -0.23804045, -7.393088, -21.090775, -0.24231243, -7.4172244, -21.114271, -0.23804045, -7.393088, -21.088425, 0.22674549, -7.393088, -21.090775, -0.24231243, -7.4172244, -21.114271, -0.23804045, -7.4172244, -21.111708, 0.22204626, -7.393088, -21.088425, 0.22674549, -7.4172244, -21.111708, 0.22204626, -7.393088, -21.219574, 0.2705326, -7.393088, -21.088425, 0.22674549, -7.4172244, -21.111708, 0.22204626, -7.4172244, -21.224485, 0.2510954, -7.393088, -21.219574, 0.2705326, -7.393088, -21.208893, -0.27221608, -7.4172244, -21.06728, -0.24658465, -7.4172244, -21.20334, -0.29122615, -7.393088, -21.208893, -0.27221608, -7.393088, -21.090775, -0.24231243, -7.4172244, -21.06728, -0.24658465, -7.393088, -21.090775, -0.24231243, -7.4172244, -21.06493, 0.23144436, -7.4172244, -21.06728, -0.24658465, -7.393088, -21.090775, -0.24231243, -7.393088, -21.088425, 0.22674549, -7.4172244, -21.06493, 0.23144436, -7.393088, -21.088425, 0.22674549, -7.4172244, -21.214874, 0.28996992, -7.4172244, -21.06493, 0.23144436, -7.393088, -21.088425, 0.22674549, -7.393088, -21.219574, 0.2705326, -7.4172244, -21.214874, 0.28996992, -7.4172244, -21.20334, -0.29122615, -7.441361, -21.090775, -0.24231243, -7.441361, -21.208893, -0.27221608, -7.4172244, -21.20334, -0.29122615, -7.4172244, -21.06728, -0.24658465, -7.441361, -21.090775, -0.24231243, -7.441361, -21.208893, -0.27221608, -7.4172244, -21.114271, -0.23804045, -7.4172244, -21.21466, -0.25277877, -7.441361, -21.208893, -0.27221608, -7.441361, -21.090775, -0.24231243, -7.4172244, -21.114271, -0.23804045, -7.441361, -21.090775, -0.24231243, -7.4172244, -21.111708, 0.22204626, -7.4172244, -21.114271, -0.23804045, -7.441361, -21.090775, -0.24231243, -7.441361, -21.088425, 0.22674549, -7.4172244, -21.111708, 0.22204626, -7.441361, -21.088425, 0.22674549, -7.4172244, -21.224485, 0.2510954, -7.4172244, -21.111708, 0.22204626, -7.441361, -21.088425, 0.22674549, -7.441361, -21.219574, 0.2705326, -7.4172244, -21.224485, 0.2510954, -7.4172244, -21.06728, -0.24658465, -7.441361, -21.088425, 0.22674549, -7.441361, -21.090775, -0.24231243, -7.4172244, -21.06728, -0.24658465, -7.4172244, -21.06493, 0.23144436, -7.441361, -21.088425, 0.22674549, -7.4172244, -21.06493, 0.23144436, -7.441361, -21.219574, 0.2705326, -7.441361, -21.088425, 0.22674549, -7.4172244, -21.06493, 0.23144436, -7.4172244, -21.214874, 0.28996992, -7.441361, -21.219574, 0.2705326, -7.4172244, -21.224485, 0.2510954, -7.393088, -21.355635, 0.23059022, -7.393088, -21.219574, 0.2705326, -7.4172244, -21.224485, 0.2510954, -7.4172244, -21.333633, 0.22268713, -7.393088, -21.355635, 0.23059022, -7.393088, -21.219574, 0.2705326, -7.4172244, -21.377848, 0.2384932, -7.4172244, -21.214874, 0.28996992, -7.393088, -21.219574, 0.2705326, -7.393088, -21.355635, 0.23059022, -7.4172244, -21.377848, 0.2384932, -7.4172244, -21.214874, 0.28996992, -7.441361, -21.355635, 0.23059022, -7.441361, -21.219574, 0.2705326, -7.4172244, -21.214874, 0.28996992, -7.4172244, -21.377848, 0.2384932, -7.441361, -21.355635, 0.23059022, -7.441361, -21.219574, 0.2705326, -7.4172244, -21.333633, 0.22268713, -7.4172244, -21.224485, 0.2510954, -7.441361, -21.219574, 0.2705326, -7.441361, -21.355635, 0.23059022, -7.4172244, -21.333633, 0.22268713, -3.8775039, -21.320818, 0.20923042, -3.8561444, -21.335342, -0.30446887, -3.8561444, -21.34047, 0.21777427, -3.8775039, -21.320818, 0.20923042, -3.8775039, -21.316118, -0.29528427, -3.8561444, -21.335342, -0.30446887, -3.8775039, -21.316118, -0.29528427, -3.8561444, -21.210388, -0.32390642, -3.8561444, -21.335342, -0.30446887, -3.8775039, -21.316118, -0.29528427, -3.8775039, -21.215515, -0.3031876, -3.8561444, -21.210388, -0.32390642, -3.8561444, -21.34047, 0.21777427, -3.8775039, -21.35478, -0.31322622, -3.8775039, -21.36012, 0.22631812, -3.8561444, -21.34047, 0.21777427, -3.8561444, -21.335342, -0.30446887, -3.8775039, -21.35478, -0.31322622, -3.8561444, -21.335342, -0.30446887, -3.8775039, -21.205263, -0.34462523, -3.8775039, -21.35478, -0.31322622, -3.8561444, -21.335342, -0.30446887, -3.8561444, -21.210388, -0.32390642, -3.8775039, -21.205263, -0.34462523, -3.8775039, -21.36012, 0.22631812, -3.8988638, -21.335342, -0.30446887, -3.8988638, -21.34047, 0.21777427, -3.8775039, -21.36012, 0.22631812, -3.8775039, -21.35478, -0.31322622, -3.8988638, -21.335342, -0.30446887, -3.8775039, -21.35478, -0.31322622, -3.8988638, -21.210388, -0.32390642, -3.8988638, -21.335342, -0.30446887, -3.8775039, -21.35478, -0.31322622, -3.8775039, -21.205263, -0.34462523, -3.8988638, -21.210388, -0.32390642, -3.8988638, -21.34047, 0.21777427, -3.8775039, -21.316118, -0.29528427, -3.8775039, -21.320818, 0.20923042, -3.8988638, -21.34047, 0.21777427, -3.8988638, -21.335342, -0.30446887, -3.8775039, -21.316118, -0.29528427, -3.8988638, -21.335342, -0.30446887, -3.8775039, -21.215515, -0.3031876, -3.8775039, -21.316118, -0.29528427, -3.8988638, -21.335342, -0.30446887, -3.8988638, -21.210388, -0.32390642, -3.8775039, -21.215515, -0.3031876, -3.8775039, -21.215515, -0.3031876, -3.8561444, -21.105513, -0.29165316, -3.8561444, -21.210388, -0.32390642, -3.8775039, -21.215515, -0.3031876, -3.8775039, -21.126446, -0.2871678, -3.8561444, -21.105513, -0.29165316, -3.8775039, -21.126446, -0.2871678, -3.8561444, -21.10359, 0.2135024, -3.8561444, -21.105513, -0.29165316, -3.8775039, -21.126446, -0.2871678, -3.8775039, -21.12431, 0.20858967, -3.8561444, -21.10359, 0.2135024, -3.8775039, -21.12431, 0.20858967, -3.8561444, -21.219788, 0.26070714, -3.8561444, -21.10359, 0.2135024, -3.8775039, -21.12431, 0.20858967, -3.8775039, -21.224058, 0.23977482, -3.8561444, -21.219788, 0.26070714, -3.8561444, -21.210388, -0.32390642, -3.8775039, -21.084795, -0.2963524, -3.8775039, -21.205263, -0.34462523, -3.8561444, -21.210388, -0.32390642, -3.8561444, -21.105513, -0.29165316, -3.8775039, -21.084795, -0.2963524, -3.8561444, -21.105513, -0.29165316, -3.8775039, -21.082659, 0.21862864, -3.8775039, -21.084795, -0.2963524, -3.8561444, -21.105513, -0.29165316, -3.8561444, -21.10359, 0.2135024, -3.8775039, -21.082659, 0.21862864, -3.8561444, -21.10359, 0.2135024, -3.8775039, -21.215515, 0.2816397, -3.8775039, -21.082659, 0.21862864, -3.8561444, -21.10359, 0.2135024, -3.8561444, -21.219788, 0.26070714, -3.8775039, -21.215515, 0.2816397, -3.8775039, -21.205263, -0.34462523, -3.8988638, -21.105513, -0.29165316, -3.8988638, -21.210388, -0.32390642, -3.8775039, -21.205263, -0.34462523, -3.8775039, -21.084795, -0.2963524, -3.8988638, -21.105513, -0.29165316, -3.8988638, -21.210388, -0.32390642, -3.8775039, -21.126446, -0.2871678, -3.8775039, -21.215515, -0.3031876, -3.8988638, -21.210388, -0.32390642, -3.8988638, -21.105513, -0.29165316, -3.8775039, -21.126446, -0.2871678, -3.8988638, -21.105513, -0.29165316, -3.8775039, -21.12431, 0.20858967, -3.8775039, -21.126446, -0.2871678, -3.8988638, -21.105513, -0.29165316, -3.8988638, -21.10359, 0.2135024, -3.8775039, -21.12431, 0.20858967, -3.8988638, -21.10359, 0.2135024, -3.8775039, -21.224058, 0.23977482, -3.8775039, -21.12431, 0.20858967, -3.8988638, -21.10359, 0.2135024, -3.8988638, -21.219788, 0.26070714, -3.8775039, -21.224058, 0.23977482, -3.8775039, -21.084795, -0.2963524, -3.8988638, -21.10359, 0.2135024, -3.8988638, -21.105513, -0.29165316, -3.8775039, -21.084795, -0.2963524, -3.8775039, -21.082659, 0.21862864, -3.8988638, -21.10359, 0.2135024, -3.8775039, -21.082659, 0.21862864, -3.8988638, -21.219788, 0.26070714, -3.8988638, -21.10359, 0.2135024, -3.8775039, -21.082659, 0.21862864, -3.8775039, -21.215515, 0.2816397, -3.8988638, -21.219788, 0.26070714, -3.8775039, -21.224058, 0.23977482, -3.8561444, -21.34047, 0.21777427, -3.8561444, -21.219788, 0.26070714, -3.8775039, -21.224058, 0.23977482, -3.8775039, -21.320818, 0.20923042, -3.8561444, -21.34047, 0.21777427, -3.8561444, -21.219788, 0.26070714, -3.8775039, -21.36012, 0.22631812, -3.8775039, -21.215515, 0.2816397, -3.8561444, -21.219788, 0.26070714, -3.8561444, -21.34047, 0.21777427, -3.8775039, -21.36012, 0.22631812, -3.8775039, -21.215515, 0.2816397, -3.8988638, -21.34047, 0.21777427, -3.8988638, -21.219788, 0.26070714, -3.8775039, -21.215515, 0.2816397, -3.8775039, -21.36012, 0.22631812, -3.8988638, -21.34047, 0.21777427, -3.8988638, -21.219788, 0.26070714, -3.8775039, -21.320818, 0.20923042, -3.8775039, -21.224058, 0.23977482, -3.8988638, -21.219788, 0.26070714, -3.8988638, -21.34047, 0.21777427, -3.8775039, -21.320818, 0.20923042, -7.34631, -21.333633, 0.9091861, -7.3221745, -21.35008, 0.3158151, -7.3221745, -21.355635, 0.9190115, -7.34631, -21.333633, 0.9091861, -7.34631, -21.328295, 0.3260677, -7.3221745, -21.35008, 0.3158151, -7.34631, -21.328295, 0.3260677, -7.3221745, -21.208893, 0.2931739, -7.3221745, -21.35008, 0.3158151, -7.34631, -21.328295, 0.3260677, -7.34631, -21.21466, 0.3170967, -7.3221745, -21.208893, 0.2931739, -7.3221745, -21.355635, 0.9190115, -7.34631, -21.371868, 0.30534887, -7.34631, -21.377848, 0.92883694, -7.3221745, -21.355635, 0.9190115, -7.3221745, -21.35008, 0.3158151, -7.34631, -21.371868, 0.30534887, -7.3221745, -21.35008, 0.3158151, -7.34631, -21.20334, 0.2692511, -7.34631, -21.371868, 0.30534887, -7.3221745, -21.35008, 0.3158151, -7.3221745, -21.208893, 0.2931739, -7.34631, -21.20334, 0.2692511, -7.34631, -21.377848, 0.92883694, -7.3704467, -21.35008, 0.3158151, -7.3704467, -21.355635, 0.9190115, -7.34631, -21.377848, 0.92883694, -7.34631, -21.371868, 0.30534887, -7.3704467, -21.35008, 0.3158151, -7.34631, -21.371868, 0.30534887, -7.3704467, -21.208893, 0.2931739, -7.3704467, -21.35008, 0.3158151, -7.34631, -21.371868, 0.30534887, -7.34631, -21.20334, 0.2692511, -7.3704467, -21.208893, 0.2931739, -7.3704467, -21.355635, 0.9190115, -7.34631, -21.328295, 0.3260677, -7.34631, -21.333633, 0.9091861, -7.3704467, -21.355635, 0.9190115, -7.3704467, -21.35008, 0.3158151, -7.34631, -21.328295, 0.3260677, -7.3704467, -21.35008, 0.3158151, -7.34631, -21.21466, 0.3170967, -7.34631, -21.328295, 0.3260677, -7.3704467, -21.35008, 0.3158151, -7.3704467, -21.208893, 0.2931739, -7.34631, -21.21466, 0.3170967, -7.34631, -21.21466, 0.3170967, -7.3221745, -21.090775, 0.33033967, -7.3221745, -21.208893, 0.2931739, -7.34631, -21.21466, 0.3170967, -7.34631, -21.114271, 0.33567965, -7.3221745, -21.090775, 0.33033967, -7.34631, -21.114271, 0.33567965, -7.3221745, -21.088425, 0.91409886, -7.3221745, -21.090775, 0.33033967, -7.34631, -21.114271, 0.33567965, -7.34631, -21.111708, 0.90833163, -7.3221745, -21.088425, 0.91409886, -7.34631, -21.111708, 0.90833163, -7.3221745, -21.219574, 0.96877944, -7.3221745, -21.088425, 0.91409886, -7.34631, -21.111708, 0.90833163, -7.34631, -21.224485, 0.9444295, -7.3221745, -21.219574, 0.96877944, -7.3221745, -21.208893, 0.2931739, -7.34631, -21.06728, 0.32499957, -7.34631, -21.20334, 0.2692511, -7.3221745, -21.208893, 0.2931739, -7.3221745, -21.090775, 0.33033967, -7.34631, -21.06728, 0.32499957, -7.3221745, -21.090775, 0.33033967, -7.34631, -21.06493, 0.92007935, -7.34631, -21.06728, 0.32499957, -7.3221745, -21.090775, 0.33033967, -7.3221745, -21.088425, 0.91409886, -7.34631, -21.06493, 0.92007935, -7.3221745, -21.088425, 0.91409886, -7.34631, -21.214874, 0.99291587, -7.34631, -21.06493, 0.92007935, -7.3221745, -21.088425, 0.91409886, -7.3221745, -21.219574, 0.96877944, -7.34631, -21.214874, 0.99291587, -7.34631, -21.20334, 0.2692511, -7.3704467, -21.090775, 0.33033967, -7.3704467, -21.208893, 0.2931739, -7.34631, -21.20334, 0.2692511, -7.34631, -21.06728, 0.32499957, -7.3704467, -21.090775, 0.33033967, -7.3704467, -21.208893, 0.2931739, -7.34631, -21.114271, 0.33567965, -7.34631, -21.21466, 0.3170967, -7.3704467, -21.208893, 0.2931739, -7.3704467, -21.090775, 0.33033967, -7.34631, -21.114271, 0.33567965, -7.3704467, -21.090775, 0.33033967, -7.34631, -21.111708, 0.90833163, -7.34631, -21.114271, 0.33567965, -7.3704467, -21.090775, 0.33033967, -7.3704467, -21.088425, 0.91409886, -7.34631, -21.111708, 0.90833163, -7.3704467, -21.088425, 0.91409886, -7.34631, -21.224485, 0.9444295, -7.34631, -21.111708, 0.90833163, -7.3704467, -21.088425, 0.91409886, -7.3704467, -21.219574, 0.96877944, -7.34631, -21.224485, 0.9444295, -7.34631, -21.06728, 0.32499957, -7.3704467, -21.088425, 0.91409886, -7.3704467, -21.090775, 0.33033967, -7.34631, -21.06728, 0.32499957, -7.34631, -21.06493, 0.92007935, -7.3704467, -21.088425, 0.91409886, -7.34631, -21.06493, 0.92007935, -7.3704467, -21.219574, 0.96877944, -7.3704467, -21.088425, 0.91409886, -7.34631, -21.06493, 0.92007935, -7.34631, -21.214874, 0.99291587, -7.3704467, -21.219574, 0.96877944, -7.34631, -21.224485, 0.9444295, -7.3221745, -21.355635, 0.9190115, -7.3221745, -21.219574, 0.96877944, -7.34631, -21.224485, 0.9444295, -7.34631, -21.333633, 0.9091861, -7.3221745, -21.355635, 0.9190115, -7.3221745, -21.219574, 0.96877944, -7.34631, -21.377848, 0.92883694, -7.34631, -21.214874, 0.99291587, -7.3221745, -21.219574, 0.96877944, -7.3221745, -21.355635, 0.9190115, -7.34631, -21.377848, 0.92883694, -7.34631, -21.214874, 0.99291587, -7.3704467, -21.355635, 0.9190115, -7.3704467, -21.219574, 0.96877944, -7.34631, -21.214874, 0.99291587, -7.34631, -21.377848, 0.92883694, -7.3704467, -21.355635, 0.9190115, -7.3704467, -21.219574, 0.96877944, -7.34631, -21.333633, 0.9091861, -7.34631, -21.224485, 0.9444295, -7.3704467, -21.219574, 0.96877944, -7.3704467, -21.355635, 0.9190115, -7.34631, -21.333633, 0.9091861, -7.433244, -21.333633, 2.1138701, -7.4093213, -21.35008, 1.6759974, -7.4093213, -21.355633, 2.1211324, -7.433244, -21.333633, 2.1138701, -7.433244, -21.328293, 1.6839005, -7.4093213, -21.35008, 1.6759974, -7.4093213, -21.355633, 2.1211324, -7.433244, -21.371868, 1.6683079, -7.433244, -21.377848, 2.1283946, -7.4093213, -21.355633, 2.1211324, -7.4093213, -21.35008, 1.6759974, -7.433244, -21.371868, 1.6683079, -7.433244, -21.377848, 2.1283946, -7.457381, -21.35008, 1.6759974, -7.457381, -21.355633, 2.1211324, -7.433244, -21.377848, 2.1283946, -7.433244, -21.371868, 1.6683079, -7.457381, -21.35008, 1.6759974, -7.457381, -21.355633, 2.1211324, -7.433244, -21.328293, 1.6839005, -7.433244, -21.333633, 2.1138701, -7.457381, -21.355633, 2.1211324, -7.457381, -21.35008, 1.6759974, -7.433244, -21.328293, 1.6839005, -7.433244, -21.328293, 1.6839005, -7.4093213, -21.208893, 1.6595504, -7.4093213, -21.35008, 1.6759974, -7.433244, -21.328293, 1.6839005, -7.433244, -21.21466, 1.6770654, -7.4093213, -21.208893, 1.6595504, -7.4093213, -21.35008, 1.6759974, -7.433244, -21.203339, 1.6418219, -7.433244, -21.371868, 1.6683079, -7.4093213, -21.35008, 1.6759974, -7.4093213, -21.208893, 1.6595504, -7.433244, -21.203339, 1.6418219, -7.433244, -21.371868, 1.6683079, -7.457381, -21.208893, 1.6595504, -7.457381, -21.35008, 1.6759974, -7.433244, -21.371868, 1.6683079, -7.433244, -21.203339, 1.6418219, -7.457381, -21.208893, 1.6595504, -7.457381, -21.35008, 1.6759974, -7.433244, -21.21466, 1.6770654, -7.433244, -21.328293, 1.6839005, -7.457381, -21.35008, 1.6759974, -7.457381, -21.208893, 1.6595504, -7.433244, -21.21466, 1.6770654, -7.433244, -21.21466, 1.6770654, -7.4093213, -21.090775, 1.6868907, -7.4093213, -21.208893, 1.6595504, -7.433244, -21.21466, 1.6770654, -7.433244, -21.11427, 1.6907355, -7.4093213, -21.090775, 1.6868907, -7.4093213, -21.208893, 1.6595504, -7.433244, -21.067278, 1.6828324, -7.433244, -21.203339, 1.6418219, -7.4093213, -21.208893, 1.6595504, -7.4093213, -21.090775, 1.6868907, -7.433244, -21.067278, 1.6828324, -7.433244, -21.203339, 1.6418219, -7.457381, -21.090775, 1.6868907, -7.457381, -21.208893, 1.6595504, -7.433244, -21.203339, 1.6418219, -7.433244, -21.067278, 1.6828324, -7.457381, -21.090775, 1.6868907, -7.457381, -21.208893, 1.6595504, -7.433244, -21.11427, 1.6907355, -7.433244, -21.21466, 1.6770654, -7.457381, -21.208893, 1.6595504, -7.457381, -21.090775, 1.6868907, -7.433244, -21.11427, 1.6907355, -7.433244, -21.11427, 1.6907355, -7.4093213, -21.088425, 2.1175013, -7.4093213, -21.090775, 1.6868907, -7.433244, -21.11427, 1.6907355, -7.433244, -21.111706, 2.1132293, -7.4093213, -21.088425, 2.1175013, -7.433244, -21.111706, 2.1132293, -7.4093213, -21.219572, 2.157871, -7.4093213, -21.088425, 2.1175013, -7.433244, -21.111706, 2.1132293, -7.433244, -21.224485, 2.1399288, -7.4093213, -21.219572, 2.157871, -7.4093213, -21.090775, 1.6868907, -7.433244, -21.064928, 2.121773, -7.433244, -21.067278, 1.6828324, -7.4093213, -21.090775, 1.6868907, -7.4093213, -21.088425, 2.1175013, -7.433244, -21.064928, 2.121773, -7.4093213, -21.088425, 2.1175013, -7.433244, -21.214874, 2.1755996, -7.433244, -21.064928, 2.121773, -7.4093213, -21.088425, 2.1175013, -7.4093213, -21.219572, 2.157871, -7.433244, -21.214874, 2.1755996, -7.433244, -21.067278, 1.6828324, -7.457381, -21.088425, 2.1175013, -7.457381, -21.090775, 1.6868907, -7.433244, -21.067278, 1.6828324, -7.433244, -21.064928, 2.121773, -7.457381, -21.088425, 2.1175013, -7.433244, -21.064928, 2.121773, -7.457381, -21.219572, 2.157871, -7.457381, -21.088425, 2.1175013, -7.433244, -21.064928, 2.121773, -7.433244, -21.214874, 2.1755996, -7.457381, -21.219572, 2.157871, -7.457381, -21.090775, 1.6868907, -7.433244, -21.111706, 2.1132293, -7.433244, -21.11427, 1.6907355, -7.457381, -21.090775, 1.6868907, -7.457381, -21.088425, 2.1175013, -7.433244, -21.111706, 2.1132293, -7.457381, -21.088425, 2.1175013, -7.433244, -21.224485, 2.1399288, -7.433244, -21.111706, 2.1132293, -7.457381, -21.088425, 2.1175013, -7.457381, -21.219572, 2.157871, -7.433244, -21.224485, 2.1399288, -7.433244, -21.224485, 2.1399288, -7.4093213, -21.355633, 2.1211324, -7.4093213, -21.219572, 2.157871, -7.433244, -21.224485, 2.1399288, -7.433244, -21.333633, 2.1138701, -7.4093213, -21.355633, 2.1211324, -7.4093213, -21.219572, 2.157871, -7.433244, -21.377848, 2.1283946, -7.433244, -21.214874, 2.1755996, -7.4093213, -21.219572, 2.157871, -7.4093213, -21.355633, 2.1211324, -7.433244, -21.377848, 2.1283946, -7.433244, -21.214874, 2.1755996, -7.457381, -21.355633, 2.1211324, -7.457381, -21.219572, 2.157871, -7.433244, -21.214874, 2.1755996, -7.433244, -21.377848, 2.1283946, -7.457381, -21.355633, 2.1211324, -7.457381, -21.219572, 2.157871, -7.433244, -21.333633, 2.1138701, -7.433244, -21.224485, 2.1399288, -7.457381, -21.219572, 2.157871, -7.457381, -21.355633, 2.1211324, -7.433244, -21.333633, 2.1138701, -7.433244, -21.333633, 3.4082646, -7.4093213, -21.35008, 2.8360398, -7.4093213, -21.355633, 3.4176629, -7.433244, -21.333633, 3.4082646, -7.433244, -21.328293, 2.8460789, -7.4093213, -21.35008, 2.8360398, -7.433244, -21.328293, 2.8460789, -7.4093213, -21.208893, 2.8142529, -7.4093213, -21.35008, 2.8360398, -7.433244, -21.328293, 2.8460789, -7.433244, -21.21466, 2.837535, -7.4093213, -21.208893, 2.8142529, -7.4093213, -21.355633, 3.4176629, -7.433244, -21.371866, 2.8260007, -7.433244, -21.377848, 3.4272747, -7.4093213, -21.355633, 3.4176629, -7.4093213, -21.35008, 2.8360398, -7.433244, -21.371866, 2.8260007, -7.4093213, -21.35008, 2.8360398, -7.433244, -21.203339, 2.7911844, -7.433244, -21.371866, 2.8260007, -7.4093213, -21.35008, 2.8360398, -7.4093213, -21.208893, 2.8142529, -7.433244, -21.203339, 2.7911844, -7.433244, -21.377848, 3.4272747, -7.457381, -21.35008, 2.8360398, -7.457381, -21.355633, 3.4176629, -7.433244, -21.377848, 3.4272747, -7.433244, -21.371866, 2.8260007, -7.457381, -21.35008, 2.8360398, -7.433244, -21.371866, 2.8260007, -7.457381, -21.208893, 2.8142529, -7.457381, -21.35008, 2.8360398, -7.433244, -21.371866, 2.8260007, -7.433244, -21.203339, 2.7911844, -7.457381, -21.208893, 2.8142529, -7.457381, -21.355633, 3.4176629, -7.433244, -21.328293, 2.8460789, -7.433244, -21.333633, 3.4082646, -7.457381, -21.355633, 3.4176629, -7.457381, -21.35008, 2.8360398, -7.433244, -21.328293, 2.8460789, -7.457381, -21.35008, 2.8360398, -7.433244, -21.21466, 2.837535, -7.433244, -21.328293, 2.8460789, -7.457381, -21.35008, 2.8360398, -7.457381, -21.208893, 2.8142529, -7.433244, -21.21466, 2.837535, -7.433244, -21.21466, 2.837535, -7.4093213, -21.090775, 2.850137, -7.4093213, -21.208893, 2.8142529, -7.433244, -21.21466, 2.837535, -7.433244, -21.11427, 2.8552632, -7.4093213, -21.090775, 2.850137, -7.433244, -21.11427, 2.8552632, -7.4093213, -21.088425, 3.4129639, -7.4093213, -21.090775, 2.850137, -7.433244, -21.11427, 2.8552632, -7.433244, -21.111706, 3.4071965, -7.4093213, -21.088425, 3.4129639, -7.433244, -21.111706, 3.4071965, -7.4093213, -21.219572, 3.4655085, -7.4093213, -21.088425, 3.4129639, -7.433244, -21.111706, 3.4071965, -7.433244, -21.224485, 3.4422264, -7.4093213, -21.219572, 3.4655085, -7.4093213, -21.208893, 2.8142529, -7.433244, -21.067278, 2.8450108, -7.433244, -21.203339, 2.7911844, -7.4093213, -21.208893, 2.8142529, -7.4093213, -21.090775, 2.850137, -7.433244, -21.067278, 2.8450108, -7.4093213, -21.090775, 2.850137, -7.433244, -21.064928, 3.4187307, -7.433244, -21.067278, 2.8450108, -7.4093213, -21.090775, 2.850137, -7.4093213, -21.088425, 3.4129639, -7.433244, -21.064928, 3.4187307, -7.4093213, -21.088425, 3.4129639, -7.433244, -21.214872, 3.4887905, -7.433244, -21.064928, 3.4187307, -7.4093213, -21.088425, 3.4129639, -7.4093213, -21.219572, 3.4655085, -7.433244, -21.214872, 3.4887905, -7.433244, -21.203339, 2.7911844, -7.457381, -21.090775, 2.850137, -7.457381, -21.208893, 2.8142529, -7.433244, -21.203339, 2.7911844, -7.433244, -21.067278, 2.8450108, -7.457381, -21.090775, 2.850137, -7.457381, -21.208893, 2.8142529, -7.433244, -21.11427, 2.8552632, -7.433244, -21.21466, 2.837535, -7.457381, -21.208893, 2.8142529, -7.457381, -21.090775, 2.850137, -7.433244, -21.11427, 2.8552632, -7.457381, -21.090775, 2.850137, -7.433244, -21.111706, 3.4071965, -7.433244, -21.11427, 2.8552632, -7.457381, -21.090775, 2.850137, -7.457381, -21.088425, 3.4129639, -7.433244, -21.111706, 3.4071965, -7.457381, -21.088425, 3.4129639, -7.433244, -21.224485, 3.4422264, -7.433244, -21.111706, 3.4071965, -7.457381, -21.088425, 3.4129639, -7.457381, -21.219572, 3.4655085, -7.433244, -21.224485, 3.4422264, -7.433244, -21.067278, 2.8450108, -7.457381, -21.088425, 3.4129639, -7.457381, -21.090775, 2.850137, -7.433244, -21.067278, 2.8450108, -7.433244, -21.064928, 3.4187307, -7.457381, -21.088425, 3.4129639, -7.433244, -21.064928, 3.4187307, -7.457381, -21.219572, 3.4655085, -7.457381, -21.088425, 3.4129639, -7.433244, -21.064928, 3.4187307, -7.433244, -21.214872, 3.4887905, -7.457381, -21.219572, 3.4655085, -7.433244, -21.224485, 3.4422264, -7.4093213, -21.355633, 3.4176629, -7.4093213, -21.219572, 3.4655085, -7.433244, -21.224485, 3.4422264, -7.433244, -21.333633, 3.4082646, -7.4093213, -21.355633, 3.4176629, -7.4093213, -21.219572, 3.4655085, -7.433244, -21.377848, 3.4272747, -7.433244, -21.214872, 3.4887905, -7.4093213, -21.219572, 3.4655085, -7.4093213, -21.355633, 3.4176629, -7.433244, -21.377848, 3.4272747, -7.433244, -21.214872, 3.4887905, -7.457381, -21.355633, 3.4176629, -7.457381, -21.219572, 3.4655085, -7.433244, -21.214872, 3.4887905, -7.433244, -21.377848, 3.4272747, -7.457381, -21.355633, 3.4176629, -7.457381, -21.219572, 3.4655085, -7.433244, -21.333633, 3.4082646, -7.433244, -21.224485, 3.4422264, -7.457381, -21.219572, 3.4655085, -7.457381, -21.355633, 3.4176629, -7.433244, -21.333633, 3.4082646, -3.7589583, -21.320816, 4.036238, -3.7375984, -21.335342, 3.5225387, -3.7375984, -21.340467, 4.044782, -3.7589583, -21.320816, 4.036238, -3.7589583, -21.316118, 3.5317235, -3.7375984, -21.335342, 3.5225387, -3.7589583, -21.316118, 3.5317235, -3.7375984, -21.210388, 3.5031013, -3.7375984, -21.335342, 3.5225387, -3.7589583, -21.316118, 3.5317235, -3.7589583, -21.215513, 3.5238204, -3.7375984, -21.210388, 3.5031013, -3.7375984, -21.340467, 4.044782, -3.7589583, -21.354778, 3.5137813, -3.7589583, -21.360119, 4.0533257, -3.7375984, -21.340467, 4.044782, -3.7375984, -21.335342, 3.5225387, -3.7589583, -21.354778, 3.5137813, -3.7375984, -21.335342, 3.5225387, -3.7589583, -21.205261, 3.4823828, -3.7589583, -21.354778, 3.5137813, -3.7375984, -21.335342, 3.5225387, -3.7375984, -21.210388, 3.5031013, -3.7589583, -21.205261, 3.4823828, -3.7589583, -21.360119, 4.0533257, -3.7803178, -21.335342, 3.5225387, -3.7803178, -21.340467, 4.044782, -3.7589583, -21.360119, 4.0533257, -3.7589583, -21.354778, 3.5137813, -3.7803178, -21.335342, 3.5225387, -3.7589583, -21.354778, 3.5137813, -3.7803178, -21.210388, 3.5031013, -3.7803178, -21.335342, 3.5225387, -3.7589583, -21.354778, 3.5137813, -3.7589583, -21.205261, 3.4823828, -3.7803178, -21.210388, 3.5031013, -3.7803178, -21.340467, 4.044782, -3.7589583, -21.316118, 3.5317235, -3.7589583, -21.320816, 4.036238, -3.7803178, -21.340467, 4.044782, -3.7803178, -21.335342, 3.5225387, -3.7589583, -21.316118, 3.5317235, -3.7803178, -21.335342, 3.5225387, -3.7589583, -21.215513, 3.5238204, -3.7589583, -21.316118, 3.5317235, -3.7803178, -21.335342, 3.5225387, -3.7803178, -21.210388, 3.5031013, -3.7589583, -21.215513, 3.5238204, -3.7589583, -21.215513, 3.5238204, -3.7375984, -21.105513, 3.5353546, -3.7375984, -21.210388, 3.5031013, -3.7589583, -21.215513, 3.5238204, -3.7589583, -21.126444, 3.5398402, -3.7375984, -21.105513, 3.5353546, -3.7589583, -21.126444, 3.5398402, -3.7375984, -21.10359, 4.04051, -3.7375984, -21.105513, 3.5353546, -3.7589583, -21.126444, 3.5398402, -3.7589583, -21.124308, 4.0355973, -3.7375984, -21.10359, 4.04051, -3.7589583, -21.124308, 4.0355973, -3.7375984, -21.219786, 4.087715, -3.7375984, -21.10359, 4.04051, -3.7589583, -21.124308, 4.0355973, -3.7589583, -21.224058, 4.0667825, -3.7375984, -21.219786, 4.087715, -3.7375984, -21.210388, 3.5031013, -3.7589583, -21.084793, 3.5306554, -3.7589583, -21.205261, 3.4823828, -3.7375984, -21.210388, 3.5031013, -3.7375984, -21.105513, 3.5353546, -3.7589583, -21.084793, 3.5306554, -3.7375984, -21.105513, 3.5353546, -3.7589583, -21.082657, 4.045636, -3.7589583, -21.084793, 3.5306554, -3.7375984, -21.105513, 3.5353546, -3.7375984, -21.10359, 4.04051, -3.7589583, -21.082657, 4.045636, -3.7375984, -21.10359, 4.04051, -3.7589583, -21.215513, 4.1086473, -3.7589583, -21.082657, 4.045636, -3.7375984, -21.10359, 4.04051, -3.7375984, -21.219786, 4.087715, -3.7589583, -21.215513, 4.1086473, -3.7589583, -21.205261, 3.4823828, -3.7803178, -21.105513, 3.5353546, -3.7803178, -21.210388, 3.5031013, -3.7589583, -21.205261, 3.4823828, -3.7589583, -21.084793, 3.5306554, -3.7803178, -21.105513, 3.5353546, -3.7803178, -21.210388, 3.5031013, -3.7589583, -21.126444, 3.5398402, -3.7589583, -21.215513, 3.5238204, -3.7803178, -21.210388, 3.5031013, -3.7803178, -21.105513, 3.5353546, -3.7589583, -21.126444, 3.5398402, -3.7803178, -21.105513, 3.5353546, -3.7589583, -21.124308, 4.0355973, -3.7589583, -21.126444, 3.5398402, -3.7803178, -21.105513, 3.5353546, -3.7803178, -21.10359, 4.04051, -3.7589583, -21.124308, 4.0355973, -3.7803178, -21.10359, 4.04051, -3.7589583, -21.224058, 4.0667825, -3.7589583, -21.124308, 4.0355973, -3.7803178, -21.10359, 4.04051, -3.7803178, -21.219786, 4.087715, -3.7589583, -21.224058, 4.0667825, -3.7589583, -21.084793, 3.5306554, -3.7803178, -21.10359, 4.04051, -3.7803178, -21.105513, 3.5353546, -3.7589583, -21.084793, 3.5306554, -3.7589583, -21.082657, 4.045636, -3.7803178, -21.10359, 4.04051, -3.7589583, -21.082657, 4.045636, -3.7803178, -21.219786, 4.087715, -3.7803178, -21.10359, 4.04051, -3.7589583, -21.082657, 4.045636, -3.7589583, -21.215513, 4.1086473, -3.7803178, -21.219786, 4.087715, -3.7589583, -21.224058, 4.0667825, -3.7375984, -21.340467, 4.044782, -3.7375984, -21.219786, 4.087715, -3.7589583, -21.224058, 4.0667825, -3.7589583, -21.320816, 4.036238, -3.7375984, -21.340467, 4.044782, -3.7375984, -21.219786, 4.087715, -3.7589583, -21.360119, 4.0533257, -3.7589583, -21.215513, 4.1086473, -3.7375984, -21.219786, 4.087715, -3.7375984, -21.340467, 4.044782, -3.7589583, -21.360119, 4.0533257, -3.7589583, -21.215513, 4.1086473, -3.7803178, -21.340467, 4.044782, -3.7803178, -21.219786, 4.087715, -3.7589583, -21.215513, 4.1086473, -3.7589583, -21.360119, 4.0533257, -3.7803178, -21.340467, 4.044782, -3.7803178, -21.219786, 4.087715, -3.7589583, -21.320816, 4.036238, -3.7589583, -21.224058, 4.0667825, -3.7803178, -21.219786, 4.087715, -3.7803178, -21.340467, 4.044782, -3.7589583, -21.320816, 4.036238, -7.491342, -21.333633, 1.4549251, -7.4672065, -21.35008, 1.0367032, -7.4672065, -21.355635, 1.4619738, -7.491342, -21.333633, 1.4549251, -7.491342, -21.328293, 1.0439655, -7.4672065, -21.35008, 1.0367032, -7.4672065, -21.355635, 1.4619738, -7.491342, -21.371868, 1.0292273, -7.491342, -21.377848, 1.4688089, -7.4672065, -21.355635, 1.4619738, -7.4672065, -21.35008, 1.0367032, -7.491342, -21.371868, 1.0292273, -7.491342, -21.377848, 1.4688089, -7.5154786, -21.35008, 1.0367032, -7.5154786, -21.355635, 1.4619738, -7.491342, -21.377848, 1.4688089, -7.491342, -21.371868, 1.0292273, -7.5154786, -21.35008, 1.0367032, -7.5154786, -21.355635, 1.4619738, -7.491342, -21.328293, 1.0439655, -7.491342, -21.333633, 1.4549251, -7.5154786, -21.355635, 1.4619738, -7.5154786, -21.35008, 1.0367032, -7.491342, -21.328293, 1.0439655, -7.491342, -21.328293, 1.0439655, -7.4672065, -21.208893, 1.0206835, -7.4672065, -21.35008, 1.0367032, -7.491342, -21.328293, 1.0439655, -7.491342, -21.21466, 1.0375576, -7.4672065, -21.208893, 1.0206835, -7.4672065, -21.35008, 1.0367032, -7.491342, -21.20334, 1.0038093, -7.491342, -21.371868, 1.0292273, -7.4672065, -21.35008, 1.0367032, -7.4672065, -21.208893, 1.0206835, -7.491342, -21.20334, 1.0038093, -7.491342, -21.371868, 1.0292273, -7.5154786, -21.208893, 1.0206835, -7.5154786, -21.35008, 1.0367032, -7.491342, -21.371868, 1.0292273, -7.491342, -21.20334, 1.0038093, -7.5154786, -21.208893, 1.0206835, -7.5154786, -21.35008, 1.0367032, -7.491342, -21.21466, 1.0375576, -7.491342, -21.328293, 1.0439655, -7.5154786, -21.35008, 1.0367032, -7.5154786, -21.208893, 1.0206835, -7.491342, -21.21466, 1.0375576, -7.491342, -21.21466, 1.0375576, -7.4672065, -21.090775, 1.0469557, -7.4672065, -21.208893, 1.0206835, -7.491342, -21.21466, 1.0375576, -7.491342, -21.11427, 1.0505869, -7.4672065, -21.090775, 1.0469557, -7.4672065, -21.208893, 1.0206835, -7.491342, -21.067278, 1.0431108, -7.491342, -21.20334, 1.0038093, -7.4672065, -21.208893, 1.0206835, -7.4672065, -21.090775, 1.0469557, -7.491342, -21.067278, 1.0431108, -7.491342, -21.20334, 1.0038093, -7.5154786, -21.090775, 1.0469557, -7.5154786, -21.208893, 1.0206835, -7.491342, -21.20334, 1.0038093, -7.491342, -21.067278, 1.0431108, -7.5154786, -21.090775, 1.0469557, -7.5154786, -21.208893, 1.0206835, -7.491342, -21.11427, 1.0505869, -7.491342, -21.21466, 1.0375576, -7.5154786, -21.208893, 1.0206835, -7.5154786, -21.090775, 1.0469557, -7.491342, -21.11427, 1.0505869, -7.491342, -21.11427, 1.0505869, -7.4672065, -21.088425, 1.4585562, -7.4672065, -21.090775, 1.0469557, -7.491342, -21.11427, 1.0505869, -7.491342, -21.111706, 1.4542842, -7.4672065, -21.088425, 1.4585562, -7.4672065, -21.090775, 1.0469557, -7.491342, -21.06493, 1.4626144, -7.491342, -21.067278, 1.0431108, -7.4672065, -21.090775, 1.0469557, -7.4672065, -21.088425, 1.4585562, -7.491342, -21.06493, 1.4626144, -7.491342, -21.067278, 1.0431108, -7.5154786, -21.088425, 1.4585562, -7.5154786, -21.090775, 1.0469557, -7.491342, -21.067278, 1.0431108, -7.491342, -21.06493, 1.4626144, -7.5154786, -21.088425, 1.4585562, -7.5154786, -21.090775, 1.0469557, -7.491342, -21.111706, 1.4542842, -7.491342, -21.11427, 1.0505869, -7.5154786, -21.090775, 1.0469557, -7.5154786, -21.088425, 1.4585562, -7.491342, -21.111706, 1.4542842, -7.491342, -21.111706, 1.4542842, -7.4672065, -21.219572, 1.4970036, -7.4672065, -21.088425, 1.4585562, -7.491342, -21.111706, 1.4542842, -7.491342, -21.224485, 1.4799159, -7.4672065, -21.219572, 1.4970036, -7.4672065, -21.088425, 1.4585562, -7.491342, -21.214874, 1.5138776, -7.491342, -21.06493, 1.4626144, -7.4672065, -21.088425, 1.4585562, -7.4672065, -21.219572, 1.4970036, -7.491342, -21.214874, 1.5138776, -7.491342, -21.06493, 1.4626144, -7.5154786, -21.219572, 1.4970036, -7.5154786, -21.088425, 1.4585562, -7.491342, -21.06493, 1.4626144, -7.491342, -21.214874, 1.5138776, -7.5154786, -21.219572, 1.4970036, -7.5154786, -21.088425, 1.4585562, -7.491342, -21.224485, 1.4799159, -7.491342, -21.111706, 1.4542842, -7.5154786, -21.088425, 1.4585562, -7.5154786, -21.219572, 1.4970036, -7.491342, -21.224485, 1.4799159, -7.491342, -21.224485, 1.4799159, -7.4672065, -21.355635, 1.4619738, -7.4672065, -21.219572, 1.4970036, -7.491342, -21.224485, 1.4799159, -7.491342, -21.333633, 1.4549251, -7.4672065, -21.355635, 1.4619738, -7.4672065, -21.219572, 1.4970036, -7.491342, -21.377848, 1.4688089, -7.491342, -21.214874, 1.5138776, -7.4672065, -21.219572, 1.4970036, -7.4672065, -21.355635, 1.4619738, -7.491342, -21.377848, 1.4688089, -7.491342, -21.214874, 1.5138776, -7.5154786, -21.355635, 1.4619738, -7.5154786, -21.219572, 1.4970036, -7.491342, -21.214874, 1.5138776, -7.491342, -21.377848, 1.4688089, -7.5154786, -21.355635, 1.4619738, -7.5154786, -21.219572, 1.4970036, -7.491342, -21.333633, 1.4549251, -7.491342, -21.224485, 1.4799159, -7.5154786, -21.219572, 1.4970036, -7.5154786, -21.355635, 1.4619738, -7.491342, -21.333633, 1.4549251, -7.4881387, -21.333633, 2.66858, -7.464002, -21.35008, 2.2503583, -7.464002, -21.355633, 2.6756287, -7.4881387, -21.333633, 2.66858, -7.4881387, -21.328293, 2.2576206, -7.464002, -21.35008, 2.2503583, -7.464002, -21.355633, 2.6756287, -7.4881387, -21.371866, 2.2428825, -7.4881387, -21.377848, 2.682464, -7.464002, -21.355633, 2.6756287, -7.464002, -21.35008, 2.2503583, -7.4881387, -21.371866, 2.2428825, -7.4881387, -21.377848, 2.682464, -7.512275, -21.35008, 2.2503583, -7.512275, -21.355633, 2.6756287, -7.4881387, -21.377848, 2.682464, -7.4881387, -21.371866, 2.2428825, -7.512275, -21.35008, 2.2503583, -7.512275, -21.355633, 2.6756287, -7.4881387, -21.328293, 2.2576206, -7.4881387, -21.333633, 2.66858, -7.512275, -21.355633, 2.6756287, -7.512275, -21.35008, 2.2503583, -7.4881387, -21.328293, 2.2576206, -7.4881387, -21.328293, 2.2576206, -7.464002, -21.208893, 2.2343385, -7.464002, -21.35008, 2.2503583, -7.4881387, -21.328293, 2.2576206, -7.4881387, -21.21466, 2.2512126, -7.464002, -21.208893, 2.2343385, -7.464002, -21.35008, 2.2503583, -7.4881387, -21.203339, 2.2174644, -7.4881387, -21.371866, 2.2428825, -7.464002, -21.35008, 2.2503583, -7.464002, -21.208893, 2.2343385, -7.4881387, -21.203339, 2.2174644, -7.4881387, -21.371866, 2.2428825, -7.512275, -21.208893, 2.2343385, -7.512275, -21.35008, 2.2503583, -7.4881387, -21.371866, 2.2428825, -7.4881387, -21.203339, 2.2174644, -7.512275, -21.208893, 2.2343385, -7.512275, -21.35008, 2.2503583, -7.4881387, -21.21466, 2.2512126, -7.4881387, -21.328293, 2.2576206, -7.512275, -21.35008, 2.2503583, -7.512275, -21.208893, 2.2343385, -7.4881387, -21.21466, 2.2512126, -7.4881387, -21.21466, 2.2512126, -7.464002, -21.090775, 2.2606108, -7.464002, -21.208893, 2.2343385, -7.4881387, -21.21466, 2.2512126, -7.4881387, -21.11427, 2.264242, -7.464002, -21.090775, 2.2606108, -7.464002, -21.208893, 2.2343385, -7.4881387, -21.067278, 2.256766, -7.4881387, -21.203339, 2.2174644, -7.464002, -21.208893, 2.2343385, -7.464002, -21.090775, 2.2606108, -7.4881387, -21.067278, 2.256766, -7.4881387, -21.203339, 2.2174644, -7.512275, -21.090775, 2.2606108, -7.512275, -21.208893, 2.2343385, -7.4881387, -21.203339, 2.2174644, -7.4881387, -21.067278, 2.256766, -7.512275, -21.090775, 2.2606108, -7.512275, -21.208893, 2.2343385, -7.4881387, -21.11427, 2.264242, -7.4881387, -21.21466, 2.2512126, -7.512275, -21.208893, 2.2343385, -7.512275, -21.090775, 2.2606108, -7.4881387, -21.11427, 2.264242, -7.4881387, -21.11427, 2.264242, -7.464002, -21.088425, 2.6722112, -7.464002, -21.090775, 2.2606108, -7.4881387, -21.11427, 2.264242, -7.4881387, -21.111706, 2.6679392, -7.464002, -21.088425, 2.6722112, -7.464002, -21.090775, 2.2606108, -7.4881387, -21.064928, 2.6762695, -7.4881387, -21.067278, 2.256766, -7.464002, -21.090775, 2.2606108, -7.464002, -21.088425, 2.6722112, -7.4881387, -21.064928, 2.6762695, -7.4881387, -21.067278, 2.256766, -7.512275, -21.088425, 2.6722112, -7.512275, -21.090775, 2.2606108, -7.4881387, -21.067278, 2.256766, -7.4881387, -21.064928, 2.6762695, -7.512275, -21.088425, 2.6722112, -7.512275, -21.090775, 2.2606108, -7.4881387, -21.111706, 2.6679392, -7.4881387, -21.11427, 2.264242, -7.512275, -21.090775, 2.2606108, -7.512275, -21.088425, 2.6722112, -7.4881387, -21.111706, 2.6679392, -7.4881387, -21.111706, 2.6679392, -7.464002, -21.219572, 2.7106586, -7.464002, -21.088425, 2.6722112, -7.4881387, -21.111706, 2.6679392, -7.4881387, -21.224485, 2.6935709, -7.464002, -21.219572, 2.7106586, -7.464002, -21.088425, 2.6722112, -7.4881387, -21.214874, 2.7275326, -7.4881387, -21.064928, 2.6762695, -7.464002, -21.088425, 2.6722112, -7.464002, -21.219572, 2.7106586, -7.4881387, -21.214874, 2.7275326, -7.4881387, -21.064928, 2.6762695, -7.512275, -21.219572, 2.7106586, -7.512275, -21.088425, 2.6722112, -7.4881387, -21.064928, 2.6762695, -7.4881387, -21.214874, 2.7275326, -7.512275, -21.219572, 2.7106586, -7.512275, -21.088425, 2.6722112, -7.4881387, -21.224485, 2.6935709, -7.4881387, -21.111706, 2.6679392, -7.512275, -21.088425, 2.6722112, -7.512275, -21.219572, 2.7106586, -7.4881387, -21.224485, 2.6935709, -7.4881387, -21.224485, 2.6935709, -7.464002, -21.355633, 2.6756287, -7.464002, -21.219572, 2.7106586, -7.4881387, -21.224485, 2.6935709, -7.4881387, -21.333633, 2.66858, -7.464002, -21.355633, 2.6756287, -7.464002, -21.219572, 2.7106586, -7.4881387, -21.377848, 2.682464, -7.4881387, -21.214874, 2.7275326, -7.464002, -21.219572, 2.7106586, -7.464002, -21.355633, 2.6756287, -7.4881387, -21.377848, 2.682464, -7.4881387, -21.214874, 2.7275326, -7.512275, -21.355633, 2.6756287, -7.512275, -21.219572, 2.7106586, -7.4881387, -21.214874, 2.7275326, -7.4881387, -21.377848, 2.682464, -7.512275, -21.355633, 2.6756287, -7.512275, -21.219572, 2.7106586, -7.4881387, -21.333633, 2.66858, -7.4881387, -21.224485, 2.6935709, -7.512275, -21.219572, 2.7106586, -7.512275, -21.355633, 2.6756287, -7.4881387, -21.333633, 2.66858, -3.7905703, -21.320818, 1.4850421, -3.7692103, -21.335342, 0.9713427, -3.7692103, -21.34047, 1.4933724, -3.7905703, -21.320818, 1.4850421, -3.7905703, -21.316118, 0.98031366, -3.7692103, -21.335342, 0.9713427, -3.7905703, -21.316118, 0.98031366, -3.7692103, -21.210388, 0.95169187, -3.7692103, -21.335342, 0.9713427, -3.7905703, -21.316118, 0.98031366, -3.7905703, -21.215515, 0.9724107, -3.7692103, -21.210388, 0.95169187, -3.7692103, -21.34047, 1.4933724, -3.7905703, -21.35478, 0.9623716, -3.7905703, -21.360119, 1.5019164, -3.7692103, -21.34047, 1.4933724, -3.7692103, -21.335342, 0.9713427, -3.7905703, -21.35478, 0.9623716, -3.7692103, -21.335342, 0.9713427, -3.7905703, -21.205261, 0.93097293, -3.7905703, -21.35478, 0.9623716, -3.7692103, -21.335342, 0.9713427, -3.7692103, -21.210388, 0.95169187, -3.7905703, -21.205261, 0.93097293, -3.7905703, -21.360119, 1.5019164, -3.8119302, -21.335342, 0.9713427, -3.8119302, -21.34047, 1.4933724, -3.7905703, -21.360119, 1.5019164, -3.7905703, -21.35478, 0.9623716, -3.8119302, -21.335342, 0.9713427, -3.7905703, -21.35478, 0.9623716, -3.8119302, -21.210388, 0.95169187, -3.8119302, -21.335342, 0.9713427, -3.7905703, -21.35478, 0.9623716, -3.7905703, -21.205261, 0.93097293, -3.8119302, -21.210388, 0.95169187, -3.8119302, -21.34047, 1.4933724, -3.7905703, -21.316118, 0.98031366, -3.7905703, -21.320818, 1.4850421, -3.8119302, -21.34047, 1.4933724, -3.8119302, -21.335342, 0.9713427, -3.7905703, -21.316118, 0.98031366, -3.8119302, -21.335342, 0.9713427, -3.7905703, -21.215515, 0.9724107, -3.7905703, -21.316118, 0.98031366, -3.8119302, -21.335342, 0.9713427, -3.8119302, -21.210388, 0.95169187, -3.7905703, -21.215515, 0.9724107, -3.7905703, -21.215515, 0.9724107, -3.7692103, -21.105513, 0.9839448, -3.7692103, -21.210388, 0.95169187, -3.7905703, -21.215515, 0.9724107, -3.7905703, -21.126446, 0.9884304, -3.7692103, -21.105513, 0.9839448, -3.7905703, -21.126446, 0.9884304, -3.7692103, -21.10359, 1.489314, -3.7692103, -21.105513, 0.9839448, -3.7905703, -21.126446, 0.9884304, -3.7905703, -21.12431, 1.4841876, -3.7692103, -21.10359, 1.489314, -3.7905703, -21.12431, 1.4841876, -3.7692103, -21.219786, 1.5363052, -3.7692103, -21.10359, 1.489314, -3.7905703, -21.12431, 1.4841876, -3.7905703, -21.224058, 1.5153728, -3.7692103, -21.219786, 1.5363052, -3.7692103, -21.210388, 0.95169187, -3.7905703, -21.084793, 0.9792458, -3.7905703, -21.205261, 0.93097293, -3.7692103, -21.210388, 0.95169187, -3.7692103, -21.105513, 0.9839448, -3.7905703, -21.084793, 0.9792458, -3.7692103, -21.105513, 0.9839448, -3.7905703, -21.082657, 1.4942267, -3.7905703, -21.084793, 0.9792458, -3.7692103, -21.105513, 0.9839448, -3.7692103, -21.10359, 1.489314, -3.7905703, -21.082657, 1.4942267, -3.7692103, -21.10359, 1.489314, -3.7905703, -21.215515, 1.5574512, -3.7905703, -21.082657, 1.4942267, -3.7692103, -21.10359, 1.489314, -3.7692103, -21.219786, 1.5363052, -3.7905703, -21.215515, 1.5574512, -3.7905703, -21.205261, 0.93097293, -3.8119302, -21.105513, 0.9839448, -3.8119302, -21.210388, 0.95169187, -3.7905703, -21.205261, 0.93097293, -3.7905703, -21.084793, 0.9792458, -3.8119302, -21.105513, 0.9839448, -3.8119302, -21.210388, 0.95169187, -3.7905703, -21.126446, 0.9884304, -3.7905703, -21.215515, 0.9724107, -3.8119302, -21.210388, 0.95169187, -3.8119302, -21.105513, 0.9839448, -3.7905703, -21.126446, 0.9884304, -3.8119302, -21.105513, 0.9839448, -3.7905703, -21.12431, 1.4841876, -3.7905703, -21.126446, 0.9884304, -3.8119302, -21.105513, 0.9839448, -3.8119302, -21.10359, 1.489314, -3.7905703, -21.12431, 1.4841876, -3.8119302, -21.10359, 1.489314, -3.7905703, -21.224058, 1.5153728, -3.7905703, -21.12431, 1.4841876, -3.8119302, -21.10359, 1.489314, -3.8119302, -21.219786, 1.5363052, -3.7905703, -21.224058, 1.5153728, -3.7905703, -21.084793, 0.9792458, -3.8119302, -21.10359, 1.489314, -3.8119302, -21.105513, 0.9839448, -3.7905703, -21.084793, 0.9792458, -3.7905703, -21.082657, 1.4942267, -3.8119302, -21.10359, 1.489314, -3.7905703, -21.082657, 1.4942267, -3.8119302, -21.219786, 1.5363052, -3.8119302, -21.10359, 1.489314, -3.7905703, -21.082657, 1.4942267, -3.7905703, -21.215515, 1.5574512, -3.8119302, -21.219786, 1.5363052, -3.7905703, -21.224058, 1.5153728, -3.7692103, -21.34047, 1.4933724, -3.7692103, -21.219786, 1.5363052, -3.7905703, -21.224058, 1.5153728, -3.7905703, -21.320818, 1.4850421, -3.7692103, -21.34047, 1.4933724, -3.7692103, -21.219786, 1.5363052, -3.7905703, -21.360119, 1.5019164, -3.7905703, -21.215515, 1.5574512, -3.7692103, -21.219786, 1.5363052, -3.7692103, -21.34047, 1.4933724, -3.7905703, -21.360119, 1.5019164, -3.7905703, -21.215515, 1.5574512, -3.8119302, -21.34047, 1.4933724, -3.8119302, -21.219786, 1.5363052, -3.7905703, -21.215515, 1.5574512, -3.7905703, -21.360119, 1.5019164, -3.8119302, -21.34047, 1.4933724, -3.8119302, -21.219786, 1.5363052, -3.7905703, -21.320818, 1.4850421, -3.7905703, -21.224058, 1.5153728, -3.8119302, -21.219786, 1.5363052, -3.8119302, -21.34047, 1.4933724, -3.7905703, -21.320818, 1.4850421, -3.8458915, -21.320818, 2.7324455, -3.824532, -21.335342, 2.218746, -3.824532, -21.340467, 2.7409892, -3.8458915, -21.320818, 2.7324455, -3.8458915, -21.316118, 2.227717, -3.824532, -21.335342, 2.218746, -3.8458915, -21.316118, 2.227717, -3.824532, -21.210388, 2.199095, -3.824532, -21.335342, 2.218746, -3.8458915, -21.316118, 2.227717, -3.8458915, -21.215515, 2.2200274, -3.824532, -21.210388, 2.199095, -3.824532, -21.340467, 2.7409892, -3.8458915, -21.354778, 2.209775, -3.8458915, -21.360119, 2.7495332, -3.824532, -21.340467, 2.7409892, -3.824532, -21.335342, 2.218746, -3.8458915, -21.354778, 2.209775, -3.824532, -21.335342, 2.218746, -3.8458915, -21.205261, 2.1783762, -3.8458915, -21.354778, 2.209775, -3.824532, -21.335342, 2.218746, -3.824532, -21.210388, 2.199095, -3.8458915, -21.205261, 2.1783762, -3.8458915, -21.360119, 2.7495332, -3.8672514, -21.335342, 2.218746, -3.8672514, -21.340467, 2.7409892, -3.8458915, -21.360119, 2.7495332, -3.8458915, -21.354778, 2.209775, -3.8672514, -21.335342, 2.218746, -3.8458915, -21.354778, 2.209775, -3.8672514, -21.210388, 2.199095, -3.8672514, -21.335342, 2.218746, -3.8458915, -21.354778, 2.209775, -3.8458915, -21.205261, 2.1783762, -3.8672514, -21.210388, 2.199095, -3.8672514, -21.340467, 2.7409892, -3.8458915, -21.316118, 2.227717, -3.8458915, -21.320818, 2.7324455, -3.8672514, -21.340467, 2.7409892, -3.8672514, -21.335342, 2.218746, -3.8458915, -21.316118, 2.227717, -3.8672514, -21.335342, 2.218746, -3.8458915, -21.215515, 2.2200274, -3.8458915, -21.316118, 2.227717, -3.8672514, -21.335342, 2.218746, -3.8672514, -21.210388, 2.199095, -3.8458915, -21.215515, 2.2200274, -3.8458915, -21.215515, 2.2200274, -3.824532, -21.105513, 2.231348, -3.824532, -21.210388, 2.199095, -3.8458915, -21.215515, 2.2200274, -3.8458915, -21.126444, 2.2360473, -3.824532, -21.105513, 2.231348, -3.8458915, -21.126444, 2.2360473, -3.824532, -21.10359, 2.7367172, -3.824532, -21.105513, 2.231348, -3.8458915, -21.126444, 2.2360473, -3.8458915, -21.124308, 2.731591, -3.824532, -21.10359, 2.7367172, -3.8458915, -21.124308, 2.731591, -3.824532, -21.219786, 2.7839222, -3.824532, -21.10359, 2.7367172, -3.8458915, -21.124308, 2.731591, -3.8458915, -21.224058, 2.7629898, -3.824532, -21.219786, 2.7839222, -3.824532, -21.210388, 2.199095, -3.8458915, -21.084793, 2.2268624, -3.8458915, -21.205261, 2.1783762, -3.824532, -21.210388, 2.199095, -3.824532, -21.105513, 2.231348, -3.8458915, -21.084793, 2.2268624, -3.824532, -21.105513, 2.231348, -3.8458915, -21.082657, 2.7418437, -3.8458915, -21.084793, 2.2268624, -3.824532, -21.105513, 2.231348, -3.824532, -21.10359, 2.7367172, -3.8458915, -21.082657, 2.7418437, -3.824532, -21.10359, 2.7367172, -3.8458915, -21.215513, 2.8048546, -3.8458915, -21.082657, 2.7418437, -3.824532, -21.10359, 2.7367172, -3.824532, -21.219786, 2.7839222, -3.8458915, -21.215513, 2.8048546, -3.8458915, -21.205261, 2.1783762, -3.8672514, -21.105513, 2.231348, -3.8672514, -21.210388, 2.199095, -3.8458915, -21.205261, 2.1783762, -3.8458915, -21.084793, 2.2268624, -3.8672514, -21.105513, 2.231348, -3.8672514, -21.210388, 2.199095, -3.8458915, -21.126444, 2.2360473, -3.8458915, -21.215515, 2.2200274, -3.8672514, -21.210388, 2.199095, -3.8672514, -21.105513, 2.231348, -3.8458915, -21.126444, 2.2360473, -3.8672514, -21.105513, 2.231348, -3.8458915, -21.124308, 2.731591, -3.8458915, -21.126444, 2.2360473, -3.8672514, -21.105513, 2.231348, -3.8672514, -21.10359, 2.7367172, -3.8458915, -21.124308, 2.731591, -3.8672514, -21.10359, 2.7367172, -3.8458915, -21.224058, 2.7629898, -3.8458915, -21.124308, 2.731591, -3.8672514, -21.10359, 2.7367172, -3.8672514, -21.219786, 2.7839222, -3.8458915, -21.224058, 2.7629898, -3.8458915, -21.084793, 2.2268624, -3.8672514, -21.10359, 2.7367172, -3.8672514, -21.105513, 2.231348, -3.8458915, -21.084793, 2.2268624, -3.8458915, -21.082657, 2.7418437, -3.8672514, -21.10359, 2.7367172, -3.8458915, -21.082657, 2.7418437, -3.8672514, -21.219786, 2.7839222, -3.8672514, -21.10359, 2.7367172, -3.8458915, -21.082657, 2.7418437, -3.8458915, -21.215513, 2.8048546, -3.8672514, -21.219786, 2.7839222, -3.8458915, -21.224058, 2.7629898, -3.824532, -21.340467, 2.7409892, -3.824532, -21.219786, 2.7839222, -3.8458915, -21.224058, 2.7629898, -3.8458915, -21.320818, 2.7324455, -3.824532, -21.340467, 2.7409892, -3.824532, -21.219786, 2.7839222, -3.8458915, -21.360119, 2.7495332, -3.8458915, -21.215513, 2.8048546, -3.824532, -21.219786, 2.7839222, -3.824532, -21.340467, 2.7409892, -3.8458915, -21.360119, 2.7495332, -3.8458915, -21.215513, 2.8048546, -3.8672514, -21.340467, 2.7409892, -3.8672514, -21.219786, 2.7839222, -3.8458915, -21.215513, 2.8048546, -3.8458915, -21.360119, 2.7495332, -3.8672514, -21.340467, 2.7409892, -3.8672514, -21.219786, 2.7839222, -3.8458915, -21.320818, 2.7324455, -3.8458915, -21.224058, 2.7629898, -3.8672514, -21.219786, 2.7839222, -3.8672514, -21.340467, 2.7409892, -3.8458915, -21.320818, 2.7324455, -3.774764, -21.320818, 2.140356, -3.7534046, -21.335342, 1.6268702, -3.7534046, -21.340467, 2.1489, -3.774764, -21.320818, 2.140356, -3.774764, -21.316118, 1.6358411, -3.7534046, -21.335342, 1.6268702, -3.774764, -21.316118, 1.6358411, -3.7534046, -21.210388, 1.6072192, -3.7534046, -21.335342, 1.6268702, -3.774764, -21.316118, 1.6358411, -3.774764, -21.215515, 1.6279382, -3.7534046, -21.210388, 1.6072192, -3.7534046, -21.340467, 2.1489, -3.774764, -21.35478, 1.6176856, -3.774764, -21.360119, 2.1574438, -3.7534046, -21.340467, 2.1489, -3.7534046, -21.335342, 1.6268702, -3.774764, -21.35478, 1.6176856, -3.7534046, -21.335342, 1.6268702, -3.774764, -21.205261, 1.5865004, -3.774764, -21.35478, 1.6176856, -3.7534046, -21.335342, 1.6268702, -3.7534046, -21.210388, 1.6072192, -3.774764, -21.205261, 1.5865004, -3.774764, -21.360119, 2.1574438, -3.796124, -21.335342, 1.6268702, -3.796124, -21.340467, 2.1489, -3.774764, -21.360119, 2.1574438, -3.774764, -21.35478, 1.6176856, -3.796124, -21.335342, 1.6268702, -3.774764, -21.35478, 1.6176856, -3.796124, -21.210388, 1.6072192, -3.796124, -21.335342, 1.6268702, -3.774764, -21.35478, 1.6176856, -3.774764, -21.205261, 1.5865004, -3.796124, -21.210388, 1.6072192, -3.796124, -21.340467, 2.1489, -3.774764, -21.316118, 1.6358411, -3.774764, -21.320818, 2.140356, -3.796124, -21.340467, 2.1489, -3.796124, -21.335342, 1.6268702, -3.774764, -21.316118, 1.6358411, -3.796124, -21.335342, 1.6268702, -3.774764, -21.215515, 1.6279382, -3.774764, -21.316118, 1.6358411, -3.796124, -21.335342, 1.6268702, -3.796124, -21.210388, 1.6072192, -3.774764, -21.215515, 1.6279382, -3.774764, -21.215515, 1.6279382, -3.7534046, -21.105513, 1.6392586, -3.7534046, -21.210388, 1.6072192, -3.774764, -21.215515, 1.6279382, -3.774764, -21.126446, 1.6439579, -3.7534046, -21.105513, 1.6392586, -3.774764, -21.126446, 1.6439579, -3.7534046, -21.10359, 2.144628, -3.7534046, -21.105513, 1.6392586, -3.774764, -21.126446, 1.6439579, -3.774764, -21.12431, 2.1395016, -3.7534046, -21.10359, 2.144628, -3.774764, -21.12431, 2.1395016, -3.7534046, -21.219786, 2.1918328, -3.7534046, -21.10359, 2.144628, -3.774764, -21.12431, 2.1395016, -3.774764, -21.224058, 2.1709003, -3.7534046, -21.219786, 2.1918328, -3.7534046, -21.210388, 1.6072192, -3.774764, -21.084793, 1.6347731, -3.774764, -21.205261, 1.5865004, -3.7534046, -21.210388, 1.6072192, -3.7534046, -21.105513, 1.6392586, -3.774764, -21.084793, 1.6347731, -3.7534046, -21.105513, 1.6392586, -3.774764, -21.082657, 2.1497543, -3.774764, -21.084793, 1.6347731, -3.7534046, -21.105513, 1.6392586, -3.7534046, -21.10359, 2.144628, -3.774764, -21.082657, 2.1497543, -3.7534046, -21.10359, 2.144628, -3.774764, -21.215515, 2.2127652, -3.774764, -21.082657, 2.1497543, -3.7534046, -21.10359, 2.144628, -3.7534046, -21.219786, 2.1918328, -3.774764, -21.215515, 2.2127652, -3.774764, -21.205261, 1.5865004, -3.796124, -21.105513, 1.6392586, -3.796124, -21.210388, 1.6072192, -3.774764, -21.205261, 1.5865004, -3.774764, -21.084793, 1.6347731, -3.796124, -21.105513, 1.6392586, -3.796124, -21.210388, 1.6072192, -3.774764, -21.126446, 1.6439579, -3.774764, -21.215515, 1.6279382, -3.796124, -21.210388, 1.6072192, -3.796124, -21.105513, 1.6392586, -3.774764, -21.126446, 1.6439579, -3.796124, -21.105513, 1.6392586, -3.774764, -21.12431, 2.1395016, -3.774764, -21.126446, 1.6439579, -3.796124, -21.105513, 1.6392586, -3.796124, -21.10359, 2.144628, -3.774764, -21.12431, 2.1395016, -3.796124, -21.10359, 2.144628, -3.774764, -21.224058, 2.1709003, -3.774764, -21.12431, 2.1395016, -3.796124, -21.10359, 2.144628, -3.796124, -21.219786, 2.1918328, -3.774764, -21.224058, 2.1709003, -3.774764, -21.084793, 1.6347731, -3.796124, -21.10359, 2.144628, -3.796124, -21.105513, 1.6392586, -3.774764, -21.084793, 1.6347731, -3.774764, -21.082657, 2.1497543, -3.796124, -21.10359, 2.144628, -3.774764, -21.082657, 2.1497543, -3.796124, -21.219786, 2.1918328, -3.796124, -21.10359, 2.144628, -3.774764, -21.082657, 2.1497543, -3.774764, -21.215515, 2.2127652, -3.796124, -21.219786, 2.1918328, -3.774764, -21.224058, 2.1709003, -3.7534046, -21.340467, 2.1489, -3.7534046, -21.219786, 2.1918328, -3.774764, -21.224058, 2.1709003, -3.774764, -21.320818, 2.140356, -3.7534046, -21.340467, 2.1489, -3.7534046, -21.219786, 2.1918328, -3.774764, -21.360119, 2.1574438, -3.774764, -21.215515, 2.2127652, -3.7534046, -21.219786, 2.1918328, -3.7534046, -21.340467, 2.1489, -3.774764, -21.360119, 2.1574438, -3.774764, -21.215515, 2.2127652, -3.796124, -21.340467, 2.1489, -3.796124, -21.219786, 2.1918328, -3.774764, -21.215515, 2.2127652, -3.774764, -21.360119, 2.1574438, -3.796124, -21.340467, 2.1489, -3.796124, -21.219786, 2.1918328, -3.774764, -21.320818, 2.140356, -3.774764, -21.224058, 2.1709003, -3.796124, -21.219786, 2.1918328, -3.796124, -21.340467, 2.1489, -3.774764, -21.320818, 2.140356, -7.4558854, -21.333633, -0.46060777, -7.431749, -21.35008, -0.89848065, -7.431749, -21.355635, -0.45334554, -7.4558854, -21.333633, -0.46060777, -7.4558854, -21.328295, -0.89057755, -7.431749, -21.35008, -0.89848065, -7.431749, -21.355635, -0.45334554, -7.4558854, -21.371868, -0.9061701, -7.4558854, -21.37785, -0.4460833, -7.431749, -21.355635, -0.45334554, -7.431749, -21.35008, -0.89848065, -7.4558854, -21.371868, -0.9061701, -7.4558854, -21.37785, -0.4460833, -7.480022, -21.35008, -0.89848065, -7.480022, -21.355635, -0.45334554, -7.4558854, -21.37785, -0.4460833, -7.4558854, -21.371868, -0.9061701, -7.480022, -21.35008, -0.89848065, -7.480022, -21.355635, -0.45334554, -7.4558854, -21.328295, -0.89057755, -7.4558854, -21.333633, -0.46060777, -7.480022, -21.355635, -0.45334554, -7.480022, -21.35008, -0.89848065, -7.4558854, -21.328295, -0.89057755, -7.4558854, -21.328295, -0.89057755, -7.431749, -21.208895, -0.9149277, -7.431749, -21.35008, -0.89848065, -7.4558854, -21.328295, -0.89057755, -7.4558854, -21.21466, -0.8974128, -7.431749, -21.208895, -0.9149277, -7.431749, -21.35008, -0.89848065, -7.4558854, -21.20334, -0.9326565, -7.4558854, -21.371868, -0.9061701, -7.431749, -21.35008, -0.89848065, -7.431749, -21.208895, -0.9149277, -7.4558854, -21.20334, -0.9326565, -7.4558854, -21.371868, -0.9061701, -7.480022, -21.208895, -0.9149277, -7.480022, -21.35008, -0.89848065, -7.4558854, -21.371868, -0.9061701, -7.4558854, -21.20334, -0.9326565, -7.480022, -21.208895, -0.9149277, -7.480022, -21.35008, -0.89848065, -7.4558854, -21.21466, -0.8974128, -7.4558854, -21.328295, -0.89057755, -7.480022, -21.35008, -0.89848065, -7.480022, -21.208895, -0.9149277, -7.4558854, -21.21466, -0.8974128, -7.4558854, -21.21466, -0.8974128, -7.431749, -21.090775, -0.88758755, -7.431749, -21.208895, -0.9149277, -7.4558854, -21.21466, -0.8974128, -7.4558854, -21.114271, -0.8837426, -7.431749, -21.090775, -0.88758755, -7.431749, -21.208895, -0.9149277, -7.4558854, -21.06728, -0.89164567, -7.4558854, -21.20334, -0.9326565, -7.431749, -21.208895, -0.9149277, -7.431749, -21.090775, -0.88758755, -7.4558854, -21.06728, -0.89164567, -7.4558854, -21.20334, -0.9326565, -7.480022, -21.090775, -0.88758755, -7.480022, -21.208895, -0.9149277, -7.4558854, -21.20334, -0.9326565, -7.4558854, -21.06728, -0.89164567, -7.480022, -21.090775, -0.88758755, -7.480022, -21.208895, -0.9149277, -7.4558854, -21.114271, -0.8837426, -7.4558854, -21.21466, -0.8974128, -7.480022, -21.208895, -0.9149277, -7.480022, -21.090775, -0.88758755, -7.4558854, -21.114271, -0.8837426, -7.4558854, -21.114271, -0.8837426, -7.431749, -21.088425, -0.45697713, -7.431749, -21.090775, -0.88758755, -7.4558854, -21.114271, -0.8837426, -7.4558854, -21.111708, -0.46124887, -7.431749, -21.088425, -0.45697713, -7.4558854, -21.111708, -0.46124887, -7.431749, -21.219574, -0.416821, -7.431749, -21.088425, -0.45697713, -7.4558854, -21.111708, -0.46124887, -7.4558854, -21.224487, -0.43454933, -7.431749, -21.219574, -0.416821, -7.431749, -21.090775, -0.88758755, -7.4558854, -21.06493, -0.45249128, -7.4558854, -21.06728, -0.89164567, -7.431749, -21.090775, -0.88758755, -7.431749, -21.088425, -0.45697713, -7.4558854, -21.06493, -0.45249128, -7.431749, -21.088425, -0.45697713, -7.4558854, -21.214874, -0.39887857, -7.4558854, -21.06493, -0.45249128, -7.431749, -21.088425, -0.45697713, -7.431749, -21.219574, -0.416821, -7.4558854, -21.214874, -0.39887857, -7.4558854, -21.06728, -0.89164567, -7.480022, -21.088425, -0.45697713, -7.480022, -21.090775, -0.88758755, -7.4558854, -21.06728, -0.89164567, -7.4558854, -21.06493, -0.45249128, -7.480022, -21.088425, -0.45697713, -7.4558854, -21.06493, -0.45249128, -7.480022, -21.219574, -0.416821, -7.480022, -21.088425, -0.45697713, -7.4558854, -21.06493, -0.45249128, -7.4558854, -21.214874, -0.39887857, -7.480022, -21.219574, -0.416821, -7.480022, -21.090775, -0.88758755, -7.4558854, -21.111708, -0.46124887, -7.4558854, -21.114271, -0.8837426, -7.480022, -21.090775, -0.88758755, -7.480022, -21.088425, -0.45697713, -7.4558854, -21.111708, -0.46124887, -7.480022, -21.088425, -0.45697713, -7.4558854, -21.224487, -0.43454933, -7.4558854, -21.111708, -0.46124887, -7.480022, -21.088425, -0.45697713, -7.480022, -21.219574, -0.416821, -7.4558854, -21.224487, -0.43454933, -7.4558854, -21.224487, -0.43454933, -7.431749, -21.355635, -0.45334554, -7.431749, -21.219574, -0.416821, -7.4558854, -21.224487, -0.43454933, -7.4558854, -21.333633, -0.46060777, -7.431749, -21.355635, -0.45334554, -7.431749, -21.219574, -0.416821, -7.4558854, -21.37785, -0.4460833, -7.4558854, -21.214874, -0.39887857, -7.431749, -21.219574, -0.416821, -7.431749, -21.355635, -0.45334554, -7.4558854, -21.37785, -0.4460833, -7.4558854, -21.214874, -0.39887857, -7.480022, -21.355635, -0.45334554, -7.480022, -21.219574, -0.416821, -7.4558854, -21.214874, -0.39887857, -7.4558854, -21.37785, -0.4460833, -7.480022, -21.355635, -0.45334554, -7.480022, -21.219574, -0.416821, -7.4558854, -21.333633, -0.46060777, -7.4558854, -21.224487, -0.43454933, -7.480022, -21.219574, -0.416821, -7.480022, -21.355635, -0.45334554, -7.4558854, -21.333633, -0.46060777, -3.8775039, -21.320818, 0.85066056, -3.8561444, -21.335342, 0.33696115, -3.8561444, -21.34047, 0.85920453, -3.8775039, -21.320818, 0.85066056, -3.8775039, -21.316118, 0.34593213, -3.8561444, -21.335342, 0.33696115, -3.8775039, -21.316118, 0.34593213, -3.8561444, -21.210388, 0.31752384, -3.8561444, -21.335342, 0.33696115, -3.8775039, -21.316118, 0.34593213, -3.8775039, -21.215515, 0.33824265, -3.8561444, -21.210388, 0.31752384, -3.8561444, -21.34047, 0.85920453, -3.8775039, -21.35478, 0.32799017, -3.8775039, -21.360119, 0.8677484, -3.8561444, -21.34047, 0.85920453, -3.8561444, -21.335342, 0.33696115, -3.8775039, -21.35478, 0.32799017, -3.8561444, -21.335342, 0.33696115, -3.8775039, -21.205263, 0.29680502, -3.8775039, -21.35478, 0.32799017, -3.8561444, -21.335342, 0.33696115, -3.8561444, -21.210388, 0.31752384, -3.8775039, -21.205263, 0.29680502, -3.8775039, -21.360119, 0.8677484, -3.8988638, -21.335342, 0.33696115, -3.8988638, -21.34047, 0.85920453, -3.8775039, -21.360119, 0.8677484, -3.8775039, -21.35478, 0.32799017, -3.8988638, -21.335342, 0.33696115, -3.8775039, -21.35478, 0.32799017, -3.8988638, -21.210388, 0.31752384, -3.8988638, -21.335342, 0.33696115, -3.8775039, -21.35478, 0.32799017, -3.8775039, -21.205263, 0.29680502, -3.8988638, -21.210388, 0.31752384, -3.8988638, -21.34047, 0.85920453, -3.8775039, -21.316118, 0.34593213, -3.8775039, -21.320818, 0.85066056, -3.8988638, -21.34047, 0.85920453, -3.8988638, -21.335342, 0.33696115, -3.8775039, -21.316118, 0.34593213, -3.8988638, -21.335342, 0.33696115, -3.8775039, -21.215515, 0.33824265, -3.8775039, -21.316118, 0.34593213, -3.8988638, -21.335342, 0.33696115, -3.8988638, -21.210388, 0.31752384, -3.8775039, -21.215515, 0.33824265, -3.8775039, -21.215515, 0.33824265, -3.8561444, -21.105513, 0.34956324, -3.8561444, -21.210388, 0.31752384, -3.8775039, -21.215515, 0.33824265, -3.8775039, -21.126446, 0.35404897, -3.8561444, -21.105513, 0.34956324, -3.8775039, -21.126446, 0.35404897, -3.8561444, -21.10359, 0.85493267, -3.8561444, -21.105513, 0.34956324, -3.8775039, -21.126446, 0.35404897, -3.8775039, -21.12431, 0.8498062, -3.8561444, -21.10359, 0.85493267, -3.8775039, -21.12431, 0.8498062, -3.8561444, -21.219788, 0.9021374, -3.8561444, -21.10359, 0.85493267, -3.8775039, -21.12431, 0.8498062, -3.8775039, -21.224058, 0.88120484, -3.8561444, -21.219788, 0.9021374, -3.8561444, -21.210388, 0.31752384, -3.8775039, -21.084793, 0.34507775, -3.8775039, -21.205263, 0.29680502, -3.8561444, -21.210388, 0.31752384, -3.8561444, -21.105513, 0.34956324, -3.8775039, -21.084793, 0.34507775, -3.8561444, -21.105513, 0.34956324, -3.8775039, -21.082657, 0.8600589, -3.8775039, -21.084793, 0.34507775, -3.8561444, -21.105513, 0.34956324, -3.8561444, -21.10359, 0.85493267, -3.8775039, -21.082657, 0.8600589, -3.8561444, -21.10359, 0.85493267, -3.8775039, -21.215515, 0.92306983, -3.8775039, -21.082657, 0.8600589, -3.8561444, -21.10359, 0.85493267, -3.8561444, -21.219788, 0.9021374, -3.8775039, -21.215515, 0.92306983, -3.8775039, -21.205263, 0.29680502, -3.8988638, -21.105513, 0.34956324, -3.8988638, -21.210388, 0.31752384, -3.8775039, -21.205263, 0.29680502, -3.8775039, -21.084793, 0.34507775, -3.8988638, -21.105513, 0.34956324, -3.8988638, -21.210388, 0.31752384, -3.8775039, -21.126446, 0.35404897, -3.8775039, -21.215515, 0.33824265, -3.8988638, -21.210388, 0.31752384, -3.8988638, -21.105513, 0.34956324, -3.8775039, -21.126446, 0.35404897, -3.8988638, -21.105513, 0.34956324, -3.8775039, -21.12431, 0.8498062, -3.8775039, -21.126446, 0.35404897, -3.8988638, -21.105513, 0.34956324, -3.8988638, -21.10359, 0.85493267, -3.8775039, -21.12431, 0.8498062, -3.8988638, -21.10359, 0.85493267, -3.8775039, -21.224058, 0.88120484, -3.8775039, -21.12431, 0.8498062, -3.8988638, -21.10359, 0.85493267, -3.8988638, -21.219788, 0.9021374, -3.8775039, -21.224058, 0.88120484, -3.8775039, -21.084793, 0.34507775, -3.8988638, -21.10359, 0.85493267, -3.8988638, -21.105513, 0.34956324, -3.8775039, -21.084793, 0.34507775, -3.8775039, -21.082657, 0.8600589, -3.8988638, -21.10359, 0.85493267, -3.8775039, -21.082657, 0.8600589, -3.8988638, -21.219788, 0.9021374, -3.8988638, -21.10359, 0.85493267, -3.8775039, -21.082657, 0.8600589, -3.8775039, -21.215515, 0.92306983, -3.8988638, -21.219788, 0.9021374, -3.8775039, -21.224058, 0.88120484, -3.8561444, -21.34047, 0.85920453, -3.8561444, -21.219788, 0.9021374, -3.8775039, -21.224058, 0.88120484, -3.8775039, -21.320818, 0.85066056, -3.8561444, -21.34047, 0.85920453, -3.8561444, -21.219788, 0.9021374, -3.8775039, -21.360119, 0.8677484, -3.8775039, -21.215515, 0.92306983, -3.8561444, -21.219788, 0.9021374, -3.8561444, -21.34047, 0.85920453, -3.8775039, -21.360119, 0.8677484, -3.8775039, -21.215515, 0.92306983, -3.8988638, -21.34047, 0.85920453, -3.8988638, -21.219788, 0.9021374, -3.8775039, -21.215515, 0.92306983, -3.8775039, -21.360119, 0.8677484, -3.8988638, -21.34047, 0.85920453, -3.8988638, -21.219788, 0.9021374, -3.8775039, -21.320818, 0.85066056, -3.8775039, -21.224058, 0.88120484, -3.8988638, -21.219788, 0.9021374, -3.8988638, -21.34047, 0.85920453, -3.8775039, -21.320818, 0.85066056, -3.7194428, -21.320816, 3.3595648, -3.698083, -21.335342, 2.8460789, -3.698083, -21.340467, 3.3681085, -3.7194428, -21.320816, 3.3595648, -3.7194428, -21.316118, 2.8550498, -3.698083, -21.335342, 2.8460789, -3.7194428, -21.316118, 2.8550498, -3.698083, -21.210388, 2.826428, -3.698083, -21.335342, 2.8460789, -3.7194428, -21.316118, 2.8550498, -3.7194428, -21.215513, 2.8471467, -3.698083, -21.210388, 2.826428, -3.698083, -21.340467, 3.3681085, -3.7194428, -21.354778, 2.836894, -3.7194428, -21.360119, 3.3768659, -3.698083, -21.340467, 3.3681085, -3.698083, -21.335342, 2.8460789, -3.7194428, -21.354778, 2.836894, -3.698083, -21.335342, 2.8460789, -3.7194428, -21.205261, 2.805709, -3.7194428, -21.354778, 2.836894, -3.698083, -21.335342, 2.8460789, -3.698083, -21.210388, 2.826428, -3.7194428, -21.205261, 2.805709, -3.7194428, -21.360119, 3.3768659, -3.7408023, -21.335342, 2.8460789, -3.7408023, -21.340467, 3.3681085, -3.7194428, -21.360119, 3.3768659, -3.7194428, -21.354778, 2.836894, -3.7408023, -21.335342, 2.8460789, -3.7194428, -21.354778, 2.836894, -3.7408023, -21.210388, 2.826428, -3.7408023, -21.335342, 2.8460789, -3.7194428, -21.354778, 2.836894, -3.7194428, -21.205261, 2.805709, -3.7408023, -21.210388, 2.826428, -3.7408023, -21.340467, 3.3681085, -3.7194428, -21.316118, 2.8550498, -3.7194428, -21.320816, 3.3595648, -3.7408023, -21.340467, 3.3681085, -3.7408023, -21.335342, 2.8460789, -3.7194428, -21.316118, 2.8550498, -3.7408023, -21.335342, 2.8460789, -3.7194428, -21.215513, 2.8471467, -3.7194428, -21.316118, 2.8550498, -3.7408023, -21.335342, 2.8460789, -3.7408023, -21.210388, 2.826428, -3.7194428, -21.215513, 2.8471467, -3.7194428, -21.215513, 2.8471467, -3.698083, -21.105513, 2.8586807, -3.698083, -21.210388, 2.826428, -3.7194428, -21.215513, 2.8471467, -3.7194428, -21.126444, 2.8631663, -3.698083, -21.105513, 2.8586807, -3.7194428, -21.126444, 2.8631663, -3.698083, -21.10359, 3.3640501, -3.698083, -21.105513, 2.8586807, -3.7194428, -21.126444, 2.8631663, -3.7194428, -21.124308, 3.358924, -3.698083, -21.10359, 3.3640501, -3.7194428, -21.124308, 3.358924, -3.698083, -21.219786, 3.411255, -3.698083, -21.10359, 3.3640501, -3.7194428, -21.124308, 3.358924, -3.7194428, -21.224058, 3.3903227, -3.698083, -21.219786, 3.411255, -3.698083, -21.210388, 2.826428, -3.7194428, -21.084793, 2.8539817, -3.7194428, -21.205261, 2.805709, -3.698083, -21.210388, 2.826428, -3.698083, -21.105513, 2.8586807, -3.7194428, -21.084793, 2.8539817, -3.698083, -21.105513, 2.8586807, -3.7194428, -21.082657, 3.3691764, -3.7194428, -21.084793, 2.8539817, -3.698083, -21.105513, 2.8586807, -3.698083, -21.10359, 3.3640501, -3.7194428, -21.082657, 3.3691764, -3.698083, -21.10359, 3.3640501, -3.7194428, -21.215513, 3.431974, -3.7194428, -21.082657, 3.3691764, -3.698083, -21.10359, 3.3640501, -3.698083, -21.219786, 3.411255, -3.7194428, -21.215513, 3.431974, -3.7194428, -21.205261, 2.805709, -3.7408023, -21.105513, 2.8586807, -3.7408023, -21.210388, 2.826428, -3.7194428, -21.205261, 2.805709, -3.7194428, -21.084793, 2.8539817, -3.7408023, -21.105513, 2.8586807, -3.7408023, -21.210388, 2.826428, -3.7194428, -21.126444, 2.8631663, -3.7194428, -21.215513, 2.8471467, -3.7408023, -21.210388, 2.826428, -3.7408023, -21.105513, 2.8586807, -3.7194428, -21.126444, 2.8631663, -3.7408023, -21.105513, 2.8586807, -3.7194428, -21.124308, 3.358924, -3.7194428, -21.126444, 2.8631663, -3.7408023, -21.105513, 2.8586807, -3.7408023, -21.10359, 3.3640501, -3.7194428, -21.124308, 3.358924, -3.7408023, -21.10359, 3.3640501, -3.7194428, -21.224058, 3.3903227, -3.7194428, -21.124308, 3.358924, -3.7408023, -21.10359, 3.3640501, -3.7408023, -21.219786, 3.411255, -3.7194428, -21.224058, 3.3903227, -3.7194428, -21.084793, 2.8539817, -3.7408023, -21.10359, 3.3640501, -3.7408023, -21.105513, 2.8586807, -3.7194428, -21.084793, 2.8539817, -3.7194428, -21.082657, 3.3691764, -3.7408023, -21.10359, 3.3640501, -3.7194428, -21.082657, 3.3691764, -3.7408023, -21.219786, 3.411255, -3.7408023, -21.10359, 3.3640501, -3.7194428, -21.082657, 3.3691764, -3.7194428, -21.215513, 3.431974, -3.7408023, -21.219786, 3.411255, -3.7194428, -21.224058, 3.3903227, -3.698083, -21.340467, 3.3681085, -3.698083, -21.219786, 3.411255, -3.7194428, -21.224058, 3.3903227, -3.7194428, -21.320816, 3.3595648, -3.698083, -21.340467, 3.3681085, -3.698083, -21.219786, 3.411255, -3.7194428, -21.360119, 3.3768659, -3.7194428, -21.215513, 3.431974, -3.698083, -21.219786, 3.411255, -3.698083, -21.340467, 3.3681085, -3.7194428, -21.360119, 3.3768659, -3.7194428, -21.215513, 3.431974, -3.7408023, -21.340467, 3.3681085, -3.7408023, -21.219786, 3.411255, -3.7194428, -21.215513, 3.431974, -3.7194428, -21.360119, 3.3768659, -3.7408023, -21.340467, 3.3681085, -3.7408023, -21.219786, 3.411255, -3.7194428, -21.320816, 3.3595648, -3.7194428, -21.224058, 3.3903227, -3.7408023, -21.219786, 3.411255, -3.7408023, -21.340467, 3.3681085, -3.7194428, -21.320816, 3.3595648, -7.4172244, -21.333633, 4.035811, -7.393088, -21.35008, 3.6370263, -7.393088, -21.355633, 4.0424323, -7.4172244, -21.333633, 4.035811, -7.4172244, -21.328293, 3.6438615, -7.393088, -21.35008, 3.6370263, -7.393088, -21.355633, 4.0424323, -7.4172244, -21.371866, 3.6299777, -7.4172244, -21.377848, 4.049054, -7.393088, -21.355633, 4.0424323, -7.393088, -21.35008, 3.6370263, -7.4172244, -21.371866, 3.6299777, -7.4172244, -21.377848, 4.049054, -7.441361, -21.35008, 3.6370263, -7.441361, -21.355633, 4.0424323, -7.4172244, -21.377848, 4.049054, -7.4172244, -21.371866, 3.6299777, -7.441361, -21.35008, 3.6370263, -7.441361, -21.355633, 4.0424323, -7.4172244, -21.328293, 3.6438615, -7.4172244, -21.333633, 4.035811, -7.441361, -21.355633, 4.0424323, -7.441361, -21.35008, 3.6370263, -7.4172244, -21.328293, 3.6438615, -7.4172244, -21.328293, 3.6438615, -7.393088, -21.208893, 3.621861, -7.393088, -21.35008, 3.6370263, -7.4172244, -21.328293, 3.6438615, -7.4172244, -21.214659, 3.6378808, -7.393088, -21.208893, 3.621861, -7.393088, -21.35008, 3.6370263, -7.4172244, -21.203339, 3.6056278, -7.4172244, -21.371866, 3.6299777, -7.393088, -21.35008, 3.6370263, -7.393088, -21.208893, 3.621861, -7.4172244, -21.203339, 3.6056278, -7.4172244, -21.371866, 3.6299777, -7.441361, -21.208893, 3.621861, -7.441361, -21.35008, 3.6370263, -7.4172244, -21.371866, 3.6299777, -7.4172244, -21.203339, 3.6056278, -7.441361, -21.208893, 3.621861, -7.441361, -21.35008, 3.6370263, -7.4172244, -21.214659, 3.6378808, -7.4172244, -21.328293, 3.6438615, -7.441361, -21.35008, 3.6370263, -7.441361, -21.208893, 3.621861, -7.4172244, -21.214659, 3.6378808, -7.4172244, -21.214659, 3.6378808, -7.393088, -21.090773, 3.6466384, -7.393088, -21.208893, 3.621861, -7.4172244, -21.214659, 3.6378808, -7.4172244, -21.11427, 3.6502695, -7.393088, -21.090773, 3.6466384, -7.393088, -21.208893, 3.621861, -7.4172244, -21.067278, 3.6432207, -7.4172244, -21.203339, 3.6056278, -7.393088, -21.208893, 3.621861, -7.393088, -21.090773, 3.6466384, -7.4172244, -21.067278, 3.6432207, -7.4172244, -21.203339, 3.6056278, -7.441361, -21.090773, 3.6466384, -7.441361, -21.208893, 3.621861, -7.4172244, -21.203339, 3.6056278, -7.4172244, -21.067278, 3.6432207, -7.441361, -21.090773, 3.6466384, -7.441361, -21.208893, 3.621861, -7.4172244, -21.11427, 3.6502695, -7.4172244, -21.214659, 3.6378808, -7.441361, -21.208893, 3.621861, -7.441361, -21.090773, 3.6466384, -7.4172244, -21.11427, 3.6502695, -7.4172244, -21.11427, 3.6502695, -7.393088, -21.088425, 4.0392284, -7.393088, -21.090773, 3.6466384, -7.4172244, -21.11427, 3.6502695, -7.4172244, -21.111706, 4.03517, -7.393088, -21.088425, 4.0392284, -7.393088, -21.090773, 3.6466384, -7.4172244, -21.064928, 4.043073, -7.4172244, -21.067278, 3.6432207, -7.393088, -21.090773, 3.6466384, -7.393088, -21.088425, 4.0392284, -7.4172244, -21.064928, 4.043073, -7.4172244, -21.067278, 3.6432207, -7.441361, -21.088425, 4.0392284, -7.441361, -21.090773, 3.6466384, -7.4172244, -21.067278, 3.6432207, -7.4172244, -21.064928, 4.043073, -7.441361, -21.088425, 4.0392284, -7.441361, -21.090773, 3.6466384, -7.4172244, -21.111706, 4.03517, -7.4172244, -21.11427, 3.6502695, -7.441361, -21.090773, 3.6466384, -7.441361, -21.088425, 4.0392284, -7.4172244, -21.111706, 4.03517, -7.4172244, -21.111706, 4.03517, -7.393088, -21.219572, 4.0757537, -7.393088, -21.088425, 4.0392284, -7.4172244, -21.111706, 4.03517, -7.4172244, -21.224485, 4.0595202, -7.393088, -21.219572, 4.0757537, -7.393088, -21.088425, 4.0392284, -7.4172244, -21.214872, 4.0919867, -7.4172244, -21.064928, 4.043073, -7.393088, -21.088425, 4.0392284, -7.393088, -21.219572, 4.0757537, -7.4172244, -21.214872, 4.0919867, -7.4172244, -21.064928, 4.043073, -7.441361, -21.219572, 4.0757537, -7.441361, -21.088425, 4.0392284, -7.4172244, -21.064928, 4.043073, -7.4172244, -21.214872, 4.0919867, -7.441361, -21.219572, 4.0757537, -7.441361, -21.088425, 4.0392284, -7.4172244, -21.224485, 4.0595202, -7.4172244, -21.111706, 4.03517, -7.441361, -21.088425, 4.0392284, -7.441361, -21.219572, 4.0757537, -7.4172244, -21.224485, 4.0595202, -7.4172244, -21.224485, 4.0595202, -7.393088, -21.355633, 4.0424323, -7.393088, -21.219572, 4.0757537, -7.4172244, -21.224485, 4.0595202, -7.4172244, -21.333633, 4.035811, -7.393088, -21.355633, 4.0424323, -7.393088, -21.219572, 4.0757537, -7.4172244, -21.377848, 4.049054, -7.4172244, -21.214872, 4.0919867, -7.393088, -21.219572, 4.0757537, -7.393088, -21.355633, 4.0424323, -7.4172244, -21.377848, 4.049054, -7.4172244, -21.214872, 4.0919867, -7.441361, -21.355633, 4.0424323, -7.441361, -21.219572, 4.0757537, -7.4172244, -21.214872, 4.0919867, -7.4172244, -21.377848, 4.049054, -7.441361, -21.355633, 4.0424323, -7.441361, -21.219572, 4.0757537, -7.4172244, -21.333633, 4.035811, -7.4172244, -21.224485, 4.0595202, -7.441361, -21.219572, 4.0757537, -7.441361, -21.355633, 4.0424323, -7.4172244, -21.333633, 4.035811, -7.4558854, -21.333632, 4.726582, -7.431749, -21.350079, 4.2887096, -7.431749, -21.355633, 4.7338443, -7.4558854, -21.333632, 4.726582, -7.4558854, -21.328293, 4.2966127, -7.431749, -21.350079, 4.2887096, -7.431749, -21.355633, 4.7338443, -7.4558854, -21.371866, 4.281234, -7.4558854, -21.377846, 4.7411065, -7.431749, -21.355633, 4.7338443, -7.431749, -21.350079, 4.2887096, -7.4558854, -21.371866, 4.281234, -7.4558854, -21.377846, 4.7411065, -7.480022, -21.350079, 4.2887096, -7.480022, -21.355633, 4.7338443, -7.4558854, -21.377846, 4.7411065, -7.4558854, -21.371866, 4.281234, -7.480022, -21.350079, 4.2887096, -7.480022, -21.355633, 4.7338443, -7.4558854, -21.328293, 4.2966127, -7.4558854, -21.333632, 4.726582, -7.480022, -21.355633, 4.7338443, -7.480022, -21.350079, 4.2887096, -7.4558854, -21.328293, 4.2966127, -7.4558854, -21.328293, 4.2966127, -7.431749, -21.208893, 4.272262, -7.431749, -21.350079, 4.2887096, -7.4558854, -21.328293, 4.2966127, -7.4558854, -21.214659, 4.2899904, -7.431749, -21.208893, 4.272262, -7.431749, -21.350079, 4.2887096, -7.4558854, -21.203339, 4.254534, -7.4558854, -21.371866, 4.281234, -7.431749, -21.350079, 4.2887096, -7.431749, -21.208893, 4.272262, -7.4558854, -21.203339, 4.254534, -7.4558854, -21.371866, 4.281234, -7.480022, -21.208893, 4.272262, -7.480022, -21.350079, 4.2887096, -7.4558854, -21.371866, 4.281234, -7.4558854, -21.203339, 4.254534, -7.480022, -21.208893, 4.272262, -7.480022, -21.350079, 4.2887096, -7.4558854, -21.214659, 4.2899904, -7.4558854, -21.328293, 4.2966127, -7.480022, -21.350079, 4.2887096, -7.480022, -21.208893, 4.272262, -7.4558854, -21.214659, 4.2899904, -7.4558854, -21.214659, 4.2899904, -7.431749, -21.090773, 4.2996025, -7.431749, -21.208893, 4.272262, -7.4558854, -21.214659, 4.2899904, -7.4558854, -21.11427, 4.3034472, -7.431749, -21.090773, 4.2996025, -7.431749, -21.208893, 4.272262, -7.4558854, -21.067278, 4.295544, -7.4558854, -21.203339, 4.254534, -7.431749, -21.208893, 4.272262, -7.431749, -21.090773, 4.2996025, -7.4558854, -21.067278, 4.295544, -7.4558854, -21.203339, 4.254534, -7.480022, -21.090773, 4.2996025, -7.480022, -21.208893, 4.272262, -7.4558854, -21.203339, 4.254534, -7.4558854, -21.067278, 4.295544, -7.480022, -21.090773, 4.2996025, -7.480022, -21.208893, 4.272262, -7.4558854, -21.11427, 4.3034472, -7.4558854, -21.214659, 4.2899904, -7.480022, -21.208893, 4.272262, -7.480022, -21.090773, 4.2996025, -7.4558854, -21.11427, 4.3034472, -7.4558854, -21.11427, 4.3034472, -7.431749, -21.088423, 4.730213, -7.431749, -21.090773, 4.2996025, -7.4558854, -21.11427, 4.3034472, -7.4558854, -21.111706, 4.7259407, -7.431749, -21.088423, 4.730213, -7.4558854, -21.111706, 4.7259407, -7.431749, -21.219572, 4.770369, -7.431749, -21.088423, 4.730213, -7.4558854, -21.111706, 4.7259407, -7.4558854, -21.224485, 4.7526407, -7.431749, -21.219572, 4.770369, -7.431749, -21.090773, 4.2996025, -7.4558854, -21.064928, 4.7346983, -7.4558854, -21.067278, 4.295544, -7.431749, -21.090773, 4.2996025, -7.431749, -21.088423, 4.730213, -7.4558854, -21.064928, 4.7346983, -7.431749, -21.088423, 4.730213, -7.4558854, -21.214872, 4.788311, -7.4558854, -21.064928, 4.7346983, -7.431749, -21.088423, 4.730213, -7.431749, -21.219572, 4.770369, -7.4558854, -21.214872, 4.788311, -7.4558854, -21.067278, 4.295544, -7.480022, -21.088423, 4.730213, -7.480022, -21.090773, 4.2996025, -7.4558854, -21.067278, 4.295544, -7.4558854, -21.064928, 4.7346983, -7.480022, -21.088423, 4.730213, -7.4558854, -21.064928, 4.7346983, -7.480022, -21.219572, 4.770369, -7.480022, -21.088423, 4.730213, -7.4558854, -21.064928, 4.7346983, -7.4558854, -21.214872, 4.788311, -7.480022, -21.219572, 4.770369, -7.480022, -21.090773, 4.2996025, -7.4558854, -21.111706, 4.7259407, -7.4558854, -21.11427, 4.3034472, -7.480022, -21.090773, 4.2996025, -7.480022, -21.088423, 4.730213, -7.4558854, -21.111706, 4.7259407, -7.480022, -21.088423, 4.730213, -7.4558854, -21.224485, 4.7526407, -7.4558854, -21.111706, 4.7259407, -7.480022, -21.088423, 4.730213, -7.480022, -21.219572, 4.770369, -7.4558854, -21.224485, 4.7526407, -7.4558854, -21.224485, 4.7526407, -7.431749, -21.355633, 4.7338443, -7.431749, -21.219572, 4.770369, -7.4558854, -21.224485, 4.7526407, -7.4558854, -21.333632, 4.726582, -7.431749, -21.355633, 4.7338443, -7.431749, -21.219572, 4.770369, -7.4558854, -21.377846, 4.7411065, -7.4558854, -21.214872, 4.788311, -7.431749, -21.219572, 4.770369, -7.431749, -21.355633, 4.7338443, -7.4558854, -21.377846, 4.7411065, -7.4558854, -21.214872, 4.788311, -7.480022, -21.355633, 4.7338443, -7.480022, -21.219572, 4.770369, -7.4558854, -21.214872, 4.788311, -7.4558854, -21.377846, 4.7411065, -7.480022, -21.355633, 4.7338443, -7.480022, -21.219572, 4.770369, -7.4558854, -21.333632, 4.726582, -7.4558854, -21.224485, 4.7526407, -7.480022, -21.219572, 4.770369, -7.480022, -21.355633, 4.7338443, -7.4558854, -21.333632, 4.726582, -3.7589583, -21.320816, 4.7411065, -3.7375984, -21.33534, 4.2274075, -3.7375984, -21.340467, 4.7496505, -3.7589583, -21.320816, 4.7411065, -3.7589583, -21.316118, 4.236378, -3.7375984, -21.33534, 4.2274075, -3.7589583, -21.316118, 4.236378, -3.7375984, -21.210388, 4.2079697, -3.7375984, -21.33534, 4.2274075, -3.7589583, -21.316118, 4.236378, -3.7589583, -21.215513, 4.2284746, -3.7375984, -21.210388, 4.2079697, -3.7375984, -21.340467, 4.7496505, -3.7589583, -21.354778, 4.2184362, -3.7589583, -21.360119, 4.758194, -3.7375984, -21.340467, 4.7496505, -3.7375984, -21.33534, 4.2274075, -3.7589583, -21.354778, 4.2184362, -3.7375984, -21.33534, 4.2274075, -3.7589583, -21.205261, 4.1870375, -3.7589583, -21.354778, 4.2184362, -3.7375984, -21.33534, 4.2274075, -3.7375984, -21.210388, 4.2079697, -3.7589583, -21.205261, 4.1870375, -3.7589583, -21.360119, 4.758194, -3.7803178, -21.33534, 4.2274075, -3.7803178, -21.340467, 4.7496505, -3.7589583, -21.360119, 4.758194, -3.7589583, -21.354778, 4.2184362, -3.7803178, -21.33534, 4.2274075, -3.7589583, -21.354778, 4.2184362, -3.7803178, -21.210388, 4.2079697, -3.7803178, -21.33534, 4.2274075, -3.7589583, -21.354778, 4.2184362, -3.7589583, -21.205261, 4.1870375, -3.7803178, -21.210388, 4.2079697, -3.7803178, -21.340467, 4.7496505, -3.7589583, -21.316118, 4.236378, -3.7589583, -21.320816, 4.7411065, -3.7803178, -21.340467, 4.7496505, -3.7803178, -21.33534, 4.2274075, -3.7589583, -21.316118, 4.236378, -3.7803178, -21.33534, 4.2274075, -3.7589583, -21.215513, 4.2284746, -3.7589583, -21.316118, 4.236378, -3.7803178, -21.33534, 4.2274075, -3.7803178, -21.210388, 4.2079697, -3.7589583, -21.215513, 4.2284746, -3.7589583, -21.215513, 4.2284746, -3.7375984, -21.10551, 4.2400093, -3.7375984, -21.210388, 4.2079697, -3.7589583, -21.215513, 4.2284746, -3.7589583, -21.126444, 4.2444944, -3.7375984, -21.10551, 4.2400093, -3.7589583, -21.126444, 4.2444944, -3.7375984, -21.103588, 4.7453785, -3.7375984, -21.10551, 4.2400093, -3.7589583, -21.126444, 4.2444944, -3.7589583, -21.124308, 4.740252, -3.7375984, -21.103588, 4.7453785, -3.7589583, -21.124308, 4.740252, -3.7375984, -21.219786, 4.7925835, -3.7375984, -21.103588, 4.7453785, -3.7589583, -21.124308, 4.740252, -3.7589583, -21.224058, 4.7716503, -3.7375984, -21.219786, 4.7925835, -3.7375984, -21.210388, 4.2079697, -3.7589583, -21.084793, 4.23531, -3.7589583, -21.205261, 4.1870375, -3.7375984, -21.210388, 4.2079697, -3.7375984, -21.10551, 4.2400093, -3.7589583, -21.084793, 4.23531, -3.7375984, -21.10551, 4.2400093, -3.7589583, -21.082657, 4.7505045, -3.7589583, -21.084793, 4.23531, -3.7375984, -21.10551, 4.2400093, -3.7375984, -21.103588, 4.7453785, -3.7589583, -21.082657, 4.7505045, -3.7375984, -21.103588, 4.7453785, -3.7589583, -21.215513, 4.8135157, -3.7589583, -21.082657, 4.7505045, -3.7375984, -21.103588, 4.7453785, -3.7375984, -21.219786, 4.7925835, -3.7589583, -21.215513, 4.8135157, -3.7589583, -21.205261, 4.1870375, -3.7803178, -21.10551, 4.2400093, -3.7803178, -21.210388, 4.2079697, -3.7589583, -21.205261, 4.1870375, -3.7589583, -21.084793, 4.23531, -3.7803178, -21.10551, 4.2400093, -3.7803178, -21.210388, 4.2079697, -3.7589583, -21.126444, 4.2444944, -3.7589583, -21.215513, 4.2284746, -3.7803178, -21.210388, 4.2079697, -3.7803178, -21.10551, 4.2400093, -3.7589583, -21.126444, 4.2444944, -3.7803178, -21.10551, 4.2400093, -3.7589583, -21.124308, 4.740252, -3.7589583, -21.126444, 4.2444944, -3.7803178, -21.10551, 4.2400093, -3.7803178, -21.103588, 4.7453785, -3.7589583, -21.124308, 4.740252, -3.7803178, -21.103588, 4.7453785, -3.7589583, -21.224058, 4.7716503, -3.7589583, -21.124308, 4.740252, -3.7803178, -21.103588, 4.7453785, -3.7803178, -21.219786, 4.7925835, -3.7589583, -21.224058, 4.7716503, -3.7589583, -21.084793, 4.23531, -3.7803178, -21.103588, 4.7453785, -3.7803178, -21.10551, 4.2400093, -3.7589583, -21.084793, 4.23531, -3.7589583, -21.082657, 4.7505045, -3.7803178, -21.103588, 4.7453785, -3.7589583, -21.082657, 4.7505045, -3.7803178, -21.219786, 4.7925835, -3.7803178, -21.103588, 4.7453785, -3.7589583, -21.082657, 4.7505045, -3.7589583, -21.215513, 4.8135157, -3.7803178, -21.219786, 4.7925835, -3.7589583, -21.224058, 4.7716503, -3.7375984, -21.340467, 4.7496505, -3.7375984, -21.219786, 4.7925835, -3.7589583, -21.224058, 4.7716503, -3.7589583, -21.320816, 4.7411065, -3.7375984, -21.340467, 4.7496505, -3.7375984, -21.219786, 4.7925835, -3.7589583, -21.360119, 4.758194, -3.7589583, -21.215513, 4.8135157, -3.7375984, -21.219786, 4.7925835, -3.7375984, -21.340467, 4.7496505, -3.7589583, -21.360119, 4.758194, -3.7589583, -21.215513, 4.8135157, -3.7803178, -21.340467, 4.7496505, -3.7803178, -21.219786, 4.7925835, -3.7589583, -21.215513, 4.8135157, -3.7589583, -21.360119, 4.758194, -3.7803178, -21.340467, 4.7496505, -3.7803178, -21.219786, 4.7925835, -3.7589583, -21.320816, 4.7411065, -3.7589583, -21.224058, 4.7716503, -3.7803178, -21.219786, 4.7925835, -3.7803178, -21.340467, 4.7496505, -3.7589583, -21.320816, 4.7411065, -3.7589583, -21.320816, 5.3611774, -3.7375984, -21.33534, 4.8476915, -3.7375984, -21.340467, 5.3697214, -3.7589583, -21.320816, 5.3611774, -3.7589583, -21.316116, 4.8566623, -3.7375984, -21.33534, 4.8476915, -3.7589583, -21.316116, 4.8566623, -3.7375984, -21.210386, 4.82804, -3.7375984, -21.33534, 4.8476915, -3.7589583, -21.316116, 4.8566623, -3.7589583, -21.215513, 4.8487587, -3.7375984, -21.210386, 4.82804, -3.7375984, -21.340467, 5.3697214, -3.7589583, -21.354778, 4.8387203, -3.7589583, -21.360119, 5.378265, -3.7375984, -21.340467, 5.3697214, -3.7375984, -21.33534, 4.8476915, -3.7589583, -21.354778, 4.8387203, -3.7375984, -21.33534, 4.8476915, -3.7589583, -21.205261, 4.8073215, -3.7589583, -21.354778, 4.8387203, -3.7375984, -21.33534, 4.8476915, -3.7375984, -21.210386, 4.82804, -3.7589583, -21.205261, 4.8073215, -3.7589583, -21.360119, 5.378265, -3.7803178, -21.33534, 4.8476915, -3.7803178, -21.340467, 5.3697214, -3.7589583, -21.360119, 5.378265, -3.7589583, -21.354778, 4.8387203, -3.7803178, -21.33534, 4.8476915, -3.7589583, -21.354778, 4.8387203, -3.7803178, -21.210386, 4.82804, -3.7803178, -21.33534, 4.8476915, -3.7589583, -21.354778, 4.8387203, -3.7589583, -21.205261, 4.8073215, -3.7803178, -21.210386, 4.82804, -3.7803178, -21.340467, 5.3697214, -3.7589583, -21.316116, 4.8566623, -3.7589583, -21.320816, 5.3611774, -3.7803178, -21.340467, 5.3697214, -3.7803178, -21.33534, 4.8476915, -3.7589583, -21.316116, 4.8566623, -3.7803178, -21.33534, 4.8476915, -3.7589583, -21.215513, 4.8487587, -3.7589583, -21.316116, 4.8566623, -3.7803178, -21.33534, 4.8476915, -3.7803178, -21.210386, 4.82804, -3.7589583, -21.215513, 4.8487587, -3.7589583, -21.215513, 4.8487587, -3.7375984, -21.10551, 4.8602934, -3.7375984, -21.210386, 4.82804, -3.7589583, -21.215513, 4.8487587, -3.7589583, -21.126444, 4.8647785, -3.7375984, -21.10551, 4.8602934, -3.7589583, -21.126444, 4.8647785, -3.7375984, -21.103588, 5.3656626, -3.7375984, -21.10551, 4.8602934, -3.7589583, -21.126444, 4.8647785, -3.7589583, -21.124308, 5.3605366, -3.7375984, -21.103588, 5.3656626, -3.7589583, -21.124308, 5.3605366, -3.7375984, -21.219786, 5.412654, -3.7375984, -21.103588, 5.3656626, -3.7589583, -21.124308, 5.3605366, -3.7589583, -21.224056, 5.3917212, -3.7375984, -21.219786, 5.412654, -3.7375984, -21.210386, 4.82804, -3.7589583, -21.084793, 4.855594, -3.7589583, -21.205261, 4.8073215, -3.7375984, -21.210386, 4.82804, -3.7375984, -21.10551, 4.8602934, -3.7589583, -21.084793, 4.855594, -3.7375984, -21.10551, 4.8602934, -3.7589583, -21.082657, 5.370575, -3.7589583, -21.084793, 4.855594, -3.7375984, -21.10551, 4.8602934, -3.7375984, -21.103588, 5.3656626, -3.7589583, -21.082657, 5.370575, -3.7375984, -21.103588, 5.3656626, -3.7589583, -21.215513, 5.433586, -3.7589583, -21.082657, 5.370575, -3.7375984, -21.103588, 5.3656626, -3.7375984, -21.219786, 5.412654, -3.7589583, -21.215513, 5.433586, -3.7589583, -21.205261, 4.8073215, -3.7803178, -21.10551, 4.8602934, -3.7803178, -21.210386, 4.82804, -3.7589583, -21.205261, 4.8073215, -3.7589583, -21.084793, 4.855594, -3.7803178, -21.10551, 4.8602934, -3.7803178, -21.210386, 4.82804, -3.7589583, -21.126444, 4.8647785, -3.7589583, -21.215513, 4.8487587, -3.7803178, -21.210386, 4.82804, -3.7803178, -21.10551, 4.8602934, -3.7589583, -21.126444, 4.8647785, -3.7803178, -21.10551, 4.8602934, -3.7589583, -21.124308, 5.3605366, -3.7589583, -21.126444, 4.8647785, -3.7803178, -21.10551, 4.8602934, -3.7803178, -21.103588, 5.3656626, -3.7589583, -21.124308, 5.3605366, -3.7803178, -21.103588, 5.3656626, -3.7589583, -21.224056, 5.3917212, -3.7589583, -21.124308, 5.3605366, -3.7803178, -21.103588, 5.3656626, -3.7803178, -21.219786, 5.412654, -3.7589583, -21.224056, 5.3917212, -3.7589583, -21.084793, 4.855594, -3.7803178, -21.103588, 5.3656626, -3.7803178, -21.10551, 4.8602934, -3.7589583, -21.084793, 4.855594, -3.7589583, -21.082657, 5.370575, -3.7803178, -21.103588, 5.3656626, -3.7589583, -21.082657, 5.370575, -3.7803178, -21.219786, 5.412654, -3.7803178, -21.103588, 5.3656626, -3.7589583, -21.082657, 5.370575, -3.7589583, -21.215513, 5.433586, -3.7803178, -21.219786, 5.412654, -3.7589583, -21.224056, 5.3917212, -3.7375984, -21.340467, 5.3697214, -3.7375984, -21.219786, 5.412654, -3.7589583, -21.224056, 5.3917212, -3.7589583, -21.320816, 5.3611774, -3.7375984, -21.340467, 5.3697214, -3.7375984, -21.219786, 5.412654, -3.7589583, -21.360119, 5.378265, -3.7589583, -21.215513, 5.433586, -3.7375984, -21.219786, 5.412654, -3.7375984, -21.340467, 5.3697214, -3.7589583, -21.360119, 5.378265, -3.7589583, -21.215513, 5.433586, -3.7803178, -21.340467, 5.3697214, -3.7803178, -21.219786, 5.412654, -3.7589583, -21.215513, 5.433586, -3.7589583, -21.360119, 5.378265, -3.7803178, -21.340467, 5.3697214, -3.7803178, -21.219786, 5.412654, -3.7589583, -21.320816, 5.3611774, -3.7589583, -21.224056, 5.3917212, -3.7803178, -21.219786, 5.412654, -3.7803178, -21.340467, 5.3697214, -3.7589583, -21.320816, 5.3611774, -7.3817677, -21.333632, 5.409023, -7.357631, -21.350079, 4.8643517, -7.357631, -21.355633, 5.418207, -7.3817677, -21.333632, 5.409023, -7.3817677, -21.328293, 4.8739634, -7.357631, -21.350079, 4.8643517, -7.3817677, -21.328293, 4.8739634, -7.357631, -21.208893, 4.8436327, -7.357631, -21.350079, 4.8643517, -7.3817677, -21.328293, 4.8739634, -7.3817677, -21.214659, 4.8654194, -7.357631, -21.208893, 4.8436327, -7.357631, -21.355633, 5.418207, -7.3817677, -21.371866, 4.85474, -7.3817677, -21.377846, 5.4271784, -7.357631, -21.355633, 5.418207, -7.357631, -21.350079, 4.8643517, -7.3817677, -21.371866, 4.85474, -7.357631, -21.350079, 4.8643517, -7.3817677, -21.203339, 4.8216324, -7.3817677, -21.371866, 4.85474, -7.357631, -21.350079, 4.8643517, -7.357631, -21.208893, 4.8436327, -7.3817677, -21.203339, 4.8216324, -7.3817677, -21.377846, 5.4271784, -7.4059043, -21.350079, 4.8643517, -7.4059043, -21.355633, 5.418207, -7.3817677, -21.377846, 5.4271784, -7.3817677, -21.371866, 4.85474, -7.4059043, -21.350079, 4.8643517, -7.3817677, -21.371866, 4.85474, -7.4059043, -21.208893, 4.8436327, -7.4059043, -21.350079, 4.8643517, -7.3817677, -21.371866, 4.85474, -7.3817677, -21.203339, 4.8216324, -7.4059043, -21.208893, 4.8436327, -7.4059043, -21.355633, 5.418207, -7.3817677, -21.328293, 4.8739634, -7.3817677, -21.333632, 5.409023, -7.4059043, -21.355633, 5.418207, -7.4059043, -21.350079, 4.8643517, -7.3817677, -21.328293, 4.8739634, -7.4059043, -21.350079, 4.8643517, -7.3817677, -21.214659, 4.8654194, -7.3817677, -21.328293, 4.8739634, -7.4059043, -21.350079, 4.8643517, -7.4059043, -21.208893, 4.8436327, -7.3817677, -21.214659, 4.8654194, -7.3817677, -21.214659, 4.8654194, -7.357631, -21.090773, 4.8775945, -7.357631, -21.208893, 4.8436327, -7.3817677, -21.214659, 4.8654194, -7.3817677, -21.11427, 4.8825073, -7.357631, -21.090773, 4.8775945, -7.3817677, -21.11427, 4.8825073, -7.357631, -21.088423, 5.4137216, -7.357631, -21.090773, 4.8775945, -7.3817677, -21.11427, 4.8825073, -7.3817677, -21.111706, 5.4083815, -7.357631, -21.088423, 5.4137216, -7.3817677, -21.111706, 5.4083815, -7.357631, -21.219572, 5.463703, -7.357631, -21.088423, 5.4137216, -7.3817677, -21.111706, 5.4083815, -7.3817677, -21.224483, 5.441489, -7.357631, -21.219572, 5.463703, -7.357631, -21.208893, 4.8436327, -7.3817677, -21.067278, 4.8726816, -7.3817677, -21.203339, 4.8216324, -7.357631, -21.208893, 4.8436327, -7.357631, -21.090773, 4.8775945, -7.3817677, -21.067278, 4.8726816, -7.357631, -21.090773, 4.8775945, -7.3817677, -21.064928, 5.4190617, -7.3817677, -21.067278, 4.8726816, -7.357631, -21.090773, 4.8775945, -7.357631, -21.088423, 5.4137216, -7.3817677, -21.064928, 5.4190617, -7.357631, -21.088423, 5.4137216, -7.3817677, -21.214872, 5.485917, -7.3817677, -21.064928, 5.4190617, -7.357631, -21.088423, 5.4137216, -7.357631, -21.219572, 5.463703, -7.3817677, -21.214872, 5.485917, -7.3817677, -21.203339, 4.8216324, -7.4059043, -21.090773, 4.8775945, -7.4059043, -21.208893, 4.8436327, -7.3817677, -21.203339, 4.8216324, -7.3817677, -21.067278, 4.8726816, -7.4059043, -21.090773, 4.8775945, -7.4059043, -21.208893, 4.8436327, -7.3817677, -21.11427, 4.8825073, -7.3817677, -21.214659, 4.8654194, -7.4059043, -21.208893, 4.8436327, -7.4059043, -21.090773, 4.8775945, -7.3817677, -21.11427, 4.8825073, -7.4059043, -21.090773, 4.8775945, -7.3817677, -21.111706, 5.4083815, -7.3817677, -21.11427, 4.8825073, -7.4059043, -21.090773, 4.8775945, -7.4059043, -21.088423, 5.4137216, -7.3817677, -21.111706, 5.4083815, -7.4059043, -21.088423, 5.4137216, -7.3817677, -21.224483, 5.441489, -7.3817677, -21.111706, 5.4083815, -7.4059043, -21.088423, 5.4137216, -7.4059043, -21.219572, 5.463703, -7.3817677, -21.224483, 5.441489, -7.3817677, -21.067278, 4.8726816, -7.4059043, -21.088423, 5.4137216, -7.4059043, -21.090773, 4.8775945, -7.3817677, -21.067278, 4.8726816, -7.3817677, -21.064928, 5.4190617, -7.4059043, -21.088423, 5.4137216, -7.3817677, -21.064928, 5.4190617, -7.4059043, -21.219572, 5.463703, -7.4059043, -21.088423, 5.4137216, -7.3817677, -21.064928, 5.4190617, -7.3817677, -21.214872, 5.485917, -7.4059043, -21.219572, 5.463703, -7.3817677, -21.224483, 5.441489, -7.357631, -21.355633, 5.418207, -7.357631, -21.219572, 5.463703, -7.3817677, -21.224483, 5.441489, -7.3817677, -21.333632, 5.409023, -7.357631, -21.355633, 5.418207, -7.357631, -21.219572, 5.463703, -7.3817677, -21.377846, 5.4271784, -7.3817677, -21.214872, 5.485917, -7.357631, -21.219572, 5.463703, -7.357631, -21.355633, 5.418207, -7.3817677, -21.377846, 5.4271784, -7.3817677, -21.214872, 5.485917, -7.4059043, -21.355633, 5.418207, -7.4059043, -21.219572, 5.463703, -7.3817677, -21.214872, 5.485917, -7.3817677, -21.377846, 5.4271784, -7.4059043, -21.355633, 5.418207, -7.4059043, -21.219572, 5.463703, -7.3817677, -21.333632, 5.409023, -7.3817677, -21.224483, 5.441489, -7.4059043, -21.219572, 5.463703, -7.4059043, -21.355633, 5.418207, -7.3817677, -21.333632, 5.409023, 16.86181, -22.803505, -1.1805243, 12.459326, -22.631578, -0.992887, 16.845665, -22.437832, -1.1752877, 16.86181, -22.803505, -1.1805243, 12.4754715, -22.996815, -0.99855995, 12.459326, -22.631578, -0.992887, 21.372076, -22.244087, -0.9867778, 16.86181, -22.803505, -1.1805243, 16.845665, -22.437832, -1.1752877, 21.372076, -22.244087, -0.9867778, 21.38822, -22.609324, -0.9924512, 16.86181, -22.803505, -1.1805243, 16.86181, -22.78867, -2.160163, 12.4754715, -22.996815, -0.99855995, 16.86181, -22.803505, -1.1805243, 16.86181, -22.78867, -2.160163, 12.4754715, -22.984161, -1.8285255, 12.4754715, -22.996815, -0.99855995, 16.86181, -22.803505, -1.1805243, 21.38822, -22.592306, -2.12569, 16.86181, -22.78867, -2.160163, 16.86181, -22.803505, -1.1805243, 21.38822, -22.601032, -1.5496888, 21.38822, -22.592306, -2.12569, 21.38822, -22.601032, -1.5496888, 16.86181, -22.803505, -1.1805243, 21.38822, -22.609324, -0.9924512, 12.4754715, -22.984161, -1.8285255, 12.459326, -22.631578, -0.992887, 12.4754715, -22.996815, -0.99855995, 12.4754715, -22.984161, -1.8285255, 12.459326, -22.618923, -1.8228531, 12.459326, -22.631578, -0.992887, 21.372076, -22.236668, -1.4776883, 21.20582, -22.351868, -1.5763068, 21.38822, -22.601032, -1.5496888, 16.845665, -22.426924, -1.9096894, 16.849592, -22.514633, -2.155799, 17.977158, -22.374123, -2.1461992, 16.845665, -22.426924, -1.9096894, 15.749081, -22.472305, -2.0715804, 16.849592, -22.514633, -2.155799, 16.845665, -22.426924, -1.9096894, 12.459326, -22.618923, -1.8228531, 15.749081, -22.472305, -2.0715804, 16.845665, -22.426924, -1.9096894, 12.459326, -22.631578, -0.992887, 12.459326, -22.618923, -1.8228531, 12.459326, -22.631578, -0.992887, 16.845665, -22.426924, -1.9096894, 16.845665, -22.437832, -1.1752877, 17.977158, -22.374123, -2.1461992, 16.845665, -22.437832, -1.1752877, 16.845665, -22.426924, -1.9096894, 16.845665, -22.437832, -1.1752877, 21.372076, -22.236668, -1.4776883, 21.372076, -22.244087, -0.9867778, 16.845665, -22.437832, -1.1752877, 20.594036, -22.268959, -1.5780525, 21.372076, -22.236668, -1.4776883, 17.977158, -22.374123, -2.1461992, 20.594036, -22.268959, -1.5780525, 16.845665, -22.437832, -1.1752877, 21.20582, -22.351868, -1.5763068, 21.372076, -22.236668, -1.4776883, 20.594036, -22.268959, -1.5780525, 21.372076, -22.232304, -1.7539072, 21.20582, -22.351868, -1.5763068, 20.594036, -22.268959, -1.5780525, 20.594036, -22.268959, -1.5780525, 17.977158, -22.374123, -2.1461992, 21.372076, -22.232304, -1.7539072, 21.372076, -22.232304, -1.7539072, 17.977158, -22.374123, -2.1461992, 21.37251, -22.227068, -2.1200175, 21.38822, -22.609324, -0.9924512, 21.372076, -22.236668, -1.4776883, 21.38822, -22.601032, -1.5496888, 21.38822, -22.609324, -0.9924512, 21.372076, -22.244087, -0.9867778, 21.372076, -22.236668, -1.4776883, 21.372076, -22.232304, -1.7539072, 21.38822, -22.592306, -2.12569, 21.38822, -22.601032, -1.5496888, 21.372076, -22.232304, -1.7539072, 21.37251, -22.227068, -2.1200175, 21.38822, -22.592306, -2.12569, 21.20582, -22.351868, -1.5763068, 21.372076, -22.232304, -1.7539072, 21.38822, -22.601032, -1.5496888, 21.37251, -22.227068, -2.1200175, 16.86181, -22.78867, -2.160163, 21.38822, -22.592306, -2.12569, 16.86181, -22.78867, -2.160163, 21.37251, -22.227068, -2.1200175, 16.849592, -22.514633, -2.155799, 16.849592, -22.514633, -2.155799, 21.37251, -22.227068, -2.1200175, 17.977158, -22.374123, -2.1461992, 16.849592, -22.514633, -2.155799, 12.459326, -22.618923, -1.8228531, 16.86181, -22.78867, -2.160163, 16.86181, -22.78867, -2.160163, 12.459326, -22.618923, -1.8228531, 12.4754715, -22.984161, -1.8285255, 12.459326, -22.618923, -1.8228531, 16.849592, -22.514633, -2.155799, 15.749081, -22.472305, -2.0715804, 13.651039, -22.54256, -3.436966, 12.76609, -22.946634, -3.462275, 13.666748, -22.907797, -3.4426389, 13.651039, -22.54256, -3.436966, 12.749945, -22.581396, -3.4570384, 12.76609, -22.946634, -3.462275, 13.666748, -22.907797, -3.4426389, 21.08582, -22.31085, -3.4526749, 13.651039, -22.54256, -3.436966, 13.651039, -22.54256, -3.436966, 21.08582, -22.31085, -3.4526749, 19.224287, -22.300377, -3.4474387, 21.08582, -22.31085, -3.4526749, 13.666748, -22.907797, -3.4426389, 21.0976, -22.584887, -3.4566026, 12.749945, -22.596233, -2.4743457, 13.651039, -22.54256, -3.436966, 13.651039, -22.557396, -2.4507813, 19.224287, -22.300377, -3.4474387, 13.651039, -22.557396, -2.4507813, 13.651039, -22.54256, -3.436966, 19.224287, -22.300377, -3.4474387, 21.081892, -22.231869, -2.6214004, 13.651039, -22.557396, -2.4507813, 21.081892, -22.231869, -2.6214004, 19.224287, -22.300377, -3.4474387, 21.081892, -22.222704, -3.2436562, 21.081892, -22.222704, -3.2436562, 19.224287, -22.300377, -3.4474387, 21.08582, -22.31085, -3.4526749, 13.651039, -22.54256, -3.436966, 12.749945, -22.596233, -2.4743457, 13.230383, -22.567432, -2.9914374, 13.230383, -22.567432, -2.9914374, 12.749945, -22.596233, -2.4743457, 12.749945, -22.590124, -2.8701282, 12.749945, -22.590124, -2.8701282, 12.838528, -22.724524, -2.981401, 13.230383, -22.567432, -2.9914374, 12.838528, -22.724524, -2.981401, 12.749945, -22.586197, -3.144165, 13.230383, -22.567432, -2.9914374, 13.651039, -22.54256, -3.436966, 13.230383, -22.567432, -2.9914374, 12.749945, -22.586197, -3.144165, 13.651039, -22.54256, -3.436966, 12.749945, -22.586197, -3.144165, 12.749945, -22.581396, -3.4570384, 13.666748, -22.923069, -2.4560184, 12.749945, -22.596233, -2.4743457, 13.651039, -22.557396, -2.4507813, 13.666748, -22.923069, -2.4560184, 12.76609, -22.96147, -2.4795818, 12.749945, -22.596233, -2.4743457, 21.081892, -22.231869, -2.6214004, 13.666748, -22.923069, -2.4560184, 13.651039, -22.557396, -2.4507813, 21.081892, -22.231869, -2.6214004, 21.0976, -22.597105, -2.6270728, 13.666748, -22.923069, -2.4560184, 12.76609, -22.946634, -3.462275, 13.666748, -22.923069, -2.4560184, 13.666748, -22.907797, -3.4426389, 13.666748, -22.923069, -2.4560184, 12.76609, -22.946634, -3.462275, 12.76609, -22.954924, -2.931219, 13.666748, -22.923069, -2.4560184, 12.76609, -22.954924, -2.931219, 12.76609, -22.96147, -2.4795818, 21.0976, -22.597105, -2.6270728, 13.666748, -22.907797, -3.4426389, 13.666748, -22.923069, -2.4560184, 21.0976, -22.597105, -2.6270728, 21.0976, -22.584887, -3.4566026, 13.666748, -22.907797, -3.4426389, 12.749945, -22.586197, -3.144165, 12.838528, -22.724524, -2.981401, 12.76609, -22.954924, -2.931219, 12.838528, -22.724524, -2.981401, 12.749945, -22.590124, -2.8701282, 12.76609, -22.954924, -2.931219, 12.76609, -22.946634, -3.462275, 12.749945, -22.586197, -3.144165, 12.76609, -22.954924, -2.931219, 12.76609, -22.946634, -3.462275, 12.749945, -22.581396, -3.4570384, 12.749945, -22.586197, -3.144165, 12.749945, -22.590124, -2.8701282, 12.76609, -22.96147, -2.4795818, 12.76609, -22.954924, -2.931219, 12.749945, -22.590124, -2.8701282, 12.749945, -22.596233, -2.4743457, 12.76609, -22.96147, -2.4795818, 21.081892, -22.231869, -2.6214004, 21.0976, -22.584887, -3.4566026, 21.0976, -22.597105, -2.6270728, 21.0976, -22.584887, -3.4566026, 21.081892, -22.231869, -2.6214004, 21.08582, -22.31085, -3.4526749, 21.08582, -22.31085, -3.4526749, 21.081892, -22.231869, -2.6214004, 21.081892, -22.222704, -3.2436562, 16.86661, -22.74067, -5.2888975, 12.750381, -22.556524, -5.1012607, 16.850464, -22.375433, -5.2836614, 16.86661, -22.74067, -5.2888975, 12.76609, -22.92176, -5.1069336, 12.750381, -22.556524, -5.1012607, 21.081892, -22.194342, -5.0951514, 16.86661, -22.74067, -5.2888975, 16.850464, -22.375433, -5.2836614, 21.081892, -22.194342, -5.0951514, 21.0976, -22.559578, -5.100825, 16.86661, -22.74067, -5.2888975, 16.86661, -22.725834, -6.2681003, 12.76609, -22.92176, -5.1069336, 16.86661, -22.74067, -5.2888975, 16.86661, -22.725834, -6.2681003, 12.76609, -22.909105, -5.936463, 12.76609, -22.92176, -5.1069336, 16.86661, -22.74067, -5.2888975, 21.0976, -22.54256, -6.2344995, 16.86661, -22.725834, -6.2681003, 16.86661, -22.74067, -5.2888975, 21.0976, -22.551287, -5.658062, 21.0976, -22.54256, -6.2344995, 21.0976, -22.551287, -5.658062, 16.86661, -22.74067, -5.2888975, 21.0976, -22.559578, -5.100825, 12.76609, -22.909105, -5.936463, 12.750381, -22.556524, -5.1012607, 12.76609, -22.92176, -5.1069336, 12.76609, -22.909105, -5.936463, 12.750381, -22.543869, -5.93079, 12.750381, -22.556524, -5.1012607, 21.081892, -22.186922, -5.5856256, 20.926546, -22.301687, -5.6846805, 21.0976, -22.551287, -5.658062, 16.850464, -22.364523, -6.018063, 16.854391, -22.451796, -6.2637362, 17.908213, -22.314777, -6.2541366, 16.850464, -22.364523, -6.018063, 15.825443, -22.406414, -6.179518, 16.854391, -22.451796, -6.2637362, 16.850464, -22.364523, -6.018063, 12.750381, -22.543869, -5.93079, 15.825443, -22.406414, -6.179518, 16.850464, -22.364523, -6.018063, 12.750381, -22.556524, -5.1012607, 12.750381, -22.543869, -5.93079, 12.750381, -22.556524, -5.1012607, 16.850464, -22.364523, -6.018063, 16.850464, -22.375433, -5.2836614, 17.908213, -22.314777, -6.2541366, 16.850464, -22.375433, -5.2836614, 16.850464, -22.364523, -6.018063, 16.850464, -22.375433, -5.2836614, 21.081892, -22.186922, -5.5856256, 21.081892, -22.194342, -5.0951514, 16.850464, -22.375433, -5.2836614, 20.354473, -22.217031, -5.6864257, 21.081892, -22.186922, -5.5856256, 17.908213, -22.314777, -6.2541366, 20.354473, -22.217031, -5.6864257, 16.850464, -22.375433, -5.2836614, 20.926546, -22.301687, -5.6846805, 21.081892, -22.186922, -5.5856256, 20.354473, -22.217031, -5.6864257, 21.081892, -22.182995, -5.862281, 20.926546, -22.301687, -5.6846805, 20.354473, -22.217031, -5.6864257, 20.354473, -22.217031, -5.6864257, 17.908213, -22.314777, -6.2541366, 21.081892, -22.182995, -5.862281, 21.081892, -22.182995, -5.862281, 17.908213, -22.314777, -6.2541366, 21.081892, -22.177322, -6.228827, 21.0976, -22.559578, -5.100825, 21.081892, -22.186922, -5.5856256, 21.0976, -22.551287, -5.658062, 21.0976, -22.559578, -5.100825, 21.081892, -22.194342, -5.0951514, 21.081892, -22.186922, -5.5856256, 21.081892, -22.182995, -5.862281, 21.0976, -22.54256, -6.2344995, 21.0976, -22.551287, -5.658062, 21.081892, -22.182995, -5.862281, 21.081892, -22.177322, -6.228827, 21.0976, -22.54256, -6.2344995, 20.926546, -22.301687, -5.6846805, 21.081892, -22.182995, -5.862281, 21.0976, -22.551287, -5.658062, 21.081892, -22.177322, -6.228827, 16.86661, -22.725834, -6.2681003, 21.0976, -22.54256, -6.2344995, 16.86661, -22.725834, -6.2681003, 21.081892, -22.177322, -6.228827, 16.854391, -22.451796, -6.2637362, 16.854391, -22.451796, -6.2637362, 21.081892, -22.177322, -6.228827, 17.908213, -22.314777, -6.2541366, 16.854391, -22.451796, -6.2637362, 12.750381, -22.543869, -5.93079, 16.86661, -22.725834, -6.2681003, 16.86661, -22.725834, -6.2681003, 12.750381, -22.543869, -5.93079, 12.76609, -22.909105, -5.936463, 12.750381, -22.543869, -5.93079, 16.854391, -22.451796, -6.2637362, 15.825443, -22.406414, -6.179518, 19.724798, -22.63725, -3.9361672, 12.459763, -22.58925, -3.7760215, 19.70909, -22.271578, -3.9304943, 19.724798, -22.63725, -3.9361672, 12.4754715, -22.954489, -3.781694, 12.459763, -22.58925, -3.7760215, 21.37251, -22.199577, -3.9226394, 19.724798, -22.63725, -3.9361672, 19.70909, -22.271578, -3.9304943, 21.37251, -22.199577, -3.9226394, 21.38822, -22.564814, -3.9283128, 19.724798, -22.63725, -3.9361672, 19.724798, -22.621979, -4.944606, 12.4754715, -22.954489, -3.781694, 19.724798, -22.63725, -3.9361672, 19.724798, -22.621979, -4.944606, 12.4754715, -22.939651, -4.764387, 12.4754715, -22.954489, -3.781694, 21.38822, -22.564814, -3.9283128, 19.724798, -22.621979, -4.944606, 19.724798, -22.63725, -3.9361672, 21.38822, -22.564814, -3.9283128, 21.38822, -22.55216, -4.7578416, 19.724798, -22.621979, -4.944606, 21.38822, -22.564814, -3.9283128, 21.37251, -22.186922, -4.752169, 21.38822, -22.55216, -4.7578416, 21.38822, -22.564814, -3.9283128, 21.37251, -22.199577, -3.9226394, 21.37251, -22.186922, -4.752169, 19.70909, -22.260231, -4.6867146, 19.713017, -22.34794, -4.9402423, 20.124945, -22.239286, -4.8926787, 19.70909, -22.260231, -4.6867146, 17.896868, -22.335724, -4.8939877, 19.713017, -22.34794, -4.9402423, 19.70909, -22.260231, -4.6867146, 13.819038, -22.514633, -4.792751, 17.896868, -22.335724, -4.8939877, 20.124945, -22.239286, -4.8926787, 19.70909, -22.271578, -3.9304943, 19.70909, -22.260231, -4.6867146, 20.124945, -22.239286, -4.8926787, 21.37251, -22.199577, -3.9226394, 19.70909, -22.271578, -3.9304943, 21.37251, -22.199577, -3.9226394, 20.124945, -22.239286, -4.8926787, 21.37251, -22.186922, -4.752169, 12.459763, -22.58925, -3.7760215, 19.70909, -22.260231, -4.6867146, 19.70909, -22.271578, -3.9304943, 19.70909, -22.260231, -4.6867146, 12.459763, -22.58925, -3.7760215, 13.819038, -22.514633, -4.792751, 13.819038, -22.514633, -4.792751, 12.459763, -22.58925, -3.7760215, 12.459763, -22.577906, -4.513041, 13.819038, -22.514633, -4.792751, 12.459763, -22.577906, -4.513041, 12.46369, -22.665615, -4.7600236, 21.37251, -22.186922, -4.752169, 19.724798, -22.621979, -4.944606, 21.38822, -22.55216, -4.7578416, 19.724798, -22.621979, -4.944606, 21.37251, -22.186922, -4.752169, 19.713017, -22.34794, -4.9402423, 19.713017, -22.34794, -4.9402423, 21.37251, -22.186922, -4.752169, 20.124945, -22.239286, -4.8926787, 19.713017, -22.34794, -4.9402423, 12.46369, -22.665615, -4.7600236, 19.724798, -22.621979, -4.944606, 19.724798, -22.621979, -4.944606, 12.46369, -22.665615, -4.7600236, 12.4754715, -22.939651, -4.764387, 12.46369, -22.665615, -4.7600236, 19.713017, -22.34794, -4.9402423, 13.819038, -22.514633, -4.792751, 13.819038, -22.514633, -4.792751, 19.713017, -22.34794, -4.9402423, 17.896868, -22.335724, -4.8939877, 12.46369, -22.665615, -4.7600236, 12.4754715, -22.954489, -3.781694, 12.4754715, -22.939651, -4.764387, 12.4754715, -22.954489, -3.781694, 12.46369, -22.665615, -4.7600236, 12.459763, -22.58925, -3.7760215, 12.459763, -22.58925, -3.7760215, 12.46369, -22.665615, -4.7600236, 12.459763, -22.577906, -4.513041, 16.95781, -23.00336, -0.79565, 21.06182, -22.63725, -0.9811053, 16.95781, -22.63725, -0.79565, 16.95781, -23.00336, -0.79565, 21.06182, -23.00336, -0.9811053, 21.06182, -22.63725, -0.9811053, 12.722454, -22.63725, -0.9811053, 16.95781, -23.00336, -0.79565, 16.95781, -22.63725, -0.79565, 12.722454, -22.63725, -0.9811053, 12.722454, -23.00336, -0.9811053, 16.95781, -23.00336, -0.79565, 16.95781, -23.00336, 0.18311548, 21.06182, -23.00336, -0.9811053, 16.95781, -23.00336, -0.79565, 16.95781, -23.00336, 0.18311548, 21.06182, -23.00336, -0.15113974, 21.06182, -23.00336, -0.9811053, 16.95781, -23.00336, -0.79565, 12.722454, -23.00336, 0.15257025, 16.95781, -23.00336, 0.18311548, 16.95781, -23.00336, -0.79565, 12.722454, -23.00336, -0.4238677, 12.722454, -23.00336, 0.15257025, 12.722454, -23.00336, -0.4238677, 16.95781, -23.00336, -0.79565, 12.722454, -23.00336, -0.9811053, 21.06182, -23.00336, -0.15113974, 21.06182, -22.63725, -0.9811053, 21.06182, -23.00336, -0.9811053, 21.06182, -23.00336, -0.15113974, 21.06182, -22.63725, -0.15113974, 21.06182, -22.63725, -0.9811053, 12.722454, -22.63725, -0.49063158, 12.882601, -22.746778, -0.39288568, 12.722454, -23.00336, -0.4238677, 16.95781, -22.63725, -0.06124878, 16.95781, -22.728888, 0.18311548, 15.899189, -22.63725, 0.17569733, 16.95781, -22.63725, -0.06124878, 17.983704, -22.63725, 0.09977007, 16.95781, -22.728888, 0.18311548, 16.95781, -22.63725, -0.06124878, 21.06182, -22.63725, -0.15113974, 17.983704, -22.63725, 0.09977007, 16.95781, -22.63725, -0.06124878, 21.06182, -22.63725, -0.9811053, 21.06182, -22.63725, -0.15113974, 21.06182, -22.63725, -0.9811053, 16.95781, -22.63725, -0.06124878, 16.95781, -22.63725, -0.79565, 15.899189, -22.63725, 0.17569733, 16.95781, -22.63725, -0.79565, 16.95781, -22.63725, -0.06124878, 16.95781, -22.63725, -0.79565, 12.722454, -22.63725, -0.49063158, 12.722454, -22.63725, -0.9811053, 16.95781, -22.63725, -0.79565, 13.450312, -22.63725, -0.39070415, 12.722454, -22.63725, -0.49063158, 15.899189, -22.63725, 0.17569733, 13.450312, -22.63725, -0.39070415, 16.95781, -22.63725, -0.79565, 12.882601, -22.746778, -0.39288568, 12.722454, -22.63725, -0.49063158, 13.450312, -22.63725, -0.39070415, 12.722454, -22.63725, -0.21441269, 12.882601, -22.746778, -0.39288568, 13.450312, -22.63725, -0.39070415, 13.450312, -22.63725, -0.39070415, 15.899189, -22.63725, 0.17569733, 12.722454, -22.63725, -0.21441269, 12.722454, -22.63725, -0.21441269, 15.899189, -22.63725, 0.17569733, 12.722454, -22.63725, 0.15257025, 12.722454, -23.00336, -0.9811053, 12.722454, -22.63725, -0.49063158, 12.722454, -23.00336, -0.4238677, 12.722454, -23.00336, -0.9811053, 12.722454, -22.63725, -0.9811053, 12.722454, -22.63725, -0.49063158, 12.722454, -22.63725, -0.21441269, 12.722454, -23.00336, 0.15257025, 12.722454, -23.00336, -0.4238677, 12.722454, -22.63725, -0.21441269, 12.722454, -22.63725, 0.15257025, 12.722454, -23.00336, 0.15257025, 12.882601, -22.746778, -0.39288568, 12.722454, -22.63725, -0.21441269, 12.722454, -23.00336, -0.4238677, 12.722454, -22.63725, 0.15257025, 16.95781, -23.00336, 0.18311548, 12.722454, -23.00336, 0.15257025, 16.95781, -23.00336, 0.18311548, 12.722454, -22.63725, 0.15257025, 15.899189, -22.63725, 0.17569733, 16.95781, -23.00336, 0.18311548, 15.899189, -22.63725, 0.17569733, 16.95781, -22.728888, 0.18311548, 16.95781, -22.728888, 0.18311548, 21.06182, -23.00336, -0.15113974, 16.95781, -23.00336, 0.18311548, 16.95781, -22.728888, 0.18311548, 21.06182, -22.63725, -0.15113974, 21.06182, -23.00336, -0.15113974, 21.06182, -22.63725, -0.15113974, 16.95781, -22.728888, 0.18311548, 17.983704, -22.63725, 0.09977007, 20.16029, -22.63725, 2.5866122, 21.06182, -23.00336, 2.6058125, 20.16029, -23.00336, 2.5866122, 20.16029, -22.63725, 2.5866122, 21.06182, -22.63725, 2.6058125, 21.06182, -23.00336, 2.6058125, 20.16029, -23.00336, 2.5866122, 14.582241, -22.63725, 2.6010118, 20.16029, -22.63725, 2.5866122, 20.16029, -23.00336, 2.5866122, 12.722454, -22.728888, 2.6058125, 14.582241, -22.63725, 2.6010118, 12.722454, -22.728888, 2.6058125, 20.16029, -23.00336, 2.5866122, 12.722454, -23.00336, 2.6058125, 21.06182, -22.63725, 1.6231189, 20.16029, -22.63725, 2.5866122, 20.16029, -22.63725, 1.6004281, 14.582241, -22.63725, 2.6010118, 20.16029, -22.63725, 1.6004281, 20.16029, -22.63725, 2.5866122, 14.582241, -22.63725, 2.6010118, 12.722454, -22.63725, 1.7762828, 20.16029, -22.63725, 1.6004281, 12.722454, -22.63725, 1.7762828, 14.582241, -22.63725, 2.6010118, 12.722454, -22.63725, 2.398975, 12.722454, -22.63725, 2.398975, 14.582241, -22.63725, 2.6010118, 12.722454, -22.728888, 2.6058125, 20.16029, -22.63725, 2.5866122, 21.06182, -22.63725, 1.6231189, 20.581383, -22.63725, 2.1410842, 20.581383, -22.63725, 2.1410842, 21.06182, -22.63725, 1.6231189, 21.06182, -22.63725, 2.0193381, 21.06182, -22.63725, 2.0193381, 20.979784, -22.776888, 2.128429, 20.581383, -22.63725, 2.1410842, 20.979784, -22.776888, 2.128429, 21.06182, -22.63725, 2.2933755, 20.581383, -22.63725, 2.1410842, 20.16029, -22.63725, 2.5866122, 20.581383, -22.63725, 2.1410842, 21.06182, -22.63725, 2.2933755, 20.16029, -22.63725, 2.5866122, 21.06182, -22.63725, 2.2933755, 21.06182, -22.63725, 2.6058125, 20.16029, -23.00336, 1.6004281, 21.06182, -22.63725, 1.6231189, 20.16029, -22.63725, 1.6004281, 20.16029, -23.00336, 1.6004281, 21.06182, -23.00336, 1.6231189, 21.06182, -22.63725, 1.6231189, 12.722454, -22.63725, 1.7762828, 20.16029, -23.00336, 1.6004281, 20.16029, -22.63725, 1.6004281, 12.722454, -22.63725, 1.7762828, 12.722454, -23.00336, 1.7762828, 20.16029, -23.00336, 1.6004281, 21.06182, -23.00336, 2.6058125, 20.16029, -23.00336, 1.6004281, 20.16029, -23.00336, 2.5866122, 20.16029, -23.00336, 1.6004281, 21.06182, -23.00336, 2.6058125, 21.06182, -23.00336, 2.0747561, 20.16029, -23.00336, 1.6004281, 21.06182, -23.00336, 2.0747561, 21.06182, -23.00336, 1.6231189, 12.722454, -23.00336, 1.7762828, 20.16029, -23.00336, 2.5866122, 20.16029, -23.00336, 1.6004281, 12.722454, -23.00336, 1.7762828, 12.722454, -23.00336, 2.6058125, 20.16029, -23.00336, 2.5866122, 21.06182, -22.63725, 2.2933755, 20.979784, -22.776888, 2.128429, 21.06182, -23.00336, 2.0747561, 20.979784, -22.776888, 2.128429, 21.06182, -22.63725, 2.0193381, 21.06182, -23.00336, 2.0747561, 21.06182, -23.00336, 2.6058125, 21.06182, -22.63725, 2.2933755, 21.06182, -23.00336, 2.0747561, 21.06182, -23.00336, 2.6058125, 21.06182, -22.63725, 2.6058125, 21.06182, -22.63725, 2.2933755, 21.06182, -22.63725, 2.0193381, 21.06182, -23.00336, 1.6231189, 21.06182, -23.00336, 2.0747561, 21.06182, -22.63725, 2.0193381, 21.06182, -22.63725, 1.6231189, 21.06182, -23.00336, 1.6231189, 12.722454, -22.63725, 1.7762828, 12.722454, -23.00336, 2.6058125, 12.722454, -23.00336, 1.7762828, 12.722454, -23.00336, 2.6058125, 12.722454, -22.63725, 1.7762828, 12.722454, -22.63725, 2.398975, 12.722454, -23.00336, 2.6058125, 12.722454, -22.63725, 2.398975, 12.722454, -22.728888, 2.6058125, 20.38851, -22.63725, 3.7669787, 21.352875, -23.00336, 3.786178, 20.38851, -23.00336, 3.7669787, 20.38851, -22.63725, 3.7669787, 21.352875, -22.63725, 3.786178, 21.352875, -23.00336, 3.786178, 20.38851, -23.00336, 3.7669787, 14.420786, -22.63725, 3.7813792, 20.38851, -22.63725, 3.7669787, 20.38851, -23.00336, 3.7669787, 12.431835, -22.728888, 3.786178, 14.420786, -22.63725, 3.7813792, 12.431835, -22.728888, 3.786178, 20.38851, -23.00336, 3.7669787, 12.431835, -23.00336, 3.786178, 21.352875, -22.63725, 2.8034854, 20.38851, -22.63725, 3.7669787, 20.38851, -22.63725, 2.7803578, 14.420786, -22.63725, 3.7813792, 20.38851, -22.63725, 2.7803578, 20.38851, -22.63725, 3.7669787, 14.420786, -22.63725, 3.7813792, 12.431835, -22.63725, 2.9562135, 20.38851, -22.63725, 2.7803578, 12.431835, -22.63725, 2.9562135, 14.420786, -22.63725, 3.7813792, 12.431835, -22.63725, 3.5784698, 12.431835, -22.63725, 3.5784698, 14.420786, -22.63725, 3.7813792, 12.431835, -22.728888, 3.786178, 20.38851, -22.63725, 3.7669787, 21.352875, -22.63725, 2.8034854, 20.838837, -22.63725, 3.321015, 20.838837, -22.63725, 3.321015, 21.352875, -22.63725, 2.8034854, 21.352875, -22.63725, 3.1997046, 21.352875, -22.63725, 3.1997046, 21.264729, -22.776888, 3.3083596, 20.838837, -22.63725, 3.321015, 21.264729, -22.776888, 3.3083596, 21.352875, -22.63725, 3.4733052, 20.838837, -22.63725, 3.321015, 20.38851, -22.63725, 3.7669787, 20.838837, -22.63725, 3.321015, 21.352875, -22.63725, 3.4733052, 20.38851, -22.63725, 3.7669787, 21.352875, -22.63725, 3.4733052, 21.352875, -22.63725, 3.786178, 20.38851, -23.00336, 2.7803578, 21.352875, -22.63725, 2.8034854, 20.38851, -22.63725, 2.7803578, 20.38851, -23.00336, 2.7803578, 21.352875, -23.00336, 2.8034854, 21.352875, -22.63725, 2.8034854, 12.431835, -22.63725, 2.9562135, 20.38851, -23.00336, 2.7803578, 20.38851, -22.63725, 2.7803578, 12.431835, -22.63725, 2.9562135, 12.431835, -23.00336, 2.9562135, 20.38851, -23.00336, 2.7803578, 21.352875, -23.00336, 3.786178, 20.38851, -23.00336, 2.7803578, 20.38851, -23.00336, 3.7669787, 20.38851, -23.00336, 2.7803578, 21.352875, -23.00336, 3.786178, 21.352875, -23.00336, 3.2546868, 20.38851, -23.00336, 2.7803578, 21.352875, -23.00336, 3.2546868, 21.352875, -23.00336, 2.8034854, 12.431835, -23.00336, 2.9562135, 20.38851, -23.00336, 3.7669787, 20.38851, -23.00336, 2.7803578, 12.431835, -23.00336, 2.9562135, 12.431835, -23.00336, 3.786178, 20.38851, -23.00336, 3.7669787, 21.352875, -22.63725, 3.4733052, 21.264729, -22.776888, 3.3083596, 21.352875, -23.00336, 3.2546868, 21.264729, -22.776888, 3.3083596, 21.352875, -22.63725, 3.1997046, 21.352875, -23.00336, 3.2546868, 21.352875, -23.00336, 3.786178, 21.352875, -22.63725, 3.4733052, 21.352875, -23.00336, 3.2546868, 21.352875, -23.00336, 3.786178, 21.352875, -22.63725, 3.786178, 21.352875, -22.63725, 3.4733052, 21.352875, -22.63725, 3.1997046, 21.352875, -23.00336, 2.8034854, 21.352875, -23.00336, 3.2546868, 21.352875, -22.63725, 3.1997046, 21.352875, -22.63725, 2.8034854, 21.352875, -23.00336, 2.8034854, 12.431835, -22.63725, 2.9562135, 12.431835, -23.00336, 3.786178, 12.431835, -23.00336, 2.9562135, 12.431835, -23.00336, 3.786178, 12.431835, -22.63725, 2.9562135, 12.431835, -22.63725, 3.5784698, 12.431835, -23.00336, 3.786178, 12.431835, -22.63725, 3.5784698, 12.431835, -22.728888, 3.786178, 14.157221, -23.00336, 0.4183159, 21.256002, -22.63725, 0.25860643, 14.157221, -22.63725, 0.4183159, 14.157221, -23.00336, 0.4183159, 21.256002, -23.00336, 0.25860643, 21.256002, -22.63725, 0.25860643, 12.528709, -22.63725, 0.41177034, 14.157221, -23.00336, 0.4183159, 14.157221, -22.63725, 0.4183159, 12.528709, -22.63725, 0.41177034, 12.528709, -23.00336, 0.41177034, 14.157221, -23.00336, 0.4183159, 14.157221, -23.00336, 1.4267545, 21.256002, -23.00336, 0.25860643, 14.157221, -23.00336, 0.4183159, 14.157221, -23.00336, 1.4267545, 21.256002, -23.00336, 1.2413001, 21.256002, -23.00336, 0.25860643, 12.528709, -23.00336, 0.41177034, 14.157221, -23.00336, 1.4267545, 14.157221, -23.00336, 0.4183159, 12.528709, -23.00336, 0.41177034, 12.528709, -23.00336, 1.2413001, 14.157221, -23.00336, 1.4267545, 12.528709, -23.00336, 0.41177034, 12.528709, -22.63725, 1.2413001, 12.528709, -23.00336, 1.2413001, 12.528709, -23.00336, 0.41177034, 12.528709, -22.63725, 0.41177034, 12.528709, -22.63725, 1.2413001, 14.157221, -22.63725, 1.1745362, 14.157221, -22.728888, 1.4267545, 13.750093, -22.63725, 1.3805003, 14.157221, -22.63725, 1.1745362, 15.931917, -22.63725, 1.3805003, 14.157221, -22.728888, 1.4267545, 14.157221, -22.63725, 1.1745362, 19.925089, -22.63725, 1.2762094, 15.931917, -22.63725, 1.3805003, 13.750093, -22.63725, 1.3805003, 14.157221, -22.63725, 0.4183159, 14.157221, -22.63725, 1.1745362, 13.750093, -22.63725, 1.3805003, 12.528709, -22.63725, 0.41177034, 14.157221, -22.63725, 0.4183159, 12.528709, -22.63725, 0.41177034, 13.750093, -22.63725, 1.3805003, 12.528709, -22.63725, 1.2413001, 21.256002, -22.63725, 0.25860643, 14.157221, -22.63725, 1.1745362, 14.157221, -22.63725, 0.4183159, 14.157221, -22.63725, 1.1745362, 21.256002, -22.63725, 0.25860643, 19.925089, -22.63725, 1.2762094, 19.925089, -22.63725, 1.2762094, 21.256002, -22.63725, 0.25860643, 21.256002, -22.63725, 0.99606276, 19.925089, -22.63725, 1.2762094, 21.256002, -22.63725, 0.99606276, 21.256002, -22.728888, 1.2413001, 12.528709, -22.63725, 1.2413001, 14.157221, -23.00336, 1.4267545, 12.528709, -23.00336, 1.2413001, 14.157221, -23.00336, 1.4267545, 12.528709, -22.63725, 1.2413001, 13.750093, -22.63725, 1.3805003, 14.157221, -23.00336, 1.4267545, 13.750093, -22.63725, 1.3805003, 14.157221, -22.728888, 1.4267545, 14.157221, -22.728888, 1.4267545, 21.256002, -23.00336, 1.2413001, 14.157221, -23.00336, 1.4267545, 14.157221, -22.728888, 1.4267545, 19.925089, -22.63725, 1.2762094, 21.256002, -23.00336, 1.2413001, 21.256002, -23.00336, 1.2413001, 19.925089, -22.63725, 1.2762094, 21.256002, -22.728888, 1.2413001, 19.925089, -22.63725, 1.2762094, 14.157221, -22.728888, 1.4267545, 15.931917, -22.63725, 1.3805003, 21.256002, -22.728888, 1.2413001, 21.256002, -23.00336, 0.25860643, 21.256002, -23.00336, 1.2413001, 21.256002, -23.00336, 0.25860643, 21.256002, -22.728888, 1.2413001, 21.256002, -22.63725, 0.99606276, 21.256002, -23.00336, 0.25860643, 21.256002, -22.63725, 0.99606276, 21.256002, -22.63725, 0.25860643, 17.195192, -22.439577, -16.726889, 21.299639, -22.073904, -16.912344, 17.195192, -22.073904, -16.726889, 17.195192, -22.439577, -16.726889, 21.299639, -22.439577, -16.912344, 21.299639, -22.073904, -16.912344, 12.960274, -22.073904, -16.912344, 17.195192, -22.439577, -16.726889, 17.195192, -22.073904, -16.726889, 12.960274, -22.073904, -16.912344, 12.960274, -22.439577, -16.912344, 17.195192, -22.439577, -16.726889, 17.195192, -22.439577, -15.748123, 21.299639, -22.439577, -16.912344, 17.195192, -22.439577, -16.726889, 17.195192, -22.439577, -15.748123, 21.299639, -22.439577, -16.082378, 21.299639, -22.439577, -16.912344, 17.195192, -22.439577, -16.726889, 12.960274, -22.439577, -15.779104, 17.195192, -22.439577, -15.748123, 17.195192, -22.439577, -16.726889, 12.960274, -22.439577, -16.355106, 12.960274, -22.439577, -15.779104, 12.960274, -22.439577, -16.355106, 17.195192, -22.439577, -16.726889, 12.960274, -22.439577, -16.912344, 21.299639, -22.439577, -16.082378, 21.299639, -22.073904, -16.912344, 21.299639, -22.439577, -16.912344, 21.299639, -22.439577, -16.082378, 21.299639, -22.073904, -16.082378, 21.299639, -22.073904, -16.912344, 12.960274, -22.073904, -16.422306, 13.119982, -22.182995, -16.32456, 12.960274, -22.439577, -16.355106, 17.195192, -22.073904, -15.992487, 17.195192, -22.165104, -15.748123, 16.136572, -22.073904, -15.755539, 17.195192, -22.073904, -15.992487, 18.221523, -22.073904, -15.831467, 17.195192, -22.165104, -15.748123, 17.195192, -22.073904, -15.992487, 21.299639, -22.073904, -16.082378, 18.221523, -22.073904, -15.831467, 17.195192, -22.073904, -15.992487, 21.299639, -22.073904, -16.912344, 21.299639, -22.073904, -16.082378, 21.299639, -22.073904, -16.912344, 17.195192, -22.073904, -15.992487, 17.195192, -22.073904, -16.726889, 16.136572, -22.073904, -15.755539, 17.195192, -22.073904, -16.726889, 17.195192, -22.073904, -15.992487, 17.195192, -22.073904, -16.726889, 12.960274, -22.073904, -16.422306, 12.960274, -22.073904, -16.912344, 17.195192, -22.073904, -16.726889, 13.688129, -22.073904, -16.321941, 12.960274, -22.073904, -16.422306, 16.136572, -22.073904, -15.755539, 13.688129, -22.073904, -16.321941, 17.195192, -22.073904, -16.726889, 13.119982, -22.182995, -16.32456, 12.960274, -22.073904, -16.422306, 13.688129, -22.073904, -16.321941, 12.960274, -22.073904, -16.14565, 13.119982, -22.182995, -16.32456, 13.688129, -22.073904, -16.321941, 13.688129, -22.073904, -16.321941, 16.136572, -22.073904, -15.755539, 12.960274, -22.073904, -16.14565, 12.960274, -22.073904, -16.14565, 16.136572, -22.073904, -15.755539, 12.960274, -22.073904, -15.779104, 12.960274, -22.439577, -16.912344, 12.960274, -22.073904, -16.422306, 12.960274, -22.439577, -16.355106, 12.960274, -22.439577, -16.912344, 12.960274, -22.073904, -16.912344, 12.960274, -22.073904, -16.422306, 12.960274, -22.073904, -16.14565, 12.960274, -22.439577, -15.779104, 12.960274, -22.439577, -16.355106, 12.960274, -22.073904, -16.14565, 12.960274, -22.073904, -15.779104, 12.960274, -22.439577, -15.779104, 13.119982, -22.182995, -16.32456, 12.960274, -22.073904, -16.14565, 12.960274, -22.439577, -16.355106, 12.960274, -22.073904, -15.779104, 17.195192, -22.439577, -15.748123, 12.960274, -22.439577, -15.779104, 17.195192, -22.439577, -15.748123, 12.960274, -22.073904, -15.779104, 16.136572, -22.073904, -15.755539, 17.195192, -22.439577, -15.748123, 16.136572, -22.073904, -15.755539, 17.195192, -22.165104, -15.748123, 17.195192, -22.165104, -15.748123, 21.299639, -22.439577, -16.082378, 17.195192, -22.439577, -15.748123, 17.195192, -22.165104, -15.748123, 21.299639, -22.073904, -16.082378, 21.299639, -22.439577, -16.082378, 21.299639, -22.073904, -16.082378, 17.195192, -22.165104, -15.748123, 18.221523, -22.073904, -15.831467, 20.39811, -22.073904, -13.344625, 21.299639, -22.439577, -13.325426, 20.39811, -22.439577, -13.344625, 20.39811, -22.073904, -13.344625, 21.299639, -22.073904, -13.325426, 21.299639, -22.439577, -13.325426, 20.39811, -22.439577, -13.344625, 14.819624, -22.073904, -13.330225, 20.39811, -22.073904, -13.344625, 20.39811, -22.439577, -13.344625, 12.960274, -22.165104, -13.325426, 14.819624, -22.073904, -13.330225, 12.960274, -22.165104, -13.325426, 20.39811, -22.439577, -13.344625, 12.960274, -22.439577, -13.325426, 21.299639, -22.073904, -14.308119, 20.39811, -22.073904, -13.344625, 20.39811, -22.073904, -14.331245, 14.819624, -22.073904, -13.330225, 20.39811, -22.073904, -14.331245, 20.39811, -22.073904, -13.344625, 14.819624, -22.073904, -13.330225, 12.960274, -22.073904, -14.154955, 20.39811, -22.073904, -14.331245, 12.960274, -22.073904, -14.154955, 14.819624, -22.073904, -13.330225, 12.960274, -22.073904, -13.5327, 12.960274, -22.073904, -13.5327, 14.819624, -22.073904, -13.330225, 12.960274, -22.165104, -13.325426, 20.39811, -22.073904, -13.344625, 21.299639, -22.073904, -14.308119, 20.818766, -22.073904, -13.7901535, 20.818766, -22.073904, -13.7901535, 21.299639, -22.073904, -14.308119, 21.299639, -22.073904, -13.9119, 21.299639, -22.073904, -13.9119, 21.217165, -22.213541, -13.803246, 20.818766, -22.073904, -13.7901535, 21.217165, -22.213541, -13.803246, 21.299639, -22.073904, -13.6383, 20.818766, -22.073904, -13.7901535, 20.39811, -22.073904, -13.344625, 20.818766, -22.073904, -13.7901535, 21.299639, -22.073904, -13.6383, 20.39811, -22.073904, -13.344625, 21.299639, -22.073904, -13.6383, 21.299639, -22.073904, -13.325426, 20.39811, -22.439577, -14.331245, 21.299639, -22.073904, -14.308119, 20.39811, -22.073904, -14.331245, 20.39811, -22.439577, -14.331245, 21.299639, -22.439577, -14.308119, 21.299639, -22.073904, -14.308119, 12.960274, -22.073904, -14.154955, 20.39811, -22.439577, -14.331245, 20.39811, -22.073904, -14.331245, 12.960274, -22.073904, -14.154955, 12.960274, -22.439577, -14.154955, 20.39811, -22.439577, -14.331245, 21.299639, -22.439577, -13.325426, 20.39811, -22.439577, -14.331245, 20.39811, -22.439577, -13.344625, 20.39811, -22.439577, -14.331245, 21.299639, -22.439577, -13.325426, 21.299639, -22.439577, -13.856482, 20.39811, -22.439577, -14.331245, 21.299639, -22.439577, -13.856482, 21.299639, -22.439577, -14.308119, 12.960274, -22.439577, -14.154955, 20.39811, -22.439577, -13.344625, 20.39811, -22.439577, -14.331245, 12.960274, -22.439577, -14.154955, 12.960274, -22.439577, -13.325426, 20.39811, -22.439577, -13.344625, 21.299639, -22.073904, -13.6383, 21.217165, -22.213541, -13.803246, 21.299639, -22.439577, -13.856482, 21.217165, -22.213541, -13.803246, 21.299639, -22.073904, -13.9119, 21.299639, -22.439577, -13.856482, 21.299639, -22.439577, -13.325426, 21.299639, -22.073904, -13.6383, 21.299639, -22.439577, -13.856482, 21.299639, -22.439577, -13.325426, 21.299639, -22.073904, -13.325426, 21.299639, -22.073904, -13.6383, 21.299639, -22.073904, -13.9119, 21.299639, -22.439577, -14.308119, 21.299639, -22.439577, -13.856482, 21.299639, -22.073904, -13.9119, 21.299639, -22.073904, -14.308119, 21.299639, -22.439577, -14.308119, 12.960274, -22.073904, -14.154955, 12.960274, -22.439577, -13.325426, 12.960274, -22.439577, -14.154955, 12.960274, -22.439577, -13.325426, 12.960274, -22.073904, -14.154955, 12.960274, -22.073904, -13.5327, 12.960274, -22.439577, -13.325426, 12.960274, -22.073904, -13.5327, 12.960274, -22.165104, -13.325426, 13.295837, -22.635942, 4.8980365, 13.527548, -22.543432, 4.8980365, 13.527548, -22.635942, 4.8980365, 13.295837, -22.635942, 4.8980365, 13.295837, -22.543432, 4.8980365, 13.527548, -22.543432, 4.8980365, 13.295837, -22.543432, 4.8980365, 13.527548, -22.543432, -19.742168, 13.527548, -22.543432, 4.8980365, 13.295837, -22.543432, 4.8980365, 13.295837, -22.543432, -19.742168, 13.527548, -22.543432, -19.742168, 13.295837, -22.543432, -19.742168, 13.527548, -22.635942, -19.742168, 13.527548, -22.543432, -19.742168, 13.295837, -22.543432, -19.742168, 13.295837, -22.635942, -19.742168, 13.527548, -22.635942, -19.742168, 13.295837, -22.635942, -19.742168, 13.527548, -22.635942, 4.8980365, 13.527548, -22.635942, -19.742168, 13.295837, -22.635942, -19.742168, 13.295837, -22.635942, 4.8980365, 13.527548, -22.635942, 4.8980365, 13.527548, -22.635942, 4.8980365, 13.527548, -22.543432, -19.742168, 13.527548, -22.635942, -19.742168, 13.527548, -22.635942, 4.8980365, 13.527548, -22.543432, 4.8980365, 13.527548, -22.543432, -19.742168, 13.295837, -22.635942, -19.742168, 13.295837, -22.543432, 4.8980365, 13.295837, -22.635942, 4.8980365, 13.295837, -22.635942, -19.742168, 13.295837, -22.543432, -19.742168, 13.295837, -22.543432, 4.8980365, 14.33395, -22.439577, -18.07831, 21.590258, -22.073904, -18.237583, 14.33395, -22.073904, -18.07831, 14.33395, -22.439577, -18.07831, 21.590258, -22.439577, -18.237583, 21.590258, -22.073904, -18.237583, 12.669218, -22.073904, -18.084854, 14.33395, -22.439577, -18.07831, 14.33395, -22.073904, -18.07831, 12.669218, -22.073904, -18.084854, 12.669218, -22.439577, -18.084854, 14.33395, -22.439577, -18.07831, 14.33395, -22.439577, -17.069435, 21.590258, -22.439577, -18.237583, 14.33395, -22.439577, -18.07831, 14.33395, -22.439577, -17.069435, 21.590258, -22.439577, -17.25489, 21.590258, -22.439577, -18.237583, 12.669218, -22.439577, -18.084854, 14.33395, -22.439577, -17.069435, 14.33395, -22.439577, -18.07831, 12.669218, -22.439577, -18.084854, 12.669218, -22.439577, -17.25489, 14.33395, -22.439577, -17.069435, 12.669218, -22.439577, -18.084854, 12.669218, -22.073904, -17.25489, 12.669218, -22.439577, -17.25489, 12.669218, -22.439577, -18.084854, 12.669218, -22.073904, -18.084854, 12.669218, -22.073904, -17.25489, 14.33395, -22.073904, -17.321653, 14.33395, -22.165104, -17.069435, 13.917658, -22.073904, -17.115688, 14.33395, -22.073904, -17.321653, 16.147917, -22.073904, -17.115688, 14.33395, -22.165104, -17.069435, 14.33395, -22.073904, -17.321653, 20.229671, -22.073904, -17.220417, 16.147917, -22.073904, -17.115688, 13.917658, -22.073904, -17.115688, 14.33395, -22.073904, -18.07831, 14.33395, -22.073904, -17.321653, 13.917658, -22.073904, -17.115688, 12.669218, -22.073904, -18.084854, 14.33395, -22.073904, -18.07831, 12.669218, -22.073904, -18.084854, 13.917658, -22.073904, -17.115688, 12.669218, -22.073904, -17.25489, 21.590258, -22.073904, -18.237583, 14.33395, -22.073904, -17.321653, 14.33395, -22.073904, -18.07831, 14.33395, -22.073904, -17.321653, 21.590258, -22.073904, -18.237583, 20.229671, -22.073904, -17.220417, 20.229671, -22.073904, -17.220417, 21.590258, -22.073904, -18.237583, 21.590258, -22.073904, -17.501, 20.229671, -22.073904, -17.220417, 21.590258, -22.073904, -17.501, 21.590258, -22.165104, -17.25489, 12.669218, -22.073904, -17.25489, 14.33395, -22.439577, -17.069435, 12.669218, -22.439577, -17.25489, 14.33395, -22.439577, -17.069435, 12.669218, -22.073904, -17.25489, 13.917658, -22.073904, -17.115688, 14.33395, -22.439577, -17.069435, 13.917658, -22.073904, -17.115688, 14.33395, -22.165104, -17.069435, 14.33395, -22.165104, -17.069435, 21.590258, -22.439577, -17.25489, 14.33395, -22.439577, -17.069435, 14.33395, -22.165104, -17.069435, 20.229671, -22.073904, -17.220417, 21.590258, -22.439577, -17.25489, 21.590258, -22.439577, -17.25489, 20.229671, -22.073904, -17.220417, 21.590258, -22.165104, -17.25489, 20.229671, -22.073904, -17.220417, 14.33395, -22.165104, -17.069435, 16.147917, -22.073904, -17.115688, 21.590258, -22.165104, -17.25489, 21.590258, -22.439577, -18.237583, 21.590258, -22.439577, -17.25489, 21.590258, -22.439577, -18.237583, 21.590258, -22.165104, -17.25489, 21.590258, -22.073904, -17.501, 21.590258, -22.439577, -18.237583, 21.590258, -22.073904, -17.501, 21.590258, -22.073904, -18.237583, 12.749508, -25.90344, -19.752205, 13.527111, -21.174994, -19.579403, 13.354311, -25.90344, -19.752205, 12.749508, -25.90344, -19.752205, 12.57671, -21.174994, -19.579403, 13.527111, -21.174994, -19.579403, 12.57671, -21.174994, -19.579403, 13.527111, -21.174994, -20.52937, 13.527111, -21.174994, -19.579403, 12.57671, -21.174994, -19.579403, 12.57671, -21.174994, -20.52937, 13.527111, -21.174994, -20.52937, 12.57671, -21.174994, -20.52937, 13.354311, -25.90344, -20.356571, 13.527111, -21.174994, -20.52937, 12.57671, -21.174994, -20.52937, 12.749508, -25.90344, -20.356571, 13.354311, -25.90344, -20.356571, 12.749508, -25.90344, -20.356571, 13.354311, -25.90344, -19.752205, 13.354311, -25.90344, -20.356571, 12.749508, -25.90344, -20.356571, 12.749508, -25.90344, -19.752205, 13.354311, -25.90344, -19.752205, 13.354311, -25.90344, -19.752205, 13.527111, -21.174994, -20.52937, 13.354311, -25.90344, -20.356571, 13.354311, -25.90344, -19.752205, 13.527111, -21.174994, -19.579403, 13.527111, -21.174994, -20.52937, 12.749508, -25.90344, -20.356571, 12.57671, -21.174994, -19.579403, 12.749508, -25.90344, -19.752205, 12.749508, -25.90344, -20.356571, 12.57671, -21.174994, -20.52937, 12.57671, -21.174994, -19.579403, 20.39811, -22.073904, -18.576202, 21.299639, -22.439577, -18.556564, 20.39811, -22.439577, -18.576202, 20.39811, -22.073904, -18.576202, 21.299639, -22.073904, -18.556564, 21.299639, -22.439577, -18.556564, 20.39811, -22.439577, -18.576202, 14.819624, -22.073904, -18.561365, 20.39811, -22.073904, -18.576202, 20.39811, -22.439577, -18.576202, 12.960274, -22.165104, -18.556564, 14.819624, -22.073904, -18.561365, 12.960274, -22.165104, -18.556564, 20.39811, -22.439577, -18.576202, 12.960274, -22.439577, -18.556564, 21.299639, -22.073904, -19.539696, 20.39811, -22.073904, -18.576202, 20.39811, -22.073904, -19.562386, 14.819624, -22.073904, -18.561365, 20.39811, -22.073904, -19.562386, 20.39811, -22.073904, -18.576202, 14.819624, -22.073904, -18.561365, 12.960274, -22.073904, -19.386532, 20.39811, -22.073904, -19.562386, 12.960274, -22.073904, -19.386532, 14.819624, -22.073904, -18.561365, 12.960274, -22.073904, -18.764275, 12.960274, -22.073904, -18.764275, 14.819624, -22.073904, -18.561365, 12.960274, -22.165104, -18.556564, 20.39811, -22.073904, -18.576202, 21.299639, -22.073904, -19.539696, 20.818766, -22.073904, -19.022167, 20.818766, -22.073904, -19.022167, 21.299639, -22.073904, -19.539696, 21.299639, -22.073904, -19.143913, 21.299639, -22.073904, -19.143913, 21.217165, -22.213541, -19.034386, 20.818766, -22.073904, -19.022167, 21.217165, -22.213541, -19.034386, 21.299639, -22.073904, -18.869438, 20.818766, -22.073904, -19.022167, 20.39811, -22.073904, -18.576202, 20.818766, -22.073904, -19.022167, 21.299639, -22.073904, -18.869438, 20.39811, -22.073904, -18.576202, 21.299639, -22.073904, -18.869438, 21.299639, -22.073904, -18.556564, 20.39811, -22.439577, -19.562386, 21.299639, -22.073904, -19.539696, 20.39811, -22.073904, -19.562386, 20.39811, -22.439577, -19.562386, 21.299639, -22.439577, -19.539696, 21.299639, -22.073904, -19.539696, 12.960274, -22.073904, -19.386532, 20.39811, -22.439577, -19.562386, 20.39811, -22.073904, -19.562386, 12.960274, -22.073904, -19.386532, 12.960274, -22.439577, -19.386532, 20.39811, -22.439577, -19.562386, 21.299639, -22.439577, -18.556564, 20.39811, -22.439577, -19.562386, 20.39811, -22.439577, -18.576202, 20.39811, -22.439577, -19.562386, 21.299639, -22.439577, -18.556564, 21.299639, -22.439577, -19.088493, 20.39811, -22.439577, -19.562386, 21.299639, -22.439577, -19.088493, 21.299639, -22.439577, -19.539696, 12.960274, -22.439577, -19.386532, 20.39811, -22.439577, -18.576202, 20.39811, -22.439577, -19.562386, 12.960274, -22.439577, -19.386532, 12.960274, -22.439577, -18.556564, 20.39811, -22.439577, -18.576202, 21.299639, -22.073904, -18.869438, 21.217165, -22.213541, -19.034386, 21.299639, -22.439577, -19.088493, 21.217165, -22.213541, -19.034386, 21.299639, -22.073904, -19.143913, 21.299639, -22.439577, -19.088493, 21.299639, -22.439577, -18.556564, 21.299639, -22.073904, -18.869438, 21.299639, -22.439577, -19.088493, 21.299639, -22.439577, -18.556564, 21.299639, -22.073904, -18.556564, 21.299639, -22.073904, -18.869438, 21.299639, -22.073904, -19.143913, 21.299639, -22.439577, -19.539696, 21.299639, -22.439577, -19.088493, 21.299639, -22.073904, -19.143913, 21.299639, -22.073904, -19.539696, 21.299639, -22.439577, -19.539696, 12.960274, -22.073904, -19.386532, 12.960274, -22.439577, -18.556564, 12.960274, -22.439577, -19.386532, 12.960274, -22.439577, -18.556564, 12.960274, -22.073904, -19.386532, 12.960274, -22.073904, -18.764275, 12.960274, -22.439577, -18.556564, 12.960274, -22.073904, -18.764275, 12.960274, -22.165104, -18.556564, 20.62589, -22.073904, -12.164696, 21.590258, -22.439577, -12.14506, 20.62589, -22.439577, -12.164696, 20.62589, -22.073904, -12.164696, 21.590258, -22.073904, -12.14506, 21.590258, -22.439577, -12.14506, 20.62589, -22.439577, -12.164696, 14.658169, -22.073904, -12.149858, 20.62589, -22.073904, -12.164696, 20.62589, -22.439577, -12.164696, 12.669218, -22.165104, -12.14506, 14.658169, -22.073904, -12.149858, 12.669218, -22.165104, -12.14506, 20.62589, -22.439577, -12.164696, 12.669218, -22.439577, -12.14506, 21.590258, -22.073904, -13.127752, 20.62589, -22.073904, -12.164696, 20.62589, -22.073904, -13.150879, 14.658169, -22.073904, -12.149858, 20.62589, -22.073904, -13.150879, 20.62589, -22.073904, -12.164696, 14.658169, -22.073904, -12.149858, 12.669218, -22.073904, -12.975025, 20.62589, -22.073904, -13.150879, 12.669218, -22.073904, -12.975025, 14.658169, -22.073904, -12.149858, 12.669218, -22.073904, -12.352768, 12.669218, -22.073904, -12.352768, 14.658169, -22.073904, -12.149858, 12.669218, -22.165104, -12.14506, 20.62589, -22.073904, -12.164696, 21.590258, -22.073904, -13.127752, 21.07622, -22.073904, -12.610224, 21.07622, -22.073904, -12.610224, 21.590258, -22.073904, -13.127752, 21.590258, -22.073904, -12.73197, 21.590258, -22.073904, -12.73197, 21.502111, -22.213541, -12.622879, 21.07622, -22.073904, -12.610224, 21.502111, -22.213541, -12.622879, 21.590258, -22.073904, -12.457933, 21.07622, -22.073904, -12.610224, 20.62589, -22.073904, -12.164696, 21.07622, -22.073904, -12.610224, 21.590258, -22.073904, -12.457933, 20.62589, -22.073904, -12.164696, 21.590258, -22.073904, -12.457933, 21.590258, -22.073904, -12.14506, 20.62589, -22.439577, -13.150879, 21.590258, -22.073904, -13.127752, 20.62589, -22.073904, -13.150879, 20.62589, -22.439577, -13.150879, 21.590258, -22.439577, -13.127752, 21.590258, -22.073904, -13.127752, 12.669218, -22.073904, -12.975025, 20.62589, -22.439577, -13.150879, 20.62589, -22.073904, -13.150879, 12.669218, -22.073904, -12.975025, 12.669218, -22.439577, -12.975025, 20.62589, -22.439577, -13.150879, 21.590258, -22.439577, -12.14506, 20.62589, -22.439577, -13.150879, 20.62589, -22.439577, -12.164696, 20.62589, -22.439577, -13.150879, 21.590258, -22.439577, -12.14506, 21.590258, -22.439577, -12.676552, 20.62589, -22.439577, -13.150879, 21.590258, -22.439577, -12.676552, 21.590258, -22.439577, -13.127752, 12.669218, -22.439577, -12.975025, 20.62589, -22.439577, -12.164696, 20.62589, -22.439577, -13.150879, 12.669218, -22.439577, -12.975025, 12.669218, -22.439577, -12.14506, 20.62589, -22.439577, -12.164696, 21.590258, -22.073904, -12.457933, 21.502111, -22.213541, -12.622879, 21.590258, -22.439577, -12.676552, 21.502111, -22.213541, -12.622879, 21.590258, -22.073904, -12.73197, 21.590258, -22.439577, -12.676552, 21.590258, -22.439577, -12.14506, 21.590258, -22.073904, -12.457933, 21.590258, -22.439577, -12.676552, 21.590258, -22.439577, -12.14506, 21.590258, -22.073904, -12.14506, 21.590258, -22.073904, -12.457933, 21.590258, -22.073904, -12.73197, 21.590258, -22.439577, -13.127752, 21.590258, -22.439577, -12.676552, 21.590258, -22.073904, -12.73197, 21.590258, -22.073904, -13.127752, 21.590258, -22.439577, -13.127752, 12.669218, -22.073904, -12.975025, 12.669218, -22.439577, -12.14506, 12.669218, -22.439577, -12.975025, 12.669218, -22.439577, -12.14506, 12.669218, -22.073904, -12.975025, 12.669218, -22.073904, -12.352768, 12.669218, -22.439577, -12.14506, 12.669218, -22.073904, -12.352768, 12.669218, -22.165104, -12.14506, 17.199993, -22.439577, -11.627094, 21.590258, -22.073904, -11.812113, 17.199993, -22.073904, -11.627094, 17.199993, -22.439577, -11.627094, 21.590258, -22.439577, -11.812113, 21.590258, -22.073904, -11.812113, 12.669218, -22.073904, -11.812113, 17.199993, -22.439577, -11.627094, 17.199993, -22.073904, -11.627094, 12.669218, -22.073904, -11.812113, 12.669218, -22.439577, -11.812113, 17.199993, -22.439577, -11.627094, 17.199993, -22.439577, -10.647455, 21.590258, -22.439577, -11.812113, 17.199993, -22.439577, -11.627094, 17.199993, -22.439577, -10.647455, 21.590258, -22.439577, -10.982147, 21.590258, -22.439577, -11.812113, 17.199993, -22.439577, -11.627094, 12.669218, -22.439577, -10.678438, 17.199993, -22.439577, -10.647455, 17.199993, -22.439577, -11.627094, 12.669218, -22.439577, -11.254438, 12.669218, -22.439577, -10.678438, 12.669218, -22.439577, -11.254438, 17.199993, -22.439577, -11.627094, 12.669218, -22.439577, -11.812113, 21.590258, -22.439577, -10.982147, 21.590258, -22.073904, -11.812113, 21.590258, -22.439577, -11.812113, 21.590258, -22.439577, -10.982147, 21.590258, -22.073904, -10.982147, 21.590258, -22.073904, -11.812113, 12.669218, -22.073904, -11.32164, 12.840273, -22.182995, -11.224329, 12.669218, -22.439577, -11.254438, 17.199993, -22.073904, -10.892256, 17.199993, -22.165104, -10.647455, 16.06719, -22.073904, -10.65531, 17.199993, -22.073904, -10.892256, 18.29745, -22.073904, -10.731237, 17.199993, -22.165104, -10.647455, 17.199993, -22.073904, -10.892256, 21.590258, -22.073904, -10.982147, 18.29745, -22.073904, -10.731237, 17.199993, -22.073904, -10.892256, 21.590258, -22.073904, -11.812113, 21.590258, -22.073904, -10.982147, 21.590258, -22.073904, -11.812113, 17.199993, -22.073904, -10.892256, 17.199993, -22.073904, -11.627094, 16.06719, -22.073904, -10.65531, 17.199993, -22.073904, -11.627094, 17.199993, -22.073904, -10.892256, 17.199993, -22.073904, -11.627094, 12.669218, -22.073904, -11.32164, 12.669218, -22.073904, -11.812113, 17.199993, -22.073904, -11.627094, 13.447693, -22.073904, -11.221275, 12.669218, -22.073904, -11.32164, 16.06719, -22.073904, -10.65531, 13.447693, -22.073904, -11.221275, 17.199993, -22.073904, -11.627094, 12.840273, -22.182995, -11.224329, 12.669218, -22.073904, -11.32164, 13.447693, -22.073904, -11.221275, 12.669218, -22.073904, -11.044985, 12.840273, -22.182995, -11.224329, 13.447693, -22.073904, -11.221275, 13.447693, -22.073904, -11.221275, 16.06719, -22.073904, -10.65531, 12.669218, -22.073904, -11.044985, 12.669218, -22.073904, -11.044985, 16.06719, -22.073904, -10.65531, 12.669218, -22.073904, -10.678438, 12.669218, -22.439577, -11.812113, 12.669218, -22.073904, -11.32164, 12.669218, -22.439577, -11.254438, 12.669218, -22.439577, -11.812113, 12.669218, -22.073904, -11.812113, 12.669218, -22.073904, -11.32164, 12.669218, -22.073904, -11.044985, 12.669218, -22.439577, -10.678438, 12.669218, -22.439577, -11.254438, 12.669218, -22.073904, -11.044985, 12.669218, -22.073904, -10.678438, 12.669218, -22.439577, -10.678438, 12.840273, -22.182995, -11.224329, 12.669218, -22.073904, -11.044985, 12.669218, -22.439577, -11.254438, 12.669218, -22.073904, -10.678438, 17.199993, -22.439577, -10.647455, 12.669218, -22.439577, -10.678438, 17.199993, -22.439577, -10.647455, 12.669218, -22.073904, -10.678438, 16.06719, -22.073904, -10.65531, 17.199993, -22.439577, -10.647455, 16.06719, -22.073904, -10.65531, 17.199993, -22.165104, -10.647455, 17.199993, -22.165104, -10.647455, 21.590258, -22.439577, -10.982147, 17.199993, -22.439577, -10.647455, 17.199993, -22.165104, -10.647455, 21.590258, -22.073904, -10.982147, 21.590258, -22.439577, -10.982147, 21.590258, -22.073904, -10.982147, 17.199993, -22.165104, -10.647455, 18.29745, -22.073904, -10.731237, 20.39811, -22.073904, -9.367163, 21.299639, -22.439577, -9.347525, 20.39811, -22.439577, -9.367163, 20.39811, -22.073904, -9.367163, 21.299639, -22.073904, -9.347525, 21.299639, -22.439577, -9.347525, 20.39811, -22.439577, -9.367163, 14.819624, -22.073904, -9.352325, 20.39811, -22.073904, -9.367163, 20.39811, -22.439577, -9.367163, 12.960274, -22.165104, -9.347525, 14.819624, -22.073904, -9.352325, 12.960274, -22.165104, -9.347525, 20.39811, -22.439577, -9.367163, 12.960274, -22.439577, -9.347525, 21.299639, -22.073904, -10.330656, 20.39811, -22.073904, -9.367163, 20.39811, -22.073904, -10.353346, 14.819624, -22.073904, -9.352325, 20.39811, -22.073904, -10.353346, 20.39811, -22.073904, -9.367163, 14.819624, -22.073904, -9.352325, 12.960274, -22.073904, -10.17749, 20.39811, -22.073904, -10.353346, 12.960274, -22.073904, -10.17749, 14.819624, -22.073904, -9.352325, 12.960274, -22.073904, -9.555235, 12.960274, -22.073904, -9.555235, 14.819624, -22.073904, -9.352325, 12.960274, -22.165104, -9.347525, 20.39811, -22.073904, -9.367163, 21.299639, -22.073904, -10.330656, 20.818766, -22.073904, -9.8131275, 20.818766, -22.073904, -9.8131275, 21.299639, -22.073904, -10.330656, 21.299639, -22.073904, -9.934872, 21.299639, -22.073904, -9.934872, 21.217165, -22.213541, -9.825344, 20.818766, -22.073904, -9.8131275, 21.217165, -22.213541, -9.825344, 21.299639, -22.073904, -9.6603985, 20.818766, -22.073904, -9.8131275, 20.39811, -22.073904, -9.367163, 20.818766, -22.073904, -9.8131275, 21.299639, -22.073904, -9.6603985, 20.39811, -22.073904, -9.367163, 21.299639, -22.073904, -9.6603985, 21.299639, -22.073904, -9.347525, 20.39811, -22.439577, -10.353346, 21.299639, -22.073904, -10.330656, 20.39811, -22.073904, -10.353346, 20.39811, -22.439577, -10.353346, 21.299639, -22.439577, -10.330656, 21.299639, -22.073904, -10.330656, 12.960274, -22.073904, -10.17749, 20.39811, -22.439577, -10.353346, 20.39811, -22.073904, -10.353346, 12.960274, -22.073904, -10.17749, 12.960274, -22.439577, -10.17749, 20.39811, -22.439577, -10.353346, 21.299639, -22.439577, -9.347525, 20.39811, -22.439577, -10.353346, 20.39811, -22.439577, -9.367163, 20.39811, -22.439577, -10.353346, 21.299639, -22.439577, -9.347525, 21.299639, -22.439577, -9.879017, 20.39811, -22.439577, -10.353346, 21.299639, -22.439577, -9.879017, 21.299639, -22.439577, -10.330656, 12.960274, -22.439577, -10.17749, 20.39811, -22.439577, -9.367163, 20.39811, -22.439577, -10.353346, 12.960274, -22.439577, -10.17749, 12.960274, -22.439577, -9.347525, 20.39811, -22.439577, -9.367163, 21.299639, -22.073904, -9.6603985, 21.217165, -22.213541, -9.825344, 21.299639, -22.439577, -9.879017, 21.217165, -22.213541, -9.825344, 21.299639, -22.073904, -9.934872, 21.299639, -22.439577, -9.879017, 21.299639, -22.439577, -9.347525, 21.299639, -22.073904, -9.6603985, 21.299639, -22.439577, -9.879017, 21.299639, -22.439577, -9.347525, 21.299639, -22.073904, -9.347525, 21.299639, -22.073904, -9.6603985, 21.299639, -22.073904, -9.934872, 21.299639, -22.439577, -10.330656, 21.299639, -22.439577, -9.879017, 21.299639, -22.073904, -9.934872, 21.299639, -22.073904, -10.330656, 21.299639, -22.439577, -10.330656, 12.960274, -22.073904, -10.17749, 12.960274, -22.439577, -9.347525, 12.960274, -22.439577, -10.17749, 12.960274, -22.439577, -9.347525, 12.960274, -22.073904, -10.17749, 12.960274, -22.073904, -9.555235, 12.960274, -22.439577, -9.347525, 12.960274, -22.073904, -9.555235, 12.960274, -22.165104, -9.347525, 20.474909, -25.90344, -19.689804, 21.125528, -21.174994, -19.768787, 21.204512, -25.90344, -19.689804, 20.474909, -25.90344, -19.689804, 20.553892, -21.174994, -19.768787, 21.125528, -21.174994, -19.768787, 20.553892, -21.174994, -19.768787, 21.125528, -21.174994, -20.340424, 21.125528, -21.174994, -19.768787, 20.553892, -21.174994, -19.768787, 20.553892, -21.174994, -20.340424, 21.125528, -21.174994, -20.340424, 20.553892, -21.174994, -20.340424, 21.204512, -25.90344, -20.419407, 21.125528, -21.174994, -20.340424, 20.553892, -21.174994, -20.340424, 20.474909, -25.90344, -20.419407, 21.204512, -25.90344, -20.419407, 20.474909, -25.90344, -20.419407, 21.204512, -25.90344, -19.689804, 21.204512, -25.90344, -20.419407, 20.474909, -25.90344, -20.419407, 20.474909, -25.90344, -19.689804, 21.204512, -25.90344, -19.689804, 21.204512, -25.90344, -19.689804, 21.125528, -21.174994, -20.340424, 21.204512, -25.90344, -20.419407, 21.204512, -25.90344, -19.689804, 21.125528, -21.174994, -19.768787, 21.125528, -21.174994, -20.340424, 20.474909, -25.90344, -20.419407, 20.553892, -21.174994, -19.768787, 20.474909, -25.90344, -19.689804, 20.474909, -25.90344, -20.419407, 20.553892, -21.174994, -20.340424, 20.553892, -21.174994, -19.768787, 12.886963, -25.90344, 5.2994914, 13.6170025, -21.174994, 5.2994914, 13.6170025, -25.90344, 5.2994914, 12.886963, -25.90344, 5.2994914, 12.886963, -21.174994, 5.2994914, 13.6170025, -21.174994, 5.2994914, 12.886963, -25.90344, 4.5698895, 13.6170025, -25.90344, 5.2994914, 13.6170025, -25.90344, 4.5698895, 12.886963, -25.90344, 4.5698895, 12.886963, -25.90344, 5.2994914, 13.6170025, -25.90344, 5.2994914, 13.6170025, -25.90344, 5.2994914, 13.6170025, -21.174994, 4.5698895, 13.6170025, -25.90344, 4.5698895, 13.6170025, -25.90344, 5.2994914, 13.6170025, -21.174994, 5.2994914, 13.6170025, -21.174994, 4.5698895, 12.886963, -22.357105, 4.5698895, 13.069365, -21.174994, 4.5698895, 12.886963, -21.174994, 4.7522902, 12.886963, -25.90344, 5.2994914, 12.886963, -22.357105, 4.5698895, 12.886963, -21.174994, 4.7522902, 12.886963, -22.357105, 4.5698895, 12.886963, -25.90344, 5.2994914, 12.886963, -25.90344, 4.5698895, 12.886963, -25.90344, 5.2994914, 12.886963, -21.174994, 4.7522902, 12.886963, -21.174994, 5.2994914, 12.886963, -21.174994, 4.7522902, 13.6170025, -21.174994, 5.2994914, 12.886963, -21.174994, 5.2994914, 13.6170025, -21.174994, 5.2994914, 12.886963, -21.174994, 4.7522902, 13.069365, -21.174994, 4.5698895, 13.6170025, -21.174994, 5.2994914, 13.069365, -21.174994, 4.5698895, 13.6170025, -21.174994, 4.5698895, 12.886963, -25.90344, 4.5698895, 13.069365, -21.174994, 4.5698895, 12.886963, -22.357105, 4.5698895, 13.069365, -21.174994, 4.5698895, 12.886963, -25.90344, 4.5698895, 13.6170025, -25.90344, 4.5698895, 13.069365, -21.174994, 4.5698895, 13.6170025, -25.90344, 4.5698895, 13.6170025, -21.174994, 4.5698895, 17.195192, -22.439577, -7.5178485, 21.299639, -22.073904, -7.703304, 17.195192, -22.073904, -7.5178485, 17.195192, -22.439577, -7.5178485, 21.299639, -22.439577, -7.703304, 21.299639, -22.073904, -7.703304, 12.960274, -22.073904, -7.703304, 17.195192, -22.439577, -7.5178485, 17.195192, -22.073904, -7.5178485, 12.960274, -22.073904, -7.703304, 12.960274, -22.439577, -7.703304, 17.195192, -22.439577, -7.5178485, 17.195192, -22.439577, -6.539082, 21.299639, -22.439577, -7.703304, 17.195192, -22.439577, -7.5178485, 17.195192, -22.439577, -6.539082, 21.299639, -22.439577, -6.873338, 21.299639, -22.439577, -7.703304, 17.195192, -22.439577, -7.5178485, 12.960274, -22.439577, -6.570064, 17.195192, -22.439577, -6.539082, 17.195192, -22.439577, -7.5178485, 12.960274, -22.439577, -7.146065, 12.960274, -22.439577, -6.570064, 12.960274, -22.439577, -7.146065, 17.195192, -22.439577, -7.5178485, 12.960274, -22.439577, -7.703304, 21.299639, -22.439577, -6.873338, 21.299639, -22.073904, -7.703304, 21.299639, -22.439577, -7.703304, 21.299639, -22.439577, -6.873338, 21.299639, -22.073904, -6.873338, 21.299639, -22.073904, -7.703304, 12.960274, -22.073904, -7.2123933, 13.119982, -22.182995, -7.11552, 12.960274, -22.439577, -7.146065, 17.195192, -22.073904, -6.783447, 17.195192, -22.165104, -6.539082, 16.136572, -22.073904, -6.5465007, 17.195192, -22.073904, -6.783447, 18.221523, -22.073904, -6.6224284, 17.195192, -22.165104, -6.539082, 17.195192, -22.073904, -6.783447, 21.299639, -22.073904, -6.873338, 18.221523, -22.073904, -6.6224284, 17.195192, -22.073904, -6.783447, 21.299639, -22.073904, -7.703304, 21.299639, -22.073904, -6.873338, 21.299639, -22.073904, -7.703304, 17.195192, -22.073904, -6.783447, 17.195192, -22.073904, -7.5178485, 16.136572, -22.073904, -6.5465007, 17.195192, -22.073904, -7.5178485, 17.195192, -22.073904, -6.783447, 17.195192, -22.073904, -7.5178485, 12.960274, -22.073904, -7.2123933, 12.960274, -22.073904, -7.703304, 17.195192, -22.073904, -7.5178485, 13.688129, -22.073904, -7.112902, 12.960274, -22.073904, -7.2123933, 16.136572, -22.073904, -6.5465007, 13.688129, -22.073904, -7.112902, 17.195192, -22.073904, -7.5178485, 13.119982, -22.182995, -7.11552, 12.960274, -22.073904, -7.2123933, 13.688129, -22.073904, -7.112902, 12.960274, -22.073904, -6.9366107, 13.119982, -22.182995, -7.11552, 13.688129, -22.073904, -7.112902, 13.688129, -22.073904, -7.112902, 16.136572, -22.073904, -6.5465007, 12.960274, -22.073904, -6.9366107, 12.960274, -22.073904, -6.9366107, 16.136572, -22.073904, -6.5465007, 12.960274, -22.073904, -6.570064, 12.960274, -22.439577, -7.703304, 12.960274, -22.073904, -7.2123933, 12.960274, -22.439577, -7.146065, 12.960274, -22.439577, -7.703304, 12.960274, -22.073904, -7.703304, 12.960274, -22.073904, -7.2123933, 12.960274, -22.073904, -6.9366107, 12.960274, -22.439577, -6.570064, 12.960274, -22.439577, -7.146065, 12.960274, -22.073904, -6.9366107, 12.960274, -22.073904, -6.570064, 12.960274, -22.439577, -6.570064, 13.119982, -22.182995, -7.11552, 12.960274, -22.073904, -6.9366107, 12.960274, -22.439577, -7.146065, 12.960274, -22.073904, -6.570064, 17.195192, -22.439577, -6.539082, 12.960274, -22.439577, -6.570064, 17.195192, -22.439577, -6.539082, 12.960274, -22.073904, -6.570064, 16.136572, -22.073904, -6.5465007, 17.195192, -22.439577, -6.539082, 16.136572, -22.073904, -6.5465007, 17.195192, -22.165104, -6.539082, 17.195192, -22.165104, -6.539082, 21.299639, -22.439577, -6.873338, 17.195192, -22.439577, -6.539082, 17.195192, -22.165104, -6.539082, 21.299639, -22.073904, -6.873338, 21.299639, -22.439577, -6.873338, 21.299639, -22.073904, -6.873338, 17.195192, -22.165104, -6.539082, 18.221523, -22.073904, -6.6224284, 14.394604, -22.439577, -15.51292, 21.493383, -22.073904, -15.67263, 14.394604, -22.073904, -15.51292, 14.394604, -22.439577, -15.51292, 21.493383, -22.439577, -15.67263, 21.493383, -22.073904, -15.67263, 12.76609, -22.073904, -15.519905, 14.394604, -22.439577, -15.51292, 14.394604, -22.073904, -15.51292, 12.76609, -22.073904, -15.519905, 12.76609, -22.439577, -15.519905, 14.394604, -22.439577, -15.51292, 14.394604, -22.439577, -14.504482, 21.493383, -22.439577, -15.67263, 14.394604, -22.439577, -15.51292, 14.394604, -22.439577, -14.504482, 21.493383, -22.439577, -14.689938, 21.493383, -22.439577, -15.67263, 12.76609, -22.439577, -15.519905, 14.394604, -22.439577, -14.504482, 14.394604, -22.439577, -15.51292, 12.76609, -22.439577, -15.519905, 12.76609, -22.439577, -14.689938, 14.394604, -22.439577, -14.504482, 12.76609, -22.439577, -15.519905, 12.76609, -22.073904, -14.689938, 12.76609, -22.439577, -14.689938, 12.76609, -22.439577, -15.519905, 12.76609, -22.073904, -15.519905, 12.76609, -22.073904, -14.689938, 14.394604, -22.073904, -14.756702, 14.394604, -22.165104, -14.504482, 13.987476, -22.073904, -14.550737, 14.394604, -22.073904, -14.756702, 16.1693, -22.073904, -14.550737, 14.394604, -22.165104, -14.504482, 14.394604, -22.073904, -14.756702, 20.162472, -22.073904, -14.655029, 16.1693, -22.073904, -14.550737, 13.987476, -22.073904, -14.550737, 14.394604, -22.073904, -15.51292, 14.394604, -22.073904, -14.756702, 13.987476, -22.073904, -14.550737, 12.76609, -22.073904, -15.519905, 14.394604, -22.073904, -15.51292, 12.76609, -22.073904, -15.519905, 13.987476, -22.073904, -14.550737, 12.76609, -22.073904, -14.689938, 21.493383, -22.073904, -15.67263, 14.394604, -22.073904, -14.756702, 14.394604, -22.073904, -15.51292, 14.394604, -22.073904, -14.756702, 21.493383, -22.073904, -15.67263, 20.162472, -22.073904, -14.655029, 20.162472, -22.073904, -14.655029, 21.493383, -22.073904, -15.67263, 21.493383, -22.073904, -14.935175, 20.162472, -22.073904, -14.655029, 21.493383, -22.073904, -14.935175, 21.493383, -22.165104, -14.689938, 12.76609, -22.073904, -14.689938, 14.394604, -22.439577, -14.504482, 12.76609, -22.439577, -14.689938, 14.394604, -22.439577, -14.504482, 12.76609, -22.073904, -14.689938, 13.987476, -22.073904, -14.550737, 14.394604, -22.439577, -14.504482, 13.987476, -22.073904, -14.550737, 14.394604, -22.165104, -14.504482, 14.394604, -22.165104, -14.504482, 21.493383, -22.439577, -14.689938, 14.394604, -22.439577, -14.504482, 14.394604, -22.165104, -14.504482, 20.162472, -22.073904, -14.655029, 21.493383, -22.439577, -14.689938, 21.493383, -22.439577, -14.689938, 20.162472, -22.073904, -14.655029, 21.493383, -22.165104, -14.689938, 20.162472, -22.073904, -14.655029, 14.394604, -22.165104, -14.504482, 16.1693, -22.073904, -14.550737, 21.493383, -22.165104, -14.689938, 21.493383, -22.439577, -15.67263, 21.493383, -22.439577, -14.689938, 21.493383, -22.439577, -15.67263, 21.493383, -22.165104, -14.689938, 21.493383, -22.073904, -14.935175, 21.493383, -22.439577, -15.67263, 21.493383, -22.073904, -14.935175, 21.493383, -22.073904, -15.67263, 14.33395, -22.439577, -8.868834, 21.590258, -22.073904, -9.028543, 14.33395, -22.073904, -8.868834, 14.33395, -22.439577, -8.868834, 21.590258, -22.439577, -9.028543, 21.590258, -22.073904, -9.028543, 12.669218, -22.073904, -8.875814, 14.33395, -22.439577, -8.868834, 14.33395, -22.073904, -8.868834, 12.669218, -22.073904, -8.875814, 12.669218, -22.439577, -8.875814, 14.33395, -22.439577, -8.868834, 14.33395, -22.439577, -7.860395, 21.590258, -22.439577, -9.028543, 14.33395, -22.439577, -8.868834, 14.33395, -22.439577, -7.860395, 21.590258, -22.439577, -8.045849, 21.590258, -22.439577, -9.028543, 12.669218, -22.439577, -8.875814, 14.33395, -22.439577, -7.860395, 14.33395, -22.439577, -8.868834, 12.669218, -22.439577, -8.875814, 12.669218, -22.439577, -8.045849, 14.33395, -22.439577, -7.860395, 12.669218, -22.439577, -8.875814, 12.669218, -22.073904, -8.045849, 12.669218, -22.439577, -8.045849, 12.669218, -22.439577, -8.875814, 12.669218, -22.073904, -8.875814, 12.669218, -22.073904, -8.045849, 14.33395, -22.073904, -8.112614, 14.33395, -22.165104, -7.860395, 13.917658, -22.073904, -7.906649, 14.33395, -22.073904, -8.112614, 16.147917, -22.073904, -7.906649, 14.33395, -22.165104, -7.860395, 14.33395, -22.073904, -8.112614, 20.229671, -22.073904, -8.011377, 16.147917, -22.073904, -7.906649, 13.917658, -22.073904, -7.906649, 14.33395, -22.073904, -8.868834, 14.33395, -22.073904, -8.112614, 13.917658, -22.073904, -7.906649, 12.669218, -22.073904, -8.875814, 14.33395, -22.073904, -8.868834, 12.669218, -22.073904, -8.875814, 13.917658, -22.073904, -7.906649, 12.669218, -22.073904, -8.045849, 21.590258, -22.073904, -9.028543, 14.33395, -22.073904, -8.112614, 14.33395, -22.073904, -8.868834, 14.33395, -22.073904, -8.112614, 21.590258, -22.073904, -9.028543, 20.229671, -22.073904, -8.011377, 20.229671, -22.073904, -8.011377, 21.590258, -22.073904, -9.028543, 21.590258, -22.073904, -8.29196, 20.229671, -22.073904, -8.011377, 21.590258, -22.073904, -8.29196, 21.590258, -22.165104, -8.045849, 12.669218, -22.073904, -8.045849, 14.33395, -22.439577, -7.860395, 12.669218, -22.439577, -8.045849, 14.33395, -22.439577, -7.860395, 12.669218, -22.073904, -8.045849, 13.917658, -22.073904, -7.906649, 14.33395, -22.439577, -7.860395, 13.917658, -22.073904, -7.906649, 14.33395, -22.165104, -7.860395, 14.33395, -22.165104, -7.860395, 21.590258, -22.439577, -8.045849, 14.33395, -22.439577, -7.860395, 14.33395, -22.165104, -7.860395, 20.229671, -22.073904, -8.011377, 21.590258, -22.439577, -8.045849, 21.590258, -22.439577, -8.045849, 20.229671, -22.073904, -8.011377, 21.590258, -22.165104, -8.045849, 20.229671, -22.073904, -8.011377, 14.33395, -22.165104, -7.860395, 16.147917, -22.073904, -7.906649, 21.590258, -22.165104, -8.045849, 21.590258, -22.439577, -9.028543, 21.590258, -22.439577, -8.045849, 21.590258, -22.439577, -9.028543, 21.590258, -22.165104, -8.045849, 21.590258, -22.073904, -8.29196, 21.590258, -22.439577, -9.028543, 21.590258, -22.073904, -8.29196, 21.590258, -22.073904, -9.028543, 20.608437, -25.90344, 5.6272016, 21.338474, -21.174994, 5.6272016, 21.338474, -25.90344, 5.6272016, 20.608437, -25.90344, 5.6272016, 20.608437, -21.723503, 5.6272016, 21.338474, -21.174994, 5.6272016, 20.608437, -21.723503, 5.6272016, 21.338474, -21.174994, 4.8975997, 21.338474, -21.174994, 5.6272016, 20.608437, -21.723503, 5.6272016, 20.608437, -21.174994, 4.8975997, 21.338474, -21.174994, 4.8975997, 20.608437, -21.174994, 4.8975997, 21.338474, -25.90344, 4.8975997, 21.338474, -21.174994, 4.8975997, 20.608437, -21.174994, 4.8975997, 20.608437, -25.90344, 4.8975997, 21.338474, -25.90344, 4.8975997, 20.608437, -25.90344, 4.8975997, 21.338474, -25.90344, 5.6272016, 21.338474, -25.90344, 4.8975997, 20.608437, -25.90344, 4.8975997, 20.608437, -25.90344, 5.6272016, 21.338474, -25.90344, 5.6272016, 21.338474, -25.90344, 5.6272016, 21.338474, -21.174994, 4.8975997, 21.338474, -25.90344, 4.8975997, 21.338474, -25.90344, 5.6272016, 21.338474, -21.174994, 5.6272016, 21.338474, -21.174994, 4.8975997, 20.608437, -25.90344, 4.8975997, 20.608437, -21.723503, 5.6272016, 20.608437, -25.90344, 5.6272016, 20.608437, -25.90344, 4.8975997, 20.608437, -21.174994, 4.8975997, 20.608437, -21.723503, 5.6272016, 20.752874, -22.635942, 4.8980365, 20.984583, -22.543432, 4.8980365, 20.984583, -22.635942, 4.8980365, 20.752874, -22.635942, 4.8980365, 20.752874, -22.543432, 4.8980365, 20.984583, -22.543432, 4.8980365, 20.752874, -22.543432, 4.8980365, 20.984583, -22.543432, -19.742168, 20.984583, -22.543432, 4.8980365, 20.752874, -22.543432, 4.8980365, 20.752874, -22.543432, -19.742168, 20.984583, -22.543432, -19.742168, 20.752874, -22.543432, -19.742168, 20.984583, -22.635942, -19.742168, 20.984583, -22.543432, -19.742168, 20.752874, -22.543432, -19.742168, 20.752874, -22.635942, -19.742168, 20.984583, -22.635942, -19.742168, 20.752874, -22.635942, -19.742168, 20.984583, -22.635942, 4.8980365, 20.984583, -22.635942, -19.742168, 20.752874, -22.635942, -19.742168, 20.752874, -22.635942, 4.8980365, 20.984583, -22.635942, 4.8980365, 20.984583, -22.635942, 4.8980365, 20.984583, -22.543432, -19.742168, 20.984583, -22.635942, -19.742168, 20.984583, -22.635942, 4.8980365, 20.984583, -22.543432, 4.8980365, 20.984583, -22.543432, -19.742168, 20.752874, -22.635942, -19.742168, 20.752874, -22.543432, 4.8980365, 20.752874, -22.635942, 4.8980365, 20.752874, -22.635942, -19.742168, 20.752874, -22.543432, -19.742168, 20.752874, -22.543432, 4.8980365, 12.886963, -25.348385, -5.927299, 13.6170025, -20.619938, -5.927299, 13.6170025, -25.348385, -5.927299, 12.886963, -25.348385, -5.927299, 12.886963, -20.619938, -5.927299, 13.6170025, -20.619938, -5.927299, 12.886963, -25.348385, -6.6573377, 13.6170025, -25.348385, -5.927299, 13.6170025, -25.348385, -6.6573377, 12.886963, -25.348385, -6.6573377, 12.886963, -25.348385, -5.927299, 13.6170025, -25.348385, -5.927299, 13.6170025, -25.348385, -5.927299, 13.6170025, -20.619938, -6.6573377, 13.6170025, -25.348385, -6.6573377, 13.6170025, -25.348385, -5.927299, 13.6170025, -20.619938, -5.927299, 13.6170025, -20.619938, -6.6573377, 12.886963, -21.80205, -6.6573377, 13.069365, -20.619938, -6.6573377, 12.886963, -20.619938, -6.474937, 12.886963, -25.348385, -5.927299, 12.886963, -21.80205, -6.6573377, 12.886963, -20.619938, -6.474937, 12.886963, -21.80205, -6.6573377, 12.886963, -25.348385, -5.927299, 12.886963, -25.348385, -6.6573377, 12.886963, -25.348385, -5.927299, 12.886963, -20.619938, -6.474937, 12.886963, -20.619938, -5.927299, 12.886963, -20.619938, -6.474937, 13.6170025, -20.619938, -5.927299, 12.886963, -20.619938, -5.927299, 13.6170025, -20.619938, -5.927299, 12.886963, -20.619938, -6.474937, 13.069365, -20.619938, -6.6573377, 13.6170025, -20.619938, -5.927299, 13.069365, -20.619938, -6.6573377, 13.6170025, -20.619938, -6.6573377, 12.886963, -25.348385, -6.6573377, 13.069365, -20.619938, -6.6573377, 12.886963, -21.80205, -6.6573377, 13.069365, -20.619938, -6.6573377, 12.886963, -25.348385, -6.6573377, 13.6170025, -25.348385, -6.6573377, 13.069365, -20.619938, -6.6573377, 13.6170025, -25.348385, -6.6573377, 13.6170025, -20.619938, -6.6573377, 12.886963, -26.235077, -13.537062, 13.6170025, -21.50663, -13.537062, 13.6170025, -26.235077, -13.537062, 12.886963, -26.235077, -13.537062, 12.886963, -21.50663, -13.537062, 13.6170025, -21.50663, -13.537062, 12.886963, -26.235077, -14.2666645, 13.6170025, -26.235077, -13.537062, 13.6170025, -26.235077, -14.2666645, 12.886963, -26.235077, -14.2666645, 12.886963, -26.235077, -13.537062, 13.6170025, -26.235077, -13.537062, 13.6170025, -26.235077, -13.537062, 13.6170025, -21.50663, -14.2666645, 13.6170025, -26.235077, -14.2666645, 13.6170025, -26.235077, -13.537062, 13.6170025, -21.50663, -13.537062, 13.6170025, -21.50663, -14.2666645, 12.886963, -22.688742, -14.2666645, 13.069365, -21.50663, -14.2666645, 12.886963, -21.50663, -14.084265, 12.886963, -26.235077, -13.537062, 12.886963, -22.688742, -14.2666645, 12.886963, -21.50663, -14.084265, 12.886963, -22.688742, -14.2666645, 12.886963, -26.235077, -13.537062, 12.886963, -26.235077, -14.2666645, 12.886963, -26.235077, -13.537062, 12.886963, -21.50663, -14.084265, 12.886963, -21.50663, -13.537062, 12.886963, -21.50663, -14.084265, 13.6170025, -21.50663, -13.537062, 12.886963, -21.50663, -13.537062, 13.6170025, -21.50663, -13.537062, 12.886963, -21.50663, -14.084265, 13.069365, -21.50663, -14.2666645, 13.6170025, -21.50663, -13.537062, 13.069365, -21.50663, -14.2666645, 13.6170025, -21.50663, -14.2666645, 12.886963, -26.235077, -14.2666645, 13.069365, -21.50663, -14.2666645, 12.886963, -22.688742, -14.2666645, 13.069365, -21.50663, -14.2666645, 12.886963, -26.235077, -14.2666645, 13.6170025, -26.235077, -14.2666645, 13.069365, -21.50663, -14.2666645, 13.6170025, -26.235077, -14.2666645, 13.6170025, -21.50663, -14.2666645, 21.21673, -25.99464, -5.8286805, 21.946331, -21.266193, -5.8286805, 21.946331, -25.99464, -5.8286805, 21.21673, -25.99464, -5.8286805, 21.21673, -21.266193, -5.8286805, 21.946331, -21.266193, -5.8286805, 21.21673, -25.99464, -6.558719, 21.946331, -25.99464, -5.8286805, 21.946331, -25.99464, -6.558719, 21.21673, -25.99464, -6.558719, 21.21673, -25.99464, -5.8286805, 21.946331, -25.99464, -5.8286805, 21.946331, -25.99464, -5.8286805, 21.946331, -21.266193, -6.558719, 21.946331, -25.99464, -6.558719, 21.946331, -25.99464, -5.8286805, 21.946331, -21.266193, -5.8286805, 21.946331, -21.266193, -6.558719, 21.21673, -22.448305, -6.558719, 21.39913, -21.266193, -6.558719, 21.21673, -21.266193, -6.3763185, 21.21673, -25.99464, -5.8286805, 21.21673, -22.448305, -6.558719, 21.21673, -21.266193, -6.3763185, 21.21673, -22.448305, -6.558719, 21.21673, -25.99464, -5.8286805, 21.21673, -25.99464, -6.558719, 21.21673, -25.99464, -5.8286805, 21.21673, -21.266193, -6.3763185, 21.21673, -21.266193, -5.8286805, 21.21673, -21.266193, -6.3763185, 21.946331, -21.266193, -5.8286805, 21.21673, -21.266193, -5.8286805, 21.946331, -21.266193, -5.8286805, 21.21673, -21.266193, -6.3763185, 21.39913, -21.266193, -6.558719, 21.946331, -21.266193, -5.8286805, 21.39913, -21.266193, -6.558719, 21.946331, -21.266193, -6.558719, 21.21673, -25.99464, -6.558719, 21.39913, -21.266193, -6.558719, 21.21673, -22.448305, -6.558719, 21.39913, -21.266193, -6.558719, 21.21673, -25.99464, -6.558719, 21.946331, -25.99464, -6.558719, 21.39913, -21.266193, -6.558719, 21.946331, -25.99464, -6.558719, 21.946331, -21.266193, -6.558719, 21.21673, -25.99464, -13.537062, 21.946331, -21.266193, -13.537062, 21.946331, -25.99464, -13.537062, 21.21673, -25.99464, -13.537062, 21.21673, -21.266193, -13.537062, 21.946331, -21.266193, -13.537062, 21.21673, -25.99464, -14.2666645, 21.946331, -25.99464, -13.537062, 21.946331, -25.99464, -14.2666645, 21.21673, -25.99464, -14.2666645, 21.21673, -25.99464, -13.537062, 21.946331, -25.99464, -13.537062, 21.946331, -25.99464, -13.537062, 21.946331, -21.266193, -14.2666645, 21.946331, -25.99464, -14.2666645, 21.946331, -25.99464, -13.537062, 21.946331, -21.266193, -13.537062, 21.946331, -21.266193, -14.2666645, 21.21673, -22.448305, -14.2666645, 21.39913, -21.266193, -14.2666645, 21.21673, -21.266193, -14.084265, 21.21673, -25.99464, -13.537062, 21.21673, -22.448305, -14.2666645, 21.21673, -21.266193, -14.084265, 21.21673, -22.448305, -14.2666645, 21.21673, -25.99464, -13.537062, 21.21673, -25.99464, -14.2666645, 21.21673, -25.99464, -13.537062, 21.21673, -21.266193, -14.084265, 21.21673, -21.266193, -13.537062, 21.21673, -21.266193, -14.084265, 21.946331, -21.266193, -13.537062, 21.21673, -21.266193, -13.537062, 21.946331, -21.266193, -13.537062, 21.21673, -21.266193, -14.084265, 21.39913, -21.266193, -14.2666645, 21.946331, -21.266193, -13.537062, 21.39913, -21.266193, -14.2666645, 21.946331, -21.266193, -14.2666645, 21.21673, -25.99464, -14.2666645, 21.39913, -21.266193, -14.2666645, 21.21673, -22.448305, -14.2666645, 21.39913, -21.266193, -14.2666645, 21.21673, -25.99464, -14.2666645, 21.946331, -25.99464, -14.2666645, 21.39913, -21.266193, -14.2666645, 21.946331, -25.99464, -14.2666645, 21.946331, -21.266193, -14.2666645, -13.073534, -0.35833585, 29.034882, -8.669889, -0.18640822, 28.876835, -13.057354, 0.007337749, 29.029753, -13.073534, -0.35833585, 29.034882, -8.686073, -0.5516454, 28.882399, -8.669889, -0.18640822, 28.876835, -17.582396, 0.2010836, 28.810827, -13.073534, -0.35833585, 29.034882, -13.057354, 0.007337749, 29.029753, -17.582396, 0.2010836, 28.810827, -17.59858, -0.16415358, 28.816393, -13.073534, -0.35833585, 29.034882, -13.080118, -0.3434996, 30.014496, -8.686073, -0.5516454, 28.882399, -13.073534, -0.35833585, 29.034882, -13.080118, -0.3434996, 30.014496, -8.69165, -0.538991, 29.712345, -8.686073, -0.5516454, 28.882399, -13.073534, -0.35833585, 29.034882, -17.606195, -0.1471355, 29.949606, -13.080118, -0.3434996, 30.014496, -13.073534, -0.35833585, 29.034882, -17.602324, -0.15586269, 29.373617, -17.606195, -0.1471355, 29.949606, -17.602324, -0.15586269, 29.373617, -13.073534, -0.35833585, 29.034882, -17.59858, -0.16415358, 28.816393, -8.69165, -0.538991, 29.712345, -8.669889, -0.18640822, 28.876835, -8.686073, -0.5516454, 28.882399, -8.69165, -0.538991, 29.712345, -8.675467, -0.17375374, 29.706781, -8.669889, -0.18640822, 28.876835, -17.585695, 0.20850176, 29.301727, -17.420107, 0.093301594, 29.40146, -17.602324, -0.15586269, 29.373617, -13.06229, 0.01824683, 29.764137, -13.067871, -0.06946254, 30.010216, -14.195347, 0.07104677, 29.993038, -13.06229, 0.01824683, 29.764137, -11.966818, -0.027135193, 29.933395, -13.067871, -0.06946254, 30.010216, -13.06229, 0.01824683, 29.764137, -8.675467, -0.17375374, 29.706781, -11.966818, -0.027135193, 29.933395, -13.06229, 0.01824683, 29.764137, -8.669889, -0.18640822, 28.876835, -8.675467, -0.17375374, 29.706781, -8.669889, -0.18640822, 28.876835, -13.06229, 0.01824683, 29.764137, -13.057354, 0.007337749, 29.029753, -14.195347, 0.07104677, 29.993038, -13.057354, 0.007337749, 29.029753, -13.06229, 0.01824683, 29.764137, -13.057354, 0.007337749, 29.029753, -17.585695, 0.20850176, 29.301727, -17.582396, 0.2010836, 28.810827, -13.057354, 0.007337749, 29.029753, -16.80835, 0.17621082, 29.407318, -17.585695, 0.20850176, 29.301727, -14.195347, 0.07104677, 29.993038, -16.80835, 0.17621082, 29.407318, -13.057354, 0.007337749, 29.029753, -17.420107, 0.093301594, 29.40146, -17.585695, 0.20850176, 29.301727, -16.80835, 0.17621082, 29.407318, -17.587553, 0.21286553, 29.57794, -17.420107, 0.093301594, 29.40146, -16.80835, 0.17621082, 29.407318, -16.80835, 0.17621082, 29.407318, -14.195347, 0.07104677, 29.993038, -17.587553, 0.21286553, 29.57794, -17.587553, 0.21286553, 29.57794, -14.195347, 0.07104677, 29.993038, -17.590448, 0.21810168, 29.944038, -17.59858, -0.16415358, 28.816393, -17.585695, 0.20850176, 29.301727, -17.602324, -0.15586269, 29.373617, -17.59858, -0.16415358, 28.816393, -17.582396, 0.2010836, 28.810827, -17.585695, 0.20850176, 29.301727, -17.587553, 0.21286553, 29.57794, -17.606195, -0.1471355, 29.949606, -17.602324, -0.15586269, 29.373617, -17.587553, 0.21286553, 29.57794, -17.590448, 0.21810168, 29.944038, -17.606195, -0.1471355, 29.949606, -17.420107, 0.093301594, 29.40146, -17.587553, 0.21286553, 29.57794, -17.602324, -0.15586269, 29.373617, -17.590448, 0.21810168, 29.944038, -13.080118, -0.3434996, 30.014496, -17.606195, -0.1471355, 29.949606, -13.080118, -0.3434996, 30.014496, -17.590448, 0.21810168, 29.944038, -13.067871, -0.06946254, 30.010216, -13.067871, -0.06946254, 30.010216, -17.590448, 0.21810168, 29.944038, -14.195347, 0.07104677, 29.993038, -13.067871, -0.06946254, 30.010216, -8.675467, -0.17375374, 29.706781, -13.080118, -0.3434996, 30.014496, -13.080118, -0.3434996, 30.014496, -8.675467, -0.17375374, 29.706781, -8.69165, -0.538991, 29.712345, -8.675467, -0.17375374, 29.706781, -13.067871, -0.06946254, 30.010216, -11.966818, -0.027135193, 29.933395, -9.878, -0.097390115, 31.312849, -8.993242, -0.5014638, 31.344105, -9.893747, -0.4626273, 31.318417, -9.878, -0.097390115, 31.312849, -8.977062, -0.13622653, 31.338978, -8.993242, -0.5014638, 31.344105, -9.893747, -0.4626273, 31.318417, -17.31272, 0.1343196, 31.278593, -9.878, -0.097390115, 31.312849, -9.878, -0.097390115, 31.312849, -17.31272, 0.1343196, 31.278593, -15.451195, 0.14479238, 31.285868, -17.31272, 0.1343196, 31.278593, -9.893747, -0.4626273, 31.318417, -17.324528, -0.13971746, 31.28244, -8.970457, -0.15106285, 30.356306, -9.878, -0.097390115, 31.312849, -9.871372, -0.11222637, 30.326687, -15.451195, 0.14479238, 31.285868, -9.871372, -0.11222637, 30.326687, -9.878, -0.097390115, 31.312849, -15.451195, 0.14479238, 31.285868, -17.303205, 0.21330172, 30.447365, -9.871372, -0.11222637, 30.326687, -17.303205, 0.21330172, 30.447365, -15.451195, 0.14479238, 31.285868, -17.307388, 0.22246522, 31.069607, -17.307388, 0.22246522, 31.069607, -15.451195, 0.14479238, 31.285868, -17.31272, 0.1343196, 31.278593, -9.878, -0.097390115, 31.312849, -8.970457, -0.15106285, 30.356306, -9.454359, -0.122262776, 30.87016, -9.454359, -0.122262776, 30.87016, -8.970457, -0.15106285, 30.356306, -8.973118, -0.14495373, 30.75208, -8.973118, -0.14495373, 30.75208, -9.062445, -0.27935404, 30.862755, -9.454359, -0.122262776, 30.87016, -9.062445, -0.27935404, 30.862755, -8.974958, -0.14102644, 31.026112, -9.454359, -0.122262776, 30.87016, -9.878, -0.097390115, 31.312849, -9.454359, -0.122262776, 30.87016, -8.974958, -0.14102644, 31.026112, -9.878, -0.097390115, 31.312849, -8.974958, -0.14102644, 31.026112, -8.977062, -0.13622653, 31.338978, -9.8871155, -0.47789997, 30.331818, -8.970457, -0.15106285, 30.356306, -9.871372, -0.11222637, 30.326687, -9.8871155, -0.47789997, 30.331818, -8.986637, -0.5163001, 30.361433, -8.970457, -0.15106285, 30.356306, -17.303205, 0.21330172, 30.447365, -9.8871155, -0.47789997, 30.331818, -9.871372, -0.11222637, 30.326687, -17.303205, 0.21330172, 30.447365, -17.318953, -0.15193558, 30.45293, -9.8871155, -0.47789997, 30.331818, -8.993242, -0.5014638, 31.344105, -9.8871155, -0.47789997, 30.331818, -9.893747, -0.4626273, 31.318417, -9.8871155, -0.47789997, 30.331818, -8.993242, -0.5014638, 31.344105, -8.989674, -0.50975466, 30.81306, -9.8871155, -0.47789997, 30.331818, -8.989674, -0.50975466, 30.81306, -8.986637, -0.5163001, 30.361433, -17.318953, -0.15193558, 30.45293, -9.893747, -0.4626273, 31.318417, -9.8871155, -0.47789997, 30.331818, -17.318953, -0.15193558, 30.45293, -17.324528, -0.13971746, 31.28244, -9.893747, -0.4626273, 31.318417, -8.974958, -0.14102644, 31.026112, -9.062445, -0.27935404, 30.862755, -8.989674, -0.50975466, 30.81306, -9.062445, -0.27935404, 30.862755, -8.973118, -0.14495373, 30.75208, -8.989674, -0.50975466, 30.81306, -8.993242, -0.5014638, 31.344105, -8.974958, -0.14102644, 31.026112, -8.989674, -0.50975466, 30.81306, -8.993242, -0.5014638, 31.344105, -8.977062, -0.13622653, 31.338978, -8.974958, -0.14102644, 31.026112, -8.973118, -0.14495373, 30.75208, -8.986637, -0.5163001, 30.361433, -8.989674, -0.50975466, 30.81306, -8.973118, -0.14495373, 30.75208, -8.970457, -0.15106285, 30.356306, -8.986637, -0.5163001, 30.361433, -17.303205, 0.21330172, 30.447365, -17.324528, -0.13971746, 31.28244, -17.318953, -0.15193558, 30.45293, -17.324528, -0.13971746, 31.28244, -17.303205, 0.21330172, 30.447365, -17.31272, 0.1343196, 31.278593, -17.31272, 0.1343196, 31.278593, -17.303205, 0.21330172, 30.447365, -17.307388, 0.22246522, 31.069607, -13.105944, -0.29549986, 33.143127, -8.988548, -0.111353934, 32.98316, -13.089764, 0.069737375, 33.138, -13.105944, -0.29549986, 33.143127, -9.004295, -0.47659117, 32.988728, -8.988548, -0.111353934, 32.98316, -17.31983, 0.25082868, 32.92106, -13.105944, -0.29549986, 33.143127, -13.089764, 0.069737375, 33.138, -17.31983, 0.25082868, 32.92106, -17.335577, -0.11440843, 32.926624, -13.105944, -0.29549986, 33.143127, -13.112524, -0.2806636, 34.12231, -9.004295, -0.47659117, 32.988728, -13.105944, -0.29549986, 33.143127, -13.112524, -0.2806636, 34.12231, -9.009869, -0.4639367, 33.818237, -9.004295, -0.47659117, 32.988728, -13.105944, -0.29549986, 33.143127, -17.343197, -0.09739047, 34.060276, -13.112524, -0.2806636, 34.12231, -13.105944, -0.29549986, 33.143127, -17.339323, -0.10611755, 33.483852, -17.343197, -0.09739047, 34.060276, -17.339323, -0.10611755, 33.483852, -13.105944, -0.29549986, 33.143127, -17.335577, -0.11440843, 32.926624, -9.009869, -0.4639367, 33.818237, -8.988548, -0.111353934, 32.98316, -9.004295, -0.47659117, 32.988728, -9.009869, -0.4639367, 33.818237, -8.994122, -0.09869945, 33.812668, -8.988548, -0.111353934, 32.98316, -17.323126, 0.25824696, 33.411522, -17.16845, 0.14348298, 33.51162, -17.339323, -0.10611755, 33.483852, -13.0947, 0.080646336, 33.872387, -13.100277, -0.0066265464, 34.118027, -14.154011, 0.1303919, 34.101345, -13.0947, 0.080646336, 33.872387, -12.070787, 0.038755357, 34.040726, -13.100277, -0.0066265464, 34.118027, -13.0947, 0.080646336, 33.872387, -8.994122, -0.09869945, 33.812668, -12.070787, 0.038755357, 34.040726, -13.0947, 0.080646336, 33.872387, -8.988548, -0.111353934, 32.98316, -8.994122, -0.09869945, 33.812668, -8.988548, -0.111353934, 32.98316, -13.0947, 0.080646336, 33.872387, -13.089764, 0.069737375, 33.138, -14.154011, 0.1303919, 34.101345, -13.089764, 0.069737375, 33.138, -13.0947, 0.080646336, 33.872387, -13.089764, 0.069737375, 33.138, -17.323126, 0.25824696, 33.411522, -17.31983, 0.25082868, 32.92106, -13.089764, 0.069737375, 33.138, -16.596401, 0.22813767, 33.51721, -17.323126, 0.25824696, 33.411522, -14.154011, 0.1303919, 34.101345, -16.596401, 0.22813767, 33.51721, -13.089764, 0.069737375, 33.138, -17.16845, 0.14348298, 33.51162, -17.323126, 0.25824696, 33.411522, -16.596401, 0.22813767, 33.51721, -17.324986, 0.2621742, 33.68817, -17.16845, 0.14348298, 33.51162, -16.596401, 0.22813767, 33.51721, -16.596401, 0.22813767, 33.51721, -14.154011, 0.1303919, 34.101345, -17.324986, 0.2621742, 33.68817, -17.324986, 0.2621742, 33.68817, -14.154011, 0.1303919, 34.101345, -17.32745, 0.26784688, 34.05471, -17.335577, -0.11440843, 32.926624, -17.323126, 0.25824696, 33.411522, -17.339323, -0.10611755, 33.483852, -17.335577, -0.11440843, 32.926624, -17.31983, 0.25082868, 32.92106, -17.323126, 0.25824696, 33.411522, -17.324986, 0.2621742, 33.68817, -17.343197, -0.09739047, 34.060276, -17.339323, -0.10611755, 33.483852, -17.324986, 0.2621742, 33.68817, -17.32745, 0.26784688, 34.05471, -17.343197, -0.09739047, 34.060276, -17.16845, 0.14348298, 33.51162, -17.324986, 0.2621742, 33.68817, -17.339323, -0.10611755, 33.483852, -17.32745, 0.26784688, 34.05471, -13.112524, -0.2806636, 34.12231, -17.343197, -0.09739047, 34.060276, -13.112524, -0.2806636, 34.12231, -17.32745, 0.26784688, 34.05471, -13.100277, -0.0066265464, 34.118027, -13.100277, -0.0066265464, 34.118027, -17.32745, 0.26784688, 34.05471, -14.154011, 0.1303919, 34.101345, -13.100277, -0.0066265464, 34.118027, -8.994122, -0.09869945, 33.812668, -13.112524, -0.2806636, 34.12231, -13.112524, -0.2806636, 34.12231, -8.994122, -0.09869945, 33.812668, -9.009869, -0.4639367, 33.818237, -8.994122, -0.09869945, 33.812668, -13.100277, -0.0066265464, 34.118027, -12.070787, 0.038755357, 34.040726, -15.954979, -0.19208127, 31.771221, -8.68903, -0.14408118, 31.659903, -15.939232, 0.17359239, 31.765654, -15.954979, -0.19208127, 31.771221, -8.704777, -0.50931835, 31.66547, -8.68903, -0.14408118, 31.659903, -17.602564, 0.24559253, 31.74662, -15.954979, -0.19208127, 31.771221, -15.939232, 0.17359239, 31.765654, -17.602564, 0.24559253, 31.74662, -17.61831, -0.11964476, 31.752188, -15.954979, -0.19208127, 31.771221, -15.961756, -0.1768086, 32.779636, -8.704777, -0.50931835, 31.66547, -15.954979, -0.19208127, 31.771221, -15.961756, -0.1768086, 32.779636, -8.71138, -0.49448207, 32.64814, -8.704777, -0.50931835, 31.66547, -17.61831, -0.11964476, 31.752188, -15.961756, -0.1768086, 32.779636, -15.954979, -0.19208127, 31.771221, -17.61831, -0.11964476, 31.752188, -17.623884, -0.10699028, 32.5817, -15.961756, -0.1768086, 32.779636, -17.61831, -0.11964476, 31.752188, -17.608137, 0.25824708, 32.57613, -17.623884, -0.10699028, 32.5817, -17.61831, -0.11964476, 31.752188, -17.602564, 0.24559253, 31.74662, -17.608137, 0.25824708, 32.57613, -15.944313, 0.18493778, 32.52186, -15.949944, 0.09722847, 32.775352, -16.361544, 0.20588332, 32.72502, -15.944313, 0.18493778, 32.52186, -14.133524, 0.109446704, 32.741302, -15.949944, 0.09722847, 32.775352, -15.944313, 0.18493778, 32.52186, -10.055107, -0.069462895, 32.667473, -14.133524, 0.109446704, 32.741302, -16.361544, 0.20588332, 32.72502, -15.939232, 0.17359239, 31.765654, -15.944313, 0.18493778, 32.52186, -16.361544, 0.20588332, 32.72502, -17.602564, 0.24559253, 31.74662, -15.939232, 0.17359239, 31.765654, -17.602564, 0.24559253, 31.74662, -16.361544, 0.20588332, 32.72502, -17.608137, 0.25824708, 32.57613, -8.68903, -0.14408118, 31.659903, -15.944313, 0.18493778, 32.52186, -15.939232, 0.17359239, 31.765654, -15.944313, 0.18493778, 32.52186, -8.68903, -0.14408118, 31.659903, -10.055107, -0.069462895, 32.667473, -10.055107, -0.069462895, 32.667473, -8.68903, -0.14408118, 31.659903, -8.693983, -0.13273573, 32.396904, -10.055107, -0.069462895, 32.667473, -8.693983, -0.13273573, 32.396904, -8.69957, -0.2204451, 32.643856, -17.608137, 0.25824708, 32.57613, -15.961756, -0.1768086, 32.779636, -17.623884, -0.10699028, 32.5817, -15.961756, -0.1768086, 32.779636, -17.608137, 0.25824708, 32.57613, -15.949944, 0.09722847, 32.775352, -15.949944, 0.09722847, 32.775352, -17.608137, 0.25824708, 32.57613, -16.361544, 0.20588332, 32.72502, -15.949944, 0.09722847, 32.775352, -8.69957, -0.2204451, 32.643856, -15.961756, -0.1768086, 32.779636, -15.961756, -0.1768086, 32.779636, -8.69957, -0.2204451, 32.643856, -8.71138, -0.49448207, 32.64814, -8.69957, -0.2204451, 32.643856, -15.949944, 0.09722847, 32.775352, -10.055107, -0.069462895, 32.667473, -10.055107, -0.069462895, 32.667473, -15.949944, 0.09722847, 32.775352, -14.133524, 0.109446704, 32.741302, -8.69957, -0.2204451, 32.643856, -8.704777, -0.50931835, 31.66547, -8.71138, -0.49448207, 32.64814, -8.704777, -0.50931835, 31.66547, -8.69957, -0.2204451, 32.643856, -8.68903, -0.14408118, 31.659903, -8.68903, -0.14408118, 31.659903, -8.69957, -0.2204451, 32.643856, -8.693983, -0.13273573, 32.396904, -13.166946, -0.5581908, 28.64937, -17.27211, -0.19208091, 28.80724, -13.166946, -0.19208091, 28.64937, -13.166946, -0.5581908, 28.64937, -17.27211, -0.5581909, 28.80724, -17.27211, -0.19208091, 28.80724, -8.932932, -0.19208091, 28.863285, -13.166946, -0.5581908, 28.64937, -13.166946, -0.19208091, 28.64937, -8.932932, -0.19208091, 28.863285, -8.932932, -0.5581909, 28.863285, -13.166946, -0.5581908, 28.64937, -13.160368, -0.5581907, 27.670628, -17.27211, -0.5581909, 28.80724, -13.166946, -0.5581908, 28.64937, -13.160368, -0.5581907, 27.670628, -17.266533, -0.5581908, 27.977295, -17.27211, -0.5581909, 28.80724, -13.166946, -0.5581908, 28.64937, -8.925314, -0.55819076, 27.729633, -13.160368, -0.5581907, 27.670628, -13.166946, -0.5581908, 28.64937, -8.929188, -0.5581908, 28.306059, -8.925314, -0.55819076, 27.729633, -8.929188, -0.5581908, 28.306059, -13.166946, -0.5581908, 28.64937, -8.932932, -0.5581909, 28.863285, -17.266533, -0.5581908, 27.977295, -17.27211, -0.19208091, 28.80724, -17.27211, -0.5581909, 28.80724, -17.266533, -0.5581908, 27.977295, -17.266533, -0.1920808, 27.977295, -17.27211, -0.19208091, 28.80724, -8.929636, -0.19208086, 28.372822, -9.089121, -0.30160832, 28.274002, -8.929188, -0.5581908, 28.306059, -13.16201, -0.1920808, 27.914986, -13.160368, -0.28371733, 27.670628, -12.101822, -0.1920808, 27.685158, -13.16201, -0.1920808, 27.914986, -14.1868, -0.1920808, 27.747076, -13.160368, -0.28371733, 27.670628, -13.16201, -0.1920808, 27.914986, -17.266533, -0.1920808, 27.977295, -14.1868, -0.1920808, 27.747076, -13.16201, -0.1920808, 27.914986, -17.27211, -0.19208091, 28.80724, -17.266533, -0.1920808, 27.977295, -17.27211, -0.19208091, 28.80724, -13.16201, -0.1920808, 27.914986, -13.166946, -0.19208091, 28.64937, -12.101822, -0.1920808, 27.685158, -13.166946, -0.19208091, 28.64937, -13.16201, -0.1920808, 27.914986, -13.166946, -0.19208091, 28.64937, -8.929636, -0.19208086, 28.372822, -8.932932, -0.19208091, 28.863285, -13.166946, -0.19208091, 28.64937, -9.656805, -0.19208086, 28.268005, -8.929636, -0.19208086, 28.372822, -12.101822, -0.1920808, 27.685158, -9.656805, -0.19208086, 28.268005, -13.166946, -0.19208091, 28.64937, -9.089121, -0.30160832, 28.274002, -8.929636, -0.19208086, 28.372822, -9.656805, -0.19208086, 28.268005, -8.92778, -0.19208086, 28.09661, -9.089121, -0.30160832, 28.274002, -9.656805, -0.19208086, 28.268005, -9.656805, -0.19208086, 28.268005, -12.101822, -0.1920808, 27.685158, -8.92778, -0.19208086, 28.09661, -8.92778, -0.19208086, 28.09661, -12.101822, -0.1920808, 27.685158, -8.925314, -0.1920808, 27.729633, -8.932932, -0.5581909, 28.863285, -8.929636, -0.19208086, 28.372822, -8.929188, -0.5581908, 28.306059, -8.932932, -0.5581909, 28.863285, -8.932932, -0.19208091, 28.863285, -8.929636, -0.19208086, 28.372822, -8.92778, -0.19208086, 28.09661, -8.925314, -0.55819076, 27.729633, -8.929188, -0.5581908, 28.306059, -8.92778, -0.19208086, 28.09661, -8.925314, -0.1920808, 27.729633, -8.925314, -0.55819076, 27.729633, -9.089121, -0.30160832, 28.274002, -8.92778, -0.19208086, 28.09661, -8.929188, -0.5581908, 28.306059, -8.925314, -0.1920808, 27.729633, -13.160368, -0.5581907, 27.670628, -8.925314, -0.55819076, 27.729633, -13.160368, -0.5581907, 27.670628, -8.925314, -0.1920808, 27.729633, -12.101822, -0.1920808, 27.685158, -13.160368, -0.5581907, 27.670628, -12.101822, -0.1920808, 27.685158, -13.160368, -0.28371733, 27.670628, -13.160368, -0.28371733, 27.670628, -17.266533, -0.5581908, 27.977295, -13.160368, -0.5581907, 27.670628, -13.160368, -0.28371733, 27.670628, -17.266533, -0.1920808, 27.977295, -17.266533, -0.5581908, 27.977295, -17.266533, -0.1920808, 27.977295, -13.160368, -0.28371733, 27.670628, -14.1868, -0.1920808, 27.747076, -16.346624, -0.1920805, 25.245663, -17.248005, -0.55819046, 25.220404, -16.346624, -0.55819046, 25.245663, -16.346624, -0.1920805, 25.245663, -17.248005, -0.1920805, 25.220404, -17.248005, -0.55819046, 25.220404, -16.346624, -0.55819046, 25.245663, -10.768602, -0.1920805, 25.26875, -16.346624, -0.1920805, 25.245663, -16.346624, -0.55819046, 25.245663, -8.908827, -0.28371704, 25.276447, -10.768602, -0.1920805, 25.26875, -8.908827, -0.28371704, 25.276447, -16.346624, -0.55819046, 25.245663, -8.908827, -0.55819046, 25.276447, -17.254608, -0.19208062, 26.203075, -16.346624, -0.1920805, 25.245663, -16.353252, -0.19208062, 26.231823, -10.768602, -0.1920805, 25.26875, -16.353252, -0.19208062, 26.231823, -16.346624, -0.1920805, 25.245663, -10.768602, -0.1920805, 25.26875, -8.914402, -0.19208062, 26.105959, -16.353252, -0.19208062, 26.231823, -8.914402, -0.19208062, 26.105959, -10.768602, -0.1920805, 25.26875, -8.910217, -0.1920805, 25.48328, -8.910217, -0.1920805, 25.48328, -10.768602, -0.1920805, 25.26875, -8.908827, -0.28371704, 25.276447, -16.346624, -0.1920805, 25.245663, -17.254608, -0.19208062, 26.203075, -16.7707, -0.19208056, 25.68835, -16.7707, -0.19208056, 25.68835, -17.254608, -0.19208062, 26.203075, -17.251945, -0.19208056, 25.806864, -17.251945, -0.19208056, 25.806864, -17.169178, -0.33171725, 25.698326, -16.7707, -0.19208056, 25.68835, -17.169178, -0.33171725, 25.698326, -17.250105, -0.1920805, 25.532833, -16.7707, -0.19208056, 25.68835, -16.346624, -0.1920805, 25.245663, -16.7707, -0.19208056, 25.68835, -17.250105, -0.1920805, 25.532833, -16.346624, -0.1920805, 25.245663, -17.250105, -0.1920805, 25.532833, -17.248005, -0.1920805, 25.220404, -16.353252, -0.5581906, 26.231823, -17.254608, -0.19208062, 26.203075, -16.353252, -0.19208062, 26.231823, -16.353252, -0.5581906, 26.231823, -17.254608, -0.5581906, 26.203075, -17.254608, -0.19208062, 26.203075, -8.914402, -0.19208062, 26.105959, -16.353252, -0.5581906, 26.231823, -16.353252, -0.19208062, 26.231823, -8.914402, -0.19208062, 26.105959, -8.914402, -0.5581906, 26.105959, -16.353252, -0.5581906, 26.231823, -17.248005, -0.55819046, 25.220404, -16.353252, -0.5581906, 26.231823, -16.346624, -0.55819046, 25.245663, -16.353252, -0.5581906, 26.231823, -17.248005, -0.55819046, 25.220404, -17.251574, -0.5581905, 25.751448, -16.353252, -0.5581906, 26.231823, -17.251574, -0.5581905, 25.751448, -17.254608, -0.5581906, 26.203075, -8.914402, -0.5581906, 26.105959, -16.346624, -0.55819046, 25.245663, -16.353252, -0.5581906, 26.231823, -8.914402, -0.5581906, 26.105959, -8.908827, -0.55819046, 25.276447, -16.346624, -0.55819046, 25.245663, -17.250105, -0.1920805, 25.532833, -17.169178, -0.33171725, 25.698326, -17.251574, -0.5581905, 25.751448, -17.169178, -0.33171725, 25.698326, -17.251945, -0.19208056, 25.806864, -17.251574, -0.5581905, 25.751448, -17.248005, -0.55819046, 25.220404, -17.250105, -0.1920805, 25.532833, -17.251574, -0.5581905, 25.751448, -17.248005, -0.55819046, 25.220404, -17.248005, -0.1920805, 25.220404, -17.250105, -0.1920805, 25.532833, -17.251945, -0.19208056, 25.806864, -17.254608, -0.5581906, 26.203075, -17.251574, -0.5581905, 25.751448, -17.251945, -0.19208056, 25.806864, -17.254608, -0.19208062, 26.203075, -17.254608, -0.5581906, 26.203075, -8.914402, -0.19208062, 26.105959, -8.908827, -0.55819046, 25.276447, -8.914402, -0.5581906, 26.105959, -8.908827, -0.55819046, 25.276447, -8.914402, -0.19208062, 26.105959, -8.910217, -0.1920805, 25.48328, -8.908827, -0.55819046, 25.276447, -8.910217, -0.1920805, 25.48328, -8.908827, -0.28371704, 25.276447, -16.566906, -0.19208038, 24.06379, -17.53112, -0.55819035, 24.038109, -16.566906, -0.55819035, 24.06379, -16.566906, -0.19208038, 24.06379, -17.53112, -0.19208038, 24.038109, -17.53112, -0.55819035, 24.038109, -16.566906, -0.55819035, 24.06379, -10.599218, -0.19208038, 24.089493, -16.566906, -0.19208038, 24.06379, -16.566906, -0.55819035, 24.06379, -8.610281, -0.28371692, 24.09806, -10.599218, -0.19208038, 24.089493, -8.610281, -0.28371692, 24.09806, -16.566906, -0.55819035, 24.06379, -8.610281, -0.55819035, 24.09806, -17.537725, -0.19208044, 25.020779, -16.566906, -0.19208038, 24.06379, -16.573536, -0.1920805, 25.050386, -10.599218, -0.19208038, 24.089493, -16.573536, -0.1920805, 25.050386, -16.566906, -0.19208038, 24.06379, -10.599218, -0.19208038, 24.089493, -8.61586, -0.19208044, 24.928009, -16.573536, -0.1920805, 25.050386, -8.61586, -0.19208044, 24.928009, -10.599218, -0.19208038, 24.089493, -8.611677, -0.19208038, 24.305765, -8.611677, -0.19208038, 24.305765, -10.599218, -0.19208038, 24.089493, -8.610281, -0.28371692, 24.09806, -16.566906, -0.19208038, 24.06379, -17.537725, -0.19208044, 25.020779, -17.02022, -0.19208038, 24.506718, -17.02022, -0.19208038, 24.506718, -17.537725, -0.19208044, 25.020779, -17.535063, -0.19208044, 24.624569, -17.535063, -0.19208044, 24.624569, -17.446188, -0.33171707, 24.51651, -17.02022, -0.19208038, 24.506718, -17.446188, -0.33171707, 24.51651, -17.533224, -0.19208038, 24.350975, -17.02022, -0.19208038, 24.506718, -16.566906, -0.19208038, 24.06379, -17.02022, -0.19208038, 24.506718, -17.533224, -0.19208038, 24.350975, -16.566906, -0.19208038, 24.06379, -17.533224, -0.19208038, 24.350975, -17.53112, -0.19208038, 24.038109, -16.573536, -0.55819046, 25.050386, -17.537725, -0.19208044, 25.020779, -16.573536, -0.1920805, 25.050386, -16.573536, -0.55819046, 25.050386, -17.537725, -0.55819046, 25.020779, -17.537725, -0.19208044, 25.020779, -8.61586, -0.19208044, 24.928009, -16.573536, -0.55819046, 25.050386, -16.573536, -0.1920805, 25.050386, -8.61586, -0.19208044, 24.928009, -8.61586, -0.5581904, 24.928009, -16.573536, -0.55819046, 25.050386, -17.53112, -0.55819035, 24.038109, -16.573536, -0.55819046, 25.050386, -16.566906, -0.55819035, 24.06379, -16.573536, -0.55819046, 25.050386, -17.53112, -0.55819035, 24.038109, -17.534693, -0.55819035, 24.569588, -16.573536, -0.55819046, 25.050386, -17.534693, -0.55819035, 24.569588, -17.537725, -0.55819046, 25.020779, -8.61586, -0.5581904, 24.928009, -16.566906, -0.55819035, 24.06379, -16.573536, -0.55819046, 25.050386, -8.61586, -0.5581904, 24.928009, -8.610281, -0.55819035, 24.09806, -16.566906, -0.55819035, 24.06379, -17.533224, -0.19208038, 24.350975, -17.446188, -0.33171707, 24.51651, -17.534693, -0.55819035, 24.569588, -17.446188, -0.33171707, 24.51651, -17.535063, -0.19208044, 24.624569, -17.534693, -0.55819035, 24.569588, -17.53112, -0.55819035, 24.038109, -17.533224, -0.19208038, 24.350975, -17.534693, -0.55819035, 24.569588, -17.53112, -0.55819035, 24.038109, -17.53112, -0.19208038, 24.038109, -17.533224, -0.19208038, 24.350975, -17.535063, -0.19208044, 24.624569, -17.537725, -0.55819046, 25.020779, -17.534693, -0.55819035, 24.569588, -17.535063, -0.19208044, 24.624569, -17.537725, -0.19208044, 25.020779, -17.537725, -0.55819046, 25.020779, -8.61586, -0.19208044, 24.928009, -8.610281, -0.55819035, 24.09806, -8.61586, -0.5581904, 24.928009, -8.610281, -0.55819035, 24.09806, -8.61586, -0.19208044, 24.928009, -8.611677, -0.19208038, 24.305765, -8.610281, -0.55819035, 24.09806, -8.611677, -0.19208038, 24.305765, -8.610281, -0.28371692, 24.09806, -10.358263, -0.5581907, 27.454252, -17.457956, -0.1920808, 27.566252, -10.358263, -0.19208074, 27.454252, -10.358263, -0.5581907, 27.454252, -17.457956, -0.5581907, 27.566252, -17.457956, -0.1920808, 27.566252, -8.72983, -0.19208074, 27.471743, -10.358263, -0.5581907, 27.454252, -10.358263, -0.19208074, 27.454252, -8.72983, -0.19208074, 27.471743, -8.72983, -0.5581907, 27.471743, -10.358263, -0.5581907, 27.454252, -10.351484, -0.5581906, 26.445835, -17.457956, -0.5581907, 27.566252, -10.358263, -0.5581907, 27.454252, -10.351484, -0.5581906, 26.445835, -17.451353, -0.5581906, 26.58358, -17.457956, -0.5581907, 27.566252, -8.72983, -0.5581907, 27.471743, -10.351484, -0.5581906, 26.445835, -10.358263, -0.5581907, 27.454252, -8.72983, -0.5581907, 27.471743, -8.724255, -0.5581906, 26.642231, -10.351484, -0.5581906, 26.445835, -8.72983, -0.5581907, 27.471743, -8.724255, -0.19208068, 26.642231, -8.724255, -0.5581906, 26.642231, -8.72983, -0.5581907, 27.471743, -8.72983, -0.19208074, 27.471743, -8.724255, -0.19208068, 26.642231, -10.35318, -0.19208068, 26.69805, -10.351484, -0.28371716, 26.445835, -9.944677, -0.19208062, 26.494825, -10.35318, -0.19208068, 26.69805, -12.1264515, -0.19208062, 26.480164, -10.351484, -0.28371716, 26.445835, -10.35318, -0.19208068, 26.69805, -16.120235, -0.19208068, 26.557617, -12.1264515, -0.19208062, 26.480164, -9.944677, -0.19208062, 26.494825, -10.358263, -0.19208074, 27.454252, -10.35318, -0.19208068, 26.69805, -9.944677, -0.19208062, 26.494825, -8.72983, -0.19208074, 27.471743, -10.358263, -0.19208074, 27.454252, -8.72983, -0.19208074, 27.471743, -9.944677, -0.19208062, 26.494825, -8.724255, -0.19208068, 26.642231, -17.457956, -0.1920808, 27.566252, -10.35318, -0.19208068, 26.69805, -10.358263, -0.19208074, 27.454252, -10.35318, -0.19208068, 26.69805, -17.457956, -0.1920808, 27.566252, -16.120235, -0.19208068, 26.557617, -16.120235, -0.19208068, 26.557617, -17.457956, -0.1920808, 27.566252, -17.453001, -0.19208068, 26.828812, -16.120235, -0.19208068, 26.557617, -17.453001, -0.19208068, 26.828812, -17.451353, -0.28371722, 26.58358, -8.724255, -0.19208068, 26.642231, -10.351484, -0.5581906, 26.445835, -8.724255, -0.5581906, 26.642231, -10.351484, -0.5581906, 26.445835, -8.724255, -0.19208068, 26.642231, -9.944677, -0.19208062, 26.494825, -10.351484, -0.5581906, 26.445835, -9.944677, -0.19208062, 26.494825, -10.351484, -0.28371716, 26.445835, -10.351484, -0.28371716, 26.445835, -17.451353, -0.5581906, 26.58358, -10.351484, -0.5581906, 26.445835, -10.351484, -0.28371716, 26.445835, -16.120235, -0.19208068, 26.557617, -17.451353, -0.5581906, 26.58358, -17.451353, -0.5581906, 26.58358, -16.120235, -0.19208068, 26.557617, -17.451353, -0.28371722, 26.58358, -16.120235, -0.19208068, 26.557617, -10.351484, -0.28371716, 26.445835, -12.1264515, -0.19208062, 26.480164, -17.451353, -0.28371722, 26.58358, -17.457956, -0.5581907, 27.566252, -17.451353, -0.5581906, 26.58358, -17.457956, -0.5581907, 27.566252, -17.451353, -0.28371722, 26.58358, -17.453001, -0.19208068, 26.828812, -17.457956, -0.5581907, 27.566252, -17.453001, -0.19208068, 26.828812, -17.457956, -0.1920808, 27.566252, -13.511387, 0.0055903792, 44.578655, -17.616987, 0.37126416, 44.736523, -13.511387, 0.37126416, 44.578655, -13.511387, 0.0055903792, 44.578655, -17.616987, 0.0055903792, 44.736523, -17.616987, 0.37126416, 44.736523, -9.277809, 0.37126416, 44.792564, -13.511387, 0.0055903792, 44.578655, -13.511387, 0.37126416, 44.578655, -9.277809, 0.37126416, 44.792564, -9.277809, 0.0055903792, 44.792564, -13.511387, 0.0055903792, 44.578655, -13.50481, 0.0055904984, 43.59991, -17.616987, 0.0055903792, 44.736523, -13.511387, 0.0055903792, 44.578655, -13.50481, 0.0055904984, 43.59991, -17.61141, 0.0055904984, 43.906574, -17.616987, 0.0055903792, 44.736523, -13.511387, 0.0055903792, 44.578655, -9.270195, 0.0055904984, 43.65935, -13.50481, 0.0055904984, 43.59991, -13.511387, 0.0055903792, 44.578655, -9.274065, 0.005590439, 44.23534, -9.270195, 0.0055904984, 43.65935, -9.274065, 0.005590439, 44.23534, -13.511387, 0.0055903792, 44.578655, -9.277809, 0.0055903792, 44.792564, -17.61141, 0.0055904984, 43.906574, -17.616987, 0.37126416, 44.736523, -17.616987, 0.0055903792, 44.736523, -17.61141, 0.0055904984, 43.906574, -17.61141, 0.37126416, 43.906574, -17.616987, 0.37126416, 44.736523, -9.274517, 0.37126416, 44.30254, -9.433565, 0.26217288, 44.20372, -9.274065, 0.005590439, 44.23534, -13.506453, 0.37126416, 43.84427, -13.50481, 0.28006393, 43.59991, -12.446262, 0.37126428, 43.61444, -13.506453, 0.37126416, 43.84427, -14.531677, 0.37126428, 43.676357, -13.50481, 0.28006393, 43.59991, -13.506453, 0.37126416, 43.84427, -17.61141, 0.37126416, 43.906574, -14.531677, 0.37126428, 43.676357, -13.506453, 0.37126416, 43.84427, -17.616987, 0.37126416, 44.736523, -17.61141, 0.37126416, 43.906574, -17.616987, 0.37126416, 44.736523, -13.506453, 0.37126416, 43.84427, -13.511387, 0.37126416, 44.578655, -12.446262, 0.37126428, 43.61444, -13.511387, 0.37126416, 44.578655, -13.506453, 0.37126416, 43.84427, -13.511387, 0.37126416, 44.578655, -9.274517, 0.37126416, 44.30254, -9.277809, 0.37126416, 44.792564, -13.511387, 0.37126416, 44.578655, -10.001682, 0.37126416, 44.19729, -9.274517, 0.37126416, 44.30254, -12.446262, 0.37126428, 43.61444, -10.001682, 0.37126416, 44.19729, -13.511387, 0.37126416, 44.578655, -9.433565, 0.26217288, 44.20372, -9.274517, 0.37126416, 44.30254, -10.001682, 0.37126416, 44.19729, -9.272657, 0.37126416, 44.02589, -9.433565, 0.26217288, 44.20372, -10.001682, 0.37126416, 44.19729, -10.001682, 0.37126416, 44.19729, -12.446262, 0.37126428, 43.61444, -9.272657, 0.37126416, 44.02589, -9.272657, 0.37126416, 44.02589, -12.446262, 0.37126428, 43.61444, -9.270195, 0.37126428, 43.65935, -9.277809, 0.0055903792, 44.792564, -9.274517, 0.37126416, 44.30254, -9.274065, 0.005590439, 44.23534, -9.277809, 0.0055903792, 44.792564, -9.277809, 0.37126416, 44.792564, -9.274517, 0.37126416, 44.30254, -9.272657, 0.37126416, 44.02589, -9.270195, 0.0055904984, 43.65935, -9.274065, 0.005590439, 44.23534, -9.272657, 0.37126416, 44.02589, -9.270195, 0.37126428, 43.65935, -9.270195, 0.0055904984, 43.65935, -9.433565, 0.26217288, 44.20372, -9.272657, 0.37126416, 44.02589, -9.274065, 0.005590439, 44.23534, -9.270195, 0.37126428, 43.65935, -13.50481, 0.0055904984, 43.59991, -9.270195, 0.0055904984, 43.65935, -13.50481, 0.0055904984, 43.59991, -9.270195, 0.37126428, 43.65935, -12.446262, 0.37126428, 43.61444, -13.50481, 0.0055904984, 43.59991, -12.446262, 0.37126428, 43.61444, -13.50481, 0.28006393, 43.59991, -13.50481, 0.28006393, 43.59991, -17.61141, 0.0055904984, 43.906574, -13.50481, 0.0055904984, 43.59991, -13.50481, 0.28006393, 43.59991, -17.61141, 0.37126416, 43.906574, -17.61141, 0.0055904984, 43.906574, -17.61141, 0.37126416, 43.906574, -13.50481, 0.28006393, 43.59991, -14.531677, 0.37126428, 43.676357, -16.691502, 0.37126452, 41.174942, -17.592882, 0.0055907965, 41.149685, -16.691502, 0.0055907965, 41.174942, -16.691502, 0.37126452, 41.174942, -17.592882, 0.37126452, 41.149685, -17.592882, 0.0055907965, 41.149685, -16.691502, 0.0055907965, 41.174942, -11.113045, 0.37126452, 41.198032, -16.691502, 0.37126452, 41.174942, -16.691502, 0.0055907965, 41.174942, -9.253704, 0.28006417, 41.20573, -11.113045, 0.37126452, 41.198032, -9.253704, 0.28006417, 41.20573, -16.691502, 0.0055907965, 41.174942, -9.253704, 0.0055907965, 41.20573, -17.599485, 0.3712644, 42.132355, -16.691502, 0.37126452, 41.174942, -16.698133, 0.3712644, 42.16154, -11.113045, 0.37126452, 41.198032, -16.698133, 0.3712644, 42.16154, -16.691502, 0.37126452, 41.174942, -11.113045, 0.37126452, 41.198032, -9.259279, 0.3712644, 42.03524, -16.698133, 0.3712644, 42.16154, -9.259279, 0.3712644, 42.03524, -11.113045, 0.37126452, 41.198032, -9.255098, 0.37126452, 41.413, -9.255098, 0.37126452, 41.413, -11.113045, 0.37126452, 41.198032, -9.253704, 0.28006417, 41.20573, -16.691502, 0.37126452, 41.174942, -17.599485, 0.3712644, 42.132355, -17.115143, 0.37126452, 41.617634, -17.115143, 0.37126452, 41.617634, -17.599485, 0.3712644, 42.132355, -17.596823, 0.37126452, 41.736145, -17.596823, 0.37126452, 41.736145, -17.513622, 0.23162776, 41.628048, -17.115143, 0.37126452, 41.617634, -17.513622, 0.23162776, 41.628048, -17.594984, 0.37126452, 41.46255, -17.115143, 0.37126452, 41.617634, -16.691502, 0.37126452, 41.174942, -17.115143, 0.37126452, 41.617634, -17.594984, 0.37126452, 41.46255, -16.691502, 0.37126452, 41.174942, -17.594984, 0.37126452, 41.46255, -17.592882, 0.37126452, 41.149685, -16.698133, 0.0055906773, 42.16154, -17.599485, 0.3712644, 42.132355, -16.698133, 0.3712644, 42.16154, -16.698133, 0.0055906773, 42.16154, -17.599485, 0.0055906773, 42.132355, -17.599485, 0.3712644, 42.132355, -9.259279, 0.3712644, 42.03524, -16.698133, 0.0055906773, 42.16154, -16.698133, 0.3712644, 42.16154, -9.259279, 0.3712644, 42.03524, -9.259279, 0.005590737, 42.03524, -16.698133, 0.0055906773, 42.16154, -17.592882, 0.0055907965, 41.149685, -16.698133, 0.0055906773, 42.16154, -16.691502, 0.0055907965, 41.174942, -16.698133, 0.0055906773, 42.16154, -17.592882, 0.0055907965, 41.149685, -17.59645, 0.005590737, 41.68073, -16.698133, 0.0055906773, 42.16154, -17.59645, 0.005590737, 41.68073, -17.599485, 0.0055906773, 42.132355, -9.259279, 0.005590737, 42.03524, -16.691502, 0.0055907965, 41.174942, -16.698133, 0.0055906773, 42.16154, -9.259279, 0.005590737, 42.03524, -9.253704, 0.0055907965, 41.20573, -16.691502, 0.0055907965, 41.174942, -17.594984, 0.37126452, 41.46255, -17.513622, 0.23162776, 41.628048, -17.59645, 0.005590737, 41.68073, -17.513622, 0.23162776, 41.628048, -17.596823, 0.37126452, 41.736145, -17.59645, 0.005590737, 41.68073, -17.592882, 0.0055907965, 41.149685, -17.594984, 0.37126452, 41.46255, -17.59645, 0.005590737, 41.68073, -17.592882, 0.0055907965, 41.149685, -17.592882, 0.37126452, 41.149685, -17.594984, 0.37126452, 41.46255, -17.596823, 0.37126452, 41.736145, -17.599485, 0.0055906773, 42.132355, -17.59645, 0.005590737, 41.68073, -17.596823, 0.37126452, 41.736145, -17.599485, 0.3712644, 42.132355, -17.599485, 0.0055906773, 42.132355, -9.259279, 0.3712644, 42.03524, -9.253704, 0.0055907965, 41.20573, -9.259279, 0.005590737, 42.03524, -9.253704, 0.0055907965, 41.20573, -9.259279, 0.3712644, 42.03524, -9.255098, 0.37126452, 41.413, -9.253704, 0.0055907965, 41.20573, -9.255098, 0.37126452, 41.413, -9.253704, 0.28006417, 41.20573, -9.466791, -0.19077104, 22.980423, -9.698496, -0.09826177, 22.978865, -9.698496, -0.19077104, 22.978865, -9.466791, -0.19077104, 22.980423, -9.466791, -0.09826177, 22.980423, -9.698496, -0.09826177, 22.978865, -9.466791, -0.09826177, 22.980423, -9.864088, -0.098264754, 47.618515, -9.698496, -0.09826177, 22.978865, -9.466791, -0.09826177, 22.980423, -9.632383, -0.098264754, 47.62007, -9.864088, -0.098264754, 47.618515, -9.632383, -0.098264754, 47.62007, -9.864088, -0.19077402, 47.618515, -9.864088, -0.098264754, 47.618515, -9.632383, -0.098264754, 47.62007, -9.632383, -0.19077402, 47.62007, -9.864088, -0.19077402, 47.618515, -9.632383, -0.19077402, 47.62007, -9.698496, -0.19077104, 22.978865, -9.864088, -0.19077402, 47.618515, -9.632383, -0.19077402, 47.62007, -9.466791, -0.19077104, 22.980423, -9.698496, -0.19077104, 22.978865, -9.698496, -0.19077104, 22.978865, -9.864088, -0.098264754, 47.618515, -9.864088, -0.19077402, 47.618515, -9.698496, -0.19077104, 22.978865, -9.698496, -0.09826177, 22.978865, -9.864088, -0.098264754, 47.618515, -9.632383, -0.19077402, 47.62007, -9.466791, -0.09826177, 22.980423, -9.466791, -0.19077104, 22.980423, -9.632383, -0.19077402, 47.62007, -9.632383, -0.098264754, 47.62007, -9.466791, -0.09826177, 22.980423, -10.65929, 0.00559026, 45.949276, -17.916506, 0.37126392, 46.05978, -10.65929, 0.37126392, 45.949276, -10.65929, 0.00559026, 45.949276, -17.916506, 0.0055902004, 46.05978, -17.916506, 0.37126392, 46.05978, -8.99464, 0.37126392, 45.967007, -10.65929, 0.00559026, 45.949276, -10.65929, 0.37126392, 45.949276, -8.99464, 0.37126392, 45.967007, -8.99464, 0.00559026, 45.967007, -10.65929, 0.00559026, 45.949276, -10.65251, 0.0055903792, 44.940422, -17.916506, 0.0055902004, 46.05978, -10.65929, 0.00559026, 45.949276, -10.65251, 0.0055903792, 44.940422, -17.909903, 0.0055903196, 45.07711, -17.916506, 0.0055902004, 46.05978, -8.99464, 0.00559026, 45.967007, -10.65251, 0.0055903792, 44.940422, -10.65929, 0.00559026, 45.949276, -8.99464, 0.00559026, 45.967007, -8.989063, 0.0055903196, 45.137062, -10.65251, 0.0055903792, 44.940422, -8.99464, 0.00559026, 45.967007, -8.989063, 0.37126404, 45.137062, -8.989063, 0.0055903196, 45.137062, -8.99464, 0.00559026, 45.967007, -8.99464, 0.37126392, 45.967007, -8.989063, 0.37126404, 45.137062, -10.654205, 0.37126404, 45.192635, -10.65251, 0.2800637, 44.940422, -10.236538, 0.37126404, 44.98947, -10.654205, 0.37126404, 45.192635, -12.466749, 0.37126404, 44.974487, -10.65251, 0.2800637, 44.940422, -10.654205, 0.37126404, 45.192635, -16.549116, 0.37126404, 45.05178, -12.466749, 0.37126404, 44.974487, -10.236538, 0.37126404, 44.98947, -10.65929, 0.37126392, 45.949276, -10.654205, 0.37126404, 45.192635, -10.236538, 0.37126404, 44.98947, -8.99464, 0.37126392, 45.967007, -10.65929, 0.37126392, 45.949276, -8.99464, 0.37126392, 45.967007, -10.236538, 0.37126404, 44.98947, -8.989063, 0.37126404, 45.137062, -17.916506, 0.37126392, 46.05978, -10.654205, 0.37126404, 45.192635, -10.65929, 0.37126392, 45.949276, -10.654205, 0.37126404, 45.192635, -17.916506, 0.37126392, 46.05978, -16.549116, 0.37126404, 45.05178, -16.549116, 0.37126404, 45.05178, -17.916506, 0.37126392, 46.05978, -17.911556, 0.37126404, 45.32321, -16.549116, 0.37126404, 45.05178, -17.911556, 0.37126404, 45.32321, -17.909903, 0.2800637, 45.07711, -8.989063, 0.37126404, 45.137062, -10.65251, 0.0055903792, 44.940422, -8.989063, 0.0055903196, 45.137062, -10.65251, 0.0055903792, 44.940422, -8.989063, 0.37126404, 45.137062, -10.236538, 0.37126404, 44.98947, -10.65251, 0.0055903792, 44.940422, -10.236538, 0.37126404, 44.98947, -10.65251, 0.2800637, 44.940422, -10.65251, 0.2800637, 44.940422, -17.909903, 0.0055903196, 45.07711, -10.65251, 0.0055903792, 44.940422, -10.65251, 0.2800637, 44.940422, -16.549116, 0.37126404, 45.05178, -17.909903, 0.0055903196, 45.07711, -17.909903, 0.0055903196, 45.07711, -16.549116, 0.37126404, 45.05178, -17.909903, 0.2800637, 45.07711, -16.549116, 0.37126404, 45.05178, -10.65251, 0.2800637, 44.940422, -12.466749, 0.37126404, 44.974487, -17.909903, 0.2800637, 45.07711, -17.916506, 0.0055902004, 46.05978, -17.909903, 0.0055903196, 45.07711, -17.916506, 0.0055902004, 46.05978, -17.909903, 0.2800637, 45.07711, -17.911556, 0.37126404, 45.32321, -17.916506, 0.0055902004, 46.05978, -17.911556, 0.37126404, 45.32321, -17.916506, 0.37126392, 46.05978, -9.086136, -3.458273, 47.63378, -9.862558, 1.270175, 47.455757, -9.690924, -3.458273, 47.629715, -9.086136, -3.458273, 47.63378, -8.912178, 1.270175, 47.462143, -9.862558, 1.270175, 47.455757, -8.912178, 1.270175, 47.462143, -9.868942, 1.2701747, 48.4057, -9.862558, 1.270175, 47.455757, -8.912178, 1.270175, 47.462143, -8.918562, 1.2701747, 48.41209, -9.868942, 1.2701747, 48.4057, -8.918562, 1.2701747, 48.41209, -9.694984, -3.458273, 48.234066, -9.868942, 1.2701747, 48.4057, -8.918562, 1.2701747, 48.41209, -9.090197, -3.458273, 48.238132, -9.694984, -3.458273, 48.234066, -9.090197, -3.458273, 48.238132, -9.690924, -3.458273, 47.629715, -9.694984, -3.458273, 48.234066, -9.090197, -3.458273, 48.238132, -9.086136, -3.458273, 47.63378, -9.690924, -3.458273, 47.629715, -9.690924, -3.458273, 47.629715, -9.868942, 1.2701747, 48.4057, -9.694984, -3.458273, 48.234066, -9.690924, -3.458273, 47.629715, -9.862558, 1.270175, 47.455757, -9.868942, 1.2701747, 48.4057, -9.090197, -3.458273, 48.238132, -8.912178, 1.270175, 47.462143, -9.086136, -3.458273, 47.63378, -9.090197, -3.458273, 48.238132, -8.918562, 1.2701747, 48.41209, -8.912178, 1.270175, 47.462143, -16.72666, 0.37126392, 46.406403, -17.628038, 0.0055902004, 46.380707, -16.72666, 0.0055902004, 46.406403, -16.72666, 0.37126392, 46.406403, -17.628038, 0.37126392, 46.380707, -17.628038, 0.0055902004, 46.380707, -16.72666, 0.0055902004, 46.406403, -11.148199, 0.37126392, 46.429054, -16.72666, 0.37126392, 46.406403, -16.72666, 0.0055902004, 46.406403, -9.28886, 0.28006357, 46.436752, -11.148199, 0.37126392, 46.429054, -9.28886, 0.28006357, 46.436752, -16.72666, 0.0055902004, 46.406403, -9.28886, 0.0055902004, 46.436752, -17.634645, 0.3712638, 47.363815, -16.72666, 0.37126392, 46.406403, -16.733288, 0.3712638, 47.392563, -11.148199, 0.37126392, 46.429054, -16.733288, 0.3712638, 47.392563, -16.72666, 0.37126392, 46.406403, -11.148199, 0.37126392, 46.429054, -9.294437, 0.3712638, 47.266697, -16.733288, 0.3712638, 47.392563, -9.294437, 0.3712638, 47.266697, -11.148199, 0.37126392, 46.429054, -9.2902565, 0.37126392, 46.644455, -9.2902565, 0.37126392, 46.644455, -11.148199, 0.37126392, 46.429054, -9.28886, 0.28006357, 46.436752, -16.72666, 0.37126392, 46.406403, -17.634645, 0.3712638, 47.363815, -17.150305, 0.3712638, 46.84953, -17.150305, 0.3712638, 46.84953, -17.634645, 0.3712638, 47.363815, -17.631985, 0.3712638, 46.96804, -17.631985, 0.3712638, 46.96804, -17.548779, 0.23162705, 46.85907, -17.150305, 0.3712638, 46.84953, -17.548779, 0.23162705, 46.85907, -17.63014, 0.37126392, 46.693573, -17.150305, 0.3712638, 46.84953, -16.72666, 0.37126392, 46.406403, -17.150305, 0.3712638, 46.84953, -17.63014, 0.37126392, 46.693573, -16.72666, 0.37126392, 46.406403, -17.63014, 0.37126392, 46.693573, -17.628038, 0.37126392, 46.380707, -16.733288, 0.005590081, 47.392563, -17.634645, 0.3712638, 47.363815, -16.733288, 0.3712638, 47.392563, -16.733288, 0.005590081, 47.392563, -17.634645, 0.005590081, 47.363815, -17.634645, 0.3712638, 47.363815, -9.294437, 0.3712638, 47.266697, -16.733288, 0.005590081, 47.392563, -16.733288, 0.3712638, 47.392563, -9.294437, 0.3712638, 47.266697, -9.294437, 0.005590081, 47.266697, -16.733288, 0.005590081, 47.392563, -17.628038, 0.0055902004, 46.380707, -16.733288, 0.005590081, 47.392563, -16.72666, 0.0055902004, 46.406403, -16.733288, 0.005590081, 47.392563, -17.628038, 0.0055902004, 46.380707, -17.631613, 0.005590141, 46.912624, -16.733288, 0.005590081, 47.392563, -17.631613, 0.005590141, 46.912624, -17.634645, 0.005590081, 47.363815, -9.294437, 0.005590081, 47.266697, -16.72666, 0.0055902004, 46.406403, -16.733288, 0.005590081, 47.392563, -9.294437, 0.005590081, 47.266697, -9.28886, 0.0055902004, 46.436752, -16.72666, 0.0055902004, 46.406403, -17.63014, 0.37126392, 46.693573, -17.548779, 0.23162705, 46.85907, -17.631613, 0.005590141, 46.912624, -17.548779, 0.23162705, 46.85907, -17.631985, 0.3712638, 46.96804, -17.631613, 0.005590141, 46.912624, -17.628038, 0.0055902004, 46.380707, -17.63014, 0.37126392, 46.693573, -17.631613, 0.005590141, 46.912624, -17.628038, 0.0055902004, 46.380707, -17.628038, 0.37126392, 46.380707, -17.63014, 0.37126392, 46.693573, -17.631985, 0.3712638, 46.96804, -17.634645, 0.005590081, 47.363815, -17.631613, 0.005590141, 46.912624, -17.631985, 0.3712638, 46.96804, -17.634645, 0.3712638, 47.363815, -17.634645, 0.005590081, 47.363815, -9.294437, 0.3712638, 47.266697, -9.28886, 0.0055902004, 46.436752, -9.294437, 0.005590081, 47.266697, -9.28886, 0.0055902004, 46.436752, -9.294437, 0.3712638, 47.266697, -9.2902565, 0.37126392, 46.644455, -9.28886, 0.0055902004, 46.436752, -9.2902565, 0.37126392, 46.644455, -9.28886, 0.28006357, 46.436752, -16.91135, 0.37126464, 39.993507, -17.875563, 0.0055909753, 39.967392, -16.91135, 0.0055909753, 39.993507, -16.91135, 0.37126464, 39.993507, -17.875563, 0.37126464, 39.967392, -17.875563, 0.0055909753, 39.967392, -16.91135, 0.0055909753, 39.993507, -10.943661, 0.37126464, 40.01878, -16.91135, 0.37126464, 39.993507, -16.91135, 0.0055909753, 39.993507, -8.954723, 0.28006428, 40.027344, -10.943661, 0.37126464, 40.01878, -8.954723, 0.28006428, 40.027344, -16.91135, 0.0055909753, 39.993507, -8.954723, 0.0055909753, 40.027344, -17.882166, 0.37126452, 40.95006, -16.91135, 0.37126464, 39.993507, -16.917978, 0.37126452, 40.97967, -10.943661, 0.37126464, 40.01878, -16.917978, 0.37126452, 40.97967, -16.91135, 0.37126464, 39.993507, -10.943661, 0.37126464, 40.01878, -8.9603, 0.37126452, 40.857292, -16.917978, 0.37126452, 40.97967, -8.9603, 0.37126452, 40.857292, -10.943661, 0.37126464, 40.01878, -8.95612, 0.37126464, 40.23505, -8.95612, 0.37126464, 40.23505, -10.943661, 0.37126464, 40.01878, -8.954723, 0.28006428, 40.027344, -16.91135, 0.37126464, 39.993507, -17.882166, 0.37126452, 40.95006, -17.364662, 0.37126464, 40.436, -17.364662, 0.37126464, 40.436, -17.882166, 0.37126452, 40.95006, -17.879507, 0.37126464, 40.55429, -17.879507, 0.37126464, 40.55429, -17.79063, 0.23162788, 40.445793, -17.364662, 0.37126464, 40.436, -17.79063, 0.23162788, 40.445793, -17.877665, 0.37126464, 40.28026, -17.364662, 0.37126464, 40.436, -16.91135, 0.37126464, 39.993507, -17.364662, 0.37126464, 40.436, -17.877665, 0.37126464, 40.28026, -16.91135, 0.37126464, 39.993507, -17.877665, 0.37126464, 40.28026, -17.875563, 0.37126464, 39.967392, -16.917978, 0.005590856, 40.97967, -17.882166, 0.37126452, 40.95006, -16.917978, 0.37126452, 40.97967, -16.917978, 0.005590856, 40.97967, -17.882166, 0.005590856, 40.95006, -17.882166, 0.37126452, 40.95006, -8.9603, 0.37126452, 40.857292, -16.917978, 0.005590856, 40.97967, -16.917978, 0.37126452, 40.97967, -8.9603, 0.37126452, 40.857292, -8.9603, 0.005590856, 40.857292, -16.917978, 0.005590856, 40.97967, -17.875563, 0.0055909753, 39.967392, -16.917978, 0.005590856, 40.97967, -16.91135, 0.0055909753, 39.993507, -16.917978, 0.005590856, 40.97967, -17.875563, 0.0055909753, 39.967392, -17.879133, 0.0055909157, 40.49887, -16.917978, 0.005590856, 40.97967, -17.879133, 0.0055909157, 40.49887, -17.882166, 0.005590856, 40.95006, -8.9603, 0.005590856, 40.857292, -16.91135, 0.0055909753, 39.993507, -16.917978, 0.005590856, 40.97967, -8.9603, 0.005590856, 40.857292, -8.954723, 0.0055909753, 40.027344, -16.91135, 0.0055909753, 39.993507, -17.877665, 0.37126464, 40.28026, -17.79063, 0.23162788, 40.445793, -17.879133, 0.0055909157, 40.49887, -17.79063, 0.23162788, 40.445793, -17.879507, 0.37126464, 40.55429, -17.879133, 0.0055909157, 40.49887, -17.875563, 0.0055909753, 39.967392, -17.877665, 0.37126464, 40.28026, -17.879133, 0.0055909157, 40.49887, -17.875563, 0.0055909753, 39.967392, -17.875563, 0.37126464, 39.967392, -17.877665, 0.37126464, 40.28026, -17.879507, 0.37126464, 40.55429, -17.882166, 0.005590856, 40.95006, -17.879133, 0.0055909157, 40.49887, -17.879507, 0.37126464, 40.55429, -17.882166, 0.37126452, 40.95006, -17.882166, 0.005590856, 40.95006, -8.9603, 0.37126452, 40.857292, -8.954723, 0.0055909753, 40.027344, -8.9603, 0.005590856, 40.857292, -8.954723, 0.0055909753, 40.027344, -8.9603, 0.37126452, 40.857292, -8.95612, 0.37126464, 40.23505, -8.954723, 0.0055909753, 40.027344, -8.95612, 0.37126464, 40.23505, -8.954723, 0.28006428, 40.027344, -13.4819145, 0.005591035, 39.478943, -17.873325, 0.37126476, 39.634453, -13.4819145, 0.37126476, 39.478943, -13.4819145, 0.005591035, 39.478943, -17.873325, 0.0055909753, 39.634453, -17.873325, 0.37126476, 39.634453, -8.952486, 0.37126476, 39.694405, -13.4819145, 0.005591035, 39.478943, -13.4819145, 0.37126476, 39.478943, -8.952486, 0.37126476, 39.694405, -8.952486, 0.0055909753, 39.694405, -13.4819145, 0.005591035, 39.478943, -13.47533, 0.005591154, 38.49933, -17.873325, 0.0055909753, 39.634453, -13.4819145, 0.005591035, 39.478943, -13.47533, 0.005591154, 38.49933, -17.867746, 0.0055910945, 38.80451, -17.873325, 0.0055909753, 39.634453, -13.4819145, 0.005591035, 39.478943, -8.944866, 0.005591154, 38.560757, -13.47533, 0.005591154, 38.49933, -13.4819145, 0.005591035, 39.478943, -8.948738, 0.005591035, 39.136745, -8.944866, 0.005591154, 38.560757, -8.948738, 0.005591035, 39.136745, -13.4819145, 0.005591035, 39.478943, -8.952486, 0.0055909753, 39.694405, -17.867746, 0.0055910945, 38.80451, -17.873325, 0.37126476, 39.634453, -17.873325, 0.0055909753, 39.634453, -17.867746, 0.0055910945, 38.80451, -17.867746, 0.37126476, 38.80451, -17.873325, 0.37126476, 39.634453, -8.949188, 0.37126476, 39.203945, -9.119587, 0.26217347, 39.105488, -8.948738, 0.005591035, 39.136745, -13.476976, 0.37126487, 38.74412, -13.47533, 0.28006452, 38.49933, -12.3426075, 0.37126487, 38.514793, -13.476976, 0.37126487, 38.74412, -14.573328, 0.37126487, 38.575733, -13.47533, 0.28006452, 38.49933, -13.476976, 0.37126487, 38.74412, -17.867746, 0.37126476, 38.80451, -14.573328, 0.37126487, 38.575733, -13.476976, 0.37126487, 38.74412, -17.873325, 0.37126476, 39.634453, -17.867746, 0.37126476, 38.80451, -17.873325, 0.37126476, 39.634453, -13.476976, 0.37126487, 38.74412, -13.4819145, 0.37126476, 39.478943, -12.3426075, 0.37126487, 38.514793, -13.4819145, 0.37126476, 39.478943, -13.476976, 0.37126487, 38.74412, -13.4819145, 0.37126476, 39.478943, -8.949188, 0.37126476, 39.203945, -8.952486, 0.37126476, 39.694405, -13.4819145, 0.37126476, 39.478943, -9.726973, 0.37126476, 39.09835, -8.949188, 0.37126476, 39.203945, -12.3426075, 0.37126487, 38.514793, -9.726973, 0.37126476, 39.09835, -13.4819145, 0.37126476, 39.478943, -9.119587, 0.26217347, 39.105488, -8.949188, 0.37126476, 39.203945, -9.726973, 0.37126476, 39.09835, -8.94733, 0.37126476, 38.927296, -9.119587, 0.26217347, 39.105488, -9.726973, 0.37126476, 39.09835, -9.726973, 0.37126476, 39.09835, -12.3426075, 0.37126487, 38.514793, -8.94733, 0.37126476, 38.927296, -8.94733, 0.37126476, 38.927296, -12.3426075, 0.37126487, 38.514793, -8.944866, 0.37126487, 38.560757, -8.952486, 0.0055909753, 39.694405, -8.949188, 0.37126476, 39.203945, -8.948738, 0.005591035, 39.136745, -8.952486, 0.0055909753, 39.694405, -8.952486, 0.37126476, 39.694405, -8.949188, 0.37126476, 39.203945, -8.94733, 0.37126476, 38.927296, -8.944866, 0.005591154, 38.560757, -8.948738, 0.005591035, 39.136745, -8.94733, 0.37126476, 38.927296, -8.944866, 0.37126487, 38.560757, -8.944866, 0.005591154, 38.560757, -9.119587, 0.26217347, 39.105488, -8.94733, 0.37126476, 38.927296, -8.948738, 0.005591035, 39.136745, -8.944866, 0.37126487, 38.560757, -13.47533, 0.005591154, 38.49933, -8.944866, 0.005591154, 38.560757, -13.47533, 0.005591154, 38.49933, -8.944866, 0.37126487, 38.560757, -12.3426075, 0.37126487, 38.514793, -13.47533, 0.005591154, 38.49933, -12.3426075, 0.37126487, 38.514793, -13.47533, 0.28006452, 38.49933, -13.47533, 0.28006452, 38.49933, -17.867746, 0.0055910945, 38.80451, -13.47533, 0.005591154, 38.49933, -13.47533, 0.28006452, 38.49933, -17.867746, 0.37126476, 38.80451, -17.867746, 0.0055910945, 38.80451, -17.867746, 0.37126476, 38.80451, -13.47533, 0.28006452, 38.49933, -14.573328, 0.37126487, 38.575733, -16.664772, 0.371265, 37.19757, -17.566149, 0.0055912733, 37.171875, -16.664772, 0.0055912733, 37.19757, -16.664772, 0.371265, 37.19757, -17.566149, 0.371265, 37.171875, -17.566149, 0.0055912733, 37.171875, -16.664772, 0.0055912733, 37.19757, -11.086311, 0.371265, 37.220222, -16.664772, 0.371265, 37.19757, -16.664772, 0.0055912733, 37.19757, -9.226971, 0.28006464, 37.227917, -11.086311, 0.371265, 37.220222, -9.226971, 0.28006464, 37.227917, -16.664772, 0.0055912733, 37.19757, -9.226971, 0.0055912733, 37.227917, -17.572756, 0.37126487, 38.154984, -16.664772, 0.371265, 37.19757, -16.6714, 0.37126487, 38.18373, -11.086311, 0.371265, 37.220222, -16.6714, 0.37126487, 38.18373, -16.664772, 0.371265, 37.19757, -11.086311, 0.371265, 37.220222, -9.23255, 0.37126487, 38.057865, -16.6714, 0.37126487, 38.18373, -9.23255, 0.37126487, 38.057865, -11.086311, 0.371265, 37.220222, -9.228367, 0.371265, 37.435623, -9.228367, 0.371265, 37.435623, -11.086311, 0.371265, 37.220222, -9.226971, 0.28006464, 37.227917, -16.664772, 0.371265, 37.19757, -17.572756, 0.37126487, 38.154984, -17.088415, 0.371265, 37.640697, -17.088415, 0.371265, 37.640697, -17.572756, 0.37126487, 38.154984, -17.570097, 0.371265, 37.75921, -17.570097, 0.371265, 37.75921, -17.486889, 0.23162824, 37.650238, -17.088415, 0.371265, 37.640697, -17.486889, 0.23162824, 37.650238, -17.56825, 0.371265, 37.48474, -17.088415, 0.371265, 37.640697, -16.664772, 0.371265, 37.19757, -17.088415, 0.371265, 37.640697, -17.56825, 0.371265, 37.48474, -16.664772, 0.371265, 37.19757, -17.56825, 0.371265, 37.48474, -17.566149, 0.371265, 37.171875, -16.6714, 0.005591154, 38.18373, -17.572756, 0.37126487, 38.154984, -16.6714, 0.37126487, 38.18373, -16.6714, 0.005591154, 38.18373, -17.572756, 0.005591154, 38.154984, -17.572756, 0.37126487, 38.154984, -9.23255, 0.37126487, 38.057865, -16.6714, 0.005591154, 38.18373, -16.6714, 0.37126487, 38.18373, -9.23255, 0.37126487, 38.057865, -9.23255, 0.0055912137, 38.057865, -16.6714, 0.005591154, 38.18373, -17.566149, 0.0055912733, 37.171875, -16.6714, 0.005591154, 38.18373, -16.664772, 0.0055912733, 37.19757, -16.6714, 0.005591154, 38.18373, -17.566149, 0.0055912733, 37.171875, -17.569721, 0.0055912137, 37.703354, -16.6714, 0.005591154, 38.18373, -17.569721, 0.0055912137, 37.703354, -17.572756, 0.005591154, 38.154984, -9.23255, 0.0055912137, 38.057865, -16.664772, 0.0055912733, 37.19757, -16.6714, 0.005591154, 38.18373, -9.23255, 0.0055912137, 38.057865, -9.226971, 0.0055912733, 37.227917, -16.664772, 0.0055912733, 37.19757, -17.56825, 0.371265, 37.48474, -17.486889, 0.23162824, 37.650238, -17.569721, 0.0055912137, 37.703354, -17.486889, 0.23162824, 37.650238, -17.570097, 0.371265, 37.75921, -17.569721, 0.0055912137, 37.703354, -17.566149, 0.0055912733, 37.171875, -17.56825, 0.371265, 37.48474, -17.569721, 0.0055912137, 37.703354, -17.566149, 0.0055912733, 37.171875, -17.566149, 0.371265, 37.171875, -17.56825, 0.371265, 37.48474, -17.570097, 0.371265, 37.75921, -17.572756, 0.005591154, 38.154984, -17.569721, 0.0055912137, 37.703354, -17.570097, 0.371265, 37.75921, -17.572756, 0.37126487, 38.154984, -17.572756, 0.005591154, 38.154984, -9.23255, 0.37126487, 38.057865, -9.226971, 0.0055912733, 37.227917, -9.23255, 0.0055912137, 38.057865, -9.226971, 0.0055912733, 37.227917, -9.23255, 0.37126487, 38.057865, -9.228367, 0.371265, 37.435623, -9.226971, 0.0055912733, 37.227917, -9.228367, 0.371265, 37.435623, -9.226971, 0.28006464, 37.227917, -16.810944, -3.458273, 47.519463, -17.46208, 1.270175, 47.59407, -17.54053, -3.458273, 47.51456, -16.810944, -3.458273, 47.519463, -16.890453, 1.270175, 47.59791, -17.46208, 1.270175, 47.59407, -16.890453, 1.270175, 47.59791, -17.465921, 1.270175, 48.165695, -17.46208, 1.270175, 47.59407, -16.890453, 1.270175, 47.59791, -16.894295, 1.270175, 48.16954, -17.465921, 1.270175, 48.165695, -16.894295, 1.270175, 48.16954, -17.545431, -3.458273, 48.24415, -17.465921, 1.270175, 48.165695, -16.894295, 1.270175, 48.16954, -16.815845, -3.458273, 48.24905, -17.545431, -3.458273, 48.24415, -16.815845, -3.458273, 48.24905, -17.54053, -3.458273, 47.51456, -17.545431, -3.458273, 48.24415, -16.815845, -3.458273, 48.24905, -16.810944, -3.458273, 47.519463, -17.54053, -3.458273, 47.51456, -17.54053, -3.458273, 47.51456, -17.465921, 1.270175, 48.165695, -17.545431, -3.458273, 48.24415, -17.54053, -3.458273, 47.51456, -17.46208, 1.270175, 47.59407, -17.465921, 1.270175, 48.165695, -16.815845, -3.458273, 48.24905, -16.890453, 1.270175, 47.59791, -16.810944, -3.458273, 47.519463, -16.815845, -3.458273, 48.24905, -16.894295, 1.270175, 48.16954, -16.890453, 1.270175, 47.59791, -9.055229, -3.45827, 22.581722, -9.785252, 1.2701778, 22.576817, -9.785252, -3.45827, 22.576817, -9.055229, -3.45827, 22.581722, -9.055229, 1.2701778, 22.581722, -9.785252, 1.2701778, 22.576817, -9.060133, -3.45827, 23.31131, -9.785252, -3.45827, 22.576817, -9.790155, -3.45827, 23.306404, -9.060133, -3.45827, 23.31131, -9.055229, -3.45827, 22.581722, -9.785252, -3.45827, 22.576817, -9.785252, -3.45827, 22.576817, -9.790155, 1.2701778, 23.306404, -9.790155, -3.45827, 23.306404, -9.785252, -3.45827, 22.576817, -9.785252, 1.2701778, 22.576817, -9.790155, 1.2701778, 23.306404, -9.060133, 0.08806592, 23.31131, -9.242529, 1.2701778, 23.310083, -9.058907, 1.2701778, 23.128912, -9.055229, -3.45827, 22.581722, -9.060133, 0.08806592, 23.31131, -9.058907, 1.2701778, 23.128912, -9.060133, 0.08806592, 23.31131, -9.055229, -3.45827, 22.581722, -9.060133, -3.45827, 23.31131, -9.055229, -3.45827, 22.581722, -9.058907, 1.2701778, 23.128912, -9.055229, 1.2701778, 22.581722, -9.058907, 1.2701778, 23.128912, -9.785252, 1.2701778, 22.576817, -9.055229, 1.2701778, 22.581722, -9.785252, 1.2701778, 22.576817, -9.058907, 1.2701778, 23.128912, -9.242529, 1.2701778, 23.310083, -9.785252, 1.2701778, 22.576817, -9.242529, 1.2701778, 23.310083, -9.790155, 1.2701778, 23.306404, -9.060133, -3.45827, 23.31131, -9.242529, 1.2701778, 23.310083, -9.060133, 0.08806592, 23.31131, -9.242529, 1.2701778, 23.310083, -9.060133, -3.45827, 23.31131, -9.790155, -3.45827, 23.306404, -9.242529, 1.2701778, 23.310083, -9.790155, -3.45827, 23.306404, -9.790155, 1.2701778, 23.306404, -13.449499, 0.0055915117, 35.369823, -17.5551, 0.37126523, 35.52769, -13.449499, 0.37126523, 35.369823, -13.449499, 0.0055915117, 35.369823, -17.5551, 0.0055915117, 35.52769, -17.5551, 0.37126523, 35.52769, -9.215921, 0.37126523, 35.583733, -13.449499, 0.0055915117, 35.369823, -13.449499, 0.37126523, 35.369823, -9.215921, 0.37126523, 35.583733, -9.215921, 0.005591452, 35.583733, -13.449499, 0.0055915117, 35.369823, -13.442921, 0.005591631, 34.39108, -17.5551, 0.0055915117, 35.52769, -13.449499, 0.0055915117, 35.369823, -13.442921, 0.005591631, 34.39108, -17.54952, 0.0055915713, 34.697742, -17.5551, 0.0055915117, 35.52769, -13.449499, 0.0055915117, 35.369823, -9.208305, 0.005591631, 34.45052, -13.442921, 0.005591631, 34.39108, -13.449499, 0.0055915117, 35.369823, -9.212177, 0.0055915713, 35.02651, -9.208305, 0.005591631, 34.45052, -9.212177, 0.0055915713, 35.02651, -13.449499, 0.0055915117, 35.369823, -9.215921, 0.005591452, 35.583733, -17.54952, 0.0055915713, 34.697742, -17.5551, 0.37126523, 35.52769, -17.5551, 0.0055915117, 35.52769, -17.54952, 0.0055915713, 34.697742, -17.54952, 0.37126535, 34.697742, -17.5551, 0.37126523, 35.52769, -9.212622, 0.37126523, 35.092834, -9.371677, 0.26217395, 34.99489, -9.212177, 0.0055915713, 35.02651, -13.444563, 0.37126535, 34.635437, -13.442921, 0.280065, 34.39108, -12.384375, 0.37126535, 34.40561, -13.444563, 0.37126535, 34.635437, -14.469788, 0.37126535, 34.467525, -13.442921, 0.280065, 34.39108, -13.444563, 0.37126535, 34.635437, -17.54952, 0.37126535, 34.697742, -14.469788, 0.37126535, 34.467525, -13.444563, 0.37126535, 34.635437, -17.5551, 0.37126523, 35.52769, -17.54952, 0.37126535, 34.697742, -17.5551, 0.37126523, 35.52769, -13.444563, 0.37126535, 34.635437, -13.449499, 0.37126523, 35.369823, -12.384375, 0.37126535, 34.40561, -13.449499, 0.37126523, 35.369823, -13.444563, 0.37126535, 34.635437, -13.449499, 0.37126523, 35.369823, -9.212622, 0.37126523, 35.092834, -9.215921, 0.37126523, 35.583733, -13.449499, 0.37126523, 35.369823, -9.939795, 0.37126523, 34.988453, -9.212622, 0.37126523, 35.092834, -12.384375, 0.37126535, 34.40561, -9.939795, 0.37126523, 34.988453, -13.449499, 0.37126523, 35.369823, -9.371677, 0.26217395, 34.99489, -9.212622, 0.37126523, 35.092834, -9.939795, 0.37126523, 34.988453, -9.21077, 0.37126535, 34.81706, -9.371677, 0.26217395, 34.99489, -9.939795, 0.37126523, 34.988453, -9.939795, 0.37126523, 34.988453, -12.384375, 0.37126535, 34.40561, -9.21077, 0.37126535, 34.81706, -9.21077, 0.37126535, 34.81706, -12.384375, 0.37126535, 34.40561, -9.208305, 0.37126535, 34.45052, -9.215921, 0.005591452, 35.583733, -9.212622, 0.37126523, 35.092834, -9.212177, 0.0055915713, 35.02651, -9.215921, 0.005591452, 35.583733, -9.215921, 0.37126523, 35.583733, -9.212622, 0.37126523, 35.092834, -9.21077, 0.37126535, 34.81706, -9.208305, 0.005591631, 34.45052, -9.212177, 0.0055915713, 35.02651, -9.21077, 0.37126535, 34.81706, -9.208305, 0.37126535, 34.45052, -9.208305, 0.005591631, 34.45052, -9.371677, 0.26217395, 34.99489, -9.21077, 0.37126535, 34.81706, -9.212177, 0.0055915713, 35.02651, -9.208305, 0.37126535, 34.45052, -13.442921, 0.005591631, 34.39108, -9.208305, 0.005591631, 34.45052, -13.442921, 0.005591631, 34.39108, -9.208305, 0.37126535, 34.45052, -12.384375, 0.37126535, 34.40561, -13.442921, 0.005591631, 34.39108, -12.384375, 0.37126535, 34.40561, -13.442921, 0.280065, 34.39108, -13.442921, 0.280065, 34.39108, -17.54952, 0.0055915713, 34.697742, -13.442921, 0.005591631, 34.39108, -13.442921, 0.280065, 34.39108, -17.54952, 0.37126535, 34.697742, -17.54952, 0.0055915713, 34.697742, -17.54952, 0.37126535, 34.697742, -13.442921, 0.280065, 34.39108, -14.469788, 0.37126535, 34.467525, -10.702703, 0.005590558, 43.383537, -17.802399, 0.37126428, 43.495537, -10.702703, 0.37126428, 43.383537, -10.702703, 0.005590558, 43.383537, -17.802399, 0.005590558, 43.495537, -17.802399, 0.37126428, 43.495537, -9.074274, 0.37126428, 43.401463, -10.702703, 0.005590558, 43.383537, -10.702703, 0.37126428, 43.383537, -9.074274, 0.37126428, 43.401463, -9.074274, 0.005590558, 43.401463, -10.702703, 0.005590558, 43.383537, -10.695927, 0.0055906773, 42.375122, -17.802399, 0.005590558, 43.495537, -10.702703, 0.005590558, 43.383537, -10.695927, 0.0055906773, 42.375122, -17.795794, 0.0055906773, 42.512863, -17.802399, 0.005590558, 43.495537, -9.074274, 0.005590558, 43.401463, -10.695927, 0.0055906773, 42.375122, -10.702703, 0.005590558, 43.383537, -9.074274, 0.005590558, 43.401463, -9.068697, 0.0055906773, 42.571514, -10.695927, 0.0055906773, 42.375122, -9.074274, 0.005590558, 43.401463, -9.068697, 0.3712644, 42.571514, -9.068697, 0.0055906773, 42.571514, -9.074274, 0.005590558, 43.401463, -9.074274, 0.37126428, 43.401463, -9.068697, 0.3712644, 42.571514, -10.697622, 0.3712644, 42.627335, -10.695927, 0.28006405, 42.375122, -10.289118, 0.3712644, 42.42411, -10.697622, 0.3712644, 42.627335, -12.470892, 0.3712644, 42.409447, -10.695927, 0.28006405, 42.375122, -10.697622, 0.3712644, 42.627335, -16.464678, 0.3712644, 42.4869, -12.470892, 0.3712644, 42.409447, -10.289118, 0.3712644, 42.42411, -10.702703, 0.37126428, 43.383537, -10.697622, 0.3712644, 42.627335, -10.289118, 0.3712644, 42.42411, -9.074274, 0.37126428, 43.401463, -10.702703, 0.37126428, 43.383537, -9.074274, 0.37126428, 43.401463, -10.289118, 0.3712644, 42.42411, -9.068697, 0.3712644, 42.571514, -17.802399, 0.37126428, 43.495537, -10.697622, 0.3712644, 42.627335, -10.702703, 0.37126428, 43.383537, -10.697622, 0.3712644, 42.627335, -17.802399, 0.37126428, 43.495537, -16.464678, 0.3712644, 42.4869, -16.464678, 0.3712644, 42.4869, -17.802399, 0.37126428, 43.495537, -17.797441, 0.3712644, 42.758095, -16.464678, 0.3712644, 42.4869, -17.797441, 0.3712644, 42.758095, -17.795794, 0.28006405, 42.512863, -9.068697, 0.3712644, 42.571514, -10.695927, 0.0055906773, 42.375122, -9.068697, 0.0055906773, 42.571514, -10.695927, 0.0055906773, 42.375122, -9.068697, 0.3712644, 42.571514, -10.289118, 0.3712644, 42.42411, -10.695927, 0.0055906773, 42.375122, -10.289118, 0.3712644, 42.42411, -10.695927, 0.28006405, 42.375122, -10.695927, 0.28006405, 42.375122, -17.795794, 0.0055906773, 42.512863, -10.695927, 0.0055906773, 42.375122, -10.695927, 0.28006405, 42.375122, -16.464678, 0.3712644, 42.4869, -17.795794, 0.0055906773, 42.512863, -17.795794, 0.0055906773, 42.512863, -16.464678, 0.3712644, 42.4869, -17.795794, 0.28006405, 42.512863, -16.464678, 0.3712644, 42.4869, -10.695927, 0.28006405, 42.375122, -12.470892, 0.3712644, 42.409447, -17.795794, 0.28006405, 42.512863, -17.802399, 0.005590558, 43.495537, -17.795794, 0.0055906773, 42.512863, -17.802399, 0.005590558, 43.495537, -17.795794, 0.28006405, 42.512863, -17.797441, 0.3712644, 42.758095, -17.802399, 0.005590558, 43.495537, -17.797441, 0.3712644, 42.758095, -17.802399, 0.37126428, 43.495537, -10.597399, 0.005591333, 36.740005, -17.854618, 0.371265, 36.850945, -10.597399, 0.3712651, 36.740005, -10.597399, 0.005591333, 36.740005, -17.854618, 0.005591333, 36.850945, -17.854618, 0.371265, 36.850945, -8.932753, 0.3712651, 36.758175, -10.597399, 0.005591333, 36.740005, -10.597399, 0.3712651, 36.740005, -8.932753, 0.3712651, 36.758175, -8.932753, 0.005591333, 36.758175, -10.597399, 0.005591333, 36.740005, -10.590622, 0.005591452, 35.73159, -17.854618, 0.005591333, 36.850945, -10.597399, 0.005591333, 36.740005, -10.590622, 0.005591452, 35.73159, -17.848013, 0.005591452, 35.868275, -17.854618, 0.005591333, 36.850945, -8.932753, 0.005591333, 36.758175, -10.590622, 0.005591452, 35.73159, -10.597399, 0.005591333, 36.740005, -8.932753, 0.005591333, 36.758175, -8.927174, 0.005591452, 35.928226, -10.590622, 0.005591452, 35.73159, -8.932753, 0.005591333, 36.758175, -8.927174, 0.3712651, 35.928226, -8.927174, 0.005591452, 35.928226, -8.932753, 0.005591333, 36.758175, -8.932753, 0.3712651, 36.758175, -8.927174, 0.3712651, 35.928226, -10.592318, 0.3712651, 35.983803, -10.590622, 0.28006488, 35.73159, -10.17465, 0.37126523, 35.78064, -10.592318, 0.3712651, 35.983803, -12.40486, 0.37126523, 35.76565, -10.590622, 0.28006488, 35.73159, -10.592318, 0.3712651, 35.983803, -16.487228, 0.3712651, 35.842945, -12.40486, 0.37126523, 35.76565, -10.17465, 0.37126523, 35.78064, -10.597399, 0.3712651, 36.740005, -10.592318, 0.3712651, 35.983803, -10.17465, 0.37126523, 35.78064, -8.932753, 0.3712651, 36.758175, -10.597399, 0.3712651, 36.740005, -8.932753, 0.3712651, 36.758175, -10.17465, 0.37126523, 35.78064, -8.927174, 0.3712651, 35.928226, -17.854618, 0.371265, 36.850945, -10.592318, 0.3712651, 35.983803, -10.597399, 0.3712651, 36.740005, -10.592318, 0.3712651, 35.983803, -17.854618, 0.371265, 36.850945, -16.487228, 0.3712651, 35.842945, -16.487228, 0.3712651, 35.842945, -17.854618, 0.371265, 36.850945, -17.849669, 0.3712651, 36.11438, -16.487228, 0.3712651, 35.842945, -17.849669, 0.3712651, 36.11438, -17.848013, 0.28006476, 35.868275, -8.927174, 0.3712651, 35.928226, -10.590622, 0.005591452, 35.73159, -8.927174, 0.005591452, 35.928226, -10.590622, 0.005591452, 35.73159, -8.927174, 0.3712651, 35.928226, -10.17465, 0.37126523, 35.78064, -10.590622, 0.005591452, 35.73159, -10.17465, 0.37126523, 35.78064, -10.590622, 0.28006488, 35.73159, -10.590622, 0.28006488, 35.73159, -17.848013, 0.005591452, 35.868275, -10.590622, 0.005591452, 35.73159, -10.590622, 0.28006488, 35.73159, -16.487228, 0.3712651, 35.842945, -17.848013, 0.005591452, 35.868275, -17.848013, 0.005591452, 35.868275, -16.487228, 0.3712651, 35.842945, -17.848013, 0.28006476, 35.868275, -16.487228, 0.3712651, 35.842945, -10.590622, 0.28006488, 35.73159, -12.40486, 0.37126523, 35.76565, -17.848013, 0.28006476, 35.868275, -17.854618, 0.005591333, 36.850945, -17.848013, 0.005591452, 35.868275, -17.854618, 0.005591333, 36.850945, -17.848013, 0.28006476, 35.868275, -17.849669, 0.3712651, 36.11438, -17.854618, 0.005591333, 36.850945, -17.849669, 0.3712651, 36.11438, -17.854618, 0.371265, 36.850945, -16.774326, -3.4582698, 22.20213, -17.504349, 1.2701781, 22.197224, -17.504349, -3.4582698, 22.197224, -16.774326, -3.4582698, 22.20213, -16.774326, 0.72166747, 22.20213, -17.504349, 1.2701781, 22.197224, -16.774326, 0.72166747, 22.20213, -17.509253, 1.2701778, 22.926807, -17.504349, 1.2701781, 22.197224, -16.774326, 0.72166747, 22.20213, -16.77923, 1.2701778, 22.931713, -17.509253, 1.2701778, 22.926807, -16.77923, 1.2701778, 22.931713, -17.509253, -3.45827, 22.926807, -17.509253, 1.2701778, 22.926807, -16.77923, 1.2701778, 22.931713, -16.77923, -3.45827, 22.931713, -17.509253, -3.45827, 22.926807, -16.77923, -3.45827, 22.931713, -17.504349, -3.4582698, 22.197224, -17.509253, -3.45827, 22.926807, -16.77923, -3.45827, 22.931713, -16.774326, -3.4582698, 22.20213, -17.504349, -3.4582698, 22.197224, -17.504349, -3.4582698, 22.197224, -17.509253, 1.2701778, 22.926807, -17.509253, -3.45827, 22.926807, -17.504349, -3.4582698, 22.197224, -17.504349, 1.2701781, 22.197224, -17.509253, 1.2701778, 22.926807, -16.77923, -3.45827, 22.931713, -16.774326, 0.72166747, 22.20213, -16.774326, -3.4582698, 22.20213, -16.77923, -3.45827, 22.931713, -16.77923, 1.2701778, 22.931713, -16.774326, 0.72166747, 22.20213, -16.92366, -0.19077104, 22.930307, -17.155365, -0.09826177, 22.928751, -17.155365, -0.19077104, 22.928751, -16.92366, -0.19077104, 22.930307, -16.92366, -0.09826177, 22.930307, -17.155365, -0.09826177, 22.928751, -16.92366, -0.09826177, 22.930307, -17.320957, -0.098264754, 47.5684, -17.155365, -0.09826177, 22.928751, -16.92366, -0.09826177, 22.930307, -17.089252, -0.098264754, 47.569958, -17.320957, -0.098264754, 47.5684, -17.089252, -0.098264754, 47.569958, -17.320957, -0.19077402, 47.5684, -17.320957, -0.098264754, 47.5684, -17.089252, -0.098264754, 47.569958, -17.089252, -0.19077402, 47.569958, -17.320957, -0.19077402, 47.5684, -17.089252, -0.19077402, 47.569958, -17.155365, -0.19077104, 22.928751, -17.320957, -0.19077402, 47.5684, -17.089252, -0.19077402, 47.569958, -16.92366, -0.19077104, 22.930307, -17.155365, -0.19077104, 22.928751, -17.155365, -0.19077104, 22.928751, -17.320957, -0.098264754, 47.5684, -17.320957, -0.19077402, 47.5684, -17.155365, -0.19077104, 22.928751, -17.155365, -0.09826177, 22.928751, -17.320957, -0.098264754, 47.5684, -17.089252, -0.19077402, 47.569958, -16.92366, -0.09826177, 22.930307, -16.92366, -0.19077104, 22.930307, -17.089252, -0.19077402, 47.569958, -17.089252, -0.098264754, 47.569958, -16.92366, -0.09826177, 22.930307, -9.130678, -2.9032154, 33.80826, -9.860701, 1.8252325, 33.803356, -9.860701, -2.9032154, 33.803352, -9.130678, -2.9032154, 33.80826, -9.130678, 1.8252325, 33.80826, -9.860701, 1.8252325, 33.803356, -9.135584, -2.9032154, 34.538284, -9.860701, -2.9032154, 33.803352, -9.865606, -2.9032154, 34.53338, -9.135584, -2.9032154, 34.538284, -9.130678, -2.9032154, 33.80826, -9.860701, -2.9032154, 33.803352, -9.860701, -2.9032154, 33.803352, -9.865606, 1.8252323, 34.53338, -9.865606, -2.9032154, 34.53338, -9.860701, -2.9032154, 33.803352, -9.860701, 1.8252325, 33.803356, -9.865606, 1.8252323, 34.53338, -9.135584, 0.64312047, 34.538284, -9.317982, 1.8252323, 34.537056, -9.134359, 1.8252323, 34.35589, -9.130678, -2.9032154, 33.80826, -9.135584, 0.64312047, 34.538284, -9.134359, 1.8252323, 34.35589, -9.135584, 0.64312047, 34.538284, -9.130678, -2.9032154, 33.80826, -9.135584, -2.9032154, 34.538284, -9.130678, -2.9032154, 33.80826, -9.134359, 1.8252323, 34.35589, -9.130678, 1.8252325, 33.80826, -9.134359, 1.8252323, 34.35589, -9.860701, 1.8252325, 33.803356, -9.130678, 1.8252325, 33.80826, -9.860701, 1.8252325, 33.803356, -9.134359, 1.8252323, 34.35589, -9.317982, 1.8252323, 34.537056, -9.860701, 1.8252325, 33.803356, -9.317982, 1.8252323, 34.537056, -9.865606, 1.8252323, 34.53338, -9.135584, -2.9032154, 34.538284, -9.317982, 1.8252323, 34.537056, -9.135584, 0.64312047, 34.538284, -9.317982, 1.8252323, 34.537056, -9.135584, -2.9032154, 34.538284, -9.865606, -2.9032154, 34.53338, -9.317982, 1.8252323, 34.537056, -9.865606, -2.9032154, 34.53338, -9.865606, 1.8252323, 34.53338, -9.18182, -3.7899094, 41.417854, -9.91184, 0.9385386, 41.41295, -9.91184, -3.7899094, 41.41295, -9.18182, -3.7899094, 41.417854, -9.18182, 0.9385386, 41.417854, -9.91184, 0.9385386, 41.41295, -9.186722, -3.7899094, 42.147438, -9.91184, -3.7899094, 41.41295, -9.916744, -3.7899094, 42.142532, -9.186722, -3.7899094, 42.147438, -9.18182, -3.7899094, 41.417854, -9.91184, -3.7899094, 41.41295, -9.91184, -3.7899094, 41.41295, -9.916744, 0.9385385, 42.142532, -9.916744, -3.7899094, 42.142532, -9.91184, -3.7899094, 41.41295, -9.91184, 0.9385386, 41.41295, -9.916744, 0.9385385, 42.142532, -9.186722, -0.24357355, 42.147438, -9.36912, 0.9385385, 42.146214, -9.185497, 0.9385385, 41.965042, -9.18182, -3.7899094, 41.417854, -9.186722, -0.24357355, 42.147438, -9.185497, 0.9385385, 41.965042, -9.186722, -0.24357355, 42.147438, -9.18182, -3.7899094, 41.417854, -9.186722, -3.7899094, 42.147438, -9.18182, -3.7899094, 41.417854, -9.185497, 0.9385385, 41.965042, -9.18182, 0.9385386, 41.417854, -9.185497, 0.9385385, 41.965042, -9.91184, 0.9385386, 41.41295, -9.18182, 0.9385386, 41.417854, -9.91184, 0.9385386, 41.41295, -9.185497, 0.9385385, 41.965042, -9.36912, 0.9385385, 42.146214, -9.91184, 0.9385386, 41.41295, -9.36912, 0.9385385, 42.146214, -9.916744, 0.9385385, 42.142532, -9.186722, -3.7899094, 42.147438, -9.36912, 0.9385385, 42.146214, -9.186722, -0.24357355, 42.147438, -9.36912, 0.9385385, 42.146214, -9.186722, -3.7899094, 42.147438, -9.916744, -3.7899094, 42.142532, -9.36912, 0.9385385, 42.146214, -9.916744, -3.7899094, 42.142532, -9.916744, 0.9385385, 42.142532, -17.459593, -3.5494714, 33.653664, -18.189178, 1.1789763, 33.64876, -18.189178, -3.5494714, 33.64876, -17.459593, -3.5494714, 33.653664, -17.459593, 1.1789763, 33.653664, -18.189178, 1.1789763, 33.64876, -17.4645, -3.5494716, 34.383686, -18.189178, -3.5494714, 33.64876, -18.194086, -3.5494716, 34.378784, -17.4645, -3.5494716, 34.383686, -17.459593, -3.5494714, 33.653664, -18.189178, -3.5494714, 33.64876, -18.189178, -3.5494714, 33.64876, -18.194086, 1.178976, 34.378784, -18.194086, -3.5494716, 34.378784, -18.189178, -3.5494714, 33.64876, -18.189178, 1.1789763, 33.64876, -18.194086, 1.178976, 34.378784, -17.4645, -0.0031356215, 34.383686, -17.646896, 1.178976, 34.38246, -17.463274, 1.1789763, 34.20129, -17.459593, -3.5494714, 33.653664, -17.4645, -0.0031356215, 34.383686, -17.463274, 1.1789763, 34.20129, -17.4645, -0.0031356215, 34.383686, -17.459593, -3.5494714, 33.653664, -17.4645, -3.5494716, 34.383686, -17.459593, -3.5494714, 33.653664, -17.463274, 1.1789763, 34.20129, -17.459593, 1.1789763, 33.653664, -17.463274, 1.1789763, 34.20129, -18.189178, 1.1789763, 33.64876, -17.459593, 1.1789763, 33.653664, -18.189178, 1.1789763, 33.64876, -17.463274, 1.1789763, 34.20129, -17.646896, 1.178976, 34.38246, -18.189178, 1.1789763, 33.64876, -17.646896, 1.178976, 34.38246, -18.194086, 1.178976, 34.378784, -17.4645, -3.5494716, 34.383686, -17.646896, 1.178976, 34.38246, -17.4645, -0.0031356215, 34.383686, -17.646896, 1.178976, 34.38246, -17.4645, -3.5494716, 34.383686, -18.194086, -3.5494716, 34.378784, -17.646896, 1.178976, 34.38246, -18.194086, -3.5494716, 34.378784, -18.194086, 1.178976, 34.378784, -17.511396, -3.5494723, 41.361874, -18.240982, 1.1789753, 41.35697, -18.240982, -3.5494723, 41.35697, -17.511396, -3.5494723, 41.361874, -17.511396, 1.1789753, 41.361874, -18.240982, 1.1789753, 41.35697, -17.5163, -3.5494723, 42.09146, -18.240982, -3.5494723, 41.35697, -18.245886, -3.5494723, 42.086555, -17.5163, -3.5494723, 42.09146, -17.511396, -3.5494723, 41.361874, -18.240982, -3.5494723, 41.35697, -18.240982, -3.5494723, 41.35697, -18.245886, 1.1789753, 42.086555, -18.245886, -3.5494723, 42.086555, -18.240982, -3.5494723, 41.35697, -18.240982, 1.1789753, 41.35697, -18.245886, 1.1789753, 42.086555, -17.5163, -0.0031365752, 42.09146, -17.698698, 1.1789753, 42.090233, -17.515074, 1.1789753, 41.909065, -17.511396, -3.5494723, 41.361874, -17.5163, -0.0031365752, 42.09146, -17.515074, 1.1789753, 41.909065, -17.5163, -0.0031365752, 42.09146, -17.511396, -3.5494723, 41.361874, -17.5163, -3.5494723, 42.09146, -17.511396, -3.5494723, 41.361874, -17.515074, 1.1789753, 41.909065, -17.511396, 1.1789753, 41.361874, -17.515074, 1.1789753, 41.909065, -18.240982, 1.1789753, 41.35697, -17.511396, 1.1789753, 41.361874, -18.240982, 1.1789753, 41.35697, -17.515074, 1.1789753, 41.909065, -17.698698, 1.1789753, 42.090233, -18.240982, 1.1789753, 41.35697, -17.698698, 1.1789753, 42.090233, -18.245886, 1.1789753, 42.086555, -17.5163, -3.5494723, 42.09146, -17.698698, 1.1789753, 42.090233, -17.5163, -0.0031365752, 42.09146, -17.698698, 1.1789753, 42.090233, -17.5163, -3.5494723, 42.09146, -18.245886, -3.5494723, 42.086555, -17.698698, 1.1789753, 42.090233, -18.245886, -3.5494723, 42.086555, -18.245886, 1.1789753, 42.086555, -12.414185, -22.456995, 9.651152, -10.526909, -22.242655, 9.475412, -12.414185, -22.326996, 9.5211525, -12.414185, -22.456995, 9.651152, -10.526909, -22.391994, 9.624752, -10.526909, -22.242655, 9.475412, -19.07084, -22.391996, 9.624752, -12.414185, -22.456995, 9.651152, -12.414185, -22.326996, 9.5211525, -19.07084, -22.391996, 9.624752, -12.414185, -22.326996, 9.5211525, -19.07084, -22.242657, 9.475412, -12.414185, -22.326996, 9.5211525, -10.526909, -22.03864, 9.420736, -12.414185, -22.14938, 9.473576, -12.414185, -22.326996, 9.5211525, -10.526909, -22.242655, 9.475412, -10.526909, -22.03864, 9.420736, -19.07084, -22.242657, 9.475412, -12.414185, -22.326996, 9.5211525, -12.414185, -22.14938, 9.473576, -19.07084, -22.242657, 9.475412, -12.414185, -22.14938, 9.473576, -19.07084, -22.03864, 9.420735, -12.414185, -22.14938, 9.473576, -10.526909, -21.834621, 9.475412, -12.414185, -21.971802, 9.5211525, -12.414185, -22.14938, 9.473576, -10.526909, -22.03864, 9.420736, -10.526909, -21.834621, 9.475412, -19.07084, -22.03864, 9.420735, -12.414185, -22.14938, 9.473576, -12.414185, -21.971802, 9.5211525, -19.07084, -22.03864, 9.420735, -12.414185, -21.971802, 9.5211525, -19.07084, -21.834623, 9.475412, -12.414185, -21.971802, 9.5211525, -10.526909, -21.685282, 9.624752, -12.414185, -21.841803, 9.651152, -12.414185, -21.971802, 9.5211525, -10.526909, -21.834621, 9.475412, -10.526909, -21.685282, 9.624752, -19.07084, -21.834623, 9.475412, -12.414185, -21.971802, 9.5211525, -12.414185, -21.841803, 9.651152, -19.07084, -21.834623, 9.475412, -12.414185, -21.841803, 9.651152, -19.07084, -21.685282, 9.624752, -12.414185, -21.841803, 9.651152, -10.526909, -21.630606, 9.82877, -12.414185, -21.794186, 9.82877, -12.414185, -21.841803, 9.651152, -10.526909, -21.685282, 9.624752, -10.526909, -21.630606, 9.82877, -19.07084, -21.685282, 9.624752, -12.414185, -21.841803, 9.651152, -12.414185, -21.794186, 9.82877, -19.07084, -21.685282, 9.624752, -12.414185, -21.794186, 9.82877, -19.07084, -21.630606, 9.828769, -12.414185, -21.794186, 9.82877, -10.526909, -21.685282, 10.032785, -12.414185, -21.841803, 10.006346, -12.414185, -21.794186, 9.82877, -10.526909, -21.630606, 9.82877, -10.526909, -21.685282, 10.032785, -19.07084, -21.630606, 9.828769, -12.414185, -21.794186, 9.82877, -12.414185, -21.841803, 10.006346, -19.07084, -21.630606, 9.828769, -12.414185, -21.841803, 10.006346, -19.07084, -21.685282, 10.032785, -12.414185, -21.841803, 10.006346, -10.526909, -21.834621, 10.182125, -12.414185, -21.971802, 10.136345, -12.414185, -21.841803, 10.006346, -10.526909, -21.685282, 10.032785, -10.526909, -21.834621, 10.182125, -19.07084, -21.685282, 10.032785, -12.414185, -21.841803, 10.006346, -12.414185, -21.971802, 10.136345, -19.07084, -21.685282, 10.032785, -12.414185, -21.971802, 10.136345, -19.07084, -21.834623, 10.182125, -12.414185, -21.971802, 10.136345, -10.526909, -22.03864, 10.236803, -12.414185, -22.149378, 10.183962, -12.414185, -21.971802, 10.136345, -10.526909, -21.834621, 10.182125, -10.526909, -22.03864, 10.236803, -19.07084, -21.834623, 10.182125, -12.414185, -21.971802, 10.136345, -12.414185, -22.149378, 10.183962, -19.07084, -21.834623, 10.182125, -12.414185, -22.149378, 10.183962, -19.07084, -22.03864, 10.236801, -12.414185, -22.149378, 10.183962, -10.526909, -22.242655, 10.182125, -12.414185, -22.326996, 10.136345, -12.414185, -22.149378, 10.183962, -10.526909, -22.03864, 10.236803, -10.526909, -22.242655, 10.182125, -19.07084, -22.03864, 10.236801, -12.414185, -22.149378, 10.183962, -12.414185, -22.326996, 10.136345, -19.07084, -22.03864, 10.236801, -12.414185, -22.326996, 10.136345, -19.07084, -22.242657, 10.182125, -12.414185, -22.326996, 10.136345, -10.526909, -22.391994, 10.032785, -12.414185, -22.456995, 10.006346, -12.414185, -22.326996, 10.136345, -10.526909, -22.242655, 10.182125, -10.526909, -22.391994, 10.032785, -19.07084, -22.242657, 10.182125, -12.414185, -22.326996, 10.136345, -12.414185, -22.456995, 10.006346, -19.07084, -22.242657, 10.182125, -12.414185, -22.456995, 10.006346, -19.07084, -22.391996, 10.032785, -12.414185, -22.456995, 10.006346, -10.526909, -22.446672, 9.82877, -12.414185, -22.504572, 9.82877, -12.414185, -22.456995, 10.006346, -10.526909, -22.391994, 10.032785, -10.526909, -22.446672, 9.82877, -19.07084, -22.391996, 10.032785, -12.414185, -22.456995, 10.006346, -12.414185, -22.504572, 9.82877, -19.07084, -22.391996, 10.032785, -12.414185, -22.504572, 9.82877, -19.07084, -22.446672, 9.828769, -12.414185, -22.504572, 9.82877, -10.526909, -22.391994, 9.624752, -12.414185, -22.456995, 9.651152, -12.414185, -22.504572, 9.82877, -10.526909, -22.446672, 9.82877, -10.526909, -22.391994, 9.624752, -19.07084, -22.446672, 9.828769, -12.414185, -22.504572, 9.82877, -12.414185, -22.456995, 9.651152, -19.07084, -22.446672, 9.828769, -12.414185, -22.456995, 9.651152, -19.07084, -22.391996, 9.624752, -19.07084, -22.242657, 9.475412, -19.693949, -22.03864, 9.828769, -19.07084, -22.391996, 9.624752, -19.07084, -22.391996, 9.624752, -19.693949, -22.03864, 9.828769, -19.07084, -22.446672, 9.828769, -19.07084, -22.446672, 9.828769, -19.693949, -22.03864, 9.828769, -19.07084, -22.391996, 10.032785, -19.07084, -22.391996, 10.032785, -19.693949, -22.03864, 9.828769, -19.07084, -22.242657, 10.182125, -19.07084, -22.03864, 9.420735, -19.693949, -22.03864, 9.828769, -19.07084, -22.242657, 9.475412, -19.07084, -21.834623, 9.475412, -19.693949, -22.03864, 9.828769, -19.07084, -22.03864, 9.420735, -19.07084, -21.685282, 9.624752, -19.693949, -22.03864, 9.828769, -19.07084, -21.834623, 9.475412, -19.07084, -21.630606, 9.828769, -19.693949, -22.03864, 9.828769, -19.07084, -21.685282, 9.624752, -19.07084, -21.685282, 10.032785, -19.693949, -22.03864, 9.828769, -19.07084, -21.630606, 9.828769, -19.07084, -21.834623, 10.182125, -19.693949, -22.03864, 9.828769, -19.07084, -21.685282, 10.032785, -19.07084, -22.03864, 10.236801, -19.693949, -22.03864, 9.828769, -19.07084, -21.834623, 10.182125, -19.07084, -22.242657, 10.182125, -19.693949, -22.03864, 9.828769, -19.07084, -22.03864, 10.236801, -10.526909, -22.391994, 9.624752, -9.89662, -22.03864, 9.82877, -10.526909, -22.242655, 9.475412, -10.526909, -22.446672, 9.82877, -9.89662, -22.03864, 9.82877, -10.526909, -22.391994, 9.624752, -10.526909, -22.391994, 10.032785, -9.89662, -22.03864, 9.82877, -10.526909, -22.446672, 9.82877, -10.526909, -22.242655, 10.182125, -9.89662, -22.03864, 9.82877, -10.526909, -22.391994, 10.032785, -10.526909, -22.242655, 9.475412, -9.89662, -22.03864, 9.82877, -10.526909, -22.03864, 9.420736, -10.526909, -22.03864, 9.420736, -9.89662, -22.03864, 9.82877, -10.526909, -21.834621, 9.475412, -10.526909, -21.834621, 9.475412, -9.89662, -22.03864, 9.82877, -10.526909, -21.685282, 9.624752, -10.526909, -21.685282, 9.624752, -9.89662, -22.03864, 9.82877, -10.526909, -21.630606, 9.82877, -10.526909, -21.630606, 9.82877, -9.89662, -22.03864, 9.82877, -10.526909, -21.685282, 10.032785, -10.526909, -21.685282, 10.032785, -9.89662, -22.03864, 9.82877, -10.526909, -21.834621, 10.182125, -10.526909, -21.834621, 10.182125, -9.89662, -22.03864, 9.82877, -10.526909, -22.03864, 10.236803, -10.526909, -22.03864, 10.236803, -9.89662, -22.03864, 9.82877, -10.526909, -22.242655, 10.182125, -14.262087, -22.348663, 7.7697797, -10.526909, -22.242655, 7.6348023, -14.262087, -22.188835, 7.609912, -14.262087, -22.348663, 7.7697797, -10.526909, -22.391994, 7.7841425, -10.526909, -22.242655, 7.6348023, -19.07084, -22.391996, 7.784142, -14.262087, -22.348663, 7.7697797, -14.262087, -22.188835, 7.609912, -19.07084, -22.391996, 7.784142, -14.262087, -22.188835, 7.609912, -19.07084, -22.242657, 7.634802, -14.262087, -22.188835, 7.609912, -10.526909, -22.03864, 7.580126, -14.262087, -21.970457, 7.5514, -14.262087, -22.188835, 7.609912, -10.526909, -22.242655, 7.6348023, -10.526909, -22.03864, 7.580126, -19.07084, -22.242657, 7.634802, -14.262087, -22.188835, 7.609912, -14.262087, -21.970457, 7.5514, -19.07084, -22.242657, 7.634802, -14.262087, -21.970457, 7.5514, -19.07084, -22.03864, 7.5801253, -14.262087, -21.970457, 7.5514, -10.526909, -21.834621, 7.6348023, -14.262087, -21.752077, 7.609912, -14.262087, -21.970457, 7.5514, -10.526909, -22.03864, 7.580126, -10.526909, -21.834621, 7.6348023, -19.07084, -22.03864, 7.5801253, -14.262087, -21.970457, 7.5514, -14.262087, -21.752077, 7.609912, -19.07084, -22.03864, 7.5801253, -14.262087, -21.752077, 7.609912, -19.07084, -21.834623, 7.634802, -14.262087, -21.752077, 7.609912, -10.526909, -21.685282, 7.7841425, -14.262087, -21.592209, 7.769779, -14.262087, -21.752077, 7.609912, -10.526909, -21.834621, 7.6348023, -10.526909, -21.685282, 7.7841425, -19.07084, -21.834623, 7.634802, -14.262087, -21.752077, 7.609912, -14.262087, -21.592209, 7.769779, -19.07084, -21.834623, 7.634802, -14.262087, -21.592209, 7.769779, -19.07084, -21.685282, 7.784142, -14.262087, -21.592209, 7.769779, -10.526909, -21.630606, 7.988159, -14.262087, -21.533697, 7.9881587, -14.262087, -21.592209, 7.769779, -10.526909, -21.685282, 7.7841425, -10.526909, -21.630606, 7.988159, -19.07084, -21.685282, 7.784142, -14.262087, -21.592209, 7.769779, -14.262087, -21.533697, 7.9881587, -19.07084, -21.685282, 7.784142, -14.262087, -21.533697, 7.9881587, -19.07084, -21.630606, 7.9881587, -14.262087, -21.533697, 7.9881587, -10.526909, -21.685282, 8.192176, -14.262087, -21.592209, 8.206538, -14.262087, -21.533697, 7.9881587, -10.526909, -21.630606, 7.988159, -10.526909, -21.685282, 8.192176, -19.07084, -21.630606, 7.9881587, -14.262087, -21.533697, 7.9881587, -14.262087, -21.592209, 8.206538, -19.07084, -21.630606, 7.9881587, -14.262087, -21.592209, 8.206538, -19.07084, -21.685282, 8.192175, -14.262087, -21.592209, 8.206538, -10.526909, -21.834621, 8.3415165, -14.262087, -21.752077, 8.366365, -14.262087, -21.592209, 8.206538, -10.526909, -21.685282, 8.192176, -10.526909, -21.834621, 8.3415165, -19.07084, -21.685282, 8.192175, -14.262087, -21.592209, 8.206538, -14.262087, -21.752077, 8.366365, -19.07084, -21.685282, 8.192175, -14.262087, -21.752077, 8.366365, -19.07084, -21.834623, 8.341516, -14.262087, -21.752077, 8.366365, -10.526909, -22.03864, 8.396193, -14.262087, -21.970457, 8.424917, -14.262087, -21.752077, 8.366365, -10.526909, -21.834621, 8.3415165, -10.526909, -22.03864, 8.396193, -19.07084, -21.834623, 8.341516, -14.262087, -21.752077, 8.366365, -14.262087, -21.970457, 8.424917, -19.07084, -21.834623, 8.341516, -14.262087, -21.970457, 8.424917, -19.07084, -22.03864, 8.396193, -14.262087, -21.970457, 8.424917, -10.526909, -22.242655, 8.3415165, -14.262087, -22.188835, 8.366365, -14.262087, -21.970457, 8.424917, -10.526909, -22.03864, 8.396193, -10.526909, -22.242655, 8.3415165, -19.07084, -22.03864, 8.396193, -14.262087, -21.970457, 8.424917, -14.262087, -22.188835, 8.366365, -19.07084, -22.03864, 8.396193, -14.262087, -22.188835, 8.366365, -19.07084, -22.242657, 8.341516, -14.262087, -22.188835, 8.366365, -10.526909, -22.391994, 8.192176, -14.262087, -22.348663, 8.206538, -14.262087, -22.188835, 8.366365, -10.526909, -22.242655, 8.3415165, -10.526909, -22.391994, 8.192176, -19.07084, -22.242657, 8.341516, -14.262087, -22.188835, 8.366365, -14.262087, -22.348663, 8.206538, -19.07084, -22.242657, 8.341516, -14.262087, -22.348663, 8.206538, -19.07084, -22.391996, 8.192175, -14.262087, -22.348663, 8.206538, -10.526909, -22.446672, 7.988159, -14.262087, -22.407175, 7.9881587, -14.262087, -22.348663, 8.206538, -10.526909, -22.391994, 8.192176, -10.526909, -22.446672, 7.988159, -19.07084, -22.391996, 8.192175, -14.262087, -22.348663, 8.206538, -14.262087, -22.407175, 7.9881587, -19.07084, -22.391996, 8.192175, -14.262087, -22.407175, 7.9881587, -19.07084, -22.446672, 7.9881587, -14.262087, -22.407175, 7.9881587, -10.526909, -22.391994, 7.7841425, -14.262087, -22.348663, 7.7697797, -14.262087, -22.407175, 7.9881587, -10.526909, -22.446672, 7.988159, -10.526909, -22.391994, 7.7841425, -19.07084, -22.446672, 7.9881587, -14.262087, -22.407175, 7.9881587, -14.262087, -22.348663, 7.7697797, -19.07084, -22.446672, 7.9881587, -14.262087, -22.348663, 7.7697797, -19.07084, -22.391996, 7.784142, -19.07084, -22.242657, 7.634802, -19.693949, -22.03864, 7.9881587, -19.07084, -22.391996, 7.784142, -19.07084, -22.391996, 7.784142, -19.693949, -22.03864, 7.9881587, -19.07084, -22.446672, 7.9881587, -19.07084, -22.446672, 7.9881587, -19.693949, -22.03864, 7.9881587, -19.07084, -22.391996, 8.192175, -19.07084, -22.391996, 8.192175, -19.693949, -22.03864, 7.9881587, -19.07084, -22.242657, 8.341516, -19.07084, -22.03864, 7.5801253, -19.693949, -22.03864, 7.9881587, -19.07084, -22.242657, 7.634802, -19.07084, -21.834623, 7.634802, -19.693949, -22.03864, 7.9881587, -19.07084, -22.03864, 7.5801253, -19.07084, -21.685282, 7.784142, -19.693949, -22.03864, 7.9881587, -19.07084, -21.834623, 7.634802, -19.07084, -21.630606, 7.9881587, -19.693949, -22.03864, 7.9881587, -19.07084, -21.685282, 7.784142, -19.07084, -21.685282, 8.192175, -19.693949, -22.03864, 7.9881587, -19.07084, -21.630606, 7.9881587, -19.07084, -21.834623, 8.341516, -19.693949, -22.03864, 7.9881587, -19.07084, -21.685282, 8.192175, -19.07084, -22.03864, 8.396193, -19.693949, -22.03864, 7.9881587, -19.07084, -21.834623, 8.341516, -19.07084, -22.242657, 8.341516, -19.693949, -22.03864, 7.9881587, -19.07084, -22.03864, 8.396193, -10.526909, -22.391994, 7.7841425, -9.89662, -22.03864, 7.988159, -10.526909, -22.242655, 7.6348023, -10.526909, -22.446672, 7.988159, -9.89662, -22.03864, 7.988159, -10.526909, -22.391994, 7.7841425, -10.526909, -22.391994, 8.192176, -9.89662, -22.03864, 7.988159, -10.526909, -22.446672, 7.988159, -10.526909, -22.242655, 8.3415165, -9.89662, -22.03864, 7.988159, -10.526909, -22.391994, 8.192176, -10.526909, -22.242655, 7.6348023, -9.89662, -22.03864, 7.988159, -10.526909, -22.03864, 7.580126, -10.526909, -22.03864, 7.580126, -9.89662, -22.03864, 7.988159, -10.526909, -21.834621, 7.6348023, -10.526909, -21.834621, 7.6348023, -9.89662, -22.03864, 7.988159, -10.526909, -21.685282, 7.7841425, -10.526909, -21.685282, 7.7841425, -9.89662, -22.03864, 7.988159, -10.526909, -21.630606, 7.988159, -10.526909, -21.630606, 7.988159, -9.89662, -22.03864, 7.988159, -10.526909, -21.685282, 8.192176, -10.526909, -21.685282, 8.192176, -9.89662, -22.03864, 7.988159, -10.526909, -21.834621, 8.3415165, -10.526909, -21.834621, 8.3415165, -9.89662, -22.03864, 7.988159, -10.526909, -22.03864, 8.396193, -10.526909, -22.03864, 8.396193, -9.89662, -22.03864, 7.988159, -10.526909, -22.242655, 8.3415165, -12.004166, -22.046726, 10.088959, -12.124956, -19.902678, 9.968168, -12.124956, -22.046726, 9.968168, -12.004166, -22.046726, 10.088959, -12.004166, -19.902678, 10.088959, -12.124956, -19.902678, 9.968168, -12.124956, -22.046726, 9.968168, -12.28997, -19.902678, 9.923944, -12.28997, -22.046726, 9.923944, -12.124956, -22.046726, 9.968168, -12.124956, -19.902678, 9.968168, -12.28997, -19.902678, 9.923944, -12.28997, -22.046726, 9.923944, -12.454985, -19.902678, 9.968168, -12.454985, -22.046726, 9.968168, -12.28997, -22.046726, 9.923944, -12.28997, -19.902678, 9.923944, -12.454985, -19.902678, 9.968168, -12.454985, -22.046726, 9.968168, -12.575773, -19.902678, 10.088959, -12.575773, -22.046726, 10.088959, -12.454985, -22.046726, 9.968168, -12.454985, -19.902678, 9.968168, -12.575773, -19.902678, 10.088959, -12.575773, -22.046726, 10.088959, -12.619997, -19.902678, 10.253973, -12.619997, -22.046726, 10.253973, -12.575773, -22.046726, 10.088959, -12.575773, -19.902678, 10.088959, -12.619997, -19.902678, 10.253973, -12.619997, -22.046726, 10.253973, -12.575773, -19.902678, 10.418985, -12.575773, -22.046726, 10.418987, -12.619997, -22.046726, 10.253973, -12.619997, -19.902678, 10.253973, -12.575773, -19.902678, 10.418985, -12.575773, -22.046726, 10.418987, -12.454985, -19.902678, 10.539776, -12.454985, -22.046726, 10.539778, -12.575773, -22.046726, 10.418987, -12.575773, -19.902678, 10.418985, -12.454985, -19.902678, 10.539776, -12.454985, -22.046726, 10.539778, -12.28997, -19.902678, 10.584, -12.28997, -22.046726, 10.584002, -12.454985, -22.046726, 10.539778, -12.454985, -19.902678, 10.539776, -12.28997, -19.902678, 10.584, -12.28997, -22.046726, 10.584002, -12.124956, -19.902678, 10.539776, -12.124956, -22.046726, 10.539778, -12.28997, -22.046726, 10.584002, -12.28997, -19.902678, 10.584, -12.124956, -19.902678, 10.539776, -12.124956, -22.046726, 10.539778, -12.004166, -19.902678, 10.418985, -12.004166, -22.046726, 10.418987, -12.124956, -22.046726, 10.539778, -12.124956, -19.902678, 10.539776, -12.004166, -19.902678, 10.418985, -12.004166, -22.046726, 10.418987, -11.959942, -19.902678, 10.253973, -11.959942, -22.046726, 10.253973, -12.004166, -22.046726, 10.418987, -12.004166, -19.902678, 10.418985, -11.959942, -19.902678, 10.253973, -11.959942, -22.046726, 10.253973, -12.004166, -19.902678, 10.088959, -12.004166, -22.046726, 10.088959, -11.959942, -22.046726, 10.253973, -11.959942, -19.902678, 10.253973, -12.004166, -19.902678, 10.088959, -12.124956, -22.046726, 9.968168, -12.28997, -22.046726, 10.253973, -12.004166, -22.046726, 10.088959, -12.004166, -22.046726, 10.088959, -12.28997, -22.046726, 10.253973, -11.959942, -22.046726, 10.253973, -12.28997, -22.046726, 9.923944, -12.28997, -22.046726, 10.253973, -12.124956, -22.046726, 9.968168, -11.959942, -22.046726, 10.253973, -12.28997, -22.046726, 10.253973, -12.004166, -22.046726, 10.418987, -12.454985, -22.046726, 9.968168, -12.28997, -22.046726, 10.253973, -12.28997, -22.046726, 9.923944, -12.004166, -22.046726, 10.418987, -12.28997, -22.046726, 10.253973, -12.124956, -22.046726, 10.539778, -12.575773, -22.046726, 10.088959, -12.28997, -22.046726, 10.253973, -12.454985, -22.046726, 9.968168, -12.124956, -22.046726, 10.539778, -12.28997, -22.046726, 10.253973, -12.28997, -22.046726, 10.584002, -12.619997, -22.046726, 10.253973, -12.28997, -22.046726, 10.253973, -12.575773, -22.046726, 10.088959, -12.28997, -22.046726, 10.584002, -12.28997, -22.046726, 10.253973, -12.454985, -22.046726, 10.539778, -12.575773, -22.046726, 10.418987, -12.28997, -22.046726, 10.253973, -12.619997, -22.046726, 10.253973, -12.454985, -22.046726, 10.539778, -12.28997, -22.046726, 10.253973, -12.575773, -22.046726, 10.418987, -12.004166, -19.902678, 10.088959, -12.28997, -19.456135, 10.253971, -12.124956, -19.902678, 9.968168, -12.124956, -19.902678, 9.968168, -12.28997, -19.456135, 10.253971, -12.28997, -19.902678, 9.923944, -11.959942, -19.902678, 10.253973, -12.28997, -19.456135, 10.253971, -12.004166, -19.902678, 10.088959, -12.28997, -19.902678, 9.923944, -12.28997, -19.456135, 10.253971, -12.454985, -19.902678, 9.968168, -12.004166, -19.902678, 10.418985, -12.28997, -19.456135, 10.253971, -11.959942, -19.902678, 10.253973, -12.454985, -19.902678, 9.968168, -12.28997, -19.456135, 10.253971, -12.575773, -19.902678, 10.088959, -12.124956, -19.902678, 10.539776, -12.28997, -19.456135, 10.253971, -12.004166, -19.902678, 10.418985, -12.575773, -19.902678, 10.088959, -12.28997, -19.456135, 10.253971, -12.619997, -19.902678, 10.253973, -12.28997, -19.902678, 10.584, -12.28997, -19.456135, 10.253971, -12.124956, -19.902678, 10.539776, -12.619997, -19.902678, 10.253973, -12.28997, -19.456135, 10.253971, -12.575773, -19.902678, 10.418985, -12.454985, -19.902678, 10.539776, -12.28997, -19.456135, 10.253971, -12.28997, -19.902678, 10.584, -12.575773, -19.902678, 10.418985, -12.28997, -19.456135, 10.253971, -12.454985, -19.902678, 10.539776, -12.004166, -22.046726, 6.859756, -12.124956, -19.902678, 6.7389646, -12.124956, -22.046726, 6.7389655, -12.004166, -22.046726, 6.859756, -12.004166, -19.902678, 6.859755, -12.124956, -19.902678, 6.7389646, -12.124956, -22.046726, 6.7389655, -12.28997, -19.902678, 6.6947412, -12.28997, -22.046726, 6.6947417, -12.124956, -22.046726, 6.7389655, -12.124956, -19.902678, 6.7389646, -12.28997, -19.902678, 6.6947412, -12.28997, -22.046726, 6.6947417, -12.454985, -19.902678, 6.7389646, -12.454985, -22.046726, 6.7389655, -12.28997, -22.046726, 6.6947417, -12.28997, -19.902678, 6.6947412, -12.454985, -19.902678, 6.7389646, -12.454985, -22.046726, 6.7389655, -12.575773, -19.902678, 6.859755, -12.575773, -22.046726, 6.859756, -12.454985, -22.046726, 6.7389655, -12.454985, -19.902678, 6.7389646, -12.575773, -19.902678, 6.859755, -12.575773, -22.046726, 6.859756, -12.619997, -19.902678, 7.024769, -12.619997, -22.046726, 7.02477, -12.575773, -22.046726, 6.859756, -12.575773, -19.902678, 6.859755, -12.619997, -19.902678, 7.024769, -12.619997, -22.046726, 7.02477, -12.575773, -19.902678, 7.1897826, -12.575773, -22.046726, 7.1897836, -12.619997, -22.046726, 7.02477, -12.619997, -19.902678, 7.024769, -12.575773, -19.902678, 7.1897826, -12.575773, -22.046726, 7.1897836, -12.454985, -19.902678, 7.310573, -12.454985, -22.046726, 7.3105736, -12.575773, -22.046726, 7.1897836, -12.575773, -19.902678, 7.1897826, -12.454985, -19.902678, 7.310573, -12.454985, -22.046726, 7.3105736, -12.28997, -19.902678, 7.354797, -12.28997, -22.046726, 7.3547974, -12.454985, -22.046726, 7.3105736, -12.454985, -19.902678, 7.310573, -12.28997, -19.902678, 7.354797, -12.28997, -22.046726, 7.3547974, -12.124956, -19.902678, 7.310573, -12.124956, -22.046726, 7.3105736, -12.28997, -22.046726, 7.3547974, -12.28997, -19.902678, 7.354797, -12.124956, -19.902678, 7.310573, -12.124956, -22.046726, 7.3105736, -12.004166, -19.902678, 7.1897826, -12.004166, -22.046726, 7.1897836, -12.124956, -22.046726, 7.3105736, -12.124956, -19.902678, 7.310573, -12.004166, -19.902678, 7.1897826, -12.004166, -22.046726, 7.1897836, -11.959942, -19.902678, 7.024769, -11.959942, -22.046726, 7.02477, -12.004166, -22.046726, 7.1897836, -12.004166, -19.902678, 7.1897826, -11.959942, -19.902678, 7.024769, -11.959942, -22.046726, 7.02477, -12.004166, -19.902678, 6.859755, -12.004166, -22.046726, 6.859756, -11.959942, -22.046726, 7.02477, -11.959942, -19.902678, 7.024769, -12.004166, -19.902678, 6.859755, -12.124956, -22.046726, 6.7389655, -12.28997, -22.046726, 7.02477, -12.004166, -22.046726, 6.859756, -12.004166, -22.046726, 6.859756, -12.28997, -22.046726, 7.02477, -11.959942, -22.046726, 7.02477, -12.28997, -22.046726, 6.6947417, -12.28997, -22.046726, 7.02477, -12.124956, -22.046726, 6.7389655, -11.959942, -22.046726, 7.02477, -12.28997, -22.046726, 7.02477, -12.004166, -22.046726, 7.1897836, -12.454985, -22.046726, 6.7389655, -12.28997, -22.046726, 7.02477, -12.28997, -22.046726, 6.6947417, -12.004166, -22.046726, 7.1897836, -12.28997, -22.046726, 7.02477, -12.124956, -22.046726, 7.3105736, -12.575773, -22.046726, 6.859756, -12.28997, -22.046726, 7.02477, -12.454985, -22.046726, 6.7389655, -12.124956, -22.046726, 7.3105736, -12.28997, -22.046726, 7.02477, -12.28997, -22.046726, 7.3547974, -12.619997, -22.046726, 7.02477, -12.28997, -22.046726, 7.02477, -12.575773, -22.046726, 6.859756, -12.28997, -22.046726, 7.3547974, -12.28997, -22.046726, 7.02477, -12.454985, -22.046726, 7.3105736, -12.575773, -22.046726, 7.1897836, -12.28997, -22.046726, 7.02477, -12.619997, -22.046726, 7.02477, -12.454985, -22.046726, 7.3105736, -12.28997, -22.046726, 7.02477, -12.575773, -22.046726, 7.1897836, -12.004166, -19.902678, 6.859755, -12.28997, -19.456135, 7.024769, -12.124956, -19.902678, 6.7389646, -12.124956, -19.902678, 6.7389646, -12.28997, -19.456135, 7.024769, -12.28997, -19.902678, 6.6947412, -11.959942, -19.902678, 7.024769, -12.28997, -19.456135, 7.024769, -12.004166, -19.902678, 6.859755, -12.28997, -19.902678, 6.6947412, -12.28997, -19.456135, 7.024769, -12.454985, -19.902678, 6.7389646, -12.004166, -19.902678, 7.1897826, -12.28997, -19.456135, 7.024769, -11.959942, -19.902678, 7.024769, -12.454985, -19.902678, 6.7389646, -12.28997, -19.456135, 7.024769, -12.575773, -19.902678, 6.859755, -12.124956, -19.902678, 7.310573, -12.28997, -19.456135, 7.024769, -12.004166, -19.902678, 7.1897826, -12.575773, -19.902678, 6.859755, -12.28997, -19.456135, 7.024769, -12.619997, -19.902678, 7.024769, -12.28997, -19.902678, 7.354797, -12.28997, -19.456135, 7.024769, -12.124956, -19.902678, 7.310573, -12.619997, -19.902678, 7.024769, -12.28997, -19.456135, 7.024769, -12.575773, -19.902678, 7.1897826, -12.454985, -19.902678, 7.310573, -12.28997, -19.456135, 7.024769, -12.28997, -19.902678, 7.354797, -12.575773, -19.902678, 7.1897826, -12.28997, -19.456135, 7.024769, -12.454985, -19.902678, 7.310573, -12.917406, -22.143438, 6.933488, -12.989674, -20.442587, 6.8666687, -12.989674, -22.143438, 6.8666697, -12.917406, -22.143438, 6.933488, -12.917406, -20.442587, 6.933487, -12.989674, -20.442587, 6.8666687, -12.989674, -22.143438, 6.8666697, -13.088398, -20.442587, 6.8422055, -13.088398, -22.143438, 6.842206, -12.989674, -22.143438, 6.8666697, -12.989674, -20.442587, 6.8666687, -13.088398, -20.442587, 6.8422055, -13.088398, -22.143438, 6.842206, -13.187122, -20.442587, 6.8666687, -13.187122, -22.143438, 6.8666697, -13.088398, -22.143438, 6.842206, -13.088398, -20.442587, 6.8422055, -13.187122, -20.442587, 6.8666687, -13.187122, -22.143438, 6.8666697, -13.259388, -20.442587, 6.933487, -13.259388, -22.143438, 6.933488, -13.187122, -22.143438, 6.8666697, -13.187122, -20.442587, 6.8666687, -13.259388, -20.442587, 6.933487, -13.259388, -22.143438, 6.933488, -13.285847, -20.442587, 7.024769, -13.285847, -22.143438, 7.02477, -13.259388, -22.143438, 6.933488, -13.259388, -20.442587, 6.933487, -13.285847, -20.442587, 7.024769, -13.285847, -22.143438, 7.02477, -13.259388, -20.442587, 7.1160507, -13.259388, -22.143438, 7.116051, -13.285847, -22.143438, 7.02477, -13.285847, -20.442587, 7.024769, -13.259388, -20.442587, 7.1160507, -13.259388, -22.143438, 7.116051, -13.187122, -20.442587, 7.182869, -13.187122, -22.143438, 7.18287, -13.259388, -22.143438, 7.116051, -13.259388, -20.442587, 7.1160507, -13.187122, -20.442587, 7.182869, -13.187122, -22.143438, 7.18287, -13.088398, -20.442587, 7.2073326, -13.088398, -22.143438, 7.207333, -13.187122, -22.143438, 7.18287, -13.187122, -20.442587, 7.182869, -13.088398, -20.442587, 7.2073326, -13.088398, -22.143438, 7.207333, -12.989674, -20.442587, 7.182869, -12.989674, -22.143438, 7.18287, -13.088398, -22.143438, 7.207333, -13.088398, -20.442587, 7.2073326, -12.989674, -20.442587, 7.182869, -12.989674, -22.143438, 7.18287, -12.917406, -20.442587, 7.1160507, -12.917406, -22.143438, 7.116051, -12.989674, -22.143438, 7.18287, -12.989674, -20.442587, 7.182869, -12.917406, -20.442587, 7.1160507, -12.917406, -22.143438, 7.116051, -12.890947, -20.442587, 7.024769, -12.890947, -22.143438, 7.02477, -12.917406, -22.143438, 7.116051, -12.917406, -20.442587, 7.1160507, -12.890947, -20.442587, 7.024769, -12.890947, -22.143438, 7.02477, -12.917406, -20.442587, 6.933487, -12.917406, -22.143438, 6.933488, -12.890947, -22.143438, 7.02477, -12.890947, -20.442587, 7.024769, -12.917406, -20.442587, 6.933487, -12.989674, -22.143438, 6.8666697, -13.088398, -22.143438, 7.02477, -12.917406, -22.143438, 6.933488, -12.917406, -22.143438, 6.933488, -13.088398, -22.143438, 7.02477, -12.890947, -22.143438, 7.02477, -13.088398, -22.143438, 6.842206, -13.088398, -22.143438, 7.02477, -12.989674, -22.143438, 6.8666697, -12.890947, -22.143438, 7.02477, -13.088398, -22.143438, 7.02477, -12.917406, -22.143438, 7.116051, -13.187122, -22.143438, 6.8666697, -13.088398, -22.143438, 7.02477, -13.088398, -22.143438, 6.842206, -12.917406, -22.143438, 7.116051, -13.088398, -22.143438, 7.02477, -12.989674, -22.143438, 7.18287, -13.259388, -22.143438, 6.933488, -13.088398, -22.143438, 7.02477, -13.187122, -22.143438, 6.8666697, -12.989674, -22.143438, 7.18287, -13.088398, -22.143438, 7.02477, -13.088398, -22.143438, 7.207333, -13.285847, -22.143438, 7.02477, -13.088398, -22.143438, 7.02477, -13.259388, -22.143438, 6.933488, -13.088398, -22.143438, 7.207333, -13.088398, -22.143438, 7.02477, -13.187122, -22.143438, 7.18287, -13.259388, -22.143438, 7.116051, -13.088398, -22.143438, 7.02477, -13.285847, -22.143438, 7.02477, -13.187122, -22.143438, 7.18287, -13.088398, -22.143438, 7.02477, -13.259388, -22.143438, 7.116051, -12.917406, -20.442587, 6.933487, -13.088398, -20.08835, 7.024769, -12.989674, -20.442587, 6.8666687, -12.989674, -20.442587, 6.8666687, -13.088398, -20.08835, 7.024769, -13.088398, -20.442587, 6.8422055, -12.890947, -20.442587, 7.024769, -13.088398, -20.08835, 7.024769, -12.917406, -20.442587, 6.933487, -13.088398, -20.442587, 6.8422055, -13.088398, -20.08835, 7.024769, -13.187122, -20.442587, 6.8666687, -12.917406, -20.442587, 7.1160507, -13.088398, -20.08835, 7.024769, -12.890947, -20.442587, 7.024769, -13.187122, -20.442587, 6.8666687, -13.088398, -20.08835, 7.024769, -13.259388, -20.442587, 6.933487, -12.989674, -20.442587, 7.182869, -13.088398, -20.08835, 7.024769, -12.917406, -20.442587, 7.1160507, -13.259388, -20.442587, 6.933487, -13.088398, -20.08835, 7.024769, -13.285847, -20.442587, 7.024769, -13.088398, -20.442587, 7.2073326, -13.088398, -20.08835, 7.024769, -12.989674, -20.442587, 7.182869, -13.285847, -20.442587, 7.024769, -13.088398, -20.08835, 7.024769, -13.259388, -20.442587, 7.1160507, -13.187122, -20.442587, 7.182869, -13.088398, -20.08835, 7.024769, -13.088398, -20.442587, 7.2073326, -13.259388, -20.442587, 7.1160507, -13.088398, -20.08835, 7.024769, -13.187122, -20.442587, 7.182869, 7.7560043, -21.843687, -1.5963855, 7.8594513, -21.712654, -1.5136316, 7.8594513, -21.889545, -1.5601864, 7.7560043, -21.843687, -1.5963855, 7.7198067, -21.712654, -1.5601864, 7.8594513, -21.712654, -1.5136316, 7.7198067, -21.889545, -1.6998296, 7.7560043, -21.843687, -1.5963855, 7.8594513, -21.889545, -1.5601864, 7.7198067, -21.889545, -1.6998296, 7.7198067, -21.712654, -1.5601864, 7.7560043, -21.843687, -1.5963855, 7.7198067, -21.712654, -1.5601864, 7.8594513, -21.392513, -1.5493045, 7.8594513, -21.712654, -1.5136316, 7.8594513, -21.712654, -1.5136316, 7.8594513, -21.392513, -1.5493045, 7.9628983, -21.392513, -1.5855265, 7.7198067, -21.712654, -1.5601864, 7.7560043, -21.392513, -1.5855265, 7.8594513, -21.392513, -1.5493045, 7.8594513, -21.712654, -1.5136316, 7.9628983, -21.392513, -1.5855265, 7.999096, -21.712654, -1.5601864, 7.8594513, -21.889545, -1.5601864, 7.8594513, -21.712654, -1.5136316, 7.999096, -21.712654, -1.5601864, 7.999096, -21.712654, -1.5601864, 7.9628983, -21.392513, -1.5855265, 7.999096, -21.392513, -1.6889691, 7.673259, -21.712656, -1.6998296, 7.7560043, -21.392513, -1.5855265, 7.7198067, -21.712654, -1.5601864, 7.7198067, -21.889545, -1.6998296, 7.673259, -21.712656, -1.6998296, 7.7198067, -21.712654, -1.5601864, 7.673259, -21.712656, -1.6998296, 7.7198067, -21.392513, -1.6889691, 7.7560043, -21.392513, -1.5855265, 7.999096, -21.712654, -1.5601864, 7.999096, -21.392513, -1.6889691, 8.045644, -21.712656, -1.6998296, 8.045644, -21.712656, -1.6998296, 7.999096, -21.392513, -1.6889691, 7.9628983, -21.392513, -1.7924135, 7.8594513, -21.889545, -1.5601864, 7.999096, -21.712654, -1.5601864, 7.9628983, -21.843687, -1.5963855, 7.9628983, -21.843687, -1.5963855, 7.999096, -21.712654, -1.5601864, 8.045644, -21.712656, -1.6998296, 7.7198067, -21.889545, -1.6998296, 7.8594513, -21.889545, -1.5601864, 7.8594513, -21.948505, -1.6998296, 7.8594513, -21.948505, -1.6998296, 7.8594513, -21.889545, -1.5601864, 7.9628983, -21.843687, -1.5963855, 7.7560043, -21.843687, -1.8032722, 7.673259, -21.712656, -1.6998296, 7.7198067, -21.889545, -1.6998296, 7.7560043, -21.843687, -1.8032722, 7.7198067, -21.889545, -1.6998296, 7.8594513, -21.948505, -1.6998296, 7.7198067, -21.712656, -1.8394728, 7.7198067, -21.392513, -1.6889691, 7.673259, -21.712656, -1.6998296, 7.7560043, -21.843687, -1.8032722, 7.7198067, -21.712656, -1.8394728, 7.673259, -21.712656, -1.6998296, 7.7198067, -21.712656, -1.8394728, 7.7560043, -21.392513, -1.7924135, 7.7198067, -21.392513, -1.6889691, 7.7560043, -21.843687, -1.8032722, 7.8594513, -21.948505, -1.6998296, 7.8594513, -21.889545, -1.8394728, 7.7198067, -21.712656, -1.8394728, 7.7560043, -21.843687, -1.8032722, 7.8594513, -21.889545, -1.8394728, 7.8594513, -21.948505, -1.6998296, 7.9628983, -21.843687, -1.5963855, 7.999096, -21.889545, -1.6998296, 7.8594513, -21.889545, -1.8394728, 7.8594513, -21.948505, -1.6998296, 7.999096, -21.889545, -1.6998296, 7.9628983, -21.843687, -1.5963855, 8.045644, -21.712656, -1.6998296, 7.999096, -21.889545, -1.6998296, 7.8594513, -21.889545, -1.8394728, 7.999096, -21.889545, -1.6998296, 7.9628983, -21.843687, -1.8032722, 7.7560043, -21.392513, -1.7924135, 7.7198067, -21.712656, -1.8394728, 7.8594513, -21.712656, -1.8860278, 7.7198067, -21.712656, -1.8394728, 7.8594513, -21.889545, -1.8394728, 7.8594513, -21.712656, -1.8860278, 7.8594513, -21.712656, -1.8860278, 7.8594513, -21.889545, -1.8394728, 7.9628983, -21.843687, -1.8032722, 7.7560043, -21.392513, -1.7924135, 7.8594513, -21.712656, -1.8860278, 7.8594513, -21.392513, -1.8286123, 7.999096, -21.889545, -1.6998296, 8.045644, -21.712656, -1.6998296, 7.999096, -21.712656, -1.8394728, 7.999096, -21.889545, -1.6998296, 7.999096, -21.712656, -1.8394728, 7.9628983, -21.843687, -1.8032722, 7.8594513, -21.712656, -1.8860278, 7.9628983, -21.843687, -1.8032722, 7.999096, -21.712656, -1.8394728, 7.8594513, -21.392513, -1.8286123, 7.8594513, -21.712656, -1.8860278, 7.999096, -21.712656, -1.8394728, 8.045644, -21.712656, -1.6998296, 7.9628983, -21.392513, -1.7924135, 7.999096, -21.712656, -1.8394728, 7.8594513, -21.392513, -1.8286123, 7.999096, -21.712656, -1.8394728, 7.9628983, -21.392513, -1.7924135, 7.597028, -21.442598, -1.34617, 7.8594513, -21.312298, -1.1490684, 7.8594513, -21.49598, -1.2661133, 7.597028, -21.442598, -1.34617, 7.505172, -21.314877, -1.2550125, 7.8594513, -21.312298, -1.1490684, 7.8594513, -21.49598, -1.2661133, 7.8594513, -21.312298, -1.1490684, 8.213731, -21.314877, -1.2550125, 7.505172, -21.409956, -1.6840334, 7.505172, -21.314877, -1.2550125, 7.597028, -21.442598, -1.34617, 7.505172, -21.409956, -1.6840334, 7.597028, -21.442598, -1.34617, 7.8594513, -21.49598, -1.2661133, 7.505172, -21.409956, -1.6840334, 7.387093, -21.22724, -1.6845381, 7.505172, -21.314877, -1.2550125, 7.8594513, -21.49598, -1.2661133, 8.213731, -21.314877, -1.2550125, 8.121874, -21.442598, -1.34617, 8.121874, -21.442598, -1.34617, 8.213731, -21.314877, -1.2550125, 8.331823, -21.22724, -1.6845381, 7.505172, -21.409956, -1.6840334, 7.8594513, -21.49598, -1.2661133, 7.8594513, -21.492252, -1.6844721, 7.8594513, -21.492252, -1.6844721, 7.8594513, -21.49598, -1.2661133, 8.121874, -21.442598, -1.34617, 7.597028, -21.339413, -1.9443204, 7.387093, -21.22724, -1.6845381, 7.505172, -21.409956, -1.6840334, 7.597028, -21.339413, -1.9443204, 7.505172, -21.409956, -1.6840334, 7.8594513, -21.492252, -1.6844721, 7.597028, -21.339413, -1.9443204, 7.505172, -21.222763, -2.0274482, 7.387093, -21.22724, -1.6845381, 8.121874, -21.442598, -1.34617, 8.331823, -21.22724, -1.6845381, 8.213731, -21.409956, -1.6840334, 7.8594513, -21.492252, -1.6844721, 8.121874, -21.442598, -1.34617, 8.213731, -21.409956, -1.6840334, 8.213731, -21.409956, -1.6840334, 8.331823, -21.22724, -1.6845381, 8.213731, -21.222763, -2.0274482, 7.597028, -21.339413, -1.9443204, 7.8594513, -21.492252, -1.6844721, 7.8594513, -21.4032, -2.0336347, 7.505172, -21.222763, -2.0274482, 7.597028, -21.339413, -1.9443204, 7.8594513, -21.4032, -2.0336347, 7.8594513, -21.4032, -2.0336347, 7.8594513, -21.492252, -1.6844721, 8.213731, -21.409956, -1.6840334, 7.505172, -21.222763, -2.0274482, 7.8594513, -21.4032, -2.0336347, 7.8594513, -21.227156, -2.1436162, 8.213731, -21.409956, -1.6840334, 8.213731, -21.222763, -2.0274482, 8.121874, -21.339413, -1.9443204, 7.8594513, -21.4032, -2.0336347, 8.213731, -21.409956, -1.6840334, 8.121874, -21.339413, -1.9443204, 7.8594513, -21.227156, -2.1436162, 8.121874, -21.339413, -1.9443204, 8.213731, -21.222763, -2.0274482, 7.8594513, -21.227156, -2.1436162, 7.8594513, -21.4032, -2.0336347, 8.121874, -21.339413, -1.9443204, 7.8594513, -21.312298, -1.1490684, 8.121874, -21.111137, -1.4137647, 8.213731, -21.314877, -1.2550125, 8.213731, -21.314877, -1.2550125, 8.121874, -21.111137, -1.4137647, 8.213731, -21.024748, -1.6911418, 7.8594513, -21.312298, -1.1490684, 7.8594513, -21.038862, -1.3319969, 8.121874, -21.111137, -1.4137647, 7.8594513, -21.038862, -1.3319969, 8.213731, -21.024748, -1.6911418, 8.121874, -21.111137, -1.4137647, 8.213731, -21.314877, -1.2550125, 8.213731, -21.024748, -1.6911418, 8.331823, -21.22724, -1.6845381, 7.505172, -21.314877, -1.2550125, 7.8594513, -21.038862, -1.3319969, 7.8594513, -21.312298, -1.1490684, 7.505172, -21.314877, -1.2550125, 7.597028, -21.111137, -1.4137647, 7.8594513, -21.038862, -1.3319969, 7.387093, -21.22724, -1.6845381, 7.597028, -21.111137, -1.4137647, 7.505172, -21.314877, -1.2550125, 7.8594513, -21.038862, -1.3319969, 7.8594513, -20.941704, -1.6914926, 8.213731, -21.024748, -1.6911418, 7.597028, -21.111137, -1.4137647, 7.8594513, -20.941704, -1.6914926, 7.8594513, -21.038862, -1.3319969, 8.331823, -21.22724, -1.6845381, 8.213731, -21.024748, -1.6911418, 8.121874, -21.092463, -1.9232578, 7.8594513, -20.941704, -1.6914926, 8.121874, -21.092463, -1.9232578, 8.213731, -21.024748, -1.6911418, 8.331823, -21.22724, -1.6845381, 8.121874, -21.092463, -1.9232578, 8.213731, -21.222763, -2.0274482, 7.387093, -21.22724, -1.6845381, 7.505172, -21.024748, -1.6911418, 7.597028, -21.111137, -1.4137647, 7.597028, -21.111137, -1.4137647, 7.505172, -21.024748, -1.6911418, 7.8594513, -20.941704, -1.6914926, 7.505172, -21.222763, -2.0274482, 7.505172, -21.024748, -1.6911418, 7.387093, -21.22724, -1.6845381, 7.8594513, -21.02841, -2.012529, 8.213731, -21.222763, -2.0274482, 8.121874, -21.092463, -1.9232578, 7.8594513, -20.941704, -1.6914926, 7.8594513, -21.02841, -2.012529, 8.121874, -21.092463, -1.9232578, 7.505172, -21.024748, -1.6911418, 7.8594513, -21.02841, -2.012529, 7.8594513, -20.941704, -1.6914926, 7.8594513, -21.02841, -2.012529, 7.8594513, -21.227156, -2.1436162, 8.213731, -21.222763, -2.0274482, 7.505172, -21.222763, -2.0274482, 7.597028, -21.092463, -1.9232578, 7.505172, -21.024748, -1.6911418, 7.505172, -21.024748, -1.6911418, 7.597028, -21.092463, -1.9232578, 7.8594513, -21.02841, -2.012529, 7.597028, -21.092463, -1.9232578, 7.505172, -21.222763, -2.0274482, 7.8594513, -21.227156, -2.1436162, 7.597028, -21.092463, -1.9232578, 7.8594513, -21.227156, -2.1436162, 7.8594513, -21.02841, -2.012529, 7.7984443, -21.95358, -2.1591706, 7.8594513, -21.864279, -2.1397543, 7.8594513, -21.971691, -2.1298366, 7.7984443, -21.95358, -2.1591706, 7.7770944, -21.873667, -2.165554, 7.8594513, -21.864279, -2.1397543, 7.7770944, -21.999872, -2.2072396, 7.7984443, -21.95358, -2.1591706, 7.8594513, -21.971691, -2.1298366, 7.7770944, -21.999872, -2.2072396, 7.7770944, -21.873667, -2.165554, 7.7984443, -21.95358, -2.1591706, 7.7770944, -21.873667, -2.165554, 7.8594513, -21.694061, -2.224133, 7.8594513, -21.864279, -2.1397543, 7.8594513, -21.864279, -2.1397543, 7.8594513, -21.694061, -2.224133, 7.9204583, -21.701368, -2.2442064, 7.7770944, -21.873667, -2.165554, 7.7984443, -21.701368, -2.2442064, 7.8594513, -21.694061, -2.224133, 7.8594513, -21.864279, -2.1397543, 7.9204583, -21.701368, -2.2442064, 7.941808, -21.873667, -2.165554, 7.8594513, -21.971691, -2.1298366, 7.8594513, -21.864279, -2.1397543, 7.941808, -21.873667, -2.165554, 7.941808, -21.873667, -2.165554, 7.9204583, -21.701368, -2.2442064, 7.941808, -21.722242, -2.3015342, 7.7496324, -21.901846, -2.2429338, 7.7984443, -21.701368, -2.2442064, 7.7770944, -21.873667, -2.165554, 7.7770944, -21.999872, -2.2072396, 7.7496324, -21.901846, -2.2429338, 7.7770944, -21.873667, -2.165554, 7.7496324, -21.901846, -2.2429338, 7.7770944, -21.722242, -2.3015342, 7.7984443, -21.701368, -2.2442064, 7.941808, -21.873667, -2.165554, 7.941808, -21.722242, -2.3015342, 7.96927, -21.901846, -2.2429338, 7.96927, -21.901846, -2.2429338, 7.941808, -21.722242, -2.3015342, 7.9204583, -21.743116, -2.3588605, 7.8594513, -21.971691, -2.1298366, 7.941808, -21.873667, -2.165554, 7.9204583, -21.95358, -2.1591706, 7.9204583, -21.95358, -2.1591706, 7.941808, -21.873667, -2.165554, 7.96927, -21.901846, -2.2429338, 7.7770944, -21.999872, -2.2072396, 7.8594513, -21.971691, -2.1298366, 7.8594513, -22.032564, -2.1953483, 7.8594513, -22.032564, -2.1953483, 7.8594513, -21.971691, -2.1298366, 7.9204583, -21.95358, -2.1591706, 7.7984443, -21.995344, -2.2738247, 7.7496324, -21.901846, -2.2429338, 7.7770944, -21.999872, -2.2072396, 7.7984443, -21.995344, -2.2738247, 7.7770944, -21.999872, -2.2072396, 7.8594513, -22.032564, -2.1953483, 7.7770944, -21.930044, -2.320335, 7.7770944, -21.722242, -2.3015342, 7.7496324, -21.901846, -2.2429338, 7.7984443, -21.995344, -2.2738247, 7.7770944, -21.930044, -2.320335, 7.7496324, -21.901846, -2.2429338, 7.7770944, -21.930044, -2.320335, 7.7984443, -21.743116, -2.3588605, 7.7770944, -21.722242, -2.3015342, 7.7984443, -21.995344, -2.2738247, 7.8594513, -22.032564, -2.1953483, 7.8594513, -22.02807, -2.2846193, 7.7770944, -21.930044, -2.320335, 7.7984443, -21.995344, -2.2738247, 7.8594513, -22.02807, -2.2846193, 7.8594513, -22.032564, -2.1953483, 7.9204583, -21.95358, -2.1591706, 7.941808, -21.999872, -2.2072396, 7.8594513, -22.02807, -2.2846193, 7.8594513, -22.032564, -2.1953483, 7.941808, -21.999872, -2.2072396, 7.9204583, -21.95358, -2.1591706, 7.96927, -21.901846, -2.2429338, 7.941808, -21.999872, -2.2072396, 7.8594513, -22.02807, -2.2846193, 7.941808, -21.999872, -2.2072396, 7.9204583, -21.995344, -2.2738247, 7.7984443, -21.743116, -2.3588605, 7.7770944, -21.930044, -2.320335, 7.8594513, -21.939434, -2.3461366, 7.7770944, -21.930044, -2.320335, 7.8594513, -22.02807, -2.2846193, 7.8594513, -21.939434, -2.3461366, 7.8594513, -21.939434, -2.3461366, 7.8594513, -22.02807, -2.2846193, 7.9204583, -21.995344, -2.2738247, 7.7984443, -21.743116, -2.3588605, 7.8594513, -21.939434, -2.3461366, 7.8594513, -21.750423, -2.3789139, 7.941808, -21.999872, -2.2072396, 7.96927, -21.901846, -2.2429338, 7.941808, -21.930044, -2.320335, 7.941808, -21.999872, -2.2072396, 7.941808, -21.930044, -2.320335, 7.9204583, -21.995344, -2.2738247, 7.8594513, -21.939434, -2.3461366, 7.9204583, -21.995344, -2.2738247, 7.941808, -21.930044, -2.320335, 7.8594513, -21.750423, -2.3789139, 7.8594513, -21.939434, -2.3461366, 7.941808, -21.930044, -2.320335, 7.96927, -21.901846, -2.2429338, 7.9204583, -21.743116, -2.3588605, 7.941808, -21.930044, -2.320335, 7.8594513, -21.750423, -2.3789139, 7.941808, -21.930044, -2.320335, 7.9204583, -21.743116, -2.3588605, 7.7046704, -21.680813, -2.1014476, 7.8594513, -21.56882, -2.0185182, 7.8594513, -21.694244, -2.0463152, 7.7046704, -21.680813, -2.1014476, 7.6505113, -21.591642, -2.0767002, 7.8594513, -21.56882, -2.0185182, 7.8594513, -21.694244, -2.0463152, 7.8594513, -21.56882, -2.0185182, 8.068392, -21.591642, -2.0767002, 7.6505113, -21.730915, -2.2952814, 7.6505113, -21.591642, -2.0767002, 7.7046704, -21.680813, -2.1014476, 7.6505113, -21.730915, -2.2952814, 7.7046704, -21.680813, -2.1014476, 7.8594513, -21.694244, -2.0463152, 7.6505113, -21.730915, -2.2952814, 7.5808535, -21.62976, -2.3324466, 7.6505113, -21.591642, -2.0767002, 7.8594513, -21.694244, -2.0463152, 8.068392, -21.591642, -2.0767002, 8.014233, -21.680813, -2.1014476, 8.014233, -21.680813, -2.1014476, 8.068392, -21.591642, -2.0767002, 8.138048, -21.62976, -2.3324466, 7.6505113, -21.730915, -2.2952814, 7.8594513, -21.694244, -2.0463152, 7.8594513, -21.776608, -2.278893, 7.8594513, -21.776608, -2.278893, 7.8594513, -21.694244, -2.0463152, 8.014233, -21.680813, -2.1014476, 7.7046704, -21.744349, -2.4537702, 7.5808535, -21.62976, -2.3324466, 7.6505113, -21.730915, -2.2952814, 7.7046704, -21.744349, -2.4537702, 7.6505113, -21.730915, -2.2952814, 7.8594513, -21.776608, -2.278893, 7.7046704, -21.744349, -2.4537702, 7.6505113, -21.696476, -2.5233836, 7.5808535, -21.62976, -2.3324466, 8.014233, -21.680813, -2.1014476, 8.138048, -21.62976, -2.3324466, 8.068392, -21.730915, -2.2952814, 7.8594513, -21.776608, -2.278893, 8.014233, -21.680813, -2.1014476, 8.068392, -21.730915, -2.2952814, 8.068392, -21.730915, -2.2952814, 8.138048, -21.62976, -2.3324466, 8.068392, -21.696476, -2.5233836, 7.7046704, -21.744349, -2.4537702, 7.8594513, -21.776608, -2.278893, 7.8594513, -21.79773, -2.490386, 7.6505113, -21.696476, -2.5233836, 7.7046704, -21.744349, -2.4537702, 7.8594513, -21.79773, -2.490386, 7.8594513, -21.79773, -2.490386, 7.8594513, -21.776608, -2.278893, 8.068392, -21.730915, -2.2952814, 7.6505113, -21.696476, -2.5233836, 7.8594513, -21.79773, -2.490386, 7.8594513, -21.722359, -2.586853, 8.068392, -21.730915, -2.2952814, 8.068392, -21.696476, -2.5233836, 8.014233, -21.744349, -2.4537702, 7.8594513, -21.79773, -2.490386, 8.068392, -21.730915, -2.2952814, 8.014233, -21.744349, -2.4537702, 7.8594513, -21.722359, -2.586853, 8.014233, -21.744349, -2.4537702, 8.068392, -21.696476, -2.5233836, 7.8594513, -21.722359, -2.586853, 7.8594513, -21.79773, -2.490386, 8.014233, -21.744349, -2.4537702, 7.8594513, -21.56882, -2.0185182, 8.014233, -21.510761, -2.2058134, 8.068392, -21.591642, -2.0767002, 8.068392, -21.591642, -2.0767002, 8.014233, -21.510761, -2.2058134, 8.068392, -21.51887, -2.3769612, 7.8594513, -21.56882, -2.0185182, 7.8594513, -21.4542, -2.1750765, 8.014233, -21.510761, -2.2058134, 7.8594513, -21.4542, -2.1750765, 8.068392, -21.51887, -2.3769612, 8.014233, -21.510761, -2.2058134, 8.068392, -21.591642, -2.0767002, 8.068392, -21.51887, -2.3769612, 8.138048, -21.62976, -2.3324466, 7.6505113, -21.591642, -2.0767002, 7.8594513, -21.4542, -2.1750765, 7.8594513, -21.56882, -2.0185182, 7.6505113, -21.591642, -2.0767002, 7.7046704, -21.510761, -2.2058134, 7.8594513, -21.4542, -2.1750765, 7.5808535, -21.62976, -2.3324466, 7.7046704, -21.510761, -2.2058134, 7.6505113, -21.591642, -2.0767002, 7.8594513, -21.4542, -2.1750765, 7.8594513, -21.47291, -2.3939195, 8.068392, -21.51887, -2.3769612, 7.7046704, -21.510761, -2.2058134, 7.8594513, -21.47291, -2.3939195, 7.8594513, -21.4542, -2.1750765, 8.138048, -21.62976, -2.3324466, 8.068392, -21.51887, -2.3769612, 8.014233, -21.603245, -2.491922, 7.8594513, -21.47291, -2.3939195, 8.014233, -21.603245, -2.491922, 8.068392, -21.51887, -2.3769612, 8.138048, -21.62976, -2.3324466, 8.014233, -21.603245, -2.491922, 8.068392, -21.696476, -2.5233836, 7.5808535, -21.62976, -2.3324466, 7.6505113, -21.51887, -2.3769612, 7.7046704, -21.510761, -2.2058134, 7.7046704, -21.510761, -2.2058134, 7.6505113, -21.51887, -2.3769612, 7.8594513, -21.47291, -2.3939195, 7.6505113, -21.696476, -2.5233836, 7.6505113, -21.51887, -2.3769612, 7.5808535, -21.62976, -2.3324466, 7.8594513, -21.585766, -2.5543175, 8.068392, -21.696476, -2.5233836, 8.014233, -21.603245, -2.491922, 7.8594513, -21.47291, -2.3939195, 7.8594513, -21.585766, -2.5543175, 8.014233, -21.603245, -2.491922, 7.6505113, -21.51887, -2.3769612, 7.8594513, -21.585766, -2.5543175, 7.8594513, -21.47291, -2.3939195, 7.8594513, -21.585766, -2.5543175, 7.8594513, -21.722359, -2.586853, 8.068392, -21.696476, -2.5233836, 7.6505113, -21.696476, -2.5233836, 7.7046704, -21.603245, -2.491922, 7.6505113, -21.51887, -2.3769612, 7.6505113, -21.51887, -2.3769612, 7.7046704, -21.603245, -2.491922, 7.8594513, -21.585766, -2.5543175, 7.7046704, -21.603245, -2.491922, 7.6505113, -21.696476, -2.5233836, 7.8594513, -21.722359, -2.586853, 7.7046704, -21.603245, -2.491922, 7.8594513, -21.722359, -2.586853, 7.8594513, -21.585766, -2.5543175, -3.1935778, 3.8995895, -1.8595574, -2.9311557, 3.6870894, -1.6457057, -2.9311557, 3.8599355, -1.9618971, -3.1935778, 3.8995895, -1.8595574, -3.2854238, 3.7667134, -1.6248863, -2.9311557, 3.6870894, -1.6457057, -2.9311557, 3.8599355, -1.9618971, -2.9311557, 3.6870894, -1.6457057, -2.5768762, 3.7667134, -1.6248863, -2.9311557, 3.8599355, -1.9618971, -2.5768762, 3.7667134, -1.6248863, -2.6687322, 3.8995895, -1.8595574, -2.9311557, 3.6870894, -1.6457057, -2.6687322, 3.6513314, -1.305656, -2.5768762, 3.7667134, -1.6248863, -2.9311557, 3.6870894, -1.6457057, -2.9311557, 3.579767, -1.2413225, -2.6687322, 3.6513314, -1.305656, -3.2854238, 3.7667134, -1.6248863, -2.9311557, 3.579767, -1.2413225, -2.9311557, 3.6870894, -1.6457057, -3.2854238, 3.7667134, -1.6248863, -3.1935778, 3.6513314, -1.305656, -2.9311557, 3.579767, -1.2413225, -3.0859365, 3.6335888, -2.4534812, -2.9311557, 3.5589857, -2.2920804, -2.9311557, 3.5909512, -2.5021868, -3.0859365, 3.6335888, -2.4534812, -3.1401029, 3.6073158, -2.2966237, -2.9311557, 3.5589857, -2.2920804, -2.9311557, 3.5909512, -2.5021868, -2.9311557, 3.5589857, -2.2920804, -2.722207, 3.6073158, -2.2966237, -2.9311557, 3.5909512, -2.5021868, -2.722207, 3.6073158, -2.2966237, -2.7763748, 3.6335888, -2.4534812, -2.9311557, 3.5589857, -2.2920804, -2.7763748, 3.6077993, -2.096417, -2.722207, 3.6073158, -2.2966237, -2.9311557, 3.5589857, -2.2920804, -2.9311557, 3.5811186, -2.046321, -2.7763748, 3.6077993, -2.096417, -3.1401029, 3.6073158, -2.2966237, -2.9311557, 3.5811186, -2.046321, -2.9311557, 3.5589857, -2.2920804, -3.1401029, 3.6073158, -2.2966237, -3.0859365, 3.6077993, -2.096417, -2.9311557, 3.5811186, -2.046321, -3.1935806, 3.6513338, -1.3056598, -2.931157, 3.7287045, -1.0824075, -2.931157, 3.5797653, -1.2413273, -2.931157, 3.5797653, -1.2413273, -2.931157, 3.7287045, -1.0824075, -2.5768776, 3.7524617, -1.1856833, -3.1935806, 3.6513338, -1.3056598, -3.2854366, 3.7524617, -1.1856833, -2.931157, 3.7287045, -1.0824075, -2.931157, 3.5797653, -1.2413273, -2.5768776, 3.7524617, -1.1856833, -2.668735, 3.6513338, -1.3056598, -3.2854366, 3.766717, -1.6248941, -3.2854366, 3.7524617, -1.1856833, -3.1935806, 3.6513338, -1.3056598, -2.668735, 3.6513338, -1.3056598, -2.5768776, 3.7524617, -1.1856833, -2.4587846, 3.9438598, -1.5800798, -3.2854366, 3.766717, -1.6248941, -3.4035153, 3.9438598, -1.5800798, -3.2854366, 3.7524617, -1.1856833, -2.668735, 3.6513338, -1.3056598, -2.4587846, 3.9438598, -1.5800798, -2.5768776, 3.766717, -1.6248941, -3.1935806, 3.8995967, -1.8595555, -3.4035153, 3.9438598, -1.5800798, -3.2854366, 3.766717, -1.6248941, -2.5768776, 3.766717, -1.6248941, -2.4587846, 3.9438598, -1.5800798, -2.5768776, 4.0332108, -1.9111595, -3.1935806, 3.8995967, -1.8595555, -3.2854366, 4.0332108, -1.9111595, -3.4035153, 3.9438598, -1.5800798, -2.5768776, 3.766717, -1.6248941, -2.5768776, 4.0332108, -1.9111595, -2.668735, 3.8995967, -1.8595555, -3.2854366, 4.0332108, -1.9111595, -3.1935806, 3.8995967, -1.8595555, -2.931157, 3.8599317, -1.9618936, -2.931157, 4.0577416, -2.0247965, -2.668735, 3.8995967, -1.8595555, -2.5768776, 4.0332108, -1.9111595, -3.2854366, 4.0332108, -1.9111595, -2.931157, 3.8599317, -1.9618936, -2.931157, 4.0577416, -2.0247965, -2.931157, 4.0577416, -2.0247965, -2.931157, 3.8599317, -1.9618936, -2.668735, 3.8995967, -1.8595555, -2.931157, 3.7287045, -1.0824075, -2.668735, 3.9892077, -1.288969, -2.5768776, 3.7524617, -1.1856833, -2.5768776, 3.7524617, -1.1856833, -2.668735, 3.9892077, -1.288969, -2.5768776, 4.141674, -1.5362737, -2.931157, 3.7287045, -1.0824075, -2.931157, 4.0389485, -1.191823, -2.668735, 3.9892077, -1.288969, -2.931157, 4.0389485, -1.191823, -2.5768776, 4.141674, -1.5362737, -2.668735, 3.9892077, -1.288969, -2.5768776, 3.7524617, -1.1856833, -2.5768776, 4.141674, -1.5362737, -2.4587846, 3.9438598, -1.5800798, -3.2854366, 3.7524617, -1.1856833, -2.931157, 4.0389485, -1.191823, -2.931157, 3.7287045, -1.0824075, -3.2854366, 3.7524617, -1.1856833, -3.1935806, 3.9892077, -1.288969, -2.931157, 4.0389485, -1.191823, -3.4035153, 3.9438598, -1.5800798, -3.1935806, 3.9892077, -1.288969, -3.2854366, 3.7524617, -1.1856833, -2.931157, 4.0389485, -1.191823, -2.931157, 4.2222066, -1.5160246, -2.5768776, 4.141674, -1.5362737, -3.1935806, 3.9892077, -1.288969, -2.931157, 4.2222066, -1.5160246, -2.931157, 4.0389485, -1.191823, -2.4587846, 3.9438598, -1.5800798, -2.5768776, 4.141674, -1.5362737, -2.668735, 4.1336055, -1.777915, -2.931157, 4.2222066, -1.5160246, -2.668735, 4.1336055, -1.777915, -2.5768776, 4.141674, -1.5362737, -2.4587846, 3.9438598, -1.5800798, -2.668735, 4.1336055, -1.777915, -2.5768776, 4.0332108, -1.9111595, -3.4035153, 3.9438598, -1.5800798, -3.2854366, 4.141674, -1.5362737, -3.1935806, 3.9892077, -1.288969, -3.1935806, 3.9892077, -1.288969, -3.2854366, 4.141674, -1.5362737, -2.931157, 4.2222066, -1.5160246, -3.2854366, 4.0332108, -1.9111595, -3.2854366, 4.141674, -1.5362737, -3.4035153, 3.9438598, -1.5800798, -2.931157, 4.2177896, -1.8485272, -2.5768776, 4.0332108, -1.9111595, -2.668735, 4.1336055, -1.777915, -2.931157, 4.2222066, -1.5160246, -2.931157, 4.2177896, -1.8485272, -2.668735, 4.1336055, -1.777915, -3.2854366, 4.141674, -1.5362737, -2.931157, 4.2177896, -1.8485272, -2.931157, 4.2222066, -1.5160246, -2.931157, 4.2177896, -1.8485272, -2.931157, 4.0577416, -2.0247965, -2.5768776, 4.0332108, -1.9111595, -3.2854366, 4.0332108, -1.9111595, -3.1935806, 4.1336055, -1.777915, -3.2854366, 4.141674, -1.5362737, -3.2854366, 4.141674, -1.5362737, -3.1935806, 4.1336055, -1.777915, -2.931157, 4.2177896, -1.8485272, -3.1935806, 4.1336055, -1.777915, -3.2854366, 4.0332108, -1.9111595, -2.931157, 4.0577416, -2.0247965, -3.1935806, 4.1336055, -1.777915, -2.931157, 4.0577416, -2.0247965, -2.931157, 4.2177896, -1.8485272, -3.034594, 3.324797, -1.6474974, -2.9311528, 3.431215, -1.5348387, -2.9311528, 3.2713995, -1.6237905, -3.034594, 3.324797, -1.6474974, -3.0708017, 3.4427564, -1.5799403, -2.9311528, 3.431215, -1.5348387, -3.0708017, 3.3060207, -1.7590828, -3.034594, 3.324797, -1.6474974, -2.9311528, 3.2713995, -1.6237905, -3.0708017, 3.3060207, -1.7590828, -3.0708017, 3.4427564, -1.5799403, -3.034594, 3.324797, -1.6474974, -3.0708017, 3.4427564, -1.5799403, -2.9311528, 3.7502108, -1.490046, -2.9311528, 3.431215, -1.5348387, -2.9311528, 3.431215, -1.5348387, -2.9311528, 3.7502108, -1.490046, -2.8277116, 3.759186, -1.5251193, -3.0708017, 3.4427564, -1.5799403, -3.034594, 3.759186, -1.5251193, -2.9311528, 3.7502108, -1.490046, -2.9311528, 3.431215, -1.5348387, -2.8277116, 3.759186, -1.5251193, -2.791504, 3.4427564, -1.5799403, -2.9311528, 3.2713995, -1.6237905, -2.9311528, 3.431215, -1.5348387, -2.791504, 3.4427564, -1.5799403, -2.791504, 3.4427564, -1.5799403, -2.8277116, 3.759186, -1.5251193, -2.791504, 3.784829, -1.6253259, -3.1173468, 3.477378, -1.7152324, -3.034594, 3.759186, -1.5251193, -3.0708017, 3.4427564, -1.5799403, -3.0708017, 3.3060207, -1.7590828, -3.1173468, 3.477378, -1.7152324, -3.0708017, 3.4427564, -1.5799403, -3.1173468, 3.477378, -1.7152324, -3.0708017, 3.784829, -1.6253259, -3.034594, 3.759186, -1.5251193, -2.791504, 3.4427564, -1.5799403, -2.791504, 3.784829, -1.6253259, -2.7449532, 3.477378, -1.7152324, -2.7449532, 3.477378, -1.7152324, -2.791504, 3.784829, -1.6253259, -2.8277116, 3.8104749, -1.7255449, -2.9311528, 3.2713995, -1.6237905, -2.791504, 3.4427564, -1.5799403, -2.8277116, 3.324797, -1.6474974, -2.8277116, 3.324797, -1.6474974, -2.791504, 3.4427564, -1.5799403, -2.7449532, 3.477378, -1.7152324, -3.0708017, 3.3060207, -1.7590828, -2.9311528, 3.2713995, -1.6237905, -2.9311528, 3.2488918, -1.7737021, -2.9311528, 3.2488918, -1.7737021, -2.9311528, 3.2713995, -1.6237905, -2.8277116, 3.324797, -1.6474974, -3.034594, 3.3760855, -1.8479218, -3.1173468, 3.477378, -1.7152324, -3.0708017, 3.3060207, -1.7590828, -3.034594, 3.3760855, -1.8479218, -3.0708017, 3.3060207, -1.7590828, -2.9311528, 3.2488918, -1.7737021, -3.0708017, 3.511996, -1.8505123, -3.0708017, 3.784829, -1.6253259, -3.1173468, 3.477378, -1.7152324, -3.034594, 3.3760855, -1.8479218, -3.0708017, 3.511996, -1.8505123, -3.1173468, 3.477378, -1.7152324, -3.0708017, 3.511996, -1.8505123, -3.034594, 3.8104749, -1.7255449, -3.0708017, 3.784829, -1.6253259, -3.034594, 3.3760855, -1.8479218, -2.9311528, 3.2488918, -1.7737021, -2.9311528, 3.3406389, -1.8943624, -3.0708017, 3.511996, -1.8505123, -3.034594, 3.3760855, -1.8479218, -2.9311528, 3.3406389, -1.8943624, -2.9311528, 3.2488918, -1.7737021, -2.8277116, 3.324797, -1.6474974, -2.791504, 3.3060207, -1.7590828, -2.9311528, 3.3406389, -1.8943624, -2.9311528, 3.2488918, -1.7737021, -2.791504, 3.3060207, -1.7590828, -2.8277116, 3.324797, -1.6474974, -2.7449532, 3.477378, -1.7152324, -2.791504, 3.3060207, -1.7590828, -2.9311528, 3.3406389, -1.8943624, -2.791504, 3.3060207, -1.7590828, -2.8277116, 3.3760855, -1.8479218, -3.034594, 3.8104749, -1.7255449, -3.0708017, 3.511996, -1.8505123, -2.9311528, 3.5235374, -1.8956139, -3.0708017, 3.511996, -1.8505123, -2.9311528, 3.3406389, -1.8943624, -2.9311528, 3.5235374, -1.8956139, -2.9311528, 3.5235374, -1.8956139, -2.9311528, 3.3406389, -1.8943624, -2.8277116, 3.3760855, -1.8479218, -3.034594, 3.8104749, -1.7255449, -2.9311528, 3.5235374, -1.8956139, -2.9311528, 3.8194501, -1.7606182, -2.791504, 3.3060207, -1.7590828, -2.7449532, 3.477378, -1.7152324, -2.791504, 3.511996, -1.8505123, -2.791504, 3.3060207, -1.7590828, -2.791504, 3.511996, -1.8505123, -2.8277116, 3.3760855, -1.8479218, -2.9311528, 3.5235374, -1.8956139, -2.8277116, 3.3760855, -1.8479218, -2.791504, 3.511996, -1.8505123, -2.9311528, 3.8194501, -1.7606182, -2.9311528, 3.5235374, -1.8956139, -2.791504, 3.511996, -1.8505123, -2.7449532, 3.477378, -1.7152324, -2.8277116, 3.8104749, -1.7255449, -2.791504, 3.511996, -1.8505123, -2.9311528, 3.8194501, -1.7606182, -2.791504, 3.511996, -1.8505123, -2.8277116, 3.8104749, -1.7255449, -2.9921641, 3.357846, -2.219953, -2.9311528, 3.439559, -2.179008, -2.9311528, 3.3330348, -2.1960335, -2.9921641, 3.357846, -2.219953, -3.0135126, 3.436851, -2.2063189, -2.9311528, 3.439559, -2.179008, -3.0135126, 3.324916, -2.2780023, -2.9921641, 3.357846, -2.219953, -2.9311528, 3.3330348, -2.1960335, -3.0135126, 3.324916, -2.2780023, -3.0135126, 3.436851, -2.2063189, -2.9921641, 3.357846, -2.219953, -3.0135126, 3.436851, -2.2063189, -2.9311528, 3.6253839, -2.2185574, -2.9311528, 3.439559, -2.179008, -2.9311528, 3.439559, -2.179008, -2.9311528, 3.6253839, -2.2185574, -2.8701415, 3.6232789, -2.239798, -3.0135126, 3.436851, -2.2063189, -2.9921641, 3.6232789, -2.239798, -2.9311528, 3.6253839, -2.2185574, -2.9311528, 3.439559, -2.179008, -2.8701415, 3.6232789, -2.239798, -2.848793, 3.436851, -2.2063189, -2.9311528, 3.3330348, -2.1960335, -2.9311528, 3.439559, -2.179008, -2.848793, 3.436851, -2.2063189, -2.848793, 3.436851, -2.2063189, -2.8701415, 3.6232789, -2.239798, -2.848793, 3.617262, -2.3005147, -3.0409703, 3.428742, -2.2882862, -2.9921641, 3.6232789, -2.239798, -3.0135126, 3.436851, -2.2063189, -3.0135126, 3.324916, -2.2780023, -3.0409703, 3.428742, -2.2882862, -3.0135126, 3.436851, -2.2063189, -3.0409703, 3.428742, -2.2882862, -3.0135126, 3.617262, -2.3005147, -2.9921641, 3.6232789, -2.239798, -2.848793, 3.436851, -2.2063189, -2.848793, 3.617262, -2.3005147, -2.8213353, 3.428742, -2.2882862, -2.8213353, 3.428742, -2.2882862, -2.848793, 3.617262, -2.3005147, -2.8701415, 3.6112561, -2.361228, -2.9311528, 3.3330348, -2.1960335, -2.848793, 3.436851, -2.2063189, -2.8701415, 3.357846, -2.219953, -2.8701415, 3.357846, -2.219953, -2.848793, 3.436851, -2.2063189, -2.8213353, 3.428742, -2.2882862, -3.0135126, 3.324916, -2.2780023, -2.9311528, 3.3330348, -2.1960335, -2.9311528, 3.2903087, -2.274579, -2.9311528, 3.2903087, -2.274579, -2.9311528, 3.3330348, -2.1960335, -2.8701415, 3.357846, -2.219953, -2.9921641, 3.345823, -2.3413825, -3.0409703, 3.428742, -2.2882862, -3.0135126, 3.324916, -2.2780023, -2.9921641, 3.345823, -2.3413825, -3.0135126, 3.324916, -2.2780023, -2.9311528, 3.2903087, -2.274579, -3.0135126, 3.4206212, -2.370242, -3.0135126, 3.617262, -2.3005147, -3.0409703, 3.428742, -2.2882862, -2.9921641, 3.345823, -2.3413825, -3.0135126, 3.4206212, -2.370242, -3.0409703, 3.428742, -2.2882862, -3.0135126, 3.4206212, -2.370242, -2.9921641, 3.6112561, -2.361228, -3.0135126, 3.617262, -2.3005147, -2.9921641, 3.345823, -2.3413825, -2.9311528, 3.2903087, -2.274579, -2.9311528, 3.3167953, -2.3599591, -3.0135126, 3.4206212, -2.370242, -2.9921641, 3.345823, -2.3413825, -2.9311528, 3.3167953, -2.3599591, -2.9311528, 3.2903087, -2.274579, -2.8701415, 3.357846, -2.219953, -2.848793, 3.324916, -2.2780023, -2.9311528, 3.3167953, -2.3599591, -2.9311528, 3.2903087, -2.274579, -2.848793, 3.324916, -2.2780023, -2.8701415, 3.357846, -2.219953, -2.8213353, 3.428742, -2.2882862, -2.848793, 3.324916, -2.2780023, -2.9311528, 3.3167953, -2.3599591, -2.848793, 3.324916, -2.2780023, -2.8701415, 3.345823, -2.3413825, -2.9921641, 3.6112561, -2.361228, -3.0135126, 3.4206212, -2.370242, -2.9311528, 3.417915, -2.3975658, -3.0135126, 3.4206212, -2.370242, -2.9311528, 3.3167953, -2.3599591, -2.9311528, 3.417915, -2.3975658, -2.9311528, 3.417915, -2.3975658, -2.9311528, 3.3167953, -2.3599591, -2.8701415, 3.345823, -2.3413825, -2.9921641, 3.6112561, -2.361228, -2.9311528, 3.417915, -2.3975658, -2.9311528, 3.609141, -2.3824706, -2.848793, 3.324916, -2.2780023, -2.8213353, 3.428742, -2.2882862, -2.848793, 3.4206212, -2.370242, -2.848793, 3.324916, -2.2780023, -2.848793, 3.4206212, -2.370242, -2.8701415, 3.345823, -2.3413825, -2.9311528, 3.417915, -2.3975658, -2.8701415, 3.345823, -2.3413825, -2.848793, 3.4206212, -2.370242, -2.9311528, 3.609141, -2.3824706, -2.9311528, 3.417915, -2.3975658, -2.848793, 3.4206212, -2.370242, -2.8213353, 3.428742, -2.2882862, -2.8701415, 3.6112561, -2.361228, -2.848793, 3.4206212, -2.370242, -2.9311528, 3.609141, -2.3824706, -2.848793, 3.4206212, -2.370242, -2.8701415, 3.6112561, -2.361228, -3.085928, 3.6077986, -2.0964143, -2.9311543, 3.695728, -1.988307, -2.9311543, 3.5811217, -2.0463157, -2.9311543, 3.5811217, -2.0463157, -2.9311543, 3.695728, -1.988307, -2.7222042, 3.6880543, -2.0503378, -3.085928, 3.6077986, -2.0964143, -3.1401043, 3.6880543, -2.0503378, -2.9311543, 3.695728, -1.988307, -2.9311543, 3.5811217, -2.0463157, -2.7222042, 3.6880543, -2.0503378, -2.7763805, 3.6077986, -2.0964143, -3.1401043, 3.6073084, -2.2966123, -3.1401043, 3.6880543, -2.0503378, -3.085928, 3.6077986, -2.0964143, -2.7763805, 3.6077986, -2.0964143, -2.7222042, 3.6880543, -2.0503378, -2.6525536, 3.7145243, -2.3075337, -3.1401043, 3.6073084, -2.2966123, -3.2097464, 3.7145243, -2.3075337, -3.1401043, 3.6880543, -2.0503378, -2.7763805, 3.6077986, -2.0964143, -2.6525536, 3.7145243, -2.3075337, -2.7222042, 3.6073084, -2.2966123, -3.085928, 3.6335886, -2.4534798, -3.2097464, 3.7145243, -2.3075337, -3.1401043, 3.6073084, -2.2966123, -2.7222042, 3.6073084, -2.2966123, -2.6525536, 3.7145243, -2.3075337, -2.7222042, 3.697219, -2.5090442, -3.085928, 3.6335886, -2.4534798, -3.1401043, 3.697219, -2.5090442, -3.2097464, 3.7145243, -2.3075337, -2.7222042, 3.6073084, -2.2966123, -2.7222042, 3.697219, -2.5090442, -2.7763805, 3.6335886, -2.4534798, -3.1401043, 3.697219, -2.5090442, -3.085928, 3.6335886, -2.4534798, -2.9311543, 3.5909529, -2.5021935, -2.9311543, 3.687878, -2.5769706, -2.7763805, 3.6335886, -2.4534798, -2.7222042, 3.697219, -2.5090442, -3.1401043, 3.697219, -2.5090442, -2.9311543, 3.5909529, -2.5021935, -2.9311543, 3.687878, -2.5769706, -2.9311543, 3.687878, -2.5769706, -2.9311543, 3.5909529, -2.5021935, -2.7763805, 3.6335886, -2.4534798, -2.9311543, 3.695728, -1.988307, -2.7763805, 3.7984102, -2.1553535, -2.7222042, 3.6880543, -2.0503378, -2.7222042, 3.6880543, -2.0503378, -2.7763805, 3.7984102, -2.1553535, -2.7222042, 3.8329906, -2.3231764, -2.9311543, 3.695728, -1.988307, -2.9311543, 3.845578, -2.1115575, -2.7763805, 3.7984102, -2.1553535, -2.9311543, 3.845578, -2.1115575, -2.7222042, 3.8329906, -2.3231764, -2.7763805, 3.7984102, -2.1553535, -2.7222042, 3.6880543, -2.0503378, -2.7222042, 3.8329906, -2.3231764, -2.6525536, 3.7145243, -2.3075337, -3.1401043, 3.6880543, -2.0503378, -2.9311543, 3.845578, -2.1115575, -2.9311543, 3.695728, -1.988307, -3.1401043, 3.6880543, -2.0503378, -3.085928, 3.7984102, -2.1553535, -2.9311543, 3.845578, -2.1115575, -3.2097464, 3.7145243, -2.3075337, -3.085928, 3.7984102, -2.1553535, -3.1401043, 3.6880543, -2.0503378, -2.9311543, 3.845578, -2.1115575, -2.9311543, 3.8817086, -2.3282094, -2.7222042, 3.8329906, -2.3231764, -3.085928, 3.7984102, -2.1553535, -2.9311543, 3.8817086, -2.3282094, -2.9311543, 3.845578, -2.1115575, -2.6525536, 3.7145243, -2.3075337, -2.7222042, 3.8329906, -2.3231764, -2.7763805, 3.7797475, -2.4554658, -2.9311543, 3.8817086, -2.3282094, -2.7763805, 3.7797475, -2.4554658, -2.7222042, 3.8329906, -2.3231764, -2.6525536, 3.7145243, -2.3075337, -2.7763805, 3.7797475, -2.4554658, -2.7222042, 3.697219, -2.5090442, -3.2097464, 3.7145243, -2.3075337, -3.1401043, 3.8329906, -2.3231764, -3.085928, 3.7984102, -2.1553535, -3.085928, 3.7984102, -2.1553535, -3.1401043, 3.8329906, -2.3231764, -2.9311543, 3.8817086, -2.3282094, -3.1401043, 3.697219, -2.5090442, -3.1401043, 3.8329906, -2.3231764, -3.2097464, 3.7145243, -2.3075337, -2.9311543, 3.812152, -2.5115814, -2.7222042, 3.697219, -2.5090442, -2.7763805, 3.7797475, -2.4554658, -2.9311543, 3.8817086, -2.3282094, -2.9311543, 3.812152, -2.5115814, -2.7763805, 3.7797475, -2.4554658, -3.1401043, 3.8329906, -2.3231764, -2.9311543, 3.812152, -2.5115814, -2.9311543, 3.8817086, -2.3282094, -2.9311543, 3.812152, -2.5115814, -2.9311543, 3.687878, -2.5769706, -2.7222042, 3.697219, -2.5090442, -3.1401043, 3.697219, -2.5090442, -3.085928, 3.7797475, -2.4554658, -3.1401043, 3.8329906, -2.3231764, -3.1401043, 3.8329906, -2.3231764, -3.085928, 3.7797475, -2.4554658, -2.9311543, 3.812152, -2.5115814, -3.085928, 3.7797475, -2.4554658, -3.1401043, 3.697219, -2.5090442, -2.9311543, 3.687878, -2.5769706, -3.085928, 3.7797475, -2.4554658, -2.9311543, 3.687878, -2.5769706, -2.9311543, 3.812152, -2.5115814, -16.306217, 3.8995876, -8.693363, -16.639778, 3.6870875, -8.751106, -16.484772, 3.8599336, -8.475517, -16.306217, 3.8995876, -8.693363, -16.341208, 3.7667115, -8.942926, -16.639778, 3.6870875, -8.751106, -16.484772, 3.8599336, -8.475517, -16.639778, 3.6870875, -8.751106, -16.958773, 3.7667115, -8.595573, -16.484772, 3.8599336, -8.475517, -16.958773, 3.7667115, -8.595573, -16.763668, 3.8995876, -8.436068, -16.639778, 3.6870875, -8.751106, -17.035208, 3.6513293, -8.918842, -16.958773, 3.7667115, -8.595573, -16.639778, 3.6870875, -8.751106, -16.83802, 3.579765, -9.103563, -17.035208, 3.6513293, -8.918842, -16.341208, 3.7667115, -8.942926, -16.83802, 3.579765, -9.103563, -16.639778, 3.6870875, -8.751106, -16.341208, 3.7667115, -8.942926, -16.577757, 3.6513293, -9.17614, -16.83802, 3.579765, -9.103563, -16.108875, 3.6335871, -8.122934, -16.322905, 3.5589838, -8.187733, -16.219904, 3.5909493, -8.004604, -16.108875, 3.6335871, -8.122934, -16.138561, 3.607314, -8.286205, -16.322905, 3.5589838, -8.187733, -16.219904, 3.5909493, -8.004604, -16.322905, 3.5589838, -8.187733, -16.502796, 3.607314, -8.081339, -16.219904, 3.5909493, -8.004604, -16.502796, 3.607314, -8.081339, -16.378687, 3.6335871, -7.9711776, -16.322905, 3.5589838, -8.187733, -16.553732, 3.6077974, -8.2823925, -16.502796, 3.607314, -8.081339, -16.322905, 3.5589838, -8.187733, -16.443384, 3.5811167, -8.401934, -16.553732, 3.6077974, -8.2823925, -16.138561, 3.607314, -8.286205, -16.443384, 3.5811167, -8.401934, -16.322905, 3.5589838, -8.187733, -16.138561, 3.607314, -8.286205, -16.28392, 3.6077974, -8.434149, -16.443384, 3.5811167, -8.401934, -16.577753, 3.651332, -9.176138, -16.915924, 3.7287025, -9.242073, -16.838017, 3.5797634, -9.1035595, -16.838017, 3.5797634, -9.1035595, -16.915924, 3.7287025, -9.242073, -17.174082, 3.7524595, -8.97838, -16.577753, 3.651332, -9.176138, -16.556507, 3.7524595, -9.325739, -16.915924, 3.7287025, -9.242073, -16.838017, 3.5797634, -9.1035595, -17.174082, 3.7524595, -8.97838, -17.035204, 3.651332, -8.91884, -16.341192, 3.766715, -8.942926, -16.556507, 3.7524595, -9.325739, -16.577753, 3.651332, -9.176138, -17.035204, 3.651332, -8.91884, -17.174082, 3.7524595, -8.97838, -17.083666, 3.943858, -8.576735, -16.341192, 3.766715, -8.942926, -16.260246, 3.943858, -9.039871, -16.556507, 3.7524595, -9.325739, -17.035204, 3.651332, -8.91884, -17.083666, 3.943858, -8.576735, -16.958767, 3.7667148, -8.595568, -16.306215, 3.8995948, -8.693367, -16.260246, 3.943858, -9.039871, -16.341192, 3.766715, -8.942926, -16.958767, 3.7667148, -8.595568, -17.083666, 3.943858, -8.576735, -16.81843, 4.033209, -8.346062, -16.306215, 3.8995948, -8.693367, -16.200855, 4.033209, -8.6934185, -16.260246, 3.943858, -9.039871, -16.958767, 3.7667148, -8.595568, -16.81843, 4.033209, -8.346062, -16.763666, 3.8995945, -8.4360695, -16.200855, 4.033209, -8.6934185, -16.306215, 3.8995948, -8.693367, -16.484772, 3.8599298, -8.475521, -16.453936, 4.0577397, -8.420694, -16.763666, 3.8995945, -8.4360695, -16.81843, 4.033209, -8.346062, -16.200855, 4.033209, -8.6934185, -16.484772, 3.8599298, -8.475521, -16.453936, 4.0577397, -8.420694, -16.453936, 4.0577397, -8.420694, -16.484772, 3.8599298, -8.475521, -16.763666, 3.8995945, -8.4360695, -16.915924, 3.7287025, -9.242073, -17.043386, 3.9892056, -8.933388, -17.174082, 3.7524595, -8.97838, -17.174082, 3.7524595, -8.97838, -17.043386, 3.9892056, -8.933388, -17.00221, 4.141672, -8.672808, -16.915924, 3.7287025, -9.242073, -16.862286, 4.038946, -9.146708, -17.043386, 3.9892056, -8.933388, -16.862286, 4.038946, -9.146708, -17.00221, 4.141672, -8.672808, -17.043386, 3.9892056, -8.933388, -17.174082, 3.7524595, -8.97838, -17.00221, 4.141672, -8.672808, -17.083666, 3.943858, -8.576735, -16.556507, 3.7524595, -9.325739, -16.862286, 4.038946, -9.146708, -16.915924, 3.7287025, -9.242073, -16.556507, 3.7524595, -9.325739, -16.585936, 3.9892056, -9.190685, -16.862286, 4.038946, -9.146708, -16.260246, 3.943858, -9.039871, -16.585936, 3.9892056, -9.190685, -16.556507, 3.7524595, -9.325739, -16.862286, 4.038946, -9.146708, -16.703352, 4.2222047, -8.864136, -17.00221, 4.141672, -8.672808, -16.585936, 3.9892056, -9.190685, -16.703352, 4.2222047, -8.864136, -16.862286, 4.038946, -9.146708, -17.083666, 3.943858, -8.576735, -17.00221, 4.141672, -8.672808, -16.803688, 4.1336036, -8.507227, -16.703352, 4.2222047, -8.864136, -16.803688, 4.1336036, -8.507227, -17.00221, 4.141672, -8.672808, -17.083666, 3.943858, -8.576735, -16.803688, 4.1336036, -8.507227, -16.81843, 4.033209, -8.346062, -16.260246, 3.943858, -9.039871, -16.384638, 4.141672, -9.020166, -16.585936, 3.9892056, -9.190685, -16.585936, 3.9892056, -9.190685, -16.384638, 4.141672, -9.020166, -16.703352, 4.2222047, -8.864136, -16.200855, 4.033209, -8.6934185, -16.384638, 4.141672, -9.020166, -16.260246, 3.943858, -9.039871, -16.540348, 4.2177877, -8.574329, -16.81843, 4.033209, -8.346062, -16.803688, 4.1336036, -8.507227, -16.703352, 4.2222047, -8.864136, -16.540348, 4.2177877, -8.574329, -16.803688, 4.1336036, -8.507227, -16.384638, 4.141672, -9.020166, -16.540348, 4.2177877, -8.574329, -16.703352, 4.2222047, -8.864136, -16.540348, 4.2177877, -8.574329, -16.453936, 4.0577397, -8.420694, -16.81843, 4.033209, -8.346062, -16.200855, 4.033209, -8.6934185, -16.346237, 4.1336036, -8.764523, -16.384638, 4.141672, -9.020166, -16.384638, 4.141672, -9.020166, -16.346237, 4.1336036, -8.764523, -16.540348, 4.2177877, -8.574329, -16.346237, 4.1336036, -8.764523, -16.200855, 4.033209, -8.6934185, -16.453936, 4.0577397, -8.420694, -16.346237, 4.1336036, -8.764523, -16.453936, 4.0577397, -8.420694, -16.540348, 4.2177877, -8.574329, -16.548744, 3.324795, -8.800255, -16.694132, 3.4312131, -8.847736, -16.650524, 3.2713976, -8.770206, -16.548744, 3.324795, -8.800255, -16.550304, 3.4427547, -8.876886, -16.694132, 3.4312131, -8.847736, -16.462482, 3.3060188, -8.720747, -16.548744, 3.324795, -8.800255, -16.650524, 3.2713976, -8.770206, -16.462482, 3.3060188, -8.720747, -16.550304, 3.4427547, -8.876886, -16.548744, 3.324795, -8.800255, -16.550304, 3.4427547, -8.876886, -16.716091, 3.7502089, -8.886778, -16.694132, 3.4312131, -8.847736, -16.694132, 3.4312131, -8.847736, -16.716091, 3.7502089, -8.886778, -16.789055, 3.7591841, -8.805498, -16.550304, 3.4427547, -8.876886, -16.608738, 3.7591841, -8.906918, -16.716091, 3.7502089, -8.886778, -16.694132, 3.4312131, -8.847736, -16.789055, 3.7591841, -8.805498, -16.793737, 3.4427545, -8.739965, -16.650524, 3.2713976, -8.770206, -16.694132, 3.4312131, -8.847736, -16.793737, 3.4427545, -8.739965, -16.793737, 3.4427545, -8.739965, -16.789055, 3.7591841, -8.805498, -16.771488, 3.784827, -8.700407, -16.44341, 3.477376, -8.781784, -16.608738, 3.7591841, -8.906918, -16.550304, 3.4427547, -8.876886, -16.462482, 3.3060188, -8.720747, -16.44341, 3.477376, -8.781784, -16.550304, 3.4427547, -8.876886, -16.44341, 3.477376, -8.781784, -16.528055, 3.784827, -8.837328, -16.608738, 3.7591841, -8.906918, -16.793737, 3.4427545, -8.739965, -16.771488, 3.784827, -8.700407, -16.767986, 3.477376, -8.599226, -16.767986, 3.477376, -8.599226, -16.771488, 3.784827, -8.700407, -16.6908, 3.810473, -8.630808, -16.650524, 3.2713976, -8.770206, -16.793737, 3.4427545, -8.739965, -16.729061, 3.324795, -8.698833, -16.729061, 3.324795, -8.698833, -16.793737, 3.4427545, -8.739965, -16.767986, 3.477376, -8.599226, -16.462482, 3.3060188, -8.720747, -16.650524, 3.2713976, -8.770206, -16.577034, 3.2488902, -8.639545, -16.577034, 3.2488902, -8.639545, -16.650524, 3.2713976, -8.770206, -16.729061, 3.324795, -8.698833, -16.450489, 3.3760836, -8.6255665, -16.44341, 3.477376, -8.781784, -16.462482, 3.3060188, -8.720747, -16.450489, 3.3760836, -8.6255665, -16.462482, 3.3060188, -8.720747, -16.577034, 3.2488902, -8.639545, -16.417662, 3.5119941, -8.641058, -16.528055, 3.784827, -8.837328, -16.44341, 3.477376, -8.781784, -16.450489, 3.3760836, -8.6255665, -16.417662, 3.5119941, -8.641058, -16.44341, 3.477376, -8.781784, -16.417662, 3.5119941, -8.641058, -16.510483, 3.810473, -8.732229, -16.528055, 3.784827, -8.837328, -16.450489, 3.3760836, -8.6255665, -16.577034, 3.2488902, -8.639545, -16.517881, 3.340637, -8.534378, -16.417662, 3.5119941, -8.641058, -16.450489, 3.3760836, -8.6255665, -16.517881, 3.340637, -8.534378, -16.577034, 3.2488902, -8.639545, -16.729061, 3.324795, -8.698833, -16.705917, 3.3060188, -8.583826, -16.517881, 3.340637, -8.534378, -16.577034, 3.2488902, -8.639545, -16.705917, 3.3060188, -8.583826, -16.729061, 3.324795, -8.698833, -16.767986, 3.477376, -8.599226, -16.705917, 3.3060188, -8.583826, -16.517881, 3.340637, -8.534378, -16.705917, 3.3060188, -8.583826, -16.630806, 3.3760836, -8.524145, -16.510483, 3.810473, -8.732229, -16.417662, 3.5119941, -8.641058, -16.517267, 3.5235355, -8.533287, -16.417662, 3.5119941, -8.641058, -16.517881, 3.340637, -8.534378, -16.517267, 3.5235355, -8.533287, -16.517267, 3.5235355, -8.533287, -16.517881, 3.340637, -8.534378, -16.630806, 3.3760836, -8.524145, -16.510483, 3.810473, -8.732229, -16.517267, 3.5235355, -8.533287, -16.583447, 3.8194482, -8.6509495, -16.705917, 3.3060188, -8.583826, -16.767986, 3.477376, -8.599226, -16.661095, 3.5119941, -8.504137, -16.705917, 3.3060188, -8.583826, -16.661095, 3.5119941, -8.504137, -16.630806, 3.3760836, -8.524145, -16.517267, 3.5235355, -8.533287, -16.630806, 3.3760836, -8.524145, -16.661095, 3.5119941, -8.504137, -16.583447, 3.8194482, -8.6509495, -16.517267, 3.5235355, -8.533287, -16.661095, 3.5119941, -8.504137, -16.767986, 3.477376, -8.599226, -16.6908, 3.810473, -8.630808, -16.661095, 3.5119941, -8.504137, -16.583447, 3.8194482, -8.6509495, -16.661095, 3.5119941, -8.504137, -16.6908, 3.810473, -8.630808, -16.30509, 3.357844, -8.280506, -16.37834, 3.439557, -8.2862835, -16.369993, 3.333033, -8.271444, -16.30509, 3.357844, -8.280506, -16.293167, 3.436849, -8.302855, -16.37834, 3.439557, -8.2862835, -16.258024, 3.324914, -8.240377, -16.30509, 3.357844, -8.280506, -16.369993, 3.333033, -8.271444, -16.258024, 3.324914, -8.240377, -16.293167, 3.436849, -8.302855, -16.30509, 3.357844, -8.280506, -16.293167, 3.436849, -8.302855, -16.358952, 3.625382, -8.251812, -16.37834, 3.439557, -8.2862835, -16.37834, 3.439557, -8.2862835, -16.358952, 3.625382, -8.251812, -16.401714, 3.6232772, -8.20339, -16.293167, 3.436849, -8.302855, -16.29536, 3.6232772, -8.263208, -16.358952, 3.625382, -8.251812, -16.37834, 3.439557, -8.2862835, -16.401714, 3.6232772, -8.20339, -16.436735, 3.436849, -8.222103, -16.369993, 3.333033, -8.271444, -16.37834, 3.439557, -8.2862835, -16.436735, 3.436849, -8.222103, -16.436735, 3.436849, -8.222103, -16.401714, 3.6232772, -8.20339, -16.390556, 3.61726, -8.140003, -16.229052, 3.4287403, -8.244873, -16.29536, 3.6232772, -8.263208, -16.293167, 3.436849, -8.302855, -16.258024, 3.324914, -8.240377, -16.229052, 3.4287403, -8.244873, -16.293167, 3.436849, -8.302855, -16.229052, 3.4287403, -8.244873, -16.246988, 3.61726, -8.220755, -16.29536, 3.6232772, -8.263208, -16.436735, 3.436849, -8.222103, -16.390556, 3.61726, -8.140003, -16.420483, 3.4287403, -8.137201, -16.420483, 3.4287403, -8.137201, -16.390556, 3.61726, -8.140003, -16.342186, 3.6112542, -8.097551, -16.369993, 3.333033, -8.271444, -16.436735, 3.436849, -8.222103, -16.411444, 3.357844, -8.220686, -16.411444, 3.357844, -8.220686, -16.436735, 3.436849, -8.222103, -16.420483, 3.4287403, -8.137201, -16.258024, 3.324914, -8.240377, -16.369993, 3.333033, -8.271444, -16.331488, 3.290307, -8.202984, -16.331488, 3.290307, -8.202984, -16.369993, 3.333033, -8.271444, -16.411444, 3.357844, -8.220686, -16.245562, 3.3458211, -8.174669, -16.229052, 3.4287403, -8.244873, -16.258024, 3.324914, -8.240377, -16.245562, 3.3458211, -8.174669, -16.258024, 3.324914, -8.240377, -16.331488, 3.290307, -8.202984, -16.212805, 3.4206195, -8.159981, -16.246988, 3.61726, -8.220755, -16.229052, 3.4287403, -8.244873, -16.245562, 3.3458211, -8.174669, -16.212805, 3.4206195, -8.159981, -16.229052, 3.4287403, -8.244873, -16.212805, 3.4206195, -8.159981, -16.235832, 3.6112542, -8.1573715, -16.246988, 3.61726, -8.220755, -16.245562, 3.3458211, -8.174669, -16.331488, 3.290307, -8.202984, -16.28963, 3.3167934, -8.128569, -16.212805, 3.4206195, -8.159981, -16.245562, 3.3458211, -8.174669, -16.28963, 3.3167934, -8.128569, -16.331488, 3.290307, -8.202984, -16.411444, 3.357844, -8.220686, -16.401594, 3.324914, -8.159626, -16.28963, 3.3167934, -8.128569, -16.331488, 3.290307, -8.202984, -16.401594, 3.324914, -8.159626, -16.411444, 3.357844, -8.220686, -16.420483, 3.4287403, -8.137201, -16.401594, 3.324914, -8.159626, -16.28963, 3.3167934, -8.128569, -16.401594, 3.324914, -8.159626, -16.351915, 3.3458211, -8.114849, -16.235832, 3.6112542, -8.1573715, -16.212805, 3.4206195, -8.159981, -16.271194, 3.4179132, -8.095791, -16.212805, 3.4206195, -8.159981, -16.28963, 3.3167934, -8.128569, -16.271194, 3.4179132, -8.095791, -16.271194, 3.4179132, -8.095791, -16.28963, 3.3167934, -8.128569, -16.351915, 3.3458211, -8.114849, -16.235832, 3.6112542, -8.1573715, -16.271194, 3.4179132, -8.095791, -16.278595, 3.6091392, -8.108948, -16.401594, 3.324914, -8.159626, -16.420483, 3.4287403, -8.137201, -16.356375, 3.4206195, -8.079229, -16.401594, 3.324914, -8.159626, -16.356375, 3.4206195, -8.079229, -16.351915, 3.3458211, -8.114849, -16.271194, 3.4179132, -8.095791, -16.351915, 3.3458211, -8.114849, -16.356375, 3.4206195, -8.079229, -16.278595, 3.6091392, -8.108948, -16.271194, 3.4179132, -8.095791, -16.356375, 3.4206195, -8.079229, -16.420483, 3.4287403, -8.137201, -16.342186, 3.6112542, -8.097551, -16.356375, 3.4206195, -8.079229, -16.278595, 3.6091392, -8.108948, -16.356375, 3.4206195, -8.079229, -16.342186, 3.6112542, -8.097551, -16.283928, 3.6077967, -8.434147, -16.471827, 3.6957262, -8.4524975, -16.443388, 3.5811198, -8.4019375, -16.443388, 3.5811198, -8.4019375, -16.471827, 3.6957262, -8.4524975, -16.623535, 3.6880524, -8.295998, -16.283928, 3.6077967, -8.434147, -16.259296, 3.6880524, -8.500866, -16.471827, 3.6957262, -8.4524975, -16.443388, 3.5811198, -8.4019375, -16.623535, 3.6880524, -8.295998, -16.553728, 3.6077967, -8.282396, -16.138565, 3.6073067, -8.286215, -16.259296, 3.6880524, -8.500866, -16.283928, 3.6077967, -8.434147, -16.553728, 3.6077967, -8.282396, -16.623535, 3.6880524, -8.295998, -16.558157, 3.7145224, -8.0376835, -16.138565, 3.6073067, -8.286215, -16.072512, 3.7145224, -8.310837, -16.259296, 3.6880524, -8.500866, -16.553728, 3.6077967, -8.282396, -16.558157, 3.7145224, -8.0376835, -16.502804, 3.6073067, -8.0813465, -16.108883, 3.6335866, -8.122932, -16.072512, 3.7145224, -8.310837, -16.138565, 3.6073067, -8.286215, -16.502804, 3.6073067, -8.0813465, -16.558157, 3.7145224, -8.0376835, -16.398663, 3.697217, -7.896193, -16.108883, 3.6335866, -8.122932, -16.034424, 3.697217, -8.101061, -16.072512, 3.7145224, -8.310837, -16.502804, 3.6073067, -8.0813465, -16.398663, 3.697217, -7.896193, -16.378683, 3.6335866, -7.9711814, -16.034424, 3.697217, -8.101061, -16.108883, 3.6335866, -8.122932, -16.219902, 3.5909512, -8.004599, -16.183245, 3.687876, -7.939423, -16.378683, 3.6335866, -7.9711814, -16.398663, 3.697217, -7.896193, -16.034424, 3.697217, -8.101061, -16.219902, 3.5909512, -8.004599, -16.183245, 3.687876, -7.939423, -16.183245, 3.687876, -7.939423, -16.219902, 3.5909512, -8.004599, -16.378683, 3.6335866, -7.9711814, -16.471827, 3.6957262, -8.4524975, -16.524834, 3.7984083, -8.231026, -16.623535, 3.6880524, -8.295998, -16.623535, 3.6880524, -8.295998, -16.524834, 3.7984083, -8.231026, -16.48978, 3.8329887, -8.058193, -16.471827, 3.6957262, -8.4524975, -16.411404, 3.845576, -8.345074, -16.524834, 3.7984083, -8.231026, -16.411404, 3.845576, -8.345074, -16.48978, 3.8329887, -8.058193, -16.524834, 3.7984083, -8.231026, -16.623535, 3.6880524, -8.295998, -16.48978, 3.8329887, -8.058193, -16.558157, 3.7145224, -8.0376835, -16.259296, 3.6880524, -8.500866, -16.411404, 3.845576, -8.345074, -16.471827, 3.6957262, -8.4524975, -16.259296, 3.6880524, -8.500866, -16.255035, 3.7984083, -8.382776, -16.411404, 3.845576, -8.345074, -16.072512, 3.7145224, -8.310837, -16.255035, 3.7984083, -8.382776, -16.259296, 3.6880524, -8.500866, -16.411404, 3.845576, -8.345074, -16.305195, 3.881707, -8.156242, -16.48978, 3.8329887, -8.058193, -16.255035, 3.7984083, -8.382776, -16.305195, 3.881707, -8.156242, -16.411404, 3.845576, -8.345074, -16.558157, 3.7145224, -8.0376835, -16.48978, 3.8329887, -8.058193, -16.377708, 3.7797456, -7.9694505, -16.305195, 3.881707, -8.156242, -16.377708, 3.7797456, -7.9694505, -16.48978, 3.8329887, -8.058193, -16.558157, 3.7145224, -8.0376835, -16.377708, 3.7797456, -7.9694505, -16.398663, 3.697217, -7.896193, -16.072512, 3.7145224, -8.310837, -16.125544, 3.8329887, -8.263062, -16.255035, 3.7984083, -8.382776, -16.255035, 3.7984083, -8.382776, -16.125544, 3.8329887, -8.263062, -16.305195, 3.881707, -8.156242, -16.034424, 3.697217, -8.101061, -16.125544, 3.8329887, -8.263062, -16.072512, 3.7145224, -8.310837, -16.2153, 3.8121502, -7.9964156, -16.398663, 3.697217, -7.896193, -16.377708, 3.7797456, -7.9694505, -16.305195, 3.881707, -8.156242, -16.2153, 3.8121502, -7.9964156, -16.377708, 3.7797456, -7.9694505, -16.125544, 3.8329887, -8.263062, -16.2153, 3.8121502, -7.9964156, -16.305195, 3.881707, -8.156242, -16.2153, 3.8121502, -7.9964156, -16.183245, 3.687876, -7.939423, -16.398663, 3.697217, -7.896193, -16.034424, 3.697217, -8.101061, -16.10791, 3.7797456, -8.121201, -16.125544, 3.8329887, -8.263062, -16.125544, 3.8329887, -8.263062, -16.10791, 3.7797456, -8.121201, -16.2153, 3.8121502, -7.9964156, -16.10791, 3.7797456, -8.121201, -16.034424, 3.697217, -8.101061, -16.183245, 3.687876, -7.939423, -16.10791, 3.7797456, -8.121201, -16.183245, 3.687876, -7.939423, -16.2153, 3.8121502, -7.9964156, -7.086538, 9.0531025, 23.60468, -7.939819, 8.776951, 23.477636, -7.89693, 8.906714, 23.382841, -7.086538, 9.0531025, 23.60468, -7.1825204, 8.414909, 24.04463, -7.939819, 8.776951, 23.477636, -6.961786, 8.872082, 22.884235, -7.2900796, 8.958991, 23.246565, -7.2749104, 8.879946, 22.997782, -6.961786, 8.872082, 22.884235, -7.086538, 9.0531025, 23.60468, -7.2900796, 8.958991, 23.246565, -3.8860898, 6.9690914, 23.62356, -4.5446486, 7.7101564, 23.798996, -4.6237864, 7.655897, 23.206228, -3.8860898, 6.9690914, 23.62356, -3.8783517, 6.953966, 23.7307, -4.5446486, 7.7101564, 23.798996, -4.5446486, 7.7101564, 23.798996, -4.823362, 7.815732, 23.123234, -4.6237864, 7.655897, 23.206228, -4.5446486, 7.7101564, 23.798996, -4.899761, 7.976705, 23.460878, -4.823362, 7.815732, 23.123234, -4.899761, 7.976705, 23.460878, -4.5446486, 7.7101564, 23.798996, -5.2783494, 8.404766, 23.83276, -4.899761, 7.976705, 23.460878, -5.2783494, 8.404766, 23.83276, -5.3587403, 8.23149, 22.899555, -4.899761, 7.976705, 23.460878, -5.3587403, 8.23149, 22.899555, -5.0027404, 7.957439, 23.048418, -5.3587403, 8.23149, 22.899555, -5.5498886, 8.408549, 23.109316, -5.46656, 8.274823, 22.889973, -5.3587403, 8.23149, 22.899555, -5.2783494, 8.404766, 23.83276, -5.5498886, 8.408549, 23.109316, -6.134132, 8.667774, 22.83608, -6.545529, 8.861699, 23.146437, -6.347387, 8.715011, 22.84835, -6.134132, 8.667774, 22.83608, -6.2255015, 8.901371, 23.757235, -6.545529, 8.861699, 23.146437, -3.9216104, 6.895205, 23.810205, -4.5446486, 7.7101564, 23.798996, -3.8783517, 6.953966, 23.7307, -4.5446486, 7.7101564, 23.798996, -3.9216104, 6.895205, 23.810205, -4.32818, 7.252925, 23.874067, -4.32818, 7.252925, 23.874067, -3.9216104, 6.895205, 23.810205, -4.2883744, 7.0421944, 23.9518, -4.5446486, 7.7101564, 23.798996, -5.1261964, 7.754751, 24.078827, -5.2783494, 8.404766, 23.83276, -4.5446486, 7.7101564, 23.798996, -4.9056582, 7.542821, 24.083008, -5.1261964, 7.754751, 24.078827, -5.6396194, 7.681168, 24.366714, -6.2255015, 8.901371, 23.757235, -5.2783494, 8.404766, 23.83276, -6.2255015, 8.901371, 23.757235, -5.6396194, 7.681168, 24.366714, -6.046368, 7.8717294, 24.331638, -6.2255015, 8.901371, 23.757235, -6.046368, 7.8717294, 24.331638, -6.119331, 8.248653, 24.137571, -6.7146773, 8.708108, 23.8794, -7.086538, 9.0531025, 23.60468, -6.2255015, 8.901371, 23.757235, -7.086538, 9.0531025, 23.60468, -6.7146773, 8.708108, 23.8794, -7.0044417, 8.349307, 24.104824, -7.086538, 9.0531025, 23.60468, -7.0044417, 8.349307, 24.104824, -7.1825204, 8.414909, 24.04463, -6.2255015, 8.901371, 23.757235, -5.5498886, 8.408549, 23.109316, -5.2783494, 8.404766, 23.83276, -5.953386, 8.703066, 23.382, -5.5498886, 8.408549, 23.109316, -6.2255015, 8.901371, 23.757235, -5.5498886, 8.408549, 23.109316, -5.953386, 8.703066, 23.382, -5.8336997, 8.425533, 22.857294, -5.5498886, 8.408549, 23.109316, -5.8336997, 8.425533, 22.857294, -5.650786, 8.361013, 22.874142, -6.2255015, 8.901371, 23.757235, -5.9328055, 8.570662, 22.853338, -5.953386, 8.703066, 23.382, -6.2255015, 8.901371, 23.757235, -6.134132, 8.667774, 22.83608, -5.9328055, 8.570662, 22.853338, -6.119331, 8.248653, 24.137571, -6.4117084, 8.071957, 24.301369, -6.2255015, 8.901371, 23.757235, -6.119331, 8.248653, 24.137571, -6.237124, 7.9882894, 24.31635, -6.4117084, 8.071957, 24.301369, -7.086538, 9.0531025, 23.60468, -6.545529, 8.861699, 23.146437, -6.2255015, 8.901371, 23.757235, -6.545529, 8.861699, 23.146437, -7.086538, 9.0531025, 23.60468, -6.961786, 8.872082, 22.884235, -6.545529, 8.861699, 23.146437, -6.961786, 8.872082, 22.884235, -6.66091, 8.812481, 22.867199, -6.7146773, 8.708108, 23.8794, -6.4117084, 8.071957, 24.301369, -6.875569, 8.223388, 24.143358, -6.7146773, 8.708108, 23.8794, -6.2255015, 8.901371, 23.757235, -6.4117084, 8.071957, 24.301369, -7.89693, 8.906714, 23.382841, -7.2900796, 8.958991, 23.246565, -7.086538, 9.0531025, 23.60468, -7.2900796, 8.958991, 23.246565, -7.89693, 8.906714, 23.382841, -7.890431, 8.871303, 23.22045, -7.2900796, 8.958991, 23.246565, -7.890431, 8.871303, 23.22045, -7.484878, 8.8925495, 23.073898, -5.1261964, 7.754751, 24.078827, -5.6396194, 7.681168, 24.366714, -5.2783494, 8.404766, 23.83276, -5.1261964, 7.754751, 24.078827, -5.328693, 7.544381, 24.286783, -5.6396194, 7.681168, 24.366714, -4.9056582, 7.542821, 24.083008, -5.1280284, 7.4066963, 24.234045, -5.1261964, 7.754751, 24.078827, -4.9056582, 7.542821, 24.083008, -5.0212817, 7.379748, 24.207062, -5.1280284, 7.4066963, 24.234045, -4.9056582, 7.542821, 24.083008, -4.5446486, 7.7101564, 23.798996, -4.804087, 7.2903175, 24.15141, -4.32818, 7.252925, 23.874067, -4.804087, 7.2903175, 24.15141, -4.5446486, 7.7101564, 23.798996, -4.32818, 7.252925, 23.874067, -4.4737935, 7.144829, 24.02375, -4.804087, 7.2903175, 24.15141, -8.469263, 8.833129, 23.903402, -7.7564616, 8.8668, 23.1668, -7.7024093, 8.948188, 23.326448, -8.469263, 8.833129, 23.903402, -8.792166, 8.398045, 23.2395, -7.7564616, 8.8668, 23.1668, -7.939649, 8.319658, 24.36807, -8.019506, 8.693222, 23.9122, -7.814714, 8.502601, 24.04807, -7.939649, 8.319658, 24.36807, -8.469263, 8.833129, 23.903402, -8.019506, 8.693222, 23.9122, -10.742025, 5.3900876, 25.65433, -10.427696, 6.4519587, 25.310745, -9.86124, 6.2139215, 25.59392, -10.742025, 5.3900876, 25.65433, -10.839937, 5.4104342, 25.586737, -10.427696, 6.4519587, 25.310745, -10.427696, 6.4519587, 25.310745, -9.6490345, 6.4258494, 25.54795, -9.86124, 6.2139215, 25.59392, -10.427696, 6.4519587, 25.310745, -9.8865795, 6.741735, 25.338587, -9.6490345, 6.4258494, 25.54795, -9.8865795, 6.741735, 25.338587, -10.427696, 6.4519587, 25.310745, -9.939594, 7.468337, 24.97506, -9.8865795, 6.741735, 25.338587, -9.939594, 7.468337, 24.97506, -9.078133, 6.986556, 25.424217, -9.8865795, 6.741735, 25.338587, -9.078133, 6.986556, 25.424217, -9.458067, 6.6153927, 25.506601, -9.078133, 6.986556, 25.424217, -9.126747, 7.324047, 25.200722, -8.992649, 7.0699244, 25.362774, -9.078133, 6.986556, 25.424217, -9.939594, 7.468337, 24.97506, -9.126747, 7.324047, 25.200722, -8.48115, 7.732603, 24.99367, -8.460228, 8.226148, 24.537516, -8.340681, 7.875271, 24.831814, -8.48115, 7.732603, 24.99367, -9.20825, 8.35639, 24.448666, -8.460228, 8.226148, 24.537516, -10.878963, 5.39891, 25.472626, -10.427696, 6.4519587, 25.310745, -10.839937, 5.4104342, 25.586737, -10.427696, 6.4519587, 25.310745, -10.878963, 5.39891, 25.472626, -10.647385, 5.933868, 25.242573, -10.647385, 5.933868, 25.242573, -10.878963, 5.39891, 25.472626, -10.741941, 5.7328005, 25.138784, -10.427696, 6.4519587, 25.310745, -10.264824, 6.8368664, 24.649649, -9.939594, 7.468337, 24.97506, -10.427696, 6.4519587, 25.310745, -10.423819, 6.5334654, 24.740517, -10.264824, 6.8368664, 24.649649, -10.154926, 7.080727, 23.99825, -9.20825, 8.35639, 24.448666, -9.939594, 7.468337, 24.97506, -9.20825, 8.35639, 24.448666, -10.154926, 7.080727, 23.99825, -9.836353, 7.4272223, 23.768997, -9.20825, 8.35639, 24.448666, -9.836353, 7.4272223, 23.768997, -9.618614, 7.784581, 23.992184, -8.975733, 8.430757, 23.866367, -8.469263, 8.833129, 23.903402, -9.20825, 8.35639, 24.448666, -8.469263, 8.833129, 23.903402, -8.975733, 8.430757, 23.866367, -8.970964, 8.277404, 23.316208, -8.469263, 8.833129, 23.903402, -8.970964, 8.277404, 23.316208, -8.792166, 8.398045, 23.2395, -9.20825, 8.35639, 24.448666, -9.126747, 7.324047, 25.200722, -9.939594, 7.468337, 24.97506, -9.079264, 7.896097, 24.814846, -9.126747, 7.324047, 25.200722, -9.20825, 8.35639, 24.448666, -9.126747, 7.324047, 25.200722, -9.079264, 7.896097, 24.814846, -8.702198, 7.3584385, 25.153973, -9.126747, 7.324047, 25.200722, -8.702198, 7.3584385, 25.153973, -8.848383, 7.227356, 25.258986, -9.20825, 8.35639, 24.448666, -8.638075, 7.5534444, 25.106686, -9.079264, 7.896097, 24.814846, -9.20825, 8.35639, 24.448666, -8.48115, 7.732603, 24.99367, -8.638075, 7.5534444, 25.106686, -9.618614, 7.784581, 23.992184, -9.555359, 7.787944, 23.5661, -9.20825, 8.35639, 24.448666, -9.618614, 7.784581, 23.992184, -9.691614, 7.632971, 23.664253, -9.555359, 7.787944, 23.5661, -8.469263, 8.833129, 23.903402, -8.460228, 8.226148, 24.537516, -9.20825, 8.35639, 24.448666, -8.460228, 8.226148, 24.537516, -8.469263, 8.833129, 23.903402, -7.939649, 8.319658, 24.36807, -8.460228, 8.226148, 24.537516, -7.939649, 8.319658, 24.36807, -8.1381, 8.120274, 24.596785, -8.975733, 8.430757, 23.866367, -9.555359, 7.787944, 23.5661, -9.08618, 8.070576, 23.364449, -8.975733, 8.430757, 23.866367, -9.20825, 8.35639, 24.448666, -9.555359, 7.787944, 23.5661, -7.7024093, 8.948188, 23.326448, -8.019506, 8.693222, 23.9122, -8.469263, 8.833129, 23.903402, -8.019506, 8.693222, 23.9122, -7.7024093, 8.948188, 23.326448, -7.56801, 8.854256, 23.41686, -8.019506, 8.693222, 23.9122, -7.56801, 8.854256, 23.41686, -7.7330556, 8.652529, 23.835022, -10.264824, 6.8368664, 24.649649, -10.154926, 7.080727, 23.99825, -9.939594, 7.468337, 24.97506, -10.264824, 6.8368664, 24.649649, -10.304508, 6.7830296, 24.250587, -10.154926, 7.080727, 23.99825, -10.423819, 6.5334654, 24.740517, -10.394926, 6.530945, 24.408104, -10.264824, 6.8368664, 24.649649, -10.423819, 6.5334654, 24.740517, -10.448719, 6.45382, 24.497004, -10.394926, 6.530945, 24.408104, -10.423819, 6.5334654, 24.740517, -10.427696, 6.4519587, 25.310745, -10.554361, 6.258996, 24.674118, -10.647385, 5.933868, 25.242573, -10.554361, 6.258996, 24.674118, -10.427696, 6.4519587, 25.310745, -10.647385, 5.933868, 25.242573, -10.675802, 5.9358487, 24.97307, -10.554361, 6.258996, 24.674118, -8.476179, 9.272415, 23.238873, -7.6357913, 8.757383, 23.254288, -7.649511, 8.880784, 23.39443, -8.476179, 9.272415, 23.238873, -8.520136, 8.706246, 22.59189, -7.6357913, 8.757383, 23.254288, -8.663195, 8.882344, 23.984976, -8.29641, 9.024534, 23.588913, -8.32843, 8.858036, 23.843124, -8.663195, 8.882344, 23.984976, -8.476179, 9.272415, 23.238873, -8.29641, 9.024534, 23.588913, -12.152782, 7.7485704, 22.986092, -11.339409, 8.419413, 22.91118, -11.277941, 8.172669, 23.538235, -12.152782, 7.7485704, 22.986092, -12.161711, 7.7648354, 22.866318, -11.339409, 8.419413, 22.91118, -11.339409, 8.419413, 22.91118, -11.045532, 8.272723, 23.64941, -11.277941, 8.172669, 23.538235, -11.339409, 8.419413, 22.91118, -10.934807, 8.523428, 23.311256, -11.045532, 8.272723, 23.64941, -10.934807, 8.523428, 23.311256, -11.339409, 8.419413, 22.91118, -10.46002, 9.004967, 22.97543, -10.934807, 8.523428, 23.311256, -10.46002, 9.004967, 22.97543, -10.420095, 8.532848, 23.947876, -10.934807, 8.523428, 23.311256, -10.420095, 8.532848, 23.947876, -10.836201, 8.361673, 23.749374, -10.420095, 8.532848, 23.947876, -10.197205, 8.742559, 23.74126, -10.297283, 8.550915, 23.961588, -10.420095, 8.532848, 23.947876, -10.46002, 9.004967, 22.97543, -10.197205, 8.742559, 23.74126, -9.557905, 8.814163, 24.051355, -9.097107, 9.033176, 23.725506, -9.326338, 8.822926, 24.033926, -9.557905, 8.814163, 24.051355, -9.396812, 9.323492, 23.09922, -9.097107, 9.033176, 23.725506, -12.129438, 7.7163987, 22.76176, -11.339409, 8.419413, 22.91118, -12.161711, 7.7648354, 22.866318, -11.339409, 8.419413, 22.91118, -12.129438, 7.7163987, 22.76176, -11.6488285, 8.007675, 22.739779, -11.6488285, 8.007675, 22.739779, -12.129438, 7.7163987, 22.76176, -11.723551, 7.814352, 22.611177, -11.339409, 8.419413, 22.91118, -10.748026, 8.414791, 22.562681, -10.46002, 9.004967, 22.97543, -11.339409, 8.419413, 22.91118, -11.012053, 8.2395935, 22.52716, -10.748026, 8.414791, 22.562681, -10.238874, 8.305614, 22.187637, -9.396812, 9.323492, 23.09922, -10.46002, 9.004967, 22.97543, -9.396812, 9.323492, 23.09922, -10.238874, 8.305614, 22.187637, -9.780174, 8.406629, 22.240479, -9.396812, 9.323492, 23.09922, -9.780174, 8.406629, 22.240479, -9.642679, 8.753303, 22.532566, -8.943731, 9.065945, 22.87788, -8.476179, 9.272415, 23.238873, -9.396812, 9.323492, 23.09922, -8.476179, 9.272415, 23.238873, -8.943731, 9.065945, 22.87788, -8.7198925, 8.690582, 22.52244, -8.476179, 9.272415, 23.238873, -8.7198925, 8.690582, 22.52244, -8.520136, 8.706246, 22.59189, -9.396812, 9.323492, 23.09922, -10.197205, 8.742559, 23.74126, -10.46002, 9.004967, 22.97543, -9.730011, 9.053403, 23.47832, -10.197205, 8.742559, 23.74126, -9.396812, 9.323492, 23.09922, -10.197205, 8.742559, 23.74126, -9.730011, 9.053403, 23.47832, -9.879805, 8.6168785, 24.008417, -10.197205, 8.742559, 23.74126, -9.879805, 8.6168785, 24.008417, -10.089674, 8.597132, 23.985575, -9.396812, 9.323492, 23.09922, -9.784039, 8.756422, 24.024965, -9.730011, 9.053403, 23.47832, -9.396812, 9.323492, 23.09922, -9.557905, 8.814163, 24.051355, -9.784039, 8.756422, 24.024965, -9.642679, 8.753303, 22.532566, -9.374041, 8.548035, 22.28962, -9.396812, 9.323492, 23.09922, -9.642679, 8.753303, 22.532566, -9.570545, 8.498457, 22.26675, -9.374041, 8.548035, 22.28962, -8.476179, 9.272415, 23.238873, -9.097107, 9.033176, 23.725506, -9.396812, 9.323492, 23.09922, -9.097107, 9.033176, 23.725506, -8.476179, 9.272415, 23.238873, -8.663195, 8.882344, 23.984976, -9.097107, 9.033176, 23.725506, -8.663195, 8.882344, 23.984976, -8.990536, 8.872201, 24.00973, -8.943731, 9.065945, 22.87788, -9.374041, 8.548035, 22.28962, -8.84972, 8.556498, 22.469631, -8.943731, 9.065945, 22.87788, -9.396812, 9.323492, 23.09922, -9.374041, 8.548035, 22.28962, -7.649511, 8.880784, 23.39443, -8.29641, 9.024534, 23.588913, -8.476179, 9.272415, 23.238873, -8.29641, 9.024534, 23.588913, -7.649511, 8.880784, 23.39443, -7.667808, 8.801199, 23.562954, -8.29641, 9.024534, 23.588913, -7.667808, 8.801199, 23.562954, -8.106319, 8.869322, 23.749159, -10.748026, 8.414791, 22.562681, -10.238874, 8.305614, 22.187637, -10.46002, 9.004967, 22.97543, -10.748026, 8.414791, 22.562681, -10.583004, 8.204302, 22.268263, -10.238874, 8.305614, 22.187637, -11.012053, 8.2395935, 22.52716, -10.796698, 8.076697, 22.316998, -10.748026, 8.414791, 22.562681, -11.012053, 8.2395935, 22.52716, -10.918375, 8.067935, 22.346127, -10.796698, 8.076697, 22.316998, -11.012053, 8.2395935, 22.52716, -11.339409, 8.419413, 22.91118, -11.160143, 8.010557, 22.403072, -11.6488285, 8.007675, 22.739779, -11.160143, 8.010557, 22.403072, -11.339409, 8.419413, 22.91118, -11.6488285, 8.007675, 22.739779, -11.5230255, 7.8992805, 22.537394, -11.160143, 8.010557, 22.403072, -8.041105, 9.099136, 22.774368, -7.6169944, 8.80678, 23.443369, -7.7392535, 8.897409, 23.481745, -8.041105, 9.099136, 22.774368, -7.5259223, 8.667595, 22.517582, -7.6169944, 8.80678, 23.443369, -8.604433, 8.708588, 23.005474, -8.175547, 8.90155, 23.08837, -8.352665, 8.7482605, 23.189362, -8.604433, 8.708588, 23.005474, -8.041105, 9.099136, 22.774368, -8.175547, 8.90155, 23.08837, -9.354351, 7.2679915, 20.05077, -9.012537, 7.976405, 20.566238, -9.399052, 7.74749, 20.912569, -9.354351, 7.2679915, 20.05077, -9.275749, 7.2862973, 19.989244, -9.012537, 7.976405, 20.566238, -9.012537, 7.976405, 20.566238, -9.383741, 7.8629084, 21.12708, -9.399052, 7.74749, 20.912569, -9.012537, 7.976405, 20.566238, -9.122709, 8.10707, 21.038918, -9.383741, 7.8629084, 21.12708, -9.122709, 8.10707, 21.038918, -9.012537, 7.976405, 20.566238, -8.725763, 8.597912, 21.202042, -9.122709, 8.10707, 21.038918, -8.725763, 8.597912, 21.202042, -9.341703, 8.161026, 21.703133, -9.122709, 8.10707, 21.038918, -9.341703, 8.161026, 21.703133, -9.369871, 7.9649425, 21.320047, -9.341703, 8.161026, 21.703133, -9.114939, 8.379078, 21.764282, -9.299545, 8.194818, 21.797089, -9.341703, 8.161026, 21.703133, -8.725763, 8.597912, 21.202042, -9.114939, 8.379078, 21.764282, -9.049728, 8.516345, 22.375086, -8.632957, 8.781511, 22.557295, -8.934408, 8.559859, 22.53762, -9.049728, 8.516345, 22.375086, -8.364826, 9.012768, 22.024788, -8.632957, 8.781511, 22.557295, -9.180586, 7.258568, 19.97211, -9.012537, 7.976405, 20.566238, -9.275749, 7.2862973, 19.989244, -9.012537, 7.976405, 20.566238, -9.180586, 7.258568, 19.97211, -8.98185, 7.591978, 20.29632, -8.98185, 7.591978, 20.29632, -9.180586, 7.258568, 19.97211, -8.903774, 7.424042, 20.197647, -9.012537, 7.976405, 20.566238, -8.491125, 8.092604, 20.86079, -8.725763, 8.597912, 21.202042, -9.012537, 7.976405, 20.566238, -8.566002, 7.9071417, 20.66232, -8.491125, 8.092604, 20.86079, -7.9790645, 8.107249, 21.086702, -8.364826, 9.012768, 22.024788, -8.725763, 8.597912, 21.202042, -8.364826, 9.012768, 22.024788, -7.9790645, 8.107249, 21.086702, -7.822355, 8.259277, 21.4402, -8.364826, 9.012768, 22.024788, -7.822355, 8.259277, 21.4402, -8.002892, 8.544012, 21.647385, -7.964889, 8.880724, 22.295406, -8.041105, 9.099136, 22.774368, -8.364826, 9.012768, 22.024788, -8.041105, 9.099136, 22.774368, -7.964889, 8.880724, 22.295406, -7.5640388, 8.629003, 22.34164, -8.041105, 9.099136, 22.774368, -7.5640388, 8.629003, 22.34164, -7.5259223, 8.667595, 22.517582, -8.364826, 9.012768, 22.024788, -9.114939, 8.379078, 21.764282, -8.725763, 8.597912, 21.202042, -8.749628, 8.718971, 21.97248, -9.114939, 8.379078, 21.764282, -8.364826, 9.012768, 22.024788, -9.114939, 8.379078, 21.764282, -8.749628, 8.718971, 21.97248, -9.156193, 8.312938, 22.116726, -9.114939, 8.379078, 21.764282, -9.156193, 8.312938, 22.116726, -9.228645, 8.264259, 21.957209, -8.364826, 9.012768, 22.024788, -9.126802, 8.436518, 22.200216, -8.749628, 8.718971, 21.97248, -8.364826, 9.012768, 22.024788, -9.049728, 8.516345, 22.375086, -9.126802, 8.436518, 22.200216, -8.002892, 8.544012, 21.647385, -7.684996, 8.432556, 21.75747, -8.364826, 9.012768, 22.024788, -8.002892, 8.544012, 21.647385, -7.7519794, 8.363534, 21.605556, -7.684996, 8.432556, 21.75747, -8.041105, 9.099136, 22.774368, -8.632957, 8.781511, 22.557295, -8.364826, 9.012768, 22.024788, -8.632957, 8.781511, 22.557295, -8.041105, 9.099136, 22.774368, -8.604433, 8.708588, 23.005474, -8.632957, 8.781511, 22.557295, -8.604433, 8.708588, 23.005474, -8.767645, 8.649889, 22.776098, -7.964889, 8.880724, 22.295406, -7.684996, 8.432556, 21.75747, -7.5840287, 8.511244, 22.2162, -7.964889, 8.880724, 22.295406, -8.364826, 9.012768, 22.024788, -7.684996, 8.432556, 21.75747, -7.7392535, 8.897409, 23.481745, -8.175547, 8.90155, 23.08837, -8.041105, 9.099136, 22.774368, -8.175547, 8.90155, 23.08837, -7.7392535, 8.897409, 23.481745, -7.856048, 8.8193245, 23.551592, -8.175547, 8.90155, 23.08837, -7.856048, 8.8193245, 23.551592, -8.1856785, 8.794295, 23.313171, -8.491125, 8.092604, 20.86079, -7.9790645, 8.107249, 21.086702, -8.725763, 8.597912, 21.202042, -8.491125, 8.092604, 20.86079, -8.181248, 7.964281, 20.873774, -7.9790645, 8.107249, 21.086702, -8.566002, 7.9071417, 20.66232, -8.305813, 7.8208942, 20.736774, -8.491125, 8.092604, 20.86079, -8.566002, 7.9071417, 20.66232, -8.377768, 7.7919035, 20.663399, -8.305813, 7.8208942, 20.736774, -8.566002, 7.9071417, 20.66232, -9.012537, 7.976405, 20.566238, -8.519827, 7.7004347, 20.51477, -8.98185, 7.591978, 20.29632, -8.519827, 7.7004347, 20.51477, -9.012537, 7.976405, 20.566238, -8.98185, 7.591978, 20.29632, -8.76738, 7.536939, 20.311623, -8.519827, 7.7004347, 20.51477, -7.2060475, 9.208552, 22.897741, -7.80905, 8.817884, 23.60042, -7.899529, 8.892069, 23.45427, -7.2060475, 9.208552, 22.897741, -6.7061973, 8.855337, 23.494766, -7.80905, 8.817884, 23.60042, -7.4934087, 8.594069, 22.34334, -7.539685, 8.893689, 22.84897, -7.65863, 8.6545105, 22.680805, -7.4934087, 8.594069, 22.34334, -7.2060475, 9.208552, 22.897741, -7.539685, 8.893689, 22.84897, -4.068832, 7.336172, 20.780975, -4.714312, 8.10803, 21.257643, -5.132072, 7.6965923, 20.921396, -4.068832, 7.336172, 20.780975, -3.9881473, 7.385569, 20.85462, -4.714312, 8.10803, 21.257643, -4.714312, 8.10803, 21.257643, -5.3909154, 7.790823, 20.987743, -5.132072, 7.6965923, 20.921396, -4.714312, 8.10803, 21.257643, -5.2879725, 8.145002, 21.248096, -5.3909154, 7.790823, 20.987743, -5.2879725, 8.145002, 21.248096, -4.714312, 8.10803, 21.257643, -5.489513, 8.767287, 21.711481, -5.2879725, 8.145002, 21.248096, -5.489513, 8.767287, 21.711481, -6.085754, 8.035226, 21.16589, -5.2879725, 8.145002, 21.248096, -6.085754, 8.035226, 21.16589, -5.623652, 7.8744917, 21.047535, -6.085754, 8.035226, 21.16589, -6.1478257, 8.328001, 21.433554, -6.1905837, 8.063794, 21.235548, -6.085754, 8.035226, 21.16589, -5.489513, 8.767287, 21.711481, -6.1478257, 8.328001, 21.433554, -6.841514, 8.391562, 21.667154, -7.0118194, 8.758585, 22.183632, -7.009152, 8.4349575, 21.841381, -6.841514, 8.391562, 21.667154, -6.416242, 9.177944, 22.323563, -7.0118194, 8.758585, 22.183632, -3.9419742, 7.374406, 20.966194, -4.714312, 8.10803, 21.257643, -3.9881473, 7.385569, 20.85462, -4.714312, 8.10803, 21.257643, -3.9419742, 7.374406, 20.966194, -4.32668, 7.7234807, 21.258965, -4.32668, 7.7234807, 21.258965, -3.9419742, 7.374406, 20.966194, -4.1686845, 7.564969, 21.337112, -4.714312, 8.10803, 21.257643, -4.9478, 8.286828, 21.951738, -5.489513, 8.767287, 21.711481, -4.714312, 8.10803, 21.257643, -4.704924, 8.094104, 21.826122, -4.9478, 8.286828, 21.951738, -5.0908885, 8.360533, 22.620289, -6.416242, 9.177944, 22.323563, -5.489513, 8.767287, 21.711481, -6.416242, 9.177944, 22.323563, -5.0908885, 8.360533, 22.620289, -5.486716, 8.50116, 22.883144, -6.416242, 9.177944, 22.323563, -5.486716, 8.50116, 22.883144, -5.8117423, 8.768128, 22.703707, -6.5980697, 9.059402, 22.89238, -7.2060475, 9.208552, 22.897741, -6.416242, 9.177944, 22.323563, -7.2060475, 9.208552, 22.897741, -6.5980697, 9.059402, 22.89238, -6.507363, 8.83523, 23.408497, -7.2060475, 9.208552, 22.897741, -6.507363, 8.83523, 23.408497, -6.7061973, 8.855337, 23.494766, -6.416242, 9.177944, 22.323563, -6.1478257, 8.328001, 21.433554, -5.489513, 8.767287, 21.711481, -6.3719687, 8.766026, 21.89067, -6.1478257, 8.328001, 21.433554, -6.416242, 9.177944, 22.323563, -6.1478257, 8.328001, 21.433554, -6.3719687, 8.766026, 21.89067, -6.5476384, 8.165707, 21.472878, -6.1478257, 8.328001, 21.433554, -6.5476384, 8.165707, 21.472878, -6.369827, 8.1280155, 21.354618, -6.416242, 9.177944, 22.323563, -6.645247, 8.314198, 21.536797, -6.3719687, 8.766026, 21.89067, -6.416242, 9.177944, 22.323563, -6.841514, 8.391562, 21.667154, -6.645247, 8.314198, 21.536797, -5.8117423, 8.768128, 22.703707, -5.8438954, 8.677977, 23.119993, -6.416242, 9.177944, 22.323563, -5.8117423, 8.768128, 22.703707, -5.6736007, 8.611357, 23.006952, -5.8438954, 8.677977, 23.119993, -7.2060475, 9.208552, 22.897741, -7.0118194, 8.758585, 22.183632, -6.416242, 9.177944, 22.323563, -7.0118194, 8.758585, 22.183632, -7.2060475, 9.208552, 22.897741, -7.4934087, 8.594069, 22.34334, -7.0118194, 8.758585, 22.183632, -7.4934087, 8.594069, 22.34334, -7.256623, 8.534951, 22.097307, -6.5980697, 9.059402, 22.89238, -5.8438954, 8.677977, 23.119993, -6.361113, 8.698025, 23.343914, -6.5980697, 9.059402, 22.89238, -6.416242, 9.177944, 22.323563, -5.8438954, 8.677977, 23.119993, -7.899529, 8.892069, 23.45427, -7.539685, 8.893689, 22.84897, -7.2060475, 9.208552, 22.897741, -7.539685, 8.893689, 22.84897, -7.899529, 8.892069, 23.45427, -7.983706, 8.764886, 23.345701, -7.539685, 8.893689, 22.84897, -7.983706, 8.764886, 23.345701, -7.7710595, 8.722573, 22.907578, -4.9478, 8.286828, 21.951738, -5.0908885, 8.360533, 22.620289, -5.489513, 8.767287, 21.711481, -4.9478, 8.286828, 21.951738, -4.867348, 8.1940365, 22.336489, -5.0908885, 8.360533, 22.620289, -4.704924, 8.094104, 21.826122, -4.7211885, 8.02508, 22.154125, -4.9478, 8.286828, 21.951738, -4.704924, 8.094104, 21.826122, -4.6452146, 7.9936295, 22.056368, -4.7211885, 8.02508, 22.154125, -4.704924, 8.094104, 21.826122, -4.714312, 8.10803, 21.257643, -4.489761, 7.8906374, 21.858315, -4.32668, 7.7234807, 21.258965, -4.489761, 7.8906374, 21.858315, -4.714312, 8.10803, 21.257643, -4.32668, 7.7234807, 21.258965, -4.284569, 7.6962314, 21.524137, -4.489761, 7.8906374, 21.858315, -7.4770913, 9.070688, 24.137522, -7.9792457, 8.86656, 23.280897, -7.798713, 8.910673, 23.258356, -7.4770913, 9.070688, 24.137522, -8.267395, 8.83601, 24.344084, -7.9792457, 8.86656, 23.280897, -6.969793, 8.361493, 23.999329, -7.3750834, 8.766386, 23.809656, -7.2131476, 8.500739, 23.731937, -6.969793, 8.361493, 23.999329, -7.4770913, 9.070688, 24.137522, -7.3750834, 8.766386, 23.809656, -6.8215938, 6.6485844, 27.584244, -6.934275, 7.533578, 26.905539, -6.54954, 7.0755653, 26.591766, -6.8215938, 6.6485844, 27.584244, -6.908404, 6.709503, 27.638208, -6.934275, 7.533578, 26.905539, -6.934275, 7.533578, 26.905539, -6.512714, 7.1929045, 26.339361, -6.54954, 7.0755653, 26.591766, -6.934275, 7.533578, 26.905539, -6.735351, 7.5916777, 26.38232, -6.512714, 7.1929045, 26.339361, -6.735351, 7.5916777, 26.38232, -6.934275, 7.533578, 26.905539, -7.004352, 8.309274, 26.101746, -6.735351, 7.5916777, 26.38232, -7.004352, 8.309274, 26.101746, -6.413199, 7.4994855, 25.660645, -6.735351, 7.5916777, 26.38232, -6.413199, 7.4994855, 25.660645, -6.4796042, 7.2974, 26.112244, -6.413199, 7.4994855, 25.660645, -6.6031613, 7.8468814, 25.541204, -6.4362464, 7.5467825, 25.541874, -6.413199, 7.4994855, 25.660645, -7.004352, 8.309274, 26.101746, -6.6031613, 7.8468814, 25.541204, -6.5875335, 7.9890084, 24.822481, -6.9586644, 8.467667, 24.52183, -6.6856866, 8.076338, 24.609621, -6.5875335, 7.9890084, 24.822481, -7.210817, 8.882824, 25.071764, -6.9586644, 8.467667, 24.52183, -7.030128, 6.721147, 27.639519, -6.934275, 7.533578, 26.905539, -6.908404, 6.709503, 27.638208, -6.934275, 7.533578, 26.905539, -7.030128, 6.721147, 27.639519, -7.122934, 7.142128, 27.21883, -7.122934, 7.142128, 27.21883, -7.030128, 6.721147, 27.639519, -7.2680945, 6.9975395, 27.31846, -6.934275, 7.533578, 26.905539, -7.48521, 7.8700495, 26.46049, -7.004352, 8.309274, 26.101746, -6.934275, 7.533578, 26.905539, -7.476253, 7.6441336, 26.707956, -7.48521, 7.8700495, 26.46049, -8.052195, 8.094164, 26.095999, -7.210817, 8.882824, 25.071764, -7.004352, 8.309274, 26.101746, -7.210817, 8.882824, 25.071764, -8.052195, 8.094164, 26.095999, -8.141077, 8.305193, 25.651417, -7.210817, 8.882824, 25.071764, -8.141077, 8.305193, 25.651417, -7.8344674, 8.5407715, 25.446497, -7.7096314, 8.899331, 24.684853, -7.4770913, 9.070688, 24.137522, -7.210817, 8.882824, 25.071764, -7.4770913, 9.070688, 24.137522, -7.7096314, 8.899331, 24.684853, -8.258791, 8.789434, 24.556768, -7.4770913, 9.070688, 24.137522, -8.258791, 8.789434, 24.556768, -8.267395, 8.83601, 24.344084, -7.210817, 8.882824, 25.071764, -6.6031613, 7.8468814, 25.541204, -7.004352, 8.309274, 26.101746, -6.8924146, 8.3843, 25.220247, -6.6031613, 7.8468814, 25.541204, -7.210817, 8.882824, 25.071764, -6.6031613, 7.8468814, 25.541204, -6.8924146, 8.3843, 25.220247, -6.5150523, 7.712496, 25.137945, -6.6031613, 7.8468814, 25.541204, -6.5150523, 7.712496, 25.137945, -6.4764667, 7.6428747, 25.340647, -7.210817, 8.882824, 25.071764, -6.543115, 7.8768907, 25.041906, -6.8924146, 8.3843, 25.220247, -7.210817, 8.882824, 25.071764, -6.5875335, 7.9890084, 24.822481, -6.543115, 7.8768907, 25.041906, -7.8344674, 8.5407715, 25.446497, -8.223946, 8.544853, 25.256237, -7.210817, 8.882824, 25.071764, -7.8344674, 8.5407715, 25.446497, -8.185364, 8.448042, 25.446867, -8.223946, 8.544853, 25.256237, -7.4770913, 9.070688, 24.137522, -6.9586644, 8.467667, 24.52183, -7.210817, 8.882824, 25.071764, -6.9586644, 8.467667, 24.52183, -7.4770913, 9.070688, 24.137522, -6.969793, 8.361493, 23.999329, -6.9586644, 8.467667, 24.52183, -6.969793, 8.361493, 23.999329, -6.8314404, 8.240372, 24.300121, -7.7096314, 8.899331, 24.684853, -8.223946, 8.544853, 25.256237, -8.244255, 8.633982, 24.69929, -7.7096314, 8.899331, 24.684853, -7.210817, 8.882824, 25.071764, -8.223946, 8.544853, 25.256237, -7.798713, 8.910673, 23.258356, -7.3750834, 8.766386, 23.809656, -7.4770913, 9.070688, 24.137522, -7.3750834, 8.766386, 23.809656, -7.798713, 8.910673, 23.258356, -7.6923747, 8.766327, 23.204716, -7.3750834, 8.766386, 23.809656, -7.6923747, 8.766327, 23.204716, -7.3779397, 8.62144, 23.55421, -7.48521, 7.8700495, 26.46049, -8.052195, 8.094164, 26.095999, -7.004352, 8.309274, 26.101746, -7.48521, 7.8700495, 26.46049, -7.886131, 7.860207, 26.385628, -8.052195, 8.094164, 26.095999, -7.476253, 7.6441336, 26.707956, -7.776336, 7.6484556, 26.566654, -7.48521, 7.8700495, 26.46049, -7.476253, 7.6441336, 26.707956, -7.720366, 7.5934772, 26.668566, -7.776336, 7.6484556, 26.566654, -7.476253, 7.6441336, 26.707956, -6.934275, 7.533578, 26.905539, -7.604976, 7.443248, 26.871801, -7.122934, 7.142128, 27.21883, -7.604976, 7.443248, 26.871801, -6.934275, 7.533578, 26.905539, -7.122934, 7.142128, 27.21883, -7.3896413, 7.171777, 27.159313, -7.604976, 7.443248, 26.871801, -6.0571437, 2.278272, 22.798777, -6.422816, 4.561778, 23.067327, -6.255482, 4.6069903, 22.866049, -6.0571437, 2.278272, 22.798777, -6.2640643, 2.2363775, 23.040073, -6.422816, 4.561778, 23.067327, -6.229696, -0.29725552, 22.954578, -6.2640643, 2.2363775, 23.040073, -6.0571437, 2.278272, 22.798777, -6.229696, -0.29725552, 22.954578, -6.4595838, -0.294353, 23.230642, -6.2640643, 2.2363775, 23.040073, -6.8122897, 2.1787193, 22.89551, -6.9267097, 4.515596, 22.675344, -6.886102, 4.499142, 22.937313, -6.8122897, 2.1787193, 22.89551, -6.8565516, 2.1943433, 22.589626, -6.9267097, 4.515596, 22.675344, -6.34096, 2.278272, 22.29763, -6.2974906, 4.6231685, 22.603962, -6.5006537, 4.606991, 22.43314, -6.34096, 2.278272, 22.29763, -6.0964046, 2.2940338, 22.49008, -6.2974906, 4.6231685, 22.603962, -6.886102, 4.499142, 22.937313, -7.330835, 6.6817102, 22.999025, -7.3017764, 6.6674695, 23.172724, -6.886102, 4.499142, 22.937313, -6.9267097, 4.515596, 22.675344, -7.330835, 6.6817102, 22.999025, -6.255482, 4.6069903, 22.866049, -6.9959083, 6.7194586, 23.261988, -6.883434, 6.7554083, 23.12764, -6.255482, 4.6069903, 22.866049, -6.422816, 4.561778, 23.067327, -6.9959083, 6.7194586, 23.261988, -6.883434, 6.7554083, 23.12764, -6.9959083, 6.7194586, 23.261988, -7.3726697, 7.8587894, 23.408417, -6.883434, 6.7554083, 23.12764, -7.3726697, 7.8587894, 23.408417, -7.2935386, 7.8998566, 23.310549, -6.2640643, 2.2363775, 23.040073, -6.6823287, 4.515596, 23.106857, -6.422816, 4.561778, 23.067327, -6.2640643, 2.2363775, 23.040073, -6.5727344, 2.1943433, 23.090773, -6.6823287, 4.515596, 23.106857, -6.422816, 4.561778, 23.067327, -6.6823287, 4.515596, 23.106857, -7.1677566, 6.6817102, 23.28698, -6.422816, 4.561778, 23.067327, -7.1677566, 6.6817102, 23.28698, -6.9959083, 6.7194586, 23.261988, -6.8565516, 2.1943433, 22.589626, -6.759332, 4.561778, 22.473125, -6.9267097, 4.515596, 22.675344, -6.8565516, 2.1943433, 22.589626, -6.6543117, 2.2363775, 22.350998, -6.759332, 4.561778, 22.473125, -6.9267097, 4.515596, 22.675344, -6.759332, 4.561778, 22.473125, -7.2210193, 6.7194586, 22.864502, -6.9267097, 4.515596, 22.675344, -7.2210193, 6.7194586, 22.864502, -7.330835, 6.6817102, 22.999025, -6.5006537, 4.606991, 22.43314, -6.9114146, 6.7684054, 22.951649, -7.0479617, 6.7554083, 22.837128, -6.5006537, 4.606991, 22.43314, -6.2974906, 4.6231685, 22.603962, -6.9114146, 6.7684054, 22.951649, -6.0964046, 2.2940338, 22.49008, -6.255482, 4.6069903, 22.866049, -6.2974906, 4.6231685, 22.603962, -6.0964046, 2.2940338, 22.49008, -6.0571437, 2.278272, 22.798777, -6.255482, 4.6069903, 22.866049, -6.2974906, 4.6231685, 22.603962, -6.883434, 6.7554083, 23.12764, -6.9114146, 6.7684054, 22.951649, -6.2974906, 4.6231685, 22.603962, -6.255482, 4.6069903, 22.866049, -6.883434, 6.7554083, 23.12764, -6.6543117, 2.2363775, 22.350998, -6.5006537, 4.606991, 22.43314, -6.759332, 4.561778, 22.473125, -6.6543117, 2.2363775, 22.350998, -6.34096, 2.278272, 22.29763, -6.5006537, 4.606991, 22.43314, -6.9183087, -0.294353, 22.420652, -6.34096, 2.278272, 22.29763, -6.6543117, 2.2363775, 22.350998, -6.9183087, -0.294353, 22.420652, -6.563316, -0.29725552, 22.365494, -6.34096, 2.278272, 22.29763, -6.759332, 4.561778, 22.473125, -7.0479617, 6.7554083, 22.837128, -7.2210193, 6.7194586, 22.864502, -6.759332, 4.561778, 22.473125, -6.5006537, 4.606991, 22.43314, -7.0479617, 6.7554083, 22.837128, -7.2210193, 6.7194586, 22.864502, -7.0479617, 6.7554083, 22.837128, -7.4157386, 7.8998566, 23.094776, -7.2210193, 6.7194586, 22.864502, -7.4157386, 7.8998566, 23.094776, -7.5403686, 7.8587894, 23.112305, -7.596041, 7.8030686, 23.339376, -7.8122087, 8.670566, 23.565685, -7.4973254, 7.8185544, 23.425323, -7.596041, 7.8030686, 23.339376, -7.884003, 8.657431, 23.502459, -7.8122087, 8.670566, 23.565685, -7.3726697, 7.8587894, 23.408417, -7.6698213, 8.747442, 23.485046, -7.2935386, 7.8998566, 23.310549, -7.3726697, 7.8587894, 23.408417, -7.724811, 8.710249, 23.555187, -7.6698213, 8.747442, 23.485046, -7.4973254, 7.8185544, 23.425323, -7.724811, 8.710249, 23.555187, -7.3726697, 7.8587894, 23.408417, -7.4973254, 7.8185544, 23.425323, -7.8122087, 8.670566, 23.565685, -7.724811, 8.710249, 23.555187, -7.3161235, 7.9149265, 23.18085, -7.7589135, 8.747442, 23.327732, -7.4157386, 7.8998566, 23.094776, -7.3161235, 7.9149265, 23.18085, -7.6881547, 8.763065, 23.391544, -7.7589135, 8.747442, 23.327732, -7.2935386, 7.8998566, 23.310549, -7.6881547, 8.763065, 23.391544, -7.3161235, 7.9149265, 23.18085, -7.2935386, 7.8998566, 23.310549, -7.6698213, 8.747442, 23.485046, -7.6881547, 8.763065, 23.391544, -7.5403686, 7.8587894, 23.112305, -7.901301, 8.670566, 23.408371, -7.61898, 7.8185544, 23.210514, -7.5403686, 7.8587894, 23.112305, -7.8473487, 8.710249, 23.338818, -7.901301, 8.670566, 23.408371, -7.4157386, 7.8998566, 23.094776, -7.8473487, 8.710249, 23.338818, -7.5403686, 7.8587894, 23.112305, -7.4157386, 7.8998566, 23.094776, -7.7589135, 8.747442, 23.327732, -7.8473487, 8.710249, 23.338818, -6.8164535, -0.2914486, 23.28688, -6.8122897, 2.1787193, 22.89551, -6.5727344, 2.1943433, 23.090773, -6.8164535, -0.2914486, 23.28688, -7.092834, -0.29034328, 23.054392, -6.8122897, 2.1787193, 22.89551, -7.61898, 7.8185544, 23.210514, -7.884003, 8.657431, 23.502459, -7.596041, 7.8030686, 23.339376, -7.61898, 7.8185544, 23.210514, -7.901301, 8.670566, 23.408371, -7.884003, 8.657431, 23.502459, -6.5727344, 2.1943433, 23.090773, -6.886102, 4.499142, 22.937313, -6.6823287, 4.515596, 23.106857, -6.5727344, 2.1943433, 23.090773, -6.8122897, 2.1787193, 22.89551, -6.886102, 4.499142, 22.937313, -7.092834, -0.29034328, 23.054392, -6.8565516, 2.1943433, 22.589626, -6.8122897, 2.1787193, 22.89551, -7.092834, -0.29034328, 23.054392, -7.1500726, -0.2914486, 22.697796, -6.8565516, 2.1943433, 22.589626, -6.563316, -0.29725552, 22.365494, -6.0964046, 2.2940338, 22.49008, -6.34096, 2.278272, 22.29763, -6.563316, -0.29725552, 22.365494, -6.288299, -0.2983632, 22.598755, -6.0964046, 2.2940338, 22.49008, -6.4595838, -0.294353, 23.230642, -6.5727344, 2.1943433, 23.090773, -6.2640643, 2.2363775, 23.040073, -6.4595838, -0.294353, 23.230642, -6.8164535, -0.2914486, 23.28688, -6.5727344, 2.1943433, 23.090773, -7.1500726, -0.2914486, 22.697796, -6.6543117, 2.2363775, 22.350998, -6.8565516, 2.1943433, 22.589626, -7.1500726, -0.2914486, 22.697796, -6.9183087, -0.294353, 22.420652, -6.6543117, 2.2363775, 22.350998, -6.288299, -0.2983632, 22.598755, -6.0571437, 2.278272, 22.798777, -6.0964046, 2.2940338, 22.49008, -6.288299, -0.2983632, 22.598755, -6.229696, -0.29725552, 22.954578, -6.0571437, 2.278272, 22.798777, -6.6823287, 4.515596, 23.106857, -7.3017764, 6.6674695, 23.172724, -7.1677566, 6.6817102, 23.28698, -6.6823287, 4.515596, 23.106857, -6.886102, 4.499142, 22.937313, -7.3017764, 6.6674695, 23.172724, -7.1677566, 6.6817102, 23.28698, -7.596041, 7.8030686, 23.339376, -7.4973254, 7.8185544, 23.425323, -7.1677566, 6.6817102, 23.28698, -7.3017764, 6.6674695, 23.172724, -7.596041, 7.8030686, 23.339376, -7.3017764, 6.6674695, 23.172724, -7.61898, 7.8185544, 23.210514, -7.596041, 7.8030686, 23.339376, -7.3017764, 6.6674695, 23.172724, -7.330835, 6.6817102, 22.999025, -7.61898, 7.8185544, 23.210514, -6.9959083, 6.7194586, 23.261988, -7.4973254, 7.8185544, 23.425323, -7.3726697, 7.8587894, 23.408417, -6.9959083, 6.7194586, 23.261988, -7.1677566, 6.6817102, 23.28698, -7.4973254, 7.8185544, 23.425323, -7.0479617, 6.7554083, 22.837128, -7.3161235, 7.9149265, 23.18085, -7.4157386, 7.8998566, 23.094776, -7.0479617, 6.7554083, 22.837128, -6.9114146, 6.7684054, 22.951649, -7.3161235, 7.9149265, 23.18085, -6.9114146, 6.7684054, 22.951649, -7.2935386, 7.8998566, 23.310549, -7.3161235, 7.9149265, 23.18085, -6.9114146, 6.7684054, 22.951649, -6.883434, 6.7554083, 23.12764, -7.2935386, 7.8998566, 23.310549, -7.330835, 6.6817102, 22.999025, -7.5403686, 7.8587894, 23.112305, -7.61898, 7.8185544, 23.210514, -7.330835, 6.6817102, 22.999025, -7.2210193, 6.7194586, 22.864502, -7.5403686, 7.8587894, 23.112305, -5.520864, 5.50994, 24.639458, -6.0238147, 5.3727474, 24.921116, -6.027886, 5.4678555, 24.868423, -5.520864, 5.50994, 24.639458, -5.4553275, 5.043026, 24.83633, -6.0238147, 5.3727474, 24.921116, -5.780359, 5.49264, 24.220936, -5.780785, 5.505308, 24.545547, -5.885944, 5.489472, 24.411573, -5.780359, 5.49264, 24.220936, -5.520864, 5.50994, 24.639458, -5.780785, 5.505308, 24.545547, -4.172077, 4.097315, 23.081501, -4.3400836, 4.5620866, 23.516861, -4.6323843, 4.612814, 23.259392, -4.172077, 4.097315, 23.081501, -4.1252418, 4.0723934, 23.12863, -4.3400836, 4.5620866, 23.516861, -4.3400836, 4.5620866, 23.516861, -4.7473187, 4.731488, 23.319653, -4.6323843, 4.612814, 23.259392, -4.3400836, 4.5620866, 23.516861, -4.6260543, 4.7886457, 23.530365, -4.7473187, 4.731488, 23.319653, -4.6260543, 4.7886457, 23.530365, -4.3400836, 4.5620866, 23.516861, -4.6092978, 5.019003, 23.91192, -4.6260543, 4.7886457, 23.530365, -4.6092978, 5.019003, 23.91192, -5.05752, 5.0416813, 23.479633, -4.6260543, 4.7886457, 23.530365, -5.05752, 5.0416813, 23.479633, -4.8509307, 4.836937, 23.373531, -5.05752, 5.0416813, 23.479633, -5.044219, 5.1299534, 23.679413, -5.109679, 5.073374, 23.52538, -5.05752, 5.0416813, 23.479633, -4.6092978, 5.019003, 23.91192, -5.044219, 5.1299534, 23.679413, -5.416506, 5.348407, 23.822437, -5.4675636, 5.4387703, 24.16735, -5.5109153, 5.382139, 23.924562, -5.416506, 5.348407, 23.822437, -5.0510015, 5.370203, 24.32837, -5.4675636, 5.4387703, 24.16735, -4.119844, 4.0247717, 23.180462, -4.3400836, 4.5620866, 23.516861, -4.1252418, 4.0723934, 23.12863, -4.3400836, 4.5620866, 23.516861, -4.119844, 4.0247717, 23.180462, -4.253202, 4.254257, 23.418776, -4.253202, 4.254257, 23.418776, -4.119844, 4.0247717, 23.180462, -4.22462, 4.107806, 23.420288, -4.3400836, 4.5620866, 23.516861, -4.504075, 4.5656476, 23.906963, -4.6092978, 5.019003, 23.91192, -4.3400836, 4.5620866, 23.516861, -4.4175224, 4.424284, 23.794865, -4.504075, 4.5656476, 23.906963, -4.644364, 4.490939, 24.260977, -5.0510015, 5.370203, 24.32837, -4.6092978, 5.019003, 23.91192, -5.0510015, 5.370203, 24.32837, -4.644364, 4.490939, 24.260977, -4.8376765, 4.627639, 24.436502, -5.0510015, 5.370203, 24.32837, -4.8376765, 4.627639, 24.436502, -4.9126344, 4.897375, 24.407942, -5.261839, 5.2418065, 24.581022, -5.520864, 5.50994, 24.639458, -5.0510015, 5.370203, 24.32837, -5.520864, 5.50994, 24.639458, -5.261839, 5.2418065, 24.581022, -5.3500004, 4.9882493, 24.782772, -5.520864, 5.50994, 24.639458, -5.3500004, 4.9882493, 24.782772, -5.4553275, 5.043026, 24.83633, -5.0510015, 5.370203, 24.32837, -5.044219, 5.1299534, 23.679413, -4.6092978, 5.019003, 23.91192, -5.09594, 5.2896347, 24.011734, -5.044219, 5.1299534, 23.679413, -5.0510015, 5.370203, 24.32837, -5.044219, 5.1299534, 23.679413, -5.09594, 5.2896347, 24.011734, -5.2869577, 5.1833105, 23.681408, -5.044219, 5.1299534, 23.679413, -5.2869577, 5.1833105, 23.681408, -5.197224, 5.1352034, 23.604895, -5.0510015, 5.370203, 24.32837, -5.321176, 5.2789783, 23.735258, -5.09594, 5.2896347, 24.011734, -5.0510015, 5.370203, 24.32837, -5.416506, 5.348407, 23.822437, -5.321176, 5.2789783, 23.735258, -4.9126344, 4.897375, 24.407942, -5.007563, 4.7688026, 24.597364, -5.0510015, 5.370203, 24.32837, -4.9126344, 4.897375, 24.407942, -4.924829, 4.7089424, 24.521822, -5.007563, 4.7688026, 24.597364, -5.520864, 5.50994, 24.639458, -5.4675636, 5.4387703, 24.16735, -5.0510015, 5.370203, 24.32837, -5.4675636, 5.4387703, 24.16735, -5.520864, 5.50994, 24.639458, -5.780359, 5.49264, 24.220936, -5.4675636, 5.4387703, 24.16735, -5.780359, 5.49264, 24.220936, -5.6462617, 5.4495068, 24.077614, -5.261839, 5.2418065, 24.581022, -5.007563, 4.7688026, 24.597364, -5.284591, 4.8992395, 24.734537, -5.261839, 5.2418065, 24.581022, -5.0510015, 5.370203, 24.32837, -5.007563, 4.7688026, 24.597364, -6.027886, 5.4678555, 24.868423, -5.780785, 5.505308, 24.545547, -5.520864, 5.50994, 24.639458, -5.780785, 5.505308, 24.545547, -6.027886, 5.4678555, 24.868423, -6.0964007, 5.467935, 24.783894, -5.780785, 5.505308, 24.545547, -6.0964007, 5.467935, 24.783894, -5.9559407, 5.492031, 24.540054, -4.504075, 4.5656476, 23.906963, -4.644364, 4.490939, 24.260977, -4.6092978, 5.019003, 23.91192, -4.504075, 4.5656476, 23.906963, -4.5401545, 4.407131, 24.07597, -4.644364, 4.490939, 24.260977, -4.4175224, 4.424284, 23.794865, -4.4788713, 4.3216662, 23.951574, -4.504075, 4.5656476, 23.906963, -4.4175224, 4.424284, 23.794865, -4.4406796, 4.305605, 23.890078, -4.4788713, 4.3216662, 23.951574, -4.4175224, 4.424284, 23.794865, -4.3400836, 4.5620866, 23.516861, -4.367128, 4.250943, 23.76148, -4.253202, 4.254257, 23.418776, -4.367128, 4.250943, 23.76148, -4.3400836, 4.5620866, 23.516861, -4.253202, 4.254257, 23.418776, -4.274289, 4.1678133, 23.544254, -4.367128, 4.250943, 23.76148, -6.100014, 5.3618755, 25.36038, -6.053468, 5.4692774, 24.699776, -5.951238, 5.4974275, 24.761002, -6.100014, 5.3618755, 25.36038, -6.5840898, 5.185566, 25.139408, -6.053468, 5.4692774, 24.699776, -5.702927, 4.9555445, 25.310673, -5.8909087, 5.2601395, 25.158152, -5.754765, 5.1142435, 25.118452, -5.702927, 4.9555445, 25.310673, -6.100014, 5.3618755, 25.36038, -5.8909087, 5.2601395, 25.158152, -6.868545, 2.974114, 26.87804, -6.7395024, 3.6925054, 26.67168, -6.369455, 3.4866214, 26.543037, -6.868545, 2.974114, 26.87804, -6.9426017, 2.9990473, 26.889389, -6.7395024, 3.6925054, 26.67168, -6.7395024, 3.6925054, 26.67168, -6.2608256, 3.6231003, 26.448338, -6.369455, 3.4866214, 26.543037, -6.7395024, 3.6925054, 26.67168, -6.429816, 3.8601167, 26.47786, -6.2608256, 3.6231003, 26.448338, -6.429816, 3.8601167, 26.47786, -6.7395024, 3.6925054, 26.67168, -6.5268407, 4.3764234, 26.390133, -6.429816, 3.8601167, 26.47786, -6.5268407, 4.3764234, 26.390133, -5.9696584, 3.9842505, 26.192686, -6.429816, 3.8601167, 26.47786, -5.9696584, 3.9842505, 26.192686, -6.1631923, 3.745168, 26.363018, -5.9696584, 3.9842505, 26.192686, -6.049317, 4.232349, 26.135853, -5.944036, 4.043989, 26.133595, -5.9696584, 3.9842505, 26.192686, -6.5268407, 4.3764234, 26.390133, -6.049317, 4.232349, 26.135853, -5.773127, 4.5062346, 25.794031, -5.898379, 4.8849564, 25.608694, -5.7558064, 4.6165876, 25.667988, -5.773127, 4.5062346, 25.794031, -6.2885137, 4.9992027, 25.899937, -5.898379, 4.8849564, 25.608694, -7.0106807, 3.0087154, 26.849985, -6.7395024, 3.6925054, 26.67168, -6.9426017, 2.9990473, 26.889389, -6.7395024, 3.6925054, 26.67168, -7.0106807, 3.0087154, 26.849985, -6.9334645, 3.3768253, 26.686901, -6.9334645, 3.3768253, 26.686901, -7.0106807, 3.0087154, 26.849985, -7.0455823, 3.2654228, 26.659414, -6.7395024, 3.6925054, 26.67168, -6.892614, 4.0271807, 26.316252, -6.5268407, 4.3764234, 26.390133, -6.7395024, 3.6925054, 26.67168, -6.9665236, 3.8246672, 26.401512, -6.892614, 4.0271807, 26.316252, -7.0833793, 4.2717676, 25.97569, -6.2885137, 4.9992027, 25.899937, -6.5268407, 4.3764234, 26.390133, -6.2885137, 4.9992027, 25.899937, -7.0833793, 4.2717676, 25.97569, -6.9840283, 4.5172915, 25.75856, -6.2885137, 4.9992027, 25.899937, -6.9840283, 4.5172915, 25.75856, -6.7441907, 4.708605, 25.804724, -6.4090276, 5.1228185, 25.524706, -6.100014, 5.3618755, 25.36038, -6.2885137, 4.9992027, 25.899937, -6.100014, 5.3618755, 25.36038, -6.4090276, 5.1228185, 25.524706, -6.6533313, 5.102206, 25.24277, -6.100014, 5.3618755, 25.36038, -6.6533313, 5.102206, 25.24277, -6.5840898, 5.185566, 25.139408, -6.2885137, 4.9992027, 25.899937, -6.049317, 4.232349, 26.135853, -6.5268407, 4.3764234, 26.390133, -6.123463, 4.6506386, 25.980106, -6.049317, 4.232349, 26.135853, -6.2885137, 4.9992027, 25.899937, -6.049317, 4.232349, 26.135853, -6.123463, 4.6506386, 25.980106, -5.8564105, 4.2503223, 25.933277, -6.049317, 4.232349, 26.135853, -5.8564105, 4.2503223, 25.933277, -5.898976, 4.1555033, 26.03533, -6.2885137, 4.9992027, 25.899937, -5.822971, 4.3798666, 25.900269, -6.123463, 4.6506386, 25.980106, -6.2885137, 4.9992027, 25.899937, -5.773127, 4.5062346, 25.794031, -5.822971, 4.3798666, 25.900269, -6.7441907, 4.708605, 25.804724, -6.8905606, 4.769124, 25.571657, -6.2885137, 4.9992027, 25.899937, -6.7441907, 4.708605, 25.804724, -6.933764, 4.659773, 25.663965, -6.8905606, 4.769124, 25.571657, -6.100014, 5.3618755, 25.36038, -5.898379, 4.8849564, 25.608694, -6.2885137, 4.9992027, 25.899937, -5.898379, 4.8849564, 25.608694, -6.100014, 5.3618755, 25.36038, -5.702927, 4.9555445, 25.310673, -5.898379, 4.8849564, 25.608694, -5.702927, 4.9555445, 25.310673, -5.727136, 4.8010197, 25.48896, -6.4090276, 5.1228185, 25.524706, -6.8905606, 4.769124, 25.571657, -6.712791, 4.966251, 25.297207, -6.4090276, 5.1228185, 25.524706, -6.2885137, 4.9992027, 25.899937, -6.8905606, 4.769124, 25.571657, -5.951238, 5.4974275, 24.761002, -5.8909087, 5.2601395, 25.158152, -6.100014, 5.3618755, 25.36038, -5.8909087, 5.2601395, 25.158152, -5.951238, 5.4974275, 24.761002, -5.857908, 5.4214015, 24.738348, -5.8909087, 5.2601395, 25.158152, -5.857908, 5.4214015, 24.738348, -5.786898, 5.237897, 24.993658, -6.892614, 4.0271807, 26.316252, -7.0833793, 4.2717676, 25.97569, -6.5268407, 4.3764234, 26.390133, -6.892614, 4.0271807, 26.316252, -7.084641, 4.049944, 26.135506, -7.0833793, 4.2717676, 25.97569, -6.9665236, 3.8246672, 26.401512, -7.0913386, 3.8691072, 26.228043, -6.892614, 4.0271807, 26.316252, -6.9665236, 3.8246672, 26.401512, -7.0892367, 3.8087032, 26.28731, -7.0913386, 3.8691072, 26.228043, -6.9665236, 3.8246672, 26.401512, -6.7395024, 3.6925054, 26.67168, -7.0888734, 3.6620417, 26.401033, -6.9334645, 3.3768253, 26.686901, -7.0888734, 3.6620417, 26.401033, -6.7395024, 3.6925054, 26.67168, -6.9334645, 3.3768253, 26.686901, -7.0596833, 3.4167135, 26.568975, -7.0888734, 3.6620417, 26.401033, -6.3319364, 5.7359695, 25.081383, -5.9698243, 5.384118, 24.680239, -5.904365, 5.4435186, 24.765022, -6.3319364, 5.7359695, 25.081383, -6.686463, 5.4666615, 24.73655, -5.9698243, 5.384118, 24.680239, -6.155786, 5.38664, 25.487875, -6.125067, 5.5240107, 25.150925, -6.053208, 5.3827543, 25.27274, -6.155786, 5.38664, 25.487875, -6.3319364, 5.7359695, 25.081383, -6.125067, 5.5240107, 25.150925, -8.413198, 4.890188, 26.407503, -7.970281, 5.3087463, 26.08081, -7.7057996, 5.0614824, 26.335453, -8.413198, 4.890188, 26.407503, -8.465763, 4.9176445, 26.35488, -7.970281, 5.3087463, 26.08081, -7.970281, 5.3087463, 26.08081, -7.5340934, 5.103933, 26.298006, -7.7057996, 5.0614824, 26.335453, -7.970281, 5.3087463, 26.08081, -7.592959, 5.3087974, 26.109215, -7.5340934, 5.103933, 26.298006, -7.592959, 5.3087974, 26.109215, -7.970281, 5.3087463, 26.08081, -7.4463277, 5.651639, 25.785309, -7.592959, 5.3087974, 26.109215, -7.4463277, 5.651639, 25.785309, -7.0733275, 5.2124443, 26.196064, -7.592959, 5.3087974, 26.109215, -7.0733275, 5.2124443, 26.196064, -7.379638, 5.141446, 26.26409, -7.0733275, 5.2124443, 26.196064, -7.0267406, 5.3698435, 26.018854, -7.005255, 5.218994, 26.151365, -7.0733275, 5.2124443, 26.196064, -7.4463277, 5.651639, 25.785309, -7.0267406, 5.3698435, 26.018854, -6.5752587, 5.356027, 25.89963, -6.46051, 5.5302234, 25.563005, -6.4677835, 5.358314, 25.792141, -6.5752587, 5.356027, 25.89963, -6.836881, 5.81112, 25.415369, -6.46051, 5.5302234, 25.563005, -8.498926, 4.900632, 26.286041, -7.970281, 5.3087463, 26.08081, -8.465763, 4.9176445, 26.35488, -7.970281, 5.3087463, 26.08081, -8.498926, 4.900632, 26.286041, -8.239595, 5.077715, 26.094341, -8.239595, 5.077715, 26.094341, -8.498926, 4.900632, 26.286041, -8.351461, 4.9742537, 26.046995, -7.970281, 5.3087463, 26.08081, -7.8256736, 5.34012, 25.656843, -7.4463277, 5.651639, 25.785309, -7.970281, 5.3087463, 26.08081, -7.9896913, 5.2398424, 25.73777, -7.8256736, 5.34012, 25.656843, -7.744165, 5.310528, 25.246101, -6.836881, 5.81112, 25.415369, -7.4463277, 5.651639, 25.785309, -6.836881, 5.81112, 25.415369, -7.744165, 5.310528, 25.246101, -7.485513, 5.35617, 25.082954, -6.836881, 5.81112, 25.415369, -7.485513, 5.35617, 25.082954, -7.2575336, 5.5329638, 25.196087, -6.7352633, 5.6665816, 25.089825, -6.3319364, 5.7359695, 25.081383, -6.836881, 5.81112, 25.415369, -6.3319364, 5.7359695, 25.081383, -6.7352633, 5.6665816, 25.089825, -6.815335, 5.4714, 24.787678, -6.3319364, 5.7359695, 25.081383, -6.815335, 5.4714, 24.787678, -6.686463, 5.4666615, 24.73655, -6.836881, 5.81112, 25.415369, -7.0267406, 5.3698435, 26.018854, -7.4463277, 5.651639, 25.785309, -6.8723903, 5.5936527, 25.718147, -7.0267406, 5.3698435, 26.018854, -6.836881, 5.81112, 25.415369, -7.0267406, 5.3698435, 26.018854, -6.8723903, 5.5936527, 25.718147, -6.7732606, 5.244132, 25.999937, -7.0267406, 5.3698435, 26.018854, -6.7732606, 5.244132, 25.999937, -6.888104, 5.2399597, 26.077604, -6.836881, 5.81112, 25.415369, -6.703796, 5.3285036, 25.979181, -6.8723903, 5.5936527, 25.718147, -6.836881, 5.81112, 25.415369, -6.5752587, 5.356027, 25.89963, -6.703796, 5.3285036, 25.979181, -7.2575336, 5.5329638, 25.196087, -7.249745, 5.4294252, 24.944311, -6.836881, 5.81112, 25.415369, -7.2575336, 5.5329638, 25.196087, -7.3613477, 5.405882, 25.013523, -7.249745, 5.4294252, 24.944311, -6.3319364, 5.7359695, 25.081383, -6.46051, 5.5302234, 25.563005, -6.836881, 5.81112, 25.415369, -6.46051, 5.5302234, 25.563005, -6.3319364, 5.7359695, 25.081383, -6.155786, 5.38664, 25.487875, -6.46051, 5.5302234, 25.563005, -6.155786, 5.38664, 25.487875, -6.3074155, 5.384823, 25.640076, -6.7352633, 5.6665816, 25.089825, -7.249745, 5.4294252, 24.944311, -6.916063, 5.3964624, 24.806072, -6.7352633, 5.6665816, 25.089825, -6.836881, 5.81112, 25.415369, -7.249745, 5.4294252, 24.944311, -5.904365, 5.4435186, 24.765022, -6.125067, 5.5240107, 25.150925, -6.3319364, 5.7359695, 25.081383, -6.125067, 5.5240107, 25.150925, -5.904365, 5.4435186, 24.765022, -5.8518662, 5.369458, 24.847279, -6.125067, 5.5240107, 25.150925, -5.8518662, 5.369458, 24.847279, -5.982039, 5.3976545, 25.132534, -7.8256736, 5.34012, 25.656843, -7.744165, 5.310528, 25.246101, -7.4463277, 5.651639, 25.785309, -7.8256736, 5.34012, 25.656843, -7.8908563, 5.243067, 25.42438, -7.744165, 5.310528, 25.246101, -7.9896913, 5.2398424, 25.73777, -7.989692, 5.1600666, 25.528631, -7.8256736, 5.34012, 25.656843, -7.9896913, 5.2398424, 25.73777, -8.038292, 5.1534004, 25.594398, -7.989692, 5.1600666, 25.528631, -7.9896913, 5.2398424, 25.73777, -7.970281, 5.3087463, 26.08081, -8.13969, 5.114773, 25.721031, -8.239595, 5.077715, 26.094341, -8.13969, 5.114773, 25.721031, -7.970281, 5.3087463, 26.08081, -8.239595, 5.077715, 26.094341, -8.274294, 5.0338635, 25.932472, -8.13969, 5.114773, 25.721031, -6.331285, 5.6798854, 24.653553, -5.876188, 5.388583, 24.768026, -5.910171, 5.4440794, 24.847443, -6.331285, 5.6798854, 24.653553, -6.2332807, 5.427716, 24.268461, -5.876188, 5.388583, 24.768026, -6.555012, 5.4120646, 24.973154, -6.2882495, 5.5129185, 24.845657, -6.350158, 5.405257, 24.957108, -6.555012, 5.4120646, 24.973154, -6.331285, 5.6798854, 24.653553, -6.2882495, 5.5129185, 24.845657, -8.316685, 4.926779, 23.737947, -7.8548923, 5.297988, 23.903517, -7.925697, 5.1127415, 24.21713, -8.316685, 4.926779, 23.737947, -8.301708, 4.9451656, 23.675941, -7.8548923, 5.297988, 23.903517, -7.8548923, 5.297988, 23.903517, -7.815824, 5.15586, 24.324652, -7.925697, 5.1127415, 24.21713, -7.8548923, 5.297988, 23.903517, -7.6972337, 5.3176384, 24.191387, -7.815824, 5.15586, 24.324652, -7.6972337, 5.3176384, 24.191387, -7.8548923, 5.297988, 23.903517, -7.37958, 5.598157, 24.143217, -7.6972337, 5.3176384, 24.191387, -7.37958, 5.598157, 24.143217, -7.52163, 5.2640796, 24.611933, -7.6972337, 5.3176384, 24.191387, -7.52163, 5.2640796, 24.611933, -7.717137, 5.1935024, 24.421171, -7.52163, 5.2640796, 24.611933, -7.3604617, 5.389035, 24.563318, -7.457949, 5.2713842, 24.642237, -7.52163, 5.2640796, 24.611933, -7.37958, 5.598157, 24.143217, -7.3604617, 5.389035, 24.563318, -7.058254, 5.3891068, 24.842972, -6.74797, 5.522382, 24.775219, -6.928924, 5.3911495, 24.875774, -7.058254, 5.3891068, 24.842972, -6.8127713, 5.7382603, 24.422806, -6.74797, 5.522382, 24.775219, -8.2651825, 4.9275074, 23.624132, -7.8548923, 5.297988, 23.903517, -8.301708, 4.9451656, 23.675941, -7.8548923, 5.297988, 23.903517, -8.2651825, 4.9275074, 23.624132, -7.9951816, 5.089792, 23.725204, -7.9951816, 5.089792, 23.725204, -8.2651825, 4.9275074, 23.624132, -8.016663, 4.994527, 23.62873, -7.8548923, 5.297988, 23.903517, -7.4628644, 5.3177576, 23.831608, -7.37958, 5.598157, 24.143217, -7.8548923, 5.297988, 23.903517, -7.6030936, 5.2291493, 23.751238, -7.4628644, 5.3177576, 23.831608, -7.1153607, 5.282588, 23.72141, -6.8127713, 5.7382603, 24.422806, -7.37958, 5.598157, 24.143217, -6.8127713, 5.7382603, 24.422806, -7.1153607, 5.282588, 23.72141, -6.87394, 5.326008, 23.83848, -6.8127713, 5.7382603, 24.422806, -6.87394, 5.326008, 23.83848, -6.8445373, 5.4831157, 24.042107, -6.518, 5.605947, 24.369406, -6.331285, 5.6798854, 24.653553, -6.8127713, 5.7382603, 24.422806, -6.331285, 5.6798854, 24.653553, -6.518, 5.605947, 24.369406, -6.3297257, 5.428781, 24.196327, -6.331285, 5.6798854, 24.653553, -6.3297257, 5.428781, 24.196327, -6.2332807, 5.427716, 24.268461, -6.8127713, 5.7382603, 24.422806, -7.3604617, 5.389035, 24.563318, -7.37958, 5.598157, 24.143217, -7.056313, 5.567637, 24.537035, -7.3604617, 5.389035, 24.563318, -6.8127713, 5.7382603, 24.422806, -7.3604617, 5.389035, 24.563318, -7.056313, 5.567637, 24.537035, -7.24099, 5.2982535, 24.745642, -7.3604617, 5.389035, 24.563318, -7.24099, 5.2982535, 24.745642, -7.3485713, 5.2914233, 24.69535, -6.8127713, 5.7382603, 24.422806, -7.1779733, 5.3646665, 24.78445, -7.056313, 5.567637, 24.537035, -6.8127713, 5.7382603, 24.422806, -7.058254, 5.3891068, 24.842972, -7.1779733, 5.3646665, 24.78445, -6.8445373, 5.4831157, 24.042107, -6.6547856, 5.388571, 23.94828, -6.8127713, 5.7382603, 24.422806, -6.8445373, 5.4831157, 24.042107, -6.7587676, 5.367548, 23.897482, -6.6547856, 5.388571, 23.94828, -6.331285, 5.6798854, 24.653553, -6.74797, 5.522382, 24.775219, -6.8127713, 5.7382603, 24.422806, -6.74797, 5.522382, 24.775219, -6.331285, 5.6798854, 24.653553, -6.555012, 5.4120646, 24.973154, -6.74797, 5.522382, 24.775219, -6.555012, 5.4120646, 24.973154, -6.737456, 5.410923, 24.927305, -6.518, 5.605947, 24.369406, -6.6547856, 5.388571, 23.94828, -6.404985, 5.3717523, 24.133698, -6.518, 5.605947, 24.369406, -6.8127713, 5.7382603, 24.422806, -6.6547856, 5.388571, 23.94828, -5.910171, 5.4440794, 24.847443, -6.2882495, 5.5129185, 24.845657, -6.331285, 5.6798854, 24.653553, -6.2882495, 5.5129185, 24.845657, -5.910171, 5.4440794, 24.847443, -5.947083, 5.38731, 24.924572, -6.2882495, 5.5129185, 24.845657, -5.947083, 5.38731, 24.924572, -6.211325, 5.4130735, 24.94913, -7.4628644, 5.3177576, 23.831608, -7.1153607, 5.282588, 23.72141, -7.37958, 5.598157, 24.143217, -7.4628644, 5.3177576, 23.831608, -7.319452, 5.226307, 23.692755, -7.1153607, 5.282588, 23.72141, -7.6030936, 5.2291493, 23.751238, -7.4537644, 5.1571455, 23.66732, -7.4628644, 5.3177576, 23.831608, -7.6030936, 5.2291493, 23.751238, -7.522962, 5.150751, 23.66025, -7.4537644, 5.1571455, 23.66732, -7.6030936, 5.2291493, 23.751238, -7.8548923, 5.297988, 23.903517, -7.6649528, 5.116803, 23.641397, -7.9951816, 5.089792, 23.725204, -7.6649528, 5.116803, 23.641397, -7.8548923, 5.297988, 23.903517, -7.9951816, 5.089792, 23.725204, -7.8895354, 5.0471697, 23.63519, -7.6649528, 5.116803, 23.641397, -5.857347, 5.7116084, 24.363003, -5.903773, 5.378351, 24.927797, -6.00098, 5.4485216, 24.902779, -5.857347, 5.7116084, 24.363003, -5.4018383, 5.389697, 24.404541, -5.903773, 5.378351, 24.927797, -6.2981954, 5.4044847, 24.163559, -6.076615, 5.5257673, 24.45499, -6.2318177, 5.399699, 24.403456, -6.2981954, 5.4044847, 24.163559, -5.857347, 5.7116084, 24.363003, -6.076615, 5.5257673, 24.45499, -5.4074144, 4.736121, 21.818316, -5.439855, 5.177844, 22.396505, -5.831164, 4.97289, 22.37704, -5.4074144, 4.736121, 21.818316, -5.3315473, 4.755287, 21.823586, -5.439855, 5.177844, 22.396505, -5.439855, 5.177844, 22.396505, -5.9201818, 5.030147, 22.5292, -5.831164, 4.97289, 22.37704, -5.439855, 5.177844, 22.396505, -5.7215886, 5.217056, 22.642551, -5.9201818, 5.030147, 22.5292, -5.7215886, 5.217056, 22.642551, -5.439855, 5.177844, 22.396505, -5.5580716, 5.554124, 23.009472, -5.7215886, 5.217056, 22.642551, -5.5580716, 5.554124, 23.009472, -6.160071, 5.178384, 22.936909, -5.7215886, 5.217056, 22.642551, -6.160071, 5.178384, 22.936909, -6.000282, 5.0809345, 22.665983, -6.160071, 5.178384, 22.936909, -6.046327, 5.3291693, 23.119432, -6.1793313, 5.1894274, 23.018368, -6.160071, 5.178384, 22.936909, -5.5580716, 5.554124, 23.009472, -6.046327, 5.3291693, 23.119432, -6.2826037, 5.3541317, 23.53723, -6.1099467, 5.52, 23.893438, -6.287435, 5.3614902, 23.69768, -6.2826037, 5.3541317, 23.53723, -5.7123218, 5.753208, 23.741987, -6.1099467, 5.52, 23.893438, -5.2635365, 4.7313147, 21.856642, -5.439855, 5.177844, 22.396505, -5.3315473, 4.755287, 21.823586, -5.439855, 5.177844, 22.396505, -5.2635365, 4.7313147, 21.856642, -5.291579, 4.922532, 22.195475, -5.291579, 4.922532, 22.195475, -5.2635365, 4.7313147, 21.856642, -5.19895, 4.8064184, 22.150917, -5.439855, 5.177844, 22.396505, -5.24503, 5.200137, 22.848965, -5.5580716, 5.554124, 23.009472, -5.439855, 5.177844, 22.396505, -5.1995373, 5.0887403, 22.666178, -5.24503, 5.200137, 22.848965, -5.0281267, 5.1566877, 23.240654, -5.7123218, 5.753208, 23.741987, -5.5580716, 5.554124, 23.009472, -5.7123218, 5.753208, 23.741987, -5.0281267, 5.1566877, 23.240654, -5.097282, 5.219322, 23.551094, -5.7123218, 5.753208, 23.741987, -5.097282, 5.219322, 23.551094, -5.3022, 5.4230766, 23.628416, -5.577439, 5.6020293, 24.084873, -5.857347, 5.7116084, 24.363003, -5.7123218, 5.753208, 23.741987, -5.857347, 5.7116084, 24.363003, -5.577439, 5.6020293, 24.084873, -5.342383, 5.384054, 24.275276, -5.857347, 5.7116084, 24.363003, -5.342383, 5.384054, 24.275276, -5.4018383, 5.389697, 24.404541, -5.7123218, 5.753208, 23.741987, -6.046327, 5.3291693, 23.119432, -5.5580716, 5.554124, 23.009472, -5.917007, 5.5500546, 23.476519, -6.046327, 5.3291693, 23.119432, -5.7123218, 5.753208, 23.741987, -6.046327, 5.3291693, 23.119432, -5.917007, 5.5500546, 23.476519, -6.244391, 5.2299757, 23.296265, -6.046327, 5.3291693, 23.119432, -6.244391, 5.2299757, 23.296265, -6.210569, 5.21813, 23.159012, -5.7123218, 5.753208, 23.741987, -6.2491727, 5.318202, 23.382605, -5.917007, 5.5500546, 23.476519, -5.7123218, 5.753208, 23.741987, -6.2826037, 5.3541317, 23.53723, -6.2491727, 5.318202, 23.382605, -5.3022, 5.4230766, 23.628416, -5.154279, 5.307758, 23.83554, -5.7123218, 5.753208, 23.741987, -5.3022, 5.4230766, 23.628416, -5.1251884, 5.2768984, 23.701454, -5.154279, 5.307758, 23.83554, -5.857347, 5.7116084, 24.363003, -6.1099467, 5.52, 23.893438, -5.7123218, 5.753208, 23.741987, -6.1099467, 5.52, 23.893438, -5.857347, 5.7116084, 24.363003, -6.2981954, 5.4044847, 24.163559, -6.1099467, 5.52, 23.893438, -6.2981954, 5.4044847, 24.163559, -6.291105, 5.3954716, 23.937151, -5.577439, 5.6020293, 24.084873, -5.154279, 5.307758, 23.83554, -5.3127255, 5.301915, 24.168657, -5.577439, 5.6020293, 24.084873, -5.7123218, 5.753208, 23.741987, -5.154279, 5.307758, 23.83554, -6.00098, 5.4485216, 24.902779, -6.076615, 5.5257673, 24.45499, -5.857347, 5.7116084, 24.363003, -6.076615, 5.5257673, 24.45499, -6.00098, 5.4485216, 24.902779, -6.1017814, 5.3846993, 24.875137, -6.076615, 5.5257673, 24.45499, -6.1017814, 5.3846993, 24.875137, -6.184852, 5.4140406, 24.567734, -5.24503, 5.200137, 22.848965, -5.0281267, 5.1566877, 23.240654, -5.5580716, 5.554124, 23.009472, -5.24503, 5.200137, 22.848965, -5.0552382, 5.0847697, 22.992046, -5.0281267, 5.1566877, 23.240654, -5.1995373, 5.0887403, 22.666178, -5.0783086, 4.9989347, 22.825645, -5.24503, 5.200137, 22.848965, -5.1995373, 5.0887403, 22.666178, -5.0852733, 4.9907217, 22.742779, -5.0783086, 4.9989347, 22.825645, -5.1995373, 5.0887403, 22.666178, -5.439855, 5.177844, 22.396505, -5.102995, 4.9489727, 22.570704, -5.291579, 4.922532, 22.195475, -5.102995, 4.9489727, 22.570704, -5.439855, 5.177844, 22.396505, -5.291579, 4.922532, 22.195475, -5.163247, 4.866782, 22.303133, -5.102995, 4.9489727, 22.570704, -5.488422, 5.4559135, 25.067163, -6.115338, 5.4586115, 24.851, -6.0311418, 5.4854546, 24.766218, -5.488422, 5.4559135, 25.067163, -5.8165927, 5.2966948, 25.486755, -6.115338, 5.4586115, 24.851, -5.37565, 5.0100093, 24.717901, -5.60895, 5.3052464, 24.837267, -5.5913396, 5.1425714, 24.705996, -5.37565, 5.0100093, 24.717901, -5.488422, 5.4559135, 25.067163, -5.60895, 5.3052464, 24.837267, -3.997026, 3.4084823, 26.23418, -4.2373033, 4.0717287, 26.033955, -4.2301164, 3.8139224, 25.675167, -3.997026, 3.4084823, 26.23418, -4.010387, 3.441938, 26.303183, -4.2373033, 4.0717287, 26.033955, -4.2373033, 4.0717287, 26.033955, -4.3043237, 3.923424, 25.547739, -4.2301164, 3.8139224, 25.675167, -4.2373033, 4.0717287, 26.033955, -4.351472, 4.177483, 25.700325, -4.3043237, 3.923424, 25.547739, -4.351472, 4.177483, 25.700325, -4.2373033, 4.0717287, 26.033955, -4.5209985, 4.6817417, 25.74504, -4.351472, 4.177483, 25.700325, -4.5209985, 4.6817417, 25.74504, -4.504621, 4.2121515, 25.204073, -4.351472, 4.177483, 25.700325, -4.504621, 4.2121515, 25.204073, -4.3712316, 4.021261, 25.432993, -4.504621, 4.2121515, 25.204073, -4.6092005, 4.455448, 25.259403, -4.5602574, 4.259628, 25.160809, -4.504621, 4.2121515, 25.204073, -4.5209985, 4.6817417, 25.74504, -4.6092005, 4.455448, 25.259403, -4.8856854, 4.646908, 24.917786, -5.1403203, 5.003999, 24.975368, -5.0130434, 4.735046, 24.86499, -4.8856854, 4.646908, 24.917786, -4.988566, 5.1979246, 25.387373, -5.1403203, 5.003999, 24.975368, -4.0683527, 3.4522138, 26.357347, -4.2373033, 4.0717287, 26.033955, -4.010387, 3.441938, 26.303183, -4.2373033, 4.0717287, 26.033955, -4.0683527, 3.4522138, 26.357347, -4.242745, 3.782452, 26.231682, -4.242745, 3.782452, 26.231682, -4.0683527, 3.4522138, 26.357347, -4.2885528, 3.6797438, 26.329477, -4.2373033, 4.0717287, 26.033955, -4.656346, 4.3628387, 26.08645, -4.5209985, 4.6817417, 25.74504, -4.2373033, 4.0717287, 26.033955, -4.57377, 4.1835814, 26.181997, -4.656346, 4.3628387, 26.08645, -5.062138, 4.5712886, 26.17474, -4.988566, 5.1979246, 25.387373, -4.5209985, 4.6817417, 25.74504, -4.988566, 5.1979246, 25.387373, -5.062138, 4.5712886, 26.17474, -5.2679048, 4.7707634, 26.016972, -4.988566, 5.1979246, 25.387373, -5.2679048, 4.7707634, 26.016972, -5.1766024, 4.9423556, 25.806808, -5.3932915, 5.275302, 25.41678, -5.488422, 5.4559135, 25.067163, -4.988566, 5.1979246, 25.387373, -5.488422, 5.4559135, 25.067163, -5.3932915, 5.275302, 25.41678, -5.7287784, 5.236825, 25.581738, -5.488422, 5.4559135, 25.067163, -5.7287784, 5.236825, 25.581738, -5.8165927, 5.2966948, 25.486755, -4.988566, 5.1979246, 25.387373, -4.6092005, 4.455448, 25.259403, -4.5209985, 4.6817417, 25.74504, -4.825552, 4.8508716, 25.277138, -4.6092005, 4.455448, 25.259403, -4.988566, 5.1979246, 25.387373, -4.6092005, 4.455448, 25.259403, -4.825552, 4.8508716, 25.277138, -4.749141, 4.4242043, 25.014292, -4.6092005, 4.455448, 25.259403, -4.749141, 4.4242043, 25.014292, -4.653323, 4.3502817, 25.089447, -4.988566, 5.1979246, 25.387373, -4.784744, 4.543359, 24.994701, -4.825552, 4.8508716, 25.277138, -4.988566, 5.1979246, 25.387373, -4.8856854, 4.646908, 24.917786, -4.784744, 4.543359, 24.994701, -5.1766024, 4.9423556, 25.806808, -5.4469156, 4.981415, 25.883078, -4.988566, 5.1979246, 25.387373, -5.1766024, 4.9423556, 25.806808, -5.3591576, 4.891834, 25.949957, -5.4469156, 4.981415, 25.883078, -5.488422, 5.4559135, 25.067163, -5.1403203, 5.003999, 24.975368, -4.988566, 5.1979246, 25.387373, -5.1403203, 5.003999, 24.975368, -5.488422, 5.4559135, 25.067163, -5.37565, 5.0100093, 24.717901, -5.1403203, 5.003999, 24.975368, -5.37565, 5.0100093, 24.717901, -5.1955976, 4.8869286, 24.792862, -5.3932915, 5.275302, 25.41678, -5.4469156, 4.981415, 25.883078, -5.6794295, 5.1171756, 25.630447, -5.3932915, 5.275302, 25.41678, -4.988566, 5.1979246, 25.387373, -5.4469156, 4.981415, 25.883078, -6.0311418, 5.4854546, 24.766218, -5.60895, 5.3052464, 24.837267, -5.488422, 5.4559135, 25.067163, -5.60895, 5.3052464, 24.837267, -6.0311418, 5.4854546, 24.766218, -6.01732, 5.3982096, 24.681461, -5.60895, 5.3052464, 24.837267, -6.01732, 5.3982096, 24.681461, -5.733069, 5.248727, 24.701923, -4.656346, 4.3628387, 26.08645, -5.062138, 4.5712886, 26.17474, -4.5209985, 4.6817417, 25.74504, -4.656346, 4.3628387, 26.08645, -4.8856683, 4.377059, 26.22222, -5.062138, 4.5712886, 26.17474, -4.57377, 4.1835814, 26.181997, -4.779701, 4.213683, 26.243425, -4.656346, 4.3628387, 26.08645, -4.57377, 4.1835814, 26.181997, -4.715779, 4.162856, 26.263649, -4.779701, 4.213683, 26.243425, -4.57377, 4.1835814, 26.181997, -4.2373033, 4.0717287, 26.033955, -4.590958, 4.0354905, 26.29871, -4.242745, 3.782452, 26.231682, -4.590958, 4.0354905, 26.29871, -4.2373033, 4.0717287, 26.033955, -4.242745, 3.782452, 26.231682, -4.395331, 3.8163853, 26.320553, -4.590958, 4.0354905, 26.29871, -6.1042504, 1.2728562, 23.197392, -5.918094, 2.7018955, 23.690025, -5.9148564, 2.7549148, 23.524578, -6.1042504, 1.2728562, 23.197392, -6.1098676, 1.2173094, 23.399563, -5.918094, 2.7018955, 23.690025, -6.4102006, -0.38891935, 23.115858, -6.1098676, 1.2173094, 23.399563, -6.1042504, 1.2728562, 23.197392, -6.4102006, -0.38891935, 23.115858, -6.407615, -0.42018914, 23.34877, -6.1098676, 1.2173094, 23.399563, -6.445969, 1.214475, 23.560837, -6.334398, 2.7400944, 23.713541, -6.206943, 2.6917243, 23.821266, -6.445969, 1.214475, 23.560837, -6.593639, 1.2685848, 23.43337, -6.334398, 2.7400944, 23.713541, -6.45285, 1.3504215, 23.077362, -6.04308, 2.8031602, 23.417374, -6.2159896, 2.8219187, 23.420893, -6.45285, 1.3504215, 23.077362, -6.2506223, 1.3273255, 23.06642, -6.04308, 2.8031602, 23.417374, -6.206943, 2.6917243, 23.821266, -6.1571717, 4.087394, 24.238876, -6.071984, 4.053143, 24.309086, -6.206943, 2.6917243, 23.821266, -6.334398, 2.7400944, 23.713541, -6.1571717, 4.087394, 24.238876, -5.9148564, 2.7549148, 23.524578, -5.878671, 4.066166, 24.22505, -5.875483, 4.1052194, 24.1148, -5.9148564, 2.7549148, 23.524578, -5.918094, 2.7018955, 23.690025, -5.878671, 4.066166, 24.22505, -5.875483, 4.1052194, 24.1148, -5.878671, 4.066166, 24.22505, -5.8760715, 4.7822523, 24.560642, -5.875483, 4.1052194, 24.1148, -5.8760715, 4.7822523, 24.560642, -5.8734727, 4.8202696, 24.482874, -6.1098676, 1.2173094, 23.399563, -6.0342355, 2.6733067, 23.816893, -5.918094, 2.7018955, 23.690025, -6.1098676, 1.2173094, 23.399563, -6.2450395, 1.1910194, 23.5534, -6.0342355, 2.6733067, 23.816893, -5.918094, 2.7018955, 23.690025, -6.0342355, 2.6733067, 23.816893, -5.9568696, 4.0428257, 24.307844, -5.918094, 2.7018955, 23.690025, -5.9568696, 4.0428257, 24.307844, -5.878671, 4.066166, 24.22505, -6.593639, 1.2685848, 23.43337, -6.3314233, 2.7938638, 23.547709, -6.334398, 2.7400944, 23.713541, -6.593639, 1.2685848, 23.43337, -6.589192, 1.3239617, 23.234522, -6.3314233, 2.7938638, 23.547709, -6.334398, 2.7400944, 23.713541, -6.3314233, 2.7938638, 23.547709, -6.1551642, 4.1276875, 24.129848, -6.334398, 2.7400944, 23.713541, -6.1551642, 4.1276875, 24.129848, -6.1571717, 4.087394, 24.238876, -6.2159896, 2.8219187, 23.420893, -5.9612355, 4.1389728, 24.042906, -6.0775657, 4.150184, 24.04522, -6.2159896, 2.8219187, 23.420893, -6.04308, 2.8031602, 23.417374, -5.9612355, 4.1389728, 24.042906, -6.2506223, 1.3273255, 23.06642, -5.9148564, 2.7549148, 23.524578, -6.04308, 2.8031602, 23.417374, -6.2506223, 1.3273255, 23.06642, -6.1042504, 1.2728562, 23.197392, -5.9148564, 2.7549148, 23.524578, -6.04308, 2.8031602, 23.417374, -5.875483, 4.1052194, 24.1148, -5.9612355, 4.1389728, 24.042906, -6.04308, 2.8031602, 23.417374, -5.9148564, 2.7549148, 23.524578, -5.875483, 4.1052194, 24.1148, -6.589192, 1.3239617, 23.234522, -6.2159896, 2.8219187, 23.420893, -6.3314233, 2.7938638, 23.547709, -6.589192, 1.3239617, 23.234522, -6.45285, 1.3504215, 23.077362, -6.2159896, 2.8219187, 23.420893, -6.971047, -0.29482222, 23.15477, -6.45285, 1.3504215, 23.077362, -6.589192, 1.3239617, 23.234522, -6.971047, -0.29482222, 23.15477, -6.8199706, -0.29774308, 22.974768, -6.45285, 1.3504215, 23.077362, -6.3314233, 2.7938638, 23.547709, -6.0775657, 4.150184, 24.04522, -6.1551642, 4.1276875, 24.129848, -6.3314233, 2.7938638, 23.547709, -6.2159896, 2.8219187, 23.420893, -6.0775657, 4.150184, 24.04522, -6.1551642, 4.1276875, 24.129848, -6.0775657, 4.150184, 24.04522, -6.023566, 4.8536663, 24.431192, -6.1551642, 4.1276875, 24.129848, -6.023566, 4.8536663, 24.431192, -6.082048, 4.828084, 24.48972, -6.020826, 4.7619505, 24.618555, -5.936191, 5.2892733, 24.899128, -5.934734, 4.757289, 24.618954, -6.020826, 4.7619505, 24.618555, -5.999312, 5.2915688, 24.898323, -5.936191, 5.2892733, 24.899128, -5.8760715, 4.7822523, 24.560642, -5.8913436, 5.3461533, 24.805635, -5.8734727, 4.8202696, 24.482874, -5.8760715, 4.7822523, 24.560642, -5.8932214, 5.3139095, 24.859932, -5.8913436, 5.3461533, 24.805635, -5.934734, 4.757289, 24.618954, -5.8932214, 5.3139095, 24.859932, -5.8760715, 4.7822523, 24.560642, -5.934734, 4.757289, 24.618954, -5.936191, 5.2892733, 24.899128, -5.8932214, 5.3139095, 24.859932, -5.9370246, 4.8486996, 24.431229, -6.000772, 5.3705015, 24.767956, -6.023566, 4.8536663, 24.431192, -5.9370246, 4.8486996, 24.431229, -5.937638, 5.3697376, 24.769716, -6.000772, 5.3705015, 24.767956, -5.8734727, 4.8202696, 24.482874, -5.937638, 5.3697376, 24.769716, -5.9370246, 4.8486996, 24.431229, -5.8734727, 4.8202696, 24.482874, -5.8913436, 5.3461533, 24.805635, -5.937638, 5.3697376, 24.769716, -6.082048, 4.828084, 24.48972, -6.0456195, 5.3136215, 24.86145, -6.0841565, 4.790536, 24.567505, -6.082048, 4.828084, 24.48972, -6.0437293, 5.3473988, 24.80811, -6.0456195, 5.3136215, 24.86145, -6.023566, 4.8536663, 24.431192, -6.0437293, 5.3473988, 24.80811, -6.082048, 4.828084, 24.48972, -6.023566, 4.8536663, 24.431192, -6.000772, 5.3705015, 24.767956, -6.0437293, 5.3473988, 24.80811, -6.5591636, -0.41737175, 23.530104, -6.445969, 1.214475, 23.560837, -6.2450395, 1.1910194, 23.5534, -6.5591636, -0.41737175, 23.530104, -6.791864, -0.37708354, 23.536917, -6.445969, 1.214475, 23.560837, -6.0841565, 4.790536, 24.567505, -5.999312, 5.2915688, 24.898323, -6.020826, 4.7619505, 24.618555, -6.0841565, 4.790536, 24.567505, -6.0456195, 5.3136215, 24.86145, -5.999312, 5.2915688, 24.898323, -6.2450395, 1.1910194, 23.5534, -6.206943, 2.6917243, 23.821266, -6.0342355, 2.6733067, 23.816893, -6.2450395, 1.1910194, 23.5534, -6.445969, 1.214475, 23.560837, -6.206943, 2.6917243, 23.821266, -6.791864, -0.37708354, 23.536917, -6.593639, 1.2685848, 23.43337, -6.445969, 1.214475, 23.560837, -6.791864, -0.37708354, 23.536917, -6.9689336, -0.32619548, 23.389013, -6.593639, 1.2685848, 23.43337, -6.8199706, -0.29774308, 22.974768, -6.2506223, 1.3273255, 23.06642, -6.45285, 1.3504215, 23.077362, -6.8199706, -0.29774308, 22.974768, -6.5876184, -0.33810782, 22.968916, -6.2506223, 1.3273255, 23.06642, -6.407615, -0.42018914, 23.34877, -6.2450395, 1.1910194, 23.5534, -6.1098676, 1.2173094, 23.399563, -6.407615, -0.42018914, 23.34877, -6.5591636, -0.41737175, 23.530104, -6.2450395, 1.1910194, 23.5534, -6.9689336, -0.32619548, 23.389013, -6.589192, 1.3239617, 23.234522, -6.593639, 1.2685848, 23.43337, -6.9689336, -0.32619548, 23.389013, -6.971047, -0.29482222, 23.15477, -6.589192, 1.3239617, 23.234522, -6.5876184, -0.33810782, 22.968916, -6.1042504, 1.2728562, 23.197392, -6.2506223, 1.3273255, 23.06642, -6.5876184, -0.33810782, 22.968916, -6.4102006, -0.38891935, 23.115858, -6.1042504, 1.2728562, 23.197392, -6.0342355, 2.6733067, 23.816893, -6.071984, 4.053143, 24.309086, -5.9568696, 4.0428257, 24.307844, -6.0342355, 2.6733067, 23.816893, -6.206943, 2.6917243, 23.821266, -6.071984, 4.053143, 24.309086, -5.9568696, 4.0428257, 24.307844, -6.020826, 4.7619505, 24.618555, -5.934734, 4.757289, 24.618954, -5.9568696, 4.0428257, 24.307844, -6.071984, 4.053143, 24.309086, -6.020826, 4.7619505, 24.618555, -6.071984, 4.053143, 24.309086, -6.0841565, 4.790536, 24.567505, -6.020826, 4.7619505, 24.618555, -6.071984, 4.053143, 24.309086, -6.1571717, 4.087394, 24.238876, -6.0841565, 4.790536, 24.567505, -5.878671, 4.066166, 24.22505, -5.934734, 4.757289, 24.618954, -5.8760715, 4.7822523, 24.560642, -5.878671, 4.066166, 24.22505, -5.9568696, 4.0428257, 24.307844, -5.934734, 4.757289, 24.618954, -6.0775657, 4.150184, 24.04522, -5.9370246, 4.8486996, 24.431229, -6.023566, 4.8536663, 24.431192, -6.0775657, 4.150184, 24.04522, -5.9612355, 4.1389728, 24.042906, -5.9370246, 4.8486996, 24.431229, -5.9612355, 4.1389728, 24.042906, -5.8734727, 4.8202696, 24.482874, -5.9370246, 4.8486996, 24.431229, -5.9612355, 4.1389728, 24.042906, -5.875483, 4.1052194, 24.1148, -5.8734727, 4.8202696, 24.482874, -6.1571717, 4.087394, 24.238876, -6.082048, 4.828084, 24.48972, -6.0841565, 4.790536, 24.567505, -6.1571717, 4.087394, 24.238876, -6.1551642, 4.1276875, 24.129848, -6.082048, 4.828084, 24.48972, -7.3456454, 4.1475077, 21.98113, -7.7547154, 4.0165606, 21.935587, -7.73344, 4.0729046, 21.883982, -7.3456454, 4.1475077, 21.98113, -7.39551, 3.8681917, 22.222395, -7.7547154, 4.0165606, 21.935587, -7.2885756, 4.023938, 21.648745, -7.4439178, 4.086134, 21.816298, -7.4376407, 4.0358357, 21.702383, -7.2885756, 4.023938, 21.648745, -7.3456454, 4.1475077, 21.98113, -7.4439178, 4.086134, 21.816298, -5.835222, 3.136388, 22.094479, -6.143434, 3.5016217, 22.14021, -6.182443, 3.446207, 21.86201, -5.835222, 3.136388, 22.094479, -5.831487, 3.134635, 22.146042, -6.143434, 3.5016217, 22.14021, -6.143434, 3.5016217, 22.14021, -6.276529, 3.5192416, 21.814625, -6.182443, 3.446207, 21.86201, -6.143434, 3.5016217, 22.14021, -6.311259, 3.6133804, 21.96652, -6.276529, 3.5192416, 21.814625, -6.311259, 3.6133804, 21.96652, -6.143434, 3.5016217, 22.14021, -6.488027, 3.838162, 22.121197, -6.311259, 3.6133804, 21.96652, -6.488027, 3.838162, 22.121197, -6.5290217, 3.7089415, 21.687683, -6.311259, 3.6133804, 21.96652, -6.5290217, 3.7089415, 21.687683, -6.3611083, 3.5839481, 21.772032, -6.5290217, 3.7089415, 21.687683, -6.61853, 3.8050375, 21.778206, -6.5801196, 3.7298079, 21.680998, -6.5290217, 3.7089415, 21.687683, -6.488027, 3.838162, 22.121197, -6.61853, 3.8050375, 21.778206, -6.895559, 3.9183722, 21.635805, -7.089803, 4.029269, 21.773304, -6.996865, 3.9430032, 21.63935, -6.895559, 3.9183722, 21.635805, -6.936025, 4.07687, 22.060637, -7.089803, 4.029269, 21.773304, -5.852432, 3.11117, 22.186768, -6.143434, 3.5016217, 22.14021, -5.831487, 3.134635, 22.146042, -6.143434, 3.5016217, 22.14021, -5.852432, 3.11117, 22.186768, -6.0435195, 3.2870784, 22.199028, -6.0435195, 3.2870784, 22.199028, -5.852432, 3.11117, 22.186768, -6.0259957, 3.1908565, 22.246626, -6.143434, 3.5016217, 22.14021, -6.4199605, 3.5414572, 22.270983, -6.488027, 3.838162, 22.121197, -6.143434, 3.5016217, 22.14021, -6.316384, 3.4395418, 22.283651, -6.4199605, 3.5414572, 22.270983, -6.6648736, 3.5251694, 22.411572, -6.936025, 4.07687, 22.060637, -6.488027, 3.838162, 22.121197, -6.936025, 4.07687, 22.060637, -6.6648736, 3.5251694, 22.411572, -6.8574367, 3.616784, 22.385473, -6.936025, 4.07687, 22.060637, -6.8574367, 3.616784, 22.385473, -6.8897033, 3.7860932, 22.274248, -7.1705127, 3.995197, 22.128761, -7.3456454, 4.1475077, 21.98113, -6.936025, 4.07687, 22.060637, -7.3456454, 4.1475077, 21.98113, -7.1705127, 3.995197, 22.128761, -7.311005, 3.8388238, 22.254168, -7.3456454, 4.1475077, 21.98113, -7.311005, 3.8388238, 22.254168, -7.39551, 3.8681917, 22.222395, -6.936025, 4.07687, 22.060637, -6.61853, 3.8050375, 21.778206, -6.488027, 3.838162, 22.121197, -6.808315, 3.9616337, 21.892696, -6.61853, 3.8050375, 21.778206, -6.936025, 4.07687, 22.060637, -6.61853, 3.8050375, 21.778206, -6.808315, 3.9616337, 21.892696, -6.754091, 3.8023548, 21.658047, -6.61853, 3.8050375, 21.778206, -6.754091, 3.8023548, 21.658047, -6.667336, 3.7712486, 21.66921, -6.936025, 4.07687, 22.060637, -6.8002677, 3.871698, 21.648817, -6.808315, 3.9616337, 21.892696, -6.936025, 4.07687, 22.060637, -6.895559, 3.9183722, 21.635805, -6.8002677, 3.871698, 21.648817, -6.8897033, 3.7860932, 22.274248, -7.0301766, 3.7129135, 22.36113, -6.936025, 4.07687, 22.060637, -6.8897033, 3.7860932, 22.274248, -6.94754, 3.6726983, 22.372395, -7.0301766, 3.7129135, 22.36113, -7.3456454, 4.1475077, 21.98113, -7.089803, 4.029269, 21.773304, -6.936025, 4.07687, 22.060637, -7.089803, 4.029269, 21.773304, -7.3456454, 4.1475077, 21.98113, -7.2885756, 4.023938, 21.648745, -7.089803, 4.029269, 21.773304, -7.2885756, 4.023938, 21.648745, -7.145592, 3.9925408, 21.643513, -7.1705127, 3.995197, 22.128761, -7.0301766, 3.7129135, 22.36113, -7.250442, 3.7801287, 22.278788, -7.1705127, 3.995197, 22.128761, -6.936025, 4.07687, 22.060637, -7.0301766, 3.7129135, 22.36113, -7.73344, 4.0729046, 21.883982, -7.4439178, 4.086134, 21.816298, -7.3456454, 4.1475077, 21.98113, -7.4439178, 4.086134, 21.816298, -7.73344, 4.0729046, 21.883982, -7.730845, 4.0477705, 21.8088, -7.4439178, 4.086134, 21.816298, -7.730845, 4.0477705, 21.8088, -7.537543, 4.047288, 21.737965, -6.4199605, 3.5414572, 22.270983, -6.6648736, 3.5251694, 22.411572, -6.488027, 3.838162, 22.121197, -6.4199605, 3.5414572, 22.270983, -6.5177665, 3.4538927, 22.380463, -6.6648736, 3.5251694, 22.411572, -6.316384, 3.4395418, 22.283651, -6.4231963, 3.3844132, 22.362364, -6.4199605, 3.5414572, 22.270983, -6.316384, 3.4395418, 22.283651, -6.372542, 3.369453, 22.350878, -6.4231963, 3.3844132, 22.362364, -6.316384, 3.4395418, 22.283651, -6.143434, 3.5016217, 22.14021, -6.269735, 3.3225741, 22.32892, -6.0435195, 3.2870784, 22.199028, -6.269735, 3.3225741, 22.32892, -6.143434, 3.5016217, 22.14021, -6.0435195, 3.2870784, 22.199028, -6.1135287, 3.244587, 22.275616, -6.269735, 3.3225741, 22.32892, -8.006098, 4.0689516, 22.13492, -7.6670833, 4.0418825, 21.783504, -7.640471, 4.0882125, 21.854998, -8.006098, 4.0689516, 22.13492, -8.1642685, 3.8312206, 21.842627, -7.6670833, 4.0418825, 21.783504, -7.756726, 3.8452916, 22.38111, -7.7926917, 3.9996805, 22.145943, -7.6962695, 3.9147148, 22.219965, -7.756726, 3.8452916, 22.38111, -8.006098, 4.0689516, 22.13492, -7.7926917, 3.9996805, 22.145943, -9.112757, 2.5434918, 23.142544, -8.955492, 3.0269203, 22.925161, -8.686771, 2.9242716, 23.071201, -9.112757, 2.5434918, 23.142544, -9.159386, 2.5504227, 23.109524, -8.955492, 3.0269203, 22.925161, -8.955492, 3.0269203, 22.925161, -8.584085, 3.0207791, 23.038433, -8.686771, 2.9242716, 23.071201, -8.955492, 3.0269203, 22.925161, -8.695301, 3.1616163, 22.923185, -8.584085, 3.0207791, 23.038433, -8.695301, 3.1616163, 22.923185, -8.955492, 3.0269203, 22.925161, -8.715704, 3.4878736, 22.713732, -8.695301, 3.1616163, 22.923185, -8.715704, 3.4878736, 22.713732, -8.307899, 3.2759342, 22.950727, -8.695301, 3.1616163, 22.923185, -8.307899, 3.2759342, 22.950727, -8.491686, 3.1070724, 23.009012, -8.307899, 3.2759342, 22.950727, -8.328896, 3.4248629, 22.82755, -8.266613, 3.3116674, 22.91728, -8.307899, 3.2759342, 22.950727, -8.715704, 3.4878736, 22.713732, -8.328896, 3.4248629, 22.82755, -8.018351, 3.603071, 22.708073, -8.005375, 3.8135586, 22.46657, -7.9505553, 3.661367, 22.623951, -8.018351, 3.603071, 22.708073, -8.361177, 3.876412, 22.41829, -8.005375, 3.8135586, 22.46657, -9.178247, 2.5394235, 23.05604, -8.955492, 3.0269203, 22.925161, -9.159386, 2.5504227, 23.109524, -8.955492, 3.0269203, 22.925161, -9.178247, 2.5394235, 23.05604, -9.064192, 2.7795045, 22.919472, -9.064192, 2.7795045, 22.919472, -9.178247, 2.5394235, 23.05604, -9.110924, 2.6796026, 22.880608, -8.955492, 3.0269203, 22.925161, -8.875946, 3.1743643, 22.591955, -8.715704, 3.4878736, 22.713732, -8.955492, 3.0269203, 22.925161, -8.9538765, 3.0363877, 22.650652, -8.875946, 3.1743643, 22.591955, -8.822695, 3.2558434, 22.270594, -8.361177, 3.876412, 22.41829, -8.715704, 3.4878736, 22.713732, -8.361177, 3.876412, 22.41829, -8.822695, 3.2558434, 22.270594, -8.668564, 3.40597, 22.14398, -8.361177, 3.876412, 22.41829, -8.668564, 3.40597, 22.14398, -8.56176, 3.58513, 22.231379, -8.250622, 3.8801494, 22.13827, -8.006098, 4.0689516, 22.13492, -8.361177, 3.876412, 22.41829, -8.006098, 4.0689516, 22.13492, -8.250622, 3.8801494, 22.13827, -8.250301, 3.7793045, 21.885279, -8.006098, 4.0689516, 22.13492, -8.250301, 3.7793045, 21.885279, -8.1642685, 3.8312206, 21.842627, -8.361177, 3.876412, 22.41829, -8.328896, 3.4248629, 22.82755, -8.715704, 3.4878736, 22.713732, -8.302567, 3.6759555, 22.615335, -8.328896, 3.4248629, 22.82755, -8.361177, 3.876412, 22.41829, -8.328896, 3.4248629, 22.82755, -8.302567, 3.6759555, 22.615335, -8.126291, 3.4355674, 22.803347, -8.328896, 3.4248629, 22.82755, -8.126291, 3.4355674, 22.803347, -8.196812, 3.379901, 22.85993, -8.361177, 3.876412, 22.41829, -8.094337, 3.5251052, 22.770916, -8.302567, 3.6759555, 22.615335, -8.361177, 3.876412, 22.41829, -8.018351, 3.603071, 22.708073, -8.094337, 3.5251052, 22.770916, -8.56176, 3.58513, 22.231379, -8.532204, 3.5644715, 22.029161, -8.361177, 3.876412, 22.41829, -8.56176, 3.58513, 22.231379, -8.598177, 3.497055, 22.083708, -8.532204, 3.5644715, 22.029161, -8.006098, 4.0689516, 22.13492, -8.005375, 3.8135586, 22.46657, -8.361177, 3.876412, 22.41829, -8.005375, 3.8135586, 22.46657, -8.006098, 4.0689516, 22.13492, -7.756726, 3.8452916, 22.38111, -8.005375, 3.8135586, 22.46657, -7.756726, 3.8452916, 22.38111, -7.852491, 3.7639642, 22.499866, -8.250622, 3.8801494, 22.13827, -8.532204, 3.5644715, 22.029161, -8.306704, 3.6845965, 21.918798, -8.250622, 3.8801494, 22.13827, -8.361177, 3.876412, 22.41829, -8.532204, 3.5644715, 22.029161, -7.640471, 4.0882125, 21.854998, -7.7926917, 3.9996805, 22.145943, -8.006098, 4.0689516, 22.13492, -7.7926917, 3.9996805, 22.145943, -7.640471, 4.0882125, 21.854998, -7.576958, 4.04729, 21.902573, -7.7926917, 3.9996805, 22.145943, -7.576958, 4.04729, 21.902573, -7.6565347, 3.9742813, 22.111242, -8.875946, 3.1743643, 22.591955, -8.822695, 3.2558434, 22.270594, -8.715704, 3.4878736, 22.713732, -8.875946, 3.1743643, 22.591955, -8.895857, 3.1287508, 22.405542, -8.822695, 3.2558434, 22.270594, -8.9538765, 3.0363877, 22.650652, -8.940609, 3.017987, 22.493166, -8.875946, 3.1743643, 22.591955, -8.9538765, 3.0363877, 22.650652, -8.9667015, 2.9863772, 22.539291, -8.940609, 3.017987, 22.493166, -8.9538765, 3.0363877, 22.650652, -8.955492, 3.0269203, 22.925161, -9.018259, 2.9038734, 22.63329, -9.064192, 2.7795045, 22.919472, -9.018259, 2.9038734, 22.63329, -8.955492, 3.0269203, 22.925161, -9.064192, 2.7795045, 22.919472, -9.078123, 2.7668862, 22.79162, -9.018259, 2.9038734, 22.63329, -8.007105, 4.2432814, 21.79742, -7.6102357, 3.9935734, 21.830496, -7.6156516, 4.0593348, 21.890636, -8.007105, 4.2432814, 21.79742, -8.03323, 3.9421675, 21.519663, -7.6102357, 3.9935734, 21.830496, -8.098074, 4.0979156, 22.171206, -7.9227233, 4.142306, 21.975924, -7.9388556, 4.0766134, 22.104975, -8.098074, 4.0979156, 22.171206, -8.007105, 4.2432814, 21.79742, -7.9227233, 4.142306, 21.975924, -9.771751, 3.535802, 21.75793, -9.379068, 3.8438268, 21.68758, -9.350674, 3.7584422, 21.997433, -9.771751, 3.535802, 21.75793, -9.776064, 3.537459, 21.700321, -9.379068, 3.8438268, 21.68758, -9.379068, 3.8438268, 21.68758, -9.238958, 3.8097954, 22.04487, -9.350674, 3.7584422, 21.997433, -9.379068, 3.8438268, 21.68758, -9.184797, 3.91052, 21.871664, -9.238958, 3.8097954, 22.04487, -9.184797, 3.91052, 21.871664, -9.379068, 3.8438268, 21.68758, -8.955339, 4.1180353, 21.68752, -9.184797, 3.91052, 21.871664, -8.955339, 4.1180353, 21.68752, -8.938385, 3.9436283, 22.172657, -9.184797, 3.91052, 21.871664, -8.938385, 3.9436283, 22.172657, -9.138344, 3.8554869, 22.087576, -8.938385, 3.9436283, 22.172657, -8.830858, 4.0307946, 22.063833, -8.879677, 3.9519649, 22.17815, -8.938385, 3.9436283, 22.172657, -8.955339, 4.1180353, 21.68752, -8.830858, 4.0307946, 22.063833, -8.525064, 4.0757513, 22.206758, -8.3042145, 4.1594357, 22.040773, -8.414618, 4.077264, 22.197893, -8.525064, 4.0757513, 22.206758, -8.445869, 4.2673163, 21.729216, -8.3042145, 4.1594357, 22.040773, -9.761192, 3.5089111, 21.653206, -9.379068, 3.8438268, 21.68758, -9.776064, 3.537459, 21.700321, -9.379068, 3.8438268, 21.68758, -9.761192, 3.5089111, 21.653206, -9.529911, 3.6422298, 21.627573, -9.529911, 3.6422298, 21.627573, -9.761192, 3.5089111, 21.653206, -9.567165, 3.544581, 21.576538, -9.379068, 3.8438268, 21.68758, -9.097656, 3.8193562, 21.5222, -8.955339, 4.1180353, 21.68752, -9.379068, 3.8438268, 21.68758, -9.2248955, 3.7364876, 21.514492, -9.097656, 3.8193562, 21.5222, -8.856268, 3.7445884, 21.349636, -8.445869, 4.2673163, 21.729216, -8.955339, 4.1180353, 21.68752, -8.445869, 4.2673163, 21.729216, -8.856268, 3.7445884, 21.349636, -8.63674, 3.7917051, 21.369219, -8.445869, 4.2673163, 21.729216, -8.63674, 3.7917051, 21.369219, -8.568174, 3.9699275, 21.489882, -8.232094, 4.130494, 21.637142, -8.007105, 4.2432814, 21.79742, -8.445869, 4.2673163, 21.729216, -8.007105, 4.2432814, 21.79742, -8.232094, 4.130494, 21.637142, -8.128689, 3.9327025, 21.48767, -8.007105, 4.2432814, 21.79742, -8.128689, 3.9327025, 21.48767, -8.03323, 3.9421675, 21.519663, -8.445869, 4.2673163, 21.729216, -8.830858, 4.0307946, 22.063833, -8.955339, 4.1180353, 21.68752, -8.606184, 4.161176, 21.922972, -8.830858, 4.0307946, 22.063833, -8.445869, 4.2673163, 21.729216, -8.830858, 4.0307946, 22.063833, -8.606184, 4.161176, 21.922972, -8.680071, 3.982471, 22.196703, -8.830858, 4.0307946, 22.063833, -8.680071, 3.982471, 22.196703, -8.7803135, 3.9735296, 22.187021, -8.445869, 4.2673163, 21.729216, -8.633348, 4.0487413, 22.19735, -8.606184, 4.161176, 21.922972, -8.445869, 4.2673163, 21.729216, -8.525064, 4.0757513, 22.206758, -8.633348, 4.0487413, 22.19735, -8.568174, 3.9699275, 21.489882, -8.441978, 3.8581774, 21.385015, -8.445869, 4.2673163, 21.729216, -8.568174, 3.9699275, 21.489882, -8.53607, 3.8349931, 21.376839, -8.441978, 3.8581774, 21.385015, -8.007105, 4.2432814, 21.79742, -8.3042145, 4.1594357, 22.040773, -8.445869, 4.2673163, 21.729216, -8.3042145, 4.1594357, 22.040773, -8.007105, 4.2432814, 21.79742, -8.098074, 4.0979156, 22.171206, -8.3042145, 4.1594357, 22.040773, -8.098074, 4.0979156, 22.171206, -8.254183, 4.096847, 22.18368, -8.232094, 4.130494, 21.637142, -8.441978, 3.8581774, 21.385015, -8.191664, 3.867425, 21.469576, -8.232094, 4.130494, 21.637142, -8.445869, 4.2673163, 21.729216, -8.441978, 3.8581774, 21.385015, -7.6156516, 4.0593348, 21.890636, -7.9227233, 4.142306, 21.975924, -8.007105, 4.2432814, 21.79742, -7.9227233, 4.142306, 21.975924, -7.6156516, 4.0593348, 21.890636, -7.62472, 4.0303593, 21.974613, -7.9227233, 4.142306, 21.975924, -7.62472, 4.0303593, 21.974613, -7.833011, 4.0754824, 22.059702, -9.097656, 3.8193562, 21.5222, -8.856268, 3.7445884, 21.349636, -8.955339, 4.1180353, 21.68752, -9.097656, 3.8193562, 21.5222, -9.020979, 3.7032843, 21.39327, -8.856268, 3.7445884, 21.349636, -9.2248955, 3.7364876, 21.514492, -9.123741, 3.6469016, 21.423038, -9.097656, 3.8193562, 21.5222, -9.2248955, 3.7364876, 21.514492, -9.181778, 3.6451564, 21.437378, -9.123741, 3.6469016, 21.423038, -9.2248955, 3.7364876, 21.514492, -9.379068, 3.8438268, 21.68758, -9.29739, 3.622695, 21.467472, -9.529911, 3.6422298, 21.627573, -9.29739, 3.622695, 21.467472, -9.379068, 3.8438268, 21.68758, -9.529911, 3.6422298, 21.627573, -9.471037, 3.5795534, 21.537083, -9.29739, 3.622695, 21.467472, -7.801645, 4.134115, 21.58577, -7.6006274, 4.02651, 21.917599, -7.6581864, 4.072356, 21.931242, -7.801645, 4.134115, 21.58577, -7.559606, 3.912532, 21.485746, -7.6006274, 4.02651, 21.917599, -8.072794, 3.9650502, 21.715675, -7.866752, 4.057515, 21.744825, -7.952191, 3.99135, 21.80066, -8.072794, 3.9650502, 21.715675, -7.801645, 4.134115, 21.58577, -7.866752, 4.057515, 21.744825, -8.445419, 3.1368337, 20.389019, -8.276415, 3.4964035, 20.596956, -8.461891, 3.4085104, 20.773108, -8.445419, 3.1368337, 20.389019, -8.407898, 3.1417727, 20.358862, -8.276415, 3.4964035, 20.596956, -8.276415, 3.4964035, 20.596956, -8.453417, 3.4740689, 20.868896, -8.461891, 3.4085104, 20.773108, -8.276415, 3.4964035, 20.596956, -8.327274, 3.583331, 20.814444, -8.453417, 3.4740689, 20.868896, -8.327274, 3.583331, 20.814444, -8.276415, 3.4964035, 20.596956, -8.134125, 3.821342, 20.866423, -8.327274, 3.583331, 20.814444, -8.134125, 3.821342, 20.866423, -8.4303055, 3.644507, 21.12673, -8.327274, 3.583331, 20.814444, -8.4303055, 3.644507, 21.12673, -8.445759, 3.5321927, 20.955154, -8.4303055, 3.644507, 21.12673, -8.320477, 3.7492816, 21.144423, -8.409815, 3.665008, 21.169518, -8.4303055, 3.644507, 21.12673, -8.134125, 3.821342, 20.866423, -8.320477, 3.7492816, 21.144423, -8.287462, 3.8450718, 21.426939, -8.086512, 3.9769306, 21.499489, -8.231916, 3.8731332, 21.501694, -8.287462, 3.8450718, 21.426939, -7.9577355, 4.0573144, 21.235031, -8.086512, 3.9769306, 21.499489, -8.362757, 3.127033, 20.352093, -8.276415, 3.4964035, 20.596956, -8.407898, 3.1417727, 20.358862, -8.276415, 3.4964035, 20.596956, -8.362757, 3.127033, 20.352093, -8.265045, 3.3001463, 20.48862, -8.265045, 3.3001463, 20.48862, -8.362757, 3.127033, 20.352093, -8.229216, 3.2149067, 20.450375, -8.276415, 3.4964035, 20.596956, -8.026518, 3.5625966, 20.730312, -8.134125, 3.821342, 20.866423, -8.276415, 3.4964035, 20.596956, -8.06389, 3.4651048, 20.64575, -8.026518, 3.5625966, 20.730312, -7.781936, 3.5772128, 20.836325, -7.9577355, 4.0573144, 21.235031, -8.134125, 3.821342, 20.866423, -7.9577355, 4.0573144, 21.235031, -7.781936, 3.5772128, 20.836325, -7.705567, 3.6661596, 20.99604, -7.9577355, 4.0573144, 21.235031, -7.705567, 3.6661596, 20.99604, -7.7892184, 3.8130858, 21.079828, -7.7676377, 4.0055275, 21.369812, -7.801645, 4.134115, 21.58577, -7.9577355, 4.0573144, 21.235031, -7.801645, 4.134115, 21.58577, -7.7676377, 4.0055275, 21.369812, -7.5783267, 3.8855352, 21.404331, -7.801645, 4.134115, 21.58577, -7.5783267, 3.8855352, 21.404331, -7.559606, 3.912532, 21.485746, -7.9577355, 4.0573144, 21.235031, -8.320477, 3.7492816, 21.144423, -8.134125, 3.821342, 20.866423, -8.143465, 3.9182801, 21.225508, -8.320477, 3.7492816, 21.144423, -7.9577355, 4.0573144, 21.235031, -8.320477, 3.7492816, 21.144423, -8.143465, 3.9182801, 21.225508, -8.340118, 3.7362518, 21.314922, -8.320477, 3.7492816, 21.144423, -8.340118, 3.7362518, 21.314922, -8.375259, 3.7055726, 21.241833, -7.9577355, 4.0573144, 21.235031, -8.325062, 3.7988772, 21.348167, -8.143465, 3.9182801, 21.225508, -7.9577355, 4.0573144, 21.235031, -8.287462, 3.8450718, 21.426939, -8.325062, 3.7988772, 21.348167, -7.7892184, 3.8130858, 21.079828, -7.6383195, 3.7634745, 21.137505, -7.9577355, 4.0573144, 21.235031, -7.7892184, 3.8130858, 21.079828, -7.6709933, 3.7234988, 21.069057, -7.6383195, 3.7634745, 21.137505, -7.801645, 4.134115, 21.58577, -8.086512, 3.9769306, 21.499489, -7.9577355, 4.0573144, 21.235031, -8.086512, 3.9769306, 21.499489, -7.801645, 4.134115, 21.58577, -8.072794, 3.9650502, 21.715675, -8.086512, 3.9769306, 21.499489, -8.072794, 3.9650502, 21.715675, -8.151386, 3.9267366, 21.61004, -7.7676377, 4.0055275, 21.369812, -7.6383195, 3.7634745, 21.137505, -7.588919, 3.823454, 21.350895, -7.7676377, 4.0055275, 21.369812, -7.9577355, 4.0573144, 21.235031, -7.6383195, 3.7634745, 21.137505, -7.6581864, 4.072356, 21.931242, -7.866752, 4.057515, 21.744825, -7.801645, 4.134115, 21.58577, -7.866752, 4.057515, 21.744825, -7.6581864, 4.072356, 21.931242, -7.71435, 4.039794, 21.968426, -7.866752, 4.057515, 21.744825, -7.71435, 4.039794, 21.968426, -7.87205, 4.018237, 21.856892, -8.026518, 3.5625966, 20.730312, -7.781936, 3.5772128, 20.836325, -8.134125, 3.821342, 20.866423, -8.026518, 3.5625966, 20.730312, -7.8797107, 3.5000882, 20.74282, -7.781936, 3.5772128, 20.836325, -8.06389, 3.4651048, 20.64575, -7.94037, 3.4260588, 20.685284, -8.026518, 3.5625966, 20.730312, -8.06389, 3.4651048, 20.64575, -7.975001, 3.40911, 20.652027, -7.94037, 3.4260588, 20.685284, -8.06389, 3.4651048, 20.64575, -8.276415, 3.4964035, 20.596956, -8.0436325, 3.3592296, 20.586334, -8.265045, 3.3001463, 20.48862, -8.0436325, 3.3592296, 20.586334, -8.276415, 3.4964035, 20.596956, -8.265045, 3.3001463, 20.48862, -8.163176, 3.2732167, 20.498547, -8.0436325, 3.3592296, 20.586334, -7.402509, 4.1859736, 21.63811, -7.6918817, 4.041251, 21.991617, -7.7346835, 4.0696325, 21.918596, -7.402509, 4.1859736, 21.63811, -7.1659408, 4.0452685, 21.938877, -7.6918817, 4.041251, 21.991617, -7.544909, 3.8685284, 21.406876, -7.563997, 4.036748, 21.631306, -7.6227355, 3.9156742, 21.563887, -7.544909, 3.8685284, 21.406876, -7.402509, 4.1859736, 21.63811, -7.563997, 4.036748, 21.631306, -5.9238067, 3.1665137, 20.728191, -6.2251096, 3.5616388, 20.915148, -6.4278474, 3.3525786, 20.777048, -5.9238067, 3.1665137, 20.728191, -5.8848615, 3.193083, 20.760527, -6.2251096, 3.5616388, 20.915148, -6.2251096, 3.5616388, 20.915148, -6.5504594, 3.402594, 20.803858, -6.4278474, 3.3525786, 20.777048, -6.2251096, 3.5616388, 20.915148, -6.4983582, 3.5830135, 20.909115, -6.5504594, 3.402594, 20.803858, -6.4983582, 3.5830135, 20.909115, -6.2251096, 3.5616388, 20.915148, -6.5891337, 3.903202, 21.097126, -6.4983582, 3.5830135, 20.909115, -6.5891337, 3.903202, 21.097126, -6.879663, 3.532806, 20.876286, -6.4983582, 3.5830135, 20.909115, -6.879663, 3.532806, 20.876286, -6.6607127, 3.447071, 20.828083, -6.879663, 3.532806, 20.876286, -6.9066834, 3.6857386, 20.988258, -6.9293284, 3.5507002, 20.90792, -6.879663, 3.532806, 20.876286, -6.5891337, 3.903202, 21.097126, -6.9066834, 3.6857386, 20.988258, -7.2366023, 3.7330508, 21.09622, -7.3143077, 3.9347124, 21.32243, -7.315949, 3.763792, 21.176712, -7.2366023, 3.7330508, 21.09622, -7.02702, 4.1361513, 21.366934, -7.3143077, 3.9347124, 21.32243, -5.862766, 3.1931438, 20.813963, -6.2251096, 3.5616388, 20.915148, -5.8848615, 3.193083, 20.760527, -6.2251096, 3.5616388, 20.915148, -5.862766, 3.1931438, 20.813963, -6.043155, 3.376487, 20.935175, -6.043155, 3.376487, 20.935175, -5.862766, 3.1931438, 20.813963, -5.9688907, 3.3041463, 20.98022, -6.2251096, 3.5616388, 20.915148, -6.3340783, 3.6836305, 21.23523, -6.5891337, 3.903202, 21.097126, -6.2251096, 3.5616388, 20.915148, -6.2198997, 3.5840178, 21.185366, -6.3340783, 3.6836305, 21.23523, -6.400766, 3.7538157, 21.548512, -7.02702, 4.1361513, 21.366934, -6.5891337, 3.903202, 21.097126, -7.02702, 4.1361513, 21.366934, -6.400766, 3.7538157, 21.548512, -6.588054, 3.8369021, 21.666204, -7.02702, 4.1361513, 21.366934, -6.588054, 3.8369021, 21.666204, -6.7412972, 3.9567418, 21.567703, -7.1137557, 4.110402, 21.642786, -7.402509, 4.1859736, 21.63811, -7.02702, 4.1361513, 21.366934, -7.402509, 4.1859736, 21.63811, -7.1137557, 4.110402, 21.642786, -7.0714173, 4.029825, 21.898872, -7.402509, 4.1859736, 21.63811, -7.0714173, 4.029825, 21.898872, -7.1659408, 4.0452685, 21.938877, -7.02702, 4.1361513, 21.366934, -6.9066834, 3.6857386, 20.988258, -6.5891337, 3.903202, 21.097126, -7.0096154, 3.9184318, 21.182732, -6.9066834, 3.6857386, 20.988258, -7.02702, 4.1361513, 21.366934, -6.9066834, 3.6857386, 20.988258, -7.0096154, 3.9184318, 21.182732, -7.098456, 3.6138377, 21.015465, -6.9066834, 3.6857386, 20.988258, -7.098456, 3.6138377, 21.015465, -7.014134, 3.5885832, 20.961206, -7.02702, 4.1361513, 21.366934, -7.1437945, 3.6882315, 21.038242, -7.0096154, 3.9184318, 21.182732, -7.02702, 4.1361513, 21.366934, -7.2366023, 3.7330508, 21.09622, -7.1437945, 3.6882315, 21.038242, -6.7412972, 3.9567418, 21.567703, -6.756685, 3.9355235, 21.769691, -7.02702, 4.1361513, 21.366934, -6.7412972, 3.9567418, 21.567703, -6.6761546, 3.8968792, 21.71939, -6.756685, 3.9355235, 21.769691, -7.402509, 4.1859736, 21.63811, -7.3143077, 3.9347124, 21.32243, -7.02702, 4.1361513, 21.366934, -7.3143077, 3.9347124, 21.32243, -7.402509, 4.1859736, 21.63811, -7.544909, 3.8685284, 21.406876, -7.3143077, 3.9347124, 21.32243, -7.544909, 3.8685284, 21.406876, -7.432817, 3.8261418, 21.293098, -7.1137557, 4.110402, 21.642786, -6.756685, 3.9355235, 21.769691, -7.002805, 3.9603796, 21.87517, -7.1137557, 4.110402, 21.642786, -7.02702, 4.1361513, 21.366934, -6.756685, 3.9355235, 21.769691, -7.7346835, 4.0696325, 21.918596, -7.563997, 4.036748, 21.631306, -7.402509, 4.1859736, 21.63811, -7.563997, 4.036748, 21.631306, -7.7346835, 4.0696325, 21.918596, -7.775924, 4.0044317, 21.873682, -7.563997, 4.036748, 21.631306, -7.775924, 4.0044317, 21.873682, -7.6754994, 3.960377, 21.667994, -6.3340783, 3.6836305, 21.23523, -6.400766, 3.7538157, 21.548512, -6.5891337, 3.903202, 21.097126, -6.3340783, 3.6836305, 21.23523, -6.2958436, 3.6586976, 21.422325, -6.400766, 3.7538157, 21.548512, -6.2198997, 3.5840178, 21.185366, -6.2276845, 3.568183, 21.344408, -6.3340783, 3.6836305, 21.23523, -6.2198997, 3.5840178, 21.185366, -6.1918397, 3.5477042, 21.29962, -6.2276845, 3.568183, 21.344408, -6.2198997, 3.5840178, 21.185366, -6.2251096, 3.5616388, 20.915148, -6.1187816, 3.4875863, 21.210886, -6.043155, 3.376487, 20.935175, -6.1187816, 3.4875863, 21.210886, -6.2251096, 3.5616388, 20.915148, -6.043155, 3.376487, 20.935175, -6.0228896, 3.3768027, 21.062256, -6.1187816, 3.4875863, 21.210886, -7.5309367, 4.1860266, 22.233109, -7.7731357, 4.049283, 21.837759, -7.686767, 4.0676775, 21.824697, -7.5309367, 4.1860266, 22.233109, -7.90918, 4.0913115, 22.343561, -7.7731357, 4.049283, 21.837759, -7.2945504, 3.8389473, 22.203506, -7.4850507, 4.0242515, 22.093157, -7.4099345, 3.8931296, 22.069782, -7.2945504, 3.8389473, 22.203506, -7.5309367, 4.1860266, 22.233109, -7.4850507, 4.0242515, 22.093157, -7.231361, 3.2090497, 23.990551, -7.2794967, 3.594735, 23.623615, -7.099934, 3.3586783, 23.498016, -7.231361, 3.2090497, 23.990551, -7.2722163, 3.2413416, 24.013079, -7.2794967, 3.594735, 23.623615, -7.2794967, 3.594735, 23.623615, -7.0818753, 3.401124, 23.37233, -7.099934, 3.3586783, 23.498016, -7.2794967, 3.594735, 23.623615, -7.1849923, 3.5940344, 23.37246, -7.0818753, 3.401124, 23.37233, -7.1849923, 3.5940344, 23.37246, -7.2794967, 3.594735, 23.623615, -7.3083177, 3.9218946, 23.202938, -7.1849923, 3.5940344, 23.37246, -7.3083177, 3.9218946, 23.202938, -7.0331464, 3.5110173, 23.034817, -7.1849923, 3.5940344, 23.37246, -7.0331464, 3.5110173, 23.034817, -7.0656457, 3.4388018, 23.25929, -7.0331464, 3.5110173, 23.034817, -7.121306, 3.6710267, 22.96056, -7.043958, 3.527542, 22.976107, -7.0331464, 3.5110173, 23.034817, -7.3083177, 3.9218946, 23.202938, -7.121306, 3.6710267, 22.96056, -7.113857, 3.7015529, 22.612543, -7.287684, 3.915894, 22.445786, -7.160318, 3.7328143, 22.507229, -7.113857, 3.7015529, 22.612543, -7.4040046, 4.1427026, 22.68545, -7.287684, 3.915894, 22.445786, -7.3301635, 3.2478483, 24.013186, -7.2794967, 3.594735, 23.623615, -7.2722163, 3.2413416, 24.013079, -7.2794967, 3.594735, 23.623615, -7.3301635, 3.2478483, 24.013186, -7.371898, 3.4266107, 23.792282, -7.371898, 3.4266107, 23.792282, -7.3301635, 3.2478483, 24.013186, -7.442037, 3.3642597, 23.847004, -7.2794967, 3.594735, 23.623615, -7.540323, 3.735655, 23.39579, -7.3083177, 3.9218946, 23.202938, -7.2794967, 3.594735, 23.623615, -7.5373693, 3.641142, 23.524654, -7.540323, 3.735655, 23.39579, -7.8095174, 3.8275523, 23.211908, -7.4040046, 4.1427026, 22.68545, -7.3083177, 3.9218946, 23.202938, -7.4040046, 4.1427026, 22.68545, -7.8095174, 3.8275523, 23.211908, -7.8509803, 3.9055398, 22.990408, -7.4040046, 4.1427026, 22.68545, -7.8509803, 3.9055398, 22.990408, -7.703343, 4.004422, 22.88101, -7.6422763, 4.1345253, 22.501507, -7.5309367, 4.1860266, 22.233109, -7.4040046, 4.1427026, 22.68545, -7.5309367, 4.1860266, 22.233109, -7.6422763, 4.1345253, 22.501507, -7.905112, 4.080037, 22.446768, -7.5309367, 4.1860266, 22.233109, -7.905112, 4.080037, 22.446768, -7.90918, 4.0913115, 22.343561, -7.4040046, 4.1427026, 22.68545, -7.121306, 3.6710267, 22.96056, -7.3083177, 3.9218946, 23.202938, -7.255689, 3.9115663, 22.781116, -7.121306, 3.6710267, 22.96056, -7.4040046, 4.1427026, 22.68545, -7.121306, 3.6710267, 22.96056, -7.255689, 3.9115663, 22.781116, -7.080893, 3.5860498, 22.77619, -7.121306, 3.6710267, 22.96056, -7.080893, 3.5860498, 22.77619, -7.062715, 3.563114, 22.87582, -7.4040046, 4.1427026, 22.68545, -7.0931907, 3.6592827, 22.722273, -7.255689, 3.9115663, 22.781116, -7.4040046, 4.1427026, 22.68545, -7.113857, 3.7015529, 22.612543, -7.0931907, 3.6592827, 22.722273, -7.703343, 4.004422, 22.88101, -7.8892875, 3.9995782, 22.79086, -7.4040046, 4.1427026, 22.68545, -7.703343, 4.004422, 22.88101, -7.8713326, 3.9631367, 22.88616, -7.8892875, 3.9995782, 22.79086, -7.5309367, 4.1860266, 22.233109, -7.287684, 3.915894, 22.445786, -7.4040046, 4.1427026, 22.68545, -7.287684, 3.915894, 22.445786, -7.5309367, 4.1860266, 22.233109, -7.2945504, 3.8389473, 22.203506, -7.287684, 3.915894, 22.445786, -7.2945504, 3.8389473, 22.203506, -7.2290454, 3.7958574, 22.35221, -7.6422763, 4.1345253, 22.501507, -7.8892875, 3.9995782, 22.79086, -7.8991284, 4.0135202, 22.522274, -7.6422763, 4.1345253, 22.501507, -7.4040046, 4.1427026, 22.68545, -7.8892875, 3.9995782, 22.79086, -7.686767, 4.0676775, 21.824697, -7.4850507, 4.0242515, 22.093157, -7.5309367, 4.1860266, 22.233109, -7.4850507, 4.0242515, 22.093157, -7.686767, 4.0676775, 21.824697, -7.63722, 3.9957073, 21.806574, -7.4850507, 4.0242515, 22.093157, -7.63722, 3.9957073, 21.806574, -7.487868, 3.9425092, 21.979464, -7.540323, 3.735655, 23.39579, -7.8095174, 3.8275523, 23.211908, -7.3083177, 3.9218946, 23.202938, -7.540323, 3.735655, 23.39579, -7.7316575, 3.7301946, 23.361069, -7.8095174, 3.8275523, 23.211908, -7.5373693, 3.641142, 23.524654, -7.680619, 3.6382384, 23.457644, -7.540323, 3.735655, 23.39579, -7.5373693, 3.641142, 23.524654, -7.6541924, 3.6169612, 23.508732, -7.680619, 3.6382384, 23.457644, -7.5373693, 3.641142, 23.524654, -7.2794967, 3.594735, 23.623615, -7.599995, 3.5552611, 23.612686, -7.371898, 3.4266107, 23.792282, -7.599995, 3.5552611, 23.612686, -7.2794967, 3.594735, 23.623615, -7.371898, 3.4266107, 23.792282, -7.4989257, 3.4396398, 23.762728, -7.599995, 3.5552611, 23.612686, -6.9064727, 0.8870442, 21.944698, -7.0634227, 1.9859911, 21.955528, -6.983601, 1.9958726, 21.857681, -6.9064727, 0.8870442, 21.944698, -7.0050845, 0.88108003, 22.061377, -7.0634227, 1.9859911, 21.955528, -7.007685, -0.32457638, 22.15034, -7.0050845, 0.88108003, 22.061377, -6.9064727, 0.8870442, 21.944698, -7.007685, -0.32457638, 22.15034, -7.116863, -0.30735517, 22.281223, -7.0050845, 0.88108003, 22.061377, -7.2671094, 0.85050464, 21.996153, -7.3045907, 1.9478768, 21.77239, -7.284966, 1.9531578, 21.8974, -7.2671094, 0.85050464, 21.996153, -7.288546, 0.84261394, 21.850367, -7.3045907, 1.9478768, 21.77239, -7.0425286, 0.86357975, 21.707298, -7.003896, 1.9904655, 21.73263, -7.101132, 1.9756031, 21.652607, -7.0425286, 0.86357975, 21.707298, -6.925528, 0.87903726, 21.79757, -7.003896, 1.9904655, 21.73263, -7.284966, 1.9531578, 21.8974, -7.4806666, 2.9942842, 21.815382, -7.466662, 2.9961905, 21.89844, -7.284966, 1.9531578, 21.8974, -7.3045907, 1.9478768, 21.77239, -7.4806666, 2.9942842, 21.815382, -6.983601, 1.9958726, 21.857681, -7.320312, 3.0230846, 21.937897, -7.2666173, 3.0324101, 21.872292, -6.983601, 1.9958726, 21.857681, -7.0634227, 1.9859911, 21.955528, -7.320312, 3.0230846, 21.937897, -7.2666173, 3.0324101, 21.872292, -7.320312, 3.0230846, 21.937897, -7.4912467, 3.573497, 21.949327, -7.2666173, 3.0324101, 21.872292, -7.4912467, 3.573497, 21.949327, -7.453357, 3.5873647, 21.900778, -7.0050845, 0.88108003, 22.061377, -7.1874385, 1.968081, 21.976803, -7.0634227, 1.9859911, 21.955528, -7.0050845, 0.88108003, 22.061377, -7.15249, 0.8660785, 22.087767, -7.1874385, 1.968081, 21.976803, -7.0634227, 1.9859911, 21.955528, -7.1874385, 1.968081, 21.976803, -7.40249, 3.0077667, 21.95179, -7.0634227, 1.9859911, 21.955528, -7.40249, 3.0077667, 21.95179, -7.320312, 3.0230846, 21.937897, -7.288546, 0.84261394, 21.850367, -7.2247424, 1.9581697, 21.674047, -7.3045907, 1.9478768, 21.77239, -7.288546, 0.84261394, 21.850367, -7.192162, 0.8488163, 21.734951, -7.2247424, 1.9581697, 21.674047, -7.3045907, 1.9478768, 21.77239, -7.2247424, 1.9581697, 21.674047, -7.428226, 3.0044737, 21.749603, -7.3045907, 1.9478768, 21.77239, -7.428226, 3.0044737, 21.749603, -7.4806666, 2.9942842, 21.815382, -7.101132, 1.9756031, 21.652607, -7.2801204, 3.029789, 21.78821, -7.345489, 3.018808, 21.73467, -7.101132, 1.9756031, 21.652607, -7.003896, 1.9904655, 21.73263, -7.2801204, 3.029789, 21.78821, -6.925528, 0.87903726, 21.79757, -6.983601, 1.9958726, 21.857681, -7.003896, 1.9904655, 21.73263, -6.925528, 0.87903726, 21.79757, -6.9064727, 0.8870442, 21.944698, -6.983601, 1.9958726, 21.857681, -7.003896, 1.9904655, 21.73263, -7.2666173, 3.0324101, 21.872292, -7.2801204, 3.029789, 21.78821, -7.003896, 1.9904655, 21.73263, -6.983601, 1.9958726, 21.857681, -7.2666173, 3.0324101, 21.872292, -7.192162, 0.8488163, 21.734951, -7.101132, 1.9756031, 21.652607, -7.2247424, 1.9581697, 21.674047, -7.192162, 0.8488163, 21.734951, -7.0425286, 0.86357975, 21.707298, -7.101132, 1.9756031, 21.652607, -7.3367667, -0.3452804, 21.89752, -7.0425286, 0.86357975, 21.707298, -7.192162, 0.8488163, 21.734951, -7.3367667, -0.3452804, 21.89752, -7.1676164, -0.3521583, 21.871283, -7.0425286, 0.86357975, 21.707298, -7.2247424, 1.9581697, 21.674047, -7.345489, 3.018808, 21.73467, -7.428226, 3.0044737, 21.749603, -7.2247424, 1.9581697, 21.674047, -7.101132, 1.9756031, 21.652607, -7.345489, 3.018808, 21.73467, -7.428226, 3.0044737, 21.749603, -7.345489, 3.018808, 21.73467, -7.5119376, 3.577262, 21.798561, -7.428226, 3.0044737, 21.749603, -7.5119376, 3.577262, 21.798561, -7.5716386, 3.5596325, 21.809055, -7.5982623, 3.5452437, 21.919594, -7.6945357, 3.969666, 21.982683, -7.5509553, 3.5562305, 21.959482, -7.5982623, 3.5452437, 21.919594, -7.7289567, 3.960751, 21.953426, -7.6945357, 3.969666, 21.982683, -7.4912467, 3.573497, 21.949327, -7.6261945, 4.0009108, 21.940428, -7.453357, 3.5873647, 21.900778, -7.4912467, 3.573497, 21.949327, -7.6525865, 3.9872801, 21.975618, -7.6261945, 4.0009108, 21.940428, -7.5509553, 3.5562305, 21.959482, -7.6525865, 3.9872801, 21.975618, -7.4912467, 3.573497, 21.949327, -7.5509553, 3.5562305, 21.959482, -7.6945357, 3.969666, 21.982683, -7.6525865, 3.9872801, 21.975618, -7.4642043, 3.588051, 21.838531, -7.668904, 3.9935448, 21.865906, -7.5119376, 3.577262, 21.798561, -7.4642043, 3.588051, 21.838531, -7.634957, 4.0036774, 21.895311, -7.668904, 3.9935448, 21.865906, -7.453357, 3.5873647, 21.900778, -7.634957, 4.0036774, 21.895311, -7.4642043, 3.588051, 21.838531, -7.453357, 3.5873647, 21.900778, -7.6261945, 4.0009108, 21.940428, -7.634957, 4.0036774, 21.895311, -7.5716386, 3.5596325, 21.809055, -7.737245, 3.9623003, 21.908161, -7.6092744, 3.5461726, 21.857725, -7.5716386, 3.5596325, 21.809055, -7.711328, 3.9771495, 21.873121, -7.737245, 3.9623003, 21.908161, -7.5119376, 3.577262, 21.798561, -7.711328, 3.9771495, 21.873121, -7.5716386, 3.5596325, 21.809055, -7.5119376, 3.577262, 21.798561, -7.668904, 3.9935448, 21.865906, -7.711328, 3.9771495, 21.873121, -7.2869067, -0.3004067, 22.307976, -7.2671094, 0.85050464, 21.996153, -7.15249, 0.8660785, 22.087767, -7.2869067, -0.3004067, 22.307976, -7.4190135, -0.30967426, 22.197882, -7.2671094, 0.85050464, 21.996153, -7.6092744, 3.5461726, 21.857725, -7.7289567, 3.960751, 21.953426, -7.5982623, 3.5452437, 21.919594, -7.6092744, 3.5461726, 21.857725, -7.737245, 3.9623003, 21.908161, -7.7289567, 3.960751, 21.953426, -7.15249, 0.8660785, 22.087767, -7.284966, 1.9531578, 21.8974, -7.1874385, 1.968081, 21.976803, -7.15249, 0.8660785, 22.087767, -7.2671094, 0.85050464, 21.996153, -7.284966, 1.9531578, 21.8974, -7.4190135, -0.30967426, 22.197882, -7.288546, 0.84261394, 21.850367, -7.2671094, 0.85050464, 21.996153, -7.4190135, -0.30967426, 22.197882, -7.446838, -0.32798862, 22.028917, -7.288546, 0.84261394, 21.850367, -7.1676164, -0.3521583, 21.871283, -6.925528, 0.87903726, 21.79757, -7.0425286, 0.86357975, 21.707298, -7.1676164, -0.3521583, 21.871283, -7.036158, -0.3428421, 21.981743, -6.925528, 0.87903726, 21.79757, -7.116863, -0.30735517, 22.281223, -7.15249, 0.8660785, 22.087767, -7.0050845, 0.88108003, 22.061377, -7.116863, -0.30735517, 22.281223, -7.2869067, -0.3004067, 22.307976, -7.15249, 0.8660785, 22.087767, -7.446838, -0.32798862, 22.028917, -7.192162, 0.8488163, 21.734951, -7.288546, 0.84261394, 21.850367, -7.446838, -0.32798862, 22.028917, -7.3367667, -0.3452804, 21.89752, -7.192162, 0.8488163, 21.734951, -7.036158, -0.3428421, 21.981743, -6.9064727, 0.8870442, 21.944698, -6.925528, 0.87903726, 21.79757, -7.036158, -0.3428421, 21.981743, -7.007685, -0.32457638, 22.15034, -6.9064727, 0.8870442, 21.944698, -7.1874385, 1.968081, 21.976803, -7.466662, 2.9961905, 21.89844, -7.40249, 3.0077667, 21.95179, -7.1874385, 1.968081, 21.976803, -7.284966, 1.9531578, 21.8974, -7.466662, 2.9961905, 21.89844, -7.40249, 3.0077667, 21.95179, -7.5982623, 3.5452437, 21.919594, -7.5509553, 3.5562305, 21.959482, -7.40249, 3.0077667, 21.95179, -7.466662, 2.9961905, 21.89844, -7.5982623, 3.5452437, 21.919594, -7.466662, 2.9961905, 21.89844, -7.6092744, 3.5461726, 21.857725, -7.5982623, 3.5452437, 21.919594, -7.466662, 2.9961905, 21.89844, -7.4806666, 2.9942842, 21.815382, -7.6092744, 3.5461726, 21.857725, -7.320312, 3.0230846, 21.937897, -7.5509553, 3.5562305, 21.959482, -7.4912467, 3.573497, 21.949327, -7.320312, 3.0230846, 21.937897, -7.40249, 3.0077667, 21.95179, -7.5509553, 3.5562305, 21.959482, -7.345489, 3.018808, 21.73467, -7.4642043, 3.588051, 21.838531, -7.5119376, 3.577262, 21.798561, -7.345489, 3.018808, 21.73467, -7.2801204, 3.029789, 21.78821, -7.4642043, 3.588051, 21.838531, -7.2801204, 3.029789, 21.78821, -7.453357, 3.5873647, 21.900778, -7.4642043, 3.588051, 21.838531, -7.2801204, 3.029789, 21.78821, -7.2666173, 3.0324101, 21.872292, -7.453357, 3.5873647, 21.900778, -7.4806666, 2.9942842, 21.815382, -7.5716386, 3.5596325, 21.809055, -7.6092744, 3.5461726, 21.857725, -7.4806666, 2.9942842, 21.815382, -7.428226, 3.0044737, 21.749603, -7.5716386, 3.5596325, 21.809055, -25.120148, 13.783545, 12.764626, -26.397978, 13.369994, 12.574373, -26.33375, 13.5643215, 12.432411, -25.120148, 13.783545, 12.764626, -25.263885, 12.827821, 13.423475, -26.397978, 13.369994, 12.574373, -24.933325, 13.512459, 11.685724, -25.424961, 13.642609, 12.2283325, -25.402243, 13.524235, 11.855768, -24.933325, 13.512459, 11.685724, -25.120148, 13.783545, 12.764626, -25.424961, 13.642609, 12.2283325, -20.327318, 10.662638, 12.792898, -21.313543, 11.772419, 13.055622, -21.432056, 11.691162, 12.167927, -20.327318, 10.662638, 12.792898, -20.315731, 10.639986, 12.953346, -21.313543, 11.772419, 13.055622, -21.313543, 11.772419, 13.055622, -21.73093, 11.930523, 12.043638, -21.432056, 11.691162, 12.167927, -21.313543, 11.772419, 13.055622, -21.845343, 12.171588, 12.549276, -21.73093, 11.930523, 12.043638, -21.845343, 12.171588, 12.549276, -21.313543, 11.772419, 13.055622, -22.412296, 12.812631, 13.106188, -21.845343, 12.171588, 12.549276, -22.412296, 12.812631, 13.106188, -22.532686, 12.553142, 11.708666, -21.845343, 12.171588, 12.549276, -22.532686, 12.553142, 11.708666, -21.999557, 12.142736, 11.931597, -22.532686, 12.553142, 11.708666, -22.81894, 12.8182955, 12.022795, -22.69415, 12.618034, 11.694317, -22.532686, 12.553142, 11.708666, -22.412296, 12.812631, 13.106188, -22.81894, 12.8182955, 12.022795, -23.693872, 13.206497, 11.613611, -24.30996, 13.49691, 12.078384, -24.013233, 13.277237, 11.631985, -23.693872, 13.206497, 11.613611, -23.830704, 13.556321, 12.993084, -24.30996, 13.49691, 12.078384, -20.380512, 10.551989, 13.072411, -21.313543, 11.772419, 13.055622, -20.315731, 10.639986, 12.953346, -21.313543, 11.772419, 13.055622, -20.380512, 10.551989, 13.072411, -20.98937, 11.087692, 13.168047, -20.98937, 11.087692, 13.168047, -20.380512, 10.551989, 13.072411, -20.92976, 10.772113, 13.284454, -21.313543, 11.772419, 13.055622, -22.184439, 11.839201, 13.474684, -22.412296, 12.812631, 13.106188, -21.313543, 11.772419, 13.055622, -21.854174, 11.521826, 13.480944, -22.184439, 11.839201, 13.474684, -22.953316, 11.729006, 13.905809, -23.830704, 13.556321, 12.993084, -22.412296, 12.812631, 13.106188, -23.830704, 13.556321, 12.993084, -22.953316, 11.729006, 13.905809, -23.56244, 12.014381, 13.853283, -23.830704, 13.556321, 12.993084, -23.56244, 12.014381, 13.853283, -23.671707, 12.578844, 13.562656, -24.563269, 13.266899, 13.176035, -25.120148, 13.783545, 12.764626, -23.830704, 13.556321, 12.993084, -25.120148, 13.783545, 12.764626, -24.563269, 13.266899, 13.176035, -24.997204, 12.729578, 13.513615, -25.120148, 13.783545, 12.764626, -24.997204, 12.729578, 13.513615, -25.263885, 12.827821, 13.423475, -23.830704, 13.556321, 12.993084, -22.81894, 12.8182955, 12.022795, -22.412296, 12.812631, 13.106188, -23.423197, 13.259348, 12.431152, -22.81894, 12.8182955, 12.022795, -23.830704, 13.556321, 12.993084, -22.81894, 12.8182955, 12.022795, -23.423197, 13.259348, 12.431152, -23.243961, 12.84373, 11.64538, -22.81894, 12.8182955, 12.022795, -23.243961, 12.84373, 11.64538, -22.970037, 12.747108, 11.67061, -23.830704, 13.556321, 12.993084, -23.392378, 13.061067, 11.639456, -23.423197, 13.259348, 12.431152, -23.830704, 13.556321, 12.993084, -23.693872, 13.206497, 11.613611, -23.392378, 13.061067, 11.639456, -23.671707, 12.578844, 13.562656, -24.109556, 12.314231, 13.807953, -23.830704, 13.556321, 12.993084, -23.671707, 12.578844, 13.562656, -23.848108, 12.188936, 13.830387, -24.109556, 12.314231, 13.807953, -25.120148, 13.783545, 12.764626, -24.30996, 13.49691, 12.078384, -23.830704, 13.556321, 12.993084, -24.30996, 13.49691, 12.078384, -25.120148, 13.783545, 12.764626, -24.933325, 13.512459, 11.685724, -24.30996, 13.49691, 12.078384, -24.933325, 13.512459, 11.685724, -24.482748, 13.423203, 11.660212, -24.563269, 13.266899, 13.176035, -24.109556, 12.314231, 13.807953, -24.80421, 12.541008, 13.571323, -24.563269, 13.266899, 13.176035, -23.830704, 13.556321, 12.993084, -24.109556, 12.314231, 13.807953, -26.33375, 13.5643215, 12.432411, -25.424961, 13.642609, 12.2283325, -25.120148, 13.783545, 12.764626, -25.424961, 13.642609, 12.2283325, -26.33375, 13.5643215, 12.432411, -26.324017, 13.5112915, 12.189222, -25.424961, 13.642609, 12.2283325, -26.324017, 13.5112915, 12.189222, -25.71668, 13.54311, 11.969755, -22.184439, 11.839201, 13.474684, -22.953316, 11.729006, 13.905809, -22.412296, 12.812631, 13.106188, -22.184439, 11.839201, 13.474684, -22.487688, 11.524162, 13.78611, -22.953316, 11.729006, 13.905809, -21.854174, 11.521826, 13.480944, -22.187183, 11.317971, 13.70713, -22.184439, 11.839201, 13.474684, -21.854174, 11.521826, 13.480944, -22.027325, 11.277615, 13.666721, -22.187183, 11.317971, 13.70713, -21.854174, 11.521826, 13.480944, -21.313543, 11.772419, 13.055622, -21.702065, 11.143689, 13.583382, -20.98937, 11.087692, 13.168047, -21.702065, 11.143689, 13.583382, -21.313543, 11.772419, 13.055622, -20.98937, 11.087692, 13.168047, -21.207434, 10.925812, 13.392204, -21.702065, 11.143689, 13.583382, -27.190845, 13.454124, 13.211977, -26.123392, 13.504549, 12.108877, -26.042444, 13.6264305, 12.347961, -27.190845, 13.454124, 13.211977, -27.674408, 12.802565, 12.217752, -26.123392, 13.504549, 12.108877, -26.397722, 12.685178, 13.907841, -26.517313, 13.244606, 13.225155, -26.210627, 12.959142, 13.428625, -26.397722, 12.685178, 13.907841, -27.190845, 13.454124, 13.211977, -26.517313, 13.244606, 13.225155, -30.59442, 8.298002, 15.834078, -30.123693, 9.8882065, 15.319544, -29.275402, 9.5317335, 15.74361, -30.59442, 8.298002, 15.834078, -30.741045, 8.328472, 15.732853, -30.123693, 9.8882065, 15.319544, -30.123693, 9.8882065, 15.319544, -28.95761, 9.849106, 15.67477, -29.275402, 9.5317335, 15.74361, -30.123693, 9.8882065, 15.319544, -29.313347, 10.32216, 15.361237, -28.95761, 9.849106, 15.67477, -29.313347, 10.32216, 15.361237, -30.123693, 9.8882065, 15.319544, -29.39274, 11.410282, 14.816835, -29.313347, 10.32216, 15.361237, -29.39274, 11.410282, 14.816835, -28.10266, 10.688791, 15.489471, -29.313347, 10.32216, 15.361237, -28.10266, 10.688791, 15.489471, -28.671627, 10.132956, 15.612846, -28.10266, 10.688791, 15.489471, -28.17546, 11.1942005, 15.154776, -27.974642, 10.813639, 15.397457, -28.10266, 10.688791, 15.489471, -29.39274, 11.410282, 14.816835, -28.17546, 11.1942005, 15.154776, -27.208647, 11.806034, 14.844706, -27.177315, 12.54514, 14.161594, -26.99829, 12.019685, 14.60232, -27.208647, 11.806034, 14.844706, -28.297514, 12.740184, 14.028536, -27.177315, 12.54514, 14.161594, -30.79949, 8.3112135, 15.561966, -30.123693, 9.8882065, 15.319544, -30.741045, 8.328472, 15.732853, -30.123693, 9.8882065, 15.319544, -30.79949, 8.3112135, 15.561966, -30.452688, 9.11234, 15.217451, -30.452688, 9.11234, 15.217451, -30.79949, 8.3112135, 15.561966, -30.594294, 8.811231, 15.062023, -30.123693, 9.8882065, 15.319544, -29.879786, 10.464624, 14.329517, -29.39274, 11.410282, 14.816835, -30.123693, 9.8882065, 15.319544, -30.117891, 10.010266, 14.465597, -29.879786, 10.464624, 14.329517, -29.715208, 10.829817, 13.354015, -28.297514, 12.740184, 14.028536, -29.39274, 11.410282, 14.816835, -28.297514, 12.740184, 14.028536, -29.715208, 10.829817, 13.354015, -29.23813, 11.34871, 13.010698, -28.297514, 12.740184, 14.028536, -29.23813, 11.34871, 13.010698, -28.912056, 11.883873, 13.344931, -27.949308, 12.851552, 13.156515, -27.190845, 13.454124, 13.211977, -28.297514, 12.740184, 14.028536, -27.190845, 13.454124, 13.211977, -27.949308, 12.851552, 13.156515, -27.942167, 12.621899, 12.332624, -27.190845, 13.454124, 13.211977, -27.942167, 12.621899, 12.332624, -27.674408, 12.802565, 12.217752, -28.297514, 12.740184, 14.028536, -28.17546, 11.1942005, 15.154776, -29.39274, 11.410282, 14.816835, -28.104351, 12.050874, 14.57691, -28.17546, 11.1942005, 15.154776, -28.297514, 12.740184, 14.028536, -28.17546, 11.1942005, 15.154776, -28.104351, 12.050874, 14.57691, -27.539679, 11.245704, 15.084768, -28.17546, 11.1942005, 15.154776, -27.539679, 11.245704, 15.084768, -27.758598, 11.0494, 15.242031, -28.297514, 12.740184, 14.028536, -27.44365, 11.537734, 15.013952, -28.104351, 12.050874, 14.57691, -28.297514, 12.740184, 14.028536, -27.208647, 11.806034, 14.844706, -27.44365, 11.537734, 15.013952, -28.912056, 11.883873, 13.344931, -28.817327, 11.888908, 12.70685, -28.297514, 12.740184, 14.028536, -28.912056, 11.883873, 13.344931, -29.021376, 11.656829, 12.85384, -28.817327, 11.888908, 12.70685, -27.190845, 13.454124, 13.211977, -27.177315, 12.54514, 14.161594, -28.297514, 12.740184, 14.028536, -27.177315, 12.54514, 14.161594, -27.190845, 13.454124, 13.211977, -26.397722, 12.685178, 13.907841, -27.177315, 12.54514, 14.161594, -26.397722, 12.685178, 13.907841, -26.694912, 12.386589, 14.250351, -27.949308, 12.851552, 13.156515, -28.817327, 11.888908, 12.70685, -28.11471, 12.312162, 12.404867, -27.949308, 12.851552, 13.156515, -28.297514, 12.740184, 14.028536, -28.817327, 11.888908, 12.70685, -26.042444, 13.6264305, 12.347961, -26.517313, 13.244606, 13.225155, -27.190845, 13.454124, 13.211977, -26.517313, 13.244606, 13.225155, -26.042444, 13.6264305, 12.347961, -25.841175, 13.485764, 12.483356, -26.517313, 13.244606, 13.225155, -25.841175, 13.485764, 12.483356, -26.088339, 13.183667, 13.109575, -29.879786, 10.464624, 14.329517, -29.715208, 10.829817, 13.354015, -29.39274, 11.410282, 14.816835, -29.879786, 10.464624, 14.329517, -29.939215, 10.384001, 13.731905, -29.715208, 10.829817, 13.354015, -30.117891, 10.010266, 14.465597, -30.074621, 10.006492, 13.9677925, -29.879786, 10.464624, 14.329517, -30.117891, 10.010266, 14.465597, -30.15518, 9.890993, 14.100925, -30.074621, 10.006492, 13.9677925, -30.117891, 10.010266, 14.465597, -30.123693, 9.8882065, 15.319544, -30.313383, 9.599236, 14.366161, -30.452688, 9.11234, 15.217451, -30.313383, 9.599236, 14.366161, -30.123693, 9.8882065, 15.319544, -30.452688, 9.11234, 15.217451, -30.495245, 9.115306, 14.813856, -30.313383, 9.599236, 14.366161, -27.201202, 14.111977, 12.216812, -25.942682, 13.340691, 12.239897, -25.963226, 13.52549, 12.449766, -27.201202, 14.111977, 12.216812, -27.26703, 13.264112, 11.247925, -25.942682, 13.340691, 12.239897, -27.481268, 13.527826, 13.334137, -26.931988, 13.740763, 12.7410145, -26.979942, 13.491425, 13.121708, -27.481268, 13.527826, 13.334137, -27.201202, 14.111977, 12.216812, -26.931988, 13.740763, 12.7410145, -32.707096, 11.829945, 11.838261, -31.489027, 12.834562, 11.726076, -31.396978, 12.465054, 12.665121, -32.707096, 11.829945, 11.838261, -32.720463, 11.854302, 11.658894, -31.489027, 12.834562, 11.726076, -31.489027, 12.834562, 11.726076, -31.048937, 12.614889, 12.831612, -31.396978, 12.465054, 12.665121, -31.489027, 12.834562, 11.726076, -30.883116, 12.990331, 12.325209, -31.048937, 12.614889, 12.831612, -30.883116, 12.990331, 12.325209, -31.489027, 12.834562, 11.726076, -30.172102, 13.71146, 11.822292, -30.883116, 12.990331, 12.325209, -30.172102, 13.71146, 11.822292, -30.112314, 13.00444, 13.27858, -30.883116, 12.990331, 12.325209, -30.112314, 13.00444, 13.27858, -30.735453, 12.748096, 12.981314, -30.112314, 13.00444, 13.27858, -29.77852, 13.318491, 12.969162, -29.928392, 13.031496, 13.299112, -30.112314, 13.00444, 13.27858, -30.172102, 13.71146, 11.822292, -29.77852, 13.318491, 12.969162, -28.82114, 13.425723, 13.433544, -28.131073, 13.753705, 12.945568, -28.474356, 13.438845, 13.407442, -28.82114, 13.425723, 13.433544, -28.579897, 14.188468, 12.007677, -28.131073, 13.753705, 12.945568, -32.672134, 11.781767, 11.502314, -31.489027, 12.834562, 11.726076, -32.720463, 11.854302, 11.658894, -31.489027, 12.834562, 11.726076, -32.672134, 11.781767, 11.502314, -31.952402, 12.217968, 11.469395, -31.952402, 12.217968, 11.469395, -32.672134, 11.781767, 11.502314, -32.0643, 11.928456, 11.276808, -31.489027, 12.834562, 11.726076, -30.603403, 12.827642, 11.204182, -30.172102, 13.71146, 11.822292, -31.489027, 12.834562, 11.726076, -30.9988, 12.565276, 11.150988, -30.603403, 12.827642, 11.204182, -29.840925, 12.6641445, 10.642536, -28.579897, 14.188468, 12.007677, -30.172102, 13.71146, 11.822292, -28.579897, 14.188468, 12.007677, -29.840925, 12.6641445, 10.642536, -29.154, 12.815418, 10.721668, -28.579897, 14.188468, 12.007677, -29.154, 12.815418, 10.721668, -28.948093, 13.334579, 11.159084, -27.901386, 13.802778, 11.676207, -27.201202, 14.111977, 12.216812, -28.579897, 14.188468, 12.007677, -27.201202, 14.111977, 12.216812, -27.901386, 13.802778, 11.676207, -27.566175, 13.240652, 11.143919, -27.201202, 14.111977, 12.216812, -27.566175, 13.240652, 11.143919, -27.26703, 13.264112, 11.247925, -28.579897, 14.188468, 12.007677, -29.77852, 13.318491, 12.969162, -30.172102, 13.71146, 11.822292, -29.078878, 13.783996, 12.575394, -29.77852, 13.318491, 12.969162, -28.579897, 14.188468, 12.007677, -29.77852, 13.318491, 12.969162, -29.078878, 13.783996, 12.575394, -29.3032, 13.130279, 13.369244, -29.77852, 13.318491, 12.969162, -29.3032, 13.130279, 13.369244, -29.61749, 13.100707, 13.335033, -28.579897, 14.188468, 12.007677, -29.159786, 13.339252, 13.394022, -29.078878, 13.783996, 12.575394, -28.579897, 14.188468, 12.007677, -28.82114, 13.425723, 13.433544, -29.159786, 13.339252, 13.394022, -28.948093, 13.334579, 11.159084, -28.545794, 13.027181, 10.795259, -28.579897, 14.188468, 12.007677, -28.948093, 13.334579, 11.159084, -28.840069, 12.952937, 10.761011, -28.545794, 13.027181, 10.795259, -27.201202, 14.111977, 12.216812, -28.131073, 13.753705, 12.945568, -28.579897, 14.188468, 12.007677, -28.131073, 13.753705, 12.945568, -27.201202, 14.111977, 12.216812, -27.481268, 13.527826, 13.334137, -28.131073, 13.753705, 12.945568, -27.481268, 13.527826, 13.334137, -27.971476, 13.512636, 13.371208, -27.901386, 13.802778, 11.676207, -28.545794, 13.027181, 10.795259, -27.7606, 13.039855, 11.0648365, -27.901386, 13.802778, 11.676207, -28.579897, 14.188468, 12.007677, -28.545794, 13.027181, 10.795259, -25.963226, 13.52549, 12.449766, -26.931988, 13.740763, 12.7410145, -27.201202, 14.111977, 12.216812, -26.931988, 13.740763, 12.7410145, -25.963226, 13.52549, 12.449766, -25.99063, 13.406307, 12.702139, -26.931988, 13.740763, 12.7410145, -25.99063, 13.406307, 12.702139, -26.647318, 13.508326, 12.980991, -30.603403, 12.827642, 11.204182, -29.840925, 12.6641445, 10.642536, -30.172102, 13.71146, 11.822292, -30.603403, 12.827642, 11.204182, -30.356276, 12.512424, 10.763277, -29.840925, 12.6641445, 10.642536, -30.9988, 12.565276, 11.150988, -30.676294, 12.321331, 10.836258, -30.603403, 12.827642, 11.204182, -30.9988, 12.565276, 11.150988, -30.858511, 12.308209, 10.879881, -30.676294, 12.321331, 10.836258, -30.9988, 12.565276, 11.150988, -31.489027, 12.834562, 11.726076, -31.220568, 12.222282, 10.96516, -31.952402, 12.217968, 11.469395, -31.220568, 12.222282, 10.96516, -31.489027, 12.834562, 11.726076, -31.952402, 12.217968, 11.469395, -31.764006, 12.055641, 11.166313, -31.220568, 12.222282, 10.96516, -26.549658, 13.852484, 11.521194, -25.914532, 13.414665, 12.523054, -26.09762, 13.550388, 12.580524, -26.549658, 13.852484, 11.521194, -25.778147, 13.206228, 11.136642, -25.914532, 13.414665, 12.523054, -27.393269, 13.267618, 11.867287, -26.750992, 13.556589, 11.991425, -27.016235, 13.327029, 12.142666, -27.393269, 13.267618, 11.867287, -26.549658, 13.852484, 11.521194, -26.750992, 13.556589, 11.991425, -28.51631, 11.110254, 7.4424706, -28.004425, 12.171139, 8.214411, -28.58325, 11.828327, 8.733058, -28.51631, 11.110254, 7.4424706, -28.3986, 11.137669, 7.350334, -28.004425, 12.171139, 8.214411, -28.004425, 12.171139, 8.214411, -28.560322, 12.001171, 9.0543, -28.58325, 11.828327, 8.733058, -28.004425, 12.171139, 8.214411, -28.169415, 12.366816, 8.922272, -28.560322, 12.001171, 9.0543, -28.169415, 12.366816, 8.922272, -28.004425, 12.171139, 8.214411, -27.574968, 13.101874, 9.166556, -28.169415, 12.366816, 8.922272, -27.574968, 13.101874, 9.166556, -28.497368, 12.447617, 9.9169655, -28.169415, 12.366816, 8.922272, -28.497368, 12.447617, 9.9169655, -28.539549, 12.153973, 9.343277, -28.497368, 12.447617, 9.9169655, -28.157778, 12.77416, 10.008541, -28.434235, 12.498222, 10.057671, -28.497368, 12.447617, 9.9169655, -27.574968, 13.101874, 9.166556, -28.157778, 12.77416, 10.008541, -28.060122, 12.979725, 10.923248, -27.435986, 13.376825, 11.196117, -27.887424, 13.044889, 11.166651, -28.060122, 12.979725, 10.923248, -27.034447, 13.723143, 10.398659, -27.435986, 13.376825, 11.196117, -28.256086, 11.096142, 7.324676, -28.004425, 12.171139, 8.214411, -28.3986, 11.137669, 7.350334, -28.004425, 12.171139, 8.214411, -28.256086, 11.096142, 7.324676, -27.958471, 11.59544, 7.810196, -27.958471, 11.59544, 7.810196, -28.256086, 11.096142, 7.324676, -27.841549, 11.343948, 7.662429, -28.004425, 12.171139, 8.214411, -27.223587, 12.345152, 8.655518, -27.574968, 13.101874, 9.166556, -28.004425, 12.171139, 8.214411, -27.335718, 12.067413, 8.358295, -27.223587, 12.345152, 8.655518, -26.456749, 12.367084, 8.993832, -27.034447, 13.723143, 10.398659, -27.574968, 13.101874, 9.166556, -27.034447, 13.723143, 10.398659, -26.456749, 12.367084, 8.993832, -26.222069, 12.594754, 9.523212, -27.034447, 13.723143, 10.398659, -26.222069, 12.594754, 9.523212, -26.492432, 13.021158, 9.833479, -26.435522, 13.525401, 10.803925, -26.549658, 13.852484, 11.521194, -27.034447, 13.723143, 10.398659, -26.549658, 13.852484, 11.521194, -26.435522, 13.525401, 10.803925, -25.835228, 13.148436, 10.873161, -26.549658, 13.852484, 11.521194, -25.835228, 13.148436, 10.873161, -25.778147, 13.206228, 11.136642, -27.034447, 13.723143, 10.398659, -28.157778, 12.77416, 10.008541, -27.574968, 13.101874, 9.166556, -27.610704, 13.283167, 10.320328, -28.157778, 12.77416, 10.008541, -27.034447, 13.723143, 10.398659, -28.157778, 12.77416, 10.008541, -27.610704, 13.283167, 10.320328, -28.219557, 12.675113, 10.536343, -28.157778, 12.77416, 10.008541, -28.219557, 12.675113, 10.536343, -28.328056, 12.602215, 10.297457, -27.034447, 13.723143, 10.398659, -28.175543, 12.86018, 10.661373, -27.610704, 13.283167, 10.320328, -27.034447, 13.723143, 10.398659, -28.060122, 12.979725, 10.923248, -28.175543, 12.86018, 10.661373, -26.492432, 13.021158, 9.833479, -26.016369, 12.854247, 9.998339, -27.034447, 13.723143, 10.398659, -26.492432, 13.021158, 9.833479, -26.116678, 12.750883, 9.77084, -26.016369, 12.854247, 9.998339, -26.549658, 13.852484, 11.521194, -27.435986, 13.376825, 11.196117, -27.034447, 13.723143, 10.398659, -27.435986, 13.376825, 11.196117, -26.549658, 13.852484, 11.521194, -27.393269, 13.267618, 11.867287, -27.435986, 13.376825, 11.196117, -27.393269, 13.267618, 11.867287, -27.637686, 13.179714, 11.523783, -26.435522, 13.525401, 10.803925, -26.016369, 12.854247, 9.998339, -25.865164, 12.972085, 10.685308, -26.435522, 13.525401, 10.803925, -27.034447, 13.723143, 10.398659, -26.016369, 12.854247, 9.998339, -26.09762, 13.550388, 12.580524, -26.750992, 13.556589, 11.991425, -26.549658, 13.852484, 11.521194, -26.750992, 13.556589, 11.991425, -26.09762, 13.550388, 12.580524, -26.272526, 13.433453, 12.685123, -26.750992, 13.556589, 11.991425, -26.272526, 13.433453, 12.685123, -26.766165, 13.395969, 12.328079, -27.223587, 12.345152, 8.655518, -26.456749, 12.367084, 8.993832, -27.574968, 13.101874, 9.166556, -27.223587, 12.345152, 8.655518, -26.759527, 12.152982, 8.67496, -26.456749, 12.367084, 8.993832, -27.335718, 12.067413, 8.358295, -26.946072, 11.938253, 8.469797, -27.223587, 12.345152, 8.655518, -27.335718, 12.067413, 8.358295, -27.053827, 11.894838, 8.359913, -26.946072, 11.938253, 8.469797, -27.335718, 12.067413, 8.358295, -28.004425, 12.171139, 8.214411, -27.266567, 11.75786, 8.137337, -27.958471, 11.59544, 7.810196, -27.266567, 11.75786, 8.137337, -28.004425, 12.171139, 8.214411, -27.958471, 11.59544, 7.810196, -27.63729, 11.513017, 7.833111, -27.266567, 11.75786, 8.137337, -25.299118, 14.016339, 11.705952, -26.202145, 13.431294, 12.758247, -26.33764, 13.542391, 12.539379, -25.299118, 14.016339, 11.705952, -24.55057, 13.487381, 12.600025, -26.202145, 13.431294, 12.758247, -25.729456, 13.096121, 10.875708, -25.798758, 13.544817, 11.6329155, -25.976883, 13.186634, 11.381079, -25.729456, 13.096121, 10.875708, -25.299118, 14.016339, 11.705952, -25.798758, 13.544817, 11.6329155, -20.600985, 11.212358, 8.53599, -21.567623, 12.368253, 9.249824, -22.19324, 11.752106, 8.746279, -20.600985, 11.212358, 8.53599, -20.480156, 11.286333, 8.646276, -21.567623, 12.368253, 9.249824, -21.567623, 12.368253, 9.249824, -22.58087, 11.89322, 8.845634, -22.19324, 11.752106, 8.746279, -21.567623, 12.368253, 9.249824, -22.426706, 12.42362, 9.235527, -22.58087, 11.89322, 8.845634, -22.426706, 12.42362, 9.235527, -21.567623, 12.368253, 9.249824, -22.728525, 13.355524, 9.92947, -22.426706, 12.42362, 9.235527, -22.728525, 13.355524, 9.92947, -23.621424, 12.259226, 9.112419, -22.426706, 12.42362, 9.235527, -23.621424, 12.259226, 9.112419, -22.929403, 12.018518, 8.935175, -23.621424, 12.259226, 9.112419, -23.71438, 12.69767, 9.51326, -23.778412, 12.302008, 9.216736, -23.621424, 12.259226, 9.112419, -22.728525, 13.355524, 9.92947, -23.71438, 12.69767, 9.51326, -24.753212, 12.792858, 9.863087, -25.008253, 13.342491, 10.636538, -25.004257, 12.857843, 10.124001, -24.753212, 12.792858, 9.863087, -24.116346, 13.970501, 10.84609, -25.008253, 13.342491, 10.636538, -20.411009, 11.269615, 8.813364, -21.567623, 12.368253, 9.249824, -20.480156, 11.286333, 8.646276, -21.567623, 12.368253, 9.249824, -20.411009, 11.269615, 8.813364, -20.987125, 11.792372, 9.251802, -20.987125, 11.792372, 9.251802, -20.411009, 11.269615, 8.813364, -20.750517, 11.554993, 9.368832, -21.567623, 12.368253, 9.249824, -21.917282, 12.636011, 10.289265, -22.728525, 13.355524, 9.92947, -21.567623, 12.368253, 9.249824, -21.553564, 12.347399, 10.101149, -21.917282, 12.636011, 10.289265, -22.131565, 12.746388, 11.290453, -24.116346, 13.970501, 10.84609, -22.728525, 13.355524, 9.92947, -24.116346, 13.970501, 10.84609, -22.131565, 12.746388, 11.290453, -22.724337, 12.956984, 11.684092, -24.116346, 13.970501, 10.84609, -22.724337, 12.956984, 11.684092, -23.211079, 13.356783, 11.415373, -24.388641, 13.79298, 11.697922, -25.299118, 14.016339, 11.705952, -24.116346, 13.970501, 10.84609, -25.299118, 14.016339, 11.705952, -24.388641, 13.79298, 11.697922, -24.252804, 13.45727, 12.470831, -25.299118, 14.016339, 11.705952, -24.252804, 13.45727, 12.470831, -24.55057, 13.487381, 12.600025, -24.116346, 13.970501, 10.84609, -23.71438, 12.69767, 9.51326, -22.728525, 13.355524, 9.92947, -24.050045, 13.353634, 10.197813, -23.71438, 12.69767, 9.51326, -24.116346, 13.970501, 10.84609, -23.71438, 12.69767, 9.51326, -24.050045, 13.353634, 10.197813, -24.313118, 12.454627, 9.572146, -23.71438, 12.69767, 9.51326, -24.313118, 12.454627, 9.572146, -24.046837, 12.398183, 9.39505, -24.116346, 13.970501, 10.84609, -24.459291, 12.676998, 9.6678705, -24.050045, 13.353634, 10.197813, -24.116346, 13.970501, 10.84609, -24.753212, 12.792858, 9.863087, -24.459291, 12.676998, 9.6678705, -23.211079, 13.356783, 11.415373, -23.25923, 13.221777, 12.038786, -24.116346, 13.970501, 10.84609, -23.211079, 13.356783, 11.415373, -23.004206, 13.122009, 11.869499, -23.25923, 13.221777, 12.038786, -25.299118, 14.016339, 11.705952, -25.008253, 13.342491, 10.636538, -24.116346, 13.970501, 10.84609, -25.008253, 13.342491, 10.636538, -25.299118, 14.016339, 11.705952, -25.729456, 13.096121, 10.875708, -25.008253, 13.342491, 10.636538, -25.729456, 13.096121, 10.875708, -25.374859, 13.007589, 10.507263, -24.388641, 13.79298, 11.697922, -23.25923, 13.221777, 12.038786, -24.033789, 13.251799, 12.374115, -24.388641, 13.79298, 11.697922, -24.116346, 13.970501, 10.84609, -23.25923, 13.221777, 12.038786, -26.33764, 13.542391, 12.539379, -25.798758, 13.544817, 11.6329155, -25.299118, 14.016339, 11.705952, -25.798758, 13.544817, 11.6329155, -26.33764, 13.542391, 12.539379, -26.4637, 13.351927, 12.376793, -25.798758, 13.544817, 11.6329155, -26.4637, 13.351927, 12.376793, -26.145252, 13.288563, 11.72068, -21.917282, 12.636011, 10.289265, -22.131565, 12.746388, 11.290453, -22.728525, 13.355524, 9.92947, -21.917282, 12.636011, 10.289265, -21.7968, 12.497051, 10.865448, -22.131565, 12.746388, 11.290453, -21.553564, 12.347399, 10.101149, -21.57792, 12.244032, 10.592348, -21.917282, 12.636011, 10.289265, -21.553564, 12.347399, 10.101149, -21.464146, 12.196934, 10.445953, -21.57792, 12.244032, 10.592348, -21.553564, 12.347399, 10.101149, -21.567623, 12.368253, 9.249824, -21.231346, 12.042698, 10.149359, -20.987125, 11.792372, 9.251802, -21.231346, 12.042698, 10.149359, -21.567623, 12.368253, 9.249824, -20.987125, 11.792372, 9.251802, -20.92406, 11.751565, 9.648912, -21.231346, 12.042698, 10.149359, -25.705019, 13.809881, 13.562584, -26.45702, 13.504189, 12.279745, -26.186665, 13.570251, 12.245989, -25.705019, 13.809881, 13.562584, -26.888538, 13.45844, 13.87192, -26.45702, 13.504189, 12.279745, -24.945316, 12.747828, 13.355633, -25.55226, 13.354175, 13.0715885, -25.309752, 12.956354, 12.9552, -24.945316, 12.747828, 13.355633, -25.705019, 13.809881, 13.562584, -25.55226, 13.354175, 13.0715885, -24.723381, 10.182662, 18.724218, -24.892126, 11.507984, 17.707823, -24.315966, 10.822086, 17.237934, -24.723381, 10.182662, 18.724218, -24.853382, 10.273891, 18.805033, -24.892126, 11.507984, 17.707823, -24.892126, 11.507984, 17.707823, -24.260817, 10.9978075, 16.859945, -24.315966, 10.822086, 17.237934, -24.892126, 11.507984, 17.707823, -24.594227, 11.594991, 16.92428, -24.260817, 10.9978075, 16.859945, -24.594227, 11.594991, 16.92428, -24.892126, 11.507984, 17.707823, -24.99707, 12.669626, 16.504105, -24.594227, 11.594991, 16.92428, -24.99707, 12.669626, 16.504105, -24.11179, 11.456928, 15.843534, -24.594227, 11.594991, 16.92428, -24.11179, 11.456928, 15.843534, -24.211235, 11.154295, 16.519825, -24.11179, 11.456928, 15.843534, -24.396267, 11.977171, 15.664667, -24.146303, 11.527758, 15.66567, -24.11179, 11.456928, 15.843534, -24.99707, 12.669626, 16.504105, -24.396267, 11.977171, 15.664667, -24.372864, 12.190012, 14.588343, -24.92865, 12.906826, 14.1381035, -24.519852, 12.320793, 14.269573, -24.372864, 12.190012, 14.588343, -25.306261, 13.528545, 14.961657, -24.92865, 12.906826, 14.1381035, -25.035671, 10.291328, 18.806995, -24.892126, 11.507984, 17.707823, -24.853382, 10.273891, 18.805033, -24.892126, 11.507984, 17.707823, -25.035671, 10.291328, 18.806995, -25.174652, 10.921768, 18.176992, -25.174652, 10.921768, 18.176992, -25.035671, 10.291328, 18.806995, -25.392036, 10.70524, 18.326195, -24.892126, 11.507984, 17.707823, -25.717178, 12.011866, 17.041342, -24.99707, 12.669626, 16.504105, -24.892126, 11.507984, 17.707823, -25.703766, 11.673546, 17.411934, -25.717178, 12.011866, 17.041342, -26.566265, 12.347487, 16.495499, -25.306261, 13.528545, 14.961657, -24.99707, 12.669626, 16.504105, -25.306261, 13.528545, 14.961657, -26.566265, 12.347487, 16.495499, -26.699371, 12.663515, 15.829714, -25.306261, 13.528545, 14.961657, -26.699371, 12.663515, 15.829714, -26.24021, 13.016304, 15.522837, -26.053259, 13.553265, 14.382238, -25.705019, 13.809881, 13.562584, -25.306261, 13.528545, 14.961657, -25.705019, 13.809881, 13.562584, -26.053259, 13.553265, 14.382238, -26.875654, 13.388691, 14.190426, -25.705019, 13.809881, 13.562584, -26.875654, 13.388691, 14.190426, -26.888538, 13.45844, 13.87192, -25.306261, 13.528545, 14.961657, -24.396267, 11.977171, 15.664667, -24.99707, 12.669626, 16.504105, -24.82944, 12.781982, 15.184017, -24.396267, 11.977171, 15.664667, -25.306261, 13.528545, 14.961657, -24.396267, 11.977171, 15.664667, -24.82944, 12.781982, 15.184017, -24.26432, 11.775922, 15.060766, -24.396267, 11.977171, 15.664667, -24.26432, 11.775922, 15.060766, -24.206535, 11.67166, 15.364321, -25.306261, 13.528545, 14.961657, -24.306345, 12.02211, 14.9169445, -24.82944, 12.781982, 15.184017, -25.306261, 13.528545, 14.961657, -24.372864, 12.190012, 14.588343, -24.306345, 12.02211, 14.9169445, -26.24021, 13.016304, 15.522837, -26.82347, 13.022417, 15.237913, -25.306261, 13.528545, 14.961657, -26.24021, 13.016304, 15.522837, -26.765692, 12.877438, 15.523392, -26.82347, 13.022417, 15.237913, -25.705019, 13.809881, 13.562584, -24.92865, 12.906826, 14.1381035, -25.306261, 13.528545, 14.961657, -24.92865, 12.906826, 14.1381035, -25.705019, 13.809881, 13.562584, -24.945316, 12.747828, 13.355633, -24.92865, 12.906826, 14.1381035, -24.945316, 12.747828, 13.355633, -24.738127, 12.5664425, 13.806084, -26.053259, 13.553265, 14.382238, -26.82347, 13.022417, 15.237913, -26.853886, 13.155892, 14.403858, -26.053259, 13.553265, 14.382238, -25.306261, 13.528545, 14.961657, -26.82347, 13.022417, 15.237913, -26.186665, 13.570251, 12.245989, -25.55226, 13.354175, 13.0715885, -25.705019, 13.809881, 13.562584, -25.55226, 13.354175, 13.0715885, -26.186665, 13.570251, 12.245989, -26.027418, 13.354084, 12.165661, -25.55226, 13.354175, 13.0715885, -26.027418, 13.354084, 12.165661, -25.556536, 13.13711, 12.689047, -25.717178, 12.011866, 17.041342, -26.566265, 12.347487, 16.495499, -24.99707, 12.669626, 16.504105, -25.717178, 12.011866, 17.041342, -26.317577, 11.997127, 16.929232, -26.566265, 12.347487, 16.495499, -25.703766, 11.673546, 17.411934, -26.153154, 11.680018, 17.200329, -25.717178, 12.011866, 17.041342, -25.703766, 11.673546, 17.411934, -26.069336, 11.597685, 17.352945, -26.153154, 11.680018, 17.200329, -25.703766, 11.673546, 17.411934, -24.892126, 11.507984, 17.707823, -25.896534, 11.372709, 17.657299, -25.174652, 10.921768, 18.176992, -25.896534, 11.372709, 17.657299, -24.892126, 11.507984, 17.707823, -25.174652, 10.921768, 18.176992, -25.57406, 10.966168, 18.087864, -25.896534, 11.372709, 17.657299, -23.578579, 3.6379063, 11.557745, -24.12619, 7.057568, 11.959915, -23.8756, 7.125276, 11.658489, -23.578579, 3.6379063, 11.557745, -23.888453, 3.5751674, 11.919102, -24.12619, 7.057568, 11.959915, -23.836985, -0.21907139, 11.791069, -23.888453, 3.5751674, 11.919102, -23.578579, 3.6379063, 11.557745, -23.836985, -0.21907139, 11.791069, -24.181253, -0.21472502, 12.204487, -23.888453, 3.5751674, 11.919102, -24.709448, 3.4888213, 11.70261, -24.880796, 6.9884076, 11.3729, -24.819984, 6.963768, 11.765211, -24.709448, 3.4888213, 11.70261, -24.77573, 3.5122192, 11.244535, -24.880796, 6.9884076, 11.3729, -24.003609, 3.6379066, 10.807255, -23.93851, 7.1495028, 11.266003, -24.242756, 7.125276, 11.010187, -24.003609, 3.6379066, 10.807255, -23.637373, 3.6615102, 11.095457, -23.93851, 7.1495028, 11.266003, -24.819984, 6.963768, 11.765211, -25.485994, 10.232269, 11.85763, -25.442476, 10.210943, 12.117752, -24.819984, 6.963768, 11.765211, -24.880796, 6.9884076, 11.3729, -25.485994, 10.232269, 11.85763, -23.8756, 7.125276, 11.658489, -24.984426, 10.2888, 12.251429, -24.815989, 10.342636, 12.050236, -23.8756, 7.125276, 11.658489, -24.12619, 7.057568, 11.959915, -24.984426, 10.2888, 12.251429, -24.815989, 10.342636, 12.050236, -24.984426, 10.2888, 12.251429, -25.548643, 11.995004, 12.470713, -24.815989, 10.342636, 12.050236, -25.548643, 11.995004, 12.470713, -25.430141, 12.056503, 12.32415, -23.888453, 3.5751674, 11.919102, -24.514824, 6.9884076, 12.019112, -24.12619, 7.057568, 11.959915, -23.888453, 3.5751674, 11.919102, -24.350702, 3.512219, 11.995026, -24.514824, 6.9884076, 12.019112, -24.12619, 7.057568, 11.959915, -24.514824, 6.9884076, 12.019112, -25.241776, 10.232269, 12.288855, -24.12619, 7.057568, 11.959915, -25.241776, 10.232269, 12.288855, -24.984426, 10.2888, 12.251429, -24.77573, 3.5122192, 11.244535, -24.63014, 7.057568, 11.070068, -24.880796, 6.9884076, 11.3729, -24.77573, 3.5122192, 11.244535, -24.472868, 3.5751677, 10.8871765, -24.63014, 7.057568, 11.070068, -24.880796, 6.9884076, 11.3729, -24.63014, 7.057568, 11.070068, -25.321539, 10.2888, 11.656172, -24.880796, 6.9884076, 11.3729, -25.321539, 10.2888, 11.656172, -25.485994, 10.232269, 11.85763, -24.242756, 7.125276, 11.010187, -24.857891, 10.362101, 11.78668, -25.062378, 10.342636, 11.615177, -24.242756, 7.125276, 11.010187, -23.93851, 7.1495028, 11.266003, -24.857891, 10.362101, 11.78668, -23.637373, 3.6615102, 11.095457, -23.8756, 7.125276, 11.658489, -23.93851, 7.1495028, 11.266003, -23.637373, 3.6615102, 11.095457, -23.578579, 3.6379063, 11.557745, -23.8756, 7.125276, 11.658489, -23.93851, 7.1495028, 11.266003, -24.815989, 10.342636, 12.050236, -24.857891, 10.362101, 11.78668, -23.93851, 7.1495028, 11.266003, -23.8756, 7.125276, 11.658489, -24.815989, 10.342636, 12.050236, -24.472868, 3.5751677, 10.8871765, -24.242756, 7.125276, 11.010187, -24.63014, 7.057568, 11.070068, -24.472868, 3.5751677, 10.8871765, -24.003609, 3.6379066, 10.807255, -24.242756, 7.125276, 11.010187, -24.868216, -0.21472502, 10.9914875, -24.003609, 3.6379066, 10.807255, -24.472868, 3.5751677, 10.8871765, -24.868216, -0.21472502, 10.9914875, -24.336596, -0.21907139, 10.908884, -24.003609, 3.6379066, 10.807255, -24.63014, 7.057568, 11.070068, -25.062378, 10.342636, 11.615177, -25.321539, 10.2888, 11.656172, -24.63014, 7.057568, 11.070068, -24.242756, 7.125276, 11.010187, -25.062378, 10.342636, 11.615177, -25.321539, 10.2888, 11.656172, -25.062378, 10.342636, 11.615177, -25.613142, 12.056503, 12.001019, -25.321539, 10.2888, 11.656172, -25.613142, 12.056503, 12.001019, -25.79978, 11.995004, 12.027269, -25.883152, 11.911559, 12.367321, -26.206875, 13.210678, 12.70623, -25.735323, 11.93475, 12.496033, -25.883152, 11.911559, 12.367321, -26.31439, 13.191008, 12.611546, -26.206875, 13.210678, 12.70623, -25.548643, 11.995004, 12.470713, -25.993643, 13.325804, 12.585468, -25.430141, 12.056503, 12.32415, -25.548643, 11.995004, 12.470713, -26.075993, 13.270106, 12.690508, -25.993643, 13.325804, 12.585468, -25.735323, 11.93475, 12.496033, -26.075993, 13.270106, 12.690508, -25.548643, 11.995004, 12.470713, -25.735323, 11.93475, 12.496033, -26.206875, 13.210678, 12.70623, -26.075993, 13.270106, 12.690508, -25.463963, 12.079072, 12.129919, -26.127062, 13.325804, 12.349884, -25.613142, 12.056503, 12.001019, -25.463963, 12.079072, 12.129919, -26.021097, 13.349201, 12.445444, -26.127062, 13.325804, 12.349884, -25.430141, 12.056503, 12.32415, -26.021097, 13.349201, 12.445444, -25.463963, 12.079072, 12.129919, -25.430141, 12.056503, 12.32415, -25.993643, 13.325804, 12.585468, -26.021097, 13.349201, 12.445444, -25.79978, 11.995004, 12.027269, -26.340294, 13.210678, 12.470644, -25.917505, 11.93475, 12.174345, -25.79978, 11.995004, 12.027269, -26.259499, 13.270106, 12.366484, -26.340294, 13.210678, 12.470644, -25.613142, 12.056503, 12.001019, -26.259499, 13.270106, 12.366484, -25.79978, 11.995004, 12.027269, -25.613142, 12.056503, 12.001019, -26.127062, 13.325804, 12.349884, -26.259499, 13.270106, 12.366484, -24.715683, -0.21037531, 12.288706, -24.709448, 3.4888213, 11.70261, -24.350702, 3.512219, 11.995026, -24.715683, -0.21037531, 12.288706, -25.129576, -0.2087202, 11.940542, -24.709448, 3.4888213, 11.70261, -25.917505, 11.93475, 12.174345, -26.31439, 13.191008, 12.611546, -25.883152, 11.911559, 12.367321, -25.917505, 11.93475, 12.174345, -26.340294, 13.210678, 12.470644, -26.31439, 13.191008, 12.611546, -24.350702, 3.512219, 11.995026, -24.819984, 6.963768, 11.765211, -24.514824, 6.9884076, 12.019112, -24.350702, 3.512219, 11.995026, -24.709448, 3.4888213, 11.70261, -24.819984, 6.963768, 11.765211, -25.129576, -0.2087202, 11.940542, -24.77573, 3.5122192, 11.244535, -24.709448, 3.4888213, 11.70261, -25.129576, -0.2087202, 11.940542, -25.215294, -0.21037531, 11.406523, -24.77573, 3.5122192, 11.244535, -24.336596, -0.21907139, 10.908884, -23.637373, 3.6615102, 11.095457, -24.003609, 3.6379066, 10.807255, -24.336596, -0.21907139, 10.908884, -23.924746, -0.2207303, 11.258205, -23.637373, 3.6615102, 11.095457, -24.181253, -0.21472502, 12.204487, -24.350702, 3.512219, 11.995026, -23.888453, 3.5751674, 11.919102, -24.181253, -0.21472502, 12.204487, -24.715683, -0.21037531, 12.288706, -24.350702, 3.512219, 11.995026, -25.215294, -0.21037531, 11.406523, -24.472868, 3.5751677, 10.8871765, -24.77573, 3.5122192, 11.244535, -25.215294, -0.21037531, 11.406523, -24.868216, -0.21472502, 10.9914875, -24.472868, 3.5751677, 10.8871765, -23.924746, -0.2207303, 11.258205, -23.578579, 3.6379063, 11.557745, -23.637373, 3.6615102, 11.095457, -23.924746, -0.2207303, 11.258205, -23.836985, -0.21907139, 11.791069, -23.578579, 3.6379063, 11.557745, -24.514824, 6.9884076, 12.019112, -25.442476, 10.210943, 12.117752, -25.241776, 10.232269, 12.288855, -24.514824, 6.9884076, 12.019112, -24.819984, 6.963768, 11.765211, -25.442476, 10.210943, 12.117752, -25.241776, 10.232269, 12.288855, -25.883152, 11.911559, 12.367321, -25.735323, 11.93475, 12.496033, -25.241776, 10.232269, 12.288855, -25.442476, 10.210943, 12.117752, -25.883152, 11.911559, 12.367321, -25.442476, 10.210943, 12.117752, -25.917505, 11.93475, 12.174345, -25.883152, 11.911559, 12.367321, -25.442476, 10.210943, 12.117752, -25.485994, 10.232269, 11.85763, -25.917505, 11.93475, 12.174345, -24.984426, 10.2888, 12.251429, -25.735323, 11.93475, 12.496033, -25.548643, 11.995004, 12.470713, -24.984426, 10.2888, 12.251429, -25.241776, 10.232269, 12.288855, -25.735323, 11.93475, 12.496033, -25.062378, 10.342636, 11.615177, -25.463963, 12.079072, 12.129919, -25.613142, 12.056503, 12.001019, -25.062378, 10.342636, 11.615177, -24.857891, 10.362101, 11.78668, -25.463963, 12.079072, 12.129919, -24.857891, 10.362101, 11.78668, -25.430141, 12.056503, 12.32415, -25.463963, 12.079072, 12.129919, -24.857891, 10.362101, 11.78668, -24.815989, 10.342636, 12.050236, -25.430141, 12.056503, 12.32415, -25.485994, 10.232269, 11.85763, -25.79978, 11.995004, 12.027269, -25.917505, 11.93475, 12.174345, -25.485994, 10.232269, 11.85763, -25.321539, 10.2888, 11.656172, -25.79978, 11.995004, 12.027269, 14.960796, 7.3177958, 10.284792, 14.197514, 7.0888658, 10.165964, 14.230383, 7.219601, 10.105017, 14.960796, 7.3177958, 10.284792, 14.899889, 6.6811314, 10.556076, 14.197514, 7.0888658, 10.165964, 15.035656, 7.2923393, 9.619492, 14.762205, 7.297971, 9.966335, 14.763325, 7.2744055, 9.734959, 15.035656, 7.2923393, 9.619492, 14.960796, 7.3177958, 10.284792, 14.762205, 7.297971, 9.966335, 17.810453, 5.5428567, 9.76613, 17.232166, 6.147483, 10.085447, 17.132032, 6.2065306, 9.564142, 17.810453, 5.5428567, 9.76613, 17.822802, 5.5103865, 9.856148, 17.232166, 6.147483, 10.085447, 17.232166, 6.147483, 10.085447, 16.95009, 6.3580484, 9.530783, 17.132032, 6.2065306, 9.564142, 17.232166, 6.147483, 10.085447, 16.89884, 6.4360313, 9.857285, 16.95009, 6.3580484, 9.530783, 16.89884, 6.4360313, 9.857285, 17.232166, 6.147483, 10.085447, 16.58012, 6.736306, 10.276844, 16.89884, 6.4360313, 9.857285, 16.58012, 6.736306, 10.276844, 16.462008, 6.7533646, 9.4380245, 16.89884, 6.4360313, 9.857285, 16.462008, 6.7533646, 9.4380245, 16.786558, 6.492572, 9.500252, 16.462008, 6.7533646, 9.4380245, 16.302326, 6.86697, 9.66189, 16.365639, 6.7913795, 9.442841, 16.462008, 6.7533646, 9.4380245, 16.58012, 6.736306, 10.276844, 16.302326, 6.86697, 9.66189, 15.768839, 7.134306, 9.500018, 15.418615, 7.241414, 9.825178, 15.579935, 7.1703434, 9.529699, 15.768839, 7.134306, 9.500018, 15.7336235, 7.169642, 10.347719, 15.418615, 7.241414, 9.825178, 17.788603, 5.4442396, 9.916714, 17.232166, 6.147483, 10.085447, 17.822802, 5.5103865, 9.856148, 17.232166, 6.147483, 10.085447, 17.788603, 5.4442396, 9.916714, 17.429657, 5.7386765, 10.057089, 17.429657, 5.7386765, 10.057089, 17.788603, 5.4442396, 9.916714, 17.469614, 5.541645, 10.084452, 17.232166, 6.147483, 10.085447, 16.729776, 6.127803, 10.365282, 16.58012, 6.736306, 10.276844, 17.232166, 6.147483, 10.085447, 16.926506, 5.9454803, 10.319639, 16.729776, 6.127803, 10.365282, 16.288668, 6.0046787, 10.627327, 15.7336235, 7.169642, 10.347719, 16.58012, 6.736306, 10.276844, 15.7336235, 7.169642, 10.347719, 16.288668, 6.0046787, 10.627327, 15.925083, 6.171483, 10.651344, 15.7336235, 7.169642, 10.347719, 15.925083, 6.171483, 10.651344, 15.8492565, 6.533848, 10.554647, 15.306034, 6.9726505, 10.442774, 14.960796, 7.3177958, 10.284792, 15.7336235, 7.169642, 10.347719, 14.960796, 7.3177958, 10.284792, 15.306034, 6.9726505, 10.442774, 15.061283, 6.615505, 10.587776, 14.960796, 7.3177958, 10.284792, 15.061283, 6.615505, 10.587776, 14.899889, 6.6811314, 10.556076, 15.7336235, 7.169642, 10.347719, 16.302326, 6.86697, 9.66189, 16.58012, 6.736306, 10.276844, 15.95689, 7.068595, 9.972179, 16.302326, 6.86697, 9.66189, 15.7336235, 7.169642, 10.347719, 16.302326, 6.86697, 9.66189, 15.95689, 7.068595, 9.972179, 16.037476, 6.9235826, 9.459768, 16.302326, 6.86697, 9.66189, 16.037476, 6.9235826, 9.459768, 16.200966, 6.8668146, 9.453747, 15.7336235, 7.169642, 10.347719, 15.948803, 7.0493326, 9.487534, 15.95689, 7.068595, 9.972179, 15.7336235, 7.169642, 10.347719, 15.768839, 7.134306, 9.500018, 15.948803, 7.0493326, 9.487534, 15.8492565, 6.533848, 10.554647, 15.598484, 6.34639, 10.67927, 15.7336235, 7.169642, 10.347719, 15.8492565, 6.533848, 10.554647, 15.754543, 6.2731757, 10.668556, 15.598484, 6.34639, 10.67927, 14.960796, 7.3177958, 10.284792, 15.418615, 7.241414, 9.825178, 15.7336235, 7.169642, 10.347719, 15.418615, 7.241414, 9.825178, 14.960796, 7.3177958, 10.284792, 15.035656, 7.2923393, 9.619492, 15.418615, 7.241414, 9.825178, 15.035656, 7.2923393, 9.619492, 15.302166, 7.2475796, 9.57913, 15.306034, 6.9726505, 10.442774, 15.598484, 6.34639, 10.67927, 15.17808, 6.500619, 10.592104, 15.306034, 6.9726505, 10.442774, 15.7336235, 7.169642, 10.347719, 15.598484, 6.34639, 10.67927, 14.230383, 7.219601, 10.105017, 14.762205, 7.297971, 9.966335, 14.960796, 7.3177958, 10.284792, 14.762205, 7.297971, 9.966335, 14.230383, 7.219601, 10.105017, 14.228041, 7.218266, 9.957092, 14.762205, 7.297971, 9.966335, 14.228041, 7.218266, 9.957092, 14.580687, 7.2687683, 9.813696, 16.729776, 6.127803, 10.365282, 16.288668, 6.0046787, 10.627327, 16.58012, 6.736306, 10.276844, 16.729776, 6.127803, 10.365282, 16.561163, 5.9042377, 10.517782, 16.288668, 6.0046787, 10.627327, 16.926506, 5.9454803, 10.319639, 16.737123, 5.796604, 10.437109, 16.729776, 6.127803, 10.365282, 16.926506, 5.9454803, 10.319639, 16.830635, 5.779464, 10.403534, 16.737123, 5.796604, 10.437109, 16.926506, 5.9454803, 10.319639, 17.232166, 6.147483, 10.085447, 17.020973, 5.7145977, 10.328281, 17.429657, 5.7386765, 10.057089, 17.020973, 5.7145977, 10.328281, 17.232166, 6.147483, 10.085447, 17.429657, 5.7386765, 10.057089, 17.308277, 5.615484, 10.174715, 17.020973, 5.7145977, 10.328281, 13.748751, 7.053542, 10.572222, 14.344303, 7.2258663, 9.903076, 14.400131, 7.268545, 10.054003, 13.748751, 7.053542, 10.572222, 13.42976, 6.790598, 9.931854, 14.344303, 7.2258663, 9.903076, 14.244236, 6.5294213, 10.857023, 14.149033, 6.936182, 10.532454, 14.338385, 6.748352, 10.605932, 14.244236, 6.5294213, 10.857023, 13.748751, 7.053542, 10.572222, 14.149033, 6.936182, 10.532454, 11.830196, 3.7078786, 11.580435, 12.08853, 4.698938, 11.459175, 12.606657, 4.4480114, 11.634403, 11.830196, 3.7078786, 11.580435, 11.739759, 3.7365186, 11.530159, 12.08853, 4.698938, 11.459175, 12.08853, 4.698938, 11.459175, 12.792095, 4.643725, 11.622538, 12.606657, 4.4480114, 11.634403, 12.08853, 4.698938, 11.459175, 12.569534, 4.9534965, 11.509512, 12.792095, 4.643725, 11.622538, 12.569534, 4.9534965, 11.509512, 12.08853, 4.698938, 11.459175, 12.50172, 5.6512947, 11.328012, 12.569534, 4.9534965, 11.509512, 12.50172, 5.6512947, 11.328012, 13.291006, 5.162043, 11.5888405, 12.569534, 4.9534965, 11.509512, 13.291006, 5.162043, 11.5888405, 12.958977, 4.8188252, 11.61166, 13.291006, 5.162043, 11.5888405, 13.2354355, 5.49573, 11.458206, 13.363539, 5.246913, 11.546379, 13.291006, 5.162043, 11.5888405, 12.50172, 5.6512947, 11.328012, 13.2354355, 5.49573, 11.458206, 13.796944, 5.897662, 11.320793, 13.790836, 6.4103017, 11.012831, 13.913025, 6.053091, 11.199114, 13.796944, 5.897662, 11.320793, 13.121664, 6.529729, 10.9958515, 13.790836, 6.4103017, 11.012831, 11.699358, 3.746626, 11.430775, 12.08853, 4.698938, 11.459175, 11.739759, 3.7365186, 11.530159, 12.08853, 4.698938, 11.459175, 11.699358, 3.746626, 11.430775, 11.891642, 4.2572117, 11.316582, 11.891642, 4.2572117, 11.316582, 11.699358, 3.746626, 11.430775, 11.803057, 4.0996614, 11.194469, 12.08853, 4.698938, 11.459175, 12.198441, 5.1560144, 10.946365, 12.50172, 5.6512947, 11.328012, 12.08853, 4.698938, 11.459175, 12.062822, 4.8732367, 10.978052, 12.198441, 5.1560144, 10.946365, 12.262251, 5.4878073, 10.418972, 13.121664, 6.529729, 10.9958515, 12.50172, 5.6512947, 11.328012, 13.121664, 6.529729, 10.9958515, 12.262251, 5.4878073, 10.418972, 12.532429, 5.8353195, 10.266994, 13.121664, 6.529729, 10.9958515, 12.532429, 5.8353195, 10.266994, 12.735952, 6.1089916, 10.515257, 13.298405, 6.7030754, 10.491749, 13.748751, 7.053542, 10.572222, 13.121664, 6.529729, 10.9958515, 13.748751, 7.053542, 10.572222, 13.298405, 6.7030754, 10.491749, 13.275257, 6.6692533, 9.985384, 13.748751, 7.053542, 10.572222, 13.275257, 6.6692533, 9.985384, 13.42976, 6.790598, 9.931854, 13.121664, 6.529729, 10.9958515, 13.2354355, 5.49573, 11.458206, 12.50172, 5.6512947, 11.328012, 13.256226, 6.064356, 11.224297, 13.2354355, 5.49573, 11.458206, 13.121664, 6.529729, 10.9958515, 13.2354355, 5.49573, 11.458206, 13.256226, 6.064356, 11.224297, 13.609962, 5.5398574, 11.403032, 13.2354355, 5.49573, 11.458206, 13.609962, 5.5398574, 11.403032, 13.485888, 5.4047327, 11.477678, 13.121664, 6.529729, 10.9958515, 13.663889, 5.719082, 11.394192, 13.256226, 6.064356, 11.224297, 13.121664, 6.529729, 10.9958515, 13.796944, 5.897662, 11.320793, 13.663889, 5.719082, 11.394192, 12.735952, 6.1089916, 10.515257, 12.770527, 6.18994, 10.142353, 13.121664, 6.529729, 10.9958515, 12.735952, 6.1089916, 10.515257, 12.654997, 6.03539, 10.206213, 12.770527, 6.18994, 10.142353, 13.748751, 7.053542, 10.572222, 13.790836, 6.4103017, 11.012831, 13.121664, 6.529729, 10.9958515, 13.790836, 6.4103017, 11.012831, 13.748751, 7.053542, 10.572222, 14.244236, 6.5294213, 10.857023, 13.790836, 6.4103017, 11.012831, 14.244236, 6.5294213, 10.857023, 14.080233, 6.311716, 11.029364, 13.298405, 6.7030754, 10.491749, 12.770527, 6.18994, 10.142353, 13.176046, 6.4788733, 9.995405, 13.298405, 6.7030754, 10.491749, 13.121664, 6.529729, 10.9958515, 12.770527, 6.18994, 10.142353, 14.400131, 7.268545, 10.054003, 14.149033, 6.936182, 10.532454, 13.748751, 7.053542, 10.572222, 14.149033, 6.936182, 10.532454, 14.400131, 7.268545, 10.054003, 14.524361, 7.1721907, 10.108967, 14.149033, 6.936182, 10.532454, 14.524361, 7.1721907, 10.108967, 14.399626, 6.918585, 10.443947, 12.198441, 5.1560144, 10.946365, 12.262251, 5.4878073, 10.418972, 12.50172, 5.6512947, 11.328012, 12.198441, 5.1560144, 10.946365, 12.143154, 5.1808786, 10.591608, 12.262251, 5.4878073, 10.418972, 12.062822, 4.8732367, 10.978052, 12.071648, 4.931636, 10.687195, 12.198441, 5.1560144, 10.946365, 12.062822, 4.8732367, 10.978052, 12.028627, 4.8476563, 10.753109, 12.071648, 4.931636, 10.687195, 12.062822, 4.8732367, 10.978052, 12.08853, 4.698938, 11.459175, 11.94441, 4.6445174, 10.876879, 11.891642, 4.2572117, 11.316582, 11.94441, 4.6445174, 10.876879, 12.08853, 4.698938, 11.459175, 11.891642, 4.2572117, 11.316582, 11.852747, 4.307365, 11.084038, 11.94441, 4.6445174, 10.876879, 13.7075405, 7.556304, 10.0746155, 14.456242, 7.1163726, 9.9533615, 14.450766, 7.1982546, 10.098274, 13.7075405, 7.556304, 10.0746155, 13.637535, 7.179911, 9.4115, 14.456242, 7.1163726, 9.9533615, 13.580511, 7.079011, 10.661566, 13.885704, 7.279489, 10.325115, 13.870678, 7.088043, 10.517448, 13.580511, 7.079011, 10.661566, 13.7075405, 7.556304, 10.0746155, 13.885704, 7.279489, 10.325115, 10.434713, 6.2257376, 9.758102, 11.151068, 6.834375, 9.774982, 11.238207, 6.5067883, 10.272303, 10.434713, 6.2257376, 9.758102, 10.420666, 6.2614727, 9.657367, 11.151068, 6.834375, 9.774982, 11.151068, 6.834375, 9.774982, 11.449902, 6.5769014, 10.375746, 11.238207, 6.5067883, 10.272303, 11.151068, 6.834375, 9.774982, 11.530296, 6.857931, 10.121874, 11.449902, 6.5769014, 10.375746, 11.530296, 6.857931, 10.121874, 11.151068, 6.834375, 9.774982, 11.933365, 7.3444357, 9.894124, 11.530296, 6.857931, 10.121874, 11.933365, 7.3444357, 9.894124, 12.01959, 6.757763, 10.651842, 11.530296, 6.857931, 10.121874, 12.01959, 6.757763, 10.651842, 11.640572, 6.6390653, 10.468557, 12.01959, 6.757763, 10.651842, 12.206385, 6.9807854, 10.499392, 12.129288, 6.772664, 10.661032, 12.01959, 6.757763, 10.651842, 11.933365, 7.3444357, 9.894124, 12.206385, 6.9807854, 10.499392, 12.789576, 6.995577, 10.750685, 13.181564, 7.251497, 10.484621, 12.994299, 7.0094805, 10.72579, 12.789576, 6.995577, 10.750685, 12.882765, 7.613677, 10.007544, 13.181564, 7.251497, 10.484621, 10.444181, 6.238669, 9.556094, 11.151068, 6.834375, 9.774982, 10.420666, 6.2614727, 9.657367, 11.151068, 6.834375, 9.774982, 10.444181, 6.238669, 9.556094, 10.868927, 6.502743, 9.566353, 10.868927, 6.502743, 9.566353, 10.444181, 6.238669, 9.556094, 10.796675, 6.356696, 9.423105, 11.151068, 6.834375, 9.774982, 11.658583, 6.90143, 9.442226, 11.933365, 7.3444357, 9.894124, 11.151068, 6.834375, 9.774982, 11.422882, 6.7517605, 9.392457, 11.658583, 6.90143, 9.442226, 12.092066, 6.8811474, 9.071436, 12.882765, 7.613677, 10.007544, 11.933365, 7.3444357, 9.894124, 12.882765, 7.613677, 10.007544, 12.092066, 6.8811474, 9.071436, 12.501753, 6.965708, 9.113264, 12.882765, 7.613677, 10.007544, 12.501753, 6.965708, 9.113264, 12.637543, 7.2165165, 9.423414, 13.274715, 7.4356117, 9.746176, 13.7075405, 7.556304, 10.0746155, 12.882765, 7.613677, 10.007544, 13.7075405, 7.556304, 10.0746155, 13.274715, 7.4356117, 9.746176, 13.45668, 7.17616, 9.358056, 13.7075405, 7.556304, 10.0746155, 13.45668, 7.17616, 9.358056, 13.637535, 7.179911, 9.4115, 12.882765, 7.613677, 10.007544, 12.206385, 6.9807854, 10.499392, 11.933365, 7.3444357, 9.894124, 12.606947, 7.305357, 10.3043785, 12.206385, 6.9807854, 10.499392, 12.882765, 7.613677, 10.007544, 12.206385, 6.9807854, 10.499392, 12.606947, 7.305357, 10.3043785, 12.502178, 6.827238, 10.693289, 12.206385, 6.9807854, 10.499392, 12.502178, 6.827238, 10.693289, 12.314716, 6.8113565, 10.680117, 12.882765, 7.613677, 10.007544, 12.587612, 6.947036, 10.728325, 12.606947, 7.305357, 10.3043785, 12.882765, 7.613677, 10.007544, 12.789576, 6.995577, 10.750685, 12.587612, 6.947036, 10.728325, 12.637543, 7.2165165, 9.423414, 12.864445, 7.0854006, 9.161785, 12.882765, 7.613677, 10.007544, 12.637543, 7.2165165, 9.423414, 12.688946, 7.04373, 9.142518, 12.864445, 7.0854006, 9.161785, 13.7075405, 7.556304, 10.0746155, 13.181564, 7.251497, 10.484621, 12.882765, 7.613677, 10.007544, 13.181564, 7.251497, 10.484621, 13.7075405, 7.556304, 10.0746155, 13.580511, 7.079011, 10.661566, 13.181564, 7.251497, 10.484621, 13.580511, 7.079011, 10.661566, 13.291115, 7.061289, 10.697266, 13.274715, 7.4356117, 9.746176, 12.864445, 7.0854006, 9.161785, 13.339142, 7.0672264, 9.294153, 13.274715, 7.4356117, 9.746176, 12.882765, 7.613677, 10.007544, 12.864445, 7.0854006, 9.161785, 14.450766, 7.1982546, 10.098274, 13.885704, 7.279489, 10.325115, 13.7075405, 7.556304, 10.0746155, 13.885704, 7.279489, 10.325115, 14.450766, 7.1982546, 10.098274, 14.443308, 7.0981884, 10.231224, 13.885704, 7.279489, 10.325115, 14.443308, 7.0981884, 10.231224, 14.063122, 7.117878, 10.426937, 11.658583, 6.90143, 9.442226, 12.092066, 6.8811474, 9.071436, 11.933365, 7.3444357, 9.894124, 11.658583, 6.90143, 9.442226, 11.79088, 6.773697, 9.139975, 12.092066, 6.8811474, 9.071436, 11.422882, 6.7517605, 9.392457, 11.603992, 6.6508856, 9.16963, 11.658583, 6.90143, 9.442226, 11.422882, 6.7517605, 9.392457, 11.497446, 6.636342, 9.199318, 11.603992, 6.6508856, 9.16963, 11.422882, 6.7517605, 9.392457, 11.151068, 6.834375, 9.774982, 11.28582, 6.5728126, 9.250239, 10.868927, 6.502743, 9.566353, 11.28582, 6.5728126, 9.250239, 11.151068, 6.834375, 9.774982, 10.868927, 6.502743, 9.566353, 10.970734, 6.4467087, 9.364567, 11.28582, 6.5728126, 9.250239, 14.070913, 7.495411, 9.618036, 14.482357, 7.125392, 10.12579, 14.3754425, 7.195709, 10.181591, 14.070913, 7.495411, 9.618036, 14.516771, 7.173098, 9.291218, 14.482357, 7.125392, 10.12579, 13.583624, 7.1059093, 9.775603, 13.968065, 7.2646875, 9.861715, 13.816387, 7.1105375, 9.930347, 13.583624, 7.1059093, 9.775603, 14.070913, 7.495411, 9.618036, 13.968065, 7.2646875, 9.861715, 12.772589, 6.376586, 6.9820247, 13.099979, 6.904664, 7.5420585, 12.775024, 6.637413, 7.820493, 12.772589, 6.376586, 6.9820247, 12.839212, 6.4047265, 6.9280143, 13.099979, 6.904664, 7.5420585, 13.099979, 6.904664, 7.5420585, 12.79912, 6.699265, 8.027189, 12.775024, 6.637413, 7.820493, 13.099979, 6.904664, 7.5420585, 13.025673, 6.931345, 7.982105, 12.79912, 6.699265, 8.027189, 13.025673, 6.931345, 7.982105, 13.099979, 6.904664, 7.5420585, 13.384867, 7.3345337, 8.193618, 13.025673, 6.931345, 7.982105, 13.384867, 7.3345337, 8.193618, 12.864683, 6.8550787, 8.580061, 13.025673, 6.931345, 7.982105, 12.864683, 6.8550787, 8.580061, 12.820887, 6.753347, 8.212795, 12.864683, 6.8550787, 8.580061, 13.068455, 7.0369205, 8.661718, 12.906773, 6.8680534, 8.665814, 12.864683, 6.8550787, 8.580061, 13.384867, 7.3345337, 8.193618, 13.068455, 7.0369205, 8.661718, 13.15687, 7.046695, 9.214457, 13.535355, 7.2501936, 9.400614, 13.26737, 7.0566998, 9.358015, 13.15687, 7.046695, 9.214457, 13.745743, 7.551609, 8.966543, 13.535355, 7.2501936, 9.400614, 12.922939, 6.384966, 6.9034257, 13.099979, 6.904664, 7.5420585, 12.839212, 6.4047265, 6.9280143, 13.099979, 6.904664, 7.5420585, 12.922939, 6.384966, 6.9034257, 13.11478, 6.619231, 7.236095, 13.11478, 6.619231, 7.236095, 12.922939, 6.384966, 6.9034257, 13.179651, 6.491927, 7.1159973, 13.099979, 6.904664, 7.5420585, 13.577553, 6.959513, 7.7937083, 13.384867, 7.3345337, 8.193618, 13.099979, 6.904664, 7.5420585, 13.501598, 6.832964, 7.5911536, 13.577553, 6.959513, 7.7937083, 14.043669, 6.938242, 7.9677033, 13.745743, 7.551609, 8.966543, 13.384867, 7.3345337, 8.193618, 13.745743, 7.551609, 8.966543, 14.043669, 6.938242, 7.9677033, 14.200254, 7.008704, 8.294954, 13.745743, 7.551609, 8.966543, 14.200254, 7.008704, 8.294954, 14.049522, 7.2166758, 8.535611, 14.115025, 7.3930063, 9.158257, 14.070913, 7.495411, 9.618036, 13.745743, 7.551609, 8.966543, 14.070913, 7.495411, 9.618036, 14.115025, 7.3930063, 9.158257, 14.474133, 7.170848, 9.13312, 14.070913, 7.495411, 9.618036, 14.474133, 7.170848, 9.13312, 14.516771, 7.173098, 9.291218, 13.745743, 7.551609, 8.966543, 13.068455, 7.0369205, 8.661718, 13.384867, 7.3345337, 8.193618, 13.402321, 7.300085, 8.886555, 13.068455, 7.0369205, 8.661718, 13.745743, 7.551609, 8.966543, 13.068455, 7.0369205, 8.661718, 13.402321, 7.300085, 8.886555, 13.049887, 6.9149427, 8.958126, 13.068455, 7.0369205, 8.661718, 13.049887, 6.9149427, 8.958126, 12.977623, 6.9004726, 8.814155, 13.745743, 7.551609, 8.966543, 13.079823, 7.007822, 9.05171, 13.402321, 7.300085, 8.886555, 13.745743, 7.551609, 8.966543, 13.15687, 7.046695, 9.214457, 13.079823, 7.007822, 9.05171, 14.049522, 7.2166758, 8.535611, 14.337751, 7.1039696, 8.595517, 13.745743, 7.551609, 8.966543, 14.049522, 7.2166758, 8.535611, 14.270794, 7.0704823, 8.454195, 14.337751, 7.1039696, 8.595517, 14.070913, 7.495411, 9.618036, 13.535355, 7.2501936, 9.400614, 13.745743, 7.551609, 8.966543, 13.535355, 7.2501936, 9.400614, 14.070913, 7.495411, 9.618036, 13.583624, 7.1059093, 9.775603, 13.535355, 7.2501936, 9.400614, 13.583624, 7.1059093, 9.775603, 13.427256, 7.094145, 9.573523, 14.115025, 7.3930063, 9.158257, 14.337751, 7.1039696, 8.595517, 14.450401, 7.090761, 9.003662, 14.115025, 7.3930063, 9.158257, 13.745743, 7.551609, 8.966543, 14.337751, 7.1039696, 8.595517, 14.3754425, 7.195709, 10.181591, 13.968065, 7.2646875, 9.861715, 14.070913, 7.495411, 9.618036, 13.968065, 7.2646875, 9.861715, 14.3754425, 7.195709, 10.181591, 14.275515, 7.113496, 10.233852, 13.968065, 7.2646875, 9.861715, 14.275515, 7.113496, 10.233852, 13.9707985, 7.1304455, 10.03817, 13.577553, 6.959513, 7.7937083, 14.043669, 6.938242, 7.9677033, 13.384867, 7.3345337, 8.193618, 13.577553, 6.959513, 7.7937083, 13.853798, 6.849599, 7.7665267, 14.043669, 6.938242, 7.9677033, 13.501598, 6.832964, 7.5911536, 13.736696, 6.747884, 7.6274853, 13.577553, 6.959513, 7.7937083, 13.501598, 6.832964, 7.5911536, 13.669174, 6.7349615, 7.561953, 13.736696, 6.747884, 7.6274853, 13.501598, 6.832964, 7.5911536, 13.099979, 6.904664, 7.5420585, 13.535788, 6.6803236, 7.4230866, 13.11478, 6.619231, 7.236095, 13.535788, 6.6803236, 7.4230866, 13.099979, 6.904664, 7.5420585, 13.11478, 6.619231, 7.236095, 13.306187, 6.5714235, 7.228906, 13.535788, 6.6803236, 7.4230866, 14.818359, 7.5795794, 9.704287, 14.319729, 7.1040306, 10.273739, 14.231741, 7.193877, 10.164581, 14.818359, 7.5795794, 9.704287, 15.293608, 7.170624, 10.134708, 14.319729, 7.1040306, 10.273739, 14.53705, 7.1410728, 9.124798, 14.520617, 7.3097606, 9.621042, 14.407236, 7.130357, 9.437237, 14.53705, 7.1410728, 9.124798, 14.818359, 7.5795794, 9.704287, 14.520617, 7.3097606, 9.621042, 17.50299, 6.374856, 7.3705115, 16.95148, 6.951913, 7.9566584, 16.564781, 6.648938, 7.610077, 17.50299, 6.374856, 7.3705115, 17.578213, 6.4056153, 7.4395566, 16.95148, 6.951913, 7.9566584, 16.95148, 6.951913, 7.9566584, 16.337984, 6.7154865, 7.697535, 16.564781, 6.648938, 7.610077, 16.95148, 6.951913, 7.9566584, 16.44146, 6.978112, 7.98315, 16.337984, 6.7154865, 7.697535, 16.44146, 6.978112, 7.98315, 16.95148, 6.951913, 7.9566584, 16.283978, 7.4333143, 8.50886, 16.44146, 6.978112, 7.98315, 16.283978, 7.4333143, 8.50886, 15.729202, 6.886676, 7.930798, 16.44146, 6.978112, 7.98315, 15.729202, 6.886676, 7.930798, 16.134073, 6.774377, 7.7760997, 15.729202, 6.886676, 7.930798, 15.686707, 7.0922894, 8.219696, 15.639549, 6.8975234, 8.001675, 15.729202, 6.886676, 7.930798, 16.283978, 7.4333143, 8.50886, 15.686707, 7.0922894, 8.219696, 15.082333, 7.0959883, 8.468272, 14.956093, 7.31973, 8.992256, 14.942156, 7.0999613, 8.635822, 15.082333, 7.0959883, 8.468272, 15.490726, 7.667551, 9.160905, 14.956093, 7.31973, 8.992256, 17.624905, 6.3763094, 7.5322666, 16.95148, 6.951913, 7.9566584, 17.578213, 6.4056153, 7.4395566, 16.95148, 6.951913, 7.9566584, 17.624905, 6.3763094, 7.5322666, 17.296997, 6.6220546, 7.8690057, 17.296997, 6.6220546, 7.8690057, 17.624905, 6.3763094, 7.5322666, 17.441767, 6.4720078, 7.9004264, 16.95148, 6.951913, 7.9566584, 16.778732, 6.9787436, 8.60397, 16.283978, 7.4333143, 8.50886, 16.95148, 6.951913, 7.9566584, 16.988663, 6.836954, 8.447882, 16.778732, 6.9787436, 8.60397, 16.685303, 6.91991, 9.205566, 15.490726, 7.667551, 9.160905, 16.283978, 7.4333143, 8.50886, 15.490726, 7.667551, 9.160905, 16.685303, 6.91991, 9.205566, 16.34667, 6.989422, 9.478991, 15.490726, 7.667551, 9.160905, 16.34667, 6.989422, 9.478991, 16.0481, 7.250002, 9.387381, 15.358458, 7.458866, 9.642784, 14.818359, 7.5795794, 9.704287, 15.490726, 7.667551, 9.160905, 14.818359, 7.5795794, 9.704287, 15.358458, 7.458866, 9.642784, 15.46587, 7.1714168, 10.046328, 14.818359, 7.5795794, 9.704287, 15.46587, 7.1714168, 10.046328, 15.293608, 7.170624, 10.134708, 15.490726, 7.667551, 9.160905, 15.686707, 7.0922894, 8.219696, 16.283978, 7.4333143, 8.50886, 15.509426, 7.387882, 8.707602, 15.686707, 7.0922894, 8.219696, 15.490726, 7.667551, 9.160905, 15.686707, 7.0922894, 8.219696, 15.509426, 7.387882, 8.707602, 15.334177, 6.938472, 8.243979, 15.686707, 7.0922894, 8.219696, 15.334177, 6.938472, 8.243979, 15.486206, 6.9294643, 8.125624, 15.490726, 7.667551, 9.160905, 15.250263, 7.0548754, 8.33129, 15.509426, 7.387882, 8.707602, 15.490726, 7.667551, 9.160905, 15.082333, 7.0959883, 8.468272, 15.250263, 7.0548754, 8.33129, 16.0481, 7.250002, 9.387381, 16.040924, 7.0956764, 9.734488, 15.490726, 7.667551, 9.160905, 16.0481, 7.250002, 9.387381, 16.186634, 7.0604343, 9.615782, 16.040924, 7.0956764, 9.734488, 14.818359, 7.5795794, 9.704287, 14.956093, 7.31973, 8.992256, 15.490726, 7.667551, 9.160905, 14.956093, 7.31973, 8.992256, 14.818359, 7.5795794, 9.704287, 14.53705, 7.1410728, 9.124798, 14.956093, 7.31973, 8.992256, 14.53705, 7.1410728, 9.124798, 14.7350445, 7.1373453, 8.888584, 15.358458, 7.458866, 9.642784, 16.040924, 7.0956764, 9.734488, 15.592907, 7.0656147, 9.958109, 15.358458, 7.458866, 9.642784, 15.490726, 7.667551, 9.160905, 16.040924, 7.0956764, 9.734488, 14.231741, 7.193877, 10.164581, 14.520617, 7.3097606, 9.621042, 14.818359, 7.5795794, 9.704287, 14.520617, 7.3097606, 9.621042, 14.231741, 7.193877, 10.164581, 14.1518955, 7.1016655, 10.051222, 14.520617, 7.3097606, 9.621042, 14.1518955, 7.1016655, 10.051222, 14.318668, 7.147036, 9.652245, 16.778732, 6.9787436, 8.60397, 16.685303, 6.91991, 9.205566, 16.283978, 7.4333143, 8.50886, 16.778732, 6.9787436, 8.60397, 16.869965, 6.8293467, 8.917667, 16.685303, 6.91991, 9.205566, 16.988663, 6.836954, 8.447882, 16.991056, 6.717228, 8.721294, 16.778732, 6.9787436, 8.60397, 16.988663, 6.836954, 8.447882, 17.05367, 6.7085714, 8.62688, 16.991056, 6.717228, 8.721294, 16.988663, 6.836954, 8.447882, 16.95148, 6.951913, 7.9566584, 17.18201, 6.656856, 8.4283905, 17.296997, 6.6220546, 7.8690057, 17.18201, 6.656856, 8.4283905, 16.95148, 6.951913, 7.9566584, 17.296997, 6.6220546, 7.8690057, 17.347916, 6.550868, 8.092527, 17.18201, 6.656856, 8.4283905, 14.640917, 7.231346, 10.77033, 14.15225, 7.201992, 10.013128, 14.311281, 7.246917, 9.992706, 14.640917, 7.231346, 10.77033, 13.950329, 6.9789553, 10.945974, 14.15225, 7.201992, 10.013128, 15.086668, 6.645689, 10.496582, 14.715862, 7.027137, 10.425049, 14.856575, 6.812086, 10.301319, 15.086668, 6.645689, 10.496582, 14.640917, 7.231346, 10.77033, 14.715862, 7.027137, 10.425049, 15.405359, 4.506928, 13.294855, 15.268087, 5.398923, 12.871037, 15.5953045, 5.062126, 12.496258, 15.405359, 4.506928, 13.294855, 15.330811, 4.5490294, 13.357082, 15.268087, 5.398923, 12.871037, 15.268087, 5.398923, 12.871037, 15.614843, 5.2105064, 12.296331, 15.5953045, 5.062126, 12.496258, 15.268087, 5.398923, 12.871037, 15.418043, 5.546952, 12.416988, 15.614843, 5.2105064, 12.296331, 15.418043, 5.546952, 12.416988, 15.268087, 5.398923, 12.871037, 15.162661, 6.218977, 12.31654, 15.418043, 5.546952, 12.416988, 15.162661, 6.218977, 12.31654, 15.6678505, 5.60172, 11.757086, 15.418043, 5.546952, 12.416988, 15.6678505, 5.60172, 11.757086, 15.632406, 5.343074, 12.11624, 15.6678505, 5.60172, 11.757086, 15.4920025, 5.9232817, 11.72563, 15.641216, 5.6641035, 11.663549, 15.6678505, 5.60172, 11.757086, 15.162661, 6.218977, 12.31654, 15.4920025, 5.9232817, 11.72563, 15.469013, 6.1774178, 11.125845, 15.1226845, 6.643654, 10.969555, 15.370789, 6.2906885, 10.961456, 15.469013, 6.1774178, 11.125845, 14.925304, 6.9021482, 11.535374, 15.1226845, 6.643654, 10.969555, 15.222748, 4.557292, 13.366293, 15.268087, 5.398923, 12.871037, 15.330811, 4.5490294, 13.357082, 15.268087, 5.398923, 12.871037, 15.222748, 4.557292, 13.366293, 15.117676, 4.9987955, 13.081551, 15.117676, 4.9987955, 13.081551, 15.222748, 4.557292, 13.366293, 14.994282, 4.8528996, 13.149015, 15.268087, 5.398923, 12.871037, 14.755228, 5.765085, 12.572195, 15.162661, 6.218977, 12.31654, 15.268087, 5.398923, 12.871037, 14.77644, 5.523675, 12.745871, 14.755228, 5.765085, 12.572195, 14.232555, 6.018609, 12.3237705, 14.925304, 6.9021482, 11.535374, 15.162661, 6.218977, 12.31654, 14.925304, 6.9021482, 11.535374, 14.232555, 6.018609, 12.3237705, 14.130428, 6.281682, 11.9799385, 14.925304, 6.9021482, 11.535374, 14.130428, 6.281682, 11.9799385, 14.391569, 6.5280485, 11.829561, 14.462694, 6.9798803, 11.226421, 14.640917, 7.231346, 10.77033, 14.925304, 6.9021482, 11.535374, 14.640917, 7.231346, 10.77033, 14.462694, 6.9798803, 11.226421, 13.968893, 6.899996, 11.121994, 14.640917, 7.231346, 10.77033, 13.968893, 6.899996, 11.121994, 13.950329, 6.9789553, 10.945974, 14.925304, 6.9021482, 11.535374, 15.4920025, 5.9232817, 11.72563, 15.162661, 6.218977, 12.31654, 15.217165, 6.445463, 11.55835, 15.4920025, 5.9232817, 11.72563, 14.925304, 6.9021482, 11.535374, 15.4920025, 5.9232817, 11.72563, 15.217165, 6.445463, 11.55835, 15.550241, 5.8804913, 11.346338, 15.4920025, 5.9232817, 11.72563, 15.550241, 5.8804913, 11.346338, 15.594999, 5.783677, 11.508028, 14.925304, 6.9021482, 11.535374, 15.519932, 6.0406504, 11.294071, 15.217165, 6.445463, 11.55835, 14.925304, 6.9021482, 11.535374, 15.469013, 6.1774178, 11.125845, 15.519932, 6.0406504, 11.294071, 14.391569, 6.5280485, 11.829561, 14.036055, 6.5608177, 11.683962, 14.925304, 6.9021482, 11.535374, 14.391569, 6.5280485, 11.829561, 14.080282, 6.442515, 11.830221, 14.036055, 6.5608177, 11.683962, 14.640917, 7.231346, 10.77033, 15.1226845, 6.643654, 10.969555, 14.925304, 6.9021482, 11.535374, 15.1226845, 6.643654, 10.969555, 14.640917, 7.231346, 10.77033, 15.086668, 6.645689, 10.496582, 15.1226845, 6.643654, 10.969555, 15.086668, 6.645689, 10.496582, 15.225153, 6.48761, 10.729311, 14.462694, 6.9798803, 11.226421, 14.036055, 6.5608177, 11.683962, 13.989519, 6.7390223, 11.216955, 14.462694, 6.9798803, 11.226421, 14.925304, 6.9021482, 11.535374, 14.036055, 6.5608177, 11.683962, 14.311281, 7.246917, 9.992706, 14.715862, 7.027137, 10.425049, 14.640917, 7.231346, 10.77033, 14.715862, 7.027137, 10.425049, 14.311281, 7.246917, 9.992706, 14.403456, 7.132376, 9.914658, 14.715862, 7.027137, 10.425049, 14.403456, 7.132376, 9.914658, 14.700848, 6.947154, 10.176794, 14.755228, 5.765085, 12.572195, 14.232555, 6.018609, 12.3237705, 15.162661, 6.218977, 12.31654, 14.755228, 5.765085, 12.572195, 14.395441, 5.764677, 12.524948, 14.232555, 6.018609, 12.3237705, 14.77644, 5.523675, 12.745871, 14.502789, 5.5489907, 12.638502, 14.755228, 5.765085, 12.572195, 14.77644, 5.523675, 12.745871, 14.557829, 5.4834146, 12.714375, 14.502789, 5.5489907, 12.638502, 14.77644, 5.523675, 12.745871, 15.268087, 5.398923, 12.871037, 14.671074, 5.3173504, 12.858131, 15.117676, 4.9987955, 13.081551, 14.671074, 5.3173504, 12.858131, 15.268087, 5.398923, 12.871037, 15.117676, 4.9987955, 13.081551, 14.877726, 5.0318, 13.048248, 14.671074, 5.3173504, 12.858131, 15.855707, 1.5785854, 8.303576, 15.537302, 3.513335, 8.969594, 15.675556, 3.59141, 8.79463, 15.855707, 1.5785854, 8.303576, 15.684317, 1.4956186, 8.515871, 15.537302, 3.513335, 8.969594, 15.718592, -0.6945374, 7.979791, 15.684317, 1.4956186, 8.515871, 15.855707, 1.5785854, 8.303576, 15.718592, -0.6945374, 7.979791, 15.528423, -0.7451041, 8.231567, 15.684317, 1.4956186, 8.515871, 15.190344, 1.4642165, 8.406557, 15.070126, 3.5373333, 8.645098, 15.119511, 3.4761071, 8.8678665, 15.190344, 1.4642165, 8.406557, 15.135492, 1.5326246, 8.145638, 15.070126, 3.5373333, 8.645098, 15.578283, 1.6655294, 7.8817935, 15.624922, 3.6523986, 8.571777, 15.435907, 3.6665154, 8.430279, 15.578283, 1.6655294, 7.8817935, 15.805153, 1.6476903, 8.039993, 15.624922, 3.6523986, 8.571777, 15.119511, 3.4761071, 8.8678665, 14.720741, 5.3593645, 9.339607, 14.75539, 5.3158965, 9.486606, 15.119511, 3.4761071, 8.8678665, 15.070126, 3.5373333, 8.645098, 14.720741, 5.3593645, 9.339607, 15.675556, 3.59141, 8.79463, 15.031363, 5.349116, 9.558678, 15.124321, 5.4062643, 9.4429035, 15.675556, 3.59141, 8.79463, 15.537302, 3.513335, 8.969594, 15.031363, 5.349116, 9.558678, 15.124321, 5.4062643, 9.4429035, 15.031363, 5.349116, 9.558678, 14.700575, 6.30957, 9.911303, 15.124321, 5.4062643, 9.4429035, 14.700575, 6.30957, 9.911303, 14.765755, 6.3641186, 9.829805, 15.684317, 1.4956186, 8.515871, 15.309, 3.4624698, 9.008275, 15.537302, 3.513335, 8.969594, 15.684317, 1.4956186, 8.515871, 15.412914, 1.4456806, 8.567421, 15.309, 3.4624698, 9.008275, 15.537302, 3.513335, 8.969594, 15.309, 3.4624698, 9.008275, 14.880146, 5.309407, 9.581961, 15.537302, 3.513335, 8.969594, 14.880146, 5.309407, 9.581961, 15.031363, 5.349116, 9.558678, 15.135492, 1.5326246, 8.145638, 15.208366, 3.6164234, 8.469492, 15.070126, 3.5373333, 8.645098, 15.135492, 1.5326246, 8.145638, 15.30286, 1.6151665, 7.9359193, 15.208366, 3.6164234, 8.469492, 15.070126, 3.5373333, 8.645098, 15.208366, 3.6164234, 8.469492, 14.811323, 5.4180756, 9.224138, 15.070126, 3.5373333, 8.645098, 14.811323, 5.4180756, 9.224138, 14.720741, 5.3593645, 9.339607, 15.435907, 3.6665154, 8.430279, 15.090517, 5.4490795, 9.293634, 14.963499, 5.456666, 9.198397, 15.435907, 3.6665154, 8.430279, 15.624922, 3.6523986, 8.571777, 15.090517, 5.4490795, 9.293634, 15.805153, 1.6476903, 8.039993, 15.675556, 3.59141, 8.79463, 15.624922, 3.6523986, 8.571777, 15.805153, 1.6476903, 8.039993, 15.855707, 1.5785854, 8.303576, 15.675556, 3.59141, 8.79463, 15.624922, 3.6523986, 8.571777, 15.124321, 5.4062643, 9.4429035, 15.090517, 5.4490795, 9.293634, 15.624922, 3.6523986, 8.571777, 15.675556, 3.59141, 8.79463, 15.124321, 5.4062643, 9.4429035, 15.30286, 1.6151665, 7.9359193, 15.435907, 3.6665154, 8.430279, 15.208366, 3.6164234, 8.469492, 15.30286, 1.6151665, 7.9359193, 15.578283, 1.6655294, 7.8817935, 15.435907, 3.6665154, 8.430279, 15.080032, -0.60457873, 7.549851, 15.578283, 1.6655294, 7.8817935, 15.30286, 1.6151665, 7.9359193, 15.080032, -0.60457873, 7.549851, 15.392487, -0.5923369, 7.483996, 15.578283, 1.6655294, 7.8817935, 15.208366, 3.6164234, 8.469492, 14.963499, 5.456666, 9.198397, 14.811323, 5.4180756, 9.224138, 15.208366, 3.6164234, 8.469492, 15.435907, 3.6665154, 8.430279, 14.963499, 5.456666, 9.198397, 14.811323, 5.4180756, 9.224138, 14.963499, 5.456666, 9.198397, 14.646309, 6.401553, 9.648203, 14.811323, 5.4180756, 9.224138, 14.646309, 6.401553, 9.648203, 14.5366535, 6.3609424, 9.662085, 14.498898, 6.2705493, 9.8520975, 14.315634, 6.982005, 10.216946, 14.590864, 6.2697954, 9.924797, 14.498898, 6.2705493, 9.8520975, 14.248718, 6.9810524, 10.163109, 14.315634, 6.982005, 10.216946, 14.700575, 6.30957, 9.911303, 14.437746, 7.065465, 10.1538315, 14.765755, 6.3641186, 9.829805, 14.700575, 6.30957, 9.911303, 14.392586, 7.019636, 10.210747, 14.437746, 7.065465, 10.1538315, 14.590864, 6.2697954, 9.924797, 14.392586, 7.019636, 10.210747, 14.700575, 6.30957, 9.911303, 14.590864, 6.2697954, 9.924797, 14.315634, 6.982005, 10.216946, 14.392586, 7.019636, 10.210747, 14.73908, 6.400427, 9.720892, 14.35066, 7.092757, 10.021431, 14.646309, 6.401553, 9.648203, 14.73908, 6.400427, 9.720892, 14.416679, 7.0957565, 10.076281, 14.35066, 7.092757, 10.021431, 14.765755, 6.3641186, 9.829805, 14.416679, 7.0957565, 10.076281, 14.73908, 6.400427, 9.720892, 14.765755, 6.3641186, 9.829805, 14.437746, 7.065465, 10.1538315, 14.416679, 7.0957565, 10.076281, 14.5366535, 6.3609424, 9.662085, 14.22855, 7.0092974, 10.084545, 14.471951, 6.307063, 9.744005, 14.5366535, 6.3609424, 9.662085, 14.27281, 7.057174, 10.028643, 14.22855, 7.0092974, 10.084545, 14.646309, 6.401553, 9.648203, 14.27281, 7.057174, 10.028643, 14.5366535, 6.3609424, 9.662085, 14.646309, 6.401553, 9.648203, 14.35066, 7.092757, 10.021431, 14.27281, 7.057174, 10.028643, 15.214357, -0.7575648, 8.298452, 15.190344, 1.4642165, 8.406557, 15.412914, 1.4456806, 8.567421, 15.214357, -0.7575648, 8.298452, 14.957146, -0.7182157, 8.110065, 15.190344, 1.4642165, 8.406557, 14.471951, 6.307063, 9.744005, 14.248718, 6.9810524, 10.163109, 14.498898, 6.2705493, 9.8520975, 14.471951, 6.307063, 9.744005, 14.22855, 7.0092974, 10.084545, 14.248718, 6.9810524, 10.163109, 15.412914, 1.4456806, 8.567421, 15.119511, 3.4761071, 8.8678665, 15.309, 3.4624698, 9.008275, 15.412914, 1.4456806, 8.567421, 15.190344, 1.4642165, 8.406557, 15.119511, 3.4761071, 8.8678665, 14.957146, -0.7182157, 8.110065, 15.135492, 1.5326246, 8.145638, 15.190344, 1.4642165, 8.406557, 14.957146, -0.7182157, 8.110065, 14.888254, -0.6553638, 7.8026576, 15.135492, 1.5326246, 8.145638, 15.392487, -0.5923369, 7.483996, 15.805153, 1.6476903, 8.039993, 15.578283, 1.6655294, 7.8817935, 15.392487, -0.5923369, 7.483996, 15.648527, -0.6318462, 7.673121, 15.805153, 1.6476903, 8.039993, 15.528423, -0.7451041, 8.231567, 15.412914, 1.4456806, 8.567421, 15.684317, 1.4956186, 8.515871, 15.528423, -0.7451041, 8.231567, 15.214357, -0.7575648, 8.298452, 15.412914, 1.4456806, 8.567421, 14.888254, -0.6553638, 7.8026576, 15.30286, 1.6151665, 7.9359193, 15.135492, 1.5326246, 8.145638, 14.888254, -0.6553638, 7.8026576, 15.080032, -0.60457873, 7.549851, 15.30286, 1.6151665, 7.9359193, 15.648527, -0.6318462, 7.673121, 15.855707, 1.5785854, 8.303576, 15.805153, 1.6476903, 8.039993, 15.648527, -0.6318462, 7.673121, 15.718592, -0.6945374, 7.979791, 15.855707, 1.5785854, 8.303576, 15.309, 3.4624698, 9.008275, 14.75539, 5.3158965, 9.486606, 14.880146, 5.309407, 9.581961, 15.309, 3.4624698, 9.008275, 15.119511, 3.4761071, 8.8678665, 14.75539, 5.3158965, 9.486606, 14.880146, 5.309407, 9.581961, 14.498898, 6.2705493, 9.8520975, 14.590864, 6.2697954, 9.924797, 14.880146, 5.309407, 9.581961, 14.75539, 5.3158965, 9.486606, 14.498898, 6.2705493, 9.8520975, 14.75539, 5.3158965, 9.486606, 14.471951, 6.307063, 9.744005, 14.498898, 6.2705493, 9.8520975, 14.75539, 5.3158965, 9.486606, 14.720741, 5.3593645, 9.339607, 14.471951, 6.307063, 9.744005, 15.031363, 5.349116, 9.558678, 14.590864, 6.2697954, 9.924797, 14.700575, 6.30957, 9.911303, 15.031363, 5.349116, 9.558678, 14.880146, 5.309407, 9.581961, 14.590864, 6.2697954, 9.924797, 14.963499, 5.456666, 9.198397, 14.73908, 6.400427, 9.720892, 14.646309, 6.401553, 9.648203, 14.963499, 5.456666, 9.198397, 15.090517, 5.4490795, 9.293634, 14.73908, 6.400427, 9.720892, 15.090517, 5.4490795, 9.293634, 14.765755, 6.3641186, 9.829805, 14.73908, 6.400427, 9.720892, 15.090517, 5.4490795, 9.293634, 15.124321, 5.4062643, 9.4429035, 14.765755, 6.3641186, 9.829805, 14.720741, 5.3593645, 9.339607, 14.5366535, 6.3609424, 9.662085, 14.471951, 6.307063, 9.744005, 14.720741, 5.3593645, 9.339607, 14.811323, 5.4180756, 9.224138, 14.5366535, 6.3609424, 9.662085, -18.8297, 3.3895998, -9.473499, -19.616299, 3.2075999, -9.711899, -19.1775, 3.1662998, -9.7628, -18.8297, 3.3895998, -9.473499, -19.3743, 3.391, -9.417299, -19.616299, 3.2075999, -9.711899, -19.3743, 3.391, -9.417299, -19.611, 3.187, -9.246899, -19.616299, 3.2075999, -9.711899, 10.0335, 3.3913999, -10.0343, 13.378099, 3.3913999, -13.378599, 13.378099, 3.3913999, -10.0343, 13.378099, 3.3913999, -13.378599, 16.722599, 3.3913999, -10.0343, 13.378099, 3.3913999, -10.0343, 13.378099, 3.3913999, -6.6894, 13.378099, 3.3913999, -10.0343, 16.722599, 3.3913999, -10.0343, 13.378099, 3.3913999, -6.6894, 16.722599, 3.3913999, -10.0343, 16.722599, 3.3913999, -6.6894, 10.0335, 3.3913999, -6.6894, 13.378099, 3.3913999, -10.0343, 13.378099, 3.3913999, -6.6894, 10.0335, 3.3913999, -6.6894, 10.0335, 3.3913999, -10.0343, 13.378099, 3.3913999, -10.0343, 16.722599, 3.3913999, -10.0343, 16.4746, 3.3913999, -13.3993, 16.722599, 3.3913999, -13.109999, 16.722599, 3.3913999, -10.0343, 13.378099, 3.3913999, -13.378599, 16.4746, 3.3913999, -13.3993, 16.4746, 3.3913999, -13.3993, 15.5536995, 3.3913999, -16.3177, 16.4952, 3.3913999, -15.5392, 16.4746, 3.3913999, -13.3993, 12.7383995, 3.3913999, -15.8953, 15.5536995, 3.3913999, -16.3177, 12.7383995, 3.3913999, -15.8953, 16.4746, 3.3913999, -13.3993, 13.378099, 3.3913999, -13.378599, 13.378099, 3.3913999, -13.378599, 12.460499, 3.3913999, -16.1674, 12.7383995, 3.3913999, -15.8953, 13.378099, 3.3913999, -13.378599, 10.0335, 3.3913999, -16.7235, 12.460499, 3.3913999, -16.1674, 10.0335, 3.3913999, -16.7235, 13.378099, 3.3913999, -13.378599, 10.0335, 3.3913999, -13.378599, 10.0335, 3.3913999, -10.0343, 10.0335, 3.3913999, -13.378599, 13.378099, 3.3913999, -13.378599, 6.6889997, 3.3913999, -13.378599, 10.0335, 3.3913999, -16.7235, 10.0335, 3.3913999, -13.378599, 6.6889997, 3.3913999, -13.378599, 6.6889997, 3.3913999, -16.7235, 10.0335, 3.3913999, -16.7235, 6.6889997, 3.3913999, -10.0343, 10.0335, 3.3913999, -13.378599, 10.0335, 3.3913999, -10.0343, 6.6889997, 3.3913999, -10.0343, 6.6889997, 3.3913999, -13.378599, 10.0335, 3.3913999, -13.378599, 4.6816, 3.3913999, -13.378599, 6.6889997, 3.3913999, -16.7235, 6.6889997, 3.3913999, -13.378599, 4.6816, 3.3913999, -13.378599, 3.8384998, 3.3913999, -16.7235, 6.6889997, 3.3913999, -16.7235, 4.5101, 3.3913999, -8.955799, 4.6816, 3.3913999, -13.378599, 6.6889997, 3.3913999, -13.378599, 4.5101, 3.3913999, -8.955799, 6.6889997, 3.3913999, -13.378599, 6.6889997, 3.3913999, -10.0343, 4.6816, 3.3913999, -13.378599, 4.5101, 3.3913999, -8.955799, 4.1105, 3.3913999, -9.3386, 6.6889997, 3.3913999, -6.6894, 6.6889997, 3.3913999, -10.0343, 10.0335, 3.3913999, -10.0343, 6.6889997, 3.3913999, -6.6894, 4.5101, 3.3913999, -8.955799, 6.6889997, 3.3913999, -10.0343, 6.6889997, 3.3913999, -6.6894, 10.0335, 3.3913999, -10.0343, 10.0335, 3.3913999, -6.6894, 4.1105, 3.3913999, -9.3386, 4.5101, 3.3913999, -8.955799, 3.8492, 3.3913999, -8.198, 6.6889997, 3.3913999, -6.6894, 3.8492, 3.3913999, -8.198, 4.5101, 3.3913999, -8.955799, 4.1105, 3.3913999, -9.3386, 3.8492, 3.3913999, -8.198, 3.4176, 3.3913999, -8.714399, 3.3444998, 3.3913999, -6.6894, 3.4176, 3.3913999, -8.714399, 3.8492, 3.3913999, -8.198, 3.8492, 3.3913999, -8.198, 6.6889997, 3.3913999, -6.6894, 3.3444998, 3.3913999, -6.6894, 3.3444998, 3.3913999, -6.6894, 0, 3.3913999, -8.714399, 3.4176, 3.3913999, -8.714399, 6.6889997, 3.3913999, -3.3451, 6.6889997, 3.3913999, -6.6894, 10.0335, 3.3913999, -6.6894, 6.6889997, 3.3913999, -3.3451, 10.0335, 3.3913999, -6.6894, 10.0335, 3.3913999, -3.3451, 3.3444998, 3.3913999, -3.3451, 3.3444998, 3.3913999, -6.6894, 6.6889997, 3.3913999, -6.6894, 3.3444998, 3.3913999, -3.3451, 6.6889997, 3.3913999, -6.6894, 6.6889997, 3.3913999, -3.3451, 0, 3.3913999, -8.714399, 3.3444998, 3.3913999, -6.6894, 0, 3.3913999, -6.6894, 0, 3.3913999, -6.6894, -3.5373998, 3.3913999, -9.750299, 0, 3.3913999, -8.714399, 0, 3.3913999, -3.3451, 3.3444998, 3.3913999, -6.6894, 3.3444998, 3.3913999, -3.3451, 0, 3.3913999, -3.3451, 0, 3.3913999, -6.6894, 3.3444998, 3.3913999, -6.6894, 3.3444998, 3.3913999, -0.000100016594, 3.3444998, 3.3913999, -3.3451, 6.6889997, 3.3913999, -3.3451, 3.3444998, 3.3913999, -0.000100016594, 6.6889997, 3.3913999, -3.3451, 6.6889997, 3.3913999, -0.000100016594, 3.3444998, 3.3913999, 3.3442, 3.3444998, 3.3913999, -0.000100016594, 6.6889997, 3.3913999, -0.000100016594, 3.3444998, 3.3913999, 3.3442, 6.6889997, 3.3913999, -0.000100016594, 6.6889997, 3.3913999, 3.3442, 0, 3.3913999, 3.3442, 3.3444998, 3.3913999, -0.000100016594, 3.3444998, 3.3913999, 3.3442, 3.3444998, 3.3913999, 6.6891, 3.3444998, 3.3913999, 3.3442, 6.6889997, 3.3913999, 3.3442, 0, 3.3913999, 3.3442, 0, 3.3913999, -0.000100016594, 3.3444998, 3.3913999, -0.000100016594, 0, 3.3913999, -0.000100016594, 3.3444998, 3.3913999, -3.3451, 3.3444998, 3.3913999, -0.000100016594, 0, 3.3913999, -0.000100016594, 0, 3.3913999, -3.3451, 3.3444998, 3.3913999, -3.3451, -2.9569001, 3.3913999, 3.3442, 0, 3.3913999, -0.000100016594, 0, 3.3913999, 3.3442, -2.9569001, 3.3913999, 3.3442, -2.9569001, 3.3913999, -0.000100016594, 0, 3.3913999, -0.000100016594, -2.9569001, 3.3913999, -0.000100016594, 0, 3.3913999, -3.3451, 0, 3.3913999, -0.000100016594, -2.9569001, 3.3913999, -0.000100016594, -3.6383996, 3.3913999, -2.0795999, 0, 3.3913999, -3.3451, -3.6383996, 3.3913999, -2.0795999, 0, 3.3913999, -6.6894, 0, 3.3913999, -3.3451, -3.6383996, 3.3913999, -2.0795999, -3.3452, 3.3913999, -6.6894, 0, 3.3913999, -6.6894, -6.6896996, 3.3913999, -3.7331, -3.3452, 3.3913999, -6.6894, -3.6383996, 3.3913999, -2.0795999, -3.8484998, 3.3913999, -9.5107, 0, 3.3913999, -6.6894, -3.3452, 3.3913999, -6.6894, 0, 3.3913999, -6.6894, -3.8484998, 3.3913999, -9.5107, -3.5373998, 3.3913999, -9.750299, -3.5373998, 3.3913999, -9.750299, -3.8484998, 3.3913999, -9.5107, -4.2641, 3.3913999, -9.881699, -3.3452, 3.3913999, -6.6894, -4.2641, 3.3913999, -9.881699, -3.8484998, 3.3913999, -9.5107, -3.5373998, 3.3913999, -9.750299, -4.2641, 3.3913999, -9.881699, -3.9104, 3.3913999, -10.240799, -4.2641, 3.3913999, -9.881699, -3.9104, 3.3913999, -12.1610985, -3.9104, 3.3913999, -10.240799, -6.6896996, 3.3913999, -3.7331, -6.6896996, 3.3913999, -6.6894, -3.3452, 3.3913999, -6.6894, -10.034201, 3.3913999, -3.7331, -6.6896996, 3.3913999, -6.6894, -6.6896996, 3.3913999, -3.7331, -3.3452, 3.3913999, -6.6894, -6.6896996, 3.3913999, -10.0343, -4.2641, 3.3913999, -9.881699, -6.6896996, 3.3913999, -10.0343, -3.3452, 3.3913999, -6.6894, -6.6896996, 3.3913999, -6.6894, -4.2641, 3.3913999, -9.881699, -6.6896996, 3.3913999, -12.5385, -3.9104, 3.3913999, -12.1610985, -6.6896996, 3.3913999, -12.5385, -4.2641, 3.3913999, -9.881699, -6.6896996, 3.3913999, -10.0343, -3.9104, 3.3913999, -12.1610985, -6.6896996, 3.3913999, -12.5385, -4.2794, 3.3913999, -12.5385, -10.034201, 3.3913999, -3.7331, -10.034201, 3.3913999, -6.6894, -6.6896996, 3.3913999, -6.6894, -10.034201, 3.3913999, -6.6894, -6.6896996, 3.3913999, -10.0343, -6.6896996, 3.3913999, -6.6894, -13.378799, 3.3913999, -3.7331, -10.034201, 3.3913999, -6.6894, -10.034201, 3.3913999, -3.7331, -10.034201, 3.3913999, -10.0343, -6.6896996, 3.3913999, -12.5385, -6.6896996, 3.3913999, -10.0343, -10.034201, 3.3913999, -6.6894, -10.034201, 3.3913999, -10.0343, -6.6896996, 3.3913999, -10.0343, -10.034201, 3.3913999, -10.0343, -10.6998005, 3.3913999, -13.1763, -6.6896996, 3.3913999, -12.5385, -13.378799, 3.3913999, -3.7331, -13.378799, 3.3913999, -6.6894, -10.034201, 3.3913999, -6.6894, -13.378799, 3.3913999, -6.6894, -10.034201, 3.3913999, -10.0343, -10.034201, 3.3913999, -6.6894, -16.192, 3.3913999, -3.0972, -13.378799, 3.3913999, -6.6894, -13.378799, 3.3913999, -3.7331, -13.378799, 3.3913999, -10.0343, -10.6998005, 3.3913999, -13.1763, -10.034201, 3.3913999, -10.0343, -13.378799, 3.3913999, -6.6894, -13.378799, 3.3913999, -10.0343, -10.034201, 3.3913999, -10.0343, -13.378799, 3.3913999, -10.0343, -13.378799, 3.3913999, -13.378599, -10.6998005, 3.3913999, -13.1763, -16.192, 3.3913999, -3.0972, -16.723299, 3.3913999, -6.6894, -13.378799, 3.3913999, -6.6894, -19.754599, 3.3913999, -2.7854, -16.723299, 3.3913999, -6.6894, -16.192, 3.3913999, -3.0972, -19.754599, 3.3913999, -2.7854, -19.2812, 3.3913999, -6.6894, -16.723299, 3.3913999, -6.6894, -17.111599, 3.3913999, -0.000100016594, -19.754599, 3.3913999, -2.7854, -16.192, 3.3913999, -3.0972, -17.111599, 3.3913999, -0.000100016594, -19.9515, 3.3913999, -2.5836997, -19.754599, 3.3913999, -2.7854, -19.9515, 3.3913999, -2.5836997, -17.111599, 3.3913999, -0.000100016594, -20.068499, 3.3913999, -0.000100016594, -20.068499, 3.3913999, 3.3442, -20.068499, 3.3913999, -0.000100016594, -17.111599, 3.3913999, -0.000100016594, -20.068499, 3.3913999, 3.3442, -17.111599, 3.3913999, -0.000100016594, -17.111599, 3.3913999, 3.304, -20.068499, 3.3913999, 6.6891, -20.068499, 3.3913999, 3.3442, -17.111599, 3.3913999, 3.304, -22.332499, 3.3913999, 8.990399, -22.315199, 3.3913999, 6.6891, -20.068499, 3.3913999, 6.6891, -22.332499, 3.3913999, 8.990399, -20.068499, 3.3913999, 6.6891, -20.068499, 3.3913999, 9.1673, -20.068499, 3.3913999, 9.1673, -20.068499, 3.3913999, 6.6891, -16.723299, 3.3913999, 6.6891, -20.068499, 3.3913999, 6.6891, -17.111599, 3.3913999, 3.304, -16.723299, 3.3913999, 6.6891, -20.068499, 3.3913999, 9.1673, -16.723299, 3.3913999, 6.6891, -16.285099, 3.3913999, 9.5862, -16.723299, 3.3913999, 6.6891, -16.0544, 3.3913999, 9.808, -16.285099, 3.3913999, 9.5862, -16.0544, 3.3913999, 9.808, -16.723299, 3.3913999, 6.6891, -13.136101, 3.3913999, 6.7548, -17.111599, 3.3913999, 3.304, -13.136101, 3.3913999, 6.7548, -16.723299, 3.3913999, 6.6891, -16.0544, 3.3913999, 9.808, -13.136101, 3.3913999, 6.7548, -13.378799, 3.3913999, 10.0334, -13.378799, 3.3913999, 10.0334, -13.136101, 3.3913999, 6.7548, -10.034201, 3.3913999, 7.0772, -13.378799, 3.3913999, 10.0334, -10.034201, 3.3913999, 7.0772, -10.034201, 3.3913999, 10.0334, -13.136101, 3.3913999, 6.7548, -17.111599, 3.3913999, 3.304, -14.877501, 3.3913999, 4.6651998, -14.877501, 3.3913999, 4.6651998, -17.111599, 3.3913999, 3.304, -15.5823, 3.3913999, 4.0364, -13.136101, 3.3913999, 6.7548, -14.877501, 3.3913999, 4.6651998, -14.0949, 3.3913999, 5.5070996, 3.3444998, 3.3913999, 10.0334, 6.6889997, 3.3913999, 6.6891, 6.6889997, 3.3913999, 10.0334, 0, 3.3913999, 13.3783, 0, 3.3913999, 10.0334, 3.3444998, 3.3913999, 10.0334, 0, 3.3913999, 13.3783, 3.3444998, 3.3913999, 10.0334, 3.3444998, 3.3913999, 13.3783, 3.3444998, 3.3913999, 13.3783, 3.3444998, 3.3913999, 10.0334, 6.6889997, 3.3913999, 10.0334, 3.3444998, 3.3913999, 10.0334, 3.3444998, 3.3913999, 6.6891, 6.6889997, 3.3913999, 6.6891, 3.3444998, 3.3913999, 6.6891, 6.6889997, 3.3913999, 3.3442, 6.6889997, 3.3913999, 6.6891, 6.6889997, 3.3913999, 6.6891, 6.6889997, 3.3913999, 3.3442, 10.0335, 3.3913999, 4.2546997, 6.6889997, 3.3913999, 6.6891, 10.0335, 3.3913999, 4.2546997, 10.0335, 3.3913999, 6.6891, 6.6889997, 3.3913999, 10.0334, 6.6889997, 3.3913999, 6.6891, 10.0335, 3.3913999, 6.6891, 6.6889997, 3.3913999, 10.0334, 10.0335, 3.3913999, 6.6891, 10.0335, 3.3913999, 10.0334, 3.3444998, 3.3913999, 13.3783, 6.6889997, 3.3913999, 10.0334, 6.6889997, 3.3913999, 13.3783, 3.9143, 3.3913999, 16.5144, 3.3444998, 3.3913999, 13.3783, 6.6889997, 3.3913999, 13.3783, 3.3444998, 3.3913999, 13.3783, 3.9143, 3.3913999, 16.5144, 3.6397, 3.3913999, 16.2405, 3.9143, 3.3913999, 16.5144, 6.6889997, 3.3913999, 13.3783, 6.6889997, 3.3913999, 16.7227, -3.3452, 3.3913999, 13.3783, 0, 3.3913999, 10.0334, 0, 3.3913999, 13.3783, -3.3452, 3.3913999, 13.3783, -3.3452, 3.4796999, 10.0334, 0, 3.3913999, 10.0334, 0, 3.3913999, 10.0334, 0, 3.4796999, 6.6891, 3.3444998, 3.3913999, 6.6891, 0, 3.3913999, 10.0334, 3.3444998, 3.3913999, 6.6891, 3.3444998, 3.3913999, 10.0334, 0, 3.4796999, 6.6891, 3.3444998, 3.3913999, 3.3442, 3.3444998, 3.3913999, 6.6891, 0, 3.4796999, 6.6891, 0, 3.3913999, 3.3442, 3.3444998, 3.3913999, 3.3442, 6.6889997, 3.3913999, -0.000100016594, 10.0335, 3.3913999, -3.3451, 10.0335, 3.2212, -2.2310996, 6.6889997, 3.3913999, -0.000100016594, 6.6889997, 3.3913999, -3.3451, 10.0335, 3.3913999, -3.3451, -10.034201, 3.0033998, 6.6891, -13.136101, 3.3913999, 6.7548, -12.747801, 3.0033998, 6.3666997, -10.034201, 3.0033998, 6.6891, -10.034201, 3.3913999, 7.0772, -13.136101, 3.3913999, 6.7548, -2.5679002, 2.9782999, 7.6208997, -6.6896996, 3.4796999, 7.0772, -6.6896996, 3.0033998, 6.6891, -2.5679002, 2.9782999, 7.6208997, -2.1796002, 3.3107998, 8.009, -6.6896996, 3.4796999, 7.0772, -12.747801, 3.0033998, 6.3666997, -14.0949, 3.3913999, 5.5070996, -13.694601, 3.0033998, 5.1793, -12.747801, 3.0033998, 6.3666997, -13.136101, 3.3913999, 6.7548, -14.0949, 3.3913999, 5.5070996, -6.6896996, 3.0033998, 6.6891, -10.034201, 3.3913999, 7.0772, -10.034201, 3.0033998, 6.6891, -6.6896996, 3.0033998, 6.6891, -6.6896996, 3.4796999, 7.0772, -10.034201, 3.3913999, 7.0772, -16.723299, 3.0033998, -0.000100016594, -16.192, 3.3913999, -3.0972, -15.8036995, 3.0033998, -2.7097, -16.723299, 3.0033998, -0.000100016594, -17.111599, 3.3913999, -0.000100016594, -16.192, 3.3913999, -3.0972, -13.378799, 3.3913999, -3.7331, -15.8036995, 3.0033998, -2.7097, -16.192, 3.3913999, -3.0972, -13.378799, 3.3913999, -3.7331, -13.378799, 3.0033998, -3.3451, -15.8036995, 3.0033998, -2.7097, -2.9569001, 3.3913999, -0.000100016594, -4.0260997, 3.0033998, -1.6915, -3.6383996, 3.3913999, -2.0795999, -2.9569001, 3.3913999, -0.000100016594, -3.3452, 3.0033998, -0.000100016594, -4.0260997, 3.0033998, -1.6915, -3.6383996, 3.3913999, -2.0795999, -6.6896996, 3.0033998, -3.3451, -6.6896996, 3.3913999, -3.7331, -3.6383996, 3.3913999, -2.0795999, -4.0260997, 3.0033998, -1.6915, -6.6896996, 3.0033998, -3.3451, -10.034201, 3.3913999, -3.7331, -13.378799, 3.0033998, -3.3451, -13.378799, 3.3913999, -3.7331, -10.034201, 3.3913999, -3.7331, -10.034201, 3.0033998, -3.3451, -13.378799, 3.0033998, -3.3451, -6.6896996, 3.3913999, -3.7331, -10.034201, 3.0033998, -3.3451, -10.034201, 3.3913999, -3.7331, -6.6896996, 3.3913999, -3.7331, -6.6896996, 3.0033998, -3.3451, -10.034201, 3.0033998, -3.3451, -16.723299, 3.0033998, 2.9164999, -17.111599, 3.3913999, -0.000100016594, -16.723299, 3.0033998, -0.000100016594, -16.723299, 3.0033998, 2.9164999, -17.111599, 3.3913999, 3.304, -17.111599, 3.3913999, -0.000100016594, -14.4897995, 3.0033998, 4.2777, -15.5823, 3.3913999, 4.0364, -15.3722, 3.0033998, 3.6128, -14.4897995, 3.0033998, 4.2777, -14.877501, 3.3913999, 4.6651998, -15.5823, 3.3913999, 4.0364, -2.9569001, 3.3913999, 3.3442, -3.3452, 3.0033998, -0.000100016594, -2.9569001, 3.3913999, -0.000100016594, -2.9569001, 3.3913999, 3.3442, -3.3452, 3.0033998, 3.3442, -3.3452, 3.0033998, -0.000100016594, -2.1796002, 3.3107998, 8.009, -2.1397, 3.0033998, 5.1793, -1.7839999, 3.3913999, 5.216, -2.1796002, 3.3107998, 8.009, -2.5679002, 2.9782999, 7.6208997, -2.1397, 3.0033998, 5.1793, -6.6896996, 3.3913999, 10.0334, -2.1796002, 3.3107998, 8.009, -3.3452, 3.4796999, 10.0334, -6.6896996, 3.3913999, 10.0334, -6.6896996, 3.4796999, 7.0772, -2.1796002, 3.3107998, 8.009, -10.034201, 3.3913999, 10.0334, -6.6896996, 3.4796999, 7.0772, -6.6896996, 3.3913999, 10.0334, -10.034201, 3.3913999, 10.0334, -10.034201, 3.3913999, 7.0772, -6.6896996, 3.4796999, 7.0772, -1.7839999, 3.3913999, 5.216, 0, 3.4796999, 6.6891, -2.1796002, 3.3107998, 8.009, 0, 3.4796999, 6.6891, -1.7839999, 3.3913999, 5.216, -2.9569001, 3.3913999, 3.3442, 0, 3.4796999, 6.6891, -2.9569001, 3.3913999, 3.3442, 0, 3.3913999, 3.3442, -3.3452, 3.4796999, 10.0334, 0, 3.4796999, 6.6891, 0, 3.3913999, 10.0334, -3.3452, 3.4796999, 10.0334, -2.1796002, 3.3107998, 8.009, 0, 3.4796999, 6.6891, -2.1397, 3.0033998, 5.1793, -2.9569001, 3.3913999, 3.3442, -1.7839999, 3.3913999, 5.216, -2.1397, 3.0033998, 5.1793, -3.3452, 3.0033998, 3.3442, -2.9569001, 3.3913999, 3.3442, -14.0949, 3.3913999, 5.5070996, -14.4897995, 3.0033998, 4.2777, -13.694601, 3.0033998, 5.1793, -14.0949, 3.3913999, 5.5070996, -14.877501, 3.3913999, 4.6651998, -14.4897995, 3.0033998, 4.2777, -15.5823, 3.3913999, 4.0364, -16.723299, 3.0033998, 2.9164999, -15.3722, 3.0033998, 3.6128, -15.5823, 3.3913999, 4.0364, -17.111599, 3.3913999, 3.304, -16.723299, 3.0033998, 2.9164999, 16.722599, 3.3913999, -13.109999, 16.4746, 3.3913999, -13.3993, 16.8123, 3.1578999, -13.4637985, 10.0335, 3.0523999, -19.0296, 6.6797, 3.2777998, -18.734999, 6.6763997, 3.0570998, -19.0278, 10.0335, 3.0523999, -19.0296, 10.0335, 3.2784998, -18.7001, 6.6797, 3.2777998, -18.734999, 6.6889997, 3.3913999, -16.7235, 10.0335, 3.2784998, -18.7001, 10.0335, 3.3913999, -16.7235, 6.6889997, 3.3913999, -16.7235, 6.6797, 3.2777998, -18.734999, 10.0335, 3.2784998, -18.7001, 12.7383995, 3.3913999, -15.8953, 12.460499, 3.3913999, -16.1674, 12.747099, 3.1769, -16.1994, 4.6816, 3.3913999, -13.378599, 3.5892, 3.2033, -16.7235, 3.8384998, 3.3913999, -16.7235, 4.6816, 3.3913999, -13.378599, 4.413, 3.2091, -13.357899, 3.5892, 3.2033, -16.7235, -10.6998005, 3.3913999, -13.1763, -6.6896996, 3.175, -12.867498, -6.6896996, 3.3913999, -12.5385, -10.6998005, 3.3913999, -13.1763, -10.4046, 3.1608999, -13.429499, -6.6896996, 3.175, -12.867498, -22.8711, 3.4937, 3.3673, -23.3678, 3.4459999, 0.13709998, -23.171, 3.6251, 0.12290001, -22.8711, 3.4937, 3.3673, -23.079899, 3.314, 3.3673, -23.3678, 3.4459999, 0.13709998, -22.8711, 3.4937, 3.3673, -20.068499, 3.3913999, -0.000100016594, -20.068499, 3.3913999, 3.3442, -22.8711, 3.4937, 3.3673, -23.171, 3.6251, 0.12290001, -20.068499, 3.3913999, -0.000100016594, -23.079899, 3.314, 3.3673, -22.315199, 3.3913999, 6.6891, -22.5639, 3.2219, 6.6891, -23.079899, 3.314, 3.3673, -22.8711, 3.4937, 3.3673, -22.315199, 3.3913999, 6.6891, -22.315199, 3.3913999, 6.6891, -20.068499, 3.3913999, 3.3442, -20.068499, 3.3913999, 6.6891, -22.315199, 3.3913999, 6.6891, -22.8711, 3.4937, 3.3673, -20.068499, 3.3913999, 3.3442, -15.739201, 3.2087, 12.341301, -13.378799, 3.3913999, 10.0334, -13.378799, 3.3922, 12.5714, -15.739201, 3.2087, 12.341301, -16.0544, 3.3913999, 9.808, -13.378799, 3.3913999, 10.0334, -10.034201, 3.2142, 12.105801, -13.378799, 3.1938999, 12.808599, -13.378799, 3.3922, 12.5714, -10.034201, 3.2142, 12.105801, -10.034201, 2.9384, 12.453701, -13.378799, 3.1938999, 12.808599, -13.378799, 3.3922, 12.5714, -10.034201, 3.3913999, 10.0334, -10.034201, 3.2142, 12.105801, -13.378799, 3.3922, 12.5714, -13.378799, 3.3913999, 10.0334, -10.034201, 3.3913999, 10.0334, 0, 3.2243998, 15.7092, -3.3452, 3.1497998, 15.914499, -3.3452, 3.3913999, 15.601, 0, 3.2243998, 15.7092, 0, 2.9636998, 16.0175, -3.3452, 3.1497998, 15.914499, -3.3452, 3.3913999, 15.601, 0, 3.3913999, 13.3783, 0, 3.2243998, 15.7092, -3.3452, 3.3913999, 15.601, -3.3452, 3.3913999, 13.3783, 0, 3.3913999, 13.3783, 0, 3.2243998, 15.7092, 3.3444998, 3.3913999, 13.3783, 3.6397, 3.3913999, 16.2405, 0, 3.2243998, 15.7092, 0, 3.3913999, 13.3783, 3.3444998, 3.3913999, 13.3783, 3.6397, 3.3913999, 16.2405, 3.9143, 3.3913999, 16.5144, 3.6729999, 3.1532, 16.5718, 13.2491, 2.9931, -3.474, 16.722599, 3.3913999, -6.6894, 16.722599, 3.1513, -3.6023998, 13.2491, 2.9931, -3.474, 13.378099, 3.3913999, -6.6894, 16.722599, 3.3913999, -6.6894, 10.0335, 3.3913999, -3.3451, 13.378099, 3.3913999, -6.6894, 13.2491, 2.9931, -3.474, 10.0335, 3.3913999, -3.3451, 10.0335, 3.3913999, -6.6894, 13.378099, 3.3913999, -6.6894, 19.8151, 3.3908, -10.0177, 20.1469, 3.0588999, -6.6894, 19.8317, 3.2891998, -6.6894, 19.8151, 3.3908, -10.0177, 20.188799, 3.1655998, -10.0154, 20.1469, 3.0588999, -6.6894, 19.8317, 3.2891998, -6.6894, 20.139599, 2.779, -3.3616, 19.8317, 3.0491, -3.6023998, 19.8317, 3.2891998, -6.6894, 20.1469, 3.0588999, -6.6894, 20.139599, 2.779, -3.3616, 16.722599, 3.1513, -3.6023998, 19.8317, 3.2891998, -6.6894, 19.8317, 3.0491, -3.6023998, 16.722599, 3.1513, -3.6023998, 16.722599, 3.3913999, -6.6894, 19.8317, 3.2891998, -6.6894, 16.722599, 3.3913999, -6.6894, 19.8151, 3.3908, -10.0177, 19.8317, 3.2891998, -6.6894, 16.722599, 3.3913999, -6.6894, 16.722599, 3.3913999, -10.0343, 19.8151, 3.3908, -10.0177, 20.139599, 2.779, -3.3616, 16.722599, 3.1513, -3.6023998, 19.8317, 3.0491, -3.6023998, 20.139599, 2.779, -3.3616, 16.712599, 2.8734, -3.3451, 16.722599, 3.1513, -3.6023998, 19.767899, 3.1308, -13.4058, 19.7985, 3.3913999, -12.747999, 19.4075, 3.3913999, -13.109999, 19.767899, 3.1308, -13.4058, 20.1582, 3.1318998, -13.041399, 19.7985, 3.3913999, -12.747999, 19.767899, 3.1308, -13.4058, 16.722599, 3.3913999, -13.109999, 16.8123, 3.1578999, -13.4637985, 19.767899, 3.1308, -13.4058, 19.4075, 3.3913999, -13.109999, 16.722599, 3.3913999, -13.109999, 20.188799, 3.1655998, -10.0154, 19.7985, 3.3913999, -12.747999, 20.1582, 3.1318998, -13.041399, 20.188799, 3.1655998, -10.0154, 19.8151, 3.3908, -10.0177, 19.7985, 3.3913999, -12.747999, 16.722599, 3.3913999, -13.109999, 19.8151, 3.3908, -10.0177, 16.722599, 3.3913999, -10.0343, 19.8151, 3.3908, -10.0177, 16.722599, 3.3913999, -13.109999, 19.4075, 3.3913999, -13.109999, 19.8151, 3.3908, -10.0177, 19.4075, 3.3913999, -13.109999, 19.7985, 3.3913999, -12.747999, 16.4952, 3.3913999, -15.5392, 15.828299, 3.1678, -16.6064, 16.7698, 3.1685998, -15.8202, 16.4952, 3.3913999, -15.5392, 15.5536995, 3.3913999, -16.3177, 15.828299, 3.1678, -16.6064, 16.8123, 3.1578999, -13.4637985, 16.4952, 3.3913999, -15.5392, 16.7698, 3.1685998, -15.8202, 16.8123, 3.1578999, -13.4637985, 16.4746, 3.3913999, -13.3993, 16.4952, 3.3913999, -15.5392, 15.828299, 3.1678, -16.6064, 12.7383995, 3.3913999, -15.8953, 12.747099, 3.1769, -16.1994, 15.828299, 3.1678, -16.6064, 15.5536995, 3.3913999, -16.3177, 12.7383995, 3.3913999, -15.8953, 12.4485, 3.2073998, -18.4711, 12.299599, 2.942, -19.2491, 12.726398, 2.9599, -18.824299, 12.4485, 3.2073998, -18.4711, 12.0203, 3.1891, -18.8983, 12.299599, 2.942, -19.2491, 12.4485, 3.2073998, -18.4711, 12.747099, 3.1769, -16.1994, 12.460499, 3.3913999, -16.1674, 12.4485, 3.2073998, -18.4711, 12.726398, 2.9599, -18.824299, 12.747099, 3.1769, -16.1994, 12.299599, 2.942, -19.2491, 10.0335, 3.2784998, -18.7001, 10.0335, 3.0523999, -19.0296, 12.299599, 2.942, -19.2491, 12.0203, 3.1891, -18.8983, 10.0335, 3.2784998, -18.7001, 10.0335, 3.2784998, -18.7001, 12.460499, 3.3913999, -16.1674, 10.0335, 3.3913999, -16.7235, 12.460499, 3.3913999, -16.1674, 10.0335, 3.2784998, -18.7001, 12.0203, 3.1891, -18.8983, 12.460499, 3.3913999, -16.1674, 12.0203, 3.1891, -18.8983, 12.4485, 3.2073998, -18.4711, 5.6212, 3.2835999, -18.3475, 3.9036999, 3.1690998, -17.2696, 5.4681997, 3.0900998, -18.607199, 5.6212, 3.2835999, -18.3475, 4.0333, 3.3667998, -17.0276, 3.9036999, 3.1690998, -17.2696, 4.0333, 3.3667998, -17.0276, 6.6889997, 3.3913999, -16.7235, 3.8384998, 3.3913999, -16.7235, 6.6889997, 3.3913999, -16.7235, 4.0333, 3.3667998, -17.0276, 5.6212, 3.2835999, -18.3475, 6.6889997, 3.3913999, -16.7235, 5.6212, 3.2835999, -18.3475, 6.6797, 3.2777998, -18.734999, 3.8384998, 3.3913999, -16.7235, 3.9036999, 3.1690998, -17.2696, 4.0333, 3.3667998, -17.0276, 3.8384998, 3.3913999, -16.7235, 3.5892, 3.2033, -16.7235, 3.9036999, 3.1690998, -17.2696, 6.6763997, 3.0570998, -19.0278, 5.6212, 3.2835999, -18.3475, 5.4681997, 3.0900998, -18.607199, 6.6763997, 3.0570998, -19.0278, 6.6797, 3.2777998, -18.734999, 5.6212, 3.2835999, -18.3475, -15.2073, 3.5182998, -15.4569, -16.124199, 3.3711998, -15.150499, -15.441299, 3.3151, -15.7533, -15.2073, 3.5182998, -15.4569, -15.9035, 3.5797, -14.867699, -16.124199, 3.3711998, -15.150499, -15.9035, 3.5797, -14.867699, -13.378799, 3.3913999, -13.378599, -16.1309, 3.6227, -13.6241, -13.378799, 3.3913999, -13.378599, -15.9035, 3.5797, -14.867699, -15.2073, 3.5182998, -15.4569, -13.378799, 3.3913999, -13.378599, -15.2073, 3.5182998, -15.4569, -13.3874, 3.3918998, -15.424398, -16.1309, 3.6227, -13.6241, -16.124199, 3.3711998, -15.150499, -15.9035, 3.5797, -14.867699, -16.1309, 3.6227, -13.6241, -16.3755, 3.4225, -13.6283, -16.124199, 3.3711998, -15.150499, -13.385401, 3.1832, -15.7598, -15.2073, 3.5182998, -15.4569, -15.441299, 3.3151, -15.7533, -13.385401, 3.1832, -15.7598, -13.3874, 3.3918998, -15.424398, -15.2073, 3.5182998, -15.4569, -10.749701, 3.1581, -16.1136, -10.6998005, 3.3913999, -15.507799, -11.021601, 3.3913999, -15.7846985, -10.749701, 3.1581, -16.1136, -10.429201, 3.1564, -15.8326, -10.6998005, 3.3913999, -15.507799, -10.749701, 3.1581, -16.1136, -13.3874, 3.3918998, -15.424398, -13.385401, 3.1832, -15.7598, -10.749701, 3.1581, -16.1136, -11.021601, 3.3913999, -15.7846985, -13.3874, 3.3918998, -15.424398, -10.4046, 3.1608999, -13.429499, -10.6998005, 3.3913999, -15.507799, -10.429201, 3.1564, -15.8326, -10.4046, 3.1608999, -13.429499, -10.6998005, 3.3913999, -13.1763, -10.6998005, 3.3913999, -15.507799, -13.3874, 3.3918998, -15.424398, -10.6998005, 3.3913999, -13.1763, -13.378799, 3.3913999, -13.378599, -10.6998005, 3.3913999, -13.1763, -13.3874, 3.3918998, -15.424398, -11.021601, 3.3913999, -15.7846985, -10.6998005, 3.3913999, -13.1763, -11.021601, 3.3913999, -15.7846985, -10.6998005, 3.3913999, -15.507799, -3.9104, 3.3913999, -12.1610985, -4.0188, 3.1604998, -12.820099, -3.6476998, 3.1597998, -12.4415, -3.9104, 3.3913999, -12.1610985, -4.2794, 3.3913999, -12.5385, -4.0188, 3.1604998, -12.820099, -4.0188, 3.1604998, -12.820099, -6.6896996, 3.3913999, -12.5385, -6.6896996, 3.175, -12.867498, -4.0188, 3.1604998, -12.820099, -4.2794, 3.3913999, -12.5385, -6.6896996, 3.3913999, -12.5385, -3.5373998, 3.3913999, -9.750299, -3.6144996, 3.1664, -10.4478, -3.2335, 3.1696, -9.965099, -3.5373998, 3.3913999, -9.750299, -3.9104, 3.3913999, -10.240799, -3.6144996, 3.1664, -10.4478, -3.6144996, 3.1664, -10.4478, -3.9104, 3.3913999, -12.1610985, -3.6476998, 3.1597998, -12.4415, -3.6144996, 3.1664, -10.4478, -3.9104, 3.3913999, -10.240799, -3.9104, 3.3913999, -12.1610985, -0.0046999454, 3.1827998, -9.064699, -3.5373998, 3.3913999, -9.750299, -3.2335, 3.1696, -9.965099, -0.0046999454, 3.1827998, -9.064699, 0, 3.3913999, -8.714399, -3.5373998, 3.3913999, -9.750299, 4.1105, 3.3913999, -9.3386, 3.149, 3.1724, -9.052198, 3.8465, 3.1766, -9.664, 4.1105, 3.3913999, -9.3386, 3.4176, 3.3913999, -8.714399, 3.149, 3.1724, -9.052198, 4.1105, 3.3913999, -9.3386, 4.413, 3.2091, -13.357899, 4.6816, 3.3913999, -13.378599, 4.1105, 3.3913999, -9.3386, 3.8465, 3.1766, -9.664, 4.413, 3.2091, -13.357899, 3.149, 3.1724, -9.052198, 0, 3.3913999, -8.714399, -0.0046999454, 3.1827998, -9.064699, 3.149, 3.1724, -9.052198, 3.4176, 3.3913999, -8.714399, 0, 3.3913999, -8.714399, -19.2812, 3.3913999, -6.6894, -19.611, 3.187, -9.246899, -19.3743, 3.391, -9.417299, -19.2812, 3.3913999, -6.6894, -19.515299, 3.2122, -6.6894, -19.611, 3.187, -9.246899, -16.1255, 3.4196, -10.133099, -16.240599, 3.3848999, -8.961699, -16.7605, 3.3848, -9.501299, -16.1255, 3.4196, -10.133099, -15.5737, 3.3848999, -9.614899, -16.240599, 3.3848999, -8.961699, -16.1255, 3.4196, -10.133099, -17.049099, 3.1696, -9.7829, -16.4075, 3.2108998, -10.402899, -16.1255, 3.4196, -10.133099, -16.7605, 3.3848, -9.501299, -17.049099, 3.1696, -9.7829, -16.7605, 3.3848, -9.501299, -19.1775, 3.1662998, -9.7628, -17.049099, 3.1696, -9.7829, -16.7605, 3.3848, -9.501299, -18.8297, 3.3895998, -9.473499, -19.1775, 3.1662998, -9.7628, -16.3755, 3.4225, -13.6283, -16.1255, 3.4196, -10.133099, -16.4075, 3.2108998, -10.402899, -16.3755, 3.4225, -13.6283, -16.1309, 3.6227, -13.6241, -16.1255, 3.4196, -10.133099, -16.240599, 3.3848999, -8.961699, -13.378799, 3.3913999, -6.6894, -16.723299, 3.3913999, -6.6894, -13.378799, 3.3913999, -6.6894, -16.240599, 3.3848999, -8.961699, -15.5737, 3.3848999, -9.614899, -13.378799, 3.3913999, -6.6894, -15.5737, 3.3848999, -9.614899, -13.378799, 3.3913999, -10.0343, -16.1309, 3.6227, -13.6241, -15.5737, 3.3848999, -9.614899, -16.1255, 3.4196, -10.133099, -15.5737, 3.3848999, -9.614899, -16.1309, 3.6227, -13.6241, -13.378799, 3.3913999, -13.378599, -15.5737, 3.3848999, -9.614899, -13.378799, 3.3913999, -13.378599, -13.378799, 3.3913999, -10.0343, -19.3743, 3.391, -9.417299, -16.723299, 3.3913999, -6.6894, -19.2812, 3.3913999, -6.6894, -16.723299, 3.3913999, -6.6894, -19.3743, 3.391, -9.417299, -16.7605, 3.3848, -9.501299, -16.7605, 3.3848, -9.501299, -19.3743, 3.391, -9.417299, -18.8297, 3.3895998, -9.473499, -16.723299, 3.3913999, -6.6894, -16.7605, 3.3848, -9.501299, -16.240599, 3.3848999, -8.961699, -19.754599, 3.3913999, -2.7854, -19.9515, 3.3913999, -2.5836997, -19.9495, 3.2063, -2.8084998, -19.754599, 3.3913999, -2.7854, -19.515299, 3.2122, -6.6894, -19.2812, 3.3913999, -6.6894, -19.754599, 3.3913999, -2.7854, -19.8424, 3.2077, -3.7668996, -19.515299, 3.2122, -6.6894, -22.7335, 3.5105, -2.4837003, -23.3864, 3.3542, -2.205, -22.931599, 3.3177998, -2.7097, -22.7335, 3.5105, -2.4837003, -23.1883, 3.5481, -1.9755001, -23.3864, 3.3542, -2.205, -23.1883, 3.5481, -1.9755001, -20.068499, 3.3913999, -0.000100016594, -23.171, 3.6251, 0.12290001, -20.068499, 3.3913999, -0.000100016594, -23.1883, 3.5481, -1.9755001, -22.7335, 3.5105, -2.4837003, -20.068499, 3.3913999, -0.000100016594, -22.7335, 3.5105, -2.4837003, -19.9515, 3.3913999, -2.5836997, -23.171, 3.6251, 0.12290001, -23.3864, 3.3542, -2.205, -23.1883, 3.5481, -1.9755001, -23.171, 3.6251, 0.12290001, -23.3678, 3.4459999, 0.13709998, -23.3864, 3.3542, -2.205, -22.7335, 3.5105, -2.4837003, -19.9495, 3.2063, -2.8084998, -19.9515, 3.3913999, -2.5836997, -22.7335, 3.5105, -2.4837003, -22.931599, 3.3177998, -2.7097, -19.9495, 3.2063, -2.8084998, -22.332499, 3.3913999, 8.990399, -22.5912, 3.2112, 9.44, -22.7647, 3.2136, 9.1158, -22.7647, 3.2136, 9.1158, -22.315199, 3.3913999, 6.6891, -22.332499, 3.3913999, 8.990399, -22.7647, 3.2136, 9.1158, -22.5639, 3.2219, 6.6891, -22.315199, 3.3913999, 6.6891, -22.5912, 3.2112, 9.44, -20.068499, 3.3913999, 9.1673, -20.068499, 3.1943, 9.406899, -22.5912, 3.2112, 9.44, -22.332499, 3.3913999, 8.990399, -20.068499, 3.3913999, 9.1673, -6.2755, 3.126, 16.1251, -5.9743, 3.3983, 13.383699, -5.9743, 3.393, 15.6513, -6.2755, 3.126, 16.1251, -6.2755, 3.126, 13.6215, -5.9743, 3.3983, 13.383699, -17.1362, 3.192, 9.7157, -16.285099, 3.3913999, 9.5862, -16.2818, 3.1913998, 9.8050995, -16.285099, 3.3913999, 9.5862, -16.0544, 3.3913999, 9.808, -16.2818, 3.1913998, 9.8050995, -16.285099, 3.3913999, 9.5862, -20.068499, 3.1943, 9.406899, -20.068499, 3.3913999, 9.1673, -16.285099, 3.3913999, 9.5862, -17.1362, 3.192, 9.7157, -20.068499, 3.1943, 9.406899, -16.1122, 3.066, 12.232401, -15.739201, 3.2087, 12.341301, -15.571699, 3.0688, 12.748899, -15.739201, 3.2087, 12.341301, -16.2818, 3.1913998, 9.8050995, -16.0544, 3.3913999, 9.808, -15.739201, 3.2087, 12.341301, -16.1122, 3.066, 12.232401, -16.2818, 3.1913998, 9.8050995, -13.378799, 3.3922, 12.5714, -15.571699, 3.0688, 12.748899, -15.739201, 3.2087, 12.341301, -13.378799, 3.3922, 12.5714, -13.378799, 3.1938999, 12.808599, -15.571699, 3.0688, 12.748899, -6.4743, 3.3766, 12.7861, -5.5162, 3.398, 12.9678, -5.9743, 3.3983, 13.383699, -6.4743, 3.3766, 12.7861, -6.088, 3.3981, 12.428801, -5.5162, 3.398, 12.9678, -6.4743, 3.3766, 12.7861, -6.2755, 3.126, 13.6215, -6.7781997, 3.1009, 13.0322, -6.4743, 3.3766, 12.7861, -5.9743, 3.3983, 13.383699, -6.2755, 3.126, 13.6215, -6.4743, 3.3766, 12.7861, -10.034201, 2.9384, 12.453701, -10.034201, 3.2142, 12.105801, -6.4743, 3.3766, 12.7861, -6.7781997, 3.1009, 13.0322, -10.034201, 2.9384, 12.453701, -10.034201, 3.3913999, 10.0334, -6.4743, 3.3766, 12.7861, -10.034201, 3.2142, 12.105801, -6.4743, 3.3766, 12.7861, -10.034201, 3.3913999, 10.0334, -6.6896996, 3.3913999, 10.0334, -6.4743, 3.3766, 12.7861, -6.6896996, 3.3913999, 10.0334, -6.088, 3.3981, 12.428801, -6.6896996, 3.3913999, 10.0334, -5.5162, 3.398, 12.9678, -6.088, 3.3981, 12.428801, -5.5162, 3.398, 12.9678, -6.6896996, 3.3913999, 10.0334, -3.3452, 3.4796999, 10.0334, -5.5162, 3.398, 12.9678, -3.3452, 3.4796999, 10.0334, -3.3452, 3.3913999, 13.3783, -5.9743, 3.393, 15.6513, -6.0454, 3.135, 16.5322, -6.2755, 3.126, 16.1251, -5.9743, 3.393, 15.6513, -5.5313997, 3.3918, 16.0056, -6.0454, 3.135, 16.5322, -6.0454, 3.135, 16.5322, -3.3452, 3.3913999, 15.601, -3.3452, 3.1497998, 15.914499, -6.0454, 3.135, 16.5322, -5.5313997, 3.3918, 16.0056, -3.3452, 3.3913999, 15.601, -5.9743, 3.3983, 13.383699, -5.5313997, 3.3918, 16.0056, -5.9743, 3.393, 15.6513, -5.5313997, 3.3918, 16.0056, -5.9743, 3.3983, 13.383699, -3.3452, 3.3913999, 13.3783, -3.3452, 3.3913999, 13.3783, -5.9743, 3.3983, 13.383699, -5.5162, 3.398, 12.9678, -5.5313997, 3.3918, 16.0056, -3.3452, 3.3913999, 13.3783, -3.3452, 3.3913999, 15.601, 2.7767, 3.0992, 16.3949, 3.6397, 3.3913999, 16.2405, 3.6729999, 3.1532, 16.5718, 3.6397, 3.3913999, 16.2405, 0, 2.9636998, 16.0175, 0, 3.2243998, 15.7092, 3.6397, 3.3913999, 16.2405, 2.7767, 3.0992, 16.3949, 0, 2.9636998, 16.0175, 3.9987998, 3.4764, 18.6069, 3.9143, 3.3913999, 16.5144, 6.6889997, 3.3913999, 16.7227, 3.8212, 3.3128, 18.7347, 4.941, 3.4643, 19.3458, 4.8006997, 3.3019998, 19.5215, 3.8212, 3.3128, 18.7347, 3.9987998, 3.4764, 18.6069, 4.941, 3.4643, 19.3458, 6.6923, 3.3525, 19.0394, 4.8006997, 3.3019998, 19.5215, 4.941, 3.4643, 19.3458, 6.6923, 3.3525, 19.0394, 6.7794, 3.1271, 19.2435, 4.8006997, 3.3019998, 19.5215, 3.6729999, 3.1532, 16.5718, 3.9987998, 3.4764, 18.6069, 3.8212, 3.3128, 18.7347, 3.6729999, 3.1532, 16.5718, 3.9143, 3.3913999, 16.5144, 3.9987998, 3.4764, 18.6069, 6.6889997, 3.3913999, 16.7227, 4.941, 3.4643, 19.3458, 3.9987998, 3.4764, 18.6069, 6.6923, 3.3525, 19.0394, 4.941, 3.4643, 19.3458, 6.6889997, 3.3913999, 16.7227, 8.6452, 3.3837, 18.872, 9.5275, 3.2163, 18.6602, 8.8241, 3.2010999, 19.0991, 8.6452, 3.3837, 18.872, 9.3605995, 3.3913, 18.4371, 9.5275, 3.2163, 18.6602, 8.6452, 3.3837, 18.872, 6.7794, 3.1271, 19.2435, 6.6923, 3.3525, 19.0394, 8.6452, 3.3837, 18.872, 8.8241, 3.2010999, 19.0991, 6.7794, 3.1271, 19.2435, 9.5275, 3.2163, 18.6602, 10.388599, 3.3911998, 16.7085, 10.590099, 3.2050998, 16.7167, 9.5275, 3.2163, 18.6602, 9.3605995, 3.3913, 18.4371, 10.388599, 3.3911998, 16.7085, 6.6889997, 3.3913999, 16.7227, 8.6452, 3.3837, 18.872, 6.6923, 3.3525, 19.0394, 8.6452, 3.3837, 18.872, 6.6889997, 3.3913999, 16.7227, 10.388599, 3.3911998, 16.7085, 8.6452, 3.3837, 18.872, 10.388599, 3.3911998, 16.7085, 9.3605995, 3.3913, 18.4371, 9.8819, 3.359, 13.619101, 9.838699, 3.359, 12.8258, 10.225699, 3.399, 13.197901, 9.8819, 3.359, 13.619101, 9.4411, 3.359, 13.2192, 9.838699, 3.359, 12.8258, 9.8819, 3.359, 13.619101, 10.462399, 3.2359, 13.4067, 10.122, 3.1906, 13.8256, 9.8819, 3.359, 13.619101, 10.225699, 3.399, 13.197901, 10.462399, 3.2359, 13.4067, 12.575499, 3.4812999, 13.4044, 10.225699, 3.399, 13.197901, 12.125999, 3.6032, 13.197901, 12.575499, 3.4812999, 13.4044, 10.462399, 3.2359, 13.4067, 10.225699, 3.399, 13.197901, 6.6889997, 3.3913999, 13.3783, 10.388599, 3.3911998, 16.7085, 6.6889997, 3.3913999, 16.7227, 10.388599, 3.3911998, 16.7085, 6.6889997, 3.3913999, 13.3783, 9.4411, 3.359, 13.2192, 10.388599, 3.3911998, 16.7085, 9.4411, 3.359, 13.2192, 9.8819, 3.359, 13.619101, 6.6889997, 3.3913999, 10.0334, 9.4411, 3.359, 13.2192, 6.6889997, 3.3913999, 13.3783, 9.4411, 3.359, 13.2192, 6.6889997, 3.3913999, 10.0334, 10.0335, 3.3913999, 10.0334, 9.4411, 3.359, 13.2192, 10.0335, 3.3913999, 10.0334, 9.838699, 3.359, 12.8258, 9.8819, 3.359, 13.619101, 10.590099, 3.2050998, 16.7167, 10.388599, 3.3911998, 16.7085, 9.8819, 3.359, 13.619101, 10.122, 3.1906, 13.8256, 10.590099, 3.2050998, 16.7167, 12.125999, 3.6032, 13.197901, 13.189199, 3.2312999, 12.5394, 13.262999, 3.3165998, 13.403801, 12.125999, 3.6032, 13.197901, 12.9445, 3.6148, 12.325901, 13.189199, 3.2312999, 12.5394, 13.262999, 3.3165998, 13.403801, 12.575499, 3.4812999, 13.4044, 12.125999, 3.6032, 13.197901, 13.189199, 3.2312999, 12.5394, 12.732399, 3.3913999, 10.0334, 12.977798, 3.2031, 10.0163, 13.189199, 3.2312999, 12.5394, 12.9445, 3.6148, 12.325901, 12.732399, 3.3913999, 10.0334, 10.0335, 3.3913999, 10.0334, 10.225699, 3.399, 13.197901, 9.838699, 3.359, 12.8258, 10.225699, 3.399, 13.197901, 10.0335, 3.3913999, 10.0334, 12.9445, 3.6148, 12.325901, 12.9445, 3.6148, 12.325901, 10.0335, 3.3913999, 10.0334, 12.732399, 3.3913999, 10.0334, 10.225699, 3.399, 13.197901, 12.9445, 3.6148, 12.325901, 12.125999, 3.6032, 13.197901, 12.8249, 2.8544, 7.9231997, 12.9499, 3.3256998, 8.668, 11.173199, 3.3332, 6.6548, 10.0335, 3.3913999, 6.6891, 10.0335, 3.3913999, 4.2546997, 11.173199, 3.3332, 6.6548, 12.732399, 3.3913999, 10.0334, 13.175299, 2.4743, 8.0415, 12.977798, 3.2031, 10.0163, 13.175299, 2.4743, 8.0415, 12.732399, 3.3913999, 10.0334, 12.9499, 3.3256998, 8.668, 13.175299, 2.4743, 8.0415, 12.9499, 3.3256998, 8.668, 12.8249, 2.8544, 7.9231997, 10.0335, 3.3913999, 6.6891, 12.732399, 3.3913999, 10.0334, 10.0335, 3.3913999, 10.0334, 12.732399, 3.3913999, 10.0334, 10.0335, 3.3913999, 6.6891, 11.173199, 3.3332, 6.6548, 12.732399, 3.3913999, 10.0334, 11.173199, 3.3332, 6.6548, 12.9499, 3.3256998, 8.668, 16.722599, 3.1513, -3.6023998, 15.810999, 2.9368, -3.3060002, 13.2491, 2.9931, -3.474, 16.722599, 3.1513, -3.6023998, 16.712599, 2.8734, -3.3451, 15.810999, 2.9368, -3.3060002, 10.0335, 3.2212, -2.2310996, 10.0335, 3.3913999, -3.3451, 13.2491, 2.9931, -3.474, -16.7232, 0.6137, 0, -15.754801, 0.6137, 3.5372, -16.7232, 0.6137, 2.9164, -15.754801, 0.6137, 3.5372, -16.7232, 0.6137, 0, -13.378601, 0.6137, 0, -16.7232, 0.6137, 0, -15.803801, 0.6137, -2.7093, -13.378601, 0.6137, -3.3446002, -16.7232, 0.6137, 0, -13.378601, 0.6137, -3.3446002, -13.378601, 0.6137, 0, -13.378601, 0.6137, 0, -13.378601, 0.6137, -3.3446002, -10.033899, 0.6137, -3.3446002, -15.754801, 0.6137, 3.5372, -13.378601, 0.6137, 0, -14.489201, 0.6137, 4.2777, -13.378601, 0.6137, 0, -10.033899, 0.6137, -3.3446002, -10.033899, 0.6137, 0, -14.489201, 0.6137, 4.2777, -13.378601, 0.6137, 0, -10.033899, 0.6137, 0, -10.033899, 0.6137, 0, -10.033899, 0.6137, -3.3446002, -6.6893, 0.6137, -3.3446002, -10.033899, 0.6137, 0, -6.6893, 0.6137, -3.3446002, -6.6893, 0.6137, 0, -6.6893, 0.6137, 0, -6.6893, 0.6137, -3.3446002, -4.0259, 0.6137, -1.6911998, -6.6893, 0.6137, 0, -4.0259, 0.6137, -1.6911998, -3.3446999, 0.6137, 0, -10.033899, 0.6137, 3.3446, -10.033899, 0.6137, 0, -6.6893, 0.6137, 0, -14.489201, 0.6137, 4.2777, -10.033899, 0.6137, 0, -10.033899, 0.6137, 3.3446, -6.6893, 0.6137, 3.3446, -6.6893, 0.6137, 0, -3.3446999, 0.6137, 0, -10.033899, 0.6137, 3.3446, -6.6893, 0.6137, 0, -6.6893, 0.6137, 3.3446, -6.6893, 0.6137, 3.3446, -3.3446999, 0.6137, 0, -3.3446999, 0.6137, 3.3446, -10.033899, 0.6137, 6.6893, -14.489201, 0.6137, 4.2777, -10.033899, 0.6137, 3.3446, -10.033899, 0.6137, 6.6893, -10.033899, 0.6137, 3.3446, -6.6893, 0.6137, 3.3446, -10.033899, 0.6137, 6.6893, -6.6893, 0.6137, 3.3446, -6.6893, 0.6137, 6.6893, -10.033899, 0.6137, 6.6893, -13.6772, 0.6137, 5.2616, -14.489201, 0.6137, 4.2777, -13.6772, 0.6137, 5.2616, -10.033899, 0.6137, 6.6893, -12.7477, 0.6137, 6.3669996, -6.6893, 0.6137, 3.3446, -2.5675998, 0.0266, 7.6215, -6.6893, 0.6137, 6.6893, -2.5675998, 0.0266, 7.6215, -6.6893, 0.6137, 3.3446, -3.3446999, 0.6137, 3.3446, -2.5675998, 0.0266, 7.6215, -3.3446999, 0.6137, 3.3446, -2.1193, 0.6137, 5.2736, 10.033899, 0, -20.467, 6.6766996, 3.0570998, -19.0275, 6.6893, 0, -20.1318, 10.033899, 0, -20.467, 10.033899, 3.0523999, -19.0294, 6.6766996, 3.0570998, -19.0275, 3.0140998, 0, -16.7232, 4.4131, 3.2091, -13.357698, 3.3446, -0.3989, -12.9443, 3.0140998, 0, -16.7232, 3.5895, 3.2033, -16.7232, 4.4131, 3.2091, -13.357698, -6.6893, 0, -14.263699, -10.404301, 3.1608999, -13.429499, -9.6168995, 0, -14.127899, -6.6893, 0, -14.263699, -6.6893, 3.175, -12.866999, -10.404301, 3.1608999, -13.429499, -23.412498, -0.2913, 0.26119995, -23.0793, 3.314, 3.3674998, -23.412498, 0, 3.3446, -23.412498, -0.2913, 0.26119995, -23.3676, 3.4459999, 0.1372, -23.0793, 3.314, 3.3674998, -23.412498, 0, 3.3446, -22.563799, 3.2219, 6.6893, -23.8078, 0, 6.6893, -23.412498, 0, 3.3446, -23.0793, 3.314, 3.3674998, -22.563799, 3.2219, 6.6893, -13.378601, 0, 13.378601, -10.033899, 2.9384, 12.453701, -10.033899, 0, 13.378601, -13.378601, 0, 13.378601, -13.378601, 3.194, 12.808901, -10.033899, 2.9384, 12.453701, -3.3446002, 0, 16.7232, 0, 2.9636998, 16.0179, 0, 0, 16.7232, -3.3446002, 0, 16.7232, -3.3446002, 3.1497998, 15.9146, 0, 2.9636998, 16.0179, 21.2349, 0, -6.6893, 20.188799, 3.1655998, -10.014999, 21.8888, 0, -10.033899, 21.2349, 0, -6.6893, 20.147, 3.0588999, -6.6893, 20.188799, 3.1655998, -10.014999, 20.1586, 3.1318998, -13.0413, 20.809599, 0, -13.7309, 21.251299, 0, -13.3043995, 20.1586, 3.1318998, -13.0413, 19.7684, 3.1308, -13.405399, 20.809599, 0, -13.7309, 20.809599, 0, -13.7309, 16.8128, 3.1578999, -13.463299, 18.0241, 0, -14.301899, 20.809599, 0, -13.7309, 19.7684, 3.1308, -13.405399, 16.8128, 3.1578999, -13.463299, 21.8888, 0, -10.033899, 20.1586, 3.1318998, -13.0413, 21.251299, 0, -13.3043995, 21.8888, 0, -10.033899, 20.188799, 3.1655998, -10.014999, 20.1586, 3.1318998, -13.0413, 16.7704, 3.1685998, -15.819698, 16.3113, 0, -16.9629, 17.503, 0, -15.940498, 16.7704, 3.1685998, -15.819698, 15.8286, 3.1678, -16.6059, 16.3113, 0, -16.9629, 16.3113, 0, -16.9629, 12.747099, 3.1769, -16.199, 13.701399, 0, -17.416399, 16.3113, 0, -16.9629, 15.8286, 3.1678, -16.6059, 12.747099, 3.1769, -16.199, 18.0241, 0, -14.301899, 16.7704, 3.1685998, -15.819698, 17.503, 0, -15.940498, 18.0241, 0, -14.301899, 16.8128, 3.1578999, -13.463299, 16.7704, 3.1685998, -15.819698, 12.961399, 0, -20.5828, 12.727098, 2.9599, -18.8239, 12.2999, 2.942, -19.2491, 12.961399, 0, -20.5828, 13.423399, 0, -20.1574, 12.727098, 2.9599, -18.8239, 12.961399, 0, -20.5828, 10.033899, 3.0523999, -19.0294, 10.033899, 0, -20.467, 12.961399, 0, -20.5828, 12.2999, 2.942, -19.2491, 10.033899, 3.0523999, -19.0294, 13.701399, 0, -17.416399, 12.727098, 2.9599, -18.8239, 13.423399, 0, -20.1574, 13.701399, 0, -17.416399, 12.747099, 3.1769, -16.199, 12.727098, 2.9599, -18.8239, 3.2372, 0, -19.3395, 5.4684, 3.0900998, -18.6069, 3.9039, 3.1690998, -17.2691, 3.2372, 0, -19.3395, 4.4523, 0, -20.444399, 5.4684, 3.0900998, -18.6069, 6.6893, 0, -20.1318, 5.4684, 3.0900998, -18.6069, 4.4523, 0, -20.444399, 6.6893, 0, -20.1318, 6.6766996, 3.0570998, -19.0275, 5.4684, 3.0900998, -18.6069, 3.2372, 0, -19.3395, 3.5895, 3.2033, -16.7232, 3.0140998, 0, -16.7232, 3.2372, 0, -19.3395, 3.9039, 3.1690998, -17.2691, 3.5895, 3.2033, -16.7232, -15.441, 3.3151, -15.753099, -16.7232, 0, -16.113699, -16.1493, 0, -16.8284, -15.441, 3.3151, -15.753099, -16.1238, 3.3711998, -15.15, -16.7232, 0, -16.113699, -16.7232, 0, -16.113699, -16.3753, 3.4225, -13.627699, -16.7232, 0, -13.378599, -16.7232, 0, -16.113699, -16.1238, 3.3711998, -15.15, -16.3753, 3.4225, -13.627699, -13.378601, 0, -17.3364, -15.441, 3.3151, -15.753099, -16.1493, 0, -16.8284, -13.378601, 0, -17.3364, -13.3848, 3.1832, -15.7598, -15.441, 3.3151, -15.753099, -10.3452, 0, -16.7803, -10.4286995, 3.1564, -15.832399, -10.7493, 3.1581, -16.1132, -10.3452, 0, -16.7803, -9.983101, 0, -16.4067, -10.4286995, 3.1564, -15.832399, -10.3452, 0, -16.7803, -13.3848, 3.1832, -15.7598, -13.378601, 0, -17.3364, -10.3452, 0, -16.7803, -10.7493, 3.1581, -16.1132, -13.3848, 3.1832, -15.7598, -9.6168995, 0, -14.127899, -10.4286995, 3.1564, -15.832399, -9.983101, 0, -16.4067, -9.6168995, 0, -14.127899, -10.404301, 3.1608999, -13.429499, -10.4286995, 3.1564, -15.832399, -3.6946998, 0, -13.471199, -3.6475997, 3.1597998, -12.441198, -4.0183997, 3.1606, -12.819899, -3.6946998, 0, -13.471199, -3.2535, 0, -13.020899, -3.6475997, 3.1597998, -12.441198, -3.6946998, 0, -13.471199, -6.6893, 3.175, -12.866999, -6.6893, 0, -14.263699, -3.6946998, 0, -13.471199, -4.0183997, 3.1606, -12.819899, -6.6893, 3.175, -12.866999, -3.2331, 3.1696, -9.964899, -2.7220998, 0, -10.936998, -2.2352996, 0, -10.6031, -3.2331, 3.1696, -9.964899, -3.6138997, 3.1664, -10.447599, -2.7220998, 0, -10.936998, 0, 0, -10.7654, -3.2331, 3.1696, -9.964899, -2.2352996, 0, -10.6031, 0, 0, -10.7654, -0.0039999485, 3.1827998, -9.0644, -3.2331, 3.1696, -9.964899, -2.7220998, 0, -10.936998, -3.6475997, 3.1597998, -12.441198, -3.2535, 0, -13.020899, -2.7220998, 0, -10.936998, -3.6138997, 3.1664, -10.447599, -3.6475997, 3.1597998, -12.441198, 3.847, 3.1766, -9.663599, 2.2182999, 0, -10.525, 2.9573, -0.1021, -11.0952, 3.847, 3.1766, -9.663599, 3.1496, 3.1724, -9.052, 2.2182999, 0, -10.525, 3.3446, -0.3989, -12.9443, 3.847, 3.1766, -9.663599, 2.9573, -0.1021, -11.0952, 3.3446, -0.3989, -12.9443, 4.4131, 3.2091, -13.357698, 3.847, 3.1766, -9.663599, 2.2182999, 0, -10.525, -0.0039999485, 3.1827998, -9.0644, 0, 0, -10.7654, 2.2182999, 0, -10.525, 3.1496, 3.1724, -9.052, -0.0039999485, 3.1827998, -9.0644, -20.108599, 0, -9.592199, -19.176899, 3.1662998, -9.762199, -19.6161, 3.2075999, -9.711699, -20.108599, 0, -9.592199, -19.6286, 0, -10.1098995, -19.176899, 3.1662998, -9.762199, -19.6161, 3.2075999, -9.711699, -20.3764, 0, -6.6893, -20.108599, 0, -9.592199, -20.3764, 0, -6.6893, -19.6161, 3.2075999, -9.711699, -19.610699, 3.187, -9.246599, -20.3764, 0, -6.6893, -19.610699, 3.187, -9.246599, -19.515, 3.2122, -6.6893, -16.407099, 3.2108998, -10.4028, -17.8929, 0, -10.41, -17.1586, 0, -11.120298, -16.407099, 3.2108998, -10.4028, -17.0486, 3.1696, -9.782799, -17.8929, 0, -10.41, -16.7232, 0, -13.378599, -16.407099, 3.2108998, -10.4028, -17.1586, 0, -11.120298, -16.7232, 0, -13.378599, -16.3753, 3.4225, -13.627699, -16.407099, 3.2108998, -10.4028, -17.8929, 0, -10.41, -19.176899, 3.1662998, -9.762199, -19.6286, 0, -10.1098995, -17.8929, 0, -10.41, -17.0486, 3.1696, -9.782799, -19.176899, 3.1662998, -9.762199, -19.841799, 3.2077, -3.7668, -19.7545, 3.3913999, -2.7851996, -19.9489, 3.2063, -2.8082, -19.841799, 3.2077, -3.7668, -21.0086, -0.2504, -3.5043998, -20.1607, -0.2436, -4.5060997, -19.841799, 3.2077, -3.7668, -19.9489, 3.2063, -2.8082, -21.0086, -0.2504, -3.5043998, -20.3764, 0, -6.6893, -19.841799, 3.2077, -3.7668, -20.1607, -0.2436, -4.5060997, -20.3764, 0, -6.6893, -19.515, 3.2122, -6.6893, -19.841799, 3.2077, -3.7668, -22.9314, 3.3177998, -2.7092, -23.412498, -0.0385, -2.8684, -22.9552, -0.047599997, -3.375, -22.9314, 3.3177998, -2.7092, -23.3864, 3.3542, -2.2045999, -23.412498, -0.0385, -2.8684, -23.412498, -0.0385, -2.8684, -23.3676, 3.4459999, 0.1372, -23.412498, -0.2913, 0.26119995, -23.412498, -0.0385, -2.8684, -23.3864, 3.3542, -2.2045999, -23.3676, 3.4459999, 0.1372, -21.0086, -0.2504, -3.5043998, -22.9314, 3.3177998, -2.7092, -22.9552, -0.047599997, -3.375, -21.0086, -0.2504, -3.5043998, -19.9489, 3.2063, -2.8082, -22.9314, 3.3177998, -2.7092, -22.756899, 0, 10.033899, -22.7643, 3.2136, 9.1159, -22.5907, 3.2112, 9.440499, -22.756899, 0, 10.033899, -23.489, 0, 9.386499, -22.7643, 3.2136, 9.1159, -23.8078, 0, 6.6893, -22.7643, 3.2136, 9.1159, -23.489, 0, 9.386499, -23.8078, 0, 6.6893, -22.563799, 3.2219, 6.6893, -22.7643, 3.2136, 9.1159, -16.7232, 0, 10.8878, -17.1359, 3.192, 9.715799, -16.2818, 3.1913998, 9.8056, -16.7232, 0, 10.8878, -17.583, 0, 10.033899, -17.1359, 3.192, 9.715799, -20.0679, 0, 10.033899, -17.1359, 3.192, 9.715799, -17.583, 0, 10.033899, -20.0679, 0, 10.033899, -20.0679, 3.1943, 9.407499, -17.1359, 3.192, 9.715799, -16.111599, 3.066, 12.2328, -16.223, 0, 13.378601, -16.7232, 0, 12.878401, -16.111599, 3.066, 12.2328, -15.5713005, 3.0688999, 12.748899, -16.223, 0, 13.378601, -16.223, 0, 13.378601, -13.378601, 3.194, 12.808901, -13.378601, 0, 13.378601, -16.223, 0, 13.378601, -15.5713005, 3.0688999, 12.748899, -13.378601, 3.194, 12.808901, -16.7232, 0, 10.8878, -16.111599, 3.066, 12.2328, -16.7232, 0, 12.878401, -16.7232, 0, 10.8878, -16.2818, 3.1913998, 9.8056, -16.111599, 3.066, 12.2328, -6.6893, 0, 13.8773, -6.7777, 3.1009, 13.0326, -6.2748, 3.126, 13.622, -6.6893, 0, 13.8773, -7.1966996, 0, 13.378601, -6.7777, 3.1009, 13.0326, -10.033899, 0, 13.378601, -6.7777, 3.1009, 13.0326, -7.1966996, 0, 13.378601, -10.033899, 0, 13.378601, -10.033899, 2.9384, 12.453701, -6.7777, 3.1009, 13.0326, -6.1093993, 0, 16.7232, -6.2748, 3.1260998, 16.1257, -6.0452, 3.135, 16.5325, -6.1093993, 0, 16.7232, -6.6893, 0, 16.1455, -6.2748, 3.1260998, 16.1257, -6.1093993, 0, 16.7232, -3.3446002, 3.1497998, 15.9146, -3.3446002, 0, 16.7232, -6.1093993, 0, 16.7232, -6.0452, 3.135, 16.5325, -3.3446002, 3.1497998, 15.9146, -6.6893, 0, 13.8773, -6.2748, 3.1260998, 16.1257, -6.6893, 0, 16.1455, -6.6893, 0, 13.8773, -6.2748, 3.126, 13.622, -6.2748, 3.1260998, 16.1257, 3.3446, 0, 17.592, 2.777, 3.0992, 16.3951, 3.6736, 3.1532, 16.5721, 3.3446, 0, 17.592, 2.4738998, 0, 16.7232, 2.777, 3.0992, 16.3951, 0, 0, 16.7232, 2.777, 3.0992, 16.3951, 2.4738998, 0, 16.7232, 0, 0, 16.7232, 0, 2.9636998, 16.0179, 2.777, 3.0992, 16.3951, 3.3446, 0, 17.592, 3.8212998, 3.3128, 18.735199, 3.3446, 0, 19.1425, 3.3446, 0, 17.592, 3.6736, 3.1532, 16.5721, 3.8212998, 3.3128, 18.735199, 4.275, 0, 20.0679, 6.7795997, 3.1271, 19.243599, 6.6893, 0, 20.0679, 4.275, 0, 20.0679, 4.8012, 3.3019998, 19.5215, 6.7795997, 3.1271, 19.243599, 3.8212998, 3.3128, 18.735199, 4.275, 0, 20.0679, 3.3446, 0, 19.1425, 3.8212998, 3.3128, 18.735199, 4.8012, 3.3019998, 19.5215, 4.275, 0, 20.0679, -22.756899, 0, 10.033899, -20.0679, 3.1943, 9.407499, -20.0679, 0, 10.033899, -22.756899, 0, 10.033899, -22.5907, 3.2112, 9.440499, -20.0679, 3.1943, 9.407499, 10.572599, 0, 19.5895, 8.8245, 3.2012, 19.0993, 9.5278, 3.2163, 18.6607, 10.572599, 0, 19.5895, 10.080299, 0, 20.0679, 8.8245, 3.2012, 19.0993, 6.6893, 0, 20.0679, 8.8245, 3.2012, 19.0993, 10.080299, 0, 20.0679, 6.6893, 0, 20.0679, 6.7795997, 3.1271, 19.243599, 8.8245, 3.2012, 19.0993, 10.572599, 0, 19.5895, 10.5903, 3.2052, 16.7169, 10.572599, 0, 16.7232, 10.572599, 0, 19.5895, 9.5278, 3.2163, 18.6607, 10.5903, 3.2052, 16.7169, 10.986898, 0, 13.9188, 10.122399, 3.1906, 13.826099, 10.462799, 3.2359, 13.406799, 10.986898, 0, 13.9188, 10.572599, 0, 14.3402, 10.122399, 3.1906, 13.826099, 10.572599, 0, 16.7232, 10.122399, 3.1906, 13.826099, 10.572599, 0, 14.3402, 10.572599, 0, 16.7232, 10.5903, 3.2052, 16.7169, 10.122399, 3.1906, 13.826099, 13.8046, 0, 13.2202, 12.5756, 3.4812999, 13.4049, 13.2631, 3.3165998, 13.404301, 13.8046, 0, 13.2202, 13.105099, 0, 13.9188, 12.5756, 3.4812999, 13.4049, 13.2631, 3.3165998, 13.404301, 13.8046, 0, 10.033899, 13.8046, 0, 13.2202, 13.8046, 0, 10.033899, 13.2631, 3.3165998, 13.404301, 13.1894, 3.2312999, 12.539801, 13.8046, 0, 10.033899, 13.1894, 3.2312999, 12.539801, 12.9783, 3.2031, 10.0168, 10.986898, 0, 13.9188, 12.5756, 3.4812999, 13.4049, 13.105099, 0, 13.9188, 10.986898, 0, 13.9188, 10.462799, 3.2359, 13.406799, 12.5756, 3.4812999, 13.4049, 13.8046, 0, 10.033899, 13.175798, 2.4743, 8.042, 14.0257, 0.0442, 7.3252997, 13.8046, 0, 10.033899, 12.9783, 3.2031, 10.0168, 13.175798, 2.4743, 8.042, 20.1399, 2.779, -3.3615003, 21.09, -0.0218, -4.9179, 20.613499, 1.0832, -3.1922002, 21.09, -0.0218, -4.9179, 20.1399, 2.779, -3.3615003, 20.147, 3.0588999, -6.6893, 21.09, -0.0218, -4.9179, 20.147, 3.0588999, -6.6893, 21.2349, 0, -6.6893, 15.6619, 2.2603, -2.7998996, 20.1399, 2.779, -3.3615003, 20.613499, 1.0832, -3.1922002, 20.1399, 2.779, -3.3615003, 15.6619, 2.2603, -2.7998996, 16.7127, 2.8734, -3.3446002, 16.7127, 2.8734, -3.3446002, 15.6619, 2.2603, -2.7998996, 15.810999, 2.9368, -3.3059, 13.249599, 2.9931998, -3.4737, 15.810999, 2.9368, -3.3059, 14.217899, 2.8779, -3.3838, 14.217899, 2.8779, -3.3838, 15.810999, 2.9368, -3.3059, 15.6619, 2.2603, -2.7998996, -16.7232, 3.0033998, 2.9164, -15.754801, 0.6137, 3.5372, -15.372101, 3.0033998, 3.6132, -16.7232, 3.0033998, 2.9164, -16.7232, 0.6137, 2.9164, -15.754801, 0.6137, 3.5372, -14.489201, 3.0033998, 4.2777, -13.6772, 0.6137, 5.2616, -13.694401, 3.0033998, 5.1798, -14.489201, 3.0033998, 4.2777, -14.489201, 0.6137, 4.2777, -13.6772, 0.6137, 5.2616, -15.803801, 3.0033998, -2.7093, -16.7232, 0.6137, 0, -16.7232, 3.0033998, 0, -15.803801, 3.0033998, -2.7093, -15.803801, 0.6137, -2.7093, -16.7232, 0.6137, 0, -16.7232, 3.0033998, 0, -16.7232, 0.6137, 2.9164, -16.7232, 3.0033998, 2.9164, -16.7232, 3.0033998, 0, -16.7232, 0.6137, 0, -16.7232, 0.6137, 2.9164, -3.3446999, 3.0033998, 0, -4.0259, 0.6137, -1.6911998, -4.0259, 3.0033998, -1.6911998, -3.3446999, 3.0033998, 0, -3.3446999, 0.6137, 0, -4.0259, 0.6137, -1.6911998, -3.3446999, 3.0033998, 3.3446, -3.3446999, 0.6137, 0, -3.3446999, 3.0033998, 0, -3.3446999, 3.0033998, 3.3446, -3.3446999, 0.6137, 3.3446, -3.3446999, 0.6137, 0, -12.7477, 3.0033998, 6.3669996, -10.033899, 0.6137, 6.6893, -10.033899, 3.0033998, 6.6893, -12.7477, 3.0033998, 6.3669996, -12.7477, 0.6137, 6.3669996, -10.033899, 0.6137, 6.6893, -10.033899, 3.0033998, -3.3446002, -13.378601, 0.6137, -3.3446002, -13.378601, 3.0033998, -3.3446002, -10.033899, 3.0033998, -3.3446002, -10.033899, 0.6137, -3.3446002, -13.378601, 0.6137, -3.3446002, -6.6893, 3.0033998, -3.3446002, -10.033899, 0.6137, -3.3446002, -10.033899, 3.0033998, -3.3446002, -6.6893, 3.0033998, -3.3446002, -6.6893, 0.6137, -3.3446002, -10.033899, 0.6137, -3.3446002, -13.378601, 3.0033998, -3.3446002, -15.803801, 0.6137, -2.7093, -15.803801, 3.0033998, -2.7093, -13.378601, 3.0033998, -3.3446002, -13.378601, 0.6137, -3.3446002, -15.803801, 0.6137, -2.7093, -4.0259, 3.0033998, -1.6911998, -6.6893, 0.6137, -3.3446002, -6.6893, 3.0033998, -3.3446002, -4.0259, 3.0033998, -1.6911998, -4.0259, 0.6137, -1.6911998, -6.6893, 0.6137, -3.3446002, -6.6893, 3.0033998, 6.6893, -2.5675998, 0.0266, 7.6215, -2.5675998, 2.9782, 7.6215, -6.6893, 3.0033998, 6.6893, -6.6893, 0.6137, 6.6893, -2.5675998, 0.0266, 7.6215, -10.033899, 3.0033998, 6.6893, -6.6893, 0.6137, 6.6893, -6.6893, 3.0033998, 6.6893, -10.033899, 3.0033998, 6.6893, -10.033899, 0.6137, 6.6893, -6.6893, 0.6137, 6.6893, -2.5675998, 2.9782, 7.6215, -2.1193, 0.6137, 5.2736, -2.1397996, 3.0033998, 5.1794, -2.5675998, 2.9782, 7.6215, -2.5675998, 0.0266, 7.6215, -2.1193, 0.6137, 5.2736, -2.1193, 0.6137, 5.2736, -3.3446999, 3.0033998, 3.3446, -2.1397996, 3.0033998, 5.1794, -2.1193, 0.6137, 5.2736, -3.3446999, 0.6137, 3.3446, -3.3446999, 3.0033998, 3.3446, -13.6772, 0.6137, 5.2616, -12.7477, 3.0033998, 6.3669996, -13.694401, 3.0033998, 5.1798, -13.6772, 0.6137, 5.2616, -12.7477, 0.6137, 6.3669996, -12.7477, 3.0033998, 6.3669996, -15.754801, 0.6137, 3.5372, -14.489201, 3.0033998, 4.2777, -15.372101, 3.0033998, 3.6132, -15.754801, 0.6137, 3.5372, -14.489201, 0.6137, 4.2777, -14.489201, 3.0033998, 4.2777, -3.3446002, -1.4008, -23.412498, 0, -1.0608, -26.7572, 0, -0.9271, -23.412498, -3.3446002, -1.4008, -23.412498, -3.3446002, -1.458, -26.7572, 0, -1.0608, -26.7572, -16.7232, -1.7572, -23.412498, -13.378601, -2.7663999, -26.7572, -13.378601, -1.3177999, -23.412498, -16.7232, -1.7572, -23.412498, -16.7232, -3.0929, -26.7572, -13.378601, -2.7663999, -26.7572, 10.033899, 0, -23.412498, 13.378599, -0.8401, -26.7572, 13.378599, 0, -23.412498, 10.033899, 0, -23.412498, 10.033899, -0.8648, -26.7572, 13.378599, -0.8401, -26.7572, 3.3446, -0.3434, -23.412498, 6.6893, -1.0129, -26.7572, 6.6893, 0, -23.412498, 3.3446, -0.3434, -23.412498, 3.3446, -0.98829997, -26.7572, 6.6893, -1.0129, -26.7572, -23.412498, -2.7663999, -23.412498, -20.0679, -3.0929, -26.7572, -20.0679, -2.7663999, -23.412498, -23.412498, -2.7663999, -23.412498, -23.412498, -3.0929, -26.7572, -20.0679, -3.0929, -26.7572, -26.7572, -2.7663999, -23.412498, -23.412498, -3.0929, -26.7572, -23.412498, -2.7663999, -23.412498, -26.7572, -2.7663999, -23.412498, -26.7572, -3.0929, -26.7572, -23.412498, -3.0929, -26.7572, -23.412498, -0.7606, -16.7232, -20.0679, -1.7572, -20.0679, -20.0679, -0.43429998, -16.7232, -23.412498, -0.7606, -16.7232, -23.412498, -2.7663999, -20.0679, -20.0679, -1.7572, -20.0679, -10.033899, -0.2814, 23.412498, -6.6893, 0, 20.0679, -6.6893, -0.2814, 23.412498, -6.6893, -0.2814, 23.412498, -6.6893, 0, 20.0679, -3.3446002, 0, 20.0679, -10.033899, -0.2814, 23.412498, -10.033899, 0, 20.0679, -6.6893, 0, 20.0679, -6.6893, -0.2814, 23.412498, -3.3446002, 0, 20.0679, -3.3446002, -0.2814, 23.412498, -3.3446002, -0.2814, 23.412498, -3.3446002, 0, 20.0679, 0, 0, 20.0679, -3.3446002, -0.2814, 23.412498, 0, 0, 20.0679, 0, -0.2814, 23.412498, -13.378601, 0, 20.0679, -10.033899, 0, 20.0679, -10.033899, -0.2814, 23.412498, -13.378601, 0, 20.0679, -10.033899, -0.2814, 23.412498, -12.357901, -0.2814, 23.412498, -13.378601, -0.2814, 23.412498, -13.378601, 0, 20.0679, -12.357901, -0.2814, 23.412498, -23.412498, -0.36479998, 16.7232, -23.412498, 0, 13.378601, -20.0679, -0.36479998, 16.7232, -23.412498, 0, 13.378601, -20.0679, 0, 13.378601, -20.0679, -0.36479998, 16.7232, -23.412498, -0.7373, 23.412498, -23.412498, -0.692, 20.0679, -20.0679, -0.5589, 23.412498, -16.7232, -0.36479998, 23.412498, -16.7232, -0.36479998, 20.0679, -13.378601, -0.2814, 23.412498, 16.7232, -1.0746, 16.7232, 20.0679, -1.0746, 13.378601, 20.0679, -1.8294, 16.7232, 20.0679, -1.8294, 16.7232, 20.0679, -1.0746, 13.378601, 23.412498, -1.8294, 13.378601, 16.7232, -1.8294, 20.0679, 16.7232, -1.0746, 16.7232, 20.0679, -1.8294, 16.7232, 16.7232, -2.2719998, 23.3902, 20.0679, -1.8294, 20.0679, 20.0679, -2.2719998, 23.3902, 16.7232, -2.2719998, 23.3902, 16.7232, -1.8294, 20.0679, 20.0679, -1.8294, 20.0679, 16.7232, -1.8294, 20.0679, 16.7232, -2.2719998, 23.3902, 13.378599, -2.2719998, 23.3902, 20.0679, -2.2719998, 23.3902, 20.0679, -1.8294, 20.0679, 23.412498, -1.8294, 20.0679, 20.0679, -2.2719998, 23.3902, 23.412498, -1.8294, 20.0679, 23.412498, -2.2719998, 23.3902, 23.412498, -1.8294, 20.0679, 26.7582, -2.2719998, 23.3902, 23.412498, -2.2719998, 23.3902, 23.412498, -1.8294, 20.0679, 26.7582, -1.8294, 20.0679, 26.7582, -2.2719998, 23.3902, -10.033899, -0.9271, -23.412498, -6.6893, -1.458, -26.7572, -6.6893, -1.3241999, -23.412498, -10.033899, -0.9271, -23.412498, -10.033899, -1.8786, -26.7572, -6.6893, -1.458, -26.7572, -3.3446002, -0.9271, -16.7232, 0, -0.9271, -20.0679, 0, -0.9271, -16.7232, -3.3446002, -0.9271, -16.7232, -3.3446002, -0.9271, -20.0679, 0, -0.9271, -20.0679, -6.6893, -0.9271, -20.0679, -3.3446002, -0.9271, -20.0679, -3.3446002, -0.9271, -16.7232, 16.7232, -0.3105, -23.412498, 16.7232, -1.3382, -26.7572, 20.0679, -0.8222, -23.412498, 20.0679, 0, -16.7232, 20.0679, -0.2837, -20.0679, 23.412498, -0.456, -16.7232, 13.378599, 0, -23.412498, 13.378599, -0.8401, -26.7572, 16.7232, -0.3105, -23.412498, 16.7232, 0, -20.0679, 16.7232, -0.3105, -23.412498, 20.0679, -0.2837, -20.0679, -6.6893, 0, -16.7232, -6.6893, -0.9271, -20.0679, -3.3446002, -0.9271, -16.7232, -13.378601, -1.3177999, -23.412498, -10.033899, -1.8786, -26.7572, -10.033899, -0.9271, -23.412498, -13.378601, -1.3177999, -23.412498, -13.378601, -2.7663999, -26.7572, -10.033899, -1.8786, -26.7572, -13.210501, -0.3964, -20.032099, -10.033899, -0.9271, -23.412498, -9.318001, -0.3969, -19.413, -13.210501, -0.3964, -20.032099, -13.378601, -1.3177999, -23.412498, -10.033899, -0.9271, -23.412498, -9.318001, -0.3969, -19.413, -10.033899, -0.9271, -23.412498, -6.6893, -0.9271, -20.0679, 20.0679, -1.0746, 13.378601, 20.0679, 0, 10.033899, 23.412498, -0.35529998, 10.033899, 13.378599, -2.2719998, 23.3902, 16.7232, -2.2194998, 26.781, 13.378599, -2.2194998, 26.781, 13.378599, -2.2719998, 23.3902, 16.7232, -2.2719998, 23.3902, 16.7232, -2.2194998, 26.781, 16.7232, -2.2194998, 26.781, 16.7232, -2.2719998, 23.3902, 20.0679, -2.2719998, 23.3902, 16.7232, -2.2194998, 26.781, 20.0679, -2.2719998, 23.3902, 20.0679, -2.2194998, 26.781, 20.0679, -2.2194998, 26.781, 20.0679, -2.2719998, 23.3902, 23.412498, -2.2719998, 23.3902, 20.0679, -2.2194998, 26.781, 23.412498, -2.2719998, 23.3902, 23.412498, -2.2194998, 26.781, 13.378599, -1.0746, 20.0679, 15.0508995, -0.40039998, 16.7232, 16.7232, -1.0746, 16.7232, 16.7232, -1.0746, 13.378601, 16.7232, 0, 10.033899, 20.0679, 0, 10.033899, 20.0679, 0, 10.033899, 20.0679, -1.0746, 13.378601, 16.7232, -1.0746, 13.378601, 6.6893, -1.1209999, 26.7572, 10.033899, -0.501, 23.412498, 10.033899, -1.1209999, 26.7572, 6.6893, -1.1209999, 26.7572, 6.6893, -0.2814, 23.412498, 10.033899, -0.501, 23.412498, 10.033899, -1.1209999, 26.7572, 13.378599, -2.2719998, 23.3902, 13.378599, -2.2194998, 26.781, 10.033899, -1.1209999, 26.7572, 10.033899, -0.501, 23.412498, 13.378599, -2.2719998, 23.3902, 0, -1.1209999, 26.7572, 3.3446, -0.2814, 23.412498, 3.3446, -1.1209999, 26.7572, 3.3446, -1.1209999, 26.7572, 3.3446, -0.2814, 23.412498, 6.6893, -0.2814, 23.412498, 3.3446, -1.1209999, 26.7572, 6.6893, -0.2814, 23.412498, 6.6893, -1.1209999, 26.7572, 0, -1.1209999, 26.7572, 0, -0.2814, 23.412498, 3.3446, -0.2814, 23.412498, -3.3446002, -1.1209999, 26.7572, 0, -0.2814, 23.412498, 0, -1.1209999, 26.7572, -3.3446002, -1.1209999, 26.7572, -3.3446002, -0.2814, 23.412498, 0, -0.2814, 23.412498, -6.6893, -1.1209999, 26.7572, -3.3446002, -0.2814, 23.412498, -3.3446002, -1.1209999, 26.7572, -6.6893, -1.1209999, 26.7572, -6.6893, -0.2814, 23.412498, -3.3446002, -0.2814, 23.412498, -10.033899, -1.1209999, 26.7572, -6.6893, -0.2814, 23.412498, -6.6893, -1.1209999, 26.7572, -10.033899, -1.1209999, 26.7572, -10.033899, -0.2814, 23.412498, -6.6893, -0.2814, 23.412498, -10.033899, -1.1209999, 26.7572, -12.357901, -0.2814, 23.412498, -10.033899, -0.2814, 23.412498, -10.033899, -1.1209999, 26.7572, -13.378601, -0.2814, 23.412498, -12.357901, -0.2814, 23.412498, -13.378601, -0.2814, 23.412498, -10.033899, -1.1209999, 26.7572, -13.378601, -1.1209999, 26.7572, 16.7232, -1.0746, 13.378601, 15.0508995, -0.6288, 13.378601, 16.7232, 0, 10.033899, -29.294899, -0.6617, 3.3446, -25.479, -0.4588, 0.143, -25.869999, -0.2764, 3.3446, -29.294899, -0.6617, 3.3446, -27.9812, -0.6617, 0, -25.479, -0.4588, 0.143, -29.294899, -0.6617, 6.6893, -25.869999, -0.2764, 3.3446, -25.945799, -0.25779998, 6.6893, -29.294899, -0.6617, 6.6893, -29.294899, -0.6617, 3.3446, -25.869999, -0.2764, 3.3446, -20.0679, -0.5589, 23.412498, -20.0679, -0.36479998, 20.0679, -16.7232, -0.36479998, 23.412498, -20.0679, -1.1374999, 26.7572, -20.0679, -0.5589, 23.412498, -16.7232, -1.1374999, 26.7572, -16.7232, -1.1374999, 26.7572, -16.7232, -0.36479998, 23.412498, -13.378601, -1.1209999, 26.7572, -26.7572, -1.0756, 23.412498, -25.174, -0.7391, 20.0679, -23.412498, -0.7373, 23.412498, -26.7572, -1.0756, 23.412498, -26.7572, -1.0756, 20.0679, -25.174, -0.7391, 20.0679, -26.7572, -1.2701, 26.7572, -23.412498, -0.7373, 23.412498, -23.412498, -1.1374999, 26.7572, -26.7572, -1.2701, 26.7572, -26.7572, -1.0756, 23.412498, -23.412498, -0.7373, 23.412498, -23.412498, -1.1374999, 26.7572, -23.412498, -0.7373, 23.412498, -20.0679, -1.1374999, 26.7572, -29.294899, -1.0265, 16.7232, -25.9681, -0.2875, 13.378601, -25.4212, -0.5907, 16.7232, -29.294899, -1.0265, 16.7232, -29.294899, -0.6617, 13.378601, -25.9681, -0.2875, 13.378601, -25.9681, -0.2875, 13.378601, -23.412498, -0.36479998, 16.7232, -25.4212, -0.5907, 16.7232, -23.412498, -0.36479998, 16.7232, -25.9681, -0.2875, 13.378601, -23.412498, 0, 13.378601, -26.7572, -1.0756, 20.0679, -25.4212, -0.5907, 16.7232, -25.174, -0.7391, 20.0679, -26.7572, -1.0756, 20.0679, -29.294899, -1.0265, 16.7232, -25.4212, -0.5907, 16.7232, -23.412498, -0.692, 20.0679, -23.412498, -0.36479998, 16.7232, -20.0679, -0.36479998, 20.0679, -13.378601, 0, 16.7232, -10.033899, 0, 13.378601, -10.033899, 0, 16.7232, -13.378601, 0, 16.7232, -13.378601, 0, 13.378601, -10.033899, 0, 13.378601, -13.378601, 0, 20.0679, -13.378601, 0, 16.7232, -10.033899, 0, 16.7232, -13.378601, 0, 20.0679, -10.033899, 0, 16.7232, -10.033899, 0, 20.0679, -10.033899, 0, 16.7232, -6.6893, 0, 20.0679, -10.033899, 0, 20.0679, -10.033899, 0, 13.378601, -7.2641997, 0, 16.7232, -10.033899, 0, 16.7232, -6.6893, 0, 20.0679, -10.033899, 0, 16.7232, -7.2641997, 0, 16.7232, -6.6893, 0, 13.8773, -10.033899, 0, 13.378601, -7.1966996, 0, 13.378601, -7.2641997, 0, 16.7232, -10.033899, 0, 13.378601, -6.6893, 0, 13.8773, -7.2641997, 0, 16.7232, -6.6893, 0, 13.8773, -6.6893, 0, 16.1455, -6.1093993, 0, 16.7232, -7.2641997, 0, 16.7232, -6.6893, 0, 16.1455, -6.6893, 0, 20.0679, -7.2641997, 0, 16.7232, -6.6893, 0, 17.298199, -6.1093993, 0, 16.7232, -6.6893, 0, 17.298199, -7.2641997, 0, 16.7232, -6.6893, 0, 17.298199, -3.3446002, 0, 20.0679, -6.6893, 0, 20.0679, -3.3446002, 0, 20.0679, -6.6893, 0, 17.298199, -6.1093993, 0, 16.7232, -3.3446002, 0, 20.0679, -6.1093993, 0, 16.7232, -3.3446002, 0, 16.7232, -3.3446002, 0, 20.0679, -3.3446002, 0, 16.7232, 0, 0, 16.7232, -3.3446002, 0, 20.0679, 0, 0, 16.7232, 0, 0, 20.0679, 0, 0, 16.7232, 2.4261, 0, 20.0679, 0, 0, 20.0679, 2.4261, 0, 20.0679, 0, 0, 16.7232, 3.3446, 0, 17.592, 3.3446, 0, 17.592, 0, 0, 16.7232, 2.4738998, 0, 16.7232, 2.4261, 0, 20.0679, 3.3446, 0, 17.592, 3.3446, 0, 19.1425, 4.275, 0, 20.0679, 2.4261, 0, 20.0679, 3.3446, 0, 19.1425, 4.275, 0, 20.0679, 3.3446, 0, 20.986399, 2.4261, 0, 20.0679, -26.7572, -1.6710999, -17.1511, -23.412498, -2.7663999, -20.0679, -23.412498, -0.7606, -16.7232, -26.7572, -1.6710999, -17.1511, -26.7572, -1.6710999, -20.4958, -23.412498, -2.7663999, -20.0679, -29.294899, -0.6617, -13.378599, -23.412498, -0.7606, -16.7232, -23.412498, 0, -13.378599, -29.294899, -0.6617, -13.378599, -26.7572, -1.6710999, -17.1511, -23.412498, -0.7606, -16.7232, -23.412498, 0, -13.378599, -23.412498, -0.7606, -16.7232, -20.0679, -0.43429998, -16.7232, -26.7572, -1.6710999, -20.4958, -23.412498, -2.7663999, -23.412498, -23.412498, -2.7663999, -20.0679, -26.7572, -1.6710999, -20.4958, -26.7572, -2.7663999, -23.412498, -23.412498, -2.7663999, -23.412498, -23.412498, -2.7663999, -20.0679, -20.0679, -2.7663999, -23.412498, -20.0679, -1.7572, -20.0679, -23.412498, -2.7663999, -20.0679, -23.412498, -2.7663999, -23.412498, -20.0679, -2.7663999, -23.412498, -29.294899, -0.6617, -10.033899, -23.412498, 0, -13.378599, -23.412498, 0, -10.033899, -29.294899, -0.6617, -10.033899, -29.294899, -0.6617, -13.378599, -23.412498, 0, -13.378599, -29.294899, -0.6617, -6.6893, -29.294899, -0.6617, -10.033899, -23.412498, 0, -10.033899, -29.294899, -0.6617, -6.6893, -23.412498, 0, -10.033899, -23.412498, 0, -6.6893, 0, 0, -13.378599, 0, -0.9271, -16.7232, 3.0140998, 0, -16.7232, 0, -0.9271, -23.412498, 3.3446, -0.98829997, -26.7572, 3.3446, -0.3434, -23.412498, 0, -0.9271, -23.412498, 0, -1.0608, -26.7572, 3.3446, -0.98829997, -26.7572, 21.2349, 0, -6.6893, 23.412498, 0, -10.033899, 23.412498, 0, -6.6893, 21.2349, 0, -6.6893, 21.8888, 0, -10.033899, 23.412498, 0, -10.033899, 21.8888, 0, -10.033899, 21.5122, 0, -13.6136, 23.412498, 0, -10.033899, 21.8888, 0, -10.033899, 21.251299, 0, -13.3043995, 21.5122, 0, -13.6136, 21.5122, 0, -13.6136, 23.412498, 0, -13.378599, 23.412498, 0, -10.033899, 20.809599, 0, -13.7309, 21.5122, 0, -13.6136, 21.251299, 0, -13.3043995, 21.0698, 0, -13.966099, 23.412498, 0, -13.378599, 21.5122, 0, -13.6136, 20.809599, 0, -13.7309, 21.0698, 0, -13.966099, 21.5122, 0, -13.6136, 21.0698, 0, -13.966099, 20.0679, 0, -16.7232, 23.412498, 0, -13.378599, 20.809599, 0, -13.7309, 18.053999, 0, -16.7802, 21.0698, 0, -13.966099, 18.053999, 0, -16.7802, 20.0679, 0, -16.7232, 21.0698, 0, -13.966099, 20.809599, 0, -13.7309, 17.503, 0, -15.940498, 18.053999, 0, -16.7802, 17.503, 0, -15.940498, 20.809599, 0, -13.7309, 18.0241, 0, -14.301899, 16.3113, 0, -16.9629, 18.053999, 0, -16.7802, 17.503, 0, -15.940498, 17.1022, 0, -17.6197, 20.0679, 0, -16.7232, 18.053999, 0, -16.7802, 16.3113, 0, -16.9629, 17.1022, 0, -17.6197, 18.053999, 0, -16.7802, 17.1022, 0, -17.6197, 16.7232, 0, -20.0679, 20.0679, 0, -16.7232, 16.3113, 0, -16.9629, 13.748098, 0, -20.540499, 17.1022, 0, -17.6197, 13.748098, 0, -20.540499, 16.7232, 0, -20.0679, 17.1022, 0, -17.6197, 16.3113, 0, -16.9629, 13.423399, 0, -20.1574, 13.748098, 0, -20.540499, 13.423399, 0, -20.1574, 16.3113, 0, -16.9629, 13.701399, 0, -17.416399, 12.961399, 0, -20.5828, 13.748098, 0, -20.540499, 13.423399, 0, -20.1574, 13.378599, 0, -20.9734, 16.7232, 0, -20.0679, 13.748098, 0, -20.540499, 12.961399, 0, -20.5828, 13.378599, 0, -20.9734, 13.748098, 0, -20.540499, 13.378599, 0, -20.9734, 13.378599, 0, -23.412498, 16.7232, 0, -20.0679, 10.033899, 0, -20.467, 13.378599, 0, -20.9734, 12.961399, 0, -20.5828, 10.033899, 0, -23.412498, 13.378599, 0, -23.412498, 13.378599, 0, -20.9734, 10.033899, 0, -20.467, 10.033899, 0, -23.412498, 13.378599, 0, -20.9734, 6.6893, 0, -20.1318, 10.033899, 0, -23.412498, 10.033899, 0, -20.467, 6.6893, 0, -20.1318, 6.6893, 0, -23.412498, 10.033899, 0, -23.412498, 6.6893, 0, -23.412498, 6.6893, 0, -20.1318, 4.4523, 0, -20.444399, 6.6893, 0, -23.412498, 4.4523, 0, -20.444399, 3.3446, 0, -21.6384, 3.2372, 0, -19.3395, 3.3446, 0, -21.6384, 4.4523, 0, -20.444399, 3.2372, 0, -19.3395, 2.3184, 0, -20.4362, 3.3446, 0, -21.6384, 6.6893, 0, -23.412498, 10.033899, -0.8648, -26.7572, 10.033899, 0, -23.412498, 6.6893, 0, -23.412498, 6.6893, -1.0129, -26.7572, 10.033899, -0.8648, -26.7572, -20.0679, -2.7663999, -23.412498, -16.7232, -3.0929, -26.7572, -16.7232, -1.7572, -23.412498, -20.0679, -2.7663999, -23.412498, -20.0679, -3.0929, -26.7572, -16.7232, -3.0929, -26.7572, -20.0679, -1.7572, -20.0679, -16.7232, -1.7572, -23.412498, -17.2383, -0.66719997, -19.6364, -20.0679, -1.7572, -20.0679, -20.0679, -2.7663999, -23.412498, -16.7232, -1.7572, -23.412498, -17.2383, -0.66719997, -19.6364, -13.378601, -1.3177999, -23.412498, -13.210501, -0.3964, -20.032099, -17.2383, -0.66719997, -19.6364, -16.7232, -1.7572, -23.412498, -13.378601, -1.3177999, -23.412498, -20.0679, -0.36479998, 20.0679, -20.0679, -0.36479998, 16.7232, -16.7232, -0.36479998, 20.0679, -23.412498, -0.36479998, 16.7232, -20.0679, -0.36479998, 16.7232, -20.0679, -0.36479998, 20.0679, -20.0679, -0.36479998, 20.0679, -16.7232, -0.36479998, 20.0679, -16.7232, -0.36479998, 23.412498, -16.7232, -0.36479998, 20.0679, -16.7232, -0.26209998, 16.7232, -13.378601, 0, 20.0679, 20.0679, -1.8294, 20.0679, 23.412498, -1.8294, 16.7232, 23.412498, -1.8294, 20.0679, 23.412498, -1.8294, 16.7232, 26.7582, -1.8294, 20.0679, 23.412498, -1.8294, 20.0679, 23.412498, -1.8294, 16.7232, 26.7582, -1.8294, 16.7232, 26.7582, -1.8294, 20.0679, 20.0679, -1.8294, 20.0679, 20.0679, -1.8294, 16.7232, 23.412498, -1.8294, 16.7232, 20.0679, -1.8294, 16.7232, 20.0679, -1.8294, 20.0679, 16.7232, -1.8294, 20.0679, 23.412498, -1.8294, 13.378601, 23.412498, -1.8294, 16.7232, 20.0679, -1.8294, 16.7232, 23.412498, -1.8294, 13.378601, 26.7582, -1.8294, 16.7232, 23.412498, -1.8294, 16.7232, 23.412498, -1.8294, 13.378601, 26.7582, -1.8294, 13.378601, 26.7582, -1.8294, 16.7232, -6.6893, -1.3241999, -23.412498, -3.3446002, -1.458, -26.7572, -3.3446002, -1.4008, -23.412498, -6.6893, -1.3241999, -23.412498, -6.6893, -1.458, -26.7572, -3.3446002, -1.458, -26.7572, -6.6893, -0.9271, -20.0679, -3.3446002, -1.4008, -23.412498, -3.3446002, -0.9271, -20.0679, -6.6893, -0.9271, -20.0679, -6.6893, -1.3241999, -23.412498, -3.3446002, -1.4008, -23.412498, -3.3446002, -0.9271, -20.0679, 0, -0.9271, -23.412498, 0, -0.9271, -20.0679, -3.3446002, -0.9271, -20.0679, -3.3446002, -1.4008, -23.412498, 0, -0.9271, -23.412498, 20.0679, -0.8222, -23.412498, 23.412498, -1.1158999, -26.7572, 23.412498, -1.0924, -23.412498, 20.0679, -0.8222, -23.412498, 20.0679, -1.1922, -26.7572, 23.412498, -1.1158999, -26.7572, 20.0679, -0.2837, -20.0679, 20.0679, -0.8222, -23.412498, 23.412498, -1.0924, -20.0679, 26.7573, -1.3222, -26.7572, 29.564798, -1.6410999, -23.412498, 26.7582, -1.0924, -23.412498, 26.7573, -1.3222, -26.7572, 29.3928, -1.796, -26.7572, 29.564798, -1.6410999, -23.412498, 13.378599, -1.0746, 20.0679, 16.7232, -1.8294, 20.0679, 13.378599, -2.2719998, 23.3902, 13.378599, -1.0746, 20.0679, 15.0508995, -1.0746, 20.0679, 16.7232, -1.8294, 20.0679, 0, -0.9271, -20.0679, 3.3446, 0, -21.6384, 2.3184, 0, -20.4362, 0, -0.9271, -20.0679, 3.3446, -0.3434, -23.412498, 3.3446, 0, -21.6384, 0, -0.9271, -16.7232, 3.2372, 0, -19.3395, 3.0140998, 0, -16.7232, 0, -0.9271, -16.7232, 2.3184, 0, -20.4362, 3.2372, 0, -19.3395, 3.3446, 0, -21.6384, 3.3446, -0.3434, -23.412498, 6.6893, 0, -23.412498, -16.7232, 0, -16.113699, -16.7232, 0, -17.2664, -16.1493, 0, -16.8284, -16.7232, 0, -16.113699, -17.2664, 0, -16.7232, -16.7232, 0, -17.2664, -20.0679, -0.43429998, -16.7232, -16.7232, 0, -17.2664, -17.2664, 0, -16.7232, -20.0679, -0.43429998, -16.7232, -17.2383, -0.66719997, -19.6364, -16.7232, 0, -17.2664, -20.0679, -0.43429998, -16.7232, -16.7232, 0, -13.378599, -20.0679, 0, -13.378599, -16.7232, 0, -13.378599, -20.0679, -0.43429998, -16.7232, -17.2664, 0, -16.7232, -16.7232, 0, -13.378599, -17.2664, 0, -16.7232, -16.7232, 0, -16.113699, -17.2383, -0.66719997, -19.6364, -16.1493, 0, -16.8284, -16.7232, 0, -17.2664, -16.1493, 0, -16.8284, -17.2383, -0.66719997, -19.6364, -13.210501, -0.3964, -20.032099, -16.1493, 0, -16.8284, -13.210501, -0.3964, -20.032099, -13.378601, 0, -17.3364, -10.3452, 0, -16.7803, -9.7488, 0, -16.7232, -9.983101, 0, -16.4067, -10.3452, 0, -16.7803, -10.033899, 0, -17.008299, -9.7488, 0, -16.7232, -6.6893, 0, -14.263699, -9.983101, 0, -16.4067, -9.7488, 0, -16.7232, -9.983101, 0, -16.4067, -6.6893, 0, -14.263699, -9.6168995, 0, -14.127899, -6.6893, 0, -14.263699, -9.7488, 0, -16.7232, -6.6893, 0, -16.7232, -6.6893, 0, -14.263699, -6.6893, 0, -16.7232, -3.3446002, 0, -13.7127, -6.6893, 0, -14.263699, -3.3446002, 0, -13.7127, -3.6946998, 0, -13.471199, -3.6946998, 0, -13.471199, -3.3446002, 0, -13.7127, -3.0105996, 0, -13.378599, 0, 0, -13.378599, -3.0105996, 0, -13.378599, -3.3446002, 0, -13.7127, -3.6946998, 0, -13.471199, -3.0105996, 0, -13.378599, -3.2535, 0, -13.020899, 0, 0, -13.378599, -3.2535, 0, -13.020899, -3.0105996, 0, -13.378599, -2.2352996, 0, -10.6031, -3.2535, 0, -13.020899, 0, 0, -13.378599, -3.2535, 0, -13.020899, -2.2352996, 0, -10.6031, -2.7220998, 0, -10.936998, -2.2352996, 0, -10.6031, 0, 0, -13.378599, 0, 0, -10.7654, -13.210501, -0.3964, -20.032099, -10.3452, 0, -16.7803, -13.378601, 0, -17.3364, -10.3452, 0, -16.7803, -13.210501, -0.3964, -20.032099, -9.318001, -0.3969, -19.413, -10.3452, 0, -16.7803, -9.318001, -0.3969, -19.413, -10.033899, 0, -17.008299, -10.033899, 0, -17.008299, -6.6893, 0, -16.7232, -9.7488, 0, -16.7232, -10.033899, 0, -17.008299, -9.318001, -0.3969, -19.413, -6.6893, 0, -16.7232, -3.3446002, 0, -13.7127, 0, -0.9271, -16.7232, 0, 0, -13.378599, -3.3446002, 0, -13.7127, -3.3446002, -0.9271, -16.7232, 0, -0.9271, -16.7232, 0, 0, -13.378599, 2.2182999, 0, -10.525, 0, 0, -10.7654, 2.2182999, 0, -10.525, 0, 0, -13.378599, 3.3446, -0.3989, -12.9443, 2.2182999, 0, -10.525, 3.3446, -0.3989, -12.9443, 2.9573, -0.1021, -11.0952, -20.108599, 0, -9.592199, -20.0679, 0, -10.476398, -19.6286, 0, -10.1098995, -20.108599, 0, -9.592199, -20.5103, 0, -10.033899, -20.0679, 0, -10.476398, -20.3764, 0, -6.6893, -20.5103, 0, -10.033899, -20.108599, 0, -9.592199, -20.0679, 0, -13.378599, -19.6286, 0, -10.1098995, -20.0679, 0, -10.476398, -20.5103, 0, -10.033899, -20.0679, 0, -13.378599, -20.0679, 0, -10.476398, -19.6286, 0, -10.1098995, -20.0679, 0, -13.378599, -17.1586, 0, -11.120298, -19.6286, 0, -10.1098995, -17.1586, 0, -11.120298, -17.8929, 0, -10.41, -17.1586, 0, -11.120298, -20.0679, 0, -13.378599, -16.7232, 0, -13.378599, -20.5103, 0, -10.033899, -23.412498, 0, -13.378599, -20.0679, 0, -13.378599, -23.412498, 0, -13.378599, -20.5103, 0, -10.033899, -23.412498, 0, -10.033899, -20.3764, 0, -6.6893, -23.412498, 0, -10.033899, -20.5103, 0, -10.033899, -23.412498, 0, -10.033899, -20.3764, 0, -6.6893, -23.412498, 0, -6.6893, -23.412498, -0.0385, -2.8684, -23.412498, 0, -3.7743, -22.9552, -0.047599997, -3.375, -23.412498, -0.0385, -2.8684, -23.8421, 0, -3.3446002, -23.412498, 0, -3.7743, -23.412498, 0, -6.6893, -22.9552, -0.047599997, -3.375, -23.412498, 0, -3.7743, -22.9552, -0.047599997, -3.375, -23.412498, 0, -6.6893, -20.1607, -0.2436, -4.5060997, -20.1607, -0.2436, -4.5060997, -23.412498, 0, -6.6893, -20.3764, 0, -6.6893, -22.9552, -0.047599997, -3.375, -20.1607, -0.2436, -4.5060997, -21.0086, -0.2504, -3.5043998, -29.294899, -0.6617, -6.6893, -23.8421, 0, -3.3446002, -27.9812, -0.6617, -3.3446002, -23.8421, 0, -3.3446002, -29.294899, -0.6617, -6.6893, -23.412498, 0, -6.6893, -23.8421, 0, -3.3446002, -23.412498, 0, -6.6893, -23.412498, 0, -3.7743, -27.9812, -0.6617, -3.3446002, -25.479, -0.4588, 0.143, -27.9812, -0.6617, 0, -25.479, -0.4588, 0.143, -27.9812, -0.6617, -3.3446002, -23.412498, -0.0385, -2.8684, -23.412498, -0.0385, -2.8684, -27.9812, -0.6617, -3.3446002, -23.8421, 0, -3.3446002, -25.479, -0.4588, 0.143, -23.412498, -0.0385, -2.8684, -23.412498, -0.2913, 0.26119995, -22.756899, 0, 10.033899, -24.056599, 0, 10.033899, -23.489, 0, 9.386499, -22.756899, 0, 10.033899, -23.412498, 0, 10.6779995, -24.056599, 0, 10.033899, -20.0679, 0, 13.378601, -23.412498, 0, 10.6779995, -22.756899, 0, 10.033899, -23.412498, 0, 10.6779995, -20.0679, 0, 13.378601, -23.412498, 0, 13.378601, -20.0679, 0, 13.378601, -22.756899, 0, 10.033899, -20.0679, 0, 10.033899, -20.0679, 0, 10.033899, -17.213, 0, 13.378601, -20.0679, 0, 13.378601, -17.213, 0, 13.378601, -20.0679, 0, 10.033899, -16.7232, 0, 10.8878, -16.7232, 0, 10.8878, -20.0679, 0, 10.033899, -17.583, 0, 10.033899, -17.213, 0, 13.378601, -16.7232, 0, 10.8878, -16.7232, 0, 12.878401, -16.223, 0, 13.378601, -17.213, 0, 13.378601, -16.7232, 0, 12.878401, -16.223, 0, 13.378601, -16.7232, 0, 13.868401, -17.213, 0, 13.378601, -29.294899, -0.6617, 10.033899, -25.945799, -0.25779998, 6.6893, -26.0077, -0.2465, 10.033899, -29.294899, -0.6617, 10.033899, -29.294899, -0.6617, 6.6893, -25.945799, -0.25779998, 6.6893, -29.294899, -0.6617, 13.378601, -26.0077, -0.2465, 10.033899, -25.9681, -0.2875, 13.378601, -29.294899, -0.6617, 13.378601, -29.294899, -0.6617, 10.033899, -26.0077, -0.2465, 10.033899, -20.0679, -0.36479998, 16.7232, -20.0679, 0, 13.378601, -16.7232, -0.26209998, 16.7232, -16.7232, 0, 13.868401, -13.378601, 0, 16.7232, -16.7232, -0.26209998, 16.7232, -13.378601, 0, 16.7232, -16.7232, 0, 13.868401, -16.223, 0, 13.378601, -13.378601, 0, 16.7232, -16.223, 0, 13.378601, -13.378601, 0, 13.378601, 0, 0, 20.0679, 3.3446, -0.2814, 23.412498, 0, -0.2814, 23.412498, 3.3446, -0.2814, 23.412498, 0, 0, 20.0679, 2.4261, 0, 20.0679, 3.3446, -0.2814, 23.412498, 2.4261, 0, 20.0679, 3.3446, 0, 20.986399, 3.3446, 0, 20.986399, 6.6893, -0.2814, 23.412498, 3.3446, -0.2814, 23.412498, 6.6893, -0.2814, 23.412498, 3.3446, 0, 20.986399, 4.275, 0, 20.0679, 6.6893, -0.2814, 23.412498, 4.275, 0, 20.0679, 6.6893, 0, 20.0679, 10.572599, 0, 19.5895, 10.501598, 0, 20.5087, 10.080299, 0, 20.0679, 10.572599, 0, 19.5895, 11.0191, 0, 20.0679, 10.501598, 0, 20.5087, 10.572599, 0, 19.5895, 13.378599, 0, 16.7232, 11.0191, 0, 20.0679, 10.572599, 0, 19.5895, 10.572599, 0, 16.7232, 13.378599, 0, 16.7232, 10.572599, 0, 14.3402, 13.378599, 0, 16.7232, 10.572599, 0, 16.7232, 13.378599, 0, 16.7232, 10.572599, 0, 14.3402, 13.105099, 0, 13.9188, 13.105099, 0, 13.9188, 10.572599, 0, 14.3402, 10.986898, 0, 13.9188, 13.378599, 0, 16.7232, 13.105099, 0, 13.9188, 13.700699, 0, 14.602699, 13.8046, 0, 13.2202, 13.700699, 0, 14.602699, 13.105099, 0, 13.9188, 13.8046, 0, 13.2202, 14.439199, 0, 13.6437, 13.700699, 0, 14.602699, 6.6893, -0.2814, 23.412498, 10.501598, 0, 20.5087, 10.033899, -0.501, 23.412498, 10.033899, -0.501, 23.412498, 11.0191, 0, 20.0679, 13.378599, -1.0746, 20.0679, 10.033899, -0.501, 23.412498, 10.501598, 0, 20.5087, 11.0191, 0, 20.0679, 17.4912, 0.0034999999, 7.4080997, 13.8046, 0, 10.033899, 14.0257, 0.0442, 7.3252997, 13.8046, 0, 10.033899, 17.4912, 0.0034999999, 7.4080997, 16.7232, 0, 10.033899, 13.8046, 0, 10.033899, 16.7232, 0, 10.033899, 15.0508995, 0, 10.033899, 16.7232, -1.0746, 13.378601, 15.0508995, -0.40039998, 16.7232, 15.0508995, -0.6288, 13.378601, -16.7232, -1.1374999, 26.7572, -20.0679, -1.9081, 30.3625, -20.0679, -1.1374999, 26.7572, -16.7232, -1.1374999, 26.7572, -16.7232, -1.9068999, 30.3568, -20.0679, -1.9081, 30.3625, -23.412498, -1.9093, 30.3681, -20.0679, -1.1374999, 26.7572, -20.0679, -1.9081, 30.3625, -23.412498, -1.9093, 30.3681, -23.412498, -1.1374999, 26.7572, -20.0679, -1.1374999, 26.7572, -23.412498, -2.6287, 33.7341, -23.412498, -1.9093, 30.3681, -20.0679, -1.9081, 30.3625, -16.7232, -1.9068999, 30.3568, -20.0679, -2.628, 33.7306, -20.0679, -1.9081, 30.3625, -23.412498, -2.6287, 33.7341, -20.0679, -1.9081, 30.3625, -20.0679, -2.628, 33.7306, -16.7232, -1.9068999, 30.3568, -16.7232, -2.6272, 33.726997, -20.0679, -2.628, 33.7306, -23.412498, -3.2477999, 36.6305, -23.412498, -2.6287, 33.7341, -20.0679, -2.628, 33.7306, -16.7232, -2.6272, 33.726997, -20.0679, -3.2473998, 36.6287, -20.0679, -2.628, 33.7306, -23.412498, -3.2477999, 36.6305, -20.0679, -2.628, 33.7306, -20.0679, -3.2473998, 36.6287, -16.7232, -2.6272, 33.726997, -16.7232, -3.247, 36.6269, -20.0679, -3.2473998, 36.6287, -20.0679, -3.8518999, 39.456898, -23.412498, -3.2477999, 36.6305, -20.0679, -3.2473998, 36.6287, -16.7232, -3.247, 36.6269, -20.0679, -3.8518999, 39.456898, -20.0679, -3.2473998, 36.6287, -20.0679, -3.8518999, 39.456898, -23.412498, -3.8518999, 39.456898, -23.412498, -3.2477999, 36.6305, -16.7232, -3.247, 36.6269, -16.7232, -3.8518999, 39.456898, -20.0679, -3.8518999, 39.456898, -27.9812, -0.6617, 0, -30.315699, -0.9931, 3.3446, -30.300001, -1.3205999, 0, -27.9812, -0.6617, 0, -29.294899, -0.6617, 3.3446, -30.315699, -0.9931, 3.3446, -50.290497, -8.1437, 10.033899, -53.117798, -8.6939, 6.6893, -50.290497, -8.1437, 6.6893, -50.290497, -8.1437, 10.033899, -50.290497, -8.1437, 13.378601, -53.117798, -8.6939, 6.6893, -53.117798, -8.6939, 3.3446, -50.290497, -8.1437, 6.6893, -53.117798, -8.6939, 6.6893, -53.117798, -8.6939, 3.3446, -50.290497, -8.1437, 3.3446, -50.290497, -8.1437, 6.6893, -53.117798, -8.6939, 6.6893, -50.290497, -8.1437, 13.378601, -53.117798, -8.6939, 13.378601, -53.117798, -8.6939, 0, -50.290497, -8.1437, 3.3446, -53.117798, -8.6939, 3.3446, -53.117798, -8.6939, 0, -50.290497, -8.1437, 0, -50.290497, -8.1437, 3.3446, -55.5951, -9.176, 3.3446, -53.117798, -8.6939, 3.3446, -53.117798, -8.6939, 6.6893, -53.117798, -8.6939, -3.3446002, -50.290497, -8.1437, 0, -53.117798, -8.6939, 0, -53.117798, -8.6939, -3.3446002, -50.290497, -8.1437, -3.3446002, -50.290497, -8.1437, 0, -55.5951, -9.176, 0, -53.117798, -8.6939, 0, -53.117798, -8.6939, 3.3446, -55.5951, -9.176, 0, -53.117798, -8.6939, 3.3446, -55.5951, -9.176, 3.3446, -55.5951, -9.176, -3.3446002, -53.117798, -8.6939, -3.3446002, -53.117798, -8.6939, 0, -55.5951, -9.176, -3.3446002, -53.117798, -8.6939, 0, -55.5951, -9.176, 0, -53.117798, -8.6939, -6.6893, -50.290497, -8.1437, -3.3446002, -53.117798, -8.6939, -3.3446002, -53.117798, -8.6939, -6.6893, -50.290497, -8.1437, -6.6893, -50.290497, -8.1437, -3.3446002, -55.5951, -9.176, -6.6893, -53.117798, -8.6939, -3.3446002, -55.5951, -9.176, -3.3446002, -55.5951, -9.176, -6.6893, -53.117798, -8.6939, -6.6893, -53.117798, -8.6939, -3.3446002, -53.117798, -8.6939, -10.033899, -50.290497, -8.1437, -6.6893, -53.117798, -8.6939, -6.6893, -53.117798, -8.6939, -10.033899, -50.290497, -8.1437, -10.033899, -50.290497, -8.1437, -6.6893, -55.5951, -9.176, -10.033899, -53.117798, -8.6939, -6.6893, -55.5951, -9.176, -6.6893, -55.5951, -9.176, -10.033899, -53.117798, -8.6939, -10.033899, -53.117798, -8.6939, -6.6893, -53.117798, -8.6939, -13.378599, -50.290497, -8.1437, -10.033899, -53.117798, -8.6939, -10.033899, -53.117798, -8.6939, -13.378599, -50.290497, -8.1437, -13.378599, -50.290497, -8.1437, -10.033899, -53.117798, -8.6939, -13.378599, -50.290497, -8.1437, -16.7232, -50.290497, -8.1437, -13.378599, -53.117798, -8.6939, -13.378599, -50.290497, -8.1437, -16.937199, -50.290497, -8.1437, -16.7232, -50.290497, -8.1437, -16.937199, -53.117798, -8.6939, -13.378599, -53.117798, -8.6939, -16.911499, -53.117798, -8.6939, -16.911499, -50.290497, -8.1437, -20.0679, -50.290497, -8.1437, -16.937199, -55.5951, -9.176, -13.378599, -53.117798, -8.6939, -13.378599, -53.117798, -8.6939, -10.033899, -55.5951, -9.176, -13.378599, -53.117798, -8.6939, -10.033899, -55.5951, -9.176, -10.033899, -53.117798, -8.6939, -16.911499, -50.290497, -8.1437, -20.2818, -50.290497, -8.1437, -20.0679, -55.5951, -9.176, -16.888899, -53.117798, -8.6939, -13.378599, -55.5951, -9.176, -13.378599, -55.5951, -9.176, -16.888899, -53.117798, -8.6939, -16.911499, -53.117798, -8.6939, -13.378599, -58.463497, -9.7343, -13.378599, -55.5951, -9.176, -13.378599, -55.5951, -9.176, -10.033899, -58.463497, -9.7343, -16.8629, -55.5951, -9.176, -16.888899, -55.5951, -9.176, -13.378599, -58.463497, -9.7343, -16.8629, -55.5951, -9.176, -13.378599, -58.463497, -9.7343, -13.378599, -55.5951, -9.176, -20.233599, -53.117798, -8.6939, -16.911499, -55.5951, -9.176, -16.888899, -50.290497, -8.1437, -20.2818, -53.117798, -8.6939, -16.911499, -53.117798, -8.6939, -20.2561, -55.5951, -9.176, -20.233599, -53.117798, -8.6939, -20.2561, -53.117798, -8.6939, -16.911499, -53.117798, -8.6939, -23.412498, -50.290497, -8.1437, -20.2818, -53.117798, -8.6939, -20.2561, -53.117798, -8.6939, -23.412498, -50.290497, -8.1437, -23.412498, -50.290497, -8.1437, -20.2818, -53.117798, -8.6939, -26.7572, -50.290497, -8.1437, -23.412498, -53.117798, -8.6939, -23.412498, -53.117798, -8.6939, -26.7572, -50.290497, -8.1437, -26.7572, -50.290497, -8.1437, -23.412498, -55.5951, -9.176, -26.7572, -53.117798, -8.6939, -26.7572, -53.117798, -8.6939, -23.412498, -55.5951, -9.176, -23.412498, -53.117798, -8.6939, -23.412498, -53.117798, -8.6939, -20.2561, -55.5951, -9.176, -26.7572, -53.117798, -8.6939, -23.412498, -55.5951, -9.176, -23.412498, -55.5951, -9.176, -23.412498, -53.117798, -8.6939, -20.2561, -55.5951, -9.176, -20.233599, -58.463497, -9.7343, -26.7572, -55.5951, -9.176, -26.7572, -55.5951, -9.176, -23.412498, -58.463497, -9.7343, -23.412498, -55.5951, -9.176, -23.412498, -55.5951, -9.176, -20.233599, -58.463497, -9.7343, -26.7572, -55.5951, -9.176, -23.412498, -58.463497, -9.7343, -23.412498, -62.057194, -10.4337, -23.412498, -58.463497, -9.7343, -26.7572, -58.463497, -9.7343, -23.412498, -62.057194, -10.4337, -23.412498, -62.057194, -10.4337, -26.7572, -58.463497, -9.7343, -26.7572, -62.057194, -10.4337, -20.174799, -62.057194, -10.4337, -23.412498, -58.463497, -9.7343, -23.412498, -58.463497, -9.7343, -23.412498, -55.5951, -9.176, -20.233599, -58.463497, -9.7343, -20.207499, -62.057194, -10.4337, -20.174799, -58.463497, -9.7343, -23.412498, -58.463497, -9.7343, -20.207499, -58.463497, -9.7343, -20.207499, -55.5951, -9.176, -20.233599, -55.5951, -9.176, -16.888899, -58.463497, -9.7343, -20.207499, -55.5951, -9.176, -16.888899, -58.463497, -9.7343, -16.8629, -58.463497, -9.7343, -16.8629, -62.057194, -10.4337, -20.174799, -58.463497, -9.7343, -20.207499, -58.463497, -9.7343, -16.8629, -62.057194, -10.4337, -20.0679, -62.057194, -10.4337, -20.174799, -62.057194, -10.4337, -20.0679, -58.463497, -9.7343, -16.8629, -62.057194, -10.4337, -16.8302, -58.463497, -9.7343, -13.378599, -62.057194, -10.4337, -16.8302, -58.463497, -9.7343, -16.8629, -58.463497, -9.7343, -13.378599, -62.057194, -10.4337, -16.7232, -62.057194, -10.4337, -16.8302, -62.057194, -10.4337, -16.7232, -58.463497, -9.7343, -13.378599, -62.057194, -10.4337, -13.378599, -62.057194, -10.4337, -10.033899, -62.057194, -10.4337, -13.378599, -58.463497, -9.7343, -13.378599, -62.057194, -10.4337, -10.033899, -58.463497, -9.7343, -13.378599, -58.463497, -9.7343, -10.033899, -58.463497, -9.7343, -13.378599, -55.5951, -9.176, -10.033899, -58.463497, -9.7343, -10.033899, -62.057194, -10.4337, -6.6893, -62.057194, -10.4337, -10.033899, -58.463497, -9.7343, -10.033899, -58.463497, -9.7343, -10.033899, -55.5951, -9.176, -10.033899, -55.5951, -9.176, -6.6893, -62.057194, -10.4337, -6.6893, -58.463497, -9.7343, -10.033899, -58.463497, -9.7343, -6.6893, -58.463497, -9.7343, -10.033899, -55.5951, -9.176, -6.6893, -58.463497, -9.7343, -6.6893, -62.057194, -10.4337, -3.3446002, -62.057194, -10.4337, -6.6893, -58.463497, -9.7343, -6.6893, -58.463497, -9.7343, -6.6893, -55.5951, -9.176, -6.6893, -55.5951, -9.176, -3.3446002, -62.057194, -10.4337, -3.3446002, -58.463497, -9.7343, -6.6893, -58.463497, -9.7343, -3.3446002, -58.463497, -9.7343, -6.6893, -55.5951, -9.176, -3.3446002, -58.463497, -9.7343, -3.3446002, -62.057194, -10.4337, 0, -62.057194, -10.4337, -3.3446002, -58.463497, -9.7343, -3.3446002, -58.463497, -9.7343, -3.3446002, -55.5951, -9.176, -3.3446002, -55.5951, -9.176, 0, -62.057194, -10.4337, 0, -58.463497, -9.7343, -3.3446002, -58.463497, -9.7343, 0, -58.463497, -9.7343, -3.3446002, -55.5951, -9.176, 0, -58.463497, -9.7343, 0, -62.057194, -10.4337, 3.3446, -62.057194, -10.4337, 0, -58.463497, -9.7343, 0, -58.463497, -9.7343, 0, -55.5951, -9.176, 0, -55.5951, -9.176, 3.3446, -62.057194, -10.4337, 3.3446, -58.463497, -9.7343, 0, -58.463497, -9.7343, 3.3446, -58.463497, -9.7343, 0, -55.5951, -9.176, 3.3446, -58.463497, -9.7343, 3.3446, -62.057194, -10.4337, 6.6893, -62.057194, -10.4337, 3.3446, -58.463497, -9.7343, 3.3446, -62.057194, -10.4337, 6.6893, -58.463497, -9.7343, 3.3446, -58.463497, -9.7343, 6.6893, -58.463497, -9.7343, 6.6893, -62.057194, -10.4337, 10.033899, -62.057194, -10.4337, 6.6893, -58.463497, -9.7343, 3.3446, -55.5951, -9.176, 3.3446, -55.5951, -9.176, 6.6893, -58.463497, -9.7343, 3.3446, -55.5951, -9.176, 6.6893, -58.463497, -9.7343, 6.6893, -55.5951, -9.176, 3.3446, -53.117798, -8.6939, 6.6893, -55.5951, -9.176, 6.6893, -58.463497, -9.7343, 6.6893, -62.057194, -10.4337, 13.378601, -62.057194, -10.4337, 10.033899, -53.117798, -8.6939, 13.378601, -55.5951, -9.176, 6.6893, -53.117798, -8.6939, 6.6893, -55.5951, -9.176, 13.378601, -58.463497, -9.7343, 6.6893, -55.5951, -9.176, 6.6893, -53.117798, -8.6939, 13.378601, -55.5951, -9.176, 13.378601, -55.5951, -9.176, 6.6893, -55.5951, -9.176, 13.378601, -58.463497, -9.7343, 13.378601, -58.463497, -9.7343, 6.6893, -62.057194, -10.4337, 13.378601, -58.463497, -9.7343, 6.6893, -58.463497, -9.7343, 13.378601, -53.117798, -8.6939, 16.7232, -55.5951, -9.176, 13.378601, -53.117798, -8.6939, 13.378601, -50.290497, -8.1437, 13.378601, -53.117798, -8.6939, 16.7232, -53.117798, -8.6939, 13.378601, -50.290497, -8.1437, 13.378601, -50.290497, -8.1437, 16.7232, -53.117798, -8.6939, 16.7232, -53.117798, -8.6939, 16.7232, -55.5951, -9.176, 16.7232, -55.5951, -9.176, 13.378601, -55.5951, -9.176, 16.7232, -58.463497, -9.7343, 13.378601, -55.5951, -9.176, 13.378601, -50.290497, -8.1437, 16.7232, -53.117798, -8.6939, 20.0679, -53.117798, -8.6939, 16.7232, -53.117798, -8.6939, 20.0679, -55.5951, -9.176, 16.7232, -53.117798, -8.6939, 16.7232, -50.290497, -8.1437, 16.7232, -50.290497, -8.1437, 20.0679, -53.117798, -8.6939, 20.0679, -58.463497, -9.7343, 16.7232, -62.057194, -10.4337, 13.378601, -58.463497, -9.7343, 13.378601, -55.5951, -9.176, 16.7232, -58.463497, -9.7343, 16.7232, -58.463497, -9.7343, 13.378601, -58.463497, -9.7343, 16.7232, -62.057194, -10.4337, 16.7232, -62.057194, -10.4337, 13.378601, -53.117798, -8.6939, 20.0679, -55.5951, -9.176, 20.0679, -55.5951, -9.176, 16.7232, -55.5951, -9.176, 20.0679, -58.463497, -9.7343, 16.7232, -55.5951, -9.176, 16.7232, -50.290497, -8.1437, 20.0679, -53.117798, -8.6939, 23.412498, -53.117798, -8.6939, 20.0679, -53.117798, -8.6939, 23.412498, -55.5951, -9.176, 20.0679, -53.117798, -8.6939, 20.0679, -50.290497, -8.1437, 20.0679, -50.290497, -8.1437, 23.412498, -53.117798, -8.6939, 23.412498, -50.290497, -8.1437, 23.412498, -53.117798, -8.6939, 26.7572, -53.117798, -8.6939, 23.412498, -50.290497, -8.1437, 23.412498, -50.290497, -8.1437, 26.7572, -53.117798, -8.6939, 26.7572, -53.117798, -8.6939, 26.7572, -55.5951, -9.176, 23.412498, -53.117798, -8.6939, 23.412498, -53.117798, -8.6939, 23.412498, -55.5951, -9.176, 23.412498, -55.5951, -9.176, 20.0679, -53.117798, -8.6939, 26.7572, -55.5951, -9.176, 26.7572, -55.5951, -9.176, 23.412498, -55.5951, -9.176, 20.0679, -58.463497, -9.7343, 20.0679, -58.463497, -9.7343, 16.7232, -58.463497, -9.7343, 20.0679, -62.057194, -10.4337, 16.7232, -58.463497, -9.7343, 16.7232, -55.5951, -9.176, 23.412498, -58.463497, -9.7343, 20.0679, -55.5951, -9.176, 20.0679, -58.463497, -9.7343, 20.0679, -62.057194, -10.4337, 20.0679, -62.057194, -10.4337, 16.7232, -55.5951, -9.176, 26.7572, -58.463497, -9.7343, 23.412498, -55.5951, -9.176, 23.412498, -55.5951, -9.176, 23.412498, -58.463497, -9.7343, 23.412498, -58.463497, -9.7343, 20.0679, -58.463497, -9.7343, 23.412498, -62.057194, -10.4337, 20.0679, -58.463497, -9.7343, 20.0679, -55.5951, -9.176, 26.7572, -58.463497, -9.7343, 26.7572, -58.463497, -9.7343, 23.412498, -58.463497, -9.7343, 23.412498, -62.057194, -10.4337, 23.412498, -62.057194, -10.4337, 20.0679, -58.463497, -9.7343, 26.7572, -62.057194, -10.4337, 23.412498, -58.463497, -9.7343, 23.412498, -58.463497, -9.7343, 26.7572, -62.057194, -10.4337, 26.7572, -62.057194, -10.4337, 23.412498, -62.057194, -10.4337, 0, -64.963196, -10.4337, -3.3446002, -62.057194, -10.4337, -3.3446002, -64.963196, -10.4337, -6.6893, -62.057194, -10.4337, -3.3446002, -64.963196, -10.4337, -3.3446002, -64.963196, -10.4337, -6.6893, -62.057194, -10.4337, -6.6893, -62.057194, -10.4337, -3.3446002, -62.057194, -10.4337, 0, -64.963196, -10.4337, 0, -64.963196, -10.4337, -3.3446002, -64.963196, -10.4337, 0, -62.057194, -10.4337, 0, -62.057194, -10.4337, 3.3446, -68.2489, -10.4337, -6.6893, -64.963196, -10.4337, -6.6893, -64.963196, -10.4337, -3.3446002, -64.963196, -10.4337, 0, -68.2489, -10.4337, -3.3446002, -64.963196, -10.4337, -3.3446002, -68.2489, -10.4337, -6.6893, -64.963196, -10.4337, -3.3446002, -68.2489, -10.4337, -3.3446002, -64.963196, -10.4337, -10.033899, -62.057194, -10.4337, -6.6893, -64.963196, -10.4337, -6.6893, -64.963196, -10.4337, -10.033899, -62.057194, -10.4337, -10.033899, -62.057194, -10.4337, -6.6893, -68.2489, -10.4337, -10.033899, -64.963196, -10.4337, -6.6893, -68.2489, -10.4337, -6.6893, -68.2489, -10.4337, -10.033899, -64.963196, -10.4337, -10.033899, -64.963196, -10.4337, -6.6893, -64.963196, -10.4337, -13.378599, -62.057194, -10.4337, -10.033899, -64.963196, -10.4337, -10.033899, -64.963196, -10.4337, -13.378599, -62.057194, -10.4337, -13.378599, -62.057194, -10.4337, -10.033899, -64.963196, -10.4337, -13.378599, -62.057194, -10.4337, -16.7232, -62.057194, -10.4337, -13.378599, -64.963196, -10.4337, -13.378599, -62.057194, -10.4337, -16.8302, -62.057194, -10.4337, -16.7232, -62.057194, -10.4337, -16.8302, -64.963196, -10.4337, -13.378599, -64.963196, -10.4337, -16.803799, -64.963196, -10.4337, -16.803799, -62.057194, -10.4337, -20.0679, -62.057194, -10.4337, -16.8302, -68.2489, -10.4337, -13.378599, -64.963196, -10.4337, -13.378599, -64.963196, -10.4337, -10.033899, -68.2489, -10.4337, -13.378599, -64.963196, -10.4337, -10.033899, -68.2489, -10.4337, -10.033899, -64.963196, -10.4337, -16.803799, -62.057194, -10.4337, -20.174799, -62.057194, -10.4337, -20.0679, -68.2489, -10.4337, -16.7739, -64.963196, -10.4337, -13.378599, -68.2489, -10.4337, -13.378599, -68.2489, -10.4337, -16.7739, -64.963196, -10.4337, -16.803799, -64.963196, -10.4337, -13.378599, -71.2999, -10.4337, -13.378599, -68.2489, -10.4337, -13.378599, -68.2489, -10.4337, -10.033899, -71.2999, -10.4337, -16.746199, -68.2489, -10.4337, -16.7739, -68.2489, -10.4337, -13.378599, -71.2999, -10.4337, -16.746199, -68.2489, -10.4337, -13.378599, -71.2999, -10.4337, -13.378599, -73.8239, -10.4337, -13.378599, -71.2999, -10.4337, -16.746199, -71.2999, -10.4337, -13.378599, -73.8239, -10.4337, -13.378599, -73.8239, -10.4337, -16.7232, -71.2999, -10.4337, -16.746199, -73.8239, -10.4337, -10.033899, -73.8239, -10.4337, -13.378599, -71.2999, -10.4337, -13.378599, -73.8239, -10.4337, -16.7232, -71.2999, -10.4337, -20.0908, -71.2999, -10.4337, -16.746199, -71.2999, -10.4337, -20.0908, -68.2489, -10.4337, -16.7739, -71.2999, -10.4337, -16.746199, -73.8239, -10.4337, -16.7232, -73.8239, -10.4337, -20.0679, -71.2999, -10.4337, -20.0908, -71.2999, -10.4337, -13.378599, -68.2489, -10.4337, -10.033899, -71.2999, -10.4337, -10.033899, -73.8239, -10.4337, -10.033899, -71.2999, -10.4337, -13.378599, -71.2999, -10.4337, -10.033899, -71.2999, -10.4337, -10.033899, -68.2489, -10.4337, -10.033899, -68.2489, -10.4337, -6.6893, -73.8239, -10.4337, -6.6893, -73.8239, -10.4337, -10.033899, -71.2999, -10.4337, -10.033899, -71.2999, -10.4337, -10.033899, -68.2489, -10.4337, -6.6893, -71.2999, -10.4337, -6.6893, -73.8239, -10.4337, -6.6893, -71.2999, -10.4337, -10.033899, -71.2999, -10.4337, -6.6893, -71.2999, -10.4337, -6.6893, -68.2489, -10.4337, -6.6893, -68.2489, -10.4337, -3.3446002, -73.8239, -10.4337, -3.3446002, -73.8239, -10.4337, -6.6893, -71.2999, -10.4337, -6.6893, -71.2999, -10.4337, -6.6893, -68.2489, -10.4337, -3.3446002, -71.2999, -10.4337, -3.3446002, -73.8239, -10.4337, -3.3446002, -71.2999, -10.4337, -6.6893, -71.2999, -10.4337, -3.3446002, -68.2489, -10.4337, 0, -71.2999, -10.4337, -3.3446002, -68.2489, -10.4337, -3.3446002, -71.2999, -10.4337, 0, -73.8239, -10.4337, -3.3446002, -71.2999, -10.4337, -3.3446002, -68.2489, -10.4337, 0, -71.2999, -10.4337, 0, -71.2999, -10.4337, -3.3446002, -71.2999, -10.4337, 0, -73.8239, -10.4337, 0, -73.8239, -10.4337, -3.3446002, -64.963196, -10.4337, 0, -68.2489, -10.4337, 0, -68.2489, -10.4337, -3.3446002, -73.8239, -10.4337, 0, -71.2999, -10.4337, 0, -71.2999, -10.4337, 3.3446, -73.8239, -10.4337, 0, -71.2999, -10.4337, 3.3446, -73.8239, -10.4337, 3.3446, -71.2999, -10.4337, 0, -68.2489, -10.4337, 0, -68.2489, -10.4337, 3.3446, -71.2999, -10.4337, 0, -68.2489, -10.4337, 3.3446, -71.2999, -10.4337, 3.3446, -68.2489, -10.4337, 0, -64.963196, -10.4337, 0, -64.963196, -10.4337, 3.3446, -68.2489, -10.4337, 0, -64.963196, -10.4337, 3.3446, -68.2489, -10.4337, 3.3446, -64.963196, -10.4337, 0, -62.057194, -10.4337, 3.3446, -64.963196, -10.4337, 3.3446, -62.057194, -10.4337, 3.3446, -64.963196, -10.4337, 6.6893, -64.963196, -10.4337, 3.3446, -64.963196, -10.4337, 6.6893, -68.2489, -10.4337, 3.3446, -64.963196, -10.4337, 3.3446, -62.057194, -10.4337, 3.3446, -62.057194, -10.4337, 6.6893, -64.963196, -10.4337, 6.6893, -62.057194, -10.4337, 10.033899, -64.963196, -10.4337, 6.6893, -62.057194, -10.4337, 6.6893, -64.963196, -10.4337, 6.6893, -62.057194, -10.4337, 10.033899, -62.057194, -10.4337, 13.378601, -64.963196, -10.4337, 6.6893, -68.2489, -10.4337, 6.6893, -68.2489, -10.4337, 3.3446, -68.2489, -10.4337, 6.6893, -71.2999, -10.4337, 3.3446, -68.2489, -10.4337, 3.3446, -64.963196, -10.4337, 6.6893, -62.057194, -10.4337, 13.378601, -64.963196, -10.4337, 13.378601, -64.963196, -10.4337, 13.378601, -68.2489, -10.4337, 6.6893, -64.963196, -10.4337, 6.6893, -62.057194, -10.4337, 13.378601, -64.963196, -10.4337, 16.7232, -64.963196, -10.4337, 13.378601, -62.057194, -10.4337, 13.378601, -62.057194, -10.4337, 16.7232, -64.963196, -10.4337, 16.7232, -64.963196, -10.4337, 13.378601, -68.2489, -10.4337, 13.378601, -68.2489, -10.4337, 6.6893, -64.963196, -10.4337, 16.7232, -68.2489, -10.4337, 13.378601, -64.963196, -10.4337, 13.378601, -68.2489, -10.4337, 6.6893, -71.2999, -10.4337, 6.6893, -71.2999, -10.4337, 3.3446, -68.2489, -10.4337, 13.378601, -71.2999, -10.4337, 6.6893, -68.2489, -10.4337, 6.6893, -71.2999, -10.4337, 6.6893, -73.8239, -10.4337, 3.3446, -71.2999, -10.4337, 3.3446, -71.2999, -10.4337, 6.6893, -73.8239, -10.4337, 6.6893, -73.8239, -10.4337, 3.3446, -71.2999, -10.4337, 6.6893, -73.8239, -10.4337, 10.033899, -73.8239, -10.4337, 6.6893, -71.2999, -10.4337, 6.6893, -73.8239, -10.4337, 13.378601, -73.8239, -10.4337, 10.033899, -68.2489, -10.4337, 13.378601, -71.2999, -10.4337, 13.378601, -71.2999, -10.4337, 6.6893, -73.8239, -10.4337, 13.378601, -71.2999, -10.4337, 6.6893, -71.2999, -10.4337, 13.378601, -64.963196, -10.4337, 16.7232, -68.2489, -10.4337, 16.7232, -68.2489, -10.4337, 13.378601, -68.2489, -10.4337, 16.7232, -71.2999, -10.4337, 13.378601, -68.2489, -10.4337, 13.378601, -71.2999, -10.4337, 16.7232, -73.8239, -10.4337, 13.378601, -71.2999, -10.4337, 13.378601, -68.2489, -10.4337, 16.7232, -71.2999, -10.4337, 16.7232, -71.2999, -10.4337, 13.378601, -71.2999, -10.4337, 16.7232, -73.8239, -10.4337, 16.7232, -73.8239, -10.4337, 13.378601, -64.963196, -10.4337, 20.0679, -68.2489, -10.4337, 16.7232, -64.963196, -10.4337, 16.7232, -62.057194, -10.4337, 16.7232, -64.963196, -10.4337, 20.0679, -64.963196, -10.4337, 16.7232, -62.057194, -10.4337, 16.7232, -62.057194, -10.4337, 20.0679, -64.963196, -10.4337, 20.0679, -64.963196, -10.4337, 20.0679, -68.2489, -10.4337, 20.0679, -68.2489, -10.4337, 16.7232, -68.2489, -10.4337, 20.0679, -71.2999, -10.4337, 16.7232, -68.2489, -10.4337, 16.7232, -62.057194, -10.4337, 20.0679, -64.963196, -10.4337, 23.412498, -64.963196, -10.4337, 20.0679, -64.963196, -10.4337, 23.412498, -68.2489, -10.4337, 20.0679, -64.963196, -10.4337, 20.0679, -62.057194, -10.4337, 20.0679, -62.057194, -10.4337, 23.412498, -64.963196, -10.4337, 23.412498, -71.2999, -10.4337, 20.0679, -73.8239, -10.4337, 16.7232, -71.2999, -10.4337, 16.7232, -68.2489, -10.4337, 20.0679, -71.2999, -10.4337, 20.0679, -71.2999, -10.4337, 16.7232, -71.2999, -10.4337, 20.0679, -73.8239, -10.4337, 20.0679, -73.8239, -10.4337, 16.7232, -64.963196, -10.4337, 23.412498, -68.2489, -10.4337, 23.412498, -68.2489, -10.4337, 20.0679, -68.2489, -10.4337, 23.412498, -71.2999, -10.4337, 20.0679, -68.2489, -10.4337, 20.0679, -62.057194, -10.4337, 23.412498, -64.963196, -10.4337, 26.7572, -64.963196, -10.4337, 23.412498, -64.963196, -10.4337, 26.7572, -68.2489, -10.4337, 23.412498, -64.963196, -10.4337, 23.412498, -62.057194, -10.4337, 23.412498, -62.057194, -10.4337, 26.7572, -64.963196, -10.4337, 26.7572, -71.2999, -10.4337, 23.412498, -73.8239, -10.4337, 20.0679, -71.2999, -10.4337, 20.0679, -68.2489, -10.4337, 23.412498, -71.2999, -10.4337, 23.412498, -71.2999, -10.4337, 20.0679, -71.2999, -10.4337, 23.412498, -73.8239, -10.4337, 23.412498, -73.8239, -10.4337, 20.0679, -68.2489, -10.4337, 26.7572, -71.2999, -10.4337, 23.412498, -68.2489, -10.4337, 23.412498, -64.963196, -10.4337, 26.7572, -68.2489, -10.4337, 26.7572, -68.2489, -10.4337, 23.412498, -71.2999, -10.4337, 26.7572, -73.8239, -10.4337, 23.412498, -71.2999, -10.4337, 23.412498, -68.2489, -10.4337, 26.7572, -71.2999, -10.4337, 26.7572, -71.2999, -10.4337, 23.412498, -71.2999, -10.4337, 26.7572, -73.8239, -10.4337, 26.7572, -73.8239, -10.4337, 23.412498, -73.8239, -10.4337, 26.7572, -71.2999, -10.4337, 26.7572, -72.9579, -10.4337, 27.7057, -71.2999, -10.4337, 26.7572, -71.694496, -10.4337, 29.089499, -72.9579, -10.4337, 27.7057, -71.2999, -10.4337, 26.7572, -70.1271, -10.4337, 28.0285, -71.694496, -10.4337, 29.089499, -71.2999, -10.4337, 26.7572, -68.2489, -10.4337, 26.7572, -70.1271, -10.4337, 28.0285, -70.1271, -10.4337, 28.0285, -70.3329, -10.4337, 30.580898, -71.694496, -10.4337, 29.089499, -70.1271, -10.4337, 28.0285, -68.7877, -10.4337, 29.480598, -70.3329, -10.4337, 30.580898, -68.2489, -10.4337, 26.7572, -68.7877, -10.4337, 29.480598, -70.1271, -10.4337, 28.0285, -68.7877, -10.4337, 29.480598, -69.0569, -10.4337, 31.9786, -70.3329, -10.4337, 30.580898, -68.2489, -10.4337, 26.7572, -66.948, -10.4337, 28.1705, -68.7877, -10.4337, 29.480598, -68.2489, -10.4337, 26.7572, -64.963196, -10.4337, 26.7572, -66.948, -10.4337, 28.1705, -68.7877, -10.4337, 29.480598, -67.5324, -10.4337, 30.8414, -69.0569, -10.4337, 31.9786, -66.948, -10.4337, 28.1705, -67.5324, -10.4337, 30.8414, -68.7877, -10.4337, 29.480598, -67.5324, -10.4337, 30.8414, -67.618996, -10.4337, 33.553497, -69.0569, -10.4337, 31.9786, -64.963196, -10.4337, 26.7572, -65.7283, -10.4337, 29.495699, -66.948, -10.4337, 28.1705, -66.948, -10.4337, 28.1705, -65.7283, -10.4337, 29.495699, -67.5324, -10.4337, 30.8414, -67.5324, -10.4337, 30.8414, -66.0847, -10.4337, 32.410698, -67.618996, -10.4337, 33.553497, -65.7283, -10.4337, 29.495699, -66.0847, -10.4337, 32.410698, -67.5324, -10.4337, 30.8414, -66.0847, -10.4337, 32.410698, -66.2484, -10.4337, 35.0548, -67.618996, -10.4337, 33.553497, -64.963196, -10.4337, 26.7572, -63.779697, -10.4337, 28.042099, -65.7283, -10.4337, 29.495699, -64.963196, -10.4337, 26.7572, -62.057194, -10.4337, 26.7572, -63.779697, -10.4337, 28.042099, -65.7283, -10.4337, 29.495699, -64.2815, -10.4337, 31.0675, -66.0847, -10.4337, 32.410698, -63.779697, -10.4337, 28.042099, -64.2815, -10.4337, 31.0675, -65.7283, -10.4337, 29.495699, -66.0847, -10.4337, 32.410698, -64.736496, -10.4337, 33.8722, -66.2484, -10.4337, 35.0548, -64.2815, -10.4337, 31.0675, -64.736496, -10.4337, 33.8722, -66.0847, -10.4337, 32.410698, -64.736496, -10.4337, 33.8722, -65.1522, -10.4337, 36.255398, -66.2484, -10.4337, 35.0548, -62.057194, -10.4337, 26.7572, -62.331196, -10.4337, 29.6148, -63.779697, -10.4337, 28.042099, -63.779697, -10.4337, 28.042099, -62.331196, -10.4337, 29.6148, -64.2815, -10.4337, 31.0675, -62.057194, -10.4337, 26.7572, -60.611, -10.4337, 28.3335, -62.331196, -10.4337, 29.6148, -64.2815, -10.4337, 31.0675, -62.971096, -10.4337, 32.4913, -64.736496, -10.4337, 33.8722, -62.331196, -10.4337, 29.6148, -62.971096, -10.4337, 32.4913, -64.2815, -10.4337, 31.0675, -64.736496, -10.4337, 33.8722, -63.642498, -10.4337, 35.0582, -65.1522, -10.4337, 36.255398, -62.971096, -10.4337, 32.4913, -63.642498, -10.4337, 35.0582, -64.736496, -10.4337, 33.8722, -63.642498, -10.4337, 35.0582, -63.8252, -10.4337, 37.7089, -65.1522, -10.4337, 36.255398, -60.611, -10.4337, 28.3335, -61.059097, -10.4337, 30.9959, -62.331196, -10.4337, 29.6148, -62.331196, -10.4337, 29.6148, -61.059097, -10.4337, 30.9959, -62.971096, -10.4337, 32.4913, -60.611, -10.4337, 28.3335, -59.3761, -10.4337, 29.679499, -61.059097, -10.4337, 30.9959, -62.971096, -10.4337, 32.4913, -61.8887, -10.4337, 33.667297, -63.642498, -10.4337, 35.0582, -61.059097, -10.4337, 30.9959, -61.8887, -10.4337, 33.667297, -62.971096, -10.4337, 32.4913, -63.642498, -10.4337, 35.0582, -62.323597, -10.4337, 36.4879, -63.8252, -10.4337, 37.7089, -61.8887, -10.4337, 33.667297, -62.323597, -10.4337, 36.4879, -63.642498, -10.4337, 35.0582, -62.323597, -10.4337, 36.4879, -62.558193, -10.4337, 39.0967, -63.8252, -10.4337, 37.7089, -59.3761, -10.4337, 29.679499, -59.9874, -10.4337, 32.1594, -61.059097, -10.4337, 30.9959, -61.059097, -10.4337, 30.9959, -59.9874, -10.4337, 32.1594, -61.8887, -10.4337, 33.667297, -59.3761, -10.4337, 29.679499, -58.316597, -10.4337, 30.834398, -59.9874, -10.4337, 32.1594, -61.8887, -10.4337, 33.667297, -60.59, -10.4337, 35.078197, -62.323597, -10.4337, 36.4879, -59.9874, -10.4337, 32.1594, -60.59, -10.4337, 35.078197, -61.8887, -10.4337, 33.667297, -62.323597, -10.4337, 36.4879, -61.055798, -10.4337, 37.8623, -62.558193, -10.4337, 39.0967, -60.59, -10.4337, 35.078197, -61.055798, -10.4337, 37.8623, -62.323597, -10.4337, 36.4879, -61.055798, -10.4337, 37.8623, -61.1665, -10.4337, 40.621098, -62.558193, -10.4337, 39.0967, -58.316597, -10.4337, 30.834398, -58.708298, -10.4337, 33.5481, -59.9874, -10.4337, 32.1594, -59.9874, -10.4337, 32.1594, -58.708298, -10.4337, 33.5481, -60.59, -10.4337, 35.078197, -58.316597, -10.4337, 30.834398, -57.058, -10.4337, 32.2062, -58.708298, -10.4337, 33.5481, -60.59, -10.4337, 35.078197, -59.331398, -10.4337, 36.4456, -61.055798, -10.4337, 37.8623, -58.708298, -10.4337, 33.5481, -59.331398, -10.4337, 36.4456, -60.59, -10.4337, 35.078197, -61.055798, -10.4337, 37.8623, -59.6695, -10.4337, 39.3651, -61.1665, -10.4337, 40.621098, -59.331398, -10.4337, 36.4456, -59.6695, -10.4337, 39.3651, -61.055798, -10.4337, 37.8623, -59.6695, -10.4337, 39.3651, -59.815098, -10.4337, 42.1012, -61.1665, -10.4337, 40.621098, -57.058, -10.4337, 32.2062, -57.457497, -10.4337, 34.906097, -58.708298, -10.4337, 33.5481, -58.708298, -10.4337, 33.5481, -57.457497, -10.4337, 34.906097, -59.331398, -10.4337, 36.4456, -57.058, -10.4337, 32.2062, -55.8173, -10.4337, 33.5585, -57.457497, -10.4337, 34.906097, -59.331398, -10.4337, 36.4456, -57.962597, -10.4337, 37.9328, -59.6695, -10.4337, 39.3651, -57.457497, -10.4337, 34.906097, -57.962597, -10.4337, 37.9328, -59.331398, -10.4337, 36.4456, -59.6695, -10.4337, 39.3651, -58.3182, -10.4337, 40.8299, -59.815098, -10.4337, 42.1012, -57.962597, -10.4337, 37.9328, -58.3182, -10.4337, 40.8299, -59.6695, -10.4337, 39.3651, -58.3182, -10.4337, 40.8299, -58.397198, -10.4337, 43.6543, -59.815098, -10.4337, 42.1012, -55.8173, -10.4337, 33.5585, -56.105198, -10.4337, 36.374397, -57.457497, -10.4337, 34.906097, -57.457497, -10.4337, 34.906097, -56.105198, -10.4337, 36.374397, -57.962597, -10.4337, 37.9328, -55.8173, -10.4337, 33.5585, -54.4828, -10.4337, 35.0131, -56.105198, -10.4337, 36.374397, -57.962597, -10.4337, 37.9328, -56.621998, -10.4337, 39.389297, -58.3182, -10.4337, 40.8299, -56.105198, -10.4337, 36.374397, -56.621998, -10.4337, 39.389297, -57.962597, -10.4337, 37.9328, -58.3182, -10.4337, 40.8299, -56.8974, -10.4337, 42.370197, -58.397198, -10.4337, 43.6543, -56.621998, -10.4337, 39.389297, -56.8974, -10.4337, 42.370197, -58.3182, -10.4337, 40.8299, -56.8974, -10.4337, 42.370197, -57.1702, -10.4337, 44.9982, -58.397198, -10.4337, 43.6543, -54.4828, -10.4337, 35.0131, -54.7739, -10.4337, 37.819798, -56.105198, -10.4337, 36.374397, -56.105198, -10.4337, 36.374397, -54.7739, -10.4337, 37.819798, -56.621998, -10.4337, 39.389297, -54.4828, -10.4337, 35.0131, -53.163, -10.4337, 36.4517, -54.7739, -10.4337, 37.819798, -56.621998, -10.4337, 39.389297, -55.2089, -10.4337, 40.9246, -56.8974, -10.4337, 42.370197, -54.7739, -10.4337, 37.819798, -55.2089, -10.4337, 40.9246, -56.621998, -10.4337, 39.389297, -56.8974, -10.4337, 42.370197, -55.676598, -10.4337, 43.6936, -57.1702, -10.4337, 44.9982, -55.2089, -10.4337, 40.9246, -55.676598, -10.4337, 43.6936, -56.8974, -10.4337, 42.370197, -55.676598, -10.4337, 43.6936, -55.7286, -10.4337, 46.577297, -57.1702, -10.4337, 44.9982, -53.163, -10.4337, 36.4517, -53.3668, -10.4337, 39.3474, -54.7739, -10.4337, 37.819798, -54.7739, -10.4337, 37.819798, -53.3668, -10.4337, 39.3474, -55.2089, -10.4337, 40.9246, -53.163, -10.4337, 36.4517, -51.764698, -10.4337, 37.9757, -53.3668, -10.4337, 39.3474, -55.2089, -10.4337, 40.9246, -54.004498, -10.4337, 42.233097, -55.676598, -10.4337, 43.6936, -53.3668, -10.4337, 39.3474, -54.004498, -10.4337, 42.233097, -55.2089, -10.4337, 40.9246, -55.676598, -10.4337, 43.6936, -54.2416, -10.4337, 45.2492, -55.7286, -10.4337, 46.577297, -54.004498, -10.4337, 42.233097, -54.2416, -10.4337, 45.2492, -55.676598, -10.4337, 43.6936, -54.2416, -10.4337, 45.2492, -54.056297, -10.4337, 48.408897, -55.7286, -10.4337, 46.577297, -51.764698, -10.4337, 37.9757, -52.1782, -10.4337, 40.637897, -53.3668, -10.4337, 39.3474, -53.3668, -10.4337, 39.3474, -52.1782, -10.4337, 40.637897, -54.004498, -10.4337, 42.233097, -51.764698, -10.4337, 37.9757, -50.5928, -10.4337, 39.2532, -52.1782, -10.4337, 40.637897, -54.004498, -10.4337, 42.233097, -52.5879, -10.4337, 43.772198, -54.2416, -10.4337, 45.2492, -52.1782, -10.4337, 40.637897, -52.5879, -10.4337, 43.772198, -54.004498, -10.4337, 42.233097, -54.2416, -10.4337, 45.2492, -52.5793, -10.4337, 47.051098, -54.056297, -10.4337, 48.408897, -52.5879, -10.4337, 43.772198, -52.5793, -10.4337, 47.051098, -54.2416, -10.4337, 45.2492, -52.5793, -10.4337, 47.051098, -52.2215, -10.4337, 50.418697, -54.056297, -10.4337, 48.408897, -50.5928, -10.4337, 39.2532, -50.779198, -10.4337, 42.1568, -52.1782, -10.4337, 40.637897, -52.1782, -10.4337, 40.637897, -50.779198, -10.4337, 42.1568, -52.5879, -10.4337, 43.772198, -50.5928, -10.4337, 39.2532, -49.212498, -10.4337, 40.7576, -50.779198, -10.4337, 42.1568, -52.5879, -10.4337, 43.772198, -50.9492, -10.4337, 45.552597, -52.5793, -10.4337, 47.051098, -50.779198, -10.4337, 42.1568, -50.9492, -10.4337, 45.552597, -52.5879, -10.4337, 43.772198, -52.5793, -10.4337, 47.051098, -50.741398, -10.4337, 49.0436, -52.2215, -10.4337, 50.418697, -50.9492, -10.4337, 45.552597, -50.741398, -10.4337, 49.0436, -52.5793, -10.4337, 47.051098, -50.741398, -10.4337, 49.0436, -50.267597, -10.4337, 52.5587, -52.2215, -10.4337, 50.418697, -49.212498, -10.4337, 40.7576, -49.163498, -10.4337, 43.911, -50.779198, -10.4337, 42.1568, -50.779198, -10.4337, 42.1568, -49.163498, -10.4337, 43.911, -50.9492, -10.4337, 45.552597, -49.212498, -10.4337, 40.7576, -47.620697, -10.4337, 42.4927, -49.163498, -10.4337, 43.911, -50.9492, -10.4337, 45.552597, -49.1213, -10.4337, 47.5384, -50.741398, -10.4337, 49.0436, -49.163498, -10.4337, 43.911, -49.1213, -10.4337, 47.5384, -50.9492, -10.4337, 45.552597, -50.741398, -10.4337, 49.0436, -48.787197, -10.4337, 51.162, -50.267597, -10.4337, 52.5587, -49.1213, -10.4337, 47.5384, -48.787197, -10.4337, 51.162, -50.741398, -10.4337, 49.0436, -48.787197, -10.4337, 51.162, -48.3197, -10.4337, 54.6923, -50.267597, -10.4337, 52.5587, -47.620697, -10.4337, 42.4927, -47.343597, -10.4337, 45.8868, -49.163498, -10.4337, 43.911, -49.163498, -10.4337, 43.911, -47.343597, -10.4337, 45.8868, -49.1213, -10.4337, 47.5384, -47.620697, -10.4337, 42.4927, -45.8121, -10.4337, 44.463898, -47.343597, -10.4337, 45.8868, -49.1213, -10.4337, 47.5384, -47.181, -10.4337, 49.6466, -48.787197, -10.4337, 51.162, -47.343597, -10.4337, 45.8868, -47.181, -10.4337, 49.6466, -49.1213, -10.4337, 47.5384, -48.787197, -10.4337, 51.162, -46.8489, -10.4337, 53.263298, -48.3197, -10.4337, 54.6923, -47.181, -10.4337, 49.6466, -46.8489, -10.4337, 53.263298, -48.787197, -10.4337, 51.162, -46.8489, -10.4337, 53.263298, -46.839, -10.4337, 56.314198, -48.3197, -10.4337, 54.6923, -45.8121, -10.4337, 44.463898, -45.4151, -10.4337, 47.9805, -47.343597, -10.4337, 45.8868, -47.343597, -10.4337, 45.8868, -45.4151, -10.4337, 47.9805, -47.181, -10.4337, 49.6466, -45.8121, -10.4337, 44.463898, -43.8985, -10.4337, 46.549698, -45.4151, -10.4337, 47.9805, -47.181, -10.4337, 49.6466, -45.2669, -10.4337, 51.7262, -46.8489, -10.4337, 53.263298, -45.4151, -10.4337, 47.9805, -45.2669, -10.4337, 51.7262, -47.181, -10.4337, 49.6466, -46.8489, -10.4337, 53.263298, -45.3659, -10.4337, 54.8708, -46.839, -10.4337, 56.314198, -45.2669, -10.4337, 51.7262, -45.3659, -10.4337, 54.8708, -46.8489, -10.4337, 53.263298, -45.3659, -10.4337, 54.8708, -45.411, -10.4337, 57.8783, -46.839, -10.4337, 56.314198, -43.8985, -10.4337, 46.549698, -43.524498, -10.4337, 50.0333, -45.4151, -10.4337, 47.9805, -45.4151, -10.4337, 47.9805, -43.524498, -10.4337, 50.0333, -45.2669, -10.4337, 51.7262, -43.8985, -10.4337, 46.549698, -42.032497, -10.4337, 48.5836, -43.524498, -10.4337, 50.0333, -45.2669, -10.4337, 51.7262, -43.792, -10.4337, 53.328598, -45.3659, -10.4337, 54.8708, -43.524498, -10.4337, 50.0333, -43.792, -10.4337, 53.328598, -45.2669, -10.4337, 51.7262, -45.3659, -10.4337, 54.8708, -43.935497, -10.4337, 56.421497, -45.411, -10.4337, 57.8783, -43.792, -10.4337, 53.328598, -43.935497, -10.4337, 56.421497, -45.3659, -10.4337, 54.8708, -43.935497, -10.4337, 56.421497, -43.670998, -10.4337, 59.7842, -45.411, -10.4337, 57.8783, -42.032497, -10.4337, 48.5836, -42.056, -10.4337, 51.6275, -43.524498, -10.4337, 50.0333, -43.524498, -10.4337, 50.0333, -42.056, -10.4337, 51.6275, -43.792, -10.4337, 53.328598, -42.032497, -10.4337, 48.5836, -40.572998, -10.4337, 50.1744, -42.056, -10.4337, 51.6275, -43.792, -10.4337, 53.328598, -42.368797, -10.4337, 54.874798, -43.935497, -10.4337, 56.421497, -42.056, -10.4337, 51.6275, -42.368797, -10.4337, 54.874798, -43.792, -10.4337, 53.328598, -43.935497, -10.4337, 56.421497, -42.2006, -10.4337, 58.3022, -43.670998, -10.4337, 59.7842, -42.368797, -10.4337, 54.874798, -42.2006, -10.4337, 58.3022, -43.935497, -10.4337, 56.421497, -42.2006, -10.4337, 58.3022, -41.9354, -10.4337, 61.685097, -43.670998, -10.4337, 59.7842, -40.572998, -10.4337, 50.1744, -40.6386, -10.4337, 53.1665, -42.056, -10.4337, 51.6275, -42.056, -10.4337, 51.6275, -40.6386, -10.4337, 53.1665, -42.368797, -10.4337, 54.874798, -40.572998, -10.4337, 50.1744, -39.1638, -10.4337, 51.7104, -40.6386, -10.4337, 53.1665, -42.368797, -10.4337, 54.874798, -40.6512, -10.4337, 56.7408, -42.2006, -10.4337, 58.3022, -40.6386, -10.4337, 53.1665, -40.6512, -10.4337, 56.7408, -42.368797, -10.4337, 54.874798, -42.2006, -10.4337, 58.3022, -40.4544, -10.4337, 60.1951, -41.9354, -10.4337, 61.685097, -40.6512, -10.4337, 56.7408, -40.4544, -10.4337, 60.1951, -42.2006, -10.4337, 58.3022, -40.4544, -10.4337, 60.1951, -40.3009, -10.4337, 63.4754, -41.9354, -10.4337, 61.685097, -39.1638, -10.4337, 51.7104, -38.937298, -10.4337, 55.0135, -40.6386, -10.4337, 53.1665, -40.6386, -10.4337, 53.1665, -38.937298, -10.4337, 55.0135, -40.6512, -10.4337, 56.7408, -39.1638, -10.4337, 51.7104, -37.4804, -10.4337, 53.5453, -38.937298, -10.4337, 55.0135, -40.6512, -10.4337, 56.7408, -38.9059, -10.4337, 58.6371, -40.4544, -10.4337, 60.1951, -38.937298, -10.4337, 55.0135, -38.9059, -10.4337, 58.6371, -40.6512, -10.4337, 56.7408, -40.4544, -10.4337, 60.1951, -38.822998, -10.4337, 61.9637, -40.3009, -10.4337, 63.4754, -38.9059, -10.4337, 58.6371, -38.822998, -10.4337, 61.9637, -40.4544, -10.4337, 60.1951, -38.822998, -10.4337, 61.9637, -38.953697, -10.4337, 64.951, -40.3009, -10.4337, 63.4754, -37.4804, -10.4337, 53.5453, -37.1899, -10.4337, 56.910698, -38.937298, -10.4337, 55.0135, -38.937298, -10.4337, 55.0135, -37.1899, -10.4337, 56.910698, -38.9059, -10.4337, 58.6371, -37.4804, -10.4337, 53.5453, -35.735397, -10.4337, 55.4473, -37.1899, -10.4337, 56.910698, -38.9059, -10.4337, 58.6371, -37.2887, -10.4337, 60.3941, -38.822998, -10.4337, 61.9637, -37.1899, -10.4337, 56.910698, -37.2887, -10.4337, 60.3941, -38.9059, -10.4337, 58.6371, -38.822998, -10.4337, 61.9637, -37.4867, -10.4337, 63.4123, -38.953697, -10.4337, 64.951, -37.2887, -10.4337, 60.3941, -37.4867, -10.4337, 63.4123, -38.822998, -10.4337, 61.9637, -37.4867, -10.4337, 63.4123, -37.4493, -10.4337, 66.5989, -38.953697, -10.4337, 64.951, -35.735397, -10.4337, 55.4473, -35.5858, -10.4337, 58.6522, -37.1899, -10.4337, 56.910698, -37.1899, -10.4337, 56.910698, -35.5858, -10.4337, 58.6522, -37.2887, -10.4337, 60.3941, -35.735397, -10.4337, 55.4473, -34.1461, -10.4337, 57.1796, -35.5858, -10.4337, 58.6522, -37.2887, -10.4337, 60.3941, -35.9725, -10.4337, 61.824097, -37.4867, -10.4337, 63.4123, -35.5858, -10.4337, 58.6522, -35.9725, -10.4337, 61.824097, -37.2887, -10.4337, 60.3941, -37.4867, -10.4337, 63.4123, -35.9927, -10.4337, 65.0319, -37.4493, -10.4337, 66.5989, -35.9725, -10.4337, 61.824097, -35.9927, -10.4337, 65.0319, -37.4867, -10.4337, 63.4123, -35.9927, -10.4337, 65.0319, -36.0228, -10.4337, 68.1614, -37.4493, -10.4337, 66.5989, -34.1461, -10.4337, 57.1796, -34.2898, -10.4337, 60.0593, -35.5858, -10.4337, 58.6522, -35.5858, -10.4337, 58.6522, -34.2898, -10.4337, 60.0593, -35.9725, -10.4337, 61.824097, -34.1461, -10.4337, 57.1796, -32.870197, -10.4337, 58.570297, -34.2898, -10.4337, 60.0593, -35.9725, -10.4337, 61.824097, -34.499, -10.4337, 63.425, -35.9927, -10.4337, 65.0319, -34.2898, -10.4337, 60.0593, -34.499, -10.4337, 63.425, -35.9725, -10.4337, 61.824097, -35.9927, -10.4337, 65.0319, -34.5678, -10.4337, 66.5766, -36.0228, -10.4337, 68.1614, -34.499, -10.4337, 63.425, -34.5678, -10.4337, 66.5766, -35.9927, -10.4337, 65.0319, -34.5678, -10.4337, 66.5766, -34.1187, -10.4337, 70.246895, -36.0228, -10.4337, 68.1614, -32.870197, -10.4337, 58.570297, -32.8368, -10.4337, 61.636898, -34.2898, -10.4337, 60.0593, -34.2898, -10.4337, 60.0593, -32.8368, -10.4337, 61.636898, -34.499, -10.4337, 63.425, -32.870197, -10.4337, 58.570297, -31.437601, -10.4337, 60.131798, -32.8368, -10.4337, 61.636898, -34.499, -10.4337, 63.425, -33.0849, -10.4337, 64.961395, -34.5678, -10.4337, 66.5766, -32.8368, -10.4337, 61.636898, -33.0849, -10.4337, 64.961395, -34.499, -10.4337, 63.425, -34.5678, -10.4337, 66.5766, -32.69, -10.4337, 68.6121, -34.1187, -10.4337, 70.246895, -33.0849, -10.4337, 64.961395, -32.69, -10.4337, 68.6121, -34.5678, -10.4337, 66.5766, -32.69, -10.4337, 68.6121, -32.6527, -10.4337, 71.8527, -34.1187, -10.4337, 70.246895, -31.437601, -10.4337, 60.131798, -31.4325, -10.4337, 63.1615, -32.8368, -10.4337, 61.636898, -32.8368, -10.4337, 61.636898, -31.4325, -10.4337, 63.1615, -33.0849, -10.4337, 64.961395, -31.437601, -10.4337, 60.131798, -30.044802, -10.4337, 61.649998, -31.4325, -10.4337, 63.1615, -33.0849, -10.4337, 64.961395, -31.245802, -10.4337, 66.959496, -32.69, -10.4337, 68.6121, -31.4325, -10.4337, 63.1615, -31.245802, -10.4337, 66.959496, -33.0849, -10.4337, 64.961395, -32.69, -10.4337, 68.6121, -31.2026, -10.4337, 70.2246, -32.6527, -10.4337, 71.8527, -31.245802, -10.4337, 66.959496, -31.2026, -10.4337, 70.2246, -32.69, -10.4337, 68.6121, -31.2026, -10.4337, 70.2246, -31.218801, -10.4337, 73.423195, -32.6527, -10.4337, 71.8527, -30.044802, -10.4337, 61.649998, -29.633501, -10.4337, 65.1147, -31.4325, -10.4337, 63.1615, -31.4325, -10.4337, 63.1615, -29.633501, -10.4337, 65.1147, -31.245802, -10.4337, 66.959496, -30.044802, -10.4337, 61.649998, -28.2834, -10.4337, 63.569798, -29.633501, -10.4337, 65.1147, -31.245802, -10.4337, 66.959496, -29.745901, -10.4337, 68.589, -31.2026, -10.4337, 70.2246, -29.633501, -10.4337, 65.1147, -29.745901, -10.4337, 68.589, -31.245802, -10.4337, 66.959496, -31.2026, -10.4337, 70.2246, -29.787, -10.4337, 71.7591, -31.218801, -10.4337, 73.423195, -29.745901, -10.4337, 68.589, -29.787, -10.4337, 71.7591, -31.2026, -10.4337, 70.2246, -29.787, -10.4337, 71.7591, -29.6429, -10.4337, 75.1494, -31.218801, -10.4337, 73.423195, -28.2834, -10.4337, 63.569798, -28.117498, -10.4337, 66.7606, -29.633501, -10.4337, 65.1147, -29.633501, -10.4337, 65.1147, -28.117498, -10.4337, 66.7606, -29.745901, -10.4337, 68.589, -28.2834, -10.4337, 63.569798, -26.7572, -10.4337, 65.2334, -28.117498, -10.4337, 66.7606, -29.745901, -10.4337, 68.589, -28.357399, -10.4337, 70.097496, -29.787, -10.4337, 71.7591, -28.117498, -10.4337, 66.7606, -28.357399, -10.4337, 70.097496, -29.745901, -10.4337, 68.589, -29.787, -10.4337, 71.7591, -28.1941, -10.4337, 73.4859, -29.6429, -10.4337, 75.1494, -28.357399, -10.4337, 70.097496, -28.1941, -10.4337, 73.4859, -29.787, -10.4337, 71.7591, -28.1941, -10.4337, 73.4859, -28.2134, -10.4337, 76.715096, -29.6429, -10.4337, 75.1494, -26.7572, -10.4337, 65.2334, -26.7572, -10.4337, 68.237495, -28.117498, -10.4337, 66.7606, -28.117498, -10.4337, 66.7606, -26.7572, -10.4337, 68.237495, -28.357399, -10.4337, 70.097496, -26.7572, -10.4337, 68.237495, -26.7572, -10.4337, 65.2334, -23.412498, -10.4337, 65.2334, -28.1941, -10.4337, 73.4859, -26.7572, -10.4337, 75.043594, -28.2134, -10.4337, 76.715096, -26.7572, -10.4337, 75.043594, -26.7572, -10.4337, 78.3101, -28.2134, -10.4337, 76.715096, -28.357399, -10.4337, 70.097496, -26.7572, -10.4337, 71.8361, -28.1941, -10.4337, 73.4859, -26.7572, -10.4337, 68.237495, -26.7572, -10.4337, 71.8361, -28.357399, -10.4337, 70.097496, -26.7572, -10.4337, 71.8361, -26.7572, -10.4337, 75.043594, -28.1941, -10.4337, 73.4859, -23.412498, -10.4337, 78.3101, -26.7572, -10.4337, 78.3101, -26.7572, -10.4337, 75.043594, -26.7572, -10.4337, 71.8361, -26.7572, -10.4337, 68.237495, -23.412498, -10.4337, 68.237495, -26.7572, -10.4337, 68.237495, -23.412498, -10.4337, 65.2334, -23.412498, -10.4337, 68.237495, -23.412498, -10.4337, 68.237495, -23.412498, -10.4337, 65.2334, -20.0679, -10.4337, 65.2334, -26.7572, -10.4337, 71.8361, -23.412498, -10.4337, 68.237495, -23.412498, -10.4337, 71.8361, -26.7572, -10.4337, 75.043594, -26.7572, -10.4337, 71.8361, -23.412498, -10.4337, 71.8361, -23.412498, -10.4337, 68.237495, -20.0679, -10.4337, 65.2334, -20.0679, -10.4337, 68.237495, -23.412498, -10.4337, 71.8361, -23.412498, -10.4337, 68.237495, -20.0679, -10.4337, 68.237495, -16.7232, -10.4337, 65.2334, -20.0679, -10.4337, 68.237495, -20.0679, -10.4337, 65.2334, -23.412498, -10.4337, 78.3101, -26.7572, -10.4337, 75.043594, -23.412498, -10.4337, 75.043594, -26.7572, -10.4337, 75.043594, -23.412498, -10.4337, 71.8361, -23.412498, -10.4337, 75.043594, -20.0679, -10.4337, 78.3101, -23.412498, -10.4337, 78.3101, -23.412498, -10.4337, 75.043594, -23.412498, -10.4337, 71.8361, -20.0679, -10.4337, 68.237495, -20.0679, -10.4337, 71.8361, -23.412498, -10.4337, 75.043594, -23.412498, -10.4337, 71.8361, -20.0679, -10.4337, 71.8361, -16.7232, -10.4337, 65.2334, -16.7232, -10.4337, 68.237495, -20.0679, -10.4337, 68.237495, -16.7232, -10.4337, 68.237495, -20.0679, -10.4337, 71.8361, -20.0679, -10.4337, 68.237495, -16.7232, -10.4337, 68.237495, -16.7232, -10.4337, 65.2334, -13.378601, -10.4337, 65.2334, -23.412498, -10.4337, 75.043594, -20.0679, -10.4337, 71.8361, -20.0679, -10.4337, 75.043594, -20.0679, -10.4337, 78.3101, -23.412498, -10.4337, 75.043594, -20.0679, -10.4337, 75.043594, -16.7232, -10.4337, 68.237495, -16.7232, -10.4337, 71.8361, -20.0679, -10.4337, 71.8361, -16.7232, -10.4337, 71.8361, -20.0679, -10.4337, 75.043594, -20.0679, -10.4337, 71.8361, -16.7232, -10.4337, 75.043594, -20.0679, -10.4337, 78.3101, -20.0679, -10.4337, 75.043594, -16.7232, -10.4337, 71.8361, -16.7232, -10.4337, 75.043594, -20.0679, -10.4337, 75.043594, -16.7232, -10.4337, 75.043594, -16.7232, -10.4337, 78.3101, -20.0679, -10.4337, 78.3101, -16.7232, -10.4337, 71.8361, -16.7232, -10.4337, 68.237495, -13.378601, -10.4337, 68.237495, -16.7232, -10.4337, 68.237495, -13.378601, -10.4337, 65.2334, -13.378601, -10.4337, 68.237495, -16.7232, -10.4337, 75.043594, -16.7232, -10.4337, 71.8361, -13.378601, -10.4337, 71.8361, -16.7232, -10.4337, 71.8361, -13.378601, -10.4337, 68.237495, -13.378601, -10.4337, 71.8361, -16.7232, -10.4337, 78.3101, -16.7232, -10.4337, 75.043594, -13.378601, -10.4337, 75.043594, -16.7232, -10.4337, 75.043594, -13.378601, -10.4337, 71.8361, -13.378601, -10.4337, 75.043594, -16.7232, -10.4337, 78.3101, -13.378601, -10.4337, 75.043594, -13.378601, -10.4337, 78.3101, -13.378601, -10.4337, 65.2334, -10.033899, -10.4337, 68.237495, -13.378601, -10.4337, 68.237495, -10.033899, -10.4337, 68.237495, -13.378601, -10.4337, 71.8361, -13.378601, -10.4337, 68.237495, -13.378601, -10.4337, 65.2334, -10.033899, -10.4337, 65.2334, -10.033899, -10.4337, 68.237495, -10.033899, -10.4337, 71.8361, -13.378601, -10.4337, 75.043594, -13.378601, -10.4337, 71.8361, -10.033899, -10.4337, 68.237495, -10.033899, -10.4337, 71.8361, -13.378601, -10.4337, 71.8361, -10.033899, -10.4337, 75.043594, -13.378601, -10.4337, 78.3101, -13.378601, -10.4337, 75.043594, -10.033899, -10.4337, 71.8361, -10.033899, -10.4337, 75.043594, -13.378601, -10.4337, 75.043594, -10.033899, -10.4337, 75.043594, -10.033899, -10.4337, 78.3101, -13.378601, -10.4337, 78.3101, -10.033899, -10.4337, 65.2334, -6.6893, -10.4337, 68.237495, -10.033899, -10.4337, 68.237495, -6.6893, -10.4337, 68.237495, -10.033899, -10.4337, 71.8361, -10.033899, -10.4337, 68.237495, -10.033899, -10.4337, 65.2334, -6.6893, -10.4337, 65.2334, -6.6893, -10.4337, 68.237495, -6.6893, -10.4337, 71.8361, -10.033899, -10.4337, 75.043594, -10.033899, -10.4337, 71.8361, -6.6893, -10.4337, 68.237495, -6.6893, -10.4337, 71.8361, -10.033899, -10.4337, 71.8361, -6.6893, -10.4337, 75.043594, -10.033899, -10.4337, 78.3101, -10.033899, -10.4337, 75.043594, -6.6893, -10.4337, 71.8361, -6.6893, -10.4337, 75.043594, -10.033899, -10.4337, 75.043594, -6.6893, -10.4337, 75.043594, -6.6893, -10.4337, 78.3101, -10.033899, -10.4337, 78.3101, -6.6893, -10.4337, 65.2334, -3.3446002, -10.4337, 68.237495, -6.6893, -10.4337, 68.237495, -3.3446002, -10.4337, 68.237495, -6.6893, -10.4337, 71.8361, -6.6893, -10.4337, 68.237495, -6.6893, -10.4337, 65.2334, -3.3446002, -10.4337, 65.2334, -3.3446002, -10.4337, 68.237495, -3.3446002, -10.4337, 71.8361, -6.6893, -10.4337, 75.043594, -6.6893, -10.4337, 71.8361, -3.3446002, -10.4337, 68.237495, -3.3446002, -10.4337, 71.8361, -6.6893, -10.4337, 71.8361, -3.3446002, -10.4337, 75.043594, -6.6893, -10.4337, 78.3101, -6.6893, -10.4337, 75.043594, -3.3446002, -10.4337, 71.8361, -3.3446002, -10.4337, 75.043594, -6.6893, -10.4337, 75.043594, -3.3446002, -10.4337, 75.043594, -3.3446002, -10.4337, 78.3101, -6.6893, -10.4337, 78.3101, -3.3446002, -10.4337, 65.2334, 0, -10.4337, 68.237495, -3.3446002, -10.4337, 68.237495, 0, -10.4337, 68.237495, -3.3446002, -10.4337, 71.8361, -3.3446002, -10.4337, 68.237495, -3.3446002, -10.4337, 65.2334, 0, -10.4337, 65.2334, 0, -10.4337, 68.237495, 0, -10.4337, 71.8361, -3.3446002, -10.4337, 75.043594, -3.3446002, -10.4337, 71.8361, 0, -10.4337, 68.237495, 0, -10.4337, 71.8361, -3.3446002, -10.4337, 71.8361, 0, -10.4337, 75.043594, -3.3446002, -10.4337, 78.3101, -3.3446002, -10.4337, 75.043594, 0, -10.4337, 71.8361, 0, -10.4337, 75.043594, -3.3446002, -10.4337, 75.043594, 0, -10.4337, 75.043594, 0, -10.4337, 78.3101, -3.3446002, -10.4337, 78.3101, 0, -10.4337, 65.2334, 3.3446, -10.4337, 68.237495, 0, -10.4337, 68.237495, 3.3446, -10.4337, 68.237495, 0, -10.4337, 71.8361, 0, -10.4337, 68.237495, 0, -10.4337, 65.2334, 3.3446, -10.4337, 65.2334, 3.3446, -10.4337, 68.237495, 3.3446, -10.4337, 71.8361, 0, -10.4337, 75.043594, 0, -10.4337, 71.8361, 3.3446, -10.4337, 68.237495, 3.3446, -10.4337, 71.8361, 0, -10.4337, 71.8361, 3.3446, -10.4337, 75.043594, 0, -10.4337, 78.3101, 0, -10.4337, 75.043594, 3.3446, -10.4337, 71.8361, 3.3446, -10.4337, 75.043594, 0, -10.4337, 75.043594, 3.3446, -10.4337, 75.043594, 3.3446, -10.4337, 78.3101, 0, -10.4337, 78.3101, 3.3446, -10.4337, 65.2334, 6.6893, -10.4337, 68.237495, 3.3446, -10.4337, 68.237495, 6.6893, -10.4337, 68.237495, 3.3446, -10.4337, 71.8361, 3.3446, -10.4337, 68.237495, 3.3446, -10.4337, 65.2334, 6.6893, -10.4337, 65.2334, 6.6893, -10.4337, 68.237495, 6.6893, -10.4337, 71.8361, 3.3446, -10.4337, 75.043594, 3.3446, -10.4337, 71.8361, 6.6893, -10.4337, 68.237495, 6.6893, -10.4337, 71.8361, 3.3446, -10.4337, 71.8361, 6.6893, -10.4337, 75.043594, 3.3446, -10.4337, 78.3101, 3.3446, -10.4337, 75.043594, 6.6893, -10.4337, 71.8361, 6.6893, -10.4337, 75.043594, 3.3446, -10.4337, 75.043594, 6.6893, -10.4337, 75.043594, 6.6893, -10.4337, 78.3101, 3.3446, -10.4337, 78.3101, 6.6893, -10.4337, 65.2334, 10.033899, -10.4337, 68.237495, 6.6893, -10.4337, 68.237495, 10.033899, -10.4337, 68.237495, 6.6893, -10.4337, 71.8361, 6.6893, -10.4337, 68.237495, 6.6893, -10.4337, 65.2334, 10.033899, -10.4337, 65.2334, 10.033899, -10.4337, 68.237495, 10.033899, -10.4337, 71.8361, 6.6893, -10.4337, 75.043594, 6.6893, -10.4337, 71.8361, 10.033899, -10.4337, 68.237495, 10.033899, -10.4337, 71.8361, 6.6893, -10.4337, 71.8361, 10.033899, -10.4337, 75.043594, 6.6893, -10.4337, 78.3101, 6.6893, -10.4337, 75.043594, 10.033899, -10.4337, 71.8361, 10.033899, -10.4337, 75.043594, 6.6893, -10.4337, 75.043594, 10.033899, -10.4337, 75.043594, 10.033899, -10.4337, 78.3101, 6.6893, -10.4337, 78.3101, 10.033899, -10.4337, 65.2334, 13.378599, -10.4337, 68.237495, 10.033899, -10.4337, 68.237495, 13.378599, -10.4337, 68.237495, 10.033899, -10.4337, 71.8361, 10.033899, -10.4337, 68.237495, 10.033899, -10.4337, 65.2334, 13.378599, -10.4337, 65.2334, 13.378599, -10.4337, 68.237495, 13.378599, -10.4337, 71.8361, 10.033899, -10.4337, 75.043594, 10.033899, -10.4337, 71.8361, 13.378599, -10.4337, 68.237495, 13.378599, -10.4337, 71.8361, 10.033899, -10.4337, 71.8361, 13.378599, -10.4337, 75.043594, 10.033899, -10.4337, 78.3101, 10.033899, -10.4337, 75.043594, 13.378599, -10.4337, 71.8361, 13.378599, -10.4337, 75.043594, 10.033899, -10.4337, 75.043594, 13.378599, -10.4337, 75.043594, 13.378599, -10.4337, 78.3101, 10.033899, -10.4337, 78.3101, 13.378599, -10.4337, 65.2334, 16.7232, -10.4337, 68.237495, 13.378599, -10.4337, 68.237495, 16.7232, -10.4337, 68.237495, 13.378599, -10.4337, 71.8361, 13.378599, -10.4337, 68.237495, 13.378599, -10.4337, 65.2334, 16.7232, -10.4337, 65.2334, 16.7232, -10.4337, 68.237495, 16.7232, -10.4337, 71.8361, 13.378599, -10.4337, 75.043594, 13.378599, -10.4337, 71.8361, 16.7232, -10.4337, 68.237495, 16.7232, -10.4337, 71.8361, 13.378599, -10.4337, 71.8361, 16.7232, -10.4337, 75.043594, 13.378599, -10.4337, 78.3101, 13.378599, -10.4337, 75.043594, 16.7232, -10.4337, 71.8361, 16.7232, -10.4337, 75.043594, 13.378599, -10.4337, 75.043594, 16.7232, -10.4337, 75.043594, 16.7232, -10.4337, 78.3101, 13.378599, -10.4337, 78.3101, 16.7232, -10.4337, 65.2334, 20.0679, -10.4337, 68.237495, 16.7232, -10.4337, 68.237495, 20.0679, -10.4337, 68.237495, 16.7232, -10.4337, 71.8361, 16.7232, -10.4337, 68.237495, 16.7232, -10.4337, 65.2334, 20.0679, -10.4337, 65.2334, 20.0679, -10.4337, 68.237495, 20.0679, -10.4337, 71.8361, 16.7232, -10.4337, 75.043594, 16.7232, -10.4337, 71.8361, 20.0679, -10.4337, 68.237495, 20.0679, -10.4337, 71.8361, 16.7232, -10.4337, 71.8361, 20.0679, -10.4337, 75.043594, 16.7232, -10.4337, 78.3101, 16.7232, -10.4337, 75.043594, 20.0679, -10.4337, 71.8361, 20.0679, -10.4337, 75.043594, 16.7232, -10.4337, 75.043594, 20.0679, -10.4337, 75.043594, 20.0679, -10.4337, 78.3101, 16.7232, -10.4337, 78.3101, 20.0679, -10.4337, 65.2334, 23.412498, -10.4337, 68.237495, 20.0679, -10.4337, 68.237495, 23.412498, -10.4337, 68.237495, 20.0679, -10.4337, 71.8361, 20.0679, -10.4337, 68.237495, 20.0679, -10.4337, 65.2334, 23.412498, -10.4337, 65.2334, 23.412498, -10.4337, 68.237495, 23.412498, -10.4337, 71.8361, 20.0679, -10.4337, 75.043594, 20.0679, -10.4337, 71.8361, 23.412498, -10.4337, 68.237495, 23.412498, -10.4337, 71.8361, 20.0679, -10.4337, 71.8361, 23.412498, -10.4337, 75.043594, 20.0679, -10.4337, 78.3101, 20.0679, -10.4337, 75.043594, 23.412498, -10.4337, 71.8361, 23.412498, -10.4337, 75.043594, 20.0679, -10.4337, 75.043594, 23.412498, -10.4337, 75.043594, 23.412498, -10.4337, 78.3101, 20.0679, -10.4337, 78.3101, 23.412498, -10.4337, 65.2334, 26.7582, -10.4337, 68.237495, 23.412498, -10.4337, 68.237495, 26.7582, -10.4337, 68.237495, 23.412498, -10.4337, 71.8361, 23.412498, -10.4337, 68.237495, 23.412498, -10.4337, 65.2334, 26.7582, -10.4337, 65.2334, 26.7582, -10.4337, 68.237495, 26.7582, -10.4337, 71.8361, 23.412498, -10.4337, 75.043594, 23.412498, -10.4337, 71.8361, 26.7582, -10.4337, 68.237495, 26.7582, -10.4337, 71.8361, 23.412498, -10.4337, 71.8361, 26.7582, -10.4337, 75.043594, 23.412498, -10.4337, 78.3101, 23.412498, -10.4337, 75.043594, 26.7582, -10.4337, 71.8361, 26.7582, -10.4337, 75.043594, 23.412498, -10.4337, 75.043594, 26.7582, -10.4337, 75.043594, 26.7582, -10.4337, 78.3101, 23.412498, -10.4337, 78.3101, 26.7582, -10.4337, 75.043594, 75.8818, -10.4337, 26.7572, 26.7582, -10.4337, 78.3101, 26.7582, -10.4337, 71.8361, 75.8818, -10.4337, 26.7572, 26.7582, -10.4337, 75.043594, 26.7582, -10.4337, 78.3101, 75.8818, -10.4337, 26.7572, 79.236, -10.4337, 26.7572, 79.236, -10.4337, 23.412498, 79.236, -10.4337, 26.7572, 75.8818, -10.4337, 26.7572, 71.9379, -10.4337, 26.7572, 26.7582, -10.4337, 71.8361, 26.7582, -10.4337, 68.237495, 75.8818, -10.4337, 26.7572, 26.7582, -10.4337, 71.8361, 71.9379, -10.4337, 26.7572, 68.9355, -10.4337, 26.7572, 26.7582, -10.4337, 68.237495, 26.7582, -10.4337, 65.2334, 71.9379, -10.4337, 26.7572, 26.7582, -10.4337, 68.237495, 68.9355, -10.4337, 26.7572, 68.9355, -10.4337, 26.7572, 26.7582, -10.4337, 65.2334, 66.1166, -10.4337, 26.7572, 68.9355, -10.4337, 26.7572, 66.1166, -10.4337, 26.7572, 66.1166, -10.4337, 23.412498, 68.9355, -10.4337, 26.7572, 66.1166, -10.4337, 23.412498, 68.937, -10.4337, 23.412498, 71.9379, -10.4337, 26.7572, 68.9355, -10.4337, 26.7572, 68.937, -10.4337, 23.412498, 68.937, -10.4337, 23.412498, 66.1166, -10.4337, 23.412498, 66.1166, -10.4337, 20.0679, 75.8818, -10.4337, 26.7572, 71.9379, -10.4337, 26.7572, 71.9555, -10.4337, 23.412498, 71.9379, -10.4337, 26.7572, 68.937, -10.4337, 23.412498, 71.9555, -10.4337, 23.412498, 79.236, -10.4337, 23.412498, 75.8818, -10.4337, 26.7572, 75.8708, -10.4337, 23.412498, 75.8818, -10.4337, 26.7572, 71.9555, -10.4337, 23.412498, 75.8708, -10.4337, 23.412498, 79.236, -10.4337, 20.0679, 79.236, -10.4337, 23.412498, 75.8708, -10.4337, 23.412498, 68.937, -10.4337, 23.412498, 66.1166, -10.4337, 20.0679, 68.9385, -10.4337, 20.0679, 71.9555, -10.4337, 23.412498, 68.937, -10.4337, 23.412498, 68.9385, -10.4337, 20.0679, 68.9385, -10.4337, 20.0679, 66.1166, -10.4337, 20.0679, 66.1166, -10.4337, 16.7232, 75.8708, -10.4337, 23.412498, 71.9555, -10.4337, 23.412498, 71.9732, -10.4337, 20.0679, 71.9555, -10.4337, 23.412498, 68.9385, -10.4337, 20.0679, 71.9732, -10.4337, 20.0679, 79.236, -10.4337, 20.0679, 75.8708, -10.4337, 23.412498, 75.859795, -10.4337, 20.0679, 75.8708, -10.4337, 23.412498, 71.9732, -10.4337, 20.0679, 75.859795, -10.4337, 20.0679, 79.236, -10.4337, 16.7232, 79.236, -10.4337, 20.0679, 75.859795, -10.4337, 20.0679, 68.9385, -10.4337, 20.0679, 66.1166, -10.4337, 16.7232, 68.9401, -10.4337, 16.7232, 71.9732, -10.4337, 20.0679, 68.9385, -10.4337, 20.0679, 68.9401, -10.4337, 16.7232, 68.9401, -10.4337, 16.7232, 66.1166, -10.4337, 16.7232, 66.1166, -10.4337, 13.378601, 75.859795, -10.4337, 20.0679, 71.9732, -10.4337, 20.0679, 71.9908, -10.4337, 16.7232, 71.9732, -10.4337, 20.0679, 68.9401, -10.4337, 16.7232, 71.9908, -10.4337, 16.7232, 79.236, -10.4337, 16.7232, 75.859795, -10.4337, 20.0679, 75.8488, -10.4337, 16.7232, 75.859795, -10.4337, 20.0679, 71.9908, -10.4337, 16.7232, 75.8488, -10.4337, 16.7232, 79.236, -10.4337, 13.378601, 79.236, -10.4337, 16.7232, 75.8488, -10.4337, 16.7232, 68.9401, -10.4337, 16.7232, 66.1166, -10.4337, 13.378601, 68.9416, -10.4337, 13.378601, 71.9908, -10.4337, 16.7232, 68.9401, -10.4337, 16.7232, 68.9416, -10.4337, 13.378601, 68.9416, -10.4337, 13.378601, 66.1166, -10.4337, 13.378601, 66.1166, -10.4337, 10.033899, 75.8488, -10.4337, 16.7232, 71.9908, -10.4337, 16.7232, 72.0085, -10.4337, 13.378601, 71.9908, -10.4337, 16.7232, 68.9416, -10.4337, 13.378601, 72.0085, -10.4337, 13.378601, 79.236, -10.4337, 13.378601, 75.8488, -10.4337, 16.7232, 75.8377, -10.4337, 13.378601, 75.8488, -10.4337, 16.7232, 72.0085, -10.4337, 13.378601, 75.8377, -10.4337, 13.378601, 79.236, -10.4337, 10.033899, 79.236, -10.4337, 13.378601, 75.8377, -10.4337, 13.378601, 68.9416, -10.4337, 13.378601, 66.1166, -10.4337, 10.033899, 68.9432, -10.4337, 10.033899, 72.0085, -10.4337, 13.378601, 68.9416, -10.4337, 13.378601, 68.9432, -10.4337, 10.033899, 68.9432, -10.4337, 10.033899, 66.1166, -10.4337, 10.033899, 66.1166, -10.4337, 6.6893, 75.8377, -10.4337, 13.378601, 72.0085, -10.4337, 13.378601, 72.0261, -10.4337, 10.033899, 72.0085, -10.4337, 13.378601, 68.9432, -10.4337, 10.033899, 72.0261, -10.4337, 10.033899, 79.236, -10.4337, 10.033899, 75.8377, -10.4337, 13.378601, 75.8267, -10.4337, 10.033899, 75.8377, -10.4337, 13.378601, 72.0261, -10.4337, 10.033899, 75.8267, -10.4337, 10.033899, 79.236, -10.4337, 6.6893, 79.236, -10.4337, 10.033899, 75.8267, -10.4337, 10.033899, 68.9432, -10.4337, 10.033899, 66.1166, -10.4337, 6.6893, 68.944695, -10.4337, 6.6893, 72.0261, -10.4337, 10.033899, 68.9432, -10.4337, 10.033899, 68.944695, -10.4337, 6.6893, 68.944695, -10.4337, 6.6893, 66.1166, -10.4337, 6.6893, 66.1166, -10.4337, 3.3446, 75.8267, -10.4337, 10.033899, 72.0261, -10.4337, 10.033899, 72.0437, -10.4337, 6.6893, 72.0261, -10.4337, 10.033899, 68.944695, -10.4337, 6.6893, 72.0437, -10.4337, 6.6893, 79.236, -10.4337, 6.6893, 75.8267, -10.4337, 10.033899, 75.8157, -10.4337, 6.6893, 75.8267, -10.4337, 10.033899, 72.0437, -10.4337, 6.6893, 75.8157, -10.4337, 6.6893, 79.236, -10.4337, 3.3446, 79.236, -10.4337, 6.6893, 75.8157, -10.4337, 6.6893, 68.944695, -10.4337, 6.6893, 66.1166, -10.4337, 3.3446, 68.9463, -10.4337, 3.3446, 72.0437, -10.4337, 6.6893, 68.944695, -10.4337, 6.6893, 68.9463, -10.4337, 3.3446, 68.9463, -10.4337, 3.3446, 66.1166, -10.4337, 3.3446, 66.1166, -10.4337, 0, 75.8157, -10.4337, 6.6893, 72.0437, -10.4337, 6.6893, 72.0614, -10.4337, 3.3446, 72.0437, -10.4337, 6.6893, 68.9463, -10.4337, 3.3446, 72.0614, -10.4337, 3.3446, 79.236, -10.4337, 3.3446, 75.8157, -10.4337, 6.6893, 75.804695, -10.4337, 3.3446, 75.8157, -10.4337, 6.6893, 72.0614, -10.4337, 3.3446, 75.804695, -10.4337, 3.3446, 79.236, -10.4337, 0, 79.236, -10.4337, 3.3446, 75.804695, -10.4337, 3.3446, 68.9463, -10.4337, 3.3446, 66.1166, -10.4337, 0, 68.9478, -10.4337, 0, 72.0614, -10.4337, 3.3446, 68.9463, -10.4337, 3.3446, 68.9478, -10.4337, 0, 68.9478, -10.4337, 0, 66.1166, -10.4337, 0, 66.1166, -10.4337, -3.3446002, 75.804695, -10.4337, 3.3446, 72.0614, -10.4337, 3.3446, 72.078995, -10.4337, 0, 72.0614, -10.4337, 3.3446, 68.9478, -10.4337, 0, 72.078995, -10.4337, 0, 79.236, -10.4337, 0, 75.804695, -10.4337, 3.3446, 75.793594, -10.4337, 0, 75.804695, -10.4337, 3.3446, 72.078995, -10.4337, 0, 75.793594, -10.4337, 0, 79.236, -10.4337, -3.3446002, 79.236, -10.4337, 0, 75.793594, -10.4337, 0, 68.9478, -10.4337, 0, 66.1166, -10.4337, -3.3446002, 68.9494, -10.4337, -3.3446002, 72.078995, -10.4337, 0, 68.9478, -10.4337, 0, 68.9494, -10.4337, -3.3446002, 68.9494, -10.4337, -3.3446002, 66.1166, -10.4337, -3.3446002, 66.1166, -10.4337, -6.6893, 75.793594, -10.4337, 0, 72.078995, -10.4337, 0, 72.096695, -10.4337, -3.3446002, 72.078995, -10.4337, 0, 68.9494, -10.4337, -3.3446002, 72.096695, -10.4337, -3.3446002, 79.236, -10.4337, -3.3446002, 75.793594, -10.4337, 0, 75.7826, -10.4337, -3.3446002, 75.793594, -10.4337, 0, 72.096695, -10.4337, -3.3446002, 75.7826, -10.4337, -3.3446002, 79.236, -10.4337, -6.6893, 79.236, -10.4337, -3.3446002, 75.7826, -10.4337, -3.3446002, 68.9494, -10.4337, -3.3446002, 66.1166, -10.4337, -6.6893, 68.9509, -10.4337, -6.6893, 72.096695, -10.4337, -3.3446002, 68.9494, -10.4337, -3.3446002, 68.9509, -10.4337, -6.6893, 68.9509, -10.4337, -6.6893, 66.1166, -10.4337, -6.6893, 66.1166, -10.4337, -10.033899, 75.7826, -10.4337, -3.3446002, 72.096695, -10.4337, -3.3446002, 72.114296, -10.4337, -6.6893, 72.096695, -10.4337, -3.3446002, 68.9509, -10.4337, -6.6893, 72.114296, -10.4337, -6.6893, 79.236, -10.4337, -6.6893, 75.7826, -10.4337, -3.3446002, 75.7716, -10.4337, -6.6893, 75.7826, -10.4337, -3.3446002, 72.114296, -10.4337, -6.6893, 75.7716, -10.4337, -6.6893, 79.236, -10.4337, -10.033899, 79.236, -10.4337, -6.6893, 75.7716, -10.4337, -6.6893, 68.9509, -10.4337, -6.6893, 66.1166, -10.4337, -10.033899, 68.9524, -10.4337, -10.033899, 72.114296, -10.4337, -6.6893, 68.9509, -10.4337, -6.6893, 68.9524, -10.4337, -10.033899, 68.9524, -10.4337, -10.033899, 66.1166, -10.4337, -10.033899, 66.1166, -10.4337, -13.378599, 75.7716, -10.4337, -6.6893, 72.114296, -10.4337, -6.6893, 72.1319, -10.4337, -10.033899, 72.114296, -10.4337, -6.6893, 68.9524, -10.4337, -10.033899, 72.1319, -10.4337, -10.033899, 79.236, -10.4337, -10.033899, 75.7716, -10.4337, -6.6893, 75.7606, -10.4337, -10.033899, 75.7716, -10.4337, -6.6893, 72.1319, -10.4337, -10.033899, 75.7606, -10.4337, -10.033899, 79.236, -10.4337, -13.378599, 79.236, -10.4337, -10.033899, 75.7606, -10.4337, -10.033899, 68.9524, -10.4337, -10.033899, 66.1166, -10.4337, -13.378599, 68.953995, -10.4337, -13.378599, 72.1319, -10.4337, -10.033899, 68.9524, -10.4337, -10.033899, 68.953995, -10.4337, -13.378599, 68.953995, -10.4337, -13.378599, 66.1166, -10.4337, -13.378599, 66.1166, -10.4337, -16.7232, 75.7606, -10.4337, -10.033899, 72.1319, -10.4337, -10.033899, 72.1496, -10.4337, -13.378599, 72.1319, -10.4337, -10.033899, 68.953995, -10.4337, -13.378599, 72.1496, -10.4337, -13.378599, 79.236, -10.4337, -13.378599, 75.7606, -10.4337, -10.033899, 75.749596, -10.4337, -13.378599, 75.7606, -10.4337, -10.033899, 72.1496, -10.4337, -13.378599, 75.749596, -10.4337, -13.378599, 79.236, -10.4337, -16.7232, 79.236, -10.4337, -13.378599, 75.749596, -10.4337, -13.378599, 68.953995, -10.4337, -13.378599, 66.1166, -10.4337, -16.7232, 68.9555, -10.4337, -16.7232, 72.1496, -10.4337, -13.378599, 68.953995, -10.4337, -13.378599, 68.9555, -10.4337, -16.7232, 68.9555, -10.4337, -16.7232, 66.1166, -10.4337, -16.7232, 66.1166, -10.4337, -20.0679, 75.749596, -10.4337, -13.378599, 72.1496, -10.4337, -13.378599, 72.1672, -10.4337, -16.7232, 72.1496, -10.4337, -13.378599, 68.9555, -10.4337, -16.7232, 72.1672, -10.4337, -16.7232, 79.236, -10.4337, -16.7232, 75.749596, -10.4337, -13.378599, 75.738495, -10.4337, -16.7232, 75.749596, -10.4337, -13.378599, 72.1672, -10.4337, -16.7232, 75.738495, -10.4337, -16.7232, 79.236, -10.4337, -20.0679, 79.236, -10.4337, -16.7232, 75.738495, -10.4337, -16.7232, 68.9555, -10.4337, -16.7232, 66.1166, -10.4337, -20.0679, 68.9571, -10.4337, -20.0679, 72.1672, -10.4337, -16.7232, 68.9555, -10.4337, -16.7232, 68.9571, -10.4337, -20.0679, 68.9571, -10.4337, -20.0679, 66.1166, -10.4337, -20.0679, 66.1166, -10.4337, -23.412498, 68.9571, -10.4337, -20.0679, 66.1166, -10.4337, -23.412498, 68.958595, -10.4337, -23.412498, 72.1672, -10.4337, -16.7232, 68.9571, -10.4337, -20.0679, 72.1849, -10.4337, -20.0679, 72.1849, -10.4337, -20.0679, 68.9571, -10.4337, -20.0679, 68.958595, -10.4337, -23.412498, 75.738495, -10.4337, -16.7232, 72.1672, -10.4337, -16.7232, 72.1849, -10.4337, -20.0679, 72.1849, -10.4337, -20.0679, 68.958595, -10.4337, -23.412498, 72.2025, -10.4337, -23.412498, 79.236, -10.4337, -20.0679, 75.738495, -10.4337, -16.7232, 75.7275, -10.4337, -20.0679, 75.738495, -10.4337, -16.7232, 72.1849, -10.4337, -20.0679, 75.7275, -10.4337, -20.0679, 75.7275, -10.4337, -20.0679, 72.1849, -10.4337, -20.0679, 72.2025, -10.4337, -23.412498, 79.236, -10.4337, -23.412498, 79.236, -10.4337, -20.0679, 75.7275, -10.4337, -20.0679, 75.7275, -10.4337, -20.0679, 72.2025, -10.4337, -23.412498, 75.7165, -10.4337, -23.412498, 79.236, -10.4337, -23.412498, 75.7275, -10.4337, -20.0679, 75.7165, -10.4337, -23.412498, -38.5239, -3.6573, 10.033899, -41.627, -4.8403997, 6.6893, -38.5239, -3.6573, 6.6893, -38.5239, -3.6573, 10.033899, -38.5239, -3.6573, 13.378601, -41.627, -4.8403997, 6.6893, -41.627, -4.8403997, 3.3446, -38.5239, -3.6573, 6.6893, -41.627, -4.8403997, 6.6893, -41.627, -4.8403997, 3.3446, -38.5239, -3.6573, 3.3446, -38.5239, -3.6573, 6.6893, -41.627, -4.8403997, 6.6893, -38.5239, -3.6573, 13.378601, -41.627, -4.8403997, 13.378601, -41.627, -4.8403997, 0, -38.5239, -3.6573, 3.3446, -41.627, -4.8403997, 3.3446, -41.627, -4.8403997, 0, -38.5239, -3.6573, 0, -38.5239, -3.6573, 3.3446, -44.537098, -5.95, 3.3446, -41.627, -4.8403997, 3.3446, -41.627, -4.8403997, 6.6893, -41.627, -4.8403997, -3.3446002, -38.5239, -3.6573, 0, -41.627, -4.8403997, 0, -41.627, -4.8403997, -3.3446002, -38.5239, -3.6573, -3.3446002, -38.5239, -3.6573, 0, -44.537098, -5.95, 0, -41.627, -4.8403997, 0, -41.627, -4.8403997, 3.3446, -44.537098, -5.95, 0, -41.627, -4.8403997, 3.3446, -44.537098, -5.95, 3.3446, -44.537098, -5.95, -3.3446002, -41.627, -4.8403997, -3.3446002, -41.627, -4.8403997, 0, -44.537098, -5.95, -3.3446002, -41.627, -4.8403997, 0, -44.537098, -5.95, 0, -41.627, -4.8403997, -6.6893, -38.5239, -3.6573, -3.3446002, -41.627, -4.8403997, -3.3446002, -41.627, -4.8403997, -6.6893, -38.5239, -3.6573, -6.6893, -38.5239, -3.6573, -3.3446002, -44.537098, -5.95, -6.6893, -41.627, -4.8403997, -3.3446002, -44.537098, -5.95, -3.3446002, -44.537098, -5.95, -6.6893, -41.627, -4.8403997, -6.6893, -41.627, -4.8403997, -3.3446002, -41.627, -4.8403997, -10.033899, -38.5239, -3.6573, -6.6893, -41.627, -4.8403997, -6.6893, -41.627, -4.8403997, -10.033899, -38.5239, -3.6573, -10.033899, -38.5239, -3.6573, -6.6893, -44.537098, -5.95, -10.033899, -41.627, -4.8403997, -6.6893, -44.537098, -5.95, -6.6893, -44.537098, -5.95, -10.033899, -41.627, -4.8403997, -10.033899, -41.627, -4.8403997, -6.6893, -41.627, -4.8403997, -13.378599, -38.5239, -3.6573, -10.033899, -41.627, -4.8403997, -10.033899, -41.627, -4.8403997, -13.378599, -38.5239, -3.6573, -13.378599, -38.5239, -3.6573, -10.033899, -41.627, -4.8403997, -13.378599, -38.5239, -3.6573, -16.7232, -38.5239, -3.6573, -13.378599, -41.627, -4.8403997, -13.378599, -38.5239, -3.6573, -17.0441, -38.5239, -3.6573, -16.7232, -38.5239, -3.6573, -17.0441, -41.627, -4.8403997, -13.378599, -41.627, -4.8403997, -17.0159, -41.627, -4.8403997, -17.0159, -38.5239, -3.6573, -20.0679, -38.5239, -3.6573, -17.0441, -44.537098, -5.95, -13.378599, -41.627, -4.8403997, -13.378599, -41.627, -4.8403997, -10.033899, -44.537098, -5.95, -13.378599, -41.627, -4.8403997, -10.033899, -44.537098, -5.95, -10.033899, -41.627, -4.8403997, -17.0159, -38.5239, -3.6573, -20.3888, -38.5239, -3.6573, -20.0679, -44.537098, -5.95, -16.9895, -41.627, -4.8403997, -13.378599, -44.537098, -5.95, -13.378599, -44.537098, -5.95, -16.9895, -41.627, -4.8403997, -17.0159, -41.627, -4.8403997, -13.378599, -47.4473, -7.0596, -13.378599, -44.537098, -5.95, -13.378599, -44.537098, -5.95, -10.033899, -47.4473, -7.0596, -16.963, -44.537098, -5.95, -16.9895, -44.537098, -5.95, -13.378599, -47.4473, -7.0596, -16.963, -44.537098, -5.95, -13.378599, -47.4473, -7.0596, -13.378599, -44.537098, -5.95, -20.334099, -41.627, -4.8403997, -17.0159, -44.537098, -5.95, -16.9895, -38.5239, -3.6573, -20.3888, -41.627, -4.8403997, -17.0159, -41.627, -4.8403997, -20.3606, -44.537098, -5.95, -20.334099, -41.627, -4.8403997, -20.3606, -41.627, -4.8403997, -17.0159, -41.627, -4.8403997, -23.412498, -38.5239, -3.6573, -20.3888, -41.627, -4.8403997, -20.3606, -41.627, -4.8403997, -23.412498, -38.5239, -3.6573, -23.412498, -38.5239, -3.6573, -20.3888, -41.627, -4.8403997, -26.7572, -38.5239, -3.6573, -23.412498, -41.627, -4.8403997, -23.412498, -41.627, -4.8403997, -26.7572, -38.5239, -3.6573, -26.7572, -38.5239, -3.6573, -23.412498, -44.537098, -5.95, -26.7572, -41.627, -4.8403997, -26.7572, -41.627, -4.8403997, -23.412498, -44.537098, -5.95, -23.412498, -41.627, -4.8403997, -23.412498, -41.627, -4.8403997, -20.3606, -44.537098, -5.95, -26.7572, -41.627, -4.8403997, -23.412498, -44.537098, -5.95, -23.412498, -44.537098, -5.95, -23.412498, -41.627, -4.8403997, -20.3606, -44.537098, -5.95, -20.334099, -47.4473, -7.0596, -26.7572, -44.537098, -5.95, -26.7572, -44.537098, -5.95, -23.412498, -47.4473, -7.0596, -23.412498, -44.537098, -5.95, -23.412498, -44.537098, -5.95, -20.334099, -47.4473, -7.0596, -26.7572, -44.537098, -5.95, -23.412498, -47.4473, -7.0596, -23.412498, -50.290497, -8.1437, -23.412498, -47.4473, -7.0596, -26.7572, -47.4473, -7.0596, -23.412498, -50.290497, -8.1437, -23.412498, -50.290497, -8.1437, -26.7572, -47.4473, -7.0596, -26.7572, -50.290497, -8.1437, -20.2818, -50.290497, -8.1437, -23.412498, -47.4473, -7.0596, -23.412498, -47.4473, -7.0596, -23.412498, -44.537098, -5.95, -20.334099, -47.4473, -7.0596, -20.3077, -50.290497, -8.1437, -20.2818, -47.4473, -7.0596, -23.412498, -47.4473, -7.0596, -20.3077, -47.4473, -7.0596, -20.3077, -44.537098, -5.95, -20.334099, -44.537098, -5.95, -16.9895, -47.4473, -7.0596, -20.3077, -44.537098, -5.95, -16.9895, -47.4473, -7.0596, -16.963, -47.4473, -7.0596, -16.963, -50.290497, -8.1437, -20.2818, -47.4473, -7.0596, -20.3077, -47.4473, -7.0596, -16.963, -50.290497, -8.1437, -20.0679, -50.290497, -8.1437, -20.2818, -50.290497, -8.1437, -20.0679, -47.4473, -7.0596, -16.963, -50.290497, -8.1437, -16.937199, -47.4473, -7.0596, -13.378599, -50.290497, -8.1437, -16.937199, -47.4473, -7.0596, -16.963, -47.4473, -7.0596, -13.378599, -50.290497, -8.1437, -16.7232, -50.290497, -8.1437, -16.937199, -50.290497, -8.1437, -16.7232, -47.4473, -7.0596, -13.378599, -50.290497, -8.1437, -13.378599, -50.290497, -8.1437, -10.033899, -50.290497, -8.1437, -13.378599, -47.4473, -7.0596, -13.378599, -50.290497, -8.1437, -10.033899, -47.4473, -7.0596, -13.378599, -47.4473, -7.0596, -10.033899, -47.4473, -7.0596, -13.378599, -44.537098, -5.95, -10.033899, -47.4473, -7.0596, -10.033899, -50.290497, -8.1437, -6.6893, -50.290497, -8.1437, -10.033899, -47.4473, -7.0596, -10.033899, -47.4473, -7.0596, -10.033899, -44.537098, -5.95, -10.033899, -44.537098, -5.95, -6.6893, -50.290497, -8.1437, -6.6893, -47.4473, -7.0596, -10.033899, -47.4473, -7.0596, -6.6893, -47.4473, -7.0596, -10.033899, -44.537098, -5.95, -6.6893, -47.4473, -7.0596, -6.6893, -50.290497, -8.1437, -3.3446002, -50.290497, -8.1437, -6.6893, -47.4473, -7.0596, -6.6893, -47.4473, -7.0596, -6.6893, -44.537098, -5.95, -6.6893, -44.537098, -5.95, -3.3446002, -50.290497, -8.1437, -3.3446002, -47.4473, -7.0596, -6.6893, -47.4473, -7.0596, -3.3446002, -47.4473, -7.0596, -6.6893, -44.537098, -5.95, -3.3446002, -47.4473, -7.0596, -3.3446002, -50.290497, -8.1437, 0, -50.290497, -8.1437, -3.3446002, -47.4473, -7.0596, -3.3446002, -47.4473, -7.0596, -3.3446002, -44.537098, -5.95, -3.3446002, -44.537098, -5.95, 0, -50.290497, -8.1437, 0, -47.4473, -7.0596, -3.3446002, -47.4473, -7.0596, 0, -47.4473, -7.0596, -3.3446002, -44.537098, -5.95, 0, -47.4473, -7.0596, 0, -50.290497, -8.1437, 3.3446, -50.290497, -8.1437, 0, -47.4473, -7.0596, 0, -47.4473, -7.0596, 0, -44.537098, -5.95, 0, -44.537098, -5.95, 3.3446, -50.290497, -8.1437, 3.3446, -47.4473, -7.0596, 0, -47.4473, -7.0596, 3.3446, -47.4473, -7.0596, 0, -44.537098, -5.95, 3.3446, -47.4473, -7.0596, 3.3446, -50.290497, -8.1437, 6.6893, -50.290497, -8.1437, 3.3446, -47.4473, -7.0596, 3.3446, -50.290497, -8.1437, 6.6893, -47.4473, -7.0596, 3.3446, -47.4473, -7.0596, 6.6893, -47.4473, -7.0596, 6.6893, -50.290497, -8.1437, 10.033899, -50.290497, -8.1437, 6.6893, -47.4473, -7.0596, 3.3446, -44.537098, -5.95, 3.3446, -44.537098, -5.95, 6.6893, -47.4473, -7.0596, 3.3446, -44.537098, -5.95, 6.6893, -47.4473, -7.0596, 6.6893, -44.537098, -5.95, 3.3446, -41.627, -4.8403997, 6.6893, -44.537098, -5.95, 6.6893, -47.4473, -7.0596, 6.6893, -50.290497, -8.1437, 13.378601, -50.290497, -8.1437, 10.033899, -41.627, -4.8403997, 13.378601, -44.537098, -5.95, 6.6893, -41.627, -4.8403997, 6.6893, -44.537098, -5.95, 13.378601, -47.4473, -7.0596, 6.6893, -44.537098, -5.95, 6.6893, -41.627, -4.8403997, 13.378601, -44.537098, -5.95, 13.378601, -44.537098, -5.95, 6.6893, -44.537098, -5.95, 13.378601, -47.4473, -7.0596, 13.378601, -47.4473, -7.0596, 6.6893, -50.290497, -8.1437, 13.378601, -47.4473, -7.0596, 6.6893, -47.4473, -7.0596, 13.378601, -41.627, -4.8403997, 16.7232, -44.537098, -5.95, 13.378601, -41.627, -4.8403997, 13.378601, -38.5239, -3.6573, 13.378601, -41.627, -4.8403997, 16.7232, -41.627, -4.8403997, 13.378601, -38.5239, -3.6573, 13.378601, -38.5239, -3.6573, 16.7232, -41.627, -4.8403997, 16.7232, -41.627, -4.8403997, 16.7232, -44.537098, -5.95, 16.7232, -44.537098, -5.95, 13.378601, -44.537098, -5.95, 16.7232, -47.4473, -7.0596, 13.378601, -44.537098, -5.95, 13.378601, -38.5239, -3.6573, 16.7232, -41.627, -4.8403997, 20.0679, -41.627, -4.8403997, 16.7232, -41.627, -4.8403997, 20.0679, -44.537098, -5.95, 16.7232, -41.627, -4.8403997, 16.7232, -38.5239, -3.6573, 16.7232, -38.5239, -3.6573, 20.0679, -41.627, -4.8403997, 20.0679, -47.4473, -7.0596, 16.7232, -50.290497, -8.1437, 13.378601, -47.4473, -7.0596, 13.378601, -44.537098, -5.95, 16.7232, -47.4473, -7.0596, 16.7232, -47.4473, -7.0596, 13.378601, -47.4473, -7.0596, 16.7232, -50.290497, -8.1437, 16.7232, -50.290497, -8.1437, 13.378601, -41.627, -4.8403997, 20.0679, -44.537098, -5.95, 20.0679, -44.537098, -5.95, 16.7232, -44.537098, -5.95, 20.0679, -47.4473, -7.0596, 16.7232, -44.537098, -5.95, 16.7232, -38.5239, -3.6573, 20.0679, -41.627, -4.8403997, 23.412498, -41.627, -4.8403997, 20.0679, -41.627, -4.8403997, 23.412498, -44.537098, -5.95, 20.0679, -41.627, -4.8403997, 20.0679, -38.5239, -3.6573, 20.0679, -38.5239, -3.6573, 23.412498, -41.627, -4.8403997, 23.412498, -38.5239, -3.6573, 23.412498, -41.627, -4.8403997, 26.7572, -41.627, -4.8403997, 23.412498, -38.5239, -3.6573, 23.412498, -38.5239, -3.6573, 26.7572, -41.627, -4.8403997, 26.7572, -41.627, -4.8403997, 26.7572, -44.537098, -5.95, 23.412498, -41.627, -4.8403997, 23.412498, -41.627, -4.8403997, 23.412498, -44.537098, -5.95, 23.412498, -44.537098, -5.95, 20.0679, -41.627, -4.8403997, 26.7572, -44.537098, -5.95, 26.7572, -44.537098, -5.95, 23.412498, -44.537098, -5.95, 20.0679, -47.4473, -7.0596, 20.0679, -47.4473, -7.0596, 16.7232, -47.4473, -7.0596, 20.0679, -50.290497, -8.1437, 16.7232, -47.4473, -7.0596, 16.7232, -44.537098, -5.95, 23.412498, -47.4473, -7.0596, 20.0679, -44.537098, -5.95, 20.0679, -47.4473, -7.0596, 20.0679, -50.290497, -8.1437, 20.0679, -50.290497, -8.1437, 16.7232, -44.537098, -5.95, 26.7572, -47.4473, -7.0596, 23.412498, -44.537098, -5.95, 23.412498, -44.537098, -5.95, 23.412498, -47.4473, -7.0596, 23.412498, -47.4473, -7.0596, 20.0679, -47.4473, -7.0596, 23.412498, -50.290497, -8.1437, 20.0679, -47.4473, -7.0596, 20.0679, -44.537098, -5.95, 26.7572, -47.4473, -7.0596, 26.7572, -47.4473, -7.0596, 23.412498, -47.4473, -7.0596, 23.412498, -50.290497, -8.1437, 23.412498, -50.290497, -8.1437, 20.0679, -47.4473, -7.0596, 26.7572, -50.290497, -8.1437, 23.412498, -47.4473, -7.0596, 23.412498, -47.4473, -7.0596, 26.7572, -50.290497, -8.1437, 26.7572, -50.290497, -8.1437, 23.412498, -6.6893, -8.1437, -54.500298, -3.4038, -8.6382, -57.495697, -3.4199996, -8.1437, -54.500298, -3.4038, -8.6382, -57.495697, -3.3446002, -8.1437, -54.500298, -3.4199996, -8.1437, -54.500298, -6.6893, -8.1437, -54.500298, -6.7919, -8.1437, -54.500298, -3.4038, -8.6382, -57.495697, -3.4038, -8.6382, -57.495697, -0.048199892, -8.1437, -54.500298, -3.3446002, -8.1437, -54.500298, -3.4038, -8.6382, -57.495697, -6.7919, -8.1437, -54.500298, -6.7697997, -8.6367, -57.4865, -10.033899, -8.1437, -54.500298, -6.7697997, -8.6367, -57.4865, -6.7919, -8.1437, -54.500298, -0.048199892, -8.1437, -54.500298, -3.4038, -8.6382, -57.495697, -0.037699938, -8.6397, -57.504997, -6.7697997, -8.6367, -57.4865, -10.033899, -8.1437, -54.500298, -10.141901, -8.1437, -54.500298, -0.037699938, -8.6397, -57.504997, 0, -8.1437, -54.500298, -0.048199892, -8.1437, -54.500298, -6.7697997, -8.6367, -57.4865, -10.141901, -8.1437, -54.500298, -10.1187, -8.635099, -57.4772, -13.378601, -8.1437, -54.500298, -10.1187, -8.635099, -57.4772, -10.141901, -8.1437, -54.500298, -0.037699938, -8.6397, -57.504997, 3.3446, -8.1437, -54.500298, 0, -8.1437, -54.500298, -10.1187, -8.635099, -57.4772, -13.378601, -8.1437, -54.500298, -13.4286, -8.1437, -54.500298, 3.3446, -8.1437, -54.500298, -0.037699938, -8.6397, -57.504997, 3.3446, -8.6413, -57.514297, -10.1187, -8.635099, -57.4772, -6.749, -9.1004, -60.295498, -6.7697997, -8.6367, -57.4865, 6.6893, -8.642799, -57.5235, 3.3446, -8.1437, -54.500298, 3.3446, -8.6413, -57.514297, 6.6893, -8.642799, -57.5235, 6.6893, -8.1437, -54.500298, 3.3446, -8.1437, -54.500298, 3.3446, -9.0949, -60.262497, 3.3446, -8.6413, -57.514297, -0.037699938, -8.6397, -57.504997, 10.033899, -8.6442995, -57.5327, 6.6893, -8.1437, -54.500298, 6.6893, -8.642799, -57.5235, 10.033899, -8.6442995, -57.5327, 10.033899, -8.1437, -54.500298, 6.6893, -8.1437, -54.500298, 10.033899, -8.6442995, -57.5327, 13.378599, -8.1437, -54.500298, 10.033899, -8.1437, -54.500298, 10.033899, -8.6442995, -57.5327, 13.444599, -8.1437, -54.500298, 13.378599, -8.1437, -54.500298, 13.444599, -8.1437, -54.500298, 10.033899, -8.6442995, -57.5327, 13.4300995, -8.6458, -57.5421, 13.4300995, -8.6458, -57.5421, 16.7232, -8.1437, -54.500298, 13.444599, -8.1437, -54.500298, 13.4300995, -8.6458, -57.5421, 16.8188, -8.1437, -54.500298, 16.7232, -8.1437, -54.500298, 16.8188, -8.1437, -54.500298, 13.4300995, -8.6458, -57.5421, 16.7978, -8.6474, -57.5514, 16.7978, -8.6474, -57.5514, 20.0679, -8.1437, -54.500298, 16.8188, -8.1437, -54.500298, 16.7978, -8.6474, -57.5514, 20.1975, -8.1437, -54.500298, 20.0679, -8.1437, -54.500298, 20.1975, -8.1437, -54.500298, 16.7978, -8.6474, -57.5514, 20.1689, -8.6489, -57.5607, 20.1442, -9.085899, -60.207497, 20.1689, -8.6489, -57.5607, 16.7978, -8.6474, -57.5514, 20.1442, -9.085899, -60.207497, 16.7978, -8.6474, -57.5514, 16.7794, -9.0877, -60.2185, 16.7794, -9.0877, -60.2185, 16.7978, -8.6474, -57.5514, 13.4300995, -8.6458, -57.5421, 20.112099, -9.6529, -63.642, 20.1442, -9.085899, -60.207497, 16.7794, -9.0877, -60.2185, 16.7794, -9.0877, -60.2185, 13.4300995, -8.6458, -57.5421, 13.417299, -9.089499, -60.2295, 13.417299, -9.089499, -60.2295, 13.4300995, -8.6458, -57.5421, 10.033899, -8.6442995, -57.5327, 20.112099, -9.6529, -63.642, 16.7794, -9.0877, -60.2185, 16.7557, -9.6571, -63.6679, 16.7557, -9.6571, -63.6679, 16.7794, -9.0877, -60.2185, 13.417299, -9.089499, -60.2295, 16.7232, -10.4337, -68.371895, 20.112099, -9.6529, -63.642, 16.7557, -9.6571, -63.6679, 16.7232, -10.4337, -68.371895, 20.0679, -10.4337, -68.371895, 20.112099, -9.6529, -63.642, 13.378599, -10.4337, -68.371895, 16.7232, -10.4337, -68.371895, 16.7557, -9.6571, -63.6679, 13.378599, -10.4337, -68.371895, 16.7557, -9.6571, -63.6679, 13.400799, -9.6614, -63.693794, 16.7557, -9.6571, -63.6679, 13.417299, -9.089499, -60.2295, 13.400799, -9.6614, -63.693794, 10.033899, -10.4337, -68.371895, 13.378599, -10.4337, -68.371895, 13.400799, -9.6614, -63.693794, 13.417299, -9.089499, -60.2295, 10.033899, -8.6442995, -57.5327, 10.033899, -9.0913, -60.240597, 13.400799, -9.6614, -63.693794, 13.417299, -9.089499, -60.2295, 10.033899, -9.0913, -60.240597, 10.033899, -9.0913, -60.240597, 10.033899, -8.6442995, -57.5327, 6.6893, -8.642799, -57.5235, 10.033899, -10.4337, -68.371895, 13.400799, -9.6614, -63.693794, 10.033899, -9.6657, -63.719696, 13.400799, -9.6614, -63.693794, 10.033899, -9.0913, -60.240597, 10.033899, -9.6657, -63.719696, 6.6893, -10.4337, -68.371895, 10.033899, -10.4337, -68.371895, 10.033899, -9.6657, -63.719696, 10.033899, -9.0913, -60.240597, 6.6893, -8.642799, -57.5235, 6.6893, -9.0931, -60.2515, 10.033899, -9.6657, -63.719696, 10.033899, -9.0913, -60.240597, 6.6893, -9.0931, -60.2515, 6.6893, -9.0931, -60.2515, 6.6893, -8.642799, -57.5235, 3.3446, -8.6413, -57.514297, 6.6893, -10.4337, -68.371895, 10.033899, -9.6657, -63.719696, 6.6893, -9.6699, -63.7455, 10.033899, -9.6657, -63.719696, 6.6893, -9.0931, -60.2515, 6.6893, -9.6699, -63.7455, 3.3446, -10.4337, -68.371895, 6.6893, -10.4337, -68.371895, 6.6893, -9.6699, -63.7455, 6.6893, -9.0931, -60.2515, 3.3446, -8.6413, -57.514297, 3.3446, -9.0949, -60.262497, 6.6893, -9.6699, -63.7455, 6.6893, -9.0931, -60.2515, 3.3446, -9.0949, -60.262497, 3.3446, -10.4337, -68.371895, 6.6893, -9.6699, -63.7455, 3.3446, -9.6742, -63.771194, 6.6893, -9.6699, -63.7455, 3.3446, -9.0949, -60.262497, 3.3446, -9.6742, -63.771194, 0, -10.4337, -68.371895, 3.3446, -10.4337, -68.371895, 3.3446, -9.6742, -63.771194, 3.3446, -9.6742, -63.771194, 3.3446, -9.0949, -60.262497, -0.028100014, -9.0968, -60.2735, 3.3446, -9.0949, -60.262497, -0.037699938, -8.6397, -57.504997, -0.028100014, -9.0968, -60.2735, -0.028100014, -9.0968, -60.2735, -0.037699938, -8.6397, -57.504997, -3.4038, -8.6382, -57.495697, 0, -10.4337, -68.371895, 3.3446, -9.6742, -63.771194, -0.015899897, -9.6785, -63.797096, 3.3446, -9.6742, -63.771194, -0.028100014, -9.0968, -60.2735, -0.015899897, -9.6785, -63.797096, -3.3446002, -10.4337, -68.371895, 0, -10.4337, -68.371895, -0.015899897, -9.6785, -63.797096, -0.028100014, -9.0968, -60.2735, -3.4038, -8.6382, -57.495697, -3.3885999, -9.098599, -60.2845, -0.015899897, -9.6785, -63.797096, -0.028100014, -9.0968, -60.2735, -3.3885999, -9.098599, -60.2845, -6.7697997, -8.6367, -57.4865, -3.3885999, -9.098599, -60.2845, -3.4038, -8.6382, -57.495697, -6.7697997, -8.6367, -57.4865, -6.749, -9.1004, -60.295498, -3.3885999, -9.098599, -60.2845, -0.015899897, -9.6785, -63.797096, -3.3885999, -9.098599, -60.2845, -3.3694, -9.6827, -63.8229, -3.3446002, -10.4337, -68.371895, -0.015899897, -9.6785, -63.797096, -3.3694, -9.6827, -63.8229, -6.749, -9.1004, -60.295498, -3.3694, -9.6827, -63.8229, -3.3885999, -9.098599, -60.2845, -6.7226996, -9.686999, -63.848793, -3.3446002, -10.4337, -68.371895, -3.3694, -9.6827, -63.8229, -6.749, -9.1004, -60.295498, -6.7226996, -9.686999, -63.848793, -3.3694, -9.6827, -63.8229, -6.7226996, -9.686999, -63.848793, -6.6893, -10.4337, -68.371895, -3.3446002, -10.4337, -68.371895, -10.096701, -9.1022, -60.3065, -6.7226996, -9.686999, -63.848793, -6.749, -9.1004, -60.295498, -10.068901, -9.691199, -63.874596, -6.6893, -10.4337, -68.371895, -6.7226996, -9.686999, -63.848793, -10.096701, -9.1022, -60.3065, -10.068901, -9.691199, -63.874596, -6.7226996, -9.686999, -63.848793, -10.068901, -9.691199, -63.874596, -10.033899, -10.4337, -68.371895, -6.6893, -10.4337, -68.371895, -10.1187, -8.635099, -57.4772, -10.096701, -9.1022, -60.3065, -6.749, -9.1004, -60.295498, -13.394701, -9.695499, -63.9002, -10.033899, -10.4337, -68.371895, -10.068901, -9.691199, -63.874596, -13.394701, -9.695499, -63.9002, -13.378601, -10.4337, -68.371895, -10.033899, -10.4337, -68.371895, -13.4076, -9.104, -60.3173, -10.068901, -9.691199, -63.874596, -10.096701, -9.1022, -60.3065, -13.4076, -9.104, -60.3173, -13.394701, -9.695499, -63.9002, -10.068901, -9.691199, -63.874596, -13.4179, -8.6336, -57.468098, -10.096701, -9.1022, -60.3065, -10.1187, -8.635099, -57.4772, -13.4179, -8.6336, -57.468098, -13.4076, -9.104, -60.3173, -10.096701, -9.1022, -60.3065, -10.1187, -8.635099, -57.4772, -13.4286, -8.1437, -54.500298, -13.4179, -8.6336, -57.468098, -13.4286, -8.1437, -54.500298, -16.7232, -8.6321, -57.459, -13.4179, -8.6336, -57.468098, -16.7232, -8.6321, -57.459, -13.4076, -9.104, -60.3173, -13.4179, -8.6336, -57.468098, -13.4286, -8.1437, -54.500298, -16.7232, -8.1437, -54.500298, -16.7232, -8.6321, -57.459, -16.7232, -9.1058, -60.3281, -13.394701, -9.695499, -63.9002, -13.4076, -9.104, -60.3173, -16.7232, -8.6321, -57.459, -16.7232, -9.1058, -60.3281, -13.4076, -9.104, -60.3173, -16.7232, -9.699699, -63.925797, -13.378601, -10.4337, -68.371895, -13.394701, -9.695499, -63.9002, -16.7232, -9.1058, -60.3281, -16.7232, -9.699699, -63.925797, -13.394701, -9.695499, -63.9002, -16.7232, -9.699699, -63.925797, -16.7232, -10.4337, -68.371895, -13.378601, -10.4337, -68.371895, -16.7232, -8.1437, -54.500298, -20.0679, -8.6306, -57.4498, -16.7232, -8.6321, -57.459, -20.0679, -8.6306, -57.4498, -16.7232, -9.1058, -60.3281, -16.7232, -8.6321, -57.459, -16.7232, -8.1437, -54.500298, -20.0679, -8.1437, -54.500298, -20.0679, -8.6306, -57.4498, -20.0679, -9.1076, -60.3391, -16.7232, -9.699699, -63.925797, -16.7232, -9.1058, -60.3281, -20.0679, -8.6306, -57.4498, -20.0679, -9.1076, -60.3391, -16.7232, -9.1058, -60.3281, -20.0679, -9.7039995, -63.9516, -16.7232, -10.4337, -68.371895, -16.7232, -9.699699, -63.925797, -20.0679, -9.1076, -60.3391, -20.0679, -9.7039995, -63.9516, -16.7232, -9.699699, -63.925797, -20.0679, -9.7039995, -63.9516, -20.0679, -10.4337, -68.371895, -16.7232, -10.4337, -68.371895, -20.0679, -8.1437, -54.500298, -23.412498, -8.6291, -57.440598, -20.0679, -8.6306, -57.4498, -23.412498, -8.6291, -57.440598, -20.0679, -9.1076, -60.3391, -20.0679, -8.6306, -57.4498, -20.0679, -8.1437, -54.500298, -23.412498, -8.1437, -54.500298, -23.412498, -8.6291, -57.440598, -23.412498, -8.1437, -54.500298, -26.7572, -8.6276, -57.4314, -23.412498, -8.6291, -57.440598, -23.412498, -8.1437, -54.500298, -26.7572, -8.1437, -54.500298, -26.7572, -8.6276, -57.4314, -23.412498, -8.6291, -57.440598, -23.412498, -9.1094, -60.35, -20.0679, -9.1076, -60.3391, -26.7572, -8.6276, -57.4314, -23.412498, -9.1094, -60.35, -23.412498, -8.6291, -57.440598, -23.412498, -9.1094, -60.35, -20.0679, -9.7039995, -63.9516, -20.0679, -9.1076, -60.3391, -26.7572, -8.6276, -57.4314, -26.7572, -9.111199, -60.361, -23.412498, -9.1094, -60.35, -23.412498, -9.7081995, -63.977394, -20.0679, -10.4337, -68.371895, -20.0679, -9.7039995, -63.9516, -23.412498, -9.1094, -60.35, -23.412498, -9.7081995, -63.977394, -20.0679, -9.7039995, -63.9516, -26.7572, -9.111199, -60.361, -23.412498, -9.7081995, -63.977394, -23.412498, -9.1094, -60.35, -23.412498, -9.7081995, -63.977394, -23.412498, -10.4337, -68.371895, -20.0679, -10.4337, -68.371895, -26.7572, -9.111199, -60.361, -26.7572, -9.7125, -64.0031, -23.412498, -9.7081995, -63.977394, -26.7572, -9.7125, -64.0031, -23.412498, -10.4337, -68.371895, -23.412498, -9.7081995, -63.977394, -26.7572, -9.7125, -64.0031, -26.7572, -10.4337, -68.371895, -23.412498, -10.4337, -68.371895, -3.3446002, -10.4337, -68.371895, -0.0020999908, -10.5633, -70.6314, 0, -10.4337, -68.371895, -3.3446002, -10.4337, -68.371895, -3.3514, -10.5471, -70.669, -0.0020999908, -10.5633, -70.6314, 23.412498, 0, -3.3446002, 26.7577, -0.6956, 0, 23.412498, 0, 0, 23.412498, 0, -3.3446002, 26.7577, -0.4894, -3.3446002, 26.7577, -0.6956, 0, 23.412498, 0, -6.6893, 26.7577, -0.4894, -3.3446002, 23.412498, 0, -3.3446002, 23.412498, 0, -6.6893, 26.7577, -0.3464, -6.6893, 26.7577, -0.4894, -3.3446002, 23.412498, -1.0924, -23.412498, 26.7582, -1.0924, -20.0679, 23.412498, -1.0924, -20.0679, 23.412498, -1.0924, -23.412498, 26.7582, -1.0924, -23.412498, 26.7582, -1.0924, -20.0679, 23.412498, 0, -10.033899, 26.7577, -0.3464, -6.6893, 23.412498, 0, -6.6893, 23.412498, 0, -10.033899, 26.572199, -0.4003, -10.314899, 26.7577, -0.3464, -6.6893, 23.412498, -0.35529998, 10.033899, 26.7582, -1.7623999, 10.033899, 23.412498, -1.8294, 13.378601, 23.412498, -0.456, -16.7232, 26.7577, -0.8804, -16.7232, 26.572199, -0.95549995, -13.659599, 23.412498, -1.1158999, -26.7572, 26.7582, -1.0924, -23.412498, 23.412498, -1.0924, -23.412498, 23.412498, -1.1158999, -26.7572, 26.7573, -1.3222, -26.7572, 26.7582, -1.0924, -23.412498, 23.412498, -2.2719998, 23.3902, 26.7582, -2.7837, 26.6955, 23.412498, -2.2194998, 26.781, 23.412498, -2.2719998, 23.3902, 26.7582, -2.2719998, 23.3902, 26.7582, -2.7837, 26.6955, 23.412498, 0, -13.378599, 26.572199, -0.4003, -10.314899, 23.412498, 0, -10.033899, 23.412498, 0, -13.378599, 26.572199, -0.95549995, -13.659599, 26.572199, -0.4003, -10.314899, 23.412498, 0, 0, 26.7577, -0.6956, 0, 26.7577, -0.73109996, 3.3446, 23.412498, -1.0924, -20.0679, 26.7582, -1.0924, -20.0679, 26.7577, -0.8804, -16.7232, 52.997097, -8.1437, -6.6893, 56.213997, -8.7052, -3.3446002, 52.997097, -8.1437, -3.3446002, 56.173397, -8.6981, 0, 52.997097, -8.1437, -3.3446002, 56.213997, -8.7052, -3.3446002, 56.173397, -8.6981, 0, 52.997097, -8.1437, 0, 52.997097, -8.1437, -3.3446002, 52.997097, -8.1437, -6.6893, 56.254498, -8.712299, -6.6893, 56.213997, -8.7052, -3.3446002, 56.254498, -8.712299, -6.6893, 52.997097, -8.1437, -6.6893, 52.997097, -8.1437, -10.033899, 59.1829, -9.2234, 0, 56.173397, -8.6981, 0, 56.213997, -8.7052, -3.3446002, 56.254498, -8.712299, -6.6893, 59.216, -9.229199, -3.3446002, 56.213997, -8.7052, -3.3446002, 59.1829, -9.2234, 0, 56.213997, -8.7052, -3.3446002, 59.216, -9.229199, -3.3446002, 56.1329, -8.691, 3.3446, 52.997097, -8.1437, 0, 56.173397, -8.6981, 0, 56.1329, -8.691, 3.3446, 52.997097, -8.1437, 3.3446, 52.997097, -8.1437, 0, 59.1498, -9.2176, 3.3446, 56.173397, -8.6981, 0, 59.1829, -9.2234, 0, 59.1498, -9.2176, 3.3446, 56.1329, -8.691, 3.3446, 56.173397, -8.6981, 0, 56.0924, -8.684, 6.6893, 52.997097, -8.1437, 3.3446, 56.1329, -8.691, 3.3446, 56.0924, -8.684, 6.6893, 52.997097, -8.1437, 6.6893, 52.997097, -8.1437, 3.3446, 59.1167, -9.2119, 6.6893, 56.1329, -8.691, 3.3446, 59.1498, -9.2176, 3.3446, 59.1167, -9.2119, 6.6893, 56.0924, -8.684, 6.6893, 56.1329, -8.691, 3.3446, 56.0518, -8.6769, 10.033899, 52.997097, -8.1437, 6.6893, 56.0924, -8.684, 6.6893, 56.0518, -8.6769, 10.033899, 52.997097, -8.1437, 10.033899, 52.997097, -8.1437, 6.6893, 59.0836, -9.2060995, 10.033899, 56.0924, -8.684, 6.6893, 59.1167, -9.2119, 6.6893, 59.0836, -9.2060995, 10.033899, 56.0518, -8.6769, 10.033899, 56.0924, -8.684, 6.6893, 56.0113, -8.6698, 13.378601, 52.997097, -8.1437, 10.033899, 56.0518, -8.6769, 10.033899, 56.0113, -8.6698, 13.378601, 52.997097, -8.1437, 13.378601, 52.997097, -8.1437, 10.033899, 59.0505, -9.2003, 13.378601, 56.0518, -8.6769, 10.033899, 59.0836, -9.2060995, 10.033899, 59.0505, -9.2003, 13.378601, 56.0113, -8.6698, 13.378601, 56.0518, -8.6769, 10.033899, 55.9708, -8.6627, 16.7232, 52.997097, -8.1437, 13.378601, 56.0113, -8.6698, 13.378601, 55.9708, -8.6627, 16.7232, 52.997097, -8.1437, 16.7232, 52.997097, -8.1437, 13.378601, 59.017498, -9.1945, 16.7232, 56.0113, -8.6698, 13.378601, 59.0505, -9.2003, 13.378601, 59.017498, -9.1945, 16.7232, 55.9708, -8.6627, 16.7232, 56.0113, -8.6698, 13.378601, 55.930298, -8.6557, 20.0679, 52.997097, -8.1437, 16.7232, 55.9708, -8.6627, 16.7232, 55.930298, -8.6557, 20.0679, 52.997097, -8.1437, 20.0679, 52.997097, -8.1437, 16.7232, 58.984398, -9.1888, 20.0679, 55.9708, -8.6627, 16.7232, 59.017498, -9.1945, 16.7232, 58.984398, -9.1888, 20.0679, 55.930298, -8.6557, 20.0679, 55.9708, -8.6627, 16.7232, 55.889698, -8.6486, 23.412498, 52.997097, -8.1437, 20.0679, 55.930298, -8.6557, 20.0679, 55.889698, -8.6486, 23.412498, 52.997097, -8.1437, 23.412498, 52.997097, -8.1437, 20.0679, 55.849197, -8.6414995, 26.7572, 52.997097, -8.1437, 23.412498, 55.889698, -8.6486, 23.412498, 55.849197, -8.6414995, 26.7572, 52.997097, -8.1437, 26.7572, 52.997097, -8.1437, 23.412498, 58.918198, -9.177199, 26.7572, 55.849197, -8.6414995, 26.7572, 55.889698, -8.6486, 23.412498, 58.951298, -9.183, 23.412498, 55.889698, -8.6486, 23.412498, 55.930298, -8.6557, 20.0679, 58.918198, -9.177199, 26.7572, 55.889698, -8.6486, 23.412498, 58.951298, -9.183, 23.412498, 58.951298, -9.183, 23.412498, 55.930298, -8.6557, 20.0679, 58.984398, -9.1888, 20.0679, 62.4636, -9.7961, 26.7572, 58.918198, -9.177199, 26.7572, 58.951298, -9.183, 23.412498, 62.4577, -9.795, 23.412498, 58.951298, -9.183, 23.412498, 58.984398, -9.1888, 20.0679, 62.4636, -9.7961, 26.7572, 58.951298, -9.183, 23.412498, 62.4577, -9.795, 23.412498, 66.1166, -10.4337, 23.412498, 62.4636, -9.7961, 26.7572, 62.4577, -9.795, 23.412498, 66.1166, -10.4337, 23.412498, 66.1166, -10.4337, 26.7572, 62.4636, -9.7961, 26.7572, 66.1166, -10.4337, 20.0679, 66.1166, -10.4337, 23.412498, 62.4577, -9.795, 23.412498, 62.4577, -9.795, 23.412498, 58.984398, -9.1888, 20.0679, 62.451897, -9.794, 20.0679, 66.1166, -10.4337, 20.0679, 62.4577, -9.795, 23.412498, 62.451897, -9.794, 20.0679, 62.451897, -9.794, 20.0679, 58.984398, -9.1888, 20.0679, 59.017498, -9.1945, 16.7232, 66.1166, -10.4337, 16.7232, 66.1166, -10.4337, 20.0679, 62.451897, -9.794, 20.0679, 62.451897, -9.794, 20.0679, 59.017498, -9.1945, 16.7232, 62.446, -9.793, 16.7232, 66.1166, -10.4337, 16.7232, 62.451897, -9.794, 20.0679, 62.446, -9.793, 16.7232, 62.446, -9.793, 16.7232, 59.017498, -9.1945, 16.7232, 59.0505, -9.2003, 13.378601, 66.1166, -10.4337, 13.378601, 66.1166, -10.4337, 16.7232, 62.446, -9.793, 16.7232, 62.446, -9.793, 16.7232, 59.0505, -9.2003, 13.378601, 62.440098, -9.792, 13.378601, 66.1166, -10.4337, 13.378601, 62.446, -9.793, 16.7232, 62.440098, -9.792, 13.378601, 62.440098, -9.792, 13.378601, 59.0505, -9.2003, 13.378601, 59.0836, -9.2060995, 10.033899, 66.1166, -10.4337, 10.033899, 66.1166, -10.4337, 13.378601, 62.440098, -9.792, 13.378601, 62.440098, -9.792, 13.378601, 59.0836, -9.2060995, 10.033899, 62.4343, -9.790899, 10.033899, 66.1166, -10.4337, 10.033899, 62.440098, -9.792, 13.378601, 62.4343, -9.790899, 10.033899, 62.4343, -9.790899, 10.033899, 59.0836, -9.2060995, 10.033899, 59.1167, -9.2119, 6.6893, 66.1166, -10.4337, 6.6893, 66.1166, -10.4337, 10.033899, 62.4343, -9.790899, 10.033899, 62.4343, -9.790899, 10.033899, 59.1167, -9.2119, 6.6893, 62.4284, -9.7899, 6.6893, 66.1166, -10.4337, 6.6893, 62.4343, -9.790899, 10.033899, 62.4284, -9.7899, 6.6893, 62.4284, -9.7899, 6.6893, 59.1167, -9.2119, 6.6893, 59.1498, -9.2176, 3.3446, 66.1166, -10.4337, 3.3446, 66.1166, -10.4337, 6.6893, 62.4284, -9.7899, 6.6893, 62.4284, -9.7899, 6.6893, 59.1498, -9.2176, 3.3446, 62.422497, -9.788899, 3.3446, 66.1166, -10.4337, 3.3446, 62.4284, -9.7899, 6.6893, 62.422497, -9.788899, 3.3446, 62.422497, -9.788899, 3.3446, 59.1498, -9.2176, 3.3446, 59.1829, -9.2234, 0, 66.1166, -10.4337, 0, 66.1166, -10.4337, 3.3446, 62.422497, -9.788899, 3.3446, 62.422497, -9.788899, 3.3446, 59.1829, -9.2234, 0, 62.4167, -9.7879, 0, 66.1166, -10.4337, 0, 62.422497, -9.788899, 3.3446, 62.4167, -9.7879, 0, 62.4167, -9.7879, 0, 59.1829, -9.2234, 0, 59.216, -9.229199, -3.3446002, 66.1166, -10.4337, -3.3446002, 66.1166, -10.4337, 0, 62.4167, -9.7879, 0, 62.4167, -9.7879, 0, 59.216, -9.229199, -3.3446002, 62.410797, -9.786799, -3.3446002, 66.1166, -10.4337, -3.3446002, 62.4167, -9.7879, 0, 62.410797, -9.786799, -3.3446002, 59.248997, -9.235, -6.6893, 62.410797, -9.786799, -3.3446002, 59.216, -9.229199, -3.3446002, 62.4049, -9.7858, -6.6893, 66.1166, -10.4337, -3.3446002, 62.410797, -9.786799, -3.3446002, 59.248997, -9.235, -6.6893, 62.4049, -9.7858, -6.6893, 62.410797, -9.786799, -3.3446002, 62.4049, -9.7858, -6.6893, 66.1166, -10.4337, -6.6893, 66.1166, -10.4337, -3.3446002, 56.254498, -8.712299, -6.6893, 59.248997, -9.235, -6.6893, 59.216, -9.229199, -3.3446002, 66.1166, -10.4337, -6.6893, 62.4049, -9.7858, -6.6893, 62.399, -9.7848, -10.033899, 66.1166, -10.4337, -6.6893, 62.399, -9.7848, -10.033899, 66.1166, -10.4337, -10.033899, 62.4049, -9.7858, -6.6893, 59.248997, -9.235, -6.6893, 59.282097, -9.2407, -10.033899, 62.4049, -9.7858, -6.6893, 59.282097, -9.2407, -10.033899, 62.399, -9.7848, -10.033899, 59.248997, -9.235, -6.6893, 56.254498, -8.712299, -6.6893, 56.295, -8.719299, -10.033899, 59.248997, -9.235, -6.6893, 56.295, -8.719299, -10.033899, 59.282097, -9.2407, -10.033899, 56.254498, -8.712299, -6.6893, 52.997097, -8.1437, -10.033899, 56.295, -8.719299, -10.033899, 52.997097, -8.1437, -10.033899, 56.3355, -8.726399, -13.378599, 56.295, -8.719299, -10.033899, 56.3355, -8.726399, -13.378599, 59.282097, -9.2407, -10.033899, 56.295, -8.719299, -10.033899, 52.997097, -8.1437, -10.033899, 52.997097, -8.1437, -13.378599, 56.3355, -8.726399, -13.378599, 59.315197, -9.2465, -13.378599, 62.399, -9.7848, -10.033899, 59.282097, -9.2407, -10.033899, 56.3355, -8.726399, -13.378599, 59.315197, -9.2465, -13.378599, 59.282097, -9.2407, -10.033899, 52.997097, -8.1437, -13.378599, 56.3761, -8.7335, -16.7232, 56.3355, -8.726399, -13.378599, 56.3761, -8.7335, -16.7232, 59.315197, -9.2465, -13.378599, 56.3355, -8.726399, -13.378599, 52.997097, -8.1437, -13.378599, 52.997097, -8.1437, -16.7232, 56.3761, -8.7335, -16.7232, 59.315197, -9.2465, -13.378599, 62.3932, -9.7838, -13.378599, 62.399, -9.7848, -10.033899, 62.3932, -9.7838, -13.378599, 66.1166, -10.4337, -10.033899, 62.399, -9.7848, -10.033899, 62.3932, -9.7838, -13.378599, 66.1166, -10.4337, -13.378599, 66.1166, -10.4337, -10.033899, 59.348297, -9.252299, -16.7232, 62.3932, -9.7838, -13.378599, 59.315197, -9.2465, -13.378599, 56.3761, -8.7335, -16.7232, 59.348297, -9.252299, -16.7232, 59.315197, -9.2465, -13.378599, 62.3873, -9.7827, -16.7232, 66.1166, -10.4337, -13.378599, 62.3932, -9.7838, -13.378599, 59.348297, -9.252299, -16.7232, 62.3873, -9.7827, -16.7232, 62.3932, -9.7838, -13.378599, 62.3873, -9.7827, -16.7232, 66.1166, -10.4337, -16.7232, 66.1166, -10.4337, -13.378599, 56.4166, -8.7406, -20.0679, 59.348297, -9.252299, -16.7232, 56.3761, -8.7335, -16.7232, 52.997097, -8.1437, -16.7232, 56.4166, -8.7406, -20.0679, 56.3761, -8.7335, -16.7232, 52.997097, -8.1437, -16.7232, 52.997097, -8.1437, -20.0679, 56.4166, -8.7406, -20.0679, 52.997097, -8.1437, -20.0679, 56.4571, -8.7476, -23.412498, 56.4166, -8.7406, -20.0679, 52.997097, -8.1437, -20.0679, 52.997097, -8.1437, -23.412498, 56.4571, -8.7476, -23.412498, 56.4166, -8.7406, -20.0679, 59.381397, -9.2581, -20.0679, 59.348297, -9.252299, -16.7232, 56.4571, -8.7476, -23.412498, 59.381397, -9.2581, -20.0679, 56.4166, -8.7406, -20.0679, 59.381397, -9.2581, -20.0679, 62.3873, -9.7827, -16.7232, 59.348297, -9.252299, -16.7232, 56.4571, -8.7476, -23.412498, 59.414497, -9.2638, -23.412498, 59.381397, -9.2581, -20.0679, 62.381397, -9.7817, -20.0679, 66.1166, -10.4337, -16.7232, 62.3873, -9.7827, -16.7232, 59.381397, -9.2581, -20.0679, 62.381397, -9.7817, -20.0679, 62.3873, -9.7827, -16.7232, 59.414497, -9.2638, -23.412498, 62.381397, -9.7817, -20.0679, 59.381397, -9.2581, -20.0679, 62.381397, -9.7817, -20.0679, 66.1166, -10.4337, -20.0679, 66.1166, -10.4337, -16.7232, 59.414497, -9.2638, -23.412498, 62.3756, -9.7807, -23.412498, 62.381397, -9.7817, -20.0679, 62.3756, -9.7807, -23.412498, 66.1166, -10.4337, -20.0679, 62.381397, -9.7817, -20.0679, 62.3756, -9.7807, -23.412498, 66.1166, -10.4337, -23.412498, 66.1166, -10.4337, -20.0679, 66.1166, -10.4572, -26.7572, 68.958595, -10.4337, -23.412498, 66.1166, -10.4337, -23.412498, 66.1166, -10.4572, -26.7572, 68.9481, -10.4572, -26.7572, 68.958595, -10.4337, -23.412498, 68.9481, -10.4572, -26.7572, 72.2025, -10.4337, -23.412498, 68.958595, -10.4337, -23.412498, 68.9481, -10.4572, -26.7572, 72.2092, -10.4572, -26.7572, 72.2025, -10.4337, -23.412498, 72.2092, -10.4572, -26.7572, 75.7165, -10.4337, -23.412498, 72.2025, -10.4337, -23.412498, 72.2092, -10.4572, -26.7572, 75.6957, -10.4572, -26.7572, 75.7165, -10.4337, -23.412498, 75.6957, -10.4572, -26.7572, 79.236, -10.4337, -23.412498, 75.7165, -10.4337, -23.412498, 75.6957, -10.4572, -26.7572, 79.236, -10.4572, -26.7572, 79.236, -10.4337, -23.412498, 39.877598, -3.6573, -13.378599, 42.9754, -4.7166, -10.033899, 39.877598, -3.6573, -10.033899, 39.877598, -3.6573, -13.378599, 42.951797, -4.7086, -13.378599, 42.9754, -4.7166, -10.033899, 42.951797, -4.7086, -13.378599, 46.3474, -5.8697, -10.033899, 42.9754, -4.7166, -10.033899, 42.951797, -4.7086, -13.378599, 39.877598, -3.6573, -13.378599, 39.877598, -3.6573, -16.7232, 42.951797, -4.7086, -13.378599, 46.326397, -5.8626, -13.378599, 46.3474, -5.8697, -10.033899, 46.326397, -5.8626, -13.378599, 49.4666, -6.9364, -10.033899, 46.3474, -5.8697, -10.033899, 42.951797, -4.7086, -13.378599, 39.877598, -3.6573, -16.7232, 42.9282, -4.7005, -16.7232, 46.326397, -5.8626, -13.378599, 42.951797, -4.7086, -13.378599, 42.9282, -4.7005, -16.7232, 39.877598, -3.6573, -16.7232, 42.9046, -4.6924, -20.0679, 42.9282, -4.7005, -16.7232, 39.877598, -3.6573, -16.7232, 39.877598, -3.6573, -20.0679, 42.9046, -4.6924, -20.0679, 46.326397, -5.8626, -13.378599, 42.9282, -4.7005, -16.7232, 46.3055, -5.8554, -16.7232, 42.9046, -4.6924, -20.0679, 46.3055, -5.8554, -16.7232, 42.9282, -4.7005, -16.7232, 46.326397, -5.8626, -13.378599, 49.4568, -6.9329996, -13.378599, 49.4666, -6.9364, -10.033899, 49.4568, -6.9329996, -13.378599, 46.326397, -5.8626, -13.378599, 46.3055, -5.8554, -16.7232, 49.4568, -6.9329996, -13.378599, 52.997097, -8.1437, -10.033899, 49.4666, -6.9364, -10.033899, 49.4568, -6.9329996, -13.378599, 52.997097, -8.1437, -13.378599, 52.997097, -8.1437, -10.033899, 39.877598, -3.6573, -20.0679, 42.881, -4.6844, -23.412498, 42.9046, -4.6924, -20.0679, 39.877598, -3.6573, -20.0679, 39.877598, -3.6573, -23.412498, 42.881, -4.6844, -23.412498, 42.881, -4.6844, -23.412498, 46.2845, -5.8482, -20.0679, 42.9046, -4.6924, -20.0679, 42.9046, -4.6924, -20.0679, 46.2845, -5.8482, -20.0679, 46.3055, -5.8554, -16.7232, 42.881, -4.6844, -23.412498, 46.2636, -5.8410997, -23.412498, 46.2845, -5.8482, -20.0679, 52.997097, -8.1437, -13.378599, 49.4568, -6.9329996, -13.378599, 49.447, -6.9297, -16.7232, 49.4568, -6.9329996, -13.378599, 46.3055, -5.8554, -16.7232, 49.447, -6.9297, -16.7232, 46.2845, -5.8482, -20.0679, 49.447, -6.9297, -16.7232, 46.3055, -5.8554, -16.7232, 52.997097, -8.1437, -13.378599, 49.447, -6.9297, -16.7232, 52.997097, -8.1437, -16.7232, 46.2636, -5.8410997, -23.412498, 49.4372, -6.9263997, -20.0679, 46.2845, -5.8482, -20.0679, 46.2845, -5.8482, -20.0679, 49.4372, -6.9263997, -20.0679, 49.447, -6.9297, -16.7232, 49.4372, -6.9263997, -20.0679, 52.997097, -8.1437, -16.7232, 49.447, -6.9297, -16.7232, 46.2636, -5.8410997, -23.412498, 49.427498, -6.923, -23.412498, 49.4372, -6.9263997, -20.0679, 49.4372, -6.9263997, -20.0679, 52.997097, -8.1437, -20.0679, 52.997097, -8.1437, -16.7232, 49.427498, -6.923, -23.412498, 52.997097, -8.1437, -20.0679, 49.4372, -6.9263997, -20.0679, 49.427498, -6.923, -23.412498, 52.997097, -8.1437, -23.412498, 52.997097, -8.1437, -20.0679, 20.0679, -8.1437, 52.156597, 16.7232, -8.658199, 55.0947, 16.7232, -8.1437, 52.156597, 13.378599, -8.658199, 55.0947, 16.7232, -8.1437, 52.156597, 16.7232, -8.658199, 55.0947, 13.378599, -8.658199, 55.0947, 13.378599, -8.1437, 52.156597, 16.7232, -8.1437, 52.156597, 20.0679, -8.1437, 52.156597, 20.0679, -8.658199, 55.0947, 16.7232, -8.658199, 55.0947, 20.0679, -8.658199, 55.0947, 20.0679, -8.1437, 52.156597, 23.412498, -8.1437, 52.156597, 13.378599, -9.1788, 58.067497, 13.378599, -8.658199, 55.0947, 16.7232, -8.658199, 55.0947, 20.0679, -8.658199, 55.0947, 16.7232, -9.1788, 58.067497, 16.7232, -8.658199, 55.0947, 13.378599, -9.1788, 58.067497, 16.7232, -8.658199, 55.0947, 16.7232, -9.1788, 58.067497, 10.033899, -8.658199, 55.0947, 13.378599, -8.1437, 52.156597, 13.378599, -8.658199, 55.0947, 10.033899, -8.658199, 55.0947, 10.033899, -8.1437, 52.156597, 13.378599, -8.1437, 52.156597, 10.033899, -9.1788, 58.067497, 13.378599, -8.658199, 55.0947, 13.378599, -9.1788, 58.067497, 10.033899, -9.1788, 58.067497, 10.033899, -8.658199, 55.0947, 13.378599, -8.658199, 55.0947, 6.6893, -8.658199, 55.0947, 10.033899, -8.1437, 52.156597, 10.033899, -8.658199, 55.0947, 6.6893, -8.658199, 55.0947, 6.6893, -8.1437, 52.156597, 10.033899, -8.1437, 52.156597, 6.6893, -9.1788, 58.067497, 10.033899, -8.658199, 55.0947, 10.033899, -9.1788, 58.067497, 6.6893, -9.1788, 58.067497, 6.6893, -8.658199, 55.0947, 10.033899, -8.658199, 55.0947, 3.3446, -8.658199, 55.0947, 6.6893, -8.1437, 52.156597, 6.6893, -8.658199, 55.0947, 3.3446, -8.658199, 55.0947, 3.3446, -8.1437, 52.156597, 6.6893, -8.1437, 52.156597, 3.3446, -9.1788, 58.067497, 6.6893, -8.658199, 55.0947, 6.6893, -9.1788, 58.067497, 3.3446, -9.1788, 58.067497, 3.3446, -8.658199, 55.0947, 6.6893, -8.658199, 55.0947, 0, -8.658199, 55.0947, 3.3446, -8.1437, 52.156597, 3.3446, -8.658199, 55.0947, 0, -8.658199, 55.0947, 0, -8.1437, 52.156597, 3.3446, -8.1437, 52.156597, 0, -9.1788, 58.067497, 3.3446, -8.658199, 55.0947, 3.3446, -9.1788, 58.067497, 0, -9.1788, 58.067497, 0, -8.658199, 55.0947, 3.3446, -8.658199, 55.0947, -3.3446002, -8.658199, 55.0947, 0, -8.1437, 52.156597, 0, -8.658199, 55.0947, -3.3446002, -8.658199, 55.0947, -3.3446002, -8.1437, 52.156597, 0, -8.1437, 52.156597, -3.3446002, -9.1788, 58.067497, 0, -8.658199, 55.0947, 0, -9.1788, 58.067497, -3.3446002, -9.1788, 58.067497, -3.3446002, -8.658199, 55.0947, 0, -8.658199, 55.0947, -6.6893, -8.658199, 55.0947, -3.3446002, -8.1437, 52.156597, -3.3446002, -8.658199, 55.0947, -6.6893, -8.658199, 55.0947, -6.6893, -8.1437, 52.156597, -3.3446002, -8.1437, 52.156597, -6.6893, -9.1788, 58.067497, -3.3446002, -8.658199, 55.0947, -3.3446002, -9.1788, 58.067497, -6.6893, -9.1788, 58.067497, -6.6893, -8.658199, 55.0947, -3.3446002, -8.658199, 55.0947, -10.033899, -8.658199, 55.0947, -6.6893, -8.1437, 52.156597, -6.6893, -8.658199, 55.0947, -10.033899, -8.658199, 55.0947, -10.033899, -8.1437, 52.156597, -6.6893, -8.1437, 52.156597, -10.033899, -9.1788, 58.067497, -6.6893, -8.658199, 55.0947, -6.6893, -9.1788, 58.067497, -10.033899, -9.1788, 58.067497, -10.033899, -8.658199, 55.0947, -6.6893, -8.658199, 55.0947, -13.378601, -8.658199, 55.0947, -10.033899, -8.1437, 52.156597, -10.033899, -8.658199, 55.0947, -13.378601, -8.658199, 55.0947, -13.378601, -8.1437, 52.156597, -10.033899, -8.1437, 52.156597, -13.378601, -9.1788, 58.067497, -10.033899, -8.658199, 55.0947, -10.033899, -9.1788, 58.067497, -13.378601, -9.1788, 58.067497, -13.378601, -8.658199, 55.0947, -10.033899, -8.658199, 55.0947, -16.7232, -8.658199, 55.0947, -13.378601, -8.1437, 52.156597, -13.378601, -8.658199, 55.0947, -16.7232, -8.658199, 55.0947, -16.7232, -8.1437, 52.156597, -13.378601, -8.1437, 52.156597, -16.7232, -9.1788, 58.067497, -13.378601, -8.658199, 55.0947, -13.378601, -9.1788, 58.067497, -16.7232, -9.1788, 58.067497, -16.7232, -8.658199, 55.0947, -13.378601, -8.658199, 55.0947, -20.0679, -8.658199, 55.0947, -16.7232, -8.1437, 52.156597, -16.7232, -8.658199, 55.0947, -20.0679, -8.658199, 55.0947, -20.0679, -8.1437, 52.156597, -16.7232, -8.1437, 52.156597, -20.0679, -9.1788, 58.067497, -16.7232, -8.658199, 55.0947, -16.7232, -9.1788, 58.067497, -20.0679, -9.1788, 58.067497, -20.0679, -8.658199, 55.0947, -16.7232, -8.658199, 55.0947, -23.412498, -8.658199, 55.0947, -20.0679, -8.1437, 52.156597, -20.0679, -8.658199, 55.0947, -23.412498, -8.658199, 55.0947, -23.412498, -8.1437, 52.156597, -20.0679, -8.1437, 52.156597, -26.7572, -8.658199, 55.0947, -23.412498, -8.1437, 52.156597, -23.412498, -8.658199, 55.0947, -26.7572, -8.658199, 55.0947, -26.7572, -8.1437, 52.156597, -23.412498, -8.1437, 52.156597, -26.7572, -9.1788, 58.067497, -26.7572, -8.658199, 55.0947, -23.412498, -8.658199, 55.0947, -23.412498, -9.1788, 58.067497, -23.412498, -8.658199, 55.0947, -20.0679, -8.658199, 55.0947, -26.7572, -9.1788, 58.067497, -23.412498, -8.658199, 55.0947, -23.412498, -9.1788, 58.067497, -23.412498, -9.1788, 58.067497, -20.0679, -8.658199, 55.0947, -20.0679, -9.1788, 58.067497, -26.7572, -9.8364, 61.822598, -26.7572, -9.1788, 58.067497, -23.412498, -9.1788, 58.067497, -23.412498, -9.8364, 61.822598, -23.412498, -9.1788, 58.067497, -20.0679, -9.1788, 58.067497, -26.7572, -9.8364, 61.822598, -23.412498, -9.1788, 58.067497, -23.412498, -9.8364, 61.822598, -23.412498, -10.4337, 65.2334, -26.7572, -9.8364, 61.822598, -23.412498, -9.8364, 61.822598, -23.412498, -10.4337, 65.2334, -26.7572, -10.4337, 65.2334, -26.7572, -9.8364, 61.822598, -20.0679, -10.4337, 65.2334, -23.412498, -10.4337, 65.2334, -23.412498, -9.8364, 61.822598, -23.412498, -9.8364, 61.822598, -20.0679, -9.1788, 58.067497, -20.0679, -9.8364, 61.822598, -20.0679, -10.4337, 65.2334, -23.412498, -9.8364, 61.822598, -20.0679, -9.8364, 61.822598, -20.0679, -9.8364, 61.822598, -20.0679, -9.1788, 58.067497, -16.7232, -9.1788, 58.067497, -16.7232, -10.4337, 65.2334, -20.0679, -10.4337, 65.2334, -20.0679, -9.8364, 61.822598, -20.0679, -9.8364, 61.822598, -16.7232, -9.1788, 58.067497, -16.7232, -9.8364, 61.822598, -16.7232, -10.4337, 65.2334, -20.0679, -9.8364, 61.822598, -16.7232, -9.8364, 61.822598, -16.7232, -9.8364, 61.822598, -16.7232, -9.1788, 58.067497, -13.378601, -9.1788, 58.067497, -13.378601, -10.4337, 65.2334, -16.7232, -10.4337, 65.2334, -16.7232, -9.8364, 61.822598, -16.7232, -9.8364, 61.822598, -13.378601, -9.1788, 58.067497, -13.378601, -9.8364, 61.822598, -13.378601, -10.4337, 65.2334, -16.7232, -9.8364, 61.822598, -13.378601, -9.8364, 61.822598, -13.378601, -9.8364, 61.822598, -13.378601, -9.1788, 58.067497, -10.033899, -9.1788, 58.067497, -10.033899, -10.4337, 65.2334, -13.378601, -10.4337, 65.2334, -13.378601, -9.8364, 61.822598, -13.378601, -9.8364, 61.822598, -10.033899, -9.1788, 58.067497, -10.033899, -9.8364, 61.822598, -10.033899, -10.4337, 65.2334, -13.378601, -9.8364, 61.822598, -10.033899, -9.8364, 61.822598, -10.033899, -9.8364, 61.822598, -10.033899, -9.1788, 58.067497, -6.6893, -9.1788, 58.067497, -6.6893, -10.4337, 65.2334, -10.033899, -10.4337, 65.2334, -10.033899, -9.8364, 61.822598, -10.033899, -9.8364, 61.822598, -6.6893, -9.1788, 58.067497, -6.6893, -9.8364, 61.822598, -6.6893, -10.4337, 65.2334, -10.033899, -9.8364, 61.822598, -6.6893, -9.8364, 61.822598, -6.6893, -9.8364, 61.822598, -6.6893, -9.1788, 58.067497, -3.3446002, -9.1788, 58.067497, -3.3446002, -10.4337, 65.2334, -6.6893, -10.4337, 65.2334, -6.6893, -9.8364, 61.822598, -6.6893, -9.8364, 61.822598, -3.3446002, -9.1788, 58.067497, -3.3446002, -9.8364, 61.822598, -3.3446002, -10.4337, 65.2334, -6.6893, -9.8364, 61.822598, -3.3446002, -9.8364, 61.822598, -3.3446002, -9.8364, 61.822598, -3.3446002, -9.1788, 58.067497, 0, -9.1788, 58.067497, 0, -10.4337, 65.2334, -3.3446002, -10.4337, 65.2334, -3.3446002, -9.8364, 61.822598, -3.3446002, -9.8364, 61.822598, 0, -9.1788, 58.067497, 0, -9.8364, 61.822598, 0, -10.4337, 65.2334, -3.3446002, -9.8364, 61.822598, 0, -9.8364, 61.822598, 0, -9.8364, 61.822598, 0, -9.1788, 58.067497, 3.3446, -9.1788, 58.067497, 3.3446, -10.4337, 65.2334, 0, -10.4337, 65.2334, 0, -9.8364, 61.822598, 0, -9.8364, 61.822598, 3.3446, -9.1788, 58.067497, 3.3446, -9.8364, 61.822598, 3.3446, -10.4337, 65.2334, 0, -9.8364, 61.822598, 3.3446, -9.8364, 61.822598, 3.3446, -9.8364, 61.822598, 3.3446, -9.1788, 58.067497, 6.6893, -9.1788, 58.067497, 6.6893, -10.4337, 65.2334, 3.3446, -10.4337, 65.2334, 3.3446, -9.8364, 61.822598, 3.3446, -9.8364, 61.822598, 6.6893, -9.1788, 58.067497, 6.6893, -9.8364, 61.822598, 6.6893, -10.4337, 65.2334, 3.3446, -9.8364, 61.822598, 6.6893, -9.8364, 61.822598, 6.6893, -9.8364, 61.822598, 6.6893, -9.1788, 58.067497, 10.033899, -9.1788, 58.067497, 10.033899, -10.4337, 65.2334, 6.6893, -10.4337, 65.2334, 6.6893, -9.8364, 61.822598, 6.6893, -9.8364, 61.822598, 10.033899, -9.1788, 58.067497, 10.033899, -9.8364, 61.822598, 10.033899, -10.4337, 65.2334, 6.6893, -9.8364, 61.822598, 10.033899, -9.8364, 61.822598, 10.033899, -9.8364, 61.822598, 10.033899, -9.1788, 58.067497, 13.378599, -9.1788, 58.067497, 13.378599, -10.4337, 65.2334, 10.033899, -10.4337, 65.2334, 10.033899, -9.8364, 61.822598, 10.033899, -9.8364, 61.822598, 13.378599, -9.1788, 58.067497, 13.378599, -9.8364, 61.822598, 13.378599, -10.4337, 65.2334, 10.033899, -9.8364, 61.822598, 13.378599, -9.8364, 61.822598, 13.378599, -9.8364, 61.822598, 13.378599, -9.1788, 58.067497, 16.7232, -9.1788, 58.067497, 16.7232, -10.4337, 65.2334, 13.378599, -10.4337, 65.2334, 13.378599, -9.8364, 61.822598, 13.378599, -9.8364, 61.822598, 16.7232, -9.1788, 58.067497, 16.7232, -9.8364, 61.822598, 16.7232, -10.4337, 65.2334, 13.378599, -9.8364, 61.822598, 16.7232, -9.8364, 61.822598, 20.0679, -9.1788, 58.067497, 16.7232, -9.8364, 61.822598, 16.7232, -9.1788, 58.067497, 20.0679, -9.8364, 61.822598, 16.7232, -10.4337, 65.2334, 16.7232, -9.8364, 61.822598, 20.0679, -9.1788, 58.067497, 20.0679, -9.8364, 61.822598, 16.7232, -9.8364, 61.822598, 20.0679, -9.8364, 61.822598, 20.0679, -10.4337, 65.2334, 16.7232, -10.4337, 65.2334, 20.0679, -8.658199, 55.0947, 20.0679, -9.1788, 58.067497, 16.7232, -9.1788, 58.067497, 20.0679, -10.4337, 65.2334, 20.0679, -9.8364, 61.822598, 23.412498, -9.8364, 61.822598, 20.0679, -10.4337, 65.2334, 23.412498, -9.8364, 61.822598, 23.412498, -10.4337, 65.2334, 26.7582, -9.8364, 61.822598, 23.412498, -10.4337, 65.2334, 23.412498, -9.8364, 61.822598, 26.7582, -9.8364, 61.822598, 26.7582, -10.4337, 65.2334, 23.412498, -10.4337, 65.2334, 26.7582, -9.1788, 58.067497, 26.7582, -9.8364, 61.822598, 23.412498, -9.8364, 61.822598, 20.0679, -9.8364, 61.822598, 23.412498, -9.1788, 58.067497, 23.412498, -9.8364, 61.822598, 26.7582, -9.1788, 58.067497, 23.412498, -9.8364, 61.822598, 23.412498, -9.1788, 58.067497, 20.0679, -9.8364, 61.822598, 20.0679, -9.1788, 58.067497, 23.412498, -9.1788, 58.067497, 26.7582, -8.658199, 55.0947, 26.7582, -9.1788, 58.067497, 23.412498, -9.1788, 58.067497, 20.0679, -9.1788, 58.067497, 20.0679, -8.658199, 55.0947, 23.412498, -8.658199, 55.0947, 20.0679, -9.1788, 58.067497, 23.412498, -8.658199, 55.0947, 23.412498, -9.1788, 58.067497, 26.7582, -8.658199, 55.0947, 23.412498, -9.1788, 58.067497, 23.412498, -8.658199, 55.0947, 20.0679, -8.658199, 55.0947, 23.412498, -8.1437, 52.156597, 23.412498, -8.658199, 55.0947, 23.412498, -8.1437, 52.156597, 26.7582, -8.658199, 55.0947, 23.412498, -8.658199, 55.0947, 23.412498, -8.1437, 52.156597, 26.7582, -8.1437, 52.156597, 26.7582, -8.658199, 55.0947, 20.0679, -3.8518999, 39.456898, 16.7232, -4.9595, 42.7343, 16.7232, -3.8518999, 39.456898, 13.378599, -4.9595, 42.7343, 16.7232, -3.8518999, 39.456898, 16.7232, -4.9595, 42.7343, 13.378599, -4.9595, 42.7343, 13.378599, -3.8518999, 39.456898, 16.7232, -3.8518999, 39.456898, 20.0679, -3.8518999, 39.456898, 20.0679, -4.9595, 42.7343, 16.7232, -4.9595, 42.7343, 20.0679, -4.9595, 42.7343, 20.0679, -3.8518999, 39.456898, 23.412498, -3.8518999, 39.456898, 13.378599, -6.2019997, 46.4111, 13.378599, -4.9595, 42.7343, 16.7232, -4.9595, 42.7343, 20.0679, -4.9595, 42.7343, 16.7232, -6.2019997, 46.4111, 16.7232, -4.9595, 42.7343, 13.378599, -6.2019997, 46.4111, 16.7232, -4.9595, 42.7343, 16.7232, -6.2019997, 46.4111, 10.033899, -4.9595, 42.7343, 13.378599, -3.8518999, 39.456898, 13.378599, -4.9595, 42.7343, 10.033899, -4.9595, 42.7343, 10.033899, -3.8518999, 39.456898, 13.378599, -3.8518999, 39.456898, 10.033899, -6.2019997, 46.4111, 13.378599, -4.9595, 42.7343, 13.378599, -6.2019997, 46.4111, 10.033899, -6.2019997, 46.4111, 10.033899, -4.9595, 42.7343, 13.378599, -4.9595, 42.7343, 6.6893, -4.9595, 42.7343, 10.033899, -3.8518999, 39.456898, 10.033899, -4.9595, 42.7343, 6.6893, -4.9595, 42.7343, 6.6893, -3.8518999, 39.456898, 10.033899, -3.8518999, 39.456898, 6.6893, -6.2019997, 46.4111, 10.033899, -4.9595, 42.7343, 10.033899, -6.2019997, 46.4111, 6.6893, -6.2019997, 46.4111, 6.6893, -4.9595, 42.7343, 10.033899, -4.9595, 42.7343, 3.3446, -4.9595, 42.7343, 6.6893, -3.8518999, 39.456898, 6.6893, -4.9595, 42.7343, 3.3446, -4.9595, 42.7343, 3.3446, -3.8518999, 39.456898, 6.6893, -3.8518999, 39.456898, 3.3446, -6.2019997, 46.4111, 6.6893, -4.9595, 42.7343, 6.6893, -6.2019997, 46.4111, 3.3446, -6.2019997, 46.4111, 3.3446, -4.9595, 42.7343, 6.6893, -4.9595, 42.7343, 0, -4.9595, 42.7343, 3.3446, -3.8518999, 39.456898, 3.3446, -4.9595, 42.7343, 0, -4.9595, 42.7343, 0, -3.8518999, 39.456898, 3.3446, -3.8518999, 39.456898, 0, -6.2019997, 46.4111, 3.3446, -4.9595, 42.7343, 3.3446, -6.2019997, 46.4111, 0, -6.2019997, 46.4111, 0, -4.9595, 42.7343, 3.3446, -4.9595, 42.7343, -3.3446002, -4.9595, 42.7343, 0, -3.8518999, 39.456898, 0, -4.9595, 42.7343, -3.3446002, -4.9595, 42.7343, -3.3446002, -3.8518999, 39.456898, 0, -3.8518999, 39.456898, -3.3446002, -6.2019997, 46.4111, 0, -4.9595, 42.7343, 0, -6.2019997, 46.4111, -3.3446002, -6.2019997, 46.4111, -3.3446002, -4.9595, 42.7343, 0, -4.9595, 42.7343, -6.6893, -4.9595, 42.7343, -3.3446002, -3.8518999, 39.456898, -3.3446002, -4.9595, 42.7343, -6.6893, -4.9595, 42.7343, -6.6893, -3.8518999, 39.456898, -3.3446002, -3.8518999, 39.456898, -6.6893, -6.2019997, 46.4111, -3.3446002, -4.9595, 42.7343, -3.3446002, -6.2019997, 46.4111, -6.6893, -6.2019997, 46.4111, -6.6893, -4.9595, 42.7343, -3.3446002, -4.9595, 42.7343, -10.033899, -4.9595, 42.7343, -6.6893, -3.8518999, 39.456898, -6.6893, -4.9595, 42.7343, -10.033899, -4.9595, 42.7343, -10.033899, -3.8518999, 39.456898, -6.6893, -3.8518999, 39.456898, -10.033899, -6.2019997, 46.4111, -6.6893, -4.9595, 42.7343, -6.6893, -6.2019997, 46.4111, -10.033899, -6.2019997, 46.4111, -10.033899, -4.9595, 42.7343, -6.6893, -4.9595, 42.7343, -13.378601, -4.9595, 42.7343, -10.033899, -3.8518999, 39.456898, -10.033899, -4.9595, 42.7343, -13.378601, -4.9595, 42.7343, -13.378601, -3.8518999, 39.456898, -10.033899, -3.8518999, 39.456898, -13.378601, -6.2019997, 46.4111, -10.033899, -4.9595, 42.7343, -10.033899, -6.2019997, 46.4111, -13.378601, -6.2019997, 46.4111, -13.378601, -4.9595, 42.7343, -10.033899, -4.9595, 42.7343, -16.7232, -4.9595, 42.7343, -13.378601, -3.8518999, 39.456898, -13.378601, -4.9595, 42.7343, -16.7232, -4.9595, 42.7343, -16.7232, -3.8518999, 39.456898, -13.378601, -3.8518999, 39.456898, -16.7232, -6.2019997, 46.4111, -13.378601, -4.9595, 42.7343, -13.378601, -6.2019997, 46.4111, -16.7232, -6.2019997, 46.4111, -16.7232, -4.9595, 42.7343, -13.378601, -4.9595, 42.7343, -20.0679, -4.9595, 42.7343, -16.7232, -3.8518999, 39.456898, -16.7232, -4.9595, 42.7343, -20.0679, -4.9595, 42.7343, -20.0679, -3.8518999, 39.456898, -16.7232, -3.8518999, 39.456898, -20.0679, -6.2019997, 46.4111, -16.7232, -4.9595, 42.7343, -16.7232, -6.2019997, 46.4111, -20.0679, -6.2019997, 46.4111, -20.0679, -4.9595, 42.7343, -16.7232, -4.9595, 42.7343, -23.412498, -4.9595, 42.7343, -20.0679, -3.8518999, 39.456898, -20.0679, -4.9595, 42.7343, -23.412498, -4.9595, 42.7343, -23.412498, -3.8518999, 39.456898, -20.0679, -3.8518999, 39.456898, -26.7572, -4.9595, 42.7343, -23.412498, -3.8518999, 39.456898, -23.412498, -4.9595, 42.7343, -26.7572, -4.9595, 42.7343, -26.7572, -3.8518999, 39.456898, -23.412498, -3.8518999, 39.456898, -26.7572, -6.2019997, 46.4111, -26.7572, -4.9595, 42.7343, -23.412498, -4.9595, 42.7343, -23.412498, -6.2019997, 46.4111, -23.412498, -4.9595, 42.7343, -20.0679, -4.9595, 42.7343, -26.7572, -6.2019997, 46.4111, -23.412498, -4.9595, 42.7343, -23.412498, -6.2019997, 46.4111, -23.412498, -6.2019997, 46.4111, -20.0679, -4.9595, 42.7343, -20.0679, -6.2019997, 46.4111, -26.7572, -7.286, 49.6186, -26.7572, -6.2019997, 46.4111, -23.412498, -6.2019997, 46.4111, -23.412498, -7.286, 49.6186, -23.412498, -6.2019997, 46.4111, -20.0679, -6.2019997, 46.4111, -26.7572, -7.286, 49.6186, -23.412498, -6.2019997, 46.4111, -23.412498, -7.286, 49.6186, -23.412498, -8.1437, 52.156597, -26.7572, -7.286, 49.6186, -23.412498, -7.286, 49.6186, -23.412498, -8.1437, 52.156597, -26.7572, -8.1437, 52.156597, -26.7572, -7.286, 49.6186, -20.0679, -8.1437, 52.156597, -23.412498, -8.1437, 52.156597, -23.412498, -7.286, 49.6186, -23.412498, -7.286, 49.6186, -20.0679, -6.2019997, 46.4111, -20.0679, -7.286, 49.6186, -20.0679, -8.1437, 52.156597, -23.412498, -7.286, 49.6186, -20.0679, -7.286, 49.6186, -20.0679, -7.286, 49.6186, -20.0679, -6.2019997, 46.4111, -16.7232, -6.2019997, 46.4111, -16.7232, -8.1437, 52.156597, -20.0679, -8.1437, 52.156597, -20.0679, -7.286, 49.6186, -20.0679, -7.286, 49.6186, -16.7232, -6.2019997, 46.4111, -16.7232, -7.286, 49.6186, -16.7232, -8.1437, 52.156597, -20.0679, -7.286, 49.6186, -16.7232, -7.286, 49.6186, -16.7232, -7.286, 49.6186, -16.7232, -6.2019997, 46.4111, -13.378601, -6.2019997, 46.4111, -13.378601, -8.1437, 52.156597, -16.7232, -8.1437, 52.156597, -16.7232, -7.286, 49.6186, -16.7232, -7.286, 49.6186, -13.378601, -6.2019997, 46.4111, -13.378601, -7.286, 49.6186, -13.378601, -8.1437, 52.156597, -16.7232, -7.286, 49.6186, -13.378601, -7.286, 49.6186, -13.378601, -7.286, 49.6186, -13.378601, -6.2019997, 46.4111, -10.033899, -6.2019997, 46.4111, -10.033899, -8.1437, 52.156597, -13.378601, -8.1437, 52.156597, -13.378601, -7.286, 49.6186, -13.378601, -7.286, 49.6186, -10.033899, -6.2019997, 46.4111, -10.033899, -7.286, 49.6186, -10.033899, -8.1437, 52.156597, -13.378601, -7.286, 49.6186, -10.033899, -7.286, 49.6186, -10.033899, -7.286, 49.6186, -10.033899, -6.2019997, 46.4111, -6.6893, -6.2019997, 46.4111, -6.6893, -8.1437, 52.156597, -10.033899, -8.1437, 52.156597, -10.033899, -7.286, 49.6186, -10.033899, -7.286, 49.6186, -6.6893, -6.2019997, 46.4111, -6.6893, -7.286, 49.6186, -6.6893, -8.1437, 52.156597, -10.033899, -7.286, 49.6186, -6.6893, -7.286, 49.6186, -6.6893, -7.286, 49.6186, -6.6893, -6.2019997, 46.4111, -3.3446002, -6.2019997, 46.4111, -3.3446002, -8.1437, 52.156597, -6.6893, -8.1437, 52.156597, -6.6893, -7.286, 49.6186, -6.6893, -7.286, 49.6186, -3.3446002, -6.2019997, 46.4111, -3.3446002, -7.286, 49.6186, -3.3446002, -8.1437, 52.156597, -6.6893, -7.286, 49.6186, -3.3446002, -7.286, 49.6186, -3.3446002, -7.286, 49.6186, -3.3446002, -6.2019997, 46.4111, 0, -6.2019997, 46.4111, 0, -8.1437, 52.156597, -3.3446002, -8.1437, 52.156597, -3.3446002, -7.286, 49.6186, -3.3446002, -7.286, 49.6186, 0, -6.2019997, 46.4111, 0, -7.286, 49.6186, 0, -8.1437, 52.156597, -3.3446002, -7.286, 49.6186, 0, -7.286, 49.6186, 0, -7.286, 49.6186, 0, -6.2019997, 46.4111, 3.3446, -6.2019997, 46.4111, 3.3446, -8.1437, 52.156597, 0, -8.1437, 52.156597, 0, -7.286, 49.6186, 0, -7.286, 49.6186, 3.3446, -6.2019997, 46.4111, 3.3446, -7.286, 49.6186, 3.3446, -8.1437, 52.156597, 0, -7.286, 49.6186, 3.3446, -7.286, 49.6186, 3.3446, -7.286, 49.6186, 3.3446, -6.2019997, 46.4111, 6.6893, -6.2019997, 46.4111, 6.6893, -8.1437, 52.156597, 3.3446, -8.1437, 52.156597, 3.3446, -7.286, 49.6186, 3.3446, -7.286, 49.6186, 6.6893, -6.2019997, 46.4111, 6.6893, -7.286, 49.6186, 6.6893, -8.1437, 52.156597, 3.3446, -7.286, 49.6186, 6.6893, -7.286, 49.6186, 6.6893, -7.286, 49.6186, 6.6893, -6.2019997, 46.4111, 10.033899, -6.2019997, 46.4111, 10.033899, -8.1437, 52.156597, 6.6893, -8.1437, 52.156597, 6.6893, -7.286, 49.6186, 6.6893, -7.286, 49.6186, 10.033899, -6.2019997, 46.4111, 10.033899, -7.286, 49.6186, 10.033899, -8.1437, 52.156597, 6.6893, -7.286, 49.6186, 10.033899, -7.286, 49.6186, 10.033899, -7.286, 49.6186, 10.033899, -6.2019997, 46.4111, 13.378599, -6.2019997, 46.4111, 13.378599, -8.1437, 52.156597, 10.033899, -8.1437, 52.156597, 10.033899, -7.286, 49.6186, 10.033899, -7.286, 49.6186, 13.378599, -6.2019997, 46.4111, 13.378599, -7.286, 49.6186, 13.378599, -8.1437, 52.156597, 10.033899, -7.286, 49.6186, 13.378599, -7.286, 49.6186, 13.378599, -7.286, 49.6186, 13.378599, -6.2019997, 46.4111, 16.7232, -6.2019997, 46.4111, 16.7232, -8.1437, 52.156597, 13.378599, -8.1437, 52.156597, 13.378599, -7.286, 49.6186, 13.378599, -7.286, 49.6186, 16.7232, -6.2019997, 46.4111, 16.7232, -7.286, 49.6186, 16.7232, -8.1437, 52.156597, 13.378599, -7.286, 49.6186, 16.7232, -7.286, 49.6186, 20.0679, -6.2019997, 46.4111, 16.7232, -7.286, 49.6186, 16.7232, -6.2019997, 46.4111, 20.0679, -7.286, 49.6186, 16.7232, -8.1437, 52.156597, 16.7232, -7.286, 49.6186, 20.0679, -6.2019997, 46.4111, 20.0679, -7.286, 49.6186, 16.7232, -7.286, 49.6186, 20.0679, -7.286, 49.6186, 20.0679, -8.1437, 52.156597, 16.7232, -8.1437, 52.156597, 20.0679, -4.9595, 42.7343, 20.0679, -6.2019997, 46.4111, 16.7232, -6.2019997, 46.4111, 20.0679, -8.1437, 52.156597, 20.0679, -7.286, 49.6186, 23.412498, -7.286, 49.6186, 20.0679, -8.1437, 52.156597, 23.412498, -7.286, 49.6186, 23.412498, -8.1437, 52.156597, 26.7582, -7.286, 49.6186, 23.412498, -8.1437, 52.156597, 23.412498, -7.286, 49.6186, 26.7582, -7.286, 49.6186, 26.7582, -8.1437, 52.156597, 23.412498, -8.1437, 52.156597, 26.7582, -6.2019997, 46.4111, 26.7582, -7.286, 49.6186, 23.412498, -7.286, 49.6186, 20.0679, -7.286, 49.6186, 23.412498, -6.2019997, 46.4111, 23.412498, -7.286, 49.6186, 26.7582, -6.2019997, 46.4111, 23.412498, -7.286, 49.6186, 23.412498, -6.2019997, 46.4111, 20.0679, -7.286, 49.6186, 20.0679, -6.2019997, 46.4111, 23.412498, -6.2019997, 46.4111, 26.7582, -4.9595, 42.7343, 26.7582, -6.2019997, 46.4111, 23.412498, -6.2019997, 46.4111, 20.0679, -6.2019997, 46.4111, 20.0679, -4.9595, 42.7343, 23.412498, -4.9595, 42.7343, 20.0679, -6.2019997, 46.4111, 23.412498, -4.9595, 42.7343, 23.412498, -6.2019997, 46.4111, 26.7582, -4.9595, 42.7343, 23.412498, -6.2019997, 46.4111, 23.412498, -4.9595, 42.7343, 20.0679, -4.9595, 42.7343, 23.412498, -3.8518999, 39.456898, 23.412498, -4.9595, 42.7343, 23.412498, -3.8518999, 39.456898, 26.7582, -4.9595, 42.7343, 23.412498, -4.9595, 42.7343, 23.412498, -3.8518999, 39.456898, 26.7582, -3.8518999, 39.456898, 26.7582, -4.9595, 42.7343, -26.7572, -1.2701, 26.7572, -26.7572, -2.0054, 30.3737, -28.645699, -2.01, 28.5121, -28.645699, -2.01, 28.5121, -30.426, -2.0144, 26.7572, -26.7572, -1.2701, 26.7572, -28.447899, -2.6727, 31.969099, -28.645699, -2.01, 28.5121, -26.7572, -2.0054, 30.3737, -26.7572, -2.0054, 30.3737, -26.7572, -2.6892, 33.737698, -28.447899, -2.6727, 31.969099, -30.291101, -2.6547, 30.040998, -30.426, -2.0144, 26.7572, -28.645699, -2.01, 28.5121, -28.447899, -2.6727, 31.969099, -30.291101, -2.6547, 30.040998, -28.645699, -2.01, 28.5121, -30.291101, -2.6547, 30.040998, -32.027798, -2.6376998, 28.2244, -30.426, -2.0144, 26.7572, -32.027798, -2.6376998, 28.2244, -33.4304, -2.6239998, 26.7572, -30.426, -2.0144, 26.7572, -29.8963, -3.2444, 33.336, -30.291101, -2.6547, 30.040998, -28.447899, -2.6727, 31.969099, -26.7572, -2.6892, 33.737698, -29.8963, -3.2444, 33.336, -28.447899, -2.6727, 31.969099, -31.7465, -3.2247999, 31.3933, -32.027798, -2.6376998, 28.2244, -30.291101, -2.6547, 30.040998, -29.8963, -3.2444, 33.336, -31.7465, -3.2247999, 31.3933, -30.291101, -2.6547, 30.040998, -26.7572, -2.6892, 33.737698, -28.188799, -3.2624998, 35.128998, -29.8963, -3.2444, 33.336, -28.188799, -3.2624998, 35.128998, -26.7572, -2.6892, 33.737698, -26.7572, -3.2777, 36.6322, -29.5455, -3.8058, 36.4474, -29.8963, -3.2444, 33.336, -28.188799, -3.2624998, 35.128998, -26.7572, -3.2777, 36.6322, -29.5455, -3.8058, 36.4474, -28.188799, -3.2624998, 35.128998, -26.7572, -3.2777, 36.6322, -28.1288, -3.8291998, 37.976498, -29.5455, -3.8058, 36.4474, -28.1288, -3.8291998, 37.976498, -26.7572, -3.2777, 36.6322, -26.7572, -3.8518999, 39.456898, -29.5455, -3.8058, 36.4474, -31.247301, -3.7775998, 34.6107, -29.8963, -3.2444, 33.336, -31.247301, -3.7775998, 34.6107, -31.7465, -3.2247999, 31.3933, -29.8963, -3.2444, 33.336, -31.247301, -3.7775998, 34.6107, -33.0801, -3.7473, 32.6325, -31.7465, -3.2247999, 31.3933, -33.0801, -3.7473, 32.6325, -33.4894, -3.2064, 29.5632, -31.7465, -3.2247999, 31.3933, -31.7465, -3.2247999, 31.3933, -33.4894, -3.2064, 29.5632, -32.027798, -2.6376998, 28.2244, -33.4894, -3.2064, 29.5632, -33.4304, -2.6239998, 26.7572, -32.027798, -2.6376998, 28.2244, -33.0801, -3.7473, 32.6325, -34.806297, -3.7187998, 30.769499, -33.4894, -3.2064, 29.5632, -33.4894, -3.2064, 29.5632, -34.9099, -3.1913, 28.0716, -33.4304, -2.6239998, 26.7572, -34.806297, -3.7187998, 30.769499, -34.9099, -3.1913, 28.0716, -33.4894, -3.2064, 29.5632, -34.9099, -3.1913, 28.0716, -36.161697, -3.1780999, 26.7572, -33.4304, -2.6239998, 26.7572, -34.806297, -3.7187998, 30.769499, -36.2241, -3.6952999, 29.2393, -34.9099, -3.1913, 28.0716, -36.2241, -3.6952999, 29.2393, -36.161697, -3.1780999, 26.7572, -34.9099, -3.1913, 28.0716, -36.2241, -3.6952999, 29.2393, -37.4711, -3.6747, 27.8934, -36.161697, -3.1780999, 26.7572, -37.4711, -3.6747, 27.8934, -38.5239, -3.6573, 26.7572, -36.161697, -3.1780999, 26.7572, -50.290497, -8.1437, 26.7572, -47.4473, -7.0596, 26.7572, -49.074398, -8.1437, 28.0697, -62.057194, -10.4337, 26.7572, -58.463497, -9.7343, 26.7572, -60.611, -10.4337, 28.3335, 26.7582, -9.8364, 61.822598, 66.1166, -10.4337, 26.7572, 26.7582, -10.4337, 65.2334, 26.7582, -9.8364, 61.822598, 62.4636, -9.7961, 26.7572, 66.1166, -10.4337, 26.7572, 26.7582, -9.1788, 58.067497, 62.4636, -9.7961, 26.7572, 26.7582, -9.8364, 61.822598, 26.7582, -9.1788, 58.067497, 58.918198, -9.177199, 26.7572, 62.4636, -9.7961, 26.7572, 26.7582, -9.1788, 58.067497, 55.849197, -8.6414995, 26.7572, 58.918198, -9.177199, 26.7572, 55.849197, -8.6414995, 26.7572, 26.7582, -9.1788, 58.067497, 52.997097, -8.1437, 26.7572, 52.997097, -8.1437, 26.7572, 26.7582, -9.1788, 58.067497, 26.7582, -8.1437, 52.156597, 26.7582, -8.1437, 52.156597, 26.7582, -9.1788, 58.067497, 26.7582, -8.658199, 55.0947, 43.234898, -4.8054, 26.7572, 26.7582, -3.8518999, 39.456898, 39.877598, -3.6573, 26.7572, 46.577698, -5.9484997, 26.7572, 26.7582, -3.8518999, 39.456898, 43.234898, -4.8054, 26.7572, 46.577698, -5.9484997, 26.7572, 26.7582, -6.2019997, 46.4111, 26.7582, -3.8518999, 39.456898, 26.7582, -3.8518999, 39.456898, 26.7582, -6.2019997, 46.4111, 26.7582, -4.9595, 42.7343, 26.7582, -6.2019997, 46.4111, 46.577698, -5.9484997, 26.7572, 26.7582, -8.1437, 52.156597, 26.7582, -6.2019997, 46.4111, 26.7582, -8.1437, 52.156597, 26.7582, -7.286, 49.6186, 26.7582, -8.1437, 52.156597, 46.577698, -5.9484997, 26.7572, 49.5743, -6.9732, 26.7572, 26.7582, -8.1437, 52.156597, 49.5743, -6.9732, 26.7572, 52.997097, -8.1437, 26.7572, 29.1145, -2.5956, 26.7572, 26.7582, -3.0839999, 30.2834, 26.7582, -2.7837, 26.6955, 29.1145, -2.5956, 26.7572, 26.7582, -3.3683999, 33.680798, 26.7582, -3.0839999, 30.2834, 33.146698, -3.214, 26.7572, 26.7582, -3.3683999, 33.680798, 29.1145, -2.5956, 26.7572, 33.146698, -3.214, 26.7572, 26.7582, -3.6130998, 36.6041, 26.7582, -3.3683999, 33.680798, 26.7582, -3.6130998, 36.6041, 33.146698, -3.214, 26.7572, 39.877598, -3.6573, 26.7572, 39.877598, -3.6573, 26.7572, 33.146698, -3.214, 26.7572, 36.078598, -3.0746999, 26.7572, 26.7582, -3.6130998, 36.6041, 39.877598, -3.6573, 26.7572, 26.7582, -3.8518999, 39.456898, 26.7573, -1.7447, -30.111198, 29.3928, -1.796, -26.7572, 26.7573, -1.3222, -26.7572, 26.7572, -2.5274, -33.9013, 29.3928, -1.796, -26.7572, 26.7573, -1.7447, -30.111198, 29.3928, -1.796, -26.7572, 26.7572, -2.5274, -33.9013, 26.7572, -3.9166, -40.6287, 26.7572, -3.9166, -40.6287, 26.7572, -2.5274, -33.9013, 26.7572, -3.2101, -37.2077, 29.3928, -1.796, -26.7572, 26.7572, -3.9166, -40.6287, 36.0678, -2.9959998, -26.7572, 36.0678, -2.9959998, -26.7572, 26.7572, -3.9166, -40.6287, 39.877598, -3.6808999, -26.7572, 29.3928, -1.796, -26.7572, 36.0678, -2.9959998, -26.7572, 32.9589, -2.4371, -26.7572, 49.4036, -6.9384, -26.7572, 26.7572, -8.403, -54.500298, 52.997097, -8.1672, -26.7572, 46.2278, -5.8524, -26.7572, 26.7572, -8.403, -54.500298, 49.4036, -6.9384, -26.7572, 26.7572, -8.403, -54.500298, 46.2278, -5.8524, -26.7572, 26.7572, -3.9166, -40.6287, 26.7572, -3.9166, -40.6287, 46.2278, -5.8524, -26.7572, 42.8416, -4.6944, -26.7572, 26.7572, -3.9166, -40.6287, 42.8416, -4.6944, -26.7572, 39.877598, -3.6808999, -26.7572, 26.7572, -8.403, -54.500298, 26.7572, -3.9166, -40.6287, 26.7572, -6.2504, -47.8447, 26.7572, -6.2504, -47.8447, 26.7572, -3.9166, -40.6287, 26.7572, -5.1514, -44.446598, 26.7572, -8.403, -54.500298, 26.7572, -6.2504, -47.8447, 26.7572, -7.3550997, -51.2602, 62.356697, -9.8008995, -26.7572, 26.7572, -10.693, -68.371895, 66.1166, -10.4572, -26.7572, 59.4335, -9.2907, -26.7572, 26.7572, -10.693, -68.371895, 62.356697, -9.8008995, -26.7572, 26.7572, -10.693, -68.371895, 59.4335, -9.2907, -26.7572, 26.7572, -9.312699, -60.011097, 26.7572, -10.693, -68.371895, 26.7572, -9.312699, -60.011097, 26.7572, -9.876599, -63.426796, 26.7572, -9.312699, -60.011097, 59.4335, -9.2907, -26.7572, 56.4827, -8.7755995, -26.7572, 26.7572, -9.312699, -60.011097, 56.4827, -8.7755995, -26.7572, 26.7572, -8.881, -57.3956, 26.7572, -8.881, -57.3956, 56.4827, -8.7755995, -26.7572, 52.997097, -8.1672, -26.7572, 26.7572, -8.881, -57.3956, 52.997097, -8.1672, -26.7572, 26.7572, -8.403, -54.500298, 26.7572, -10.693, -70.330795, 66.1166, -10.4572, -26.7572, 26.7572, -10.693, -68.371895, 26.7572, -10.693, -70.330795, 68.9481, -10.4572, -26.7572, 66.1166, -10.4572, -26.7572, 26.7572, -10.693, -73.1232, 68.9481, -10.4572, -26.7572, 26.7572, -10.693, -70.330795, 26.7572, -10.693, -73.1232, 72.2092, -10.4572, -26.7572, 68.9481, -10.4572, -26.7572, 26.7572, -10.693, -73.1232, 75.6957, -10.4572, -26.7572, 72.2092, -10.4572, -26.7572, 75.6957, -10.4572, -26.7572, 26.7572, -10.693, -73.1232, 26.7572, -10.693, -82.2434, 75.6957, -10.4572, -26.7572, 26.7572, -10.693, -82.2434, 79.236, -10.4572, -26.7572, 26.7572, -10.693, -82.2434, 26.7572, -10.693, -73.1232, 26.7572, -10.693, -79.5579, 26.7572, -10.693, -79.5579, 26.7572, -10.693, -73.1232, 26.7572, -10.693, -76.193, -30.173899, -3.2568, -26.7572, -26.7572, -3.2445998, -30.4851, -26.7572, -3.0929, -26.7572, -30.173899, -3.2568, -26.7572, -26.7572, -3.3862, -33.9664, -26.7572, -3.2445998, -30.4851, -30.173899, -3.2568, -26.7572, -26.7572, -3.5244, -37.3623, -26.7572, -3.3862, -33.9664, -26.7572, -3.5244, -37.3623, -30.173899, -3.2568, -26.7572, -36.0882, -3.5405, -26.7572, -36.0882, -3.5405, -26.7572, -30.173899, -3.2568, -26.7572, -33.2719, -3.4053998, -26.7572, -26.7572, -3.5244, -37.3623, -36.0882, -3.5405, -26.7572, -26.7572, -3.6573, -40.6287, -26.7572, -3.6573, -40.6287, -36.0882, -3.5405, -26.7572, -38.5239, -3.6573, -26.7572, -41.627, -4.8403997, -26.7572, -26.7572, -3.6573, -40.6287, -38.5239, -3.6573, -26.7572, -41.627, -4.8403997, -26.7572, -26.7572, -5.9270997, -47.646698, -26.7572, -3.6573, -40.6287, -26.7572, -3.6573, -40.6287, -26.7572, -5.9270997, -47.646698, -26.7572, -4.8125997, -44.200798, -44.537098, -5.95, -26.7572, -26.7572, -5.9270997, -47.646698, -41.627, -4.8403997, -26.7572, -26.7572, -5.9270997, -47.646698, -44.537098, -5.95, -26.7572, -50.290497, -8.1437, -26.7572, -50.290497, -8.1437, -26.7572, -44.537098, -5.95, -26.7572, -47.4473, -7.0596, -26.7572, -26.7572, -5.9270997, -47.646698, -50.290497, -8.1437, -26.7572, -26.7572, -7.1011, -51.2768, -26.7572, -7.1011, -51.2768, -50.290497, -8.1437, -26.7572, -26.7572, -8.1437, -54.500298, -53.117798, -8.6939, -26.7572, -26.7572, -8.1437, -54.500298, -50.290497, -8.1437, -26.7572, -55.5951, -9.176, -26.7572, -26.7572, -8.1437, -54.500298, -53.117798, -8.6939, -26.7572, -58.463497, -9.7343, -26.7572, -26.7572, -8.1437, -54.500298, -55.5951, -9.176, -26.7572, -26.7572, -8.1437, -54.500298, -58.463497, -9.7343, -26.7572, -26.7572, -9.7125, -64.0031, -26.7572, -9.7125, -64.0031, -58.463497, -9.7343, -26.7572, -62.057194, -10.4337, -26.7572, -26.7572, -9.7125, -64.0031, -62.057194, -10.4337, -26.7572, -26.7572, -10.4337, -68.371895, -26.7572, -8.1437, -54.500298, -26.7572, -9.7125, -64.0031, -26.7572, -9.111199, -60.361, -26.7572, -8.1437, -54.500298, -26.7572, -9.111199, -60.361, -26.7572, -8.6276, -57.4314, -64.963196, -10.4337, -26.7572, -26.7572, -10.4337, -68.371895, -62.057194, -10.4337, -26.7572, -64.963196, -10.4337, -26.7572, -26.7572, -10.4337, -70.9319, -26.7572, -10.4337, -68.371895, -64.963196, -10.4337, -26.7572, -62.057194, -10.4337, -26.7572, -62.057194, -10.4337, -23.412498, -68.2489, -10.4337, -26.7572, -26.7572, -10.4337, -70.9319, -64.963196, -10.4337, -26.7572, -68.2489, -10.4337, -26.7572, -26.7572, -10.4337, -73.7615, -26.7572, -10.4337, -70.9319, -64.963196, -10.4337, -26.7572, -62.057194, -10.4337, -23.412498, -64.963196, -10.4337, -23.412498, -68.2489, -10.4337, -26.7572, -64.963196, -10.4337, -26.7572, -64.963196, -10.4337, -23.412498, -64.963196, -10.4337, -23.412498, -62.057194, -10.4337, -23.412498, -62.057194, -10.4337, -20.174799, -71.2999, -10.4337, -26.7572, -26.7572, -10.4337, -73.7615, -68.2489, -10.4337, -26.7572, -71.2999, -10.4337, -26.7572, -26.7572, -10.4337, -76.6203, -26.7572, -10.4337, -73.7615, -26.7572, -10.4337, -76.6203, -71.2999, -10.4337, -26.7572, -26.7572, -10.4337, -79.0804, -26.7572, -10.4337, -79.0804, -71.2999, -10.4337, -26.7572, -26.7572, -10.4337, -82.2434, -26.7572, -10.4337, -82.2434, -71.2999, -10.4337, -26.7572, -73.8239, -10.4337, -26.7572, -73.8239, -10.4337, -23.412498, -73.8239, -10.4337, -26.7572, -71.2999, -10.4337, -26.7572, -68.2489, -10.4337, -26.7572, -64.963196, -10.4337, -23.412498, -68.2489, -10.4337, -23.412498, -71.2999, -10.4337, -26.7572, -68.2489, -10.4337, -26.7572, -68.2489, -10.4337, -23.412498, -73.8239, -10.4337, -23.412498, -71.2999, -10.4337, -26.7572, -71.2999, -10.4337, -23.412498, -71.2999, -10.4337, -26.7572, -68.2489, -10.4337, -23.412498, -71.2999, -10.4337, -23.412498, -73.8239, -10.4337, -20.0679, -73.8239, -10.4337, -23.412498, -71.2999, -10.4337, -23.412498, -73.8239, -10.4337, -20.0679, -71.2999, -10.4337, -23.412498, -71.2999, -10.4337, -20.0908, -71.2999, -10.4337, -23.412498, -68.2489, -10.4337, -20.118599, -71.2999, -10.4337, -20.0908, -71.2999, -10.4337, -23.412498, -68.2489, -10.4337, -23.412498, -68.2489, -10.4337, -20.118599, -71.2999, -10.4337, -20.0908, -68.2489, -10.4337, -20.118599, -68.2489, -10.4337, -16.7739, -68.2489, -10.4337, -20.118599, -64.963196, -10.4337, -16.803799, -68.2489, -10.4337, -16.7739, -68.2489, -10.4337, -23.412498, -64.963196, -10.4337, -20.1484, -68.2489, -10.4337, -20.118599, -68.2489, -10.4337, -20.118599, -64.963196, -10.4337, -20.1484, -64.963196, -10.4337, -16.803799, -68.2489, -10.4337, -23.412498, -64.963196, -10.4337, -23.412498, -64.963196, -10.4337, -20.1484, -62.057194, -10.4337, -20.174799, -64.963196, -10.4337, -16.803799, -64.963196, -10.4337, -20.1484, -64.963196, -10.4337, -23.412498, -62.057194, -10.4337, -20.174799, -64.963196, -10.4337, -20.1484, -3.3446002, -1.458, -26.7572, -6.6709, -1.7958, -30.683697, -3.3313003, -1.7853999, -30.628498, -3.3446002, -1.458, -26.7572, -6.6893, -1.458, -26.7572, -6.6709, -1.7958, -30.683697, -6.6893, -3.6573, -40.6287, -6.6689, -4.8491, -44.313698, -6.6243997, -3.6573, -40.6287, -6.6689, -4.8491, -44.313698, -3.3446002, -3.6573, -40.6287, -6.6243997, -3.6573, -40.6287, -6.6893, -3.6573, -40.6287, -9.908199, -3.6573, -40.6287, -6.6689, -4.8491, -44.313698, -6.6689, -4.8491, -44.313698, -3.297, -3.6573, -40.6287, -3.3446002, -3.6573, -40.6287, -6.6689, -4.8491, -44.313698, -9.908199, -3.6573, -40.6287, -9.969999, -4.8431, -44.295097, -10.033899, -3.6573, -40.6287, -9.969999, -4.8431, -44.295097, -9.908199, -3.6573, -40.6287, -9.969999, -4.8431, -44.295097, -10.033899, -3.6573, -40.6287, -13.0655, -3.6573, -40.6287, -9.969999, -4.8431, -44.295097, -13.0655, -3.6573, -40.6287, -13.160999, -4.8373, -44.2772, -13.378601, -3.6573, -40.6287, -13.160999, -4.8373, -44.2772, -13.0655, -3.6573, -40.6287, -13.160999, -4.8373, -44.2772, -13.378601, -3.6573, -40.6287, -16.3079, -3.6573, -40.6287, -13.160999, -4.8373, -44.2772, -16.3079, -3.6573, -40.6287, -16.4166, -4.8314, -44.2589, -16.7232, -3.6573, -40.6287, -16.4166, -4.8314, -44.2589, -16.3079, -3.6573, -40.6287, -16.4166, -4.8314, -44.2589, -16.7232, -3.6573, -40.6287, -19.5913, -3.6573, -40.6287, -16.4166, -4.8314, -44.2589, -19.5913, -3.6573, -40.6287, -19.7153, -4.8254, -44.2403, -20.0679, -3.6573, -40.6287, -19.7153, -4.8254, -44.2403, -19.5913, -3.6573, -40.6287, -19.7153, -4.8254, -44.2403, -20.0679, -3.6573, -40.6287, -22.8746, -3.6573, -40.6287, -19.7153, -4.8254, -44.2403, -22.8746, -3.6573, -40.6287, -23.013899, -4.8194, -44.221798, -23.412498, -3.6573, -40.6287, -23.013899, -4.8194, -44.221798, -22.8746, -3.6573, -40.6287, -23.013899, -4.8194, -44.221798, -23.412498, -3.6573, -40.6287, -26.7572, -3.6573, -40.6287, -23.013899, -4.8194, -44.221798, -26.7572, -3.6573, -40.6287, -26.7572, -4.8125997, -44.200798, -26.7572, -4.8125997, -44.200798, -23.1474, -5.9323997, -47.6632, -23.013899, -4.8194, -44.221798, -26.7572, -4.8125997, -44.200798, -26.7572, -5.9270997, -47.646698, -23.1474, -5.9323997, -47.6632, -23.013899, -4.8194, -44.221798, -19.8335, -5.9372997, -47.6783, -19.7153, -4.8254, -44.2403, -23.013899, -4.8194, -44.221798, -23.1474, -5.9323997, -47.6632, -19.8335, -5.9372997, -47.6783, -19.7153, -4.8254, -44.2403, -19.8335, -5.9372997, -47.6783, -16.5194, -5.9421997, -47.6935, -19.7153, -4.8254, -44.2403, -16.5194, -5.9421997, -47.6935, -16.4166, -4.8314, -44.2589, -26.7572, -5.9270997, -47.646698, -23.2876, -7.1015997, -51.2782, -23.1474, -5.9323997, -47.6632, -26.7572, -5.9270997, -47.646698, -26.7572, -7.1011, -51.2768, -23.2876, -7.1015997, -51.2782, -26.7572, -7.1011, -51.2768, -23.412498, -8.1437, -54.500298, -23.2876, -7.1015997, -51.2782, -26.7572, -7.1011, -51.2768, -26.7572, -8.1437, -54.500298, -23.412498, -8.1437, -54.500298, -23.2876, -7.1015997, -51.2782, -23.412498, -8.1437, -54.500298, -20.0679, -8.1437, -54.500298, -23.1474, -5.9323997, -47.6632, -23.2876, -7.1015997, -51.2782, -19.9572, -7.1019998, -51.2795, -23.2876, -7.1015997, -51.2782, -20.0679, -8.1437, -54.500298, -19.9572, -7.1019998, -51.2795, -23.1474, -5.9323997, -47.6632, -19.9572, -7.1019998, -51.2795, -19.8335, -5.9372997, -47.6783, -19.9572, -7.1019998, -51.2795, -20.0679, -8.1437, -54.500298, -16.7232, -8.1437, -54.500298, -19.8335, -5.9372997, -47.6783, -19.9572, -7.1019998, -51.2795, -16.626799, -7.1024, -51.2808, -19.9572, -7.1019998, -51.2795, -16.7232, -8.1437, -54.500298, -16.626799, -7.1024, -51.2808, -19.8335, -5.9372997, -47.6783, -16.626799, -7.1024, -51.2808, -16.5194, -5.9421997, -47.6935, -16.626799, -7.1024, -51.2808, -16.7232, -8.1437, -54.500298, -13.4286, -8.1437, -54.500298, -16.5194, -5.9421997, -47.6935, -16.626799, -7.1024, -51.2808, -13.344299, -7.1029, -51.282097, -16.626799, -7.1024, -51.2808, -13.4286, -8.1437, -54.500298, -13.344299, -7.1029, -51.282097, -16.5194, -5.9421997, -47.6935, -13.344299, -7.1029, -51.282097, -13.250801, -5.947, -47.708397, -16.4166, -4.8314, -44.2589, -16.5194, -5.9421997, -47.6935, -13.250801, -5.947, -47.708397, -16.4166, -4.8314, -44.2589, -13.250801, -5.947, -47.708397, -13.160999, -4.8373, -44.2772, -13.4286, -8.1437, -54.500298, -10.0877, -7.1032996, -51.283398, -13.344299, -7.1029, -51.282097, -13.250801, -5.947, -47.708397, -13.344299, -7.1029, -51.282097, -10.0877, -7.1032996, -51.283398, -10.0877, -7.1032996, -51.283398, -13.4286, -8.1437, -54.500298, -13.378601, -8.1437, -54.500298, -10.0877, -7.1032996, -51.283398, -13.378601, -8.1437, -54.500298, -10.141901, -8.1437, -54.500298, -13.160999, -4.8373, -44.2772, -13.250801, -5.947, -47.708397, -10.0277, -5.9518, -47.723198, -13.250801, -5.947, -47.708397, -10.0877, -7.1032996, -51.283398, -10.0277, -5.9518, -47.723198, -13.160999, -4.8373, -44.2772, -10.0277, -5.9518, -47.723198, -9.969999, -4.8431, -44.295097, -10.141901, -8.1437, -54.500298, -6.7531, -7.1036997, -51.284798, -10.0877, -7.1032996, -51.283398, -10.0277, -5.9518, -47.723198, -10.0877, -7.1032996, -51.283398, -6.7531, -7.1036997, -51.284798, -6.7531, -7.1036997, -51.284798, -10.141901, -8.1437, -54.500298, -10.033899, -8.1437, -54.500298, -6.7531, -7.1036997, -51.284798, -10.033899, -8.1437, -54.500298, -6.7919, -8.1437, -54.500298, -6.6893, -8.1437, -54.500298, -6.7531, -7.1036997, -51.284798, -6.7919, -8.1437, -54.500298, -6.7531, -7.1036997, -51.284798, -6.6893, -8.1437, -54.500298, -3.4199996, -8.1437, -54.500298, -9.969999, -4.8431, -44.295097, -10.0277, -5.9518, -47.723198, -6.7102, -5.9567, -47.7383, -10.0277, -5.9518, -47.723198, -6.7531, -7.1036997, -51.284798, -6.7102, -5.9567, -47.7383, -9.969999, -4.8431, -44.295097, -6.7102, -5.9567, -47.7383, -6.6689, -4.8491, -44.313698, -6.7531, -7.1036997, -51.284798, -3.4199996, -8.1437, -54.500298, -3.3915, -7.1040998, -51.2861, -3.3915, -7.1040998, -51.2861, -6.7102, -5.9567, -47.7383, -6.7531, -7.1036997, -51.284798, -3.3446002, -8.1437, -54.500298, -3.3915, -7.1040998, -51.2861, -3.4199996, -8.1437, -54.500298, -3.3915, -7.1040998, -51.2861, -3.3446002, -8.1437, -54.500298, -0.048199892, -8.1437, -54.500298, -3.3915, -7.1040998, -51.2861, -3.3602, -5.9617, -47.753597, -6.7102, -5.9567, -47.7383, -3.3602, -5.9617, -47.753597, -6.6689, -4.8491, -44.313698, -6.7102, -5.9567, -47.7383, -3.3915, -7.1040998, -51.2861, -0.048199892, -8.1437, -54.500298, -0.03699994, -7.1046, -51.2874, -0.03699994, -7.1046, -51.2874, -3.3602, -5.9617, -47.753597, -3.3915, -7.1040998, -51.2861, 0, -8.1437, -54.500298, -0.03699994, -7.1046, -51.2874, -0.048199892, -8.1437, -54.500298, -0.03699994, -7.1046, -51.2874, 0, -8.1437, -54.500298, 3.3446, -8.1437, -54.500298, -3.3602, -5.9617, -47.753597, -3.3298001, -4.8552, -44.3325, -6.6689, -4.8491, -44.313698, -3.297, -3.6573, -40.6287, -6.6689, -4.8491, -44.313698, -3.3298001, -4.8552, -44.3325, -0.03699994, -7.1046, -51.2874, -0.024800062, -5.9666, -47.768898, -3.3602, -5.9617, -47.753597, -0.024800062, -5.9666, -47.768898, -3.3298001, -4.8552, -44.3325, -3.3602, -5.9617, -47.753597, -0.012900114, -4.8612, -44.351097, -3.297, -3.6573, -40.6287, -3.3298001, -4.8552, -44.3325, -0.024800062, -5.9666, -47.768898, -0.012900114, -4.8612, -44.351097, -3.3298001, -4.8552, -44.3325, -0.012900114, -4.8612, -44.351097, 0, -3.6573, -40.6287, -3.297, -3.6573, -40.6287, 3.3446, -7.105, -51.2888, -0.024800062, -5.9666, -47.768898, -0.03699994, -7.1046, -51.2874, -0.03699994, -7.1046, -51.2874, 3.3446, -8.1437, -54.500298, 3.3446, -7.105, -51.2888, 3.3446, -5.9716, -47.7842, -0.012900114, -4.8612, -44.351097, -0.024800062, -5.9666, -47.768898, 3.3446, -7.105, -51.2888, 3.3446, -5.9716, -47.7842, -0.024800062, -5.9666, -47.768898, 3.3446, -4.8673, -44.37, 0, -3.6573, -40.6287, -0.012900114, -4.8612, -44.351097, 3.3446, -5.9716, -47.7842, 3.3446, -4.8673, -44.37, -0.012900114, -4.8612, -44.351097, 3.3446, -4.8673, -44.37, 3.3446, -3.6573, -40.6287, 0, -3.6573, -40.6287, 3.3446, -8.1437, -54.500298, 6.6893, -7.1053996, -51.2901, 3.3446, -7.105, -51.2888, 6.6893, -7.1053996, -51.2901, 3.3446, -5.9716, -47.7842, 3.3446, -7.105, -51.2888, 3.3446, -8.1437, -54.500298, 6.6893, -8.1437, -54.500298, 6.6893, -7.1053996, -51.2901, 6.6893, -5.9765, -47.7995, 3.3446, -4.8673, -44.37, 3.3446, -5.9716, -47.7842, 6.6893, -7.1053996, -51.2901, 6.6893, -5.9765, -47.7995, 3.3446, -5.9716, -47.7842, 6.6893, -4.8733997, -44.388798, 3.3446, -3.6573, -40.6287, 3.3446, -4.8673, -44.37, 6.6893, -5.9765, -47.7995, 6.6893, -4.8733997, -44.388798, 3.3446, -4.8673, -44.37, 6.6893, -4.8733997, -44.388798, 6.6893, -3.6573, -40.6287, 3.3446, -3.6573, -40.6287, 6.6893, -8.1437, -54.500298, 10.033899, -7.1059, -51.291397, 6.6893, -7.1053996, -51.2901, 10.033899, -7.1059, -51.291397, 6.6893, -5.9765, -47.7995, 6.6893, -7.1053996, -51.2901, 6.6893, -8.1437, -54.500298, 10.033899, -8.1437, -54.500298, 10.033899, -7.1059, -51.291397, 13.378599, -8.1437, -54.500298, 10.033899, -7.1059, -51.291397, 10.033899, -8.1437, -54.500298, 10.033899, -7.1059, -51.291397, 13.378599, -8.1437, -54.500298, 13.444599, -8.1437, -54.500298, 10.033899, -4.8795, -44.4076, 6.6893, -3.6573, -40.6287, 6.6893, -4.8733997, -44.388798, 10.033899, -5.9814, -47.8148, 6.6893, -4.8733997, -44.388798, 6.6893, -5.9765, -47.7995, 10.033899, -7.1059, -51.291397, 10.033899, -5.9814, -47.8148, 6.6893, -5.9765, -47.7995, 10.033899, -5.9814, -47.8148, 10.033899, -4.8795, -44.4076, 6.6893, -4.8733997, -44.388798, 10.033899, -7.1059, -51.291397, 13.444599, -8.1437, -54.500298, 13.429298, -7.1063, -51.292797, 13.429298, -7.1063, -51.292797, 10.033899, -5.9814, -47.8148, 10.033899, -7.1059, -51.291397, 10.033899, -4.8795, -44.4076, 10.033899, -3.6573, -40.6287, 6.6893, -3.6573, -40.6287, 16.7232, -8.1437, -54.500298, 13.429298, -7.1063, -51.292797, 13.444599, -8.1437, -54.500298, 13.429298, -7.1063, -51.292797, 16.7232, -8.1437, -54.500298, 16.8188, -8.1437, -54.500298, 13.412899, -5.9863997, -47.8302, 10.033899, -4.8795, -44.4076, 10.033899, -5.9814, -47.8148, 13.429298, -7.1063, -51.292797, 13.412899, -5.9863997, -47.8302, 10.033899, -5.9814, -47.8148, 13.3967, -4.8856, -44.4265, 10.033899, -3.6573, -40.6287, 10.033899, -4.8795, -44.4076, 13.412899, -5.9863997, -47.8302, 13.3967, -4.8856, -44.4265, 10.033899, -4.8795, -44.4076, 13.3967, -4.8856, -44.4265, 13.378599, -3.6573, -40.6287, 10.033899, -3.6573, -40.6287, 13.429298, -7.1063, -51.292797, 16.8188, -8.1437, -54.500298, 16.7967, -7.1067, -51.294098, 16.7967, -7.1067, -51.294098, 13.412899, -5.9863997, -47.8302, 13.429298, -7.1063, -51.292797, 20.0679, -8.1437, -54.500298, 16.7967, -7.1067, -51.294098, 16.8188, -8.1437, -54.500298, 16.7967, -7.1067, -51.294098, 20.0679, -8.1437, -54.500298, 20.1975, -8.1437, -54.500298, 16.7967, -7.1067, -51.294098, 20.1975, -8.1437, -54.500298, 20.1675, -7.1071997, -51.295498, 16.7967, -7.1067, -51.294098, 16.772999, -5.9914, -47.8456, 13.412899, -5.9863997, -47.8302, 20.1675, -7.1071997, -51.295498, 16.772999, -5.9914, -47.8456, 16.7967, -7.1067, -51.294098, 16.772999, -5.9914, -47.8456, 13.3967, -4.8856, -44.4265, 13.412899, -5.9863997, -47.8302, 20.1675, -7.1071997, -51.295498, 20.135399, -5.9964, -47.861, 16.772999, -5.9914, -47.8456, 16.7495, -4.8917, -44.445297, 13.378599, -3.6573, -40.6287, 13.3967, -4.8856, -44.4265, 16.772999, -5.9914, -47.8456, 16.7495, -4.8917, -44.445297, 13.3967, -4.8856, -44.4265, 20.135399, -5.9964, -47.861, 16.7495, -4.8917, -44.445297, 16.772999, -5.9914, -47.8456, 16.7495, -4.8917, -44.445297, 16.7232, -3.6573, -40.6287, 13.378599, -3.6573, -40.6287, 20.135399, -5.9964, -47.861, 20.103699, -4.8978, -44.4642, 16.7495, -4.8917, -44.445297, 20.103699, -4.8978, -44.4642, 16.7232, -3.6573, -40.6287, 16.7495, -4.8917, -44.445297, 20.103699, -4.8978, -44.4642, 20.0679, -3.6573, -40.6287, 16.7232, -3.6573, -40.6287, 16.7232, 0, 10.033899, 17.4912, 0.0034999999, 7.4080997, 20.0679, 0, 10.033899, 12.824999, 2.8544, 7.9234, 11.2783985, 2.1174998, 3.3446, 12.705599, 1.0321, 4.0927, 12.824999, 2.8544, 7.9234, 11.173899, 3.3332, 6.6554, 11.2783985, 2.1174998, 3.3446, 10.033899, 3.1929998, 0, 13.249599, 2.9931998, -3.4737, 11.278099, 2.3706, 0, 10.033899, 3.1929998, 0, 10.033899, 3.2212, -2.2307, 13.249599, 2.9931998, -3.4737, 20.613499, 1.0832, -3.1922002, 22.5396, -0.014599999, -3.3446002, 20.5402, -0.0411, -1.7683, 20.613499, 1.0832, -3.1922002, 21.09, -0.0218, -4.9179, 22.5396, -0.014599999, -3.3446002, 15.485399, 1.0792, -1.6708999, 14.217899, 2.8779, -3.3838, 15.6619, 2.2603, -2.7998996, 20.613499, 1.0832, -3.1922002, 15.485399, 1.0792, -1.6708999, 15.6619, 2.2603, -2.7998996, 20.613499, 1.0832, -3.1922002, 20.5402, -0.0411, -1.7683, 15.485399, 1.0792, -1.6708999, 20.5402, -0.0411, -1.7683, 23.412498, 0, 0, 20.2292, 0.030499998, -0.05219996, 23.412498, 0, 0, 20.5402, -0.0411, -1.7683, 22.5396, -0.014599999, -3.3446002, 23.412498, 0, 0, 22.5396, -0.014599999, -3.3446002, 23.412498, 0, -3.3446002, 21.09, -0.0218, -4.9179, 23.412498, 0, -6.6893, 22.5396, -0.014599999, -3.3446002, 21.09, -0.0218, -4.9179, 21.2349, 0, -6.6893, 23.412498, 0, -6.6893, 15.485399, 1.0792, -1.6708999, 20.2292, 0.030499998, -0.05219996, 14.261799, 0.9069, 1.1807, 14.217899, 2.8779, -3.3838, 11.278099, 2.3706, 0, 13.249599, 2.9931998, -3.4737, 11.278099, 2.3706, 0, 14.217899, 2.8779, -3.3838, 15.485399, 1.0792, -1.6708999, 11.278099, 2.3706, 0, 15.485399, 1.0792, -1.6708999, 14.261799, 0.9069, 1.1807, 15.485399, 1.0792, -1.6708999, 20.5402, -0.0411, -1.7683, 20.2292, 0.030499998, -0.05219996, 10.033899, 3.3913999, 4.2546997, 11.2783985, 2.1174998, 3.3446, 11.173899, 3.3332, 6.6554, 10.033899, 3.3913999, 4.2546997, 10.033899, 3.1929998, 3.3446, 11.2783985, 2.1174998, 3.3446, 6.6893, 3.3913999, 3.3446, 10.033899, 3.1929998, 3.3446, 10.033899, 3.3913999, 4.2546997, 10.033899, 3.2212, -2.2307, 10.033899, 3.1929998, 0, 6.6893, 3.3913999, 0, 14.0257, 0.0442, 7.3252997, 12.824999, 2.8544, 7.9234, 12.705599, 1.0321, 4.0927, 14.0257, 0.0442, 7.3252997, 13.175798, 2.4743, 8.042, 12.824999, 2.8544, 7.9234, 26.7582, -0.83089995, 6.6893, 26.7582, -1.7623999, 10.033899, 23.412498, -0.35529998, 10.033899, 23.826399, -8.175799, -54.500298, 26.7572, -7.3550997, -51.2602, 23.7466, -7.1323, -51.2931, 23.826399, -8.175799, -54.500298, 26.7572, -8.403, -54.500298, 26.7572, -7.3550997, -51.2602, 26.7572, -7.3550997, -51.2602, 23.6614, -6.0197997, -47.8736, 23.7466, -7.1323, -51.2931, 26.7572, -7.3550997, -51.2602, 26.7572, -6.2504, -47.8447, 23.6614, -6.0197997, -47.8736, 26.7572, -6.2504, -47.8447, 23.577, -4.916, -44.481, 23.6614, -6.0197997, -47.8736, 26.7572, -6.2504, -47.8447, 26.7572, -5.1514, -44.446598, 23.577, -4.916, -44.481, 26.7572, -5.1514, -44.446598, 23.480999, -3.6625998, -40.6287, 23.577, -4.916, -44.481, 26.7572, -5.1514, -44.446598, 26.7572, -3.9166, -40.6287, 23.480999, -3.6625998, -40.6287, 23.808699, -10.464399, -68.371895, 26.7572, -9.876599, -63.426796, 23.8148, -9.6761, -63.593796, 23.808699, -10.464399, -68.371895, 26.7572, -10.693, -68.371895, 26.7572, -9.876599, -63.426796, 26.7572, -9.876599, -63.426796, 23.819199, -9.111899, -60.1742, 23.8148, -9.6761, -63.593796, 26.7572, -9.876599, -63.426796, 26.7572, -9.312699, -60.011097, 23.819199, -9.111899, -60.1742, 26.7572, -9.312699, -60.011097, 23.8225, -8.6786995, -57.548298, 23.819199, -9.111899, -60.1742, 26.7572, -9.312699, -60.011097, 26.7572, -8.881, -57.3956, 23.8225, -8.6786995, -57.548298, 26.7572, -8.881, -57.3956, 23.826399, -8.175799, -54.500298, 23.8225, -8.6786995, -57.548298, 26.7572, -8.881, -57.3956, 26.7572, -8.403, -54.500298, 23.826399, -8.175799, -54.500298, 23.480999, -3.6625998, -40.6287, 26.7572, -3.2101, -37.2077, 23.4646, -2.985, -37.2919, 23.480999, -3.6625998, -40.6287, 26.7572, -3.9166, -40.6287, 26.7572, -3.2101, -37.2077, 23.412498, -8.1437, -54.500298, 20.1675, -7.1071997, -51.295498, 20.1975, -8.1437, -54.500298, 20.1675, -7.1071997, -51.295498, 23.412498, -8.1437, -54.500298, 23.826399, -8.175799, -54.500298, 20.1675, -7.1071997, -51.295498, 23.826399, -8.175799, -54.500298, 23.7466, -7.1323, -51.2931, 23.412498, -10.4337, -68.371895, 20.112099, -9.6529, -63.642, 20.0679, -10.4337, -68.371895, 20.112099, -9.6529, -63.642, 23.412498, -10.4337, -68.371895, 23.808699, -10.464399, -68.371895, 20.112099, -9.6529, -63.642, 23.808699, -10.464399, -68.371895, 23.8148, -9.6761, -63.593796, 23.412498, -3.6573, -40.6287, 20.0679, -2.9615998, -37.315, 20.0679, -3.6573, -40.6287, 20.0679, -2.9615998, -37.315, 23.412498, -3.6573, -40.6287, 23.480999, -3.6625998, -40.6287, 20.0679, -2.9615998, -37.315, 23.480999, -3.6625998, -40.6287, 23.4646, -2.985, -37.2919, 16.7232, -3.6573, -40.6287, 20.0679, -2.9615998, -37.315, 16.7232, -2.9859998, -37.3232, 16.7232, -3.6573, -40.6287, 20.0679, -3.6573, -40.6287, 20.0679, -2.9615998, -37.315, 13.378599, -3.6573, -40.6287, 16.7232, -2.9859998, -37.3232, 13.378599, -2.9889998, -37.3379, 13.378599, -3.6573, -40.6287, 16.7232, -3.6573, -40.6287, 16.7232, -2.9859998, -37.3232, 16.7232, -2.9859998, -37.3232, 13.378599, -2.3234, -34.0607, 13.378599, -2.9889998, -37.3379, 16.7232, -2.9859998, -37.3232, 16.7232, -2.3191, -34.0398, 13.378599, -2.3234, -34.0607, 16.7232, -2.3191, -34.0398, 13.378599, -1.582, -30.410397, 13.378599, -2.3234, -34.0607, 16.7232, -2.3191, -34.0398, 16.7232, -1.5709, -30.3554, 13.378599, -1.582, -30.410397, 10.033899, -3.6573, -40.6287, 13.378599, -2.9889998, -37.3379, 10.033899, -2.9973998, -37.350998, 10.033899, -3.6573, -40.6287, 13.378599, -3.6573, -40.6287, 13.378599, -2.9889998, -37.3379, 6.6893, -3.6573, -40.6287, 10.033899, -2.9973998, -37.350998, 6.6893, -3.0333998, -37.355698, 6.6893, -3.6573, -40.6287, 10.033899, -3.6573, -40.6287, 10.033899, -2.9973998, -37.350998, 3.3446, -3.6573, -40.6287, 6.6893, -3.0333998, -37.355698, 3.3446, -3.0307, -37.3722, 3.3446, -3.6573, -40.6287, 6.6893, -3.6573, -40.6287, 6.6893, -3.0333998, -37.355698, 0, -3.6573, -40.6287, 3.3446, -3.0307, -37.3722, 0, -3.0496, -37.3821, 0, -3.6573, -40.6287, 3.3446, -3.6573, -40.6287, 3.3446, -3.0307, -37.3722, -3.297, -3.6573, -40.6287, 0, -3.0496, -37.3821, -3.3081002, -3.0523, -37.396698, -3.297, -3.6573, -40.6287, 0, -3.6573, -40.6287, 0, -3.0496, -37.3821, -3.3081002, -3.0523, -37.396698, -3.3446002, -3.6573, -40.6287, -3.297, -3.6573, -40.6287, -3.3081002, -3.0523, -37.396698, -6.6243997, -3.6573, -40.6287, -3.3446002, -3.6573, -40.6287, -6.6243997, -3.6573, -40.6287, -3.3081002, -3.0523, -37.396698, -6.6394, -3.0551, -37.4115, -6.6547, -2.4452, -34.1534, -6.6394, -3.0551, -37.4115, -3.3081002, -3.0523, -37.396698, 0, -3.0496, -37.3821, -3.3193002, -2.4413, -34.1324, -3.3081002, -3.0523, -37.396698, -6.6547, -2.4452, -34.1534, -3.3081002, -3.0523, -37.396698, -3.3193002, -2.4413, -34.1324, -6.6709, -1.7958, -30.683697, -6.6547, -2.4452, -34.1534, -3.3193002, -2.4413, -34.1324, 0, -3.0496, -37.3821, 0, -2.4373999, -34.1115, -3.3193002, -2.4413, -34.1324, -6.6709, -1.7958, -30.683697, -3.3193002, -2.4413, -34.1324, -3.3313003, -1.7853999, -30.628498, 0, -2.4373999, -34.1115, -3.3313003, -1.7853999, -30.628498, -3.3193002, -2.4413, -34.1324, 0, -2.4373999, -34.1115, 0, -1.7751, -30.573498, -3.3313003, -1.7853999, -30.628498, -6.6893, -1.458, -26.7572, -9.9988, -2.089, -30.630497, -6.6709, -1.7958, -30.683697, -6.6893, -1.458, -26.7572, -10.033899, -1.8786, -26.7572, -9.9988, -2.089, -30.630497, -10.033899, -1.8786, -26.7572, -13.297701, -2.9966, -30.341599, -9.9988, -2.089, -30.630497, -10.033899, -1.8786, -26.7572, -13.378601, -2.7663999, -26.7572, -13.297701, -2.9966, -30.341599, -13.378601, -2.7663999, -26.7572, -16.6169, -3.2373998, -30.3083, -13.297701, -2.9966, -30.341599, -13.378601, -2.7663999, -26.7572, -16.7232, -3.0929, -26.7572, -16.6169, -3.2373998, -30.3083, -16.7232, -3.0929, -26.7572, -19.9439, -3.2396998, -30.366299, -16.6169, -3.2373998, -30.3083, -19.9439, -3.2396998, -30.366299, -16.5094, -3.3834999, -33.898598, -16.6169, -3.2373998, -30.3083, -16.7232, -3.0929, -26.7572, -20.0679, -3.0929, -26.7572, -19.9439, -3.2396998, -30.366299, -19.9439, -3.2396998, -30.366299, -19.8217, -3.3844, -33.920498, -16.5094, -3.3834999, -33.898598, -20.0679, -3.0929, -26.7572, -23.2703, -3.2421, -30.424297, -19.9439, -3.2396998, -30.366299, -23.2703, -3.2421, -30.424297, -19.8217, -3.3844, -33.920498, -19.9439, -3.2396998, -30.366299, -20.0679, -3.0929, -26.7572, -23.412498, -3.0929, -26.7572, -23.2703, -3.2421, -30.424297, -19.8217, -3.3844, -33.920498, -16.4072, -3.5224, -37.3144, -16.5094, -3.3834999, -33.898598, -23.412498, -3.0929, -26.7572, -26.7572, -3.2445998, -30.4851, -23.2703, -3.2421, -30.424297, -23.412498, -3.0929, -26.7572, -26.7572, -3.0929, -26.7572, -26.7572, -3.2445998, -30.4851, -26.7572, -3.2445998, -30.4851, -23.1339, -3.3852, -33.942398, -23.2703, -3.2421, -30.424297, -23.2703, -3.2421, -30.424297, -23.1339, -3.3852, -33.942398, -19.8217, -3.3844, -33.920498, -26.7572, -3.2445998, -30.4851, -26.7572, -3.3862, -33.9664, -23.1339, -3.3852, -33.942398, -16.4072, -3.5224, -37.3144, -16.7232, -3.6573, -40.6287, -16.3079, -3.6573, -40.6287, -16.4072, -3.5224, -37.3144, -19.5913, -3.6573, -40.6287, -16.7232, -3.6573, -40.6287, -19.8217, -3.3844, -33.920498, -19.7046, -3.5231, -37.3297, -16.4072, -3.5224, -37.3144, -19.5913, -3.6573, -40.6287, -16.4072, -3.5224, -37.3144, -19.7046, -3.5231, -37.3297, -23.1339, -3.3852, -33.942398, -19.7046, -3.5231, -37.3297, -19.8217, -3.3844, -33.920498, -19.7046, -3.5231, -37.3297, -20.0679, -3.6573, -40.6287, -19.5913, -3.6573, -40.6287, -19.7046, -3.5231, -37.3297, -22.8746, -3.6573, -40.6287, -20.0679, -3.6573, -40.6287, -23.1339, -3.3852, -33.942398, -23.0019, -3.5237, -37.3449, -19.7046, -3.5231, -37.3297, -22.8746, -3.6573, -40.6287, -19.7046, -3.5231, -37.3297, -23.0019, -3.5237, -37.3449, -26.7572, -3.3862, -33.9664, -23.0019, -3.5237, -37.3449, -23.1339, -3.3852, -33.942398, -23.0019, -3.5237, -37.3449, -23.412498, -3.6573, -40.6287, -22.8746, -3.6573, -40.6287, -26.7572, -3.3862, -33.9664, -26.7572, -3.5244, -37.3623, -23.0019, -3.5237, -37.3449, -23.0019, -3.5237, -37.3449, -26.7572, -3.6573, -40.6287, -23.412498, -3.6573, -40.6287, -26.7572, -3.6573, -40.6287, -23.0019, -3.5237, -37.3449, -26.7572, -3.5244, -37.3623, -13.297701, -2.9966, -30.341599, -9.9673, -2.6348999, -34.110798, -9.9988, -2.089, -30.630497, -13.297701, -2.9966, -30.341599, -13.2167, -3.2271, -33.93, -9.9673, -2.6348999, -34.110798, 6.6893, -1.7218, -30.475399, 3.3446, -0.98829997, -26.7572, 3.3446, -1.7156, -30.536999, 6.6893, -1.7218, -30.475399, 6.6893, -1.0129, -26.7572, 3.3446, -0.98829997, -26.7572, 26.7573, -1.7447, -30.111198, 23.412498, -1.1158999, -26.7572, 23.429699, -1.5537, -30.243198, 26.7573, -1.7447, -30.111198, 26.7573, -1.3222, -26.7572, 23.412498, -1.1158999, -26.7572, -9.9988, -2.089, -30.630497, -6.6547, -2.4452, -34.1534, -6.6709, -1.7958, -30.683697, -9.9988, -2.089, -30.630497, -9.9673, -2.6348999, -34.110798, -6.6547, -2.4452, -34.1534, 10.033899, -1.61, -30.458897, 6.6893, -1.0129, -26.7572, 6.6893, -1.7218, -30.475399, 10.033899, -1.61, -30.458897, 10.033899, -0.8648, -26.7572, 6.6893, -1.0129, -26.7572, 3.3446, -1.7156, -30.536999, 0, -1.0608, -26.7572, 0, -1.7751, -30.573498, 3.3446, -1.7156, -30.536999, 3.3446, -0.98829997, -26.7572, 0, -1.0608, -26.7572, 23.429699, -1.5537, -30.243198, 20.0679, -1.1922, -26.7572, 20.0679, -1.4942, -30.325497, 23.429699, -1.5537, -30.243198, 23.412498, -1.1158999, -26.7572, 20.0679, -1.1922, -26.7572, 16.7232, -1.5709, -30.3554, 16.7232, -1.3382, -26.7572, 13.378599, -1.582, -30.410397, 13.378599, -1.582, -30.410397, 10.033899, -0.8648, -26.7572, 10.033899, -1.61, -30.458897, 13.378599, -1.582, -30.410397, 13.378599, -0.8401, -26.7572, 10.033899, -0.8648, -26.7572, 0, -1.7751, -30.573498, -3.3446002, -1.458, -26.7572, -3.3313003, -1.7853999, -30.628498, 0, -1.7751, -30.573498, 0, -1.0608, -26.7572, -3.3446002, -1.458, -26.7572, 20.0679, -1.4942, -30.325497, 16.7232, -1.3382, -26.7572, 16.7232, -1.5709, -30.3554, 20.0679, -1.4942, -30.325497, 20.0679, -1.1922, -26.7572, 16.7232, -1.3382, -26.7572, -16.6169, -3.2373998, -30.3083, -13.2167, -3.2271, -33.93, -13.297701, -2.9966, -30.341599, -16.6169, -3.2373998, -30.3083, -16.5094, -3.3834999, -33.898598, -13.2167, -3.2271, -33.93, 6.6893, -2.4083, -34.0766, 3.3446, -1.7156, -30.536999, 3.3446, -2.4013999, -34.1014, 6.6893, -2.4083, -34.0766, 6.6893, -1.7218, -30.475399, 3.3446, -1.7156, -30.536999, 26.7572, -2.5274, -33.9013, 23.429699, -1.5537, -30.243198, 23.4483, -2.3157, -33.9959, 26.7572, -2.5274, -33.9013, 26.7573, -1.7447, -30.111198, 23.429699, -1.5537, -30.243198, 23.4483, -2.3157, -33.9959, 20.0679, -1.4942, -30.325497, 20.0679, -2.2726, -34.0333, 23.4483, -2.3157, -33.9959, 23.429699, -1.5537, -30.243198, 20.0679, -1.4942, -30.325497, -9.9673, -2.6348999, -34.110798, -6.6394, -3.0551, -37.4115, -6.6547, -2.4452, -34.1534, -9.9673, -2.6348999, -34.110798, -9.9375, -3.1504998, -37.3978, -6.6394, -3.0551, -37.4115, 3.3446, -2.4013999, -34.1014, 0, -1.7751, -30.573498, 0, -2.4373999, -34.1115, 3.3446, -2.4013999, -34.1014, 3.3446, -1.7156, -30.536999, 0, -1.7751, -30.573498, -16.5094, -3.3834999, -33.898598, -13.1401005, -3.445, -37.3228, -13.2167, -3.2271, -33.93, -16.5094, -3.3834999, -33.898598, -16.4072, -3.5224, -37.3144, -13.1401005, -3.445, -37.3228, 10.033899, -2.3385, -34.078, 6.6893, -1.7218, -30.475399, 6.6893, -2.4083, -34.0766, 10.033899, -2.3385, -34.078, 10.033899, -1.61, -30.458897, 6.6893, -1.7218, -30.475399, 13.378599, -2.3234, -34.0607, 10.033899, -1.61, -30.458897, 10.033899, -2.3385, -34.078, 13.378599, -2.3234, -34.0607, 13.378599, -1.582, -30.410397, 10.033899, -1.61, -30.458897, 20.0679, -2.2726, -34.0333, 16.7232, -1.5709, -30.3554, 16.7232, -2.3191, -34.0398, 20.0679, -2.2726, -34.0333, 20.0679, -1.4942, -30.325497, 16.7232, -1.5709, -30.3554, -13.2167, -3.2271, -33.93, -9.9375, -3.1504998, -37.3978, -9.9673, -2.6348999, -34.110798, -13.2167, -3.2271, -33.93, -13.1401005, -3.445, -37.3228, -9.9375, -3.1504998, -37.3978, -16.3079, -3.6573, -40.6287, -13.1401005, -3.445, -37.3228, -16.4072, -3.5224, -37.3144, -13.1401005, -3.445, -37.3228, -16.3079, -3.6573, -40.6287, -13.378601, -3.6573, -40.6287, -13.1401005, -3.445, -37.3228, -13.378601, -3.6573, -40.6287, -13.0655, -3.6573, -40.6287, -13.0655, -3.6573, -40.6287, -9.9375, -3.1504998, -37.3978, -13.1401005, -3.445, -37.3228, -9.9375, -3.1504998, -37.3978, -13.0655, -3.6573, -40.6287, -10.033899, -3.6573, -40.6287, -9.9375, -3.1504998, -37.3978, -10.033899, -3.6573, -40.6287, -9.908199, -3.6573, -40.6287, 6.6893, -3.0333998, -37.355698, 3.3446, -2.4013999, -34.1014, 3.3446, -3.0307, -37.3722, 6.6893, -3.0333998, -37.355698, 6.6893, -2.4083, -34.0766, 3.3446, -2.4013999, -34.1014, 10.033899, -2.9973998, -37.350998, 6.6893, -2.4083, -34.0766, 6.6893, -3.0333998, -37.355698, 10.033899, -2.9973998, -37.350998, 10.033899, -2.3385, -34.078, 6.6893, -2.4083, -34.0766, 3.3446, -3.0307, -37.3722, 0, -2.4373999, -34.1115, 0, -3.0496, -37.3821, 3.3446, -3.0307, -37.3722, 3.3446, -2.4013999, -34.1014, 0, -2.4373999, -34.1115, 23.4646, -2.985, -37.2919, 20.0679, -2.2726, -34.0333, 20.0679, -2.9615998, -37.315, 23.4646, -2.985, -37.2919, 23.4483, -2.3157, -33.9959, 20.0679, -2.2726, -34.0333, 26.7572, -3.2101, -37.2077, 23.4483, -2.3157, -33.9959, 23.4646, -2.985, -37.2919, 26.7572, -3.2101, -37.2077, 26.7572, -2.5274, -33.9013, 23.4483, -2.3157, -33.9959, 13.378599, -2.9889998, -37.3379, 10.033899, -2.3385, -34.078, 10.033899, -2.9973998, -37.350998, 13.378599, -2.9889998, -37.3379, 13.378599, -2.3234, -34.0607, 10.033899, -2.3385, -34.078, 20.0679, -2.9615998, -37.315, 16.7232, -2.3191, -34.0398, 16.7232, -2.9859998, -37.3232, 20.0679, -2.9615998, -37.315, 20.0679, -2.2726, -34.0333, 16.7232, -2.3191, -34.0398, -9.908199, -3.6573, -40.6287, -6.6394, -3.0551, -37.4115, -9.9375, -3.1504998, -37.3978, -6.6394, -3.0551, -37.4115, -9.908199, -3.6573, -40.6287, -6.6893, -3.6573, -40.6287, -6.6394, -3.0551, -37.4115, -6.6893, -3.6573, -40.6287, -6.6243997, -3.6573, -40.6287, 23.480999, -3.6625998, -40.6287, 20.103699, -4.8978, -44.4642, 23.577, -4.916, -44.481, 20.103699, -4.8978, -44.4642, 23.480999, -3.6625998, -40.6287, 23.412498, -3.6573, -40.6287, 20.103699, -4.8978, -44.4642, 23.412498, -3.6573, -40.6287, 20.0679, -3.6573, -40.6287, 23.6614, -6.0197997, -47.8736, 20.103699, -4.8978, -44.4642, 20.135399, -5.9964, -47.861, 23.6614, -6.0197997, -47.8736, 23.577, -4.916, -44.481, 20.103699, -4.8978, -44.4642, 23.7466, -7.1323, -51.2931, 20.135399, -5.9964, -47.861, 20.1675, -7.1071997, -51.295498, 23.7466, -7.1323, -51.2931, 23.6614, -6.0197997, -47.8736, 20.135399, -5.9964, -47.861, 23.826399, -8.175799, -54.500298, 20.1689, -8.6489, -57.5607, 23.8225, -8.6786995, -57.548298, 20.1689, -8.6489, -57.5607, 23.826399, -8.175799, -54.500298, 23.412498, -8.1437, -54.500298, 20.1689, -8.6489, -57.5607, 23.412498, -8.1437, -54.500298, 20.1975, -8.1437, -54.500298, 23.819199, -9.111899, -60.1742, 20.1689, -8.6489, -57.5607, 20.1442, -9.085899, -60.207497, 23.819199, -9.111899, -60.1742, 23.8225, -8.6786995, -57.548298, 20.1689, -8.6489, -57.5607, 23.8148, -9.6761, -63.593796, 20.1442, -9.085899, -60.207497, 20.112099, -9.6529, -63.642, 23.8148, -9.6761, -63.593796, 23.819199, -9.111899, -60.1742, 20.1442, -9.085899, -60.207497, -26.7572, -10.4337, -70.9319, -23.4177, -10.4499, -73.721596, -23.4177, -10.4499, -70.8944, -23.4177, -10.4499, -73.721596, -20.0768, -10.466, -70.856895, -23.4177, -10.4499, -70.8944, -26.7572, -10.4337, -70.9319, -26.7572, -10.4337, -73.7615, -23.4177, -10.4499, -73.721596, -23.4177, -10.4499, -73.721596, -20.0768, -10.466, -73.6818, -20.0768, -10.466, -70.856895, -20.0768, -10.466, -73.6818, -16.734499, -10.4822, -70.8193, -20.0768, -10.466, -70.856895, -26.7572, -10.4337, -73.7615, -23.4177, -10.4499, -76.5937, -23.4177, -10.4499, -73.721596, -23.4177, -10.4499, -76.5937, -20.0768, -10.466, -73.6818, -23.4177, -10.4499, -73.721596, -26.7572, -10.4337, -73.7615, -26.7572, -10.4337, -76.6203, -23.4177, -10.4499, -76.5937, -26.7572, -10.4337, -76.6203, -23.4177, -10.4499, -79.1102, -23.4177, -10.4499, -76.5937, -26.7572, -10.4337, -76.6203, -26.7572, -10.4337, -79.0804, -23.4177, -10.4499, -79.1102, -23.4177, -10.4499, -79.1102, -20.0768, -10.466, -76.567, -23.4177, -10.4499, -76.5937, -23.4177, -10.4499, -76.5937, -20.0768, -10.466, -76.567, -20.0768, -10.466, -73.6818, -23.4177, -10.4499, -79.1102, -20.0768, -10.466, -79.14, -20.0768, -10.466, -76.567, -20.0768, -10.466, -73.6818, -16.734499, -10.4822, -73.6419, -16.734499, -10.4822, -70.8193, -20.0768, -10.466, -76.567, -16.734499, -10.4822, -73.6419, -20.0768, -10.466, -73.6818, -16.734499, -10.4822, -73.6419, -13.3908, -10.4984, -70.7818, -16.734499, -10.4822, -70.8193, -20.0768, -10.466, -79.14, -16.734499, -10.4822, -76.5403, -20.0768, -10.466, -76.567, -20.0768, -10.466, -76.567, -16.734499, -10.4822, -76.5403, -16.734499, -10.4822, -73.6419, -20.0768, -10.466, -79.14, -16.734499, -10.4822, -79.1699, -16.734499, -10.4822, -76.5403, -16.734499, -10.4822, -73.6419, -13.3909, -10.4984, -73.602, -13.3908, -10.4984, -70.7818, -16.734499, -10.4822, -76.5403, -13.3909, -10.4984, -73.602, -16.734499, -10.4822, -73.6419, -13.3909, -10.4984, -73.602, -10.045801, -10.5146, -70.7442, -13.3908, -10.4984, -70.7818, -16.734499, -10.4822, -79.1699, -13.3909, -10.4984, -76.513596, -16.734499, -10.4822, -76.5403, -16.734499, -10.4822, -76.5403, -13.3909, -10.4984, -76.513596, -13.3909, -10.4984, -73.602, -16.734499, -10.4822, -79.1699, -13.3909, -10.4984, -79.1997, -13.3909, -10.4984, -76.513596, -13.3909, -10.4984, -73.602, -10.045801, -10.5146, -73.562195, -10.045801, -10.5146, -70.7442, -13.3909, -10.4984, -76.513596, -10.045801, -10.5146, -73.562195, -13.3909, -10.4984, -73.602, -10.045801, -10.5146, -73.562195, -6.6993003, -10.5309, -70.7066, -10.045801, -10.5146, -70.7442, -13.3909, -10.4984, -79.1997, -10.045801, -10.5146, -76.4869, -13.3909, -10.4984, -76.513596, -13.3909, -10.4984, -76.513596, -10.045801, -10.5146, -76.4869, -10.045801, -10.5146, -73.562195, -13.3909, -10.4984, -79.1997, -10.045801, -10.5146, -79.2295, -10.045801, -10.5146, -76.4869, -10.045801, -10.5146, -73.562195, -6.6993003, -10.5309, -73.5222, -6.6993003, -10.5309, -70.7066, -10.045801, -10.5146, -76.4869, -6.6993003, -10.5309, -73.5222, -10.045801, -10.5146, -73.562195, -6.6993003, -10.5309, -73.5222, -3.3514, -10.5471, -70.669, -6.6993003, -10.5309, -70.7066, -10.045801, -10.5146, -79.2295, -6.6993003, -10.5309, -76.4602, -10.045801, -10.5146, -76.4869, -10.045801, -10.5146, -76.4869, -6.6993003, -10.5309, -76.4602, -6.6993003, -10.5309, -73.5222, -10.045801, -10.5146, -79.2295, -6.6993003, -10.5309, -79.2594, -6.6993003, -10.5309, -76.4602, -6.6993003, -10.5309, -73.5222, -3.3514, -10.5471, -73.4823, -3.3514, -10.5471, -70.669, -6.6993003, -10.5309, -76.4602, -3.3514, -10.5471, -73.4823, -6.6993003, -10.5309, -73.5222, -3.3514, -10.5471, -73.4823, -0.0020999908, -10.5633, -70.6314, -3.3514, -10.5471, -70.669, -6.6993003, -10.5309, -79.2594, -3.3514, -10.5471, -76.433395, -6.6993003, -10.5309, -76.4602, -6.6993003, -10.5309, -76.4602, -3.3514, -10.5471, -76.433395, -3.3514, -10.5471, -73.4823, -6.6993003, -10.5309, -79.2594, -3.3514, -10.5471, -79.2893, -3.3514, -10.5471, -76.433395, -3.3514, -10.5471, -73.4823, -0.0020999908, -10.5633, -73.4424, -0.0020999908, -10.5633, -70.6314, -3.3514, -10.5471, -76.433395, -0.0020999908, -10.5633, -73.4424, -3.3514, -10.5471, -73.4823, -0.0020999908, -10.5633, -73.4424, 3.3486998, -10.579599, -70.5937, -0.0020999908, -10.5633, -70.6314, -3.3514, -10.5471, -79.2893, -0.0020999908, -10.5633, -76.4067, -3.3514, -10.5471, -76.433395, -3.3514, -10.5471, -76.433395, -0.0020999908, -10.5633, -76.4067, -0.0020999908, -10.5633, -73.4424, -3.3514, -10.5471, -79.2893, -0.0020999908, -10.5633, -79.3192, -0.0020999908, -10.5633, -76.4067, -0.0020999908, -10.5633, -73.4424, 3.3486998, -10.579599, -73.4024, 3.3486998, -10.579599, -70.5937, -0.0020999908, -10.5633, -76.4067, 3.3486998, -10.579599, -73.4024, -0.0020999908, -10.5633, -73.4424, 3.3486998, -10.579599, -73.4024, 6.7008, -10.595799, -70.5561, 3.3486998, -10.579599, -70.5937, -0.0020999908, -10.5633, -79.3192, 3.3486998, -10.579599, -76.3799, -0.0020999908, -10.5633, -76.4067, -0.0020999908, -10.5633, -76.4067, 3.3486998, -10.579599, -76.3799, 3.3486998, -10.579599, -73.4024, -0.0020999908, -10.5633, -79.3192, 3.3486998, -10.579599, -79.3491, 3.3486998, -10.579599, -76.3799, 3.3486998, -10.579599, -73.4024, 6.7008, -10.595799, -73.3624, 6.7008, -10.595799, -70.5561, 3.3486998, -10.579599, -76.3799, 6.7008, -10.595799, -73.3624, 3.3486998, -10.579599, -73.4024, 6.7008, -10.595799, -73.3624, 10.054299, -10.6119995, -70.518394, 6.7008, -10.595799, -70.5561, 3.3486998, -10.579599, -79.3491, 6.7008, -10.595799, -76.353195, 3.3486998, -10.579599, -76.3799, 3.3486998, -10.579599, -76.3799, 6.7008, -10.595799, -76.353195, 6.7008, -10.595799, -73.3624, 3.3486998, -10.579599, -79.3491, 6.7008, -10.595799, -79.379, 6.7008, -10.595799, -76.353195, 6.7008, -10.595799, -73.3624, 10.054299, -10.6119995, -73.322395, 10.054299, -10.6119995, -70.518394, 6.7008, -10.595799, -76.353195, 10.054299, -10.6119995, -73.322395, 6.7008, -10.595799, -73.3624, 10.054299, -10.6119995, -73.322395, 13.4093, -10.6283, -70.4807, 10.054299, -10.6119995, -70.518394, 6.7008, -10.595799, -79.379, 10.054299, -10.6119995, -76.3264, 6.7008, -10.595799, -76.353195, 6.7008, -10.595799, -76.353195, 10.054299, -10.6119995, -76.3264, 10.054299, -10.6119995, -73.322395, 6.7008, -10.595799, -79.379, 10.054299, -10.6119995, -79.4089, 10.054299, -10.6119995, -76.3264, 10.054299, -10.6119995, -73.322395, 13.4093, -10.6283, -73.282394, 13.4093, -10.6283, -70.4807, 10.054299, -10.6119995, -76.3264, 13.4093, -10.6283, -73.282394, 10.054299, -10.6119995, -73.322395, 13.4093, -10.6283, -73.282394, 16.7656, -10.6446, -70.443, 13.4093, -10.6283, -70.4807, 10.054299, -10.6119995, -79.4089, 13.4093, -10.6283, -76.2996, 10.054299, -10.6119995, -76.3264, 10.054299, -10.6119995, -76.3264, 13.4093, -10.6283, -76.2996, 13.4093, -10.6283, -73.282394, 10.054299, -10.6119995, -79.4089, 13.4093, -10.6283, -79.4388, 13.4093, -10.6283, -76.2996, 13.4093, -10.6283, -73.282394, 16.7656, -10.6446, -73.2424, 16.7656, -10.6446, -70.443, 13.4093, -10.6283, -76.2996, 16.7656, -10.6446, -73.2424, 13.4093, -10.6283, -73.282394, 16.7656, -10.6446, -73.2424, 20.1234, -10.6608, -70.4053, 16.7656, -10.6446, -70.443, 13.4093, -10.6283, -79.4388, 16.7656, -10.6446, -76.2728, 13.4093, -10.6283, -76.2996, 13.4093, -10.6283, -76.2996, 16.7656, -10.6446, -76.2728, 16.7656, -10.6446, -73.2424, 13.4093, -10.6283, -79.4388, 16.7656, -10.6446, -79.468796, 16.7656, -10.6446, -76.2728, 16.7656, -10.6446, -73.2424, 20.1234, -10.6608, -73.2023, 20.1234, -10.6608, -70.4053, 16.7656, -10.6446, -76.2728, 20.1234, -10.6608, -73.2023, 16.7656, -10.6446, -73.2424, 20.1234, -10.6608, -73.2023, 23.812, -10.6786995, -70.3639, 20.1234, -10.6608, -70.4053, 16.7656, -10.6446, -79.468796, 20.1234, -10.6608, -76.245995, 16.7656, -10.6446, -76.2728, 16.7656, -10.6446, -76.2728, 20.1234, -10.6608, -76.245995, 20.1234, -10.6608, -73.2023, 16.7656, -10.6446, -79.468796, 20.1234, -10.6608, -79.498695, 20.1234, -10.6608, -76.245995, 20.1234, -10.6608, -73.2023, 23.7337, -10.6783, -73.1593, 23.812, -10.6786995, -70.3639, 20.1234, -10.6608, -76.245995, 23.7337, -10.6783, -73.1593, 20.1234, -10.6608, -73.2023, 23.7337, -10.6783, -73.1593, 26.7572, -10.693, -70.330795, 23.812, -10.6786995, -70.3639, 23.7337, -10.6783, -73.1593, 26.7572, -10.693, -73.1232, 26.7572, -10.693, -70.330795, 20.1234, -10.6608, -76.245995, 23.6481, -10.677899, -76.2178, 23.7337, -10.6783, -73.1593, 23.6481, -10.677899, -76.2178, 26.7572, -10.693, -73.1232, 23.7337, -10.6783, -73.1593, 20.1234, -10.6608, -79.498695, 23.6481, -10.677899, -76.2178, 20.1234, -10.6608, -76.245995, 23.6481, -10.677899, -76.2178, 26.7572, -10.693, -76.193, 26.7572, -10.693, -73.1232, 20.1234, -10.6608, -79.498695, 23.555399, -10.6775, -79.529396, 23.6481, -10.677899, -76.2178, 23.555399, -10.6775, -79.529396, 26.7572, -10.693, -76.193, 23.6481, -10.677899, -76.2178, 23.555399, -10.6775, -79.529396, 26.7572, -10.693, -79.5579, 26.7572, -10.693, -76.193, -26.7572, -10.4337, -79.0804, -23.412498, -10.4337, -82.2434, -23.4177, -10.4499, -79.1102, -26.7572, -10.4337, -79.0804, -26.7572, -10.4337, -82.2434, -23.412498, -10.4337, -82.2434, 23.412498, -10.4337, -82.2434, 26.7572, -10.693, -79.5579, 23.555399, -10.6775, -79.529396, 23.412498, -10.4337, -82.2434, 26.7572, -10.693, -82.2434, 26.7572, -10.693, -79.5579, 23.812, -10.6786995, -70.3639, 26.7572, -10.693, -68.371895, 23.808699, -10.464399, -68.371895, 23.812, -10.6786995, -70.3639, 26.7572, -10.693, -70.330795, 26.7572, -10.693, -68.371895, 20.0679, -10.4337, -82.2434, 23.555399, -10.6775, -79.529396, 20.1234, -10.6608, -79.498695, 20.0679, -10.4337, -82.2434, 23.412498, -10.4337, -82.2434, 23.555399, -10.6775, -79.529396, 23.812, -10.6786995, -70.3639, 20.0679, -10.4337, -68.371895, 20.1234, -10.6608, -70.4053, 20.0679, -10.4337, -68.371895, 23.812, -10.6786995, -70.3639, 23.808699, -10.464399, -68.371895, 20.0679, -10.4337, -68.371895, 23.808699, -10.464399, -68.371895, 23.412498, -10.4337, -68.371895, 16.7232, -10.4337, -82.2434, 20.1234, -10.6608, -79.498695, 16.7656, -10.6446, -79.468796, 16.7232, -10.4337, -82.2434, 20.0679, -10.4337, -82.2434, 20.1234, -10.6608, -79.498695, 16.7656, -10.6446, -70.443, 20.0679, -10.4337, -68.371895, 16.7232, -10.4337, -68.371895, 16.7656, -10.6446, -70.443, 20.1234, -10.6608, -70.4053, 20.0679, -10.4337, -68.371895, 13.378599, -10.4337, -82.2434, 16.7656, -10.6446, -79.468796, 13.4093, -10.6283, -79.4388, 13.378599, -10.4337, -82.2434, 16.7232, -10.4337, -82.2434, 16.7656, -10.6446, -79.468796, 13.4093, -10.6283, -70.4807, 16.7232, -10.4337, -68.371895, 13.378599, -10.4337, -68.371895, 13.4093, -10.6283, -70.4807, 16.7656, -10.6446, -70.443, 16.7232, -10.4337, -68.371895, 10.033899, -10.4337, -82.2434, 13.4093, -10.6283, -79.4388, 10.054299, -10.6119995, -79.4089, 10.033899, -10.4337, -82.2434, 13.378599, -10.4337, -82.2434, 13.4093, -10.6283, -79.4388, 10.054299, -10.6119995, -70.518394, 13.378599, -10.4337, -68.371895, 10.033899, -10.4337, -68.371895, 10.054299, -10.6119995, -70.518394, 13.4093, -10.6283, -70.4807, 13.378599, -10.4337, -68.371895, 6.6893, -10.4337, -82.2434, 10.054299, -10.6119995, -79.4089, 6.7008, -10.595799, -79.379, 6.6893, -10.4337, -82.2434, 10.033899, -10.4337, -82.2434, 10.054299, -10.6119995, -79.4089, 6.7008, -10.595799, -70.5561, 10.033899, -10.4337, -68.371895, 6.6893, -10.4337, -68.371895, 6.7008, -10.595799, -70.5561, 10.054299, -10.6119995, -70.518394, 10.033899, -10.4337, -68.371895, 3.3446, -10.4337, -82.2434, 6.7008, -10.595799, -79.379, 3.3486998, -10.579599, -79.3491, 3.3446, -10.4337, -82.2434, 6.6893, -10.4337, -82.2434, 6.7008, -10.595799, -79.379, 3.3486998, -10.579599, -70.5937, 6.6893, -10.4337, -68.371895, 3.3446, -10.4337, -68.371895, 3.3486998, -10.579599, -70.5937, 6.7008, -10.595799, -70.5561, 6.6893, -10.4337, -68.371895, 0, -10.4337, -82.2434, 3.3486998, -10.579599, -79.3491, -0.0020999908, -10.5633, -79.3192, 0, -10.4337, -82.2434, 3.3446, -10.4337, -82.2434, 3.3486998, -10.579599, -79.3491, -0.0020999908, -10.5633, -70.6314, 3.3446, -10.4337, -68.371895, 0, -10.4337, -68.371895, -0.0020999908, -10.5633, -70.6314, 3.3486998, -10.579599, -70.5937, 3.3446, -10.4337, -68.371895, -3.3446002, -10.4337, -82.2434, -0.0020999908, -10.5633, -79.3192, -3.3514, -10.5471, -79.2893, -3.3446002, -10.4337, -82.2434, 0, -10.4337, -82.2434, -0.0020999908, -10.5633, -79.3192, -3.3514, -10.5471, -70.669, -6.6893, -10.4337, -68.371895, -6.6993003, -10.5309, -70.7066, -3.3514, -10.5471, -70.669, -3.3446002, -10.4337, -68.371895, -6.6893, -10.4337, -68.371895, -6.6893, -10.4337, -68.371895, -10.045801, -10.5146, -70.7442, -6.6993003, -10.5309, -70.7066, -6.6893, -10.4337, -68.371895, -10.033899, -10.4337, -68.371895, -10.045801, -10.5146, -70.7442, -6.6893, -10.4337, -82.2434, -3.3514, -10.5471, -79.2893, -6.6993003, -10.5309, -79.2594, -6.6893, -10.4337, -82.2434, -3.3446002, -10.4337, -82.2434, -3.3514, -10.5471, -79.2893, -10.033899, -10.4337, -82.2434, -6.6993003, -10.5309, -79.2594, -10.045801, -10.5146, -79.2295, -10.033899, -10.4337, -82.2434, -6.6893, -10.4337, -82.2434, -6.6993003, -10.5309, -79.2594, -10.033899, -10.4337, -68.371895, -13.3908, -10.4984, -70.7818, -10.045801, -10.5146, -70.7442, -10.033899, -10.4337, -68.371895, -13.378601, -10.4337, -68.371895, -13.3908, -10.4984, -70.7818, -13.378601, -10.4337, -82.2434, -10.045801, -10.5146, -79.2295, -13.3909, -10.4984, -79.1997, -13.378601, -10.4337, -82.2434, -10.033899, -10.4337, -82.2434, -10.045801, -10.5146, -79.2295, -13.378601, -10.4337, -68.371895, -16.734499, -10.4822, -70.8193, -13.3908, -10.4984, -70.7818, -13.378601, -10.4337, -68.371895, -16.7232, -10.4337, -68.371895, -16.734499, -10.4822, -70.8193, -16.7232, -10.4337, -68.371895, -20.0768, -10.466, -70.856895, -16.734499, -10.4822, -70.8193, -16.7232, -10.4337, -68.371895, -20.0679, -10.4337, -68.371895, -20.0768, -10.466, -70.856895, -16.7232, -10.4337, -82.2434, -13.3909, -10.4984, -79.1997, -16.734499, -10.4822, -79.1699, -16.7232, -10.4337, -82.2434, -13.378601, -10.4337, -82.2434, -13.3909, -10.4984, -79.1997, -20.0679, -10.4337, -68.371895, -23.4177, -10.4499, -70.8944, -20.0768, -10.466, -70.856895, -20.0679, -10.4337, -68.371895, -23.412498, -10.4337, -68.371895, -23.4177, -10.4499, -70.8944, -20.0679, -10.4337, -82.2434, -16.734499, -10.4822, -79.1699, -20.0768, -10.466, -79.14, -20.0679, -10.4337, -82.2434, -16.7232, -10.4337, -82.2434, -16.734499, -10.4822, -79.1699, -23.412498, -10.4337, -68.371895, -26.7572, -10.4337, -70.9319, -23.4177, -10.4499, -70.8944, -23.412498, -10.4337, -68.371895, -26.7572, -10.4337, -68.371895, -26.7572, -10.4337, -70.9319, -23.412498, -10.4337, -82.2434, -20.0768, -10.466, -79.14, -23.4177, -10.4499, -79.1102, -23.412498, -10.4337, -82.2434, -20.0679, -10.4337, -82.2434, -20.0768, -10.466, -79.14, 13.378599, -1.0746, 20.0679, 13.378599, -2.2719998, 23.3902, 10.033899, -0.501, 23.412498, 20.0679, -1.0746, 13.378601, 16.7232, -1.0746, 16.7232, 16.7232, -1.0746, 13.378601, 16.7232, -1.0746, 16.7232, 15.0508995, -1.0746, 20.0679, 13.378599, -1.0746, 20.0679, 16.7232, -1.0746, 16.7232, 16.7232, -1.8294, 20.0679, 15.0508995, -1.0746, 20.0679, 23.412498, -0.35529998, 10.033899, 23.412498, -1.8294, 13.378601, 20.0679, -1.0746, 13.378601, 10.501598, 0, 20.5087, 6.6893, 0, 20.0679, 10.080299, 0, 20.0679, 10.501598, 0, 20.5087, 6.6893, -0.2814, 23.412498, 6.6893, 0, 20.0679, -20.0679, 0, 13.378601, -16.7232, 0, 13.868401, -16.7232, -0.26209998, 16.7232, -20.0679, 0, 13.378601, -17.213, 0, 13.378601, -16.7232, 0, 13.868401, -16.7232, -0.26209998, 16.7232, -13.378601, 0, 16.7232, -13.378601, 0, 20.0679, -24.056599, 0, 10.033899, -25.9681, -0.2875, 13.378601, -26.0077, -0.2465, 10.033899, -25.9681, -0.2875, 13.378601, -24.056599, 0, 10.033899, -23.412498, 0, 10.6779995, -25.9681, -0.2875, 13.378601, -23.412498, 0, 10.6779995, -23.412498, 0, 13.378601, -23.8078, 0, 6.6893, -26.0077, -0.2465, 10.033899, -25.945799, -0.25779998, 6.6893, -26.0077, -0.2465, 10.033899, -23.8078, 0, 6.6893, -23.489, 0, 9.386499, -26.0077, -0.2465, 10.033899, -23.489, 0, 9.386499, -24.056599, 0, 10.033899, -25.4212, -0.5907, 16.7232, -23.412498, -0.692, 20.0679, -25.174, -0.7391, 20.0679, -25.479, -0.4588, 0.143, -23.412498, 0, 3.3446, -25.869999, -0.2764, 3.3446, -25.479, -0.4588, 0.143, -23.412498, -0.2913, 0.26119995, -23.412498, 0, 3.3446, -25.869999, -0.2764, 3.3446, -23.8078, 0, 6.6893, -25.945799, -0.25779998, 6.6893, -25.869999, -0.2764, 3.3446, -23.412498, 0, 3.3446, -23.8078, 0, 6.6893, -17.2383, -0.66719997, -19.6364, -20.0679, -0.43429998, -16.7232, -20.0679, -1.7572, -20.0679, -20.0679, -0.43429998, -16.7232, -20.0679, 0, -13.378599, -23.412498, 0, -13.378599, -9.318001, -0.3969, -19.413, -6.6893, -0.9271, -20.0679, -6.6893, 0, -16.7232, -6.6893, 0, -16.7232, -3.3446002, -0.9271, -16.7232, -3.3446002, 0, -13.7127, 16.7232, 0, -20.0679, 20.0679, -0.2837, -20.0679, 20.0679, 0, -16.7232, 13.378599, 0, -23.412498, 16.7232, -0.3105, -23.412498, 16.7232, 0, -20.0679, 20.0679, 0, -16.7232, 23.412498, -0.456, -16.7232, 23.412498, 0, -13.378599, 23.412498, 0, -6.6893, 23.412498, 0, -3.3446002, 22.5396, -0.014599999, -3.3446002, 15.0508995, -0.40039998, 16.7232, 13.378599, 0, 16.7232, 15.0508995, -0.6288, 13.378601, 14.439199, 0, 13.6437, 15.0508995, 0, 10.033899, 15.0508995, -0.6288, 13.378601, 15.0508995, 0, 10.033899, 14.439199, 0, 13.6437, 13.8046, 0, 13.2202, 15.0508995, 0, 10.033899, 13.8046, 0, 13.2202, 13.8046, 0, 10.033899, 3.0140998, 0, -16.7232, 3.3446, -0.3989, -12.9443, 0, 0, -13.378599, -23.412498, -0.692, 20.0679, -25.4212, -0.5907, 16.7232, -23.412498, -0.36479998, 16.7232, -23.412498, -0.692, 20.0679, -20.0679, -0.36479998, 20.0679, -20.0679, -0.5589, 23.412498, -16.7232, -0.36479998, 23.412498, -13.378601, -0.2814, 23.412498, -13.378601, -1.1209999, 26.7572, -20.0679, -0.36479998, 16.7232, -16.7232, -0.26209998, 16.7232, -16.7232, -0.36479998, 20.0679, -16.7232, -0.36479998, 20.0679, -13.378601, 0, 20.0679, -13.378601, -0.2814, 23.412498, -23.412498, -0.7373, 23.412498, -20.0679, -0.5589, 23.412498, -20.0679, -1.1374999, 26.7572, -25.174, -0.7391, 20.0679, -23.412498, -0.692, 20.0679, -23.412498, -0.7373, 23.412498, -20.0679, -0.5589, 23.412498, -16.7232, -0.36479998, 23.412498, -16.7232, -1.1374999, 26.7572, 26.7582, -1.7623999, 10.033899, 26.7582, -1.8294, 13.378601, 23.412498, -1.8294, 13.378601, 13.378599, 0, 16.7232, 14.439199, 0, 13.6437, 15.0508995, -0.6288, 13.378601, 13.378599, 0, 16.7232, 13.700699, 0, 14.602699, 14.439199, 0, 13.6437, 15.0508995, -0.6288, 13.378601, 15.0508995, 0, 10.033899, 16.7232, 0, 10.033899, 15.0508995, -0.40039998, 16.7232, 16.7232, -1.0746, 13.378601, 16.7232, -1.0746, 16.7232, 13.378599, 0, 16.7232, 13.378599, -1.0746, 20.0679, 11.0191, 0, 20.0679, 15.0508995, -0.40039998, 16.7232, 13.378599, -1.0746, 20.0679, 13.378599, 0, 16.7232, 20.0679, -0.2837, -20.0679, 23.412498, -1.0924, -20.0679, 23.412498, -0.456, -16.7232, 26.572199, -0.95549995, -13.659599, 23.412498, 0, -13.378599, 23.412498, -0.456, -16.7232, 13.378599, -0.8401, -26.7572, 16.7232, -1.3382, -26.7572, 16.7232, -0.3105, -23.412498, 16.7232, -0.3105, -23.412498, 20.0679, -0.8222, -23.412498, 20.0679, -0.2837, -20.0679, 16.7232, -1.3382, -26.7572, 13.378599, -0.8401, -26.7572, 13.378599, -1.582, -30.410397, 16.7232, -1.3382, -26.7572, 20.0679, -1.1922, -26.7572, 20.0679, -0.8222, -23.412498, 26.7577, -0.8804, -16.7232, 23.412498, -0.456, -16.7232, 23.412498, -1.0924, -20.0679, 20.0679, -0.8222, -23.412498, 23.412498, -1.0924, -23.412498, 23.412498, -1.0924, -20.0679, 3.3446, -0.3434, -23.412498, 0, -0.9271, -20.0679, 0, -0.9271, -23.412498, -10.033899, -0.9271, -23.412498, -6.6893, -1.3241999, -23.412498, -6.6893, -0.9271, -20.0679, 2.3184, 0, -20.4362, 0, -0.9271, -16.7232, 0, -0.9271, -20.0679, 39.877598, -3.6573, 23.412498, 36.078598, -3.0746999, 26.7572, 36.2121, -2.9357, 23.412498, 39.877598, -3.6573, 23.412498, 39.877598, -3.6573, 26.7572, 36.078598, -3.0746999, 26.7572, 52.997097, -8.1437, 23.412498, 49.5743, -6.9732, 26.7572, 49.5645, -6.9698997, 23.412498, 52.997097, -8.1437, 23.412498, 52.997097, -8.1437, 26.7572, 49.5743, -6.9732, 26.7572, 52.997097, -8.1437, 20.0679, 52.997097, -8.1437, 23.412498, 49.5645, -6.9698997, 23.412498, 49.5743, -6.9732, 26.7572, 46.556797, -5.9413, 23.412498, 49.5645, -6.9698997, 23.412498, 49.5743, -6.9732, 26.7572, 46.577698, -5.9484997, 26.7572, 46.556797, -5.9413, 23.412498, 52.997097, -8.1437, 20.0679, 49.5645, -6.9698997, 23.412498, 49.5547, -6.9665, 20.0679, 52.997097, -8.1437, 16.7232, 52.997097, -8.1437, 20.0679, 49.5547, -6.9665, 20.0679, 52.997097, -8.1437, 16.7232, 49.5547, -6.9665, 20.0679, 49.5449, -6.9631996, 16.7232, 49.5547, -6.9665, 20.0679, 46.5149, -5.927, 16.7232, 49.5449, -6.9631996, 16.7232, 49.5645, -6.9698997, 23.412498, 46.535797, -5.9342, 20.0679, 49.5547, -6.9665, 20.0679, 49.5547, -6.9665, 20.0679, 46.535797, -5.9342, 20.0679, 46.5149, -5.927, 16.7232, 49.5645, -6.9698997, 23.412498, 46.556797, -5.9413, 23.412498, 46.535797, -5.9342, 20.0679, 46.535797, -5.9342, 20.0679, 43.1641, -4.7812, 16.7232, 46.5149, -5.927, 16.7232, 46.535797, -5.9342, 20.0679, 43.1877, -4.7892, 20.0679, 43.1641, -4.7812, 16.7232, 46.556797, -5.9413, 23.412498, 43.1877, -4.7892, 20.0679, 46.535797, -5.9342, 20.0679, 43.1877, -4.7892, 20.0679, 39.877598, -3.6573, 16.7232, 43.1641, -4.7812, 16.7232, 43.1877, -4.7892, 20.0679, 39.877598, -3.6573, 20.0679, 39.877598, -3.6573, 16.7232, 46.556797, -5.9413, 23.412498, 43.2113, -4.7973, 23.412498, 43.1877, -4.7892, 20.0679, 43.2113, -4.7973, 23.412498, 39.877598, -3.6573, 20.0679, 43.1877, -4.7892, 20.0679, 46.577698, -5.9484997, 26.7572, 43.2113, -4.7973, 23.412498, 46.556797, -5.9413, 23.412498, 43.2113, -4.7973, 23.412498, 39.877598, -3.6573, 23.412498, 39.877598, -3.6573, 20.0679, 46.577698, -5.9484997, 26.7572, 43.234898, -4.8054, 26.7572, 43.2113, -4.7973, 23.412498, 43.234898, -4.8054, 26.7572, 39.877598, -3.6573, 23.412498, 43.2113, -4.7973, 23.412498, 43.234898, -4.8054, 26.7572, 39.877598, -3.6573, 26.7572, 39.877598, -3.6573, 23.412498, 39.877598, -3.6573, 20.0679, 36.2121, -2.9357, 23.412498, 36.2075, -2.9348, 20.0679, 39.877598, -3.6573, 20.0679, 39.877598, -3.6573, 23.412498, 36.2121, -2.9357, 23.412498, 39.877598, -3.6573, 16.7232, 39.877598, -3.6573, 20.0679, 36.2075, -2.9348, 20.0679, 39.877598, -3.6573, 16.7232, 36.2075, -2.9348, 20.0679, 36.2028, -2.9338999, 16.7232, 39.877598, -3.7507, 13.378601, 36.2028, -2.9338999, 16.7232, 36.1422, -2.9887998, 13.378601, 39.877598, -3.7507, 13.378601, 39.877598, -3.6573, 16.7232, 36.2028, -2.9338999, 16.7232, 52.997097, -8.1437, 13.378601, 49.5449, -6.9631996, 16.7232, 49.520397, -6.9795, 13.378601, 52.997097, -8.1437, 13.378601, 52.997097, -8.1437, 16.7232, 49.5449, -6.9631996, 16.7232, 39.877598, -3.7507, 10.033899, 36.1422, -2.9887998, 13.378601, 36.153297, -2.972, 10.033899, 39.877598, -3.7507, 10.033899, 39.877598, -3.7507, 13.378601, 36.1422, -2.9887998, 13.378601, 52.997097, -8.1437, 10.033899, 49.520397, -6.9795, 13.378601, 49.510597, -6.9763, 10.033899, 52.997097, -8.1437, 10.033899, 52.997097, -8.1437, 13.378601, 49.520397, -6.9795, 13.378601, 52.997097, -8.1437, 6.6893, 52.997097, -8.1437, 10.033899, 49.510597, -6.9763, 10.033899, 49.520397, -6.9795, 13.378601, 46.4435, -5.9493, 10.033899, 49.510597, -6.9763, 10.033899, 49.520397, -6.9795, 13.378601, 46.4646, -5.9563, 13.378601, 46.4435, -5.9493, 10.033899, 52.997097, -8.1437, 6.6893, 49.510597, -6.9763, 10.033899, 49.500698, -6.973, 6.6893, 52.997097, -8.1437, 3.3446, 52.997097, -8.1437, 6.6893, 49.500698, -6.973, 6.6893, 49.510597, -6.9763, 10.033899, 46.4435, -5.9493, 10.033899, 46.4225, -5.9421997, 6.6893, 49.510597, -6.9763, 10.033899, 46.4225, -5.9421997, 6.6893, 49.500698, -6.973, 6.6893, 46.4646, -5.9563, 13.378601, 43.0695, -4.8195, 10.033899, 46.4435, -5.9493, 10.033899, 46.4646, -5.9563, 13.378601, 43.0932, -4.8275, 13.378601, 43.0695, -4.8195, 10.033899, 43.0932, -4.8275, 13.378601, 39.877598, -3.7507, 10.033899, 43.0695, -4.8195, 10.033899, 43.0932, -4.8275, 13.378601, 39.877598, -3.7507, 13.378601, 39.877598, -3.7507, 10.033899, 43.0695, -4.8195, 10.033899, 39.877598, -3.7507, 10.033899, 39.877598, -3.7507, 6.6893, 46.4435, -5.9493, 10.033899, 43.0695, -4.8195, 10.033899, 43.0458, -4.8115997, 6.6893, 43.0695, -4.8195, 10.033899, 39.877598, -3.7507, 6.6893, 43.0458, -4.8115997, 6.6893, 46.4435, -5.9493, 10.033899, 43.0458, -4.8115997, 6.6893, 46.4225, -5.9421997, 6.6893, 43.0458, -4.8115997, 6.6893, 39.877598, -3.7507, 6.6893, 39.877598, -3.7507, 3.3446, 43.0458, -4.8115997, 6.6893, 39.877598, -3.7507, 3.3446, 43.0221, -4.8036, 3.3446, 46.4225, -5.9421997, 6.6893, 43.0458, -4.8115997, 6.6893, 43.0221, -4.8036, 3.3446, 43.0221, -4.8036, 3.3446, 39.877598, -3.7507, 3.3446, 39.877598, -3.7507, 0, 46.4225, -5.9421997, 6.6893, 43.0221, -4.8036, 3.3446, 46.4015, -5.9351997, 3.3446, 49.500698, -6.973, 6.6893, 46.4225, -5.9421997, 6.6893, 46.4015, -5.9351997, 3.3446, 43.0221, -4.8036, 3.3446, 39.877598, -3.7507, 0, 42.998398, -4.7957, 0, 46.4015, -5.9351997, 3.3446, 43.0221, -4.8036, 3.3446, 42.998398, -4.7957, 0, 42.998398, -4.7957, 0, 39.877598, -3.7507, 0, 39.877598, -3.7507, -3.3446002, 49.500698, -6.973, 6.6893, 46.4015, -5.9351997, 3.3446, 49.4909, -6.9697, 3.3446, 52.997097, -8.1437, 3.3446, 49.500698, -6.973, 6.6893, 49.4909, -6.9697, 3.3446, 52.997097, -8.1437, 0, 52.997097, -8.1437, 3.3446, 49.4909, -6.9697, 3.3446, 49.4909, -6.9697, 3.3446, 46.4015, -5.9351997, 3.3446, 46.380398, -5.9282, 0, 46.4015, -5.9351997, 3.3446, 42.998398, -4.7957, 0, 46.380398, -5.9282, 0, 52.997097, -8.1437, 0, 49.4909, -6.9697, 3.3446, 49.4811, -6.9663997, 0, 49.4909, -6.9697, 3.3446, 46.380398, -5.9282, 0, 49.4811, -6.9663997, 0, 52.997097, -8.1437, -3.3446002, 52.997097, -8.1437, 0, 49.4811, -6.9663997, 0, 42.998398, -4.7957, 0, 39.877598, -3.7507, -3.3446002, 42.974697, -4.7878, -3.3446002, 46.380398, -5.9282, 0, 42.998398, -4.7957, 0, 42.974697, -4.7878, -3.3446002, 42.974697, -4.7878, -3.3446002, 39.877598, -3.7507, -3.3446002, 39.877598, -3.7507, -6.6893, 42.974697, -4.7878, -3.3446002, 39.877598, -3.7507, -6.6893, 42.951, -4.7798, -6.6893, 46.380398, -5.9282, 0, 42.974697, -4.7878, -3.3446002, 46.359398, -5.9210997, -3.3446002, 46.359398, -5.9210997, -3.3446002, 42.974697, -4.7878, -3.3446002, 42.951, -4.7798, -6.6893, 49.4811, -6.9663997, 0, 46.380398, -5.9282, 0, 46.359398, -5.9210997, -3.3446002, 46.359398, -5.9210997, -3.3446002, 42.951, -4.7798, -6.6893, 46.338398, -5.9140997, -6.6893, 52.997097, -8.1437, -3.3446002, 49.4811, -6.9663997, 0, 49.4712, -6.9631, -3.3446002, 49.4811, -6.9663997, 0, 46.359398, -5.9210997, -3.3446002, 49.4712, -6.9631, -3.3446002, 49.4712, -6.9631, -3.3446002, 46.359398, -5.9210997, -3.3446002, 46.338398, -5.9140997, -6.6893, 52.997097, -8.1437, -6.6893, 52.997097, -8.1437, -3.3446002, 49.4712, -6.9631, -3.3446002, 49.4712, -6.9631, -3.3446002, 46.338398, -5.9140997, -6.6893, 49.4614, -6.9598, -6.6893, 52.997097, -8.1437, -6.6893, 49.4712, -6.9631, -3.3446002, 49.4614, -6.9598, -6.6893, 39.877598, -3.7507, 6.6893, 36.153297, -2.972, 10.033899, 36.1898, -2.9299998, 6.6893, 39.877598, -3.7507, 6.6893, 39.877598, -3.7507, 10.033899, 36.153297, -2.972, 10.033899, 39.877598, -3.7507, 3.3446, 36.1898, -2.9299998, 6.6893, 36.2081, -2.9062, 3.3446, 39.877598, -3.7507, 3.3446, 39.877598, -3.7507, 6.6893, 36.1898, -2.9299998, 6.6893, 39.877598, -3.7507, 0, 36.2081, -2.9062, 3.3446, 36.211597, -2.8971, 0, 39.877598, -3.7507, 0, 39.877598, -3.7507, 3.3446, 36.2081, -2.9062, 3.3446, 39.877598, -3.7507, -3.3446002, 36.211597, -2.8971, 0, 36.2533, -2.8497999, -3.3446002, 39.877598, -3.7507, -3.3446002, 39.877598, -3.7507, 0, 36.211597, -2.8971, 0, 39.877598, -3.7507, -6.6893, 36.2533, -2.8497999, -3.3446002, 36.2803, -2.8172998, -6.6893, 39.877598, -3.7507, -6.6893, 39.877598, -3.7507, -3.3446002, 36.2533, -2.8497999, -3.3446002, 52.997097, -8.1437, -10.033899, 49.4614, -6.9598, -6.6893, 49.4666, -6.9364, -10.033899, 52.997097, -8.1437, -10.033899, 52.997097, -8.1437, -6.6893, 49.4614, -6.9598, -6.6893, 39.877598, -3.6573, -10.033899, 36.2803, -2.8172998, -6.6893, 36.3083, -2.7835999, -10.109299, 39.877598, -3.6573, -10.033899, 39.877598, -3.7507, -6.6893, 36.2803, -2.8172998, -6.6893, 39.877598, -3.6573, -13.378599, 36.3083, -2.7835999, -10.109299, 36.1797, -2.9064, -13.456699, 39.877598, -3.6573, -13.378599, 39.877598, -3.6573, -10.033899, 36.3083, -2.7835999, -10.109299, 39.877598, -3.6573, -16.7232, 36.1797, -2.9064, -13.456699, 36.2015, -2.8792, -16.7232, 39.877598, -3.6573, -16.7232, 39.877598, -3.6573, -13.378599, 36.1797, -2.9064, -13.456699, 39.877598, -3.6573, -20.0679, 36.2015, -2.8792, -16.7232, 36.1471, -2.928, -20.0679, 39.877598, -3.6573, -20.0679, 39.877598, -3.6573, -16.7232, 36.2015, -2.8792, -16.7232, 39.877598, -3.6573, -23.412498, 42.8416, -4.6944, -26.7572, 42.881, -4.6844, -23.412498, 39.877598, -3.6573, -23.412498, 39.877598, -3.6808999, -26.7572, 42.8416, -4.6944, -26.7572, 42.8416, -4.6944, -26.7572, 46.2636, -5.8410997, -23.412498, 42.881, -4.6844, -23.412498, 42.8416, -4.6944, -26.7572, 46.2278, -5.8524, -26.7572, 46.2636, -5.8410997, -23.412498, 46.2278, -5.8524, -26.7572, 49.427498, -6.923, -23.412498, 46.2636, -5.8410997, -23.412498, 46.2278, -5.8524, -26.7572, 49.4036, -6.9384, -26.7572, 49.427498, -6.923, -23.412498, 49.4036, -6.9384, -26.7572, 52.997097, -8.1437, -23.412498, 49.427498, -6.923, -23.412498, 49.4036, -6.9384, -26.7572, 52.997097, -8.1672, -26.7572, 52.997097, -8.1437, -23.412498, 52.997097, -8.1437, -23.412498, 56.4827, -8.7755995, -26.7572, 56.4571, -8.7476, -23.412498, 52.997097, -8.1437, -23.412498, 52.997097, -8.1672, -26.7572, 56.4827, -8.7755995, -26.7572, 56.4827, -8.7755995, -26.7572, 59.414497, -9.2638, -23.412498, 56.4571, -8.7476, -23.412498, 56.4827, -8.7755995, -26.7572, 59.4335, -9.2907, -26.7572, 59.414497, -9.2638, -23.412498, 59.4335, -9.2907, -26.7572, 62.3756, -9.7807, -23.412498, 59.414497, -9.2638, -23.412498, 59.4335, -9.2907, -26.7572, 62.356697, -9.8008995, -26.7572, 62.3756, -9.7807, -23.412498, 62.356697, -9.8008995, -26.7572, 66.1166, -10.4337, -23.412498, 62.3756, -9.7807, -23.412498, 62.356697, -9.8008995, -26.7572, 66.1166, -10.4572, -26.7572, 66.1166, -10.4337, -23.412498, 39.877598, -3.6573, -23.412498, 36.1471, -2.928, -20.0679, 36.1424, -2.9269998, -23.412498, 39.877598, -3.6573, -23.412498, 39.877598, -3.6573, -20.0679, 36.1471, -2.928, -20.0679, 36.1471, -2.928, -20.0679, 33.0948, -2.3312, -23.412498, 36.1424, -2.9269998, -23.412498, 36.1471, -2.928, -20.0679, 33.1148, -2.3351, -20.0679, 33.0948, -2.3312, -23.412498, 33.1148, -2.3351, -20.0679, 29.564798, -1.6410999, -23.412498, 33.0948, -2.3312, -23.412498, 33.1148, -2.3351, -20.0679, 29.562698, -1.6407, -20.0679, 29.564798, -1.6410999, -23.412498, 29.562698, -1.6407, -20.0679, 26.7582, -1.0924, -23.412498, 29.564798, -1.6410999, -23.412498, 29.562698, -1.6407, -20.0679, 26.7582, -1.0924, -20.0679, 26.7582, -1.0924, -23.412498, 29.6302, -1.5764999, -13.594999, 26.7577, -0.8804, -16.7232, 29.7123, -1.5057, -16.7232, 29.6302, -1.5764999, -13.594999, 26.572199, -0.95549995, -13.659599, 26.7577, -0.8804, -16.7232, 30.0488, -1.2003, -6.6893, 26.572199, -0.4003, -10.314899, 30.0059, -1.2408999, -10.242399, 30.0488, -1.2003, -6.6893, 26.7577, -0.3464, -6.6893, 26.572199, -0.4003, -10.314899, 29.536499, -2.2303, 13.378601, 26.7582, -1.7623999, 10.033899, 29.586699, -2.188, 10.033899, 29.536499, -2.2303, 13.378601, 26.7582, -1.8294, 13.378601, 26.7582, -1.7623999, 10.033899, 29.8112, -1.4067, 0, 26.7577, -0.4894, -3.3446002, 29.9525, -1.2836, -3.3446002, 29.8112, -1.4067, 0, 26.7577, -0.6956, 0, 26.7577, -0.4894, -3.3446002, 29.550499, -2.2133, 20.0679, 26.7582, -1.8294, 16.7232, 29.552599, -2.2137, 16.7232, 29.550499, -2.2133, 20.0679, 26.7582, -1.8294, 20.0679, 26.7582, -1.8294, 16.7232, 29.3928, -1.796, -26.7572, 33.0948, -2.3312, -23.412498, 29.564798, -1.6410999, -23.412498, 29.3928, -1.796, -26.7572, 32.9589, -2.4371, -26.7572, 33.0948, -2.3312, -23.412498, 29.7136, -1.4886999, 6.6893, 26.7577, -0.73109996, 3.3446, 29.7848, -1.4277999, 3.3446, 29.7136, -1.4886999, 6.6893, 26.7582, -0.83089995, 6.6893, 26.7577, -0.73109996, 3.3446, 29.1145, -2.5956, 26.7572, 26.7582, -2.2719998, 23.3902, 29.548399, -2.2129, 23.412498, 29.1145, -2.5956, 26.7572, 26.7582, -2.7837, 26.6955, 26.7582, -2.2719998, 23.3902, 29.7123, -1.5057, -16.7232, 26.7582, -1.0924, -20.0679, 29.562698, -1.6407, -20.0679, 29.7123, -1.5057, -16.7232, 26.7577, -0.8804, -16.7232, 26.7582, -1.0924, -20.0679, 30.0059, -1.2408999, -10.242399, 26.572199, -0.95549995, -13.659599, 29.6302, -1.5764999, -13.594999, 30.0059, -1.2408999, -10.242399, 26.572199, -0.4003, -10.314899, 26.572199, -0.95549995, -13.659599, 29.586699, -2.188, 10.033899, 26.7582, -0.83089995, 6.6893, 29.7136, -1.4886999, 6.6893, 29.586699, -2.188, 10.033899, 26.7582, -1.7623999, 10.033899, 26.7582, -0.83089995, 6.6893, 29.9525, -1.2836, -3.3446002, 26.7577, -0.3464, -6.6893, 30.0488, -1.2003, -6.6893, 29.9525, -1.2836, -3.3446002, 26.7577, -0.4894, -3.3446002, 26.7577, -0.3464, -6.6893, 29.552599, -2.2137, 16.7232, 26.7582, -1.8294, 13.378601, 29.536499, -2.2303, 13.378601, 29.552599, -2.2137, 16.7232, 26.7582, -1.8294, 16.7232, 26.7582, -1.8294, 13.378601, 29.7848, -1.4277999, 3.3446, 26.7577, -0.6956, 0, 29.8112, -1.4067, 0, 29.7848, -1.4277999, 3.3446, 26.7577, -0.73109996, 3.3446, 26.7577, -0.6956, 0, 29.548399, -2.2129, 23.412498, 26.7582, -1.8294, 20.0679, 29.550499, -2.2133, 20.0679, 29.548399, -2.2129, 23.412498, 26.7582, -2.2719998, 23.3902, 26.7582, -1.8294, 20.0679, 33.1982, -2.3009999, -13.5196, 29.7123, -1.5057, -16.7232, 33.2289, -2.25, -16.7232, 33.1982, -2.3009999, -13.5196, 29.6302, -1.5764999, -13.594999, 29.7123, -1.5057, -16.7232, 33.4719, -2.0886, -6.6893, 30.0059, -1.2408999, -10.242399, 33.4514, -2.0843, -10.169699, 33.4719, -2.0886, -6.6893, 30.0488, -1.2003, -6.6893, 30.0059, -1.2408999, -10.242399, 33.2822, -2.9943, 13.378601, 29.586699, -2.188, 10.033899, 33.2915, -2.9626, 10.033899, 33.2822, -2.9943, 13.378601, 29.536499, -2.2303, 13.378601, 29.586699, -2.188, 10.033899, 33.3661, -2.2345, 0, 29.9525, -1.2836, -3.3446002, 33.4326, -2.1487, -3.3446002, 33.3661, -2.2345, 0, 29.8112, -1.4067, 0, 29.9525, -1.2836, -3.3446002, 33.3628, -2.9636998, 20.0679, 29.552599, -2.2137, 16.7232, 33.3428, -2.9598, 16.7232, 33.3628, -2.9636998, 20.0679, 29.550499, -2.2133, 20.0679, 29.552599, -2.2137, 16.7232, 33.3828, -2.9677, 23.412498, 29.550499, -2.2133, 20.0679, 33.3628, -2.9636998, 20.0679, 33.3828, -2.9677, 23.412498, 29.548399, -2.2129, 23.412498, 29.550499, -2.2133, 20.0679, 33.347797, -2.2975, 6.6893, 29.7848, -1.4277999, 3.3446, 33.370598, -2.2531, 3.3446, 33.347797, -2.2975, 6.6893, 29.7136, -1.4886999, 6.6893, 29.7848, -1.4277999, 3.3446, 33.146698, -3.214, 26.7572, 29.548399, -2.2129, 23.412498, 33.3828, -2.9677, 23.412498, 33.146698, -3.214, 26.7572, 29.1145, -2.5956, 26.7572, 29.548399, -2.2129, 23.412498, 33.2289, -2.25, -16.7232, 29.562698, -1.6407, -20.0679, 33.1148, -2.3351, -20.0679, 33.2289, -2.25, -16.7232, 29.7123, -1.5057, -16.7232, 29.562698, -1.6407, -20.0679, 32.9589, -2.4371, -26.7572, 36.1424, -2.9269998, -23.412498, 33.0948, -2.3312, -23.412498, 32.9589, -2.4371, -26.7572, 36.0678, -2.9959998, -26.7572, 36.1424, -2.9269998, -23.412498, 33.4514, -2.0843, -10.169699, 29.6302, -1.5764999, -13.594999, 33.1982, -2.3009999, -13.5196, 33.4514, -2.0843, -10.169699, 30.0059, -1.2408999, -10.242399, 29.6302, -1.5764999, -13.594999, 33.2915, -2.9626, 10.033899, 29.7136, -1.4886999, 6.6893, 33.347797, -2.2975, 6.6893, 33.2915, -2.9626, 10.033899, 29.586699, -2.188, 10.033899, 29.7136, -1.4886999, 6.6893, 33.4326, -2.1487, -3.3446002, 30.0488, -1.2003, -6.6893, 33.4719, -2.0886, -6.6893, 33.4326, -2.1487, -3.3446002, 29.9525, -1.2836, -3.3446002, 30.0488, -1.2003, -6.6893, 33.3428, -2.9598, 16.7232, 29.536499, -2.2303, 13.378601, 33.2822, -2.9943, 13.378601, 33.3428, -2.9598, 16.7232, 29.552599, -2.2137, 16.7232, 29.536499, -2.2303, 13.378601, 33.370598, -2.2531, 3.3446, 29.8112, -1.4067, 0, 33.3661, -2.2345, 0, 33.370598, -2.2531, 3.3446, 29.7848, -1.4277999, 3.3446, 29.8112, -1.4067, 0, 36.1797, -2.9064, -13.456699, 33.2289, -2.25, -16.7232, 36.2015, -2.8792, -16.7232, 36.1797, -2.9064, -13.456699, 33.1982, -2.3009999, -13.5196, 33.2289, -2.25, -16.7232, 36.2803, -2.8172998, -6.6893, 33.4514, -2.0843, -10.169699, 36.3083, -2.7835999, -10.109299, 36.2803, -2.8172998, -6.6893, 33.4719, -2.0886, -6.6893, 33.4514, -2.0843, -10.169699, 36.1422, -2.9887998, 13.378601, 33.2915, -2.9626, 10.033899, 36.153297, -2.972, 10.033899, 36.1422, -2.9887998, 13.378601, 33.2822, -2.9943, 13.378601, 33.2915, -2.9626, 10.033899, 36.211597, -2.8971, 0, 33.4326, -2.1487, -3.3446002, 36.2533, -2.8497999, -3.3446002, 36.211597, -2.8971, 0, 33.3661, -2.2345, 0, 33.4326, -2.1487, -3.3446002, 36.2075, -2.9348, 20.0679, 33.3428, -2.9598, 16.7232, 36.2028, -2.9338999, 16.7232, 36.2075, -2.9348, 20.0679, 33.3628, -2.9636998, 20.0679, 33.3428, -2.9598, 16.7232, 36.153297, -2.972, 10.033899, 33.347797, -2.2975, 6.6893, 36.1898, -2.9299998, 6.6893, 36.153297, -2.972, 10.033899, 33.2915, -2.9626, 10.033899, 33.347797, -2.2975, 6.6893, 36.1898, -2.9299998, 6.6893, 33.370598, -2.2531, 3.3446, 36.2081, -2.9062, 3.3446, 36.1898, -2.9299998, 6.6893, 33.347797, -2.2975, 6.6893, 33.370598, -2.2531, 3.3446, 36.078598, -3.0746999, 26.7572, 33.3828, -2.9677, 23.412498, 36.2121, -2.9357, 23.412498, 36.078598, -3.0746999, 26.7572, 33.146698, -3.214, 26.7572, 33.3828, -2.9677, 23.412498, 36.2015, -2.8792, -16.7232, 33.1148, -2.3351, -20.0679, 36.1471, -2.928, -20.0679, 36.2015, -2.8792, -16.7232, 33.2289, -2.25, -16.7232, 33.1148, -2.3351, -20.0679, 36.3083, -2.7835999, -10.109299, 33.1982, -2.3009999, -13.5196, 36.1797, -2.9064, -13.456699, 36.3083, -2.7835999, -10.109299, 33.4514, -2.0843, -10.169699, 33.1982, -2.3009999, -13.5196, 36.0678, -2.9959998, -26.7572, 39.877598, -3.6573, -23.412498, 36.1424, -2.9269998, -23.412498, 36.0678, -2.9959998, -26.7572, 39.877598, -3.6808999, -26.7572, 39.877598, -3.6573, -23.412498, 36.2533, -2.8497999, -3.3446002, 33.4719, -2.0886, -6.6893, 36.2803, -2.8172998, -6.6893, 36.2533, -2.8497999, -3.3446002, 33.4326, -2.1487, -3.3446002, 33.4719, -2.0886, -6.6893, 36.2028, -2.9338999, 16.7232, 33.2822, -2.9943, 13.378601, 36.1422, -2.9887998, 13.378601, 36.2028, -2.9338999, 16.7232, 33.3428, -2.9598, 16.7232, 33.2822, -2.9943, 13.378601, 36.2081, -2.9062, 3.3446, 33.3661, -2.2345, 0, 36.211597, -2.8971, 0, 36.2081, -2.9062, 3.3446, 33.370598, -2.2531, 3.3446, 33.3661, -2.2345, 0, 36.2121, -2.9357, 23.412498, 33.3628, -2.9636998, 20.0679, 36.2075, -2.9348, 20.0679, 36.2121, -2.9357, 23.412498, 33.3828, -2.9677, 23.412498, 33.3628, -2.9636998, 20.0679, 42.951, -4.7798, -6.6893, 39.877598, -3.6573, -10.033899, 42.9754, -4.7166, -10.033899, 42.951, -4.7798, -6.6893, 39.877598, -3.7507, -6.6893, 39.877598, -3.6573, -10.033899, 43.1641, -4.7812, 16.7232, 39.877598, -3.7507, 13.378601, 43.0932, -4.8275, 13.378601, 43.1641, -4.7812, 16.7232, 39.877598, -3.6573, 16.7232, 39.877598, -3.7507, 13.378601, 46.338398, -5.9140997, -6.6893, 42.9754, -4.7166, -10.033899, 46.3474, -5.8697, -10.033899, 46.338398, -5.9140997, -6.6893, 42.951, -4.7798, -6.6893, 42.9754, -4.7166, -10.033899, 46.5149, -5.927, 16.7232, 43.0932, -4.8275, 13.378601, 46.4646, -5.9563, 13.378601, 46.5149, -5.927, 16.7232, 43.1641, -4.7812, 16.7232, 43.0932, -4.8275, 13.378601, 49.4614, -6.9598, -6.6893, 46.3474, -5.8697, -10.033899, 49.4666, -6.9364, -10.033899, 49.4614, -6.9598, -6.6893, 46.338398, -5.9140997, -6.6893, 46.3474, -5.8697, -10.033899, 49.5449, -6.9631996, 16.7232, 46.4646, -5.9563, 13.378601, 49.520397, -6.9795, 13.378601, 49.5449, -6.9631996, 16.7232, 46.5149, -5.927, 16.7232, 46.4646, -5.9563, 13.378601, -23.412498, -3.8518999, 39.456898, -26.7572, -3.2777, 36.6322, -23.412498, -3.2477999, 36.6305, -23.412498, -3.8518999, 39.456898, -26.7572, -3.8518999, 39.456898, -26.7572, -3.2777, 36.6322, -16.7232, -3.8518999, 39.456898, -13.378601, -3.243, 36.6252, -13.378601, -3.8518999, 39.456898, -16.7232, -3.8518999, 39.456898, -16.7232, -3.247, 36.6269, -13.378601, -3.243, 36.6252, -13.378601, -1.1209999, 26.7572, -10.033899, -1.8925999, 30.345499, -13.378601, -1.8938999, 30.3512, -10.033899, -1.8925999, 30.345499, -13.378601, -2.619, 33.7235, -13.378601, -1.8938999, 30.3512, -13.378601, -1.1209999, 26.7572, -10.033899, -1.1209999, 26.7572, -10.033899, -1.8925999, 30.345499, -10.033899, -1.8925999, 30.345499, -10.033899, -2.6181998, 33.7199, -13.378601, -2.619, 33.7235, -10.033899, -2.6181998, 33.7199, -13.378601, -3.243, 36.6252, -13.378601, -2.619, 33.7235, -10.033899, -1.1209999, 26.7572, -6.6893, -1.8914, 30.3399, -10.033899, -1.8925999, 30.345499, -6.6893, -1.8914, 30.3399, -10.033899, -2.6181998, 33.7199, -10.033899, -1.8925999, 30.345499, -10.033899, -1.1209999, 26.7572, -6.6893, -1.1209999, 26.7572, -6.6893, -1.8914, 30.3399, -10.033899, -2.6181998, 33.7199, -10.033899, -3.2426, 36.623398, -13.378601, -3.243, 36.6252, -10.033899, -3.2426, 36.623398, -13.378601, -3.8518999, 39.456898, -13.378601, -3.243, 36.6252, -10.033899, -3.2426, 36.623398, -10.033899, -3.8518999, 39.456898, -13.378601, -3.8518999, 39.456898, -6.6893, -2.6174998, 33.7163, -10.033899, -3.2426, 36.623398, -10.033899, -2.6181998, 33.7199, -6.6893, -1.8914, 30.3399, -6.6893, -2.6174998, 33.7163, -10.033899, -2.6181998, 33.7199, -6.6893, -3.2422, 36.6217, -10.033899, -3.8518999, 39.456898, -10.033899, -3.2426, 36.623398, -6.6893, -2.6174998, 33.7163, -6.6893, -3.2422, 36.6217, -10.033899, -3.2426, 36.623398, -6.6893, -3.2422, 36.6217, -6.6893, -3.8518999, 39.456898, -10.033899, -3.8518999, 39.456898, -3.3446002, -1.8901999, 30.3342, -6.6893, -2.6174998, 33.7163, -6.6893, -1.8914, 30.3399, -6.6893, -1.1209999, 26.7572, -3.3446002, -1.8901999, 30.3342, -6.6893, -1.8914, 30.3399, -6.6893, -1.1209999, 26.7572, -3.3446002, -1.1209999, 26.7572, -3.3446002, -1.8901999, 30.3342, -3.3446002, -1.8901999, 30.3342, -3.3446002, -2.6167, 33.7128, -6.6893, -2.6174998, 33.7163, -3.3446002, -2.6167, 33.7128, -6.6893, -3.2422, 36.6217, -6.6893, -2.6174998, 33.7163, -3.3446002, -1.1209999, 26.7572, 0, -1.8889999, 30.3286, -3.3446002, -1.8901999, 30.3342, 0, -1.8889999, 30.3286, -3.3446002, -2.6167, 33.7128, -3.3446002, -1.8901999, 30.3342, -3.3446002, -1.1209999, 26.7572, 0, -1.1209999, 26.7572, 0, -1.8889999, 30.3286, -3.3446002, -3.2417998, 36.6199, -6.6893, -3.8518999, 39.456898, -6.6893, -3.2422, 36.6217, -3.3446002, -2.6167, 33.7128, -3.3446002, -3.2417998, 36.6199, -6.6893, -3.2422, 36.6217, -3.3446002, -3.2417998, 36.6199, -3.3446002, -3.8518999, 39.456898, -6.6893, -3.8518999, 39.456898, 0, -1.8889999, 30.3286, 0, -2.616, 33.709198, -3.3446002, -2.6167, 33.7128, 0, -2.616, 33.709198, -3.3446002, -3.2417998, 36.6199, -3.3446002, -2.6167, 33.7128, 0, -1.1209999, 26.7572, 3.3446, -1.8878, 30.323, 0, -1.8889999, 30.3286, 3.3446, -1.8878, 30.323, 0, -2.616, 33.709198, 0, -1.8889999, 30.3286, 0, -1.1209999, 26.7572, 3.3446, -1.1209999, 26.7572, 3.3446, -1.8878, 30.323, 0, -3.2415, 36.6182, -3.3446002, -3.8518999, 39.456898, -3.3446002, -3.2417998, 36.6199, 0, -2.616, 33.709198, 0, -3.2415, 36.6182, -3.3446002, -3.2417998, 36.6199, 0, -3.2415, 36.6182, 0, -3.8518999, 39.456898, -3.3446002, -3.8518999, 39.456898, 3.3446, -1.8878, 30.323, 3.3446, -2.6152, 33.7057, 0, -2.616, 33.709198, 3.3446, -2.6152, 33.7057, 0, -3.2415, 36.6182, 0, -2.616, 33.709198, 3.3446, -1.1209999, 26.7572, 6.6893, -1.8865999, 30.317299, 3.3446, -1.8878, 30.323, 6.6893, -1.8865999, 30.317299, 3.3446, -2.6152, 33.7057, 3.3446, -1.8878, 30.323, 3.3446, -1.1209999, 26.7572, 6.6893, -1.1209999, 26.7572, 6.6893, -1.8865999, 30.317299, 6.6893, -1.1209999, 26.7572, 10.033899, -1.8853999, 30.311699, 6.6893, -1.8865999, 30.317299, 6.6893, -1.1209999, 26.7572, 10.033899, -1.1209999, 26.7572, 10.033899, -1.8853999, 30.311699, 10.033899, -1.8853999, 30.311699, 6.6893, -2.6144, 33.7021, 6.6893, -1.8865999, 30.317299, 6.6893, -1.8865999, 30.317299, 6.6893, -2.6144, 33.7021, 3.3446, -2.6152, 33.7057, 10.033899, -1.8853999, 30.311699, 10.033899, -2.6137, 33.6986, 6.6893, -2.6144, 33.7021, 3.3446, -2.6152, 33.7057, 3.3446, -3.2410998, 36.616398, 0, -3.2415, 36.6182, 3.3446, -3.2410998, 36.616398, 0, -3.8518999, 39.456898, 0, -3.2415, 36.6182, 6.6893, -2.6144, 33.7021, 3.3446, -3.2410998, 36.616398, 3.3446, -2.6152, 33.7057, 3.3446, -3.2410998, 36.616398, 3.3446, -3.8518999, 39.456898, 0, -3.8518999, 39.456898, 10.033899, -2.6137, 33.6986, 6.6893, -3.2407, 36.6147, 6.6893, -2.6144, 33.7021, 6.6893, -2.6144, 33.7021, 6.6893, -3.2407, 36.6147, 3.3446, -3.2410998, 36.616398, 6.6893, -3.2407, 36.6147, 3.3446, -3.8518999, 39.456898, 3.3446, -3.2410998, 36.616398, 10.033899, -2.6137, 33.6986, 10.033899, -3.2403, 36.6129, 6.6893, -3.2407, 36.6147, 6.6893, -3.2407, 36.6147, 6.6893, -3.8518999, 39.456898, 3.3446, -3.8518999, 39.456898, 10.033899, -3.2403, 36.6129, 6.6893, -3.8518999, 39.456898, 6.6893, -3.2407, 36.6147, 10.033899, -3.2403, 36.6129, 10.033899, -3.8518999, 39.456898, 6.6893, -3.8518999, 39.456898, 10.033899, -1.1209999, 26.7572, 13.378599, -2.6734, 30.306, 10.033899, -1.8853999, 30.311699, 10.033899, -1.1209999, 26.7572, 13.378599, -2.2194998, 26.781, 13.378599, -2.6734, 30.306, 13.378599, -2.2194998, 26.781, 16.7232, -2.6727, 30.3004, 13.378599, -2.6734, 30.306, 16.7232, -2.6727, 30.3004, 13.378599, -3.1099, 33.695, 13.378599, -2.6734, 30.306, 13.378599, -2.2194998, 26.781, 16.7232, -2.2194998, 26.781, 16.7232, -2.6727, 30.3004, 16.7232, -2.6727, 30.3004, 16.7232, -3.1094, 33.691498, 13.378599, -3.1099, 33.695, 16.7232, -3.1094, 33.691498, 13.378599, -3.4854, 36.6112, 13.378599, -3.1099, 33.695, 16.7232, -2.2194998, 26.781, 20.0679, -2.672, 30.294699, 16.7232, -2.6727, 30.3004, 20.0679, -2.672, 30.294699, 16.7232, -3.1094, 33.691498, 16.7232, -2.6727, 30.3004, 16.7232, -2.2194998, 26.781, 20.0679, -2.2194998, 26.781, 20.0679, -2.672, 30.294699, 20.0679, -2.2194998, 26.781, 23.412498, -2.6713, 30.289099, 20.0679, -2.672, 30.294699, 20.0679, -2.2194998, 26.781, 23.412498, -2.2194998, 26.781, 23.412498, -2.6713, 30.289099, 23.412498, -2.6713, 30.289099, 20.0679, -3.109, 33.6879, 20.0679, -2.672, 30.294699, 20.0679, -2.672, 30.294699, 20.0679, -3.109, 33.6879, 16.7232, -3.1094, 33.691498, 23.412498, -2.6713, 30.289099, 23.412498, -3.1085, 33.6844, 20.0679, -3.109, 33.6879, 16.7232, -3.1094, 33.691498, 16.7232, -3.4852, 36.609398, 13.378599, -3.4854, 36.6112, 20.0679, -3.109, 33.6879, 16.7232, -3.4852, 36.609398, 16.7232, -3.1094, 33.691498, 16.7232, -3.4852, 36.609398, 13.378599, -3.8518999, 39.456898, 13.378599, -3.4854, 36.6112, 16.7232, -3.4852, 36.609398, 16.7232, -3.8518999, 39.456898, 13.378599, -3.8518999, 39.456898, 20.0679, -3.109, 33.6879, 20.0679, -3.485, 36.607597, 16.7232, -3.4852, 36.609398, 20.0679, -3.485, 36.607597, 16.7232, -3.8518999, 39.456898, 16.7232, -3.4852, 36.609398, 23.412498, -3.1085, 33.6844, 20.0679, -3.485, 36.607597, 20.0679, -3.109, 33.6879, 20.0679, -3.485, 36.607597, 20.0679, -3.8518999, 39.456898, 16.7232, -3.8518999, 39.456898, 23.412498, -3.1085, 33.6844, 23.412498, -3.4847, 36.6059, 20.0679, -3.485, 36.607597, 23.412498, -3.4847, 36.6059, 20.0679, -3.8518999, 39.456898, 20.0679, -3.485, 36.607597, 23.412498, -3.4847, 36.6059, 23.412498, -3.8518999, 39.456898, 20.0679, -3.8518999, 39.456898, 23.412498, -2.2194998, 26.781, 26.7582, -3.0839999, 30.2834, 23.412498, -2.6713, 30.289099, 23.412498, -2.2194998, 26.781, 26.7582, -2.7837, 26.6955, 26.7582, -3.0839999, 30.2834, -26.7572, -3.2777, 36.6322, -23.412498, -2.6287, 33.7341, -23.412498, -3.2477999, 36.6305, -26.7572, -3.2777, 36.6322, -26.7572, -2.6892, 33.737698, -23.412498, -2.6287, 33.7341, -16.7232, -3.247, 36.6269, -13.378601, -2.619, 33.7235, -13.378601, -3.243, 36.6252, -16.7232, -3.247, 36.6269, -16.7232, -2.6272, 33.726997, -13.378601, -2.619, 33.7235, 26.7582, -3.6130998, 36.6041, 23.412498, -3.8518999, 39.456898, 23.412498, -3.4847, 36.6059, 26.7582, -3.6130998, 36.6041, 26.7582, -3.8518999, 39.456898, 23.412498, -3.8518999, 39.456898, 13.378599, -3.4854, 36.6112, 10.033899, -3.8518999, 39.456898, 10.033899, -3.2403, 36.6129, 13.378599, -3.4854, 36.6112, 13.378599, -3.8518999, 39.456898, 10.033899, -3.8518999, 39.456898, 26.7582, -3.3683999, 33.680798, 23.412498, -3.4847, 36.6059, 23.412498, -3.1085, 33.6844, 26.7582, -3.3683999, 33.680798, 26.7582, -3.6130998, 36.6041, 23.412498, -3.4847, 36.6059, -26.7572, -2.6892, 33.737698, -23.412498, -1.9093, 30.3681, -23.412498, -2.6287, 33.7341, -26.7572, -2.6892, 33.737698, -26.7572, -2.0054, 30.3737, -23.412498, -1.9093, 30.3681, -16.7232, -2.6272, 33.726997, -13.378601, -1.8938999, 30.3512, -13.378601, -2.619, 33.7235, -16.7232, -2.6272, 33.726997, -16.7232, -1.9068999, 30.3568, -13.378601, -1.8938999, 30.3512, 13.378599, -3.1099, 33.695, 10.033899, -3.2403, 36.6129, 10.033899, -2.6137, 33.6986, 13.378599, -3.1099, 33.695, 13.378599, -3.4854, 36.6112, 10.033899, -3.2403, 36.6129, -26.7572, -2.0054, 30.3737, -23.412498, -1.1374999, 26.7572, -23.412498, -1.9093, 30.3681, -26.7572, -2.0054, 30.3737, -26.7572, -1.2701, 26.7572, -23.412498, -1.1374999, 26.7572, 26.7582, -3.0839999, 30.2834, 23.412498, -3.1085, 33.6844, 23.412498, -2.6713, 30.289099, 26.7582, -3.0839999, 30.2834, 26.7582, -3.3683999, 33.680798, 23.412498, -3.1085, 33.6844, 13.378599, -2.6734, 30.306, 10.033899, -2.6137, 33.6986, 10.033899, -1.8853999, 30.311699, 13.378599, -2.6734, 30.306, 13.378599, -3.1099, 33.695, 10.033899, -2.6137, 33.6986, -16.7232, -1.9068999, 30.3568, -13.378601, -1.1209999, 26.7572, -13.378601, -1.8938999, 30.3512, -16.7232, -1.9068999, 30.3568, -16.7232, -1.1374999, 26.7572, -13.378601, -1.1209999, 26.7572, -38.5239, -3.6573, -23.412498, -36.0882, -3.5405, -26.7572, -36.0928, -3.4731998, -23.412498, -38.5239, -3.6573, -23.412498, -38.5239, -3.6573, -26.7572, -36.0882, -3.5405, -26.7572, -38.5239, -3.6573, -20.3888, -36.0928, -3.4731998, -23.412498, -36.0969, -3.2475998, -20.410799, -38.5239, -3.6573, -20.3888, -38.5239, -3.6573, -23.412498, -36.0928, -3.4731998, -23.412498, -38.5239, -3.6573, -20.0679, -36.101498, -3.2484, -17.0662, -38.5239, -3.6573, -17.0441, -36.101498, -3.2484, -17.0662, -38.5239, -3.6573, -20.0679, -38.5239, -3.6573, -20.3888, -36.101498, -3.2484, -17.0662, -38.5239, -3.6573, -20.3888, -36.0969, -3.2475998, -20.410799, -36.0969, -3.2475998, -20.410799, -33.3005, -2.7756, -17.0916, -36.101498, -3.2484, -17.0662, -36.0969, -3.2475998, -20.410799, -33.2906, -2.7739, -20.4364, -33.3005, -2.7756, -17.0916, -33.2906, -2.7739, -20.4364, -30.219301, -2.2554998, -17.1196, -33.3005, -2.7756, -17.0916, -33.2906, -2.7739, -20.4364, -30.2036, -2.2528, -20.4644, -30.219301, -2.2554998, -17.1196, -30.2036, -2.2528, -20.4644, -26.7572, -1.6710999, -17.1511, -30.219301, -2.2554998, -17.1196, -30.2036, -2.2528, -20.4644, -26.7572, -1.6710999, -20.4958, -26.7572, -1.6710999, -17.1511, -38.5239, -3.6573, -16.7232, -36.106598, -2.8727, -13.378599, -38.5239, -3.6573, -13.378599, -36.106598, -2.8727, -13.378599, -38.5239, -3.6573, -16.7232, -38.5239, -3.6573, -17.0441, -36.106598, -2.8727, -13.378599, -38.5239, -3.6573, -17.0441, -36.101498, -3.2484, -17.0662, -38.5239, -3.6573, -10.033899, -36.106598, -2.8727, -13.378599, -36.1112, -2.8741999, -10.033899, -38.5239, -3.6573, -10.033899, -38.5239, -3.6573, -13.378599, -36.106598, -2.8727, -13.378599, -38.5239, -3.6573, -6.6893, -38.5239, -3.6573, -10.033899, -36.1112, -2.8741999, -10.033899, -38.5239, -3.6573, -6.6893, -36.1112, -2.8741999, -10.033899, -36.1158, -2.8757, -6.6893, -36.1112, -2.8741999, -10.033899, -33.3313, -1.9719, -6.6893, -36.1158, -2.8757, -6.6893, -36.106598, -2.8727, -13.378599, -33.3214, -1.9686999, -10.033899, -36.1112, -2.8741999, -10.033899, -36.1112, -2.8741999, -10.033899, -33.3214, -1.9686999, -10.033899, -33.3313, -1.9719, -6.6893, -36.106598, -2.8727, -13.378599, -33.3115, -1.9655, -13.378599, -33.3214, -1.9686999, -10.033899, -33.3214, -1.9686999, -10.033899, -30.2685, -0.9777, -6.6893, -33.3313, -1.9719, -6.6893, -33.3115, -1.9655, -13.378599, -30.252699, -0.9726, -10.033899, -33.3214, -1.9686999, -10.033899, -33.3214, -1.9686999, -10.033899, -30.252699, -0.9726, -10.033899, -30.2685, -0.9777, -6.6893, -30.252699, -0.9726, -10.033899, -29.294899, -0.6617, -6.6893, -30.2685, -0.9777, -6.6893, -33.3115, -1.9655, -13.378599, -30.237001, -0.9675, -13.378599, -30.252699, -0.9726, -10.033899, -30.252699, -0.9726, -10.033899, -29.294899, -0.6617, -10.033899, -29.294899, -0.6617, -6.6893, -30.237001, -0.9675, -13.378599, -29.294899, -0.6617, -10.033899, -30.252699, -0.9726, -10.033899, -30.237001, -0.9675, -13.378599, -29.294899, -0.6617, -13.378599, -29.294899, -0.6617, -10.033899, -38.5239, -3.6573, -3.3446002, -36.1158, -2.8757, -6.6893, -36.1204, -2.9744, -3.3446002, -38.5239, -3.6573, -3.3446002, -38.5239, -3.6573, -6.6893, -36.1158, -2.8757, -6.6893, -38.5239, -3.6573, 0, -36.1204, -2.9744, -3.3446002, -36.125, -2.9757, 0, -38.5239, -3.6573, 0, -38.5239, -3.6573, -3.3446002, -36.1204, -2.9744, -3.3446002, -36.1204, -2.9744, -3.3446002, -33.3512, -2.1875, 0, -36.125, -2.9757, 0, -36.1204, -2.9744, -3.3446002, -33.341198, -2.1847, -3.3446002, -33.3512, -2.1875, 0, -33.341198, -2.1847, -3.3446002, -30.300001, -1.3205999, 0, -33.3512, -2.1875, 0, -33.341198, -2.1847, -3.3446002, -30.2842, -1.3161, -3.3446002, -30.300001, -1.3205999, 0, -30.2842, -1.3161, -3.3446002, -27.9812, -0.6617, 0, -30.300001, -1.3205999, 0, -30.2842, -1.3161, -3.3446002, -27.9812, -0.6617, -3.3446002, -27.9812, -0.6617, 0, -29.294899, -0.6617, 3.3446, -30.3315, -0.9982, 6.6893, -30.315699, -0.9931, 3.3446, -29.294899, -0.6617, 3.3446, -29.294899, -0.6617, 6.6893, -30.3315, -0.9982, 6.6893, -29.294899, -0.6617, 10.033899, -30.3315, -0.9982, 6.6893, -29.294899, -0.6617, 6.6893, -30.3315, -0.9982, 6.6893, -29.294899, -0.6617, 10.033899, -29.294899, -0.6617, 13.378601, -30.3315, -0.9982, 6.6893, -33.3611, -1.9814999, 3.3446, -30.315699, -0.9931, 3.3446, -30.3315, -0.9982, 6.6893, -29.294899, -0.6617, 13.378601, -30.363, -1.0084, 13.378601, -30.3315, -0.9982, 6.6893, -33.371, -1.9848, 6.6893, -33.3611, -1.9814999, 3.3446, -30.363, -1.0084, 13.378601, -33.371, -1.9848, 6.6893, -30.3315, -0.9982, 6.6893, -33.371, -1.9848, 6.6893, -36.1296, -2.8801, 3.3446, -33.3611, -1.9814999, 3.3446, -30.363, -1.0084, 13.378601, -33.3908, -1.9912, 13.378601, -33.371, -1.9848, 6.6893, -33.371, -1.9848, 6.6893, -36.134197, -2.8816, 6.6893, -36.1296, -2.8801, 3.3446, -33.3908, -1.9912, 13.378601, -36.134197, -2.8816, 6.6893, -33.371, -1.9848, 6.6893, -36.134197, -2.8816, 6.6893, -38.5239, -3.6573, 3.3446, -36.1296, -2.8801, 3.3446, -33.3908, -1.9912, 13.378601, -36.1433, -2.8846, 13.378601, -36.134197, -2.8816, 6.6893, -36.134197, -2.8816, 6.6893, -38.5239, -3.6573, 6.6893, -38.5239, -3.6573, 3.3446, -38.5239, -3.6573, 13.378601, -36.134197, -2.8816, 6.6893, -36.1433, -2.8846, 13.378601, -36.134197, -2.8816, 6.6893, -38.5239, -3.6573, 10.033899, -38.5239, -3.6573, 6.6893, -36.134197, -2.8816, 6.6893, -38.5239, -3.6573, 13.378601, -38.5239, -3.6573, 10.033899, -29.294899, -1.0265, 16.7232, -30.394499, -1.8736, 20.0679, -30.378698, -1.3354, 16.7232, -29.294899, -1.0265, 16.7232, -26.7572, -1.0756, 20.0679, -30.394499, -1.8736, 20.0679, -26.7572, -1.0756, 20.0679, -30.4102, -1.8771, 23.412498, -30.394499, -1.8736, 20.0679, -26.7572, -1.0756, 20.0679, -26.7572, -1.0756, 23.412498, -30.4102, -1.8771, 23.412498, -30.4102, -1.8771, 23.412498, -33.4106, -2.5354, 20.0679, -30.394499, -1.8736, 20.0679, -30.4102, -1.8771, 23.412498, -33.420498, -2.5376, 23.412498, -33.4106, -2.5354, 20.0679, -33.420498, -2.5376, 23.412498, -36.1525, -3.1369998, 20.0679, -33.4106, -2.5354, 20.0679, -33.420498, -2.5376, 23.412498, -36.1571, -3.138, 23.412498, -36.1525, -3.1369998, 20.0679, -36.1571, -3.138, 23.412498, -38.5239, -3.6573, 20.0679, -36.1525, -3.1369998, 20.0679, -36.1571, -3.138, 23.412498, -38.5239, -3.6573, 23.412498, -38.5239, -3.6573, 20.0679, -26.7572, -1.0756, 23.412498, -30.426, -2.0144, 26.7572, -30.4102, -1.8771, 23.412498, -26.7572, -1.0756, 23.412498, -26.7572, -1.2701, 26.7572, -30.426, -2.0144, 26.7572, -29.294899, -0.6617, 13.378601, -30.378698, -1.3354, 16.7232, -30.363, -1.0084, 13.378601, -29.294899, -0.6617, 13.378601, -29.294899, -1.0265, 16.7232, -30.378698, -1.3354, 16.7232, -30.173899, -3.2568, -26.7572, -26.7572, -2.7663999, -23.412498, -30.1897, -3.0263, -23.412498, -30.173899, -3.2568, -26.7572, -26.7572, -3.0929, -26.7572, -26.7572, -2.7663999, -23.412498, -30.426, -2.0144, 26.7572, -33.420498, -2.5376, 23.412498, -30.4102, -1.8771, 23.412498, -30.426, -2.0144, 26.7572, -33.4304, -2.6239998, 26.7572, -33.420498, -2.5376, 23.412498, -30.219301, -2.2554998, -17.1196, -29.294899, -0.6617, -13.378599, -30.237001, -0.9675, -13.378599, -30.219301, -2.2554998, -17.1196, -26.7572, -1.6710999, -17.1511, -29.294899, -0.6617, -13.378599, -30.394499, -1.8736, 20.0679, -33.4007, -2.1969, 16.7232, -30.378698, -1.3354, 16.7232, -30.394499, -1.8736, 20.0679, -33.4106, -2.5354, 20.0679, -33.4007, -2.1969, 16.7232, -30.1897, -3.0263, -23.412498, -26.7572, -1.6710999, -20.4958, -30.2036, -2.2528, -20.4644, -30.1897, -3.0263, -23.412498, -26.7572, -2.7663999, -23.412498, -26.7572, -1.6710999, -20.4958, -30.315699, -0.9931, 3.3446, -33.3512, -2.1875, 0, -30.300001, -1.3205999, 0, -30.315699, -0.9931, 3.3446, -33.3611, -1.9814999, 3.3446, -33.3512, -2.1875, 0, -30.2685, -0.9777, -6.6893, -27.9812, -0.6617, -3.3446002, -30.2842, -1.3161, -3.3446002, -30.2685, -0.9777, -6.6893, -29.294899, -0.6617, -6.6893, -27.9812, -0.6617, -3.3446002, -30.378698, -1.3354, 16.7232, -33.3908, -1.9912, 13.378601, -30.363, -1.0084, 13.378601, -30.378698, -1.3354, 16.7232, -33.4007, -2.1969, 16.7232, -33.3908, -1.9912, 13.378601, -33.2719, -3.4053998, -26.7572, -30.1897, -3.0263, -23.412498, -33.2818, -3.2603998, -23.412498, -33.2719, -3.4053998, -26.7572, -30.173899, -3.2568, -26.7572, -30.1897, -3.0263, -23.412498, -33.4007, -2.1969, 16.7232, -36.1433, -2.8846, 13.378601, -33.3908, -1.9912, 13.378601, -33.4007, -2.1969, 16.7232, -36.1479, -2.98, 16.7232, -36.1433, -2.8846, 13.378601, -33.4304, -2.6239998, 26.7572, -36.1571, -3.138, 23.412498, -33.420498, -2.5376, 23.412498, -33.4304, -2.6239998, 26.7572, -36.161697, -3.1780999, 26.7572, -36.1571, -3.138, 23.412498, -33.3005, -2.7756, -17.0916, -30.237001, -0.9675, -13.378599, -33.3115, -1.9655, -13.378599, -33.3005, -2.7756, -17.0916, -30.219301, -2.2554998, -17.1196, -30.237001, -0.9675, -13.378599, -33.2818, -3.2603998, -23.412498, -30.2036, -2.2528, -20.4644, -33.2906, -2.7739, -20.4364, -33.2818, -3.2603998, -23.412498, -30.1897, -3.0263, -23.412498, -30.2036, -2.2528, -20.4644, -33.3611, -1.9814999, 3.3446, -36.125, -2.9757, 0, -33.3512, -2.1875, 0, -33.3611, -1.9814999, 3.3446, -36.1296, -2.8801, 3.3446, -36.125, -2.9757, 0, -33.4106, -2.5354, 20.0679, -36.1479, -2.98, 16.7232, -33.4007, -2.1969, 16.7232, -33.4106, -2.5354, 20.0679, -36.1525, -3.1369998, 20.0679, -36.1479, -2.98, 16.7232, -33.3313, -1.9719, -6.6893, -30.2842, -1.3161, -3.3446002, -33.341198, -2.1847, -3.3446002, -33.3313, -1.9719, -6.6893, -30.2685, -0.9777, -6.6893, -30.2842, -1.3161, -3.3446002, -36.161697, -3.1780999, 26.7572, -38.5239, -3.6573, 23.412498, -36.1571, -3.138, 23.412498, -36.161697, -3.1780999, 26.7572, -38.5239, -3.6573, 26.7572, -38.5239, -3.6573, 23.412498, -36.101498, -3.2484, -17.0662, -33.3115, -1.9655, -13.378599, -36.106598, -2.8727, -13.378599, -36.101498, -3.2484, -17.0662, -33.3005, -2.7756, -17.0916, -33.3115, -1.9655, -13.378599, -36.0928, -3.4731998, -23.412498, -33.2906, -2.7739, -20.4364, -36.0969, -3.2475998, -20.410799, -36.0928, -3.4731998, -23.412498, -33.2818, -3.2603998, -23.412498, -33.2906, -2.7739, -20.4364, -36.1296, -2.8801, 3.3446, -38.5239, -3.6573, 0, -36.125, -2.9757, 0, -36.1296, -2.8801, 3.3446, -38.5239, -3.6573, 3.3446, -38.5239, -3.6573, 0, -36.1158, -2.8757, -6.6893, -33.341198, -2.1847, -3.3446002, -36.1204, -2.9744, -3.3446002, -36.1158, -2.8757, -6.6893, -33.3313, -1.9719, -6.6893, -33.341198, -2.1847, -3.3446002, -36.1525, -3.1369998, 20.0679, -38.5239, -3.6573, 16.7232, -36.1479, -2.98, 16.7232, -36.1525, -3.1369998, 20.0679, -38.5239, -3.6573, 20.0679, -38.5239, -3.6573, 16.7232, -36.0882, -3.5405, -26.7572, -33.2818, -3.2603998, -23.412498, -36.0928, -3.4731998, -23.412498, -36.0882, -3.5405, -26.7572, -33.2719, -3.4053998, -26.7572, -33.2818, -3.2603998, -23.412498, -36.1479, -2.98, 16.7232, -38.5239, -3.6573, 13.378601, -36.1433, -2.8846, 13.378601, -36.1479, -2.98, 16.7232, -38.5239, -3.6573, 16.7232, -38.5239, -3.6573, 13.378601, -41.627, -4.8403997, 26.7572, -38.5239, -3.6573, 26.7572, -40.2616, -4.8514, 28.2242, -44.537098, -5.95, 26.7572, -41.627, -4.8403997, 26.7572, -43.2833, -5.9677997, 28.143099, -47.4473, -7.0596, 26.7572, -44.537098, -5.95, 26.7572, -46.202698, -7.0731997, 28.132399, -53.117798, -8.6939, 26.7572, -50.290497, -8.1437, 26.7572, -51.906998, -8.6923, 28.058699, -55.5951, -9.176, 26.7572, -53.117798, -8.6939, 26.7572, -54.5561, -9.1761, 27.885199, -58.463497, -9.7343, 26.7572, -55.5951, -9.176, 26.7572, -57.2836, -9.7381, 28.062199, -33.0801, -3.7473, 32.6325, -32.8819, -4.9104, 36.1535, -34.7309, -4.8956, 34.1667, -33.0801, -3.7473, 32.6325, -31.247301, -3.7775998, 34.6107, -32.8819, -4.9104, 36.1535, -34.7309, -4.8956, 34.1667, -34.5837, -6.0910997, 37.759598, -36.416798, -6.0650997, 35.7334, -34.7309, -4.8956, 34.1667, -32.8819, -4.9104, 36.1535, -34.5837, -6.0910997, 37.759598, -36.416798, -6.0650997, 35.7334, -36.1511, -7.1832, 39.2388, -37.9957, -7.1629996, 37.2007, -36.416798, -6.0650997, 35.7334, -34.5837, -6.0910997, 37.759598, -36.1511, -7.1832, 39.2388, -37.9957, -7.1629996, 37.2007, -37.5247, -8.1437, 40.5352, -39.4027, -8.1437, 38.5083, -37.9957, -7.1629996, 37.2007, -36.1511, -7.1832, 39.2388, -37.5247, -8.1437, 40.5352, -39.4027, -8.1437, 38.5083, -39.0032, -8.6748, 41.930298, -40.895798, -8.6774, 39.8957, -39.4027, -8.1437, 38.5083, -37.5247, -8.1437, 40.5352, -39.0032, -8.6748, 41.930298, -40.895798, -8.6774, 39.8957, -40.403297, -9.1775, 43.2515, -42.2959, -9.1772995, 41.196598, -40.895798, -8.6774, 39.8957, -39.0032, -8.6748, 41.930298, -40.403297, -9.1775, 43.2515, -42.2959, -9.1772995, 41.196598, -42.1009, -9.787, 44.8533, -43.9867, -9.7809, 42.7677, -42.2959, -9.1772995, 41.196598, -40.403297, -9.1775, 43.2515, -42.1009, -9.787, 44.8533, -43.9867, -9.7809, 42.7677, -43.8985, -10.4337, 46.549698, -45.8121, -10.4337, 44.463898, -43.9867, -9.7809, 42.7677, -42.1009, -9.787, 44.8533, -43.8985, -10.4337, 46.549698, -31.247301, -3.7775998, 34.6107, -31.153502, -4.9242997, 38.010498, -32.8819, -4.9104, 36.1535, -31.247301, -3.7775998, 34.6107, -29.5455, -3.8058, 36.4474, -31.153502, -4.9242997, 38.010498, -32.8819, -4.9104, 36.1535, -32.857998, -6.1155996, 39.6672, -34.5837, -6.0910997, 37.759598, -32.8819, -4.9104, 36.1535, -31.153502, -4.9242997, 38.010498, -32.857998, -6.1155996, 39.6672, -34.5837, -6.0910997, 37.759598, -34.403698, -7.2022996, 41.169598, -36.1511, -7.1832, 39.2388, -34.5837, -6.0910997, 37.759598, -32.857998, -6.1155996, 39.6672, -34.403698, -7.2022996, 41.169598, -36.1511, -7.1832, 39.2388, -35.7366, -8.1437, 42.4652, -37.5247, -8.1437, 40.5352, -36.1511, -7.1832, 39.2388, -34.403698, -7.2022996, 41.169598, -35.7366, -8.1437, 42.4652, -37.5247, -8.1437, 40.5352, -37.1909, -8.672299, 43.878498, -39.0032, -8.6748, 41.930298, -37.5247, -8.1437, 40.5352, -35.7366, -8.1437, 42.4652, -37.1909, -8.672299, 43.878498, -42.1009, -9.787, 44.8533, -42.032497, -10.4337, 48.5836, -43.8985, -10.4337, 46.549698, -42.1009, -9.787, 44.8533, -40.2735, -9.7929, 46.8743, -42.032497, -10.4337, 48.5836, -39.0032, -8.6748, 41.930298, -38.5812, -9.1777, 45.2297, -40.403297, -9.1775, 43.2515, -39.0032, -8.6748, 41.930298, -37.1909, -8.672299, 43.878498, -38.5812, -9.1777, 45.2297, -40.403297, -9.1775, 43.2515, -40.2735, -9.7929, 46.8743, -42.1009, -9.787, 44.8533, -40.403297, -9.1775, 43.2515, -38.5812, -9.1777, 45.2297, -40.2735, -9.7929, 46.8743, -40.2735, -9.7929, 46.8743, -40.572998, -10.4337, 50.1744, -42.032497, -10.4337, 48.5836, -40.2735, -9.7929, 46.8743, -38.8322, -9.7975, 48.4683, -40.572998, -10.4337, 50.1744, -32.857998, -6.1155996, 39.6672, -32.985, -7.2179, 42.7371, -34.403698, -7.2022996, 41.169598, -32.857998, -6.1155996, 39.6672, -31.445799, -6.1355996, 41.2283, -32.985, -7.2179, 42.7371, -38.5812, -9.1777, 45.2297, -38.8322, -9.7975, 48.4683, -40.2735, -9.7929, 46.8743, -38.5812, -9.1777, 45.2297, -37.1326, -9.1778, 46.802498, -38.8322, -9.7975, 48.4683, -34.403698, -7.2022996, 41.169598, -34.2949, -8.1437, 44.0212, -35.7366, -8.1437, 42.4652, -34.403698, -7.2022996, 41.169598, -32.985, -7.2179, 42.7371, -34.2949, -8.1437, 44.0212, -35.7366, -8.1437, 42.4652, -35.7403, -8.6704, 45.4379, -37.1909, -8.672299, 43.878498, -35.7366, -8.1437, 42.4652, -34.2949, -8.1437, 44.0212, -35.7403, -8.6704, 45.4379, -29.5455, -3.8058, 36.4474, -29.727, -4.9357, 39.5433, -31.153502, -4.9242997, 38.010498, -29.5455, -3.8058, 36.4474, -28.1288, -3.8291998, 37.976498, -29.727, -4.9357, 39.5433, -37.1909, -8.672299, 43.878498, -37.1326, -9.1778, 46.802498, -38.5812, -9.1777, 45.2297, -37.1909, -8.672299, 43.878498, -35.7403, -8.6704, 45.4379, -37.1326, -9.1778, 46.802498, -31.153502, -4.9242997, 38.010498, -31.445799, -6.1355996, 41.2283, -32.857998, -6.1155996, 39.6672, -31.153502, -4.9242997, 38.010498, -29.727, -4.9357, 39.5433, -31.445799, -6.1355996, 41.2283, -28.1288, -3.8291998, 37.976498, -28.3464, -4.9467, 41.0267, -29.727, -4.9357, 39.5433, -28.1288, -3.8291998, 37.976498, -26.7572, -3.8518999, 39.456898, -28.3464, -4.9467, 41.0267, -29.727, -4.9357, 39.5433, -30.0795, -6.1549, 42.738598, -31.445799, -6.1355996, 41.2283, -29.727, -4.9357, 39.5433, -28.3464, -4.9467, 41.0267, -30.0795, -6.1549, 42.738598, -38.8322, -9.7975, 48.4683, -39.1638, -10.4337, 51.7104, -40.572998, -10.4337, 50.1744, -38.8322, -9.7975, 48.4683, -37.44, -9.802, 50.008, -39.1638, -10.4337, 51.7104, -31.445799, -6.1355996, 41.2283, -31.612902, -7.2328997, 44.2532, -32.985, -7.2179, 42.7371, -31.445799, -6.1355996, 41.2283, -30.0795, -6.1549, 42.738598, -31.612902, -7.2328997, 44.2532, -37.1326, -9.1778, 46.802498, -37.44, -9.802, 50.008, -38.8322, -9.7975, 48.4683, -37.1326, -9.1778, 46.802498, -35.7329, -9.177899, 48.322197, -37.44, -9.802, 50.008, -32.985, -7.2179, 42.7371, -32.901, -8.1437, 45.5256, -34.2949, -8.1437, 44.0212, -32.985, -7.2179, 42.7371, -31.612902, -7.2328997, 44.2532, -32.901, -8.1437, 45.5256, -34.2949, -8.1437, 44.0212, -34.3383, -8.6685, 46.945, -35.7403, -8.6704, 45.4379, -34.2949, -8.1437, 44.0212, -32.901, -8.1437, 45.5256, -34.3383, -8.6685, 46.945, -35.7403, -8.6704, 45.4379, -35.7329, -9.177899, 48.322197, -37.1326, -9.1778, 46.802498, -35.7403, -8.6704, 45.4379, -34.3383, -8.6685, 46.945, -35.7329, -9.177899, 48.322197, -34.3383, -8.6685, 46.945, -34.0797, -9.1781, 50.1171, -35.7329, -9.177899, 48.322197, -34.3383, -8.6685, 46.945, -32.6904, -8.6662, 48.7166, -34.0797, -9.1781, 50.1171, -26.7572, -3.8518999, 39.456898, -26.7572, -4.9595, 42.7343, -28.3464, -4.9467, 41.0267, -28.3464, -4.9467, 41.0267, -28.496698, -6.1773996, 44.4883, -30.0795, -6.1549, 42.738598, -28.3464, -4.9467, 41.0267, -26.7572, -4.9595, 42.7343, -28.496698, -6.1773996, 44.4883, -37.44, -9.802, 50.008, -37.4804, -10.4337, 53.5453, -39.1638, -10.4337, 51.7104, -37.44, -9.802, 50.008, -35.786, -9.8073, 51.8372, -37.4804, -10.4337, 53.5453, -30.0795, -6.1549, 42.738598, -30.0148, -7.2503, 46.0191, -31.612902, -7.2328997, 44.2532, -30.0795, -6.1549, 42.738598, -28.496698, -6.1773996, 44.4883, -30.0148, -7.2503, 46.0191, -32.901, -8.1437, 45.5256, -32.6904, -8.6662, 48.7166, -34.3383, -8.6685, 46.945, -32.901, -8.1437, 45.5256, -31.270601, -8.1437, 47.285297, -32.6904, -8.6662, 48.7166, -35.7329, -9.177899, 48.322197, -35.786, -9.8073, 51.8372, -37.44, -9.802, 50.008, -35.7329, -9.177899, 48.322197, -34.0797, -9.1781, 50.1171, -35.786, -9.8073, 51.8372, -31.612902, -7.2328997, 44.2532, -31.270601, -8.1437, 47.285297, -32.901, -8.1437, 45.5256, -31.612902, -7.2328997, 44.2532, -30.0148, -7.2503, 46.0191, -31.270601, -8.1437, 47.285297, -26.7572, -4.9595, 42.7343, -26.7572, -6.2019997, 46.4111, -28.496698, -6.1773996, 44.4883, -35.786, -9.8073, 51.8372, -35.735397, -10.4337, 55.4473, -37.4804, -10.4337, 53.5453, -35.786, -9.8073, 51.8372, -34.0528, -9.8129, 53.753998, -35.735397, -10.4337, 55.4473, -28.496698, -6.1773996, 44.4883, -28.2762, -7.2693996, 47.940197, -30.0148, -7.2503, 46.0191, -28.496698, -6.1773996, 44.4883, -26.7572, -6.2019997, 46.4111, -28.2762, -7.2693996, 47.940197, -32.6904, -8.6662, 48.7166, -32.3284, -9.1783, 52.0186, -34.0797, -9.1781, 50.1171, -32.6904, -8.6662, 48.7166, -30.9289, -8.663899, 50.6101, -32.3284, -9.1783, 52.0186, -31.270601, -8.1437, 47.285297, -30.9289, -8.663899, 50.6101, -32.6904, -8.6662, 48.7166, -31.270601, -8.1437, 47.285297, -29.511599, -8.1437, 49.1838, -30.9289, -8.663899, 50.6101, -34.0797, -9.1781, 50.1171, -34.0528, -9.8129, 53.753998, -35.786, -9.8073, 51.8372, -34.0797, -9.1781, 50.1171, -32.3284, -9.1783, 52.0186, -34.0528, -9.8129, 53.753998, -30.0148, -7.2503, 46.0191, -29.511599, -8.1437, 49.1838, -31.270601, -8.1437, 47.285297, -30.0148, -7.2503, 46.0191, -28.2762, -7.2693996, 47.940197, -29.511599, -8.1437, 49.1838, -28.2762, -7.2693996, 47.940197, -27.9641, -8.1437, 50.853897, -29.511599, -8.1437, 49.1838, -28.2762, -7.2693996, 47.940197, -26.7572, -7.286, 49.6186, -27.9641, -8.1437, 50.853897, -34.0528, -9.8129, 53.753998, -34.1461, -10.4337, 57.1796, -35.735397, -10.4337, 55.4473, -34.0528, -9.8129, 53.753998, -32.4888, -9.8179, 55.4837, -34.1461, -10.4337, 57.1796, -26.7572, -6.2019997, 46.4111, -26.7572, -7.286, 49.6186, -28.2762, -7.2693996, 47.940197, -30.9289, -8.663899, 50.6101, -30.7632, -9.1784, 53.718, -32.3284, -9.1783, 52.0186, -30.9289, -8.663899, 50.6101, -29.3669, -8.6617, 52.2893, -30.7632, -9.1784, 53.718, -29.511599, -8.1437, 49.1838, -29.3669, -8.6617, 52.2893, -30.9289, -8.663899, 50.6101, -29.511599, -8.1437, 49.1838, -27.9641, -8.1437, 50.853897, -29.3669, -8.6617, 52.2893, -32.3284, -9.1783, 52.0186, -32.4888, -9.8179, 55.4837, -34.0528, -9.8129, 53.753998, -32.3284, -9.1783, 52.0186, -30.7632, -9.1784, 53.718, -32.4888, -9.8179, 55.4837, -29.3669, -8.6617, 52.2893, -29.525799, -9.1785, 55.061497, -30.7632, -9.1784, 53.718, -29.3669, -8.6617, 52.2893, -28.140299, -8.6601, 53.6078, -29.525799, -9.1785, 55.061497, -27.9641, -8.1437, 50.853897, -28.140299, -8.6601, 53.6078, -29.3669, -8.6617, 52.2893, -27.9641, -8.1437, 50.853897, -26.7572, -8.1437, 52.156597, -28.140299, -8.6601, 53.6078, -30.7632, -9.1784, 53.718, -31.2423, -9.821899, 56.862297, -32.4888, -9.8179, 55.4837, -30.7632, -9.1784, 53.718, -29.525799, -9.1785, 55.061497, -31.2423, -9.821899, 56.862297, -26.7572, -7.286, 49.6186, -26.7572, -8.1437, 52.156597, -27.9641, -8.1437, 50.853897, -32.4888, -9.8179, 55.4837, -32.870197, -10.4337, 58.570297, -34.1461, -10.4337, 57.1796, -32.4888, -9.8179, 55.4837, -31.2423, -9.821899, 56.862297, -32.870197, -10.4337, 58.570297, -28.140299, -8.6601, 53.6078, -28.1322, -9.1786995, 56.5746, -29.525799, -9.1785, 55.061497, -28.140299, -8.6601, 53.6078, -26.7572, -8.658199, 55.0947, -28.1322, -9.1786995, 56.5746, -26.7572, -8.1437, 52.156597, -26.7572, -8.658199, 55.0947, -28.140299, -8.6601, 53.6078, -29.525799, -9.1785, 55.061497, -29.8403, -9.8265, 58.4128, -31.2423, -9.821899, 56.862297, -29.525799, -9.1785, 55.061497, -28.1322, -9.1786995, 56.5746, -29.8403, -9.8265, 58.4128, -31.2423, -9.821899, 56.862297, -31.437601, -10.4337, 60.131798, -32.870197, -10.4337, 58.570297, -31.2423, -9.821899, 56.862297, -29.8403, -9.8265, 58.4128, -31.437601, -10.4337, 60.131798, -26.7572, -8.658199, 55.0947, -26.7572, -9.1788, 58.067497, -28.1322, -9.1786995, 56.5746, -28.1322, -9.1786995, 56.5746, -28.4674, -9.8309, 59.9312, -29.8403, -9.8265, 58.4128, -28.1322, -9.1786995, 56.5746, -26.7572, -9.1788, 58.067497, -28.4674, -9.8309, 59.9312, -29.8403, -9.8265, 58.4128, -30.044802, -10.4337, 61.649998, -31.437601, -10.4337, 60.131798, -29.8403, -9.8265, 58.4128, -28.4674, -9.8309, 59.9312, -30.044802, -10.4337, 61.649998, -28.4674, -9.8309, 59.9312, -28.2834, -10.4337, 63.569798, -30.044802, -10.4337, 61.649998, -28.4674, -9.8309, 59.9312, -26.7572, -9.8364, 61.822598, -28.2834, -10.4337, 63.569798, -26.7572, -9.1788, 58.067497, -26.7572, -9.8364, 61.822598, -28.4674, -9.8309, 59.9312, -26.7572, -9.8364, 61.822598, -26.7572, -10.4337, 65.2334, -28.2834, -10.4337, 63.569798, -39.7387, -7.144, 35.2747, -39.4027, -8.1437, 38.5083, -41.179398, -8.1437, 36.5907, -39.7387, -7.144, 35.2747, -37.9957, -7.1629996, 37.2007, -39.4027, -8.1437, 38.5083, -34.806297, -3.7187998, 30.769499, -34.7309, -4.8956, 34.1667, -36.474598, -4.8817, 32.293198, -34.806297, -3.7187998, 30.769499, -33.0801, -3.7473, 32.6325, -34.7309, -4.8956, 34.1667, -45.7693, -9.7752, 40.7963, -45.8121, -10.4337, 44.463898, -47.620697, -10.4337, 42.4927, -45.7693, -9.7752, 40.7963, -43.9867, -9.7809, 42.7677, -45.8121, -10.4337, 44.463898, -36.474598, -4.8817, 32.293198, -36.416798, -6.0650997, 35.7334, -38.147, -6.0406, 33.8208, -36.474598, -4.8817, 32.293198, -34.7309, -4.8956, 34.1667, -36.416798, -6.0650997, 35.7334, -38.147, -6.0406, 33.8208, -37.9957, -7.1629996, 37.2007, -39.7387, -7.144, 35.2747, -38.147, -6.0406, 33.8208, -36.416798, -6.0650997, 35.7334, -37.9957, -7.1629996, 37.2007, -41.179398, -8.1437, 36.5907, -40.895798, -8.6774, 39.8957, -42.6861, -8.6798, 37.9712, -41.179398, -8.1437, 36.5907, -39.4027, -8.1437, 38.5083, -40.895798, -8.6774, 39.8957, -42.6861, -8.6798, 37.9712, -42.2959, -9.1772995, 41.196598, -44.0855, -9.1771, 39.253498, -42.6861, -8.6798, 37.9712, -40.895798, -8.6774, 39.8957, -42.2959, -9.1772995, 41.196598, -44.0855, -9.1771, 39.253498, -43.9867, -9.7809, 42.7677, -45.7693, -9.7752, 40.7963, -44.0855, -9.1771, 39.253498, -42.2959, -9.1772995, 41.196598, -43.9867, -9.7809, 42.7677, -41.209297, -7.1278996, 33.6499, -41.179398, -8.1437, 36.5907, -42.6902, -8.1437, 34.960197, -41.209297, -7.1278996, 33.6499, -39.7387, -7.144, 35.2747, -41.179398, -8.1437, 36.5907, -36.2241, -3.6952999, 29.2393, -36.474598, -4.8817, 32.293198, -37.9203, -4.8701, 30.739899, -36.2241, -3.6952999, 29.2393, -34.806297, -3.7187998, 30.769499, -36.474598, -4.8817, 32.293198, -47.322998, -9.7702, 39.078, -47.620697, -10.4337, 42.4927, -49.212498, -10.4337, 40.7576, -47.322998, -9.7702, 39.078, -45.7693, -9.7752, 40.7963, -47.620697, -10.4337, 42.4927, -37.9203, -4.8701, 30.739899, -38.147, -6.0406, 33.8208, -39.5943, -6.0200996, 32.221, -37.9203, -4.8701, 30.739899, -36.474598, -4.8817, 32.293198, -38.147, -6.0406, 33.8208, -39.5943, -6.0200996, 32.221, -39.7387, -7.144, 35.2747, -41.209297, -7.1278996, 33.6499, -39.5943, -6.0200996, 32.221, -38.147, -6.0406, 33.8208, -39.7387, -7.144, 35.2747, -42.6902, -8.1437, 34.960197, -42.6861, -8.6798, 37.9712, -44.2212, -8.6819, 36.321, -42.6902, -8.1437, 34.960197, -41.179398, -8.1437, 36.5907, -42.6861, -8.6798, 37.9712, -44.2212, -8.6819, 36.321, -44.0855, -9.1771, 39.253498, -45.6317, -9.177, 37.5747, -44.2212, -8.6819, 36.321, -42.6861, -8.6798, 37.9712, -44.0855, -9.1771, 39.253498, -45.6317, -9.177, 37.5747, -45.7693, -9.7752, 40.7963, -47.322998, -9.7702, 39.078, -45.6317, -9.177, 37.5747, -44.0855, -9.1771, 39.253498, -45.7693, -9.7752, 40.7963, -42.4946, -7.1138, 32.2296, -42.6902, -8.1437, 34.960197, -44.0089, -8.1437, 33.5369, -42.4946, -7.1138, 32.2296, -41.209297, -7.1278996, 33.6499, -42.6902, -8.1437, 34.960197, -37.4711, -3.6747, 27.8934, -37.9203, -4.8701, 30.739899, -39.1893, -4.8599997, 29.3764, -37.4711, -3.6747, 27.8934, -36.2241, -3.6952999, 29.2393, -37.9203, -4.8701, 30.739899, -48.6723, -9.7657995, 37.585697, -49.212498, -10.4337, 40.7576, -50.5928, -10.4337, 39.2532, -48.6723, -9.7657995, 37.585697, -47.322998, -9.7702, 39.078, -49.212498, -10.4337, 40.7576, -39.1893, -4.8599997, 29.3764, -39.5943, -6.0200996, 32.221, -40.8617, -6.0021, 30.82, -39.1893, -4.8599997, 29.3764, -37.9203, -4.8701, 30.739899, -39.5943, -6.0200996, 32.221, -40.8617, -6.0021, 30.82, -41.209297, -7.1278996, 33.6499, -42.4946, -7.1138, 32.2296, -40.8617, -6.0021, 30.82, -39.5943, -6.0200996, 32.221, -41.209297, -7.1278996, 33.6499, -44.0089, -8.1437, 33.5369, -44.2212, -8.6819, 36.321, -45.559097, -8.6837, 34.882698, -44.0089, -8.1437, 33.5369, -42.6902, -8.1437, 34.960197, -44.2212, -8.6819, 36.321, -45.559097, -8.6837, 34.882698, -45.6317, -9.177, 37.5747, -46.9771, -9.1769, 36.114, -45.559097, -8.6837, 34.882698, -44.2212, -8.6819, 36.321, -45.6317, -9.177, 37.5747, -46.9771, -9.1769, 36.114, -47.322998, -9.7702, 39.078, -48.6723, -9.7657995, 37.585697, -46.9771, -9.1769, 36.114, -45.6317, -9.177, 37.5747, -47.322998, -9.7702, 39.078, -43.5821, -7.1018996, 31.028, -44.0089, -8.1437, 33.5369, -45.125797, -8.1437, 32.3315, -43.5821, -7.1018996, 31.028, -42.4946, -7.1138, 32.2296, -44.0089, -8.1437, 33.5369, -38.5239, -3.6573, 26.7572, -39.1893, -4.8599997, 29.3764, -40.2616, -4.8514, 28.2242, -38.5239, -3.6573, 26.7572, -37.4711, -3.6747, 27.8934, -39.1893, -4.8599997, 29.3764, -49.816998, -9.7621, 36.319798, -50.5928, -10.4337, 39.2532, -51.764698, -10.4337, 37.9757, -49.816998, -9.7621, 36.319798, -48.6723, -9.7657995, 37.585697, -50.5928, -10.4337, 39.2532, -40.2616, -4.8514, 28.2242, -40.8617, -6.0021, 30.82, -41.9332, -5.9869, 29.6356, -40.2616, -4.8514, 28.2242, -39.1893, -4.8599997, 29.3764, -40.8617, -6.0021, 30.82, -41.9332, -5.9869, 29.6356, -42.4946, -7.1138, 32.2296, -43.5821, -7.1018996, 31.028, -41.9332, -5.9869, 29.6356, -40.8617, -6.0021, 30.82, -42.4946, -7.1138, 32.2296, -45.125797, -8.1437, 32.3315, -45.559097, -8.6837, 34.882698, -46.692997, -8.6852, 33.6638, -45.125797, -8.1437, 32.3315, -44.0089, -8.1437, 33.5369, -45.559097, -8.6837, 34.882698, -46.692997, -8.6852, 33.6638, -46.9771, -9.1769, 36.114, -48.118, -9.1768, 34.875298, -46.692997, -8.6852, 33.6638, -45.559097, -8.6837, 34.882698, -46.9771, -9.1769, 36.114, -48.118, -9.1768, 34.875298, -48.6723, -9.7657995, 37.585697, -49.816998, -9.7621, 36.319798, -48.118, -9.1768, 34.875298, -46.9771, -9.1769, 36.114, -48.6723, -9.7657995, 37.585697, -44.939, -7.0871, 29.5287, -45.125797, -8.1437, 32.3315, -46.506897, -8.1437, 30.840899, -44.939, -7.0871, 29.5287, -43.5821, -7.1018996, 31.028, -45.125797, -8.1437, 32.3315, -51.1965, -9.7577, 34.794, -51.764698, -10.4337, 37.9757, -53.163, -10.4337, 36.4517, -51.1965, -9.7577, 34.794, -49.816998, -9.7621, 36.319798, -51.764698, -10.4337, 37.9757, -41.627, -4.8403997, 26.7572, -41.9332, -5.9869, 29.6356, -43.2833, -5.9677997, 28.143099, -41.627, -4.8403997, 26.7572, -40.2616, -4.8514, 28.2242, -41.9332, -5.9869, 29.6356, -43.2833, -5.9677997, 28.143099, -43.5821, -7.1018996, 31.028, -44.939, -7.0871, 29.5287, -43.2833, -5.9677997, 28.143099, -41.9332, -5.9869, 29.6356, -43.5821, -7.1018996, 31.028, -46.506897, -8.1437, 30.840899, -46.692997, -8.6852, 33.6638, -48.083, -8.687099, 32.1695, -46.506897, -8.1437, 30.840899, -45.125797, -8.1437, 32.3315, -46.692997, -8.6852, 33.6638, -48.083, -8.687099, 32.1695, -48.118, -9.1768, 34.875298, -49.5056, -9.1765995, 33.3687, -48.083, -8.687099, 32.1695, -46.692997, -8.6852, 33.6638, -48.118, -9.1768, 34.875298, -49.5056, -9.1765995, 33.3687, -49.816998, -9.7621, 36.319798, -51.1965, -9.7577, 34.794, -49.5056, -9.1765995, 33.3687, -48.118, -9.1768, 34.875298, -49.816998, -9.7621, 36.319798, -46.202698, -7.0731997, 28.132399, -46.506897, -8.1437, 30.840899, -47.7968, -8.1437, 29.4487, -46.202698, -7.0731997, 28.132399, -44.939, -7.0871, 29.5287, -46.506897, -8.1437, 30.840899, -52.4946, -9.7535, 33.3584, -53.163, -10.4337, 36.4517, -54.4828, -10.4337, 35.0131, -52.4946, -9.7535, 33.3584, -51.1965, -9.7577, 34.794, -53.163, -10.4337, 36.4517, -44.537098, -5.95, 26.7572, -44.939, -7.0871, 29.5287, -46.202698, -7.0731997, 28.132399, -44.537098, -5.95, 26.7572, -43.2833, -5.9677997, 28.143099, -44.939, -7.0871, 29.5287, -47.7968, -8.1437, 29.4487, -48.083, -8.687099, 32.1695, -49.384697, -8.6889, 30.770199, -47.7968, -8.1437, 29.4487, -46.506897, -8.1437, 30.840899, -48.083, -8.687099, 32.1695, -49.384697, -8.6889, 30.770199, -49.5056, -9.1765995, 33.3687, -50.808, -9.176499, 31.954699, -49.384697, -8.6889, 30.770199, -48.083, -8.687099, 32.1695, -49.5056, -9.1765995, 33.3687, -50.808, -9.176499, 31.954699, -51.1965, -9.7577, 34.794, -52.4946, -9.7535, 33.3584, -50.808, -9.176499, 31.954699, -49.5056, -9.1765995, 33.3687, -51.1965, -9.7577, 34.794, -47.4473, -7.0596, 26.7572, -47.7968, -8.1437, 29.4487, -49.074398, -8.1437, 28.0697, -47.4473, -7.0596, 26.7572, -46.202698, -7.0731997, 28.132399, -47.7968, -8.1437, 29.4487, -53.7992, -9.7493, 31.915699, -54.4828, -10.4337, 35.0131, -55.8173, -10.4337, 33.5585, -53.7992, -9.7493, 31.915699, -52.4946, -9.7535, 33.3584, -54.4828, -10.4337, 35.0131, -49.074398, -8.1437, 28.0697, -49.384697, -8.6889, 30.770199, -50.6806, -8.690599, 29.3771, -49.074398, -8.1437, 28.0697, -47.7968, -8.1437, 29.4487, -49.384697, -8.6889, 30.770199, -50.6806, -8.690599, 29.3771, -50.808, -9.176499, 31.954699, -52.1102, -9.1764, 30.5408, -50.6806, -8.690599, 29.3771, -49.384697, -8.6889, 30.770199, -50.808, -9.176499, 31.954699, -52.1102, -9.1764, 30.5408, -52.4946, -9.7535, 33.3584, -53.7992, -9.7493, 31.915699, -52.1102, -9.1764, 30.5408, -50.808, -9.176499, 31.954699, -52.4946, -9.7535, 33.3584, -50.290497, -8.1437, 26.7572, -50.6806, -8.690599, 29.3771, -51.906998, -8.6923, 28.058699, -50.290497, -8.1437, 26.7572, -49.074398, -8.1437, 28.0697, -50.6806, -8.690599, 29.3771, -51.906998, -8.6923, 28.058699, -52.1102, -9.1764, 30.5408, -53.3363, -9.1763, 29.2095, -51.906998, -8.6923, 28.058699, -50.6806, -8.690599, 29.3771, -52.1102, -9.1764, 30.5408, -55.0202, -9.745399, 30.5653, -55.8173, -10.4337, 33.5585, -57.058, -10.4337, 32.2062, -55.0202, -9.745399, 30.5653, -53.7992, -9.7493, 31.915699, -55.8173, -10.4337, 33.5585, -53.3363, -9.1763, 29.2095, -53.7992, -9.7493, 31.915699, -55.0202, -9.745399, 30.5653, -53.3363, -9.1763, 29.2095, -52.1102, -9.1764, 30.5408, -53.7992, -9.7493, 31.915699, -53.117798, -8.6939, 26.7572, -53.3363, -9.1763, 29.2095, -54.5561, -9.1761, 27.885199, -53.117798, -8.6939, 26.7572, -51.906998, -8.6923, 28.058699, -53.3363, -9.1763, 29.2095, -56.245598, -9.7414, 29.2101, -57.058, -10.4337, 32.2062, -58.316597, -10.4337, 30.834398, -56.245598, -9.7414, 29.2101, -55.0202, -9.745399, 30.5653, -57.058, -10.4337, 32.2062, -54.5561, -9.1761, 27.885199, -55.0202, -9.745399, 30.5653, -56.245598, -9.7414, 29.2101, -54.5561, -9.1761, 27.885199, -53.3363, -9.1763, 29.2095, -55.0202, -9.745399, 30.5653, -57.2836, -9.7381, 28.062199, -58.316597, -10.4337, 30.834398, -59.3761, -10.4337, 29.679499, -57.2836, -9.7381, 28.062199, -56.245598, -9.7414, 29.2101, -58.316597, -10.4337, 30.834398, -55.5951, -9.176, 26.7572, -56.245598, -9.7414, 29.2101, -57.2836, -9.7381, 28.062199, -55.5951, -9.176, 26.7572, -54.5561, -9.1761, 27.885199, -56.245598, -9.7414, 29.2101, -58.463497, -9.7343, 26.7572, -59.3761, -10.4337, 29.679499, -60.611, -10.4337, 28.3335, -58.463497, -9.7343, 26.7572, -57.2836, -9.7381, 28.062199, -59.3761, -10.4337, 29.679499, 20.0676, 0.0021, 3.3446, 23.4123, 0, -0.000100016594, 23.4123, 0, 3.3446, 20.0676, 0.0021, 3.3446, 20.229, 0.030399999, -0.05219996, 23.4123, 0, -0.000100016594, 6.6893, 3.3913999, 3.3446, 10.0336, 3.1929998, -0.000100016594, 10.0336, 3.1929998, 3.3446, 6.6893, 3.3913999, 3.3446, 6.6893, 3.3913999, -0.000100016594, 10.0336, 3.1929998, -0.000100016594, 23.4123, 0, 3.3446, 26.7582, -0.83089995, 6.6893, 23.4123, 0, 6.6893, 23.4123, 0, 3.3446, 26.7575, -0.7312, 3.3446, 26.7582, -0.83089995, 6.6893, 23.4123, 0, 6.6893, 26.7582, -0.83089995, 6.6893, 23.4123, -0.35529998, 10.033899, 20.0676, 0.0021, 3.3446, 20.0676, 0, 10.0338, 17.491, 0.0034999999, 7.408, 17.491, 0.0034999999, 7.408, 14.0257, 0.0442, 7.3251996, 20.0676, 0.0021, 3.3446, 20.0676, 0, 10.0338, 23.4123, 0, 6.6893, 23.4123, -0.35529998, 10.033899, 20.0676, 0.0021, 3.3446, 23.4123, 0, 3.3446, 23.4123, 0, 6.6893, 12.7055, 1.032, 4.0926, 11.277899, 2.3706, -0.000100016594, 14.261799, 0.9069, 1.1804999, 12.7055, 1.032, 4.0926, 11.2782, 2.1174, 3.3446, 11.277899, 2.3706, -0.000100016594, 10.0336, 3.1929998, 3.3446, 11.277899, 2.3706, -0.000100016594, 11.2782, 2.1174, 3.3446, 10.0336, 3.1929998, 3.3446, 10.0336, 3.1929998, -0.000100016594, 11.277899, 2.3706, -0.000100016594, 20.229, 0.030399999, -0.05219996, 20.0676, 0.0021, 3.3446, 14.261799, 0.9069, 1.1804999, 14.0257, 0.0442, 7.3251996, 14.261799, 0.9069, 1.1804999, 20.0676, 0.0021, 3.3446, 12.7055, 1.032, 4.0926, 14.261799, 0.9069, 1.1804999, 14.0257, 0.0442, 7.3251996, 26.7575, -0.7312, 3.3446, 23.4123, 0, 3.3446, 23.4123, 0, -0.000100016594, 20.0676, 0, 10.0338, 20.0676, 0.0021, 3.3446, 23.4123, 0, 6.6893, 17.253021, -20.068901, 7.9789844, 17.227175, -19.735691, 9.261204, 17.026821, -20.231876, 8.073181, 17.253021, -20.068901, 7.9789844, 17.434578, -19.605183, 9.12792, 17.227175, -19.735691, 9.261204, 17.434578, -19.605183, 9.12792, 17.571707, -18.471199, 10.41548, 17.227175, -19.735691, 9.261204, 17.434578, -19.605183, 9.12792, 17.629164, -18.471626, 10.358021, 17.571707, -18.471199, 10.41548, 17.227175, -19.735691, 9.261204, 17.571707, -18.471199, 10.41548, 17.608658, -18.470558, 10.487461, 17.026821, -20.231876, 8.073181, 17.227175, -19.735691, 9.261204, 17.33739, -19.946938, 9.406449, 17.227175, -19.735691, 9.261204, 17.608658, -18.470558, 10.487461, 17.33739, -19.946938, 9.406449, 17.026821, -20.231876, 8.073181, 17.33739, -19.946938, 9.406449, 17.131271, -20.495667, 8.150929, 17.33739, -19.946938, 9.406449, 17.608658, -18.470558, 10.487461, 17.688543, -18.470558, 10.474859, 17.131271, -20.495667, 8.150929, 17.33739, -19.946938, 9.406449, 17.61293, -19.946938, 9.362875, 17.33739, -19.946938, 9.406449, 17.688543, -18.470558, 10.474859, 17.61293, -19.946938, 9.362875, 17.131271, -20.495667, 8.150929, 17.61293, -19.946938, 9.362875, 17.421762, -20.495667, 8.105006, 17.61293, -19.946938, 9.362875, 17.688543, -18.470558, 10.474859, 17.701359, -18.471199, 10.394974, 17.421762, -20.495667, 8.105006, 17.61293, -19.946938, 9.362875, 17.67295, -19.735691, 9.190718, 17.61293, -19.946938, 9.362875, 17.701359, -18.471199, 10.394974, 17.67295, -19.735691, 9.190718, 17.67295, -19.735691, 9.190718, 17.701359, -18.471199, 10.394974, 17.629164, -18.471626, 10.358021, 17.421762, -20.495667, 8.105006, 17.67295, -19.735691, 9.190718, 17.497162, -20.231876, 7.998849, 17.67295, -19.735691, 9.190718, 17.629164, -18.471626, 10.358021, 17.434578, -19.605183, 9.12792, 17.497162, -20.231876, 7.998849, 17.67295, -19.735691, 9.190718, 17.434578, -19.605183, 9.12792, 17.497162, -20.231876, 7.998849, 17.434578, -19.605183, 9.12792, 17.253021, -20.068901, 7.9789844, 16.28308, -22.030998, 7.9881697, 17.28207, -19.97385, 8.213941, 16.7107, -22.030998, 8.612513, 16.28308, -22.030998, 7.9881697, 17.120804, -19.944588, 7.9881687, 17.28207, -19.97385, 8.213941, 17.120804, -19.944588, 7.9881687, 17.36345, -17.907732, 8.087917, 17.28207, -19.97385, 8.213941, 17.120804, -19.944588, 7.9881687, 17.291254, -17.900043, 7.9881682, 17.36345, -17.907732, 8.087917, 17.28207, -19.97385, 8.213941, 17.36345, -17.907732, 8.087917, 17.480074, -17.92012, 8.049685, 16.7107, -22.030998, 8.612513, 17.28207, -19.97385, 8.213941, 17.543299, -20.021269, 8.127647, 17.28207, -19.97385, 8.213941, 17.480074, -17.92012, 8.049685, 17.543299, -20.021269, 8.127647, 16.7107, -22.030998, 8.612513, 17.543299, -20.021269, 8.127647, 17.402325, -22.030998, 8.373924, 17.543299, -20.021269, 8.127647, 17.480074, -17.92012, 8.049685, 17.480074, -17.92012, 7.926439, 17.402325, -22.030998, 8.373924, 17.543299, -20.021269, 8.127647, 17.543299, -20.02127, 7.8486905, 17.543299, -20.021269, 8.127647, 17.480074, -17.92012, 7.926439, 17.543299, -20.02127, 7.8486905, 17.402325, -22.030998, 8.373924, 17.543299, -20.02127, 7.8486905, 17.402325, -22.030998, 7.602201, 17.543299, -20.02127, 7.8486905, 17.480074, -17.92012, 7.926439, 17.36345, -17.907732, 7.8884187, 17.402325, -22.030998, 7.602201, 17.543299, -20.02127, 7.8486905, 17.28207, -19.97385, 7.7623973, 17.543299, -20.02127, 7.8486905, 17.36345, -17.907732, 7.8884187, 17.28207, -19.97385, 7.7623973, 17.28207, -19.97385, 7.7623973, 17.36345, -17.907732, 7.8884187, 17.291254, -17.900043, 7.9881682, 17.402325, -22.030998, 7.602201, 17.28207, -19.97385, 7.7623973, 16.7107, -22.030998, 7.363827, 17.28207, -19.97385, 7.7623973, 17.291254, -17.900043, 7.9881682, 17.120804, -19.944588, 7.9881687, 16.7107, -22.030998, 7.363827, 17.28207, -19.97385, 7.7623973, 17.120804, -19.944588, 7.9881687, 16.7107, -22.030998, 7.363827, 17.120804, -19.944588, 7.9881687, 16.28308, -22.030998, 7.9881697, 17.194283, -19.802975, 7.602841, 18.323994, -19.463997, 6.9496627, 17.395275, -19.968939, 7.750009, 17.194283, -19.802975, 7.602841, 18.09865, -19.331139, 6.83902, 18.323994, -19.463997, 6.9496627, 18.09865, -19.331139, 6.83902, 19.147194, -18.177078, 6.041237, 18.323994, -19.463997, 6.9496627, 18.09865, -19.331139, 6.83902, 19.067095, -18.177505, 6.0213723, 19.147194, -18.177078, 6.041237, 18.323994, -19.463997, 6.9496627, 19.147194, -18.177078, 6.041237, 19.190767, -18.176437, 5.9711766, 17.395275, -19.968939, 7.750009, 18.323994, -19.463997, 6.9496627, 18.392344, -19.679089, 6.777077, 18.323994, -19.463997, 6.9496627, 19.190767, -18.176437, 5.9711766, 18.392344, -19.679089, 6.777077, 17.395275, -19.968939, 7.750009, 18.392344, -19.679089, 6.777077, 17.408092, -20.237429, 7.618006, 18.392344, -19.679089, 6.777077, 19.190767, -18.176437, 5.9711766, 19.137367, -18.176437, 5.908166, 17.408092, -20.237429, 7.618006, 18.392344, -19.679089, 6.777077, 18.209078, -19.679089, 6.560063, 18.392344, -19.679089, 6.777077, 19.137367, -18.176437, 5.908166, 18.209078, -19.679089, 6.560063, 17.408092, -20.237429, 7.618006, 18.209078, -19.679089, 6.560063, 17.214787, -20.237429, 7.389458, 18.209078, -19.679089, 6.560063, 19.137367, -18.176437, 5.908166, 19.061113, -18.177078, 5.9391375, 17.214787, -20.237429, 7.389458, 18.209078, -19.679089, 6.560063, 18.027735, -19.463997, 6.5985103, 18.209078, -19.679089, 6.560063, 19.061113, -18.177078, 5.9391375, 18.027735, -19.463997, 6.5985103, 18.027735, -19.463997, 6.5985103, 19.061113, -18.177078, 5.9391375, 19.067095, -18.177505, 6.0213723, 17.214787, -20.237429, 7.389458, 18.027735, -19.463997, 6.5985103, 17.082785, -19.968939, 7.379846, 18.027735, -19.463997, 6.5985103, 19.067095, -18.177505, 6.0213723, 18.09865, -19.331139, 6.83902, 17.082785, -19.968939, 7.379846, 18.027735, -19.463997, 6.5985103, 18.09865, -19.331139, 6.83902, 17.082785, -19.968939, 7.379846, 18.09865, -19.331139, 6.83902, 17.194283, -19.802975, 7.602841, 19.916355, -18.10766, 4.50975, 18.669378, -17.361996, 4.594761, 18.997677, -18.38085, 4.7551727, 18.997677, -18.38085, 4.7551727, 18.669378, -17.361996, 4.594761, 17.938025, -17.356228, 5.7366476, 18.997677, -18.38085, 4.7551727, 17.938025, -17.356228, 5.7366476, 18.45151, -18.10766, 5.7464733, 19.916355, -18.10766, 4.50975, 19.861246, -17.356228, 4.1126738, 18.669378, -17.361996, 4.594761, 20.759848, -18.352869, 5.1768117, 19.861246, -17.356228, 4.1126738, 19.916355, -18.10766, 4.50975, 18.669378, -17.361996, 4.594761, 18.361372, -16.59625, 5.750745, 17.938025, -17.356228, 5.7366476, 20.759848, -18.352869, 5.1768117, 20.69171, -17.339567, 4.9839334, 19.861246, -17.356228, 4.1126738, 20.916626, -18.072844, 6.2943482, 20.69171, -17.339567, 4.9839334, 20.759848, -18.352869, 5.1768117, 19.861246, -17.356228, 4.1126738, 18.80138, -16.33182, 5.093936, 18.669378, -17.361996, 4.594761, 18.669378, -17.361996, 4.594761, 18.80138, -16.33182, 5.093936, 18.361372, -16.59625, 5.750745, 20.69171, -17.339567, 4.9839334, 19.58528, -16.596252, 4.7173653, 19.861246, -17.356228, 4.1126738, 19.861246, -17.356228, 4.1126738, 19.58528, -16.596252, 4.7173653, 18.80138, -16.33182, 5.093936, 20.916626, -18.072844, 6.2943482, 20.971521, -17.322693, 6.3201933, 20.69171, -17.339567, 4.9839334, 20.971521, -17.322693, 6.3201933, 20.916626, -18.072844, 6.2943482, 20.598795, -18.324886, 7.2226386, 20.69171, -17.339567, 4.9839334, 20.07292, -16.326265, 5.255842, 19.58528, -16.596252, 4.7173653, 20.971521, -17.322693, 6.3201933, 20.07292, -16.326265, 5.255842, 20.69171, -17.339567, 4.9839334, 19.58528, -16.596252, 4.7173653, 19.312944, -15.988569, 5.813969, 18.80138, -16.33182, 5.093936, 19.58528, -16.596252, 4.7173653, 20.07292, -16.326265, 5.255842, 19.312944, -15.988569, 5.813969, 20.971521, -17.322693, 6.3201933, 20.39054, -16.581512, 6.067722, 20.07292, -16.326265, 5.255842, 20.971521, -17.322693, 6.3201933, 20.598795, -18.324886, 7.2226386, 20.51122, -17.317139, 7.2331047, 20.39054, -16.581512, 6.067722, 20.971521, -17.322693, 6.3201933, 20.51122, -17.317139, 7.2331047, 20.51122, -17.317139, 7.2331047, 20.598795, -18.324886, 7.2226386, 19.692719, -18.072844, 7.327728, 20.07292, -16.326265, 5.255842, 20.39054, -16.581512, 6.067722, 19.963133, -16.320711, 6.583985, 20.39054, -16.581512, 6.067722, 20.51122, -17.317139, 7.2331047, 19.963133, -16.320711, 6.583985, 20.07292, -16.326265, 5.255842, 19.963133, -16.320711, 6.583985, 19.312944, -15.988569, 5.813969, 20.51122, -17.317139, 7.2331047, 19.692719, -18.072844, 7.327728, 19.590406, -17.322693, 7.4862165, 19.963133, -16.320711, 6.583985, 20.51122, -17.317139, 7.2331047, 19.590406, -17.322693, 7.4862165, 18.836624, -18.352867, 6.800999, 19.590406, -17.322693, 7.4862165, 19.692719, -18.072844, 7.327728, 19.312944, -15.988569, 5.813969, 19.963133, -16.320711, 6.583985, 19.407354, -16.581512, 6.8975444, 19.963133, -16.320711, 6.583985, 19.590406, -17.322693, 7.4862165, 19.407354, -16.581512, 6.8975444, 18.836624, -18.352867, 6.800999, 18.488676, -17.339567, 6.8439317, 19.590406, -17.322693, 7.4862165, 18.488676, -17.339567, 6.8439317, 19.407354, -16.581512, 6.8975444, 19.590406, -17.322693, 7.4862165, 18.45151, -18.10766, 5.7464733, 18.488676, -17.339567, 6.8439317, 18.836624, -18.352867, 6.800999, 18.45151, -18.10766, 5.7464733, 17.938025, -17.356228, 5.7366476, 18.488676, -17.339567, 6.8439317, 18.488676, -17.339567, 6.8439317, 18.691593, -16.326265, 6.4220786, 19.407354, -16.581512, 6.8975444, 19.312944, -15.988569, 5.813969, 19.407354, -16.581512, 6.8975444, 18.691593, -16.326265, 6.4220786, 17.938025, -17.356228, 5.7366476, 18.691593, -16.326265, 6.4220786, 18.488676, -17.339567, 6.8439317, 18.80138, -16.33182, 5.093936, 19.312944, -15.988569, 5.813969, 18.691593, -16.326265, 6.4220786, 17.938025, -17.356228, 5.7366476, 18.361372, -16.59625, 5.750745, 18.691593, -16.326265, 6.4220786, 18.80138, -16.33182, 5.093936, 18.691593, -16.326265, 6.4220786, 18.361372, -16.59625, 5.750745, 20.916626, -18.072844, 6.2943482, 19.867655, -18.690779, 6.0138965, 20.598795, -18.324886, 7.2226386, 20.916626, -18.072844, 6.2943482, 20.759848, -18.352869, 5.1768117, 19.867655, -18.690779, 6.0138965, 20.598795, -18.324886, 7.2226386, 19.867655, -18.690779, 6.0138965, 18.836624, -18.352867, 6.800999, 20.598795, -18.324886, 7.2226386, 18.836624, -18.352867, 6.800999, 19.692719, -18.072844, 7.327728, 19.867655, -18.690779, 6.0138965, 18.45151, -18.10766, 5.7464733, 18.836624, -18.352867, 6.800999, 19.867655, -18.690779, 6.0138965, 18.997677, -18.38085, 4.7551727, 18.45151, -18.10766, 5.7464733, 20.759848, -18.352869, 5.1768117, 18.997677, -18.38085, 4.7551727, 19.867655, -18.690779, 6.0138965, 20.759848, -18.352869, 5.1768117, 19.916355, -18.10766, 4.50975, 18.997677, -18.38085, 4.7551727, 15.432323, -17.738777, 11.597307, 17.151134, -15.819399, 12.648415, 17.029385, -18.463295, 12.383129, 17.029385, -18.463295, 12.383129, 17.151134, -15.819399, 12.648415, 19.233913, -15.752116, 11.624861, 17.029385, -18.463295, 12.383129, 19.233913, -15.752116, 11.624861, 18.862041, -17.774446, 11.419596, 15.432323, -17.738777, 11.597307, 15.174299, -15.860622, 12.197086, 17.151134, -15.819399, 12.648415, 14.790466, -18.280245, 9.459635, 15.174299, -15.860622, 12.197086, 15.432323, -17.738777, 11.597307, 17.151134, -15.819399, 12.648415, 18.632425, -13.811806, 11.039606, 19.233913, -15.752116, 11.624861, 14.790466, -18.280245, 9.459635, 14.663164, -15.672873, 9.612782, 15.174299, -15.860622, 12.197086, 15.765963, -17.546755, 7.471905, 14.663164, -15.672873, 9.612782, 14.790466, -18.280245, 9.459635, 15.174299, -15.860622, 12.197086, 17.378614, -13.149656, 11.438818, 17.151134, -15.819399, 12.648415, 17.151134, -15.819399, 12.648415, 17.378614, -13.149656, 11.438818, 18.632425, -13.811806, 11.039606, 14.663164, -15.672873, 9.612782, 16.05389, -13.860292, 11.293999, 15.174299, -15.860622, 12.197086, 15.174299, -15.860622, 12.197086, 16.05389, -13.860292, 11.293999, 17.378614, -13.149656, 11.438818, 15.765963, -17.546755, 7.471905, 15.501957, -15.53254, 7.0716248, 14.663164, -15.672873, 9.612782, 15.501957, -15.53254, 7.0716248, 15.765963, -17.546755, 7.471905, 17.558678, -18.333218, 6.7520857, 14.663164, -15.672873, 9.612782, 15.88579, -13.113132, 9.809076, 16.05389, -13.860292, 11.293999, 15.501957, -15.53254, 7.0716248, 15.88579, -13.113132, 9.809076, 14.663164, -15.672873, 9.612782, 16.05389, -13.860292, 11.293999, 17.454443, -12.259815, 9.87465, 17.378614, -13.149656, 11.438818, 16.05389, -13.860292, 11.293999, 15.88579, -13.113132, 9.809076, 17.454443, -12.259815, 9.87465, 15.501957, -15.53254, 7.0716248, 16.199562, -13.714193, 8.2419195, 15.88579, -13.113132, 9.809076, 15.501957, -15.53254, 7.0716248, 17.558678, -18.333218, 6.7520857, 17.574484, -15.715379, 6.749949, 16.199562, -13.714193, 8.2419195, 15.501957, -15.53254, 7.0716248, 17.574484, -15.715379, 6.749949, 17.574484, -15.715379, 6.749949, 17.558678, -18.333218, 6.7520857, 19.186922, -17.80478, 7.9181085, 15.88579, -13.113132, 9.809076, 16.199562, -13.714193, 8.2419195, 17.48456, -13.123599, 8.222482, 16.199562, -13.714193, 8.2419195, 17.574484, -15.715379, 6.749949, 17.48456, -13.123599, 8.222482, 15.88579, -13.113132, 9.809076, 17.48456, -13.123599, 8.222482, 17.454443, -12.259815, 9.87465, 17.574484, -15.715379, 6.749949, 19.186922, -17.80478, 7.9181085, 19.541065, -15.924276, 7.9029427, 17.48456, -13.123599, 8.222482, 17.574484, -15.715379, 6.749949, 19.541065, -15.924276, 7.9029427, 19.797594, -18.516268, 9.675581, 19.541065, -15.924276, 7.9029427, 19.186922, -17.80478, 7.9181085, 17.454443, -12.259815, 9.87465, 17.48456, -13.123599, 8.222482, 18.768915, -13.888488, 8.611227, 17.48456, -13.123599, 8.222482, 19.541065, -15.924276, 7.9029427, 18.768915, -13.888488, 8.611227, 19.797594, -18.516268, 9.675581, 20.062454, -15.861905, 9.785582, 19.541065, -15.924276, 7.9029427, 20.062454, -15.861905, 9.785582, 18.768915, -13.888488, 8.611227, 19.541065, -15.924276, 7.9029427, 18.862041, -17.774446, 11.419596, 20.062454, -15.861905, 9.785582, 19.797594, -18.516268, 9.675581, 18.862041, -17.774446, 11.419596, 19.233913, -15.752116, 11.624861, 20.062454, -15.861905, 9.785582, 20.062454, -15.861905, 9.785582, 18.977385, -13.160124, 9.852436, 18.768915, -13.888488, 8.611227, 17.454443, -12.259815, 9.87465, 18.768915, -13.888488, 8.611227, 18.977385, -13.160124, 9.852436, 19.233913, -15.752116, 11.624861, 18.977385, -13.160124, 9.852436, 20.062454, -15.861905, 9.785582, 17.378614, -13.149656, 11.438818, 17.454443, -12.259815, 9.87465, 18.977385, -13.160124, 9.852436, 19.233913, -15.752116, 11.624861, 18.632425, -13.811806, 11.039606, 18.977385, -13.160124, 9.852436, 17.378614, -13.149656, 11.438818, 18.977385, -13.160124, 9.852436, 18.632425, -13.811806, 11.039606, 15.765963, -17.546755, 7.471905, 17.271177, -19.275177, 9.523714, 17.558678, -18.333218, 6.7520857, 15.765963, -17.546755, 7.471905, 14.790466, -18.280245, 9.459635, 17.271177, -19.275177, 9.523714, 17.558678, -18.333218, 6.7520857, 17.271177, -19.275177, 9.523714, 19.797594, -18.516268, 9.675581, 17.558678, -18.333218, 6.7520857, 19.797594, -18.516268, 9.675581, 19.186922, -17.80478, 7.9181085, 17.271177, -19.275177, 9.523714, 18.862041, -17.774446, 11.419596, 19.797594, -18.516268, 9.675581, 17.271177, -19.275177, 9.523714, 17.029385, -18.463295, 12.383129, 18.862041, -17.774446, 11.419596, 14.790466, -18.280245, 9.459635, 17.029385, -18.463295, 12.383129, 17.271177, -19.275177, 9.523714, 14.790466, -18.280245, 9.459635, 15.432323, -17.738777, 11.597307, 17.029385, -18.463295, 12.383129, 6.450511, 5.6386614, 17.721281, 5.116558, 6.049283, 18.568323, 6.1998763, 5.437825, 17.553066, 6.450511, 5.6386614, 17.721281, 5.394739, 6.2101097, 18.690458, 5.116558, 6.049283, 18.568323, 5.394739, 6.2101097, 18.690458, 4.166137, 7.607539, 19.708622, 5.116558, 6.049283, 18.568323, 5.394739, 6.2101097, 18.690458, 4.2640667, 7.6070127, 19.728611, 4.166137, 7.607539, 19.708622, 5.116558, 6.049283, 18.568323, 4.166137, 7.607539, 19.708622, 4.117188, 7.608329, 19.795757, 6.1998763, 5.437825, 17.553066, 5.116558, 6.049283, 18.568323, 5.0425253, 5.7889595, 18.780462, 5.116558, 6.049283, 18.568323, 4.117188, 7.608329, 19.795757, 5.0425253, 5.7889595, 18.780462, 6.1998763, 5.437825, 17.553066, 5.0425253, 5.7889595, 18.780462, 6.190998, 5.1124864, 17.713438, 5.0425253, 5.7889595, 18.780462, 4.117188, 7.608329, 19.795757, 4.1845627, 7.608329, 19.869196, 6.190998, 5.1124864, 17.713438, 5.0425253, 5.7889595, 18.780462, 5.2750225, 5.7889595, 19.03369, 5.0425253, 5.7889595, 18.780462, 4.1845627, 7.608329, 19.869196, 5.2750225, 5.7889595, 19.03369, 6.190998, 5.1124864, 17.713438, 5.2750225, 5.7889595, 19.03369, 6.436242, 5.1124864, 17.980635, 5.2750225, 5.7889595, 19.03369, 4.1845627, 7.608329, 19.869196, 4.2755394, 7.607539, 19.827774, 6.436242, 5.1124864, 17.980635, 5.2750225, 5.7889595, 19.03369, 5.492837, 6.049283, 18.978226, 5.2750225, 5.7889595, 19.03369, 4.2755394, 7.607539, 19.827774, 5.492837, 6.049283, 18.978226, 5.492837, 6.049283, 18.978226, 4.2755394, 7.607539, 19.827774, 4.2640667, 7.6070127, 19.728611, 6.436242, 5.1124864, 17.980635, 5.492837, 6.049283, 18.978226, 6.596695, 5.437825, 17.985352, 5.492837, 6.049283, 18.978226, 4.2640667, 7.6070127, 19.728611, 5.394739, 6.2101097, 18.690458, 6.596695, 5.437825, 17.985352, 5.492837, 6.049283, 18.978226, 5.394739, 6.2101097, 18.690458, 6.596695, 5.437825, 17.985352, 5.394739, 6.2101097, 18.690458, 6.450511, 5.6386614, 17.721281, 5.7805123, 3.2207327, 16.731695, 6.2294216, 5.7555304, 17.911285, 5.4306893, 3.2207327, 17.595985, 5.7805123, 3.2207327, 16.731695, 6.351206, 5.7918544, 17.591637, 6.2294216, 5.7555304, 17.911285, 6.351206, 5.7918544, 17.591637, 6.4141273, 8.301909, 17.908752, 6.2294216, 5.7555304, 17.911285, 6.351206, 5.7918544, 17.591637, 6.4673533, 8.311122, 17.766653, 6.4141273, 8.301909, 17.908752, 6.2294216, 5.7555304, 17.911285, 6.4141273, 8.301909, 17.908752, 6.532635, 8.286643, 18.002592, 5.4306893, 3.2207327, 17.595985, 6.2294216, 5.7555304, 17.911285, 6.495885, 5.697096, 18.12049, 6.2294216, 5.7555304, 17.911285, 6.532635, 8.286643, 18.002592, 6.495885, 5.697096, 18.12049, 5.4306893, 3.2207327, 17.595985, 6.495885, 5.697096, 18.12049, 6.146731, 3.2207327, 18.143703, 6.495885, 5.697096, 18.12049, 6.532635, 8.286643, 18.002592, 6.6594005, 8.286643, 17.918467, 6.146731, 3.2207327, 18.143703, 6.495885, 5.697096, 18.12049, 6.7823133, 5.697096, 17.930405, 6.495885, 5.697096, 18.12049, 6.6594005, 8.286643, 17.918467, 6.7823133, 5.697096, 17.930405, 6.146731, 3.2207327, 18.143703, 6.7823133, 5.697096, 17.930405, 6.939343, 3.2207327, 17.617693, 6.7823133, 5.697096, 17.930405, 6.6594005, 8.286643, 17.918467, 6.6189694, 8.301909, 17.77281, 6.939343, 3.2207327, 17.617693, 6.7823133, 5.697096, 17.930405, 6.693058, 5.7555304, 17.603598, 6.7823133, 5.697096, 17.930405, 6.6189694, 8.301909, 17.77281, 6.693058, 5.7555304, 17.603598, 6.693058, 5.7555304, 17.603598, 6.6189694, 8.301909, 17.77281, 6.4673533, 8.311122, 17.766653, 6.939343, 3.2207327, 17.617693, 6.693058, 5.7555304, 17.603598, 6.712817, 3.2207322, 16.745113, 6.693058, 5.7555304, 17.603598, 6.4673533, 8.311122, 17.766653, 6.351206, 5.7918544, 17.591637, 6.712817, 3.2207322, 16.745113, 6.693058, 5.7555304, 17.603598, 6.351206, 5.7918544, 17.591637, 6.712817, 3.2207322, 16.745113, 6.351206, 5.7918544, 17.591637, 5.7805123, 3.2207327, 16.731695, 6.732394, 5.966105, 17.783781, 8.337761, 6.384096, 17.883148, 6.83874, 5.7618475, 18.072077, 6.83874, 5.7618475, 18.072077, 6.302865, 5.6723533, 17.875813, 6.732394, 5.966105, 17.783781, 6.83874, 5.7618475, 18.072077, 6.3696475, 5.543639, 18.05737, 6.302865, 5.6723533, 17.875813, 6.732394, 5.966105, 17.783781, 8.181509, 6.5478187, 17.616283, 8.337761, 6.384096, 17.883148, 8.181509, 6.5478187, 17.616283, 9.801905, 7.9697266, 17.51171, 8.337761, 6.384096, 17.883148, 8.181509, 6.5478187, 17.616283, 9.733292, 7.9692, 17.436882, 9.801905, 7.9697266, 17.51171, 8.337761, 6.384096, 17.883148, 9.801905, 7.9697266, 17.51171, 9.894417, 7.970516, 17.469269, 8.337761, 6.384096, 17.883148, 9.894417, 7.970516, 17.469269, 8.525363, 6.119035, 17.752645, 6.83874, 5.7618475, 18.072077, 8.337761, 6.384096, 17.883148, 8.525363, 6.119035, 17.752645, 8.525363, 6.119035, 17.752645, 9.894417, 7.970516, 17.469269, 9.882729, 7.970516, 17.368353, 6.9416494, 5.4307184, 17.94534, 6.3696475, 5.543639, 18.05737, 6.83874, 5.7618475, 18.072077, 6.83874, 5.7618475, 18.072077, 8.525363, 6.119035, 17.752645, 6.9416494, 5.4307184, 17.94534, 6.9416494, 5.4307184, 17.94534, 6.4345694, 5.33517, 17.977638, 6.3696475, 5.543639, 18.05737, 8.525363, 6.119035, 17.752645, 9.882729, 7.970516, 17.368353, 8.485138, 6.119035, 17.40499, 6.9416494, 5.4307184, 17.94534, 8.525363, 6.119035, 17.752645, 8.485138, 6.119035, 17.40499, 8.485138, 6.119035, 17.40499, 9.882729, 7.970516, 17.368353, 9.783121, 7.9697266, 17.348215, 6.899346, 5.4307184, 17.578844, 6.4345694, 5.33517, 17.977638, 6.9416494, 5.4307184, 17.94534, 6.9416494, 5.4307184, 17.94534, 8.485138, 6.119035, 17.40499, 6.899346, 5.4307184, 17.578844, 6.899346, 5.4307184, 17.578844, 6.4079695, 5.33517, 17.746672, 6.4345694, 5.33517, 17.977638, 8.485138, 6.119035, 17.40499, 9.783121, 7.9697266, 17.348215, 8.2728, 6.384096, 17.320663, 6.899346, 5.4307184, 17.578844, 8.485138, 6.119035, 17.40499, 8.2728, 6.384096, 17.320663, 8.2728, 6.384096, 17.320663, 9.783121, 7.9697266, 17.348215, 9.733292, 7.9692, 17.436882, 8.2728, 6.384096, 17.320663, 9.733292, 7.9692, 17.436882, 8.181509, 6.5478187, 17.616283, 6.899346, 5.4307184, 17.578844, 8.2728, 6.384096, 17.320663, 6.7699003, 5.7618475, 17.478994, 6.7699003, 5.7618475, 17.478994, 6.4079695, 5.33517, 17.746672, 6.899346, 5.4307184, 17.578844, 6.7699003, 5.7618475, 17.478994, 8.2728, 6.384096, 17.320663, 8.181509, 6.5478187, 17.616283, 6.7699003, 5.7618475, 17.478994, 6.326483, 5.543639, 17.683863, 6.4079695, 5.33517, 17.746672, 6.7699003, 5.7618475, 17.478994, 8.181509, 6.5478187, 17.616283, 6.732394, 5.966105, 17.783781, 6.732394, 5.966105, 17.783781, 6.326483, 5.543639, 17.683863, 6.7699003, 5.7618475, 17.478994, 6.732394, 5.966105, 17.783781, 6.302865, 5.6723533, 17.875813, 6.326483, 5.543639, 17.683863, 11.635334, 8.055535, 16.46335, 10.297312, 8.974432, 15.70101, 10.525072, 7.7188787, 16.089432, 10.525072, 7.7188787, 16.089432, 10.297312, 8.974432, 15.70101, 8.768291, 8.9812765, 16.37455, 10.525072, 7.7188787, 16.089432, 8.768291, 8.9812765, 16.37455, 9.2888565, 8.055536, 16.734821, 11.635334, 8.055535, 16.46335, 11.849512, 8.981276, 16.018257, 10.297312, 8.974432, 15.70101, 12.046843, 7.75336, 17.723677, 11.849512, 8.981276, 16.018257, 11.635334, 8.055535, 16.46335, 10.297312, 8.974432, 15.70101, 9.193269, 9.9178095, 16.677896, 8.768291, 8.9812765, 16.37455, 12.046843, 7.75336, 17.723677, 12.1083145, 9.00207, 17.478806, 11.849512, 8.981276, 16.018257, 11.446236, 8.09844, 18.977428, 12.1083145, 9.00207, 17.478806, 12.046843, 7.75336, 17.723677, 11.849512, 8.981276, 16.018257, 10.092733, 10.2439375, 16.303373, 10.297312, 8.974432, 15.70101, 10.297312, 8.974432, 15.70101, 10.092733, 10.2439375, 16.303373, 9.193269, 9.9178095, 16.677896, 12.1083145, 9.00207, 17.478806, 11.154192, 9.917809, 16.450953, 11.849512, 8.981276, 16.018257, 11.849512, 8.981276, 16.018257, 11.154192, 9.917809, 16.450953, 10.092733, 10.2439375, 16.303373, 11.446236, 8.09844, 18.977428, 11.4849415, 9.022602, 19.041462, 12.1083145, 9.00207, 17.478806, 11.4849415, 9.022602, 19.041462, 11.446236, 8.09844, 18.977428, 10.487244, 7.7878428, 19.713997, 12.1083145, 9.00207, 17.478806, 11.287758, 10.250781, 17.336258, 11.154192, 9.917809, 16.450953, 11.4849415, 9.022602, 19.041462, 11.287758, 10.250781, 17.336258, 12.1083145, 9.00207, 17.478806, 11.154192, 9.917809, 16.450953, 10.127245, 10.667193, 17.391205, 10.092733, 10.2439375, 16.303373, 11.154192, 9.917809, 16.450953, 11.287758, 10.250781, 17.336258, 10.127245, 10.667193, 17.391205, 11.4849415, 9.022602, 19.041462, 11.060484, 9.936234, 18.386164, 11.287758, 10.250781, 17.336258, 11.4849415, 9.022602, 19.041462, 10.487244, 7.7878428, 19.713997, 10.390107, 9.029709, 19.664736, 11.060484, 9.936234, 18.386164, 11.4849415, 9.022602, 19.041462, 10.390107, 9.029709, 19.664736, 10.390107, 9.029709, 19.664736, 10.487244, 7.7878428, 19.713997, 9.485313, 8.098441, 19.204372, 11.287758, 10.250781, 17.336258, 11.060484, 9.936234, 18.386164, 10.269789, 10.257888, 18.624687, 11.060484, 9.936234, 18.386164, 10.390107, 9.029709, 19.664736, 10.269789, 10.257888, 18.624687, 11.287758, 10.250781, 17.336258, 10.269789, 10.257888, 18.624687, 10.127245, 10.667193, 17.391205, 10.390107, 9.029709, 19.664736, 9.485313, 8.098441, 19.204372, 9.272093, 9.022602, 19.297224, 10.269789, 10.257888, 18.624687, 10.390107, 9.029709, 19.664736, 9.272093, 9.022602, 19.297224, 8.965256, 7.7533607, 18.079897, 9.272093, 9.022602, 19.297224, 9.485313, 8.098441, 19.204372, 10.127245, 10.667193, 17.391205, 10.269789, 10.257888, 18.624687, 9.485554, 9.936234, 18.568289, 10.269789, 10.257888, 18.624687, 9.272093, 9.022602, 19.297224, 9.485554, 9.936234, 18.568289, 8.965256, 7.7533607, 18.079897, 8.57874, 9.002071, 17.886866, 9.272093, 9.022602, 19.297224, 8.57874, 9.002071, 17.886866, 9.485554, 9.936234, 18.568289, 9.272093, 9.022602, 19.297224, 9.2888565, 8.055536, 16.734821, 8.57874, 9.002071, 17.886866, 8.965256, 7.7533607, 18.079897, 9.2888565, 8.055536, 16.734821, 8.768291, 8.9812765, 16.37455, 8.57874, 9.002071, 17.886866, 8.57874, 9.002071, 17.886866, 9.07469, 10.250781, 17.592167, 9.485554, 9.936234, 18.568289, 10.127245, 10.667193, 17.391205, 9.485554, 9.936234, 18.568289, 9.07469, 10.250781, 17.592167, 8.768291, 8.9812765, 16.37455, 9.07469, 10.250781, 17.592167, 8.57874, 9.002071, 17.886866, 10.092733, 10.2439375, 16.303373, 10.127245, 10.667193, 17.391205, 9.07469, 10.250781, 17.592167, 8.768291, 8.9812765, 16.37455, 9.193269, 9.9178095, 16.677896, 9.07469, 10.250781, 17.592167, 10.092733, 10.2439375, 16.303373, 9.07469, 10.250781, 17.592167, 9.193269, 9.9178095, 16.677896, 11.446236, 8.09844, 18.977428, 10.560175, 7.3369484, 17.97454, 10.487244, 7.7878428, 19.713997, 11.446236, 8.09844, 18.977428, 12.046843, 7.75336, 17.723677, 10.560175, 7.3369484, 17.97454, 10.487244, 7.7878428, 19.713997, 10.560175, 7.3369484, 17.97454, 8.965256, 7.7533607, 18.079897, 10.487244, 7.7878428, 19.713997, 8.965256, 7.7533607, 18.079897, 9.485313, 8.098441, 19.204372, 10.560175, 7.3369484, 17.97454, 9.2888565, 8.055536, 16.734821, 8.965256, 7.7533607, 18.079897, 10.560175, 7.3369484, 17.97454, 10.525072, 7.7188787, 16.089432, 9.2888565, 8.055536, 16.734821, 12.046843, 7.75336, 17.723677, 10.525072, 7.7188787, 16.089432, 10.560175, 7.3369484, 17.97454, 12.046843, 7.75336, 17.723677, 11.635334, 8.055535, 16.46335, 10.525072, 7.7188787, 16.089432, 1.4948497, 8.510117, 18.317255, 1.5868134, 10.875402, 20.798342, 1.7763877, 7.617279, 20.49278, 1.7763877, 7.617279, 20.49278, 1.5868134, 10.875402, 20.798342, 4.0570173, 10.958316, 22.239437, 1.7763877, 7.617279, 20.49278, 4.0570173, 10.958316, 22.239437, 4.0145273, 8.465897, 21.717955, 1.4948497, 8.510117, 18.317255, 0.70318604, 10.8246, 18.46102, 1.5868134, 10.875402, 20.798342, 3.2524045, 7.8428564, 16.201567, 0.70318604, 10.8246, 18.46102, 1.4948497, 8.510117, 18.317255, 1.5868134, 10.875402, 20.798342, 4.248084, 13.349396, 21.22304, 4.0570173, 10.958316, 22.239437, 3.2524045, 7.8428564, 16.201567, 3.0084083, 11.055706, 16.17521, 0.70318604, 10.8246, 18.46102, 5.9580865, 8.746749, 15.848719, 3.0084083, 11.055706, 16.17521, 3.2524045, 7.8428564, 16.201567, 0.70318604, 10.8246, 18.46102, 2.983596, 14.165375, 20.207823, 1.5868134, 10.875402, 20.798342, 1.5868134, 10.875402, 20.798342, 2.983596, 14.165375, 20.207823, 4.248084, 13.349396, 21.22304, 3.0084083, 11.055706, 16.17521, 2.2301898, 13.289908, 18.748863, 0.70318604, 10.8246, 18.46102, 0.70318604, 10.8246, 18.46102, 2.2301898, 13.289908, 18.748863, 2.983596, 14.165375, 20.207823, 5.9580865, 8.746749, 15.848719, 6.1891904, 11.228903, 15.304886, 3.0084083, 11.055706, 16.17521, 6.1891904, 11.228903, 15.304886, 5.9580865, 8.746749, 15.848719, 7.9187675, 7.777577, 17.198952, 3.0084083, 11.055706, 16.17521, 3.6397526, 14.210384, 17.564486, 2.2301898, 13.289908, 18.748863, 6.1891904, 11.228903, 15.304886, 3.6397526, 14.210384, 17.564486, 3.0084083, 11.055706, 16.17521, 2.2301898, 13.289908, 18.748863, 4.6415443, 15.261944, 19.219688, 2.983596, 14.165375, 20.207823, 2.2301898, 13.289908, 18.748863, 3.6397526, 14.210384, 17.564486, 4.6415443, 15.261944, 19.219688, 6.1891904, 11.228903, 15.304886, 5.462911, 13.469423, 16.818632, 3.6397526, 14.210384, 17.564486, 6.1891904, 11.228903, 15.304886, 7.9187675, 7.777577, 17.198952, 7.931513, 11.003588, 17.213871, 5.462911, 13.469423, 16.818632, 6.1891904, 11.228903, 15.304886, 7.931513, 11.003588, 17.213871, 7.931513, 11.003588, 17.213871, 7.9187675, 7.777577, 17.198952, 7.831026, 8.428781, 19.665352, 3.6397526, 14.210384, 17.564486, 5.462911, 13.469423, 16.818632, 6.3584847, 14.197486, 18.1248, 5.462911, 13.469423, 16.818632, 7.931513, 11.003588, 17.213871, 6.3584847, 14.197486, 18.1248, 3.6397526, 14.210384, 17.564486, 6.3584847, 14.197486, 18.1248, 4.6415443, 15.261944, 19.219688, 7.931513, 11.003588, 17.213871, 7.831026, 8.428781, 19.665352, 8.087843, 10.745896, 20.01901, 6.3584847, 14.197486, 18.1248, 7.931513, 11.003588, 17.213871, 8.087843, 10.745896, 20.01901, 6.4428244, 7.5519996, 21.489801, 8.087843, 10.745896, 20.01901, 7.831026, 8.428781, 19.665352, 4.6415443, 15.261944, 19.219688, 6.3584847, 14.197486, 18.1248, 6.8342867, 13.254899, 19.708595, 6.3584847, 14.197486, 18.1248, 8.087843, 10.745896, 20.01901, 6.8342867, 13.254899, 19.708595, 6.4428244, 7.5519996, 21.489801, 6.510137, 10.823021, 21.836857, 8.087843, 10.745896, 20.01901, 6.510137, 10.823021, 21.836857, 6.8342867, 13.254899, 19.708595, 8.087843, 10.745896, 20.01901, 4.0145273, 8.465897, 21.717955, 6.510137, 10.823021, 21.836857, 6.4428244, 7.5519996, 21.489801, 4.0145273, 8.465897, 21.717955, 4.0570173, 10.958316, 22.239437, 6.510137, 10.823021, 21.836857, 6.510137, 10.823021, 21.836857, 5.702328, 14.152213, 20.768137, 6.8342867, 13.254899, 19.708595, 4.6415443, 15.261944, 19.219688, 6.8342867, 13.254899, 19.708595, 5.702328, 14.152213, 20.768137, 4.0570173, 10.958316, 22.239437, 5.702328, 14.152213, 20.768137, 6.510137, 10.823021, 21.836857, 2.983596, 14.165375, 20.207823, 4.6415443, 15.261944, 19.219688, 5.702328, 14.152213, 20.768137, 4.0570173, 10.958316, 22.239437, 4.248084, 13.349396, 21.22304, 5.702328, 14.152213, 20.768137, 2.983596, 14.165375, 20.207823, 5.702328, 14.152213, 20.768137, 4.248084, 13.349396, 21.22304, 5.9580865, 8.746749, 15.848719, 4.877001, 6.61652, 18.79238, 7.9187675, 7.777577, 17.198952, 5.9580865, 8.746749, 15.848719, 3.2524045, 7.8428564, 16.201567, 4.877001, 6.61652, 18.79238, 7.9187675, 7.777577, 17.198952, 4.877001, 6.61652, 18.79238, 6.4428244, 7.5519996, 21.489801, 7.9187675, 7.777577, 17.198952, 6.4428244, 7.5519996, 21.489801, 7.831026, 8.428781, 19.665352, 4.877001, 6.61652, 18.79238, 4.0145273, 8.465897, 21.717955, 6.4428244, 7.5519996, 21.489801, 4.877001, 6.61652, 18.79238, 1.7763877, 7.617279, 20.49278, 4.0145273, 8.465897, 21.717955, 3.2524045, 7.8428564, 16.201567, 1.7763877, 7.617279, 20.49278, 4.877001, 6.61652, 18.79238, 3.2524045, 7.8428564, 16.201567, 1.4948497, 8.510117, 18.317255, 1.7763877, 7.617279, 20.49278, -17.758068, 7.5774293, -6.836121, -20.570257, 8.332888, -7.573155, -17.84524, 7.2079325, -7.384581, -17.758068, 7.5774293, -6.836121, -20.386482, 8.628776, -7.04528, -20.570257, 8.332888, -7.573155, -20.386482, 8.628776, -7.04528, -23.297365, 11.199757, -7.426018, -20.570257, 8.332888, -7.573155, -20.386482, 8.628776, -7.04528, -23.201662, 11.198789, -7.2690005, -23.297365, 11.199757, -7.426018, -20.570257, 8.332888, -7.573155, -23.297365, 11.199757, -7.426018, -23.476107, 11.20121, -7.3828626, -17.84524, 7.2079325, -7.384581, -20.570257, 8.332888, -7.573155, -20.948885, 7.853947, -7.4072576, -20.570257, 8.332888, -7.573155, -23.476107, 11.20121, -7.3828626, -20.948885, 7.853947, -7.4072576, -17.84524, 7.2079325, -7.384581, -20.948885, 7.853947, -7.4072576, -18.072498, 6.6093764, -7.195704, -20.948885, 7.853947, -7.4072576, -23.476107, 11.20121, -7.3828626, -23.490705, 11.20121, -7.200089, -18.072498, 6.6093764, -7.195704, -20.948885, 7.853947, -7.4072576, -20.999002, 7.853947, -6.776777, -20.948885, 7.853947, -7.4072576, -23.490705, 11.20121, -7.200089, -20.999002, 7.853947, -6.776777, -18.072498, 6.6093764, -7.195704, -20.999002, 7.853947, -6.776777, -18.12548, 6.6093764, -6.5305486, -20.999002, 7.853947, -6.776777, -23.490705, 11.20121, -7.200089, -23.320944, 11.199757, -7.129349, -18.12548, 6.6093764, -6.5305486, -20.999002, 7.853947, -6.776777, -20.651468, 8.332888, -6.5526786, -20.999002, 7.853947, -6.776777, -23.320944, 11.199757, -7.129349, -20.651468, 8.332888, -6.5526786, -20.651468, 8.332888, -6.5526786, -23.320944, 11.199757, -7.129349, -23.201662, 11.198789, -7.2690005, -18.12548, 6.6093764, -6.5305486, -20.651468, 8.332888, -6.5526786, -17.930893, 7.2079325, -6.308391, -20.651468, 8.332888, -6.5526786, -23.201662, 11.198789, -7.2690005, -20.386482, 8.628776, -7.04528, -17.930893, 7.2079325, -6.308391, -20.651468, 8.332888, -6.5526786, -20.386482, 8.628776, -7.04528, -17.930893, 7.2079325, -6.308391, -20.386482, 8.628776, -7.04528, -17.758068, 7.5774293, -6.836121, -17.263433, 3.1289406, -8.978432, -18.291029, 7.792444, -6.8961415, -18.866385, 3.1289406, -8.367504, -17.263433, 3.1289406, -8.978432, -17.707705, 7.8592725, -7.132322, -18.291029, 7.792444, -6.8961415, -17.707705, 7.8592725, -7.132322, -18.056295, 12.477256, -6.650377, -18.291029, 7.792444, -6.8961415, -17.707705, 7.8592725, -7.132322, -17.798122, 12.494205, -6.756602, -18.056295, 12.477256, -6.650377, -18.291029, 7.792444, -6.8961415, -18.056295, 12.477256, -6.650377, -18.034353, 12.449168, -6.373137, -18.866385, 3.1289406, -8.367504, -18.291029, 7.792444, -6.8961415, -18.239275, 7.6849365, -6.2750163, -18.291029, 7.792444, -6.8961415, -18.034353, 12.449168, -6.373137, -18.239275, 7.6849365, -6.2750163, -18.866385, 3.1289406, -8.367504, -18.239275, 7.6849365, -6.2750163, -18.707829, 3.1289406, -6.716517, -18.239275, 7.6849365, -6.2750163, -18.034353, 12.449168, -6.373137, -17.762217, 12.449168, -6.3076463, -18.707829, 3.1289406, -6.716517, -18.239275, 7.6849365, -6.2750163, -17.624376, 7.6849365, -6.1270385, -18.239275, 7.6849365, -6.2750163, -17.762217, 12.449168, -6.3076463, -17.624376, 7.6849365, -6.1270385, -18.707829, 3.1289406, -6.716517, -17.624376, 7.6849365, -6.1270385, -17.006262, 3.1289406, -6.3070283, -17.624376, 7.6849365, -6.1270385, -17.762217, 12.449168, -6.3076463, -17.616545, 12.477256, -6.5445485, -17.006262, 3.1289406, -6.3070283, -17.624376, 7.6849365, -6.1270385, -17.295702, 7.792444, -6.656613, -17.624376, 7.6849365, -6.1270385, -17.616545, 12.477256, -6.5445485, -17.295702, 7.792444, -6.656613, -17.295702, 7.792444, -6.656613, -17.616545, 12.477256, -6.5445485, -17.798122, 12.494205, -6.756602, -17.006262, 3.1289406, -6.3070283, -17.295702, 7.792444, -6.656613, -16.113934, 3.1289406, -7.705115, -17.295702, 7.792444, -6.656613, -17.798122, 12.494205, -6.756602, -17.707705, 7.8592725, -7.132322, -16.113934, 3.1289406, -7.705115, -17.295702, 7.792444, -6.656613, -17.707705, 7.8592725, -7.132322, -16.113934, 3.1289406, -7.705115, -17.707705, 7.8592725, -7.132322, -17.263433, 3.1289406, -8.978432, -17.48928, 8.179858, -6.3779426, -15.612703, 8.948875, -4.0898643, -17.744648, 7.804066, -5.8735633, -17.744648, 7.804066, -5.8735633, -18.151243, 7.6394153, -6.841582, -17.48928, 8.179858, -6.3779426, -17.744648, 7.804066, -5.8735633, -18.312298, 7.402608, -6.524203, -18.151243, 7.6394153, -6.841582, -17.48928, 8.179858, -6.3779426, -15.448719, 9.250092, -4.6346655, -15.612703, 8.948875, -4.0898643, -15.448719, 9.250092, -4.6346655, -13.278458, 11.866108, -2.5817409, -15.612703, 8.948875, -4.0898643, -15.448719, 9.250092, -4.6346655, -13.263538, 11.865139, -2.7679238, -13.278458, 11.866108, -2.5817409, -15.612703, 8.948875, -4.0898643, -13.278458, 11.866108, -2.5817409, -13.1054, 11.867559, -2.5102086, -15.612703, 8.948875, -4.0898643, -13.1054, 11.867559, -2.5102086, -15.201872, 8.461218, -4.00046, -17.744648, 7.804066, -5.8735633, -15.612703, 8.948875, -4.0898643, -15.201872, 8.461218, -4.00046, -15.201872, 8.461218, -4.00046, -13.1054, 11.867559, -2.5102086, -12.98403, 11.867559, -2.6523442, -17.444958, 7.1948566, -5.8935885, -18.312298, 7.402608, -6.524203, -17.744648, 7.804066, -5.8735633, -17.744648, 7.804066, -5.8735633, -15.201872, 8.461218, -4.00046, -17.444958, 7.1948566, -5.8935885, -17.444958, 7.1948566, -5.8935885, -18.123537, 7.0190673, -6.536556, -18.312298, 7.402608, -6.524203, -15.201872, 8.461218, -4.00046, -12.98403, 11.867559, -2.6523442, -14.783697, 8.461218, -4.490066, -17.444958, 7.1948566, -5.8935885, -15.201872, 8.461218, -4.00046, -14.783697, 8.461218, -4.490066, -14.783697, 8.461218, -4.490066, -12.98403, 11.867559, -2.6523442, -13.081631, 11.866107, -2.811812, -17.003992, 7.1948566, -6.4095883, -18.123537, 7.0190673, -6.536556, -17.444958, 7.1948566, -5.8935885, -17.444958, 7.1948566, -5.8935885, -14.783697, 8.461218, -4.490066, -17.003992, 7.1948566, -6.4095883, -17.003992, 7.1948566, -6.4095883, -17.845564, 7.0190673, -6.8616605, -18.123537, 7.0190673, -6.536556, -14.783697, 8.461218, -4.490066, -13.081631, 11.866107, -2.811812, -14.935968, 8.948875, -4.8818517, -17.003992, 7.1948566, -6.4095883, -14.783697, 8.461218, -4.490066, -14.935968, 8.948875, -4.8818517, -14.935968, 8.948875, -4.8818517, -13.081631, 11.866107, -2.811812, -13.263538, 11.865139, -2.7679238, -14.935968, 8.948875, -4.8818517, -13.263538, 11.865139, -2.7679238, -15.448719, 9.250092, -4.6346655, -17.003992, 7.1948566, -6.4095883, -14.935968, 8.948875, -4.8818517, -17.031534, 7.8040657, -6.7090955, -17.031534, 7.8040657, -6.7090955, -17.845564, 7.0190673, -6.8616605, -17.003992, 7.1948566, -6.4095883, -17.031534, 7.8040657, -6.7090955, -14.935968, 8.948875, -4.8818517, -15.448719, 9.250092, -4.6346655, -17.031534, 7.8040657, -6.7090955, -17.862965, 7.402608, -7.050143, -17.845564, 7.0190673, -6.8616605, -17.031534, 7.8040657, -6.7090955, -15.448719, 9.250092, -4.6346655, -17.48928, 8.179858, -6.3779426, -17.48928, 8.179858, -6.3779426, -17.862965, 7.402608, -7.050143, -17.031534, 7.8040657, -6.7090955, -17.48928, 8.179858, -6.3779426, -18.151243, 7.6394153, -6.841582, -17.862965, 7.402608, -7.050143, -9.569414, 12.023977, -1.423661, -10.217659, 13.714559, -4.1817064, -10.455915, 11.404599, -3.3882995, -10.455915, 11.404599, -3.3882995, -10.217659, 13.714559, -4.1817064, -13.040308, 13.727151, -5.3989296, -10.455915, 11.404599, -3.3882995, -13.040308, 13.727151, -5.3989296, -12.873928, 12.023979, -4.2461476, -9.569414, 12.023977, -1.423661, -8.701311, 13.727149, -1.6924205, -10.217659, 13.714559, -4.1817064, -10.752665, 11.468038, 0.7093334, -8.701311, 13.727149, -1.6924205, -9.569414, 12.023977, -1.423661, -10.217659, 13.714559, -4.1817064, -12.916918, 15.450177, -4.4462667, -13.040308, 13.727151, -5.3989296, -10.752665, 11.468038, 0.7093334, -10.345652, 13.765407, 0.48551416, -8.701311, 13.727149, -1.6924205, -13.194582, 12.102914, 1.4700174, -10.345652, 13.765407, 0.48551416, -10.752665, 11.468038, 0.7093334, -8.701311, 13.727149, -1.6924205, -11.285702, 16.050184, -3.7030501, -10.217659, 13.714559, -4.1817064, -10.217659, 13.714559, -4.1817064, -11.285702, 16.050184, -3.7030501, -12.916918, 15.450177, -4.4462667, -10.345652, 13.765407, 0.48551416, -10.15527, 15.450176, -2.0876474, -8.701311, 13.727149, -1.6924205, -8.701311, 13.727149, -1.6924205, -10.15527, 15.450176, -2.0876474, -11.285702, 16.050184, -3.7030501, -13.194582, 12.102914, 1.4700174, -13.23241, 13.80318, 1.6023726, -10.345652, 13.765407, 0.48551416, -13.23241, 13.80318, 1.6023726, -13.194582, 12.102914, 1.4700174, -15.388298, 11.531479, 1.0999866, -10.345652, 13.765407, 0.48551416, -11.1811695, 16.062777, -0.7989111, -10.15527, 15.450176, -2.0876474, -13.23241, 13.80318, 1.6023726, -11.1811695, 16.062777, -0.7989111, -10.345652, 13.765407, 0.48551416, -10.15527, 15.450176, -2.0876474, -12.708605, 16.828888, -2.2941785, -11.285702, 16.050184, -3.7030501, -10.15527, 15.450176, -2.0876474, -11.1811695, 16.062777, -0.7989111, -12.708605, 16.828888, -2.2941785, -13.23241, 13.80318, 1.6023726, -12.880806, 15.484076, 0.2096405, -11.1811695, 16.062777, -0.7989111, -13.23241, 13.80318, 1.6023726, -15.388298, 11.531479, 1.0999866, -15.443556, 13.8162565, 0.90737486, -12.880806, 15.484076, 0.2096405, -13.23241, 13.80318, 1.6023726, -15.443556, 13.8162565, 0.90737486, -15.443556, 13.8162565, 0.90737486, -15.388298, 11.531479, 1.0999866, -15.956232, 12.102915, -0.88860226, -11.1811695, 16.062777, -0.7989111, -12.880806, 15.484076, 0.2096405, -14.192514, 16.075851, -0.5573001, -12.880806, 15.484076, 0.2096405, -15.443556, 13.8162565, 0.90737486, -14.192514, 16.075851, -0.5573001, -11.1811695, 16.062777, -0.7989111, -14.192514, 16.075851, -0.5573001, -12.708605, 16.828888, -2.2941785, -15.443556, 13.8162565, 0.90737486, -15.956232, 12.102915, -0.88860226, -16.3484, 13.803182, -1.0596855, -14.192514, 16.075851, -0.5573001, -15.443556, 13.8162565, 0.90737486, -16.3484, 13.803182, -1.0596855, -15.09202, 11.4680395, -2.9977593, -16.3484, 13.803182, -1.0596855, -15.956232, 12.102915, -0.88860226, -12.708605, 16.828888, -2.2941785, -14.192514, 16.075851, -0.5573001, -15.09865, 15.4840765, -1.6848848, -14.192514, 16.075851, -0.5573001, -16.3484, 13.803182, -1.0596855, -15.09865, 15.4840765, -1.6848848, -15.09202, 11.4680395, -2.9977593, -15.31592, 13.7654085, -3.7604294, -16.3484, 13.803182, -1.0596855, -15.31592, 13.7654085, -3.7604294, -15.09865, 15.4840765, -1.6848848, -16.3484, 13.803182, -1.0596855, -12.873928, 12.023979, -4.2461476, -15.31592, 13.7654085, -3.7604294, -15.09202, 11.4680395, -2.9977593, -12.873928, 12.023979, -4.2461476, -13.040308, 13.727151, -5.3989296, -15.31592, 13.7654085, -3.7604294, -15.31592, 13.7654085, -3.7604294, -14.29763, 16.062777, -3.461082, -15.09865, 15.4840765, -1.6848848, -12.708605, 16.828888, -2.2941785, -15.09865, 15.4840765, -1.6848848, -14.29763, 16.062777, -3.461082, -13.040308, 13.727151, -5.3989296, -14.29763, 16.062777, -3.461082, -15.31592, 13.7654085, -3.7604294, -11.285702, 16.050184, -3.7030501, -12.708605, 16.828888, -2.2941785, -14.29763, 16.062777, -3.461082, -13.040308, 13.727151, -5.3989296, -12.916918, 15.450177, -4.4462667, -14.29763, 16.062777, -3.461082, -11.285702, 16.050184, -3.7030501, -14.29763, 16.062777, -3.461082, -12.916918, 15.450177, -4.4462667, -13.194582, 12.102914, 1.4700174, -12.95261, 10.701926, -0.98015237, -15.388298, 11.531479, 1.0999866, -13.194582, 12.102914, 1.4700174, -10.752665, 11.468038, 0.7093334, -12.95261, 10.701926, -0.98015237, -15.388298, 11.531479, 1.0999866, -12.95261, 10.701926, -0.98015237, -15.09202, 11.4680395, -2.9977593, -15.388298, 11.531479, 1.0999866, -15.09202, 11.4680395, -2.9977593, -15.956232, 12.102915, -0.88860226, -12.95261, 10.701926, -0.98015237, -12.873928, 12.023979, -4.2461476, -15.09202, 11.4680395, -2.9977593, -12.95261, 10.701926, -0.98015237, -10.455915, 11.404599, -3.3882995, -12.873928, 12.023979, -4.2461476, -10.752665, 11.468038, 0.7093334, -10.455915, 11.404599, -3.3882995, -12.95261, 10.701926, -0.98015237, -10.752665, 11.468038, 0.7093334, -9.569414, 12.023977, -1.423661, -10.455915, 11.404599, -3.3882995, -24.767572, 12.860314, -12.76874, -27.996283, 17.21195, -9.537579, -27.347048, 11.217676, -9.664753, -27.347048, 11.217676, -9.664753, -27.996283, 17.21195, -9.537579, -26.84493, 17.364494, -4.4035864, -27.347048, 11.217676, -9.664753, -26.84493, 17.364494, -4.4035864, -26.195316, 12.778957, -5.113938, -24.767572, 12.860314, -12.76874, -25.952778, 17.118486, -13.655661, -27.996283, 17.21195, -9.537579, -19.715057, 11.632692, -13.049604, -25.952778, 17.118486, -13.655661, -24.767572, 12.860314, -12.76874, -27.996283, 17.21195, -9.537579, -25.235796, 21.763588, -5.4189744, -26.84493, 17.364494, -4.4035864, -19.715057, 11.632692, -13.049604, -19.985107, 17.543673, -13.411457, -25.952778, 17.118486, -13.655661, -15.851015, 13.295669, -9.844912, -19.985107, 17.543673, -13.411457, -19.715057, 11.632692, -13.049604, -25.952778, 17.118486, -13.655661, -25.451134, 23.26482, -8.394608, -27.996283, 17.21195, -9.537579, -27.996283, 17.21195, -9.537579, -25.451134, 23.26482, -8.394608, -25.235796, 21.763588, -5.4189744, -19.985107, 17.543673, -13.411457, -24.42836, 21.654142, -11.237154, -25.952778, 17.118486, -13.655661, -25.952778, 17.118486, -13.655661, -24.42836, 21.654142, -11.237154, -25.451134, 23.26482, -8.394608, -15.851015, 13.295669, -9.844912, -14.828638, 17.862318, -10.214518, -19.985107, 17.543673, -13.411457, -14.828638, 17.862318, -10.214518, -15.851015, 13.295669, -9.844912, -15.215309, 11.512592, -5.5114245, -19.985107, 17.543673, -13.411457, -21.066832, 23.347628, -10.820686, -24.42836, 21.654142, -11.237154, -14.828638, 17.862318, -10.214518, -21.066832, 23.347628, -10.820686, -19.985107, 17.543673, -13.411457, -24.42836, 21.654142, -11.237154, -22.043024, 25.28228, -7.397609, -25.451134, 23.26482, -8.394608, -24.42836, 21.654142, -11.237154, -21.066832, 23.347628, -10.820686, -22.043024, 25.28228, -7.397609, -14.828638, 17.862318, -10.214518, -17.778353, 21.984411, -9.297602, -21.066832, 23.347628, -10.820686, -14.828638, 17.862318, -10.214518, -15.215309, 11.512592, -5.5114245, -15.219456, 17.447784, -5.475563, -17.778353, 21.984411, -9.297602, -14.828638, 17.862318, -10.214518, -15.219456, 17.447784, -5.475563, -15.219456, 17.447784, -5.475563, -15.215309, 11.512592, -5.5114245, -18.649284, 12.710672, -2.540853, -21.066832, 23.347628, -10.820686, -17.778353, 21.984411, -9.297602, -18.417158, 23.323898, -6.4548, -17.778353, 21.984411, -9.297602, -15.219456, 17.447784, -5.475563, -18.417158, 23.323898, -6.4548, -21.066832, 23.347628, -10.820686, -18.417158, 23.323898, -6.4548, -22.043024, 25.28228, -7.397609, -15.219456, 17.447784, -5.475563, -18.649284, 12.710672, -2.540853, -18.8043, 16.973686, -1.7518203, -18.417158, 23.323898, -6.4548, -15.219456, 17.447784, -5.475563, -18.8043, 16.973686, -1.7518203, -22.846716, 11.097576, -2.1269307, -18.8043, 16.973686, -1.7518203, -18.649284, 12.710672, -2.540853, -22.043024, 25.28228, -7.397609, -18.417158, 23.323898, -6.4548, -19.955843, 21.589733, -3.8300514, -18.417158, 23.323898, -6.4548, -18.8043, 16.973686, -1.7518203, -19.955843, 21.589733, -3.8300514, -22.846716, 11.097576, -2.1269307, -23.23016, 17.115578, -1.6015713, -18.8043, 16.973686, -1.7518203, -23.23016, 17.115578, -1.6015713, -19.955843, 21.589733, -3.8300514, -18.8043, 16.973686, -1.7518203, -26.195316, 12.778957, -5.113938, -23.23016, 17.115578, -1.6015713, -22.846716, 11.097576, -2.1269307, -26.195316, 12.778957, -5.113938, -26.84493, 17.364494, -4.4035864, -23.23016, 17.115578, -1.6015713, -23.23016, 17.115578, -1.6015713, -22.801462, 23.240604, -4.0287204, -19.955843, 21.589733, -3.8300514, -22.043024, 25.28228, -7.397609, -19.955843, 21.589733, -3.8300514, -22.801462, 23.240604, -4.0287204, -26.84493, 17.364494, -4.4035864, -22.801462, 23.240604, -4.0287204, -23.23016, 17.115578, -1.6015713, -25.451134, 23.26482, -8.394608, -22.043024, 25.28228, -7.397609, -22.801462, 23.240604, -4.0287204, -26.84493, 17.364494, -4.4035864, -25.235796, 21.763588, -5.4189744, -22.801462, 23.240604, -4.0287204, -25.451134, 23.26482, -8.394608, -22.801462, 23.240604, -4.0287204, -25.235796, 21.763588, -5.4189744, -15.851015, 13.295669, -9.844912, -21.172243, 9.376487, -7.615418, -15.215309, 11.512592, -5.5114245, -15.851015, 13.295669, -9.844912, -19.715057, 11.632692, -13.049604, -21.172243, 9.376487, -7.615418, -15.215309, 11.512592, -5.5114245, -21.172243, 9.376487, -7.615418, -22.846716, 11.097576, -2.1269307, -15.215309, 11.512592, -5.5114245, -22.846716, 11.097576, -2.1269307, -18.649284, 12.710672, -2.540853, -21.172243, 9.376487, -7.615418, -26.195316, 12.778957, -5.113938, -22.846716, 11.097576, -2.1269307, -21.172243, 9.376487, -7.615418, -27.347048, 11.217676, -9.664753, -26.195316, 12.778957, -5.113938, -19.715057, 11.632692, -13.049604, -27.347048, 11.217676, -9.664753, -21.172243, 9.376487, -7.615418, -19.715057, 11.632692, -13.049604, -24.767572, 12.860314, -12.76874, -27.347048, 11.217676, -9.664753, 15.271845, 5.6313887, -13.373863, 13.937893, 6.0420103, -12.526823, 15.02121, 5.4305525, -13.542078, 15.271845, 5.6313887, -13.373863, 14.216074, 6.202837, -12.404688, 13.937893, 6.0420103, -12.526823, 14.216074, 6.202837, -12.404688, 12.987471, 7.6002665, -11.386524, 13.937893, 6.0420103, -12.526823, 14.216074, 6.202837, -12.404688, 13.085402, 7.59974, -11.366533, 12.987471, 7.6002665, -11.386524, 13.937893, 6.0420103, -12.526823, 12.987471, 7.6002665, -11.386524, 12.938522, 7.601056, -11.299387, 15.02121, 5.4305525, -13.542078, 13.937893, 6.0420103, -12.526823, 13.863859, 5.781687, -12.314682, 13.937893, 6.0420103, -12.526823, 12.938522, 7.601056, -11.299387, 13.863859, 5.781687, -12.314682, 15.02121, 5.4305525, -13.542078, 13.863859, 5.781687, -12.314682, 15.012333, 5.1052136, -13.381706, 13.863859, 5.781687, -12.314682, 12.938522, 7.601056, -11.299387, 13.0058975, 7.601056, -11.22595, 15.012333, 5.1052136, -13.381706, 13.863859, 5.781687, -12.314682, 14.096357, 5.781687, -12.061455, 13.863859, 5.781687, -12.314682, 13.0058975, 7.601056, -11.22595, 14.096357, 5.781687, -12.061455, 15.012333, 5.1052136, -13.381706, 14.096357, 5.781687, -12.061455, 15.257576, 5.1052136, -13.11451, 14.096357, 5.781687, -12.061455, 13.0058975, 7.601056, -11.22595, 13.096874, 7.6002665, -11.26737, 15.257576, 5.1052136, -13.11451, 14.096357, 5.781687, -12.061455, 14.314171, 6.0420103, -12.116919, 14.096357, 5.781687, -12.061455, 13.096874, 7.6002665, -11.26737, 14.314171, 6.0420103, -12.116919, 14.314171, 6.0420103, -12.116919, 13.096874, 7.6002665, -11.26737, 13.085402, 7.59974, -11.366533, 15.257576, 5.1052136, -13.11451, 14.314171, 6.0420103, -12.116919, 15.41803, 5.4305525, -13.109793, 14.314171, 6.0420103, -12.116919, 13.085402, 7.59974, -11.366533, 14.216074, 6.202837, -12.404688, 15.41803, 5.4305525, -13.109793, 14.314171, 6.0420103, -12.116919, 14.216074, 6.202837, -12.404688, 15.41803, 5.4305525, -13.109793, 14.216074, 6.202837, -12.404688, 15.271845, 5.6313887, -13.373863, 14.601847, 3.21346, -14.363449, 15.050756, 5.7482576, -13.183859, 14.252024, 3.21346, -13.499159, 14.601847, 3.21346, -14.363449, 15.172541, 5.7845817, -13.503508, 15.050756, 5.7482576, -13.183859, 15.172541, 5.7845817, -13.503508, 15.235462, 8.294637, -13.186392, 15.050756, 5.7482576, -13.183859, 15.172541, 5.7845817, -13.503508, 15.288689, 8.303849, -13.328491, 15.235462, 8.294637, -13.186392, 15.050756, 5.7482576, -13.183859, 15.235462, 8.294637, -13.186392, 15.35397, 8.27937, -13.092552, 14.252024, 3.21346, -13.499159, 15.050756, 5.7482576, -13.183859, 15.317219, 5.689823, -12.974655, 15.050756, 5.7482576, -13.183859, 15.35397, 8.27937, -13.092552, 15.317219, 5.689823, -12.974655, 14.252024, 3.21346, -13.499159, 15.317219, 5.689823, -12.974655, 14.968065, 3.21346, -12.951441, 15.317219, 5.689823, -12.974655, 15.35397, 8.27937, -13.092552, 15.480734, 8.27937, -13.17668, 14.968065, 3.21346, -12.951441, 15.317219, 5.689823, -12.974655, 15.603647, 5.689823, -13.16474, 15.317219, 5.689823, -12.974655, 15.480734, 8.27937, -13.17668, 15.603647, 5.689823, -13.16474, 14.968065, 3.21346, -12.951441, 15.603647, 5.689823, -13.16474, 15.760677, 3.21346, -13.477451, 15.603647, 5.689823, -13.16474, 15.480734, 8.27937, -13.17668, 15.440304, 8.294637, -13.322334, 15.760677, 3.21346, -13.477451, 15.603647, 5.689823, -13.16474, 15.514393, 5.7482576, -13.491547, 15.603647, 5.689823, -13.16474, 15.440304, 8.294637, -13.322334, 15.514393, 5.7482576, -13.491547, 15.514393, 5.7482576, -13.491547, 15.440304, 8.294637, -13.322334, 15.288689, 8.303849, -13.328491, 15.760677, 3.21346, -13.477451, 15.514393, 5.7482576, -13.491547, 15.534151, 3.2134595, -14.350031, 15.514393, 5.7482576, -13.491547, 15.288689, 8.303849, -13.328491, 15.172541, 5.7845817, -13.503508, 15.534151, 3.2134595, -14.350031, 15.514393, 5.7482576, -13.491547, 15.172541, 5.7845817, -13.503508, 15.534151, 3.2134595, -14.350031, 15.172541, 5.7845817, -13.503508, 14.601847, 3.21346, -14.363449, 15.553728, 5.9588323, -13.311363, 17.159096, 6.3768234, -13.211996, 15.660074, 5.754575, -13.023067, 15.660074, 5.754575, -13.023067, 15.124199, 5.6650805, -13.219332, 15.553728, 5.9588323, -13.311363, 15.660074, 5.754575, -13.023067, 15.190983, 5.5363665, -13.037777, 15.124199, 5.6650805, -13.219332, 15.553728, 5.9588323, -13.311363, 17.002844, 6.540546, -13.478861, 17.159096, 6.3768234, -13.211996, 17.002844, 6.540546, -13.478861, 18.62324, 7.962454, -13.583435, 17.159096, 6.3768234, -13.211996, 17.002844, 6.540546, -13.478861, 18.554626, 7.9619274, -13.658262, 18.62324, 7.962454, -13.583435, 17.159096, 6.3768234, -13.211996, 18.62324, 7.962454, -13.583435, 18.715752, 7.9632435, -13.625875, 17.159096, 6.3768234, -13.211996, 18.715752, 7.9632435, -13.625875, 17.346697, 6.111762, -13.342499, 15.660074, 5.754575, -13.023067, 17.159096, 6.3768234, -13.211996, 17.346697, 6.111762, -13.342499, 17.346697, 6.111762, -13.342499, 18.715752, 7.9632435, -13.625875, 18.704063, 7.9632435, -13.726791, 15.762983, 5.4234457, -13.149805, 15.190983, 5.5363665, -13.037777, 15.660074, 5.754575, -13.023067, 15.660074, 5.754575, -13.023067, 17.346697, 6.111762, -13.342499, 15.762983, 5.4234457, -13.149805, 15.762983, 5.4234457, -13.149805, 15.255903, 5.327897, -13.117506, 15.190983, 5.5363665, -13.037777, 17.346697, 6.111762, -13.342499, 18.704063, 7.9632435, -13.726791, 17.30647, 6.111762, -13.690155, 15.762983, 5.4234457, -13.149805, 17.346697, 6.111762, -13.342499, 17.30647, 6.111762, -13.690155, 17.30647, 6.111762, -13.690155, 18.704063, 7.9632435, -13.726791, 18.604456, 7.962454, -13.746929, 15.72068, 5.4234457, -13.5163, 15.255903, 5.327897, -13.117506, 15.762983, 5.4234457, -13.149805, 15.762983, 5.4234457, -13.149805, 17.30647, 6.111762, -13.690155, 15.72068, 5.4234457, -13.5163, 15.72068, 5.4234457, -13.5163, 15.229303, 5.327897, -13.348473, 15.255903, 5.327897, -13.117506, 17.30647, 6.111762, -13.690155, 18.604456, 7.962454, -13.746929, 17.094133, 6.3768234, -13.774481, 15.72068, 5.4234457, -13.5163, 17.30647, 6.111762, -13.690155, 17.094133, 6.3768234, -13.774481, 17.094133, 6.3768234, -13.774481, 18.604456, 7.962454, -13.746929, 18.554626, 7.9619274, -13.658262, 17.094133, 6.3768234, -13.774481, 18.554626, 7.9619274, -13.658262, 17.002844, 6.540546, -13.478861, 15.72068, 5.4234457, -13.5163, 17.094133, 6.3768234, -13.774481, 15.591234, 5.754575, -13.61615, 15.591234, 5.754575, -13.61615, 15.229303, 5.327897, -13.348473, 15.72068, 5.4234457, -13.5163, 15.591234, 5.754575, -13.61615, 17.094133, 6.3768234, -13.774481, 17.002844, 6.540546, -13.478861, 15.591234, 5.754575, -13.61615, 15.147818, 5.5363665, -13.411282, 15.229303, 5.327897, -13.348473, 15.591234, 5.754575, -13.61615, 17.002844, 6.540546, -13.478861, 15.553728, 5.9588323, -13.311363, 15.553728, 5.9588323, -13.311363, 15.147818, 5.5363665, -13.411282, 15.591234, 5.754575, -13.61615, 15.553728, 5.9588323, -13.311363, 15.124199, 5.6650805, -13.219332, 15.147818, 5.5363665, -13.411282, 20.456669, 8.048263, -14.631794, 19.118647, 8.967159, -15.3941345, 19.346407, 7.711606, -15.0057125, 19.346407, 7.711606, -15.0057125, 19.118647, 8.967159, -15.3941345, 17.589626, 8.974004, -14.720594, 19.346407, 7.711606, -15.0057125, 17.589626, 8.974004, -14.720594, 18.110191, 8.048264, -14.360323, 20.456669, 8.048263, -14.631794, 20.670847, 8.974003, -15.076887, 19.118647, 8.967159, -15.3941345, 20.868176, 7.746087, -13.371468, 20.670847, 8.974003, -15.076887, 20.456669, 8.048263, -14.631794, 19.118647, 8.967159, -15.3941345, 18.014603, 9.910537, -14.417248, 17.589626, 8.974004, -14.720594, 20.868176, 7.746087, -13.371468, 20.929647, 8.994798, -13.616339, 20.670847, 8.974003, -15.076887, 20.26757, 8.091167, -12.117716, 20.929647, 8.994798, -13.616339, 20.868176, 7.746087, -13.371468, 20.670847, 8.974003, -15.076887, 18.914066, 10.236665, -14.791771, 19.118647, 8.967159, -15.3941345, 19.118647, 8.967159, -15.3941345, 18.914066, 10.236665, -14.791771, 18.014603, 9.910537, -14.417248, 20.929647, 8.994798, -13.616339, 19.975527, 9.910536, -14.644192, 20.670847, 8.974003, -15.076887, 20.670847, 8.974003, -15.076887, 19.975527, 9.910536, -14.644192, 18.914066, 10.236665, -14.791771, 20.26757, 8.091167, -12.117716, 20.306274, 9.015329, -12.053684, 20.929647, 8.994798, -13.616339, 20.306274, 9.015329, -12.053684, 20.26757, 8.091167, -12.117716, 19.308578, 7.78057, -11.381147, 20.929647, 8.994798, -13.616339, 20.10909, 10.243508, -13.758886, 19.975527, 9.910536, -14.644192, 20.306274, 9.015329, -12.053684, 20.10909, 10.243508, -13.758886, 20.929647, 8.994798, -13.616339, 19.975527, 9.910536, -14.644192, 18.948578, 10.659921, -13.703939, 18.914066, 10.236665, -14.791771, 19.975527, 9.910536, -14.644192, 20.10909, 10.243508, -13.758886, 18.948578, 10.659921, -13.703939, 20.306274, 9.015329, -12.053684, 19.881817, 9.928962, -12.708981, 20.10909, 10.243508, -13.758886, 20.306274, 9.015329, -12.053684, 19.308578, 7.78057, -11.381147, 19.211441, 9.022436, -11.43041, 19.881817, 9.928962, -12.708981, 20.306274, 9.015329, -12.053684, 19.211441, 9.022436, -11.43041, 19.211441, 9.022436, -11.43041, 19.308578, 7.78057, -11.381147, 18.306646, 8.091168, -11.890772, 20.10909, 10.243508, -13.758886, 19.881817, 9.928962, -12.708981, 19.091122, 10.250615, -12.470457, 19.881817, 9.928962, -12.708981, 19.211441, 9.022436, -11.43041, 19.091122, 10.250615, -12.470457, 20.10909, 10.243508, -13.758886, 19.091122, 10.250615, -12.470457, 18.948578, 10.659921, -13.703939, 19.211441, 9.022436, -11.43041, 18.306646, 8.091168, -11.890772, 18.093428, 9.015329, -11.79792, 19.091122, 10.250615, -12.470457, 19.211441, 9.022436, -11.43041, 18.093428, 9.015329, -11.79792, 17.78659, 7.746088, -13.015247, 18.093428, 9.015329, -11.79792, 18.306646, 8.091168, -11.890772, 18.948578, 10.659921, -13.703939, 19.091122, 10.250615, -12.470457, 18.306887, 9.928962, -12.526855, 19.091122, 10.250615, -12.470457, 18.093428, 9.015329, -11.79792, 18.306887, 9.928962, -12.526855, 17.78659, 7.746088, -13.015247, 17.400074, 8.994799, -13.208279, 18.093428, 9.015329, -11.79792, 17.400074, 8.994799, -13.208279, 18.306887, 9.928962, -12.526855, 18.093428, 9.015329, -11.79792, 18.110191, 8.048264, -14.360323, 17.400074, 8.994799, -13.208279, 17.78659, 7.746088, -13.015247, 18.110191, 8.048264, -14.360323, 17.589626, 8.974004, -14.720594, 17.400074, 8.994799, -13.208279, 17.400074, 8.994799, -13.208279, 17.896025, 10.243508, -13.502977, 18.306887, 9.928962, -12.526855, 18.948578, 10.659921, -13.703939, 18.306887, 9.928962, -12.526855, 17.896025, 10.243508, -13.502977, 17.589626, 8.974004, -14.720594, 17.896025, 10.243508, -13.502977, 17.400074, 8.994799, -13.208279, 18.914066, 10.236665, -14.791771, 18.948578, 10.659921, -13.703939, 17.896025, 10.243508, -13.502977, 17.589626, 8.974004, -14.720594, 18.014603, 9.910537, -14.417248, 17.896025, 10.243508, -13.502977, 18.914066, 10.236665, -14.791771, 17.896025, 10.243508, -13.502977, 18.014603, 9.910537, -14.417248, 20.26757, 8.091167, -12.117716, 19.381508, 7.3296757, -13.120605, 19.308578, 7.78057, -11.381147, 20.26757, 8.091167, -12.117716, 20.868176, 7.746087, -13.371468, 19.381508, 7.3296757, -13.120605, 19.308578, 7.78057, -11.381147, 19.381508, 7.3296757, -13.120605, 17.78659, 7.746088, -13.015247, 19.308578, 7.78057, -11.381147, 17.78659, 7.746088, -13.015247, 18.306646, 8.091168, -11.890772, 19.381508, 7.3296757, -13.120605, 18.110191, 8.048264, -14.360323, 17.78659, 7.746088, -13.015247, 19.381508, 7.3296757, -13.120605, 19.346407, 7.711606, -15.0057125, 18.110191, 8.048264, -14.360323, 20.868176, 7.746087, -13.371468, 19.346407, 7.711606, -15.0057125, 19.381508, 7.3296757, -13.120605, 20.868176, 7.746087, -13.371468, 20.456669, 8.048263, -14.631794, 19.346407, 7.711606, -15.0057125, 10.316184, 8.502844, -12.777889, 10.408148, 10.86813, -10.2968025, 10.597721, 7.6100063, -10.6023655, 10.597721, 7.6100063, -10.6023655, 10.408148, 10.86813, -10.2968025, 12.878351, 10.951043, -8.855707, 10.597721, 7.6100063, -10.6023655, 12.878351, 10.951043, -8.855707, 12.835861, 8.458624, -9.37719, 10.316184, 8.502844, -12.777889, 9.524521, 10.8173275, -12.634127, 10.408148, 10.86813, -10.2968025, 12.073738, 7.8355837, -14.893578, 9.524521, 10.8173275, -12.634127, 10.316184, 8.502844, -12.777889, 10.408148, 10.86813, -10.2968025, 13.069418, 13.342123, -9.872105, 12.878351, 10.951043, -8.855707, 12.073738, 7.8355837, -14.893578, 11.829742, 11.048433, -14.919933, 9.524521, 10.8173275, -12.634127, 14.779421, 8.739476, -15.246426, 11.829742, 11.048433, -14.919933, 12.073738, 7.8355837, -14.893578, 9.524521, 10.8173275, -12.634127, 11.80493, 14.158102, -10.887323, 10.408148, 10.86813, -10.2968025, 10.408148, 10.86813, -10.2968025, 11.80493, 14.158102, -10.887323, 13.069418, 13.342123, -9.872105, 11.829742, 11.048433, -14.919933, 11.051523, 13.282636, -12.346281, 9.524521, 10.8173275, -12.634127, 9.524521, 10.8173275, -12.634127, 11.051523, 13.282636, -12.346281, 11.80493, 14.158102, -10.887323, 14.779421, 8.739476, -15.246426, 15.010525, 11.22163, -15.7902565, 11.829742, 11.048433, -14.919933, 15.010525, 11.22163, -15.7902565, 14.779421, 8.739476, -15.246426, 16.7401, 7.770304, -13.896193, 11.829742, 11.048433, -14.919933, 12.461086, 14.203112, -13.530659, 11.051523, 13.282636, -12.346281, 15.010525, 11.22163, -15.7902565, 12.461086, 14.203112, -13.530659, 11.829742, 11.048433, -14.919933, 11.051523, 13.282636, -12.346281, 13.462879, 15.254671, -11.875458, 11.80493, 14.158102, -10.887323, 11.051523, 13.282636, -12.346281, 12.461086, 14.203112, -13.530659, 13.462879, 15.254671, -11.875458, 15.010525, 11.22163, -15.7902565, 14.284246, 13.462151, -14.276512, 12.461086, 14.203112, -13.530659, 15.010525, 11.22163, -15.7902565, 16.7401, 7.770304, -13.896193, 16.752848, 10.996315, -13.881273, 14.284246, 13.462151, -14.276512, 15.010525, 11.22163, -15.7902565, 16.752848, 10.996315, -13.881273, 16.752848, 10.996315, -13.881273, 16.7401, 7.770304, -13.896193, 16.65236, 8.421508, -11.429792, 12.461086, 14.203112, -13.530659, 14.284246, 13.462151, -14.276512, 15.179819, 14.190213, -12.970345, 14.284246, 13.462151, -14.276512, 16.752848, 10.996315, -13.881273, 15.179819, 14.190213, -12.970345, 12.461086, 14.203112, -13.530659, 15.179819, 14.190213, -12.970345, 13.462879, 15.254671, -11.875458, 16.752848, 10.996315, -13.881273, 16.65236, 8.421508, -11.429792, 16.909176, 10.738624, -11.076134, 15.179819, 14.190213, -12.970345, 16.752848, 10.996315, -13.881273, 16.909176, 10.738624, -11.076134, 15.264158, 7.544727, -9.605343, 16.909176, 10.738624, -11.076134, 16.65236, 8.421508, -11.429792, 13.462879, 15.254671, -11.875458, 15.179819, 14.190213, -12.970345, 15.655621, 13.247626, -11.386549, 15.179819, 14.190213, -12.970345, 16.909176, 10.738624, -11.076134, 15.655621, 13.247626, -11.386549, 15.264158, 7.544727, -9.605343, 15.3314705, 10.815748, -9.258287, 16.909176, 10.738624, -11.076134, 15.3314705, 10.815748, -9.258287, 15.655621, 13.247626, -11.386549, 16.909176, 10.738624, -11.076134, 12.835861, 8.458624, -9.37719, 15.3314705, 10.815748, -9.258287, 15.264158, 7.544727, -9.605343, 12.835861, 8.458624, -9.37719, 12.878351, 10.951043, -8.855707, 15.3314705, 10.815748, -9.258287, 15.3314705, 10.815748, -9.258287, 14.523663, 14.14494, -10.327007, 15.655621, 13.247626, -11.386549, 13.462879, 15.254671, -11.875458, 15.655621, 13.247626, -11.386549, 14.523663, 14.14494, -10.327007, 12.878351, 10.951043, -8.855707, 14.523663, 14.14494, -10.327007, 15.3314705, 10.815748, -9.258287, 11.80493, 14.158102, -10.887323, 13.462879, 15.254671, -11.875458, 14.523663, 14.14494, -10.327007, 12.878351, 10.951043, -8.855707, 13.069418, 13.342123, -9.872105, 14.523663, 14.14494, -10.327007, 11.80493, 14.158102, -10.887323, 14.523663, 14.14494, -10.327007, 13.069418, 13.342123, -9.872105, 14.779421, 8.739476, -15.246426, 13.698336, 6.609247, -12.302765, 16.7401, 7.770304, -13.896193, 14.779421, 8.739476, -15.246426, 12.073738, 7.8355837, -14.893578, 13.698336, 6.609247, -12.302765, 16.7401, 7.770304, -13.896193, 13.698336, 6.609247, -12.302765, 15.264158, 7.544727, -9.605343, 16.7401, 7.770304, -13.896193, 15.264158, 7.544727, -9.605343, 16.65236, 8.421508, -11.429792, 13.698336, 6.609247, -12.302765, 12.835861, 8.458624, -9.37719, 15.264158, 7.544727, -9.605343, 13.698336, 6.609247, -12.302765, 10.597721, 7.6100063, -10.6023655, 12.835861, 8.458624, -9.37719, 12.073738, 7.8355837, -14.893578, 10.597721, 7.6100063, -10.6023655, 13.698336, 6.609247, -12.302765, 12.073738, 7.8355837, -14.893578, 10.316184, 8.502844, -12.777889, 10.597721, 7.6100063, -10.6023655, 0.9335377, -18.661976, -2.173924, 1.8889831, -18.823338, -0.58916974, 1.5114222, -18.399822, -1.4170885, 0.9335377, -18.661976, -2.173924, 0.9335377, -18.661974, 1.0975094, 1.8889831, -18.823338, -0.58916974, 1.8889831, -18.823338, -0.58916974, 0.9335377, -18.661974, 1.0975094, 1.6508096, -18.476696, 0.3862325, -0.9279604, -18.475744, -2.1898937, 0.9335377, -18.661976, -2.173924, -0.001098156, -18.845234, -2.413155, -1.7685199, -18.399822, -0.5382087, 0.9335377, -18.661976, -2.173924, -0.9279604, -18.475744, -2.1898937, 0.9335377, -18.661974, 1.0975094, 0.9335377, -18.661976, -2.173924, -1.7685199, -18.399822, -0.5382087, -1.7685199, -18.399822, -0.5382087, -0.9279604, -18.475744, -2.1898937, -1.6464877, -18.661976, -1.4825313, 0.9335377, -18.661974, 1.0975094, -1.7685199, -18.399822, -0.5382087, -0.95520806, -18.661974, 1.0975094, -0.95520806, -18.661974, 1.0975094, -1.7685199, -18.399822, -0.5382087, -1.6464877, -18.661974, 0.40619445, 0.9335377, -18.661974, 1.0975094, -0.95520806, -18.661974, 1.0975094, -0.010835171, -18.399822, 1.2195511, 1.5114222, -18.399822, -1.4170885, -0.010835171, -14.884386, -0.5382099, 0.9335377, -18.661976, -2.173924, 0.9335377, -18.661976, -2.173924, -0.010835171, -14.884386, -0.5382099, -0.001098156, -18.845234, -2.413155, -0.001098156, -18.845234, -2.413155, -0.010835171, -14.884386, -0.5382099, -0.9279604, -18.475744, -2.1898937, -0.9279604, -18.475744, -2.1898937, -0.010835171, -14.884386, -0.5382099, -1.6464877, -18.661976, -1.4825313, -1.6464877, -18.661976, -1.4825313, -0.010835171, -14.884386, -0.5382099, -1.7685199, -18.399822, -0.5382087, -1.7685199, -18.399822, -0.5382087, -0.010835171, -14.884386, -0.5382099, -1.6464877, -18.661974, 0.40619445, -1.6464877, -18.661974, 0.40619445, -0.010835171, -14.884386, -0.5382099, -0.95520806, -18.661974, 1.0975094, -0.95520806, -18.661974, 1.0975094, -0.010835171, -14.884386, -0.5382099, -0.010835171, -18.399822, 1.2195511, -0.010835171, -18.399822, 1.2195511, -0.010835171, -14.884386, -0.5382099, 0.9335377, -18.661974, 1.0975094, 0.9335377, -18.661974, 1.0975094, -0.010835171, -14.884386, -0.5382099, 1.6508096, -18.476696, 0.3862325, 1.6508096, -18.476696, 0.3862325, -0.010835171, -14.884386, -0.5382099, 1.8889831, -18.823338, -0.58916974, 1.8889831, -18.823338, -0.58916974, -0.010835171, -14.884386, -0.5382099, 1.5114222, -18.399822, -1.4170885, 0.79053855, -17.29707, -2.0162632, 1.2353985, -16.7235, -0.5382092, 1.198884, -17.024681, -1.2366474, 0.79053855, -17.29707, -2.0162632, 0.4979446, -16.83131, 0.34912467, 1.2353985, -16.7235, -0.5382092, 1.2353985, -16.7235, -0.5382092, 0.4979446, -16.83131, 0.34912467, 1.198884, -17.024681, 0.16022909, 0.4979446, -16.83131, 0.34912467, -0.88492775, -17.22686, 1.0175039, -0.010835171, -17.024681, 0.8586674, 0.4979446, -16.83131, 0.34912467, -1.2205544, -17.024681, 0.16022909, -0.88492775, -17.22686, 1.0175039, 0.79053855, -17.29707, -2.0162632, -1.2205544, -17.024681, 0.16022909, 0.4979446, -16.83131, 0.34912467, -1.2205544, -17.024681, 0.16022909, 0.79053855, -17.29707, -2.0162632, -0.6996014, -16.880219, -1.4757214, -0.6996014, -16.880219, -1.4757214, 0.79053855, -17.29707, -2.0162632, -0.010835171, -17.024681, -1.9350855, -1.2205544, -17.024681, 0.16022909, -0.6996014, -16.880219, -1.4757214, -1.2205544, -17.024681, -1.2366474, -1.2205544, -17.024681, 0.16022909, -1.2205544, -17.024681, -1.2366474, -1.5400834, -17.234833, -0.5375037, 1.198884, -17.024681, -1.2366474, -0.010835171, -14.231086, -0.53821015, 0.79053855, -17.29707, -2.0162632, 0.79053855, -17.29707, -2.0162632, -0.010835171, -14.231086, -0.53821015, -0.010835171, -17.024681, -1.9350855, -0.010835171, -17.024681, -1.9350855, -0.010835171, -14.231086, -0.53821015, -0.6996014, -16.880219, -1.4757214, -0.6996014, -16.880219, -1.4757214, -0.010835171, -14.231086, -0.53821015, -1.2205544, -17.024681, -1.2366474, -1.2205544, -17.024681, -1.2366474, -0.010835171, -14.231086, -0.53821015, -1.5400834, -17.234833, -0.5375037, -1.5400834, -17.234833, -0.5375037, -0.010835171, -14.231086, -0.53821015, -1.2205544, -17.024681, 0.16022909, -1.2205544, -17.024681, 0.16022909, -0.010835171, -14.231086, -0.53821015, -0.88492775, -17.22686, 1.0175039, -0.88492775, -17.22686, 1.0175039, -0.010835171, -14.231086, -0.53821015, -0.010835171, -17.024681, 0.8586674, -0.010835171, -17.024681, 0.8586674, -0.010835171, -14.231086, -0.53821015, 0.4979446, -16.83131, 0.34912467, 0.4979446, -16.83131, 0.34912467, -0.010835171, -14.231086, -0.53821015, 1.198884, -17.024681, 0.16022909, 1.198884, -17.024681, 0.16022909, -0.010835171, -14.231086, -0.53821015, 1.2353985, -16.7235, -0.5382092, 1.2353985, -16.7235, -0.5382092, -0.010835171, -14.231086, -0.53821015, 1.198884, -17.024681, -1.2366474, 1.3094504, -20.552734, -2.7694182, 2.5816762, -20.552734, -0.51041746, 2.2008963, -20.875694, -1.8151531, 1.3094504, -20.552734, -2.7694182, 1.2661028, -20.875694, 1.6735137, 2.5816762, -20.552734, -0.51041746, 2.5816762, -20.552734, -0.51041746, 1.2661028, -20.875694, 1.6735137, 2.2298722, -20.624132, 0.7323996, -1.2877731, -20.875696, -2.7499266, 1.3094504, -20.552734, -2.7694182, -0.039105892, -21.061094, -3.1164474, -2.5646338, -20.875694, -0.53820777, 1.3094504, -20.552734, -2.7694182, -1.2877731, -20.875696, -2.7499266, 1.2661028, -20.875694, 1.6735137, 1.3094504, -20.552734, -2.7694182, -2.5646338, -20.875694, -0.53820777, -2.5646338, -20.875694, -0.53820777, -1.2877731, -20.875696, -2.7499266, -2.1870723, -20.562729, -1.6952248, 1.2661028, -20.875694, 1.6735137, -2.5646338, -20.875694, -0.53820777, -1.2877731, -20.875694, 1.6735137, -1.2877731, -20.875694, 1.6735137, -2.5646338, -20.875694, -0.53820777, -2.1694045, -20.59831, 0.7562758, 1.2661028, -20.875694, 1.6735137, -1.2877731, -20.875694, 1.6735137, -0.033530712, -21.08287, 2.0138073, 2.2008963, -20.875694, -1.8151531, -0.010835171, -15.767945, -0.5382097, 1.3094504, -20.552734, -2.7694182, 1.3094504, -20.552734, -2.7694182, -0.010835171, -15.767945, -0.5382097, -0.039105892, -21.061094, -3.1164474, -0.039105892, -21.061094, -3.1164474, -0.010835171, -15.767945, -0.5382097, -1.2877731, -20.875696, -2.7499266, -1.2877731, -20.875696, -2.7499266, -0.010835171, -15.767945, -0.5382097, -2.1870723, -20.562729, -1.6952248, -2.1870723, -20.562729, -1.6952248, -0.010835171, -15.767945, -0.5382097, -2.5646338, -20.875694, -0.53820777, -2.5646338, -20.875694, -0.53820777, -0.010835171, -15.767945, -0.5382097, -2.1694045, -20.59831, 0.7562758, -2.1694045, -20.59831, 0.7562758, -0.010835171, -15.767945, -0.5382097, -1.2877731, -20.875694, 1.6735137, -1.2877731, -20.875694, 1.6735137, -0.010835171, -15.767945, -0.5382097, -0.033530712, -21.08287, 2.0138073, -0.033530712, -21.08287, 2.0138073, -0.010835171, -15.767945, -0.5382097, 1.2661028, -20.875694, 1.6735137, 1.2661028, -20.875694, 1.6735137, -0.010835171, -15.767945, -0.5382097, 2.2298722, -20.624132, 0.7323996, 2.2298722, -20.624132, 0.7323996, -0.010835171, -15.767945, -0.5382097, 2.5816762, -20.552734, -0.51041746, 2.5816762, -20.552734, -0.51041746, -0.010835171, -15.767945, -0.5382097, 2.2008963, -20.875694, -1.8151531, 0.5583327, -21.275528, -0.82769513, 0.37442207, -20.354485, -1.1662683, 0.31780314, -21.275528, -1.0682597, 0.5583327, -21.275528, -0.82769513, 0.65641344, -20.354485, -0.8842943, 0.37442207, -20.354485, -1.1662683, 0.6890812, -22.029617, -0.9031601, 0.5583327, -21.275528, -0.82769513, 0.31780314, -21.275528, -1.0682597, 0.6890812, -22.029617, -0.9031601, 0.31780314, -21.275528, -1.0682597, 0.39326835, -22.029617, -1.1989906, 0.31780314, -21.275528, -1.0682597, -0.010835171, -20.354485, -1.2695241, -0.010835171, -21.275528, -1.1563258, 0.31780314, -21.275528, -1.0682597, 0.37442207, -20.354485, -1.1662683, -0.010835171, -20.354485, -1.2695241, 0.39326835, -22.029617, -1.1989906, 0.31780314, -21.275528, -1.0682597, -0.010835171, -21.275528, -1.1563258, 0.39326835, -22.029617, -1.1989906, -0.010835171, -21.275528, -1.1563258, -0.010835171, -22.029617, -1.307256, -0.010835171, -21.275528, -1.1563258, -0.3960147, -20.354485, -1.1662683, -0.339396, -21.275528, -1.0682597, -0.010835171, -21.275528, -1.1563258, -0.010835171, -20.354485, -1.2695241, -0.3960147, -20.354485, -1.1662683, -0.010835171, -22.029617, -1.307256, -0.010835171, -21.275528, -1.1563258, -0.339396, -21.275528, -1.0682597, -0.010835171, -22.029617, -1.307256, -0.339396, -21.275528, -1.0682597, -0.4148612, -22.029617, -1.1989906, -0.339396, -21.275528, -1.0682597, -0.6780064, -20.354485, -0.8842943, -0.580003, -21.275528, -0.82769513, -0.339396, -21.275528, -1.0682597, -0.3960147, -20.354485, -1.1662683, -0.6780064, -20.354485, -0.8842943, -0.4148612, -22.029617, -1.1989906, -0.339396, -21.275528, -1.0682597, -0.580003, -21.275528, -0.82769513, -0.4148612, -22.029617, -1.1989906, -0.580003, -21.275528, -0.82769513, -0.71067405, -22.029617, -0.9031601, -0.580003, -21.275528, -0.82769513, -0.78126955, -20.354485, -0.49906468, -0.6680341, -21.275528, -0.49906445, -0.580003, -21.275528, -0.82769513, -0.6780064, -20.354485, -0.8842943, -0.78126955, -20.354485, -0.49906468, -0.71067405, -22.029617, -0.9031601, -0.580003, -21.275528, -0.82769513, -0.6680341, -21.275528, -0.49906445, -0.71067405, -22.029617, -0.9031601, -0.6680341, -21.275528, -0.49906445, -0.8189645, -22.029617, -0.49906397, -0.6680341, -21.275528, -0.49906445, -0.6780064, -20.354485, -0.11391497, -0.580003, -21.275528, -0.17051363, -0.6680341, -21.275528, -0.49906445, -0.78126955, -20.354485, -0.49906468, -0.6780064, -20.354485, -0.11391497, -0.8189645, -22.029617, -0.49906397, -0.6680341, -21.275528, -0.49906445, -0.580003, -21.275528, -0.17051363, -0.8189645, -22.029617, -0.49906397, -0.580003, -21.275528, -0.17051363, -0.71067405, -22.029617, -0.09504819, -0.580003, -21.275528, -0.17051363, -0.3960147, -20.354485, 0.16813636, -0.339396, -21.275528, 0.07004857, -0.580003, -21.275528, -0.17051363, -0.6780064, -20.354485, -0.11391497, -0.3960147, -20.354485, 0.16813636, -0.71067405, -22.029617, -0.09504819, -0.580003, -21.275528, -0.17051363, -0.339396, -21.275528, 0.07004857, -0.71067405, -22.029617, -0.09504819, -0.339396, -21.275528, 0.07004857, -0.4148612, -22.029617, 0.2007823, -0.339396, -21.275528, 0.07004857, -0.010835171, -20.354485, 0.27131462, -0.010835171, -21.275528, 0.15811706, -0.339396, -21.275528, 0.07004857, -0.3960147, -20.354485, 0.16813636, -0.010835171, -20.354485, 0.27131462, -0.4148612, -22.029617, 0.2007823, -0.339396, -21.275528, 0.07004857, -0.010835171, -21.275528, 0.15811706, -0.4148612, -22.029617, 0.2007823, -0.010835171, -21.275528, 0.15811706, -0.010835171, -22.029617, 0.3090477, -0.010835171, -21.275528, 0.15811706, 0.37442207, -20.354485, 0.16813636, 0.31780314, -21.275528, 0.07004857, -0.010835171, -21.275528, 0.15811706, -0.010835171, -20.354485, 0.27131462, 0.37442207, -20.354485, 0.16813636, -0.010835171, -22.029617, 0.3090477, -0.010835171, -21.275528, 0.15811706, 0.31780314, -21.275528, 0.07004857, -0.010835171, -22.029617, 0.3090477, 0.31780314, -21.275528, 0.07004857, 0.39326835, -22.029617, 0.2007823, 0.31780314, -21.275528, 0.07004857, 0.65641344, -20.354485, -0.11391497, 0.5583327, -21.275528, -0.17051363, 0.31780314, -21.275528, 0.07004857, 0.37442207, -20.354485, 0.16813636, 0.65641344, -20.354485, -0.11391497, 0.39326835, -22.029617, 0.2007823, 0.31780314, -21.275528, 0.07004857, 0.5583327, -21.275528, -0.17051363, 0.39326835, -22.029617, 0.2007823, 0.5583327, -21.275528, -0.17051363, 0.6890812, -22.029617, -0.09504819, 0.5583327, -21.275528, -0.17051363, 0.759599, -20.354485, -0.49906468, 0.64644134, -21.275528, -0.49906445, 0.5583327, -21.275528, -0.17051363, 0.65641344, -20.354485, -0.11391497, 0.759599, -20.354485, -0.49906468, 0.6890812, -22.029617, -0.09504819, 0.5583327, -21.275528, -0.17051363, 0.64644134, -21.275528, -0.49906445, 0.6890812, -22.029617, -0.09504819, 0.64644134, -21.275528, -0.49906445, 0.7973716, -22.029617, -0.49906397, 0.64644134, -21.275528, -0.49906445, 0.65641344, -20.354485, -0.8842943, 0.5583327, -21.275528, -0.82769513, 0.64644134, -21.275528, -0.49906445, 0.759599, -20.354485, -0.49906468, 0.65641344, -20.354485, -0.8842943, 0.7973716, -22.029617, -0.49906397, 0.64644134, -21.275528, -0.49906445, 0.5583327, -21.275528, -0.82769513, 0.7973716, -22.029617, -0.49906397, 0.5583327, -21.275528, -0.82769513, 0.6890812, -22.029617, -0.9031601, 0.39326835, -22.029617, -1.1989906, -0.010835171, -22.029617, -0.49906397, 0.6890812, -22.029617, -0.9031601, 0.6890812, -22.029617, -0.9031601, -0.010835171, -22.029617, -0.49906397, 0.7973716, -22.029617, -0.49906397, -0.010835171, -22.029617, -1.307256, -0.010835171, -22.029617, -0.49906397, 0.39326835, -22.029617, -1.1989906, 0.7973716, -22.029617, -0.49906397, -0.010835171, -22.029617, -0.49906397, 0.6890812, -22.029617, -0.09504819, -0.4148612, -22.029617, -1.1989906, -0.010835171, -22.029617, -0.49906397, -0.010835171, -22.029617, -1.307256, 0.6890812, -22.029617, -0.09504819, -0.010835171, -22.029617, -0.49906397, 0.39326835, -22.029617, 0.2007823, -0.71067405, -22.029617, -0.9031601, -0.010835171, -22.029617, -0.49906397, -0.4148612, -22.029617, -1.1989906, 0.39326835, -22.029617, 0.2007823, -0.010835171, -22.029617, -0.49906397, -0.010835171, -22.029617, 0.3090477, -0.8189645, -22.029617, -0.49906397, -0.010835171, -22.029617, -0.49906397, -0.71067405, -22.029617, -0.9031601, -0.010835171, -22.029617, 0.3090477, -0.010835171, -22.029617, -0.49906397, -0.4148612, -22.029617, 0.2007823, -0.71067405, -22.029617, -0.09504819, -0.010835171, -22.029617, -0.49906397, -0.8189645, -22.029617, -0.49906397, -0.4148612, -22.029617, 0.2007823, -0.010835171, -22.029617, -0.49906397, -0.71067405, -22.029617, -0.09504819, 9.266797, -17.581049, 9.7409115, 10.985607, -16.33984, 10.792019, 10.863857, -18.049467, 10.526733, 10.863857, -18.049467, 10.526733, 10.985607, -16.33984, 10.792019, 13.068386, -16.296267, 9.768465, 10.863857, -18.049467, 10.526733, 13.068386, -16.296267, 9.768465, 12.696516, -17.604118, 9.563199, 9.266797, -17.581049, 9.7409115, 9.008772, -16.366539, 10.340904, 10.985607, -16.33984, 10.792019, 8.624725, -17.931135, 7.6034517, 9.008772, -16.366539, 10.340904, 9.266797, -17.581049, 9.7409115, 10.985607, -16.33984, 10.792019, 12.4669, -15.041601, 9.18321, 13.068386, -16.296267, 9.768465, 8.624725, -17.931135, 7.6034517, 8.497637, -16.245218, 7.7565994, 9.008772, -16.366539, 10.340904, 9.600649, -17.456738, 5.615509, 8.497637, -16.245218, 7.7565994, 8.624725, -17.931135, 7.6034517, 9.008772, -16.366539, 10.340904, 11.213087, -14.61334, 9.582636, 10.985607, -16.33984, 10.792019, 10.985607, -16.33984, 10.792019, 11.213087, -14.61334, 9.582636, 12.4669, -15.041601, 9.18321, 8.497637, -16.245218, 7.7565994, 9.8885765, -15.072786, 9.437603, 9.008772, -16.366539, 10.340904, 9.008772, -16.366539, 10.340904, 9.8885765, -15.072786, 9.437603, 11.213087, -14.61334, 9.582636, 9.600649, -17.456738, 5.615509, 9.33643, -16.15444, 5.2154427, 8.497637, -16.245218, 7.7565994, 9.33643, -16.15444, 5.2154427, 9.600649, -17.456738, 5.615509, 11.392937, -17.965525, 4.8956895, 8.497637, -16.245218, 7.7565994, 9.720263, -14.589846, 7.952894, 9.8885765, -15.072786, 9.437603, 9.33643, -16.15444, 5.2154427, 9.720263, -14.589846, 7.952894, 8.497637, -16.245218, 7.7565994, 9.8885765, -15.072786, 9.437603, 11.288914, -14.037912, 8.018254, 11.213087, -14.61334, 9.582636, 9.8885765, -15.072786, 9.437603, 9.720263, -14.589846, 7.952894, 11.288914, -14.037912, 8.018254, 9.33643, -16.15444, 5.2154427, 10.034036, -14.978592, 6.3855233, 9.720263, -14.589846, 7.952894, 9.33643, -16.15444, 5.2154427, 11.392937, -17.965525, 4.8956895, 11.408957, -16.27256, 4.8937664, 10.034036, -14.978592, 6.3855233, 9.33643, -16.15444, 5.2154427, 11.408957, -16.27256, 4.8937664, 11.408957, -16.27256, 4.8937664, 11.392937, -17.965525, 4.8956895, 13.021395, -17.62377, 6.061926, 9.720263, -14.589846, 7.952894, 10.034036, -14.978592, 6.3855233, 11.318819, -14.596681, 6.3662996, 10.034036, -14.978592, 6.3855233, 11.408957, -16.27256, 4.8937664, 11.318819, -14.596681, 6.3662996, 9.720263, -14.589846, 7.952894, 11.318819, -14.596681, 6.3662996, 11.288914, -14.037912, 8.018254, 11.408957, -16.27256, 4.8937664, 13.021395, -17.62377, 6.061926, 13.375538, -16.407764, 6.04676, 11.318819, -14.596681, 6.3662996, 11.408957, -16.27256, 4.8937664, 13.375538, -16.407764, 6.04676, 13.632067, -18.083643, 7.819184, 13.375538, -16.407764, 6.04676, 13.021395, -17.62377, 6.061926, 11.288914, -14.037912, 8.018254, 11.318819, -14.596681, 6.3662996, 12.603388, -15.091156, 6.7550454, 11.318819, -14.596681, 6.3662996, 13.375538, -16.407764, 6.04676, 12.603388, -15.091156, 6.7550454, 13.632067, -18.083643, 7.819184, 13.896927, -16.367395, 7.9291854, 13.375538, -16.407764, 6.04676, 13.896927, -16.367395, 7.9291854, 12.603388, -15.091156, 6.7550454, 13.375538, -16.407764, 6.04676, 12.696516, -17.604118, 9.563199, 13.896927, -16.367395, 7.9291854, 13.632067, -18.083643, 7.819184, 12.696516, -17.604118, 9.563199, 13.068386, -16.296267, 9.768465, 13.896927, -16.367395, 7.9291854, 13.896927, -16.367395, 7.9291854, 12.811857, -14.620176, 7.996041, 12.603388, -15.091156, 6.7550454, 11.288914, -14.037912, 8.018254, 12.603388, -15.091156, 6.7550454, 12.811857, -14.620176, 7.996041, 13.068386, -16.296267, 9.768465, 12.811857, -14.620176, 7.996041, 13.896927, -16.367395, 7.9291854, 11.213087, -14.61334, 9.582636, 11.288914, -14.037912, 8.018254, 12.811857, -14.620176, 7.996041, 13.068386, -16.296267, 9.768465, 12.4669, -15.041601, 9.18321, 12.811857, -14.620176, 7.996041, 11.213087, -14.61334, 9.582636, 12.811857, -14.620176, 7.996041, 12.4669, -15.041601, 9.18321, 9.600649, -17.456738, 5.615509, 11.105434, -18.574488, 7.6675305, 11.392937, -17.965525, 4.8956895, 9.600649, -17.456738, 5.615509, 8.624725, -17.931135, 7.6034517, 11.105434, -18.574488, 7.6675305, 11.392937, -17.965525, 4.8956895, 11.105434, -18.574488, 7.6675305, 13.632067, -18.083643, 7.819184, 11.392937, -17.965525, 4.8956895, 13.632067, -18.083643, 7.819184, 13.021395, -17.62377, 6.061926, 11.105434, -18.574488, 7.6675305, 12.696516, -17.604118, 9.563199, 13.632067, -18.083643, 7.819184, 11.105434, -18.574488, 7.6675305, 10.863857, -18.049467, 10.526733, 12.696516, -17.604118, 9.563199, 8.624725, -17.931135, 7.6034517, 10.863857, -18.049467, 10.526733, 11.105434, -18.574488, 7.6675305, 8.624725, -17.931135, 7.6034517, 9.266797, -17.581049, 9.7409115, 10.863857, -18.049467, 10.526733, 7.21563, -18.140032, 8.584928, 8.205864, -17.407396, 9.311369, 8.061045, -18.408522, 8.982858, 8.061045, -18.408522, 8.982858, 8.205864, -17.407396, 9.311369, 9.478685, -17.401842, 8.917924, 8.061045, -18.408522, 8.982858, 9.478685, -17.401842, 8.917924, 9.09955, -18.140032, 8.584928, 7.21563, -18.140032, 8.584928, 7.005238, -17.401842, 8.917924, 8.205864, -17.407396, 9.311369, 7.005238, -18.380968, 7.5489845, 7.005238, -17.401842, 8.917924, 7.21563, -18.140032, 8.584928, 8.205864, -17.407396, 9.311369, 9.169825, -16.65511, 8.638754, 9.478685, -17.401842, 8.917924, 7.005238, -18.380968, 7.5489845, 6.93411, -17.385181, 7.7371626, 7.005238, -17.401842, 8.917924, 7.595832, -18.105644, 6.610869, 6.93411, -17.385181, 7.7371626, 7.005238, -18.380968, 7.5489845, 7.005238, -17.401842, 8.917924, 8.423091, -16.394949, 8.852991, 8.205864, -17.407396, 9.311369, 8.205864, -17.407396, 9.311369, 8.423091, -16.394949, 8.852991, 9.169825, -16.65511, 8.638754, 6.93411, -17.385181, 7.7371626, 7.595832, -16.65511, 8.638754, 7.005238, -17.401842, 8.917924, 7.005238, -17.401842, 8.917924, 7.595832, -16.65511, 8.638754, 8.423091, -16.394949, 8.852991, 7.595832, -18.105644, 6.610869, 7.571055, -17.368736, 6.5566154, 6.93411, -17.385181, 7.7371626, 7.571055, -17.368736, 6.5566154, 7.595832, -18.105644, 6.610869, 8.423091, -18.353416, 6.1153255, 6.93411, -17.385181, 7.7371626, 7.571055, -16.389395, 7.925341, 7.595832, -16.65511, 8.638754, 7.571055, -17.368736, 6.5566154, 7.571055, -16.389395, 7.925341, 6.93411, -17.385181, 7.7371626, 7.595832, -16.65511, 8.638754, 8.495287, -16.05768, 7.988138, 8.423091, -16.394949, 8.852991, 7.595832, -16.65511, 8.638754, 7.571055, -16.389395, 7.925341, 8.495287, -16.05768, 7.988138, 7.571055, -17.368736, 6.5566154, 7.847235, -16.640371, 7.1145287, 7.571055, -16.389395, 7.925341, 7.571055, -17.368736, 6.5566154, 8.423091, -18.353416, 6.1153255, 8.495287, -17.363182, 6.1631703, 7.847235, -16.640371, 7.1145287, 7.571055, -17.368736, 6.5566154, 8.495287, -17.363182, 6.1631703, 8.495287, -17.363182, 6.1631703, 8.423091, -18.353416, 6.1153255, 9.169825, -18.105644, 6.610869, 7.571055, -16.389395, 7.925341, 7.847235, -16.640371, 7.1145287, 8.495287, -16.384056, 6.9979053, 7.847235, -16.640371, 7.1145287, 8.495287, -17.363182, 6.1631703, 8.495287, -16.384056, 6.9979053, 7.571055, -16.389395, 7.925341, 8.495287, -16.384056, 6.9979053, 8.495287, -16.05768, 7.988138, 8.495287, -17.363182, 6.1631703, 9.169825, -18.105644, 6.610869, 9.347322, -17.368736, 6.5566154, 8.495287, -16.384056, 6.9979053, 8.495287, -17.363182, 6.1631703, 9.347322, -17.368736, 6.5566154, 9.478685, -18.380968, 7.5489845, 9.347322, -17.368736, 6.5566154, 9.169825, -18.105644, 6.610869, 8.495287, -16.05768, 7.988138, 8.495287, -16.384056, 6.9979053, 9.1112995, -16.640371, 7.1145287, 8.495287, -16.384056, 6.9979053, 9.347322, -17.368736, 6.5566154, 9.1112995, -16.640371, 7.1145287, 9.478685, -18.380968, 7.5489845, 9.767254, -17.385181, 7.7371626, 9.347322, -17.368736, 6.5566154, 9.767254, -17.385181, 7.7371626, 9.1112995, -16.640371, 7.1145287, 9.347322, -17.368736, 6.5566154, 9.09955, -18.140032, 8.584928, 9.767254, -17.385181, 7.7371626, 9.478685, -18.380968, 7.5489845, 9.09955, -18.140032, 8.584928, 9.478685, -17.401842, 8.917924, 9.767254, -17.385181, 7.7371626, 9.767254, -17.385181, 7.7371626, 9.347322, -16.389395, 7.925341, 9.1112995, -16.640371, 7.1145287, 8.495287, -16.05768, 7.988138, 9.1112995, -16.640371, 7.1145287, 9.347322, -16.389395, 7.925341, 9.478685, -17.401842, 8.917924, 9.347322, -16.389395, 7.925341, 9.767254, -17.385181, 7.7371626, 8.423091, -16.394949, 8.852991, 8.495287, -16.05768, 7.988138, 9.347322, -16.389395, 7.925341, 9.478685, -17.401842, 8.917924, 9.169825, -16.65511, 8.638754, 9.347322, -16.389395, 7.925341, 8.423091, -16.394949, 8.852991, 9.347322, -16.389395, 7.925341, 9.169825, -16.65511, 8.638754, 7.595832, -18.105644, 6.610869, 8.205864, -18.712898, 7.486401, 8.423091, -18.353416, 6.1153255, 7.595832, -18.105644, 6.610869, 7.005238, -18.380968, 7.5489845, 8.205864, -18.712898, 7.486401, 8.423091, -18.353416, 6.1153255, 8.205864, -18.712898, 7.486401, 9.478685, -18.380968, 7.5489845, 8.423091, -18.353416, 6.1153255, 9.478685, -18.380968, 7.5489845, 9.169825, -18.105644, 6.610869, 8.205864, -18.712898, 7.486401, 9.09955, -18.140032, 8.584928, 9.478685, -18.380968, 7.5489845, 8.205864, -18.712898, 7.486401, 8.061045, -18.408522, 8.982858, 9.09955, -18.140032, 8.584928, 7.005238, -18.380968, 7.5489845, 8.061045, -18.408522, 8.982858, 8.205864, -18.712898, 7.486401, 7.005238, -18.380968, 7.5489845, 7.21563, -18.140032, 8.584928, 8.061045, -18.408522, 8.982858, 11.220137, -19.80587, 7.9881396, 9.957781, -19.472874, 7.7623677, 11.16268, -19.969059, 7.7499795, 11.220137, -19.80587, 7.9881396, 10.0568905, -19.342154, 7.988139, 9.957781, -19.472874, 7.7623677, 10.0568905, -19.342154, 7.988139, 8.76399, -18.20817, 7.922565, 9.957781, -19.472874, 7.7623677, 10.0568905, -19.342154, 7.988139, 8.811623, -18.20881, 7.9881387, 8.76399, -18.20817, 7.922565, 9.957781, -19.472874, 7.7623677, 8.76399, -18.20817, 7.922565, 8.686882, -18.207743, 7.9475555, 11.16268, -19.969059, 7.7499795, 9.957781, -19.472874, 7.7623677, 9.797157, -19.68412, 7.848661, 9.957781, -19.472874, 7.7623677, 8.686882, -18.207743, 7.9475555, 9.797157, -19.68412, 7.848661, 11.16268, -19.969059, 7.7499795, 9.797157, -19.68412, 7.848661, 11.069338, -20.23285, 7.8409715, 9.797157, -19.68412, 7.848661, 8.686882, -18.207743, 7.9475555, 8.686882, -18.207743, 8.028723, 11.069338, -20.23285, 7.8409715, 9.797157, -19.68412, 7.848661, 9.797157, -19.68412, 8.127618, 9.797157, -19.68412, 7.848661, 8.686882, -18.207743, 8.028723, 9.797157, -19.68412, 8.127618, 11.069338, -20.23285, 7.8409715, 9.797157, -19.68412, 8.127618, 11.069338, -20.23285, 8.135094, 9.797157, -19.68412, 8.127618, 8.686882, -18.207743, 8.028723, 8.76399, -18.20817, 8.053713, 11.069338, -20.23285, 8.135094, 9.797157, -19.68412, 8.127618, 9.957781, -19.472874, 8.213911, 9.797157, -19.68412, 8.127618, 8.76399, -18.20817, 8.053713, 9.957781, -19.472874, 8.213911, 9.957781, -19.472874, 8.213911, 8.76399, -18.20817, 8.053713, 8.811623, -18.20881, 7.9881387, 11.069338, -20.23285, 8.135094, 9.957781, -19.472874, 8.213911, 11.16268, -19.969059, 8.226086, 9.957781, -19.472874, 8.213911, 8.811623, -18.20881, 7.9881387, 10.0568905, -19.342154, 7.988139, 11.16268, -19.969059, 8.226086, 9.957781, -19.472874, 8.213911, 10.0568905, -19.342154, 7.988139, 11.16268, -19.969059, 8.226086, 10.0568905, -19.342154, 7.988139, 11.220137, -19.80587, 7.9881396, 10.050482, -22.030905, 7.98814, 11.049473, -19.97397, 8.213911, 10.477888, -22.030905, 8.612482, 10.050482, -22.030905, 7.98814, 10.888208, -19.944494, 7.9881396, 11.049473, -19.97397, 8.213911, 10.888208, -19.944494, 7.9881396, 11.13064, -17.907639, 8.087889, 11.049473, -19.97397, 8.213911, 10.888208, -19.944494, 7.9881396, 11.058659, -17.900164, 7.9881387, 11.13064, -17.907639, 8.087889, 11.049473, -19.97397, 8.213911, 11.13064, -17.907639, 8.087889, 11.247263, -17.92024, 8.049868, 10.477888, -22.030905, 8.612482, 11.049473, -19.97397, 8.213911, 11.310488, -20.021389, 8.127618, 11.049473, -19.97397, 8.213911, 11.247263, -17.92024, 8.049868, 11.310488, -20.021389, 8.127618, 10.477888, -22.030905, 8.612482, 11.310488, -20.021389, 8.127618, 11.169514, -22.031118, 8.374109, 11.310488, -20.021389, 8.127618, 11.247263, -17.92024, 8.049868, 11.247263, -17.92024, 7.9264092, 11.169514, -22.031118, 8.374109, 11.310488, -20.021389, 8.127618, 11.310488, -20.021389, 7.848661, 11.310488, -20.021389, 8.127618, 11.247263, -17.92024, 7.9264092, 11.310488, -20.021389, 7.848661, 11.169514, -22.031118, 8.374109, 11.310488, -20.021389, 7.848661, 11.169514, -22.031118, 7.6021714, 11.310488, -20.021389, 7.848661, 11.247263, -17.92024, 7.9264092, 11.13064, -17.907639, 7.888389, 11.169514, -22.031118, 7.6021714, 11.310488, -20.021389, 7.848661, 11.049473, -19.97397, 7.762368, 11.310488, -20.021389, 7.848661, 11.13064, -17.907639, 7.888389, 11.049473, -19.97397, 7.762368, 11.049473, -19.97397, 7.762368, 11.13064, -17.907639, 7.888389, 11.058659, -17.900164, 7.9881387, 11.169514, -22.031118, 7.6021714, 11.049473, -19.97397, 7.762368, 10.477888, -22.030905, 7.3637977, 11.049473, -19.97397, 7.762368, 11.058659, -17.900164, 7.9881387, 10.888208, -19.944494, 7.9881396, 10.477888, -22.030905, 7.3637977, 11.049473, -19.97397, 7.762368, 10.888208, -19.944494, 7.9881396, 10.477888, -22.030905, 7.3637977, 10.888208, -19.944494, 7.9881396, 10.050482, -22.030905, 7.98814, 11.023628, -19.860125, 7.836486, 10.902519, -19.637772, 6.988935, 11.16268, -19.969059, 7.7499795, 11.023628, -19.860125, 7.836486, 10.7801285, -19.55041, 7.099151, 10.902519, -19.637772, 6.988935, 10.7801285, -19.55041, 7.099151, 10.55094, -18.793425, 6.265697, 10.902519, -19.637772, 6.988935, 10.7801285, -19.55041, 7.099151, 10.519327, -18.793852, 6.309698, 10.55094, -18.793425, 6.265697, 10.902519, -19.637772, 6.988935, 10.55094, -18.793425, 6.265697, 10.5189, -18.792997, 6.2221236, 11.16268, -19.969059, 7.7499795, 10.902519, -19.637772, 6.988935, 10.814302, -19.778744, 6.9052052, 10.902519, -19.637772, 6.988935, 10.5189, -18.792997, 6.2221236, 10.814302, -19.778744, 6.9052052, 11.16268, -19.969059, 7.7499795, 10.814302, -19.778744, 6.9052052, 11.085358, -20.145061, 7.710037, 10.814302, -19.778744, 6.9052052, 10.5189, -18.792997, 6.2221236, 10.4674225, -18.792997, 6.238998, 11.085358, -20.145061, 7.710037, 10.814302, -19.778744, 6.9052052, 10.637232, -19.778744, 6.963517, 10.814302, -19.778744, 6.9052052, 10.4674225, -18.792997, 6.238998, 10.637232, -19.778744, 6.963517, 11.085358, -20.145061, 7.710037, 10.637232, -19.778744, 6.963517, 10.898888, -20.145061, 7.771766, 10.637232, -19.778744, 6.963517, 10.4674225, -18.792997, 6.238998, 10.46785, -18.793425, 6.293038, 10.898888, -20.145061, 7.771766, 10.637232, -19.778744, 6.963517, 10.616299, -19.637772, 7.083345, 10.637232, -19.778744, 6.963517, 10.46785, -18.793425, 6.293038, 10.616299, -19.637772, 7.083345, 10.616299, -19.637772, 7.083345, 10.46785, -18.793425, 6.293038, 10.519327, -18.793852, 6.309698, 10.898888, -20.145061, 7.771766, 10.616299, -19.637772, 7.083345, 10.860653, -19.969059, 7.849729, 10.616299, -19.637772, 7.083345, 10.519327, -18.793852, 6.309698, 10.7801285, -19.55041, 7.099151, 10.860653, -19.969059, 7.849729, 10.616299, -19.637772, 7.083345, 10.7801285, -19.55041, 7.099151, 10.860653, -19.969059, 7.849729, 10.7801285, -19.55041, 7.099151, 11.023628, -19.860125, 7.836486, 9.806982, -18.747929, 5.422632, 9.553658, -18.258793, 6.2026863, 9.731583, -18.927135, 6.042062, 9.731583, -18.927135, 6.042062, 9.553658, -18.258793, 6.2026863, 10.069706, -18.254948, 6.927205, 9.731583, -18.927135, 6.042062, 10.069706, -18.254948, 6.927205, 10.201282, -18.747929, 6.6170635, 9.806982, -18.747929, 5.422632, 9.551735, -18.254948, 5.359194, 9.553658, -18.258793, 6.2026863, 10.419577, -18.908766, 5.0725474, 9.551735, -18.254948, 5.359194, 9.806982, -18.747929, 5.422632, 9.553658, -18.258793, 6.2026863, 10.181845, -17.756413, 6.672812, 10.069706, -18.254948, 6.927205, 10.419577, -18.908766, 5.0725474, 10.285225, -18.244055, 5.06678, 9.551735, -18.254948, 5.359194, 11.137901, -18.725073, 5.250473, 10.285225, -18.244055, 5.06678, 10.419577, -18.908766, 5.0725474, 9.551735, -18.254948, 5.359194, 9.889858, -17.582973, 6.244337, 9.553658, -18.258793, 6.2026863, 9.553658, -18.258793, 6.2026863, 9.889858, -17.582973, 6.244337, 10.181845, -17.756413, 6.672812, 10.285225, -18.244055, 5.06678, 9.852264, -17.756414, 5.6751027, 9.551735, -18.254948, 5.359194, 9.551735, -18.254948, 5.359194, 9.852264, -17.756414, 5.6751027, 9.889858, -17.582973, 6.244337, 11.137901, -18.725073, 5.250473, 11.16695, -18.232948, 5.223346, 10.285225, -18.244055, 5.06678, 11.16695, -18.232948, 5.223346, 11.137901, -18.725073, 5.250473, 11.625116, -18.890398, 5.671045, 10.285225, -18.244055, 5.06678, 10.299322, -17.579128, 5.5099926, 9.852264, -17.756414, 5.6751027, 11.16695, -18.232948, 5.223346, 10.299322, -17.579128, 5.5099926, 10.285225, -18.244055, 5.06678, 9.852264, -17.756414, 5.6751027, 10.453112, -17.357628, 6.1091304, 9.889858, -17.582973, 6.244337, 9.852264, -17.756414, 5.6751027, 10.299322, -17.579128, 5.5099926, 10.453112, -17.357628, 6.1091304, 11.16695, -18.232948, 5.223346, 10.871334, -17.746588, 5.5153327, 10.299322, -17.579128, 5.5099926, 11.16695, -18.232948, 5.223346, 11.625116, -18.890398, 5.671045, 11.610165, -18.229317, 5.727007, 10.871334, -17.746588, 5.5153327, 11.16695, -18.232948, 5.223346, 11.610165, -18.229317, 5.727007, 11.610165, -18.229317, 5.727007, 11.625116, -18.890398, 5.671045, 11.467482, -18.725073, 6.2481823, 10.299322, -17.579128, 5.5099926, 10.871334, -17.746588, 5.5153327, 11.080872, -17.575497, 5.9017286, 10.871334, -17.746588, 5.5153327, 11.610165, -18.229317, 5.727007, 11.080872, -17.575497, 5.9017286, 10.299322, -17.579128, 5.5099926, 11.080872, -17.575497, 5.9017286, 10.453112, -17.357628, 6.1091304, 11.610165, -18.229317, 5.727007, 11.467482, -18.725073, 6.2481823, 11.539036, -18.232946, 6.3494267, 11.080872, -17.575497, 5.9017286, 11.610165, -18.229317, 5.727007, 11.539036, -18.232946, 6.3494267, 10.937548, -18.908766, 6.640559, 11.539036, -18.232946, 6.3494267, 11.467482, -18.725073, 6.2481823, 10.453112, -17.357628, 6.1091304, 11.080872, -17.575497, 5.9017286, 11.135979, -17.746588, 6.316746, 11.080872, -17.575497, 5.9017286, 11.539036, -18.232946, 6.3494267, 11.135979, -17.746588, 6.316746, 10.937548, -18.908766, 6.640559, 10.878382, -18.244053, 6.8629127, 11.539036, -18.232946, 6.3494267, 10.878382, -18.244053, 6.8629127, 11.135979, -17.746588, 6.316746, 11.539036, -18.232946, 6.3494267, 10.201282, -18.747929, 6.6170635, 10.878382, -18.244053, 6.8629127, 10.937548, -18.908766, 6.640559, 10.201282, -18.747929, 6.6170635, 10.069706, -18.254948, 6.927205, 10.878382, -18.244053, 6.8629127, 10.878382, -18.244053, 6.8629127, 10.671408, -17.579128, 6.636073, 11.135979, -17.746588, 6.316746, 10.453112, -17.357628, 6.1091304, 11.135979, -17.746588, 6.316746, 10.671408, -17.579128, 6.636073, 10.069706, -18.254948, 6.927205, 10.671408, -17.579128, 6.636073, 10.878382, -18.244053, 6.8629127, 9.889858, -17.582973, 6.244337, 10.453112, -17.357628, 6.1091304, 10.671408, -17.579128, 6.636073, 10.069706, -18.254948, 6.927205, 10.181845, -17.756413, 6.672812, 10.671408, -17.579128, 6.636073, 9.889858, -17.582973, 6.244337, 10.671408, -17.579128, 6.636073, 10.181845, -17.756413, 6.672812, 11.137901, -18.725073, 5.250473, 10.710709, -19.13048, 5.8203487, 11.625116, -18.890398, 5.671045, 11.137901, -18.725073, 5.250473, 10.419577, -18.908766, 5.0725474, 10.710709, -19.13048, 5.8203487, 11.625116, -18.890398, 5.671045, 10.710709, -19.13048, 5.8203487, 10.937548, -18.908766, 6.640559, 11.625116, -18.890398, 5.671045, 10.937548, -18.908766, 6.640559, 11.467482, -18.725073, 6.2481823, 10.710709, -19.13048, 5.8203487, 10.201282, -18.747929, 6.6170635, 10.937548, -18.908766, 6.640559, 10.710709, -19.13048, 5.8203487, 9.731583, -18.927135, 6.042062, 10.201282, -18.747929, 6.6170635, 10.419577, -18.908766, 5.0725474, 9.731583, -18.927135, 6.042062, 10.710709, -19.13048, 5.8203487, 10.419577, -18.908766, 5.0725474, 9.806982, -18.747929, 5.422632, 9.731583, -18.927135, 6.042062, 15.540274, 10.966449, -3.3071837, 18.560066, 13.1471405, -1.460484, 18.346163, 10.143484, -1.9265671, 18.346163, 10.143484, -1.9265671, 18.560066, 13.1471405, -1.460484, 22.219316, 13.223694, -3.2587752, 18.346163, 10.143484, -1.9265671, 22.219316, 13.223694, -3.2587752, 21.565973, 10.92592, -3.6194077, 15.540274, 10.966449, -3.3071837, 15.086948, 13.100231, -2.2530527, 18.560066, 13.1471405, -1.460484, 14.412214, 10.35138, -7.0625033, 15.086948, 13.100231, -2.2530527, 15.540274, 10.966449, -3.3071837, 18.560066, 13.1471405, -1.460484, 21.16256, 15.42765, -4.2870145, 22.219316, 13.223694, -3.2587752, 14.412214, 10.35138, -7.0625033, 14.188929, 13.313381, -6.7934375, 15.086948, 13.100231, -2.2530527, 16.12682, 11.184852, -10.555136, 14.188929, 13.313381, -6.7934375, 14.412214, 10.35138, -7.0625033, 15.086948, 13.100231, -2.2530527, 18.959728, 16.180443, -3.5852609, 18.560066, 13.1471405, -1.460484, 18.560066, 13.1471405, -1.460484, 18.959728, 16.180443, -3.5852609, 21.16256, 15.42765, -4.2870145, 14.188929, 13.313381, -6.7934375, 16.632683, 15.373238, -3.8400683, 15.086948, 13.100231, -2.2530527, 15.086948, 13.100231, -2.2530527, 16.632683, 15.373238, -3.8400683, 18.959728, 16.180443, -3.5852609, 16.12682, 11.184852, -10.555136, 15.662611, 13.473244, -11.258017, 14.188929, 13.313381, -6.7934375, 15.662611, 13.473244, -11.258017, 16.12682, 11.184852, -10.555136, 19.275705, 10.291335, -11.819794, 14.188929, 13.313381, -6.7934375, 16.33697, 16.22172, -6.448566, 16.632683, 15.373238, -3.8400683, 15.662611, 13.473244, -11.258017, 16.33697, 16.22172, -6.448566, 14.188929, 13.313381, -6.7934375, 16.632683, 15.373238, -3.8400683, 19.092949, 17.191416, -6.333734, 18.959728, 16.180443, -3.5852609, 16.632683, 15.373238, -3.8400683, 16.33697, 16.22172, -6.448566, 19.092949, 17.191416, -6.333734, 15.662611, 13.473244, -11.258017, 16.88824, 15.538728, -9.202293, 16.33697, 16.22172, -6.448566, 15.662611, 13.473244, -11.258017, 19.275705, 10.291335, -11.819794, 19.30385, 13.265345, -11.823172, 16.88824, 15.538728, -9.202293, 15.662611, 13.473244, -11.258017, 19.30385, 13.265345, -11.823172, 19.30385, 13.265345, -11.823172, 19.275705, 10.291335, -11.819794, 22.136759, 10.891392, -9.770823, 16.33697, 16.22172, -6.448566, 16.88824, 15.538728, -9.202293, 19.145487, 16.20971, -9.236067, 16.88824, 15.538728, -9.202293, 19.30385, 13.265345, -11.823172, 19.145487, 16.20971, -9.236067, 16.33697, 16.22172, -6.448566, 19.145487, 16.20971, -9.236067, 19.092949, 17.191416, -6.333734, 19.30385, 13.265345, -11.823172, 22.136759, 10.891392, -9.770823, 22.758955, 13.0278, -9.797468, 19.145487, 16.20971, -9.236067, 19.30385, 13.265345, -11.823172, 22.758955, 13.0278, -9.797468, 23.209654, 10.083063, -6.6834817, 22.758955, 13.0278, -9.797468, 22.136759, 10.891392, -9.770823, 19.092949, 17.191416, -6.333734, 19.145487, 16.20971, -9.236067, 21.402355, 15.340961, -8.553076, 19.145487, 16.20971, -9.236067, 22.758955, 13.0278, -9.797468, 21.402355, 15.340961, -8.553076, 23.209654, 10.083063, -6.6834817, 23.674988, 13.098728, -6.4902196, 22.758955, 13.0278, -9.797468, 23.674988, 13.098728, -6.4902196, 21.402355, 15.340961, -8.553076, 22.758955, 13.0278, -9.797468, 21.565973, 10.92592, -3.6194077, 23.674988, 13.098728, -6.4902196, 23.209654, 10.083063, -6.6834817, 21.565973, 10.92592, -3.6194077, 22.219316, 13.223694, -3.2587752, 23.674988, 13.098728, -6.4902196, 23.674988, 13.098728, -6.4902196, 21.768618, 16.168056, -6.372762, 21.402355, 15.340961, -8.553076, 19.092949, 17.191416, -6.333734, 21.402355, 15.340961, -8.553076, 21.768618, 16.168056, -6.372762, 22.219316, 13.223694, -3.2587752, 21.768618, 16.168056, -6.372762, 23.674988, 13.098728, -6.4902196, 18.959728, 16.180443, -3.5852609, 19.092949, 17.191416, -6.333734, 21.768618, 16.168056, -6.372762, 22.219316, 13.223694, -3.2587752, 21.16256, 15.42765, -4.2870145, 21.768618, 16.168056, -6.372762, 18.959728, 16.180443, -3.5852609, 21.768618, 16.168056, -6.372762, 21.16256, 15.42765, -4.2870145, 16.12682, 11.184852, -10.555136, 18.770592, 9.221069, -6.949922, 19.275705, 10.291335, -11.819794, 16.12682, 11.184852, -10.555136, 14.412214, 10.35138, -7.0625033, 18.770592, 9.221069, -6.949922, 19.275705, 10.291335, -11.819794, 18.770592, 9.221069, -6.949922, 23.209654, 10.083063, -6.6834817, 19.275705, 10.291335, -11.819794, 23.209654, 10.083063, -6.6834817, 22.136759, 10.891392, -9.770823, 18.770592, 9.221069, -6.949922, 21.565973, 10.92592, -3.6194077, 23.209654, 10.083063, -6.6834817, 18.770592, 9.221069, -6.949922, 18.346163, 10.143484, -1.9265671, 21.565973, 10.92592, -3.6194077, 14.412214, 10.35138, -7.0625033, 18.346163, 10.143484, -1.9265671, 18.770592, 9.221069, -6.949922, 14.412214, 10.35138, -7.0625033, 15.540274, 10.966449, -3.3071837, 18.346163, 10.143484, -1.9265671, 11.936562, 9.984368, -5.338141, 13.67631, 11.271917, -4.06185, 13.421877, 9.512654, -4.639014, 13.421877, 9.512654, -4.639014, 13.67631, 11.271917, -4.06185, 15.91254, 11.2813, -4.7530966, 13.421877, 9.512654, -4.639014, 15.91254, 11.2813, -4.7530966, 15.246437, 9.984368, -5.338141, 11.936562, 9.984368, -5.338141, 11.566921, 11.2813, -4.7530966, 13.67631, 11.271917, -4.06185, 11.566921, 9.561063, -7.158197, 11.566921, 11.2813, -4.7530966, 11.936562, 9.984368, -5.338141, 13.67631, 11.271917, -4.06185, 15.369902, 12.5936165, -5.243574, 15.91254, 11.2813, -4.7530966, 11.566921, 9.561063, -7.158197, 11.441956, 11.310569, -6.8275857, 11.566921, 11.2813, -4.7530966, 12.604542, 10.044409, -8.806381, 11.441956, 11.310569, -6.8275857, 11.566921, 9.561063, -7.158197, 11.566921, 11.2813, -4.7530966, 14.057959, 13.050319, -4.8671794, 13.67631, 11.271917, -4.06185, 13.67631, 11.271917, -4.06185, 14.057959, 13.050319, -4.8671794, 15.369902, 12.5936165, -5.243574, 11.441956, 11.310569, -6.8275857, 12.604542, 12.5936165, -5.243574, 11.566921, 11.2813, -4.7530966, 11.566921, 11.2813, -4.7530966, 12.604542, 12.5936165, -5.243574, 14.057959, 13.050319, -4.8671794, 12.604542, 10.044409, -8.806381, 12.56101, 11.339464, -8.901699, 11.441956, 11.310569, -6.8275857, 12.56101, 11.339464, -8.901699, 12.604542, 10.044409, -8.806381, 14.057959, 9.609097, -9.677006, 11.441956, 11.310569, -6.8275857, 12.56101, 13.0597, -6.4969745, 12.604542, 12.5936165, -5.243574, 12.56101, 11.339464, -8.901699, 12.56101, 13.0597, -6.4969745, 11.441956, 11.310569, -6.8275857, 12.604542, 12.5936165, -5.243574, 14.184801, 13.643244, -6.386646, 14.057959, 13.050319, -4.8671794, 12.604542, 12.5936165, -5.243574, 12.56101, 13.0597, -6.4969745, 14.184801, 13.643244, -6.386646, 12.56101, 11.339464, -8.901699, 13.046232, 12.619133, -7.921497, 12.56101, 13.0597, -6.4969745, 12.56101, 11.339464, -8.901699, 14.057959, 9.609097, -9.677006, 14.184801, 11.34922, -9.592945, 13.046232, 12.619133, -7.921497, 12.56101, 11.339464, -8.901699, 14.184801, 11.34922, -9.592945, 14.184801, 11.34922, -9.592945, 14.057959, 9.609097, -9.677006, 15.369902, 10.044409, -8.806381, 12.56101, 13.0597, -6.4969745, 13.046232, 12.619133, -7.921497, 14.184801, 13.069456, -8.126394, 13.046232, 12.619133, -7.921497, 14.184801, 11.34922, -9.592945, 14.184801, 13.069456, -8.126394, 12.56101, 13.0597, -6.4969745, 14.184801, 13.069456, -8.126394, 14.184801, 13.643244, -6.386646, 14.184801, 11.34922, -9.592945, 15.369902, 10.044409, -8.806381, 15.681749, 11.339464, -8.901699, 14.184801, 13.069456, -8.126394, 14.184801, 11.34922, -9.592945, 15.681749, 11.339464, -8.901699, 15.91254, 9.561063, -7.158197, 15.681749, 11.339464, -8.901699, 15.369902, 10.044409, -8.806381, 14.184801, 13.643244, -6.386646, 14.184801, 13.069456, -8.126394, 15.2670765, 12.619133, -7.921497, 14.184801, 13.069456, -8.126394, 15.681749, 11.339464, -8.901699, 15.2670765, 12.619133, -7.921497, 15.91254, 9.561063, -7.158197, 16.419529, 11.310569, -6.8275857, 15.681749, 11.339464, -8.901699, 16.419529, 11.310569, -6.8275857, 15.2670765, 12.619133, -7.921497, 15.681749, 11.339464, -8.901699, 15.246437, 9.984368, -5.338141, 16.419529, 11.310569, -6.8275857, 15.91254, 9.561063, -7.158197, 15.246437, 9.984368, -5.338141, 15.91254, 11.2813, -4.7530966, 16.419529, 11.310569, -6.8275857, 16.419529, 11.310569, -6.8275857, 15.681749, 13.0597, -6.4969745, 15.2670765, 12.619133, -7.921497, 14.184801, 13.643244, -6.386646, 15.2670765, 12.619133, -7.921497, 15.681749, 13.0597, -6.4969745, 15.91254, 11.2813, -4.7530966, 15.681749, 13.0597, -6.4969745, 16.419529, 11.310569, -6.8275857, 14.057959, 13.050319, -4.8671794, 14.184801, 13.643244, -6.386646, 15.681749, 13.0597, -6.4969745, 15.91254, 11.2813, -4.7530966, 15.369902, 12.5936165, -5.243574, 15.681749, 13.0597, -6.4969745, 14.057959, 13.050319, -4.8671794, 15.681749, 13.0597, -6.4969745, 15.369902, 12.5936165, -5.243574, 12.604542, 10.044409, -8.806381, 13.67631, 8.977895, -7.268151, 14.057959, 9.609097, -9.677006, 12.604542, 10.044409, -8.806381, 11.566921, 9.561063, -7.158197, 13.67631, 8.977895, -7.268151, 14.057959, 9.609097, -9.677006, 13.67631, 8.977895, -7.268151, 15.91254, 9.561063, -7.158197, 14.057959, 9.609097, -9.677006, 15.91254, 9.561063, -7.158197, 15.369902, 10.044409, -8.806381, 13.67631, 8.977895, -7.268151, 15.246437, 9.984368, -5.338141, 15.91254, 9.561063, -7.158197, 13.67631, 8.977895, -7.268151, 13.421877, 9.512654, -4.639014, 15.246437, 9.984368, -5.338141, 11.566921, 9.561063, -7.158197, 13.421877, 9.512654, -4.639014, 13.67631, 8.977895, -7.268151, 11.566921, 9.561063, -7.158197, 11.936562, 9.984368, -5.338141, 13.421877, 9.512654, -4.639014, 16.48933, 8.916348, -10.894003, 16.04426, 9.775716, -9.5235195, 16.35686, 8.601498, -9.805721, 16.35686, 8.601498, -9.805721, 16.04426, 9.775716, -9.5235195, 16.95091, 9.782472, -8.250607, 16.35686, 8.601498, -9.805721, 16.95091, 9.782472, -8.250607, 17.182077, 8.916349, -8.795498, 16.48933, 8.916348, -10.894003, 16.040882, 9.78247, -11.005459, 16.04426, 9.775716, -9.5235195, 17.565601, 8.63377, -11.509069, 16.040882, 9.78247, -11.005459, 16.48933, 8.916348, -10.894003, 16.04426, 9.775716, -9.5235195, 17.147928, 10.65835, -8.697552, 16.95091, 9.782472, -8.250607, 17.565601, 8.63377, -11.509069, 17.329557, 9.801608, -11.519203, 16.040882, 9.78247, -11.005459, 18.827633, 8.956502, -11.19647, 17.329557, 9.801608, -11.519203, 17.565601, 8.63377, -11.509069, 16.040882, 9.78247, -11.005459, 16.634933, 10.963444, -9.450344, 16.04426, 9.775716, -9.5235195, 16.04426, 9.775716, -9.5235195, 16.634933, 10.963444, -9.450344, 17.147928, 10.65835, -8.697552, 17.329557, 9.801608, -11.519203, 16.568888, 10.658349, -10.450436, 16.040882, 9.78247, -11.005459, 16.040882, 9.78247, -11.005459, 16.568888, 10.658349, -10.450436, 16.634933, 10.963444, -9.450344, 18.827633, 8.956502, -11.19647, 18.87867, 9.821122, -11.244131, 17.329557, 9.801608, -11.519203, 18.87867, 9.821122, -11.244131, 18.827633, 8.956502, -11.19647, 19.683622, 8.666044, -10.457565, 17.329557, 9.801608, -11.519203, 17.354326, 10.969822, -10.740519, 16.568888, 10.658349, -10.450436, 18.87867, 9.821122, -11.244131, 17.354326, 10.969822, -10.740519, 17.329557, 9.801608, -11.519203, 16.568888, 10.658349, -10.450436, 17.62452, 11.358977, -9.687889, 16.634933, 10.963444, -9.450344, 16.568888, 10.658349, -10.450436, 17.354326, 10.969822, -10.740519, 17.62452, 11.358977, -9.687889, 18.87867, 9.821122, -11.244131, 18.359297, 10.6756115, -10.731136, 17.354326, 10.969822, -10.740519, 18.87867, 9.821122, -11.244131, 19.683622, 8.666044, -10.457565, 19.657354, 9.827502, -10.359245, 18.359297, 10.6756115, -10.731136, 18.87867, 9.821122, -11.244131, 19.657354, 9.827502, -10.359245, 19.657354, 9.827502, -10.359245, 19.683622, 8.666044, -10.457565, 19.406673, 8.956503, -9.443586, 17.354326, 10.969822, -10.740519, 18.359297, 10.6756115, -10.731136, 18.727436, 10.976202, -10.052275, 18.359297, 10.6756115, -10.731136, 19.657354, 9.827502, -10.359245, 18.727436, 10.976202, -10.052275, 17.354326, 10.969822, -10.740519, 18.727436, 10.976202, -10.052275, 17.62452, 11.358977, -9.687889, 19.657354, 9.827502, -10.359245, 19.406673, 8.956503, -9.443586, 19.532389, 9.821123, -9.265711, 18.727436, 10.976202, -10.052275, 19.657354, 9.827502, -10.359245, 19.532389, 9.821123, -9.265711, 18.47563, 8.633772, -8.754217, 19.532389, 9.821123, -9.265711, 19.406673, 8.956503, -9.443586, 17.62452, 11.358977, -9.687889, 18.727436, 10.976202, -10.052275, 18.824255, 10.6756115, -9.323126, 18.727436, 10.976202, -10.052275, 19.532389, 9.821123, -9.265711, 18.824255, 10.6756115, -9.323126, 18.47563, 8.633772, -8.754217, 18.371681, 9.80161, -8.363562, 19.532389, 9.821123, -9.265711, 18.371681, 9.80161, -8.363562, 18.824255, 10.6756115, -9.323126, 19.532389, 9.821123, -9.265711, 17.182077, 8.916349, -8.795498, 18.371681, 9.80161, -8.363562, 18.47563, 8.633772, -8.754217, 17.182077, 8.916349, -8.795498, 16.95091, 9.782472, -8.250607, 18.371681, 9.80161, -8.363562, 18.371681, 9.80161, -8.363562, 18.008045, 10.969824, -8.762098, 18.824255, 10.6756115, -9.323126, 17.62452, 11.358977, -9.687889, 18.824255, 10.6756115, -9.323126, 18.008045, 10.969824, -8.762098, 16.95091, 9.782472, -8.250607, 18.008045, 10.969824, -8.762098, 18.371681, 9.80161, -8.363562, 16.634933, 10.963444, -9.450344, 17.62452, 11.358977, -9.687889, 18.008045, 10.969824, -8.762098, 16.95091, 9.782472, -8.250607, 17.147928, 10.65835, -8.697552, 18.008045, 10.969824, -8.762098, 16.634933, 10.963444, -9.450344, 18.008045, 10.969824, -8.762098, 17.147928, 10.65835, -8.697552, 18.827633, 8.956502, -11.19647, 18.077095, 8.244242, -10.195251, 19.683622, 8.666044, -10.457565, 18.827633, 8.956502, -11.19647, 17.565601, 8.63377, -11.509069, 18.077095, 8.244242, -10.195251, 19.683622, 8.666044, -10.457565, 18.077095, 8.244242, -10.195251, 18.47563, 8.633772, -8.754217, 19.683622, 8.666044, -10.457565, 18.47563, 8.633772, -8.754217, 19.406673, 8.956503, -9.443586, 18.077095, 8.244242, -10.195251, 17.182077, 8.916349, -8.795498, 18.47563, 8.633772, -8.754217, 18.077095, 8.244242, -10.195251, 16.35686, 8.601498, -9.805721, 17.182077, 8.916349, -8.795498, 17.565601, 8.63377, -11.509069, 16.35686, 8.601498, -9.805721, 18.077095, 8.244242, -10.195251, 17.565601, 8.63377, -11.509069, 16.48933, 8.916348, -10.894003, 16.35686, 8.601498, -9.805721, 18.97211, 7.0576415, -6.386642, 16.75427, 7.642686, -6.783302, 18.871164, 6.7709355, -6.804692, 18.97211, 7.0576415, -6.386642, 16.92877, 7.871976, -6.386642, 16.75427, 7.642686, -6.783302, 16.92877, 7.871976, -6.386642, 14.656889, 9.864281, -6.5018516, 16.75427, 7.642686, -6.783302, 16.92877, 7.871976, -6.386642, 14.740574, 9.86353, -6.386643, 14.656889, 9.864281, -6.5018516, 16.75427, 7.642686, -6.783302, 14.656889, 9.864281, -6.5018516, 14.521418, 9.865407, -6.4579444, 18.871164, 6.7709355, -6.804692, 16.75427, 7.642686, -6.783302, 16.472067, 7.2715445, -6.6316934, 16.75427, 7.642686, -6.783302, 14.521418, 9.865407, -6.4579444, 16.472067, 7.2715445, -6.6316934, 18.871164, 6.7709355, -6.804692, 16.472067, 7.2715445, -6.6316934, 18.70717, 6.307478, -6.645202, 16.472067, 7.2715445, -6.6316934, 14.521418, 9.865407, -6.4579444, 14.521418, 9.865407, -6.3153424, 18.70717, 6.307478, -6.645202, 16.472067, 7.2715445, -6.6316934, 16.472067, 7.271545, -6.1415906, 16.472067, 7.2715445, -6.6316934, 14.521418, 9.865407, -6.3153424, 16.472067, 7.271545, -6.1415906, 18.70717, 6.307478, -6.645202, 16.472067, 7.271545, -6.1415906, 18.70717, 6.307478, -6.128081, 16.472067, 7.271545, -6.1415906, 14.521418, 9.865407, -6.3153424, 14.656889, 9.864282, -6.2714353, 18.70717, 6.307478, -6.128081, 16.472067, 7.271545, -6.1415906, 16.75427, 7.642687, -5.9899826, 16.472067, 7.271545, -6.1415906, 14.656889, 9.864282, -6.2714353, 16.75427, 7.642687, -5.9899826, 16.75427, 7.642687, -5.9899826, 14.656889, 9.864282, -6.2714353, 14.740574, 9.86353, -6.386643, 18.70717, 6.307478, -6.128081, 16.75427, 7.642687, -5.9899826, 18.871164, 6.770936, -5.9685917, 16.75427, 7.642687, -5.9899826, 14.740574, 9.86353, -6.386643, 16.92877, 7.871976, -6.386642, 18.871164, 6.770936, -5.9685917, 16.75427, 7.642687, -5.9899826, 16.92877, 7.871976, -6.386642, 18.871164, 6.770936, -5.9685917, 16.92877, 7.871976, -6.386642, 18.97211, 7.0576415, -6.386642, 16.917137, 3.1484604, -6.38664, 18.672272, 6.762305, -5.989982, 17.66805, 3.1484613, -5.289727, 16.917137, 3.1484604, -6.38664, 18.388943, 6.8137164, -6.386642, 18.672272, 6.762305, -5.989982, 18.388943, 6.8137164, -6.386642, 18.814873, 10.392285, -6.211393, 18.672272, 6.762305, -5.989982, 18.388943, 6.8137164, -6.386642, 18.688408, 10.405795, -6.386644, 18.814873, 10.392285, -6.211393, 18.672272, 6.762305, -5.989982, 18.814873, 10.392285, -6.211393, 19.01977, 10.370894, -6.278191, 17.66805, 3.1484613, -5.289727, 18.672272, 6.762305, -5.989982, 19.13085, 6.6789947, -6.1415906, 18.672272, 6.762305, -5.989982, 19.01977, 10.370894, -6.278191, 19.13085, 6.6789947, -6.1415906, 17.66805, 3.1484613, -5.289727, 19.13085, 6.6789947, -6.1415906, 18.883549, 3.148085, -5.708528, 19.13085, 6.6789947, -6.1415906, 19.01977, 10.370894, -6.278191, 19.01977, 10.370894, -6.4950967, 18.883549, 3.148085, -5.708528, 19.13085, 6.6789947, -6.1415906, 19.13085, 6.678994, -6.6316924, 19.13085, 6.6789947, -6.1415906, 19.01977, 10.370894, -6.4950967, 19.13085, 6.678994, -6.6316924, 18.883549, 3.148085, -5.708528, 19.13085, 6.678994, -6.6316924, 18.883549, 3.1480846, -7.064751, 19.13085, 6.678994, -6.6316924, 19.01977, 10.370894, -6.4950967, 18.814873, 10.392285, -6.561895, 18.883549, 3.1480846, -7.064751, 19.13085, 6.678994, -6.6316924, 18.672272, 6.7623043, -6.783302, 19.13085, 6.678994, -6.6316924, 18.814873, 10.392285, -6.561895, 18.672272, 6.7623043, -6.783302, 18.672272, 6.7623043, -6.783302, 18.814873, 10.392285, -6.561895, 18.688408, 10.405795, -6.386644, 18.883549, 3.1480846, -7.064751, 18.672272, 6.7623043, -6.783302, 17.66805, 3.14846, -7.4835525, 18.672272, 6.7623043, -6.783302, 18.688408, 10.405795, -6.386644, 18.388943, 6.8137164, -6.386642, 17.66805, 3.14846, -7.4835525, 18.672272, 6.7623043, -6.783302, 18.388943, 6.8137164, -6.386642, 17.66805, 3.14846, -7.4835525, 18.388943, 6.8137164, -6.386642, 16.917137, 3.1484604, -6.38664, 18.62724, 6.962323, -6.6530833, 18.414085, 7.3529778, -8.142153, 18.871164, 6.7709355, -6.804692, 18.62724, 6.962323, -6.6530833, 18.199057, 7.5060873, -7.9485135, 18.414085, 7.3529778, -8.142153, 18.199057, 7.5060873, -7.9485135, 17.796392, 8.836041, -9.412815, 18.414085, 7.3529778, -8.142153, 18.199057, 7.5060873, -7.9485135, 17.740852, 8.835667, -9.33551, 17.796392, 8.836041, -9.412815, 18.414085, 7.3529778, -8.142153, 17.796392, 8.836041, -9.412815, 17.740103, 8.836792, -9.48937, 18.871164, 6.7709355, -6.804692, 18.414085, 7.3529778, -8.142153, 18.258724, 7.1053, -8.289257, 18.414085, 7.3529778, -8.142153, 17.740103, 8.836792, -9.48937, 18.258724, 7.1053, -8.289257, 18.871164, 6.7709355, -6.804692, 18.258724, 7.1053, -8.289257, 18.735317, 6.461338, -6.8752427, 18.258724, 7.1053, -8.289257, 17.740103, 8.836792, -9.48937, 17.650038, 8.836792, -9.459724, 18.735317, 6.461338, -6.8752427, 18.258724, 7.1053, -8.289257, 17.948002, 7.1053, -8.18681, 18.258724, 7.1053, -8.289257, 17.650038, 8.836792, -9.459724, 17.948002, 7.1053, -8.18681, 18.735317, 6.461338, -6.8752427, 17.948002, 7.1053, -8.18681, 18.407707, 6.461338, -6.7671647, 17.948002, 7.1053, -8.18681, 17.650038, 8.836792, -9.459724, 17.650414, 8.836041, -9.36478, 18.407707, 6.461338, -6.7671647, 17.948002, 7.1053, -8.18681, 17.911226, 7.3529778, -7.975908, 17.948002, 7.1053, -8.18681, 17.650414, 8.836041, -9.36478, 17.911226, 7.3529778, -7.975908, 17.911226, 7.3529778, -7.975908, 17.650414, 8.836041, -9.36478, 17.740852, 8.835667, -9.33551, 18.407707, 6.461338, -6.7671647, 17.911226, 7.3529778, -7.975908, 18.340908, 6.7709355, -6.6298165, 17.911226, 7.3529778, -7.975908, 17.740852, 8.835667, -9.33551, 18.199057, 7.5060873, -7.9485135, 18.340908, 6.7709355, -6.6298165, 17.911226, 7.3529778, -7.975908, 18.199057, 7.5060873, -7.9485135, 18.340908, 6.7709355, -6.6298165, 18.199057, 7.5060873, -7.9485135, 18.62724, 6.962323, -6.6530833, -21.319002, 11.927798, 5.296257, -17.92721, 14.377124, 7.3704467, -18.167463, 11.003454, 6.8469477, -18.167463, 11.003454, 6.8469477, -17.92721, 14.377124, 7.3704467, -13.817183, 14.463108, 5.3506293, -18.167463, 11.003454, 6.8469477, -13.817183, 14.463108, 5.3506293, -14.551012, 11.882277, 4.945571, -21.319002, 11.927798, 5.296257, -21.828173, 14.324436, 6.480244, -17.92721, 14.377124, 7.3704467, -22.586025, 11.236962, 1.0783278, -21.828173, 14.324436, 6.480244, -21.319002, 11.927798, 5.296257, -17.92721, 14.377124, 7.3704467, -15.004122, 16.938564, 4.195724, -13.817183, 14.463108, 5.3506293, -22.586025, 11.236962, 1.0783278, -22.836817, 14.563845, 1.3805406, -21.828173, 14.324436, 6.480244, -20.660202, 12.173107, -2.8445535, -22.836817, 14.563845, 1.3805406, -22.586025, 11.236962, 1.0783278, -21.828173, 14.324436, 6.480244, -17.478313, 17.78409, 4.983925, -17.92721, 14.377124, 7.3704467, -17.92721, 14.377124, 7.3704467, -17.478313, 17.78409, 4.983925, -15.004122, 16.938564, 4.195724, -22.836817, 14.563845, 1.3805406, -20.092022, 16.877449, 4.697728, -21.828173, 14.324436, 6.480244, -21.828173, 14.324436, 6.480244, -20.092022, 16.877449, 4.697728, -17.478313, 17.78409, 4.983925, -20.660202, 12.173107, -2.8445535, -21.181595, 14.743402, -3.6340203, -22.836817, 14.563845, 1.3805406, -21.181595, 14.743402, -3.6340203, -20.660202, 12.173107, -2.8445535, -17.123413, 11.16952, -4.2650013, -22.836817, 14.563845, 1.3805406, -20.424162, 17.830454, 1.7678959, -20.092022, 16.877449, 4.697728, -21.181595, 14.743402, -3.6340203, -20.424162, 17.830454, 1.7678959, -22.836817, 14.563845, 1.3805406, -20.092022, 16.877449, 4.697728, -17.328682, 18.919605, 1.896874, -17.478313, 17.78409, 4.983925, -20.092022, 16.877449, 4.697728, -20.424162, 17.830454, 1.7678959, -17.328682, 18.919605, 1.896874, -21.181595, 14.743402, -3.6340203, -19.804983, 17.063326, -1.3250556, -20.424162, 17.830454, 1.7678959, -21.181595, 14.743402, -3.6340203, -17.123413, 11.16952, -4.2650013, -17.0918, 14.5098915, -4.268796, -19.804983, 17.063326, -1.3250556, -21.181595, 14.743402, -3.6340203, -17.0918, 14.5098915, -4.268796, -17.0918, 14.5098915, -4.268796, -17.123413, 11.16952, -4.2650013, -13.909912, 11.843496, -1.963623, -20.424162, 17.830454, 1.7678959, -19.804983, 17.063326, -1.3250556, -17.269672, 17.816965, -1.3629904, -19.804983, 17.063326, -1.3250556, -17.0918, 14.5098915, -4.268796, -17.269672, 17.816965, -1.3629904, -20.424162, 17.830454, 1.7678959, -17.269672, 17.816965, -1.3629904, -17.328682, 18.919605, 1.896874, -17.0918, 14.5098915, -4.268796, -13.909912, 11.843496, -1.963623, -13.211069, 14.243084, -1.9935503, -17.269672, 17.816965, -1.3629904, -17.0918, 14.5098915, -4.268796, -13.211069, 14.243084, -1.9935503, -12.704849, 10.935591, 1.5040407, -13.211069, 14.243084, -1.9935503, -13.909912, 11.843496, -1.963623, -17.328682, 18.919605, 1.896874, -17.269672, 17.816965, -1.3629904, -14.734785, 16.841198, -0.5958638, -17.269672, 17.816965, -1.3629904, -13.211069, 14.243084, -1.9935503, -14.734785, 16.841198, -0.5958638, -12.704849, 10.935591, 1.5040407, -12.182192, 14.322748, 1.7211109, -13.211069, 14.243084, -1.9935503, -12.182192, 14.322748, 1.7211109, -14.734785, 16.841198, -0.5958638, -13.211069, 14.243084, -1.9935503, -14.551012, 11.882277, 4.945571, -12.182192, 14.322748, 1.7211109, -12.704849, 10.935591, 1.5040407, -14.551012, 11.882277, 4.945571, -13.817183, 14.463108, 5.3506293, -12.182192, 14.322748, 1.7211109, -12.182192, 14.322748, 1.7211109, -14.323402, 17.77018, 1.8530385, -14.734785, 16.841198, -0.5958638, -17.328682, 18.919605, 1.896874, -14.734785, 16.841198, -0.5958638, -14.323402, 17.77018, 1.8530385, -13.817183, 14.463108, 5.3506293, -14.323402, 17.77018, 1.8530385, -12.182192, 14.322748, 1.7211109, -17.478313, 17.78409, 4.983925, -17.328682, 18.919605, 1.896874, -14.323402, 17.77018, 1.8530385, -13.817183, 14.463108, 5.3506293, -15.004122, 16.938564, 4.195724, -14.323402, 17.77018, 1.8530385, -17.478313, 17.78409, 4.983925, -14.323402, 17.77018, 1.8530385, -15.004122, 16.938564, 4.195724, -20.660202, 12.173107, -2.8445535, -17.690748, 9.96741, 1.2047776, -17.123413, 11.16952, -4.2650013, -20.660202, 12.173107, -2.8445535, -22.586025, 11.236962, 1.0783278, -17.690748, 9.96741, 1.2047776, -17.123413, 11.16952, -4.2650013, -17.690748, 9.96741, 1.2047776, -12.704849, 10.935591, 1.5040407, -17.123413, 11.16952, -4.2650013, -12.704849, 10.935591, 1.5040407, -13.909912, 11.843496, -1.963623, -17.690748, 9.96741, 1.2047776, -14.551012, 11.882277, 4.945571, -12.704849, 10.935591, 1.5040407, -17.690748, 9.96741, 1.2047776, -18.167463, 11.003454, 6.8469477, -14.551012, 11.882277, 4.945571, -22.586025, 11.236962, 1.0783278, -18.167463, 11.003454, 6.8469477, -17.690748, 9.96741, 1.2047776, -22.586025, 11.236962, 1.0783278, -21.319002, 11.927798, 5.296257, -18.167463, 11.003454, 6.8469477, -25.366648, 10.824738, 3.0151107, -23.412582, 12.270897, 4.4486246, -23.698359, 10.294915, 3.8003616, -23.698359, 10.294915, 3.8003616, -23.412582, 12.270897, 4.4486246, -20.900877, 12.281435, 3.6722255, -23.698359, 10.294915, 3.8003616, -20.900877, 12.281435, 3.6722255, -21.649036, 10.824738, 3.0151107, -25.366648, 10.824738, 3.0151107, -25.781822, 12.281435, 3.6722255, -23.412582, 12.270897, 4.4486246, -25.781822, 10.349287, 0.97084606, -25.781822, 12.281435, 3.6722255, -25.366648, 10.824738, 3.0151107, -23.412582, 12.270897, 4.4486246, -21.510363, 13.755413, 3.1213274, -20.900877, 12.281435, 3.6722255, -25.781822, 10.349287, 0.97084606, -25.922182, 12.314311, 1.342185, -25.781822, 12.281435, 3.6722255, -24.61638, 10.892176, -0.880373, -25.922182, 12.314311, 1.342185, -25.781822, 10.349287, 0.97084606, -25.781822, 12.281435, 3.6722255, -22.98392, 14.268375, 3.5440893, -23.412582, 12.270897, 4.4486246, -23.412582, 12.270897, 4.4486246, -22.98392, 14.268375, 3.5440893, -21.510363, 13.755413, 3.1213274, -25.922182, 12.314311, 1.342185, -24.61638, 13.755413, 3.1213274, -25.781822, 12.281435, 3.6722255, -25.781822, 12.281435, 3.6722255, -24.61638, 13.755413, 3.1213274, -22.98392, 14.268375, 3.5440893, -24.61638, 10.892176, -0.880373, -24.665274, 12.3467655, -0.9874339, -25.922182, 12.314311, 1.342185, -24.665274, 12.3467655, -0.9874339, -24.61638, 10.892176, -0.880373, -22.98392, 10.403238, -1.8582478, -25.922182, 12.314311, 1.342185, -24.665274, 14.278913, 1.713524, -24.61638, 13.755413, 3.1213274, -24.665274, 12.3467655, -0.9874339, -24.665274, 14.278913, 1.713524, -25.922182, 12.314311, 1.342185, -24.61638, 13.755413, 3.1213274, -22.841454, 14.934341, 1.8374442, -22.98392, 14.268375, 3.5440893, -24.61638, 13.755413, 3.1213274, -24.665274, 14.278913, 1.713524, -22.841454, 14.934341, 1.8374442, -24.665274, 12.3467655, -0.9874339, -24.120277, 13.784074, 0.11351812, -24.665274, 14.278913, 1.713524, -24.665274, 12.3467655, -0.9874339, -22.98392, 10.403238, -1.8582478, -22.841454, 12.357724, -1.763833, -24.120277, 13.784074, 0.11351812, -24.665274, 12.3467655, -0.9874339, -22.841454, 12.357724, -1.763833, -22.841454, 12.357724, -1.763833, -22.98392, 10.403238, -1.8582478, -21.510363, 10.892176, -0.880373, -24.665274, 14.278913, 1.713524, -24.120277, 13.784074, 0.11351812, -22.841454, 14.289871, -0.116620064, -24.120277, 13.784074, 0.11351812, -22.841454, 12.357724, -1.763833, -22.841454, 14.289871, -0.116620064, -24.665274, 14.278913, 1.713524, -22.841454, 14.289871, -0.116620064, -22.841454, 14.934341, 1.8374442, -22.841454, 12.357724, -1.763833, -21.510363, 10.892176, -0.880373, -21.160097, 12.3467655, -0.9874339, -22.841454, 14.289871, -0.116620064, -22.841454, 12.357724, -1.763833, -21.160097, 12.3467655, -0.9874339, -20.900877, 10.349287, 0.97084606, -21.160097, 12.3467655, -0.9874339, -21.510363, 10.892176, -0.880373, -22.841454, 14.934341, 1.8374442, -22.841454, 14.289871, -0.116620064, -21.625853, 13.784074, 0.11351812, -22.841454, 14.289871, -0.116620064, -21.160097, 12.3467655, -0.9874339, -21.625853, 13.784074, 0.11351812, -20.900877, 10.349287, 0.97084606, -20.331432, 12.314311, 1.342185, -21.160097, 12.3467655, -0.9874339, -20.331432, 12.314311, 1.342185, -21.625853, 13.784074, 0.11351812, -21.160097, 12.3467655, -0.9874339, -21.649036, 10.824738, 3.0151107, -20.331432, 12.314311, 1.342185, -20.900877, 10.349287, 0.97084606, -21.649036, 10.824738, 3.0151107, -20.900877, 12.281435, 3.6722255, -20.331432, 12.314311, 1.342185, -20.331432, 12.314311, 1.342185, -21.160097, 14.278913, 1.713524, -21.625853, 13.784074, 0.11351812, -22.841454, 14.934341, 1.8374442, -21.625853, 13.784074, 0.11351812, -21.160097, 14.278913, 1.713524, -20.900877, 12.281435, 3.6722255, -21.160097, 14.278913, 1.713524, -20.331432, 12.314311, 1.342185, -22.98392, 14.268375, 3.5440893, -22.841454, 14.934341, 1.8374442, -21.160097, 14.278913, 1.713524, -20.900877, 12.281435, 3.6722255, -21.510363, 13.755413, 3.1213274, -21.160097, 14.278913, 1.713524, -22.98392, 14.268375, 3.5440893, -21.160097, 14.278913, 1.713524, -21.510363, 13.755413, 3.1213274, -24.61638, 10.892176, -0.880373, -23.412582, 9.69428, 0.8473475, -22.98392, 10.403238, -1.8582478, -24.61638, 10.892176, -0.880373, -25.781822, 10.349287, 0.97084606, -23.412582, 9.69428, 0.8473475, -22.98392, 10.403238, -1.8582478, -23.412582, 9.69428, 0.8473475, -20.900877, 10.349287, 0.97084606, -22.98392, 10.403238, -1.8582478, -20.900877, 10.349287, 0.97084606, -21.510363, 10.892176, -0.880373, -23.412582, 9.69428, 0.8473475, -21.649036, 10.824738, 3.0151107, -20.900877, 10.349287, 0.97084606, -23.412582, 9.69428, 0.8473475, -23.698359, 10.294915, 3.8003616, -21.649036, 10.824738, 3.0151107, -25.781822, 10.349287, 0.97084606, -23.698359, 10.294915, 3.8003616, -23.412582, 9.69428, 0.8473475, -25.781822, 10.349287, 0.97084606, -25.366648, 10.824738, 3.0151107, -23.698359, 10.294915, 3.8003616, -20.253035, 9.625153, -3.2251654, -20.752932, 10.590384, -1.6858549, -20.401823, 9.271516, -2.002821, -20.401823, 9.271516, -2.002821, -20.752932, 10.590384, -1.6858549, -19.734592, 10.597971, -0.2561345, -20.401823, 9.271516, -2.002821, -19.734592, 10.597971, -0.2561345, -19.474949, 9.625154, -0.8681493, -20.253035, 9.625153, -3.2251654, -20.756725, 10.597969, -3.3503504, -20.752932, 10.590384, -1.6858549, -19.044178, 9.307764, -3.9160008, -20.756725, 10.597969, -3.3503504, -20.253035, 9.625153, -3.2251654, -20.752932, 10.590384, -1.6858549, -19.513306, 11.581747, -0.75813866, -19.734592, 10.597971, -0.2561345, -19.044178, 9.307764, -3.9160008, -19.309301, 10.619466, -3.9273815, -20.756725, 10.597969, -3.3503504, -17.62668, 9.670253, -3.5648928, -19.309301, 10.619466, -3.9273815, -19.044178, 9.307764, -3.9160008, -20.756725, 10.597969, -3.3503504, -20.089493, 11.924424, -1.6036634, -20.752932, 10.590384, -1.6858549, -20.752932, 10.590384, -1.6858549, -20.089493, 11.924424, -1.6036634, -19.513306, 11.581747, -0.75813866, -19.309301, 10.619466, -3.9273815, -20.163677, 11.581746, -2.7269554, -20.756725, 10.597969, -3.3503504, -20.756725, 10.597969, -3.3503504, -20.163677, 11.581746, -2.7269554, -20.089493, 11.924424, -1.6036634, -17.62668, 9.670253, -3.5648928, -17.569357, 10.641384, -3.6184235, -19.309301, 10.619466, -3.9273815, -17.569357, 10.641384, -3.6184235, -17.62668, 9.670253, -3.5648928, -16.665245, 9.344013, -2.7349634, -19.309301, 10.619466, -3.9273815, -19.281483, 11.931589, -3.052774, -20.163677, 11.581746, -2.7269554, -17.569357, 10.641384, -3.6184235, -19.281483, 11.931589, -3.052774, -19.309301, 10.619466, -3.9273815, -20.163677, 11.581746, -2.7269554, -18.978003, 12.368683, -1.870472, -20.089493, 11.924424, -1.6036634, -20.163677, 11.581746, -2.7269554, -19.281483, 11.931589, -3.052774, -18.978003, 12.368683, -1.870472, -17.569357, 10.641384, -3.6184235, -18.15271, 11.601134, -3.0422359, -19.281483, 11.931589, -3.052774, -17.569357, 10.641384, -3.6184235, -16.665245, 9.344013, -2.7349634, -16.69475, 10.64855, -2.6245313, -18.15271, 11.601134, -3.0422359, -17.569357, 10.641384, -3.6184235, -16.69475, 10.64855, -2.6245313, -16.69475, 10.64855, -2.6245313, -16.665245, 9.344013, -2.7349634, -16.976309, 9.670254, -1.596076, -19.281483, 11.931589, -3.052774, -18.15271, 11.601134, -3.0422359, -17.739222, 11.938755, -2.279746, -18.15271, 11.601134, -3.0422359, -16.69475, 10.64855, -2.6245313, -17.739222, 11.938755, -2.279746, -19.281483, 11.931589, -3.052774, -17.739222, 11.938755, -2.279746, -18.978003, 12.368683, -1.870472, -16.69475, 10.64855, -2.6245313, -16.976309, 9.670254, -1.596076, -16.835108, 10.641384, -1.396286, -17.739222, 11.938755, -2.279746, -16.69475, 10.64855, -2.6245313, -16.835108, 10.641384, -1.396286, -18.022047, 9.307765, -0.821784, -16.835108, 10.641384, -1.396286, -16.976309, 9.670254, -1.596076, -18.978003, 12.368683, -1.870472, -17.739222, 11.938755, -2.279746, -17.630474, 11.601135, -1.4607759, -17.739222, 11.938755, -2.279746, -16.835108, 10.641384, -1.396286, -17.630474, 11.601135, -1.4607759, -18.022047, 9.307765, -0.821784, -18.138802, 10.619467, -0.38300514, -16.835108, 10.641384, -1.396286, -18.138802, 10.619467, -0.38300514, -17.630474, 11.601135, -1.4607759, -16.835108, 10.641384, -1.396286, -19.474949, 9.625154, -0.8681493, -18.138802, 10.619467, -0.38300514, -18.022047, 9.307765, -0.821784, -19.474949, 9.625154, -0.8681493, -19.734592, 10.597971, -0.2561345, -18.138802, 10.619467, -0.38300514, -18.138802, 10.619467, -0.38300514, -18.547232, 11.93159, -0.8306365, -17.630474, 11.601135, -1.4607759, -18.978003, 12.368683, -1.870472, -17.630474, 11.601135, -1.4607759, -18.547232, 11.93159, -0.8306365, -19.734592, 10.597971, -0.2561345, -18.547232, 11.93159, -0.8306365, -18.138802, 10.619467, -0.38300514, -20.089493, 11.924424, -1.6036634, -18.978003, 12.368683, -1.870472, -18.547232, 11.93159, -0.8306365, -19.734592, 10.597971, -0.2561345, -19.513306, 11.581747, -0.75813866, -18.547232, 11.93159, -0.8306365, -20.089493, 11.924424, -1.6036634, -18.547232, 11.93159, -0.8306365, -19.513306, 11.581747, -0.75813866, -17.62668, 9.670253, -3.5648928, -18.469677, 8.87025, -2.4403362, -16.665245, 9.344013, -2.7349634, -17.62668, 9.670253, -3.5648928, -19.044178, 9.307764, -3.9160008, -18.469677, 8.87025, -2.4403362, -16.665245, 9.344013, -2.7349634, -18.469677, 8.87025, -2.4403362, -18.022047, 9.307765, -0.821784, -16.665245, 9.344013, -2.7349634, -18.022047, 9.307765, -0.821784, -16.976309, 9.670254, -1.596076, -18.469677, 8.87025, -2.4403362, -19.474949, 9.625154, -0.8681493, -18.022047, 9.307765, -0.821784, -18.469677, 8.87025, -2.4403362, -20.401823, 9.271516, -2.002821, -19.474949, 9.625154, -0.8681493, -19.044178, 9.307764, -3.9160008, -20.401823, 9.271516, -2.002821, -18.469677, 8.87025, -2.4403362, -19.044178, 9.307764, -3.9160008, -20.253035, 9.625153, -3.2251654, -20.401823, 9.271516, -2.002821, -17.464405, 7.537475, 1.8374468, -19.955458, 8.19459, 1.3919232, -17.577787, 7.2154503, 1.3678982, -17.464405, 7.537475, 1.8374468, -19.75946, 8.452126, 1.8374465, -19.955458, 8.19459, 1.3919232, -19.75946, 8.452126, 1.8374465, -22.311209, 10.6898575, 1.7080457, -19.955458, 8.19459, 1.3919232, -19.75946, 8.452126, 1.8374465, -22.217215, 10.689015, 1.8374457, -22.311209, 10.6898575, 1.7080457, -19.955458, 8.19459, 1.3919232, -22.311209, 10.6898575, 1.7080457, -22.46337, 10.691122, 1.757361, -17.577787, 7.2154503, 1.3678982, -19.955458, 8.19459, 1.3919232, -20.272423, 7.7777286, 1.5622085, -19.955458, 8.19459, 1.3919232, -22.46337, 10.691122, 1.757361, -20.272423, 7.7777286, 1.5622085, -17.577787, 7.2154503, 1.3678982, -20.272423, 7.7777286, 1.5622085, -17.761982, 6.6949005, 1.547035, -20.272423, 7.7777286, 1.5622085, -22.46337, 10.691122, 1.757361, -22.46337, 10.691122, 1.9175303, -17.761982, 6.6949005, 1.547035, -20.272423, 7.7777286, 1.5622085, -20.272423, 7.777729, 2.1126847, -20.272423, 7.7777286, 1.5622085, -22.46337, 10.691122, 1.9175303, -20.272423, 7.777729, 2.1126847, -17.761982, 6.6949005, 1.547035, -20.272423, 7.777729, 2.1126847, -17.761982, 6.694901, 2.127859, -20.272423, 7.777729, 2.1126847, -22.46337, 10.691122, 1.9175303, -22.311209, 10.689858, 1.9668455, -17.761982, 6.694901, 2.127859, -20.272423, 7.777729, 2.1126847, -19.955458, 8.194591, 2.28297, -20.272423, 7.777729, 2.1126847, -22.311209, 10.689858, 1.9668455, -19.955458, 8.194591, 2.28297, -19.955458, 8.194591, 2.28297, -22.311209, 10.689858, 1.9668455, -22.217215, 10.689015, 1.8374457, -17.761982, 6.694901, 2.127859, -19.955458, 8.194591, 2.28297, -17.577787, 7.215451, 2.3069956, -19.955458, 8.194591, 2.28297, -22.217215, 10.689015, 1.8374457, -19.75946, 8.452126, 1.8374465, -17.577787, 7.215451, 2.3069956, -19.955458, 8.194591, 2.28297, -19.75946, 8.452126, 1.8374465, -17.577787, 7.215451, 2.3069956, -19.75946, 8.452126, 1.8374465, -17.464405, 7.537475, 1.8374468, -19.772528, 3.1467314, 1.8374484, -17.801182, 7.205756, 2.2829702, -18.92911, 3.1467319, 3.0694866, -19.772528, 3.1467314, 1.8374484, -18.119411, 7.263501, 1.8374469, -17.801182, 7.205756, 2.2829702, -18.119411, 7.263501, 1.8374469, -17.641012, 11.282906, 2.034285, -17.801182, 7.205756, 2.2829702, -18.119411, 7.263501, 1.8374469, -17.783056, 11.2980795, 1.8374455, -17.641012, 11.282906, 2.034285, -17.801182, 7.205756, 2.2829702, -17.641012, 11.282906, 2.034285, -17.410873, 11.258881, 1.9592583, -18.92911, 3.1467319, 3.0694866, -17.801182, 7.205756, 2.2829702, -17.28611, 7.1121836, 2.1126852, -17.801182, 7.205756, 2.2829702, -17.410873, 11.258881, 1.9592583, -17.28611, 7.1121836, 2.1126852, -18.92911, 3.1467319, 3.0694866, -17.28611, 7.1121836, 2.1126852, -17.563877, 3.1463103, 2.599095, -17.28611, 7.1121836, 2.1126852, -17.410873, 11.258881, 1.9592583, -17.410873, 11.25888, 1.7156326, -17.563877, 3.1463103, 2.599095, -17.28611, 7.1121836, 2.1126852, -17.28611, 7.1121836, 1.5622088, -17.28611, 7.1121836, 2.1126852, -17.410873, 11.25888, 1.7156326, -17.28611, 7.1121836, 1.5622088, -17.563877, 3.1463103, 2.599095, -17.28611, 7.1121836, 1.5622088, -17.563877, 3.1463099, 1.0758016, -17.28611, 7.1121836, 1.5622088, -17.410873, 11.25888, 1.7156326, -17.641012, 11.282906, 1.6406059, -17.563877, 3.1463099, 1.0758016, -17.28611, 7.1121836, 1.5622088, -17.801182, 7.205756, 1.3919237, -17.28611, 7.1121836, 1.5622088, -17.641012, 11.282906, 1.6406059, -17.801182, 7.205756, 1.3919237, -17.801182, 7.205756, 1.3919237, -17.641012, 11.282906, 1.6406059, -17.783056, 11.2980795, 1.8374455, -17.563877, 3.1463099, 1.0758016, -17.801182, 7.205756, 1.3919237, -18.92911, 3.146731, 0.60541, -17.801182, 7.205756, 1.3919237, -17.783056, 11.2980795, 1.8374455, -18.119411, 7.263501, 1.8374469, -18.92911, 3.146731, 0.60541, -17.801182, 7.205756, 1.3919237, -18.119411, 7.263501, 1.8374469, -18.92911, 3.146731, 0.60541, -18.119411, 7.263501, 1.8374469, -19.772528, 3.1467314, 1.8374484, -17.85176, 7.430414, 1.5381833, -18.091171, 7.869193, -0.13432074, -17.577787, 7.2154503, 1.3678982, -17.85176, 7.430414, 1.5381833, -18.33269, 8.041164, 0.08317232, -18.091171, 7.869193, -0.13432074, -18.33269, 8.041164, 0.08317232, -18.784958, 9.534952, -1.5615134, -18.091171, 7.869193, -0.13432074, -18.33269, 8.041164, 0.08317232, -18.84734, 9.534531, -1.4746847, -18.784958, 9.534952, -1.5615134, -18.091171, 7.869193, -0.13432074, -18.784958, 9.534952, -1.5615134, -18.848183, 9.535795, -1.6474986, -17.577787, 7.2154503, 1.3678982, -18.091171, 7.869193, -0.13432074, -18.265673, 7.5910044, -0.29954767, -18.091171, 7.869193, -0.13432074, -18.848183, 9.535795, -1.6474986, -18.265673, 7.5910044, -0.29954767, -17.577787, 7.2154503, 1.3678982, -18.265673, 7.5910044, -0.29954767, -17.73037, 6.867715, 1.2886567, -18.265673, 7.5910044, -0.29954767, -18.848183, 9.535795, -1.6474986, -18.94934, 9.535795, -1.6142006, -17.73037, 6.867715, 1.2886567, -18.265673, 7.5910044, -0.29954767, -18.614672, 7.591005, -0.18447876, -18.265673, 7.5910044, -0.29954767, -18.94934, 9.535795, -1.6142006, -18.614672, 7.591005, -0.18447876, -17.73037, 6.867715, 1.2886567, -18.614672, 7.591005, -0.18447876, -18.098337, 6.867715, 1.4100481, -18.614672, 7.591005, -0.18447876, -18.94934, 9.535795, -1.6142006, -18.94892, 9.534952, -1.5075612, -18.098337, 6.867715, 1.4100481, -18.614672, 7.591005, -0.18447876, -18.65598, 7.869193, 0.052403092, -18.614672, 7.591005, -0.18447876, -18.94892, 9.534952, -1.5075612, -18.65598, 7.869193, 0.052403092, -18.65598, 7.869193, 0.052403092, -18.94892, 9.534952, -1.5075612, -18.84734, 9.534531, -1.4746847, -18.098337, 6.867715, 1.4100481, -18.65598, 7.869193, 0.052403092, -18.173365, 7.2154503, 1.5643163, -18.65598, 7.869193, 0.052403092, -18.84734, 9.534531, -1.4746847, -18.33269, 8.041164, 0.08317232, -18.173365, 7.2154503, 1.5643163, -18.65598, 7.869193, 0.052403092, -18.33269, 8.041164, 0.08317232, -18.173365, 7.2154503, 1.5643163, -18.33269, 8.041164, 0.08317232, -17.85176, 7.430414, 1.5381833, -18.021717, 16.363804, -17.998592, -21.997292, 20.020512, -13.591122, -21.163078, 14.983807, -13.799868, -21.163078, 14.983807, -13.799868, -21.997292, 20.020512, -13.591122, -20.16242, 20.148884, -7.004968, -21.163078, 14.983807, -13.799868, -20.16242, 20.148884, -7.004968, -19.366419, 16.295841, -7.970547, -18.021717, 16.363804, -17.998592, -19.619282, 19.941853, -19.07104, -21.997292, 20.020512, -13.591122, -11.484028, 15.332424, -18.699127, -19.619282, 19.941853, -19.07104, -18.021717, 16.363804, -17.998592, -21.997292, 20.020512, -13.591122, -18.141577, 23.844606, -8.429464, -20.16242, 20.148884, -7.004968, -11.484028, 15.332424, -18.699127, -11.858614, 20.29928, -19.150177, -19.619282, 19.941853, -19.07104, -6.256456, 16.73004, -14.795372, -11.858614, 20.29928, -19.150177, -11.484028, 15.332424, -18.699127, -19.619282, 19.941853, -19.07104, -18.61851, 25.10693, -12.27676, -21.997292, 20.020512, -13.591122, -21.997292, 20.020512, -13.591122, -18.61851, 25.10693, -12.27676, -18.141577, 23.844606, -8.429464, -11.858614, 20.29928, -19.150177, -17.480486, 23.753365, -16.033627, -19.619282, 19.941853, -19.07104, -19.619282, 19.941853, -19.07104, -17.480486, 23.753365, -16.033627, -18.61851, 25.10693, -12.27676, -6.256456, 16.73004, -14.795372, -4.954714, 20.567348, -15.343607, -11.858614, 20.29928, -19.150177, -4.954714, 20.567348, -15.343607, -6.256456, 16.73004, -14.795372, -5.1436496, 15.231738, -9.215076, -11.858614, 20.29928, -19.150177, -13.089849, 25.17615, -15.716137, -17.480486, 23.753365, -16.033627, -4.954714, 20.567348, -15.343607, -13.089849, 25.17615, -15.716137, -11.858614, 20.29928, -19.150177, -17.480486, 23.753365, -16.033627, -14.129517, 26.802193, -11.209101, -18.61851, 25.10693, -12.27676, -17.480486, 23.753365, -16.033627, -13.089849, 25.17615, -15.716137, -14.129517, 26.802193, -11.209101, -4.954714, 20.567348, -15.343607, -8.721195, 24.030872, -13.957819, -13.089849, 25.17615, -15.716137, -4.954714, 20.567348, -15.343607, -5.1436496, 15.231738, -9.215076, -5.146767, 20.21873, -9.1676445, -8.721195, 24.030872, -13.957819, -4.954714, 20.567348, -15.343607, -5.146767, 20.21873, -9.1676445, -5.146767, 20.21873, -9.1676445, -5.1436496, 15.231738, -9.215076, -9.403631, 16.237947, -5.131659, -13.089849, 25.17615, -15.716137, -8.721195, 24.030872, -13.957819, -9.362032, 25.156012, -10.226952, -8.721195, 24.030872, -13.957819, -5.146767, 20.21873, -9.1676445, -9.362032, 25.156012, -10.226952, -13.089849, 25.17615, -15.716137, -9.362032, 25.156012, -10.226952, -14.129517, 26.802193, -11.209101, -5.146767, 20.21873, -9.1676445, -9.403631, 16.237947, -5.131659, -9.5517025, 19.8204, -4.097917, -9.362032, 25.156012, -10.226952, -5.146767, 20.21873, -9.1676445, -9.5517025, 19.8204, -4.097917, -14.8233185, 14.882492, -4.315932, -9.5517025, 19.8204, -4.097917, -9.403631, 16.237947, -5.131659, -14.129517, 26.802193, -11.209101, -9.362032, 25.156012, -10.226952, -11.184143, 23.699244, -6.717871, -9.362032, 25.156012, -10.226952, -9.5517025, 19.8204, -4.097917, -11.184143, 23.699244, -6.717871, -14.8233185, 14.882492, -4.315932, -15.285444, 19.939335, -3.6085896, -9.5517025, 19.8204, -4.097917, -15.285444, 19.939335, -3.6085896, -11.184143, 23.699244, -6.717871, -9.5517025, 19.8204, -4.097917, -19.366419, 16.295841, -7.970547, -15.285444, 19.939335, -3.6085896, -14.8233185, 14.882492, -4.315932, -19.366419, 16.295841, -7.970547, -20.16242, 20.148884, -7.004968, -15.285444, 19.939335, -3.6085896, -15.285444, 19.939335, -3.6085896, -14.890806, 25.086163, -6.7869554, -11.184143, 23.699244, -6.717871, -14.129517, 26.802193, -11.209101, -11.184143, 23.699244, -6.717871, -14.890806, 25.086163, -6.7869554, -20.16242, 20.148884, -7.004968, -14.890806, 25.086163, -6.7869554, -15.285444, 19.939335, -3.6085896, -18.61851, 25.10693, -12.27676, -14.129517, 26.802193, -11.209101, -14.890806, 25.086163, -6.7869554, -20.16242, 20.148884, -7.004968, -18.141577, 23.844606, -8.429464, -14.890806, 25.086163, -6.7869554, -18.61851, 25.10693, -12.27676, -14.890806, 25.086163, -6.7869554, -18.141577, 23.844606, -8.429464, -6.256456, 16.73004, -14.795372, -13.014427, 13.437051, -11.550283, -5.1436496, 15.231738, -9.215076, -6.256456, 16.73004, -14.795372, -11.484028, 15.332424, -18.699127, -13.014427, 13.437051, -11.550283, -5.1436496, 15.231738, -9.215076, -13.014427, 13.437051, -11.550283, -14.8233185, 14.882492, -4.315932, -5.1436496, 15.231738, -9.215076, -14.8233185, 14.882492, -4.315932, -9.403631, 16.237947, -5.131659, -13.014427, 13.437051, -11.550283, -19.366419, 16.295841, -7.970547, -14.8233185, 14.882492, -4.315932, -13.014427, 13.437051, -11.550283, -21.163078, 14.983807, -13.799868, -19.366419, 16.295841, -7.970547, -11.484028, 15.332424, -18.699127, -21.163078, 14.983807, -13.799868, -13.014427, 13.437051, -11.550283, -11.484028, 15.332424, -18.699127, -18.021717, 16.363804, -17.998592, -21.163078, 14.983807, -13.799868, -13.562267, 14.716995, -23.311634, -16.202703, 16.876032, -20.837955, -15.172899, 13.925998, -21.079226, -15.172899, 13.925998, -21.079226, -16.202703, 16.876032, -20.837955, -15.753397, 16.891764, -16.938854, -15.172899, 13.925998, -21.079226, -15.753397, 16.891764, -16.938854, -14.583576, 14.716994, -17.856216, -13.562267, 14.716995, -23.311634, -14.412493, 16.891764, -24.101406, -16.202703, 16.876032, -20.837955, -10.448349, 14.0071745, -23.35928, -14.412493, 16.891764, -24.101406, -13.562267, 14.716995, -23.311634, -16.202703, 16.876032, -20.837955, -14.777542, 19.092333, -17.681902, -15.753397, 16.891764, -16.938854, -10.448349, 14.0071745, -23.35928, -10.954712, 16.940847, -23.667263, -14.412493, 16.891764, -24.101406, -8.051947, 14.8176775, -21.140478, -10.954712, 16.940847, -23.667263, -10.448349, 14.0071745, -23.35928, -14.412493, 16.891764, -24.101406, -14.993107, 19.85816, -19.960417, -16.202703, 16.876032, -20.837955, -16.202703, 16.876032, -20.837955, -14.993107, 19.85816, -19.960417, -14.777542, 19.092333, -17.681902, -10.954712, 16.940847, -23.667263, -13.92425, 19.092335, -22.239834, -14.412493, 16.891764, -24.101406, -14.412493, 16.891764, -24.101406, -13.92425, 19.092335, -22.239834, -14.993107, 19.85816, -19.960417, -8.051947, 14.8176775, -21.140478, -7.8814073, 16.989302, -21.182816, -10.954712, 16.940847, -23.667263, -7.8814073, 16.989302, -21.182816, -8.051947, 14.8176775, -21.140478, -7.065434, 14.08772, -18.476276, -10.954712, 16.940847, -23.667263, -11.844934, 19.873892, -21.924828, -13.92425, 19.092335, -22.239834, -7.8814073, 16.989302, -21.182816, -11.844934, 19.873892, -21.924828, -10.954712, 16.940847, -23.667263, -13.92425, 19.092335, -22.239834, -12.527824, 20.852411, -19.282501, -14.993107, 19.85816, -19.960417, -13.92425, 19.092335, -22.239834, -11.844934, 19.873892, -21.924828, -12.527824, 20.852411, -19.282501, -7.8814073, 16.989302, -21.182816, -9.646725, 19.135124, -20.685514, -11.844934, 19.873892, -21.924828, -7.8814073, 16.989302, -21.182816, -7.065434, 14.08772, -18.476276, -7.2431235, 17.005661, -18.293152, -9.646725, 19.135124, -20.685514, -7.8814073, 16.989302, -21.182816, -7.2431235, 17.005661, -18.293152, -7.2431235, 17.005661, -18.293152, -7.065434, 14.08772, -18.476276, -8.905237, 14.8176775, -16.582546, -11.844934, 19.873892, -21.924828, -9.646725, 19.135124, -20.685514, -9.66033, 19.890251, -18.745678, -9.646725, 19.135124, -20.685514, -7.2431235, 17.005661, -18.293152, -9.66033, 19.890251, -18.745678, -11.844934, 19.873892, -21.924828, -9.66033, 19.890251, -18.745678, -12.527824, 20.852411, -19.282501, -7.2431235, 17.005661, -18.293152, -8.905237, 14.8176775, -16.582546, -8.844357, 16.9893, -16.039139, -9.66033, 19.890251, -18.745678, -7.2431235, 17.005661, -18.293152, -8.844357, 16.9893, -16.039139, -11.789251, 14.007174, -16.196726, -8.844357, 16.9893, -16.039139, -8.905237, 14.8176775, -16.582546, -12.527824, 20.852411, -19.282501, -9.66033, 19.890251, -18.745678, -10.331999, 19.135124, -17.025066, -9.66033, 19.890251, -18.745678, -8.844357, 16.9893, -16.039139, -10.331999, 19.135124, -17.025066, -11.789251, 14.007174, -16.196726, -12.490612, 16.940847, -15.46311, -8.844357, 16.9893, -16.039139, -12.490612, 16.940847, -15.46311, -10.331999, 19.135124, -17.025066, -8.844357, 16.9893, -16.039139, -14.583576, 14.716994, -17.856216, -12.490612, 16.940847, -15.46311, -11.789251, 14.007174, -16.196726, -14.583576, 14.716994, -17.856216, -15.753397, 16.891764, -16.938854, -12.490612, 16.940847, -15.46311, -12.490612, 16.940847, -15.46311, -12.807882, 19.87389, -16.78115, -10.331999, 19.135124, -17.025066, -12.527824, 20.852411, -19.282501, -10.331999, 19.135124, -17.025066, -12.807882, 19.87389, -16.78115, -15.753397, 16.891764, -16.938854, -12.807882, 19.87389, -16.78115, -12.490612, 16.940847, -15.46311, -14.993107, 19.85816, -19.960417, -12.527824, 20.852411, -19.282501, -12.807882, 19.87389, -16.78115, -15.753397, 16.891764, -16.938854, -14.777542, 19.092333, -17.681902, -12.807882, 19.87389, -16.78115, -14.993107, 19.85816, -19.960417, -12.807882, 19.87389, -16.78115, -14.777542, 19.092333, -17.681902, -8.051947, 14.8176775, -21.140478, -10.918001, 13.029283, -19.848606, -7.065434, 14.08772, -18.476276, -8.051947, 14.8176775, -21.140478, -10.448349, 14.0071745, -23.35928, -10.918001, 13.029283, -19.848606, -7.065434, 14.08772, -18.476276, -10.918001, 13.029283, -19.848606, -11.789251, 14.007174, -16.196726, -7.065434, 14.08772, -18.476276, -11.789251, 14.007174, -16.196726, -8.905237, 14.8176775, -16.582546, -10.918001, 13.029283, -19.848606, -14.583576, 14.716994, -17.856216, -11.789251, 14.007174, -16.196726, -10.918001, 13.029283, -19.848606, -15.172899, 13.925998, -21.079226, -14.583576, 14.716994, -17.856216, -10.448349, 14.0071745, -23.35928, -15.172899, 13.925998, -21.079226, -10.918001, 13.029283, -19.848606, -10.448349, 14.0071745, -23.35928, -13.562267, 14.716995, -23.311634, -15.172899, 13.925998, -21.079226, -5.8097816, 12.926081, -14.093311, -7.931314, 14.367117, -15.249769, -7.562638, 12.39812, -14.647457, -7.562638, 12.39812, -14.647457, -7.931314, 14.367117, -15.249769, -10.30912, 14.378445, -14.14818, -7.562638, 12.39812, -14.647457, -10.30912, 14.378445, -14.14818, -9.4823475, 12.926081, -13.599033, -5.8097816, 12.926081, -14.093311, -5.4877048, 14.378444, -14.798061, -7.931314, 14.367117, -15.249769, -5.128114, 12.452237, -12.129587, -5.4877048, 14.378444, -14.798061, -5.8097816, 12.926081, -14.093311, -7.931314, 14.367117, -15.249769, -9.633245, 15.847169, -13.685543, -10.30912, 14.378445, -14.14818, -5.128114, 12.452237, -12.129587, -5.038579, 14.410537, -12.515514, -5.4877048, 14.378444, -14.798061, -6.032766, 12.993412, -10.145935, -5.038579, 14.410537, -12.515514, -5.128114, 12.452237, -12.129587, -5.4877048, 14.378444, -14.798061, -8.234188, 16.358768, -14.298784, -7.931314, 14.367117, -15.249769, -7.931314, 14.367117, -15.249769, -8.234188, 16.358768, -14.298784, -9.633245, 15.847169, -13.685543, -5.038579, 14.410537, -12.515514, -6.565431, 15.847169, -14.099052, -5.4877048, 14.378444, -14.798061, -5.4877048, 14.378444, -14.798061, -6.565431, 15.847169, -14.099052, -8.234188, 16.358768, -14.298784, -6.032766, 12.993412, -10.145935, -5.9699607, 14.443258, -10.047108, -5.038579, 14.410537, -12.515514, -5.9699607, 14.443258, -10.047108, -6.032766, 12.993412, -10.145935, -7.5147758, 12.506355, -8.963072, -5.038579, 14.410537, -12.515514, -6.3296666, 16.369465, -12.714966, -6.565431, 15.847169, -14.099052, -5.9699607, 14.443258, -10.047108, -6.3296666, 16.369465, -12.714966, -5.038579, 14.410537, -12.515514, -6.565431, 15.847169, -14.099052, -8.14801, 17.022022, -12.594429, -8.234188, 16.358768, -14.298784, -6.565431, 15.847169, -14.099052, -6.3296666, 16.369465, -12.714966, -8.14801, 17.022022, -12.594429, -5.9699607, 14.443258, -10.047108, -6.655229, 15.876115, -11.061441, -6.3296666, 16.369465, -12.714966, -5.9699607, 14.443258, -10.047108, -7.5147758, 12.506355, -8.963072, -7.6687236, 14.453957, -9.036707, -6.655229, 15.876115, -11.061441, -5.9699607, 14.443258, -10.047108, -7.6687236, 14.453957, -9.036707, -7.6687236, 14.453957, -9.036707, -7.5147758, 12.506355, -8.963072, -9.10058, 12.993413, -9.732424, -6.3296666, 16.369465, -12.714966, -6.655229, 15.876115, -11.061441, -7.8877406, 16.380163, -10.664139, -6.655229, 15.876115, -11.061441, -7.6687236, 14.453957, -9.036707, -7.8877406, 16.380163, -10.664139, -6.3296666, 16.369465, -12.714966, -7.8877406, 16.380163, -10.664139, -8.14801, 17.022022, -12.594429, -7.6687236, 14.453957, -9.036707, -9.10058, 12.993413, -9.732424, -9.432554, 14.443259, -9.580103, -7.8877406, 16.380163, -10.664139, -7.6687236, 14.453957, -9.036707, -9.432554, 14.443259, -9.580103, -9.94953, 12.452238, -11.479706, -9.432554, 14.443259, -9.580103, -9.10058, 12.993413, -9.732424, -8.14801, 17.022022, -12.594429, -7.8877406, 16.380163, -10.664139, -9.119415, 15.876115, -10.7295475, -7.8877406, 16.380163, -10.664139, -9.432554, 14.443259, -9.580103, -9.119415, 15.876115, -10.7295475, -9.94953, 12.452238, -11.479706, -10.561342, 14.410537, -11.77158, -9.432554, 14.443259, -9.580103, -10.561342, 14.410537, -11.77158, -9.119415, 15.876115, -10.7295475, -9.432554, 14.443259, -9.580103, -9.4823475, 12.926081, -13.599033, -10.561342, 14.410537, -11.77158, -9.94953, 12.452238, -11.479706, -9.4823475, 12.926081, -13.599033, -10.30912, 14.378445, -14.14818, -10.561342, 14.410537, -11.77158, -10.561342, 14.410537, -11.77158, -9.792261, 16.369465, -12.247959, -9.119415, 15.876115, -10.7295475, -8.14801, 17.022022, -12.594429, -9.119415, 15.876115, -10.7295475, -9.792261, 16.369465, -12.247959, -10.30912, 14.378445, -14.14818, -9.792261, 16.369465, -12.247959, -10.561342, 14.410537, -11.77158, -8.234188, 16.358768, -14.298784, -8.14801, 17.022022, -12.594429, -9.792261, 16.369465, -12.247959, -10.30912, 14.378445, -14.14818, -9.633245, 15.847169, -13.685543, -9.792261, 16.369465, -12.247959, -8.234188, 16.358768, -14.298784, -9.792261, 16.369465, -12.247959, -9.633245, 15.847169, -13.685543, -6.032766, 12.993412, -10.145935, -7.45141, 11.799051, -11.691931, -7.5147758, 12.506355, -8.963072, -6.032766, 12.993412, -10.145935, -5.128114, 12.452237, -12.129587, -7.45141, 11.799051, -11.691931, -7.5147758, 12.506355, -8.963072, -7.45141, 11.799051, -11.691931, -9.94953, 12.452238, -11.479706, -7.5147758, 12.506355, -8.963072, -9.94953, 12.452238, -11.479706, -9.10058, 12.993413, -9.732424, -7.45141, 11.799051, -11.691931, -9.4823475, 12.926081, -13.599033, -9.94953, 12.452238, -11.479706, -7.45141, 11.799051, -11.691931, -7.562638, 12.39812, -14.647457, -9.4823475, 12.926081, -13.599033, -5.128114, 12.452237, -12.129587, -7.562638, 12.39812, -14.647457, -7.45141, 11.799051, -11.691931, -5.128114, 12.452237, -12.129587, -5.8097816, 12.926081, -14.093311, -7.562638, 12.39812, -14.647457, -14.00502, 9.80929, -11.391943, -12.666889, 10.790327, -14.925047, -13.28483, 9.328525, -11.429331, -14.00502, 9.80929, -11.391943, -13.374517, 11.174813, -14.759827, -12.666889, 10.790327, -14.925047, -13.374517, 11.174813, -14.759827, -12.483606, 14.515627, -18.468845, -12.666889, 10.790327, -14.925047, -13.374517, 11.174813, -14.759827, -12.699318, 14.514368, -18.366463, -12.483606, 14.515627, -18.468845, -12.666889, 10.790327, -14.925047, -12.483606, 14.515627, -18.468845, -12.5141735, 14.517514, -18.70568, -13.28483, 9.328525, -11.429331, -12.666889, 10.790327, -14.925047, -12.829697, 10.167975, -15.43696, -12.666889, 10.790327, -14.925047, -12.5141735, 14.517514, -18.70568, -12.829697, 10.167975, -15.43696, -13.28483, 9.328525, -11.429331, -12.829697, 10.167975, -15.43696, -13.497103, 8.551372, -11.74884, -12.829697, 10.167975, -15.43696, -12.5141735, 14.517514, -18.70568, -12.749214, 14.517514, -18.749683, -13.497103, 8.551372, -11.74884, -12.829697, 10.167975, -15.43696, -13.637495, 10.167976, -15.588188, -12.829697, 10.167975, -15.43696, -12.749214, 14.517514, -18.749683, -13.637495, 10.167976, -15.588188, -13.497103, 8.551372, -11.74884, -13.637495, 10.167976, -15.588188, -14.349434, 8.551372, -11.908405, -13.637495, 10.167976, -15.588188, -12.749214, 14.517514, -18.749683, -12.863384, 14.515627, -18.539944, -14.349434, 8.551372, -11.908405, -13.637495, 10.167976, -15.588188, -13.974457, 10.790327, -15.169838, -13.637495, 10.167976, -15.588188, -12.863384, 14.515627, -18.539944, -13.974457, 10.790327, -15.169838, -13.974457, 10.790327, -15.169838, -12.863384, 14.515627, -18.539944, -12.699318, 14.514368, -18.366463, -14.349434, 8.551372, -11.908405, -13.974457, 10.790327, -15.169838, -14.662912, 9.328525, -11.687323, -13.974457, 10.790327, -15.169838, -12.699318, 14.514368, -18.366463, -13.374517, 11.174813, -14.759827, -14.662912, 9.328525, -11.687323, -13.974457, 10.790327, -15.169838, -13.374517, 11.174813, -14.759827, -14.662912, 9.328525, -11.687323, -13.374517, 11.174813, -14.759827, -14.00502, 9.80929, -11.391943, -13.370928, 3.2541475, -14.779001, -14.566284, 9.314051, -12.008541, -15.410591, 3.2541475, -13.879795, -13.370928, 3.2541475, -14.779001, -13.825075, 9.400261, -12.353134, -14.566284, 9.314051, -12.008541, -13.825075, 9.400261, -12.353134, -14.245354, 15.401014, -11.705181, -14.566284, 9.314051, -12.008541, -13.825075, 9.400261, -12.353134, -13.917479, 15.423668, -11.859549, -14.245354, 15.401014, -11.705181, -14.566284, 9.314051, -12.008541, -14.245354, 15.401014, -11.705181, -14.198481, 15.365146, -11.346853, -15.410591, 3.2541475, -13.879795, -14.566284, 9.314051, -12.008541, -14.457899, 9.174353, -11.205919, -14.566284, 9.314051, -12.008541, -14.198481, 15.365146, -11.346853, -14.457899, 9.174353, -11.205919, -15.410591, 3.2541475, -13.879795, -14.457899, 9.174353, -11.205919, -15.095373, 3.253518, -11.747156, -14.457899, 9.174353, -11.205919, -14.198481, 15.365146, -11.346853, -13.840971, 15.365146, -11.279924, -15.095373, 3.253518, -11.747156, -14.457899, 9.174353, -11.205919, -13.650103, 9.174353, -11.054691, -14.457899, 9.174353, -11.205919, -13.840971, 15.365146, -11.279924, -13.650103, 9.174353, -11.054691, -15.095373, 3.253518, -11.747156, -13.650103, 9.174353, -11.054691, -12.860012, 3.253518, -11.328674, -13.650103, 9.174353, -11.054691, -13.840971, 15.365146, -11.279924, -13.667648, 15.401014, -11.597029, -12.860012, 3.253518, -11.328674, -13.650103, 9.174353, -11.054691, -13.258715, 9.314051, -11.763752, -13.650103, 9.174353, -11.054691, -13.667648, 15.401014, -11.597029, -13.258715, 9.314051, -11.763752, -13.258715, 9.314051, -11.763752, -13.667648, 15.401014, -11.597029, -13.917479, 15.423668, -11.859549, -12.860012, 3.253518, -11.328674, -13.258715, 9.314051, -11.763752, -11.794676, 3.2541475, -13.20286, -13.258715, 9.314051, -11.763752, -13.917479, 15.423668, -11.859549, -13.825075, 9.400261, -12.353134, -11.794676, 3.2541475, -13.20286, -13.258715, 9.314051, -11.763752, -13.825075, 9.400261, -12.353134, -11.794676, 3.2541475, -13.20286, -13.825075, 9.400261, -12.353134, -13.370928, 3.2541475, -14.779001, -13.45945, 9.649454, -11.878155, -10.93936, 10.304527, -11.770006, -13.28483, 9.328525, -11.429331, -13.45945, 9.649454, -11.878155, -11.192169, 10.561271, -12.184172, -10.93936, 10.304527, -11.770006, -11.192169, 10.561271, -12.184172, -8.654425, 12.791416, -12.396021, -10.93936, 10.304527, -11.770006, -11.192169, 10.561271, -12.184172, -8.764704, 12.790787, -12.511417, -8.654425, 12.791416, -12.396021, -10.93936, 10.304527, -11.770006, -8.654425, 12.791416, -12.396021, -8.510876, 12.792675, -12.465178, -13.28483, 9.328525, -11.429331, -10.93936, 10.304527, -11.770006, -10.648958, 9.889207, -11.980684, -10.93936, 10.304527, -11.770006, -8.510876, 12.792675, -12.465178, -10.648958, 9.889207, -11.980684, -13.28483, 9.328525, -11.429331, -10.648958, 9.889207, -11.980684, -13.126629, 8.809374, -11.63147, -10.648958, 9.889207, -11.980684, -8.510876, 12.792675, -12.465178, -8.53195, 12.792675, -12.622772, -13.126629, 8.809374, -11.63147, -10.648958, 9.889207, -11.980684, -10.721937, 9.889207, -12.524437, -10.648958, 9.889207, -11.980684, -8.53195, 12.792675, -12.622772, -10.721937, 9.889207, -12.524437, -13.126629, 8.809374, -11.63147, -10.721937, 9.889207, -12.524437, -13.203676, 8.809374, -12.204792, -10.721937, 9.889207, -12.524437, -8.53195, 12.792675, -12.622772, -8.688553, 12.791416, -12.651451, -13.203676, 8.809374, -12.204792, -10.721937, 9.889207, -12.524437, -11.058203, 10.304527, -12.650129, -10.721937, 9.889207, -12.524437, -8.688553, 12.791416, -12.651451, -11.058203, 10.304527, -12.650129, -11.058203, 10.304527, -12.650129, -8.688553, 12.791416, -12.651451, -8.764704, 12.790787, -12.511417, -13.203676, 8.809374, -12.204792, -11.058203, 10.304527, -12.650129, -13.409447, 9.328525, -12.357271, -11.058203, 10.304527, -12.650129, -8.764704, 12.790787, -12.511417, -11.192169, 10.561271, -12.184172, -13.409447, 9.328525, -12.357271, -11.058203, 10.304527, -12.650129, -11.192169, 10.561271, -12.184172, -13.409447, 9.328525, -12.357271, -11.192169, 10.561271, -12.184172, -13.45945, 9.649454, -11.878155, 1.2086613, -17.361609, 9.414333, 2.631641, -16.33421, 10.284525, 2.5310369, -17.7495, 10.064947, 2.5310369, -17.7495, 10.064947, 2.631641, -16.33421, 10.284525, 4.3560047, -16.298113, 9.437187, 2.5310369, -17.7495, 10.064947, 4.3560047, -16.298113, 9.437187, 4.0482125, -17.380833, 9.267164, 1.2086613, -17.361609, 9.414333, 0.99485135, -16.35621, 9.910944, 2.631641, -16.33421, 10.284525, 0.67701983, -17.65146, 7.644686, 0.99485135, -16.35621, 9.910944, 1.2086613, -17.361609, 9.414333, 2.631641, -16.33421, 10.284525, 3.8578982, -15.259179, 8.952537, 4.3560047, -16.298113, 9.437187, 0.67701983, -17.65146, 7.644686, 0.57171667, -16.255608, 7.7713485, 0.99485135, -16.35621, 9.910944, 1.4848416, -17.258871, 5.9989257, 0.57171667, -16.255608, 7.7713485, 0.67701983, -17.65146, 7.644686, 0.99485135, -16.35621, 9.910944, 2.820033, -14.904823, 9.283184, 2.631641, -16.33421, 10.284525, 2.631641, -16.33421, 10.284525, 2.820033, -14.904823, 9.283184, 3.8578982, -15.259179, 8.952537, 0.57171667, -16.255608, 7.7713485, 1.7232151, -15.285238, 9.163143, 0.99485135, -16.35621, 9.910944, 0.99485135, -16.35621, 9.910944, 1.7232151, -15.285238, 9.163143, 2.820033, -14.904823, 9.283184, 1.4848416, -17.258871, 5.9989257, 1.2661188, -16.180422, 5.6674232, 0.57171667, -16.255608, 7.7713485, 1.2661188, -16.180422, 5.6674232, 1.4848416, -17.258871, 5.9989257, 2.9689097, -17.679869, 5.4027777, 0.57171667, -16.255608, 7.7713485, 1.5839503, -14.885172, 7.933895, 1.7232151, -15.285238, 9.163143, 1.2661188, -16.180422, 5.6674232, 1.5839503, -14.885172, 7.933895, 0.57171667, -16.255608, 7.7713485, 1.7232151, -15.285238, 9.163143, 2.8828304, -14.428289, 7.988148, 2.820033, -14.904823, 9.283184, 1.7232151, -15.285238, 9.163143, 1.5839503, -14.885172, 7.933895, 2.8828304, -14.428289, 7.988148, 1.2661188, -16.180422, 5.6674232, 1.8436836, -15.206849, 6.6362967, 1.5839503, -14.885172, 7.933895, 1.2661188, -16.180422, 5.6674232, 2.9689097, -17.679869, 5.4027777, 2.9821527, -16.278463, 5.4012823, 1.8436836, -15.206849, 6.6362967, 1.2661188, -16.180422, 5.6674232, 2.9821527, -16.278463, 5.4012823, 2.9821527, -16.278463, 5.4012823, 2.9689097, -17.679869, 5.4027777, 4.3171306, -17.397068, 6.368234, 1.5839503, -14.885172, 7.933895, 1.8436836, -15.206849, 6.6362967, 2.9076076, -14.890726, 6.620277, 1.8436836, -15.206849, 6.6362967, 2.9821527, -16.278463, 5.4012823, 2.9076076, -14.890726, 6.620277, 1.5839503, -14.885172, 7.933895, 2.9076076, -14.890726, 6.620277, 2.8828304, -14.428289, 7.988148, 2.9821527, -16.278463, 5.4012823, 4.3171306, -17.397068, 6.368234, 4.6103983, -16.390173, 6.355845, 2.9076076, -14.890726, 6.620277, 2.9821527, -16.278463, 5.4012823, 4.6103983, -16.390173, 6.355845, 4.8227134, -17.777908, 7.823253, 4.6103983, -16.390173, 6.355845, 4.3171306, -17.397068, 6.368234, 2.8828304, -14.428289, 7.988148, 2.9076076, -14.890726, 6.620277, 3.9711041, -15.30019, 6.942167, 2.9076076, -14.890726, 6.620277, 4.6103983, -16.390173, 6.355845, 3.9711041, -15.30019, 6.942167, 4.8227134, -17.777908, 7.823253, 5.042077, -16.356638, 7.9142447, 4.6103983, -16.390173, 6.355845, 5.042077, -16.356638, 7.9142447, 3.9711041, -15.30019, 6.942167, 4.6103983, -16.390173, 6.355845, 4.0482125, -17.380833, 9.267164, 5.042077, -16.356638, 7.9142447, 4.8227134, -17.777908, 7.823253, 4.0482125, -17.380833, 9.267164, 4.3560047, -16.298113, 9.437187, 5.042077, -16.356638, 7.9142447, 5.042077, -16.356638, 7.9142447, 4.1434765, -14.910377, 7.969779, 3.9711041, -15.30019, 6.942167, 2.8828304, -14.428289, 7.988148, 3.9711041, -15.30019, 6.942167, 4.1434765, -14.910377, 7.969779, 4.3560047, -16.298113, 9.437187, 4.1434765, -14.910377, 7.969779, 5.042077, -16.356638, 7.9142447, 2.820033, -14.904823, 9.283184, 2.8828304, -14.428289, 7.988148, 4.1434765, -14.910377, 7.969779, 4.3560047, -16.298113, 9.437187, 3.8578982, -15.259179, 8.952537, 4.1434765, -14.910377, 7.969779, 2.820033, -14.904823, 9.283184, 4.1434765, -14.910377, 7.969779, 3.8578982, -15.259179, 8.952537, 1.4848416, -17.258871, 5.9989257, 2.7309632, -18.18417, 7.6976585, 2.9689097, -17.679869, 5.4027777, 1.4848416, -17.258871, 5.9989257, 0.67701983, -17.65146, 7.644686, 2.7309632, -18.18417, 7.6976585, 2.9689097, -17.679869, 5.4027777, 2.7309632, -18.18417, 7.6976585, 4.8227134, -17.777908, 7.823253, 2.9689097, -17.679869, 5.4027777, 4.8227134, -17.777908, 7.823253, 4.3171306, -17.397068, 6.368234, 2.7309632, -18.18417, 7.6976585, 4.0482125, -17.380833, 9.267164, 4.8227134, -17.777908, 7.823253, 2.7309632, -18.18417, 7.6976585, 2.5310369, -17.7495, 10.064947, 4.0482125, -17.380833, 9.267164, 0.67701983, -17.65146, 7.644686, 2.5310369, -17.7495, 10.064947, 2.7309632, -18.18417, 7.6976585, 0.67701983, -17.65146, 7.644686, 1.2086613, -17.361609, 9.414333, 2.5310369, -17.7495, 10.064947, -1.1748617, -18.139956, 8.584938, -0.18462849, -17.407104, 9.311379, -0.3294468, -18.408445, 8.982868, -0.3294468, -18.408445, 8.982868, -0.18462849, -17.407104, 9.311379, 1.0884066, -17.401766, 8.917934, -0.3294468, -18.408445, 8.982868, 1.0884066, -17.401766, 8.917934, 0.70905924, -18.139956, 8.584938, -1.1748617, -18.139956, 8.584938, -1.3850405, -17.401766, 8.917934, -0.18462849, -17.407104, 9.311379, -1.3850405, -18.381105, 7.5489955, -1.3850405, -17.401766, 8.917934, -1.1748617, -18.139956, 8.584938, -0.18462849, -17.407104, 9.311379, 0.7793324, -16.655033, 8.638763, 1.0884066, -17.401766, 8.917934, -1.3850405, -18.381105, 7.5489955, -1.4563816, -17.385319, 7.7371736, -1.3850405, -17.401766, 8.917934, -0.79465985, -18.10578, 6.6108794, -1.4563816, -17.385319, 7.7371736, -1.3850405, -18.381105, 7.5489955, -1.3850405, -17.401766, 8.917934, 0.03259921, -16.395086, 8.853001, -0.18462849, -17.407104, 9.311379, -0.18462849, -17.407104, 9.311379, 0.03259921, -16.395086, 8.853001, 0.7793324, -16.655033, 8.638763, -1.4563816, -17.385319, 7.7371736, -0.79465985, -16.655033, 8.638763, -1.3850405, -17.401766, 8.917934, -1.3850405, -17.401766, 8.917934, -0.79465985, -16.655033, 8.638763, 0.03259921, -16.395086, 8.853001, -0.79465985, -18.10578, 6.6108794, -0.8192234, -17.368872, 6.556626, -1.4563816, -17.385319, 7.7371736, -0.8192234, -17.368872, 6.556626, -0.79465985, -18.10578, 6.6108794, 0.03259921, -18.353552, 6.115336, -1.4563816, -17.385319, 7.7371736, -0.8192234, -16.389532, 7.9253516, -0.79465985, -16.655033, 8.638763, -0.8192234, -17.368872, 6.556626, -0.8192234, -16.389532, 7.9253516, -1.4563816, -17.385319, 7.7371736, -0.79465985, -16.655033, 8.638763, 0.10500836, -16.057604, 7.9881487, 0.03259921, -16.395086, 8.853001, -0.79465985, -16.655033, 8.638763, -0.8192234, -16.389532, 7.9253516, 0.10500836, -16.057604, 7.9881487, -0.8192234, -17.368872, 6.556626, -0.54325676, -16.640295, 7.1145396, -0.8192234, -16.389532, 7.9253516, -0.8192234, -17.368872, 6.556626, 0.03259921, -18.353552, 6.115336, 0.10500836, -17.36332, 6.1631813, -0.54325676, -16.640295, 7.1145396, -0.8192234, -17.368872, 6.556626, 0.10500836, -17.36332, 6.1631813, 0.10500836, -17.36332, 6.1631813, 0.03259921, -18.353552, 6.115336, 0.7793324, -18.10578, 6.6108794, -0.8192234, -16.389532, 7.9253516, -0.54325676, -16.640295, 7.1145396, 0.10500836, -16.38398, 6.9979157, -0.54325676, -16.640295, 7.1145396, 0.10500836, -17.36332, 6.1631813, 0.10500836, -16.38398, 6.9979157, -0.8192234, -16.389532, 7.9253516, 0.10500836, -16.38398, 6.9979157, 0.10500836, -16.057604, 7.9881487, 0.10500836, -17.36332, 6.1631813, 0.7793324, -18.10578, 6.6108794, 0.9570446, -17.368872, 6.556626, 0.10500836, -16.38398, 6.9979157, 0.10500836, -17.36332, 6.1631813, 0.9570446, -17.368872, 6.556626, 1.0884066, -18.381105, 7.5489955, 0.9570446, -17.368872, 6.556626, 0.7793324, -18.10578, 6.6108794, 0.10500836, -16.057604, 7.9881487, 0.10500836, -16.38398, 6.9979157, 0.7210206, -16.640295, 7.1145396, 0.10500836, -16.38398, 6.9979157, 0.9570446, -17.368872, 6.556626, 0.7210206, -16.640295, 7.1145396, 1.0884066, -18.381105, 7.5489955, 1.3767617, -17.385319, 7.7371736, 0.9570446, -17.368872, 6.556626, 1.3767617, -17.385319, 7.7371736, 0.7210206, -16.640295, 7.1145396, 0.9570446, -17.368872, 6.556626, 0.70905924, -18.139956, 8.584938, 1.3767617, -17.385319, 7.7371736, 1.0884066, -18.381105, 7.5489955, 0.70905924, -18.139956, 8.584938, 1.0884066, -17.401766, 8.917934, 1.3767617, -17.385319, 7.7371736, 1.3767617, -17.385319, 7.7371736, 0.9570446, -16.389532, 7.9253516, 0.7210206, -16.640295, 7.1145396, 0.10500836, -16.057604, 7.9881487, 0.7210206, -16.640295, 7.1145396, 0.9570446, -16.389532, 7.9253516, 1.0884066, -17.401766, 8.917934, 0.9570446, -16.389532, 7.9253516, 1.3767617, -17.385319, 7.7371736, 0.03259921, -16.395086, 8.853001, 0.10500836, -16.057604, 7.9881487, 0.9570446, -16.389532, 7.9253516, 1.0884066, -17.401766, 8.917934, 0.7793324, -16.655033, 8.638763, 0.9570446, -16.389532, 7.9253516, 0.03259921, -16.395086, 8.853001, 0.9570446, -16.389532, 7.9253516, 0.7793324, -16.655033, 8.638763, -0.79465985, -18.10578, 6.6108794, -0.18462849, -18.712822, 7.4864116, 0.03259921, -18.353552, 6.115336, -0.79465985, -18.10578, 6.6108794, -1.3850405, -18.381105, 7.5489955, -0.18462849, -18.712822, 7.4864116, 0.03259921, -18.353552, 6.115336, -0.18462849, -18.712822, 7.4864116, 1.0884066, -18.381105, 7.5489955, 0.03259921, -18.353552, 6.115336, 1.0884066, -18.381105, 7.5489955, 0.7793324, -18.10578, 6.6108794, -0.18462849, -18.712822, 7.4864116, 0.70905924, -18.139956, 8.584938, 1.0884066, -18.381105, 7.5489955, -0.18462849, -18.712822, 7.4864116, -0.3294468, -18.408445, 8.982868, 0.70905924, -18.139956, 8.584938, -1.3850405, -18.381105, 7.5489955, -0.3294468, -18.408445, 8.982868, -0.18462849, -18.712822, 7.4864116, -1.3850405, -18.381105, 7.5489955, -1.1748617, -18.139956, 8.584938, -0.3294468, -18.408445, 8.982868, 2.6649618, -19.729753, 7.98815, 1.5668626, -19.439903, 7.791855, 2.6147668, -19.871582, 7.781175, 2.6649618, -19.729753, 7.98815, 1.6531556, -19.32627, 7.98815, 1.5668626, -19.439903, 7.791855, 1.6531556, -19.32627, 7.98815, 0.52835655, -18.340096, 7.9311194, 1.5668626, -19.439903, 7.791855, 1.6531556, -19.32627, 7.98815, 0.5697943, -18.34031, 7.9881496, 0.52835655, -18.340096, 7.9311194, 1.5668626, -19.439903, 7.791855, 0.52835655, -18.340096, 7.9311194, 0.46128738, -18.339455, 7.952906, 2.6147668, -19.871582, 7.781175, 1.5668626, -19.439903, 7.791855, 1.4271705, -19.62381, 7.8668275, 1.5668626, -19.439903, 7.791855, 0.46128738, -18.339455, 7.952906, 1.4271705, -19.62381, 7.8668275, 2.6147668, -19.871582, 7.781175, 1.4271705, -19.62381, 7.8668275, 2.5338137, -20.101198, 7.860206, 1.4271705, -19.62381, 7.8668275, 0.46128738, -18.339455, 7.952906, 0.46128738, -18.339455, 8.023394, 2.5338137, -20.101198, 7.860206, 1.4271705, -19.62381, 7.8668275, 1.4271705, -19.62381, 8.109472, 1.4271705, -19.62381, 7.8668275, 0.46128738, -18.339455, 8.023394, 1.4271705, -19.62381, 8.109472, 2.5338137, -20.101198, 7.860206, 1.4271705, -19.62381, 8.109472, 2.5338137, -20.101198, 8.116095, 1.4271705, -19.62381, 8.109472, 0.46128738, -18.339455, 8.023394, 0.52835655, -18.340096, 8.045179, 2.5338137, -20.101198, 8.116095, 1.4271705, -19.62381, 8.109472, 1.5668626, -19.439903, 8.184445, 1.4271705, -19.62381, 8.109472, 0.52835655, -18.340096, 8.045179, 1.5668626, -19.439903, 8.184445, 1.5668626, -19.439903, 8.184445, 0.52835655, -18.340096, 8.045179, 0.5697943, -18.34031, 7.9881496, 2.5338137, -20.101198, 8.116095, 1.5668626, -19.439903, 8.184445, 2.6147668, -19.871582, 8.195126, 1.5668626, -19.439903, 8.184445, 0.5697943, -18.34031, 7.9881496, 1.6531556, -19.32627, 7.98815, 2.6147668, -19.871582, 8.195126, 1.5668626, -19.439903, 8.184445, 1.6531556, -19.32627, 7.98815, 2.6147668, -19.871582, 8.195126, 1.6531556, -19.32627, 7.98815, 2.6649618, -19.729753, 7.98815, 1.5335416, -22.031042, 7.988151, 2.5325322, -19.973894, 8.213709, 1.9611616, -22.031042, 8.6124935, 1.5335416, -22.031042, 7.988151, 2.3712668, -19.944632, 7.98815, 2.5325322, -19.973894, 8.213709, 2.3712668, -19.944632, 7.98815, 2.613699, -17.907776, 8.087899, 2.5325322, -19.973894, 8.213709, 2.3712668, -19.944632, 7.98815, 2.5417168, -17.900085, 7.9881496, 2.613699, -17.907776, 8.087899, 2.5325322, -19.973894, 8.213709, 2.613699, -17.907776, 8.087899, 2.730536, -17.920164, 8.049879, 1.9611616, -22.031042, 8.6124935, 2.5325322, -19.973894, 8.213709, 2.7935472, -20.021313, 8.127628, 2.5325322, -19.973894, 8.213709, 2.730536, -17.920164, 8.049879, 2.7935472, -20.021313, 8.127628, 1.9611616, -22.031042, 8.6124935, 2.7935472, -20.021313, 8.127628, 2.652787, -22.031042, 8.373906, 2.7935472, -20.021313, 8.127628, 2.730536, -17.920164, 8.049879, 2.730536, -17.920164, 7.92642, 2.652787, -22.031042, 8.373906, 2.7935472, -20.021313, 8.127628, 2.7935472, -20.021313, 7.848672, 2.7935472, -20.021313, 8.127628, 2.730536, -17.920164, 7.92642, 2.7935472, -20.021313, 7.848672, 2.652787, -22.031042, 8.373906, 2.7935472, -20.021313, 7.848672, 2.652787, -22.031042, 7.6021824, 2.7935472, -20.021313, 7.848672, 2.730536, -17.920164, 7.92642, 2.613699, -17.907776, 7.8884, 2.652787, -22.031042, 7.6021824, 2.7935472, -20.021313, 7.848672, 2.5325322, -19.973894, 7.7623787, 2.7935472, -20.021313, 7.848672, 2.613699, -17.907776, 7.8884, 2.5325322, -19.973894, 7.7623787, 2.5325322, -19.973894, 7.7623787, 2.613699, -17.907776, 7.8884, 2.5417168, -17.900085, 7.9881496, 2.652787, -22.031042, 7.6021824, 2.5325322, -19.973894, 7.7623787, 1.9611616, -22.031042, 7.3638086, 2.5325322, -19.973894, 7.7623787, 2.5417168, -17.900085, 7.9881496, 2.3712668, -19.944632, 7.98815, 1.9611616, -22.031042, 7.3638086, 2.5325322, -19.973894, 7.7623787, 2.3712668, -19.944632, 7.98815, 1.9611616, -22.031042, 7.3638086, 2.3712668, -19.944632, 7.98815, 1.5335416, -22.031042, 7.988151, 7.7761884, 7.8527765, 15.352116, 9.199167, 8.88039, 16.222307, 9.098564, 7.4648857, 16.002731, 9.098564, 7.4648857, 16.002731, 9.199167, 8.88039, 16.222307, 10.9235325, 8.916273, 15.3749695, 9.098564, 7.4648857, 16.002731, 10.9235325, 8.916273, 15.3749695, 10.61574, 7.8335533, 15.204948, 7.7761884, 7.8527765, 15.352116, 7.562378, 8.858175, 15.848726, 9.199167, 8.88039, 16.222307, 7.2445464, 7.562926, 13.58247, 7.562378, 8.858175, 15.848726, 7.7761884, 7.8527765, 15.352116, 9.199167, 8.88039, 16.222307, 10.425425, 9.955207, 14.89032, 10.9235325, 8.916273, 15.3749695, 7.2445464, 7.562926, 13.58247, 7.1392436, 8.958778, 13.709131, 7.562378, 8.858175, 15.848726, 8.052368, 7.9555154, 11.936708, 7.1392436, 8.958778, 13.709131, 7.2445464, 7.562926, 13.58247, 7.562378, 8.858175, 15.848726, 9.38756, 10.309776, 15.220966, 9.199167, 8.88039, 16.222307, 9.199167, 8.88039, 16.222307, 9.38756, 10.309776, 15.220966, 10.425425, 9.955207, 14.89032, 7.1392436, 8.958778, 13.709131, 8.290742, 9.929361, 15.100925, 7.562378, 8.858175, 15.848726, 7.562378, 8.858175, 15.848726, 8.290742, 9.929361, 15.100925, 9.38756, 10.309776, 15.220966, 8.052368, 7.9555154, 11.936708, 7.8336453, 9.033964, 11.605206, 7.1392436, 8.958778, 13.709131, 7.8336453, 9.033964, 11.605206, 8.052368, 7.9555154, 11.936708, 9.536436, 7.534303, 11.340561, 7.1392436, 8.958778, 13.709131, 8.151478, 10.329214, 13.871677, 8.290742, 9.929361, 15.100925, 7.8336453, 9.033964, 11.605206, 8.151478, 10.329214, 13.871677, 7.1392436, 8.958778, 13.709131, 8.290742, 9.929361, 15.100925, 9.450357, 10.786097, 13.925932, 9.38756, 10.309776, 15.220966, 8.290742, 9.929361, 15.100925, 8.151478, 10.329214, 13.871677, 9.450357, 10.786097, 13.925932, 7.8336453, 9.033964, 11.605206, 8.411211, 10.007323, 12.5740795, 8.151478, 10.329214, 13.871677, 7.8336453, 9.033964, 11.605206, 9.536436, 7.534303, 11.340561, 9.549679, 8.935923, 11.339066, 8.411211, 10.007323, 12.5740795, 7.8336453, 9.033964, 11.605206, 9.549679, 8.935923, 11.339066, 9.549679, 8.935923, 11.339066, 9.536436, 7.534303, 11.340561, 10.884657, 7.817319, 12.306017, 8.151478, 10.329214, 13.871677, 8.411211, 10.007323, 12.5740795, 9.475134, 10.32366, 12.55806, 8.411211, 10.007323, 12.5740795, 9.549679, 8.935923, 11.339066, 9.475134, 10.32366, 12.55806, 8.151478, 10.329214, 13.871677, 9.475134, 10.32366, 12.55806, 9.450357, 10.786097, 13.925932, 9.549679, 8.935923, 11.339066, 10.884657, 7.817319, 12.306017, 11.177925, 8.823998, 12.293627, 9.475134, 10.32366, 12.55806, 9.549679, 8.935923, 11.339066, 11.177925, 8.823998, 12.293627, 11.39024, 7.4364767, 13.761036, 11.177925, 8.823998, 12.293627, 10.884657, 7.817319, 12.306017, 9.450357, 10.786097, 13.925932, 9.475134, 10.32366, 12.55806, 10.538631, 9.914196, 12.87995, 9.475134, 10.32366, 12.55806, 11.177925, 8.823998, 12.293627, 10.538631, 9.914196, 12.87995, 11.39024, 7.4364767, 13.761036, 11.609604, 8.857534, 13.852028, 11.177925, 8.823998, 12.293627, 11.609604, 8.857534, 13.852028, 10.538631, 9.914196, 12.87995, 11.177925, 8.823998, 12.293627, 10.61574, 7.8335533, 15.204948, 11.609604, 8.857534, 13.852028, 11.39024, 7.4364767, 13.761036, 10.61574, 7.8335533, 15.204948, 10.9235325, 8.916273, 15.3749695, 11.609604, 8.857534, 13.852028, 11.609604, 8.857534, 13.852028, 10.711004, 10.304009, 13.907562, 10.538631, 9.914196, 12.87995, 9.450357, 10.786097, 13.925932, 10.538631, 9.914196, 12.87995, 10.711004, 10.304009, 13.907562, 10.9235325, 8.916273, 15.3749695, 10.711004, 10.304009, 13.907562, 11.609604, 8.857534, 13.852028, 9.38756, 10.309776, 15.220966, 9.450357, 10.786097, 13.925932, 10.711004, 10.304009, 13.907562, 10.9235325, 8.916273, 15.3749695, 10.425425, 9.955207, 14.89032, 10.711004, 10.304009, 13.907562, 9.38756, 10.309776, 15.220966, 10.711004, 10.304009, 13.907562, 10.425425, 9.955207, 14.89032, 8.052368, 7.9555154, 11.936708, 9.298491, 7.030216, 13.635441, 9.536436, 7.534303, 11.340561, 8.052368, 7.9555154, 11.936708, 7.2445464, 7.562926, 13.58247, 9.298491, 7.030216, 13.635441, 9.536436, 7.534303, 11.340561, 9.298491, 7.030216, 13.635441, 11.39024, 7.4364767, 13.761036, 9.536436, 7.534303, 11.340561, 11.39024, 7.4364767, 13.761036, 10.884657, 7.817319, 12.306017, 9.298491, 7.030216, 13.635441, 10.61574, 7.8335533, 15.204948, 11.39024, 7.4364767, 13.761036, 9.298491, 7.030216, 13.635441, 9.098564, 7.4648857, 16.002731, 10.61574, 7.8335533, 15.204948, 7.2445464, 7.562926, 13.58247, 9.098564, 7.4648857, 16.002731, 9.298491, 7.030216, 13.635441, 7.2445464, 7.562926, 13.58247, 7.7761884, 7.8527765, 15.352116, 9.098564, 7.4648857, 16.002731, 5.392665, 7.074431, 14.52272, 6.3828983, 7.807067, 15.249163, 6.23808, 6.805727, 14.9206505, 6.23808, 6.805727, 14.9206505, 6.3828983, 7.807067, 15.249163, 7.6559334, 7.8126206, 14.855719, 6.23808, 6.805727, 14.9206505, 7.6559334, 7.8126206, 14.855719, 7.276586, 7.074431, 14.52272, 5.392665, 7.074431, 14.52272, 5.1824865, 7.8126206, 14.855719, 6.3828983, 7.807067, 15.249163, 5.1824865, 6.83328, 13.486778, 5.1824865, 7.8126206, 14.855719, 5.392665, 7.074431, 14.52272, 6.3828983, 7.807067, 15.249163, 7.3468595, 8.559354, 14.576548, 7.6559334, 7.8126206, 14.855719, 5.1824865, 6.83328, 13.486778, 5.111145, 7.829067, 13.674955, 5.1824865, 7.8126206, 14.855719, 5.772867, 7.108606, 12.548662, 5.111145, 7.829067, 13.674955, 5.1824865, 6.83328, 13.486778, 5.1824865, 7.8126206, 14.855719, 6.600126, 8.819301, 14.790783, 6.3828983, 7.807067, 15.249163, 6.3828983, 7.807067, 15.249163, 6.600126, 8.819301, 14.790783, 7.3468595, 8.559354, 14.576548, 5.111145, 7.829067, 13.674955, 5.772867, 8.559354, 14.576548, 5.1824865, 7.8126206, 14.855719, 5.1824865, 7.8126206, 14.855719, 5.772867, 8.559354, 14.576548, 6.600126, 8.819301, 14.790783, 5.772867, 7.108606, 12.548662, 5.7483034, 7.8455133, 12.49441, 5.111145, 7.829067, 13.674955, 5.7483034, 7.8455133, 12.49441, 5.772867, 7.108606, 12.548662, 6.600126, 6.8608336, 12.05312, 5.111145, 7.829067, 13.674955, 5.7483034, 8.824854, 13.863134, 5.772867, 8.559354, 14.576548, 5.7483034, 7.8455133, 12.49441, 5.7483034, 8.824854, 13.863134, 5.111145, 7.829067, 13.674955, 5.772867, 8.559354, 14.576548, 6.6725354, 9.156782, 13.925932, 6.600126, 8.819301, 14.790783, 5.772867, 8.559354, 14.576548, 5.7483034, 8.824854, 13.863134, 6.6725354, 9.156782, 13.925932, 5.7483034, 7.8455133, 12.49441, 6.02427, 8.574091, 13.052322, 5.7483034, 8.824854, 13.863134, 5.7483034, 7.8455133, 12.49441, 6.600126, 6.8608336, 12.05312, 6.6725354, 7.8510666, 12.100964, 6.02427, 8.574091, 13.052322, 5.7483034, 7.8455133, 12.49441, 6.6725354, 7.8510666, 12.100964, 6.6725354, 7.8510666, 12.100964, 6.600126, 6.8608336, 12.05312, 7.3468595, 7.108606, 12.548662, 5.7483034, 8.824854, 13.863134, 6.02427, 8.574091, 13.052322, 6.6725354, 8.830407, 12.935699, 6.02427, 8.574091, 13.052322, 6.6725354, 7.8510666, 12.100964, 6.6725354, 8.830407, 12.935699, 5.7483034, 8.824854, 13.863134, 6.6725354, 8.830407, 12.935699, 6.6725354, 9.156782, 13.925932, 6.6725354, 7.8510666, 12.100964, 7.3468595, 7.108606, 12.548662, 7.5245714, 7.8455133, 12.49441, 6.6725354, 8.830407, 12.935699, 6.6725354, 7.8510666, 12.100964, 7.5245714, 7.8455133, 12.49441, 7.6559334, 6.83328, 13.486778, 7.5245714, 7.8455133, 12.49441, 7.3468595, 7.108606, 12.548662, 6.6725354, 9.156782, 13.925932, 6.6725354, 8.830407, 12.935699, 7.2885475, 8.574091, 13.052322, 6.6725354, 8.830407, 12.935699, 7.5245714, 7.8455133, 12.49441, 7.2885475, 8.574091, 13.052322, 7.6559334, 6.83328, 13.486778, 7.9442887, 7.829067, 13.674955, 7.5245714, 7.8455133, 12.49441, 7.9442887, 7.829067, 13.674955, 7.2885475, 8.574091, 13.052322, 7.5245714, 7.8455133, 12.49441, 7.276586, 7.074431, 14.52272, 7.9442887, 7.829067, 13.674955, 7.6559334, 6.83328, 13.486778, 7.276586, 7.074431, 14.52272, 7.6559334, 7.8126206, 14.855719, 7.9442887, 7.829067, 13.674955, 7.9442887, 7.829067, 13.674955, 7.5245714, 8.824854, 13.863134, 7.2885475, 8.574091, 13.052322, 6.6725354, 9.156782, 13.925932, 7.2885475, 8.574091, 13.052322, 7.5245714, 8.824854, 13.863134, 7.6559334, 7.8126206, 14.855719, 7.5245714, 8.824854, 13.863134, 7.9442887, 7.829067, 13.674955, 6.600126, 8.819301, 14.790783, 6.6725354, 9.156782, 13.925932, 7.5245714, 8.824854, 13.863134, 7.6559334, 7.8126206, 14.855719, 7.3468595, 8.559354, 14.576548, 7.5245714, 8.824854, 13.863134, 6.600126, 8.819301, 14.790783, 7.5245714, 8.824854, 13.863134, 7.3468595, 8.559354, 14.576548, 5.772867, 7.108606, 12.548662, 6.3828983, 6.5013514, 13.424194, 6.600126, 6.8608336, 12.05312, 5.772867, 7.108606, 12.548662, 5.1824865, 6.83328, 13.486778, 6.3828983, 6.5013514, 13.424194, 6.600126, 6.8608336, 12.05312, 6.3828983, 6.5013514, 13.424194, 7.6559334, 6.83328, 13.486778, 6.600126, 6.8608336, 12.05312, 7.6559334, 6.83328, 13.486778, 7.3468595, 7.108606, 12.548662, 6.3828983, 6.5013514, 13.424194, 7.276586, 7.074431, 14.52272, 7.6559334, 6.83328, 13.486778, 6.3828983, 6.5013514, 13.424194, 6.23808, 6.805727, 14.9206505, 7.276586, 7.074431, 14.52272, 5.1824865, 6.83328, 13.486778, 6.23808, 6.805727, 14.9206505, 6.3828983, 6.5013514, 13.424194, 5.1824865, 6.83328, 13.486778, 5.392665, 7.074431, 14.52272, 6.23808, 6.805727, 14.9206505, 9.232489, 5.4846325, 13.925934, 8.13439, 5.7744827, 13.729637, 9.182293, 5.342804, 13.718958, 9.232489, 5.4846325, 13.925934, 8.220682, 5.8879023, 13.925932, 8.13439, 5.7744827, 13.729637, 8.220682, 5.8879023, 13.925932, 7.0958834, 6.874291, 13.868902, 8.13439, 5.7744827, 13.729637, 8.220682, 5.8879023, 13.925932, 7.137321, 6.8738637, 13.925932, 7.0958834, 6.874291, 13.868902, 8.13439, 5.7744827, 13.729637, 7.0958834, 6.874291, 13.868902, 7.0288143, 6.874932, 13.89069, 9.182293, 5.342804, 13.718958, 8.13439, 5.7744827, 13.729637, 7.994697, 5.590576, 13.804609, 8.13439, 5.7744827, 13.729637, 7.0288143, 6.874932, 13.89069, 7.994697, 5.590576, 13.804609, 9.182293, 5.342804, 13.718958, 7.994697, 5.590576, 13.804609, 9.101341, 5.1134014, 13.797989, 7.994697, 5.590576, 13.804609, 7.0288143, 6.874932, 13.89069, 7.0288143, 6.874932, 13.961176, 9.101341, 5.1134014, 13.797989, 7.994697, 5.590576, 13.804609, 7.994697, 5.590576, 14.047256, 7.994697, 5.590576, 13.804609, 7.0288143, 6.874932, 13.961176, 7.994697, 5.590576, 14.047256, 9.101341, 5.1134014, 13.797989, 7.994697, 5.590576, 14.047256, 9.101341, 5.113402, 14.053877, 7.994697, 5.590576, 14.047256, 7.0288143, 6.874932, 13.961176, 7.0958834, 6.874291, 13.982964, 9.101341, 5.113402, 14.053877, 7.994697, 5.590576, 14.047256, 8.13439, 5.7744827, 14.122229, 7.994697, 5.590576, 14.047256, 7.0958834, 6.874291, 13.982964, 8.13439, 5.7744827, 14.122229, 8.13439, 5.7744827, 14.122229, 7.0958834, 6.874291, 13.982964, 7.137321, 6.8738637, 13.925932, 9.101341, 5.113402, 14.053877, 8.13439, 5.7744827, 14.122229, 9.182293, 5.3428044, 14.132908, 8.13439, 5.7744827, 14.122229, 7.137321, 6.8738637, 13.925932, 8.220682, 5.8879023, 13.925932, 9.182293, 5.3428044, 14.132908, 8.13439, 5.7744827, 14.122229, 8.220682, 5.8879023, 13.925932, 9.182293, 5.3428044, 14.132908, 8.220682, 5.8879023, 13.925932, 9.232489, 5.4846325, 13.925934, 8.1010685, 3.1833441, 13.925934, 9.1000595, 5.240492, 14.151705, 8.528688, 3.1833444, 14.550276, 8.1010685, 3.1833441, 13.925934, 8.938793, 5.2697544, 13.925934, 9.1000595, 5.240492, 14.151705, 8.938793, 5.2697544, 13.925934, 9.181226, 7.30661, 14.025682, 9.1000595, 5.240492, 14.151705, 8.938793, 5.2697544, 13.925934, 9.109243, 7.314086, 13.925932, 9.181226, 7.30661, 14.025682, 9.1000595, 5.240492, 14.151705, 9.181226, 7.30661, 14.025682, 9.298063, 7.2942214, 13.987661, 8.528688, 3.1833444, 14.550276, 9.1000595, 5.240492, 14.151705, 9.361288, 5.1928596, 14.0654125, 9.1000595, 5.240492, 14.151705, 9.298063, 7.2942214, 13.987661, 9.361288, 5.1928596, 14.0654125, 8.528688, 3.1833444, 14.550276, 9.361288, 5.1928596, 14.0654125, 9.220314, 3.1833444, 14.311903, 9.361288, 5.1928596, 14.0654125, 9.298063, 7.2942214, 13.987661, 9.298063, 7.2942214, 13.8642025, 9.220314, 3.1833444, 14.311903, 9.361288, 5.1928596, 14.0654125, 9.361074, 5.1928596, 13.786455, 9.361288, 5.1928596, 14.0654125, 9.298063, 7.2942214, 13.8642025, 9.361074, 5.1928596, 13.786455, 9.220314, 3.1833444, 14.311903, 9.361074, 5.1928596, 13.786455, 9.220314, 3.1833441, 13.539965, 9.361074, 5.1928596, 13.786455, 9.298063, 7.2942214, 13.8642025, 9.181226, 7.30661, 13.826183, 9.220314, 3.1833441, 13.539965, 9.361074, 5.1928596, 13.786455, 9.1000595, 5.240492, 13.700161, 9.361074, 5.1928596, 13.786455, 9.181226, 7.30661, 13.826183, 9.1000595, 5.240492, 13.700161, 9.1000595, 5.240492, 13.700161, 9.181226, 7.30661, 13.826183, 9.109243, 7.314086, 13.925932, 9.220314, 3.1833441, 13.539965, 9.1000595, 5.240492, 13.700161, 8.528688, 3.183344, 13.301592, 9.1000595, 5.240492, 13.700161, 9.109243, 7.314086, 13.925932, 8.938793, 5.2697544, 13.925934, 8.528688, 3.183344, 13.301592, 9.1000595, 5.240492, 13.700161, 8.938793, 5.2697544, 13.925934, 8.528688, 3.183344, 13.301592, 8.938793, 5.2697544, 13.925934, 8.1010685, 3.1833441, 13.925934, -21.010672, 7.8103647, 2.1272998, -19.587692, 8.837978, 2.9974916, -19.688295, 7.422474, 2.7779148, -19.688295, 7.422474, 2.7779148, -19.587692, 8.837978, 2.9974916, -17.863327, 8.873861, 2.1501544, -19.688295, 7.422474, 2.7779148, -17.863327, 8.873861, 2.1501544, -18.17112, 7.7911415, 1.9801317, -21.010672, 7.8103647, 2.1272998, -21.224482, 8.815763, 2.6239111, -19.587692, 8.837978, 2.9974916, -21.542313, 7.520514, 0.35765326, -21.224482, 8.815763, 2.6239111, -21.010672, 7.8103647, 2.1272998, -19.587692, 8.837978, 2.9974916, -18.361435, 9.912795, 1.6655035, -17.863327, 8.873861, 2.1501544, -21.542313, 7.520514, 0.35765326, -21.647615, 8.916367, 0.4843155, -21.224482, 8.815763, 2.6239111, -20.734491, 7.9131036, -1.2881074, -21.647615, 8.916367, 0.4843155, -21.542313, 7.520514, 0.35765326, -21.224482, 8.815763, 2.6239111, -19.3993, 10.2673645, 1.9961507, -19.587692, 8.837978, 2.9974916, -19.587692, 8.837978, 2.9974916, -19.3993, 10.2673645, 1.9961507, -18.361435, 9.912795, 1.6655035, -21.647615, 8.916367, 0.4843155, -20.496117, 9.88695, 1.8761096, -21.224482, 8.815763, 2.6239111, -21.224482, 8.815763, 2.6239111, -20.496117, 9.88695, 1.8761096, -19.3993, 10.2673645, 1.9961507, -20.734491, 7.9131036, -1.2881074, -20.953215, 8.991552, -1.6196096, -21.647615, 8.916367, 0.4843155, -20.953215, 8.991552, -1.6196096, -20.734491, 7.9131036, -1.2881074, -19.250423, 7.4918914, -1.8842552, -21.647615, 8.916367, 0.4843155, -20.635382, 10.286802, 0.6468619, -20.496117, 9.88695, 1.8761096, -20.953215, 8.991552, -1.6196096, -20.635382, 10.286802, 0.6468619, -21.647615, 8.916367, 0.4843155, -20.496117, 9.88695, 1.8761096, -19.336502, 10.743685, 0.70111525, -19.3993, 10.2673645, 1.9961507, -20.496117, 9.88695, 1.8761096, -20.635382, 10.286802, 0.6468619, -19.336502, 10.743685, 0.70111525, -20.953215, 8.991552, -1.6196096, -20.375648, 9.964911, -0.65073633, -20.635382, 10.286802, 0.6468619, -20.953215, 8.991552, -1.6196096, -19.250423, 7.4918914, -1.8842552, -19.23718, 8.893511, -1.885751, -20.375648, 9.964911, -0.65073633, -20.953215, 8.991552, -1.6196096, -19.23718, 8.893511, -1.885751, -19.23718, 8.893511, -1.885751, -19.250423, 7.4918914, -1.8842552, -17.902203, 7.774907, -0.91879916, -20.635382, 10.286802, 0.6468619, -20.375648, 9.964911, -0.65073633, -19.311726, 10.281248, -0.66675615, -20.375648, 9.964911, -0.65073633, -19.23718, 8.893511, -1.885751, -19.311726, 10.281248, -0.66675615, -20.635382, 10.286802, 0.6468619, -19.311726, 10.281248, -0.66675615, -19.336502, 10.743685, 0.70111525, -19.23718, 8.893511, -1.885751, -17.902203, 7.774907, -0.91879916, -17.608934, 8.781587, -0.9311881, -19.311726, 10.281248, -0.66675615, -19.23718, 8.893511, -1.885751, -17.608934, 8.781587, -0.9311881, -17.39662, 7.394065, 0.53621995, -17.608934, 8.781587, -0.9311881, -17.902203, 7.774907, -0.91879916, -19.336502, 10.743685, 0.70111525, -19.311726, 10.281248, -0.66675615, -18.248228, 9.871784, -0.34486628, -19.311726, 10.281248, -0.66675615, -17.608934, 8.781587, -0.9311881, -18.248228, 9.871784, -0.34486628, -17.39662, 7.394065, 0.53621995, -17.177256, 8.815123, 0.6272116, -17.608934, 8.781587, -0.9311881, -17.177256, 8.815123, 0.6272116, -18.248228, 9.871784, -0.34486628, -17.608934, 8.781587, -0.9311881, -18.17112, 7.7911415, 1.9801317, -17.177256, 8.815123, 0.6272116, -17.39662, 7.394065, 0.53621995, -18.17112, 7.7911415, 1.9801317, -17.863327, 8.873861, 2.1501544, -17.177256, 8.815123, 0.6272116, -17.177256, 8.815123, 0.6272116, -18.075855, 10.261598, 0.6827462, -18.248228, 9.871784, -0.34486628, -19.336502, 10.743685, 0.70111525, -18.248228, 9.871784, -0.34486628, -18.075855, 10.261598, 0.6827462, -17.863327, 8.873861, 2.1501544, -18.075855, 10.261598, 0.6827462, -17.177256, 8.815123, 0.6272116, -19.3993, 10.2673645, 1.9961507, -19.336502, 10.743685, 0.70111525, -18.075855, 10.261598, 0.6827462, -17.863327, 8.873861, 2.1501544, -18.361435, 9.912795, 1.6655035, -18.075855, 10.261598, 0.6827462, -19.3993, 10.2673645, 1.9961507, -18.075855, 10.261598, 0.6827462, -18.361435, 9.912795, 1.6655035, -20.734491, 7.9131036, -1.2881074, -19.488369, 6.9878044, 0.41062546, -19.250423, 7.4918914, -1.8842552, -20.734491, 7.9131036, -1.2881074, -21.542313, 7.520514, 0.35765326, -19.488369, 6.9878044, 0.41062546, -19.250423, 7.4918914, -1.8842552, -19.488369, 6.9878044, 0.41062546, -17.39662, 7.394065, 0.53621995, -19.250423, 7.4918914, -1.8842552, -17.39662, 7.394065, 0.53621995, -17.902203, 7.774907, -0.91879916, -19.488369, 6.9878044, 0.41062546, -18.17112, 7.7911415, 1.9801317, -17.39662, 7.394065, 0.53621995, -19.488369, 6.9878044, 0.41062546, -19.688295, 7.422474, 2.7779148, -18.17112, 7.7911415, 1.9801317, -21.542313, 7.520514, 0.35765326, -19.688295, 7.422474, 2.7779148, -19.488369, 6.9878044, 0.41062546, -21.542313, 7.520514, 0.35765326, -21.010672, 7.8103647, 2.1272998, -19.688295, 7.422474, 2.7779148, -23.394194, 7.032019, 1.297905, -22.403961, 7.764655, 2.0243464, -22.54878, 6.763315, 1.6958355, -22.54878, 6.763315, 1.6958355, -22.403961, 7.764655, 2.0243464, -21.130926, 7.770209, 1.6309018, -22.54878, 6.763315, 1.6958355, -21.130926, 7.770209, 1.6309018, -21.510273, 7.032019, 1.297905, -23.394194, 7.032019, 1.297905, -23.604374, 7.770209, 1.6309018, -22.403961, 7.764655, 2.0243464, -23.604374, 6.7908683, 0.2619624, -23.604374, 7.770209, 1.6309018, -23.394194, 7.032019, 1.297905, -22.403961, 7.764655, 2.0243464, -21.44, 8.516942, 1.3517308, -21.130926, 7.770209, 1.6309018, -23.604374, 6.7908683, 0.2619624, -23.675714, 7.7866554, 0.45014048, -23.604374, 7.770209, 1.6309018, -23.013992, 7.066194, -0.6761534, -23.675714, 7.7866554, 0.45014048, -23.604374, 6.7908683, 0.2619624, -23.604374, 7.770209, 1.6309018, -22.186733, 8.776889, 1.5659679, -22.403961, 7.764655, 2.0243464, -22.403961, 7.764655, 2.0243464, -22.186733, 8.776889, 1.5659679, -21.44, 8.516942, 1.3517308, -23.675714, 7.7866554, 0.45014048, -23.013992, 8.516942, 1.3517308, -23.604374, 7.770209, 1.6309018, -23.604374, 7.770209, 1.6309018, -23.013992, 8.516942, 1.3517308, -22.186733, 8.776889, 1.5659679, -23.013992, 7.066194, -0.6761534, -23.038557, 7.8031015, -0.73040724, -23.675714, 7.7866554, 0.45014048, -23.038557, 7.8031015, -0.73040724, -23.013992, 7.066194, -0.6761534, -22.186733, 6.818422, -1.1716971, -23.675714, 7.7866554, 0.45014048, -23.038557, 8.782442, 0.63831854, -23.013992, 8.516942, 1.3517308, -23.038557, 7.8031015, -0.73040724, -23.038557, 8.782442, 0.63831854, -23.675714, 7.7866554, 0.45014048, -23.013992, 8.516942, 1.3517308, -22.114325, 9.11437, 0.70111585, -22.186733, 8.776889, 1.5659679, -23.013992, 8.516942, 1.3517308, -23.038557, 8.782442, 0.63831854, -22.114325, 9.11437, 0.70111585, -23.038557, 7.8031015, -0.73040724, -22.76259, 8.531679, -0.17249346, -23.038557, 8.782442, 0.63831854, -23.038557, 7.8031015, -0.73040724, -22.186733, 6.818422, -1.1716971, -22.114325, 7.808655, -1.1238518, -22.76259, 8.531679, -0.17249346, -23.038557, 7.8031015, -0.73040724, -22.114325, 7.808655, -1.1238518, -22.114325, 7.808655, -1.1238518, -22.186733, 6.818422, -1.1716971, -21.44, 7.066194, -0.6761534, -23.038557, 8.782442, 0.63831854, -22.76259, 8.531679, -0.17249346, -22.114325, 8.787995, -0.28911734, -22.76259, 8.531679, -0.17249346, -22.114325, 7.808655, -1.1238518, -22.114325, 8.787995, -0.28911734, -23.038557, 8.782442, 0.63831854, -22.114325, 8.787995, -0.28911734, -22.114325, 9.11437, 0.70111585, -22.114325, 7.808655, -1.1238518, -21.44, 7.066194, -0.6761534, -21.262287, 7.8031015, -0.73040724, -22.114325, 8.787995, -0.28911734, -22.114325, 7.808655, -1.1238518, -21.262287, 7.8031015, -0.73040724, -21.130926, 6.7908683, 0.2619624, -21.262287, 7.8031015, -0.73040724, -21.44, 7.066194, -0.6761534, -22.114325, 9.11437, 0.70111585, -22.114325, 8.787995, -0.28911734, -21.498312, 8.531679, -0.17249346, -22.114325, 8.787995, -0.28911734, -21.262287, 7.8031015, -0.73040724, -21.498312, 8.531679, -0.17249346, -21.130926, 6.7908683, 0.2619624, -20.842571, 7.7866554, 0.45014048, -21.262287, 7.8031015, -0.73040724, -20.842571, 7.7866554, 0.45014048, -21.498312, 8.531679, -0.17249346, -21.262287, 7.8031015, -0.73040724, -21.510273, 7.032019, 1.297905, -20.842571, 7.7866554, 0.45014048, -21.130926, 6.7908683, 0.2619624, -21.510273, 7.032019, 1.297905, -21.130926, 7.770209, 1.6309018, -20.842571, 7.7866554, 0.45014048, -20.842571, 7.7866554, 0.45014048, -21.262287, 8.782442, 0.63831854, -21.498312, 8.531679, -0.17249346, -22.114325, 9.11437, 0.70111585, -21.498312, 8.531679, -0.17249346, -21.262287, 8.782442, 0.63831854, -21.130926, 7.770209, 1.6309018, -21.262287, 8.782442, 0.63831854, -20.842571, 7.7866554, 0.45014048, -22.186733, 8.776889, 1.5659679, -22.114325, 9.11437, 0.70111585, -21.262287, 8.782442, 0.63831854, -21.130926, 7.770209, 1.6309018, -21.44, 8.516942, 1.3517308, -21.262287, 8.782442, 0.63831854, -22.186733, 8.776889, 1.5659679, -21.262287, 8.782442, 0.63831854, -21.44, 8.516942, 1.3517308, -23.013992, 7.066194, -0.6761534, -22.403961, 6.4589396, 0.19937873, -22.186733, 6.818422, -1.1716971, -23.013992, 7.066194, -0.6761534, -23.604374, 6.7908683, 0.2619624, -22.403961, 6.4589396, 0.19937873, -22.186733, 6.818422, -1.1716971, -22.403961, 6.4589396, 0.19937873, -21.130926, 6.7908683, 0.2619624, -22.186733, 6.818422, -1.1716971, -21.130926, 6.7908683, 0.2619624, -21.44, 7.066194, -0.6761534, -22.403961, 6.4589396, 0.19937873, -21.510273, 7.032019, 1.297905, -21.130926, 6.7908683, 0.2619624, -22.403961, 6.4589396, 0.19937873, -22.54878, 6.763315, 1.6958355, -21.510273, 7.032019, 1.297905, -23.604374, 6.7908683, 0.2619624, -22.54878, 6.763315, 1.6958355, -22.403961, 6.4589396, 0.19937873, -23.604374, 6.7908683, 0.2619624, -23.394194, 7.032019, 1.297905, -22.54878, 6.763315, 1.6958355, -19.55437, 5.4422207, 0.70111716, -20.65247, 5.732071, 0.5048219, -19.604567, 5.300392, 0.49414217, -19.55437, 5.4422207, 0.70111716, -20.566177, 5.8454905, 0.70111704, -20.65247, 5.732071, 0.5048219, -20.566177, 5.8454905, 0.70111704, -21.690977, 6.831879, 0.64408636, -20.65247, 5.732071, 0.5048219, -20.566177, 5.8454905, 0.70111704, -21.649538, 6.831452, 0.7011167, -21.690977, 6.831879, 0.64408636, -20.65247, 5.732071, 0.5048219, -21.690977, 6.831879, 0.64408636, -21.758045, 6.83252, 0.66587317, -19.604567, 5.300392, 0.49414217, -20.65247, 5.732071, 0.5048219, -20.792162, 5.5481644, 0.5797943, -20.65247, 5.732071, 0.5048219, -21.758045, 6.83252, 0.66587317, -20.792162, 5.5481644, 0.5797943, -19.604567, 5.300392, 0.49414217, -20.792162, 5.5481644, 0.5797943, -19.685518, 5.0709896, 0.57317305, -20.792162, 5.5481644, 0.5797943, -21.758045, 6.83252, 0.66587317, -21.758045, 6.83252, 0.7363601, -19.685518, 5.0709896, 0.57317305, -20.792162, 5.5481644, 0.5797943, -20.792162, 5.5481644, 0.8224399, -20.792162, 5.5481644, 0.5797943, -21.758045, 6.83252, 0.7363601, -20.792162, 5.5481644, 0.8224399, -19.685518, 5.0709896, 0.57317305, -20.792162, 5.5481644, 0.8224399, -19.685518, 5.07099, 0.8290615, -20.792162, 5.5481644, 0.8224399, -21.758045, 6.83252, 0.7363601, -21.690977, 6.831879, 0.7581469, -19.685518, 5.07099, 0.8290615, -20.792162, 5.5481644, 0.8224399, -20.65247, 5.732071, 0.8974122, -20.792162, 5.5481644, 0.8224399, -21.690977, 6.831879, 0.7581469, -20.65247, 5.732071, 0.8974122, -20.65247, 5.732071, 0.8974122, -21.690977, 6.831879, 0.7581469, -21.649538, 6.831452, 0.7011167, -19.685518, 5.07099, 0.8290615, -20.65247, 5.732071, 0.8974122, -19.604567, 5.3003926, 0.90809214, -20.65247, 5.732071, 0.8974122, -21.649538, 6.831452, 0.7011167, -20.566177, 5.8454905, 0.70111704, -19.604567, 5.3003926, 0.90809214, -20.65247, 5.732071, 0.8974122, -20.566177, 5.8454905, 0.70111704, -19.604567, 5.3003926, 0.90809214, -20.566177, 5.8454905, 0.70111704, -19.55437, 5.4422207, 0.70111716, -20.685791, 3.1409323, 0.701118, -19.6868, 5.19808, 0.9268887, -20.258171, 3.1409326, 1.3254604, -20.685791, 3.1409323, 0.701118, -19.848066, 5.2273426, 0.70111716, -19.6868, 5.19808, 0.9268887, -19.848066, 5.2273426, 0.70111716, -19.605635, 7.2641983, 0.800866, -19.6868, 5.19808, 0.9268887, -19.848066, 5.2273426, 0.70111716, -19.677616, 7.271674, 0.70111644, -19.605635, 7.2641983, 0.800866, -19.6868, 5.19808, 0.9268887, -19.605635, 7.2641983, 0.800866, -19.488796, 7.2518096, 0.7628459, -20.258171, 3.1409326, 1.3254604, -19.6868, 5.19808, 0.9268887, -19.425571, 5.150448, 0.8405957, -19.6868, 5.19808, 0.9268887, -19.488796, 7.2518096, 0.7628459, -19.425571, 5.150448, 0.8405957, -20.258171, 3.1409326, 1.3254604, -19.425571, 5.150448, 0.8405957, -19.566545, 3.1409326, 1.0870868, -19.425571, 5.150448, 0.8405957, -19.488796, 7.2518096, 0.7628459, -19.488796, 7.2518096, 0.63938713, -19.566545, 3.1409326, 1.0870868, -19.425571, 5.150448, 0.8405957, -19.425785, 5.150448, 0.5616387, -19.425571, 5.150448, 0.8405957, -19.488796, 7.2518096, 0.63938713, -19.425785, 5.150448, 0.5616387, -19.566545, 3.1409326, 1.0870868, -19.425785, 5.150448, 0.5616387, -19.566545, 3.1409323, 0.3151492, -19.425785, 5.150448, 0.5616387, -19.488796, 7.2518096, 0.63938713, -19.605635, 7.2641983, 0.601367, -19.566545, 3.1409323, 0.3151492, -19.425785, 5.150448, 0.5616387, -19.6868, 5.19808, 0.47534573, -19.425785, 5.150448, 0.5616387, -19.605635, 7.2641983, 0.601367, -19.6868, 5.19808, 0.47534573, -19.6868, 5.19808, 0.47534573, -19.605635, 7.2641983, 0.601367, -19.677616, 7.271674, 0.70111644, -19.566545, 3.1409323, 0.3151492, -19.6868, 5.19808, 0.47534573, -20.258171, 3.140932, 0.07677555, -19.6868, 5.19808, 0.47534573, -19.677616, 7.271674, 0.70111644, -19.848066, 5.2273426, 0.70111716, -20.258171, 3.140932, 0.07677555, -19.6868, 5.19808, 0.47534573, -19.848066, 5.2273426, 0.70111716, -20.258171, 3.140932, 0.07677555, -19.848066, 5.2273426, 0.70111716, -20.685791, 3.1409323, 0.701118, -9.178474, 7.896264, -9.667162, -7.7554946, 8.923878, -8.79697, -7.8560977, 7.5083733, -9.016546, -7.8560977, 7.5083733, -9.016546, -7.7554946, 8.923878, -8.79697, -6.0311303, 8.959761, -9.644308, -7.8560977, 7.5083733, -9.016546, -6.0311303, 8.959761, -9.644308, -6.338922, 7.877041, -9.814329, -9.178474, 7.896264, -9.667162, -9.392284, 8.901663, -9.170551, -7.7554946, 8.923878, -8.79697, -9.710115, 7.6064134, -11.436808, -9.392284, 8.901663, -9.170551, -9.178474, 7.896264, -9.667162, -7.7554946, 8.923878, -8.79697, -6.5292373, 9.998694, -10.128958, -6.0311303, 8.959761, -9.644308, -9.710115, 7.6064134, -11.436808, -9.815418, 9.002266, -11.310146, -9.392284, 8.901663, -9.170551, -8.902294, 7.999003, -13.082569, -9.815418, 9.002266, -11.310146, -9.710115, 7.6064134, -11.436808, -9.392284, 8.901663, -9.170551, -7.567102, 10.353264, -9.798311, -7.7554946, 8.923878, -8.79697, -7.7554946, 8.923878, -8.79697, -7.567102, 10.353264, -9.798311, -6.5292373, 9.998694, -10.128958, -9.815418, 9.002266, -11.310146, -8.663919, 9.972849, -9.918352, -9.392284, 8.901663, -9.170551, -9.392284, 8.901663, -9.170551, -8.663919, 9.972849, -9.918352, -7.567102, 10.353264, -9.798311, -8.902294, 7.999003, -13.082569, -9.121016, 9.077452, -13.414072, -9.815418, 9.002266, -11.310146, -9.121016, 9.077452, -13.414072, -8.902294, 7.999003, -13.082569, -7.418226, 7.5777907, -13.678717, -9.815418, 9.002266, -11.310146, -8.8031845, 10.372702, -11.1476, -8.663919, 9.972849, -9.918352, -9.121016, 9.077452, -13.414072, -8.8031845, 10.372702, -11.1476, -9.815418, 9.002266, -11.310146, -8.663919, 9.972849, -9.918352, -7.5043044, 10.829584, -11.093346, -7.567102, 10.353264, -9.798311, -8.663919, 9.972849, -9.918352, -8.8031845, 10.372702, -11.1476, -7.5043044, 10.829584, -11.093346, -9.121016, 9.077452, -13.414072, -8.543451, 10.050811, -12.445198, -8.8031845, 10.372702, -11.1476, -9.121016, 9.077452, -13.414072, -7.418226, 7.5777907, -13.678717, -7.404982, 8.97941, -13.680212, -8.543451, 10.050811, -12.445198, -9.121016, 9.077452, -13.414072, -7.404982, 8.97941, -13.680212, -7.404982, 8.97941, -13.680212, -7.418226, 7.5777907, -13.678717, -6.070005, 7.8608065, -12.713261, -8.8031845, 10.372702, -11.1476, -8.543451, 10.050811, -12.445198, -7.479528, 10.367147, -12.461218, -8.543451, 10.050811, -12.445198, -7.404982, 8.97941, -13.680212, -7.479528, 10.367147, -12.461218, -8.8031845, 10.372702, -11.1476, -7.479528, 10.367147, -12.461218, -7.5043044, 10.829584, -11.093346, -7.404982, 8.97941, -13.680212, -6.070005, 7.8608065, -12.713261, -5.7767367, 8.867486, -12.725651, -7.479528, 10.367147, -12.461218, -7.404982, 8.97941, -13.680212, -5.7767367, 8.867486, -12.725651, -5.564422, 7.4799643, -11.258242, -5.7767367, 8.867486, -12.725651, -6.070005, 7.8608065, -12.713261, -7.5043044, 10.829584, -11.093346, -7.479528, 10.367147, -12.461218, -6.4160304, 9.957684, -12.139328, -7.479528, 10.367147, -12.461218, -5.7767367, 8.867486, -12.725651, -6.4160304, 9.957684, -12.139328, -5.564422, 7.4799643, -11.258242, -5.345058, 8.901022, -11.16725, -5.7767367, 8.867486, -12.725651, -5.345058, 8.901022, -11.16725, -6.4160304, 9.957684, -12.139328, -5.7767367, 8.867486, -12.725651, -6.338922, 7.877041, -9.814329, -5.345058, 8.901022, -11.16725, -5.564422, 7.4799643, -11.258242, -6.338922, 7.877041, -9.814329, -6.0311303, 8.959761, -9.644308, -5.345058, 8.901022, -11.16725, -5.345058, 8.901022, -11.16725, -6.2436585, 10.347497, -11.111715, -6.4160304, 9.957684, -12.139328, -7.5043044, 10.829584, -11.093346, -6.4160304, 9.957684, -12.139328, -6.2436585, 10.347497, -11.111715, -6.0311303, 8.959761, -9.644308, -6.2436585, 10.347497, -11.111715, -5.345058, 8.901022, -11.16725, -7.567102, 10.353264, -9.798311, -7.5043044, 10.829584, -11.093346, -6.2436585, 10.347497, -11.111715, -6.0311303, 8.959761, -9.644308, -6.5292373, 9.998694, -10.128958, -6.2436585, 10.347497, -11.111715, -7.567102, 10.353264, -9.798311, -6.2436585, 10.347497, -11.111715, -6.5292373, 9.998694, -10.128958, -8.902294, 7.999003, -13.082569, -7.6561713, 7.073704, -11.383837, -7.418226, 7.5777907, -13.678717, -8.902294, 7.999003, -13.082569, -9.710115, 7.6064134, -11.436808, -7.6561713, 7.073704, -11.383837, -7.418226, 7.5777907, -13.678717, -7.6561713, 7.073704, -11.383837, -5.564422, 7.4799643, -11.258242, -7.418226, 7.5777907, -13.678717, -5.564422, 7.4799643, -11.258242, -6.070005, 7.8608065, -12.713261, -7.6561713, 7.073704, -11.383837, -6.338922, 7.877041, -9.814329, -5.564422, 7.4799643, -11.258242, -7.6561713, 7.073704, -11.383837, -7.8560977, 7.5083733, -9.016546, -6.338922, 7.877041, -9.814329, -9.710115, 7.6064134, -11.436808, -7.8560977, 7.5083733, -9.016546, -7.6561713, 7.073704, -11.383837, -9.710115, 7.6064134, -11.436808, -9.178474, 7.896264, -9.667162, -7.8560977, 7.5083733, -9.016546, -11.561996, 7.1179185, -10.496557, -10.571764, 7.8505545, -9.770115, -10.716581, 6.8492146, -10.098627, -10.716581, 6.8492146, -10.098627, -10.571764, 7.8505545, -9.770115, -9.298729, 7.856108, -10.163559, -10.716581, 6.8492146, -10.098627, -9.298729, 7.856108, -10.163559, -9.678076, 7.1179185, -10.496557, -11.561996, 7.1179185, -10.496557, -11.772175, 7.856108, -10.163559, -10.571764, 7.8505545, -9.770115, -11.772175, 6.8767676, -11.532499, -11.772175, 7.856108, -10.163559, -11.561996, 7.1179185, -10.496557, -10.571764, 7.8505545, -9.770115, -9.607803, 8.602841, -10.44273, -9.298729, 7.856108, -10.163559, -11.772175, 6.8767676, -11.532499, -11.843517, 7.872555, -11.344322, -11.772175, 7.856108, -10.163559, -11.181795, 7.1520934, -12.470615, -11.843517, 7.872555, -11.344322, -11.772175, 6.8767676, -11.532499, -11.772175, 7.856108, -10.163559, -10.354536, 8.862788, -10.228495, -10.571764, 7.8505545, -9.770115, -10.571764, 7.8505545, -9.770115, -10.354536, 8.862788, -10.228495, -9.607803, 8.602841, -10.44273, -11.843517, 7.872555, -11.344322, -11.181795, 8.602841, -10.44273, -11.772175, 7.856108, -10.163559, -11.772175, 7.856108, -10.163559, -11.181795, 8.602841, -10.44273, -10.354536, 8.862788, -10.228495, -11.181795, 7.1520934, -12.470615, -11.206358, 7.889001, -12.524868, -11.843517, 7.872555, -11.344322, -11.206358, 7.889001, -12.524868, -11.181795, 7.1520934, -12.470615, -10.354536, 6.904321, -12.966158, -11.843517, 7.872555, -11.344322, -11.206358, 8.868341, -11.156143, -11.181795, 8.602841, -10.44273, -11.206358, 7.889001, -12.524868, -11.206358, 8.868341, -11.156143, -11.843517, 7.872555, -11.344322, -11.181795, 8.602841, -10.44273, -10.282127, 9.20027, -11.093346, -10.354536, 8.862788, -10.228495, -11.181795, 8.602841, -10.44273, -11.206358, 8.868341, -11.156143, -10.282127, 9.20027, -11.093346, -11.206358, 7.889001, -12.524868, -10.930391, 8.6175785, -11.966955, -11.206358, 8.868341, -11.156143, -11.206358, 7.889001, -12.524868, -10.354536, 6.904321, -12.966158, -10.282127, 7.894554, -12.918314, -10.930391, 8.6175785, -11.966955, -11.206358, 7.889001, -12.524868, -10.282127, 7.894554, -12.918314, -10.282127, 7.894554, -12.918314, -10.354536, 6.904321, -12.966158, -9.607803, 7.1520934, -12.470615, -11.206358, 8.868341, -11.156143, -10.930391, 8.6175785, -11.966955, -10.282127, 8.873895, -12.083578, -10.930391, 8.6175785, -11.966955, -10.282127, 7.894554, -12.918314, -10.282127, 8.873895, -12.083578, -11.206358, 8.868341, -11.156143, -10.282127, 8.873895, -12.083578, -10.282127, 9.20027, -11.093346, -10.282127, 7.894554, -12.918314, -9.607803, 7.1520934, -12.470615, -9.43009, 7.889001, -12.524868, -10.282127, 8.873895, -12.083578, -10.282127, 7.894554, -12.918314, -9.43009, 7.889001, -12.524868, -9.298729, 6.8767676, -11.532499, -9.43009, 7.889001, -12.524868, -9.607803, 7.1520934, -12.470615, -10.282127, 9.20027, -11.093346, -10.282127, 8.873895, -12.083578, -9.666115, 8.6175785, -11.966955, -10.282127, 8.873895, -12.083578, -9.43009, 7.889001, -12.524868, -9.666115, 8.6175785, -11.966955, -9.298729, 6.8767676, -11.532499, -9.010374, 7.872555, -11.344322, -9.43009, 7.889001, -12.524868, -9.010374, 7.872555, -11.344322, -9.666115, 8.6175785, -11.966955, -9.43009, 7.889001, -12.524868, -9.678076, 7.1179185, -10.496557, -9.010374, 7.872555, -11.344322, -9.298729, 6.8767676, -11.532499, -9.678076, 7.1179185, -10.496557, -9.298729, 7.856108, -10.163559, -9.010374, 7.872555, -11.344322, -9.010374, 7.872555, -11.344322, -9.43009, 8.868341, -11.156143, -9.666115, 8.6175785, -11.966955, -10.282127, 9.20027, -11.093346, -9.666115, 8.6175785, -11.966955, -9.43009, 8.868341, -11.156143, -9.298729, 7.856108, -10.163559, -9.43009, 8.868341, -11.156143, -9.010374, 7.872555, -11.344322, -10.354536, 8.862788, -10.228495, -10.282127, 9.20027, -11.093346, -9.43009, 8.868341, -11.156143, -9.298729, 7.856108, -10.163559, -9.607803, 8.602841, -10.44273, -9.43009, 8.868341, -11.156143, -10.354536, 8.862788, -10.228495, -9.43009, 8.868341, -11.156143, -9.607803, 8.602841, -10.44273, -11.181795, 7.1520934, -12.470615, -10.571764, 6.544839, -11.595083, -10.354536, 6.904321, -12.966158, -11.181795, 7.1520934, -12.470615, -11.772175, 6.8767676, -11.532499, -10.571764, 6.544839, -11.595083, -10.354536, 6.904321, -12.966158, -10.571764, 6.544839, -11.595083, -9.298729, 6.8767676, -11.532499, -10.354536, 6.904321, -12.966158, -9.298729, 6.8767676, -11.532499, -9.607803, 7.1520934, -12.470615, -10.571764, 6.544839, -11.595083, -9.678076, 7.1179185, -10.496557, -9.298729, 6.8767676, -11.532499, -10.571764, 6.544839, -11.595083, -10.716581, 6.8492146, -10.098627, -9.678076, 7.1179185, -10.496557, -11.772175, 6.8767676, -11.532499, -10.716581, 6.8492146, -10.098627, -10.571764, 6.544839, -11.595083, -11.772175, 6.8767676, -11.532499, -11.561996, 7.1179185, -10.496557, -10.716581, 6.8492146, -10.098627, -7.722173, 5.52812, -11.093344, -8.820272, 5.8179703, -11.28964, -7.772368, 5.3862915, -11.30032, -7.722173, 5.52812, -11.093344, -8.73398, 5.93139, -11.093346, -8.820272, 5.8179703, -11.28964, -8.73398, 5.93139, -11.093346, -9.858778, 6.9177785, -11.150375, -8.820272, 5.8179703, -11.28964, -8.73398, 5.93139, -11.093346, -9.817341, 6.9173512, -11.093346, -9.858778, 6.9177785, -11.150375, -8.820272, 5.8179703, -11.28964, -9.858778, 6.9177785, -11.150375, -9.925848, 6.9184194, -11.128588, -7.772368, 5.3862915, -11.30032, -8.820272, 5.8179703, -11.28964, -8.959965, 5.6340637, -11.214668, -8.820272, 5.8179703, -11.28964, -9.925848, 6.9184194, -11.128588, -8.959965, 5.6340637, -11.214668, -7.772368, 5.3862915, -11.30032, -8.959965, 5.6340637, -11.214668, -7.8533216, 5.156889, -11.221289, -8.959965, 5.6340637, -11.214668, -9.925848, 6.9184194, -11.128588, -9.925848, 6.9184194, -11.058102, -7.8533216, 5.156889, -11.221289, -8.959965, 5.6340637, -11.214668, -8.959965, 5.6340637, -10.972021, -8.959965, 5.6340637, -11.214668, -9.925848, 6.9184194, -11.058102, -8.959965, 5.6340637, -10.972021, -7.8533216, 5.156889, -11.221289, -8.959965, 5.6340637, -10.972021, -7.8533216, 5.1568894, -10.965401, -8.959965, 5.6340637, -10.972021, -9.925848, 6.9184194, -11.058102, -9.858778, 6.9177785, -11.036314, -7.8533216, 5.1568894, -10.965401, -8.959965, 5.6340637, -10.972021, -8.820272, 5.8179703, -10.897049, -8.959965, 5.6340637, -10.972021, -9.858778, 6.9177785, -11.036314, -8.820272, 5.8179703, -10.897049, -8.820272, 5.8179703, -10.897049, -9.858778, 6.9177785, -11.036314, -9.817341, 6.9173512, -11.093346, -7.8533216, 5.1568894, -10.965401, -8.820272, 5.8179703, -10.897049, -7.772368, 5.386292, -10.88637, -8.820272, 5.8179703, -10.897049, -9.817341, 6.9173512, -11.093346, -8.73398, 5.93139, -11.093346, -7.772368, 5.386292, -10.88637, -8.820272, 5.8179703, -10.897049, -8.73398, 5.93139, -11.093346, -7.772368, 5.386292, -10.88637, -8.73398, 5.93139, -11.093346, -7.722173, 5.52812, -11.093344, -8.853594, 3.2268317, -11.093344, -7.8546023, 5.2839794, -10.867573, -8.425974, 3.226832, -10.469002, -8.853594, 3.2268317, -11.093344, -8.015869, 5.313242, -11.093344, -7.8546023, 5.2839794, -10.867573, -8.015869, 5.313242, -11.093344, -7.773436, 7.3500977, -10.993595, -7.8546023, 5.2839794, -10.867573, -8.015869, 5.313242, -11.093344, -7.8454185, 7.3575735, -11.093346, -7.773436, 7.3500977, -10.993595, -7.8546023, 5.2839794, -10.867573, -7.773436, 7.3500977, -10.993595, -7.6565986, 7.337709, -11.031616, -8.425974, 3.226832, -10.469002, -7.8546023, 5.2839794, -10.867573, -7.5933747, 5.236347, -10.953865, -7.8546023, 5.2839794, -10.867573, -7.6565986, 7.337709, -11.031616, -7.5933747, 5.236347, -10.953865, -8.425974, 3.226832, -10.469002, -7.5933747, 5.236347, -10.953865, -7.734348, 3.226832, -10.707375, -7.5933747, 5.236347, -10.953865, -7.6565986, 7.337709, -11.031616, -7.6565986, 7.337709, -11.155075, -7.734348, 3.226832, -10.707375, -7.5933747, 5.236347, -10.953865, -7.5935884, 5.236347, -11.232822, -7.5933747, 5.236347, -10.953865, -7.6565986, 7.337709, -11.155075, -7.5935884, 5.236347, -11.232822, -7.734348, 3.226832, -10.707375, -7.5935884, 5.236347, -11.232822, -7.734348, 3.2268317, -11.479313, -7.5935884, 5.236347, -11.232822, -7.6565986, 7.337709, -11.155075, -7.773436, 7.3500977, -11.193094, -7.734348, 3.2268317, -11.479313, -7.5935884, 5.236347, -11.232822, -7.8546023, 5.2839794, -11.319117, -7.5935884, 5.236347, -11.232822, -7.773436, 7.3500977, -11.193094, -7.8546023, 5.2839794, -11.319117, -7.8546023, 5.2839794, -11.319117, -7.773436, 7.3500977, -11.193094, -7.8454185, 7.3575735, -11.093346, -7.734348, 3.2268317, -11.479313, -7.8546023, 5.2839794, -11.319117, -8.425974, 3.2268314, -11.717686, -7.8546023, 5.2839794, -11.319117, -7.8454185, 7.3575735, -11.093346, -8.015869, 5.313242, -11.093344, -8.425974, 3.2268314, -11.717686, -7.8546023, 5.2839794, -11.319117, -8.015869, 5.313242, -11.093344, -8.425974, 3.2268314, -11.717686, -8.015869, 5.313242, -11.093344, -8.853594, 3.2268317, -11.093344) @@ -120,7 +139,7 @@ layer = -1 [node name="TitleBackground" type="ColorRect" parent="TitleBackgroundLayer" unique_id=1768697365] unique_name_in_owner = true -material = SubResource("ShaderMaterial_title_grass_native") +material = SubResource("ShaderMaterial_title_water_native") anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -128,6 +147,20 @@ grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 +[node name="PlayerMenuBackdrop" type="ColorRect" parent="." unique_id=2055423661] +unique_name_in_owner = true +visible = false +z_index = 10 +material = SubResource("ShaderMaterial_player_menu_pattern") +mouse_filter = 2 + +[node name="ShopBackdrop" type="ColorRect" parent="." unique_id=1404109502] +unique_name_in_owner = true +visible = false +z_index = 10 +material = SubResource("ShaderMaterial_shop_pattern") +mouse_filter = 2 + [node name="InterfaceFontController" type="Node" parent="." unique_id=384169781] unique_name_in_owner = true script = ExtResource("39_fonts") @@ -232,14 +265,6 @@ script = ExtResource("22_network_sale") unique_name_in_owner = true script = ExtResource("23_network_shop") -[node name="NetworkHomeService" type="Node" parent="."] -unique_name_in_owner = true -script = ExtResource("63_network_home") - -[node name="HomeDecorController" type="Node" parent="."] -unique_name_in_owner = true -script = ExtResource("64_home_decor_controller") - [node name="NetworkItemUseService" type="Node" parent="." unique_id=255154670] unique_name_in_owner = true script = ExtResource("24_network_item") @@ -303,10 +328,6 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.3999481, 12.07081) [node name="WorldGatherables" type="Node3D" parent="."] -[node name="HomeWorldService" type="Node3D" parent="."] -unique_name_in_owner = true -script = ExtResource("62_home_world") - [node name="GatheringController" type="Node3D" parent="."] unique_name_in_owner = true script = ExtResource("60_gathering_controller") @@ -323,10 +344,6 @@ script = ExtResource("8_recovery") unique_name_in_owner = true script = ExtResource("9_save") -[node name="PlayerHomeState" type="Node" parent="."] -unique_name_in_owner = true -script = ExtResource("61_home_state") - [node name="PlayerSettingsManager" type="Node" parent="." unique_id=906991991] unique_name_in_owner = true script = ExtResource("10_settings") @@ -352,6 +369,14 @@ bus = &"Music" unique_name_in_owner = true bus = &"Music" +[node name="ShorelineAmbience" type="Node" parent="." unique_id=1948037177] +unique_name_in_owner = true +script = ExtResource("54_shoreline_ambience") + +[node name="WavesAudio" type="AudioStreamPlayer" parent="ShorelineAmbience" unique_id=193530658] +unique_name_in_owner = true +bus = &"Environment" + [node name="WorldPixelationPostprocess" parent="." unique_id=344378000 instance=ExtResource("16_world_pixelation")] unique_name_in_owner = true diff --git a/main/runtime_performance_profile.gd b/main/runtime_performance_profile.gd index 3f44e38..ee2581d 100644 --- a/main/runtime_performance_profile.gd +++ b/main/runtime_performance_profile.gd @@ -2,14 +2,9 @@ class_name RuntimePerformanceProfile extends RefCounted const PROFILE_ENVIRONMENT_VARIABLE: String = ( - "straywild_PERFORMANCE_PROFILE" -) -const LEGACY_LIGHT_ENVIRONMENT_VARIABLE: String = "straywild_LOW_END" -const NETFISHING_PROFILE_ENVIRONMENT_VARIABLE := ( "NETFISHING_PERFORMANCE_PROFILE" ) -const NETFISHING_LIGHT_ENVIRONMENT_VARIABLE := "NETFISHING_LOW_END" -const PORTMASTER_BUILD_FEATURE: StringName = &"straywild_portmaster" +const LEGACY_LIGHT_ENVIRONMENT_VARIABLE: String = "NETFISHING_LOW_END" const NORMAL_PROFILE: StringName = &"normal" const LIGHT_PROFILE: StringName = &"light" const NORMAL_WORLD_RENDER_SCALE: float = 1.0 @@ -19,29 +14,9 @@ var _profile_name: StringName = NORMAL_PROFILE static func from_environment() -> RuntimePerformanceProfile: - return from_environment_for_portmaster_build( - OS.has_feature(PORTMASTER_BUILD_FEATURE) - ) - - -static func from_environment_for_portmaster_build( - is_portmaster_build: bool, -) -> RuntimePerformanceProfile: - if not is_portmaster_build: - return from_name(NORMAL_PROFILE) - var profile_name: String = OS.get_environment( - PROFILE_ENVIRONMENT_VARIABLE - ) - if profile_name.is_empty(): - profile_name = OS.get_environment( - NETFISHING_PROFILE_ENVIRONMENT_VARIABLE - ) return from_name( - StringName(profile_name), - ( - OS.get_environment(LEGACY_LIGHT_ENVIRONMENT_VARIABLE) == "1" - or OS.get_environment(NETFISHING_LIGHT_ENVIRONMENT_VARIABLE) == "1" - ), + StringName(OS.get_environment(PROFILE_ENVIRONMENT_VARIABLE)), + OS.get_environment(LEGACY_LIGHT_ENVIRONMENT_VARIABLE) == "1", ) diff --git a/main/texture_sampling_policy.gd b/main/texture_sampling_policy.gd index 35a92a0..3d041d0 100644 --- a/main/texture_sampling_policy.gd +++ b/main/texture_sampling_policy.gd @@ -1,6 +1,6 @@ extends Node -## Enforces straywild's nearest-neighbor-only artwork policy at runtime. +## Enforces NETfishing's nearest-neighbor-only artwork policy at runtime. ## ## Godot uses separate texture-filter enums for CanvasItem and 3D materials. ## Applying both here prevents imported models, dynamically created controls, @@ -15,12 +15,8 @@ func _enter_tree() -> void: func _on_node_added(node: Node) -> void: enforce_node(node) # Some runtime presenters assign their mesh or material immediately after - # add_child(). Recheck those 3D resource owners once deferred so the newly - # assigned resources are covered too. CanvasItems keep their filter setting - # when their texture changes, so deferring every dynamic UI node only floods - # the message queue during large inventory and catalog refreshes. - if _needs_deferred_resource_check(node): - call_deferred("_enforce_deferred_node", weakref(node)) + # add_child(). Recheck once deferred so those resources are covered too. + call_deferred("_enforce_deferred_node", weakref(node)) func _enforce_existing_tree() -> void: @@ -33,15 +29,6 @@ func _enforce_deferred_node(node_ref: WeakRef) -> void: enforce_node(node) -static func _needs_deferred_resource_check(node: Node) -> bool: - return ( - node is GeometryInstance3D - or node is MultiMeshInstance3D - or node is GPUParticles3D - or node is CPUParticles3D - ) - - static func enforce_subtree(node: Node) -> void: enforce_node(node) for child: Node in node.get_children(): diff --git a/network/connection_route.gd b/network/connection_route.gd index 2f490c7..af9e625 100644 --- a/network/connection_route.gd +++ b/network/connection_route.gd @@ -3,65 +3,22 @@ extends RefCounted enum Kind { DIRECT, - DISCOVERY_DIRECT, - DISCOVERY_RELAY, } var kind: Kind = Kind.DIRECT var direct_endpoint: ConnectionEndpoint var display_description: String = "" -var discovery_room_id: String = "" static func direct(endpoint: ConnectionEndpoint) -> ConnectionRoute: var route := ConnectionRoute.new() route.kind = Kind.DIRECT route.direct_endpoint = endpoint - route.display_description = "direct server" if endpoint != null else "" - return route - - -static func discovery_direct( - endpoint: ConnectionEndpoint, - room_id: String, - room_name: String, -) -> ConnectionRoute: - var route := ConnectionRoute.new() - route.kind = Kind.DISCOVERY_DIRECT - route.direct_endpoint = endpoint - route.discovery_room_id = room_id - var cleaned_name := room_name.strip_edges() route.display_description = ( - cleaned_name if not cleaned_name.is_empty() else "public room" + endpoint.normalized_display if endpoint != null else "" ) return route -static func discovery_relay( - endpoint: ConnectionEndpoint, - room_id: String, - room_name: String, -) -> ConnectionRoute: - var route := discovery_direct(endpoint, room_id, room_name) - route.kind = Kind.DISCOVERY_RELAY - return route - - func is_valid() -> bool: - return ( - kind in [Kind.DIRECT, Kind.DISCOVERY_DIRECT, Kind.DISCOVERY_RELAY] - and direct_endpoint != null - and direct_endpoint.is_valid() - and ( - kind == Kind.DIRECT - or not discovery_room_id.is_empty() - ) - ) - - -func is_discovery_join() -> bool: - return kind in [Kind.DISCOVERY_DIRECT, Kind.DISCOVERY_RELAY] - - -func is_relay() -> bool: - return kind == Kind.DISCOVERY_RELAY + return kind == Kind.DIRECT and direct_endpoint != null and direct_endpoint.is_valid() diff --git a/network/direct_enet_transport.gd b/network/direct_enet_transport.gd index e753246..067b86c 100644 --- a/network/direct_enet_transport.gd +++ b/network/direct_enet_transport.gd @@ -34,12 +34,11 @@ func connect_to_route(route: ConnectionRoute) -> Error: ) if error != OK: transport_error.emit( - "Unable to begin the connection to %s." - % route.display_description + "Unable to connect to %s." % endpoint.normalized_display ) return error _peer = enet_peer - _route_description = route.display_description + _route_description = endpoint.normalized_display return OK diff --git a/network/discovery_client.gd b/network/discovery_client.gd index 8bb28c0..31b8054 100644 --- a/network/discovery_client.gd +++ b/network/discovery_client.gd @@ -6,7 +6,7 @@ signal browse_status_changed(message: String, is_error: bool) signal host_settings_changed(room_name: String, discoverable: bool) signal host_status_changed(message: String, is_error: bool) signal host_state_changed(state: int) -signal public_join_prepared(route: ConnectionRoute) +signal public_join_prepared(endpoint: String) signal public_join_status_changed(message: String, is_error: bool) signal public_join_state_changed(state: int) signal friend_presence_updated(friends: Array[Dictionary]) @@ -20,25 +20,20 @@ signal friend_invite_received( signal friend_invite_finished(success: bool, message: String) const BASE_URL_SETTING: String = "network/discovery/base_url" -const BASE_URL_ENVIRONMENT: String = "straywild_DISCOVERY_URL" -const LEGACY_BASE_URL_ENVIRONMENT: String = "NETFISHING_DISCOVERY_URL" +const BASE_URL_ENVIRONMENT: String = "NETFISHING_DISCOVERY_URL" const SETTINGS_PATH: String = "user://network_discovery.cfg" const DEFAULT_ROOM_NAME: String = "Player's Server" -const LEGACY_DEFAULT_ROOM_NAME: String = "straywild Room" +const LEGACY_DEFAULT_ROOM_NAME: String = "NETfishing Room" const LEGACY_DEDICATED_DEFAULT_ROOM_NAME: String = ( - "straywild Dedicated Server" + "NETfishing Dedicated Server" ) -const HOST_CONNECTION_DIRECT: String = "direct" -const HOST_CONNECTION_RELAY: String = "relay" -const HOST_DISCOVERY_PRIVATE: String = "private" const ROOM_NAME_SUFFIX: String = "'s Server" const MAX_ROOM_NAME_LENGTH: int = 48 const HEARTBEAT_INTERVAL_SECONDS: float = 15.0 const REQUEST_TIMEOUT_SECONDS: float = 8.0 const TRAVERSAL_POLL_INTERVAL_SECONDS: float = 1.0 const JOIN_PROBE_INTERVAL_SECONDS: float = 0.35 -const TRAVERSAL_PACKET_PREFIX: String = "straywild_TRAVERSAL_V1 " -const RELAY_AUTH_PACKET_PREFIX: String = "straywild_RELAY_AUTH_V1 " +const TRAVERSAL_PACKET_PREFIX: String = "NETFISHING_TRAVERSAL_V1 " const UPNP_MAPPING_DURATION_SECONDS: int = 3600 const UPNP_RENEW_INTERVAL_SECONDS: float = 2700.0 const UPNP_RETRY_INTERVAL_SECONDS: float = 300.0 @@ -94,7 +89,6 @@ var _join_request: HTTPRequest var _traversal_timer: Timer var _join_probe_timer: Timer var _host_verified: bool = false -var _host_connection_preference: String = HOST_CONNECTION_DIRECT var _traversal_host: String = "" var _traversal_port: int = 0 var _host_verification_token: String = "" @@ -102,8 +96,6 @@ var _join_request_in_flight: bool = false var _pending_join_endpoint: String = "" var _pending_join_token: String = "" var _pending_join_room_id: String = "" -var _pending_join_room_name: String = "" -var _pending_join_transport: String = "" var _preserve_pending_join_on_inactive: bool = false var _upnp_thread: Thread var _upnp_mapping_in_progress: bool = false @@ -278,10 +270,7 @@ func get_friend_presence() -> Array[Dictionary]: result.append({ "fingerprint": fingerprint, "display_name": str( - friend.get( - "last_known_display_name", - NetworkProfilePreferences.DEFAULT_DISPLAY_NAME, - ) + friend.get("last_known_display_name", "Player") ), "online": bool(live.get("online", false)), "room": ( @@ -391,25 +380,12 @@ func get_host_state() -> HostState: return _host_state -func get_host_connection_mode() -> String: - return _host_connection_preference - - -func get_host_discovery_mode() -> String: - return ( - _host_connection_preference - if _discoverable - else HOST_DISCOVERY_PRIVATE - ) - - func get_public_join_state() -> PublicJoinState: return _public_join_state func configure_dedicated_runtime(room_name: String) -> bool: _host_settings_persistence_enabled = false - _host_connection_preference = HOST_CONNECTION_DIRECT return set_room_name(room_name) @@ -476,49 +452,6 @@ func set_discoverable(enabled: bool) -> bool: return true -func set_host_connection_mode(connection_mode: String) -> bool: - if connection_mode not in [ - HOST_CONNECTION_DIRECT, - HOST_CONNECTION_RELAY, - ]: - return false - if ( - connection_mode == HOST_CONNECTION_RELAY - and _session != null - and _session.is_dedicated_host() - ): - _set_host_state(HostState.ERROR) - _set_host_status( - "Dedicated servers must use direct discovery hosting.", true - ) - return false - if _host_connection_preference == connection_mode: - return true - _host_connection_preference = connection_mode - _save_settings() - host_settings_changed.emit(_room_name, _discoverable) - if _discoverable: - _set_host_state(HostState.REGISTERING) - _set_host_status("Updating public connection mode…", false) - _synchronize_host_lease() - return true - - -func cycle_host_discovery_mode() -> bool: - match get_host_discovery_mode(): - HOST_DISCOVERY_PRIVATE: - if not set_host_connection_mode(HOST_CONNECTION_DIRECT): - return false - return set_discoverable(true) - HOST_CONNECTION_DIRECT: - if _session != null and _session.is_dedicated_host(): - return set_discoverable(false) - return set_host_connection_mode(HOST_CONNECTION_RELAY) - HOST_CONNECTION_RELAY: - return set_discoverable(false) - return false - - func is_public_join_preparing() -> bool: return _join_request_in_flight @@ -546,16 +479,13 @@ func prepare_public_join(room: Dictionary) -> bool: "You are already hosting this room.", true ) return false + var endpoint: String = room_endpoint(room) var room_id: String = str(room.get("room_id", "")).strip_edges() - if room_id.is_empty(): + if endpoint.is_empty() or room_id.is_empty(): _set_public_join_state(PublicJoinState.ERROR) return false - _pending_join_endpoint = "" + _pending_join_endpoint = endpoint _pending_join_room_id = room_id - _pending_join_room_name = str( - room.get("room_name", "public room") - ).strip_edges() - _pending_join_transport = str(room.get("connection_mode", "")) _pending_join_token = "" var url: String = "%s/v1/rooms/%s/join-attempts" % [ _base_url, @@ -604,6 +534,16 @@ func request_rooms() -> bool: return true +func room_endpoint(room: Dictionary) -> String: + var address: String = str(room.get("address", "")).strip_edges() + var port: int = int(room.get("port", 0)) + if address.is_empty() or port < 1 or port > 65535: + return "" + if ":" in address and not address.begins_with("["): + address = "[%s]" % address + return "%s:%d" % [address, port] + + func is_own_room(room: Dictionary) -> bool: return ( not _lease_room_id.is_empty() @@ -613,10 +553,6 @@ func is_own_room(room: Dictionary) -> bool: func _configured_base_url() -> String: var value: String = OS.get_environment(BASE_URL_ENVIRONMENT).strip_edges() - if value.is_empty(): - value = OS.get_environment( - LEGACY_BASE_URL_ENVIRONMENT - ).strip_edges() if value.is_empty(): value = str(ProjectSettings.get_setting(BASE_URL_SETTING, "")).strip_edges() while value.ends_with("/"): @@ -624,7 +560,7 @@ func _configured_base_url() -> String: if not value.is_empty() and not ( value.begins_with("https://") or value.begins_with("http://") ): - push_warning("Ignored invalid straywild discovery URL.") + push_warning("Ignored invalid NETfishing discovery URL.") return "" return value @@ -699,14 +635,6 @@ func _host_payload() -> Dictionary: ProjectSettings.get_setting("application/config/version", "unknown") ), "protocol_version": NetworkProtocol.PROTOCOL_VERSION, - "host_kind": ( - "dedicated" if _session.is_dedicated_host() else "player" - ), - "connection_mode": ( - HOST_CONNECTION_DIRECT - if _session.is_dedicated_host() - else _host_connection_preference - ), } @@ -755,7 +683,7 @@ func _on_host_request_completed( else HostState.VERIFYING ) _set_host_status( - _host_listing_status(room) + "Room is listed publicly." if _host_verified else "Checking the public route…", false, @@ -773,7 +701,7 @@ func _on_host_request_completed( else HostState.VERIFYING ) _set_host_status( - _host_listing_status(room) + "Room is listed publicly." if _host_verified else "Checking the public route…", false, @@ -822,33 +750,10 @@ func _on_join_request_completed( return _pending_join_token = str(response.get("join_token", "")) _apply_traversal_response(response) - var route_transport := "" - var route_privacy := "" - var route_details: Variant = response.get("route", {}) - if typeof(route_details) == TYPE_DICTIONARY: - var direct_route: Dictionary = route_details - route_transport = str(direct_route.get("transport", "")) - route_privacy = str(direct_route.get("ip_privacy", "")) - if route_transport in ["direct", "relay"]: - var address := str(direct_route.get("address", "")).strip_edges() - var port := int(direct_route.get("port", 0)) - if not address.is_empty() and port >= 1 and port <= 65535: - if ":" in address and not address.begins_with("["): - address = "[%s]" % address - _pending_join_endpoint = "%s:%d" % [address, port] if ( _pending_join_token.is_empty() - or _pending_join_endpoint.is_empty() - or route_transport != _pending_join_transport - or ( - route_transport == "direct" - and route_privacy != "peer_visible" - ) - or (route_transport == "relay" and route_privacy != "relayed") - or ( - route_transport == "direct" - and (_traversal_host.is_empty() or _traversal_port < 1) - ) + or _traversal_host.is_empty() + or _traversal_port < 1 ): _set_public_join_state(PublicJoinState.ERROR) public_join_status_changed.emit( @@ -858,25 +763,7 @@ func _on_join_request_completed( return _set_public_join_state(PublicJoinState.CONNECTING) public_join_status_changed.emit("Connecting…", false) - var endpoint := EndpointParser.parse(_pending_join_endpoint) - if not endpoint.is_valid(): - _set_public_join_state(PublicJoinState.ERROR) - public_join_status_changed.emit("Could not reach this room.", true) - _clear_pending_join() - return - public_join_prepared.emit( - ConnectionRoute.discovery_relay( - endpoint, - _pending_join_room_id, - _pending_join_room_name, - ) - if route_transport == "relay" - else ConnectionRoute.discovery_direct( - endpoint, - _pending_join_room_id, - _pending_join_room_name, - ) - ) + public_join_prepared.emit(_pending_join_endpoint) func _on_traversal_timer_timeout() -> void: @@ -922,7 +809,7 @@ func _on_traversal_request_completed( var port: int = int(endpoint.get("port", 0)) if address.is_empty() or port < 1 or port > 65535: continue - var punch: PackedByteArray = "straywild_PUNCH_V1".to_utf8_buffer() + var punch: PackedByteArray = "NETFISHING_PUNCH_V1".to_utf8_buffer() for _attempt: int in 3: _session.send_traversal_packet(address, port, punch) @@ -964,15 +851,6 @@ func _send_pending_join_probe() -> void: ): _join_probe_timer.stop() return - if _pending_join_transport == "relay": - var relay_endpoint := EndpointParser.parse(_pending_join_endpoint) - if relay_endpoint.is_valid(): - _session.send_traversal_packet( - relay_endpoint.host, - relay_endpoint.port, - (RELAY_AUTH_PACKET_PREFIX + _pending_join_token).to_utf8_buffer(), - ) - return _send_traversal_probe({ "kind": "join", "room_id": _pending_join_room_id, @@ -1017,13 +895,13 @@ func _configure_upnp_mapping(port: int) -> Dictionary: var mapping_result: int = upnp.add_port_mapping( port, port, - "straywild", + "NETfishing", "UDP", UPNP_MAPPING_DURATION_SECONDS, ) if mapping_result == UPNP.UPNP_RESULT_ONLY_PERMANENT_LEASE_SUPPORTED: mapping_result = upnp.add_port_mapping( - port, port, "straywild", "UDP", 0 + port, port, "NETfishing", "UDP", 0 ) return { "success": mapping_result == UPNP.UPNP_RESULT_SUCCESS, @@ -1130,24 +1008,10 @@ func _valid_public_room(room: Dictionary) -> bool: return ( typeof(room.get("room_id")) == TYPE_STRING and typeof(room.get("room_name")) == TYPE_STRING + and typeof(room.get("address")) == TYPE_STRING and typeof(room.get("game_version")) == TYPE_STRING and str(room.get("game_version")) == expected_version - and str(room.get("connection_mode", "")) in ["direct", "relay"] - and ( - ( - str(room.get("connection_mode", "")) == "direct" - and str(room.get("ip_privacy", "")) == "peer_visible" - ) - or ( - str(room.get("connection_mode", "")) == "relay" - and str(room.get("ip_privacy", "")) == "relayed" - ) - ) - and str(room.get("host_kind", "")) in ["player", "dedicated"] - and not ( - str(room.get("host_kind", "")) == "dedicated" - and str(room.get("connection_mode", "")) == "relay" - ) + and _valid_json_integer(room.get("port"), 1, 65535) and _valid_json_integer(room.get("current_players"), 0, 128) and _valid_json_integer(room.get("max_players"), 1, 128) and int(room["current_players"]) <= int(room["max_players"]) @@ -1173,11 +1037,9 @@ func _valid_json_integer(value: Variant, minimum: int, maximum: int) -> bool: ) -func _make_social_request( - request_name: String, callback: Callable -) -> HTTPRequest: +func _make_social_request(name: String, callback: Callable) -> HTTPRequest: var request := HTTPRequest.new() - request.name = request_name + request.name = name request.timeout = REQUEST_TIMEOUT_SECONDS add_child(request) request.request_completed.connect(callback) @@ -1447,10 +1309,7 @@ func _on_invitation_poll_completed( continue friend_invite_received.emit( fingerprint, - str(friend.get( - "last_known_display_name", - NetworkProfilePreferences.DEFAULT_DISPLAY_NAME, - )), + str(friend.get("last_known_display_name", "Player")), room.duplicate(true), ) @@ -1504,18 +1363,6 @@ func _request_failure(response: Dictionary) -> String: return "Room discovery is temporarily unavailable." -func _host_listing_status(room: Dictionary) -> String: - if str(room.get("connection_mode", "")) == "relay": - return ( - "Room is listed through the privacy relay. Players see a relay " - + "address; the relay service still handles network addresses." - ) - return ( - "Room is listed. Its address is hidden while browsing, but direct " - + "players can see your public IP after joining." - ) - - func _discovery_version_mismatch_message(required_version: String) -> String: var local_version: String = NetworkProtocol.game_version() var rejection: NetworkProtocol.RejectionCode = ( @@ -1527,18 +1374,18 @@ func _discovery_version_mismatch_message(required_version: String) -> String: match rejection: NetworkProtocol.RejectionCode.CLIENT_OUTDATED: return ( - "Your straywild version is out of date. Update to %s to " + "Your NETfishing version is out of date. Update to %s to " + "enable public discovery. This room will not be listed " + "until you update." ) % required_version NetworkProtocol.RejectionCode.SERVER_OUTDATED: return ( - "Public discovery is still on straywild %s. This room " + "Public discovery is still on NETfishing %s. This room " + "will not be listed until discovery is updated for %s." ) % [required_version, local_version] _: return ( - "Public discovery requires straywild %s. This room will " + "Public discovery requires NETfishing %s. This room will " + "not be listed until both versions match." ) % required_version @@ -1639,8 +1486,6 @@ func _clear_pending_join() -> void: _pending_join_endpoint = "" _pending_join_token = "" _pending_join_room_id = "" - _pending_join_room_name = "" - _pending_join_transport = "" _join_probe_timer.stop() @@ -1719,14 +1564,6 @@ func _load_settings() -> void: _presence_sharing = bool(config.get_value( "social", "share_presence", false )) - var saved_connection_mode := str(config.get_value( - "host", "connection_mode", HOST_CONNECTION_DIRECT - )) - if saved_connection_mode in [ - HOST_CONNECTION_DIRECT, - HOST_CONNECTION_RELAY, - ]: - _host_connection_preference = saved_connection_mode func _save_settings() -> void: @@ -1737,10 +1574,7 @@ func _save_settings() -> void: config.set_value( "host", "room_name_uses_default", _room_name_uses_default ) - config.set_value( - "host", "connection_mode", _host_connection_preference - ) config.set_value("social", "share_presence", _presence_sharing) var error: Error = config.save(SETTINGS_PATH) if error != OK: - push_warning("Could not save local straywild discovery settings.") + push_warning("Could not save local NETfishing discovery settings.") diff --git a/network/host_ban_store.gd b/network/host_ban_store.gd index 1251846..f8c4bf9 100644 --- a/network/host_ban_store.gd +++ b/network/host_ban_store.gd @@ -17,10 +17,6 @@ var _data_root: PlayerDataRoot func configure_storage(path: String, data_root: PlayerDataRoot) -> void: _store_path = path _data_root = data_root - _namespaces.clear() - _loaded = false - _write_blocked = false - _expected_hash = "" func is_banned(host_fingerprint: String, target_fingerprint: String) -> bool: diff --git a/network/identity_backup_service.gd b/network/identity_backup_service.gd index c383e7b..ff7396c 100644 --- a/network/identity_backup_service.gd +++ b/network/identity_backup_service.gd @@ -3,8 +3,7 @@ extends Node signal operation_finished(success: bool, message: String) -const MAGIC := "straywild_IDENTITY_BACKUP" -const LEGACY_MAGIC := "NETFISHING_IDENTITY_BACKUP" +const MAGIC := "NETFISHING_IDENTITY_BACKUP" const FORMAT_VERSION := 1 const MAX_BACKUP_BYTES := 256 * 1024 const MIN_PASSPHRASE_LENGTH := 12 @@ -111,9 +110,8 @@ func inspect_backup( if json.parse(text) != OK or typeof(json.data) != TYPE_DICTIONARY: return {"ok": false} var data: Dictionary = json.data - var legacy_backup: bool = data.get("magic") == LEGACY_MAGIC if ( - data.get("magic") not in [MAGIC, LEGACY_MAGIC] + data.get("magic") != MAGIC or data.get("format_version") != FORMAT_VERSION or data.get("identity_type") != expected_type or data.get("algorithm") != NetworkIdentityCrypto.ALGORITHM @@ -136,23 +134,12 @@ func inspect_backup( var signature: PackedByteArray = Marshalls.base64_to_raw( str(data.get("self_signature", "")) ) - var public_key: CryptoKey = NetworkIdentityCrypto.load_public_key(public_pem) - var backup_signature_valid: bool = ( - NetworkIdentityCrypto.verify_legacy_fields( - public_key, - "identity_backup_self_test", - [expected_type, fingerprint], - signature, - ) - if legacy_backup - else NetworkIdentityCrypto.verify_fields( - public_key, - "identity_backup_self_test", - [expected_type, fingerprint], - signature, - ) - ) - if not backup_signature_valid: + if not NetworkIdentityCrypto.verify_fields( + NetworkIdentityCrypto.load_public_key(public_pem), + "identity_backup_self_test", + [expected_type, fingerprint], + signature, + ): return {"ok": false} var fresh: PackedByteArray = NetworkIdentityCrypto.sign_fields( key, "identity_import_self_test", [fingerprint] @@ -202,7 +189,7 @@ func import_backup( ) _finish( bool(result.get("ok", false)), - "Identity imported. Restart straywild before multiplayer." + "Identity imported. Restart NETfishing before multiplayer." if bool(result.get("ok", false)) else "Could not install this identity backup.", ) diff --git a/network/known_player_store.gd b/network/known_player_store.gd index 1118656..0c6b859 100644 --- a/network/known_player_store.gd +++ b/network/known_player_store.gd @@ -15,10 +15,6 @@ var _data_root: PlayerDataRoot func configure_storage(path: String, data_root: PlayerDataRoot) -> void: _store_path = path _data_root = data_root - _records.clear() - _loaded = false - _write_blocked = false - _expected_hash = "" func observe(fingerprint: String, display_name: String) -> String: diff --git a/network/network_chat_protocol.gd b/network/network_chat_protocol.gd index 865edaa..2e91432 100644 --- a/network/network_chat_protocol.gd +++ b/network/network_chat_protocol.gd @@ -15,9 +15,6 @@ static var _invisible_edge_pattern: RegEx = RegEx.create_from_string( static var _visible_content_pattern: RegEx = RegEx.create_from_string( "[^\\s\\p{Z}\\p{Cf}\\x{2800}]" ) -static var _roleplay_separator_pattern: RegEx = RegEx.create_from_string( - "^[\\s\\p{Z}\\p{Cf}\\x{2800}]" -) enum Kind { PLAYER, SYSTEM } @@ -43,40 +40,12 @@ static func sanitize_body(value: Variant) -> String: return result -static func is_roleplay_body(value: Variant) -> bool: - var body: String = sanitize_body(value) - if body.length() < 3 or body.left(3).to_lower() != "/me": - return false - return ( - body.length() == 3 - or _roleplay_separator_pattern.search(body.substr(3, 1)) != null - ) - - -static func roleplay_action(value: Variant) -> String: - var body: String = sanitize_body(value) - if not is_roleplay_body(body): - return "" - return sanitize_body(body.substr(3)) - - -static func valid_user_body(value: Variant) -> bool: - var body: String = sanitize_body(value) - return ( - not body.is_empty() - and ( - not is_roleplay_body(body) - or not roleplay_action(body).is_empty() - ) - ) - - static func validate_request(data: Variant) -> bool: return ( typeof(data) == TYPE_DICTIONARY and _valid_id(data.get("request_id")) and _valid_id(data.get("session_id")) - and valid_user_body(data.get("body")) + and not sanitize_body(data.get("body")).is_empty() and NetworkIdentityCrypto.valid_fingerprint( data.get("sender_fingerprint") ) @@ -98,16 +67,7 @@ static func validate_message(data: Variant) -> bool: and typeof(data.get("sender_peer_id")) == TYPE_INT and typeof(data.get("sender_display_name")) == TYPE_STRING and str(data["sender_display_name"]).length() <= 24 - and ( - ( - int(data["kind"]) == Kind.SYSTEM - and not sanitize_body(data.get("body")).is_empty() - ) - or ( - int(data["kind"]) == Kind.PLAYER - and valid_user_body(data.get("body")) - ) - ) + and not sanitize_body(data.get("body")).is_empty() and NetworkIdentityCrypto.valid_fingerprint( data.get("sender_fingerprint") ) diff --git a/network/network_chat_service.gd b/network/network_chat_service.gd index 8dc4c9a..55ba768 100644 --- a/network/network_chat_service.gd +++ b/network/network_chat_service.gd @@ -115,10 +115,7 @@ func send_local_message( send_rejected.emit("Chat is unavailable.") return false var clean := NetworkChatProtocol.sanitize_body(body) - if not NetworkChatProtocol.valid_user_body(clean): - if NetworkChatProtocol.is_roleplay_body(clean): - send_rejected.emit("Usage: /me [action].") - return false + if clean.is_empty(): send_rejected.emit("Message is empty or too long.") return false var request := { @@ -343,12 +340,11 @@ func _handle_request(peer_id: int, data: Dictionary) -> void: message["request_id"] = request_id message["sender_fingerprint"] = data["sender_fingerprint"] message["sender_signature"] = data["sender_signature"] - # `true` is the intentional no-history replay sentinel. It records that the - # request was handled without retaining a message payload for replay. - var ledger_entry: Variant = true - if _should_store_host_history(): - ledger_entry = message.duplicate(true) - ledger[request_id] = ledger_entry + ledger[request_id] = ( + message.duplicate(true) + if _should_store_host_history() + else true + ) while ledger.size() > 64: ledger.erase(ledger.keys().front()) _request_ledgers[peer_id] = ledger @@ -415,7 +411,6 @@ func _apply_message( return var kind := int(data["kind"]) var valid_signature := false - var canonical_sender_name: String = "" if kind == NetworkChatProtocol.Kind.SYSTEM: valid_signature = _session.verify_host_action( "chat_system", @@ -428,7 +423,6 @@ func _apply_message( if record == null: _queue_pending_peer_message(sender_id, data, emit_live_signals) return - canonical_sender_name = record.display_name.left(24) valid_signature = ( record.identity_fingerprint == str(data["sender_fingerprint"]) and _session.verify_peer_action( @@ -442,10 +436,6 @@ func _apply_message( return _seen_messages[data["message_id"]] = true var stored_message := data.duplicate(true) - if kind == NetworkChatProtocol.Kind.PLAYER: - # The authenticated peer registry, not sender-controlled message data, - # owns the name shown beside chat and roleplay actions. - stored_message["sender_display_name"] = canonical_sender_name # Suppression is immutable for this received copy. Relationship changes # later must never resurrect text that was hidden on arrival. stored_message["locally_suppressed"] = ( @@ -557,9 +547,7 @@ func _on_peer_removed(peer_id: int) -> void: _pending_peer_messages.erase(peer_id) if not _session.is_host(): return - var display_name: String = _peer_names.get( - peer_id, NetworkProfilePreferences.DEFAULT_DISPLAY_NAME - ) + var display_name: String = _peer_names.get(peer_id, "Player") _peer_names.erase(peer_id) _broadcast(_make_message( NetworkChatProtocol.Kind.SYSTEM, 0, "", "%s left." % display_name diff --git a/network/network_home_protocol.gd b/network/network_home_protocol.gd deleted file mode 100644 index 96756e9..0000000 --- a/network/network_home_protocol.gd +++ /dev/null @@ -1,188 +0,0 @@ -class_name NetworkHomeProtocol -extends RefCounted - -const PlayerHomeStateType = preload("res://homes/player_home_state.gd") - -const CAPABILITY: StringName = &"portable_home_v1" -const RELIABLE_CHANNEL: int = NetworkProtocol.HOME_RELIABLE_CHANNEL -const MAX_ID_LENGTH: int = 96 -const MAX_MESSAGE_LENGTH: int = 160 -const MAX_TRANSITION_COORDINATE: float = 10000.0 -const WORLD_SPACE: StringName = &"world" - -enum TransitionAction { - ENTER, - EXIT, -} - - -static func make_space_id(owner_fingerprint: String) -> StringName: - return StringName("rv:%s" % owner_fingerprint) - - -static func manifest_digest(home_data: Dictionary) -> String: - var sanitized: Dictionary = PlayerHomeStateType.sanitize_save_data(home_data) - if sanitized.is_empty(): - return "" - var canonical_owned: Array[Dictionary] = [] - var owned: Dictionary = sanitized["owned_decor"] - var owned_ids: Array[String] = [] - for value: Variant in owned.keys(): - owned_ids.append(str(value)) - owned_ids.sort() - for decor_id: String in owned_ids: - canonical_owned.append({ - "id": decor_id, - "quantity": int(owned[decor_id]), - }) - var placements: Array[Dictionary] = [] - for value: Variant in sanitized["placements"]: - placements.append((value as Dictionary).duplicate(true)) - placements.sort_custom(func(first: Dictionary, second: Dictionary) -> bool: - return str(first["instance_id"]) < str(second["instance_id"]) - ) - var canonical: Dictionary = { - "schema_version": int(sanitized["schema_version"]), - "tier": int(sanitized["tier"]), - "exterior_id": str(sanitized["exterior_id"]), - "privacy": int(sanitized["privacy"]), - "owned": canonical_owned, - "placements": placements, - "revision": int(sanitized["revision"]), - "next_instance_sequence": int(sanitized["next_instance_sequence"]), - } - return JSON.stringify(canonical).sha256_text() - - -static func manifest_signature_fields(data: Dictionary) -> Array: - return [ - str(data.get("session_id", "")), - str(data.get("request_id", "")), - str(data.get("owner_fingerprint", "")), - int((data.get("home", {}) as Dictionary).get("revision", -1)), - str(data.get("digest", "")), - ] - - -static func validate_manifest_request(value: Variant) -> bool: - if typeof(value) != TYPE_DICTIONARY: - return false - var data: Dictionary = value - if ( - not _valid_id(data.get("request_id")) - or not _valid_id(data.get("session_id")) - or not NetworkIdentityCrypto.valid_fingerprint( - data.get("owner_fingerprint") - ) - or typeof(data.get("home")) != TYPE_DICTIONARY - or typeof(data.get("digest")) != TYPE_STRING - or str(data["digest"]).length() != 64 - or typeof(data.get("sender_signature")) != TYPE_PACKED_BYTE_ARRAY - ): - return false - var sanitized: Dictionary = PlayerHomeStateType.sanitize_save_data( - data["home"] - ) - return ( - not sanitized.is_empty() - and manifest_digest(sanitized) == str(data["digest"]) - ) - - -static func validate_manifest_broadcast(value: Variant) -> bool: - if typeof(value) != TYPE_DICTIONARY: - return false - var data: Dictionary = value - return ( - typeof(data.get("owner_peer_id")) == TYPE_INT - and int(data["owner_peer_id"]) > 0 - and NetworkIdentityCrypto.valid_fingerprint( - data.get("owner_fingerprint") - ) - and typeof(data.get("home")) == TYPE_DICTIONARY - and not PlayerHomeStateType.sanitize_save_data(data["home"]).is_empty() - and _valid_transform(data.get("exterior_transform")) - and typeof(data.get("interior_index")) == TYPE_INT - and int(data["interior_index"]) >= 0 - and int(data["interior_index"]) < 128 - ) - - -static func transition_signature_fields(data: Dictionary) -> Array: - return [ - str(data.get("session_id", "")), - str(data.get("request_id", "")), - int(data.get("action", -1)), - str(data.get("owner_fingerprint", "")), - ] - - -static func validate_transition_request(value: Variant) -> bool: - if typeof(value) != TYPE_DICTIONARY: - return false - var data: Dictionary = value - return ( - _valid_id(data.get("request_id")) - and _valid_id(data.get("session_id")) - and typeof(data.get("action")) == TYPE_INT - and int(data["action"]) >= TransitionAction.ENTER - and int(data["action"]) <= TransitionAction.EXIT - and NetworkIdentityCrypto.valid_fingerprint( - data.get("owner_fingerprint") - ) - and typeof(data.get("sender_signature")) == TYPE_PACKED_BYTE_ARRAY - ) - - -static func transform_to_array(value: Transform3D) -> Array[float]: - return [ - value.basis.x.x, value.basis.x.y, value.basis.x.z, - value.basis.y.x, value.basis.y.y, value.basis.y.z, - value.basis.z.x, value.basis.z.y, value.basis.z.z, - value.origin.x, value.origin.y, value.origin.z, - ] - - -static func array_to_transform(value: Variant) -> Transform3D: - if not validate_transition_transform(value): - return Transform3D() - var fields: Array = value - return Transform3D( - Basis( - Vector3(float(fields[0]), float(fields[1]), float(fields[2])), - Vector3(float(fields[3]), float(fields[4]), float(fields[5])), - Vector3(float(fields[6]), float(fields[7]), float(fields[8])), - ), - Vector3(float(fields[9]), float(fields[10]), float(fields[11])), - ) - - -static func validate_transition_transform(value: Variant) -> bool: - if not _valid_transform(value): - return false - var fields: Array = value - return ( - absf(float(fields[9])) <= MAX_TRANSITION_COORDINATE - and absf(float(fields[10])) <= MAX_TRANSITION_COORDINATE - and absf(float(fields[11])) <= MAX_TRANSITION_COORDINATE - ) - - -static func _valid_transform(value: Variant) -> bool: - if typeof(value) != TYPE_ARRAY or (value as Array).size() != 12: - return false - for component: Variant in value: - if ( - typeof(component) not in [TYPE_FLOAT, TYPE_INT] - or not is_finite(float(component)) - ): - return false - return true - - -static func _valid_id(value: Variant) -> bool: - return ( - typeof(value) == TYPE_STRING - and not str(value).is_empty() - and str(value).length() <= MAX_ID_LENGTH - ) diff --git a/network/network_home_protocol.gd.uid b/network/network_home_protocol.gd.uid deleted file mode 100644 index 24b6aae..0000000 --- a/network/network_home_protocol.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://fl3qwiluejhm diff --git a/network/network_home_service.gd b/network/network_home_service.gd deleted file mode 100644 index 6f78cd6..0000000 --- a/network/network_home_service.gd +++ /dev/null @@ -1,1458 +0,0 @@ -class_name NetworkHomeService -extends Node - -const NetworkHomeProtocolType = preload( - "res://network/network_home_protocol.gd" -) -const PlayerHomeStateType = preload("res://homes/player_home_state.gd") -const DecorCatalogType = preload("res://homes/decor_catalog.gd") -const OwnedItemType = preload("res://items/owned_item.gd") - -signal local_transition_finished(accepted: bool, message: String) -signal local_space_changed(space_id: StringName, owner_fingerprint: String) -signal local_manifest_rejected(message: String) - -const MAX_MANIFESTS: int = 128 -const MAX_PENDING_LOCAL_DECOR_TRANSACTIONS: int = 16 - -var _session: NetworkSession -var _spawn_service: PlayerSpawnService -var _local_home: PlayerHomeStateType -var _save_manager: PlayerSaveManager -var _world_service: HomeWorldService -var _bag: PlayerBag -var _inventory_layout: PlayerInventoryLayout -var _hotbar: PlayerHotbar -var _manifests_by_fingerprint: Dictionary[String, Dictionary] = {} -var _fingerprint_by_peer: Dictionary[int, String] = {} -var _authorized_owned_counts: Dictionary[int, Dictionary] = {} -var _authorization_result_owner: Dictionary[String, int] = {} -var _authorized_home_tiers: Dictionary[int, int] = {} -var _home_upgrade_result_owner: Dictionary[String, int] = {} -var _interior_slots_by_space: Dictionary[StringName, Dictionary] = {} -var _next_interior_index: int = 0 -var _suppress_local_submission: bool = false -var _publish_queued: bool = false -var _last_submitted_local_home_revision: int = -1 -var _pending_local_decor_transactions: Dictionary[int, Dictionary] = {} - - -func setup( - session: NetworkSession, - spawn_service: PlayerSpawnService, - local_home: PlayerHomeStateType, - save_manager: PlayerSaveManager, - world_service: HomeWorldService, - bag: PlayerBag, - inventory_layout: PlayerInventoryLayout, - hotbar: PlayerHotbar, -) -> void: - _session = session - _spawn_service = spawn_service - _local_home = local_home - _save_manager = save_manager - _world_service = world_service - _bag = bag - _inventory_layout = inventory_layout - _hotbar = hotbar - if not _session.state_changed.is_connected(_on_session_state_changed): - _session.state_changed.connect(_on_session_state_changed) - if not _session.join_authenticated.is_connected(_on_join_authenticated): - _session.join_authenticated.connect(_on_join_authenticated) - if not _session.peer_authenticated.is_connected(_on_peer_authenticated): - _session.peer_authenticated.connect(_on_peer_authenticated) - if not _session.peer_removed.is_connected(_on_peer_removed): - _session.peer_removed.connect(_on_peer_removed) - if not _spawn_service.avatar_spawned.is_connected(_on_avatar_spawned): - _spawn_service.avatar_spawned.connect(_on_avatar_spawned) - if not _local_home.changed.is_connected(_on_local_home_changed): - _local_home.changed.connect(_on_local_home_changed) - - -func get_local_space() -> StringName: - if _session == null or not _session.is_gameplay_session_active(): - return NetworkHomeProtocolType.WORLD_SPACE - return _session.get_peer_space(_session.get_local_peer_id()) - - -func get_local_home_owner_fingerprint() -> String: - var space_id: String = String(get_local_space()) - return space_id.trim_prefix("rv:") if space_id.begins_with("rv:") else "" - - -func can_local_decorate() -> bool: - return ( - get_local_home_owner_fingerprint() - == _session.get_local_identity_fingerprint() - ) - - -func has_pending_local_decor_mutation() -> bool: - return not _pending_local_decor_transactions.is_empty() - - -func get_authoritative_owned_count( - peer_id: int, - decor_id: StringName, -) -> int: - var authorized: Dictionary = _authorized_owned_counts.get(peer_id, {}) - if authorized.has(String(decor_id)): - return int(authorized[String(decor_id)]) - var fingerprint: String = _fingerprint_for_peer(peer_id) - var manifest: Dictionary = _manifests_by_fingerprint.get(fingerprint, {}) - if manifest.is_empty(): - return -1 - var home: Dictionary = manifest.get("home", {}) - var owned: Dictionary = home.get("owned_decor", {}) - return int(owned.get(String(decor_id), 0)) - - -func get_authoritative_home_tier(peer_id: int) -> int: - if _authorized_home_tiers.has(peer_id): - return int(_authorized_home_tiers[peer_id]) - var fingerprint: String = _fingerprint_for_peer(peer_id) - var manifest: Dictionary = _manifests_by_fingerprint.get(fingerprint, {}) - if manifest.is_empty(): - return -1 - var home: Dictionary = manifest.get("home", {}) - return int(home.get("tier", -1)) - - -func place_local_decor( - decor_id: StringName, - position: Vector3, - yaw_radians: float, - mode: PlayerHomeStateType.PlacementMode, -) -> String: - if ( - not can_local_decorate() - or has_pending_local_decor_mutation() - or _bag == null - or _bag.get_quantity(decor_id) <= 0 - or _world_service == null - ): - return "" - var owner_fingerprint: String = ( - _session.get_local_identity_fingerprint() - ) - var normalized: Dictionary = ( - _local_home.get_nearest_valid_placement_transform( - decor_id, - position, - yaw_radians, - mode, - "", - Callable( - self, "_candidate_clear_of_players" - ).bind(owner_fingerprint, decor_id), - ) - ) - if normalized.is_empty(): - return "" - var transaction: Dictionary = _capture_local_decor_transaction() - if transaction.is_empty(): - return "" - _suppress_local_submission = true - var instance_id: String = _local_home.place_decor( - decor_id, - normalized["position"], - float(normalized["yaw"]), - mode, - ) - if instance_id.is_empty(): - _suppress_local_submission = false - return "" - if not _bag.remove_item(decor_id, 1): - _local_home.remove_placement(instance_id) - _suppress_local_submission = false - return "" - _suppress_local_submission = false - if not _commit_local_decor_transaction(transaction): - return "" - return instance_id - - -func remove_local_decor(instance_id: String) -> bool: - if ( - not can_local_decorate() - or has_pending_local_decor_mutation() - or _bag == null - or _inventory_layout == null - or _hotbar == null - ): - return false - var placement: Dictionary = _local_home.get_placement(instance_id) - if placement.is_empty(): - return false - var transaction: Dictionary = _capture_local_decor_transaction() - if transaction.is_empty(): - return false - var decor_id := StringName(str(placement["decor_id"])) - var target_hotbar_slot: int = _hotbar.find_item_slot(decor_id) - if target_hotbar_slot < 0: - target_hotbar_slot = _hotbar.find_first_empty_slot() - var prepared_hotbar_placement: bool = false - if ( - target_hotbar_slot >= 0 - and _inventory_layout.get_container( - PlayerInventoryLayout.EntryKind.ITEM, - decor_id, - ) < 0 - ): - prepared_hotbar_placement = ( - _inventory_layout.prepare_new_item_placement( - decor_id, - PlayerInventoryLayout.InventoryContainer.HOTBAR, - target_hotbar_slot, - ) - ) - var returned_to_inventory: bool = _bag.add_item(decor_id, 1) - if not returned_to_inventory: - if prepared_hotbar_placement: - _inventory_layout.cancel_prepared_item_placement(decor_id) - returned_to_inventory = _bag.add_item_to_storage(decor_id, 1) - if not returned_to_inventory: - if prepared_hotbar_placement: - _inventory_layout.cancel_prepared_item_placement(decor_id) - return false - if target_hotbar_slot >= 0: - _hotbar.assign_item(target_hotbar_slot, decor_id) - _hotbar.select_slot(target_hotbar_slot) - _suppress_local_submission = true - if not _local_home.remove_placement(instance_id): - _suppress_local_submission = false - _restore_local_decor_transaction(transaction) - return false - _suppress_local_submission = false - if not _commit_local_decor_transaction(transaction): - return false - return true - - -func update_local_decor( - instance_id: String, - position: Vector3, - yaw_radians: float, - mode: PlayerHomeStateType.PlacementMode, -) -> bool: - if has_pending_local_decor_mutation(): - return false - var normalized: Dictionary = get_valid_local_decor_transform( - instance_id, position, yaw_radians, mode - ) - if normalized.is_empty(): - return false - var transaction: Dictionary = _capture_local_decor_transaction() - if transaction.is_empty(): - return false - _suppress_local_submission = true - if not _local_home.update_placement( - instance_id, - normalized["position"], - float(normalized["yaw"]), - mode, - ): - _suppress_local_submission = false - return false - _suppress_local_submission = false - if not _commit_local_decor_transaction(transaction): - return false - return true - - -func get_valid_local_decor_transform( - instance_id: String, - position: Vector3, - yaw_radians: float, - mode: PlayerHomeStateType.PlacementMode, -) -> Dictionary: - if not can_local_decorate() or _world_service == null: - return {} - var placement: Dictionary = _local_home.get_placement(instance_id) - if placement.is_empty(): - return {} - var decor_id := StringName(str(placement.get("decor_id", ""))) - return _local_home.get_valid_update_transform( - instance_id, - position, - yaw_radians, - mode, - Callable( - self, "_candidate_clear_of_players" - ).bind( - _session.get_local_identity_fingerprint(), decor_id - ), - ) - - -func _candidate_clear_of_players( - candidate: Dictionary, - owner_fingerprint: String, - decor_id: StringName, -) -> bool: - return ( - _world_service != null - and _world_service.is_decor_placement_clear_of_players( - owner_fingerprint, - decor_id, - candidate["position"], - float(candidate["yaw"]), - ) - ) - - -func request_enter(owner_fingerprint: String) -> bool: - if ( - _session == null - or not _session.is_gameplay_session_active() - or not _manifests_by_fingerprint.has(owner_fingerprint) - or get_local_space() != NetworkHomeProtocolType.WORLD_SPACE - ): - return false - return _submit_transition( - NetworkHomeProtocolType.TransitionAction.ENTER, - owner_fingerprint, - ) - - -func request_exit() -> bool: - var owner_fingerprint: String = get_local_home_owner_fingerprint() - if owner_fingerprint.is_empty(): - return false - return _submit_transition( - NetworkHomeProtocolType.TransitionAction.EXIT, - owner_fingerprint, - ) - - -func authorize_decor_purchase( - peer_id: int, - product_id: StringName, - resulting_count: int, - result_id: String, -) -> void: - if not _session.is_host() or peer_id <= 0 or result_id.is_empty(): - return - var counts: Dictionary = _authorized_owned_counts.get(peer_id, {}) - counts[String(product_id)] = resulting_count - _authorized_owned_counts[peer_id] = counts - _authorization_result_owner[result_id] = peer_id - - -func finalize_decor_purchase( - peer_id: int, - result_id: String, - applied: bool, -) -> void: - if _authorization_result_owner.get(result_id, 0) != peer_id: - return - _authorization_result_owner.erase(result_id) - if applied: - return - _authorized_owned_counts.erase(peer_id) - - -func authorize_home_upgrade( - peer_id: int, - resulting_tier: int, - result_id: String, -) -> void: - if ( - not _session.is_host() - or peer_id <= 0 - or result_id.is_empty() - or resulting_tier < PlayerHomeStateType.STARTER_TIER - or resulting_tier > PlayerHomeStateType.MAX_TIER - ): - return - _authorized_home_tiers[peer_id] = resulting_tier - _home_upgrade_result_owner[result_id] = peer_id - - -func finalize_home_upgrade( - peer_id: int, - result_id: String, - applied: bool, -) -> void: - if _home_upgrade_result_owner.get(result_id, 0) != peer_id: - return - _home_upgrade_result_owner.erase(result_id) - if not applied: - _authorized_home_tiers.erase(peer_id) - - -func refresh_world_presentations() -> void: - if _world_service == null: - return - _world_service.clear_presentations() - if not _world_service.is_world_ready(): - return - if not _session.is_host(): - for manifest: Dictionary in _manifests_by_fingerprint.values(): - _world_service.apply_manifest(manifest) - return - var local_fingerprint: String = _session.get_local_identity_fingerprint() - if ( - not _session.is_dedicated_host() - and not _manifests_by_fingerprint.has(local_fingerprint) - ): - publish_local_home() - var fingerprints: Array[String] = [] - fingerprints.assign(_manifests_by_fingerprint.keys()) - fingerprints.sort() - var reserved: Array[Transform3D] = [] - for fingerprint: String in fingerprints: - var manifest: Dictionary = _manifests_by_fingerprint[fingerprint] - var transform: Transform3D = _world_service.choose_exterior_transform( - int(manifest["owner_peer_id"]), reserved - ) - reserved.append(transform) - manifest["exterior_transform"] = ( - NetworkHomeProtocolType.transform_to_array(transform) - ) - _manifests_by_fingerprint[fingerprint] = manifest - _broadcast_manifest(manifest) - for fingerprint: String in fingerprints: - var manifest: Dictionary = _manifests_by_fingerprint[fingerprint] - _spawn_peer_at_exterior( - int(manifest["owner_peer_id"]), fingerprint - ) - - -func publish_local_home( - allow_pending_decor_transaction: bool = false, -) -> bool: - if ( - _session == null - or not _session.is_gameplay_session_active() - or _session.is_dedicated_host() - or _local_home == null - ): - return false - # A purchase can update the owned decor count while an optimistic placement - # is waiting on the host. Hold that follow-up manifest until the placement is - # accepted or rolled back; otherwise it can carry the still-unverified - # placement and turn one rejection into a second stale rejection. - if ( - not allow_pending_decor_transaction - and has_pending_local_decor_mutation() - ): - _publish_queued = true - return true - if _session.is_host() and ( - _world_service == null or not _world_service.is_world_ready() - ): - return false - var home_data: Dictionary = _local_home.to_save_data() - var revision: int = int(home_data.get("revision", -1)) - if revision >= 0 and revision == _last_submitted_local_home_revision: - return true - var request: Dictionary = { - "request_id": _new_id("home"), - "session_id": _session.get_session_id(), - "owner_fingerprint": _session.get_local_identity_fingerprint(), - "home": home_data, - "digest": NetworkHomeProtocolType.manifest_digest(home_data), - } - request["sender_signature"] = _session.sign_local_action( - "portable_home_manifest", - NetworkHomeProtocolType.manifest_signature_fields(request), - ) - _last_submitted_local_home_revision = revision - if _session.is_host(): - _process_manifest_request(_session.get_local_peer_id(), request) - else: - submit_home_manifest.rpc_id(1, request) - return true - - -@rpc( - "any_peer", "call_remote", "reliable", - NetworkHomeProtocolType.RELIABLE_CHANNEL, -) -func submit_home_manifest(data: Dictionary) -> void: - var sender_id: int = multiplayer.get_remote_sender_id() - if ( - _session == null - or not _session.is_host() - or not _session.is_authenticated_peer(sender_id) - ): - return - _process_manifest_request(sender_id, data) - - -func _process_manifest_request(peer_id: int, data: Dictionary) -> void: - if ( - not NetworkHomeProtocolType.validate_manifest_request(data) - or str(data["session_id"]) != _session.get_session_id() - ): - _reject_manifest(peer_id, "The home update was invalid.") - return - var record := _session.get_peer_record(peer_id) - var fingerprint: String = str(data["owner_fingerprint"]) - if ( - record == null - or record.identity_fingerprint != fingerprint - or not _session.verify_peer_action( - peer_id, - "portable_home_manifest", - NetworkHomeProtocolType.manifest_signature_fields(data), - data["sender_signature"], - ) - ): - _reject_manifest(peer_id, "The home owner could not be verified.") - return - var home_data: Dictionary = PlayerHomeStateType.sanitize_save_data( - data["home"] - ) - var prior: Dictionary = _manifests_by_fingerprint.get(fingerprint, {}) - var is_first_manifest: bool = prior.is_empty() - if not _valid_manifest_revision(peer_id, prior, home_data): - _reject_manifest(peer_id, "The home update was rejected by the host.") - return - if not _moved_decor_clear_of_players(fingerprint, prior, home_data): - _reject_manifest(peer_id, "A player is in the way of that decor.") - return - var manifest: Dictionary - if prior.is_empty(): - if _manifests_by_fingerprint.size() >= MAX_MANIFESTS: - _reject_manifest(peer_id, "This room cannot place another home.") - return - var reserved: Array[Transform3D] = [] - for existing: Dictionary in _manifests_by_fingerprint.values(): - reserved.append(NetworkHomeProtocolType.array_to_transform( - existing["exterior_transform"] - )) - var exterior_transform: Transform3D = ( - _world_service.choose_exterior_transform(peer_id, reserved) - ) - manifest = { - "owner_peer_id": peer_id, - "owner_fingerprint": fingerprint, - "home": home_data, - "exterior_transform": ( - NetworkHomeProtocolType.transform_to_array(exterior_transform) - ), - "interior_index": _next_interior_index, - } - _next_interior_index += 1 - else: - manifest = prior.duplicate(true) - manifest["home"] = home_data - manifest["owner_peer_id"] = peer_id - _manifests_by_fingerprint[fingerprint] = manifest - _fingerprint_by_peer[peer_id] = fingerprint - _consume_owned_authorizations(peer_id, home_data) - if peer_id == _session.get_local_peer_id(): - _discard_local_decor_transactions_through( - int(home_data.get("revision", -1)) - ) - if _last_submitted_local_home_revision == int( - home_data.get("revision", -1) - ): - _last_submitted_local_home_revision = -1 - _flush_queued_local_home_publish() - _broadcast_manifest(manifest) - if is_first_manifest: - _spawn_peer_at_exterior(peer_id, fingerprint) - - -func _valid_manifest_revision( - peer_id: int, - prior_manifest: Dictionary, - home_data: Dictionary, -) -> bool: - if prior_manifest.is_empty(): - # A portable RV is owned by the player's signed local save. A new host has - # no prior room ledger with which to compare its first manifest. - return true - var prior_home: Dictionary = prior_manifest["home"] - var prior_tier: int = int(prior_home["tier"]) - var next_tier: int = int(home_data["tier"]) - var tier_is_authorized: bool = ( - next_tier != prior_tier - and int(_authorized_home_tiers.get(peer_id, -1)) == next_tier - ) - if ( - int(home_data["revision"]) <= int(prior_home["revision"]) - or (next_tier != prior_tier and not tier_is_authorized) - or str(home_data["exterior_id"]) - != str(PlayerHomeStateType.exterior_id_for_tier(next_tier)) - ): - return false - var prior_owned: Dictionary = prior_home["owned_decor"] - var next_owned: Dictionary = home_data["owned_decor"] - var all_ids: Dictionary[String, bool] = {} - for value: Variant in prior_owned.keys(): - all_ids[str(value)] = true - for value: Variant in next_owned.keys(): - all_ids[str(value)] = true - var authorized: Dictionary = _authorized_owned_counts.get(peer_id, {}) - for product_id: String in all_ids: - var prior_count: int = int(prior_owned.get(product_id, 0)) - var next_count: int = int(next_owned.get(product_id, 0)) - if prior_count == next_count: - continue - if next_count < prior_count or int(authorized.get(product_id, -1)) != next_count: - return false - return true - - -func _moved_decor_clear_of_players( - owner_fingerprint: String, - prior_manifest: Dictionary, - home_data: Dictionary, -) -> bool: - if _world_service == null: - return false - var prior_by_instance: Dictionary[String, Dictionary] = {} - if not prior_manifest.is_empty(): - var prior_home: Dictionary = prior_manifest.get("home", {}) - for value: Variant in prior_home.get("placements", []): - if typeof(value) != TYPE_DICTIONARY: - continue - var prior_placement: Dictionary = value - prior_by_instance[str( - prior_placement.get("instance_id", "") - )] = prior_placement - for value: Variant in home_data.get("placements", []): - if typeof(value) != TYPE_DICTIONARY: - return false - var placement: Dictionary = value - var instance_id: String = str(placement.get("instance_id", "")) - var prior_placement: Dictionary = prior_by_instance.get( - instance_id, {} - ) - if ( - not prior_placement.is_empty() - and _same_decor_transform(prior_placement, placement) - ): - continue - var decor_id := StringName(str(placement.get("decor_id", ""))) - var position: Vector3 = _placement_position(placement) - if ( - not position.is_finite() - or not _world_service.is_decor_placement_clear_of_players( - owner_fingerprint, - decor_id, - position, - float(placement.get("yaw", 0.0)), - ) - ): - return false - return true - - -static func _same_decor_transform( - first: Dictionary, - second: Dictionary, -) -> bool: - if str(first.get("decor_id", "")) != str(second.get("decor_id", "")): - return false - var first_position: Vector3 = _placement_position(first) - var second_position: Vector3 = _placement_position(second) - return ( - first_position.is_equal_approx(second_position) - and is_equal_approx( - float(first.get("yaw", 0.0)), - float(second.get("yaw", 0.0)), - ) - ) - - -static func _placement_position(placement: Dictionary) -> Vector3: - var values: Array = placement.get("position", []) - if values.size() != 3: - return Vector3.INF - return Vector3( - float(values[0]), float(values[1]), float(values[2]) - ) - - -func _consume_owned_authorizations(peer_id: int, home_data: Dictionary) -> void: - if ( - _authorized_home_tiers.has(peer_id) - and int(home_data["tier"]) == int(_authorized_home_tiers[peer_id]) - ): - _authorized_home_tiers.erase(peer_id) - var authorized: Dictionary = _authorized_owned_counts.get(peer_id, {}) - if authorized.is_empty(): - return - var owned: Dictionary = home_data["owned_decor"] - for product_id: String in authorized.keys(): - if int(owned.get(product_id, -1)) == int(authorized[product_id]): - authorized.erase(product_id) - if authorized.is_empty(): - _authorized_owned_counts.erase(peer_id) - else: - _authorized_owned_counts[peer_id] = authorized - - -func _broadcast_manifest(manifest: Dictionary) -> void: - if _world_service != null and _world_service.is_world_ready(): - _world_service.apply_manifest(manifest) - for peer_id: int in _session.get_authenticated_peer_ids(): - if peer_id == 1: - continue - receive_home_manifest.rpc_id(peer_id, manifest) - - -@rpc( - "authority", "call_remote", "reliable", - NetworkHomeProtocolType.RELIABLE_CHANNEL, -) -func receive_home_manifest(data: Dictionary) -> void: - if not NetworkHomeProtocolType.validate_manifest_broadcast(data): - return - var fingerprint: String = str(data["owner_fingerprint"]) - _manifests_by_fingerprint[fingerprint] = data.duplicate(true) - _fingerprint_by_peer[int(data["owner_peer_id"])] = fingerprint - if fingerprint == _session.get_local_identity_fingerprint(): - var home: Dictionary = data.get("home", {}) - _discard_local_decor_transactions_through( - int(home.get("revision", -1)) - ) - if _last_submitted_local_home_revision == int( - home.get("revision", -1) - ): - _last_submitted_local_home_revision = -1 - _flush_queued_local_home_publish() - if _world_service != null and _world_service.is_world_ready(): - _world_service.apply_manifest(data) - - -func _reject_manifest(peer_id: int, message: String) -> void: - var fingerprint: String = _fingerprint_for_peer(peer_id) - var canonical: Dictionary = _manifests_by_fingerprint.get(fingerprint, {}) - if peer_id == _session.get_local_peer_id(): - _apply_manifest_rejection(message, canonical) - else: - receive_home_manifest_rejection.rpc_id(peer_id, message, canonical) - - -@rpc( - "authority", "call_remote", "reliable", - NetworkHomeProtocolType.RELIABLE_CHANNEL, -) -func receive_home_manifest_rejection( - message: String, - canonical: Dictionary, -) -> void: - _apply_manifest_rejection(message, canonical) - - -func _apply_manifest_rejection(message: String, canonical: Dictionary) -> void: - _last_submitted_local_home_revision = -1 - var canonical_home: Dictionary = canonical.get("home", {}) - var canonical_revision: int = int(canonical_home.get("revision", -1)) - var transaction: Dictionary = _get_local_decor_rejection_transaction( - canonical_revision - ) - if canonical.is_empty() or not NetworkHomeProtocolType.validate_manifest_broadcast(canonical): - if not transaction.is_empty(): - _restore_local_decor_transaction(transaction) - _pending_local_decor_transactions.clear() - if _save_manager != null and not _save_manager.save_if_dirty(): - push_warning("Unable to save the restored RV decor state.") - _flush_queued_local_home_publish() - local_manifest_rejected.emit(message) - return - # A shop result can be accepted locally while its own home manifest is still - # in flight. A delayed rejection for an earlier placement must not erase that - # accepted purchase just because the host's canonical manifest predates it. - var locally_owned_decor: Dictionary[StringName, int] = ( - _capture_local_owned_decor_counts() - ) - # Only carry ownership forward across an actual pending decor-action - # rejection. A standalone rejected manifest must remain authoritative rather - # than repeatedly re-submitting an unverified owned-count increase. - var has_owned_decor_increase: bool = ( - not transaction.is_empty() - and _has_local_owned_decor_increase( - locally_owned_decor, - canonical_home, - ) - ) - _suppress_local_submission = true - var restored: bool = _local_home.restore_from_save_data(canonical_home) - var owned_decor_restored: bool = ( - restored - and ( - not has_owned_decor_increase - or _restore_local_owned_decor_increases(locally_owned_decor) - ) - ) - var reconciled: bool = ( - restored - and owned_decor_restored - and _reconcile_local_decor_inventory(transaction) - ) - _suppress_local_submission = false - _discard_local_decor_transactions_after(canonical_revision) - if not reconciled: - push_error("Unable to reconcile RV decor after a host rejection.") - elif _save_manager != null and not _save_manager.save_if_dirty(): - push_warning("Unable to save the restored RV decor state.") - receive_home_manifest(canonical) - if reconciled and has_owned_decor_increase: - # Submit the preserved purchase as a fresh revision after applying the - # canonical placement rollback. This is deliberately separate from the - # rejected action, so the host can validate the already-authorized count. - if not publish_local_home(): - push_warning("Unable to publish the restored RV decor ownership.") - local_manifest_rejected.emit(message) - - -func _capture_local_decor_transaction() -> Dictionary: - if ( - _local_home == null - or _bag == null - or _inventory_layout == null - or _hotbar == null - ): - return {} - var saved_items: Array[OwnedItemType] = [] - for item: OwnedItemType in _bag.get_all_items(): - saved_items.append(item.duplicate_record()) - return { - "home": _local_home.to_save_data(), - "bag_items": saved_items, - "layout": _inventory_layout.to_save_data(), - "hotbar_slots": _hotbar.get_slots(), - "hotbar_fish_slots": _hotbar.get_fish_slots(), - "selected_hotbar_slot": _hotbar.get_selected_slot(), - } - - -func _capture_local_owned_decor_counts() -> Dictionary[StringName, int]: - var counts: Dictionary[StringName, int] = {} - if _local_home == null: - return counts - for decor_id: StringName in DecorCatalogType.get_product_ids(): - counts[decor_id] = _local_home.get_owned_count(decor_id) - return counts - - -func _has_local_owned_decor_increase( - local_counts: Dictionary[StringName, int], - canonical_home: Dictionary, -) -> bool: - var canonical_owned: Dictionary = canonical_home.get("owned_decor", {}) - for decor_id: StringName in DecorCatalogType.get_product_ids(): - if int(local_counts.get(decor_id, 0)) > int( - canonical_owned.get(String(decor_id), 0) - ): - return true - return false - - -func _restore_local_owned_decor_increases( - local_counts: Dictionary[StringName, int], -) -> bool: - if _local_home == null: - return false - for decor_id: StringName in DecorCatalogType.get_product_ids(): - var local_count: int = int(local_counts.get(decor_id, 0)) - var canonical_count: int = _local_home.get_owned_count(decor_id) - while canonical_count < local_count: - if not _local_home.add_owned_decor(decor_id, 1): - return false - canonical_count += 1 - return true - - -func _commit_local_decor_transaction(transaction: Dictionary) -> bool: - if _save_manager == null or not _save_manager.save_if_dirty(): - _restore_local_decor_transaction(transaction) - return false - var revision: int = _local_home.get_revision() - _pending_local_decor_transactions[revision] = transaction.duplicate(true) - _trim_pending_local_decor_transactions() - if publish_local_home(true): - return true - _pending_local_decor_transactions.erase(revision) - _restore_local_decor_transaction(transaction) - _flush_queued_local_home_publish() - # The optimistic mutation was already written before we attempted to publish - # it. If the session ended or could not accept the manifest, immediately - # persist the restored state so a restart cannot resurrect the rejected - # placement or consume its decor item. - if _save_manager != null and not _save_manager.save_if_dirty(): - push_warning("Unable to save the restored RV decor state.") - return false - - -func _restore_local_decor_transaction(transaction: Dictionary) -> bool: - if ( - transaction.is_empty() - or _local_home == null - or _bag == null - or _inventory_layout == null - or _hotbar == null - ): - return false - var home_data: Variant = transaction.get("home", {}) - var layout_data: Variant = transaction.get("layout", {}) - var stored_items: Variant = transaction.get("bag_items", []) - var stored_slots: Variant = transaction.get("hotbar_slots", []) - var stored_fish_slots: Variant = transaction.get("hotbar_fish_slots", []) - if ( - typeof(home_data) != TYPE_DICTIONARY - or typeof(layout_data) != TYPE_DICTIONARY - or typeof(stored_items) != TYPE_ARRAY - or typeof(stored_slots) != TYPE_ARRAY - or typeof(stored_fish_slots) != TYPE_ARRAY - ): - return false - var items: Array[OwnedItemType] = [] - for value: Variant in stored_items as Array: - if not value is OwnedItemType: - return false - items.append((value as OwnedItemType).duplicate_record()) - var slots: Array[StringName] = [] - for value: Variant in stored_slots as Array: - slots.append(StringName(str(value))) - var fish_slots: Array[StringName] = [] - for value: Variant in stored_fish_slots as Array: - fish_slots.append(StringName(str(value))) - var was_suppressed: bool = _suppress_local_submission - _suppress_local_submission = true - var home_restored: bool = _local_home.restore_from_save_data( - home_data as Dictionary - ) - var bag_restored: bool = _bag.replace_all_items(items) - var layout_restored: bool = _inventory_layout.restore_from_save_data( - layout_data as Dictionary - ) - var hotbar_restored: bool = _hotbar.replace_state( - slots, - int(transaction.get("selected_hotbar_slot", 0)), - fish_slots, - false, - ) - _suppress_local_submission = was_suppressed - return home_restored and bag_restored and layout_restored and hotbar_restored - - -func _reconcile_local_decor_inventory(transaction: Dictionary) -> bool: - if _bag == null or _local_home == null: - return false - var preferred_slots: Dictionary[StringName, int] = ( - _decor_hotbar_slots_from_transaction(transaction) - ) - for decor_id: StringName in DecorCatalogType.get_product_ids(): - var target_quantity: int = _local_home.get_available_count(decor_id) - var current_quantity: int = _bag.get_quantity(decor_id) - if current_quantity > target_quantity: - if not _bag.remove_item( - decor_id, current_quantity - target_quantity - ): - return false - continue - while current_quantity < target_quantity: - var preferred_slot: int = int( - preferred_slots.get(decor_id, -1) - ) - if not _restore_decor_item_to_bag(decor_id, preferred_slot): - return false - current_quantity += 1 - return true - - -func _decor_hotbar_slots_from_transaction( - transaction: Dictionary, -) -> Dictionary[StringName, int]: - var result: Dictionary[StringName, int] = {} - var stored_slots: Variant = transaction.get("hotbar_slots", []) - if typeof(stored_slots) != TYPE_ARRAY: - return result - for slot_index: int in range((stored_slots as Array).size()): - var decor_id := StringName(str((stored_slots as Array)[slot_index])) - if DecorCatalogType.has_product(decor_id): - result[decor_id] = slot_index - return result - - -func _restore_decor_item_to_bag( - decor_id: StringName, - preferred_hotbar_slot: int, -) -> bool: - if _bag == null: - return false - var prepared_slot: int = -1 - if ( - _inventory_layout != null - and _hotbar != null - and _inventory_layout.get_container( - PlayerInventoryLayout.EntryKind.ITEM, decor_id - ) < 0 - ): - var candidate_slot: int = preferred_hotbar_slot - if candidate_slot < 0: - candidate_slot = _hotbar.find_first_empty_slot() - if candidate_slot >= 0 and _inventory_layout.prepare_new_item_placement( - decor_id, - PlayerInventoryLayout.InventoryContainer.HOTBAR, - candidate_slot, - ): - prepared_slot = candidate_slot - var restored: bool = _bag.add_item(decor_id, 1) - if not restored: - if prepared_slot >= 0: - _inventory_layout.cancel_prepared_item_placement(decor_id) - if _bag.get_owned_item(decor_id) == null: - restored = _bag.add_item_to_storage(decor_id, 1) - if restored and prepared_slot >= 0: - _hotbar.assign_item(prepared_slot, decor_id) - _hotbar.select_slot(prepared_slot) - return restored - - -func _get_local_decor_rejection_transaction( - canonical_revision: int, -) -> Dictionary: - var revisions: Array[int] = [] - revisions.assign(_pending_local_decor_transactions.keys()) - revisions.sort() - for revision: int in revisions: - if canonical_revision < 0 or revision > canonical_revision: - return _pending_local_decor_transactions[revision].duplicate(true) - return {} - - -func _discard_local_decor_transactions_through(revision: int) -> void: - for pending_revision: int in _pending_local_decor_transactions.keys(): - if pending_revision <= revision: - _pending_local_decor_transactions.erase(pending_revision) - - -func _discard_local_decor_transactions_after(revision: int) -> void: - for pending_revision: int in _pending_local_decor_transactions.keys(): - if pending_revision > revision: - _pending_local_decor_transactions.erase(pending_revision) - - -func _trim_pending_local_decor_transactions() -> void: - var revisions: Array[int] = [] - revisions.assign(_pending_local_decor_transactions.keys()) - revisions.sort() - while revisions.size() > MAX_PENDING_LOCAL_DECOR_TRANSACTIONS: - _pending_local_decor_transactions.erase(revisions.pop_front()) - - -func _submit_transition(action: int, owner_fingerprint: String) -> bool: - var request: Dictionary = { - "request_id": _new_id("home_transition"), - "session_id": _session.get_session_id(), - "action": action, - "owner_fingerprint": owner_fingerprint, - } - request["sender_signature"] = _session.sign_local_action( - "portable_home_transition", - NetworkHomeProtocolType.transition_signature_fields(request), - ) - if _session.is_host(): - _process_transition_request(_session.get_local_peer_id(), request) - else: - submit_home_transition.rpc_id(1, request) - return true - - -@rpc( - "any_peer", "call_remote", "reliable", - NetworkHomeProtocolType.RELIABLE_CHANNEL, -) -func submit_home_transition(data: Dictionary) -> void: - var sender_id: int = multiplayer.get_remote_sender_id() - if ( - not _session.is_host() - or not _session.is_authenticated_peer(sender_id) - ): - return - _process_transition_request(sender_id, data) - - -func _process_transition_request(peer_id: int, data: Dictionary) -> void: - if ( - not NetworkHomeProtocolType.validate_transition_request(data) - or str(data["session_id"]) != _session.get_session_id() - or not _session.verify_peer_action( - peer_id, - "portable_home_transition", - NetworkHomeProtocolType.transition_signature_fields(data), - data["sender_signature"], - ) - ): - _send_transition_rejection(peer_id, "The home transition was invalid.") - return - var owner_fingerprint: String = str(data["owner_fingerprint"]) - var action: int = int(data["action"]) - var avatar: Player = _spawn_service.get_avatar(peer_id) - var manifest: Dictionary = _manifests_by_fingerprint.get( - owner_fingerprint, {} - ) - if avatar == null or manifest.is_empty(): - _send_transition_rejection(peer_id, "That home is unavailable.") - return - if action == NetworkHomeProtocolType.TransitionAction.ENTER: - var record := _session.get_peer_record(peer_id) - var owner_is_local: bool = ( - record != null and record.identity_fingerprint == owner_fingerprint - ) - var privacy: int = int((manifest["home"] as Dictionary)["privacy"]) - if ( - (not owner_is_local and privacy != PlayerHomeStateType.Privacy.OPEN) - or _session.get_peer_space(peer_id) - != NetworkHomeProtocolType.WORLD_SPACE - or not _world_service.is_avatar_near_exterior( - avatar, owner_fingerprint - ) - ): - _send_transition_rejection(peer_id, "You cannot enter that home.") - return - var interior_space: StringName = ( - NetworkHomeProtocolType.make_space_id(owner_fingerprint) - ) - var visitor_slot: int = _reserve_interior_slot( - interior_space, peer_id - ) - _apply_host_transition( - peer_id, - interior_space, - owner_fingerprint, - _world_service.get_interior_spawn_transform( - owner_fingerprint, visitor_slot - ), - ) - return - if ( - _session.get_peer_space(peer_id) - != NetworkHomeProtocolType.make_space_id(owner_fingerprint) - ): - _send_transition_rejection(peer_id, "You are not inside that home.") - return - _apply_host_transition( - peer_id, - NetworkHomeProtocolType.WORLD_SPACE, - owner_fingerprint, - _world_service.get_exterior_spawn_transform(owner_fingerprint), - ) - - -func _spawn_peer_at_exterior( - peer_id: int, - owner_fingerprint: String, -) -> void: - if ( - not _session.is_host() - or _session.get_peer_space(peer_id) - != NetworkHomeProtocolType.WORLD_SPACE - or _spawn_service.get_avatar(peer_id) == null - ): - return - _apply_host_transition( - peer_id, - NetworkHomeProtocolType.WORLD_SPACE, - owner_fingerprint, - _world_service.get_exterior_spawn_transform(owner_fingerprint), - ) - - -func _apply_host_transition( - peer_id: int, - space_id: StringName, - owner_fingerprint: String, - transform: Transform3D, -) -> void: - var avatar: Player = _spawn_service.get_avatar(peer_id) - var movement_sequence: int = 0 - if avatar != null: - movement_sequence = int( - avatar.make_network_snapshot(peer_id).get( - "acknowledged_input", 0 - ) - ) - var transform_data: Array[float] = ( - NetworkHomeProtocolType.transform_to_array(transform) - ) - if not NetworkHomeProtocolType.validate_transition_transform( - transform_data - ): - push_error("Refused an out-of-bounds RV transition transform.") - return - var previous_space: StringName = _session.get_peer_space(peer_id) - if ( - String(previous_space).begins_with("rv:") - and previous_space != space_id - ): - _release_interior_slot(previous_space, peer_id) - var result: Dictionary = { - "peer_id": peer_id, - "space_id": String(space_id), - "owner_fingerprint": owner_fingerprint, - "transform": transform_data, - "movement_sequence": movement_sequence, - } - _apply_transition_result(result) - for recipient_id: int in _session.get_authenticated_peer_ids(): - if recipient_id == 1: - continue - receive_home_transition.rpc_id(recipient_id, result) - - -@rpc( - "authority", "call_remote", "reliable", - NetworkHomeProtocolType.RELIABLE_CHANNEL, -) -func receive_home_transition(data: Dictionary) -> void: - if ( - typeof(data.get("peer_id")) != TYPE_INT - or typeof(data.get("space_id")) not in [TYPE_STRING, TYPE_STRING_NAME] - or typeof(data.get("movement_sequence", 0)) != TYPE_INT - or int(data.get("movement_sequence", 0)) < 0 - or not NetworkIdentityCrypto.valid_fingerprint( - data.get("owner_fingerprint") - ) - or not NetworkHomeProtocolType.validate_transition_transform( - data.get("transform") - ) - ): - return - _apply_transition_result(data) - - -func _apply_transition_result(data: Dictionary) -> void: - var peer_id: int = int(data["peer_id"]) - var space_id := StringName(str(data["space_id"])) - if not NetworkHomeProtocolType.validate_transition_transform( - data.get("transform") - ): - return - var target_transform: Transform3D = ( - NetworkHomeProtocolType.array_to_transform(data["transform"]) - ) - if not _session.set_peer_space(peer_id, space_id): - return - if not _session.apply_authoritative_space_transition( - peer_id, - target_transform, - int(data.get("movement_sequence", 0)), - ): - return - if peer_id == _session.get_local_peer_id(): - _world_service.set_local_space(space_id) - local_space_changed.emit(space_id, str(data["owner_fingerprint"])) - local_transition_finished.emit(true, "") - _refresh_peer_visibility() - - -func _send_transition_rejection(peer_id: int, message: String) -> void: - if peer_id == _session.get_local_peer_id(): - local_transition_finished.emit(false, message) - else: - receive_home_transition_rejection.rpc_id(peer_id, message) - - -@rpc( - "authority", "call_remote", "reliable", - NetworkHomeProtocolType.RELIABLE_CHANNEL, -) -func receive_home_transition_rejection(message: String) -> void: - local_transition_finished.emit( - false, message.left(NetworkHomeProtocolType.MAX_MESSAGE_LENGTH) - ) - - -func _refresh_peer_visibility() -> void: - var local_peer_id: int = _session.get_local_peer_id() - if local_peer_id <= 0: - return - for peer_id: int in _spawn_service.get_peer_ids(): - if peer_id == local_peer_id: - continue - _spawn_service.set_peer_presentation_visible( - peer_id, _session.peers_share_space(local_peer_id, peer_id) - ) - - -func _on_avatar_spawned(peer_id: int, _avatar: Player) -> void: - var local_peer_id: int = _session.get_local_peer_id() - if local_peer_id <= 0 or peer_id == local_peer_id: - return - _spawn_service.set_peer_presentation_visible( - peer_id, _session.peers_share_space(local_peer_id, peer_id) - ) - - -func _on_local_home_changed() -> void: - if _suppress_local_submission or _publish_queued: - return - _publish_queued = true - call_deferred("_publish_queued_home") - - -func _publish_queued_home() -> void: - if has_pending_local_decor_mutation(): - return - _publish_queued = false - if _save_manager != null: - _save_manager.save_if_dirty() - publish_local_home() - - -func _flush_queued_local_home_publish() -> void: - if not _publish_queued or has_pending_local_decor_mutation(): - return - call_deferred("_publish_queued_home") - - -func _on_join_authenticated() -> void: - publish_local_home() - - -func _on_peer_authenticated(peer_id: int, _display_name: String) -> void: - if not _session.is_host(): - return - for manifest: Dictionary in _manifests_by_fingerprint.values(): - receive_home_manifest.rpc_id(peer_id, manifest) - for existing_peer_id: int in _session.get_authenticated_peer_ids(): - if existing_peer_id == peer_id: - continue - var avatar: Player = _spawn_service.get_avatar(existing_peer_id) - if avatar == null: - continue - var space_id: StringName = _session.get_peer_space(existing_peer_id) - var owner_fingerprint: String = ( - String(space_id).trim_prefix("rv:") - if String(space_id).begins_with("rv:") - else _fingerprint_for_peer(existing_peer_id) - ) - if owner_fingerprint.is_empty(): - continue - receive_home_transition.rpc_id(peer_id, { - "peer_id": existing_peer_id, - "space_id": String(space_id), - "owner_fingerprint": owner_fingerprint, - "transform": NetworkHomeProtocolType.transform_to_array( - avatar.global_transform - ), - }) - - -func _on_peer_removed(peer_id: int) -> void: - _release_peer_interior_slots(peer_id) - var fingerprint: String = _fingerprint_by_peer.get(peer_id, "") - _fingerprint_by_peer.erase(peer_id) - _authorized_owned_counts.erase(peer_id) - _authorized_home_tiers.erase(peer_id) - for result_id: String in _home_upgrade_result_owner.keys(): - if int(_home_upgrade_result_owner[result_id]) == peer_id: - _home_upgrade_result_owner.erase(result_id) - if fingerprint.is_empty(): - return - if _session.is_host(): - for occupant_id: int in _session.get_authenticated_peer_ids(): - if ( - occupant_id == peer_id - or _session.get_peer_space(occupant_id) - != NetworkHomeProtocolType.make_space_id(fingerprint) - ): - continue - _apply_host_transition( - occupant_id, - NetworkHomeProtocolType.WORLD_SPACE, - fingerprint, - _world_service.get_exterior_spawn_transform(fingerprint), - ) - _manifests_by_fingerprint.erase(fingerprint) - _world_service.remove_presentation(fingerprint) - if _session.is_host(): - for recipient_id: int in _session.get_authenticated_peer_ids(): - if recipient_id != 1: - receive_home_removed.rpc_id(recipient_id, fingerprint) - - -@rpc( - "authority", "call_remote", "reliable", - NetworkHomeProtocolType.RELIABLE_CHANNEL, -) -func receive_home_removed(owner_fingerprint: String) -> void: - if not NetworkIdentityCrypto.valid_fingerprint(owner_fingerprint): - return - _manifests_by_fingerprint.erase(owner_fingerprint) - _world_service.remove_presentation(owner_fingerprint) - - -func _on_session_state_changed(state: NetworkSession.State) -> void: - if state in [NetworkSession.State.PRIVATE_HOST, NetworkSession.State.OPEN_HOST]: - if ( - not _session.is_dedicated_host() - and _world_service != null - and _world_service.is_world_ready() - ): - publish_local_home() - return - if state in [ - NetworkSession.State.INACTIVE, - NetworkSession.State.DISCONNECTING, - NetworkSession.State.CONNECTION_FAILED, - NetworkSession.State.SERVER_LOST, - ]: - _manifests_by_fingerprint.clear() - _fingerprint_by_peer.clear() - _authorized_owned_counts.clear() - _authorization_result_owner.clear() - _authorized_home_tiers.clear() - _home_upgrade_result_owner.clear() - _publish_queued = false - _last_submitted_local_home_revision = -1 - _pending_local_decor_transactions.clear() - _interior_slots_by_space.clear() - _next_interior_index = 0 - _world_service.clear_presentations() - _world_service.set_local_space(NetworkHomeProtocolType.WORLD_SPACE) - local_space_changed.emit(NetworkHomeProtocolType.WORLD_SPACE, "") - - -func _fingerprint_for_peer(peer_id: int) -> String: - if _fingerprint_by_peer.has(peer_id): - return _fingerprint_by_peer[peer_id] - var record := _session.get_peer_record(peer_id) - return record.identity_fingerprint if record != null else "" - - -func _reserve_interior_slot(space_id: StringName, peer_id: int) -> int: - var slots: Dictionary = _interior_slots_by_space.get(space_id, {}) - if slots.has(peer_id): - return int(slots[peer_id]) - var used_slots: Dictionary[int, bool] = {} - for value: Variant in slots.values(): - used_slots[int(value)] = true - var slot: int = 0 - while used_slots.has(slot): - slot += 1 - slots[peer_id] = slot - _interior_slots_by_space[space_id] = slots - return slot - - -func _release_interior_slot(space_id: StringName, peer_id: int) -> void: - var slots: Dictionary = _interior_slots_by_space.get(space_id, {}) - if slots.is_empty(): - return - slots.erase(peer_id) - if slots.is_empty(): - _interior_slots_by_space.erase(space_id) - else: - _interior_slots_by_space[space_id] = slots - - -func _release_peer_interior_slots(peer_id: int) -> void: - for space_id: StringName in _interior_slots_by_space.keys(): - _release_interior_slot(space_id, peer_id) - - -func _new_id(prefix: String) -> String: - return "%s:%s" % [ - prefix, Crypto.new().generate_random_bytes(16).hex_encode(), - ] diff --git a/network/network_home_service.gd.uid b/network/network_home_service.gd.uid deleted file mode 100644 index be233ed..0000000 --- a/network/network_home_service.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ong8kug36ku7 diff --git a/network/network_identity_crypto.gd b/network/network_identity_crypto.gd index 9d4f09c..4886cca 100644 --- a/network/network_identity_crypto.gd +++ b/network/network_identity_crypto.gd @@ -5,8 +5,7 @@ const ALGORITHM: String = "RSA-3072-SHA256" const FINGERPRINT_LENGTH: int = 64 const MAX_PUBLIC_KEY_BYTES: int = 8192 const MAX_SIGNATURE_BYTES: int = 1024 -const DOMAIN_PREFIX: String = "straywild" -const LEGACY_DOMAIN_PREFIX: String = "NETFISHING" +const DOMAIN_PREFIX: String = "NETFISHING" const IDENTITY_VERSION: String = "identity_v1" @@ -51,16 +50,8 @@ static func secure_id(byte_count: int = 16) -> String: static func canonical_bytes(domain: String, fields: Array) -> PackedByteArray: - return canonical_bytes_for_prefix(DOMAIN_PREFIX, domain, fields) - - -static func canonical_bytes_for_prefix( - prefix: String, - domain: String, - fields: Array, -) -> PackedByteArray: var output := PackedByteArray() - _append_string(output, prefix) + _append_string(output, DOMAIN_PREFIX) _append_string(output, IDENTITY_VERSION) _append_string(output, domain) for value: Variant in fields: @@ -126,37 +117,6 @@ static func verify_fields( ) -static func verify_legacy_fields( - public_key: CryptoKey, - domain: String, - fields: Array, - signature: PackedByteArray, -) -> bool: - if ( - public_key == null - or signature.is_empty() - or signature.size() > MAX_SIGNATURE_BYTES - ): - return false - var bytes: PackedByteArray = canonical_bytes_for_prefix( - LEGACY_DOMAIN_PREFIX, - domain, - fields, - ) - if bytes.is_empty(): - return false - var context := HashingContext.new() - if context.start(HashingContext.HASH_SHA256) != OK: - return false - context.update(bytes) - return Crypto.new().verify( - HashingContext.HASH_SHA256, - context.finish(), - signature, - public_key, - ) - - static func load_public_key(public_pem: String) -> CryptoKey: var normalized := normalize_public_pem(public_pem) if normalized.is_empty() or normalized.to_utf8_buffer().size() > MAX_PUBLIC_KEY_BYTES: diff --git a/network/network_item_use_service.gd b/network/network_item_use_service.gd index 024eca9..cf2d5f9 100644 --- a/network/network_item_use_service.gd +++ b/network/network_item_use_service.gd @@ -5,7 +5,6 @@ const FishingRodDataType = preload("res://items/fishing_rod_data.gd") const ArtShopStockType = preload("res://economy/art_shop_stock.gd") const FishingShopStockType = preload("res://economy/fishing_shop_stock.gd") -const DecorCatalogType = preload("res://homes/decor_catalog.gd") const MAX_LEDGER_ENTRIES: int = 64 @@ -395,10 +394,6 @@ func _apply_equipped(data: Dictionary) -> void: item_id == FishingShopStockType.STANDARD_SHOVEL_ID and bool(data["owns_item"]), ) - avatar.set_active_decor_package( - DecorCatalogType.has_product(item_id) - and bool(data["owns_item"]), - ) equipped_state_changed.emit( peer_id, StringName(str(data["item_id"])), int(data["category"]) ) diff --git a/network/network_mail_service.gd b/network/network_mail_service.gd index 085c921..675a5aa 100644 --- a/network/network_mail_service.gd +++ b/network/network_mail_service.gd @@ -152,10 +152,7 @@ func is_local_recipient(letter: Dictionary) -> bool: func get_local_display_name() -> String: var record := _session.get_peer_record(_session.get_local_peer_id()) - return ( - record.display_name - if record != null else NetworkProfilePreferences.DEFAULT_DISPLAY_NAME - ) + return record.display_name if record != null else "Player" func get_recipient_choices() -> Array[Dictionary]: diff --git a/network/network_player_list_service.gd b/network/network_player_list_service.gd index e2f79c7..677df05 100644 --- a/network/network_player_list_service.gd +++ b/network/network_player_list_service.gd @@ -477,10 +477,7 @@ func request_ban(peer_id: int, fingerprint: String) -> void: if not _valid_operator_sender(sender_id): return var record: PeerRegistry.PeerRecord = _session.get_peer_record(peer_id) - var display_name: String = ( - record.display_name - if record != null else NetworkProfilePreferences.DEFAULT_DISPLAY_NAME - ) + var display_name: String = record.display_name if record != null else "Player" var ok: bool = _ban_on_host( peer_id, fingerprint, display_name, -1, false ) @@ -547,10 +544,7 @@ func receive_ban_snapshot(records: Array) -> void: var record: Dictionary = value var fingerprint: String = str(record.get("target_fingerprint", "")) var display_name: String = str( - record.get( - "last_known_display_name", - NetworkProfilePreferences.DEFAULT_DISPLAY_NAME, - ) + record.get("last_known_display_name", "Player") ).strip_edges().left(NetworkProtocol.MAX_DISPLAY_NAME_LENGTH) if ( not NetworkIdentityCrypto.valid_fingerprint(fingerprint) diff --git a/network/network_profile_preferences.gd b/network/network_profile_preferences.gd index 382f6d1..3c4996b 100644 --- a/network/network_profile_preferences.gd +++ b/network/network_profile_preferences.gd @@ -1,17 +1,12 @@ class_name NetworkProfilePreferences extends Node -signal profile_changed - const FORMAT_VERSION: int = 1 -const DEFAULT_DISPLAY_NAME: String = "stray" -const DEFAULT_TITLE: String = "newbie" const VoiceProfilesType = preload( "res://player/animalese_voice_profiles.gd" ) var profile_id: String = "" -var display_name: String = DEFAULT_DISPLAY_NAME -var title: String = DEFAULT_TITLE +var display_name: String = "Player" var voice_id: String = VoiceProfilesType.DEFAULT_ID var speech_speed_id: String = VoiceProfilesType.DEFAULT_SPEED_ID var call_id: String = VoiceProfilesType.DEFAULT_CALL_ID @@ -26,8 +21,6 @@ var _future_version := false func configure_storage(path: String, data_root: PlayerDataRoot) -> void: _profile_path = path _data_root = data_root - _expected_hash = "" - _future_version = false func _temp_path() -> String: @@ -61,8 +54,7 @@ func load_or_create() -> bool: int(Time.get_unix_time_from_system()), Time.get_ticks_usec(), ] - display_name = DEFAULT_DISPLAY_NAME - title = DEFAULT_TITLE + display_name = "Player" voice_id = VoiceProfilesType.DEFAULT_ID speech_speed_id = VoiceProfilesType.DEFAULT_SPEED_ID call_id = VoiceProfilesType.DEFAULT_CALL_ID @@ -71,113 +63,6 @@ func load_or_create() -> bool: return _save_atomic() -func to_save_data() -> Dictionary: - return { - "profile_id": profile_id, - "display_name": display_name, - "title": title, - "voice_id": voice_id, - "speech_speed_id": speech_speed_id, - "call_id": call_id, - "sample_set_id": sample_set_id, - "created_at_unix": created_at_unix, - } - - -static func validate_save_data(value: Variant) -> bool: - if typeof(value) != TYPE_DICTIONARY: - return false - var data: Dictionary = value - if ( - typeof(data.get("profile_id")) != TYPE_STRING - or typeof(data.get("display_name")) != TYPE_STRING - or ( - data.has("title") - and typeof(data.get("title")) != TYPE_STRING - ) - or typeof(data.get("created_at_unix")) not in [TYPE_INT, TYPE_FLOAT] - ): - return false - var saved_profile_id := str(data.get("profile_id", "")) - var saved_name := str(data.get("display_name", "")) - var saved_title := str(data.get("title", DEFAULT_TITLE)) - return ( - not saved_profile_id.is_empty() - and saved_profile_id.length() <= NetworkProtocol.MAX_PROFILE_ID_LENGTH - and is_valid_display_name(saved_name) - and is_valid_title(saved_title) - and VoiceProfilesType.is_valid(str(data.get( - "voice_id", - VoiceProfilesType.DEFAULT_ID, - ))) - and VoiceProfilesType.is_valid_speed(str(data.get( - "speech_speed_id", - VoiceProfilesType.DEFAULT_SPEED_ID, - ))) - and VoiceProfilesType.is_valid_call(str(data.get( - "call_id", - VoiceProfilesType.DEFAULT_CALL_ID, - ))) - and VoiceProfilesType.is_valid_sample_set(str(data.get( - "sample_set_id", - VoiceProfilesType.DEFAULT_SAMPLE_SET_ID, - ))) - and int(data.get("created_at_unix", -1)) >= 0 - ) - - -func restore_from_save_data( - value: Variant, - persist_to_profile_file: bool = true, -) -> bool: - if not validate_save_data(value): - return false - var data: Dictionary = value - var previous: Dictionary = to_save_data() - profile_id = str(data["profile_id"]) - display_name = str(data["display_name"]).strip_edges() - title = str(data.get("title", DEFAULT_TITLE)).strip_edges() - voice_id = str(data.get("voice_id", VoiceProfilesType.DEFAULT_ID)) - speech_speed_id = str(data.get( - "speech_speed_id", - VoiceProfilesType.DEFAULT_SPEED_ID, - )) - call_id = str(data.get("call_id", VoiceProfilesType.DEFAULT_CALL_ID)) - sample_set_id = str(data.get( - "sample_set_id", - VoiceProfilesType.DEFAULT_SAMPLE_SET_ID, - )) - created_at_unix = int(data["created_at_unix"]) - if persist_to_profile_file and not _save_atomic(): - _assign_save_data(previous) - return false - if to_save_data() != previous: - profile_changed.emit() - return true - - -func reset_to_defaults(persist_to_profile_file: bool = true) -> bool: - var previous: Dictionary = to_save_data() - profile_id = Crypto.new().generate_random_bytes(16).hex_encode() - if profile_id.is_empty(): - profile_id = "%d-%d" % [ - int(Time.get_unix_time_from_system()), - Time.get_ticks_usec(), - ] - display_name = DEFAULT_DISPLAY_NAME - title = DEFAULT_TITLE - voice_id = VoiceProfilesType.DEFAULT_ID - speech_speed_id = VoiceProfilesType.DEFAULT_SPEED_ID - call_id = VoiceProfilesType.DEFAULT_CALL_ID - sample_set_id = VoiceProfilesType.DEFAULT_SAMPLE_SET_ID - created_at_unix = int(Time.get_unix_time_from_system()) - if persist_to_profile_file and not _save_atomic(): - _assign_save_data(previous) - return false - profile_changed.emit() - return true - - func set_display_name(value: String) -> bool: return set_profile_identity( value, @@ -185,7 +70,6 @@ func set_display_name(value: String) -> bool: speech_speed_id, call_id, sample_set_id, - title, ) @@ -195,15 +79,10 @@ func set_profile_identity( selected_speech_speed_id: String, selected_call_id: String, selected_sample_set_id: String = VoiceProfilesType.DEFAULT_SAMPLE_SET_ID, - selected_title: String = "", ) -> bool: var clean_name: String = value.strip_edges() - var clean_title: String = ( - title if selected_title.is_empty() else selected_title.strip_edges() - ) if ( not is_valid_display_name(clean_name) - or not is_valid_title(clean_title) or not VoiceProfilesType.is_valid(selected_voice_id) or not VoiceProfilesType.is_valid_speed(selected_speech_speed_id) or not VoiceProfilesType.is_valid_call(selected_call_id) @@ -211,30 +90,18 @@ func set_profile_identity( ): return false var previous_name: String = display_name - var previous_title: String = title var previous_voice_id: String = voice_id var previous_speech_speed_id: String = speech_speed_id var previous_call_id: String = call_id var previous_sample_set_id: String = sample_set_id display_name = clean_name - title = clean_title voice_id = selected_voice_id speech_speed_id = selected_speech_speed_id call_id = selected_call_id sample_set_id = selected_sample_set_id if _save_atomic(): - if ( - display_name != previous_name - or voice_id != previous_voice_id - or title != previous_title - or speech_speed_id != previous_speech_speed_id - or call_id != previous_call_id - or sample_set_id != previous_sample_set_id - ): - profile_changed.emit() return true display_name = previous_name - title = previous_title voice_id = previous_voice_id speech_speed_id = previous_speech_speed_id call_id = previous_call_id @@ -242,23 +109,6 @@ func set_profile_identity( return false -func _assign_save_data(data: Dictionary) -> void: - profile_id = str(data.get("profile_id", "")) - display_name = str(data.get("display_name", DEFAULT_DISPLAY_NAME)) - title = str(data.get("title", DEFAULT_TITLE)) - voice_id = str(data.get("voice_id", VoiceProfilesType.DEFAULT_ID)) - speech_speed_id = str(data.get( - "speech_speed_id", - VoiceProfilesType.DEFAULT_SPEED_ID, - )) - call_id = str(data.get("call_id", VoiceProfilesType.DEFAULT_CALL_ID)) - sample_set_id = str(data.get( - "sample_set_id", - VoiceProfilesType.DEFAULT_SAMPLE_SET_ID, - )) - created_at_unix = int(data.get("created_at_unix", 0)) - - static func is_valid_display_name(value: String) -> bool: var clean_name := value.strip_edges() if clean_name.is_empty() or clean_name.length() > 24: @@ -270,17 +120,6 @@ static func is_valid_display_name(value: String) -> bool: return true -static func is_valid_title(value: String) -> bool: - var clean_title := value.strip_edges() - if clean_title.is_empty() or clean_title.length() > NetworkProtocol.MAX_PLAYER_TITLE_LENGTH: - return false - for index: int in clean_title.length(): - var codepoint: int = clean_title.unicode_at(index) - if codepoint < 32 or codepoint == 127: - return false - return true - - func _load_existing() -> bool: var file := FileAccess.open(_profile_path, FileAccess.READ) if file == null: @@ -301,27 +140,20 @@ func _load_existing() -> bool: data.get("format_version") != FORMAT_VERSION or typeof(data.get("profile_id")) != TYPE_STRING or typeof(data.get("display_name")) != TYPE_STRING - or ( - data.has("title") - and typeof(data.get("title")) != TYPE_STRING - ) or typeof(data.get("created_at_unix")) not in [TYPE_INT, TYPE_FLOAT] ): return false var loaded_id: String = data["profile_id"] var loaded_name: String = data["display_name"] - var loaded_title := str(data.get("title", DEFAULT_TITLE)) if ( loaded_id.is_empty() or loaded_id.length() > NetworkProtocol.MAX_PROFILE_ID_LENGTH or loaded_name.is_empty() or loaded_name.length() > NetworkProtocol.MAX_DISPLAY_NAME_LENGTH - or not is_valid_title(loaded_title) ): return false profile_id = loaded_id display_name = loaded_name - title = loaded_title.strip_edges() voice_id = VoiceProfilesType.sanitized_id( str(data.get("voice_id", VoiceProfilesType.DEFAULT_ID)) ) @@ -346,7 +178,6 @@ func _save_atomic() -> bool: "format_version": FORMAT_VERSION, "profile_id": profile_id, "display_name": display_name, - "title": title, "voice_id": voice_id, "speech_speed_id": speech_speed_id, "call_id": call_id, diff --git a/network/network_profile_protocol.gd b/network/network_profile_protocol.gd index 2da3c71..5c1e879 100644 --- a/network/network_profile_protocol.gd +++ b/network/network_profile_protocol.gd @@ -31,8 +31,6 @@ static func valid_check_request(data: Variant) -> bool: static func valid_apply_request(data: Variant) -> bool: return ( valid_check_request(data) - and typeof(data.get("player_title")) == TYPE_STRING - and NetworkProfilePreferences.is_valid_title(data["player_title"]) and typeof(data.get("appearance")) == TYPE_DICTIONARY and valid_snapshot(data["appearance"]) and typeof(data.get("use_anyway")) == TYPE_BOOL @@ -65,7 +63,6 @@ static func signature_fields(data: Dictionary) -> Array: str(data.get("request_id", "")), str(data.get("sender_fingerprint", "")), str(data.get("display_name", "")), - str(data.get("player_title", "")), ] result.append_array( CharacterCustomizationCatalog.appearance_signature_values(appearance) diff --git a/network/network_profile_service.gd b/network/network_profile_service.gd index 707637a..e4732a9 100644 --- a/network/network_profile_service.gd +++ b/network/network_profile_service.gd @@ -16,7 +16,6 @@ signal profile_snapshot_changed( display_name: String, appearance: Dictionary, ) -signal profile_title_changed(peer_id: int, title: String) var _session: NetworkSession var _preferences: NetworkProfilePreferences @@ -27,7 +26,6 @@ var _pending_voice_ids: Dictionary[String, String] = {} var _pending_speech_speed_ids: Dictionary[String, String] = {} var _pending_call_ids: Dictionary[String, String] = {} var _pending_sample_set_ids: Dictionary[String, String] = {} -var _pending_titles: Dictionary[String, String] = {} var _host_pending_apply: Dictionary[String, Dictionary] = {} var _latest_check_id: String = "" var _latest_check_name: String = "" @@ -44,16 +42,6 @@ func setup( _appearance_store = appearance_store _spawn_service = spawn_service _appearance_store.load_preferences() - if not _preferences.profile_changed.is_connected( - _on_local_profile_store_changed - ): - _preferences.profile_changed.connect(_on_local_profile_store_changed) - if not _appearance_store.appearance_changed.is_connected( - _on_local_appearance_store_changed - ): - _appearance_store.appearance_changed.connect( - _on_local_appearance_store_changed - ) _session.peer_authenticated.connect(_on_peer_authenticated) _session.peer_removed.connect(_on_peer_removed) _session.peer_display_name_changed.connect(_on_peer_display_name_changed) @@ -63,39 +51,10 @@ func setup( _apply_local_voice_to_avatar() -func _on_local_profile_store_changed() -> void: - _apply_local_voice_to_avatar() - - -func _on_local_appearance_store_changed() -> void: - var snapshot: Dictionary = _appearance_store.get_snapshot() - var local_peer_id: int = ( - _session.get_local_peer_id() if _session != null else 1 - ) - _apply_to_avatar(local_peer_id, snapshot) - if _session != null: - _session.set_local_appearance_snapshot(snapshot) - - -func reload_persisted_profile() -> bool: - if ( - not _preferences.load_or_create() - or not _appearance_store.load_preferences() - ): - return false - _apply_to_avatar(1, _appearance_store.get_snapshot()) - _apply_local_voice_to_avatar() - return true - - func get_persisted_name() -> String: return _preferences.display_name -func get_persisted_title() -> String: - return _preferences.title - - func get_persisted_appearance() -> Dictionary: return _appearance_store.get_snapshot() @@ -137,7 +96,6 @@ func preview_appearance(appearance: Dictionary) -> bool: local_peer_id, _preferences.display_name, snapshot, - _preferences.title, ) var authorization := _make_appearance_preview_authorization(snapshot) var local_record := _session.get_peer_record(local_peer_id) @@ -210,16 +168,10 @@ func apply_profile( speech_speed_id: String = VoiceProfilesType.DEFAULT_SPEED_ID, call_id: String = VoiceProfilesType.DEFAULT_CALL_ID, sample_set_id: String = VoiceProfilesType.DEFAULT_SAMPLE_SET_ID, - player_title: String = "", ) -> bool: var clean_name := display_name.strip_edges() - var clean_title := ( - _preferences.title - if player_title.is_empty() else player_title.strip_edges() - ) if ( not NetworkProfilePreferences.is_valid_display_name(clean_name) - or not NetworkProfilePreferences.is_valid_title(clean_title) or not CharacterCustomizationCatalog.validate_snapshot(appearance) or not VoiceProfilesType.is_valid(voice_id) or not VoiceProfilesType.is_valid_speed(speech_speed_id) @@ -233,7 +185,6 @@ func apply_profile( "request_id": request_id, "session_id": _session.get_session_id() if _session != null else "", "display_name": clean_name, - "player_title": clean_title, "appearance": appearance.duplicate(true), "use_anyway": use_anyway, "sender_fingerprint": _session.get_local_identity_fingerprint(), @@ -246,7 +197,6 @@ func apply_profile( _pending_speech_speed_ids[request_id] = speech_speed_id _pending_call_ids[request_id] = call_id _pending_sample_set_ids[request_id] = sample_set_id - _pending_titles[request_id] = clean_title if _session == null or not _session.is_gameplay_session_active(): _apply_local_result(request_id, true, "", false, PackedStringArray()) elif _session.is_host(): @@ -342,7 +292,6 @@ func submit_appearance_preview(data: Dictionary) -> void: sender_id, record.display_name, appearance, - record.title, ) _apply_to_avatar(sender_id, appearance) _broadcast_appearance_preview_to_supported_peers(sender_id, appearance) @@ -350,7 +299,6 @@ func submit_appearance_preview(data: Dictionary) -> void: func _process_apply_request(peer_id: int, data: Dictionary) -> void: var display_name: String = str(data["display_name"]).strip_edges() - var player_title: String = str(data["player_title"]).strip_edges() var conflict: bool = _name_conflicts(peer_id, display_name) var accepted: bool = not conflict or bool(data["use_anyway"]) var suggestions: PackedStringArray = ( @@ -366,8 +314,7 @@ func _process_apply_request(peer_id: int, data: Dictionary) -> void: if accepted: _host_pending_apply[str(data["request_id"])] = { "peer_id": peer_id, - "display_name": display_name, - "player_title": player_title, + "display_name": display_name, "appearance": Dictionary(data["appearance"]).duplicate(true), "authorization": { "request_id": data["request_id"], @@ -398,11 +345,8 @@ func confirm_profile_saved(request_id: String) -> void: return _host_pending_apply.erase(request_id) var display_name: String = str(pending["display_name"]) - var player_title: String = str(pending["player_title"]) var appearance: Dictionary = Dictionary(pending["appearance"]) - _session.apply_canonical_profile( - sender_id, display_name, appearance, player_title - ) + _session.apply_canonical_profile(sender_id, display_name, appearance) var record: PeerRegistry.PeerRecord = _session.get_peer_record(sender_id) if record != null: record.profile_authorization = pending.get("authorization", {}).duplicate(true) @@ -410,7 +354,6 @@ func confirm_profile_saved(request_id: String) -> void: broadcast_profile_snapshot.rpc( sender_id, display_name, - player_title, appearance, pending.get("authorization", {}), ) @@ -451,12 +394,10 @@ func _apply_local_result( _pending_speech_speed_ids.erase(request_id) _pending_call_ids.erase(request_id) _pending_sample_set_ids.erase(request_id) - _pending_titles.erase(request_id) conflict_result.emit(request_id, conflict, suggestions) apply_finished.emit(false, message) return var previous_name := _preferences.display_name - var previous_title := _preferences.title var previous_voice_id := _preferences.voice_id var previous_speech_speed_id := _preferences.speech_speed_id var previous_call_id := _preferences.call_id @@ -477,24 +418,18 @@ func _apply_local_result( request_id, VoiceProfilesType.DEFAULT_SAMPLE_SET_ID, ) - var requested_title: String = _pending_titles.get( - request_id, - NetworkProfilePreferences.DEFAULT_TITLE, - ) if not _preferences.set_profile_identity( str(request["display_name"]), requested_voice_id, requested_speech_speed_id, requested_call_id, requested_sample_set_id, - requested_title, ): _pending_apply.erase(request_id) _pending_voice_ids.erase(request_id) _pending_speech_speed_ids.erase(request_id) _pending_call_ids.erase(request_id) _pending_sample_set_ids.erase(request_id) - _pending_titles.erase(request_id) apply_finished.emit(false, "Profile could not be saved.") return if not _appearance_store.save_snapshot(request["appearance"]): @@ -504,14 +439,12 @@ func _apply_local_result( previous_speech_speed_id, previous_call_id, previous_sample_set_id, - previous_title, ) _pending_apply.erase(request_id) _pending_voice_ids.erase(request_id) _pending_speech_speed_ids.erase(request_id) _pending_call_ids.erase(request_id) _pending_sample_set_ids.erase(request_id) - _pending_titles.erase(request_id) apply_finished.emit(false, "Profile could not be saved.") return _pending_apply.erase(request_id) @@ -519,7 +452,6 @@ func _apply_local_result( _pending_speech_speed_ids.erase(request_id) _pending_call_ids.erase(request_id) _pending_sample_set_ids.erase(request_id) - _pending_titles.erase(request_id) if _session != null: _session.set_local_appearance_snapshot(_appearance_store.get_snapshot()) if _session != null and _session.is_gameplay_session_active(): @@ -528,7 +460,6 @@ func _apply_local_result( _session.get_local_peer_id(), _preferences.display_name, _appearance_store.get_snapshot(), - _preferences.title, ) var record := _session.get_peer_record( _session.get_local_peer_id() @@ -538,7 +469,6 @@ func _apply_local_result( broadcast_profile_snapshot.rpc( _session.get_local_peer_id(), _preferences.display_name, - _preferences.title, _appearance_store.get_snapshot(), request, ) @@ -558,13 +488,11 @@ func _apply_local_result( func broadcast_profile_snapshot( peer_id: int, display_name: String, - player_title: String, appearance: Dictionary, authorization: Dictionary = {}, ) -> void: if ( not NetworkProfilePreferences.is_valid_display_name(display_name) - or not NetworkProfilePreferences.is_valid_title(player_title) or not CharacterCustomizationCatalog.validate_snapshot(appearance) ): return @@ -575,16 +503,12 @@ func broadcast_profile_snapshot( display_name, appearance, authorization, - player_title, ) ): return - _session.apply_canonical_profile( - peer_id, display_name, appearance, player_title - ) + _session.apply_canonical_profile(peer_id, display_name, appearance) _apply_to_avatar(peer_id, appearance) profile_snapshot_changed.emit(peer_id, display_name, appearance.duplicate(true)) - profile_title_changed.emit(peer_id, player_title) @rpc("authority", "call_remote", "reliable", NetworkProfileProtocol.RELIABLE_CHANNEL) @@ -598,9 +522,7 @@ func broadcast_appearance_preview( if record == null: return var snapshot := CharacterCustomizationCatalog.sanitized_snapshot(appearance) - _session.apply_canonical_profile( - peer_id, record.display_name, snapshot, record.title - ) + _session.apply_canonical_profile(peer_id, record.display_name, snapshot) _apply_to_avatar(peer_id, snapshot) profile_snapshot_changed.emit( peer_id, @@ -642,7 +564,6 @@ func _on_peer_authenticated(peer_id: int, _display_name: String) -> void: peer_id, existing_id, record.display_name, - record.title, record.appearance_snapshot, record.profile_authorization, ) @@ -706,7 +627,6 @@ func _on_session_state_changed(state: NetworkSession.State) -> void: _pending_speech_speed_ids.clear() _pending_call_ids.clear() _pending_sample_set_ids.clear() - _pending_titles.clear() _host_pending_apply.clear() _latest_check_id = "" _latest_check_name = "" diff --git a/network/network_protocol.gd b/network/network_protocol.gd index d586c23..6bbbf9b 100644 --- a/network/network_protocol.gd +++ b/network/network_protocol.gd @@ -3,11 +3,10 @@ extends RefCounted const WorldLayoutType = preload("res://world/world_layout.gd") -const PROTOCOL_VERSION: int = 13 +const PROTOCOL_VERSION: int = 10 const GAME_BUILD: String = "prealpha" const MAX_GAME_VERSION_LENGTH: int = 64 const MAX_DISPLAY_NAME_LENGTH: int = 24 -const MAX_PLAYER_TITLE_LENGTH: int = 24 const MAX_PROFILE_ID_LENGTH: int = 96 const MAX_NONCE_LENGTH: int = 96 const MAX_PUBLIC_KEY_LENGTH: int = 8192 @@ -18,9 +17,9 @@ const MAX_SIGNATURE_LENGTH: int = 2048 # 8 reliable ordered session chat, 9 reliable private session mail, # 10 observer-only fishing summaries, 11 reliable movement animation state, # 12 reliable fish showcase state, 13 reliable world-spawn events, -# 14 reliable artwork state, 15 world-spawn snapshots, 16 reliable fishing -# lifecycle, and 17 reliable portable-home state. Bulk world/art payloads must -# not head-of-line block held items, fishing, animation, or home transitions. +# 14 reliable artwork state, 15 world-spawn snapshots, and 16 reliable +# fishing lifecycle. Bulk world/art payloads must not head-of-line block held +# items, fishing, or animation presentation. const SALE_RELIABLE_CHANNEL: int = 5 const SHOP_RELIABLE_CHANNEL: int = 6 const ITEM_RELIABLE_CHANNEL: int = 7 @@ -31,9 +30,8 @@ const SHOWCASE_RELIABLE_CHANNEL: int = 12 const WORLD_SPAWN_RELIABLE_CHANNEL: int = 13 const DRAWING_RELIABLE_CHANNEL: int = 14 const FISHING_RELIABLE_CHANNEL: int = 16 -const HOME_RELIABLE_CHANNEL: int = 17 -const ENET_CHANNEL_COUNT: int = 18 -const SURFACE_DRAWING_CAPABILITY: String = "surface_drawing_v3" +const ENET_CHANNEL_COUNT: int = 17 +const SURFACE_DRAWING_CAPABILITY: String = "surface_drawing_v2" const ART_SHOP_CAPABILITY: String = "art_shop_v1" const BACKPACK_SHOP_CAPABILITY: String = "backpack_shop_v1" const WORLD_TIME_CAPABILITY: String = "world_time_v2" @@ -47,8 +45,6 @@ const WORLD_LAYOUT_CAPABILITY: String = "world_layout_v1" const FRIENDS_CAPABILITY: String = "friends_v1" const MOVEMENT_RECONCILIATION_CAPABILITY: String = "movement_reconciliation_v2" const FISHING_REPLICATION_CAPABILITY: String = "fishing_replication_v2" -const HOME_CAPABILITY: String = "portable_home_v1" -const HOME_UPGRADE_CAPABILITY: String = "home_upgrade_v1" const DEFAULT_WORLD_SEED: int = 13001 const MAX_WORLD_SEED: int = 2147483646 @@ -184,7 +180,6 @@ static func make_client_hello( cosmetic_snapshot: Dictionary = {}, identity_fingerprint: String = "", identity_signature: PackedByteArray = PackedByteArray(), - player_title: String = NetworkProfilePreferences.DEFAULT_TITLE, ) -> Dictionary: return { "protocol_version": PROTOCOL_VERSION, @@ -192,7 +187,6 @@ static func make_client_hello( "game_build": GAME_BUILD, "local_profile_id": profile_id, "display_name": display_name, - "player_title": player_title, "client_nonce": client_nonce, "capability_flags": PackedStringArray([ FISH_QUALITY_CAPABILITY, @@ -208,8 +202,6 @@ static func make_client_hello( FRIENDS_CAPABILITY, MOVEMENT_RECONCILIATION_CAPABILITY, FISHING_REPLICATION_CAPABILITY, - HOME_CAPABILITY, - HOME_UPGRADE_CAPABILITY, ]), "cosmetic_snapshot": cosmetic_snapshot, "identity_fingerprint": identity_fingerprint, @@ -227,7 +219,6 @@ static func validate_client_hello(data: Variant) -> String: "game_build", "local_profile_id", "display_name", - "player_title", "client_nonce", "capability_flags", "cosmetic_snapshot", @@ -250,11 +241,6 @@ static func validate_client_hello(data: Variant) -> String: return "Profile ID is invalid." if typeof(payload["display_name"]) != TYPE_STRING: return "Display name is invalid." - if ( - typeof(payload["player_title"]) != TYPE_STRING - or not NetworkProfilePreferences.is_valid_title(payload["player_title"]) - ): - return "Player title is invalid." if typeof(payload["client_nonce"]) != TYPE_STRING: return "Client nonce is invalid." if typeof(payload["capability_flags"]) not in [ @@ -304,7 +290,6 @@ static func client_profile_fields(data: Dictionary) -> Array: str(data.get("identity_fingerprint", "")), str(data.get("local_profile_id", "")), str(data.get("display_name", "")), - str(data.get("player_title", "")), ] result.append_array( CharacterCustomizationCatalog.appearance_signature_values(appearance) @@ -319,7 +304,7 @@ static func make_server_hello( assigned_peer_id: int, player_count: int, max_players: int, - server_display_name: String = "straywild", + server_display_name: String = "NETfishing", world_seed: int = DEFAULT_WORLD_SEED, world_layout: StringName = WorldLayoutType.GENERATED, ) -> Dictionary: @@ -357,8 +342,6 @@ static func make_server_hello( FRIENDS_CAPABILITY, MOVEMENT_RECONCILIATION_CAPABILITY, FISHING_REPLICATION_CAPABILITY, - HOME_CAPABILITY, - HOME_UPGRADE_CAPABILITY, "chat_v1", "mail_v1", "profile_v1", @@ -389,17 +372,17 @@ static func rejection_text(code: int) -> String: return "You are not permitted to join this server." RejectionCode.CLIENT_OUTDATED: return ( - "Your straywild version is out of date. " + "Your NETfishing version is out of date. " + "Update the game to join this server." ) RejectionCode.SERVER_OUTDATED: return ( "This server is out of date. " - + "The host needs to update straywild." + + "The host needs to update NETfishing." ) RejectionCode.VERSION_MISMATCH: return ( - "This game and server use different straywild versions. " + "This game and server use different NETfishing versions. " + "Update both to the latest release." ) _: diff --git a/network/network_session.gd b/network/network_session.gd index 3c599e2..b889678 100644 --- a/network/network_session.gd +++ b/network/network_session.gd @@ -28,12 +28,6 @@ const MAX_PENDING_MOVEMENT_INPUTS: int = 96 const ANIMATION_REFRESH_INTERVAL: float = 1.0 const MAX_MOVEMENT_INPUT_SEQUENCE: int = 2147483647 const MAX_MOVEMENT_ONE_WAY_TRANSIT_SECONDS: float = 0.25 -const SPACE_TRANSITION_SNAPSHOT_GUARD_DISTANCE: float = 12.0 -# A reliable teleport travels on a different channel from ordinary movement -# audits. Keep the acceptance radius below Player's hard-reconciliation -# distance so an old audit can never pull a just-relocated local player back -# into the place they were recovered from. -const AUTHORITATIVE_TELEPORT_SNAPSHOT_GUARD_DISTANCE: float = 2.0 const MOVEMENT_FLAG_JUMP: int = 1 << 0 const MOVEMENT_FLAG_SPRINT: int = 1 << 1 @@ -67,7 +61,6 @@ signal host_openness_changed(is_open: bool) signal session_display_name_changed(display_name: String) signal peer_count_changed(player_count: int, max_players: int) signal peer_display_name_changed(peer_id: int, display_name: String) -signal peer_title_changed(peer_id: int, title: String) signal peer_profile_changed( peer_id: int, display_name: String, @@ -83,11 +76,7 @@ signal server_trust_required( signal peer_identity_observed(peer_id: int, status: String) signal operator_status_changed(peer_id: int, is_operator: bool) signal server_lost(message: String) -signal remote_recovery_requested( - peer_id: int, - entry_position: Vector3, - recovery_input_sequence: int, -) +signal remote_recovery_requested(peer_id: int, entry_position: Vector3) signal remote_recovery_presentation_changed( peer_id: int, active: bool, @@ -135,12 +124,6 @@ var _pending_movement_inputs: Array[Dictionary] = [] var _snapshot_accumulator: float = 0.0 var _movement_snapshot_tick: int = 0 var _last_local_snapshot_received_msec: int = 0 -var _local_space_transition_guard_active: bool = false -var _local_space_transition_guard_position: Vector3 = Vector3.ZERO -var _local_space_transition_minimum_ack: int = 0 -var _local_authoritative_teleport_guard_active: bool = false -var _local_authoritative_teleport_guard_position: Vector3 = Vector3.ZERO -var _local_authoritative_teleport_minimum_ack: int = 0 var _animation_refresh_accumulator: float = 0.0 var _last_animation_state_by_peer: Dictionary[int, Dictionary] = {} var _pending_animation_state_by_peer: Dictionary[int, Dictionary] = {} @@ -158,7 +141,6 @@ var _last_server_protocol_version: int = 0 var _last_server_world_seed: int = NetworkProtocol.DEFAULT_WORLD_SEED var _last_server_world_layout: StringName = WorldLayout.GENERATED var _server_capabilities: PackedStringArray = PackedStringArray() -var _peer_space_ids: Dictionary[int, StringName] = {} var _profile_ready: bool = false var _player_identity: PlayerIdentityStore var _host_identity: HostIdentityStore @@ -178,7 +160,7 @@ var _local_appearance_snapshot: Dictionary = ( ) var _moderation_disconnect_message := "" var _host_port: int = 0 -var _session_display_name: String = "straywild Room" +var _session_display_name: String = "NETfishing Room" var _dedicated_host: bool = false var _configured_operator_fingerprints: Dictionary[String, bool] = {} var _session_operator_fingerprints: Dictionary[String, bool] = {} @@ -352,10 +334,7 @@ func _register_player_host() -> void: NetworkProtocol.FRIENDS_CAPABILITY, NetworkProtocol.MOVEMENT_RECONCILIATION_CAPABILITY, NetworkProtocol.FISHING_REPLICATION_CAPABILITY, - NetworkProtocol.HOME_CAPABILITY, - NetworkProtocol.HOME_UPGRADE_CAPABILITY, ]), - _profile.title, ) _registry.update_appearance(1, _local_appearance_snapshot) var host_profile_hello := NetworkProtocol.make_client_hello( @@ -364,8 +343,6 @@ func _register_player_host() -> void: NetworkIdentityCrypto.secure_id(32), _local_appearance_snapshot, _player_identity.fingerprint, - PackedByteArray(), - _profile.title, ) host_profile_hello["identity_signature"] = _player_identity.sign( "handshake_client_profile", @@ -455,7 +432,7 @@ func set_peer_operator( func set_session_display_name(value: String) -> void: var cleaned: String = value.strip_edges().left(48) if cleaned.is_empty(): - cleaned = "straywild Room" + cleaned = "NETfishing Room" if cleaned == _session_display_name: return _session_display_name = cleaned @@ -489,30 +466,17 @@ func join_direct(endpoint_text: String) -> bool: if not endpoint.is_valid(): _fail(endpoint.error_message) return false - return join_route(ConnectionRoute.direct(endpoint)) - - -func join_route(route: ConnectionRoute) -> bool: - if ( - state != State.INACTIVE - or not _profile_ready - or _profile == null - or _spawn_service == null - or route == null - or not route.is_valid() - ): - return false _operation_generation += 1 var generation: int = _operation_generation - _current_route = route + _current_route = ConnectionRoute.direct(endpoint) _set_state( State.CONNECTING, - "Connecting to %s..." % route.display_description + "Connecting to %s..." % endpoint.normalized_display ) _replace_transport() var error: Error = _transport.connect_to_route(_current_route) if error != OK: - _fail("Could not begin the connection.") + _fail("Could not begin the direct connection.") return false multiplayer.multiplayer_peer = _transport.get_multiplayer_peer() _connection_deadline = ( @@ -614,23 +578,11 @@ func get_current_endpoint() -> ConnectionEndpoint: return ( _current_route.direct_endpoint if _current_route != null - and _current_route.kind in [ - ConnectionRoute.Kind.DIRECT, - ConnectionRoute.Kind.DISCOVERY_DIRECT, - ConnectionRoute.Kind.DISCOVERY_RELAY, - ] + and _current_route.kind == ConnectionRoute.Kind.DIRECT else null ) -func is_current_route_discovery() -> bool: - return _current_route != null and _current_route.is_discovery_join() - - -func is_current_route_relay() -> bool: - return _current_route != null and _current_route.is_relay() - - func get_last_server_metadata() -> Dictionary: return { "server_display_name": _last_server_display_name, @@ -642,20 +594,20 @@ func get_last_server_metadata() -> Dictionary: } -func set_host_world_seed(world_seed: int) -> bool: - return set_host_world(WorldLayout.GENERATED, world_seed) +func set_host_world_seed(seed: int) -> bool: + return set_host_world(WorldLayout.GENERATED, seed) -func set_host_world(world_layout: StringName, world_seed: int) -> bool: +func set_host_world(world_layout: StringName, seed: int) -> bool: if ( state != State.INACTIVE or not WorldLayout.is_valid(world_layout) - or world_seed <= 0 - or world_seed > NetworkProtocol.MAX_WORLD_SEED + or seed <= 0 + or seed > NetworkProtocol.MAX_WORLD_SEED ): return false _host_world_layout = world_layout - _host_world_seed = world_seed + _host_world_seed = seed return true @@ -709,8 +661,6 @@ func supports_server_capability(capability: StringName) -> bool: NetworkProtocol.FRIENDS_CAPABILITY, NetworkProtocol.MOVEMENT_RECONCILIATION_CAPABILITY, NetworkProtocol.FISHING_REPLICATION_CAPABILITY, - NetworkProtocol.HOME_CAPABILITY, - NetworkProtocol.HOME_UPGRADE_CAPABILITY, "chat_v1", "mail_v1", "profile_v1", @@ -735,55 +685,6 @@ func get_authenticated_peer_ids() -> Array[int]: return _registry.get_peer_ids() -func set_peer_space(peer_id: int, space_id: StringName) -> bool: - if not _registry.has_peer(peer_id) or space_id.is_empty(): - return false - _peer_space_ids[peer_id] = space_id - return true - - -func get_peer_space(peer_id: int) -> StringName: - return _peer_space_ids.get(peer_id, &"world") - - -func peers_share_space(first_peer_id: int, second_peer_id: int) -> bool: - return get_peer_space(first_peer_id) == get_peer_space(second_peer_id) - - -func apply_authoritative_space_transition( - peer_id: int, - target_transform: Transform3D, - acknowledged_input: int, -) -> bool: - if not target_transform.origin.is_finite(): - return false - var local_peer_id: int = get_local_peer_id() - var local_transition: bool = peer_id == local_peer_id - var avatar: Player = _spawn_service.get_avatar(peer_id) - # Remote home transitions can arrive before their player-spawn message. Keep - # the new space assignment so the later spawn inherits correct visibility; - # only a missing local avatar is a transition failure. - if avatar == null: - return not local_transition - avatar.apply_network_space_transition(target_transform, local_transition) - if ( - local_transition - and state == State.JOINED_CLIENT - ): - # Movement snapshots use another ENet channel and a pre-transition audit - # can therefore arrive after the reliable home transition. Clear local - # prediction and reject those old-world snapshots until the host publishes - # its first audit from the new space. - _pending_movement_inputs.clear() - _last_local_snapshot_received_msec = 0 - _last_input_state_hash = 0 - _idle_input_accumulator = IDLE_INPUT_INTERVAL - _local_space_transition_guard_active = true - _local_space_transition_guard_position = target_transform.origin - _local_space_transition_minimum_ack = maxi(acknowledged_input, 0) - return true - - func get_peer_rtt_ms(peer_id: int) -> int: if peer_id == 1: return 0 @@ -935,16 +836,13 @@ func apply_canonical_profile( peer_id: int, display_name: String, appearance: Dictionary, - player_title: String = NetworkProfilePreferences.DEFAULT_TITLE, ) -> bool: if ( not NetworkProfilePreferences.is_valid_display_name(display_name) - or not NetworkProfilePreferences.is_valid_title(player_title) or not CharacterCustomizationCatalog.validate_snapshot(appearance) ): return false var name_changed := _registry.update_display_name(peer_id, display_name) - var title_changed: bool = _registry.update_title(peer_id, player_title) var appearance_changed := _registry.update_appearance(peer_id, appearance) if name_changed: peer_display_name_changed.emit(peer_id, display_name) @@ -952,11 +850,9 @@ func apply_canonical_profile( var avatar: Player = _spawn_service.get_avatar(peer_id) if avatar != null: avatar.apply_appearance_snapshot(appearance) - if title_changed: - peer_title_changed.emit(peer_id, player_title) if name_changed or appearance_changed: peer_profile_changed.emit(peer_id, display_name, appearance.duplicate(true)) - return name_changed or title_changed or appearance_changed + return name_changed or appearance_changed @rpc("any_peer", "call_remote", "reliable", 0) @@ -1134,7 +1030,6 @@ func _on_peer_disconnected(peer_id: int) -> void: _pending_identity_challenges.erase(peer_id) _authenticated_identity_cache.erase(peer_id) _operator_peer_ids.erase(peer_id) - _peer_space_ids.erase(peer_id) _last_animation_state_by_peer.erase(peer_id) _pending_animation_state_by_peer.erase(peer_id) var recovery_attempt: String = _recovery_attempts.get(peer_id, "") @@ -1260,16 +1155,11 @@ func receive_server_identity_proof(data: Dictionary) -> void: _pending_server_proof = data.duplicate(true) _server_identity_fingerprint = fingerprint _server_identity_public_key = public_pem - var verification := ( - _server_trust.verify_identity(fingerprint) - if is_current_route_discovery() - else _server_trust.verify(get_current_endpoint(), fingerprint) + var verification := _server_trust.verify( + get_current_endpoint(), fingerprint ) if verification == ServerTrustStore.Verification.MATCH: - if is_current_route_discovery(): - _server_trust.touch_identity(fingerprint) - else: - _server_trust.touch(get_current_endpoint()) + _server_trust.touch(get_current_endpoint()) _send_client_identity_proof() return _set_state( @@ -1277,12 +1167,9 @@ func receive_server_identity_proof(data: Dictionary) -> void: "Confirm this server identity before continuing.", ) _connection_deadline = 0.0 - var trust_record: Dictionary = ( - _server_trust.get_identity_record(fingerprint) - if is_current_route_discovery() - else _server_trust.get_record(get_current_endpoint()) + var expected := str( + _server_trust.get_record(get_current_endpoint()).get("fingerprint", "") ) - var expected := str(trust_record.get("fingerprint", "")) server_trust_required.emit( get_current_route_display(), expected, @@ -1297,15 +1184,11 @@ func resolve_server_trust(accepted: bool) -> void: if not accepted: cancel_connection() return - var fingerprint := str(_pending_server_proof["server_fingerprint"]) - var trusted := ( - _server_trust.trust_identity(fingerprint, get_current_route_display()) - if is_current_route_discovery() - else _server_trust.trust( - get_current_endpoint(), fingerprint, "straywild" - ) - ) - if not trusted: + if not _server_trust.trust( + get_current_endpoint(), + str(_pending_server_proof["server_fingerprint"]), + "NETfishing", + ): _fail_identity("The server identity could not be pinned.") return _set_state(State.AUTHENTICATING, "Authenticating identity...") @@ -1385,8 +1268,6 @@ func request_client_profile() -> void: _client_nonce, _local_appearance_snapshot, _player_identity.fingerprint, - PackedByteArray(), - _profile.title, ) hello["identity_signature"] = _player_identity.sign( "handshake_client_profile", @@ -1432,7 +1313,6 @@ func submit_client_hello(data: Dictionary) -> void: for required_capability: String in [ NetworkProtocol.MOVEMENT_RECONCILIATION_CAPABILITY, NetworkProtocol.FISHING_REPLICATION_CAPABILITY, - NetworkProtocol.HOME_CAPABILITY, ]: if required_capability not in client_capabilities: _reject_peer( @@ -1470,7 +1350,6 @@ func submit_client_hello(data: Dictionary) -> void: return var profile_id: String = data["local_profile_id"] var display_name: String = data["display_name"] - var player_title: String = data["player_title"] if not NetworkProfilePreferences.is_valid_display_name(display_name): _reject_peer( sender_id, @@ -1485,7 +1364,6 @@ func submit_client_hello(data: Dictionary) -> void: identity["fingerprint"], identity["public_key"], client_capabilities, - player_title, ): _reject_peer( sender_id, @@ -1528,7 +1406,6 @@ func submit_client_hello(data: Dictionary) -> void: display_name, submitted_appearance.duplicate(true), ) - peer_title_changed.emit(sender_id, player_title) receive_server_hello.rpc_id( sender_id, NetworkProtocol.make_server_hello( @@ -1669,7 +1546,6 @@ func receive_server_hello(data: Dictionary) -> void: for required_capability: String in [ NetworkProtocol.MOVEMENT_RECONCILIATION_CAPABILITY, NetworkProtocol.FISHING_REPLICATION_CAPABILITY, - NetworkProtocol.HOME_CAPABILITY, ]: if required_capability not in _server_capabilities: _teardown_peer() @@ -1702,10 +1578,7 @@ func receive_server_hello(data: Dictionary) -> void: NetworkProtocol.FRIENDS_CAPABILITY, NetworkProtocol.MOVEMENT_RECONCILIATION_CAPABILITY, NetworkProtocol.FISHING_REPLICATION_CAPABILITY, - NetworkProtocol.HOME_CAPABILITY, - NetworkProtocol.HOME_UPGRADE_CAPABILITY, ]), - _profile.title, ) _registry.update_appearance(local_peer_id, _local_appearance_snapshot) var local_record := _registry.get_peer(local_peer_id) @@ -1750,7 +1623,6 @@ func receive_peer_despawn(peer_id: int) -> void: if state != State.JOINED_CLIENT: return _operator_peer_ids.erase(peer_id) - _peer_space_ids.erase(peer_id) _last_animation_state_by_peer.erase(peer_id) _pending_animation_state_by_peer.erase(peer_id) _registry.remove_peer(peer_id) @@ -1792,10 +1664,6 @@ func _apply_spawn_entry(entry: Dictionary) -> void: typeof(entry.get("peer_id")) != TYPE_INT or typeof(entry.get("profile_id")) != TYPE_STRING or typeof(entry.get("display_name")) != TYPE_STRING - or typeof(entry.get("player_title")) != TYPE_STRING - or not NetworkProfilePreferences.is_valid_title( - str(entry["player_title"]) - ) or typeof(entry.get("position")) != TYPE_ARRAY or typeof(entry.get("yaw")) not in [TYPE_FLOAT, TYPE_INT] or typeof(entry.get("sitting")) != TYPE_BOOL @@ -1830,7 +1698,6 @@ func _apply_spawn_entry(entry: Dictionary) -> void: str(entry.get("identity_fingerprint", "")), str(entry.get("identity_public_key", "")), _sanitized_capabilities(entry.get("capability_flags", [])), - str(entry["player_title"]), ): return peer_was_added = true @@ -1914,10 +1781,6 @@ func _make_spawn_entry( "peer_id": peer_id, "profile_id": record.profile_id if record != null else "", "display_name": display_name, - "player_title": ( - record.title - if record != null else NetworkProfilePreferences.DEFAULT_TITLE - ), "position": [ transform.origin.x, transform.origin.y, @@ -2002,7 +1865,6 @@ func verify_profile_authorization( display_name: String, appearance: Dictionary, authorization: Dictionary, - player_title: String = NetworkProfilePreferences.DEFAULT_TITLE, ) -> bool: var record := _registry.get_peer(peer_id) if record == null: @@ -2011,7 +1873,6 @@ func verify_profile_authorization( peer_id, record.profile_id, display_name, - player_title, appearance, record.identity_fingerprint, record.identity_public_key, @@ -2026,7 +1887,6 @@ func _verify_spawn_identity(entry: Dictionary) -> bool: int(entry.get("peer_id", 0)), str(entry.get("profile_id", "")), str(entry.get("display_name", "")), - str(entry.get("player_title", NetworkProfilePreferences.DEFAULT_TITLE)), Dictionary(entry.get("appearance", {})), str(entry.get("identity_fingerprint", "")), str(entry.get("identity_public_key", "")), @@ -2038,7 +1898,6 @@ func _verify_profile_authorization_fields( peer_id: int, profile_id: String, display_name: String, - player_title: String, appearance: Dictionary, fingerprint: String, identity_public_key: String, @@ -2049,8 +1908,6 @@ func _verify_profile_authorization_fields( ) if NetworkIdentityCrypto.fingerprint_public_pem(public_pem) != fingerprint: return false - if not NetworkProfilePreferences.is_valid_title(player_title): - return false if authorization.is_empty(): return peer_id == 1 if authorization.get("domain") == "handshake_client_profile": @@ -2061,7 +1918,6 @@ func _verify_profile_authorization_fields( appearance, fingerprint, authorization.get("signature", PackedByteArray()), - player_title, ) return NetworkIdentityCrypto.verify_fields( NetworkIdentityCrypto.load_public_key(public_pem), @@ -2085,7 +1941,6 @@ func _verify_profile_authorization_fields( return false var signed := authorization.duplicate(true) signed["display_name"] = display_name - signed["player_title"] = player_title signed["appearance"] = appearance return NetworkIdentityCrypto.verify_fields( NetworkIdentityCrypto.load_public_key(public_pem), @@ -2169,10 +2024,10 @@ func _maybe_send_local_input() -> void: if avatar == null: return var state_hash: int = avatar.get_network_input_state_hash() - var input_state_changed: bool = state_hash != _last_input_state_hash + var state_changed: bool = state_hash != _last_input_state_hash if ( avatar.has_active_network_input() - or input_state_changed + or state_changed or _idle_input_accumulator >= IDLE_INPUT_INTERVAL ): _send_local_input() @@ -2206,20 +2061,21 @@ func _maybe_send_local_animation_action() -> void: var avatar: Player = _spawn_service.get_avatar(peer_id) if avatar == null: return - var animation_state: Dictionary = avatar.make_network_animation_state() - var action: Dictionary = animation_state.get("action", {}) + var state: Dictionary = avatar.make_network_animation_state() + var action: Dictionary = state.get("action", {}) if not NetworkPlayerAnimationProtocol.validate_action_state(action): return var signature: Array = [ str(action["id"]), int(action["sequence"]), bool(action.get("paused", false)), + avatar.get_network_sitting_state(), ] if signature == _last_local_animation_action_signature: return var encoded: Array = _encode_movement_animation_action( action, - avatar.get_network_sitting_intent(), + avatar.get_network_sitting_state(), ) if encoded.is_empty(): return @@ -2262,15 +2118,11 @@ func submit_movement_animation_action(encoded: Array) -> void: if not is_host() or not _registry.has_peer(sender_id): return var avatar: Player = _spawn_service.get_avatar(sender_id) - var animation_state: Dictionary = _decode_movement_animation_action(encoded) - if avatar == null or animation_state.is_empty(): + var state: Dictionary = _decode_movement_animation_action(encoded) + if avatar == null or state.is_empty(): return - avatar.apply_authoritative_network_animation_action( - animation_state["action"] - ) - # Sitting is authoritative only on sequenced movement input. The legacy bit - # remains in this packet's wire shape for protocol compatibility, but acting - # on it here would race jump input across two independent ENet channels. + avatar.apply_authoritative_network_animation_action(state["action"]) + avatar.apply_authoritative_network_sitting_state(bool(state["sitting"])) static func _encode_movement_input(data: Dictionary) -> Array: @@ -2395,8 +2247,6 @@ func _broadcast_movement_snapshots() -> void: continue var snapshots: Array = [] for subject_id: int in peer_ids: - if not peers_share_space(recipient_id, subject_id): - continue var subject_avatar: Player = _spawn_service.get_avatar(subject_id) if subject_avatar == null: continue @@ -2465,50 +2315,42 @@ func _broadcast_movement_animation_updates(peer_ids: Array[int]) -> void: _animation_refresh_accumulator, ANIMATION_REFRESH_INTERVAL, ) - var updates_by_subject: Dictionary[int, Array] = {} + var updates: Array = [] for subject_id: int in peer_ids: var avatar: Player = _spawn_service.get_avatar(subject_id) if avatar == null: continue - var animation_state: Dictionary = avatar.make_network_animation_state() + var state: Dictionary = avatar.make_network_animation_state() var previous: Dictionary = _last_animation_state_by_peer.get( subject_id, {} ) if ( not refresh_all - and _movement_animation_signature(animation_state) + and _movement_animation_signature(state) == _movement_animation_signature(previous) ): continue - _last_animation_state_by_peer[subject_id] = animation_state.duplicate(true) - var encoded: Array = _encode_movement_animation( - subject_id, animation_state - ) + _last_animation_state_by_peer[subject_id] = state.duplicate(true) + var encoded: Array = _encode_movement_animation(subject_id, state) if not encoded.is_empty(): - updates_by_subject[subject_id] = encoded - if updates_by_subject.is_empty(): + updates.append(encoded) + if updates.is_empty(): return for recipient_id: int in peer_ids: if recipient_id == 1: continue - var updates: Array = [] - for subject_id: int in updates_by_subject: - if peers_share_space(recipient_id, subject_id): - updates.append(updates_by_subject[subject_id]) - if updates.is_empty(): - continue receive_movement_animations.rpc_id(recipient_id, updates) _movement_animation_packets_sent += 1 _movement_animation_states_sent += updates.size() -static func _movement_animation_signature(animation_state: Dictionary) -> Array: - if not NetworkPlayerAnimationProtocol.validate_state(animation_state): +static func _movement_animation_signature(state: Dictionary) -> Array: + if not NetworkPlayerAnimationProtocol.validate_state(state): return [] - var action: Dictionary = animation_state["action"] + var action: Dictionary = state["action"] return [ - str(animation_state["locomotion_id"]), - bool(animation_state["grounded"]), + str(state["locomotion_id"]), + bool(state["grounded"]), str(action["id"]), int(action["sequence"]), bool(action.get("paused", false)), @@ -2591,15 +2433,15 @@ static func _decode_movement_snapshot(value: Variant) -> Dictionary: static func _encode_movement_animation( peer_id: int, - animation_state: Dictionary, + state: Dictionary, ) -> Array: - if not NetworkPlayerAnimationProtocol.validate_state(animation_state): + if not NetworkPlayerAnimationProtocol.validate_state(state): return [] - var action: Dictionary = animation_state["action"] + var action: Dictionary = state["action"] return [ peer_id, - str(animation_state["locomotion_id"]), - bool(animation_state["grounded"]), + str(state["locomotion_id"]), + bool(state["grounded"]), str(action["id"]), int(action["sequence"]), float(action["elapsed"]), @@ -2622,7 +2464,7 @@ static func _decode_movement_animation(value: Variant) -> Dictionary: or typeof(fields[6]) != TYPE_BOOL ): return {} - var animation_state: Dictionary = NetworkPlayerAnimationProtocol.make_state( + var state: Dictionary = NetworkPlayerAnimationProtocol.make_state( StringName(str(fields[1])), bool(fields[2]), StringName(str(fields[3])), @@ -2632,10 +2474,10 @@ static func _decode_movement_animation(value: Variant) -> Dictionary: ) if ( int(fields[0]) <= 0 - or not NetworkPlayerAnimationProtocol.validate_state(animation_state) + or not NetworkPlayerAnimationProtocol.validate_state(state) ): return {} - return {"peer_id": int(fields[0]), "state": animation_state} + return {"peer_id": int(fields[0]), "state": state} static func _encode_movement_animation_action( @@ -2696,11 +2538,6 @@ func receive_movement_snapshots(encoded_snapshots: Array) -> void: if avatar == null: continue if peer_id == local_peer_id: - if ( - _reject_stale_space_transition_snapshot(snapshot) - or _reject_stale_authoritative_teleport_snapshot(snapshot) - ): - continue _discard_acknowledged_movement_inputs( int(snapshot.get("acknowledged_input", 0)) ) @@ -2718,64 +2555,6 @@ func receive_movement_snapshots(encoded_snapshots: Array) -> void: ) -func _reject_stale_space_transition_snapshot(snapshot: Dictionary) -> bool: - if not _local_space_transition_guard_active: - return false - var position_values: Array = snapshot.get("position", []) - if position_values.size() != 3: - return true - var position := Vector3( - float(position_values[0]), - float(position_values[1]), - float(position_values[2]), - ) - var acknowledged_input: int = int( - snapshot.get("acknowledged_input", 0) - ) - if acknowledged_input < _local_space_transition_minimum_ack: - return true - if acknowledged_input > _local_space_transition_minimum_ack: - _local_space_transition_guard_active = false - return false - if position.distance_to(_local_space_transition_guard_position) > ( - SPACE_TRANSITION_SNAPSHOT_GUARD_DISTANCE - ): - return true - _local_space_transition_guard_active = false - return false - - -func _reject_stale_authoritative_teleport_snapshot( - snapshot: Dictionary, -) -> bool: - if not _local_authoritative_teleport_guard_active: - return false - var position_values: Array = snapshot.get("position", []) - if position_values.size() != 3: - return true - var position := Vector3( - float(position_values[0]), - float(position_values[1]), - float(position_values[2]), - ) - var acknowledged_input: int = int( - snapshot.get("acknowledged_input", 0) - ) - if acknowledged_input < _local_authoritative_teleport_minimum_ack: - return true - # Movement input and reliable recovery RPCs travel on different channels. - # A higher input acknowledgement alone therefore does not prove that this - # snapshot was authored after the teleport; a held pre-recovery packet can - # arrive at the host late. Only a snapshot that is still near the teleported - # position is allowed to release the barrier. - if position.distance_to(_local_authoritative_teleport_guard_position) > ( - AUTHORITATIVE_TELEPORT_SNAPSHOT_GUARD_DISTANCE - ): - return true - _local_authoritative_teleport_guard_active = false - return false - - func _discard_acknowledged_movement_inputs(acknowledged_sequence: int) -> void: while ( not _pending_movement_inputs.is_empty() @@ -2943,16 +2722,11 @@ func request_safe_respawn(entry_position: Vector3) -> void: if not entry_position.is_finite(): return if is_host(): - remote_recovery_requested.emit(1, entry_position, _input_sequence) + remote_recovery_requested.emit(1, entry_position) elif state == State.JOINED_CLIENT: submit_safe_respawn_request.rpc_id( 1, - [ - entry_position.x, - entry_position.y, - entry_position.z, - _input_sequence, - ] + [entry_position.x, entry_position.y, entry_position.z] ) @@ -2962,18 +2736,9 @@ func submit_safe_respawn_request(position_data: Array) -> void: if ( not is_host() or not _registry.has_peer(sender_id) - or position_data.size() not in [3, 4] + or position_data.size() != 3 ): return - var recovery_input_sequence: int = -1 - if position_data.size() == 4: - if ( - typeof(position_data[3]) != TYPE_INT - or int(position_data[3]) < 0 - or int(position_data[3]) > MAX_MOVEMENT_INPUT_SEQUENCE - ): - return - recovery_input_sequence = int(position_data[3]) var entry_position := Vector3( float(position_data[0]), float(position_data[1]), @@ -2981,11 +2746,7 @@ func submit_safe_respawn_request(position_data: Array) -> void: ) if not entry_position.is_finite(): return - remote_recovery_requested.emit( - sender_id, - entry_position, - recovery_input_sequence, - ) + remote_recovery_requested.emit(sender_id, entry_position) @rpc("authority", "call_remote", "reliable", 0) @@ -2994,38 +2755,8 @@ func receive_authoritative_teleport(snapshot: Dictionary) -> void: return var peer_id: int = int(snapshot.get("peer_id", 0)) var avatar: Player = _spawn_service.get_avatar(peer_id) - if avatar == null or not avatar.apply_network_teleport(snapshot): - return - if peer_id != multiplayer.get_unique_id(): - return - _begin_local_authoritative_teleport_barrier( - avatar, - int(snapshot.get("acknowledged_input", 0)), - ) - - -func _begin_local_authoritative_teleport_barrier( - avatar: Player, - acknowledged_input: int, -) -> void: - if avatar == null or not avatar.global_position.is_finite(): - return - # A recovery teleport is a movement discontinuity, just like a home-space - # transition. Drop pre-teleport client prediction and request an immediate - # neutral input so the first post-teleport audit is unambiguous. - _pending_movement_inputs.clear() - _last_local_snapshot_received_msec = 0 - _last_input_state_hash = 0 - _idle_input_accumulator = IDLE_INPUT_INTERVAL - avatar.reset_local_prediction_after_authoritative_teleport() - _local_authoritative_teleport_guard_active = true - _local_authoritative_teleport_guard_position = avatar.global_position - _local_authoritative_teleport_minimum_ack = maxi(acknowledged_input, 0) - # Water recovery has already suppressed local movement, so this sends a - # neutral post-relocation input on the next server tick instead of waiting - # for the regular input cadence. - if avatar.is_water_recovery_active(): - submit_neutral_local_movement() + if avatar != null: + avatar.apply_network_teleport(snapshot) func _expire_pending_authentication(now: float) -> void: @@ -3152,18 +2883,11 @@ func _teardown_peer() -> void: _snapshot_accumulator = 0.0 _movement_snapshot_tick = 0 _last_local_snapshot_received_msec = 0 - _local_space_transition_guard_active = false - _local_space_transition_guard_position = Vector3.ZERO - _local_space_transition_minimum_ack = 0 - _local_authoritative_teleport_guard_active = false - _local_authoritative_teleport_guard_position = Vector3.ZERO - _local_authoritative_teleport_minimum_ack = 0 _animation_refresh_accumulator = 0.0 _last_animation_state_by_peer.clear() _pending_animation_state_by_peer.clear() _last_local_animation_action_signature.clear() _server_capabilities = PackedStringArray() - _peer_space_ids.clear() _server_identity_fingerprint = "" _server_identity_public_key = "" _session_identity_keys.clear() diff --git a/network/network_shop_protocol.gd b/network/network_shop_protocol.gd index e58556e..2de9cc1 100644 --- a/network/network_shop_protocol.gd +++ b/network/network_shop_protocol.gd @@ -4,8 +4,6 @@ extends RefCounted const CAPABILITY: StringName = &"shop_v1" const ART_CAPABILITY: StringName = &"art_shop_v1" const BACKPACK_CAPABILITY: StringName = &"backpack_shop_v1" -const DECOR_CAPABILITY: StringName = &"portable_home_v1" -const HOME_UPGRADE_CAPABILITY: StringName = &"home_upgrade_v1" const RELIABLE_CHANNEL: int = NetworkProtocol.SHOP_RELIABLE_CHANNEL const MAX_ID_LENGTH: int = 96 const MAX_MESSAGE_LENGTH: int = 160 @@ -16,11 +14,10 @@ enum ProductCategory { ROD, REEL_SPEED_UPGRADE, BARRIER_POWER_UPGRADE, - HOME_UPGRADE, + COOLER_CAPACITY_UPGRADE, ART_KIT, ART_UPGRADE, BACKPACK_CAPACITY_UPGRADE, - DECOR, } diff --git a/network/network_shop_service.gd b/network/network_shop_service.gd index e4d6f9c..6f31c40 100644 --- a/network/network_shop_service.gd +++ b/network/network_shop_service.gd @@ -8,14 +8,11 @@ const ItemDataType = preload("res://items/item_data.gd") const FishingRodDataType = preload("res://items/fishing_rod_data.gd") const OwnedItemType = preload("res://items/owned_item.gd") const ArtShopStockType = preload("res://economy/art_shop_stock.gd") -const DecorCatalogType = preload("res://homes/decor_catalog.gd") -const FISHING_SHOP_ID: StringName = &"main_fishing_shop" -const DECOR_SHOP_ID: StringName = &"rv_decor_shop" -const RV_UPGRADE_SHOP_ID: StringName = &"rv_upgrade_shop" +const SHOP_ID: StringName = &"main_fishing_shop" const REEL_PRODUCT_ID: StringName = &"reel_speed_upgrade" const BARRIER_PRODUCT_ID: StringName = &"barrier_power_upgrade" -const HOME_UPGRADE_PRODUCT_ID: StringName = &"starter_rv_upgrade" +const COOLER_PRODUCT_ID: StringName = &"cooler_capacity_upgrade" const BACKPACK_PRODUCT_ID: StringName = &"backpack_capacity_upgrade" const MAX_LEDGER_ENTRIES_PER_PEER: int = 64 @@ -34,8 +31,6 @@ var _session: NetworkSession var _spawn_service: PlayerSpawnService var _network_fishing: NetworkFishingService var _interaction: FishingShopInteraction -var _decor_interaction: DecorShopInteraction -var _rv_upgrade_interaction: FishingShopInteraction var _wallet: PlayerWallet var _bag: PlayerBag var _item_catalog: ItemCatalog @@ -52,8 +47,6 @@ var _received_results: Dictionary[String, bool] = {} var _applied_results: Dictionary[String, bool] = {} var _pending_local_request: Dictionary = {} var _reservations: PlayerAssetReservationService -var _home_state: PlayerHomeState -var _network_home: NetworkHomeService func setup( @@ -70,10 +63,6 @@ func setup( save_manager: PlayerSaveManager, reservations: PlayerAssetReservationService, inventory_layout: PlayerInventoryLayout = null, - home_state: PlayerHomeState = null, - network_home: NetworkHomeService = null, - decor_interaction: DecorShopInteraction = null, - rv_upgrade_interaction: FishingShopInteraction = null, ) -> void: _session = session _spawn_service = spawn_service @@ -88,10 +77,6 @@ func setup( _save_manager = save_manager _reservations = reservations _inventory_layout = inventory_layout - _home_state = home_state - _network_home = network_home - _decor_interaction = decor_interaction - _rv_upgrade_interaction = rv_upgrade_interaction if not _session.peer_removed.is_connected(_on_peer_removed): _session.peer_removed.connect(_on_peer_removed) if not _session.state_changed.is_connected(_on_session_state_changed): @@ -102,18 +87,6 @@ func set_shop_interaction(interaction: FishingShopInteraction) -> void: _interaction = interaction -func set_decor_shop_interaction( - interaction: DecorShopInteraction, -) -> void: - _decor_interaction = interaction - - -func set_rv_upgrade_shop_interaction( - interaction: FishingShopInteraction, -) -> void: - _rv_upgrade_interaction = interaction - - func can_request_purchase() -> bool: return ( _session != null @@ -151,32 +124,6 @@ func can_request_backpack_purchase() -> bool: ) -func can_request_decor_purchase() -> bool: - return ( - can_request_purchase() - and _home_state != null - and ( - _session.is_host() - or _session.supports_server_capability( - NetworkShopProtocol.DECOR_CAPABILITY - ) - ) - ) - - -func can_request_home_upgrade() -> bool: - return ( - can_request_purchase() - and _home_state != null - and ( - _session.is_host() - or _session.supports_server_capability( - NetworkShopProtocol.HOME_UPGRADE_CAPABILITY - ) - ) - ) - - func is_local_purchase_pending() -> bool: return not _pending_local_request.is_empty() @@ -227,12 +174,12 @@ func request_barrier_power_upgrade() -> String: ) -func request_home_upgrade() -> String: +func request_cooler_capacity_upgrade() -> String: return _request_purchase( - HOME_UPGRADE_PRODUCT_ID, - NetworkShopProtocol.ProductCategory.HOME_UPGRADE, + COOLER_PRODUCT_ID, + NetworkShopProtocol.ProductCategory.COOLER_CAPACITY_UPGRADE, 1, - _home_state.get_tier() if _home_state != null else 0 + _cooler_capacity.get_level() if _cooler_capacity != null else 0 ) @@ -246,15 +193,6 @@ func request_backpack_capacity_upgrade() -> String: ) -func request_decor(product_id: StringName) -> String: - return _request_purchase( - product_id, - NetworkShopProtocol.ProductCategory.DECOR, - 1, - _home_state.get_owned_count(product_id) if _home_state != null else 0, - ) - - func request_art_kit() -> String: return _request_purchase( ArtShopStockType.ART_KIT_ITEM_ID, @@ -331,30 +269,11 @@ func _request_purchase( product_id, category, 0, 0, ) return "" - if ( - category == NetworkShopProtocol.ProductCategory.HOME_UPGRADE - and not can_request_home_upgrade() - ): - local_purchase_finished.emit( - "", false, "RV upgrades require a newer server.", - product_id, category, 0, 0, - ) - return "" - if ( - category == NetworkShopProtocol.ProductCategory.DECOR - and not can_request_decor_purchase() - ): - local_purchase_finished.emit( - "", false, "Decor require a newer server.", - product_id, category, 0, 0, - ) - return "" var request_id: String = _new_id("shop") - var shop_id: StringName = _shop_id_for_category(category) var request: Dictionary = { "request_id": request_id, "session_id": _session.get_session_id(), - "shop_id": str(shop_id), + "shop_id": str(SHOP_ID), "product_id": str(product_id), "category": category, "quantity": quantity, @@ -426,38 +345,16 @@ func _handle_purchase_request(peer_id: int, data: Dictionary) -> void: _rejected_result(data, "A purchase is already pending.") ) return - var requested_shop_id := StringName(str(data["shop_id"])) - if not _is_shop_available_for_peer(peer_id, requested_shop_id): + if not _is_shop_available_for_peer(peer_id): var avatar: Player = _spawn_service.get_avatar(peer_id) - var requested_interaction: FishingShopInteraction = ( - _interaction_for_shop(requested_shop_id) - ) var message: String = ( "The shop is unavailable." - if avatar == null or requested_interaction == null + if avatar == null or _interaction == null else "Move closer to the shop." ) _record_and_send(peer_id, _rejected_result(data, message)) return var result: Dictionary = _build_authoritative_result(peer_id, data) - if ( - bool(result.get("accepted", false)) - and _network_home != null - ): - match int(result.get("category", -1)): - NetworkShopProtocol.ProductCategory.DECOR: - _network_home.authorize_decor_purchase( - peer_id, - StringName(str(result["product_id"])), - int(result["resulting_state"]), - str(result["result_id"]), - ) - NetworkShopProtocol.ProductCategory.HOME_UPGRADE: - _network_home.authorize_home_upgrade( - peer_id, - int(result["resulting_state"]), - str(result["result_id"]), - ) _pending_by_peer[peer_id] = request_id _record_and_send(peer_id, result) @@ -471,29 +368,10 @@ func _build_authoritative_result( var quantity: int = request["quantity"] var wallet_balance: int = request["wallet_balance"] var current_state: int = request["current_state"] - if ( - category == NetworkShopProtocol.ProductCategory.DECOR - and _network_home != null - ): - var authoritative_count: int = ( - _network_home.get_authoritative_owned_count(peer_id, product_id) - ) - if authoritative_count >= 0: - current_state = authoritative_count - elif ( - category == NetworkShopProtocol.ProductCategory.HOME_UPGRADE - and _network_home != null - ): - var authoritative_tier: int = ( - _network_home.get_authoritative_home_tier(peer_id) - ) - if authoritative_tier >= 0: - current_state = authoritative_tier var cost: int = -1 var resulting_state: int = current_state var rejection: String = "" - var expected_shop_id: StringName = _shop_id_for_category(category) - if StringName(str(request["shop_id"])) != expected_shop_id: + if StringName(str(request["shop_id"])) != SHOP_ID: rejection = "The shop is unavailable." elif quantity < 1: rejection = "Purchase could not be completed." @@ -606,14 +484,18 @@ func _build_authoritative_result( ] ) resulting_state = current_state + 1 - NetworkShopProtocol.ProductCategory.HOME_UPGRADE: + NetworkShopProtocol.ProductCategory.COOLER_CAPACITY_UPGRADE: if ( - product_id != HOME_UPGRADE_PRODUCT_ID - or current_state >= PlayerHomeState.MAX_TIER + product_id != COOLER_PRODUCT_ID + or current_state >= PlayerCoolerCapacity.MAX_LEVEL ): rejection = "Upgrade is already at maximum." else: - cost = PlayerHomeState.HOME_UPGRADE_COSTS[current_state] + cost = ( + PlayerCoolerCapacity.EXPANSION_COSTS[ + current_state + ] + ) resulting_state = current_state + 1 NetworkShopProtocol.ProductCategory.BACKPACK_CAPACITY_UPGRADE: if ( @@ -663,19 +545,6 @@ func _build_authoritative_result( resulting_state = PlayerArtUnlocks.resulting_mask( current_state, product_id ) - NetworkShopProtocol.ProductCategory.DECOR: - cost = DecorCatalogType.get_price(product_id) - if ( - not DecorCatalogType.has_product(product_id) - or quantity != 1 - or current_state < 0 - or current_state - >= DecorCatalogType.MAX_OWNED_PER_PRODUCT - or cost < 0 - ): - rejection = "Decor is unavailable." - else: - resulting_state = current_state + 1 if rejection.is_empty() and (cost < 0 or wallet_balance < cost): rejection = "Insufficient funds." if not rejection.is_empty(): @@ -798,9 +667,6 @@ func _apply_purchase_result(data: Dictionary) -> void: if _inventory_layout != null else 0 ) var art_snapshot: int = _art_unlocks.get_unlock_mask() - var home_snapshot: Dictionary = ( - _home_state.to_save_data() if _home_state != null else {} - ) var applied: bool = _apply_local_product(data) if not applied or not _save_manager.save_if_dirty(): _bag.replace_all_items(bag_snapshot) @@ -810,8 +676,6 @@ func _apply_purchase_result(data: Dictionary) -> void: if _inventory_layout != null: _inventory_layout.restore_backpack_level(backpack_snapshot) _art_unlocks.restore_mask(art_snapshot) - if _home_state != null and not home_snapshot.is_empty(): - _home_state.restore_from_save_data(home_snapshot) _wallet.restore_balance(wallet_snapshot) _save_manager.save_if_dirty() _fail_local_apply(data, "Purchase could not be completed.") @@ -832,7 +696,6 @@ func _validate_local_result(data: Dictionary) -> String: or _cooler_capacity == null or _art_unlocks == null or _save_manager == null - or _home_state == null or _wallet.get_balance() != int(data["expected_wallet"]) or str(data["product_id"]) != str(_pending_local_request.get("product_id", "")) @@ -907,12 +770,10 @@ func _validate_local_result(data: Dictionary) -> String: return "Purchase could not be completed." if _upgrades.get_next_barrier_power_cost() != cost: return "Purchase could not be completed." - NetworkShopProtocol.ProductCategory.HOME_UPGRADE: - if ( - product_id != HOME_UPGRADE_PRODUCT_ID - or _home_state.get_tier() != expected_state - or _home_state.get_next_upgrade_cost() != cost - ): + NetworkShopProtocol.ProductCategory.COOLER_CAPACITY_UPGRADE: + if _cooler_capacity.get_level() != expected_state: + return "Purchase could not be completed." + if _cooler_capacity.get_next_cost() != cost: return "Purchase could not be completed." NetworkShopProtocol.ProductCategory.BACKPACK_CAPACITY_UPGRADE: if ( @@ -945,20 +806,6 @@ func _validate_local_result(data: Dictionary) -> String: or cost != ArtShopStockType.UPGRADE_PRICE ): return "Purchase could not be completed." - NetworkShopProtocol.ProductCategory.DECOR: - if ( - not DecorCatalogType.has_product(product_id) - or _home_state.get_owned_count(product_id) != expected_state - or resulting_state != expected_state + 1 - or cost != DecorCatalogType.get_price(product_id) - or expected_state >= DecorCatalogType.MAX_OWNED_PER_PRODUCT - or not _bag.can_add_item(product_id, 1) - ): - return ( - "Your inventory is full." - if not _bag.can_add_item(product_id, 1) - else "Purchase could not be completed." - ) _: return "Purchase could not be completed." return "" @@ -982,11 +829,8 @@ func _apply_local_product(data: Dictionary) -> bool: return _upgrades.purchase_reel_speed(_wallet) NetworkShopProtocol.ProductCategory.BARRIER_POWER_UPGRADE: return _upgrades.purchase_barrier_power(_wallet) - NetworkShopProtocol.ProductCategory.HOME_UPGRADE: - return ( - _wallet.debit(int(data["total_cost"])) - and _home_state.upgrade_to_next_tier() - ) + NetworkShopProtocol.ProductCategory.COOLER_CAPACITY_UPGRADE: + return _cooler_capacity.purchase(_wallet) NetworkShopProtocol.ProductCategory.BACKPACK_CAPACITY_UPGRADE: return ( _inventory_layout != null @@ -1001,12 +845,6 @@ func _apply_local_product(data: Dictionary) -> bool: return _art_unlocks.purchase_product( product_id, _wallet, int(data["total_cost"]) ) - NetworkShopProtocol.ProductCategory.DECOR: - return ( - _wallet.debit(int(data["total_cost"])) - and _bag.add_item(product_id, 1) - and _home_state.add_owned_decor(product_id, 1) - ) return false @@ -1083,7 +921,7 @@ func _handle_acknowledgement( peer_id: int, result_id: String, request_id: String, - applied: bool, + _applied: bool, message: String, ) -> void: if ( @@ -1095,31 +933,20 @@ func _handle_acknowledgement( or _result_owners.get(result_id, 0) != peer_id ): return - if _network_home != null: - _network_home.finalize_decor_purchase( - peer_id, result_id, applied - ) - _network_home.finalize_home_upgrade( - peer_id, result_id, applied - ) _acknowledged_results[result_id] = true _bound_dictionary(_acknowledged_results) if _pending_by_peer.get(peer_id, "") == request_id: _pending_by_peer.erase(peer_id) -func _is_shop_available_for_peer( - peer_id: int, - shop_id: StringName, -) -> bool: - var interaction: FishingShopInteraction = _interaction_for_shop(shop_id) +func _is_shop_available_for_peer(peer_id: int) -> bool: if ( _session == null or not _session.is_host() or not _session.is_gameplay_session_active() or _spawn_service == null - or interaction == null - or not is_instance_valid(interaction) + or _interaction == null + or not is_instance_valid(_interaction) ): return false var avatar: Player = _spawn_service.get_avatar(peer_id) @@ -1130,28 +957,10 @@ func _is_shop_available_for_peer( _network_fishing == null or not _network_fishing.has_peer_attempt(peer_id) ) - and interaction.is_avatar_in_range(avatar) + and _interaction.is_avatar_in_range(avatar) ) -func _shop_id_for_category(category: int) -> StringName: - match category: - NetworkShopProtocol.ProductCategory.DECOR: - return DECOR_SHOP_ID - NetworkShopProtocol.ProductCategory.HOME_UPGRADE: - return RV_UPGRADE_SHOP_ID - return FISHING_SHOP_ID - - -func _interaction_for_shop(shop_id: StringName) -> FishingShopInteraction: - match shop_id: - DECOR_SHOP_ID: - return _decor_interaction - RV_UPGRADE_SHOP_ID: - return _rv_upgrade_interaction - return _interaction - - func _on_peer_removed(peer_id: int) -> void: _request_ledgers.erase(peer_id) _pending_by_peer.erase(peer_id) diff --git a/network/network_surface_drawing_service.gd b/network/network_surface_drawing_service.gd index 5f6c52e..4edc234 100644 --- a/network/network_surface_drawing_service.gd +++ b/network/network_surface_drawing_service.gd @@ -31,14 +31,6 @@ const ARTWORK_DIRECTORY_NAME: String = "artwork" const STAMP_ALPHA_THRESHOLD: float = 0.5 const STAMP_COLOR_TOLERANCE: float = 0.012 const INVALID_POINTER_SCREEN_POSITION := Vector2(-1.0, -1.0) -const SNAPSHOT_CANVASES_PER_FRAME: int = 2 -# A maximum-size 128 x 128 canvas consumes this entire budget, preventing -# late-join synchronization from building two large artwork textures at once. -const SNAPSHOT_GRID_CELLS_PER_FRAME: int = 16384 -const FINALIZED_NODE_LOAD_DISTANCE: float = 108.0 -const FINALIZED_NODE_UNLOAD_DISTANCE: float = 128.0 -const FINALIZED_STREAM_INTERVAL_MSEC: int = 250 -const FINALIZED_NODE_LOADS_PER_PASS: int = 1 enum GuideAction { NONE, @@ -57,10 +49,7 @@ var _art_unlocks: PlayerArtUnlocks var _data_root: PlayerDataRoot var _drawing_root: Node3D var _canvas_states: Dictionary[String, Dictionary] = {} -var _canvas_cells: Dictionary[String, SurfaceDrawingCellBuffer] = {} var _canvas_nodes: Dictionary[String, SurfaceDrawingCanvas] = {} -var _snapshot_queues: Dictionary[int, Array] = {} -var _last_finalized_stream_msec: int = 0 var _selected_canvas_id: String = "" var _hovered_canvas_id: String = "" var _last_hovered_canvas_id: String = "" @@ -261,11 +250,7 @@ func activate( _pointer_screen_position = _clamped_pointer_position( initial_pointer_position ) - # Art-kit activation can occur while the prior right-click camera drag is - # still held. Stop that drag before recording a return mode, then restore - # normal camera availability so right-click continues to work while drawing. - _stop_camera_drag_for_art_kit() - _prior_mouse_mode = _get_restorable_mouse_mode(Input.mouse_mode) + _prior_mouse_mode = Input.mouse_mode Input.mouse_mode = Input.MOUSE_MODE_VISIBLE _update_aim() _refresh_stencil_visibility() @@ -281,10 +266,6 @@ func deactivate() -> void: _eraser_mode = false _clear_armed_guide_action(false) _camera_look_active = false - # Do not leave a drag captured when drawing is closed by a menu, hotbar - # change, or session transition. The next camera drag must start on a fresh - # physical right-click press. - _stop_camera_drag_for_art_kit() _reset_stroke() _selected_canvas_id = "" _hovered_canvas_id = "" @@ -292,24 +273,10 @@ func deactivate() -> void: _aim_hit.clear() _hide_previews() _refresh_stencil_visibility() - Input.mouse_mode = _get_restorable_mouse_mode(_prior_mouse_mode) + Input.mouse_mode = _prior_mouse_mode _emit_hud_state("") -func _stop_camera_drag_for_art_kit() -> void: - if _local_player == null or not is_instance_valid(_local_player): - return - var camera_input_enabled: bool = _local_player.is_camera_input_enabled() - _local_player.set_camera_input_enabled(false) - _local_player.set_camera_input_enabled(camera_input_enabled) - - -func _get_restorable_mouse_mode(mouse_mode: Input.MouseMode) -> Input.MouseMode: - if mouse_mode == Input.MOUSE_MODE_CAPTURED: - return Input.MOUSE_MODE_VISIBLE - return mouse_mode - - func is_active() -> bool: return _active @@ -764,8 +731,8 @@ func get_canvas_count() -> int: func get_painted_cell_count() -> int: var count: int = 0 - for buffer: SurfaceDrawingCellBuffer in _canvas_cells.values(): - count += buffer.get_painted_count() + for state: Dictionary in _canvas_states.values(): + count += (state.get("cells", []) as Array).size() return count @@ -818,13 +785,7 @@ func get_canvas_ids() -> Array[String]: func get_canvas_state(canvas_id: String) -> Dictionary: - var state: Dictionary = _canvas_states.get(canvas_id, {}) - var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get(canvas_id) - if state.is_empty() or buffer == null: - return {} - var result: Dictionary = state.duplicate(true) - result["cells"] = buffer.to_cells() - return result + return Dictionary(_canvas_states.get(canvas_id, {})).duplicate(true) func is_stamp_mode() -> bool: @@ -918,7 +879,7 @@ func export_canvas_png(canvas_id: String) -> String: _emit_hud_state("paint something before exporting") return "" if _data_root == null or _data_root.root_path.is_empty(): - _emit_hud_state("choose a straywild data folder before exporting") + _emit_hud_state("choose a NETfishing data folder before exporting") return "" var export_directory: String = _artwork_directory() if DirAccess.make_dir_recursive_absolute(export_directory) != OK: @@ -1029,7 +990,7 @@ func _stamp_entry_is_unlocked(entry: Dictionary) -> bool: func _next_artwork_export_path(directory: String) -> String: var date_time: Dictionary = Time.get_datetime_dict_from_system() - var stem: String = "straywild-artwork-%04d%02d%02d-%02d%02d%02d" % [ + var stem: String = "netfishing-artwork-%04d%02d%02d-%02d%02d%02d" % [ int(date_time.get("year", 0)), int(date_time.get("month", 0)), int(date_time.get("day", 0)), @@ -1046,8 +1007,6 @@ func _next_artwork_export_path(directory: String) -> String: func _process(_delta: float) -> void: - _pump_snapshot_queues() - _refresh_finalized_canvas_streaming() if not _active: return if not can_activate(): @@ -1332,8 +1291,8 @@ func _handle_canvas_request(peer_id: int, data: Dictionary) -> void: or not _peer_can_place_grid(peer_id, requested_size) or _canvas_states.size() >= SurfaceDrawingProtocol.MAX_CANVASES or _active_canvas_count() >= SurfaceDrawingProtocol.MAX_ACTIVE_CANVASES - or _allocated_active_grid_cells() + requested_size * requested_size - > SurfaceDrawingProtocol.MAX_ACTIVE_GRID_CELLS + or _allocated_grid_cells() + requested_size * requested_size + > SurfaceDrawingProtocol.MAX_SESSION_GRID_CELLS ): return var avatar: Player = _spawn_service.get_avatar(peer_id) @@ -1419,10 +1378,8 @@ func _handle_stamp_request(peer_id: int, data: Dictionary) -> void: or not _accept_request(peer_id, str(data["request_id"])) or not _peer_can_stamp(peer_id, data) or _canvas_states.size() >= SurfaceDrawingProtocol.MAX_CANVASES - or _finalized_canvas_count() - >= SurfaceDrawingProtocol.MAX_FINALIZED_CANVASES - or _allocated_finalized_grid_cells() + requested_size * requested_size - > SurfaceDrawingProtocol.MAX_FINALIZED_GRID_CELLS + or _allocated_grid_cells() + requested_size * requested_size + > SurfaceDrawingProtocol.MAX_SESSION_GRID_CELLS ): return var avatar: Player = _spawn_service.get_avatar(peer_id) @@ -1463,12 +1420,6 @@ func _handle_stamp_request(peer_id: int, data: Dictionary) -> void: var canvas_id: String = "%s-%d" % [ _session.get_session_id().left(16), _canvas_sequence, ] - var stamp_colors: PackedByteArray = data["pixels"] - var stamp_authors := PackedInt32Array() - stamp_authors.resize(stamp_colors.size()) - for cell_key: int in stamp_colors.size(): - if stamp_colors[cell_key] > 0: - stamp_authors[cell_key] = 1 var state: Dictionary = { "session_id": _session.get_session_id(), "canvas_id": canvas_id, @@ -1486,9 +1437,9 @@ func _handle_stamp_request(peer_id: int, data: Dictionary) -> void: "layer": _canvas_sequence, "creator_fingerprint": record.identity_fingerprint, "participant_fingerprints": [record.identity_fingerprint], - "cell_encoding": SurfaceDrawingProtocol.CELL_ENCODING, - "cell_colors": stamp_colors, - "cell_authors": stamp_authors, + "cells": _stamp_cells( + data["pixels"], requested_size, record.identity_fingerprint + ), "stamp": true, } _apply_canvas_state(state) @@ -1496,6 +1447,27 @@ func _handle_stamp_request(peer_id: int, data: Dictionary) -> void: _emit_hud_state("stamp placed • finalized artwork shared with everyone") +func _stamp_cells( + pixels: PackedByteArray, + grid_size: int, + author_fingerprint: String, +) -> Array[Dictionary]: + var result: Array[Dictionary] = [] + var palette_ids: Array[StringName] = SurfaceDrawingPalette.get_color_ids() + for cell_key: int in range(pixels.size()): + var palette_index: int = pixels[cell_key] + if palette_index <= 0: + continue + var cell_y: int = floori(float(cell_key) / float(grid_size)) + result.append({ + "x": cell_key % grid_size, + "y": cell_y, + "color_id": str(palette_ids[palette_index - 1]), + "author_fingerprint": author_fingerprint, + }) + return result + + @rpc( "any_peer", "call_remote", @@ -1535,18 +1507,6 @@ func _handle_guide_request(peer_id: int, data: Dictionary) -> void: var finalized: bool = bool(data["finalized"]) if was_finalized: return - if ( - finalized - and ( - _finalized_canvas_count() - >= SurfaceDrawingProtocol.MAX_FINALIZED_CANVASES - or _allocated_finalized_grid_cells() - + int(state["width"]) * int(state["height"]) - > SurfaceDrawingProtocol.MAX_FINALIZED_GRID_CELLS - ) - ): - _emit_hud_state("finished artwork limit reached for this session") - return var guide_visible: bool = bool(data["guide_visible"]) and not finalized if ( bool(state.get("guide_visible", true)) == guide_visible @@ -1792,23 +1752,18 @@ func _queue_overlapping_finished_mutations( ).normalized() if normal.dot(target_normal) < 0.9: continue + var canvas: SurfaceDrawingCanvas = _canvas_nodes.get(canvas_id) if ( - not _state_contains_world_point( - state, + canvas == null + or not canvas.contains_world_point( world_position, SurfaceDrawingCanvas.SURFACE_SAMPLE_DEPTH + 0.05, ) ): continue - var center_cell: Vector2i = _state_cell_at_world_point( - state, world_position - ) + var center_cell: Vector2i = canvas.cell_at_world_point(world_position) if center_cell.x < 0: continue - var tangent: Vector3 = SurfaceDrawingProtocol.array_to_vector( - state["tangent"] - ).normalized() - var bitangent: Vector3 = normal.cross(tangent).normalized() for y_offset: int in range(-1, 2): for x_offset: int in range(-1, 2): var cell := Vector2i( @@ -1817,19 +1772,19 @@ func _queue_overlapping_finished_mutations( ) if ( cell.x < 0 - or cell.x >= int(state["width"]) + or cell.x >= canvas.grid_width or cell.y < 0 - or cell.y >= int(state["height"]) + or cell.y >= canvas.grid_height ): continue var relative: Vector3 = ( - _state_cell_position(state, cell.x, cell.y) + canvas.get_cell_world_position(cell.x, cell.y) - world_position ) if ( - absf(relative.dot(tangent)) + absf(relative.dot(canvas.get_surface_tangent())) >= SurfaceDrawingProtocol.CELL_SIZE - or absf(relative.dot(bitangent)) + or absf(relative.dot(canvas.get_surface_bitangent())) >= SurfaceDrawingProtocol.CELL_SIZE or _state_cell(state, cell.x, cell.y).is_empty() ): @@ -1884,9 +1839,11 @@ func _publish_cell_mutations( canvas_ids.sort() for canvas_id: String in canvas_ids: var state: Dictionary = _canvas_states.get(canvas_id, {}) - var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get(canvas_id) - if state.is_empty() or buffer == null: + if state.is_empty(): continue + var cells: Dictionary[int, Dictionary] = _cells_by_key( + state["cells"], int(state["width"]) + ) var canvas_mutations: Dictionary = mutations[canvas_id] var cell_keys: Array[int] = [] for cell_key_value: Variant in canvas_mutations.keys(): @@ -1895,11 +1852,18 @@ func _publish_cell_mutations( var edits: Array[Dictionary] = [] for cell_key: int in cell_keys: var edit: Dictionary = canvas_mutations[cell_key] + if str(edit["color_id"]).is_empty(): + cells.erase(cell_key) + else: + cells[cell_key] = edit.duplicate(true) edits.append(edit.duplicate(true)) - if edits.is_empty() or not buffer.apply_edits(edits): + if edits.is_empty(): continue state["revision"] = int(state["revision"]) + 1 - state["participant_fingerprints"] = buffer.get_participants() + state["cells"] = _sorted_cells(cells) + state["participant_fingerprints"] = _merged_participants( + state, {"edits": edits} + ) _canvas_states[canvas_id] = state var update: Dictionary = { "session_id": _session.get_session_id(), @@ -1912,7 +1876,7 @@ func _publish_cell_mutations( } var local_canvas: SurfaceDrawingCanvas = _canvas_nodes.get(canvas_id) if local_canvas != null: - local_canvas.apply_buffered_update(update) + local_canvas.apply_update(update) _broadcast_canvas_update(update) _emit_artwork_changed() @@ -2082,13 +2046,8 @@ func request_canvas_snapshot(request_id: String) -> void: ) ): return - var canvas_ids: Array[String] = get_canvas_ids() - canvas_ids.sort_custom(func(first: String, second: String) -> bool: - return _snapshot_canvas_precedes(first, second, sender_id) - ) - var queued: Array = [] - queued.assign(canvas_ids) - _snapshot_queues[sender_id] = queued + for state: Dictionary in _canvas_states.values(): + receive_canvas_state.rpc_id(sender_id, state) func _apply_canvas_state(data: Dictionary) -> void: @@ -2104,21 +2063,12 @@ func _apply_canvas_state(data: Dictionary) -> void: and int(data["revision"]) <= int(previous_state["revision"]) ): return - var buffer := SurfaceDrawingCellBuffer.new() - if not buffer.configure_from_state(data, true): - return var normalized_state: Dictionary = data.duplicate(true) - normalized_state.erase("cells") - normalized_state.erase("cell_encoding") - normalized_state.erase("cell_colors") - normalized_state.erase("cell_authors") - normalized_state["participant_fingerprints"] = buffer.get_participants() + normalized_state["participant_fingerprints"] = _state_participants( + normalized_state + ) _canvas_states[canvas_id] = normalized_state - _canvas_cells[canvas_id] = buffer - if _should_load_canvas_node(normalized_state, FINALIZED_NODE_LOAD_DISTANCE): - _rebuild_canvas_node(normalized_state, buffer) - else: - _unload_canvas_node(canvas_id) + _rebuild_canvas_node(normalized_state) _refresh_stencil_visibility() _emit_artwork_changed() if ( @@ -2133,10 +2083,7 @@ func _apply_canvas_state(data: Dictionary) -> void: ) -func _rebuild_canvas_node( - data: Dictionary, - buffer: SurfaceDrawingCellBuffer, -) -> void: +func _rebuild_canvas_node(data: Dictionary) -> void: var canvas_id: String = str(data["canvas_id"]) var previous_canvas: SurfaceDrawingCanvas = _canvas_nodes.get(canvas_id) if previous_canvas != null: @@ -2144,82 +2091,12 @@ func _rebuild_canvas_node( var canvas := SurfaceDrawingCanvas.new() canvas.name = "Drawing_%s" % canvas_id _drawing_root.add_child(canvas) - if not canvas.setup(data, _relationships, SOLID_SURFACE_MASK, buffer): + if not canvas.setup(data, _relationships, SOLID_SURFACE_MASK): canvas.queue_free() return _canvas_nodes[canvas_id] = canvas -func _refresh_finalized_canvas_streaming() -> void: - var now: int = Time.get_ticks_msec() - if now - _last_finalized_stream_msec < FINALIZED_STREAM_INTERVAL_MSEC: - return - _last_finalized_stream_msec = now - for canvas_id: String in _canvas_nodes.keys(): - var state: Dictionary = _canvas_states.get(canvas_id, {}) - if ( - bool(state.get("finalized", false)) - and not _should_load_canvas_node( - state, FINALIZED_NODE_UNLOAD_DISTANCE - ) - ): - _unload_canvas_node(canvas_id) - var candidates: Array[String] = [] - for canvas_id: String in _canvas_states: - var state: Dictionary = _canvas_states[canvas_id] - if ( - not _canvas_nodes.has(canvas_id) - and _should_load_canvas_node(state, FINALIZED_NODE_LOAD_DISTANCE) - ): - candidates.append(canvas_id) - candidates.sort_custom(func(first: String, second: String) -> bool: - return _canvas_distance_squared(first) < _canvas_distance_squared(second) - ) - for index: int in mini(candidates.size(), FINALIZED_NODE_LOADS_PER_PASS): - var canvas_id: String = candidates[index] - var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get(canvas_id) - if buffer != null: - _rebuild_canvas_node(_canvas_states[canvas_id], buffer) - - -func _should_load_canvas_node(state: Dictionary, distance: float) -> bool: - if state.is_empty(): - return false - if not bool(state.get("finalized", false)): - return true - if _local_player == null or not is_instance_valid(_local_player): - return false - return _local_player.global_position.distance_squared_to( - SurfaceDrawingProtocol.array_to_vector(state["origin"]) - ) <= distance * distance - - -func _canvas_distance_squared(canvas_id: String) -> float: - var state: Dictionary = _canvas_states.get(canvas_id, {}) - if ( - state.is_empty() - or _local_player == null - or not is_instance_valid(_local_player) - ): - return INF - return _local_player.global_position.distance_squared_to( - SurfaceDrawingProtocol.array_to_vector(state["origin"]) - ) - - -func _unload_canvas_node(canvas_id: String) -> void: - var canvas: SurfaceDrawingCanvas = _canvas_nodes.get(canvas_id) - if canvas != null: - canvas.queue_free() - _canvas_nodes.erase(canvas_id) - if _selected_canvas_id == canvas_id: - _selected_canvas_id = "" - if _hovered_canvas_id == canvas_id: - _hovered_canvas_id = "" - if _last_hovered_canvas_id == canvas_id: - _last_hovered_canvas_id = "" - - func _apply_canvas_update(data: Dictionary) -> void: if ( not SurfaceDrawingProtocol.validate_canvas_update(data) @@ -2228,14 +2105,12 @@ func _apply_canvas_update(data: Dictionary) -> void: return var canvas_id: String = str(data["canvas_id"]) var state: Dictionary = _canvas_states.get(canvas_id, {}) - var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get(canvas_id) var canvas: SurfaceDrawingCanvas = _canvas_nodes.get(canvas_id) - if ( - state.is_empty() - or buffer == null - or int(data["revision"]) <= int(state["revision"]) - ): + if state.is_empty() or canvas == null or int(data["revision"]) <= int(state["revision"]): return + var cells: Dictionary[int, Dictionary] = _cells_by_key( + state["cells"], int(state["width"]) + ) var grid_width: int = int(state["width"]) var grid_height: int = int(state["height"]) for edit_value: Variant in data["edits"]: @@ -2244,13 +2119,18 @@ func _apply_canvas_update(data: Dictionary) -> void: var y: int = int(edit["y"]) if x < 0 or x >= grid_width or y < 0 or y >= grid_height: return - if not buffer.apply_edits(data["edits"]): - return + var key: int = y * grid_width + x + if str(edit["color_id"]).is_empty(): + cells.erase(key) + else: + cells[key] = edit.duplicate(true) state["revision"] = int(data["revision"]) - state["participant_fingerprints"] = buffer.get_participants() + state["cells"] = _sorted_cells(cells) + state["participant_fingerprints"] = _merged_participants( + state, data + ) _canvas_states[canvas_id] = state - if canvas != null: - canvas.apply_buffered_update(data) + canvas.apply_update(data) _emit_artwork_changed() @@ -2265,6 +2145,7 @@ func _apply_guide_update(data: Dictionary) -> void: var canvas: SurfaceDrawingCanvas = _canvas_nodes.get(canvas_id) if ( state.is_empty() + or canvas == null or int(data["revision"]) <= int(state["revision"]) ): return @@ -2276,13 +2157,8 @@ func _apply_guide_update(data: Dictionary) -> void: state["participant_fingerprints"] = _merged_participants( state, data ) - var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get(canvas_id) - if buffer != null: - buffer.ensure_participants(state["participant_fingerprints"]) - state["participant_fingerprints"] = buffer.get_participants() _canvas_states[canvas_id] = state - if canvas != null: - canvas.apply_guide_update(data) + canvas.apply_guide_update(data) if _active: _emit_hud_state( "grid finalized • new grids may overlap its artwork" @@ -2295,90 +2171,13 @@ func _apply_guide_update(data: Dictionary) -> void: func _broadcast_canvas_state(data: Dictionary) -> void: - var network_state: Dictionary = _network_canvas_state( - str(data.get("canvas_id", "")) - ) - if network_state.is_empty(): - return for peer_id: int in _session.get_authenticated_peer_ids(): if peer_id == _session.get_local_peer_id(): continue if _session.peer_supports_capability( peer_id, SurfaceDrawingProtocol.CAPABILITY ): - receive_canvas_state.rpc_id(peer_id, network_state) - - -func _network_canvas_state(canvas_id: String) -> Dictionary: - var state: Dictionary = _canvas_states.get(canvas_id, {}) - var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get(canvas_id) - if state.is_empty() or buffer == null: - return {} - var result: Dictionary = state.duplicate(true) - result.merge(buffer.to_compact_fields(), true) - return result - - -func _pump_snapshot_queues() -> void: - if _session == null or not _session.is_host() or _snapshot_queues.is_empty(): - return - var peer_ids: Array[int] = [] - peer_ids.assign(_snapshot_queues.keys()) - peer_ids.sort() - for peer_id: int in peer_ids: - if not _session.is_authenticated_peer(peer_id): - _snapshot_queues.erase(peer_id) - continue - var queue: Array = _snapshot_queues.get(peer_id, []) - var sent_count: int = 0 - var sent_grid_cells: int = 0 - while not queue.is_empty() and sent_count < SNAPSHOT_CANVASES_PER_FRAME: - var canvas_id: String = str(queue.front()) - var state: Dictionary = _canvas_states.get(canvas_id, {}) - if state.is_empty(): - queue.pop_front() - continue - var grid_cells: int = int(state["width"]) * int(state["height"]) - if ( - sent_count > 0 - and sent_grid_cells + grid_cells > SNAPSHOT_GRID_CELLS_PER_FRAME - ): - break - queue.pop_front() - var network_state: Dictionary = _network_canvas_state(canvas_id) - if network_state.is_empty(): - continue - receive_canvas_state.rpc_id(peer_id, network_state) - sent_count += 1 - sent_grid_cells += grid_cells - if queue.is_empty(): - _snapshot_queues.erase(peer_id) - else: - _snapshot_queues[peer_id] = queue - - -func _snapshot_canvas_precedes( - first_id: String, - second_id: String, - peer_id: int, -) -> bool: - var first: Dictionary = _canvas_states.get(first_id, {}) - var second: Dictionary = _canvas_states.get(second_id, {}) - var first_finalized: bool = bool(first.get("finalized", false)) - var second_finalized: bool = bool(second.get("finalized", false)) - if first_finalized != second_finalized: - return not first_finalized - var avatar: Player = _spawn_service.get_avatar(peer_id) - if avatar != null: - var first_distance: float = avatar.global_position.distance_squared_to( - SurfaceDrawingProtocol.array_to_vector(first.get("origin", [])) - ) - var second_distance: float = avatar.global_position.distance_squared_to( - SurfaceDrawingProtocol.array_to_vector(second.get("origin", [])) - ) - if not is_equal_approx(first_distance, second_distance): - return first_distance < second_distance - return int(first.get("layer", 0)) < int(second.get("layer", 0)) + receive_canvas_state.rpc_id(peer_id, data) func _broadcast_canvas_update(data: Dictionary) -> void: @@ -2464,61 +2263,6 @@ func _state_cell_position(state: Dictionary, x: int, y: int) -> Vector3: ) -func _state_contains_world_point( - state: Dictionary, - world_point: Vector3, - tolerance: float = 0.3, -) -> bool: - var origin: Vector3 = SurfaceDrawingProtocol.array_to_vector(state["origin"]) - var normal: Vector3 = SurfaceDrawingProtocol.array_to_vector( - state["normal"] - ).normalized() - var relative: Vector3 = world_point - origin - if absf(relative.dot(normal)) > tolerance: - return false - var tangent: Vector3 = SurfaceDrawingProtocol.array_to_vector( - state["tangent"] - ).normalized() - var bitangent: Vector3 = normal.cross(tangent).normalized() - var half_width: float = ( - float(state["width"]) * float(state["cell_size"]) * 0.5 - ) - var half_height: float = ( - float(state["height"]) * float(state["cell_size"]) * 0.5 - ) - var horizontal: float = relative.dot(tangent) - var vertical: float = relative.dot(bitangent) - return ( - horizontal >= -half_width - and horizontal < half_width - and vertical >= -half_height - and vertical < half_height - ) - - -func _state_cell_at_world_point( - state: Dictionary, - world_point: Vector3, -) -> Vector2i: - var origin: Vector3 = SurfaceDrawingProtocol.array_to_vector(state["origin"]) - var normal: Vector3 = SurfaceDrawingProtocol.array_to_vector( - state["normal"] - ).normalized() - var tangent: Vector3 = SurfaceDrawingProtocol.array_to_vector( - state["tangent"] - ).normalized() - var bitangent: Vector3 = normal.cross(tangent).normalized() - var relative: Vector3 = world_point - origin - var size: float = float(state["cell_size"]) - var half_width: float = float(state["width"]) * size * 0.5 - var half_height: float = float(state["height"]) * size * 0.5 - var x: int = floori((relative.dot(tangent) + half_width) / size) - var y: int = floori((relative.dot(bitangent) + half_height) / size) - if x < 0 or x >= int(state["width"]) or y < 0 or y >= int(state["height"]): - return Vector2i(-1, -1) - return Vector2i(x, y) - - func _overlaps_existing_canvas( origin: Vector3, normal: Vector3, @@ -2569,27 +2313,10 @@ func _active_canvas_count() -> int: return count -func _finalized_canvas_count() -> int: +func _allocated_grid_cells() -> int: var count: int = 0 for state: Dictionary in _canvas_states.values(): - if bool(state.get("finalized", false)): - count += 1 - return count - - -func _allocated_active_grid_cells() -> int: - var count: int = 0 - for state: Dictionary in _canvas_states.values(): - if not bool(state.get("finalized", false)): - count += int(state.get("width", 0)) * int(state.get("height", 0)) - return count - - -func _allocated_finalized_grid_cells() -> int: - var count: int = 0 - for state: Dictionary in _canvas_states.values(): - if bool(state.get("finalized", false)): - count += int(state.get("width", 0)) * int(state.get("height", 0)) + count += int(state.get("width", 0)) * int(state.get("height", 0)) return count @@ -2929,10 +2656,30 @@ func _new_request_id(prefix: String) -> String: return "%s-%d-%d" % [prefix, Time.get_ticks_msec(), _request_sequence] +func _cells_by_key( + values: Array, + grid_width: int, +) -> Dictionary[int, Dictionary]: + var result: Dictionary[int, Dictionary] = {} + for value: Variant in values: + if typeof(value) != TYPE_DICTIONARY: + continue + var cell: Dictionary = value + var key: int = ( + int(cell.get("y", -1)) * grid_width + + int(cell.get("x", -1)) + ) + result[key] = cell.duplicate(true) + return result + + func _state_cell(state: Dictionary, x: int, y: int) -> Dictionary: - var canvas_id: String = str(state.get("canvas_id", "")) - var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get(canvas_id) - return buffer.get_cell_value(x, y) if buffer != null else {} + var cells: Dictionary[int, Dictionary] = _cells_by_key( + state.get("cells", []), int(state["width"]) + ) + return Dictionary( + cells.get(_cell_key_for_state(state, x, y), {}) + ).duplicate(true) func _register_canvas_participant( @@ -2952,9 +2699,6 @@ func _register_canvas_participant( participants.append(fingerprint) state["participant_fingerprints"] = participants _canvas_states[canvas_id] = state - var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get(canvas_id) - if buffer != null: - buffer.ensure_participants(participants) return true @@ -2974,17 +2718,17 @@ func _merged_participants( func _state_participants(state: Dictionary) -> Array[String]: - var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get( - str(state.get("canvas_id", "")) - ) - if buffer != null: - return buffer.get_participants() var result: Array[String] = [] _append_participant( result, str(state.get("creator_fingerprint", "")) ) for value: Variant in state.get("participant_fingerprints", []): _append_participant(result, str(value)) + for cell_value: Variant in state.get("cells", []): + var cell: Dictionary = cell_value + _append_participant( + result, str(cell.get("author_fingerprint", "")) + ) return result @@ -3038,6 +2782,15 @@ func _mutation_key(canvas_id: String, x: int, y: int) -> String: return "%s:%d:%d" % [canvas_id, x, y] +func _sorted_cells(values: Dictionary[int, Dictionary]) -> Array[Dictionary]: + var keys: Array[int] = values.keys() + keys.sort() + var result: Array[Dictionary] = [] + for key: int in keys: + result.append(values[key].duplicate(true)) + return result + + func _normalized_or(value: Variant, fallback: Vector3) -> Vector3: var vector: Vector3 = value if typeof(value) == TYPE_VECTOR3 else fallback return fallback if vector.is_zero_approx() else vector.normalized() @@ -3075,7 +2828,6 @@ func _on_peer_removed(peer_id: int) -> void: _peer_request_ids.erase(peer_id) _stroke_history_by_peer.erase(peer_id) _peer_art_entitlements.erase(peer_id) - _snapshot_queues.erase(peer_id) func _on_local_art_entitlement_changed() -> void: @@ -3124,7 +2876,6 @@ func _on_session_state_changed(state: NetworkSession.State) -> void: func _clear_session_artwork_state() -> void: _canvas_states.clear() - _canvas_cells.clear() for canvas: SurfaceDrawingCanvas in _canvas_nodes.values(): canvas.queue_free() _canvas_nodes.clear() @@ -3135,7 +2886,6 @@ func _clear_session_artwork_state() -> void: _stroke_history_by_peer.clear() _cell_last_stroke.clear() _last_local_stroke_id = "" - _snapshot_queues.clear() _hide_previews() _emit_artwork_changed() @@ -3160,8 +2910,16 @@ func _apply_artwork_fingerprint_clear(fingerprint: String) -> int: func _remove_canvas_state(canvas_id: String) -> void: _canvas_states.erase(canvas_id) - _canvas_cells.erase(canvas_id) - _unload_canvas_node(canvas_id) + var canvas: SurfaceDrawingCanvas = _canvas_nodes.get(canvas_id) + if canvas != null: + canvas.queue_free() + _canvas_nodes.erase(canvas_id) + if _selected_canvas_id == canvas_id: + _selected_canvas_id = "" + if _hovered_canvas_id == canvas_id: + _hovered_canvas_id = "" + if _last_hovered_canvas_id == canvas_id: + _last_hovered_canvas_id = "" func _emit_artwork_changed() -> void: diff --git a/network/network_world_spawn_service.gd b/network/network_world_spawn_service.gd index 8981237..87814ee 100644 --- a/network/network_world_spawn_service.gd +++ b/network/network_world_spawn_service.gd @@ -43,7 +43,6 @@ var _entity_revisions: Dictionary = {} var _surface_triangles: Dictionary = {} var _surface_areas: Dictionary = {} var _surface_total_areas: Dictionary = {} -var _surface_height_ranges: Dictionary = {} var _spawn_anchor_positions: Dictionary = {} var _respawns: Array[Dictionary] = [] var _next_respawn_by_type: Dictionary[StringName, float] = {} @@ -295,7 +294,7 @@ func _begin_population_if_ready() -> void: _current_season() ): _cache_spawn_surface(entry) - for _spawn_index: int in _target_population(entry): + for _spawn_index: int in entry.population: _spawn_entity(entry) @@ -323,14 +322,10 @@ func _cache_spawn_surface(entry: GatherableDataType) -> void: if not entry.diggable_area_id.is_empty(): triangles = _world.get_diggable_area_triangles(entry.diggable_area_id) else: - var height_range := _resolved_surface_height_range(entry) triangles = _world.get_spawn_surface_triangles( entry.surface_materials, - height_range.x, - 0.6, - height_range.y, + entry.minimum_surface_y, ) - _surface_height_ranges[entry.type_id] = height_range var areas := PackedFloat32Array() var total_area: float = 0.0 for triangle: PackedVector3Array in triangles: @@ -523,21 +518,7 @@ func _sample_surface_position( ) if triangles.is_empty() or total_area <= 0.0: return Vector3(INF, INF, INF) - var validates_diggable_surface := not entry.diggable_area_id.is_empty() - var height_range: Vector2 = _surface_height_ranges.get( - entry.type_id, - Vector2(entry.minimum_surface_y, entry.maximum_surface_y), - ) - var validates_height_range := _surface_height_ranges.has(entry.type_id) - var attempts: int = ( - 48 - if ( - validates_diggable_surface - or validates_height_range - or is_finite(maximum_distance) - ) - else 1 - ) + var attempts: int = 48 if is_finite(maximum_distance) else 1 var fallback: Vector3 = Vector3(INF, INF, INF) for _attempt: int in attempts: var roll: float = _rng.randf() * total_area @@ -553,33 +534,12 @@ func _sample_surface_position( + triangle[2] * barycentric_c ) fallback = point - var within_requested_distance := ( + if ( not is_finite(maximum_distance) or Vector2(point.x - origin.x, point.z - origin.z).length() <= maximum_distance - ) - var valid_diggable_surface := ( - not validates_diggable_surface - or _world.is_diggable_surface_point_valid( - entry.diggable_area_id, - point, - ) - ) - var valid_height := ( - not validates_height_range - or ( - point.y > height_range.x - and point.y < height_range.y - ) - ) - if ( - within_requested_distance - and valid_diggable_surface - and valid_height ): return point - if validates_diggable_surface or validates_height_range: - return Vector3(INF, INF, INF) if origin.is_finite() and is_finite(maximum_distance): return origin return fallback @@ -1423,45 +1383,11 @@ func _reconcile_seasonal_population() -> void: for entry: GatherableDataType in _catalog.get_available_entries(season): _cache_spawn_surface(entry) var current_population: int = _population_for_type(entry.type_id) - var target_population := _target_population(entry) - while current_population < target_population: + while current_population < entry.population: _spawn_entity(entry) current_population += 1 -func _target_population(entry: GatherableDataType) -> int: - if entry == null: - return 0 - if entry.spawn_anchor_set_id.is_empty(): - return entry.target_population_for_surface_area( - float(_surface_total_areas.get(entry.type_id, 0.0)) - ) - var anchors: PackedVector3Array = _spawn_anchor_positions.get( - entry.type_id, - PackedVector3Array(), - ) - return entry.target_population_for_anchor_count(anchors.size()) - - -func _resolved_surface_height_range(entry: GatherableDataType) -> Vector2: - var minimum_y := entry.minimum_surface_y - var maximum_y := entry.maximum_surface_y - var saltwater_height := _world.get_saltwater_surface_height() - if is_finite(saltwater_height): - match entry.surface_water_relation: - GatherableDataType.SurfaceWaterRelation.ABOVE_SALT_WATER: - minimum_y = maxf( - minimum_y, - saltwater_height + entry.waterline_margin, - ) - GatherableDataType.SurfaceWaterRelation.BELOW_SALT_WATER: - maximum_y = minf( - maximum_y, - saltwater_height - entry.waterline_margin, - ) - return Vector2(minimum_y, maximum_y) - - func _population_for_type(type_id: StringName) -> int: var count: int = 0 for state: Dictionary in _entities.values(): @@ -1493,7 +1419,6 @@ func _clear_world() -> void: _surface_triangles.clear() _surface_areas.clear() _surface_total_areas.clear() - _surface_height_ranges.clear() _spawn_anchor_positions.clear() _respawns.clear() _next_respawn_by_type.clear() diff --git a/network/peer_registry.gd b/network/peer_registry.gd index 8067451..2cab061 100644 --- a/network/peer_registry.gd +++ b/network/peer_registry.gd @@ -7,7 +7,6 @@ class PeerRecord: var peer_id: int = 0 var profile_id: String = "" var display_name: String = "" - var title: String = NetworkProfilePreferences.DEFAULT_TITLE var protocol_version: int = 0 var joined_at_unix: int = 0 var appearance_snapshot: Dictionary = ( @@ -31,12 +30,10 @@ func add_peer( identity_fingerprint: String = "", identity_public_key: String = "", capability_flags: PackedStringArray = PackedStringArray(), - player_title: String = NetworkProfilePreferences.DEFAULT_TITLE, ) -> bool: if ( peer_id <= 0 or profile_id.is_empty() - or not NetworkProfilePreferences.is_valid_title(player_title) or ( not identity_fingerprint.is_empty() and has_fingerprint(identity_fingerprint) @@ -47,7 +44,6 @@ func add_peer( record.peer_id = peer_id record.profile_id = profile_id record.display_name = display_name - record.title = player_title record.protocol_version = protocol_version record.joined_at_unix = int(Time.get_unix_time_from_system()) record.identity_fingerprint = identity_fingerprint @@ -78,14 +74,6 @@ func update_display_name(peer_id: int, display_name: String) -> bool: return true -func update_title(peer_id: int, player_title: String) -> bool: - var record: PeerRecord = _records.get(peer_id) - if record == null or not NetworkProfilePreferences.is_valid_title(player_title): - return false - record.title = player_title.strip_edges() - return true - - func update_appearance(peer_id: int, snapshot: Dictionary) -> bool: var record: PeerRecord = _records.get(peer_id) if record == null or not CharacterCustomizationCatalog.validate_snapshot(snapshot): diff --git a/network/player_data_root.gd b/network/player_data_root.gd index fd1265a..9416db3 100644 --- a/network/player_data_root.gd +++ b/network/player_data_root.gd @@ -9,46 +9,12 @@ const BOOTSTRAP_TEMP_PATH := "user://data_root_bootstrap.json.tmp" const BOOTSTRAP_VERSION := 1 const MANIFEST_VERSION := 1 const LAYOUT_VERSION := 1 -const MANIFEST_FILENAME := "straywild_data.json" -const LEGACY_MANIFEST_FILENAME := "netfishing_data.json" +const MANIFEST_FILENAME := "netfishing_data.json" const README_FILENAME := "README.txt" -const ENVIRONMENT_VARIABLE := "straywild_DATA_DIR" -const CREATE_ENVIRONMENT_VARIABLE := "straywild_CREATE_DATA_DIR" -const LEGACY_ENVIRONMENT_VARIABLE := "NETFISHING_DATA_DIR" -const LEGACY_CREATE_ENVIRONMENT_VARIABLE := "NETFISHING_CREATE_DATA_DIR" -const ISOLATED_VALIDATION_ENVIRONMENT := ( - "straywild_ISOLATED_VALIDATION_STORAGE" -) -const ISOLATED_VALIDATION_DIRECTORY := "isolated-validation-data" -const APPLICATION_ID := "straywild" -const LEGACY_APPLICATION_ID := "netfishing" +const ENVIRONMENT_VARIABLE := "NETFISHING_DATA_DIR" +const CREATE_ENVIRONMENT_VARIABLE := "NETFISHING_CREATE_DATA_DIR" +const APPLICATION_ID := "netfishing" const APP_DATA_PORTABLE_PATH := "user://portable-data" -const LEGACY_USER_DIRECTORY_NAME := "NETFISHING" -const LEGACY_USER_FILES := [ - "data_root_bootstrap.json", - "data_root_bootstrap.json.backup", - "network_discovery.cfg", - "player_settings.json", - "player_settings.json.backup", - "controller_mappings.json", - "controller_mappings.json.backup", - "keyboard_mouse_bindings.json", - "keyboard_mouse_bindings.json.backup", - "player_save.json", - "network_profile.json", - "player_appearance.json", - "saved_servers.json", - "known_players.json", - "player_relationships.json", - "server_trust.json", - "host_bans.json", - "player_identity.key", - "player_identity.pub", - "player_identity.json", - "host_identity.key", - "host_identity.pub", - "host_identity.json", -] const PATH_ALLOWED: StringName = &"allowed" const PATH_SOURCE_PROJECT: StringName = &"source_project" const PATH_INSTALLATION: StringName = &"installation" @@ -61,9 +27,6 @@ enum Mode { COMMAND_LINE_OVERRIDE, } -static var _process_validation_root := "" -static var _process_validation_device_id := "" - var mode := Mode.UNRESOLVED var root_path := "" var root_id := "" @@ -74,34 +37,23 @@ var override_active := false func resolve() -> bool: - # Validation scripts may be launched directly instead of through the - # repository runner. Keep the opt-in flag fail-safe: it must never follow a - # real user's bootstrap pointer merely because XDG isolation was omitted. - if _isolated_validation_requested(): - return _resolve_isolated_validation_root() - prepare_legacy_user_data() _load_bootstrap_identity() var command_line: String = _command_line_override() if not command_line.is_empty(): override_active = true mode = Mode.COMMAND_LINE_OVERRIDE return _activate_existing(command_line, "", false) - var environment_variable: String = _available_environment_variable( - ENVIRONMENT_VARIABLE, - LEGACY_ENVIRONMENT_VARIABLE, - ) - if not environment_variable.is_empty(): + if OS.has_environment(ENVIRONMENT_VARIABLE): override_active = true mode = Mode.ENVIRONMENT_OVERRIDE - var environment_path: String = OS.get_environment(environment_variable) + var environment_path: String = OS.get_environment(ENVIRONMENT_VARIABLE) if not environment_path.is_absolute_path(): - return _fail("straywild_DATA_DIR must be an absolute path.") + return _fail("NETFISHING_DATA_DIR must be an absolute path.") if ( - _environment_flag( - CREATE_ENVIRONMENT_VARIABLE, - LEGACY_CREATE_ENVIRONMENT_VARIABLE, + OS.get_environment(CREATE_ENVIRONMENT_VARIABLE) == "1" + and not FileAccess.file_exists( + environment_path.path_join(MANIFEST_FILENAME) ) - and not has_data_manifest(environment_path) ): var created: Dictionary = create_unbound_root(environment_path) if not bool(created.get("ok", false)): @@ -128,73 +80,11 @@ func resolve() -> bool: return false -func _resolve_isolated_validation_root() -> bool: - # Behave like app-data storage after choosing the isolated root so migration - # tests can still exercise live root switching within their sandbox. - override_active = false - mode = Mode.APP_DATA - if _process_validation_device_id.is_empty(): - _process_validation_device_id = ( - Crypto.new().generate_random_bytes(16).hex_encode() - ) - device_id = _process_validation_device_id - if _process_validation_root.is_empty(): - var parent: String - if OS.has_environment("XDG_DATA_HOME"): - parent = ProjectSettings.globalize_path("user://") - else: - parent = OS.get_temp_dir().path_join( - "straywild-validation-%d-%d" - % [OS.get_process_id(), Time.get_ticks_usec()] - ) - _process_validation_root = parent.path_join( - ISOLATED_VALIDATION_DIRECTORY - ) - if not has_data_manifest(_process_validation_root): - var created: Dictionary = create_unbound_root( - _process_validation_root - ) - if not bool(created.get("ok", false)): - return false - return _activate_existing(_process_validation_root, "", false) - - -static func _isolated_validation_requested() -> bool: - return ( - DisplayServer.get_name() == "headless" - and OS.get_environment(ISOLATED_VALIDATION_ENVIRONMENT) == "1" - ) - - -func prepare_legacy_user_data() -> void: - var current_root: String = _normalize( - ProjectSettings.globalize_path("user://") - ) - if current_root.is_empty(): - return - var legacy_root: String = _normalize( - current_root.get_base_dir().path_join(LEGACY_USER_DIRECTORY_NAME) - ) - if legacy_root == current_root or not DirAccess.dir_exists_absolute(legacy_root): - return - for filename: String in LEGACY_USER_FILES: - var destination: String = current_root.path_join(filename) - if FileAccess.file_exists(destination): - continue - var source: String = legacy_root.path_join(filename) - if FileAccess.file_exists(source): - _copy_legacy_user_file(source, destination) - - -func has_data_manifest(path: String) -> bool: - return not _existing_manifest_path(_normalize(path)).is_empty() - - func default_visible_path() -> String: var documents: String = OS.get_system_dir(OS.SYSTEM_DIR_DOCUMENTS) if documents.is_empty(): return "" - var candidate: String = _normalize(documents.path_join("straywild")) + var candidate: String = _normalize(documents.path_join("NETFISHING")) if not candidate.is_absolute_path(): return "" var classification: StringName = classify_candidate_path( @@ -215,22 +105,20 @@ func select_new_root(path: String, app_data: bool = false) -> bool: normalized = ProjectSettings.globalize_path(APP_DATA_PORTABLE_PATH) if not _validate_candidate(normalized, true): return false - var manifest_path: String = _existing_manifest_path(normalized) - if not manifest_path.is_empty(): + var manifest_path: String = normalized.path_join(MANIFEST_FILENAME) + if FileAccess.file_exists(manifest_path): var manifest: Dictionary = _read_json(manifest_path) if not _valid_manifest(manifest): - return _fail("The selected folder has a malformed straywild manifest.") + return _fail("The selected folder has a malformed NETfishing manifest.") root_id = str(manifest["root_id"]) - if not _upgrade_legacy_manifest(normalized, manifest, manifest_path): - return _fail("The legacy data-folder manifest could not be upgraded.") else: if not _directory_is_empty(normalized) and not app_data: return _fail( - "Choose an empty folder or an existing straywild data folder." + "Choose an empty folder or an existing NETfishing data folder." ) root_id = Crypto.new().generate_random_bytes(16).hex_encode() if not _create_layout(normalized, root_id): - return _fail("The straywild data folder could not be created.") + return _fail("The NETfishing data folder could not be created.") if not _write_bootstrap(normalized, root_id): return _fail("The data-folder pointer could not be saved.") root_path = normalized @@ -257,14 +145,14 @@ func create_app_data_layout_for_migration(path: String) -> Dictionary: var normalized: String = _normalize(path) if not _validate_candidate(normalized, false): return {"ok": false, "message": error_message} - var manifest_path: String = _existing_manifest_path(normalized) - if not manifest_path.is_empty(): + var manifest_path: String = normalized.path_join(MANIFEST_FILENAME) + if FileAccess.file_exists(manifest_path): var manifest: Dictionary = _read_json(manifest_path) - if not _valid_manifest(manifest): - return {"ok": false, "message": "The app-data manifest is malformed."} - if not _upgrade_legacy_manifest(normalized, manifest, manifest_path): - return {"ok": false, "message": "The app-data manifest could not be upgraded."} - return {"ok": true, "root_id": str(manifest.get("root_id", ""))} + return ( + {"ok": true, "root_id": str(manifest.get("root_id", ""))} + if _valid_manifest(manifest) + else {"ok": false, "message": "The app-data manifest is malformed."} + ) var id: String = Crypto.new().generate_random_bytes(16).hex_encode() if not _create_layout(normalized, id): return {"ok": false, "message": "The app-data layout could not be created."} @@ -348,19 +236,17 @@ func _activate_existing(path: String, expected_id: String, permit_creation: bool var normalized: String = _normalize(path) if not _validate_candidate(normalized, permit_creation): return false - var manifest_path: String = _existing_manifest_path(normalized) - if manifest_path.is_empty(): - return _fail("The selected folder is not a straywild data folder.") + var manifest_path: String = normalized.path_join(MANIFEST_FILENAME) + if not FileAccess.file_exists(manifest_path): + return _fail("The selected folder is not a NETfishing data folder.") var manifest: Dictionary = _read_json(manifest_path) if not _valid_manifest(manifest): - return _fail("The straywild data-folder manifest is malformed.") - if not _upgrade_legacy_manifest(normalized, manifest, manifest_path): - return _fail("The legacy data-folder manifest could not be upgraded.") + return _fail("The NETfishing data-folder manifest is malformed.") var found_id: String = str(manifest["root_id"]) if not expected_id.is_empty() and expected_id != found_id: return _fail("The selected data folder does not match this device pointer.") if not _test_writable(normalized): - return _fail("The straywild data folder is unavailable or unwritable.") + return _fail("The NETfishing data folder is unavailable or unwritable.") root_path = normalized root_id = found_id requires_selection = false @@ -453,7 +339,7 @@ static func _is_same_or_child_path(candidate: String, reference: String) -> bool func _test_writable(path: String) -> bool: var probe: String = path.path_join( - ".straywild-write-%s.tmp" % device_id.left(12) + ".netfishing-write-%s.tmp" % device_id.left(12) ) var file: FileAccess = FileAccess.open(probe, FileAccess.WRITE) if file == null: @@ -484,7 +370,7 @@ func _create_layout(path: String, id: String) -> bool: ): return false var readme: String = ( - "straywild player data\n\n" + "NETfishing player data\n\n" + "This folder is safe to synchronize with tools such as Syncthing.\n" + "Active private identity keys remain device-local.\n" + "Encrypted identity backups require their passphrase.\n" @@ -536,71 +422,12 @@ func _valid_manifest(data: Dictionary) -> bool: return ( data.get("format_version") == MANIFEST_VERSION and data.get("layout_version") == LAYOUT_VERSION - and data.get("application") in [APPLICATION_ID, LEGACY_APPLICATION_ID] + and data.get("application") == APPLICATION_ID and typeof(data.get("root_id")) == TYPE_STRING and str(data["root_id"]).length() == 32 ) -func _existing_manifest_path(path: String) -> String: - var current: String = path.path_join(MANIFEST_FILENAME) - if FileAccess.file_exists(current): - return current - var legacy: String = path.path_join(LEGACY_MANIFEST_FILENAME) - return legacy if FileAccess.file_exists(legacy) else "" - - -func _upgrade_legacy_manifest( - path: String, - manifest: Dictionary, - manifest_path: String, -) -> bool: - if ( - manifest_path.get_file() == MANIFEST_FILENAME - and manifest.get("application") == APPLICATION_ID - ): - return true - var upgraded: Dictionary = manifest.duplicate(true) - upgraded["application"] = APPLICATION_ID - upgraded["last_opened_at_unix"] = int(Time.get_unix_time_from_system()) - return _write_text_atomic( - path.path_join(MANIFEST_FILENAME), - JSON.stringify(upgraded, "\t"), - ) - - -func _available_environment_variable(primary: String, legacy: String) -> String: - if OS.has_environment(primary): - return primary - return legacy if OS.has_environment(legacy) else "" - - -func _environment_flag(primary: String, legacy: String) -> bool: - var variable: String = _available_environment_variable(primary, legacy) - return not variable.is_empty() and OS.get_environment(variable) == "1" - - -func _copy_legacy_user_file(source: String, destination: String) -> bool: - var bytes: PackedByteArray = PortableFileGuard.read_bytes( - source, - 16 * 1024 * 1024, - ) - if bytes.is_empty() and FileAccess.get_open_error() != OK: - return false - if DirAccess.make_dir_recursive_absolute(destination.get_base_dir()) != OK: - return false - var file: FileAccess = FileAccess.open(destination, FileAccess.WRITE) - if file == null: - return false - file.store_buffer(bytes) - file.flush() - var copied: bool = file.get_error() == OK - file.close() - if copied and source.ends_with(".key"): - FileAccess.set_unix_permissions(destination, 384) - return copied - - func _directory_is_empty(path: String) -> bool: var access: DirAccess = DirAccess.open(path) if access == null: diff --git a/network/player_relationship_store.gd b/network/player_relationship_store.gd index de04d49..2452315 100644 --- a/network/player_relationship_store.gd +++ b/network/player_relationship_store.gd @@ -7,8 +7,8 @@ const FORMAT_VERSION := 2 const MAX_RECORDS := 500 const MAX_FRIENDS := 200 const SOCIAL_TOKEN_LENGTH := 64 -const PRESENCE_CHANNEL_DOMAIN := "straywild_PRESENCE_V1:" -const INVITE_INBOX_DOMAIN := "straywild_INVITE_V1:" +const PRESENCE_CHANNEL_DOMAIN := "NETFISHING_PRESENCE_V1:" +const INVITE_INBOX_DOMAIN := "NETFISHING_INVITE_V1:" var _records: Dictionary = {} var _loaded := false @@ -21,10 +21,6 @@ var _data_root: PlayerDataRoot func configure_storage(path: String, data_root: PlayerDataRoot) -> void: _store_path = path _data_root = data_root - _records.clear() - _loaded = false - _write_blocked = false - _expected_hash = "" func is_muted(fingerprint: String) -> bool: diff --git a/network/portable_data_migration.gd b/network/portable_data_migration.gd index 2de0acb..430fba8 100644 --- a/network/portable_data_migration.gd +++ b/network/portable_data_migration.gd @@ -26,16 +26,19 @@ static func migrate_legacy_to( ) -> Dictionary: var normalized: String = destination.simplify_path().trim_suffix("/") if DirAccess.dir_exists_absolute(normalized): - if data_root.has_data_manifest(normalized): + var existing_manifest: String = normalized.path_join( + PlayerDataRoot.MANIFEST_FILENAME + ) + if FileAccess.file_exists(existing_manifest): return { "ok": false, "requires_existing_root_decision": true, - "message": "The selected folder already contains straywild data.", + "message": "The selected folder already contains NETfishing data.", } if not _directory_empty(normalized): return { "ok": false, - "message": "Choose an empty folder or create a straywild subfolder.", + "message": "Choose an empty folder or create a NETfishing subfolder.", } var staging: String = "%s.migration-%s" % [ normalized, Crypto.new().generate_random_bytes(8).hex_encode() @@ -97,22 +100,18 @@ static func migrate_active_to( ) -> Dictionary: var normalized: String = destination.simplify_path().trim_suffix("/") if normalized == data_root.root_path: - return { - "ok": true, - "changed": false, - "message": "This data folder is already active.", - } + return {"ok": true, "message": "This data folder is already active."} if DirAccess.dir_exists_absolute(normalized) and not _directory_empty(normalized): - if data_root.has_data_manifest(normalized): + if FileAccess.file_exists(normalized.path_join(PlayerDataRoot.MANIFEST_FILENAME)): return { "ok": false, "requires_existing_root_decision": true, "message": ( - "The selected folder already contains straywild data. " + "The selected folder already contains NETfishing data. " + "Choose it through the existing-data recovery flow." ), } - return {"ok": false, "message": "Choose an empty folder or a straywild subfolder."} + return {"ok": false, "message": "Choose an empty folder or a NETfishing subfolder."} var staging: String = "%s.migration-%s" % [ normalized, Crypto.new().generate_random_bytes(8).hex_encode() ] @@ -164,7 +163,6 @@ static func migrate_active_to( return {"ok": false, "message": "Migration copied data but did not change the pointer."} return { "ok": true, - "changed": true, "message": "Data folder changed. Previous data was preserved.", "previous_root": old_root, } @@ -204,8 +202,9 @@ static func replace_existing_with_legacy( destination: String, ) -> Dictionary: var normalized: String = destination.simplify_path().trim_suffix("/") - if not data_root.has_data_manifest(normalized): - return {"ok": false, "message": "The selected folder is not a straywild data root."} + var manifest: String = normalized.path_join(PlayerDataRoot.MANIFEST_FILENAME) + if not FileAccess.file_exists(manifest): + return {"ok": false, "message": "The selected folder is not a NETfishing data root."} var recovery: String = ProjectSettings.globalize_path( "user://migration-recovery" ).path_join( @@ -225,8 +224,8 @@ static func replace_existing_with_active( destination: String, ) -> Dictionary: var normalized: String = destination.simplify_path().trim_suffix("/") - if not data_root.has_data_manifest(normalized): - return {"ok": false, "message": "The selected folder is not a straywild data root."} + if not FileAccess.file_exists(normalized.path_join(PlayerDataRoot.MANIFEST_FILENAME)): + return {"ok": false, "message": "The selected folder is not a NETfishing data root."} var recovery: String = ProjectSettings.globalize_path( "user://migration-recovery" ).path_join( diff --git a/network/saved_server_store.gd b/network/saved_server_store.gd index c1ae4f8..de48c2c 100644 --- a/network/saved_server_store.gd +++ b/network/saved_server_store.gd @@ -22,12 +22,6 @@ var _data_root: PlayerDataRoot func configure_storage(path: String, data_root: PlayerDataRoot) -> void: _store_path = path _data_root = data_root - _saved_entries.clear() - _recent_entries.clear() - _loaded = false - _recovery_warning = "" - _write_blocked = false - _expected_hash = "" func _temp_path() -> String: @@ -196,7 +190,7 @@ func record_successful_connection( recent = _make_entry(endpoint, SavedServerEntry.Kind.RECENT) _recent_entries.append(recent) recent["display_name"] = ( - server_name if not server_name.is_empty() else "Recent Server" + server_name if not server_name.is_empty() else endpoint.normalized_display ) _apply_result_metadata( recent, now, "SUCCESS", server_name, protocol_version, @@ -358,11 +352,7 @@ func _make_entry( var now: int = int(Time.get_unix_time_from_system()) return { "entry_id": Crypto.new().generate_random_bytes(16).hex_encode(), - "display_name": ( - "Saved Server" - if kind == SavedServerEntry.Kind.SAVED - else "Recent Server" - ), + "display_name": endpoint.host, "route_kind": "DIRECT", "host": endpoint.host, "normalized_host": endpoint.host, diff --git a/network/server_trust_store.gd b/network/server_trust_store.gd index c95865e..fda774b 100644 --- a/network/server_trust_store.gd +++ b/network/server_trust_store.gd @@ -19,10 +19,6 @@ var _data_root: PlayerDataRoot func configure_storage(path: String, data_root: PlayerDataRoot) -> void: _store_path = path _data_root = data_root - _records.clear() - _loaded = false - _write_blocked = false - _expected_hash = "" func verify(endpoint: ConnectionEndpoint, fingerprint: String) -> Verification: @@ -39,17 +35,6 @@ func verify(endpoint: ConnectionEndpoint, fingerprint: String) -> Verification: ) -func verify_identity(fingerprint: String) -> Verification: - _ensure_loaded() - if not NetworkIdentityCrypto.valid_fingerprint(fingerprint): - return Verification.CHANGED - return ( - Verification.MATCH - if _records.has(_identity_key(fingerprint)) - else Verification.FIRST_SEEN - ) - - func get_record(endpoint: ConnectionEndpoint) -> Dictionary: _ensure_loaded() if endpoint == null: @@ -57,11 +42,6 @@ func get_record(endpoint: ConnectionEndpoint) -> Dictionary: return Dictionary(_records.get(endpoint.normalized_display, {})).duplicate(true) -func get_identity_record(fingerprint: String) -> Dictionary: - _ensure_loaded() - return Dictionary(_records.get(_identity_key(fingerprint), {})).duplicate(true) - - func trust( endpoint: ConnectionEndpoint, fingerprint: String, @@ -90,25 +70,6 @@ func trust( return _save() -func trust_identity(fingerprint: String, server_name: String = "") -> bool: - _ensure_loaded() - if not NetworkIdentityCrypto.valid_fingerprint(fingerprint): - return false - var key := _identity_key(fingerprint) - var now := int(Time.get_unix_time_from_system()) - var previous: Dictionary = _records.get(key, {}) - _records[key] = { - "route_kind": "discovery", - "identity_key": key, - "fingerprint": fingerprint, - "first_seen_unix": int(previous.get("first_seen_unix", now)), - "last_seen_unix": now, - "last_observed_server_name": server_name.left(80), - "trust_state": "pinned", - } - return _save() - - func touch(endpoint: ConnectionEndpoint) -> void: _ensure_loaded() if endpoint == null: @@ -120,15 +81,6 @@ func touch(endpoint: ConnectionEndpoint) -> void: _save() -func touch_identity(fingerprint: String) -> void: - _ensure_loaded() - var record: Dictionary = _records.get(_identity_key(fingerprint), {}) - if record.is_empty(): - return - record["last_seen_unix"] = int(Time.get_unix_time_from_system()) - _save() - - func _ensure_loaded() -> void: if _loaded: return @@ -152,21 +104,12 @@ func _ensure_loaded() -> void: continue var record: Dictionary = value var endpoint := str(record.get("normalized_endpoint", "")) - var identity_key := str(record.get("identity_key", "")) var fingerprint := str(record.get("fingerprint", "")) - if not NetworkIdentityCrypto.valid_fingerprint(fingerprint): - continue - if not endpoint.is_empty(): + if not endpoint.is_empty() and NetworkIdentityCrypto.valid_fingerprint(fingerprint): _records[endpoint] = record.duplicate(true) - elif identity_key == _identity_key(fingerprint): - _records[identity_key] = record.duplicate(true) _expected_hash = PortableFileGuard.hash_file(_store_path) -static func _identity_key(fingerprint: String) -> String: - return "identity:%s" % fingerprint - - func _save() -> bool: if _write_blocked: return false diff --git a/player/net_attachment.gd b/player/net_attachment.gd index 4ca210f..8938a13 100644 --- a/player/net_attachment.gd +++ b/player/net_attachment.gd @@ -1,88 +1,7 @@ extends "res://player/tool_socket_attachment.gd" -const TextureSamplingPolicyScript := preload( - "res://main/texture_sampling_policy.gd" -) -const SPRING_ROOT_BONE: StringName = &"net_mid" -const SPRING_END_BONE: StringName = &"net_tip" -const IMPACT_BONE: StringName = &"net_rim" - -@export_range(0.0, 10.0, 0.05) var spring_stiffness: float = 1.8 -@export_range(0.0, 1.0, 0.01) var spring_drag: float = 0.68 -@export_range(0.0, 10.0, 0.05) var spring_gravity: float = 0.3 -@export_range(0.01, 0.5, 0.01) var spring_end_length: float = 0.1 - -@onready var _catching_net: Node3D = %CatchingNet -@onready var _net_model: Node3D = %NetModel - -var _spring: SpringBoneSimulator3D -var _spring_was_visible: bool = false -var _net_skeleton: Skeleton3D - - -func _ready() -> void: - super._ready() - TextureSamplingPolicyScript.enforce_subtree(_net_model) - _configure_spring() - _sync_spring_activity() - - -func _process(_delta: float) -> void: - _sync_spring_activity() - - -func _configure_spring() -> void: - _net_skeleton = _net_model.find_child( - "Skeleton3D", true, false - ) as Skeleton3D - if _net_skeleton == null: - push_error("Imported net model is missing its Skeleton3D.") - return - if _net_skeleton.find_bone(SPRING_ROOT_BONE) < 0: - push_error("Imported net model is missing bone %s." % SPRING_ROOT_BONE) - return - if _net_skeleton.find_bone(SPRING_END_BONE) < 0: - push_error("Imported net model is missing bone %s." % SPRING_END_BONE) - return - if _net_skeleton.find_bone(IMPACT_BONE) < 0: - push_error("Imported net model is missing bone %s." % IMPACT_BONE) - return - - _spring = SpringBoneSimulator3D.new() - _spring.name = "NetSpring" - _spring.set_setting_count(1) - _spring.set_root_bone_name(0, SPRING_ROOT_BONE) - _spring.set_end_bone_name(0, SPRING_END_BONE) - _spring.set_extend_end_bone(0, true) - _spring.set_end_bone_direction( - 0, SkeletonModifier3D.BONE_DIRECTION_FROM_PARENT - ) - _spring.set_end_bone_length(0, spring_end_length) - _spring.set_stiffness(0, spring_stiffness) - _spring.set_drag(0, spring_drag) - _spring.set_gravity(0, spring_gravity) - _spring.set_gravity_direction(0, Vector3.DOWN) - _net_skeleton.add_child(_spring) +@onready var _impact_marker: Marker3D = %ImpactMarker func get_impact_world_position() -> Vector3: - if _net_skeleton == null: - return _catching_net.global_position - var impact_bone_index := _net_skeleton.find_bone(IMPACT_BONE) - if impact_bone_index < 0: - return _catching_net.global_position - return _net_skeleton.global_transform * ( - _net_skeleton.get_bone_global_pose(impact_bone_index).origin - ) - - -func _sync_spring_activity() -> void: - if _spring == null: - return - var net_is_visible: bool = _catching_net.is_visible_in_tree() - if net_is_visible and not _spring_was_visible: - _spring.active = true - _spring.reset() - elif not net_is_visible: - _spring.active = false - _spring_was_visible = net_is_visible + return _impact_marker.global_position diff --git a/player/net_attachment.tscn b/player/net_attachment.tscn index da49a88..246e71c 100644 --- a/player/net_attachment.tscn +++ b/player/net_attachment.tscn @@ -1,7 +1,42 @@ -[gd_scene load_steps=3 format=3] +[gd_scene load_steps=8 format=3] [ext_resource type="Script" path="res://player/net_attachment.gd" id="1_script"] -[ext_resource type="PackedScene" path="res://art/exported/items/equipment/net.glb" id="2_model"] + +[sub_resource type="StandardMaterial3D" id="HandleMaterial"] +albedo_color = Color(0.25, 0.13, 0.055, 1) +roughness = 0.9 + +[sub_resource type="CylinderMesh" id="HandleMesh"] +material = SubResource("HandleMaterial") +top_radius = 0.025 +bottom_radius = 0.035 +height = 1.25 + +[sub_resource type="StandardMaterial3D" id="HoopMaterial"] +albedo_color = Color(0.34, 0.39, 0.4, 1) +metallic = 0.25 +roughness = 0.65 + +[sub_resource type="TorusMesh" id="HoopMesh"] +material = SubResource("HoopMaterial") +inner_radius = 0.24 +outer_radius = 0.29 +rings = 12 +ring_segments = 18 + +[sub_resource type="StandardMaterial3D" id="NetMaterial"] +transparency = 1 +albedo_color = Color(0.65, 0.78, 0.75, 0.42) +shading_mode = 0 +cull_mode = 2 + +[sub_resource type="CylinderMesh" id="NetMesh"] +material = SubResource("NetMaterial") +top_radius = 0.24 +bottom_radius = 0.08 +height = 0.34 +radial_segments = 12 +rings = 1 [node name="NetAttachment" type="BoneAttachment3D"] bone_name = "rod_socket" @@ -12,9 +47,18 @@ aligned_mount_path = NodePath("CatchingNet") unique_name_in_owner = true visible = false -[node name="ModelMount" type="Node3D" parent="CatchingNet"] -position = Vector3(-0.000217, -0.098636, -0.020218) -rotation = Vector3(0, 3.1415927, 0) +[node name="Handle" type="MeshInstance3D" parent="CatchingNet"] +position = Vector3(0, 0.55, 0) +mesh = SubResource("HandleMesh") -[node name="NetModel" parent="CatchingNet/ModelMount" unique_id=1627767240 instance=ExtResource("2_model")] +[node name="Hoop" type="MeshInstance3D" parent="CatchingNet"] +position = Vector3(0, 1.17, 0) +mesh = SubResource("HoopMesh") + +[node name="Bag" type="MeshInstance3D" parent="CatchingNet"] +position = Vector3(0, 1, 0) +mesh = SubResource("NetMesh") + +[node name="ImpactMarker" type="Marker3D" parent="CatchingNet"] unique_name_in_owner = true +position = Vector3(0, 1.17, 0) diff --git a/player/player.gd b/player/player.gd index 51263e3..860caf3 100644 --- a/player/player.gd +++ b/player/player.gd @@ -90,7 +90,6 @@ const CATCH_SHOWCASE_INPUT_OWNER: StringName = &"catch_showcase" # safe IDs so newer clients can extend it, but Player only presents actions # explicitly approved by this catalog. const NETWORK_ANIMATION_ACTION_IDS: Array[StringName] = [ - CHARACTER_WALKING_ANIMATION, CHARACTER_CASTING_ANIMATION, CHARACTER_NET_DRAW_ANIMATION, CHARACTER_NET_STRIKE_ANIMATION, @@ -388,17 +387,6 @@ class ShowcaseCameraSnapshot: var camera_dragging: bool -class ConversationCameraSnapshot: - extends RefCounted - - var yaw_transform: Transform3D - var yaw_rotation: Vector3 - var pitch_rotation: Vector3 - var spring_length: float - var target_zoom: float - var camera_dragging: bool - - @export_category("Movement") @export var walk_speed: float = 2.25 @export var sprint_speed: float = 4.5 @@ -439,29 +427,16 @@ class ConversationCameraSnapshot: @export_range(0.0, 1.0, 0.01) var controller_camera_deadzone: float = 0.2 @export var invert_camera_y: bool = false var _swap_hotbar_camera_scroll: bool = false -var _rv_interior_camera_mode: bool = false -var _rv_interior_environment: Environment -var _rv_previous_camera_environment: Environment @export_range(-89.0, 0.0, 0.5) var minimum_pitch_degrees: float = -65.0 @export_range(0.0, 89.0, 0.5) var maximum_pitch_degrees: float = 45.0 @export var minimum_zoom: float = 2.0 @export var maximum_zoom: float = 8.0 @export var zoom_step: float = 0.75 @export var zoom_smoothing: float = 12.0 -@export_range(0.0, 1.0, 0.01) var fishing_reel_zoom_amount: float = 0.22 -@export_range(0.0, 1.5, 0.01) var fishing_barrier_break_zoom: float = 0.38 -@export_range(0.05, 1.0, 0.01) var fishing_break_zoom_decay: float = 0.34 -@export_range(0.0, 0.2, 0.005) var fishing_barrier_hit_shake: float = 0.018 -@export_range(0.0, 0.3, 0.005) var fishing_barrier_break_shake: float = 0.045 @export_range(0.1, 12.0, 0.1) var controller_zoom_speed: float = 4.0 @export_range(0.0, 1.0, 0.01) var controller_trigger_threshold: float = 0.55 @export_range(1.0, 40.0, 0.5) var free_camera_speed: float = 10.0 @export_range(1.0, 10.0, 0.5) var free_camera_sprint_multiplier: float = 3.0 -@export_category("Conversation Camera") -@export_range(0.05, 1.0, 0.01) var conversation_camera_transition_seconds: float = 0.42 -@export_range(-45.0, 20.0, 1.0) var conversation_camera_pitch_degrees: float = -9.0 -@export_range(1.5, 8.0, 0.1, "suffix:m") var conversation_camera_distance: float = 3.65 -@export_range(0.5, 2.5, 0.05, "suffix:m") var conversation_camera_target_height: float = 1.3 @onready var _visuals: Node3D = %Visuals @onready var _character_rig: Node3D = get_node_or_null( @@ -496,8 +471,6 @@ var _held_fish_attachment_offset: Vector3 = Vector3(0.0, 0.08, 0.04) var _held_fish_sprite: Sprite3D var _held_art_kit_display: Node3D var _held_art_kit_sprite: Sprite3D -var _held_decor_package_display: Node3D -var _held_decor_package_visible: bool = false var _catch_attachment_offset: Vector3 = Vector3(0.0, 0.08, 0.04) var _gravity: float = float(ProjectSettings.get_setting("physics/3d/default_gravity")) @@ -519,12 +492,6 @@ var _remote_recovery_presentation_active: bool = false var _remote_recovery_visual_origin: Vector3 var _remote_recovery_elapsed: float = 0.0 var _target_zoom: float = 5.0 -var _fishing_reel_camera_active: bool = false -var _fishing_break_zoom_offset: float = 0.0 -var _fishing_camera_shake_remaining: float = 0.0 -var _fishing_camera_shake_duration: float = 0.0 -var _fishing_camera_shake_strength: float = 0.0 -var _fishing_camera_shake_phase: float = 0.0 var _showcase_rod_visibility: bool = true var _showcase_net_visibility: bool = false var _showcase_shovel_visibility: bool = false @@ -537,9 +504,6 @@ var _showcase_restore_tween: Tween var _showcase_camera_tween: Tween var _showcase_camera_snapshot: ShowcaseCameraSnapshot var _showcase_restore_generation: int = 0 -var _conversation_camera_tween: Tween -var _conversation_camera_snapshot: ConversationCameraSnapshot -var _conversation_camera_generation: int = 0 var _network_peer_id: int = 0 var _network_authoritative_simulation: bool = false var _network_interpolation_enabled: bool = false @@ -550,7 +514,6 @@ var _network_sprint: bool = false var _network_sneak: bool = false var _network_slow_walk: bool = false var _last_network_input_sequence: int = 0 -var _authoritative_relocation_input_quarantine: bool = false var _network_input_age: float = 0.0 var _network_input_stale: bool = false var _network_input_stale_timeout_seconds: float = ( @@ -1029,7 +992,6 @@ func _initialize_held_item_attachment() -> void: _held_art_kit_sprite = attachment.get_node( "HeldArtKitDisplay/HeldArtKitSprite" ) as Sprite3D - _held_decor_package_display = _build_decor_package_display(attachment) _catch_display = attachment.get_node("CatchDisplay") as Node3D _catch_attachment_offset = _catch_display.position _catch_sprite = attachment.get_node("CatchDisplay/CatchSprite") as Sprite3D @@ -1074,33 +1036,14 @@ func _simulate_movement_physics(delta: float) -> void: or (_network_authoritative_simulation and _network_jump_pending) ) ) - if jump_requested: - _cancel_sitting_for_jump() - # Sitting deliberately stops movement processing, so never allow a stale - # grounded flag or a reconciled network state to leave an airborne avatar in - # that early-return path. Preserve the intent and sit once landing is real. - if _sitting and not _can_begin_sitting(): - _sit_after_landing = true - _set_sitting(false) - if _sit_after_landing and not jump_requested and _can_begin_sitting(): + if _sit_after_landing and is_on_floor(): _sit_after_landing = false _set_sitting(true, local_control_enabled) if _sitting: if jump_requested: _set_sitting(false, local_control_enabled) else: - # Keep the body participating in physics while seated. In particular, - # move_and_slide() refreshes Godot's floor state, so a stale grounded - # flag from prediction or a delayed packet cannot trap this early-return - # path forever after the capsule has moved into the air. - velocity.x = 0.0 - velocity.z = 0.0 - if not is_on_floor(): - velocity.y -= _gravity * fall_gravity_multiplier * delta - move_and_slide() - if not is_on_floor(): - _sit_after_landing = true - _set_sitting(false) + velocity = Vector3.ZERO _network_jump_pending = false return if _water_recovery_active: @@ -1205,7 +1148,6 @@ func _process(delta: float) -> void: ) if not local_control_enabled: return - _update_fishing_camera_effects(delta) if _free_camera_active: if _is_camera_input_enabled(): _rotate_free_camera( @@ -1234,68 +1176,13 @@ func _process(delta: float) -> void: ) var zoom_weight: float = 1.0 - exp(-zoom_smoothing * delta) - var fishing_zoom_offset: float = ( - fishing_reel_zoom_amount - if _fishing_reel_camera_active - else 0.0 - ) + _fishing_break_zoom_offset - var effective_target_zoom: float = clampf( - _target_zoom - fishing_zoom_offset, - 1.25 if _rv_interior_camera_mode else minimum_zoom, - 16.0 if _rv_interior_camera_mode else maximum_zoom, - ) _spring_arm.spring_length = lerpf( _spring_arm.spring_length, - effective_target_zoom, + _target_zoom, zoom_weight ) -func set_fishing_reel_camera_active(active: bool) -> void: - _fishing_reel_camera_active = active - - -func play_fishing_barrier_camera_feedback(barrier_broken: bool) -> void: - if not local_control_enabled or _free_camera_active: - return - _fishing_camera_shake_strength = ( - fishing_barrier_break_shake - if barrier_broken - else fishing_barrier_hit_shake - ) - _fishing_camera_shake_duration = 0.20 if barrier_broken else 0.10 - _fishing_camera_shake_remaining = _fishing_camera_shake_duration - if barrier_broken: - _fishing_break_zoom_offset = fishing_barrier_break_zoom - - -func _update_fishing_camera_effects(delta: float) -> void: - _fishing_break_zoom_offset = move_toward( - _fishing_break_zoom_offset, - 0.0, - ( - fishing_barrier_break_zoom - / maxf(fishing_break_zoom_decay, 0.05) - ) * delta, - ) - if _fishing_camera_shake_remaining <= 0.0: - _camera.h_offset = 0.0 - _camera.v_offset = 0.0 - return - _fishing_camera_shake_remaining = maxf( - _fishing_camera_shake_remaining - delta, - 0.0, - ) - _fishing_camera_shake_phase += delta * 92.0 - var decay: float = ( - _fishing_camera_shake_remaining - / maxf(_fishing_camera_shake_duration, 0.001) - ) - var strength: float = _fishing_camera_shake_strength * decay - _camera.h_offset = sin(_fishing_camera_shake_phase) * strength - _camera.v_offset = cos(_fishing_camera_shake_phase * 1.31) * strength * 0.7 - - func _update_blink(delta: float) -> void: if _fighting_visual_active: return @@ -1414,7 +1301,7 @@ func _update_character_animation() -> void: var is_sneaking_pose: bool = ( locomotion_state == LocomotionState.SNEAKING ) - var is_presented_moving_horizontally: bool = ( + var is_moving_horizontally: bool = ( _is_presented_moving_horizontally() ) var animation_action: Dictionary = _get_presented_animation_action() @@ -1427,7 +1314,9 @@ func _update_character_animation() -> void: and supports_network_animation_action(animation_action_id) and _character_animation_player.has_animation(animation_action_id) ) - var held_show_item_visible: bool = _has_held_show_item() + var held_show_item_visible: bool = ( + _held_fish_visible or _held_art_kit_visible + ) var requested_animation: Array[StringName] = [] if _pocket_visual_active: requested_animation = [_pocket_visual_animation] @@ -1531,7 +1420,7 @@ func _update_character_animation() -> void: &"idle_loop_sit", ] elif is_sneaking_pose: - if is_presented_moving_horizontally: + if is_moving_horizontally: requested_animation = [ CHARACTER_SNEAKING_ANIMATION, CHARACTER_WALKING_ANIMATION, @@ -1600,20 +1489,8 @@ func _update_character_animation() -> void: _presented_animation_action_id = &"" _presented_animation_action_sequence = -1 _presented_animation_action_paused = false - if ( - _character_animation_playback_matches( - next_animation, - action_selected and animation_action_paused, - ) - and not action_changed - ): + if _character_animation_name == next_animation and not action_changed: return - # The animation name is only a selection cache. A remote player's - # AnimationPlayer can occasionally stop or lose its assigned animation while - # its replicated locomotion state remains valid. Reassert the selected - # presentation here instead of waiting for another network state transition; - # movement simulation and replication remain untouched. - _character_animation_player.active = true _character_animation_player.play(next_animation) _character_animation_name = next_animation if action_selected: @@ -1636,26 +1513,6 @@ func _update_character_animation() -> void: _character_animation_player.pause() -func _character_animation_playback_matches( - animation_name: StringName, - paused_action_selected: bool, -) -> bool: - if ( - _character_animation_name != animation_name - or _character_animation_player.assigned_animation != animation_name - or not _character_animation_player.active - ): - return false - if paused_action_selected: - return true - var animation := _character_animation_player.get_animation(animation_name) - if animation == null or animation.loop_mode == Animation.LOOP_NONE: - # Completed one-shot actions deliberately keep their final pose until the - # authoritative action state advances; they must not be restarted here. - return true - return _character_animation_player.is_playing() - - func _on_character_animation_finished(animation_name: StringName) -> void: if animation_name == CHARACTER_NET_STRIKE_ANIMATION: if local_control_enabled: @@ -1740,7 +1597,6 @@ func _complete_retract_animation() -> void: func toggle_sitting() -> void: if _sit_after_landing: _sit_after_landing = false - _set_sitting(false, local_control_enabled) return var should_sit: bool = not _sitting if should_sit: @@ -1754,12 +1610,8 @@ func toggle_sitting() -> void: ]) ): return - if not _can_begin_sitting(): + if not is_on_floor(): _sit_after_landing = true - # Queue and repeat the intent until an owner snapshot acknowledges it. - # Previously this branch returned before marking a local sitting intent, - # so a delayed authoritative audit could race the deferred sit. - _set_sitting(false, local_control_enabled) return _set_sitting(should_sit, local_control_enabled) @@ -1777,18 +1629,14 @@ func _set_sitting( should_sit: bool, is_local_intent: bool = false, ) -> void: - if is_local_intent: - _sitting_intent_pending = true - _sitting_intent_sequence = -1 if _sitting == should_sit: return _sitting = should_sit + if is_local_intent: + _sitting_intent_pending = true + _sitting_intent_sequence = -1 if _sitting: - # Sitting stops horizontal locomotion, but vertical motion remains owned by - # physics. Clearing Y here allowed a delayed seated state to repeatedly - # cancel gravity in a high-latency session. - velocity.x = 0.0 - velocity.z = 0.0 + velocity = Vector3.ZERO _character_animation_name = &"" _update_character_animation() @@ -1797,27 +1645,7 @@ func is_sitting() -> bool: return _sitting -func _can_begin_sitting() -> bool: - return is_on_floor() and velocity.y <= 0.0 - - -func _cancel_sitting_for_jump() -> void: - if not _sitting and not _sit_after_landing: - return - _sit_after_landing = false - _set_sitting(false, local_control_enabled) - - func get_network_sitting_state() -> bool: - return _sitting - - -func get_network_sitting_intent() -> bool: - # Jumping is an explicit cancellation of both a current sit and a deferred - # sit. Input capture can run before the matching physics frame, so suppress - # the stale seated bit as soon as the reliable jump intent is queued. - if _local_network_jump_intent_pending: - return false return _sitting or _sit_after_landing @@ -1826,14 +1654,7 @@ func apply_network_sitting_state(should_sit: bool) -> void: func apply_authoritative_network_sitting_state(should_sit: bool) -> void: - # Reliable animation updates use a separate channel from movement input. - # Never let a delayed seated state re-arm motion while a recovery relocation - # is still waiting for its explicit post-relocation neutral input. - if _water_recovery_active or _authoritative_relocation_input_quarantine: - return - if should_sit and ( - not _can_begin_sitting() or _network_jump_pending - ): + if should_sit and not is_on_floor(): _sit_after_landing = true _set_sitting(false) return @@ -1841,24 +1662,6 @@ func apply_authoritative_network_sitting_state(should_sit: bool) -> void: _set_sitting(should_sit) -func _apply_local_prediction_sitting_state(should_sit: bool) -> void: - # Owner audits can arrive several physics frames behind the locally predicted - # jump. Treat an authoritative seated bit as an intent until this capsule is - # actually grounded; applying it directly zeros vertical velocity and lets a - # stream of high-latency snapshots hold the local player in mid-air. - if _local_network_jump_intent_pending: - _sit_after_landing = false - _set_sitting(false) - return - if should_sit and not _can_begin_sitting(): - _sit_after_landing = true - _set_sitting(false) - return - if should_sit: - _sit_after_landing = false - _set_sitting(should_sit) - - func _input(event: InputEvent) -> void: # Camera dragging must observe the complete mouse gesture before GUI controls # get a chance to consume one part of it. Do not claim the event here: the @@ -1900,11 +1703,7 @@ func _unhandled_input(event: InputEvent) -> void: var mouse_zoom_in: bool = ( event is InputEventMouseButton - and ( - (not event.shift_pressed) - if _rv_interior_camera_mode - else event.shift_pressed != _swap_hotbar_camera_scroll - ) + and event.shift_pressed != _swap_hotbar_camera_scroll and event.is_action_pressed("camera_zoom_in") ) var controller_zoom_in: bool = ( @@ -1913,11 +1712,7 @@ func _unhandled_input(event: InputEvent) -> void: ) var mouse_zoom_out: bool = ( event is InputEventMouseButton - and ( - (not event.shift_pressed) - if _rv_interior_camera_mode - else event.shift_pressed != _swap_hotbar_camera_scroll - ) + and event.shift_pressed != _swap_hotbar_camera_scroll and event.is_action_pressed("camera_zoom_out") ) var controller_zoom_out: bool = ( @@ -2104,168 +1899,8 @@ func get_active_gameplay_camera() -> Camera3D: return _camera -func begin_shop_conversation_camera(npc_world_position: Vector3) -> bool: - if ( - not local_control_enabled - or _camera_yaw == null - or _camera_pitch == null - or _spring_arm == null - ): - return false - if _free_camera_active: - _set_free_camera_active(false) - _kill_conversation_camera_tween() - if _conversation_camera_snapshot == null: - _conversation_camera_snapshot = ConversationCameraSnapshot.new() - _conversation_camera_snapshot.yaw_transform = _camera_yaw.transform - _conversation_camera_snapshot.yaw_rotation = _camera_yaw.rotation - _conversation_camera_snapshot.pitch_rotation = _camera_pitch.rotation - _conversation_camera_snapshot.spring_length = _spring_arm.spring_length - _conversation_camera_snapshot.target_zoom = _target_zoom - _conversation_camera_snapshot.camera_dragging = _camera_dragging - _set_camera_dragging(false) - - var pair_direction := npc_world_position - global_position - pair_direction.y = 0.0 - if pair_direction.length_squared() <= 0.000001: - pair_direction = Vector3.RIGHT - else: - pair_direction = pair_direction.normalized() - # Frame the midpoint, with the camera's right axis running from the player - # toward the NPC. This naturally places the player left and shopkeeper right. - var target_world_yaw := atan2(-pair_direction.z, pair_direction.x) - var target_local_yaw := target_world_yaw - global_rotation.y - var shortest_target_yaw := ( - _camera_yaw.rotation.y - + wrapf(target_local_yaw - _camera_yaw.rotation.y, -PI, PI) - ) - var pair_midpoint := (global_position + npc_world_position) * 0.5 - pair_midpoint.y = global_position.y + conversation_camera_target_height - var target_position := to_local(pair_midpoint) - var duration := maxf(conversation_camera_transition_seconds, 0.05) - _conversation_camera_tween = create_tween() - _conversation_camera_tween.set_parallel(true) - _conversation_camera_tween.set_trans(Tween.TRANS_QUAD) - _conversation_camera_tween.set_ease(Tween.EASE_IN_OUT) - _conversation_camera_tween.tween_property( - _camera_yaw, "rotation:y", shortest_target_yaw, duration - ) - _conversation_camera_tween.tween_property( - _camera_yaw, "position", target_position, duration - ) - _conversation_camera_tween.tween_property( - _camera_pitch, - "rotation:x", - deg_to_rad(conversation_camera_pitch_degrees), - duration, - ) - _conversation_camera_tween.tween_property( - _spring_arm, - "spring_length", - maxf(conversation_camera_distance, 0.1), - duration, - ) - return true - - -func restore_shop_conversation_camera( - immediate: bool = false, - restored_callback: Callable = Callable(), -) -> void: - _kill_conversation_camera_tween() - if _conversation_camera_snapshot == null: - if restored_callback.is_valid(): - restored_callback.call() - return - if immediate: - _complete_conversation_camera_restore(restored_callback) - return - var yaw_target := _conversation_camera_snapshot.yaw_rotation - yaw_target.y = ( - _camera_yaw.rotation.y - + wrapf(yaw_target.y - _camera_yaw.rotation.y, -PI, PI) - ) - var generation := _conversation_camera_generation - var duration := maxf(conversation_camera_transition_seconds, 0.05) - _conversation_camera_tween = create_tween() - _conversation_camera_tween.set_parallel(true) - _conversation_camera_tween.set_trans(Tween.TRANS_QUAD) - _conversation_camera_tween.set_ease(Tween.EASE_IN_OUT) - _conversation_camera_tween.tween_property( - _camera_yaw, "rotation", yaw_target, duration - ) - _conversation_camera_tween.tween_property( - _camera_yaw, - "position", - _conversation_camera_snapshot.yaw_transform.origin, - duration, - ) - _conversation_camera_tween.tween_property( - _camera_pitch, - "rotation", - _conversation_camera_snapshot.pitch_rotation, - duration, - ) - _conversation_camera_tween.tween_property( - _spring_arm, - "spring_length", - _conversation_camera_snapshot.spring_length, - duration, - ) - _conversation_camera_tween.finished.connect( - _on_conversation_camera_restore_finished.bind( - generation, restored_callback - ) - ) - - -func is_shop_conversation_camera_active() -> bool: - return _conversation_camera_snapshot != null - - -func _kill_conversation_camera_tween() -> void: - if ( - _conversation_camera_tween != null - and _conversation_camera_tween.is_valid() - ): - _conversation_camera_tween.kill() - _conversation_camera_tween = null - _conversation_camera_generation += 1 - - -func _on_conversation_camera_restore_finished( - generation: int, - restored_callback: Callable, -) -> void: - if generation != _conversation_camera_generation: - return - _conversation_camera_tween = null - _complete_conversation_camera_restore(restored_callback) - - -func _complete_conversation_camera_restore( - restored_callback: Callable, -) -> void: - if _conversation_camera_snapshot != null: - _camera_yaw.transform = _conversation_camera_snapshot.yaw_transform - _camera_pitch.rotation = _conversation_camera_snapshot.pitch_rotation - _spring_arm.spring_length = _conversation_camera_snapshot.spring_length - _target_zoom = _conversation_camera_snapshot.target_zoom - _set_camera_dragging( - _conversation_camera_snapshot.camera_dragging - and Input.is_action_pressed("camera_drag") - ) - _conversation_camera_snapshot = null - if restored_callback.is_valid(): - restored_callback.call() - - func _set_target_zoom(value: float) -> void: - _target_zoom = clampf( - value, - 1.25 if _rv_interior_camera_mode else minimum_zoom, - 16.0 if _rv_interior_camera_mode else maximum_zoom, - ) + _target_zoom = clampf(value, minimum_zoom, maximum_zoom) func _apply_axis_deadzone(value: float) -> float: @@ -2367,7 +2002,6 @@ func reset_network_movement_state() -> void: _network_sprint = false _network_sneak = false _network_slow_walk = false - _authoritative_relocation_input_quarantine = false _network_input_age = 0.0 _network_input_stale = false _network_input_stale_timeout_seconds = NETWORK_INPUT_STALE_TIMEOUT_SECONDS @@ -2380,84 +2014,6 @@ func reset_network_movement_state() -> void: _local_prediction_largest_error = 0.0 -func neutralize_authoritative_input_for_relocation( - recovery_input_sequence: int = -1, -) -> void: - # A host-side relocation must not inherit a held movement input from the - # previous position. The client stamps its reliable recovery request with - # the most recent input sequence it created; every lower sequence was made - # before that request, even if it arrives on the movement channel later. - # Keep that watermark in the acknowledgement and accept movement only after - # an explicit neutral packet beyond it. - var acknowledged_input: int = maxi( - _last_network_input_sequence, - maxi(recovery_input_sequence, 0), - ) - reset_network_movement_state() - _last_network_input_sequence = acknowledged_input - _authoritative_relocation_input_quarantine = true - _clear_authoritative_network_motion_intent() - velocity = Vector3.ZERO - - -func _clear_authoritative_network_motion_intent() -> void: - _network_axis = Vector2.ZERO - _network_jump_pending = false - _network_jump_intent_active = false - _network_sprint = false - _network_sneak = false - _network_slow_walk = false - _sit_after_landing = false - _set_sitting(false) - _apply_network_casting(false) - - -func _is_neutral_authoritative_network_input(data: Dictionary) -> bool: - var axis: Array = data.get("axis", []) - if axis.size() != 2: - return false - # Sprint/sneak/slow-walk modifiers alone cannot move the avatar. Letting a - # held modifier through preserves a responsive recovery while still requiring - # zero movement, jump, sitting, and fishing state at the relocation barrier. - return ( - Vector2(float(axis[0]), float(axis[1])).length_squared() <= 0.0025 - and not bool(data.get("jump", false)) - and not bool(data.get("sitting", false)) - and not bool(data.get("casting", false)) - ) - - -func apply_network_space_transition( - target_transform: Transform3D, - align_local_camera: bool, -) -> void: - if not target_transform.origin.is_finite(): - return - # A room transition is a discontinuity, not ordinary movement. Preserve the - # host's input acknowledgement while clearing every motion, animation, and - # reconciliation state that could pull the avatar toward the previous space. - var acknowledged_input: int = _last_network_input_sequence - reset_network_movement_state() - _last_network_input_sequence = acknowledged_input - _apply_network_casting(false) - velocity = Vector3.ZERO - global_transform = Transform3D(Basis.IDENTITY, target_transform.origin) - var target_yaw: float = target_transform.basis.get_euler().y - _visuals.rotation.y = target_yaw - _network_camera_yaw = target_yaw - _network_target_position = global_position - _network_target_velocity = Vector3.ZERO - _network_target_visual_yaw = target_yaw - _network_snapshot_age = 0.0 - _network_snapshot_ready = true - _authoritative_movement_history.clear() - if align_local_camera: - _set_camera_dragging(false) - if _free_camera_active: - _set_free_camera_active(false) - _camera_yaw.rotation.y = target_yaw - - func capture_network_input(sequence: int) -> Dictionary: if _sitting_intent_pending and _sitting_intent_sequence < 0: _sitting_intent_sequence = sequence @@ -2482,7 +2038,7 @@ func capture_network_input(sequence: int) -> Dictionary: "sprint": false, "sneak": false, "slow_walk": false, - "sitting": get_network_sitting_intent(), + "sitting": get_network_sitting_state(), "casting": ( _fishing_visual_phase == FishingVisualPhase.CASTING ), @@ -2507,7 +2063,7 @@ func capture_network_input(sequence: int) -> Dictionary: "sprint": Input.is_action_pressed("sprint"), "sneak": Input.is_action_pressed("sneak"), "slow_walk": Input.is_action_pressed("slow_walk"), - "sitting": get_network_sitting_intent(), + "sitting": get_network_sitting_state(), "casting": _fishing_visual_phase == FishingVisualPhase.CASTING, "animation_action": _make_animation_action_state(), } @@ -2555,7 +2111,7 @@ func get_network_input_state_hash() -> int: Input.is_action_pressed("sprint"), Input.is_action_pressed("sneak"), Input.is_action_pressed("slow_walk"), - get_network_sitting_intent(), + get_network_sitting_state(), _fishing_visual_phase == FishingVisualPhase.CASTING, _animation_action_id, _animation_action_sequence, @@ -2581,17 +2137,8 @@ func apply_authoritative_network_input( NETWORK_INPUT_STALE_TIMEOUT_SECONDS, NETWORK_INPUT_STALE_TIMEOUT_MAX_SECONDS, ) - _network_camera_yaw = float(data.get("camera_yaw", 0.0)) - if _water_recovery_active or _authoritative_relocation_input_quarantine: - var clears_relocation_quarantine: bool = ( - _authoritative_relocation_input_quarantine - and _is_neutral_authoritative_network_input(data) - ) - _clear_authoritative_network_motion_intent() - if clears_relocation_quarantine: - _authoritative_relocation_input_quarantine = false - return _network_axis = Vector2(float(axis[0]), float(axis[1])).limit_length(1.0) + _network_camera_yaw = float(data.get("camera_yaw", 0.0)) var jump_intent_active: bool = bool(data.get("jump", false)) if jump_intent_active and not _network_jump_intent_active: _network_jump_pending = true @@ -2640,8 +2187,6 @@ func apply_network_animation_state(state: Dictionary) -> void: func apply_authoritative_network_animation_action( action_state: Dictionary, ) -> void: - if _water_recovery_active or _authoritative_relocation_input_quarantine: - return if not NetworkPlayerAnimationProtocol.validate_action_state(action_state): return var incoming_sequence: int = int(action_state["sequence"]) @@ -2715,13 +2260,6 @@ func apply_local_prediction_correction( var parsed: Dictionary = _parse_network_snapshot(snapshot) if parsed.is_empty(): return - # Water recovery owns the local transform until its reliable respawn - # teleport arrives. Ordinary movement audits may have been authored before - # the recovery presentation reached the host, so ignore every one of their - # fields while recovery is active. - if _water_recovery_active: - _reset_local_prediction_error() - return var acknowledged_input: int = parsed["acknowledged_input"] var sitting_intent_acknowledged: bool = ( _sitting_intent_pending @@ -2738,7 +2276,7 @@ func apply_local_prediction_correction( ): _clear_local_network_jump_intent() if not _sitting_intent_pending: - _apply_local_prediction_sitting_state(bool(parsed["sitting"])) + _set_sitting(bool(parsed["sitting"])) var authoritative_position: Vector3 = parsed["position"] var transit_seconds: float = resolve_local_prediction_transit_seconds( acknowledged_input, @@ -2766,21 +2304,6 @@ func apply_local_prediction_correction( _local_prediction_hard_corrections += 1 _reset_local_prediction_error() return - if _should_defer_local_prediction_correction(parsed): - # A host and its client do not reach the apex or landing on the same - # frame. Correcting that expected vertical disagreement while either - # side is airborne can pull the local body off narrow platforms. - _reset_local_prediction_error() - return - # Both simulations agree the player is standing. Let ordinary floor motion - # and gravity resolve the vertical component; a stale height sample must not - # press a locally controlled player down or turn a horizontal correction - # into an early floor collision. - error_offset.y = 0.0 - error_distance = error_offset.length() - if error_distance <= LOCAL_PREDICTION_CORRECTION_THRESHOLD: - _reset_local_prediction_error() - return var error_direction: Vector3 = error_offset.normalized() if ( not _local_prediction_error_direction.is_zero_approx() @@ -2815,34 +2338,22 @@ func apply_local_prediction_correction( correction.normalized() * LOCAL_PREDICTION_MAX_SOFT_CORRECTION_STEP ) - if _apply_camera_safe_local_correction(correction): - _local_prediction_soft_corrections += 1 + _apply_camera_safe_local_correction(correction) + _local_prediction_soft_corrections += 1 -func _should_defer_local_prediction_correction(parsed: Dictionary) -> bool: - if not bool(parsed.get("grounded", true)): - return true - return _local_network_jump_intent_pending or not is_on_floor() - - -func _apply_camera_safe_local_correction(correction: Vector3) -> bool: +func _apply_camera_safe_local_correction(correction: Vector3) -> void: if correction.is_zero_approx(): - return false + return var previous_visual_position: Vector3 = _visuals.global_position var previous_camera_position: Vector3 = _camera_yaw.global_position - var previous_body_position: Vector3 = global_position var base_visual_local_position: Vector3 = ( _visuals.position - _local_reconciliation_visual_offset ) var base_camera_local_position: Vector3 = ( _camera_yaw.position - _local_reconciliation_camera_offset ) - # Reconciliation is still physical movement. Going through the physics - # server prevents a delayed host audit from placing the capsule through a - # tree, cliff, or stepping stone on the way to the authoritative position. - move_and_collide(correction) - if global_position.is_equal_approx(previous_body_position): - return false + global_position += correction _visuals.global_position = previous_visual_position _camera_yaw.global_position = previous_camera_position _local_reconciliation_visual_offset = ( @@ -2851,7 +2362,6 @@ func _apply_camera_safe_local_correction(correction: Vector3) -> bool: _local_reconciliation_camera_offset = ( _camera_yaw.position - base_camera_local_position ) - return true func _reset_local_prediction_error() -> void: @@ -3001,10 +2511,10 @@ static func resolve_local_prediction_transit_seconds( ) -func apply_network_teleport(snapshot: Dictionary) -> bool: +func apply_network_teleport(snapshot: Dictionary) -> void: var parsed: Dictionary = _parse_network_snapshot(snapshot) if parsed.is_empty(): - return false + return global_position = parsed["position"] velocity = parsed["velocity"] _visuals.rotation.y = parsed["visual_yaw"] @@ -3017,13 +2527,6 @@ func apply_network_teleport(snapshot: Dictionary) -> bool: _apply_network_target_animation_state(parsed["animation_state"]) _network_snapshot_age = 0.0 _network_snapshot_ready = true - return true - - -func reset_local_prediction_after_authoritative_teleport() -> void: - _clear_local_network_jump_intent() - _reset_local_prediction_error() - _clear_local_reconciliation_offsets() func _parse_network_snapshot(snapshot: Dictionary) -> Dictionary: @@ -3074,9 +2577,6 @@ func _parse_network_snapshot(snapshot: Dictionary) -> Dictionary: if snapshot.has("casting") and typeof(snapshot.get("casting")) != TYPE_BOOL: return {} var casting: bool = bool(snapshot.get("casting", false)) - if snapshot.has("grounded") and typeof(snapshot.get("grounded")) != TYPE_BOOL: - return {} - var grounded: bool = bool(snapshot.get("grounded", true)) if ( not parsed_position.is_finite() or not parsed_velocity.is_finite() @@ -3088,7 +2588,6 @@ func _parse_network_snapshot(snapshot: Dictionary) -> Dictionary: "velocity": parsed_velocity, "visual_yaw": visual_yaw, "animation_state": animation_state, - "grounded": grounded, "acknowledged_input": acknowledged_input, "sitting": sitting, "casting": casting, @@ -3361,18 +2860,16 @@ func is_movement_enabled() -> bool: return _movement_enabled -func set_local_input_suppressed( - suppressor_id: StringName, suppressed: bool -) -> void: - if suppressor_id.is_empty(): +func set_local_input_suppressed(owner: StringName, suppressed: bool) -> void: + if owner.is_empty(): return if suppressed: - _local_input_suppressors[suppressor_id] = true + _local_input_suppressors[owner] = true velocity.x = 0.0 velocity.z = 0.0 _set_camera_dragging(false) else: - _local_input_suppressors.erase(suppressor_id) + _local_input_suppressors.erase(owner) func _is_movement_input_enabled() -> bool: @@ -3394,16 +2891,16 @@ func set_camera_input_enabled(enabled: bool) -> void: func set_camera_input_suppressed( - suppressor_id: StringName, + owner: StringName, suppressed: bool, ) -> void: - if suppressor_id.is_empty(): + if owner.is_empty(): return if suppressed: - _camera_input_suppressors[suppressor_id] = true + _camera_input_suppressors[owner] = true _set_camera_dragging(false) else: - _camera_input_suppressors.erase(suppressor_id) + _camera_input_suppressors.erase(owner) func set_camera_active(active: bool) -> void: @@ -3413,19 +2910,6 @@ func set_camera_active(active: bool) -> void: _camera.current = active -func face_world_direction(direction: Vector3) -> void: - var horizontal_direction := Vector3(direction.x, 0.0, direction.z) - if horizontal_direction.is_zero_approx() or _visuals == null: - return - horizontal_direction = horizontal_direction.normalized() - var target_world_yaw: float = atan2( - -horizontal_direction.x, - -horizontal_direction.z, - ) - _visuals.rotation.y = target_world_yaw - global_rotation.y - _network_target_visual_yaw = _visuals.rotation.y - - func apply_camera_settings( new_mouse_sensitivity: float, new_controller_sensitivity: float, @@ -3442,57 +2926,12 @@ func apply_camera_settings( _swap_hotbar_camera_scroll = swap_hotbar_camera_scroll -func set_rv_interior_camera_mode( - enabled: bool, - excluded_wall_rids: Array[RID] = [], -) -> void: - if enabled != _rv_interior_camera_mode: - if enabled: - _rv_previous_camera_environment = _camera.environment - _camera.environment = _get_rv_interior_environment() - if _free_camera != null: - _free_camera.environment = _camera.environment - else: - _camera.environment = _rv_previous_camera_environment - if _free_camera != null: - _free_camera.environment = _camera.environment - _rv_previous_camera_environment = null - _rv_interior_camera_mode = enabled - if _spring_arm == null: - return - _spring_arm.clear_excluded_objects() - if enabled: - for collider_rid: RID in excluded_wall_rids: - if collider_rid.is_valid(): - _spring_arm.add_excluded_object(collider_rid) - _set_target_zoom(_target_zoom) - - -func _get_rv_interior_environment() -> Environment: - if _rv_interior_environment != null: - return _rv_interior_environment - _rv_interior_environment = Environment.new() - _rv_interior_environment.background_mode = Environment.BG_COLOR - _rv_interior_environment.background_color = Color("020506") - _rv_interior_environment.ambient_light_source = ( - Environment.AMBIENT_SOURCE_COLOR - ) - _rv_interior_environment.ambient_light_color = Color("d6caaa") - _rv_interior_environment.ambient_light_energy = 1.0 - _rv_interior_environment.reflected_light_source = ( - Environment.REFLECTION_SOURCE_DISABLED - ) - return _rv_interior_environment - - func is_camera_input_enabled() -> bool: return _camera_input_enabled func set_water_recovery_active(active: bool) -> void: _water_recovery_active = active - if active: - _clear_authoritative_network_motion_intent() velocity = Vector3.ZERO @@ -3534,23 +2973,9 @@ func get_body_center_position() -> Vector3: func get_chat_anchor_position() -> Vector3: - return get_nameplate_anchor_position() - - -func get_nameplate_anchor_position() -> Vector3: - # Character head meshes keep stable authored bounds while skeletal animation - # plays. Restricting the anchor to them prevents rods, nets, held catches, - # and showcase props from making overhead UI bounce during an action. var highest_y := -INF - var skeleton := get_node_or_null( - "Visuals/CharacterRig/CharacterRig/Skeleton3D" - ) as Skeleton3D - for head_name: String in ["head_round", "head_pointy"]: - var mesh_instance := ( - skeleton.get_node_or_null(head_name) as MeshInstance3D - if skeleton != null - else null - ) + for node: Node in _visuals.find_children("*", "MeshInstance3D", true, false): + var mesh_instance := node as MeshInstance3D if mesh_instance == null or not mesh_instance.is_visible_in_tree(): continue var bounds := mesh_instance.get_aabb() @@ -3627,23 +3052,6 @@ func set_active_shovel(should_show: bool) -> void: ) -func set_active_decor_package(should_show: bool) -> void: - var changed: bool = _held_decor_package_visible != should_show - _held_decor_package_visible = should_show - if _held_decor_package_display != null: - _held_decor_package_display.visible = should_show - if should_show: - _fishing_rod.visible = false - if _catching_net != null: - _catching_net.visible = false - if _shovel != null: - _shovel.visible = false - elif changed: - _apply_active_rod_visibility() - if changed: - _update_character_animation() - - func _apply_fishing_rod_model(rod: FishingRodDataType) -> void: var next_id: StringName = rod.item_id if rod != null else StringName() if next_id == _active_fishing_rod_id: @@ -3683,8 +3091,8 @@ func set_active_item_is_rod( if _showcase_rod_state_stored: _showcase_rod_visibility = active_is_rod return - var rod_visibility_changed: bool = _fishing_rod.visible != active_is_rod - if not animate_transition or not rod_visibility_changed: + var visibility_changed: bool = _fishing_rod.visible != active_is_rod + if not animate_transition or not visibility_changed: _fishing_rod.visible = active_is_rod return if _has_held_show_item() or _showcase_animation_active: @@ -3816,52 +3224,7 @@ func set_held_fish( func _has_held_show_item() -> bool: - return ( - _held_fish_visible - or _held_art_kit_visible - or _held_decor_package_visible - ) - - -func _build_decor_package_display(parent: Node3D) -> Node3D: - var display := Node3D.new() - display.name = "HeldDecorPackageDisplay" - display.position = Vector3(0.0, 0.1, 0.04) - display.rotation = Vector3(0.15, 0.0, -0.55) - display.visible = false - parent.add_child(display) - - var sack := MeshInstance3D.new() - sack.name = "Sack" - var sack_mesh := SphereMesh.new() - sack_mesh.radius = 0.22 - sack_mesh.height = 0.48 - sack_mesh.radial_segments = 8 - sack_mesh.rings = 4 - sack_mesh.material = _decor_package_material(Color("a87843")) - sack.mesh = sack_mesh - display.add_child(sack) - - var tie := MeshInstance3D.new() - tie.name = "Tie" - var tie_mesh := CylinderMesh.new() - tie_mesh.top_radius = 0.1 - tie_mesh.bottom_radius = 0.12 - tie_mesh.height = 0.08 - tie_mesh.radial_segments = 8 - tie_mesh.material = _decor_package_material(Color("513829")) - tie.mesh = tie_mesh - tie.position = Vector3(0.0, 0.22, 0.0) - display.add_child(tie) - return display - - -func _decor_package_material(color: Color) -> StandardMaterial3D: - var material := StandardMaterial3D.new() - material.albedo_color = color - material.roughness = 1.0 - material.shading_mode = BaseMaterial3D.SHADING_MODE_PER_VERTEX - return material + return _held_fish_visible or _held_art_kit_visible func _clear_held_fish() -> void: diff --git a/player/player.tscn b/player/player.tscn index 3288d2d..4a2d897 100644 --- a/player/player.tscn +++ b/player/player.tscn @@ -12,7 +12,7 @@ [ext_resource type="Script" path="res://progression/player_cooler_capacity.gd" id="10_capacity"] [ext_resource type="Script" path="res://player/player_ground_shadow.gd" id="11_ground_shadow"] [ext_resource type="Material" path="res://player/materials/player_blob_shadow.tres" id="12_blob_shadow"] -[ext_resource type="PackedScene" path="res://art/exported/characters/base/straywild_base_character.glb" id="13_character"] +[ext_resource type="PackedScene" path="res://art/exported/characters/base/netfishing_base_character.glb" id="13_character"] [ext_resource type="Script" path="res://progression/player_art_unlocks.gd" id="14_art_unlocks"] [ext_resource type="Script" path="res://progression/player_experience.gd" id="15_experience"] [ext_resource type="Script" path="res://player/sprint_dust_trail.gd" id="16_sprint_dust"] diff --git a/player/player_visual_presenter.gd b/player/player_visual_presenter.gd index b071b2c..745fc3c 100644 --- a/player/player_visual_presenter.gd +++ b/player/player_visual_presenter.gd @@ -3,9 +3,9 @@ extends RefCounted const PlayerScene: PackedScene = preload("res://player/player.tscn") const FurPatternShader: Shader = preload("res://player/fur_pattern.gdshader") -const RUNTIME_MATERIAL_META: StringName = &"straywild_runtime_material" +const RUNTIME_MATERIAL_META: StringName = &"netfishing_runtime_material" const RUNTIME_FUR_PATTERN_MATERIAL_META: StringName = ( - &"straywild_runtime_fur_pattern_material" + &"netfishing_runtime_fur_pattern_material" ) const EAR_MESH_NAMES: Array[String] = [ "ears_antlers_round", diff --git a/player/sprint_dust_trail.gd b/player/sprint_dust_trail.gd index 16422ad..124b6ae 100644 --- a/player/sprint_dust_trail.gd +++ b/player/sprint_dust_trail.gd @@ -156,24 +156,24 @@ func _initialize_pool() -> void: func _spawn_puff(source_position: Vector3, direction: Vector3) -> void: var lateral := Vector3(-direction.z, 0.0, direction.x) - var puff_position := ( + var position := ( source_position - direction * PUFF_BACK_OFFSET + lateral * PUFF_SIDE_OFFSET * _foot_side + Vector3.UP * PUFF_HEIGHT ) - _spawn_puff_at(puff_position) + _spawn_puff_at(position) _foot_side *= -1.0 func _spawn_puff_at( - puff_position: Vector3, + position: Vector3, size_multiplier: float = 1.0, ) -> void: var variation: float = _stable_variation(_spawn_serial) var second_variation: float = _stable_variation(_spawn_serial + 37) var index: int = _next_puff - _puff_positions[index] = puff_position + _puff_positions[index] = position _puff_ages[index] = 0.0 _puff_widths[index] = ( lerpf(0.34, 0.43, variation) * size_multiplier diff --git a/progression/player_appearance_store.gd b/progression/player_appearance_store.gd index cca4436..7ac8767 100644 --- a/progression/player_appearance_store.gd +++ b/progression/player_appearance_store.gd @@ -1,8 +1,6 @@ class_name PlayerAppearanceStore extends Node -signal appearance_changed - const FORMAT_VERSION: int = 1 var _snapshot: Dictionary = CharacterCustomizationCatalog.default_snapshot() var _loaded: bool = false @@ -15,10 +13,6 @@ var _data_root: PlayerDataRoot func configure_storage(path: String, data_root: PlayerDataRoot) -> void: _profile_path = path _data_root = data_root - _snapshot = CharacterCustomizationCatalog.default_snapshot() - _loaded = false - _future_version = false - _expected_hash = "" func _temp_path() -> String: @@ -72,42 +66,11 @@ func save_snapshot(value: Dictionary) -> bool: _snapshot = value.duplicate(true) if _save_atomic(): _loaded = true - if _snapshot != previous: - appearance_changed.emit() return true _snapshot = previous return false -func restore_from_save_data( - value: Variant, - persist_to_profile_file: bool = true, -) -> bool: - if ( - typeof(value) != TYPE_DICTIONARY - or not CharacterCustomizationCatalog.validate_snapshot(value) - ): - return false - var sanitized: Dictionary = ( - CharacterCustomizationCatalog.sanitized_snapshot(value) - ) - if persist_to_profile_file: - return save_snapshot(sanitized) - var previous: Dictionary = _snapshot.duplicate(true) - _snapshot = sanitized - _loaded = true - if _snapshot != previous: - appearance_changed.emit() - return true - - -func reset_to_defaults(persist_to_profile_file: bool = true) -> bool: - return restore_from_save_data( - CharacterCustomizationCatalog.default_snapshot(), - persist_to_profile_file, - ) - - func is_loaded() -> bool: return _loaded diff --git a/progression/player_cooler_capacity.gd b/progression/player_cooler_capacity.gd index bbd0b87..b8c62be 100644 --- a/progression/player_cooler_capacity.gd +++ b/progression/player_cooler_capacity.gd @@ -2,77 +2,62 @@ class_name PlayerCoolerCapacity extends Node const PlayerWalletType = preload("res://economy/player_wallet.gd") -const PlayerHomeStateType = preload("res://homes/player_home_state.gd") signal capacity_changed(level: int, capacity: int) -## Compatibility adapter for saves and systems that still refer to the old -## cooler-capacity object. Storage is now derived exclusively from the player's -## home tier; this object is not independently purchasable. +## Kept under the historical class name so existing saves and network product +## identifiers migrate without losing their purchased level. This progression +## now controls the player's private storage box rather than carried catches. const CAPACITIES: Array[int] = [9, 18, 27, 36, 45, 54, 63, 72] const EXPANSION_COSTS: Array[int] = [75, 175, 400, 850, 1500, 2500, 4000] const MAX_LEVEL: int = 7 const MAX_CAPACITY: int = 72 -var _home_state: PlayerHomeStateType -var _legacy_capacity_level: int = 0 - - -func bind_home_state(home_state: PlayerHomeStateType) -> void: - if _home_state == home_state: - return - if ( - _home_state != null - and _home_state.changed.is_connected(_on_home_changed) - ): - _home_state.changed.disconnect(_on_home_changed) - _home_state = home_state - if ( - _home_state != null - and not _home_state.changed.is_connected(_on_home_changed) - ): - _home_state.changed.connect(_on_home_changed) - _on_home_changed() +var _capacity_level: int = 0 func get_level() -> int: - return _legacy_capacity_level + return _capacity_level func get_capacity() -> int: - if _home_state != null: - # A new home upgrade grants its authored capacity. Older saves retain any - # separately purchased storage level so reducing the first RV tier cannot - # hide or discard items that were already placed in later slots. - return maxi( - _home_state.get_storage_capacity(), - CAPACITIES[clampi(_legacy_capacity_level, 0, MAX_LEVEL)], - ) - return CAPACITIES[clampi(_legacy_capacity_level, 0, MAX_LEVEL)] + return CAPACITIES[_capacity_level] func get_next_capacity() -> int: - return -1 + if _capacity_level >= MAX_LEVEL: + return -1 + return CAPACITIES[_capacity_level + 1] func get_next_cost() -> int: - return -1 + if _capacity_level >= MAX_LEVEL: + return -1 + return EXPANSION_COSTS[_capacity_level] -func can_purchase(_wallet: PlayerWalletType) -> bool: - return false +func can_purchase(wallet: PlayerWalletType) -> bool: + var cost: int = get_next_cost() + return wallet != null and cost >= 0 and wallet.can_afford(cost) -func purchase(_wallet: PlayerWalletType) -> bool: - return false +func purchase(wallet: PlayerWalletType) -> bool: + if not can_purchase(wallet): + return false + var cost: int = get_next_cost() + if not wallet.debit(cost): + return false + _capacity_level += 1 + capacity_changed.emit(_capacity_level, get_capacity()) + return true func restore_level(level: int) -> bool: var validated: int = clampi(level, 0, MAX_LEVEL) - var changed: bool = _legacy_capacity_level != validated - _legacy_capacity_level = validated + var changed: bool = _capacity_level != validated + _capacity_level = validated if changed: - capacity_changed.emit(get_level(), get_capacity()) + capacity_changed.emit(_capacity_level, get_capacity()) return true @@ -81,8 +66,4 @@ func reset_to_defaults() -> void: func to_save_data() -> Dictionary: - return {"capacity_level": get_level()} - - -func _on_home_changed() -> void: - capacity_changed.emit(get_level(), get_capacity()) + return {"capacity_level": _capacity_level} diff --git a/project.godot b/project.godot index 559f8f4..c0a7537 100644 --- a/project.godot +++ b/project.godot @@ -10,11 +10,11 @@ config_version=5 [application] -config/name="straywild" -config/version="0.20.4-alpha" +config/name="NETFISHING" +config/version="0.17.1-alpha" run/main_scene="res://main/main.tscn" config/features=PackedStringArray("4.7", "GL Compatibility") -config/icon="res://art/exported/system_icons/straywild_256.png" +config/icon="res://art/exported/system_icons/netfishing_256.png" [autoload] @@ -24,6 +24,10 @@ TextureSamplingPolicy="*res://main/texture_sampling_policy.gd" window/stretch/aspect="expand" +[editor_plugins] + +enabled=PackedStringArray("res://addons/netfishing_shoreline_baker/plugin.cfg") + [gui] timers/tooltip_delay_sec=0.0 @@ -256,7 +260,7 @@ alternate_fishing={ [network] -discovery/base_url="https://discovery.straywild.io/patron-test" +discovery/base_url="https://discovery.netfishing.org" [physics] diff --git a/save/player_save_manager.gd b/save/player_save_manager.gd index 6383920..1ad74a1 100644 --- a/save/player_save_manager.gd +++ b/save/player_save_manager.gd @@ -34,16 +34,8 @@ const WorldWeatherServiceType = preload( const WorldLayoutType = preload("res://world/world_layout.gd") const PlayerJobServiceType = preload("res://jobs/player_job_service.gd") const PlayerType = preload("res://player/player.gd") -const PlayerHomeStateType = preload("res://homes/player_home_state.gd") -const DecorCatalogType = preload("res://homes/decor_catalog.gd") -const NetworkProfilePreferencesType = preload( - "res://network/network_profile_preferences.gd" -) -const PlayerAppearanceStoreType = preload( - "res://progression/player_appearance_store.gd" -) -const SAVE_VERSION: int = 11 +const SAVE_VERSION: int = 10 const LEGACY_SAVE_FILENAME := "player_save.json" const ARCHIVE_EXTENSION := ".nfsave" const BASIC_ROD_ID: StringName = &"basic_fishing_rod" @@ -84,10 +76,6 @@ class LoadSnapshot: WorldWeatherServiceType.SUNNY_DURATION_RANGE.x ) var jobs_data: Dictionary = PlayerJobServiceType.default_save_data() - var home_data: Dictionary = PlayerHomeStateType.default_save_data() - var has_character_data: bool = false - var character_profile_data: Dictionary = {} - var appearance_data: Dictionary = {} @export_range(0.05, 5.0, 0.05) var autosave_delay: float = 0.5 @@ -108,10 +96,6 @@ var _world_time: WorldTimeServiceType var _world_weather: WorldWeatherServiceType var _jobs: PlayerJobServiceType var _player: PlayerType -var _home_state: PlayerHomeStateType -var _network_profile: NetworkProfilePreferencesType -var _appearance_store: PlayerAppearanceStoreType -var _legacy_character_data: Dictionary = {} var _autosave_timer: Timer var _is_configured: bool = false var _is_restoring: bool = false @@ -191,9 +175,6 @@ func setup( world_weather: WorldWeatherServiceType, jobs: PlayerJobServiceType, player: PlayerType, - home_state: PlayerHomeStateType, - network_profile: NetworkProfilePreferencesType = null, - appearance_store: PlayerAppearanceStoreType = null, ) -> void: _inventory = inventory _collection_log = collection_log @@ -211,10 +192,6 @@ func setup( _world_weather = world_weather _jobs = jobs _player = player - _home_state = home_state - _network_profile = network_profile - _appearance_store = appearance_store - capture_legacy_character_fallback() _is_configured = ( _inventory != null and _collection_log != null @@ -232,7 +209,6 @@ func setup( and _world_weather != null and _jobs != null and _player != null - and _home_state != null ) if not _is_configured: push_error("PlayerSaveManager setup is missing required references.") @@ -279,134 +255,6 @@ func setup( _player.active_bait_changed.connect(_on_active_tackle_changed) if not _player.active_lure_changed.is_connected(_on_active_tackle_changed): _player.active_lure_changed.connect(_on_active_tackle_changed) - if not _home_state.changed.is_connected(_mark_dirty): - _home_state.changed.connect(_mark_dirty) - if ( - _network_profile != null - and not _network_profile.profile_changed.is_connected(_mark_dirty) - ): - _network_profile.profile_changed.connect(_mark_dirty) - if ( - _appearance_store != null - and not _appearance_store.appearance_changed.is_connected(_mark_dirty) - ): - _appearance_store.appearance_changed.connect(_mark_dirty) - - -func capture_legacy_character_fallback() -> void: - _legacy_character_data = _current_character_data() - - -func load_character_profile() -> bool: - if _network_profile == null or _appearance_store == null: - return true - _recover_interrupted_write() - var read_path: String = _read_path() - var previous_restoring: bool = _is_restoring - _is_restoring = true - if read_path.is_empty(): - var reset_ok: bool = _reset_character_profile() - _is_restoring = previous_restoring - return reset_ok - var decoded: Dictionary = ProgressionSaveCodec.read_local_save( - read_path, - read_path == _legacy_save_path(), - ) - if not bool(decoded.get("ok", false)): - _is_restoring = previous_restoring - return false - var save_data: Dictionary = decoded["data"] - var version: int = _read_integer(save_data.get("save_version"), -1) - if version < 1 or version > SAVE_VERSION: - _is_restoring = previous_restoring - return false - if version != SAVE_VERSION: - save_data = _migrate_save(save_data, version) - if save_data.is_empty(): - _is_restoring = previous_restoring - return false - var character: Dictionary = _character_data_from_save(save_data) - var restored: bool = ( - not character.is_empty() - and _restore_character_data(character) - ) - _is_restoring = previous_restoring - return restored - - -func _current_character_data() -> Dictionary: - if _network_profile == null or _appearance_store == null: - return {} - var profile: Dictionary = _network_profile.to_save_data() - var appearance: Dictionary = _appearance_store.get_snapshot() - if ( - not NetworkProfilePreferencesType.validate_save_data(profile) - or not CharacterCustomizationCatalog.validate_snapshot(appearance) - ): - return {} - return { - "profile": profile, - "appearance": appearance, - } - - -func _character_data_from_save(save_data: Dictionary) -> Dictionary: - if not save_data.has("character"): - return _legacy_character_data.duplicate(true) - if typeof(save_data.get("character")) != TYPE_DICTIONARY: - return {} - var character: Dictionary = save_data["character"] - if ( - not NetworkProfilePreferencesType.validate_save_data( - character.get("profile") - ) - or typeof(character.get("appearance")) != TYPE_DICTIONARY - or not CharacterCustomizationCatalog.validate_snapshot( - character.get("appearance") - ) - ): - return {} - return { - "profile": (character["profile"] as Dictionary).duplicate(true), - "appearance": CharacterCustomizationCatalog.sanitized_snapshot( - character["appearance"] - ), - } - - -func _restore_character_data(character: Dictionary) -> bool: - if _network_profile == null or _appearance_store == null: - return true - # The selected progression save is authoritative here. Applying it must not - # rewrite the compatibility profile mirrors: their guarded writes may be - # stale after a Syncthing edit, and that must not make a valid slot unloadable. - var previous_profile: Dictionary = _network_profile.to_save_data() - var previous_appearance: Dictionary = _appearance_store.get_snapshot() - if not _network_profile.restore_from_save_data( - character.get("profile"), false - ): - return false - if _appearance_store.restore_from_save_data( - character.get("appearance"), false - ): - return true - _network_profile.restore_from_save_data(previous_profile, false) - _appearance_store.restore_from_save_data(previous_appearance, false) - return false - - -func _reset_character_profile() -> bool: - if _network_profile == null or _appearance_store == null: - return true - var previous_profile: Dictionary = _network_profile.to_save_data() - var previous_appearance: Dictionary = _appearance_store.get_snapshot() - if not _network_profile.reset_to_defaults(false): - return false - if _appearance_store.reset_to_defaults(false): - return true - _network_profile.restore_from_save_data(previous_profile, false) - _appearance_store.restore_from_save_data(previous_appearance, false) - return false func load_player_data() -> bool: @@ -459,12 +307,6 @@ func load_player_data() -> bool: return false _is_restoring = true - var character_restored: bool = true - if snapshot.has_character_data: - character_restored = _restore_character_data({ - "profile": snapshot.character_profile_data, - "appearance": snapshot.appearance_data, - }) var inventory_restored: bool = _inventory.replace_all_catches( snapshot.catches, snapshot.next_catch_sequence @@ -488,11 +330,6 @@ func load_player_data() -> bool: snapshot.reel_speed_level, snapshot.barrier_power_level ) - # Home tier is now the authority for private-storage capacity, so restore it - # before the compatibility capacity adapter and inventory layout. - var home_restored: bool = _home_state.restore_from_save_data( - snapshot.home_data - ) var cooler_restored: bool = _cooler_capacity.restore_level( snapshot.cooler_capacity_level ) @@ -539,15 +376,13 @@ func load_player_data() -> bool: or not world_time_restored or not world_weather_restored or not jobs_restored - or not home_restored - or not character_restored ): push_error( ( "Validated player save could not be restored: " + "inventory=%s collection=%s wallet=%s bag=%s tackle=%s hotbar=%s " + "upgrades=%s cooler=%s layout=%s art=%s experience=%s " - + "time=%s weather=%s jobs=%s home=%s character=%s" + + "time=%s weather=%s jobs=%s" ) % [ inventory_restored, @@ -564,8 +399,6 @@ func load_player_data() -> bool: world_time_restored, world_weather_restored, jobs_restored, - home_restored, - character_restored, ] ) return false @@ -821,7 +654,6 @@ func copy_progression_to_path( func initialize_new_game( world_seed: int = DEFAULT_WORLD_SEED, world_layout: StringName = WorldLayoutType.GENERATED, - reset_character_profile: bool = true, ) -> bool: if not _is_configured: return false @@ -832,12 +664,6 @@ func initialize_new_game( ): return false _automatic_saving_blocked = false - if reset_character_profile: - _is_restoring = true - var character_reset: bool = _reset_character_profile() - _is_restoring = false - if not character_reset: - return false _restore_defaults() _world_layout = world_layout _world_seed = world_seed @@ -1031,7 +857,7 @@ func _build_save_dictionary() -> Dictionary: ): return {} - var save_data: Dictionary = { + return { "save_version": SAVE_VERSION, "wallet": { "balance": _wallet.get_balance(), @@ -1073,14 +899,7 @@ func _build_save_dictionary() -> Dictionary: ), }, "jobs": _jobs.to_save_data(), - "home": _home_state.to_save_data(), } - var character: Dictionary = _current_character_data() - if _network_profile != null and _appearance_store != null: - if character.is_empty(): - return {} - save_data["character"] = character - return save_data func _build_load_snapshot(save_data: Dictionary) -> LoadSnapshot: @@ -1094,7 +913,6 @@ func _build_load_snapshot(save_data: Dictionary) -> LoadSnapshot: or typeof(save_data.get("inventory_layout")) != TYPE_DICTIONARY or typeof(save_data.get("experience")) != TYPE_DICTIONARY or typeof(save_data.get("jobs")) != TYPE_DICTIONARY - or typeof(save_data.get("home")) != TYPE_DICTIONARY ): return null var wallet_data: Dictionary = save_data["wallet"] @@ -1106,7 +924,6 @@ func _build_load_snapshot(save_data: Dictionary) -> LoadSnapshot: var inventory_layout_data: Dictionary = save_data["inventory_layout"] var experience_data: Dictionary = save_data["experience"] var jobs_data: Dictionary = save_data["jobs"] - var home_data: Dictionary = save_data["home"] var world_data: Dictionary = {} if typeof(save_data.get("world")) == TYPE_DICTIONARY: world_data = save_data["world"] @@ -1163,17 +980,6 @@ func _build_load_snapshot(save_data: Dictionary) -> LoadSnapshot: return null var snapshot := LoadSnapshot.new() - var character: Dictionary = _character_data_from_save(save_data) - if save_data.has("character") and character.is_empty(): - return null - if not character.is_empty(): - snapshot.has_character_data = true - snapshot.character_profile_data = ( - character["profile"] as Dictionary - ).duplicate(true) - snapshot.appearance_data = ( - character["appearance"] as Dictionary - ).duplicate(true) if world_data.has("layout"): if not WorldLayoutType.is_valid(world_data["layout"]): return null @@ -1200,12 +1006,6 @@ func _build_load_snapshot(save_data: Dictionary) -> LoadSnapshot: if not PlayerJobServiceType.validate_save_data(jobs_data): return null snapshot.jobs_data = jobs_data.duplicate(true) - var sanitized_home: Dictionary = PlayerHomeStateType.sanitize_save_data( - home_data - ) - if sanitized_home.is_empty(): - return null - snapshot.home_data = sanitized_home if world_data.has("time_hours"): snapshot.world_time_hours = _read_world_time_hours( world_data["time_hours"] @@ -1384,12 +1184,7 @@ func _build_load_snapshot(save_data: Dictionary) -> LoadSnapshot: ) continue var maximum: int = ( - mini( - item_data.max_stack, - DecorCatalogType.MAX_OWNED_PER_PRODUCT, - ) - if DecorCatalogType.has_product(item_id) - else item_data.max_stack if item_data.stackable else 1 + item_data.max_stack if item_data.stackable else 1 ) if quantity > maximum: push_warning( @@ -1507,26 +1302,6 @@ func _build_load_snapshot(save_data: Dictionary) -> LoadSnapshot: PlayerCoolerCapacityType.MAX_LEVEL, "cooler.capacity_level" ) - # Before homes had upgrade tiers, storage was purchased separately. Preserve - # those saves by granting the starter RV to anybody who owned at least one - # legacy expansion. PlayerCoolerCapacity also retains the purchased legacy - # capacity so entries beyond the new RV's first 18 slots remain accessible. - if ( - snapshot.cooler_capacity_level > 0 - and int(snapshot.home_data.get("tier", 0)) - == PlayerHomeStateType.STARTER_TIER - ): - var migrated_home: Dictionary = home_data.duplicate(true) - migrated_home["tier"] = PlayerHomeStateType.STARTER_RV_TIER - migrated_home["exterior_id"] = String( - PlayerHomeStateType.STARTER_RV_EXTERIOR_ID - ) - var sanitized_migrated_home := ( - PlayerHomeStateType.sanitize_save_data(migrated_home) - ) - if sanitized_migrated_home.is_empty(): - return null - snapshot.home_data = sanitized_migrated_home snapshot.art_unlock_mask = _read_integer( art_data.get("unlock_mask"), 0, @@ -1565,8 +1340,6 @@ func _migrate_save( migrated = _migrate_version_8_to_9(migrated) 9: migrated = _migrate_version_9_to_10(migrated) - 10: - migrated = _migrate_version_10_to_11(migrated) _: return {} if migrated.is_empty(): @@ -1824,13 +1597,6 @@ func _migrate_version_9_to_10(data: Dictionary) -> Dictionary: return migrated -func _migrate_version_10_to_11(data: Dictionary) -> Dictionary: - var migrated: Dictionary = data.duplicate(true) - migrated["home"] = PlayerHomeStateType.default_save_data() - migrated["save_version"] = 11 - return migrated - - func _mark_dirty() -> void: if ( _is_restoring @@ -2100,7 +1866,6 @@ func _restore_defaults() -> void: _world_layout = WorldLayoutType.GENERATED _world_seed = DEFAULT_WORLD_SEED _jobs.reset_to_defaults() - _home_state.reset_to_defaults() _is_restoring = false _is_dirty = false diff --git a/save/player_save_slot_catalog.gd b/save/player_save_slot_catalog.gd index f96293b..d3b9d23 100644 --- a/save/player_save_slot_catalog.gd +++ b/save/player_save_slot_catalog.gd @@ -14,7 +14,6 @@ var _manifest_path := "" var _slots_directory := "" var _slots: Array[Dictionary] = [] var _active_slot_id := "" -var _online_slot_id := "" var _expected_hash := "" var _error_message := "" @@ -31,7 +30,6 @@ func configure( _slots_directory = data_root.root_path.path_join("player/saves") _slots.clear() _active_slot_id = "" - _online_slot_id = "" _expected_hash = "" _error_message = "" if DirAccess.make_dir_recursive_absolute(_slots_directory) != OK: @@ -45,17 +43,13 @@ func configure( return false var slot_count_before_discovery: int = _slots.size() var active_before_discovery: String = _active_slot_id - var online_before_discovery: String = _online_slot_id _discover_untracked_saves() if _active_slot_id.is_empty() and not _slots.is_empty(): _active_slot_id = str(_slots.front().get("slot_id", "")) - if _online_slot_id.is_empty() and not _slots.is_empty(): - _online_slot_id = _active_slot_id if ( not loaded or _slots.size() != slot_count_before_discovery or _active_slot_id != active_before_discovery - or _online_slot_id != online_before_discovery ): if not _save_manifest(): return false @@ -92,24 +86,6 @@ func get_active_slot_id() -> String: return _active_slot_id -func get_online_slot_id() -> String: - return _online_slot_id - - -func mark_slot_for_online(slot_id: String) -> bool: - if _find_slot(slot_id).is_empty(): - return false - if _online_slot_id == slot_id: - return true - var previous: String = _online_slot_id - _online_slot_id = slot_id - if not _save_manifest(): - _online_slot_id = previous - return false - slots_changed.emit() - return true - - func has_slots() -> bool: return not _slots.is_empty() @@ -126,26 +102,6 @@ func ensure_active_slot() -> Dictionary: return {"ok": true, "slot_id": slot_id} -func ensure_online_slot() -> Dictionary: - var slot_id: String = _online_slot_id - if slot_id.is_empty() or _find_slot(slot_id).is_empty(): - var active: Dictionary = ensure_active_slot() - if not bool(active.get("ok", false)): - return active - slot_id = str(active.get("slot_id", "")) - if not mark_slot_for_online(slot_id): - return { - "ok": false, - "message": "the online progression could not be selected.", - } - if _active_slot_id != slot_id and not activate_slot(slot_id): - return { - "ok": false, - "message": "the online progression could not be opened.", - } - return {"ok": true, "slot_id": slot_id} - - func create_empty_slot(display_name: String) -> Dictionary: if _slots.size() >= MAX_SLOTS: return {"ok": false, "message": "the maximum number of save slots has been reached."} @@ -161,12 +117,8 @@ func create_empty_slot(display_name: String) -> Dictionary: "last_played_at_unix": 0, "legacy": false, }) - var previous_online: String = _online_slot_id - if _online_slot_id.is_empty(): - _online_slot_id = slot_id if not _save_manifest(): _slots.pop_back() - _online_slot_id = previous_online return {"ok": false, "message": "the save-slot catalog could not be updated."} slots_changed.emit() return {"ok": true, "slot_id": slot_id} @@ -315,7 +267,6 @@ func delete_slot(slot_id: String) -> bool: for previous_entry: Dictionary in _slots: previous_slots.append(previous_entry.duplicate(true)) var previous_active: String = _active_slot_id - var previous_online: String = _online_slot_id var entry: Dictionary = _slots[index] var source_path: String = _existing_slot_path(entry) var preserved_path := "" @@ -330,18 +281,9 @@ func delete_slot(slot_id: String) -> bool: if not _slots.is_empty() else "" ) - if _online_slot_id == slot_id: - _online_slot_id = ( - _active_slot_id - if not _active_slot_id.is_empty() - else str(_slots.front().get("slot_id", "")) - if not _slots.is_empty() - else "" - ) if not _select_configured_storage() or not _save_manifest(): _slots = previous_slots _active_slot_id = previous_active - _online_slot_id = previous_online _select_configured_storage() if not preserved_path.is_empty(): _rename_file(preserved_path, source_path) @@ -373,7 +315,6 @@ func _build_slot_summary(entry: Dictionary) -> Dictionary: path.ends_with(".json"), ) summary["active"] = str(entry.get("slot_id", "")) == _active_slot_id - summary["online"] = str(entry.get("slot_id", "")) == _online_slot_id summary["has_save"] = inspection.can_continue() summary["save_status"] = inspection.status summary["status_message"] = inspection.message @@ -419,9 +360,6 @@ func _load_manifest() -> bool: _active_slot_id = str(data.get("active_slot_id", "")) if not _active_slot_id.is_empty() and not seen_ids.has(_active_slot_id): _active_slot_id = "" - _online_slot_id = str(data.get("online_slot_id", "")) - if not _online_slot_id.is_empty() and not seen_ids.has(_online_slot_id): - _online_slot_id = "" _expected_hash = PortableFileGuard.hash_file(_manifest_path) return true @@ -430,7 +368,6 @@ func _save_manifest() -> bool: var data: Dictionary = { "format_version": FORMAT_VERSION, "active_slot_id": _active_slot_id, - "online_slot_id": _online_slot_id, "slots": _slots, } var result: Dictionary = PortableFileGuard.write_guarded( @@ -639,7 +576,6 @@ func _preserve_invalid_manifest() -> bool: _expected_hash = "" _slots.clear() _active_slot_id = "" - _online_slot_id = "" return true diff --git a/save/progression_save_codec.gd b/save/progression_save_codec.gd index 4d0ba33..7844e16 100644 --- a/save/progression_save_codec.gd +++ b/save/progression_save_codec.gd @@ -1,8 +1,7 @@ class_name ProgressionSaveCodec extends RefCounted -const MAGIC := "straywild_PROGRESSION_CONTAINER" -const LEGACY_MAGIC := "NETFISHING_PROGRESSION_CONTAINER" +const MAGIC := "NETFISHING_PROGRESSION_CONTAINER" const FORMAT_VERSION := 1 const LOCAL_KIND := "local_save" const ARCHIVE_KIND := "portable_archive" @@ -10,8 +9,6 @@ const MAX_CONTAINER_BYTES := 16 * 1024 * 1024 # This key keeps routine progression files opaque to casual editing. Since the # client is open source, it is intentionally not treated as a security secret. -# Its original value is a stable file-format detail so released saves remain -# readable after the Straywild rebrand. const CONTAINER_PASSPHRASE := ( "NETfishing progression container v1 / not an identity credential" ) @@ -105,9 +102,15 @@ static func _read_container(path: String, expected_kind: String) -> Dictionary: or FileAccess.get_size(path) > MAX_CONTAINER_BYTES ): return {"ok": false, "message": "progression file is unavailable."} - var envelope_text: String = _read_encrypted_text(path) - if envelope_text.is_empty(): + var file: FileAccess = FileAccess.open_encrypted_with_pass( + path, + FileAccess.READ, + CONTAINER_PASSPHRASE, + ) + if file == null: return {"ok": false, "message": "progression file could not be opened."} + var envelope_text: String = file.get_as_text() + file.close() var envelope_json := JSON.new() if ( envelope_json.parse(envelope_text) != OK @@ -115,9 +118,8 @@ static func _read_container(path: String, expected_kind: String) -> Dictionary: ): return {"ok": false, "message": "progression container is malformed."} var envelope: Dictionary = envelope_json.data - var legacy_container: bool = envelope.get("magic") == LEGACY_MAGIC if ( - envelope.get("magic") not in [MAGIC, LEGACY_MAGIC] + envelope.get("magic") != MAGIC or int(envelope.get("format_version", -1)) != FORMAT_VERSION or str(envelope.get("kind", "")) != expected_kind ): @@ -142,23 +144,9 @@ static func _read_container(path: String, expected_kind: String) -> Dictionary: "game_version": str(envelope.get("game_version", "")), "created_at_unix": int(envelope.get("created_at_unix", 0)), "legacy_plaintext": false, - "legacy_container": legacy_container, } -static func _read_encrypted_text(path: String) -> String: - var file: FileAccess = FileAccess.open_encrypted_with_pass( - path, - FileAccess.READ, - CONTAINER_PASSPHRASE, - ) - if file == null: - return "" - var text: String = file.get_as_text() - file.close() - return text - - static func _read_plaintext_dictionary(path: String) -> Dictionary: var bytes: PackedByteArray = PortableFileGuard.read_bytes( path, diff --git a/scripts/bake_shoreline_ribbons.gd b/scripts/bake_shoreline_ribbons.gd new file mode 100644 index 0000000..c030579 --- /dev/null +++ b/scripts/bake_shoreline_ribbons.gd @@ -0,0 +1,42 @@ +extends SceneTree + +const REGION_SCENE := preload("res://world/regions/starter_island_region.tscn") +func _initialize() -> void: + call_deferred("_bake") + + +func _bake() -> void: + var started := Time.get_ticks_usec() + var region := REGION_SCENE.instantiate() + root.add_child(region) + var baker := region.get_node_or_null("ShorelineRibbonBaker") as ShorelineRibbonBaker + if baker == null: + push_error("The map does not contain a configured ShorelineRibbonBaker.") + quit(1) + return + var results := baker.rebuild_all() + if results.size() != baker.water_bodies.size(): + quit(1) + return + for result: Dictionary in results: + if result.get("skipped", false): + print( + "Shoreline %s: type=%s skipped intentionally" + % [result["output_path"], WaterType.label(result["water_type"])] + ) + continue + print( + "Shoreline %s: type=%s segments=%d loops=%d raw=%d simplified=%d smoothed=%d triangles=%d" + % [ + result["output_path"], + WaterType.label(result["water_type"]), + result["segment_count"], + result["loop_count"], + result["raw_point_count"], + result["simplified_point_count"], + result["smoothed_point_count"], + result["triangle_count"], + ] + ) + print("Shoreline bake completed in %.2f ms" % ((Time.get_ticks_usec() - started) / 1000.0)) + quit() diff --git a/scripts/bake_shoreline_ribbons.gd.uid b/scripts/bake_shoreline_ribbons.gd.uid new file mode 100644 index 0000000..7b789be --- /dev/null +++ b/scripts/bake_shoreline_ribbons.gd.uid @@ -0,0 +1 @@ +uid://eosavaa6wu1e diff --git a/scripts/build_android_debug.sh b/scripts/build_android_debug.sh index f68eb32..8f856f8 100755 --- a/scripts/build_android_debug.sh +++ b/scripts/build_android_debug.sh @@ -4,7 +4,7 @@ set -euo pipefail readonly SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)" -readonly OUTPUT_PATH="${PROJECT_ROOT}/builds/android/straywild-debug.apk" +readonly OUTPUT_PATH="${PROJECT_ROOT}/builds/android/NETfishing-debug.apk" readonly GODOT_BIN="${GODOT_BIN:-godot}" mkdir -p -- "$(dirname -- "${OUTPUT_PATH}")" diff --git a/scripts/build_playtest.sh b/scripts/build_playtest.sh index 4b2c58f..ff0628c 100755 --- a/scripts/build_playtest.sh +++ b/scripts/build_playtest.sh @@ -4,14 +4,14 @@ set -euo pipefail readonly SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)" -readonly BUILD_ROOT="${PROJECT_ROOT}/builds/v0.20.4-alpha" +readonly BUILD_ROOT="${PROJECT_ROOT}/builds/v0.17.1-alpha" readonly WINDOWS_DIR="${BUILD_ROOT}/windows-x86_64" readonly LINUX_DIR="${BUILD_ROOT}/linux-x86_64" readonly README_SOURCE="${PROJECT_ROOT}/docs/README-PLAYTEST.txt" readonly SOURCE_COMMIT="$(git -C "${PROJECT_ROOT}" rev-parse HEAD)" -readonly SOURCE_URL="https://forge.makearmy.io/woofmeow/straywild" -readonly WINDOWS_ZIP="${BUILD_ROOT}/straywild-v0.20.4-alpha-windows-x86_64.zip" -readonly LINUX_ZIP="${BUILD_ROOT}/straywild-v0.20.4-alpha-linux-x86_64.zip" +readonly SOURCE_URL="https://forge.makearmy.io/woofmeow/netfishing" +readonly WINDOWS_ZIP="${BUILD_ROOT}/NETfishing-v0.17.1-alpha-windows-x86_64.zip" +readonly LINUX_ZIP="${BUILD_ROOT}/NETfishing-v0.17.1-alpha-linux-x86_64.zip" readonly GODOT_BIN="${GODOT_BIN:-godot}" if [[ ! -f "${PROJECT_ROOT}/project.godot" ]]; then @@ -31,26 +31,26 @@ mkdir -p -- "${WINDOWS_DIR}" "${LINUX_DIR}" --headless \ --path "${PROJECT_ROOT}" \ --export-release "Windows Desktop" \ - "${WINDOWS_DIR}/straywild.exe" + "${WINDOWS_DIR}/NETfishing.exe" "${GODOT_BIN}" \ --headless \ --path "${PROJECT_ROOT}" \ --export-release "Linux Desktop" \ - "${LINUX_DIR}/straywild.x86_64" + "${LINUX_DIR}/NETfishing.x86_64" for required_file in \ - "${WINDOWS_DIR}/straywild.exe" \ - "${WINDOWS_DIR}/straywild.pck" \ - "${LINUX_DIR}/straywild.x86_64" \ - "${LINUX_DIR}/straywild.pck"; do + "${WINDOWS_DIR}/NETfishing.exe" \ + "${WINDOWS_DIR}/NETfishing.pck" \ + "${LINUX_DIR}/NETfishing.x86_64" \ + "${LINUX_DIR}/NETfishing.pck"; do if [[ ! -s "${required_file}" ]]; then echo "error: expected export output is missing: ${required_file}" >&2 exit 1 fi done -chmod +x -- "${LINUX_DIR}/straywild.x86_64" +chmod +x -- "${LINUX_DIR}/NETfishing.x86_64" cp -- "${README_SOURCE}" "${WINDOWS_DIR}/README-PLAYTEST.txt" cp -- "${README_SOURCE}" "${LINUX_DIR}/README-PLAYTEST.txt" @@ -60,7 +60,7 @@ stage_licenses() { install -m 0644 "${PROJECT_ROOT}/LICENSE" \ "${destination}/GPL-3.0-or-later.txt" install -m 0644 "${PROJECT_ROOT}/ASSET-LICENSE.md" \ - "${destination}/straywild-ASSET-LICENSE.md" + "${destination}/NETFISHING-ASSET-LICENSE.md" install -m 0644 "${PROJECT_ROOT}/docs/ATTRIBUTION.md" \ "${destination}/ATTRIBUTION.md" install -m 0644 "${PROJECT_ROOT}/TRADEMARKS.md" \ @@ -72,14 +72,11 @@ stage_licenses() { cat >"${destination}/SOURCE-CODE.md" <&2 exit 1 fi -if [[ "${straywild_ALLOW_DIRTY_RELEASE:-0}" != "1" ]]; then +if [[ "${NETFISHING_ALLOW_DIRTY_RELEASE:-0}" != "1" ]]; then dirty_tree=0 git -C "${PROJECT_ROOT}" diff --quiet || dirty_tree=1 git -C "${PROJECT_ROOT}" diff --cached --quiet || dirty_tree=1 @@ -99,23 +97,20 @@ done mkdir -p -- "${ARM64_ROOT}" "${RELEASE_ROOT}" if [[ ${PACKAGE_ONLY} -eq 0 ]]; then readonly EXPORT_PROJECT_ROOT="$( - mktemp -d -t straywild-portmaster-export.XXXXXX + mktemp -d -t netfishing-portmaster-export.XXXXXX )" cleanup_export_project() { rm -rf -- "${EXPORT_PROJECT_ROOT}" } trap cleanup_export_project EXIT INT TERM - rm -f -- \ - "${ARM64_EXECUTABLE}" \ - "${ARM64_PCK}" \ - "${PORTMASTER_FEATURE_MARKER}" + rm -f -- "${ARM64_EXECUTABLE}" "${ARM64_PCK}" rsync -a \ --exclude '/.git/' \ --exclude '/.godot/' \ --exclude '/art/source/' \ - --exclude '/art/exported/system_icons/straywild.ico' \ - --exclude '/art/exported/system_icons/straywild_1024.png' \ - --exclude '/art/exported/system_icons/straywild_1024.png.import' \ + --exclude '/art/exported/system_icons/netfishing.ico' \ + --exclude '/art/exported/system_icons/netfishing_1024.png' \ + --exclude '/art/exported/system_icons/netfishing_1024.png.import' \ --exclude '/audio/ambience/' \ --exclude '/builds/' \ --exclude '/docs/design/' \ @@ -129,24 +124,14 @@ if [[ ${PACKAGE_ONLY} -eq 0 ]]; then "${GODOT_BIN}" \ --headless \ --path "${EXPORT_PROJECT_ROOT}" \ - --export-release "PortMaster ARM64" \ + --export-release "Linux ARM64" \ "${ARM64_EXECUTABLE}" - printf '%s\n%s\n' \ - "${PORTMASTER_FEATURE_TAG}" \ - "${TAG_COMMIT}" >"${PORTMASTER_FEATURE_MARKER}" cleanup_export_project trap - EXIT INT TERM fi test -s "${ARM64_EXECUTABLE}" test -s "${ARM64_PCK}" -if [[ ! -f "${PORTMASTER_FEATURE_MARKER}" ]] \ - || ! grep -Fxq "${PORTMASTER_FEATURE_TAG}" "${PORTMASTER_FEATURE_MARKER}" \ - || ! grep -Fxq "${TAG_COMMIT}" "${PORTMASTER_FEATURE_MARKER}"; then - echo "PortMaster export is missing its tagged-preset marker." >&2 - echo "Run a full PortMaster build before using --package-only." >&2 - exit 1 -fi file "${ARM64_EXECUTABLE}" | grep -q "ARM aarch64" rm -rf -- "${STAGE_ROOT}" @@ -156,14 +141,14 @@ rm -f -- \ "${OBSOLETE_LOWERCASE_ARCHIVE}" mkdir -p -- "${GAME_ROOT}/licenses" -install -m 0755 "${TEMPLATE_ROOT}/straywild.sh" "${STAGE_ROOT}/straywild.sh" +install -m 0755 "${TEMPLATE_ROOT}/NETfishing.sh" "${STAGE_ROOT}/NETfishing.sh" install -m 0644 "${TEMPLATE_ROOT}/port.json" "${GAME_ROOT}/port.json" -install -m 0644 "${TEMPLATE_ROOT}/straywild.gptk" \ - "${GAME_ROOT}/straywild.gptk" -install -m 0755 "${TEMPLATE_ROOT}/launch-straywild.sh" \ - "${GAME_ROOT}/launch-straywild.sh" -install -m 0755 "${ARM64_EXECUTABLE}" "${GAME_ROOT}/straywild.aarch64" -install -m 0644 "${ARM64_PCK}" "${GAME_ROOT}/straywild.pck" +install -m 0644 "${TEMPLATE_ROOT}/netfishing.gptk" \ + "${GAME_ROOT}/netfishing.gptk" +install -m 0755 "${TEMPLATE_ROOT}/launch-netfishing.sh" \ + "${GAME_ROOT}/launch-netfishing.sh" +install -m 0755 "${ARM64_EXECUTABLE}" "${GAME_ROOT}/NETfishing.aarch64" +install -m 0644 "${ARM64_PCK}" "${GAME_ROOT}/NETfishing.pck" install -m 0644 "${TEMPLATE_ROOT}/gameinfo.xml" "${GAME_ROOT}/gameinfo.xml" install -m 0644 "${TEMPLATE_ROOT}/screenshot.png" "${GAME_ROOT}/screenshot.png" install -m 0644 \ @@ -174,7 +159,7 @@ install -m 0644 \ "${GAME_ROOT}/licenses/GPL-3.0-or-later.txt" install -m 0644 \ "${PROJECT_ROOT}/ASSET-LICENSE.md" \ - "${GAME_ROOT}/licenses/straywild-ASSET-LICENSE.md" + "${GAME_ROOT}/licenses/NETFISHING-ASSET-LICENSE.md" install -m 0644 \ "${PROJECT_ROOT}/TRADEMARKS.md" \ "${GAME_ROOT}/licenses/TRADEMARKS.md" @@ -186,7 +171,7 @@ install -m 0644 \ "${GAME_ROOT}/licenses/Seattle-Avenue-LICENSE.txt" cat >"${GAME_ROOT}/BUILD-INFO.txt" <"${GAME_ROOT}/licenses/SOURCE-CODE.md" <"${GAME_ROOT}/README.md" </dev/null readonly TOP_LEVELS="$( unzip -Z1 "${ARCHIVE}" | cut -d/ -f1 | sort -u )" -readonly EXPECTED_TOP_LEVELS="$(printf '%s\n' straywild straywild.sh)" +readonly EXPECTED_TOP_LEVELS="$(printf '%s\n' NETfishing.sh netfishing)" if [[ "${TOP_LEVELS}" != "${EXPECTED_TOP_LEVELS}" ]]; then echo "Unexpected PortMaster archive roots:" >&2 printf '%s\n' "${TOP_LEVELS}" >&2 exit 1 fi grep -q '"version": 4' "${GAME_ROOT}/port.json" -grep -q '"name": "straywild.zip"' "${GAME_ROOT}/port.json" +grep -q '"name": "netfishing.zip"' "${GAME_ROOT}/port.json" grep -q '"rtr": true' "${GAME_ROOT}/port.json" if unzip -Z1 "${ARCHIVE}" | grep -qx 'port.json'; then - echo "port.json must be inside straywild/, not at the archive root." >&2 + echo "port.json must be inside netfishing/, not at the archive root." >&2 exit 1 fi if grep -Eq '^[[:space:]]*#[[:space:]]*PORTMASTER:' \ - "${STAGE_ROOT}/straywild.sh"; then + "${STAGE_ROOT}/NETfishing.sh"; then echo "The distributable launcher contains an installed PortMaster signature." >&2 exit 1 fi grep -Fq 'PROFILE_PATH="$CONFDIR/performance_profile"' \ - "${STAGE_ROOT}/straywild.sh" -grep -Fq 'straywild_PERFORMANCE_PROFILE=light' \ - "${STAGE_ROOT}/straywild.sh" + "${STAGE_ROOT}/NETfishing.sh" +grep -Fq 'NETFISHING_PERFORMANCE_PROFILE=light' \ + "${STAGE_ROOT}/NETfishing.sh" grep -Fq 'CONTROLLER_MAPPING_FILE="$CONFDIR/cache/controller_mapping.txt"' \ - "${STAGE_ROOT}/straywild.sh" -grep -Fq 'SAVEDIR="$PORTS_ROOT/saves/straywild"' \ - "${STAGE_ROOT}/straywild.sh" -grep -Fq 'LEGACY_SAVEDIR="$PORTS_ROOT/saves/netfishing"' \ - "${STAGE_ROOT}/straywild.sh" -grep -Fq 'cp -a "$LEGACY_CONFDIR/." "$CONFDIR/"' \ - "${STAGE_ROOT}/straywild.sh" -grep -Fq '"straywild_DATA_DIR=$SAVEDIR"' \ - "${STAGE_ROOT}/straywild.sh" -grep -Fq '"straywild_CREATE_DATA_DIR=1"' \ - "${STAGE_ROOT}/straywild.sh" -grep -Fq 'printf '\''%s\n'\'' "$straywild_controllerconfig" > "$CONTROLLER_MAPPING_FILE"' \ - "${STAGE_ROOT}/straywild.sh" -grep -Fq '"$GAME_LAUNCHER"' "${STAGE_ROOT}/straywild.sh" -grep -Fq '"$CONTROLLER_MAPPING_FILE"' "${STAGE_ROOT}/straywild.sh" -if grep -Fq 'SDL_GAMECONTROLLERCONFIG="$straywild_controllerconfig"' \ - "${STAGE_ROOT}/straywild.sh"; then + "${STAGE_ROOT}/NETfishing.sh" +grep -Fq 'SAVEDIR="$PORTS_ROOT/saves/netfishing"' \ + "${STAGE_ROOT}/NETfishing.sh" +grep -Fq '"NETFISHING_DATA_DIR=$SAVEDIR"' \ + "${STAGE_ROOT}/NETfishing.sh" +grep -Fq '"NETFISHING_CREATE_DATA_DIR=1"' \ + "${STAGE_ROOT}/NETfishing.sh" +grep -Fq 'printf '\''%s\n'\'' "$netfishing_controllerconfig" > "$CONTROLLER_MAPPING_FILE"' \ + "${STAGE_ROOT}/NETfishing.sh" +grep -Fq '"$GAME_LAUNCHER"' "${STAGE_ROOT}/NETfishing.sh" +grep -Fq '"$CONTROLLER_MAPPING_FILE"' "${STAGE_ROOT}/NETfishing.sh" +if grep -Fq 'SDL_GAMECONTROLLERCONFIG="$netfishing_controllerconfig"' \ + "${STAGE_ROOT}/NETfishing.sh"; then echo "Raw controller mappings must not be passed through westonwrap.sh." >&2 exit 1 fi grep -Fq 'SDL_GAMECONTROLLERCONFIG="$(<"$CONTROLLER_MAPPING_FILE")"' \ - "${GAME_ROOT}/launch-straywild.sh" + "${GAME_ROOT}/launch-netfishing.sh" grep -Fq 'export SDL_GAMECONTROLLERCONFIG' \ - "${GAME_ROOT}/launch-straywild.sh" -grep -Fq 'exec "$@"' "${GAME_ROOT}/launch-straywild.sh" -grep -Fq 'GPTOKEYB_CONFIG="$GAMEDIR/straywild.gptk"' \ - "${STAGE_ROOT}/straywild.sh" -grep -Fq '$GPTOKEYB "straywild.aarch64" -c "$GPTOKEYB_CONFIG" &' \ - "${STAGE_ROOT}/straywild.sh" + "${GAME_ROOT}/launch-netfishing.sh" +grep -Fq 'exec "$@"' "${GAME_ROOT}/launch-netfishing.sh" +grep -Fq 'GPTOKEYB_CONFIG="$GAMEDIR/netfishing.gptk"' \ + "${STAGE_ROOT}/NETfishing.sh" +grep -Fq '$GPTOKEYB "NETfishing.aarch64" -c "$GPTOKEYB_CONFIG" &' \ + "${STAGE_ROOT}/NETfishing.sh" grep -Fq 'pm_platform_helper "$GAME_EXECUTABLE"' \ - "${STAGE_ROOT}/straywild.sh" -grep -Fq 'pm_finish' "${STAGE_ROOT}/straywild.sh" + "${STAGE_ROOT}/NETfishing.sh" +grep -Fq 'pm_finish' "${STAGE_ROOT}/NETfishing.sh" if [[ "$(grep -Ec '^[[:space:]]*\$GPTOKEYB[[:space:]]' \ - "${STAGE_ROOT}/straywild.sh")" -ne 1 ]]; then - echo "straywild must start exactly one GPTOKEYB exit handler." >&2 + "${STAGE_ROOT}/NETfishing.sh")" -ne 1 ]]; then + echo "NETfishing must start exactly one GPTOKEYB exit handler." >&2 exit 1 fi readonly GPTOKEYB_NOOP_KEYS=( @@ -322,13 +303,13 @@ readonly GPTOKEYB_NOOP_KEYS=( for noop_key in "${GPTOKEYB_NOOP_KEYS[@]}"; do if ! grep -Eq \ "^[[:space:]]*${noop_key}[[:space:]]*=[[:space:]]*\\\\\"[[:space:]]*$" \ - "${GAME_ROOT}/straywild.gptk"; then + "${GAME_ROOT}/netfishing.gptk"; then echo "GPTOKEYB no-op mapping is missing: ${noop_key}" >&2 exit 1 fi done if [[ "$(grep -Ec '^[[:space:]]*[a-z0-9_]+[[:space:]]*=' \ - "${GAME_ROOT}/straywild.gptk")" -ne "${#GPTOKEYB_NOOP_KEYS[@]}" ]]; then + "${GAME_ROOT}/netfishing.gptk")" -ne "${#GPTOKEYB_NOOP_KEYS[@]}" ]]; then echo "GPTOKEYB no-op mapping contains an unexpected assignment." >&2 exit 1 fi diff --git a/scripts/import_animalese_voice.sh b/scripts/import_animalese_voice.sh index b9076ca..cb7eded 100755 --- a/scripts/import_animalese_voice.sh +++ b/scripts/import_animalese_voice.sh @@ -35,10 +35,10 @@ if [[ ! "$SAMPLE_SET_DIRECTORY" =~ ^[a-z0-9_-]+$ ]]; then fi readonly DESTINATION_DIRECTORY="$PROJECT_ROOT/sound/dialogue/animalese/$SAMPLE_SET_DIRECTORY" -readonly WORK_DIRECTORY="$(mktemp -d -t straywild-animalese-import.XXXXXX)" +readonly WORK_DIRECTORY="$(mktemp -d -t netfishing-animalese-import.XXXXXX)" cleanup() { - if [[ "$WORK_DIRECTORY" == /tmp/straywild-animalese-import.* ]]; then + if [[ "$WORK_DIRECTORY" == /tmp/netfishing-animalese-import.* ]]; then find "$WORK_DIRECTORY" -depth -delete fi } diff --git a/scripts/normalize_texture_imports.gd b/scripts/normalize_texture_imports.gd index edea5b1..5b78ec1 100644 --- a/scripts/normalize_texture_imports.gd +++ b/scripts/normalize_texture_imports.gd @@ -31,11 +31,6 @@ const FACIAL_FEATURE_IMPORT_PATH: String = ( "art/exported/characters/faces/" ) const FACIAL_FEATURE_SIZE_LIMIT: int = 512 -const PROJECTED_TERRAIN_TEXTURE_IMPORTS: Array[String] = [ - "res://world/generation/chunks/assets/chunk_0000_grass_lite.png.import", - "res://world/generation/chunks/assets/chunk_0001_sand.png.import", - "res://world/generation/chunks/assets/chunk_0031_dirt.png.import", -] var apply_changes: bool = false var verbose: bool = false @@ -56,8 +51,8 @@ func _initialize() -> void: quit(2) return - for root_path: String in roots: - var normalized_root := root_path + for root: String in roots: + var normalized_root := root if not normalized_root.ends_with("/"): normalized_root += "/" if not normalized_root.begins_with("res://") and not normalized_root.is_absolute_path(): @@ -158,8 +153,6 @@ func _handle_import_file(import_path: String) -> void: var desired: Variant = section_data[section_key] if section_key == "process/size_limit": desired = _size_limit_for(import_path) - elif section_key == "mipmaps/generate": - desired = _generates_mipmaps(import_path) var existing: Variant = null if cfg.has_section(section_name) and cfg.has_section_key(section_name, section_key): existing = cfg.get_value(section_name, section_key) @@ -194,11 +187,6 @@ func _size_limit_for(import_path: String) -> int: return int(DEFAULT_PROFILE["params"]["process/size_limit"]) -func _generates_mipmaps(import_path: String) -> bool: - var normalized_path := import_path.replace("\\", "/") - return normalized_path in PROJECTED_TERRAIN_TEXTURE_IMPORTS - - func print_summary() -> void: if apply_changes: _print( diff --git a/scripts/normalize_texture_profiles.sh b/scripts/normalize_texture_profiles.sh index 0551efd..1483a61 100755 --- a/scripts/normalize_texture_profiles.sh +++ b/scripts/normalize_texture_profiles.sh @@ -13,7 +13,7 @@ fi readonly ROOT_PATH="$1" -readonly WORK_ROOT="$(mktemp -d -t straywild-godot-data.XXXXXX)" +readonly WORK_ROOT="$(mktemp -d -t netfishing-godot-data.XXXXXX)" trap 'rm -rf -- "${WORK_ROOT}"' EXIT cd "${PROJECT_ROOT}" diff --git a/scripts/portmaster/straywild.sh b/scripts/portmaster/NETfishing.sh similarity index 58% rename from scripts/portmaster/straywild.sh rename to scripts/portmaster/NETfishing.sh index d4e56a7..8e118da 100755 --- a/scripts/portmaster/straywild.sh +++ b/scripts/portmaster/NETfishing.sh @@ -16,56 +16,35 @@ source "$controlfolder/control.txt" [ -f "${controlfolder}/mod_${CFW_NAME}.txt" ] && source "${controlfolder}/mod_${CFW_NAME}.txt" get_controls -GAMEDIR="/${directory}/ports/straywild" +GAMEDIR="/${directory}/ports/netfishing" CONFDIR="$GAMEDIR/conf" -PORTS_ROOT="${GAMEDIR%/straywild}" -SAVEDIR="$PORTS_ROOT/saves/straywild" -LEGACY_GAMEDIR="$PORTS_ROOT/netfishing" -LEGACY_CONFDIR="$LEGACY_GAMEDIR/conf" -LEGACY_SAVEDIR="$PORTS_ROOT/saves/netfishing" -DATA_BOOTSTRAP_DIR="$CONFDIR/data/godot/app_userdata/straywild" -LEGACY_DATA_BOOTSTRAP_DIR="$CONFDIR/data/godot/app_userdata/NETFISHING" -GAME_EXECUTABLE="$GAMEDIR/straywild.aarch64" -GAME_LAUNCHER="$GAMEDIR/launch-straywild.sh" -GPTOKEYB_CONFIG="$GAMEDIR/straywild.gptk" +PORTS_ROOT="${GAMEDIR%/netfishing}" +SAVEDIR="$PORTS_ROOT/saves/netfishing" +DATA_BOOTSTRAP_DIR="$CONFDIR/data/godot/app_userdata/NETFISHING" +GAME_EXECUTABLE="$GAMEDIR/NETfishing.aarch64" +GAME_LAUNCHER="$GAMEDIR/launch-netfishing.sh" +GPTOKEYB_CONFIG="$GAMEDIR/netfishing.gptk" CONTROLLER_MAPPING_FILE="$CONFDIR/cache/controller_mapping.txt" -WESTON_DIR="/tmp/straywild-weston" +WESTON_DIR="/tmp/netfishing-weston" WESTON_RUNTIME="weston_pkg_0.2" HARBOURMASTER="$controlfolder/harbourmaster" mkdir -p "$CONFDIR/data" "$CONFDIR/config" "$CONFDIR/cache" "$WESTON_DIR" chmod +x "$GAME_EXECUTABLE" -# A renamed PortMaster entry installs beside the former NETfishing port. Copy -# its device-local configuration once and continue using its established save -# root when present. New installations use straywild paths exclusively. -if [ -d "$LEGACY_CONFDIR" ] && [ ! -f "$CONFDIR/.netfishing-imported" ]; then - cp -a "$LEGACY_CONFDIR/." "$CONFDIR/" - touch "$CONFDIR/.netfishing-imported" -fi -if [ ! -f "$SAVEDIR/straywild_data.json" ] \ - && [ ! -f "$SAVEDIR/netfishing_data.json" ] \ - && { [ -f "$LEGACY_SAVEDIR/straywild_data.json" ] \ - || [ -f "$LEGACY_SAVEDIR/netfishing_data.json" ]; }; then - SAVEDIR="$LEGACY_SAVEDIR" -fi - -# straywild uses a predictable save directory beside the port instead of +# NETfishing uses a predictable save directory beside the port instead of # presenting a folder picker on a small screen. Preserve an established # data-root choice when upgrading an existing installation. -straywild_DATA_ENVIRONMENT=() -if [ -f "$SAVEDIR/straywild_data.json" ] \ - || [ -f "$SAVEDIR/netfishing_data.json" ] || { +NETFISHING_DATA_ENVIRONMENT=() +if [ -f "$SAVEDIR/netfishing_data.json" ] || { [ ! -f "$DATA_BOOTSTRAP_DIR/data_root_bootstrap.json" ] && - [ ! -f "$DATA_BOOTSTRAP_DIR/data_root_bootstrap.json.backup" ] && - [ ! -f "$LEGACY_DATA_BOOTSTRAP_DIR/data_root_bootstrap.json" ] && - [ ! -f "$LEGACY_DATA_BOOTSTRAP_DIR/data_root_bootstrap.json.backup" ] + [ ! -f "$DATA_BOOTSTRAP_DIR/data_root_bootstrap.json.backup" ] }; then mkdir -p "$SAVEDIR" - straywild_DATA_ENVIRONMENT+=( - "straywild_DATA_DIR=$SAVEDIR" - "straywild_CREATE_DATA_DIR=1" + NETFISHING_DATA_ENVIRONMENT+=( + "NETFISHING_DATA_DIR=$SAVEDIR" + "NETFISHING_CREATE_DATA_DIR=1" ) fi @@ -73,7 +52,7 @@ fi if [ ! -f "$controlfolder/libs/${WESTON_RUNTIME}.squashfs" ]; then if [ ! -x "$HARBOURMASTER" ]; then - pm_message "straywild requires the latest PortMaster and WestonPack runtime." + pm_message "NETfishing requires the latest PortMaster and WestonPack runtime." sleep 5 exit 1 fi @@ -99,17 +78,17 @@ cd "$GAMEDIR" || exit 1 GODOT_MUOS_MAPPING="19004ca6010000000100000000010000,muOS-Keys,a:b0,b:b1,x:b3,y:b2,leftshoulder:b4,rightshoulder:b5,lefttrigger:b10,righttrigger:b11,guide:b8,start:b7,back:b6,dpup:h0.1,dpleft:h0.8,dpright:h0.2,dpdown:h0.4,leftx:a0,lefty:a1,leftstick:b9,rightx:a2,righty:a3,rightstick:b12,platform:Linux," MUOS_SDL2_GUID="19000000010000000100000000010000" if [[ "$sdl_controllerconfig" == "${MUOS_SDL2_GUID},"* ]]; then - straywild_controllerconfig="$GODOT_MUOS_MAPPING" + netfishing_controllerconfig="$GODOT_MUOS_MAPPING" elif [ -n "$sdl_controllerconfig" ]; then - straywild_controllerconfig="$sdl_controllerconfig" + netfishing_controllerconfig="$sdl_controllerconfig" else - straywild_controllerconfig="$GODOT_MUOS_MAPPING" + netfishing_controllerconfig="$GODOT_MUOS_MAPPING" fi -printf '%s\n' "$straywild_controllerconfig" > "$CONTROLLER_MAPPING_FILE" +printf '%s\n' "$netfishing_controllerconfig" > "$CONTROLLER_MAPPING_FILE" -straywild_GODOT_OPTIONS=() -straywild_GAME_ENVIRONMENT=() -PERFORMANCE_PROFILE="${straywild_PERFORMANCE_PROFILE:-}" +NETFISHING_GODOT_OPTIONS=() +NETFISHING_GAME_ENVIRONMENT=() +PERFORMANCE_PROFILE="${NETFISHING_PERFORMANCE_PROFILE:-}" PROFILE_PATH="$CONFDIR/performance_profile" if [[ -z "$PERFORMANCE_PROFILE" && -r "$PROFILE_PATH" ]]; then IFS= read -r PERFORMANCE_PROFILE < "$PROFILE_PATH" || true @@ -117,16 +96,16 @@ if [[ -z "$PERFORMANCE_PROFILE" && -r "$PROFILE_PATH" ]]; then fi case "$PERFORMANCE_PROFILE" in normal) - straywild_GAME_ENVIRONMENT+=( - "straywild_PERFORMANCE_PROFILE=normal" + NETFISHING_GAME_ENVIRONMENT+=( + "NETFISHING_PERFORMANCE_PROFILE=normal" ) ;; light|"") - straywild_GAME_ENVIRONMENT+=( - "straywild_PERFORMANCE_PROFILE=light" - "straywild_LOW_END=1" + NETFISHING_GAME_ENVIRONMENT+=( + "NETFISHING_PERFORMANCE_PROFILE=light" + "NETFISHING_LOW_END=1" ) - straywild_GODOT_OPTIONS+=( + NETFISHING_GODOT_OPTIONS+=( --single-window --disable-vsync --max-fps 30 @@ -135,11 +114,11 @@ case "$PERFORMANCE_PROFILE" in ;; *) echo "Unknown performance profile '$PERFORMANCE_PROFILE'; using light." >&2 - straywild_GAME_ENVIRONMENT+=( - "straywild_PERFORMANCE_PROFILE=light" - "straywild_LOW_END=1" + NETFISHING_GAME_ENVIRONMENT+=( + "NETFISHING_PERFORMANCE_PROFILE=light" + "NETFISHING_LOW_END=1" ) - straywild_GODOT_OPTIONS+=( + NETFISHING_GODOT_OPTIONS+=( --single-window --disable-vsync --max-fps 30 @@ -148,10 +127,10 @@ case "$PERFORMANCE_PROFILE" in ;; esac -# straywild reads gameplay input natively. The explicit no-op map prevents +# NETfishing reads gameplay input natively. The explicit no-op map prevents # GPTOKEYB from injecting duplicate keyboard or mouse input while retaining # its device-specific force-quit chord, including on ROCKNIX. -$GPTOKEYB "straywild.aarch64" -c "$GPTOKEYB_CONFIG" & +$GPTOKEYB "NETfishing.aarch64" -c "$GPTOKEYB_CONFIG" & pm_platform_helper "$GAME_EXECUTABLE" $ESUDO env CRUSTY_RESOLUTION="${DISPLAY_WIDTH}x${DISPLAY_HEIGHT}" \ @@ -160,12 +139,12 @@ $ESUDO env CRUSTY_RESOLUTION="${DISPLAY_WIDTH}x${DISPLAY_HEIGHT}" \ XDG_CONFIG_HOME="$CONFDIR/config" \ XDG_CACHE_HOME="$CONFDIR/cache" \ GODOT_SILENCE_ROOT_WARNING=1 \ - "${straywild_DATA_ENVIRONMENT[@]}" \ - "${straywild_GAME_ENVIRONMENT[@]}" \ + "${NETFISHING_DATA_ENVIRONMENT[@]}" \ + "${NETFISHING_GAME_ENVIRONMENT[@]}" \ "$GAME_LAUNCHER" \ "$CONTROLLER_MAPPING_FILE" \ "$GAME_EXECUTABLE" \ - "${straywild_GODOT_OPTIONS[@]}" \ + "${NETFISHING_GODOT_OPTIONS[@]}" \ --resolution "${DISPLAY_WIDTH}x${DISPLAY_HEIGHT}" \ --fullscreen \ --rendering-driver opengl3_es \ diff --git a/scripts/portmaster/gameinfo.xml b/scripts/portmaster/gameinfo.xml index 1b0a1c7..ef608bd 100755 --- a/scripts/portmaster/gameinfo.xml +++ b/scripts/portmaster/gameinfo.xml @@ -1,13 +1,13 @@ - ./straywild.sh - straywild + ./NETfishing.sh + NETfishing A relaxed multiplayer fishing game about exploring a small island, catching and collecting fish, customizing your character, and spending time by the water. 20260804T000000 - straywild project + NETfishing project Independent adventure, simulation - ./straywild/screenshot.png + ./netfishing/screenshot.png diff --git a/scripts/portmaster/launch-straywild.sh b/scripts/portmaster/launch-netfishing.sh similarity index 100% rename from scripts/portmaster/launch-straywild.sh rename to scripts/portmaster/launch-netfishing.sh diff --git a/scripts/portmaster/straywild.gptk b/scripts/portmaster/netfishing.gptk similarity index 87% rename from scripts/portmaster/straywild.gptk rename to scripts/portmaster/netfishing.gptk index 2e8602e..ff1ad36 100644 --- a/scripts/portmaster/straywild.gptk +++ b/scripts/portmaster/netfishing.gptk @@ -1,4 +1,4 @@ -# straywild reads the controller directly. GPTOKEYB is retained only for its +# NETfishing reads the controller directly. GPTOKEYB is retained only for its # device-specific force-quit chord, so every keyboard and mouse binding is # disabled to prevent duplicate input. diff --git a/scripts/portmaster/port.json b/scripts/portmaster/port.json index 4c36648..affc601 100644 --- a/scripts/portmaster/port.json +++ b/scripts/portmaster/port.json @@ -1,13 +1,13 @@ { "version": 4, - "name": "straywild.zip", + "name": "netfishing.zip", "items": [ - "straywild.sh", - "straywild/" + "NETfishing.sh", + "netfishing/" ], "items_opt": null, "attr": { - "title": "straywild", + "title": "NETfishing", "porter": [ "Voyager" ], diff --git a/scripts/run_validations.sh b/scripts/run_validations.sh index 64cfb31..2ebaeff 100755 --- a/scripts/run_validations.sh +++ b/scripts/run_validations.sh @@ -6,9 +6,9 @@ readonly SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)" readonly GODOT_BIN="${GODOT_BIN:-godot}" readonly TEST_TIMEOUT_SECONDS="${TEST_TIMEOUT_SECONDS:-120}" -readonly RUN_ROOT="$(mktemp -d -t straywild-validations.XXXXXX)" +readonly RUN_ROOT="$(mktemp -d -t netfishing-validations.XXXXXX)" -export straywild_ISOLATED_VALIDATION_STORAGE=1 +export NETFISHING_ISOLATED_VALIDATION_STORAGE=1 readonly -a QUICK_TESTS=( "scripts/validate_animalese_samples.gd" @@ -22,7 +22,6 @@ readonly -a QUICK_TESTS=( "tests/controller_world_interaction_validation.gd" "tests/controller_ui_navigation_validation.gd" "tests/dedicated_server_config_validation.gd" - "tests/discovery_privacy_validation.gd" "tests/digging_prototype_validation.gd" "tests/equipment_catalog_validation.gd" "tests/exported_decal_hotfix_validation.gd" @@ -44,9 +43,8 @@ readonly -a QUICK_TESTS=( "tests/on_screen_keyboard_validation.gd" "tests/player_gathering_animation_validation.gd" "tests/player_experience_validation.gd" - "tests/profile_title_validation.gd" + "tests/shoreline_ambience_validation.gd" "tests/surface_drawing_validation.gd" - "tests/surface_drawing_performance_validation.gd" "tests/surface_drawing_texture_renderer_validation.gd" "tests/tackle_order_validation.gd" "tests/terrain_biome_validation.gd" @@ -54,7 +52,6 @@ readonly -a QUICK_TESTS=( "tests/terrain_chunk_generator_validation.gd" "tests/texture_sampling_validation.gd" "tests/tree_gathering_prototype_validation.gd" - "tests/tooltip_escape_validation.gd" "tests/unified_inventory_validation.gd" "tests/world_time_validation.gd" "tests/world_layout_validation.gd" @@ -81,7 +78,6 @@ readonly -a HOST_TESTS=( "tests/inventory_storage_persistence_validation.gd" "tests/job_system_validation.gd" "tests/progression_archive_validation.gd" - "tests/save_reload_conflict_validation.gd" "tests/surface_drawing_runtime_validation.gd" ) @@ -91,7 +87,6 @@ readonly -a NETWORK_TESTS=( "tests/fish_showcase_multiplayer_validation.gd" "tests/friend_multiplayer_validation.gd" "tests/fishing_multiplayer_validation.gd" - "tests/home_spawn_multiplayer_validation.gd" "tests/job_multiplayer_validation.gd" "tests/movement_multiplayer_validation.gd" "tests/operator_multiplayer_validation.gd" diff --git a/scripts/setup_android_build.sh b/scripts/setup_android_build.sh index bc96083..c1cebdc 100755 --- a/scripts/setup_android_build.sh +++ b/scripts/setup_android_build.sh @@ -336,8 +336,8 @@ check_editor_settings() { run_export_hint() { echo echo "Example export commands:" - echo " ${GODOT} --headless --path \"$PROJECT_ROOT\" --export-release \"Android\" builds/${PROJECT_VERSION}/android/straywild.apk" - echo " ${GODOT} --headless --path \"$PROJECT_ROOT\" --export-debug \"Android\" builds/android/straywild-debug.apk" + echo " ${GODOT} --headless --path \"$PROJECT_ROOT\" --export-release \"Android\" builds/${PROJECT_VERSION}/android/NETfishing.apk" + echo " ${GODOT} --headless --path \"$PROJECT_ROOT\" --export-debug \"Android\" builds/android/NETfishing-debug.apk" } print_status INFO "Starting Android dependency preflight..." diff --git a/scripts/test_player_data_root_paths.gd b/scripts/test_player_data_root_paths.gd index f357b9a..69a2485 100644 --- a/scripts/test_player_data_root_paths.gd +++ b/scripts/test_player_data_root_paths.gd @@ -1,36 +1,36 @@ extends SceneTree -const PROJECT_PATH := "/tmp/straywild" -const INSTALL_PATH := "/opt/straywild" +const PROJECT_PATH := "/tmp/netfishing" +const INSTALL_PATH := "/opt/NETfishing" func _initialize() -> void: - var root_to_create: String = OS.get_environment("straywild_TEST_CREATE_ROOT") + var root_to_create: String = OS.get_environment("NETFISHING_TEST_CREATE_ROOT") if not root_to_create.is_empty(): _create_validation_root(root_to_create) return var failures: PackedStringArray = [] _expect( "external temporary directory", - "/tmp/straywild-test-data", + "/tmp/NETfishing-test-data", PlayerDataRoot.PATH_ALLOWED, failures, ) _expect( "external trailing slash", - "/tmp/straywild-test-data/", + "/tmp/NETfishing-test-data/", PlayerDataRoot.PATH_ALLOWED, failures, ) _expect( "similar project-name sibling", - "/tmp/straywild-data", + "/tmp/netfishing-data", PlayerDataRoot.PATH_ALLOWED, failures, ) _expect( "documents directory", - "/home/player/Documents/straywild", + "/home/player/Documents/NETfishing", PlayerDataRoot.PATH_ALLOWED, failures, ) @@ -55,7 +55,7 @@ func _initialize() -> void: ) _expect_with_references( "empty project reference", - "/tmp/straywild-test-data", + "/tmp/NETfishing-test-data", "", INSTALL_PATH, PlayerDataRoot.PATH_ALLOWED, @@ -63,7 +63,7 @@ func _initialize() -> void: ) _expect_with_references( "root project reference", - "/tmp/straywild-test-data", + "/tmp/NETfishing-test-data", "/", INSTALL_PATH, PlayerDataRoot.PATH_ALLOWED, @@ -71,9 +71,9 @@ func _initialize() -> void: ) _expect_with_references( "Windows component and case normalization", - "C:\\Games\\straywild Data", - "C:\\Games\\straywild", - "C:\\Program Files\\straywild", + "C:\\Games\\NETfishing Data", + "C:\\Games\\NETfishing", + "C:\\Program Files\\NETfishing", PlayerDataRoot.PATH_ALLOWED, failures, true, diff --git a/server/dedicated_server_config.gd b/server/dedicated_server_config.gd index 3370457..2f515c4 100644 --- a/server/dedicated_server_config.gd +++ b/server/dedicated_server_config.gd @@ -1,7 +1,7 @@ class_name DedicatedServerConfig extends RefCounted -const DEFAULT_NAME: String = "straywild Dedicated Server" +const DEFAULT_NAME: String = "NETfishing Dedicated Server" const DEFAULT_BIND_ADDRESS: String = "*" const DEFAULT_PORT: int = 7777 const DEFAULT_MAX_PLAYERS: int = 8 @@ -31,10 +31,8 @@ static func from_runtime() -> DedicatedServerConfig: result.discovery_url = str(ProjectSettings.get_setting( "network/discovery/base_url", "" )).strip_edges() - var config_path: String = _environment_string( - "straywild_SERVER_CONFIG", - "NETFISHING_SERVER_CONFIG", - "", + var config_path: String = OS.get_environment( + "NETFISHING_SERVER_CONFIG" ).strip_edges() for argument: String in OS.get_cmdline_user_args(): if argument.begins_with("--config="): @@ -89,44 +87,36 @@ func _load_file(path: String) -> bool: func _apply_environment() -> void: server_name = _environment_string( - "straywild_SERVER_NAME", "NETFISHING_SERVER_NAME", server_name + "NETFISHING_SERVER_NAME", server_name ) bind_address = _environment_string( - "straywild_SERVER_BIND", "NETFISHING_SERVER_BIND", bind_address - ) - port = _environment_int( - "straywild_SERVER_PORT", "NETFISHING_SERVER_PORT", port + "NETFISHING_SERVER_BIND", bind_address ) + port = _environment_int("NETFISHING_SERVER_PORT", port) max_players = _environment_int( - "straywild_SERVER_MAX_PLAYERS", - "NETFISHING_SERVER_MAX_PLAYERS", - max_players, + "NETFISHING_SERVER_MAX_PLAYERS", max_players ) world_seed = _environment_int( - "straywild_WORLD_SEED", "NETFISHING_WORLD_SEED", world_seed + "NETFISHING_WORLD_SEED", world_seed ) public_listing = _environment_bool( - "straywild_SERVER_PUBLIC", "NETFISHING_SERVER_PUBLIC", public_listing + "NETFISHING_SERVER_PUBLIC", public_listing ) discovery_url = _environment_string( - "straywild_DISCOVERY_URL", "NETFISHING_DISCOVERY_URL", discovery_url + "NETFISHING_DISCOVERY_URL", discovery_url ) data_directory = _environment_string( - "straywild_DATA_DIR", "NETFISHING_DATA_DIR", data_directory + "NETFISHING_DATA_DIR", data_directory ) chat_logging = _environment_bool( - "straywild_CHAT_LOGGING", "NETFISHING_CHAT_LOGGING", chat_logging + "NETFISHING_CHAT_LOGGING", chat_logging ) chat_log_path = _environment_string( - "straywild_CHAT_LOG_PATH", "NETFISHING_CHAT_LOG_PATH", chat_log_path + "NETFISHING_CHAT_LOG_PATH", chat_log_path ) - var operators_variable: String = _available_environment_variable( - "straywild_SERVER_OPERATORS", - "NETFISHING_SERVER_OPERATORS", - ) - if not operators_variable.is_empty(): + if OS.has_environment("NETFISHING_SERVER_OPERATORS"): operator_fingerprints = _parse_fingerprint_list( - OS.get_environment(operators_variable) + OS.get_environment("NETFISHING_SERVER_OPERATORS") ) @@ -221,45 +211,21 @@ static func _safe_text(value: String) -> bool: return true -static func _available_environment_variable( - name: String, - legacy_name: String, -) -> String: - if OS.has_environment(name): - return name - return legacy_name if OS.has_environment(legacy_name) else "" +static func _environment_string(name: String, fallback: String) -> String: + return OS.get_environment(name) if OS.has_environment(name) else fallback -static func _environment_string( - name: String, - legacy_name: String, - fallback: String, -) -> String: - var variable: String = _available_environment_variable(name, legacy_name) - return OS.get_environment(variable) if not variable.is_empty() else fallback - - -static func _environment_int( - name: String, - legacy_name: String, - fallback: int, -) -> int: - var variable: String = _available_environment_variable(name, legacy_name) +static func _environment_int(name: String, fallback: int) -> int: return ( - _parse_int(OS.get_environment(variable), fallback) - if not variable.is_empty() else fallback + _parse_int(OS.get_environment(name), fallback) + if OS.has_environment(name) else fallback ) -static func _environment_bool( - name: String, - legacy_name: String, - fallback: bool, -) -> bool: - var variable: String = _available_environment_variable(name, legacy_name) - if variable.is_empty(): +static func _environment_bool(name: String, fallback: bool) -> bool: + if not OS.has_environment(name): return fallback - var value: String = OS.get_environment(variable).strip_edges().to_lower() + var value: String = OS.get_environment(name).strip_edges().to_lower() return value in ["1", "true", "yes", "on"] diff --git a/settings/controller_mapping_manager.gd b/settings/controller_mapping_manager.gd index 278022e..8c17e7f 100644 --- a/settings/controller_mapping_manager.gd +++ b/settings/controller_mapping_manager.gd @@ -84,7 +84,7 @@ const ROLE_LABELS: Dictionary = { ROLE_LB: "focus chat or world", ROLE_RB: "primary action", ROLE_POINTER_MODIFIER: "virtual mouse modifier", - ROLE_CAMERA_ZOOM: "zoom modifier (+RT)", + ROLE_CAMERA_ZOOM: "camera zoom", ROLE_SELECT: "chat", ROLE_START: "pause", ROLE_LEFT_STICK_CLICK: "sprint", @@ -96,7 +96,7 @@ const ROLE_LABELS: Dictionary = { ROLE_LEFT_STICK_X: "move left / right", ROLE_LEFT_STICK_Y: "move up / down", ROLE_RIGHT_STICK_X: "camera left / right", - ROLE_RIGHT_STICK_Y: "camera up / down (+RT to zoom)", + ROLE_RIGHT_STICK_Y: "camera up / down", } const ROLE_PROMPTS: Dictionary = { diff --git a/settings/keyboard_mouse_mapping_manager.gd b/settings/keyboard_mouse_mapping_manager.gd index 54dacc8..591bc52 100644 --- a/settings/keyboard_mouse_mapping_manager.gd +++ b/settings/keyboard_mouse_mapping_manager.gd @@ -86,8 +86,8 @@ const ROLE_LABELS: Dictionary = { ROLE_PRIMARY_ACTION: "primary action", ROLE_ALTERNATE_REEL: "alternate reel", ROLE_CAMERA_DRAG: "rotate camera", - ROLE_CAMERA_ZOOM_IN: "hotbar select (+SHIFT to zoom)", - ROLE_CAMERA_ZOOM_OUT: "hotbar select (+SHIFT to zoom)", + ROLE_CAMERA_ZOOM_IN: "camera zoom in", + ROLE_CAMERA_ZOOM_OUT: "camera zoom out", ROLE_PLAYER_MENU: "player menu", ROLE_TACKLE_BOX: "tackle box", ROLE_PROP_BOOK: "prop book", diff --git a/settings/player_settings.gd b/settings/player_settings.gd index 5734925..59099fc 100644 --- a/settings/player_settings.gd +++ b/settings/player_settings.gd @@ -101,7 +101,7 @@ func copy() -> PlayerSettings: func normalize_implicit_presentation_layout() -> bool: if presentation_layout_customized: return false - var layout_changed: bool = ( + var changed: bool = ( chat_dock_right != DEFAULT_CHAT_DOCK_RIGHT or chat_mobile_mode != DEFAULT_CHAT_MOBILE_MODE or paint_dock_right != DEFAULT_PAINT_DOCK_RIGHT @@ -109,7 +109,7 @@ func normalize_implicit_presentation_layout() -> bool: chat_dock_right = DEFAULT_CHAT_DOCK_RIGHT chat_mobile_mode = DEFAULT_CHAT_MOBILE_MODE paint_dock_right = DEFAULT_PAINT_DOCK_RIGHT - return layout_changed + return changed static func _is_valid_audio_volume(value: float) -> bool: diff --git a/settings/player_settings_manager.gd b/settings/player_settings_manager.gd index 362abc9..3fd2a35 100644 --- a/settings/player_settings_manager.gd +++ b/settings/player_settings_manager.gd @@ -7,7 +7,7 @@ const TEMP_PATH: String = "user://player_settings.json.tmp" const BACKUP_PATH: String = "user://player_settings.json.backup" const SILENT_VOLUME_DB: float = -80.0 const HEADLESS_WRITE_ENVIRONMENT: String = ( - "straywild_ISOLATED_VALIDATION_STORAGE" + "NETFISHING_ISOLATED_VALIDATION_STORAGE" ) signal settings_changed(settings: PlayerSettings) diff --git a/tests/android_readiness_validation.gd b/tests/android_readiness_validation.gd index 372051a..7472063 100644 --- a/tests/android_readiness_validation.gd +++ b/tests/android_readiness_validation.gd @@ -44,20 +44,18 @@ func _init() -> void: assert(_has_joypad_button(&"open_quick_actions", JOY_BUTTON_DPAD_DOWN)) assert(_has_joypad_button(&"open_chat", JOY_BUTTON_BACK)) assert(_has_joypad_button(&"focus_gameplay", JOY_BUTTON_LEFT_SHOULDER)) - var virtual_mouse_trigger_axis: int = GameUIType.VIRTUAL_MOUSE_TRIGGER_AXIS - var virtual_mouse_shared_trigger_axis: int = ( + assert( + GameUIType.VIRTUAL_MOUSE_TRIGGER_AXIS == JOY_AXIS_TRIGGER_RIGHT + ) + assert( GameUIType.VIRTUAL_MOUSE_SHARED_TRIGGER_AXIS + == JOY_AXIS_TRIGGER_LEFT ) - var virtual_mouse_secondary_click_axis: int = ( + assert( GameUIType.VIRTUAL_MOUSE_SECONDARY_CLICK_AXIS + == JOY_AXIS_TRIGGER_LEFT ) - var controller_zoom_trigger_axis: int = ( - PlayerType.CONTROLLER_ZOOM_TRIGGER_AXIS - ) - assert(virtual_mouse_trigger_axis == JOY_AXIS_TRIGGER_RIGHT) - assert(virtual_mouse_shared_trigger_axis == JOY_AXIS_TRIGGER_LEFT) - assert(virtual_mouse_secondary_click_axis == JOY_AXIS_TRIGGER_LEFT) - assert(controller_zoom_trigger_axis == JOY_AXIS_TRIGGER_LEFT) + assert(PlayerType.CONTROLLER_ZOOM_TRIGGER_AXIS == JOY_AXIS_TRIGGER_LEFT) assert(is_zero_approx( GameUIType.normalized_trigger_strength(-1.0, -1.0) )) diff --git a/tests/art_tools_validation.gd b/tests/art_tools_validation.gd index 1ac593d..3bc4633 100644 --- a/tests/art_tools_validation.gd +++ b/tests/art_tools_validation.gd @@ -19,15 +19,9 @@ func _run() -> void: for _frame: int in 8: await process_frame assert(bool(main.get("_application_initialized"))) - assert(bool(main.call( - "_apply_world", WorldLayout.STARTER_ISLAND, 1, true - ))) - assert(bool(main.call( - "_prepare_host_world", WorldLayout.STARTER_ISLAND, 1 - ))) assert(bool(main.call("_prepare_private_host"))) var save_manager := main.get("_save_manager") as PlayerSaveManager - assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND)) + assert(save_manager.initialize_new_game()) main.call("_enter_gameplay") await physics_frame await physics_frame @@ -100,7 +94,11 @@ func _run() -> void: assert(keyboard_mapping.reset_mapping()) await process_frame var shop_prompt_key := game_ui.get_node("%ShopPromptKey") as Label + var storage_prompt_message := game_ui.get_node( + "%StoragePromptMessage" + ) as Label assert(shop_prompt_key.text == "E") + assert(storage_prompt_message.text == "E open storage") var remapped_interact := InputEventKey.new() remapped_interact.physical_keycode = KEY_F remapped_interact.pressed = true @@ -110,6 +108,7 @@ func _run() -> void: )) await process_frame assert(shop_prompt_key.text == "F") + assert(storage_prompt_message.text == "F open storage") assert(keyboard_mapping.reset_mapping()) await process_frame assert(toolbar.get_parent() == chat_ui.get_parent()) @@ -306,17 +305,6 @@ func _run() -> void: assert(on_screen_keyboard.is_open()) on_screen_keyboard.call("_close_keyboard", true) assert(typed_chat_entry.has_focus()) - - # A deferred Standby bite has not started the fishing minigame yet. It must - # release fishing's input ownership so chat remains available until the - # player confirms the bite. - chat_fishing_spot.call("_set_fishing_input_priority", true) - chat_fishing_spot.call("_set_bite_confirmation_pending", true) - for _frame: int in 4: - await process_frame - assert(not chat_fishing_spot.is_fishing_input_priority_active()) - assert(chat_ui.is_open()) - chat_fishing_spot.call("_set_bite_confirmation_pending", false) var left_bumper := InputEventJoypadButton.new() left_bumper.button_index = JOY_BUTTON_LEFT_SHOULDER left_bumper.pressed = true @@ -409,17 +397,7 @@ func _run() -> void: # not the inactive normal gameplay camera. var normal_camera := player.get_gameplay_camera() var normal_camera_transform: Transform3D = normal_camera.global_transform - var chat_anchor: Vector3 = player.get_nameplate_anchor_position() - assert(player.get_chat_anchor_position().is_equal_approx(chat_anchor)) - var held_gear_probe := MeshInstance3D.new() - var held_gear_mesh := BoxMesh.new() - held_gear_mesh.size = Vector3(0.5, 4.0, 0.5) - held_gear_probe.mesh = held_gear_mesh - held_gear_probe.position = Vector3(0.0, 6.0, 0.0) - player.get_node("%Visuals").add_child(held_gear_probe) - assert(player.get_nameplate_anchor_position().is_equal_approx(chat_anchor)) - assert(player.get_chat_anchor_position().is_equal_approx(chat_anchor)) - held_gear_probe.free() + var chat_anchor: Vector3 = player.get_chat_anchor_position() normal_camera.look_at( normal_camera.global_position - (chat_anchor - normal_camera.global_position), @@ -427,149 +405,6 @@ func _run() -> void: ) assert(normal_camera.is_position_behind(chat_anchor)) assert(not free_camera.is_position_behind(chat_anchor)) - free_camera.look_at(chat_anchor, Vector3.UP) - chat_ui.call("_update_nameplates") - var nameplate_layer := chat_ui.get("_nameplate_layer") as Control - var nameplates: Dictionary = chat_ui.get("_nameplates") - var local_nameplate: Dictionary = nameplates.get( - session.get_local_peer_id(), {} - ) - var nameplate_control := local_nameplate.get("control") as Control - var nameplate_name := local_nameplate.get("name") as Label - var nameplate_title := local_nameplate.get("title") as Label - var local_record := session.get_peer_record(session.get_local_peer_id()) - assert( - nameplate_control != null and nameplate_control.visible, - ( - "local nameplate must be visible (available=%s world=%s layer=%s " - + "shared=%s remote_visible=%s behind=%s occluded=%s screen=%s viewport=%s)" - ) - % [ - bool(chat_ui.get("_available")), - chat_ui.is_world_speech_visible(), - nameplate_layer.visible, - bool(chat_ui.call( - "_speaker_shares_local_space", session.get_local_peer_id() - )), - player.is_remote_presentation_visible(), - free_camera.is_position_behind(chat_anchor), - bool(chat_ui.call( - "_is_speech_world_occluded", free_camera, player, chat_anchor - )), - free_camera.unproject_position(chat_anchor) - / float(chat_ui.get("_output_scale")), - chat_ui.get_viewport_rect().size, - ], - ) - assert(nameplate_name != null and nameplate_title != null) - assert(nameplate_name.text == local_record.display_name) - assert(nameplate_title.text == local_record.title) - assert( - nameplate_name.get_theme_font_size("font_size") - == ChatUI.NAMEPLATE_NAME_FONT_SIZE - ) - assert( - nameplate_title.get_theme_font_size("font_size") - == ChatUI.NAMEPLATE_TITLE_FONT_SIZE - ) - assert( - nameplate_name.get_theme_font_size("font_size") - > nameplate_title.get_theme_font_size("font_size") - ) - assert(ChatUI.NAMEPLATE_NAME_FONT_SIZE == 20) - assert(ChatUI.NAMEPLATE_TITLE_TOP < ChatUI.NAMEPLATE_NAME_HEIGHT) - assert(ChatUI.NAMEPLATE_HEIGHT < 42.0) - assert(nameplate_title.position.y == ChatUI.NAMEPLATE_TITLE_TOP) - for flat_label: Label in [nameplate_name, nameplate_title]: - assert(flat_label.get_theme_color("font_color") == Color.WHITE) - assert(flat_label.get_theme_constant("outline_size") == 0) - assert(flat_label.get_theme_color("font_outline_color").a == 0.0) - assert(flat_label.get_theme_color("font_shadow_color").a == 0.0) - - # Persistent remote labels obey both the authoritative home-space boundary - # and the avatar presentation mask. They return only when the avatar shares - # the local space and its world presentation is visible. - var spawn_service := main.get_node( - "%PlayerSpawnService" - ) as PlayerSpawnService - var registry := session.get("_registry") as PeerRegistry - const NAMEPLATE_TEST_PEER_ID: int = 9191 - assert(registry.add_peer( - NAMEPLATE_TEST_PEER_ID, - "nameplate-test-profile", - "remote stray", - NetworkProtocol.PROTOCOL_VERSION, - "", - "", - PackedStringArray(), - "trailblazer", - )) - var remote_transform: Transform3D = player.global_transform - remote_transform.origin += Vector3(20.0, 0.0, 0.0) - var remote_avatar := spawn_service.spawn_remote_player( - NAMEPLATE_TEST_PEER_ID, - remote_transform, - ) - assert(remote_avatar != null) - assert(session.set_peer_space(NAMEPLATE_TEST_PEER_ID, &"rv:privacy-test")) - remote_avatar.set_remote_presentation_visible(true) - chat_ui.call("_update_nameplates") - var remote_nameplate: Dictionary = nameplates.get( - NAMEPLATE_TEST_PEER_ID, {} - ) - var remote_plate := remote_nameplate.get("control") as Control - assert(remote_plate != null and not remote_plate.visible) - assert(session.set_peer_space( - NAMEPLATE_TEST_PEER_ID, - session.get_peer_space(session.get_local_peer_id()), - )) - remote_avatar.set_remote_presentation_visible(false) - chat_ui.call("_update_nameplates") - assert(not remote_plate.visible) - remote_avatar.set_remote_presentation_visible(true) - free_camera.look_at( - remote_avatar.get_nameplate_anchor_position(), Vector3.UP - ) - chat_ui.call("_update_nameplates") - assert(remote_plate.visible) - assert((remote_nameplate.get("name") as Label).text == "remote stray") - assert((remote_nameplate.get("title") as Label).text == "trailblazer") - chat_ui.call( - "_show_speech_bubble", - NAMEPLATE_TEST_PEER_ID, - "distant hello", - "", - ) - await process_frame - chat_ui.call("_update_speech") - var remote_speech_entries: Dictionary = chat_ui.get("_speech") - var remote_speech: Dictionary = remote_speech_entries.get( - NAMEPLATE_TEST_PEER_ID, - {}, - ) - var remote_speech_bubble := remote_speech.get("bubble") as PanelContainer - assert(remote_speech_bubble != null and remote_speech_bubble.visible) - assert(is_equal_approx( - remote_speech_bubble.scale.x, - ChatUI.speech_scale_for_distance( - remote_avatar.global_position.distance_to(player.global_position) - ), - )) - assert(remote_speech_bubble.scale.x < 1.0) - chat_ui.call("_on_peer_removed", NAMEPLATE_TEST_PEER_ID) - spawn_service.remove_peer(NAMEPLATE_TEST_PEER_ID) - registry.remove_peer(NAMEPLATE_TEST_PEER_ID) - chat_ui.call("_update_nameplates") - assert(not nameplates.has(NAMEPLATE_TEST_PEER_ID)) - free_camera.look_at(chat_anchor, Vector3.UP) - chat_ui.call("_update_nameplates") - assert(nameplate_control.visible) - var shop_prompt := game_ui.get_node("%ShopPrompt") as Control - var storage_prompt := game_ui.get_node("%StoragePrompt") as Control - game_ui.set_shop_prompt_visible(true, chat_anchor) - game_ui.set_storage_prompt_visible(true, chat_anchor) - assert(shop_prompt.visible) - assert(storage_prompt.visible) chat_ui.show_local_speech("hello there friend") await process_frame assert(bool(player.get("_speech_mouth_active"))) @@ -579,19 +414,11 @@ func _run() -> void: assert(not first_speech_mouth.is_empty()) assert(not second_speech_mouth.is_empty()) assert(first_speech_mouth != second_speech_mouth) - free_camera.look_at(chat_anchor, Vector3.UP) - chat_ui.call("_update_nameplates") chat_ui.call("_update_speech") var speech: Dictionary = chat_ui.get("_speech") var local_speech: Dictionary = speech.get(session.get_local_peer_id(), {}) var speech_bubble := local_speech.get("bubble") as PanelContainer assert(speech_bubble != null and speech_bubble.visible) - assert( - speech_bubble.position.y - + speech_bubble.size.y - + ChatUI.SPEECH_POINTER_HEIGHT - <= nameplate_control.position.y - ) normal_camera.global_transform = normal_camera_transform await create_timer(0.6).timeout assert(not bool(player.get("_speech_mouth_active"))) @@ -603,7 +430,6 @@ func _run() -> void: await process_frame assert(game_ui.is_gameplay_hud_hidden()) assert(chat_ui.is_hud_hidden()) - assert(not nameplate_layer.visible) assert(not ( game_ui.get_node("%GameplayTransientHUD") as Control ).visible) @@ -635,8 +461,6 @@ func _run() -> void: chat_ui.open_chat() await process_frame assert(chat_ui.is_open() and chat_panel.visible) - assert(not chat_ui.is_hud_hidden()) - assert(not nameplate_layer.visible) chat_ui.refocus_gameplay() assert(chat_ui.is_hud_hidden()) var cancel_button := InputEventJoypadButton.new() @@ -661,7 +485,6 @@ func _run() -> void: await process_frame assert(not game_ui.is_gameplay_hud_hidden()) assert(not chat_ui.is_hud_hidden()) - assert(nameplate_layer.visible) assert(not service.can_activate()) assert(not service.is_active() and not toolbar.visible) assert(player.bag.add_item(ArtShopStock.ART_KIT_ITEM_ID, 1)) diff --git a/tests/character_rig_validation.gd b/tests/character_rig_validation.gd index 95af5b7..c8fc57d 100644 --- a/tests/character_rig_validation.gd +++ b/tests/character_rig_validation.gd @@ -2,7 +2,7 @@ extends SceneTree const CHARACTER_SCENE: PackedScene = preload( - "res://art/exported/characters/base/straywild_base_character.glb" + "res://art/exported/characters/base/netfishing_base_character.glb" ) const EXPECTED_ANIMATIONS: Array[StringName] = [ @@ -112,9 +112,7 @@ func _validate_mesh_weights(mesh_instance: MeshInstance3D) -> int: var vertices: PackedVector3Array = arrays[Mesh.ARRAY_VERTEX] assert(not weights.is_empty()) assert(not vertices.is_empty()) - var components_per_vertex: int = int( - float(weights.size()) / float(vertices.size()) - ) + var components_per_vertex := weights.size() / vertices.size() assert(components_per_vertex == 4 or components_per_vertex == 8) for offset in range(0, weights.size(), components_per_vertex): var total := 0.0 diff --git a/tests/chat_privacy_multiplayer_validation.gd b/tests/chat_privacy_multiplayer_validation.gd index 75972b6..e1d6f87 100644 --- a/tests/chat_privacy_multiplayer_validation.gd +++ b/tests/chat_privacy_multiplayer_validation.gd @@ -4,8 +4,6 @@ const MainScene: PackedScene = preload("res://main/main.tscn") const TEST_PORT: int = 18152 const PREJOIN_MESSAGE: String = "private prejoin message" const LIVE_MESSAGE: String = "live message after join" -const HOST_ROLEPLAY: String = "/me grabs [b]his fishing rod[/b]" -const CLIENT_ROLEPLAY: String = "/me waves [color=red]hello[/color]" func _initialize() -> void: @@ -41,34 +39,11 @@ func _run_host() -> void: var chat_service := main.get_node( "%NetworkChatService" ) as NetworkChatService - assert(not chat_service.send_local_message("/me")) assert(chat_service.send_local_message(PREJOIN_MESSAGE)) var remote_peer_id: int = await _wait_for_remote_peer(session) assert(remote_peer_id > 1) await create_timer(1.0).timeout assert(chat_service.send_local_message(LIVE_MESSAGE)) - assert(chat_service.send_local_message(HOST_ROLEPLAY)) - var client_roleplay_deadline: int = Time.get_ticks_msec() + 8000 - while ( - Time.get_ticks_msec() < client_roleplay_deadline - and not _history_contains(chat_service, CLIENT_ROLEPLAY) - ): - await process_frame - assert(_history_contains(chat_service, CLIENT_ROLEPLAY)) - var client_roleplay: Dictionary = _history_message( - chat_service, CLIENT_ROLEPLAY - ) - assert(int(client_roleplay.get("sender_peer_id", 0)) == remote_peer_id) - assert( - str(client_roleplay.get("sender_display_name", "")) - == session.get_peer_record(remote_peer_id).display_name - ) - _assert_roleplay_rendered( - main, - str(client_roleplay["sender_display_name"]), - "waves [color=red]hello[/color]", - ) - _assert_no_world_speech(main, remote_peer_id) var disconnect_deadline: int = Time.get_ticks_msec() + 8000 while ( Time.get_ticks_msec() < disconnect_deadline @@ -100,39 +75,11 @@ func _run_client() -> void: var live_deadline: int = Time.get_ticks_msec() + 8000 while ( Time.get_ticks_msec() < live_deadline - and ( - not _history_contains(chat_service, LIVE_MESSAGE) - or not _history_contains(chat_service, HOST_ROLEPLAY) - ) + and not _history_contains(chat_service, LIVE_MESSAGE) ): await process_frame assert(_history_contains(chat_service, LIVE_MESSAGE)) - assert(_history_contains(chat_service, HOST_ROLEPLAY)) assert(not _history_contains(chat_service, PREJOIN_MESSAGE)) - var host_roleplay: Dictionary = _history_message( - chat_service, HOST_ROLEPLAY - ) - var host_peer_id: int = int(host_roleplay.get("sender_peer_id", 0)) - assert(host_peer_id > 0) - assert( - str(host_roleplay.get("sender_display_name", "")) - == session.get_peer_record(host_peer_id).display_name - ) - _assert_roleplay_rendered( - main, - str(host_roleplay["sender_display_name"]), - "grabs [b]his fishing rod[/b]", - ) - _assert_world_speech_body(main, host_peer_id, LIVE_MESSAGE) - assert(chat_service.send_local_message(CLIENT_ROLEPLAY)) - var confirmation_deadline: int = Time.get_ticks_msec() + 8000 - while ( - Time.get_ticks_msec() < confirmation_deadline - and not _history_contains(chat_service, CLIENT_ROLEPLAY) - ): - await process_frame - assert(_history_contains(chat_service, CLIENT_ROLEPLAY)) - _assert_no_world_speech(main, session.get_local_peer_id()) print("Chat privacy multiplayer client validation: PASS") await _session_cleanup(main, session) @@ -144,59 +91,6 @@ func _history_contains(service: NetworkChatService, body: String) -> bool: ) -func _history_message( - service: NetworkChatService, - body: String, -) -> Dictionary: - for message: Dictionary in service.get_history(): - if str(message.get("body", "")) == body: - return message - return {} - - -func _assert_roleplay_rendered( - main: Node, - display_name: String, - action: String, -) -> void: - var chat_ui := main.get_node("%GameUI").get_node("%ChatUI") as ChatUI - var history := chat_ui.get("_history") as RichTextLabel - assert(history != null) - var expected: String = "%s %s" % [display_name, action] - assert(history.get_parsed_text().contains(expected)) - assert(not history.get_parsed_text().contains( - "%s: /me" % display_name - )) - assert(not history.bbcode_enabled) - var italic_font := history.get_theme_font("italics_font") as FontVariation - assert(italic_font != null) - assert(not is_zero_approx(italic_font.variation_transform.y.x)) - - -func _assert_no_world_speech(main: Node, peer_id: int) -> void: - var chat_ui := main.get_node("%GameUI").get_node("%ChatUI") as ChatUI - var speech: Dictionary = chat_ui.get("_speech") - assert(not speech.has(peer_id)) - - -func _assert_world_speech_body( - main: Node, - peer_id: int, - expected_body: String, -) -> void: - var chat_ui := main.get_node("%GameUI").get_node("%ChatUI") as ChatUI - var speech: Dictionary = chat_ui.get("_speech") - assert(speech.has(peer_id)) - var state: Dictionary = speech[peer_id] - var bubble := state.get("bubble") as PanelContainer - assert(bubble != null) - for child: Node in bubble.get_children(): - if child is Label: - assert((child as Label).text == expected_body) - return - assert(false, "Speech bubble label is missing.") - - func _create_initialized_main() -> Node: root.size = Vector2i(1280, 720) var main: Node = MainScene.instantiate() diff --git a/tests/controller_mapping_validation.gd b/tests/controller_mapping_validation.gd index fcbf7e3..b93d475 100644 --- a/tests/controller_mapping_validation.gd +++ b/tests/controller_mapping_validation.gd @@ -14,22 +14,6 @@ func _init() -> void: func _run() -> void: - if ( - ControllerMappingManagerType.ROLE_LABELS[ - ControllerMappingManagerType.ROLE_CAMERA_ZOOM - ] != "zoom modifier (+RT)" - ): - push_error("controller zoom modifier label is misleading") - quit(1) - return - if ( - ControllerMappingManagerType.ROLE_LABELS[ - ControllerMappingManagerType.ROLE_RIGHT_STICK_Y - ] != "camera up / down (+RT to zoom)" - ): - push_error("controller vertical camera label omits the RT zoom chord") - quit(1) - return var manager := ControllerMappingManagerType.new() root.add_child(manager) await process_frame @@ -278,7 +262,7 @@ func _validate_manager(manager: ControllerMappingManagerType) -> String: func _validate_portmaster_launcher() -> String: - const launcher_path: String = "res://scripts/portmaster/straywild.sh" + const launcher_path: String = "res://scripts/portmaster/NETfishing.sh" if not FileAccess.file_exists(launcher_path): return "PortMaster launcher template is missing" var launcher: String = FileAccess.get_file_as_string(launcher_path) @@ -291,9 +275,9 @@ func _validate_portmaster_launcher() -> String: "guide:b8,start:b7,back:b6", "leftstick:b9", "rightstick:b12", - "straywild_controllerconfig=\"$GODOT_MUOS_MAPPING\"", - "GPTOKEYB_CONFIG=\"$GAMEDIR/straywild.gptk\"", - "$GPTOKEYB \"straywild.aarch64\" -c \"$GPTOKEYB_CONFIG\" &", + "netfishing_controllerconfig=\"$GODOT_MUOS_MAPPING\"", + "GPTOKEYB_CONFIG=\"$GAMEDIR/netfishing.gptk\"", + "$GPTOKEYB \"NETfishing.aarch64\" -c \"$GPTOKEYB_CONFIG\" &", "pm_platform_helper \"$GAME_EXECUTABLE\"", "\"$GAME_LAUNCHER\"", "\"$CONTROLLER_MAPPING_FILE\"", @@ -304,7 +288,7 @@ func _validate_portmaster_launcher() -> String: if "$'\\n'" in launcher: return "PortMaster launcher appends mappings across a Weston-unsafe newline" const game_launcher_path: String = ( - "res://scripts/portmaster/launch-straywild.sh" + "res://scripts/portmaster/launch-netfishing.sh" ) if not FileAccess.file_exists(game_launcher_path): return "PortMaster game launcher wrapper is missing" @@ -367,13 +351,13 @@ func _validate_auto_map(manager: ControllerMappingManagerType) -> String: if str(binding.get("kind", "")) == "button": var button := InputEventJoypadButton.new() button.device = manager.get_active_device_id() - button.button_index = int(binding.get("button", -1)) as JoyButton + button.button_index = int(binding.get("button", -1)) button.pressed = true manager.controller_input_observed.emit(button) else: var motion := InputEventJoypadMotion.new() motion.device = manager.get_active_device_id() - motion.axis = int(binding.get("axis", -1)) as JoyAxis + motion.axis = int(binding.get("axis", -1)) motion.axis_value = float(binding.get("direction", -1.0)) manager.controller_input_observed.emit(motion) if panel._auto_map_active: diff --git a/tests/controller_menu_accessibility_validation.gd b/tests/controller_menu_accessibility_validation.gd index a29e3ee..70d2095 100644 --- a/tests/controller_menu_accessibility_validation.gd +++ b/tests/controller_menu_accessibility_validation.gd @@ -122,38 +122,8 @@ func _validate_primary_menu_navigation() -> void: _expect( play_button.icon != null and play_button.icon.resource_path - == "res://ui/icons/new_menu/play.png" - and play_button.text.is_empty(), - "The Play action is not presented as the large square icon button.", - ) - _expect( - is_equal_approx(play_button.size.x, play_button.size.y), - "The Play action is not square.", - ) - var online_button := title.get_node("%JoinGameButton") as Button - var settings_button := title.get_node("%SettingsButton") as Button - var credits_button := title.get_node("%CreditsButton") as Button - var close_button := title.get_node("%QuitButton") as Button - for secondary_button: Button in [ - online_button, - settings_button, - credits_button, - close_button, - ]: - _expect( - is_equal_approx( - secondary_button.size.x, - secondary_button.size.y, - ), - "A secondary title action is not square.", - ) - _expect( - is_equal_approx( - close_button.position.y + close_button.size.y - - online_button.position.y, - play_button.size.y, - ), - "The secondary title-action stack does not match Play's height.", + == "res://ui/icons/main_menu/continue.png", + "The Play action does not use the original Continue icon.", ) _expect( not (title.get_node("%NewGameButton") as Control).visible @@ -161,45 +131,27 @@ func _validate_primary_menu_navigation() -> void: "Legacy New/Delete title bubbles are still visible.", ) _assert_neighbor( - play_button, - &"focus_neighbor_right", title.get_node("%JoinGameButton") as Control, + &"focus_neighbor_right", + play_button, ) _assert_neighbor( - title.get_node("%JoinGameButton") as Control, + title.get_node("%SettingsButton") as Control, &"focus_neighbor_left", play_button, ) _assert_neighbor( - title.get_node("%JoinGameButton") as Control, - &"focus_neighbor_bottom", - title.get_node("%SettingsButton") as Control, + title.get_node("%CreditsButton") as Control, + &"focus_neighbor_right", + play_button, ) _assert_neighbor( - title.get_node("%SettingsButton") as Control, - &"focus_neighbor_bottom", - title.get_node("%CreditsButton") as Control, - ) - _assert_neighbor( - title.get_node("%CreditsButton") as Control, - &"focus_neighbor_bottom", title.get_node("%QuitButton") as Control, + &"focus_neighbor_left", + play_button, ) for title_control: Control in title_controls: _assert_directionally_reachable(title_control, title_controls) - var version_row := title.get_node("%VersionRow") as Control - title.call("_on_continue_pressed") - await process_frame - _expect( - not version_row.visible, - "The title version remains visible behind the Save Slots panel.", - ) - title.call("_close_save_slots") - await process_frame - _expect( - version_row.visible, - "The title version was not restored after closing Save Slots.", - ) title.queue_free() await process_frame @@ -234,17 +186,7 @@ func _validate_save_slots_navigation() -> void: await create_timer(0.25).timeout var saves_tab := page.get_node("%SavesTab") as Button var new_tab := page.get_node("%NewSlotTab") as Button - var main_panel := page.get_node("%MainPanel") as PanelContainer var content_panel := page.get_node("%ContentPanel") as PanelContainer - var back_button := page.get_node("%BackButton") as Button - _expect( - main_panel.size.is_equal_approx(Vector2(880.0, 660.0)), - "Save Slots changed the fixed 880 by 660 outer panel size.", - ) - _expect( - main_panel.get_global_rect().encloses(back_button.get_global_rect()), - "The Save Slots Back button extends beyond the outer panel.", - ) var tab_overlap: float = ( saves_tab.get_global_rect().end.y - content_panel.get_global_rect().position.y @@ -281,40 +223,6 @@ func _validate_save_slots_navigation() -> void: var duplicate_slot := page.get_node("%DuplicateSlotButton") as Button var export_slot := page.get_node("%ExportSlotButton") as Button var delete_slot := page.get_node("%DeleteSlotButton") as Button - var slot_summary := page.get_node("%SlotSummary") as RichTextLabel - slot_summary.text = str(page.call("_format_slot_summary", { - "has_save": true, - "player_level": 100, - "catch_count": 9999, - "discovered_species_count": 999, - "wallet_balance": 999999, - "world_layout": &"generated", - "world_seed": 2147483647, - "last_played_at_unix": 1788282000, - })) - for _frame: int in 2: - await process_frame - var content_rect: Rect2 = content_panel.get_global_rect() - for control: Control in [ - import_button, - page.get_node("%SelectedSlotName") as Control, - slot_summary, - page.get_node("%OnlineSlotButton") as Control, - play_slot, - rename_slot, - duplicate_slot, - export_slot, - delete_slot, - ]: - _expect( - content_rect.encloses(control.get_global_rect()), - "Save-slot control %s extends beyond the content panel." - % control.name, - ) - _expect( - content_rect.end.y <= back_button.get_global_rect().position.y, - "Save-slot content overlaps the Back button.", - ) _expect( saves_tab.find_valid_focus_neighbor(SIDE_BOTTOM) == import_button, "An empty Save Slots page does not lead from its tab to Import Save.", @@ -1017,18 +925,6 @@ func _validate_profile_confirmation_focus() -> void: page.call("set_interactive", true) page.call("reset_controller_zone") var name_edit := page.get("_name_edit") as LineEdit - var customize := page.get("_customize_button") as Button - for _frame: int in 2: - await process_frame - _expect( - root.gui_get_focus_owner() == customize, - "Opening Profile activated the player-name field instead of its " - + "non-text customization action.", - ) - _expect( - not name_edit.has_focus(), - "Opening Profile activated the player-name field without user input.", - ) name_edit.grab_focus() page.call("_on_name_changed", "V") _expect( @@ -1300,12 +1196,12 @@ func _validate_profile_voice_navigation() -> void: kat_down != null and pitch_grid.is_ancestor_of(kat_down), "Down from the voice-set row does not enter the pitch row.", ) - if OS.has_environment("straywild_PROFILE_VOICE_CAPTURE"): + if OS.has_environment("NETFISHING_PROFILE_VOICE_CAPTURE"): await RenderingServer.frame_post_draw var capture := root.get_viewport().get_texture().get_image() _expect( capture.save_png(OS.get_environment( - "straywild_PROFILE_VOICE_CAPTURE" + "NETFISHING_PROFILE_VOICE_CAPTURE" )) == OK, "The profile voice-page capture could not be saved.", ) @@ -1425,24 +1321,6 @@ func _validate_player_menu_nested_controller_back() -> void: == LogbookPageType.ControllerZone.ENTRIES, "Global player-menu Back did not return Logbook to creature selection.", ) - logbook_page.call("_set_index_open", true, false) - logbook_page.set( - "_controller_zone", - LogbookPageType.ControllerZone.INDEX, - ) - _expect( - bool(menu.call("consume_escape")), - "Global player-menu Back did not consume the Logbook index zone.", - ) - _expect( - menu.visible and not bool(logbook_page.get("_index_open")), - "Global player-menu Back did not return from the Logbook index page.", - ) - _expect( - int(logbook_page.get("_controller_zone")) - == LogbookPageType.ControllerZone.TABS, - "Global player-menu Back did not return Logbook index focus to tabs.", - ) var net_page := menu.get("_the_net_page") as Control net_page.set("_active", true) @@ -2084,7 +1962,7 @@ func _assert_neighbor( % [ origin.name, property, - str(actual.name) if actual != null else "nothing", + actual.name if actual != null else "nothing", expected.name, ], ) diff --git a/tests/controller_ui_navigation_validation.gd b/tests/controller_ui_navigation_validation.gd index 2471617..e1169f9 100644 --- a/tests/controller_ui_navigation_validation.gd +++ b/tests/controller_ui_navigation_validation.gd @@ -266,32 +266,22 @@ func _validate_four_by_three_centering() -> void: func _validate_low_end_profile_contract() -> void: var launcher: String = FileAccess.get_file_as_string( - "res://scripts/portmaster/straywild.sh" + "res://scripts/portmaster/NETfishing.sh" ) - assert(launcher.contains("straywild_PERFORMANCE_PROFILE:-")) + assert(launcher.contains("NETFISHING_PERFORMANCE_PROFILE:-")) assert(launcher.contains("$CONFDIR/performance_profile")) assert(launcher.contains("normal)")) assert(launcher.contains("light|\"\")")) - assert(launcher.contains("straywild_PERFORMANCE_PROFILE=normal")) - assert(launcher.contains("straywild_PERFORMANCE_PROFILE=light")) - assert(launcher.contains("straywild_LOW_END=1")) + assert(launcher.contains("NETFISHING_PERFORMANCE_PROFILE=normal")) + assert(launcher.contains("NETFISHING_PERFORMANCE_PROFILE=light")) + assert(launcher.contains("NETFISHING_LOW_END=1")) assert(launcher.contains("--max-fps 30")) assert(launcher.contains("--audio-output-latency 40")) var builder: String = FileAccess.get_file_as_string( "res://scripts/build_portmaster.sh" ) assert(builder.contains("prepare_portmaster_assets.sh")) - assert(builder.contains("straywild-portmaster-export")) - assert(builder.contains('--export-release "PortMaster ARM64"')) - assert(builder.contains("PORTMASTER_FEATURE_MARKER")) - assert(builder.contains("Run a full PortMaster build before using --package-only.")) - var export_presets: String = FileAccess.get_file_as_string( - "res://export_presets.cfg" - ) - assert(export_presets.contains('name="PortMaster ARM64"')) - assert(export_presets.contains( - 'custom_features="straywild_portmaster"' - )) + assert(builder.contains("netfishing-portmaster-export")) var asset_profile: String = FileAccess.get_file_as_string( "res://scripts/prepare_portmaster_assets.sh" ) diff --git a/tests/controller_world_interaction_validation.gd b/tests/controller_world_interaction_validation.gd index bc102c5..d9e77a5 100644 --- a/tests/controller_world_interaction_validation.gd +++ b/tests/controller_world_interaction_validation.gd @@ -23,24 +23,13 @@ func _run() -> void: bool(main.get("_application_initialized")), "application initialization failed", ) - var save_manager := main.get("_save_manager") as PlayerSaveManager - var world_layout: StringName = WorldLayout.GENERATED - var world_seed: int = PlayerSaveManager.DEFAULT_WORLD_SEED - _expect( - bool(main.call("_apply_world", world_layout, world_seed, true)), - "generated-world preparation failed", - ) - _expect( - bool(main.call("_prepare_host_world", world_layout, world_seed)), - "host-world preparation failed", - ) _expect( bool(main.call("_prepare_private_host")), "private host preparation failed", ) + var save_manager := main.get("_save_manager") as PlayerSaveManager _expect( - save_manager != null - and save_manager.initialize_new_game(world_seed, world_layout), + save_manager != null and save_manager.initialize_new_game(), "new-game initialization failed", ) main.call("_enter_gameplay") @@ -49,16 +38,12 @@ func _run() -> void: var player := main.get("_player") as Player var interaction := main.get("_shop_interaction") as FishingShopInteraction - var decor_interaction := main.get( - "_decor_shop_interaction" - ) as DecorShopInteraction var game_ui := main.get("_game_ui") as GameUI var chat_service := main.get_node( "%NetworkChatService" ) as NetworkChatService _expect(player != null, "local player is unavailable") _expect(interaction != null, "shop interaction is unavailable") - _expect(decor_interaction != null, "decor interaction is unavailable") _expect(game_ui != null, "game UI is unavailable") _expect(chat_service != null, "network chat service is unavailable") if ( @@ -74,136 +59,6 @@ func _run() -> void: interaction.is_local_player_in_range(), "local player did not enter the shop interaction range", ) - var shop_prompt := game_ui.get_node("%ShopPrompt") as Control - var shop_message := game_ui.get_node("%ShopPromptMessage") as Label - _expect( - not bool(game_ui.get("_shop_npc_dialogue_active")) - and not shop_message.visible, - "shopkeeper spoke before the player initiated conversation", - ) - _expect( - shop_prompt.size == Vector2(30.0, 30.0), - "nearby shop prompt was not reduced to the compact interaction glyph", - ) - var fixed_area_transform := interaction.global_transform - var shopkeeper := interaction.get_node("../Shopkeeper") as WorldCharacterDisplay - var shopkeeper_start := shopkeeper.position - var camera_yaw := player.get_node("CameraYaw") as Node3D - var camera_pitch := player.get_node("CameraYaw/CameraPitch") as Node3D - var spring_arm := player.get_node( - "CameraYaw/CameraPitch/SpringArm3D" - ) as SpringArm3D - var initial_camera_yaw_transform := camera_yaw.transform - var initial_camera_pitch := camera_pitch.rotation - var initial_spring_length := spring_arm.spring_length - # Route planning treats the player as a live obstacle. Move the validation - # avatar clear before forcing an ambient patrol leg. - player.global_position = interaction.global_position + Vector3(20.0, 0.0, 0.0) - interaction.call("_refresh_local_player_proximity") - interaction.call("_choose_roaming_destination") - var roaming_destination: Vector3 = interaction.get( - "_roaming_destination" - ) - var safe_route: Dictionary = interaction.call( - "_resolve_safe_route_destination", - roaming_destination, - ) - _expect( - not safe_route.is_empty(), - "shopkeeper accepted a destination that failed its terrain route probe", - ) - var initial_route_offset := roaming_destination - shopkeeper.position - shopkeeper.rotation.y = ( - atan2(initial_route_offset.x, initial_route_offset.z) + PI - ) - interaction.call("_process", 0.05) - _expect( - shopkeeper.position.is_equal_approx(shopkeeper_start) - and not shopkeeper.is_locomotion_walking(), - "shopkeeper translated before finishing its turn-in-place", - ) - # A patrol leg deliberately starts by turning in place. Advance in small - # slices until the body is aligned and translation begins. - for _turn_frame: int in 20: - interaction.call("_process", 0.05) - if shopkeeper.position.distance_to(shopkeeper_start) > 0.001: - break - _expect( - interaction.global_transform.is_equal_approx(fixed_area_transform), - "ambient shopkeeper roaming moved the authoritative interaction area", - ) - _expect( - shopkeeper.position.distance_to(shopkeeper_start) > 0.001 - and shopkeeper.is_locomotion_walking(), - "shopkeeper did not walk toward an ambient roaming destination", - ) - var roaming_direction := ( - shopkeeper.position - shopkeeper_start - ).normalized() - var roaming_origin: Vector3 = interaction.get("_roaming_origin") - _expect( - roaming_destination.distance_to(shopkeeper_start) - >= interaction.minimum_route_distance - and roaming_destination.distance_to(shopkeeper_start) - <= interaction.maximum_route_distance + 0.001 - and roaming_destination.distance_to(roaming_origin) - <= interaction.roaming_radius + 0.001 - and shopkeeper.basis.z.normalized().dot(roaming_direction) > 0.95, - ( - "shopkeeper patrol leg was unsafe, too short, or did not face " - + "its travel direction" - ), - ) - - # Ambient visuals may roam well beyond their original compact trigger, but - # the trigger itself must remain fixed for multiplayer authority. Local UI - # eligibility follows the moving character, while the host validates a - # conservative authored-origin envelope that covers the full patrol. - var captured_roaming_origin: Vector3 = interaction.get( - "_roaming_origin" - ) - interaction.roaming_enabled = false - shopkeeper.position = captured_roaming_origin + Vector3(2.6, 0.0, 0.0) - interaction.setup_local_player(player) - _expect( - (interaction.get("_roaming_origin") as Vector3).is_equal_approx( - captured_roaming_origin - ), - "rebinding the player recaptured a wandered position as the patrol origin", - ) - player.global_position = shopkeeper.global_position + Vector3(1.4, 0.0, 0.0) - interaction.call("_refresh_local_player_proximity") - _expect( - interaction.is_local_player_in_range() - and interaction.is_avatar_in_range(player), - "moving-shopkeeper reach was not covered locally and authoritatively", - ) - player.global_position = interaction.call("_get_roaming_origin_global") - interaction.call("_refresh_local_player_proximity") - _expect( - not interaction.is_local_player_in_range() - and interaction.is_avatar_in_range(player), - "local proximity still followed the fixed authored Area3D", - ) - var authority_radius := interaction.get_authority_interaction_radius() - player.global_position = ( - interaction.call("_get_roaming_origin_global") - + Vector3(authority_radius + 0.1, 0.0, 0.0) - ) - _expect( - not interaction.is_avatar_in_range(player), - "shop authority accepted a player beyond the fixed patrol envelope", - ) - shopkeeper.position = shopkeeper_start - interaction.roaming_enabled = true - player.global_position = ( - shopkeeper.global_position + Vector3(0.0, 0.0, -1.0) - ) - interaction.call("_refresh_local_player_proximity") - _expect( - interaction.global_transform.is_equal_approx(fixed_area_transform), - "proximity validation moved the authoritative interaction area", - ) var character_calls: Array[String] = [] var capture_call := func( _peer_id: int, @@ -228,57 +83,12 @@ func _run() -> void: main.call("_unhandled_input", press) await process_frame _expect( - not game_ui.get_fishing_shop().visible - and main.get("_engaged_shop_npc_interaction") == interaction - and interaction.is_engaged(), - "first Y press did not enter shopkeeper dialogue without opening", - ) - _expect( - bool(game_ui.get("_shop_npc_dialogue_active")) - and shop_message.visible - and shop_message.text == FishingShopInteraction.DIALOGUE_TEXT, - "engaged shopkeeper dialogue was not presented", - ) - _expect( - not bool(player.call("_is_movement_input_enabled")) - and not bool(player.call("_is_camera_input_enabled")) - and player.is_shop_conversation_camera_active(), - "shopkeeper dialogue did not lock movement and hold its camera frame", + game_ui.get_fishing_shop().visible, + "Y did not open the shop while the player was in range", ) _expect( character_calls.is_empty(), - "Y played a character call instead of starting shopkeeper dialogue", - ) - await create_timer(0.5).timeout - var player_to_shopkeeper := ( - shopkeeper.global_position - player.global_position - ) - player_to_shopkeeper.y = 0.0 - player_to_shopkeeper = player_to_shopkeeper.normalized() - _expect( - camera_yaw.global_basis.x.normalized().dot(player_to_shopkeeper) - > 0.9 - and spring_arm.spring_length < initial_spring_length, - "conversation camera did not frame player-left and NPC-right", - ) - _expect( - shopkeeper.global_basis.z.normalized().dot( - (player.global_position - shopkeeper.global_position).normalized() - ) > 0.9 - and not shopkeeper.is_locomotion_walking(), - "engaged shopkeeper did not stop and face the player", - ) - main.call("_input", press) - await process_frame - _expect( - game_ui.get_fishing_shop().visible - and bool(main.get("_shop_conversation_shop_opened")), - "second Y press did not dismiss dialogue and open the shop", - ) - _expect( - main.get("_engaged_shop_npc_interaction") == interaction - and not bool(player.call("_is_camera_input_enabled")), - "shop opening released the conversation frame before close", + "Y played a character call instead of opening the shop", ) player.global_position = interaction.global_position + Vector3(20.0, 0.0, 0.0) for _frame: int in 6: @@ -287,12 +97,6 @@ func _run() -> void: if not game_ui.get_fishing_shop().visible: break await process_frame - for _frame: int in 40: - if not player.is_shop_conversation_camera_active(): - break - await process_frame - if player.is_shop_conversation_camera_active(): - await create_timer(0.55).timeout _expect( not interaction.is_local_player_in_range(), "local player did not leave the shop interaction range", @@ -301,219 +105,12 @@ func _run() -> void: not game_ui.get_fishing_shop().visible, "shop did not close after leaving its interaction range", ) - _expect( - main.get("_engaged_shop_npc_interaction") == null - and bool(player.call("_is_movement_input_enabled")) - and bool(player.call("_is_camera_input_enabled")), - ( - "shop close did not restore conversation controls and camera " - + "(engaged=%s movement=%s camera=%s restoring=%s)" - ) % [ - main.get("_engaged_shop_npc_interaction"), - player.call("_is_movement_input_enabled"), - player.call("_is_camera_input_enabled"), - main.get("_shop_conversation_camera_restoring"), - ], - ) - _expect( - camera_yaw.transform.is_equal_approx( - initial_camera_yaw_transform - ) - and camera_pitch.rotation.is_equal_approx(initial_camera_pitch) - and is_equal_approx(spring_arm.spring_length, initial_spring_length), - "conversation camera did not restore its exact pre-dialogue frame", - ) game_ui.call("_input", press) await process_frame _expect( character_calls.size() == 1, "Y did not play a character call away from an interaction", ) - - # Deliberately overlap two shop margins to validate the transition case. - # Whichever character the player is actually closest to must own both the - # dialogue/prompt and the interaction button, regardless of shop type. - if decor_interaction != null: - var fishing_root := interaction.get_parent() as Node3D - var decor_root := decor_interaction.get_parent() as Node3D - var original_decor_transform := decor_root.global_transform - interaction.roaming_enabled = false - decor_interaction.roaming_enabled = false - (interaction.get_node("../Shopkeeper") as Node3D).position = Vector3.ZERO - (decor_interaction.get_node("../Shopkeeper") as Node3D).position = Vector3.ZERO - decor_root.global_position = ( - fishing_root.global_position + Vector3(1.1, 0.0, 0.0) - ) - player.global_position = decor_root.global_position - for _frame: int in 6: - await physics_frame - _expect( - interaction.is_local_player_in_range() - and decor_interaction.is_local_player_in_range(), - "overlapping shop transition margins were not established", - ) - _expect( - main.call("_get_active_shop_npc_interaction") - == decor_interaction, - "nearest decor NPC did not own the overlapping interaction", - ) - _expect( - int(game_ui.get("_shop_npc_source_id")) - == decor_interaction.get_instance_id() - and shop_message.text - == DecorShopInteraction.DECOR_DIALOGUE_TEXT, - "decor dialogue did not follow the active NPC handoff", - ) - player.global_position = ( - fishing_root.global_position + Vector3(0.57, 0.0, 0.0) - ) - for _frame: int in 3: - await physics_frame - _expect( - main.call("_get_active_shop_npc_interaction") - == decor_interaction, - "shop handoff hysteresis did not stabilize a near-tie", - ) - player.global_position = ( - fishing_root.global_position + Vector3(0.45, 0.0, 0.0) - ) - for _frame: int in 3: - await physics_frame - _expect( - main.call("_get_active_shop_npc_interaction") - == interaction, - "shop ownership did not switch after a clear distance lead", - ) - _expect( - int(game_ui.get("_shop_npc_source_id")) - == interaction.get_instance_id() - and shop_message.text == FishingShopInteraction.DIALOGUE_TEXT, - "fishing dialogue did not replace the prior NPC cleanly", - ) - player.global_position = decor_root.global_position - for _frame: int in 3: - await physics_frame - game_ui.call("_input", press) - main.call("_unhandled_input", press) - await process_frame - _expect( - not game_ui.get_decor_shop().visible - and main.get("_engaged_shop_npc_interaction") - == decor_interaction, - "first Y did not engage the nearest decor NPC in an overlap", - ) - main.call("_input", press) - await process_frame - _expect( - game_ui.get_decor_shop().visible - and main.get("_engaged_shop_npc_interaction") - == decor_interaction, - "second Y did not open the engaged decor shop", - ) - _expect( - character_calls.size() == 1, - "Y emitted a character call instead of opening the decor shop", - ) - game_ui.get_decor_shop().close_shop() - for _frame: int in 40: - if not player.is_shop_conversation_camera_active(): - break - await process_frame - if player.is_shop_conversation_camera_active(): - await create_timer(0.55).timeout - player.global_position = fishing_root.global_position - for _frame: int in 6: - await physics_frame - _expect( - main.call("_get_active_shop_npc_interaction") - == interaction, - "shop ownership did not hand back to the nearer fishing NPC", - ) - decor_root.global_transform = original_decor_transform - - # Idle visuals can still begin a frame overlapped (for example after two - # independently planned routes converge). They must separate without - # moving either authoritative Area3D, deadlocking on their reservations, - # or waiting for one NPC to already be in the walking state. - var fishing_visual := interaction.get_node( - "../Shopkeeper" - ) as WorldCharacterDisplay - var decor_visual := decor_interaction.get_node( - "../Shopkeeper" - ) as WorldCharacterDisplay - var fishing_visual_transform := fishing_visual.global_transform - var decor_visual_transform := decor_visual.global_transform - var fishing_area_transform := interaction.global_transform - var decor_area_transform := decor_interaction.global_transform - player.global_position = fishing_visual.global_position + Vector3(20.0, 0.0, 0.0) - interaction.roaming_enabled = true - decor_interaction.roaming_enabled = true - interaction.call("_schedule_idle") - decor_interaction.call("_schedule_idle") - var crossing_center := fishing_visual.global_position - decor_visual.global_position = ( - crossing_center + Vector3(1.0, 0.0, -1.0) - ) - decor_interaction.set( - "_roaming_destination", - decor_visual.get_parent_node_3d().to_local( - crossing_center + Vector3(1.0, 0.0, 1.0) - ), - ) - decor_interaction.set("_roaming_walking", true) - _expect( - bool(interaction.call( - "_route_conflicts_with_reserved_corridors", - crossing_center, - crossing_center + Vector3(2.0, 0.0, 0.0), - )), - "crossing shopkeeper route corridors were not reserved", - ) - decor_interaction.call("_schedule_idle") - var fishing_priority: String = interaction.call( - "_traffic_priority_key" - ) - var decor_priority: String = decor_interaction.call( - "_traffic_priority_key" - ) - var blocked_outward_direction := ( - Vector3.RIGHT - if fishing_priority < decor_priority - else Vector3.LEFT - ) - fishing_visual.global_position = ( - interaction.call("_get_roaming_origin_global") - + blocked_outward_direction * interaction.roaming_radius - ) - decor_visual.global_position = fishing_visual.global_position - var overlapped_position := fishing_visual.global_position - for _separation_frame: int in 80: - interaction.call("_process", 0.05) - decor_interaction.call("_process", 0.05) - var separation := fishing_visual.global_position - decor_visual.global_position - separation.y = 0.0 - if separation.length() >= interaction.other_shopkeeper_clearance: - break - var resolved_separation := ( - fishing_visual.global_position - decor_visual.global_position - ) - resolved_separation.y = 0.0 - _expect( - resolved_separation.length() - >= interaction.other_shopkeeper_clearance - 0.02 - and fishing_visual.global_position.distance_to(overlapped_position) - > 0.1, - "idle-overlapped shopkeepers did not separate and resume safely", - ) - _expect( - interaction.global_transform.is_equal_approx(fishing_area_transform) - and decor_interaction.global_transform.is_equal_approx( - decor_area_transform - ), - "live shopkeeper separation moved an authoritative Area3D", - ) - fishing_visual.global_transform = fishing_visual_transform - decor_visual.global_transform = decor_visual_transform chat_service.character_call_received.disconnect(capture_call) var session := main.get_node("%NetworkSession") as NetworkSession diff --git a/tests/dedicated_server_config_validation.gd b/tests/dedicated_server_config_validation.gd index e2b99ed..02a881d 100644 --- a/tests/dedicated_server_config_validation.gd +++ b/tests/dedicated_server_config_validation.gd @@ -15,22 +15,16 @@ func _initialize() -> void: func _run() -> void: var defaults := ConfigType.new() - defaults.set("data_directory", "/tmp/straywild-server") + defaults.set("data_directory", "/tmp/netfishing-server") defaults.call("_validate") assert(defaults.is_valid()) assert(not bool(defaults.get("public_listing"))) assert(not bool(defaults.get("chat_logging"))) assert(str(defaults.get("chat_log_path")).is_empty()) - var chat_burst_count: int = NetworkChatService.BURST_COUNT - var chat_window_count: int = NetworkChatService.WINDOW_COUNT - var chat_window_seconds: float = NetworkChatService.WINDOW_SECONDS - var chat_call_cooldown_milliseconds: int = ( - NetworkChatService.CALL_COOLDOWN_MILLISECONDS - ) - assert(chat_burst_count == 3) - assert(chat_window_count == 5) - assert(is_equal_approx(chat_window_seconds, 10.0)) - assert(chat_call_cooldown_milliseconds == 90) + assert(NetworkChatService.BURST_COUNT == 3) + assert(NetworkChatService.WINDOW_COUNT == 5) + assert(is_equal_approx(NetworkChatService.WINDOW_SECONDS, 10.0)) + assert(NetworkChatService.CALL_COOLDOWN_MILLISECONDS == 90) var path: String = ProjectSettings.globalize_path( "user://dedicated-server-validation.cfg" @@ -43,7 +37,7 @@ func _run() -> void: file.set_value("world", "seed", 928374) file.set_value("server", "public", true) file.set_value("server", "data_directory", "/tmp/configured-server") - file.set_value("discovery", "url", "https://discovery.straywild.io/") + file.set_value("discovery", "url", "https://discovery.netfishing.org/") file.set_value("privacy", "chat_logging", true) file.set_value( "privacy", @@ -65,7 +59,7 @@ func _run() -> void: assert(int(configured.get("max_players")) == 12) assert(int(configured.get("world_seed")) == 928374) assert(bool(configured.get("public_listing"))) - assert(str(configured.get("discovery_url")) == "https://discovery.straywild.io") + assert(str(configured.get("discovery_url")) == "https://discovery.netfishing.org") assert(bool(configured.get("chat_logging"))) assert( str(configured.get("chat_log_path")) @@ -162,55 +156,29 @@ func _run() -> void: str(discovery.call("_default_room_name", "River")) == "River's Server" ) - var upnp_renew_interval_seconds: float = ( + assert( DiscoveryClient.UPNP_RENEW_INTERVAL_SECONDS + < float(DiscoveryClient.UPNP_MAPPING_DURATION_SECONDS) ) - var upnp_mapping_duration_seconds: float = float( - DiscoveryClient.UPNP_MAPPING_DURATION_SECONDS - ) - var upnp_retry_interval_seconds: float = ( + assert( DiscoveryClient.UPNP_RETRY_INTERVAL_SECONDS + < DiscoveryClient.UPNP_RENEW_INTERVAL_SECONDS ) - assert(upnp_renew_interval_seconds < upnp_mapping_duration_seconds) - assert(upnp_retry_interval_seconds < upnp_renew_interval_seconds) var discovery_settings_path: String = ProjectSettings.globalize_path( DiscoveryClient.SETTINGS_PATH ) assert(not FileAccess.file_exists(discovery_settings_path)) assert(discovery.set_room_name("Client Room")) - assert( - discovery.get_host_discovery_mode() - == DiscoveryClient.HOST_DISCOVERY_PRIVATE - ) - assert(discovery.set_host_connection_mode( - DiscoveryClient.HOST_CONNECTION_RELAY - )) - assert( - discovery.get_host_connection_mode() - == DiscoveryClient.HOST_CONNECTION_RELAY - ) - assert( - discovery.get_host_discovery_mode() - == DiscoveryClient.HOST_DISCOVERY_PRIVATE - ) var client_settings: PackedByteArray = FileAccess.get_file_as_bytes( discovery_settings_path ) assert(not client_settings.is_empty()) var dedicated_discovery := DiscoveryClient.new() dedicated_discovery.call("_load_settings") - dedicated_discovery.set( - "_host_connection_preference", - DiscoveryClient.HOST_CONNECTION_RELAY, - ) assert( dedicated_discovery.configure_dedicated_runtime("Headless Room") ) assert(dedicated_discovery.get_room_name() == "Headless Room") - assert( - dedicated_discovery.get_host_connection_mode() - == DiscoveryClient.HOST_CONNECTION_DIRECT - ) assert( FileAccess.get_file_as_bytes(discovery_settings_path) == client_settings @@ -233,26 +201,16 @@ func _run() -> void: var listed_room := { "room_id": "empty-dedicated-room", "room_name": "Empty Dedicated Room", + "address": "203.0.113.10", + "port": 7777, "current_players": 0, "max_players": 8, "game_version": str(ProjectSettings.get_setting( "application/config/version", "unknown" )), "protocol_version": NetworkProtocol.PROTOCOL_VERSION, - "connection_mode": "direct", - "ip_privacy": "peer_visible", - "host_kind": "dedicated", } assert(bool(discovery.call("_valid_public_room", listed_room))) - assert(not listed_room.has("address")) - assert(not listed_room.has("port")) - var relayed_room: Dictionary = listed_room.duplicate(true) - relayed_room["connection_mode"] = "relay" - relayed_room["ip_privacy"] = "relayed" - assert(not bool(discovery.call("_valid_public_room", relayed_room))) - var player_relayed_room: Dictionary = relayed_room.duplicate(true) - player_relayed_room["host_kind"] = "player" - assert(bool(discovery.call("_valid_public_room", player_relayed_room))) var incompatible_room: Dictionary = listed_room.duplicate(true) incompatible_room["game_version"] = "0.0.0-alpha" assert(not bool(discovery.call("_valid_public_room", incompatible_room))) diff --git a/tests/digging_prototype_validation.gd b/tests/digging_prototype_validation.gd index 95917a0..c19bf0b 100644 --- a/tests/digging_prototype_validation.gd +++ b/tests/digging_prototype_validation.gd @@ -11,15 +11,6 @@ const Gatherables: GatherableCatalog = preload( "res://gathering/catalog/gatherable_catalog.tres" ) -class PrimaryTerrainProvider: - extends Node3D - - var primary_meshes: Array[MeshInstance3D] = [] - - - func get_primary_terrain_meshes() -> Array[MeshInstance3D]: - return primary_meshes - func _initialize() -> void: call_deferred("_run") @@ -29,7 +20,6 @@ func _run() -> void: _validate_catalog_content() _validate_flat_shovel() await _validate_beach_authoring() - _validate_primary_terrain_provider() print("Digging prototype validation: PASS") quit() @@ -91,66 +81,6 @@ func _validate_beach_authoring() -> void: region.queue_free() -func _validate_primary_terrain_provider() -> void: - var fixture := Node3D.new() - fixture.name = "PrimaryTerrainFixture" - root.add_child(fixture) - var provider := PrimaryTerrainProvider.new() - provider.name = "Provider" - fixture.add_child(provider) - var clear_sand := _flat_surface_triangle(0.0, 0.0, &"sand") - var covered_sand := _flat_surface_triangle(10.0, 0.0, &"sand") - var covering_grass := _flat_surface_triangle(10.0, 0.01, &"grass_lite") - for mesh_instance: MeshInstance3D in [ - clear_sand, - covered_sand, - covering_grass, - ]: - provider.add_child(mesh_instance) - provider.primary_meshes.append(mesh_instance) - var buried_base := _flat_surface_triangle(20.0, 0.0, &"sand") - buried_base.name = "BuriedSandBase" - provider.add_child(buried_base) - var area := DiggableArea3D.new() - area.name = "DiggableArea" - area.area_id = &"provider_test" - area.terrain_source = NodePath("../Provider") - area.surface_materials = [&"sand"] - area.generation_bounds = Rect2(-20.0, -20.0, 40.0, 40.0) - fixture.add_child(area) - var triangles := area.get_surface_triangles() - assert(triangles.size() == 2) - var clear_center := Vector3(1.0 / 3.0, 0.0, 1.0 / 3.0) - var covered_center := Vector3(10.0 + 1.0 / 3.0, 0.0, 1.0 / 3.0) - assert(area.is_surface_point_valid(clear_center)) - assert(not area.is_surface_point_valid(covered_center)) - fixture.free() - - -func _flat_surface_triangle( - x_offset: float, - height: float, - material_name: StringName, -) -> MeshInstance3D: - var arrays: Array = [] - arrays.resize(Mesh.ARRAY_MAX) - arrays[Mesh.ARRAY_VERTEX] = PackedVector3Array([ - Vector3(x_offset, height, 0.0), - Vector3(x_offset, height, 1.0), - Vector3(x_offset + 1.0, height, 0.0), - ]) - arrays[Mesh.ARRAY_INDEX] = PackedInt32Array([0, 1, 2]) - var mesh := ArrayMesh.new() - mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays) - var material := StandardMaterial3D.new() - material.resource_name = str(material_name) - mesh.surface_set_material(0, material) - var mesh_instance := MeshInstance3D.new() - mesh_instance.name = "Primary%s" % str(material_name).capitalize() - mesh_instance.mesh = mesh - return mesh_instance - - func _collect_meshes( root_node: Node, result: Array[MeshInstance3D], diff --git a/tests/discovery_privacy_validation.gd b/tests/discovery_privacy_validation.gd deleted file mode 100644 index 47e7e6c..0000000 --- a/tests/discovery_privacy_validation.gd +++ /dev/null @@ -1,98 +0,0 @@ -extends SceneTree - -const FINGERPRINT: String = ( - "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" -) -const JoinGamePageScene: PackedScene = preload( - "res://ui/network/join_game_page.tscn" -) - - -func _initialize() -> void: - call_deferred("_run") - - -func _run() -> void: - var endpoint := EndpointParser.parse("203.0.113.20:49152") - assert(endpoint.is_valid()) - var direct_route := ConnectionRoute.direct(endpoint) - assert(direct_route.is_valid()) - assert("203.0.113.20" not in direct_route.display_description) - var route := ConnectionRoute.discovery_direct( - endpoint, - "opaque-room-id", - "Pond Friends", - ) - assert(route.is_valid()) - assert(route.is_discovery_join()) - assert(route.display_description == "Pond Friends") - assert("203.0.113.20" not in route.display_description) - var relay_route := ConnectionRoute.discovery_relay( - endpoint, - "opaque-room-id", - "Pond Friends", - ) - assert(relay_route.is_valid()) - assert(relay_route.is_discovery_join()) - assert(relay_route.is_relay()) - assert("203.0.113.20" not in relay_route.display_description) - - var join_page := JoinGamePageScene.instantiate() as JoinGamePage - root.add_child(join_page) - assert((join_page.get_node("%Address") as LineEdit).secret) - assert(str(join_page.call("_display_endpoint", "203.0.113.20:49152")) == "*****") - join_page.set("_addresses_visible", true) - join_page.call("_refresh_address_privacy_controls") - assert(not (join_page.get_node("%Address") as LineEdit).secret) - assert( - str(join_page.call("_display_endpoint", "203.0.113.20:49152")) - == "203.0.113.20:49152" - ) - var saved_entry := SavedServerEntry.new() - saved_entry.kind = SavedServerEntry.Kind.SAVED - saved_entry.display_name = "203.0.113.20" - saved_entry.host = "203.0.113.20" - saved_entry.normalized_host = "203.0.113.20" - saved_entry.normalized_endpoint = "203.0.113.20:49152" - join_page.set("_addresses_visible", false) - assert(str(join_page.call("_display_entry_name", saved_entry)) == "saved server") - join_page.set("_addresses_visible", true) - assert(str(join_page.call("_display_entry_name", saved_entry)) == "203.0.113.20") - - var data_root := PlayerDataRoot.new() - root.add_child(data_root) - var portable_path := ProjectSettings.globalize_path( - "user://discovery-privacy-validation" - ) - var created := data_root.create_unbound_root(portable_path) - assert(bool(created.get("ok", false))) - assert(data_root.activate_process_root(portable_path)) - - var store := ServerTrustStore.new() - root.add_child(store) - var trust_path := data_root.path_for(&"server_trust") - store.configure_storage(trust_path, data_root) - assert(store.verify_identity(FINGERPRINT) == ServerTrustStore.Verification.FIRST_SEEN) - assert(store.trust_identity(FINGERPRINT, "Pond Friends")) - assert(store.verify_identity(FINGERPRINT) == ServerTrustStore.Verification.MATCH) - var saved_text := FileAccess.get_file_as_string(trust_path) - assert("203.0.113.20" not in saved_text) - assert("normalized_endpoint" not in saved_text) - assert("normalized_host" not in saved_text) - assert("\"port\"" not in saved_text) - - var reloaded := ServerTrustStore.new() - root.add_child(reloaded) - reloaded.configure_storage(trust_path, data_root) - assert( - reloaded.verify_identity(FINGERPRINT) - == ServerTrustStore.Verification.MATCH - ) - var record := reloaded.get_identity_record(FINGERPRINT) - assert(record.get("route_kind") == "discovery") - assert(not record.has("normalized_endpoint")) - assert(not record.has("normalized_host")) - assert(not record.has("port")) - - print("Discovery privacy validation: PASS") - quit() diff --git a/tests/discovery_privacy_validation.gd.uid b/tests/discovery_privacy_validation.gd.uid deleted file mode 100644 index 3ac3f8d..0000000 --- a/tests/discovery_privacy_validation.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dmtlh1kpm7bl1 diff --git a/tests/economy_regression_validation.gd b/tests/economy_regression_validation.gd index 7cb9666..523dbb3 100644 --- a/tests/economy_regression_validation.gd +++ b/tests/economy_regression_validation.gd @@ -31,14 +31,9 @@ func _run() -> void: for _frame: int in 8: await process_frame assert(bool(main.get("_application_initialized"))) - var session := main.get_node("%NetworkSession") as NetworkSession - assert(bool(main.call( - "_apply_world", WorldLayout.STARTER_ISLAND, 1, true - ))) - assert(session.set_host_world(WorldLayout.STARTER_ISLAND, 1)) assert(bool(main.call("_prepare_private_host"))) var save_manager := main.get("_save_manager") as PlayerSaveManager - assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND)) + assert(save_manager.initialize_new_game()) main.call("_enter_gameplay") for _frame: int in 8: await process_frame @@ -47,13 +42,14 @@ func _run() -> void: var catalog := main.get("fish_catalog") as FishPool var sale_service := main.get_node("%NetworkSaleService") as NetworkSaleService var shop_service := main.get_node("%NetworkShopService") as NetworkShopService + var session := main.get_node("%NetworkSession") as NetworkSession var reservations := ( main.get_node("%PlayerAssetReservationService") as PlayerAssetReservationService ) assert(player != null) assert(catalog != null and catalog.candidates.size() == 316) - assert(LogbookCatalog.ordered_species(catalog.candidates).size() == 314) + assert(LogbookCatalog.ordered_species(catalog.candidates).size() == 63) assert(sale_service != null) assert(shop_service != null) assert(session != null and session.is_host()) @@ -76,13 +72,13 @@ func _run() -> void: assert(session.set_host_open(false)) await _test_host_shop_purchase(main, player, shop_service) - _test_host_rod_purchase(player, shop_service) + await _test_host_rod_purchase(player, shop_service) await _test_host_art_shop_purchase(main, player, shop_service) await _test_fishing_shop_sale_ui( main, player, catalog, sale_service, reservations ) _test_host_backpack_purchase(player, shop_service) - await _test_host_home_upgrade(main, player, shop_service) + _test_host_storage_purchase(player, shop_service) assert(not sale_service.is_local_sale_pending()) assert(not shop_service.is_local_purchase_pending()) @@ -175,6 +171,7 @@ func _run_multiplayer_client() -> void: assert(player.inventory_layout.restore_backpack_level( PlayerInventoryLayout.MAX_BACKPACK_LEVEL )) + assert(player.cooler_capacity.restore_level(PlayerCoolerCapacity.MAX_LEVEL)) player.inventory.set_inventory_layout(null) var catch_ids: Array[StringName] = [] for fish: FishData in catalog.candidates: @@ -183,9 +180,6 @@ func _run_multiplayer_client() -> void: var fish_catch := _make_catch(fish) assert(player.inventory.add_catch(fish_catch)) catch_ids.append(fish_catch.catch_id) - if catch_ids.size() == NetworkSaleProtocol.MAX_CATCHES_PER_REQUEST: - break - assert(catch_ids.size() == NetworkSaleProtocol.MAX_CATCHES_PER_REQUEST) player.inventory.set_inventory_layout(player.inventory_layout) await create_timer(1.0).timeout _sale_result.clear() @@ -201,6 +195,7 @@ func _run_multiplayer_client() -> void: assert(not player.inventory.contains_catch_id(catch_id)) assert(not sale_service.is_local_sale_pending()) assert(player.inventory_layout.restore_backpack_level(0)) + assert(player.cooler_capacity.restore_level(0)) var interaction := main.get("_shop_interaction") as FishingShopInteraction player.global_position = interaction.global_position @@ -556,58 +551,30 @@ func _test_host_backpack_purchase( for expected_capacity: int in [18, 27, 36]: _shop_result.clear() assert(not shop_service.request_backpack_capacity_upgrade().is_empty()) - assert( - not _shop_result.is_empty() and bool(_shop_result[1]), - "Backpack purchase failed: %s" % [_shop_result], - ) + assert(not _shop_result.is_empty() and bool(_shop_result[1])) assert(layout.get_inventory_capacity() == expected_capacity) assert(player.wallet.get_balance() == balance_before - total_cost) assert(layout.get_next_backpack_cost() == -1) -func _test_host_home_upgrade( - main: Node, +func _test_host_storage_purchase( player: Player, shop_service: NetworkShopService, ) -> void: - var interaction := main.get( - "_rv_upgrade_shop_interaction" - ) as RVUpgradeInteraction - var home_state := main.get("_home_state") as PlayerHomeState var capacity := player.cooler_capacity - assert(interaction != null and home_state != null) - player.global_position = interaction.global_position - for _frame: int in 4: - await physics_frame - assert(interaction.is_avatar_in_range(player)) - assert(home_state.get_tier() == PlayerHomeState.STARTER_TIER) - assert( - interaction.get_dialogue_text(home_state.get_tier()) - == RVUpgradeInteraction.TENT_DIALOGUE_TEXT - ) assert(capacity.get_capacity() == 9) - var upgrade_cost: int = home_state.get_next_upgrade_cost() - assert(upgrade_cost == PlayerHomeState.HOME_UPGRADE_COSTS.front()) - assert(upgrade_cost == 50) - if player.wallet.get_balance() < upgrade_cost: - assert(player.wallet.credit( - upgrade_cost - player.wallet.get_balance() - )) + var total_cost: int = 0 + for cost: int in PlayerCoolerCapacity.EXPANSION_COSTS: + total_cost += cost + if player.wallet.get_balance() < total_cost: + assert(player.wallet.credit(total_cost - player.wallet.get_balance())) var balance_before := player.wallet.get_balance() - _shop_result.clear() - assert(not shop_service.request_home_upgrade().is_empty()) - assert( - not _shop_result.is_empty() and bool(_shop_result[1]), - "Home purchase failed: %s" % [_shop_result], - ) - assert(home_state.get_tier() == PlayerHomeState.STARTER_RV_TIER) - assert( - interaction.get_dialogue_text(home_state.get_tier()) - == RVUpgradeInteraction.RV_DIALOGUE_TEXT - ) - assert(capacity.get_capacity() == 18) - assert(player.wallet.get_balance() == balance_before - upgrade_cost) - assert(home_state.get_next_upgrade_cost() == -1) + for expected_capacity: int in [18, 27, 36, 45, 54, 63, 72]: + _shop_result.clear() + assert(not shop_service.request_cooler_capacity_upgrade().is_empty()) + assert(not _shop_result.is_empty() and bool(_shop_result[1])) + assert(capacity.get_capacity() == expected_capacity) + assert(player.wallet.get_balance() == balance_before - total_cost) assert(capacity.get_next_cost() == -1) @@ -622,6 +589,7 @@ func _test_fishing_shop_sale_ui( var game_ui := main.get_node("%GameUI") as GameUI var shop := game_ui.get_node("%FishingShop") as FishingShop var player_menu := game_ui.get_node("%PlayerMenu") as PlayerMenu + var shop_backdrop := main.get_node("%ShopBackdrop") as ColorRect var ui_viewport := main.get_node( "UIPresentation/UIViewport" ) as SubViewport @@ -629,6 +597,7 @@ func _test_fishing_shop_sale_ui( interaction != null and shop != null and player_menu != null + and shop_backdrop != null and ui_viewport != null ) var item_catalog := main.get("item_catalog") as ItemCatalog @@ -699,7 +668,8 @@ func _test_fishing_shop_sale_ui( assert(shop.open_shop()) for _frame: int in 2: await process_frame - assert(main.get_node_or_null("%ShopBackdrop") == null) + assert(shop_backdrop.visible) + assert(shop_backdrop.material is ShaderMaterial) assert(shop.has_node("InputBlocker") and not shop.has_node("Dimmer")) var shop_panel := shop.get_node("%ShopPanel") as PanelContainer assert(shop_panel != null and shop_panel.size == Vector2(980.0, 600.0)) @@ -998,21 +968,12 @@ func _test_fishing_shop_sale_ui( reserved_catch.catch_id, ) assert(staged.is_empty()) - var sell_button := sell_inventory.get("_sell_button") as Button - var all_button := sell_inventory.get("_all_button") as Button - assert(sell_button != null and sell_button.text == "sell") - assert(all_button != null and all_button.text == "all") - assert(sell_button.get_parent() == all_button.get_parent()) - assert( - sell_button.size_flags_horizontal == Control.SIZE_EXPAND_FILL - and all_button.size_flags_horizontal == Control.SIZE_EXPAND_FILL + sell_inventory.call( + "_stage", + PlayerInventoryLayout.EntryKind.CATCH, + fish_catch.catch_id, ) - sell_inventory.call("_stage_all_eligible") assert(staged.has(PlayerInventoryLayout.catch_key(fish_catch.catch_id))) - assert(not staged.has( - PlayerInventoryLayout.catch_key(reserved_catch.catch_id) - )) - assert(all_button.disabled) assert((sell_inventory.get("_feedback") as Label).text.is_empty()) var source_grid := sell_inventory.get("_inventory_grid") as GeneralInventoryGrid var staged_source_found := false @@ -1021,19 +982,17 @@ func _test_fishing_shop_sale_ui( staged_source_found = bool(source_slot.get("_staged")) break assert(staged_source_found) - var expected_all_payout := int(sell_inventory.call("_calculate_total")) - assert(expected_all_payout >= fish_catch.sale_value) var feedback := sell_inventory.get("_feedback") as Label var total_label := sell_inventory.get("_total_label") as Label - var sale_buttons := sell_button.get_parent() as HBoxContainer + var sell_button := sell_inventory.get("_sell_button") as Button assert(feedback.get_index() < total_label.get_parent().get_index()) - assert(total_label.get_parent().get_index() < sale_buttons.get_index()) + assert(total_label.get_parent().get_index() < sell_button.get_index()) _sale_result.clear() sell_inventory.call("_submit_sale") await process_frame assert(not _sale_result.is_empty() and bool(_sale_result[1])) assert(not player.inventory.contains_catch_id(fish_catch.catch_id)) - assert(player.wallet.get_balance() == balance_before + expected_all_payout) + assert(player.wallet.get_balance() == balance_before + fish_catch.sale_value) assert(not sale_service.is_local_sale_pending()) assert(reservations.release(reservation_id)) await _activate_pointer_control(shop_tabs[0] as Button, ui_viewport) diff --git a/tests/file_dialog_controller_navigation_validation.gd b/tests/file_dialog_controller_navigation_validation.gd index 03b4e6a..7ac8df9 100644 --- a/tests/file_dialog_controller_navigation_validation.gd +++ b/tests/file_dialog_controller_navigation_validation.gd @@ -34,20 +34,20 @@ func _run() -> void: var root_controls: Array[Control] = ( FileDialogControllerNavigationType.interactive_controls(root_scope) ) - var directory_list: ItemList = null - var parent_button: Button = null - var create_folder_button: Button = null - var path_edit: LineEdit = null - var drive_button: MenuButton = null - var refresh_button: Button = null - var favorite_button: Button = null - var hidden_button: Button = null - var grid_button: Button = null - var list_button: Button = null - var filter_button: Button = null - var sort_button: MenuButton = null - var cancel_button: Button = null - var select_button: Button = null + var directory_list: ItemList + var parent_button: Button + var create_folder_button: Button + var path_edit: LineEdit + var drive_button: MenuButton + var refresh_button: Button + var favorite_button: Button + var hidden_button: Button + var grid_button: Button + var list_button: Button + var filter_button: Button + var sort_button: MenuButton + var cancel_button: Button + var select_button: Button for control: Control in root_controls: if ( control is ItemList diff --git a/tests/fish_catalog_content_validation.gd b/tests/fish_catalog_content_validation.gd index 2c635c6..fb5f9e4 100644 --- a/tests/fish_catalog_content_validation.gd +++ b/tests/fish_catalog_content_validation.gd @@ -37,26 +37,6 @@ const PelicanBuyer = preload("res://economy/buyers/pelicans.tres") const StarterRegionScene = preload( "res://world/regions/starter_island_region.tscn" ) -const SharedFishPlaceholder: Texture2D = preload( - "res://art/exported/creatures/fish_placeholder.png" -) -const FINAL_CREATURE_CATALOG_NUMBERS: Array[int] = [ - 101, 102, 103, 104, 105, 106, 107, 201, 403, 701, 704, 801, - 802, 805, 806, 808, 2502, 2504, 2505, 2508, 2601, 2801, 2802, - 2803, 2804, 2806, 2807, 3002, 3102, 3103, 3104, 3107, 3201, - 3401, 3902, 3906, 4101, 4401, 4701, 5001, 5702, 5901, 5902, - 5903, 5904, 6001, 6103, 6406, 6601, 6801, 6804, 6807, 6901, - 6902, 6904, 6905, 7101, 7403, 7506, 7508, -] - -const ACTIVE_CATALOG_COUNT: int = 314 -const INACTIVE_CATALOG_COUNT: int = 2 -const FISHING_SPECIES_COUNT: int = 310 -const GENERATED_POND_COUNT: int = 33 -const GENERATED_LAKE_COUNT: int = 20 -const GENERATED_RIVER_COUNT: int = 53 -const STARTER_POND_COUNT: int = 106 -const OCEAN_COUNT: int = 204 const ORIGINAL_IDS: Array[StringName] = [ &"bluegill", &"bass", &"carp", &"sunfish", @@ -102,6 +82,23 @@ const NEW_FRESH_WATER_IDS: Array[StringName] = [ &"bowfin", &"sturgeon_lake", &"gar_longnose", &"paddlefish", &"sturgeon_shovelnose", &"gar_spotted", &"lungfish_west_african", ] +const GENERATED_POND_IDS: Array[StringName] = [ + &"bowfin", &"gar_spotted", &"lungfish_west_african", + &"catfish_channel", &"catfish_white", &"carp", + &"goldfish_bubbleeye", &"goldfish", &"bluegill", +] +const GENERATED_LAKE_IDS: Array[StringName] = [ + &"sturgeon_lake", &"trout_golden", &"chub_lake", &"saugeye", + &"walleye", &"goby_round", +] +const GENERATED_RIVER_IDS: Array[StringName] = [ + &"gar_longnose", &"paddlefish", &"sturgeon_shovelnose", + &"trout_cutthroat", &"trout_rainbow", &"catfish_blue", + &"catfish_flathead", &"chub_european", &"chub_flame", &"sauger", + &"trout_steelhead", +] + + func _initialize() -> void: call_deferred("_run") @@ -118,35 +115,21 @@ func _run() -> void: func _validate_generated_habitat_pools() -> void: - var expected_counts: Dictionary = { - GeneratedPondPool: GENERATED_POND_COUNT, - GeneratedLakePool: GENERATED_LAKE_COUNT, - GeneratedRiverPool: GENERATED_RIVER_COUNT, + var expected_by_pool: Dictionary = { + GeneratedPondPool: GENERATED_POND_IDS, + GeneratedLakePool: GENERATED_LAKE_IDS, + GeneratedRiverPool: GENERATED_RIVER_IDS, } - var freshwater_ids: Dictionary[StringName, bool] = {} - for pool: FishPoolType in expected_counts: - assert(pool.candidates.size() == int(expected_counts[pool])) - for fish: FishDataType in pool.candidates: + for pool: FishPoolType in expected_by_pool: + var expected_ids: Array[StringName] = expected_by_pool[pool] + assert(pool.candidates.size() == expected_ids.size()) + for fish_id: StringName in expected_ids: + var fish: FishDataType = Catalog.get_fish_by_id(fish_id) assert(fish != null and fish.is_fishable()) - assert(not freshwater_ids.has(fish.id)) - freshwater_ids[fish.id] = true + assert(pool.get_fish_by_id(fish_id) == fish) assert(fish.is_allowed_in_water(WaterType.Type.FRESH_WATER)) - assert(freshwater_ids.size() == STARTER_POND_COUNT) - assert(PondPool.candidates.size() == STARTER_POND_COUNT) - for fish: FishDataType in PondPool.candidates: - assert(freshwater_ids.has(fish.id)) - assert(OceanPool.candidates.size() == OCEAN_COUNT) - var ocean_ids: Dictionary[StringName, bool] = {} - for fish: FishDataType in OceanPool.candidates: - assert(fish != null and fish.is_fishable()) - assert(not ocean_ids.has(fish.id)) - ocean_ids[fish.id] = true - assert(fish.is_allowed_in_water(WaterType.Type.SALT_WATER)) - for fish: FishDataType in Catalog.candidates: - if not fish.is_fishable(): - continue - assert(freshwater_ids.has(fish.id) != ocean_ids.has(fish.id)) - assert(freshwater_ids.size() + ocean_ids.size() == FISHING_SPECIES_COUNT) + assert(GeneratedPondPool.get_fish_by_id(&"pomfret_white") == null) + assert(GeneratedPondPool.get_fish_by_id(&"mackerel_atlantic") == null) assert(GeneratedPondPool.get_fish_by_id(&"gar_longnose") == null) assert(GeneratedRiverPool.get_fish_by_id(&"gar_longnose") != null) assert(GeneratedRiverPool.get_fish_by_id(&"goby_round") == null) @@ -160,7 +143,7 @@ func _validate_weight_based_display_scale() -> void: continue assert(fish.is_selectable()) assert(fish.weight_min_lb > 0.0) - assert(fish.weight_max_lb <= 500000.0) + assert(fish.weight_max_lb <= 1000.0) var minimum_scale: float = fish.get_display_scale_for_weight( fish.weight_min_lb ) @@ -189,13 +172,10 @@ func _validate_weight_based_display_scale() -> void: func _validate_catalog_and_pools() -> void: assert(Catalog.candidates.size() == 316) - assert(PondPool.candidates.size() == STARTER_POND_COUNT) - assert(OceanPool.candidates.size() == OCEAN_COUNT) + assert(PondPool.candidates.size() == 26) + assert(OceanPool.candidates.size() == 34) var active_count: int = 0 var inactive_count: int = 0 - var fishing_count: int = 0 - var final_art_count: int = 0 - var placeholder_fishing_count: int = 0 var catalog_numbers: Dictionary[int, bool] = {} for fish: FishDataType in Catalog.candidates: assert(fish != null and not fish.id.is_empty()) @@ -213,30 +193,9 @@ func _validate_catalog_and_pools() -> void: else: inactive_count += 1 assert(not fish.is_selectable()) - if fish.catalog_number not in FINAL_CREATURE_CATALOG_NUMBERS: - assert(fish.display_texture == null) - if fish.catalog_number in FINAL_CREATURE_CATALOG_NUMBERS: - var expected_path := ( - "res://art/exported/creatures/%d.png" - % fish.catalog_number - ) - var expected_texture: Texture2D = load( - expected_path - ) as Texture2D - assert(expected_texture != null) - assert(fish.display_texture == expected_texture) - final_art_count += 1 - if fish.collection_method == FishDataType.CollectionMethod.FISHING: - fishing_count += 1 - assert(fish.active) - if fish.catalog_number not in FINAL_CREATURE_CATALOG_NUMBERS: - assert(fish.display_texture == SharedFishPlaceholder) - placeholder_fishing_count += 1 - assert(active_count == ACTIVE_CATALOG_COUNT) - assert(inactive_count == INACTIVE_CATALOG_COUNT) - assert(fishing_count == FISHING_SPECIES_COUNT) - assert(final_art_count == FINAL_CREATURE_CATALOG_NUMBERS.size()) - assert(placeholder_fishing_count == 253) + assert(fish.display_texture == null) + assert(active_count == 63) + assert(inactive_count == 253) var chum: FishDataType = Catalog.get_fish_by_id(&"salmon_chum") assert(chum != null) assert(chum.get_season_text() == "fall") @@ -274,12 +233,12 @@ func _validate_catalog_and_pools() -> void: ) == chum ) seasonal_collection.free() - var inactive_fish: FishDataType = Catalog.get_fish_by_id(&"crab_dungeness") + var inactive_fish: FishDataType = Catalog.get_fish_by_id(&"mudskipper_atlantic") assert(inactive_fish != null and not inactive_fish.active) var inactive_pool := FishPoolType.new() inactive_pool.candidates = [inactive_fish] var inactive_context := FishingContextType.new() - inactive_context.water_type = WaterType.Type.SALT_WATER + inactive_context.water_type = WaterType.Type.FRESH_WATER var inactive_collection := CollectionLogType.new() var inactive_selector := FishSelectorType.new() inactive_selector.use_deterministic_test_seed = true @@ -465,15 +424,11 @@ func _validate_authoritative_water_filter() -> void: ocean_region.location_tags = [&"coast", &"ocean"] var stale_salt_pool_region := FishableWaterRegion.new() stale_salt_pool_region.water_type = WaterType.Type.FRESH_WATER - var salt_only_pool := FishPoolType.new() - salt_only_pool.candidates = [Catalog.get_fish_by_id(&"bass")] - stale_salt_pool_region.fish_pool = salt_only_pool + stale_salt_pool_region.fish_pool = OceanPool stale_salt_pool_region.location_tags = [&"starter_pond"] var stale_fresh_pool_region := FishableWaterRegion.new() stale_fresh_pool_region.water_type = WaterType.Type.SALT_WATER - var fresh_only_pool := FishPoolType.new() - fresh_only_pool.candidates = [Catalog.get_fish_by_id(&"bluegill")] - stale_fresh_pool_region.fish_pool = fresh_only_pool + stale_fresh_pool_region.fish_pool = PondPool stale_fresh_pool_region.location_tags = [&"coast", &"ocean"] var evidence := {"discovered_fish_ids": []} assert( @@ -524,16 +479,21 @@ func _validate_starter_water_bodies() -> void: assert(ocean.water_type == WaterType.Type.SALT_WATER) assert(pond.fish_pool == PondPool) assert(ocean.fish_pool == OceanPool) + assert(region.get_node_or_null("ShorelineRibbons/Pond") == null) + var shoreline_geometry := ( + region.get_node_or_null("ShorelineRibbons/Ocean") as MeshInstance3D + ) + assert(shoreline_geometry != null) + assert(not shoreline_geometry.visible) + assert(shoreline_geometry.material_override == null) var pond_material := ( region.get_node("WaterBodies/Pond/VisualWater") as MeshInstance3D ).material_override as ShaderMaterial var ocean_material := ( region.get_node("WaterBodies/Ocean/VisualWater") as MeshInstance3D ).material_override as ShaderMaterial - assert(pond_material != null) - assert(ocean_material != null) - assert(float(ocean_material.get_shader_parameter("shoreline_foam_depth")) > 0.0) - assert(float(ocean_material.get_shader_parameter("shoreline_foam_strength")) > 0.0) + assert(not bool(pond_material.get_shader_parameter("tide_effect_enabled"))) + assert(bool(ocean_material.get_shader_parameter("tide_effect_enabled"))) region.free() diff --git a/tests/fish_hotbar_showcase_validation.gd b/tests/fish_hotbar_showcase_validation.gd index ab18f07..c2d687c 100644 --- a/tests/fish_hotbar_showcase_validation.gd +++ b/tests/fish_hotbar_showcase_validation.gd @@ -104,10 +104,7 @@ func _run() -> void: var hotbar_data: Dictionary = parsed["hotbar"] assert(typeof(hotbar_data.get("fish_slots")) == TYPE_ARRAY) assert(str((hotbar_data["fish_slots"] as Array)[1]) == fish_catch.catch_id) - assert(int(parsed["save_version"]) == 11) - assert(not PlayerHomeState.sanitize_save_data( - parsed.get("home", {}) - ).is_empty()) + assert(int(parsed["save_version"]) == 10) assert( int(parsed["experience"]["total_experience"]) == 125 @@ -200,17 +197,15 @@ func _run() -> void: var invalid_state: Dictionary = valid_state.duplicate(true) invalid_state["display_scale"] = 1000.0 assert(not NetworkFishShowcaseProtocol.validate_state(invalid_state)) - var protocol_version: int = NetworkProtocol.PROTOCOL_VERSION - var enet_channel_count: int = NetworkProtocol.ENET_CHANNEL_COUNT - var fish_quality_capability: String = NetworkProtocol.FISH_QUALITY_CAPABILITY - var showcase_capability: StringName = NetworkFishShowcaseProtocol.CAPABILITY - assert(protocol_version == 13) - assert(enet_channel_count == 18) + assert(NetworkProtocol.PROTOCOL_VERSION == 10) + assert(NetworkProtocol.ENET_CHANNEL_COUNT == 17) assert( - fish_quality_capability == "fish_quality_v1" + NetworkProtocol.FISH_QUALITY_CAPABILITY + == "fish_quality_v1" ) assert( - showcase_capability == &"fish_showcase_v1" + NetworkFishShowcaseProtocol.CAPABILITY + == &"fish_showcase_v1" ) print("Fish hotbar showcase validation: PASS") diff --git a/tests/fish_quality_validation.gd b/tests/fish_quality_validation.gd index b323880..3441344 100644 --- a/tests/fish_quality_validation.gd +++ b/tests/fish_quality_validation.gd @@ -26,28 +26,18 @@ func _run() -> void: _validate_collection_mastery() _validate_version_four_migration() _validate_fishing_protocol_v2() - var protocol_version: int = NetworkProtocol.PROTOCOL_VERSION - var enet_channel_count: int = NetworkProtocol.ENET_CHANNEL_COUNT - var movement_animation_channel: int = ( - NetworkProtocol.MOVEMENT_ANIMATION_CHANNEL - ) - var movement_reconciliation_capability: String = ( + assert(NetworkProtocol.PROTOCOL_VERSION == 10) + assert(NetworkProtocol.ENET_CHANNEL_COUNT == 17) + assert(NetworkProtocol.MOVEMENT_ANIMATION_CHANNEL == 11) + assert( NetworkProtocol.MOVEMENT_RECONCILIATION_CAPABILITY + == "movement_reconciliation_v2" ) - var fishing_replication_capability: String = ( + assert( NetworkProtocol.FISHING_REPLICATION_CAPABILITY + == "fishing_replication_v2" ) - var fish_quality_capability: String = NetworkProtocol.FISH_QUALITY_CAPABILITY - assert(protocol_version == 13) - assert(enet_channel_count == 18) - assert(movement_animation_channel == 11) - assert( - movement_reconciliation_capability == "movement_reconciliation_v2" - ) - assert( - fishing_replication_capability == "fishing_replication_v2" - ) - assert(fish_quality_capability == "fish_quality_v1") + assert(NetworkProtocol.FISH_QUALITY_CAPABILITY == "fish_quality_v1") print("Fish quality validation: PASS") quit() @@ -81,17 +71,11 @@ func _validate_fishing_protocol_v2() -> void: NetworkFishingProtocol.validate_cast_request(invalid_sequence) == "Fishing request values are outside allowed limits." ) - var observer_snapshot_channel: int = ( - NetworkFishingProtocol.OBSERVER_SNAPSHOT_CHANNEL - ) - var world_spawn_snapshot_channel: int = ( - NetworkWorldSpawnProtocol.SNAPSHOT_CHANNEL - ) - var fishing_snapshot_channel: int = NetworkFishingProtocol.SNAPSHOT_CHANNEL - assert(observer_snapshot_channel == 10) - assert(world_spawn_snapshot_channel == 15) + assert(NetworkFishingProtocol.OBSERVER_SNAPSHOT_CHANNEL == 10) + assert(NetworkWorldSpawnProtocol.SNAPSHOT_CHANNEL == 15) assert( - world_spawn_snapshot_channel != fishing_snapshot_channel + NetworkWorldSpawnProtocol.SNAPSHOT_CHANNEL + != NetworkFishingProtocol.SNAPSHOT_CHANNEL ) @@ -256,14 +240,10 @@ func _validate_barrier_challenge_curve() -> void: func _validate_fight_pacing_and_reel_upgrades() -> void: - var chase_speed: float = CatchController.CHASE_SPEED - var chase_start_delay: float = CatchController.CHASE_START_DELAY - var chase_start_offset: float = CatchController.CHASE_START_OFFSET - var base_reel_speed: float = Player.BASE_REEL_SPEED - assert(is_equal_approx(chase_speed, 0.07)) - assert(is_equal_approx(chase_start_delay, 1.5)) - assert(is_equal_approx(chase_start_offset, 0.04)) - assert(is_equal_approx(base_reel_speed, 0.16)) + assert(is_equal_approx(CatchController.CHASE_SPEED, 0.07)) + assert(is_equal_approx(CatchController.CHASE_START_DELAY, 1.5)) + assert(is_equal_approx(CatchController.CHASE_START_OFFSET, 0.04)) + assert(is_equal_approx(Player.BASE_REEL_SPEED, 0.16)) var upgrades := PlayerFishingUpgrades.new() assert(is_equal_approx(upgrades.get_reel_speed_multiplier(), 1.0)) @@ -505,7 +485,7 @@ func _validate_version_four_migration() -> void: version_four, 4, ) - assert(int(migrated.get("save_version", -1)) == 11) + assert(int(migrated.get("save_version", -1)) == 10) assert(int((migrated["experience"] as Dictionary)["total_experience"]) == 0) assert( is_equal_approx( @@ -529,7 +509,4 @@ func _validate_version_four_migration() -> void: assert( PlayerJobService.validate_save_data(migrated.get("jobs", {})) ) - assert(not PlayerHomeState.sanitize_save_data( - migrated.get("home", {}) - ).is_empty()) manager.queue_free() diff --git a/tests/fishing_authority_validation.gd b/tests/fishing_authority_validation.gd index ec3320b..e7c87bb 100644 --- a/tests/fishing_authority_validation.gd +++ b/tests/fishing_authority_validation.gd @@ -265,40 +265,9 @@ func _run() -> void: assert(bool(water_recovery.get("_prior_movement_enabled"))) assert(bool(water_recovery.get("_prior_camera_input_enabled"))) assert(not pause_menu.visible) - var test_world := main.get_node("TestWorld") as TestWorld - assert(test_world != null) - var recovery_entry := water_recovery.get("_entry_position") as Vector3 - var resolved_recovery := water_recovery.call( - "_resolve_recovery_position" - ) as Vector3 - assert(resolved_recovery.is_equal_approx( - test_world.get_water_recovery_position(recovery_entry) - )) water_recovery.call("_finish_recovery") assert(player.is_movement_enabled()) - # Session/world teardown can interrupt the fade before its normal completion. - # Recovery must still release FishingSpot's external input lock without - # restoring movement that gameplay shutdown already disabled. - water_recovery.call( - "_on_recovery_requested", - player, - player.global_position.y, - ) - assert(water_recovery.is_recovery_active()) - var screen_fade := game_ui.get_screen_fade() as ScreenFade - assert(screen_fade != null) - screen_fade.fade_to_black(int(water_recovery.get("_generation"))) - water_recovery.set_recovery_enabled(false) - assert(not water_recovery.is_recovery_active()) - assert(not player.is_water_recovery_active()) - assert(not bool(fishing_spot.get("_external_input_blocked"))) - assert(not player.is_movement_enabled()) - assert(not screen_fade.visible) - water_recovery.set_recovery_enabled(true) - player.set_movement_enabled(true) - player.set_camera_input_enabled(true) - print("Fishing authority validation: PASS") session.disconnect_session("") main.queue_free() diff --git a/tests/fishing_multiplayer_validation.gd b/tests/fishing_multiplayer_validation.gd index f660fc0..73de1bd 100644 --- a/tests/fishing_multiplayer_validation.gd +++ b/tests/fishing_multiplayer_validation.gd @@ -63,38 +63,12 @@ func _run_host() -> void: var spawn_service := main.get_node( "%PlayerSpawnService" ) as PlayerSpawnService - var network_home := main.get_node( - "%NetworkHomeService" - ) as NetworkHomeService - var home_world := main.get_node("%HomeWorldService") as HomeWorldService var remote_avatar: Player = spawn_service.get_avatar(remote_peer_id) assert(remote_avatar != null) assert(remote_avatar.bag.get_quantity(&"worms") == 0) - var remote_record := session.get_peer_record(remote_peer_id) - assert(remote_record != null) - assert(await _wait_for_home( - network_home, remote_record.identity_fingerprint - )) - var exterior_spawn: Transform3D = home_world.get_exterior_spawn_transform( - remote_record.identity_fingerprint - ) - var exterior_deadline: int = Time.get_ticks_msec() + 5000 - while ( - Time.get_ticks_msec() < exterior_deadline - and remote_avatar.global_position.distance_to(exterior_spawn.origin) > 0.25 - ): - await physics_frame - assert(remote_avatar.global_position.distance_to(exterior_spawn.origin) <= 0.25) - # Give the client enough local frames to observe the initial RV-door spawn - # before this test publishes its separate fishing-position teleport. - for _frame: int in 30: - await physics_frame - var cast_setup: Dictionary = await _find_clear_fishing_setup( - main, remote_avatar - ) - assert(not cast_setup.is_empty(), "no clear fishing setup was found") - var expected_position: Vector3 = cast_setup["position"] - var expected_direction: Vector3 = cast_setup["direction"] + remote_avatar.global_position = Vector3(-0.5, 3.95, 2.1) + var remote_visuals := remote_avatar.get_node("Visuals") as Node3D + remote_visuals.rotation.y = PI * 0.5 session.publish_authoritative_teleport(remote_peer_id) var aiming_deadline: int = Time.get_ticks_msec() + 15000 while ( @@ -108,7 +82,7 @@ func _run_host() -> void: == Player.FishingVisualPhase.CASTING ) var remote_position_error := ( - remote_avatar.global_position - expected_position + remote_avatar.global_position - Vector3(-0.5, 3.95, 2.1) ) remote_position_error.y = 0.0 assert( @@ -116,7 +90,7 @@ func _run_host() -> void: "remote casting position drifted: %s" % remote_avatar.global_position ) assert( - remote_avatar.get_facing_direction().dot(expected_direction) > 0.99, + remote_avatar.get_facing_direction().dot(Vector3.LEFT) > 0.99, "remote casting facing drifted: %s" % remote_avatar.get_facing_direction() ) @@ -194,18 +168,6 @@ func _run_host() -> void: ): await process_frame assert(remote_avatar.is_retract_visual_complete()) - var observer_cleanup_deadline: int = Time.get_ticks_msec() + 3000 - while ( - Time.get_ticks_msec() < observer_cleanup_deadline - and int(remote_avatar.get("_fishing_visual_phase")) - != Player.FishingVisualPhase.NONE - ): - await process_frame - assert( - int(remote_avatar.get("_fishing_visual_phase")) - == Player.FishingVisualPhase.NONE - ) - assert(remote_animation_player.assigned_animation != &"retract_sit") # Give the client that owns the same presentation a frame boundary to finish # local cleanup before the host intentionally tears down this test session. for _frame: int in 4: @@ -234,23 +196,6 @@ func _run_client() -> void: joined = true break assert(joined) - var network_home := main.get_node( - "%NetworkHomeService" - ) as NetworkHomeService - var home_world := main.get_node("%HomeWorldService") as HomeWorldService - var local_fingerprint: String = session.get_local_identity_fingerprint() - assert(await _wait_for_home(network_home, local_fingerprint)) - var player := main.get("_player") as Player - var exterior_spawn: Transform3D = ( - home_world.get_exterior_spawn_transform(local_fingerprint) - ) - var home_spawn_deadline: int = Time.get_ticks_msec() + 5000 - while ( - Time.get_ticks_msec() < home_spawn_deadline - and player.global_position.distance_to(exterior_spawn.origin) > 0.25 - ): - await physics_frame - assert(player.global_position.distance_to(exterior_spawn.origin) <= 0.25) var service := main.get_node( "%NetworkFishingService" @@ -261,6 +206,7 @@ func _run_client() -> void: cast_rejections.append(message) ) var fishing_spot := main.get_node("%FishingSpot") as FishingSpotType + var player := main.get("_player") as Player var item_catalog := main.get("item_catalog") as ItemCatalog var worms: ItemData = item_catalog.get_item_by_id(&"worms") if player.bag.get_quantity(&"worms") == 0: @@ -271,19 +217,15 @@ func _run_client() -> void: "Visuals/CharacterRig/AnimationPlayer" ) as AnimationPlayer assert(character_animation_player.has_animation(&"retract_sit")) - # The host chooses and publishes a clear target after both RV manifests have - # settled. Waiting for that authoritative teleport also coordinates the - # animation-observation window between these two independent processes. - var placement_deadline: int = Time.get_ticks_msec() + 10000 + var placement_deadline: int = Time.get_ticks_msec() + 5000 while ( Time.get_ticks_msec() < placement_deadline - and player.global_position.distance_to(exterior_spawn.origin) <= 1.0 + and player.global_position.distance_to(Vector3(-0.5, 3.95, 2.1)) + > 0.25 ): await physics_frame - assert(player.global_position.distance_to(exterior_spawn.origin) > 1.0) - for _frame: int in 2: - await physics_frame - var expected_direction: Vector3 = player.get_facing_direction() + assert(player.global_position.distance_to(Vector3(-0.5, 3.95, 2.1)) <= 0.25) + assert(player.get_facing_direction().dot(Vector3.LEFT) > 0.99) player.set_casting_visual() assert( @@ -299,10 +241,7 @@ func _run_client() -> void: assert(player.is_sitting()) for _frame: int in 15: await physics_frame - assert(fishing_spot.state == FishingSpotType.FishingState.READY) - assert(fishing_spot.get("_active_player") == null) fishing_spot.call("_begin_aiming", player) - assert(fishing_spot.state == FishingSpotType.FishingState.AIMING_CAST) assert(player.is_movement_enabled()) assert( int(player.get("_fishing_visual_phase")) @@ -311,7 +250,6 @@ func _run_client() -> void: var cast_charge: float = 0.0 var target: Vector3 = Vector3.ZERO var cast_origin: Vector3 = fishing_spot.get("_cast_origin_position") - var target_diagnostics: Array[String] = [] for charge_step: int in range(1, 21): var candidate_charge := float(charge_step) / 20.0 fishing_spot.set("_cast_charge", candidate_charge) @@ -320,33 +258,14 @@ func _run_client() -> void: var candidate_surface := fishing_spot.get( "_aim_surface_sample" ) as FishingSurfaceSample - target_diagnostics.append( - "charge=%.2f surface=%s path=%s target=%s" % [ - candidate_charge, - candidate_surface.is_fishable(), - fishing_spot.get("_cast_path_is_clear"), - candidate_target, - ] - ) if ( candidate_surface.is_fishable() - and bool(fishing_spot.get("_cast_path_is_clear")) + and fishing_spot.is_cast_path_clear(cast_origin, candidate_target) ): cast_charge = candidate_charge target = candidate_target break - assert( - cast_charge > 0.0, - ( - "no clear fishable test target was found; position=%s facing=%s " - + "expected=%s diagnostics=%s" - ) % [ - player.global_position, - player.get_facing_direction(), - expected_direction, - target_diagnostics, - ], - ) + assert(cast_charge > 0.0, "no clear fishable test target was found") var evidence: Dictionary = fishing_spot.call("_build_network_evidence") fishing_spot.set("state", FishingSpotType.FishingState.CASTING) player.set_movement_enabled(false) @@ -469,79 +388,3 @@ func _create_initialized_main() -> Node: await process_frame assert(bool(main.get("_application_initialized"))) return main - - -func _wait_for_home( - network_home: NetworkHomeService, - fingerprint: String, -) -> bool: - var deadline: int = Time.get_ticks_msec() + 10000 - while Time.get_ticks_msec() < deadline: - await process_frame - var manifests: Dictionary = network_home.get( - "_manifests_by_fingerprint" - ) - if manifests.has(fingerprint): - return true - return false - - -func _find_clear_fishing_setup(main: Node, player: Player) -> Dictionary: - var world := main.get_node("TestWorld") as TestWorld - var fishing_spot := main.get_node("%FishingSpot") as FishingSpotType - var regions: Array[FishableWaterRegion] = world.get_fishable_water_regions() - for region: FishableWaterRegion in regions: - var body := region.get_parent() as WaterBodyAuthoring - if body == null or body.surface_size.x <= 0.0 or body.surface_size.y <= 0.0: - continue - var center: Vector3 = region.global_position - var half_size: Vector2 = body.surface_size * 0.5 - var candidate_offsets: Array[Vector3] = [ - Vector3(half_size.x + 0.8, 0.0, 0.0), - Vector3(-half_size.x - 0.8, 0.0, 0.0), - Vector3(0.0, 0.0, half_size.y + 0.8), - Vector3(0.0, 0.0, -half_size.y - 0.8), - ] - for offset: Vector3 in candidate_offsets: - var position := Vector3( - center.x + offset.x, - region.get_surface_height() + 1.44, - center.z + offset.z, - ) - var direction: Vector3 = center - position - direction.y = 0.0 - direction = direction.normalized() - player.global_position = position - var visuals := player.get_node("Visuals") as Node3D - visuals.global_rotation.y = atan2(-direction.x, -direction.z) - for _frame: int in 2: - await physics_frame - var cast_origin: Vector3 = player.get_cast_origin_position() - var launch_position: Vector3 = player.get_fishing_rod_tip().global_position - for charge_step: int in range(1, 21): - var cast_charge := float(charge_step) / 20.0 - var cast_distance := lerpf( - fishing_spot.minimum_cast_distance, - fishing_spot.maximum_cast_distance, - cast_charge, - ) - var query_position := cast_origin + direction * cast_distance - var sample: FishingSurfaceSample = ( - fishing_spot.resolve_fishing_surface( - query_position, cast_origin.y - ) - ) - var target: Vector3 = sample.get_bobber_position( - fishing_spot.solid_bobber_clearance - ) - if ( - sample.is_fishable() - and fishing_spot.is_cast_path_clear( - launch_position, target - ) - ): - return { - "position": player.global_position, - "direction": direction, - } - return {} diff --git a/tests/fishing_surface_validation.gd b/tests/fishing_surface_validation.gd index eddc66e..eb02c6c 100644 --- a/tests/fishing_surface_validation.gd +++ b/tests/fishing_surface_validation.gd @@ -156,7 +156,6 @@ func _validate_portable_water_body() -> void: PlayerWaterTrigger.EntryHeightReference.PLAYER_ORIGIN, ) water_body.set("recovery_entry_depth_threshold", 0.1) - water_body.set("recovery_entry_confirmation_seconds", 0.2) water_body.set("fish_pool", PondPool) root.add_child(water_body) await process_frame @@ -184,34 +183,6 @@ func _validate_portable_water_body() -> void: == PlayerWaterTrigger.EntryHeightReference.PLAYER_ORIGIN ) assert(is_equal_approx(recovery_region.entry_depth_threshold, 0.1)) - assert(is_equal_approx(recovery_region.entry_confirmation_seconds, 0.2)) - - var recovery_player := PlayerScene.instantiate() as Player - assert(recovery_player != null) - root.add_child(recovery_player) - recovery_player.set_process(false) - recovery_player.set_physics_process(false) - var recovery_requests: Array[float] = [] - recovery_region.recovery_requested.connect( - func(_player: Player, requested_surface_height: float) -> void: - recovery_requests.append(requested_surface_height) - ) - recovery_region.call("_on_body_entered", recovery_player) - recovery_player.global_position.y = 6.8 - recovery_region.call("_physics_process", 0.1) - assert(recovery_requests.is_empty()) - # Breaking the submersion resets confirmation rather than carrying a stale - # partial fall into a later jump. - recovery_player.global_position.y = 7.0 - recovery_region.call("_physics_process", 0.1) - recovery_player.global_position.y = 6.8 - recovery_region.call("_physics_process", 0.11) - assert(recovery_requests.is_empty()) - recovery_region.call("_physics_process", 0.1) - assert(recovery_requests == [7.0]) - recovery_region.call("_on_body_exited", recovery_player) - recovery_player.queue_free() - await process_frame water_body.queue_free() await process_frame @@ -545,35 +516,6 @@ func _validate_remote_presentation() -> void: presentation.synchronize_active("late-attempt", target, false) assert(not bool(player.get("_fighting_visual_active"))) - # An escape or withdrawal has no showcase to clear the retract pose. Return - # completion itself must restore ordinary locomotion before listeners dispose - # of the observer presentation. - presentation.play_return() - await presentation.return_completed - assert( - int(player.get("_fishing_visual_phase")) - == Player.FishingVisualPhase.NONE - ) - assert(not bool(player.get("_fighting_visual_active"))) - player.set_physics_process(false) - player.velocity = Vector3(8.0, 0.0, 0.0) - player.call("_update_character_animation") - var animation_player := player.get_node( - "Visuals/CharacterRig/AnimationPlayer" - ) as AnimationPlayer - assert(animation_player.assigned_animation == &"running") - var running_position: float = animation_player.current_animation_position - await create_timer(0.1).timeout - assert(animation_player.current_animation == &"running") - assert( - not is_equal_approx( - animation_player.current_animation_position, - running_position, - ) - ) - presentation.cleanup() - presentation.synchronize_active("catch-attempt", target, false) - var fish_catch := FishCatchType.new() var fish: FishData = PondPool.candidates.front() fish_catch.fish = fish diff --git a/tests/gathering_marker_surface_validation.gd b/tests/gathering_marker_surface_validation.gd index 4ec5429..8ce3b4a 100644 --- a/tests/gathering_marker_surface_validation.gd +++ b/tests/gathering_marker_surface_validation.gd @@ -44,8 +44,6 @@ func _run() -> void: assert(invalid_material.albedo_color == Color.WHITE) assert(is_equal_approx(invalid_material.albedo_color.a, 1.0)) assert(is_equal_approx(valid_material.albedo_color.a, 1.0)) - assert(invalid_material.no_depth_test) - assert(valid_material.no_depth_test) assert( invalid_material.shading_mode == BaseMaterial3D.SHADING_MODE_UNSHADED @@ -59,11 +57,11 @@ func _run() -> void: wall.queue_free() await process_frame - var floor_surface := _make_surface( + var floor := _make_surface( Vector3(10.0, 0.2, 10.0), Vector3(0.0, -0.1, -1.7), ) - root.add_child(floor_surface) + root.add_child(floor) await physics_frame controller.call("_update_marker_target") assert(bool(controller.get("_marker_has_surface"))) @@ -80,7 +78,7 @@ func _run() -> void: ) ) - floor_surface.queue_free() + floor.queue_free() controller.queue_free() player.queue_free() await process_frame diff --git a/tests/gathering_showcase_validation.gd b/tests/gathering_showcase_validation.gd index 51d6f38..7099f7c 100644 --- a/tests/gathering_showcase_validation.gd +++ b/tests/gathering_showcase_validation.gd @@ -21,13 +21,9 @@ func _run() -> void: assert(bool(main.get("_application_initialized"))) var session := main.get_node("%NetworkSession") as NetworkSession - assert(bool(main.call( - "_apply_world", WorldLayout.STARTER_ISLAND, 1, true - ))) - assert(session.set_host_world(WorldLayout.STARTER_ISLAND, 1)) assert(session.start_private_host(TEST_PORT)) var save_manager := main.get("_save_manager") as PlayerSaveManager - assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND)) + assert(save_manager.initialize_new_game()) main.call("_enter_gameplay") for _frame: int in 8: await process_frame @@ -42,7 +38,7 @@ func _run() -> void: and game_ui != null and catalog != null ) - fishing_spot.minimum_showcase_duration = 1.0 + fishing_spot.minimum_showcase_duration = 0.15 assert(player.bag.add_item(&"crab_net")) assert(player.hotbar.assign_item(0, &"crab_net")) assert(player.hotbar.select_slot(0)) @@ -85,7 +81,7 @@ func _run() -> void: await process_frame assert(fishing_spot.get("_pending_catch") == crab_catch) Input.action_release("fish_primary") - fishing_spot.set("_showcase_input_lock_remaining", 0.0) + await create_timer(0.2).timeout await process_frame assert(bool(fishing_spot.get("_put_away_press_armed"))) Input.parse_input_event(pocket_event) diff --git a/tests/generated_world_runtime_validation.gd b/tests/generated_world_runtime_validation.gd index 524e7b3..64b6ee1 100644 --- a/tests/generated_world_runtime_validation.gd +++ b/tests/generated_world_runtime_validation.gd @@ -12,21 +12,6 @@ const GeneratedLakePool: FishPool = preload( const GeneratedRiverPool: FishPool = preload( "res://fish/pools/generated_river_pool.tres" ) -const FishingSurfaceResolverType = preload( - "res://fishing/fishing_surface_resolver.gd" -) -const Gatherables: GatherableCatalog = preload( - "res://gathering/catalog/gatherable_catalog.tres" -) -const PrecipitationOcclusionType = preload( - "res://world/environment/precipitation_occlusion.gd" -) -const FOLIAGE_WIND_SHADER: Shader = preload( - "res://world/materials/foliage_wind.gdshader" -) -const FOLIAGE_WIND_SOURCE_MATERIALS_META: StringName = ( - &"foliage_wind_source_materials" -) const FIRST_SEED := 13001 const SECOND_SEED := 13002 const RIVER_FALLBACK_SEED := 13012 @@ -139,8 +124,8 @@ func _validate_generated_region( var placements := generator.placement_keys() var expected_chunk_count := generator.grid_size.x * generator.grid_size.y var center := Vector2i( - int(float(generator.grid_size.x) / 2.0), - int(float(generator.grid_size.y) / 2.0), + generator.grid_size.x / 2, + generator.grid_size.y / 2, ) var center_index := center.y * generator.grid_size.x + center.x assert(generator.grid_size == Vector2i(20, 20)) @@ -259,7 +244,6 @@ func _validate_generated_region( assert(_placement_count(placements, "chunk_0034") == 1) assert(_placement_count(placements, "chunk_0035") == 1) assert(_placement_count(placements, "chunk_0036") == 1) - assert(_placement_count(placements, "chunk_0038") == 2) assert( _placement_count(placements, "chunk_0014") == (2 if has_secondary_elevation else 0) @@ -298,31 +282,10 @@ func _validate_generated_region( var river_edge_count := ( _placement_count(placements, "chunk_0024") + _placement_count(placements, "chunk_0025") - + _placement_count(placements, "chunk_0038") ) assert(river_coordinate_count >= 12) assert(generator._river_feature_placements.size() == river_coordinate_count) assert(river_edge_count == river_coordinate_count - 8) - var stone_bridge_specs: Array[Dictionary] = [] - for spec: Dictionary in generator._river_feature_placements: - if spec.get("id", &"") == &"chunk_0038": - stone_bridge_specs.append(spec) - assert(stone_bridge_specs.size() == 2) - var first_bridge_coordinate := stone_bridge_specs[0].get( - "coordinate", - Vector2i(-1, -1), - ) as Vector2i - var second_bridge_coordinate := stone_bridge_specs[1].get( - "coordinate", - Vector2i(-1, -1), - ) as Vector2i - var bridge_delta := second_bridge_coordinate - first_bridge_coordinate - assert(absi(bridge_delta.x) + absi(bridge_delta.y) == 1) - assert(posmod( - int(stone_bridge_specs[1].get("turns", -1)) - - int(stone_bridge_specs[0].get("turns", -1)), - 4, - ) == 2) var river_source_coordinates := generator._river_source_coordinates( generator._river_feature_origin, generator._river_feature_footprint_size, @@ -350,7 +313,7 @@ func _validate_generated_region( ): var outlet_coordinate := Vector2i( index % generator.grid_size.x, - int(float(index) / float(generator.grid_size.x)), + index / generator.grid_size.x, ) outlet_coordinates.append(outlet_coordinate) assert( @@ -375,7 +338,7 @@ func _validate_generated_region( for index: int in placements.size(): var coordinate := Vector2i( index % generator.grid_size.x, - int(float(index) / float(generator.grid_size.x)), + index / generator.grid_size.x, ) if placements[index].begins_with("chunk_0001@"): assert(generator._distance_from_map_boundary(coordinate) <= 1) @@ -414,55 +377,17 @@ func _validate_generated_region( + generator.stacked_elevated_placement_keys().size() ) ) - _validate_elevated_cliff_feature(region, generator) + _validate_elevated_cliff_feature(generator) var shop := region.get_node("Interactables/FishingShopWorld") as Node3D var storage := region.get_node("Interactables/PlayerStorageBox") as Node3D - var decor_shop := region.get_node( - "Interactables/DecorShopWorld" - ) as Node3D - var rv_upgrade_shop := region.get_node( - "Interactables/RVUpgradeShopWorld" - ) as Node3D assert(shop != null and shop.has_node("Shopkeeper")) assert(storage != null and storage.has_node("InteractionArea")) - assert(decor_shop != null and decor_shop.has_node("Shopkeeper")) - assert(rv_upgrade_shop != null and rv_upgrade_shop.has_node("Shopkeeper")) - for shop_root: Node3D in [shop, decor_shop, rv_upgrade_shop]: - var interaction := shop_root.get_node( - "InteractionArea" - ) as FishingShopInteraction - var interaction_shape := shop_root.get_node( - "InteractionArea/InteractionShape" - ) as CollisionShape3D - var sphere := interaction_shape.shape as SphereShape3D - assert(sphere != null and is_equal_approx(sphere.radius, 1.5)) - assert(interaction != null) - assert(interaction.roaming_radius >= 2.75) - assert(interaction.minimum_route_distance >= 1.25) - assert(is_equal_approx(interaction.local_interaction_reach, 1.5)) - assert( - is_equal_approx( - interaction.get_authority_interaction_radius(), - interaction.roaming_radius + interaction.local_interaction_reach, - ) - ) var spawn_chunk_center := generator.chunk_position(center) var shop_offset := shop.position - spawn_chunk_center var storage_offset := storage.position - spawn_chunk_center assert(absf(shop_offset.x) < 5.0 and absf(shop_offset.z) < 5.0) assert(absf(storage_offset.x) < 5.0 and absf(storage_offset.z) < 5.0) - for pair: Array in [ - [shop, decor_shop], - [shop, rv_upgrade_shop], - [decor_shop, rv_upgrade_shop], - ]: - var first_shop := pair[0] as Node3D - var second_shop := pair[1] as Node3D - assert( - first_shop.position.distance_to(second_shop.position) - >= GeneratedWorldRegion.SHOPKEEPER_MINIMUM_SEPARATION - 0.001 - ) assert(region.get_fishing_shop() != null) assert(region.get_player_storage() != null) assert(region.get_player_spawn_transform().origin.y > 0.0) @@ -474,19 +399,6 @@ func _validate_generated_region( assert(ocean != null and fresh_root != null) assert(ocean.water_type == WaterType.Type.SALT_WATER) assert(is_equal_approx(ocean.position.y, GeneratedWorldRegion.WATER_HEIGHT)) - var ocean_motion := ocean.get_node("VisualWater") as WaterSurfaceMotion - assert(ocean_motion != null and ocean_motion.is_processing()) - var normal_water_amplitude: float = ocean_motion.get_effective_amplitude() - assert(normal_water_amplitude > 0.0) - region.set_water_motion_strength_multiplier(2.0) - assert(is_equal_approx( - ocean_motion.get_effective_amplitude(), - normal_water_amplitude * 2.0, - )) - region.set_water_motion_strength_multiplier(1.0) - assert(is_equal_approx( - ocean_motion.get_effective_amplitude(), normal_water_amplitude - )) var ocean_recovery := ocean.get_node("RecoveryRegion") as PlayerWaterTrigger assert( ocean_recovery.entry_height_reference @@ -522,8 +434,6 @@ func _validate_generated_region( == 20 + river_placement_count ) var river_body_count := 0 - var surface_resolver := FishingSurfaceResolverType.new() - var space_state := region.get_world_3d().direct_space_state for child: Node in fresh_root.get_children(): var fresh := child as WaterBodyAuthoring assert(fresh != null) @@ -533,20 +443,6 @@ func _validate_generated_region( assert(fresh.surface_size.x <= 10.0 and fresh.surface_size.y <= 10.0) assert(not fresh.visual_surface_enabled) assert(not (fresh.get_node("VisualWater") as MeshInstance3D).visible) - var generated_bed := fresh.get_node_or_null( - "GeneratedBed", - ) as MeshInstance3D - assert(generated_bed != null and generated_bed.mesh != null) - assert( - is_equal_approx( - generated_bed.global_position.y, - GeneratedWorldRegion.GENERATED_FRESH_WATER_BED_HEIGHT, - ) - ) - assert( - generated_bed.material_override != null - and generated_bed.material_override.resource_name == "dirt" - ) var fresh_recovery := ( fresh.get_node("RecoveryRegion") as PlayerWaterTrigger ) @@ -555,10 +451,6 @@ func _validate_generated_region( == PlayerWaterTrigger.EntryHeightReference.PLAYER_ORIGIN ) assert(is_equal_approx(fresh_recovery.entry_depth_threshold, 0.1)) - assert(is_equal_approx( - fresh_recovery.entry_confirmation_seconds, - 0.2, - )) var coordinate_tokens := child.name.trim_prefix("FreshWater_").split("_") assert(coordinate_tokens.size() == 2) var coordinate := Vector2i( @@ -583,85 +475,15 @@ func _validate_generated_region( else: assert(&"pond" in fresh.location_tags) assert(fresh.fish_pool == GeneratedPondPool) - # Generated fresh water shares the ocean's visible plane. Confirm that - # every habitat collider wins at runtime rather than merely checking the - # resource assigned to an otherwise-unused body. - var probe_position := fresh.global_position - if fresh.surface_polygon.size() >= 3: - var probe_indices := Geometry2D.triangulate_polygon( - fresh.surface_polygon, - ) - assert(probe_indices.size() >= 3) - var probe_local := Vector2.ZERO - for probe_offset: int in 3: - probe_local += fresh.surface_polygon[ - probe_indices[probe_offset] - ] - probe_local /= 3.0 - probe_position = fresh.to_global(Vector3( - probe_local.x, - 0.0, - probe_local.y, - )) - var selected_region: FishableWaterRegion = surface_resolver.call( - "_find_highest_water_region", - space_state, - probe_position, - probe_position.y + 100.0, - probe_position.y - 100.0, - ) - assert(selected_region == fresh.get_node("FishingRegion")) - assert(selected_region.fish_pool == fresh.fish_pool) assert(river_body_count == river_placement_count) - var resolved_ocean := surface_resolver.resolve_surface( - space_state, - Vector3(1000.0, GeneratedWorldRegion.WATER_HEIGHT, 1000.0), - GeneratedWorldRegion.WATER_HEIGHT + 2.0, - ) - assert(resolved_ocean.is_fishable()) - assert(resolved_ocean.water_region == ocean.get_node("FishingRegion")) - assert(resolved_ocean.water_region.water_type == WaterType.Type.SALT_WATER) _validate_authored_chunk_surfaces(region, generator) - _validate_projected_terrain_materials( - generator.get_generated_chunks_root() - ) var decorations := region.get_node("Decorations") as Node3D - var grass_prop_surface_triangles := region.get_spawn_surface_triangles( - [&"grass_lite"], - -INF, - 0.35, - ) - var sand_prop_surface_triangles := region.get_spawn_surface_triangles( - [&"sand"], - -INF, - 0.35, - ) - _validate_crab_spawn_surfaces(region) - _validate_water_recovery_positions( - region, - grass_prop_surface_triangles, - sand_prop_surface_triangles, - ) var anchors := region.get_node( "GatherableAnchors/ReachableTreeTrunks" ) as GatherableAnchorSet3D assert(decorations != null and decorations.get_child_count() > 0) - var normal_foliage_wind := _first_foliage_wind_material(decorations) - assert(normal_foliage_wind != null) - var normal_foliage_strength: float = float( - normal_foliage_wind.get_shader_parameter("local_wind_strength") - ) - assert(normal_foliage_strength > 0.0) - region.set_foliage_wind_strength_multiplier(2.0) - var rainy_foliage_wind := _first_foliage_wind_material(decorations) - assert(rainy_foliage_wind != null) - assert(is_equal_approx( - float(rainy_foliage_wind.get_shader_parameter("local_wind_strength")), - normal_foliage_strength * 2.0, - )) - region.set_foliage_wind_strength_multiplier(1.0) assert(anchors != null) assert(anchors.get_spawn_positions().size() > 0) _validate_tree_gatherable_anchors(region, decorations, anchors) @@ -680,12 +502,6 @@ func _validate_generated_region( assert(PROCEDURAL_PROP_IDS.has(prop_id)) var definition := region.get_prop_catalog().definition_for_id(prop_id) assert(definition != null) - if definition.procedural_group in [&"grass_tree", &"sand_tree"]: - assert( - _has_precipitation_occlusion_layer(child), - "Precipitation occlusion layer missing from %s (%s)." - % [child.name, prop_id], - ) var biome_id := StringName( child.get_meta(&"terrain_biome_id", &"") ) @@ -700,8 +516,8 @@ func _validate_generated_region( Vector2i.ZERO, ) var spawn_coordinate := Vector2i( - int(float(generator.grid_size.x) / 2.0), - int(float(generator.grid_size.y) / 2.0), + generator.grid_size.x / 2, + generator.grid_size.y / 2, ) var spawn_distance := ( absi(coordinate.x - spawn_coordinate.x) @@ -712,8 +528,6 @@ func _validate_generated_region( region, child as Node3D, definition, - grass_prop_surface_triangles, - sand_prop_surface_triangles, ) if prop_id == &"prop_palm": var cluster_id := int( @@ -808,7 +622,6 @@ func _validate_generated_region( func _validate_elevated_cliff_feature( - region: GeneratedWorldRegion, generator: TerrainChunkGenerator, ) -> void: var elevated_coordinates: Dictionary[Vector2i, StringName] = {} @@ -942,27 +755,6 @@ func _validate_elevated_cliff_feature( or generator.placement_keys()[low_index].begins_with("chunk_spawn@") ) assert(found_primary_ramp == not primary_is_third_tier) - var primary_surface_height := ( - generator.elevated_cliff_level_height - * (2.0 if primary_is_third_tier else 1.0) - ) - var primary_surface_position := generator.to_global( - generator.chunk_position(feature_center) - + Vector3.UP * primary_surface_height - ) - assert( - region.is_home_exterior_position_accessible(primary_surface_position) - == not primary_is_third_tier - ) - assert(region.is_home_exterior_position_accessible(generator.to_global( - generator.chunk_position(feature_center) - ))) - # A higher surface sharing a ramp-accessible base cell is still invalid - # unless that elevation has its own authored ramp connection. - assert(not region.is_home_exterior_position_accessible(generator.to_global( - generator.chunk_position(feature_center) - + Vector3.UP * (generator.elevated_cliff_level_height * 2.0) - ))) var generated := generator.get_generated_chunks_root() assert(generated != null) @@ -1016,7 +808,7 @@ func _validate_elevated_cliff_feature( var overlay_mesh := TerrainChunkAnalyzer.find_primary_mesh( overlay, ( - &"chunk_0010" + &"chunk_0015" if stable_id in [ &"chunk_9999", &"chunk_9998", @@ -1151,10 +943,6 @@ func _validate_prop_catalog(region: GeneratedWorldRegion) -> void: assert(instance.position.is_zero_approx()) assert(_find_mesh_instance(instance) != null) instance.free() - if definition.has_gatherable_surface(): - assert( - definition.gatherable_surface_clearance >= 0.12 - ) var mushroom := catalog.definition_for_id(&"prop_mushroom") assert(mushroom != null and mushroom.has_collision()) assert(mushroom.visual_offset.y < 0.0) @@ -1175,12 +963,10 @@ func _validate_prop_catalog(region: GeneratedWorldRegion) -> void: assert(pine != null) assert(pine.minimum_visual_scale < pine.maximum_visual_scale) assert(pine.material_variants.is_empty()) - assert(not pine.has_gatherable_surface()) var large_pine := catalog.definition_for_id(&"prop_pine_large") assert(large_pine != null) assert(large_pine.minimum_visual_scale < large_pine.maximum_visual_scale) assert(large_pine.material_variants.is_empty()) - assert(not large_pine.has_gatherable_surface()) var palm := catalog.definition_for_id(&"prop_palm") assert(palm != null) assert(is_equal_approx(palm.minimum_visual_scale, 0.5)) @@ -1191,25 +977,6 @@ func _validate_prop_catalog(region: GeneratedWorldRegion) -> void: assert(palm.maximum_cluster_radius > palm.minimum_cluster_radius) assert(palm.prefer_ocean_facing) assert(not palm.local_overhang_direction.is_zero_approx()) - var aligned_tree_collisions: Dictionary[StringName, Vector2] = { - &"prop_tree_1": Vector2(0.08, 0.01), - &"prop_tree_2": Vector2(0.1, 0.075), - &"prop_tree_3": Vector2(-0.1, 0.18), - &"prop_tree_large": Vector2(0.084, 0.504), - &"prop_pine": Vector2(-0.044, 0.083), - &"prop_pine_large": Vector2(-0.04, 0.075), - &"prop_palm": Vector2(0.15, -0.1), - } - for tree_id: StringName in aligned_tree_collisions: - var aligned_tree := catalog.definition_for_id(tree_id) - assert(aligned_tree != null and aligned_tree.has_cylinder_collision()) - var collision_center := Vector2( - aligned_tree.collision_offset.x, - aligned_tree.collision_offset.z, - ) - assert(collision_center.is_equal_approx( - aligned_tree_collisions[tree_id] - )) var forest := region.get_biome_catalog().definition_for_id(&"biome_forest") var forest_rule := forest.prop_rule_for_group(&"grass_tree") var large_tree := catalog.definition_for_id(&"prop_tree_large") @@ -1259,8 +1026,8 @@ func _validate_biome_catalog( for biome_id: StringName in EXPECTED_BIOME_IDS: assert(counts.get(biome_id, 0) > 0) var center := Vector2i( - int(float(generator.grid_size.x) / 2.0), - int(float(generator.grid_size.y) / 2.0), + generator.grid_size.x / 2, + generator.grid_size.y / 2, ) assert(region.get_biome_at(center) == &"biome_plains") for child: Node in generator.get_generated_chunks_root().get_children(): @@ -1278,8 +1045,6 @@ func _validate_decoration_transform( region: GeneratedWorldRegion, prop: Node3D, definition: TerrainPropDefinition, - grass_surface_triangles: Array[PackedVector3Array], - sand_surface_triangles: Array[PackedVector3Array], ) -> void: assert(prop != null) assert(prop.scale.is_equal_approx(Vector3.ONE)) @@ -1306,20 +1071,6 @@ func _validate_decoration_transform( or collision.shape is BoxShape3D ) assert(collision.global_basis.get_scale().is_equal_approx(Vector3.ONE)) - if collision.shape is CylinderShape3D: - var cylinder := collision.shape as CylinderShape3D - assert(is_equal_approx( - cylinder.radius, - definition.collision_radius * visual_scale, - )) - assert(is_equal_approx( - cylinder.height, - definition.collision_height * visual_scale, - )) - assert(collision.position.is_equal_approx( - definition.collision_offset * visual_scale - + Vector3.UP * cylinder.height * 0.5 - )) else: assert(collision == null) var query := PhysicsRayQueryParameters3D.create( @@ -1373,165 +1124,6 @@ func _validate_decoration_transform( ], ], ) - var required_surface_triangles: Array[PackedVector3Array] = ( - sand_surface_triangles - if definition.procedural_group == &"sand_tree" - else grass_surface_triangles - ) - var required_surface_height := _triangle_surface_height_at( - prop.global_position, - required_surface_triangles, - ) - assert( - required_surface_height > -INF - and absf(required_surface_height - prop.global_position.y) <= 0.01, - "%s (%s) is not rooted on its required terrain material at %s." - % [prop.name, definition.stable_id, prop.global_position], - ) - - -func _validate_crab_spawn_surfaces(region: GeneratedWorldRegion) -> void: - var brown := Gatherables.get_entry(&"crab_brown") - var blue := Gatherables.get_entry(&"crab_blue") - assert(brown != null and blue != null) - assert(is_equal_approx( - region.get_saltwater_surface_height(), - GeneratedWorldRegion.WATER_HEIGHT, - )) - var brown_minimum := maxf( - brown.minimum_surface_y, - GeneratedWorldRegion.WATER_HEIGHT + brown.waterline_margin, - ) - var blue_maximum := minf( - blue.maximum_surface_y, - GeneratedWorldRegion.WATER_HEIGHT - blue.waterline_margin, - ) - assert(brown_minimum > blue_maximum) - var brown_triangles := region.get_spawn_surface_triangles( - brown.surface_materials, - brown_minimum, - 0.6, - brown.maximum_surface_y, - ) - var blue_triangles := region.get_spawn_surface_triangles( - blue.surface_materials, - blue.minimum_surface_y, - 0.6, - blue_maximum, - ) - assert(not brown_triangles.is_empty()) - assert(not blue_triangles.is_empty()) - assert( - brown.target_population_for_surface_area( - _surface_triangle_area(brown_triangles) - ) > brown.population - ) - assert( - blue.target_population_for_surface_area( - _surface_triangle_area(blue_triangles) - ) > blue.population - ) - - -func _surface_triangle_area(triangles: Array[PackedVector3Array]) -> float: - var area := 0.0 - for triangle: PackedVector3Array in triangles: - area += (triangle[1] - triangle[0]).cross( - triangle[2] - triangle[0] - ).length() * 0.5 - return area - - -func _triangle_surface_height_at( - position: Vector3, - triangles: Array[PackedVector3Array], -) -> float: - var highest := -INF - var segment_start := position + Vector3.UP * 100.0 - var segment_end := position + Vector3.DOWN * 100.0 - for triangle: PackedVector3Array in triangles: - if triangle.size() != 3: - continue - var hit: Variant = Geometry3D.segment_intersects_triangle( - segment_start, - segment_end, - triangle[0], - triangle[1], - triangle[2], - ) - if hit is Vector3: - highest = maxf(highest, (hit as Vector3).y) - return highest - - -func _validate_water_recovery_positions( - region: GeneratedWorldRegion, - grass_triangles: Array[PackedVector3Array], - sand_triangles: Array[PackedVector3Array], -) -> void: - var fresh_water_root := region.get_node( - "WaterBodies/FreshWaterBodies" - ) as Node3D - assert(fresh_water_root != null and fresh_water_root.get_child_count() > 0) - var fresh_water := fresh_water_root.get_child(0) as WaterBodyAuthoring - assert(fresh_water != null) - var entry_position := fresh_water.global_position - var fallback_position := region.get_player_spawn_transform().origin - var recovery_position := region.get_water_recovery_position( - entry_position, - fallback_position, - ) - assert(recovery_position.is_finite()) - assert( - _horizontal_distance_squared(entry_position, recovery_position) - < _horizontal_distance_squared(entry_position, fallback_position), - "Fresh-water recovery returned the distant generated-world spawn.", - ) - assert( - recovery_position.y - > GeneratedWorldRegion.WATER_HEIGHT - + GeneratedWorldRegion.WATER_RECOVERY_MINIMUM_GROUND_CLEARANCE - ) - var recovery_triangles: Array[PackedVector3Array] = [] - recovery_triangles.append_array(grass_triangles) - recovery_triangles.append_array(sand_triangles) - var center_height := _triangle_surface_height_at( - recovery_position, - recovery_triangles, - ) - assert(center_height > -INF) - assert(absf(center_height - recovery_position.y) <= 0.01) - for direction: Vector2 in GeneratedWorldRegion.PROP_SURFACE_SAMPLE_DIRECTIONS: - var footprint_position := recovery_position + Vector3( - direction.x * GeneratedWorldRegion.WATER_RECOVERY_FOOTPRINT_RADIUS, - 0.0, - direction.y * GeneratedWorldRegion.WATER_RECOVERY_FOOTPRINT_RADIUS, - ) - var footprint_height := _triangle_surface_height_at( - footprint_position, - recovery_triangles, - ) - assert(footprint_height > -INF) - assert( - absf(footprint_height - recovery_position.y) - <= GeneratedWorldRegion.PROP_MAXIMUM_SUPPORT_HEIGHT_DIFFERENCE - ) - assert( - region.get_water_recovery_position( - entry_position, - fallback_position, - ).is_equal_approx(recovery_position) - ) - assert( - region.get_water_recovery_position( - Vector3(INF, 0.0, 0.0), - fallback_position, - ).is_equal_approx(fallback_position) - ) - - -func _horizontal_distance_squared(a: Vector3, b: Vector3) -> float: - return Vector2(a.x - b.x, a.z - b.z).length_squared() func _validate_tree_gatherable_anchors( @@ -1539,47 +1131,50 @@ func _validate_tree_gatherable_anchors( decorations: Node3D, anchors: GatherableAnchorSet3D, ) -> void: - var eligible_props: Dictionary[StringName, Node3D] = {} - var expected_anchor_count := 0 + var eligible_props: Array[Node3D] = [] for child: Node in decorations.get_children(): var prop := child as Node3D if prop == null: continue var prop_id := StringName(prop.get_meta(&"terrain_prop_id", &"")) var definition := region.get_prop_catalog().definition_for_id(prop_id) - var socket_count := _count_authored_beetle_sockets(prop) - if ( - definition != null - and definition.has_gatherable_surface() - and socket_count > 0 - ): - eligible_props[prop.name] = prop - expected_anchor_count += socket_count + if definition != null and definition.gatherable_anchor_height > 0.0: + eligible_props.append(prop) var positions := anchors.get_spawn_positions() - assert(positions.size() == expected_anchor_count) - assert(positions.size() >= 12) - for child: Node in anchors.get_children(): - var anchor := child as Marker3D - assert(anchor != null) - assert(bool(anchor.get_meta(&"authored_beetle_socket", false))) - var prop_name := StringName(anchor.get_meta(&"terrain_prop_name", &"")) - assert(eligible_props.has(prop_name)) - var prop: Node3D = eligible_props[prop_name] + assert(positions.size() == eligible_props.size()) + for prop: Node3D in eligible_props: var prop_id := StringName(prop.get_meta(&"terrain_prop_id", &"")) var definition := region.get_prop_catalog().definition_for_id(prop_id) - assert(definition != null and definition.has_gatherable_surface()) - var local_anchor := prop.to_local(anchor.global_position) - assert(prop_id != &"prop_palm") - assert(local_anchor.y >= 0.25 and local_anchor.y <= 2.0) - - -func _count_authored_beetle_sockets(root_node: Node) -> int: - var result := 0 - if String(root_node.name).to_lower().contains("beetle_socket"): - result += 1 - for child: Node in root_node.get_children(): - result += _count_authored_beetle_sockets(child) - return result + var visual_scale := float( + prop.get_meta(&"terrain_prop_visual_scale", 1.0) + ) + var nearest_anchor := Vector3(INF, INF, INF) + var nearest_distance_squared := INF + for position: Vector3 in positions: + var distance_squared := position.distance_squared_to( + prop.global_position + ) + if distance_squared < nearest_distance_squared: + nearest_distance_squared = distance_squared + nearest_anchor = position + assert(nearest_anchor.is_finite()) + var horizontal_distance := Vector2( + nearest_anchor.x - prop.global_position.x, + nearest_anchor.z - prop.global_position.z, + ).length() + assert( + horizontal_distance + >= definition.gatherable_anchor_surface_radius() * visual_scale + ) + assert( + absf( + nearest_anchor.y + - ( + prop.global_position.y + + definition.gatherable_anchor_height * visual_scale + ) + ) <= 0.001 + ) func _find_mesh_instance(root_node: Node) -> MeshInstance3D: @@ -1594,37 +1189,6 @@ func _find_mesh_instance(root_node: Node) -> MeshInstance3D: return null -func _first_foliage_wind_material(root_node: Node) -> ShaderMaterial: - var mesh_instance := root_node as MeshInstance3D - if mesh_instance != null and mesh_instance.mesh != null: - for surface_index: int in mesh_instance.mesh.get_surface_count(): - var material := mesh_instance.get_surface_override_material( - surface_index - ) as ShaderMaterial - if material != null and material.shader == FOLIAGE_WIND_SHADER: - return material - for child: Node in root_node.get_children(): - var found := _first_foliage_wind_material(child) - if found != null: - return found - return null - - -func _has_precipitation_occlusion_layer(root_node: Node) -> bool: - var mesh_instance := root_node as MeshInstance3D - if ( - mesh_instance != null - and mesh_instance.get_layer_mask_value( - PrecipitationOcclusionType.RENDER_LAYER_NUMBER - ) - ): - return true - for child: Node in root_node.get_children(): - if _has_precipitation_occlusion_layer(child): - return true - return false - - func _has_material_variant_override( root_node: Node, variants: Array[Material], @@ -1633,27 +1197,12 @@ func _has_material_variant_override( return false var mesh_instance := root_node as MeshInstance3D if mesh_instance != null and mesh_instance.mesh != null: - var source_materials: Dictionary = mesh_instance.get_meta( - FOLIAGE_WIND_SOURCE_MATERIALS_META, - {}, - ) for surface_index: int in mesh_instance.mesh.get_surface_count(): var override := mesh_instance.get_surface_override_material( surface_index ) if override != null and override in variants: return true - var wind_material := override as ShaderMaterial - if ( - wind_material != null - and wind_material.shader == FOLIAGE_WIND_SHADER - ): - var source_material: Material = source_materials.get( - surface_index, - null, - ) as Material - if source_material != null and source_material in variants: - return true for child: Node in root_node.get_children(): if _has_material_variant_override(child, variants): return true @@ -1791,60 +1340,6 @@ func _material_names(mesh_instance: MeshInstance3D) -> PackedStringArray: return result -func _validate_projected_terrain_materials(projected_root: Node) -> void: - var expected_sizes := { - "grass_lite": 1.75, - "sand": 2.6, - "dirt": 2.5, - } - var surface_counts := { - "grass_lite": 0, - "sand": 0, - "dirt": 0, - } - _validate_projected_material_node( - projected_root, - expected_sizes, - surface_counts, - ) - for material_name: String in expected_sizes: - assert(surface_counts[material_name] > 0) - - -func _validate_projected_material_node( - node: Node, - expected_sizes: Dictionary, - surface_counts: Dictionary, -) -> void: - var mesh_instance := node as MeshInstance3D - if mesh_instance != null and mesh_instance.mesh != null: - for surface_index: int in mesh_instance.mesh.get_surface_count(): - var material := mesh_instance.get_active_material(surface_index) - if material == null or not expected_sizes.has(material.resource_name): - continue - var shader_material := material as ShaderMaterial - assert(shader_material != null and shader_material.shader != null) - assert( - shader_material.shader.resource_path - == "res://world/materials/terrain_surface_projection.gdshader" - ) - assert( - is_equal_approx( - float(shader_material.get_shader_parameter( - &"tile_world_size" - )), - float(expected_sizes[material.resource_name]), - ) - ) - surface_counts[material.resource_name] += 1 - for child: Node in node.get_children(): - _validate_projected_material_node( - child, - expected_sizes, - surface_counts, - ) - - func _validate_pond_collision( region: GeneratedWorldRegion, pond: MeshInstance3D, @@ -1856,10 +1351,8 @@ func _validate_pond_collision( var vertices := arrays[Mesh.ARRAY_VERTEX] as PackedVector3Array var normals := arrays[Mesh.ARRAY_NORMAL] as PackedVector3Array var indices := arrays[Mesh.ARRAY_INDEX] as PackedInt32Array - var triangle_count: int = ( - int(float(indices.size()) / 3.0) - if not indices.is_empty() - else int(float(vertices.size()) / 3.0) + var triangle_count := ( + indices.size() / 3 if not indices.is_empty() else vertices.size() / 3 ) for triangle_index: int in triangle_count: var offset := triangle_index * 3 diff --git a/tests/home_spawn_multiplayer_validation.gd b/tests/home_spawn_multiplayer_validation.gd deleted file mode 100644 index d76533c..0000000 --- a/tests/home_spawn_multiplayer_validation.gd +++ /dev/null @@ -1,307 +0,0 @@ -extends SceneTree - -const MainScene: PackedScene = preload("res://main/main.tscn") -const TEST_PORT: int = 18222 - - -func _initialize() -> void: - call_deferred("_run") - - -func _run() -> void: - var arguments: PackedStringArray = OS.get_cmdline_user_args() - if arguments.has("host"): - await _run_host() - return - if arguments.has("client"): - await _run_client() - return - push_error("Home spawn validation needs host or client mode.") - quit(1) - - -func _run_host() -> void: - var main: Node = await _create_initialized_main() - var session := main.get_node("%NetworkSession") as NetworkSession - var network_home := main.get_node( - "%NetworkHomeService" - ) as NetworkHomeService - var home_world := main.get_node("%HomeWorldService") as HomeWorldService - var spawn_service := main.get_node( - "%PlayerSpawnService" - ) as PlayerSpawnService - var save_manager := main.get("_save_manager") as PlayerSaveManager - var home_state := main.get_node("%PlayerHomeState") as PlayerHomeState - assert(bool(main.call( - "_apply_world", WorldLayout.STARTER_ISLAND, 1, true - ))) - assert(bool(main.call( - "_prepare_host_world", WorldLayout.STARTER_ISLAND, 1 - ))) - assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND)) - assert(session.start_private_host(TEST_PORT)) - main.call("_enter_gameplay") - assert(session.set_host_open(true)) - - var host_fingerprint: String = session.get_local_identity_fingerprint() - assert(await _wait_for_home(network_home, host_fingerprint)) - var host_avatar: Player = spawn_service.get_avatar(1) - var host_spawn: Transform3D = home_world.get_exterior_spawn_transform( - host_fingerprint - ) - assert(_same_door_position(host_avatar.global_position, host_spawn.origin)) - assert(_faces_away_from_home(host_avatar, home_world, host_fingerprint)) - assert(network_home.request_enter(host_fingerprint)) - await physics_frame - host_avatar.global_position = home_world.get_interior_exit_position( - host_fingerprint - ) - assert(network_home.request_exit()) - await physics_frame - assert(_same_door_position(host_avatar.global_position, host_spawn.origin)) - assert(_faces_away_from_home(host_avatar, home_world, host_fingerprint)) - var upgrade_result_id := "home-test-upgrade" - network_home.authorize_home_upgrade( - session.get_local_peer_id(), - PlayerHomeState.STARTER_RV_TIER, - upgrade_result_id, - ) - assert(home_state.upgrade_to_next_tier()) - var rv_deadline: int = Time.get_ticks_msec() + 5000 - while ( - Time.get_ticks_msec() < rv_deadline - and home_world.get_interior_exit_positions(host_fingerprint).size() < 2 - ): - await process_frame - var rv_exits: Array[Vector3] = home_world.get_interior_exit_positions( - host_fingerprint - ) - assert(rv_exits.size() == 2) - network_home.finalize_home_upgrade( - session.get_local_peer_id(), upgrade_result_id, true - ) - assert(rv_exits[0].x < rv_exits[1].x) - for exit_position: Vector3 in rv_exits: - host_avatar.global_position = ( - exit_position - + home_world.get_interior_exit_direction_near( - host_fingerprint, exit_position - ) * 0.05 - ) - assert(home_world.has_avatar_crossed_interior_exit_threshold( - host_avatar, host_fingerprint - )) - host_avatar.global_position = rv_exits[0] + Vector3(0.0, 0.0, 1.1) - assert(not home_world.has_avatar_crossed_interior_exit_threshold( - host_avatar, host_fingerprint - )) - var presentations: Dictionary = home_world.get( - "_presentations_by_fingerprint" - ) - var host_presentation: Dictionary = presentations.get(host_fingerprint, {}) - var host_interior := host_presentation.get("interior") as Node3D - assert(host_interior != null) - var wall_collision := host_interior.find_child( - "WallWestCollision", true, false - ) as StaticBody3D - assert(wall_collision != null) - assert(bool(wall_collision.get_meta( - HomeWorldService.INTERIOR_SHELL_COLLISION_META, false - ))) - var wall_shape := wall_collision.get_child(0) as CollisionShape3D - assert(wall_shape != null) - assert((wall_shape.shape as ConcavePolygonShape3D).backface_collision) - host_avatar.global_position = host_spawn.origin - assert(network_home.request_enter(host_fingerprint)) - await physics_frame - - var remote_peer_id: int = await _wait_for_remote_peer(session) - assert(remote_peer_id > 1) - var remote_record := session.get_peer_record(remote_peer_id) - var remote_fingerprint: String = remote_record.identity_fingerprint - assert(await _wait_for_home(network_home, remote_fingerprint)) - var remote_avatar: Player = spawn_service.get_avatar(remote_peer_id) - assert(not remote_avatar.is_remote_presentation_visible()) - var chat_ui := main.get_node("%GameUI").get_node("%ChatUI") as ChatUI - chat_ui.call( - "_show_speech_bubble", remote_peer_id, "outside", remote_fingerprint - ) - var speech_states: Dictionary = chat_ui.get("_speech") - assert(not speech_states.has(remote_peer_id)) - var toolbar := main.get_node("%GameUI").get_node( - "%HomeDecorToolbar" - ) as HomeDecorToolbar - assert(toolbar.visible) - var exit_button := toolbar.find_child( - "ExitRVButton", true, false - ) as Button - assert(exit_button != null and exit_button.text == "Exit RV") - var storage := main.get_node("%GameUI").get_node( - "%PlayerStorage" - ) as PlayerStorage - assert(storage.open_storage_from_home(true)) - var close_storage_event := InputEventAction.new() - close_storage_event.action = &"interact" - close_storage_event.pressed = true - storage._unhandled_input(close_storage_event) - assert(not storage.visible) - exit_button.pressed.emit() - var exit_deadline: int = Time.get_ticks_msec() + 5000 - while ( - Time.get_ticks_msec() < exit_deadline - and not network_home.get_local_home_owner_fingerprint().is_empty() - ): - await process_frame - assert(network_home.get_local_home_owner_fingerprint().is_empty()) - var visibility_deadline: int = Time.get_ticks_msec() + 1000 - while ( - Time.get_ticks_msec() < visibility_deadline - and is_instance_valid(remote_avatar) - and not remote_avatar.is_remote_presentation_visible() - ): - await process_frame - assert(is_instance_valid(remote_avatar)) - assert(remote_avatar.is_remote_presentation_visible()) - chat_ui.call( - "_show_speech_bubble", remote_peer_id, "inside", remote_fingerprint - ) - speech_states = chat_ui.get("_speech") - assert(speech_states.has(remote_peer_id)) - chat_ui.call("_on_peer_removed", remote_peer_id) - var remote_spawn: Transform3D = home_world.get_exterior_spawn_transform( - remote_fingerprint - ) - assert(_same_door_position( - remote_avatar.global_position, remote_spawn.origin - )) - assert(_faces_away_from_home( - remote_avatar, home_world, remote_fingerprint - )) - - var disconnect_deadline: int = Time.get_ticks_msec() + 12000 - while ( - Time.get_ticks_msec() < disconnect_deadline - and session.is_authenticated_peer(remote_peer_id) - ): - await process_frame - assert(not session.is_authenticated_peer(remote_peer_id)) - print("Home spawn multiplayer host validation: PASS") - await _cleanup(main, session) - - -func _run_client() -> void: - var main: Node = await _create_initialized_main() - main.call( - "_on_title_join_game_requested", - "127.0.0.1:%d" % TEST_PORT, - ) - var session := main.get_node("%NetworkSession") as NetworkSession - var network_home := main.get_node( - "%NetworkHomeService" - ) as NetworkHomeService - var home_world := main.get_node("%HomeWorldService") as HomeWorldService - var deadline: int = Time.get_ticks_msec() + 20000 - while Time.get_ticks_msec() < deadline: - await process_frame - if session.state == NetworkSession.State.VERIFYING_SERVER_IDENTITY: - main.call("_confirm_server_trust") - if session.is_joined_client() and bool(main.get("_gameplay_started")): - break - assert(session.is_joined_client()) - var fingerprint: String = session.get_local_identity_fingerprint() - assert(await _wait_for_home(network_home, fingerprint)) - var player := main.get("_player") as Player - var exterior_spawn: Transform3D = ( - home_world.get_exterior_spawn_transform(fingerprint) - ) - deadline = Time.get_ticks_msec() + 5000 - while ( - Time.get_ticks_msec() < deadline - and not _same_door_position( - player.global_position, exterior_spawn.origin - ) - ): - await physics_frame - assert(_same_door_position( - player.global_position, exterior_spawn.origin - )) - assert(_faces_away_from_home(player, home_world, fingerprint)) - # Keep the peer present long enough for the host to rebuild the upgraded RV, - # exercise late-spawn visibility, and use the toolbar transition back to the - # shared world. A two-second grace period raced the host on slower machines. - await create_timer(10.0).timeout - print("Home spawn multiplayer client validation: PASS") - await _cleanup(main, session) - - -func _create_initialized_main() -> Node: - root.size = Vector2i(1280, 720) - var main: Node = MainScene.instantiate() - root.add_child(main) - for _frame: int in 4: - await process_frame - if not bool(main.get("_application_initialized")): - main.call("_activate_selected_data_path", "", true) - for _frame: int in 8: - await process_frame - assert(bool(main.get("_application_initialized"))) - return main - - -func _wait_for_home( - network_home: NetworkHomeService, - fingerprint: String, -) -> bool: - var deadline: int = Time.get_ticks_msec() + 10000 - while Time.get_ticks_msec() < deadline: - await process_frame - var manifests: Dictionary = network_home.get( - "_manifests_by_fingerprint" - ) - if manifests.has(fingerprint): - return true - return false - - -func _faces_away_from_home( - avatar: Player, - home_world: HomeWorldService, - fingerprint: String, -) -> bool: - var exterior_basis: Basis = home_world.get_exterior_transform( - fingerprint - ).basis - var outward_direction := exterior_basis.z - outward_direction.y = 0.0 - if outward_direction.is_zero_approx(): - return false - return avatar.get_facing_direction().dot( - outward_direction.normalized() - ) >= 0.99 - - -func _wait_for_remote_peer(session: NetworkSession) -> int: - var deadline: int = Time.get_ticks_msec() + 20000 - while Time.get_ticks_msec() < deadline: - await process_frame - for peer_id: int in session.get_authenticated_peer_ids(): - if peer_id != session.get_local_peer_id(): - return peer_id - return 0 - - -func _same_door_position(first: Vector3, second: Vector3) -> bool: - return ( - Vector2(first.x, first.z).distance_to(Vector2(second.x, second.z)) - < 0.08 - and absf(first.y - second.y) < 0.3 - ) - - -func _cleanup(main: Node, session: NetworkSession) -> void: - session.disconnect_session("") - main.queue_free() - for _frame: int in 4: - await process_frame - await create_timer(0.1).timeout - quit() diff --git a/tests/home_spawn_multiplayer_validation.gd.uid b/tests/home_spawn_multiplayer_validation.gd.uid deleted file mode 100644 index 06150f2..0000000 --- a/tests/home_spawn_multiplayer_validation.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bndtkip5p6xma diff --git a/tests/inventory_notepad_art_validation.gd b/tests/inventory_notepad_art_validation.gd index 505ade6..c42883c 100644 --- a/tests/inventory_notepad_art_validation.gd +++ b/tests/inventory_notepad_art_validation.gd @@ -666,7 +666,7 @@ func _to_screen_rect( func _capture_inventory_pages(player_menu: PlayerMenu) -> void: - if not OS.has_environment("straywild_NOTEPAD_CAPTURE"): + if not OS.has_environment("NETFISHING_NOTEPAD_CAPTURE"): return player_menu.visible = true var sections: Array[PlayerMenu.Section] = [ @@ -678,7 +678,7 @@ func _capture_inventory_pages(player_menu: PlayerMenu) -> void: player_menu.call("_show_section_immediate", sections[index]) await process_frame await process_frame - _save_capture(suffixes[index]) + await _save_capture(suffixes[index]) player_menu.call("_show_section_immediate", PlayerMenu.Section.BAG) var sale_confirmation := player_menu.get_node("%SaleConfirmation") as Control var confirmation_message := player_menu.get_node( @@ -693,14 +693,14 @@ func _capture_inventory_pages(player_menu: PlayerMenu) -> void: sale_confirmation.visible = true await process_frame await process_frame - _save_capture("sale-confirmation") + await _save_capture("sale-confirmation") sale_confirmation.visible = false func _save_capture(suffix: String) -> void: var image: Image = root.get_texture().get_image() var path: String = "%s-%s.png" % [ - OS.get_environment("straywild_NOTEPAD_CAPTURE"), + OS.get_environment("NETFISHING_NOTEPAD_CAPTURE"), suffix, ] assert(image.save_png(path) == OK) diff --git a/tests/job_system_validation.gd b/tests/job_system_validation.gd index 65b7164..1fe5ceb 100644 --- a/tests/job_system_validation.gd +++ b/tests/job_system_validation.gd @@ -21,17 +21,13 @@ func _run() -> void: assert(bool(main.get("_application_initialized"))) var session := main.get_node("%NetworkSession") as NetworkSession assert(session != null) - assert(bool(main.call( - "_apply_world", WorldLayout.STARTER_ISLAND, 1, true - ))) - assert(session.set_host_world(WorldLayout.STARTER_ISLAND, 1)) var occupied_port := PacketPeerUDP.new() assert(occupied_port.bind(18137, "127.0.0.1") == OK) assert(session.start_private_host(18137, 3)) assert(session.get_host_port() == 18138) occupied_port.close() var save_manager := main.get("_save_manager") as PlayerSaveManager - assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND)) + assert(save_manager.initialize_new_game()) main.call("_enter_gameplay") await physics_frame await physics_frame @@ -209,11 +205,8 @@ func _run() -> void: ) assert(bool(decoded.get("ok", false))) var save_data: Dictionary = decoded["data"] - assert(int(save_data.get("save_version", -1)) == 11) + assert(int(save_data.get("save_version", -1)) == 10) assert(PlayerJobService.validate_save_data(save_data.get("jobs", {}))) - assert(not PlayerHomeState.sanitize_save_data( - save_data.get("home", {}) - ).is_empty()) _validate_pause_session_switch(main, session) main.queue_free() diff --git a/tests/keyboard_mouse_mapping_validation.gd b/tests/keyboard_mouse_mapping_validation.gd index 112c7e9..db0bb71 100644 --- a/tests/keyboard_mouse_mapping_validation.gd +++ b/tests/keyboard_mouse_mapping_validation.gd @@ -38,18 +38,6 @@ func _run() -> void: KeyboardMouseMappingManagerType.ROLE_INTERACT ) == "e" ) - var zoom_in_label: String = str( - KeyboardMouseMappingManagerType.ROLE_LABELS[ - KeyboardMouseMappingManagerType.ROLE_CAMERA_ZOOM_IN - ] - ) - var zoom_out_label: String = str( - KeyboardMouseMappingManagerType.ROLE_LABELS[ - KeyboardMouseMappingManagerType.ROLE_CAMERA_ZOOM_OUT - ] - ) - assert(zoom_in_label == "hotbar select (+SHIFT to zoom)") - assert(zoom_out_label == "hotbar select (+SHIFT to zoom)") assert( str(defaults[ str(KeyboardMouseMappingManagerType.ROLE_PRIMARY_ACTION) diff --git a/tests/late_join_multiplayer_validation.gd b/tests/late_join_multiplayer_validation.gd index aaaa343..3813486 100644 --- a/tests/late_join_multiplayer_validation.gd +++ b/tests/late_join_multiplayer_validation.gd @@ -90,12 +90,11 @@ func _run_first_client() -> void: player.toggle_sitting() assert(player.is_sitting()) assert(player.bag.add_item(&"crab_net")) - # Slot zero begins selected with the starter rod. Replacing that slot does - # not emit a selection change, so use the next slot to exercise the same - # equipped-item path a player uses in normal gameplay. - assert(player.hotbar.assign_item(1, &"crab_net")) - assert(player.hotbar.select_slot(1)) - assert(await _wait_for_local_net(main, player)) + assert(player.hotbar.assign_item(0, &"crab_net")) + assert(player.hotbar.select_slot(0)) + for _frame: int in 2: + await process_frame + assert(bool(player.get("_active_item_is_net"))) assert(player.begin_animation_action(ACTIVE_ACTION)) await create_timer(0.5).timeout assert(StringName(str(player.get("_animation_action_id"))) == ACTIVE_ACTION) @@ -186,29 +185,6 @@ func _wait_for_registry_size(session: NetworkSession, expected: int) -> bool: return false -func _wait_for_local_net(main: Node, player: Player) -> bool: - var deadline: int = Time.get_ticks_msec() + 10000 - while Time.get_ticks_msec() < deadline: - # A joined client can finish its world transition one frame after the - # hotbar selection signal. Refresh through the production path until the - # ready fishing state accepts the equipped item. - main.call("_refresh_active_hotbar_item") - await process_frame - if bool(player.get("_active_item_is_net")): - return true - var fishing_spot: Node = main.get_node("%FishingSpot") - print( - "net equip wait timed out: ", - { - "fishing_state": int(fishing_spot.get("state")), - "selected_slot": player.hotbar.get_selected_slot(), - "selected_item": String(player.hotbar.get_selected_item_id()), - "owns_net": player.bag.owns_item(&"crab_net"), - }, - ) - return false - - func _history_contains(service: NetworkChatService, body: String) -> bool: return service.get_history().any( func(message: Dictionary) -> bool: @@ -293,25 +269,25 @@ func _wait_for_avatar_sitting( var deadline: int = Time.get_ticks_msec() + 10000 while Time.get_ticks_msec() < deadline: await process_frame - var observed_avatar: Player = spawn_service.get_avatar(peer_id) - if observed_avatar != null and observed_avatar.is_sitting() == expected: + var avatar: Player = spawn_service.get_avatar(peer_id) + if avatar != null and avatar.is_sitting() == expected: return true - var timed_out_avatar: Player = spawn_service.get_avatar(peer_id) - if timed_out_avatar != null: + var avatar: Player = spawn_service.get_avatar(peer_id) + if avatar != null: print( "sitting wait timed out: ", { "peer_id": peer_id, "expected": expected, - "sitting": timed_out_avatar.is_sitting(), - "sit_after_landing": bool(timed_out_avatar.get("_sit_after_landing")), - "on_floor": timed_out_avatar.is_on_floor(), - "position": timed_out_avatar.global_position, - "velocity": timed_out_avatar.velocity, - "authoritative": bool(timed_out_avatar.get( + "sitting": avatar.is_sitting(), + "sit_after_landing": bool(avatar.get("_sit_after_landing")), + "on_floor": avatar.is_on_floor(), + "position": avatar.global_position, + "velocity": avatar.velocity, + "authoritative": bool(avatar.get( "_network_authoritative_simulation" )), - "last_input": int(timed_out_avatar.get( + "last_input": int(avatar.get( "_last_network_input_sequence" )), }, diff --git a/tests/light_performance_profile_validation.gd b/tests/light_performance_profile_validation.gd index 2a06fc9..f56db35 100644 --- a/tests/light_performance_profile_validation.gd +++ b/tests/light_performance_profile_validation.gd @@ -4,9 +4,6 @@ const MainScene: PackedScene = preload("res://main/main.tscn") const RuntimePerformanceProfileType = preload( "res://main/runtime_performance_profile.gd" ) -const FOLIAGE_WIND_SHADER: Shader = preload( - "res://world/materials/foliage_wind.gdshader" -) func _initialize() -> void: call_deferred("_run") @@ -33,11 +30,8 @@ func _run() -> void: PlayerSaveManager.DEFAULT_WORLD_SEED, true, ))) - # A regular editor/desktop runtime must ignore a light-profile environment - # variable. Only the tagged PortMaster export is allowed to honor it. - _validate_normal_profile(main) - _validate_rain_visual_motion(main) - _validate_new_game_music_transition(main) + _validate_main_profile(main) + _validate_minimal_weather(main) _stop_audio_players(main) main.queue_free() for _frame: int in 8: @@ -45,7 +39,28 @@ func _run() -> void: OS.unset_environment( RuntimePerformanceProfileType.PROFILE_ENVIRONMENT_VARIABLE ) - print("Runtime performance profile validation: PASS") + var normal_main: Node = MainScene.instantiate() + root.add_child(normal_main) + for _frame: int in 4: + await process_frame + if not bool(normal_main.get("_application_initialized")): + normal_main.call("_activate_selected_data_path", "", true) + for _frame: int in 8: + await process_frame + assert(bool(normal_main.get("_application_initialized"))) + assert(bool(normal_main.call( + "_apply_world", + WorldLayout.GENERATED, + PlayerSaveManager.DEFAULT_WORLD_SEED, + true, + ))) + _validate_normal_profile(normal_main) + _validate_new_game_music_transition(normal_main) + _stop_audio_players(normal_main) + normal_main.queue_free() + for _frame: int in 8: + await process_frame + print("Light performance profile validation: PASS") quit() @@ -58,31 +73,68 @@ func _validate_profile_resolution() -> void: assert(light.is_light()) assert(is_equal_approx(light.get_world_render_scale(), 0.375)) assert(legacy.is_light()) - OS.set_environment( - RuntimePerformanceProfileType.PROFILE_ENVIRONMENT_VARIABLE, - "light", + + +func _validate_main_profile(main: Node) -> void: + var profile: RuntimePerformanceProfile = main.get("_performance_profile") + assert(profile != null and profile.is_light()) + assert(is_equal_approx(root.scaling_3d_scale, 0.375)) + var pixelation: Node = main.get_node("%WorldPixelationPostprocess") + assert(bool(pixelation.call("is_light_performance_profile"))) + pixelation.call("set_gameplay_active", true) + var screen_grid := pixelation.get_node("ScreenGrid") as ColorRect + assert(screen_grid != null and not screen_grid.visible) + + var pond := _first_fresh_water_visual(main) + var ocean := main.get_node( + "TestWorld/Regions/GeneratedWorldRegion/WaterBodies/OceanWater/VisualWater" + ) as MeshInstance3D + assert(not pond.visible) + assert(ocean.material_override is StandardMaterial3D) + assert(not ocean.material_override is ShaderMaterial) + _validate_ocean_fishing_coverage(main, ocean) + var region := main.get_node( + "TestWorld/Regions/GeneratedWorldRegion" + ) as GeneratedWorldRegion + assert(region != null) + assert(region.get_node("Decorations").get_child_count() > 0) + + var title_background := main.get_node("%TitleBackground") as ColorRect + var title_material := title_background.material as ShaderMaterial + assert(title_material != null) + assert(not bool(title_material.get_shader_parameter( + "animation_enabled" + ))) + for backdrop_name: StringName in [ + &"PlayerMenuBackdrop", + &"ShopBackdrop", + ]: + var backdrop := main.get_node("%%%s" % backdrop_name) as ColorRect + var backdrop_material := backdrop.material as ShaderMaterial + assert(backdrop_material != null) + assert(not bool(backdrop_material.get_shader_parameter( + "animation_enabled" + ))) + assert( + backdrop_material.get_shader_parameter( + "scroll_velocity_pixels" + ) == Vector2.ZERO + ) + var game_ui := main.get_node("%GameUI") as GameUI + var title_screen := game_ui.get_title_screen() + assert(title_screen != null) + assert(not title_screen.is_decorative_presentation_active()) + var player_menu := game_ui.get("_player_menu") as PlayerMenu + assert(player_menu != null) + assert(not player_menu.is_cooler_water_effect_enabled()) + assert((main.get_node("%TitleMusic") as AudioStreamPlayer).stream != null) + assert((main.get_node("%NewGameMusic") as AudioStreamPlayer).stream != null) + assert((main.get_node("%DuskMusic") as AudioStreamPlayer).stream != null) + assert( + (main.get_node("%WavesAudio") as AudioStreamPlayer).stream == null ) - assert(not RuntimePerformanceProfileType.from_environment_for_portmaster_build( - false - ).is_light()) - assert(RuntimePerformanceProfileType.from_environment_for_portmaster_build( - true - ).is_light()) - OS.unset_environment( - RuntimePerformanceProfileType.PROFILE_ENVIRONMENT_VARIABLE - ) - OS.set_environment( - RuntimePerformanceProfileType.LEGACY_LIGHT_ENVIRONMENT_VARIABLE, - "1", - ) - assert(not RuntimePerformanceProfileType.from_environment_for_portmaster_build( - false - ).is_light()) - assert(RuntimePerformanceProfileType.from_environment_for_portmaster_build( - true - ).is_light()) - OS.unset_environment( - RuntimePerformanceProfileType.LEGACY_LIGHT_ENVIRONMENT_VARIABLE + assert( + (main.get_node("RainAmbience") as AudioStreamPlayer).stream == null ) @@ -107,6 +159,8 @@ func _validate_normal_profile(main: Node) -> void: var game_ui := main.get_node("%GameUI") as GameUI var title_screen := game_ui.get_title_screen() assert(title_screen != null) + assert(title_screen.is_decorative_presentation_active()) + assert(title_screen.is_decorative_bubble_scheduler_active()) var player_menu := game_ui.get("_player_menu") as PlayerMenu assert(player_menu != null) assert(player_menu.is_cooler_water_effect_enabled()) @@ -115,7 +169,21 @@ func _validate_normal_profile(main: Node) -> void: var title_material := title_background.material as ShaderMaterial assert(title_material != null) assert(bool(title_material.get_shader_parameter("animation_enabled"))) - _validate_no_full_screen_menu_backdrops(main) + for backdrop_name: StringName in [ + &"PlayerMenuBackdrop", + &"ShopBackdrop", + ]: + var backdrop := main.get_node("%%%s" % backdrop_name) as ColorRect + var backdrop_material := backdrop.material as ShaderMaterial + assert(backdrop_material != null) + assert(bool(backdrop_material.get_shader_parameter( + "animation_enabled" + ))) + assert( + backdrop_material.get_shader_parameter( + "scroll_velocity_pixels" + ) != Vector2.ZERO + ) var visuals: WorldTimeVisualController = main.get_node( "%WorldTimeVisualController" ) @@ -131,59 +199,14 @@ func _validate_normal_profile(main: Node) -> void: assert((main.get_node("%TitleMusic") as AudioStreamPlayer).stream != null) assert((main.get_node("%NewGameMusic") as AudioStreamPlayer).stream != null) assert((main.get_node("%DuskMusic") as AudioStreamPlayer).stream != null) + assert( + (main.get_node("%WavesAudio") as AudioStreamPlayer).stream != null + ) assert( (main.get_node("RainAmbience") as AudioStreamPlayer).stream != null ) -func _validate_rain_visual_motion(main: Node) -> void: - var region := main.get_node( - "TestWorld/Regions/GeneratedWorldRegion" - ) as GeneratedWorldRegion - assert(region != null) - var ocean_motion := region.get_node( - "WaterBodies/OceanWater/VisualWater" - ) as WaterSurfaceMotion - assert(ocean_motion != null) - var normal_water_amplitude: float = ocean_motion.get_effective_amplitude() - var decorations := region.get_node("Decorations") as Node3D - assert(decorations != null) - var normal_wind := _first_foliage_wind_material(decorations) - assert(normal_wind != null) - var normal_wind_strength: float = float( - normal_wind.get_shader_parameter("local_wind_strength") - ) - var weather := main.get_node("%WorldWeatherService") as WorldWeatherService - assert(weather != null) - weather.apply_authoritative_snapshot( - WorldWeatherService.Weather.RAINY, - 60.0, - ) - assert(is_equal_approx( - ocean_motion.get_effective_amplitude(), - normal_water_amplitude * 2.0, - )) - var rainy_wind := _first_foliage_wind_material(decorations) - assert(rainy_wind != null) - assert(is_equal_approx( - float(rainy_wind.get_shader_parameter("local_wind_strength")), - normal_wind_strength * 2.0, - )) - weather.apply_authoritative_snapshot( - WorldWeatherService.Weather.SUNNY, - 60.0, - ) - assert(is_equal_approx( - ocean_motion.get_effective_amplitude(), normal_water_amplitude - )) - var restored_wind := _first_foliage_wind_material(decorations) - assert(restored_wind != null) - assert(is_equal_approx( - float(restored_wind.get_shader_parameter("local_wind_strength")), - normal_wind_strength, - )) - - func _validate_new_game_music_transition(main: Node) -> void: var title_music := main.get_node("%TitleMusic") as AudioStreamPlayer var new_game_music := main.get_node("%NewGameMusic") as AudioStreamPlayer @@ -196,33 +219,12 @@ func _validate_new_game_music_transition(main: Node) -> void: assert(title_music.playing) -func _validate_no_full_screen_menu_backdrops(main: Node) -> void: - assert(main.get_node_or_null("%PlayerMenuBackdrop") == null) - assert(main.get_node_or_null("%ShopBackdrop") == null) - - func _first_fresh_water_visual(main: Node) -> MeshInstance3D: - var fresh_water_root := main.get_node( + var root := main.get_node( "TestWorld/Regions/GeneratedWorldRegion/WaterBodies/FreshWaterBodies" ) as Node3D - assert(fresh_water_root != null and fresh_water_root.get_child_count() > 0) - return fresh_water_root.get_child(0).get_node("VisualWater") as MeshInstance3D - - -func _first_foliage_wind_material(root_node: Node) -> ShaderMaterial: - for node: Node in root_node.find_children( - "*", "MeshInstance3D", true, false - ): - var mesh_instance := node as MeshInstance3D - if mesh_instance == null or mesh_instance.mesh == null: - continue - for surface_index: int in mesh_instance.mesh.get_surface_count(): - var material := mesh_instance.get_surface_override_material( - surface_index - ) as ShaderMaterial - if material != null and material.shader == FOLIAGE_WIND_SHADER: - return material - return null + assert(root != null and root.get_child_count() > 0) + return root.get_child(0).get_node("VisualWater") as MeshInstance3D func _validate_ocean_fishing_coverage( @@ -254,3 +256,41 @@ func _stop_audio_players(root_node: Node) -> void: (root_node as AudioStreamPlayer3D).stop() for child: Node in root_node.get_children(): _stop_audio_players(child) + + +func _validate_minimal_weather(main: Node) -> void: + var visuals: WorldTimeVisualController = main.get_node( + "%WorldTimeVisualController" + ) + var rain := visuals.get_node("LocalRain") as GPUParticles3D + assert(rain.amount == WorldTimeVisualController.LIGHT_RAIN_PARTICLE_AMOUNT) + assert(rain.fixed_fps == WorldTimeVisualController.LIGHT_RAIN_FIXED_FPS) + assert(rain.amount == 48) + assert(rain.fixed_fps == 8) + var clouds := visuals.get_node("LocalStormClouds") as LocalStormCloudLayer + assert(clouds.get_patch_count() == 1) + var ceiling := clouds.get_node("CloudCeiling") as MeshInstance3D + assert(ceiling != null and ceiling.mesh is PlaneMesh) + assert(ceiling.material_override == null) + assert((ceiling.mesh as PlaneMesh).material is StandardMaterial3D) + + visuals.apply_weather_immediately(WorldWeatherService.Weather.RAINY) + assert(rain.emitting and rain.amount_ratio > 0.99) + assert(clouds.visible and clouds.get_storm_amount() > 0.87) + var cloud_material := ( + (ceiling.mesh as PlaneMesh).material as StandardMaterial3D + ) + assert(cloud_material.albedo_color.a < 0.65) + var test_world := main.get_node("TestWorld") as TestWorld + var runtime_environment := ( + test_world.get_world_environment().environment as Environment + ) + var sky_material := ( + runtime_environment.sky.sky_material as ShaderMaterial + ) + assert(is_zero_approx(float( + sky_material.get_shader_parameter("cloud_coverage") + ))) + assert(is_zero_approx(float( + sky_material.get_shader_parameter("cloud_opacity") + ))) diff --git a/tests/logbook_runtime_validation.gd b/tests/logbook_runtime_validation.gd index 7fc2311..e411fef 100644 --- a/tests/logbook_runtime_validation.gd +++ b/tests/logbook_runtime_validation.gd @@ -2,7 +2,6 @@ extends SceneTree const MainScene = preload("res://main/main.tscn") const FishCatchType = preload("res://fish/fish_catch.gd") -const MENU_TRANSITION_SETTLE_SECONDS := 3.0 func _initialize() -> void: @@ -35,78 +34,47 @@ func _run() -> void: var game_ui := main.get_node("%GameUI") as GameUI var player_menu := game_ui.get_node("%PlayerMenu") as PlayerMenu var logbook := player_menu.get_node("%CatalogLogbook") as LogbookPage + var backdrop := main.get_node("%PlayerMenuBackdrop") as ColorRect var hotbar := game_ui.get_node("%Hotbar") as Control - var fishing_spot := main.get("_fishing_spot") as FishingSpot - assert(logbook.get("_fishing_spot") == fishing_spot) - assert(logbook.get("_world_time") == main.get("_world_time")) - assert(logbook.get("_world_weather") == main.get("_world_weather")) var shortcut := InputEventKey.new() shortcut.pressed = true shortcut.physical_keycode = KEY_L assert(bool(player_menu.call("_handle_direct_page_shortcut", shortcut))) - await create_timer(MENU_TRANSITION_SETTLE_SECONDS).timeout + await create_timer(2.2).timeout assert(player_menu.visible) assert(logbook.visible) - assert(main.get_node_or_null("%PlayerMenuBackdrop") == null) + assert(backdrop.visible) assert(not bool(game_ui.get("_player_menu_hotbar_visible"))) assert(not hotbar.visible) var entry_buttons: Dictionary = logbook.get("_entry_buttons") - assert(entry_buttons.size() == 108) + assert(entry_buttons.size() == 26) await _capture_if_requested("-unknown") - logbook.call("_set_index_open", true, false) - await process_frame - assert(bool(logbook.get("_index_open"))) - assert((logbook.get("_index_body") as Control).visible) - await _capture_if_requested("-index") - logbook.set_compact_presentation(true) - await process_frame - await _capture_if_requested("-index-compact") - logbook.set_compact_presentation(false) - await process_frame - logbook.call("_set_index_open", false, false) - await process_frame logbook.call( "_select_category", WaterType.Type.FRESH_WATER ) await create_timer(0.25).timeout - assert((logbook.get("_entry_buttons") as Dictionary).size() == 108) + assert((logbook.get("_entry_buttons") as Dictionary).size() == 26) await _capture_if_requested("-fresh") logbook.call("_select_category", WaterType.Type.SALT_WATER) await create_timer(0.25).timeout - assert((logbook.get("_entry_buttons") as Dictionary).size() == 202) + assert((logbook.get("_entry_buttons") as Dictionary).size() == 34) logbook.call("_select_category", WaterType.Type.FRESH_WATER) await create_timer(0.25).timeout - assert((logbook.get("_entry_buttons") as Dictionary).size() == 108) + assert((logbook.get("_entry_buttons") as Dictionary).size() == 26) player.collection_log.mark_discovered(&"bluegill") await process_frame logbook.call("_select_entry", &"bluegill", &"bluegill") await create_timer(0.2).timeout await _capture_if_requested("-known") - var bluegill := ( - main.get("fish_catalog") as FishPool - ).get_fish_by_id(&"bluegill") - var bluegill_available_now := fishing_spot.is_species_available_now(bluegill) - var index_options := logbook.get("_index_options") as Dictionary - index_options["availability"] = ( - LogbookCatalog.AvailabilityFilter.AVAILABLE_NOW - ) - logbook.notify_availability_context_changed() - await process_frame - assert( - (logbook.get("_entry_buttons") as Dictionary).has(&"bluegill") - == bluegill_available_now - ) - logbook.call("_reset_index") - await process_frame assert(bool(player_menu.call("_handle_direct_page_shortcut", shortcut))) - await create_timer(MENU_TRANSITION_SETTLE_SECONDS).timeout + await create_timer(2.2).timeout assert(not player_menu.visible) assert(bool(player_menu.call("_handle_direct_page_shortcut", shortcut))) - await create_timer(MENU_TRANSITION_SETTLE_SECONDS).timeout + await create_timer(2.2).timeout player_menu.call( "_show_section_immediate", PlayerMenu.Section.PROFILE ) @@ -142,38 +110,23 @@ func _validate_save_round_trip( assert(catalog != null) assert(catalog.candidates.size() == 316) var active_species := LogbookCatalog.ordered_species(catalog.candidates) - assert(active_species.size() == 314) - # Keep this runtime save fixture within maximum player capacity while the - # focused catalog validation exercises every active species individually. - var round_trip_species: Array[FishData] = [] - for fish: FishData in active_species: - if round_trip_species.size() >= 59: - break - round_trip_species.append(fish) - for fish_id: StringName in [ - &"catfish_blue", - &"catfish_channel", - &"catfish_flathead", - &"catfish_white", - ]: - var catfish: FishData = catalog.get_fish_by_id(fish_id) - if catfish not in round_trip_species: - round_trip_species.append(catfish) - assert(round_trip_species.size() == 63) + assert(active_species.size() == 63) + # This test intentionally round-trips one catch for every active species. + # Give the fixture enough combined capacity, then bypass per-catch carried + # inventory admission while constructing it. The inventory layout still + # reconciles and persists the resulting placements. player.inventory_layout.restore_backpack_level( PlayerInventoryLayout.MAX_BACKPACK_LEVEL ) - var home_state := main.get("_home_state") as PlayerHomeState - assert(home_state != null) - assert(home_state.upgrade_to_next_tier()) + player.cooler_capacity.restore_level(PlayerCoolerCapacity.MAX_LEVEL) assert( player.inventory_layout.get_backpack_level() == PlayerInventoryLayout.MAX_BACKPACK_LEVEL ) - assert(player.cooler_capacity.get_capacity() == 18) + assert(player.cooler_capacity.get_level() == PlayerCoolerCapacity.MAX_LEVEL) player.inventory.set_inventory_layout(null) for index: int in 4: - _add_test_catch(player, round_trip_species[index]) + _add_test_catch(player, active_species[index]) assert(save_manager.save_now()) var no_catches: Array[FishCatch] = [] var no_discoveries: Array[StringName] = [] @@ -182,21 +135,18 @@ func _validate_save_round_trip( assert(save_manager.load_player_data()) assert(player.inventory.get_all_catches().size() == 4) for index: int in 4: - var original_fish: FishData = round_trip_species[index] + var original_fish: FishData = active_species[index] assert(player.inventory.get_count(original_fish.id) == 1) assert(player.collection_log.has_discovered(original_fish.id)) - for index: int in range(4, round_trip_species.size()): - _add_test_catch(player, round_trip_species[index]) + for index: int in range(4, active_species.size()): + _add_test_catch(player, active_species[index]) assert(save_manager.save_now()) assert(player.inventory.replace_all_catches(no_catches, 1)) assert(player.collection_log.replace_discovered_ids(no_discoveries)) assert(save_manager.load_player_data()) - assert( - player.inventory.get_all_catches().size() - == round_trip_species.size() - ) - for fish: FishData in round_trip_species: + assert(player.inventory.get_all_catches().size() == 63) + for fish: FishData in active_species: assert(player.inventory.get_count(fish.id) == 1) assert(player.collection_log.has_discovered(fish.id)) for fish_id: StringName in [ @@ -235,13 +185,13 @@ func _add_test_catch(player: Player, fish: FishData) -> void: func _capture_if_requested(suffix: String) -> void: - if not OS.has_environment("straywild_LOGBOOK_CAPTURE"): + if not OS.has_environment("NETFISHING_LOGBOOK_CAPTURE"): return await process_frame await process_frame var image: Image = root.get_texture().get_image() var path: String = ( - OS.get_environment("straywild_LOGBOOK_CAPTURE") + OS.get_environment("NETFISHING_LOGBOOK_CAPTURE") + suffix + ".png" ) diff --git a/tests/logbook_validation.gd b/tests/logbook_validation.gd index 941fbe6..7eca559 100644 --- a/tests/logbook_validation.gd +++ b/tests/logbook_validation.gd @@ -17,19 +17,17 @@ const CatalogResource: FishPoolType = preload( "res://fish/pools/fish_catalog.tres" ) -var _query_available_id: StringName - func _initialize() -> void: call_deferred("_run") func _run() -> void: - if OS.has_environment("straywild_TEST_CREATE_ROOT"): + if OS.has_environment("NETFISHING_TEST_CREATE_ROOT"): var data_root := PlayerDataRoot.new() root.add_child(data_root) var result: Dictionary = data_root.create_unbound_root( - OS.get_environment("straywild_TEST_CREATE_ROOT") + OS.get_environment("NETFISHING_TEST_CREATE_ROOT") ) assert(bool(result.get("ok", false))) data_root.queue_free() @@ -37,7 +35,6 @@ func _run() -> void: quit() return _validate_catalog() - _validate_catalog_query() await _validate_page() print("Logbook validation: PASS") quit() @@ -46,7 +43,7 @@ func _run() -> void: func _validate_catalog() -> void: assert(CatalogResource.candidates.size() == 316) var ordered := LogbookCatalog.ordered_species(CatalogResource.candidates) - assert(ordered.size() == 314) + assert(ordered.size() == 63) var previous_number: int = 0 var catalog_numbers: Dictionary[int, bool] = {} for fish: FishDataType in CatalogResource.candidates: @@ -71,348 +68,6 @@ func _validate_catalog() -> void: ) -func _validate_catalog_query() -> void: - var collection := CollectionLogType.new() - var inventory := FishInventoryType.new() - var fresh_species: Array[FishDataType] = [] - for fish: FishDataType in LogbookCatalog.ordered_species( - CatalogResource.candidates - ): - if LogbookCatalog.category_for(fish) == LogbookCatalog.Category.FRESH_WATER: - fresh_species.append(fish) - assert(fresh_species.size() == 108) - var first := fresh_species[0] - var second := fresh_species[1] - var unknown := fresh_species[2] - for quality: int in FishQualityType.TIER_COUNT: - collection.record_catch(first.id, quality) - collection.record_catch(second.id, FishQualityType.Tier.BORING) - var held := _make_test_catch(first, true) - assert(inventory.add_catch(held)) - - var options := _default_query_options() - options["show"] = LogbookCatalog.DiscoveryFilter.CAUGHT - var filtered := LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(filtered.size() == 2) - assert(first in filtered and second in filtered) - - options["show"] = LogbookCatalog.DiscoveryFilter.MISSING - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(filtered.size() == fresh_species.size() - 2) - options["sort"] = LogbookCatalog.SortMode.CATALOG_NUMBER - options["descending"] = true - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(filtered.front() == fresh_species.back()) - assert(filtered.back() == unknown) - - options["show"] = LogbookCatalog.DiscoveryFilter.INCOMPLETE - options["descending"] = false - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(filtered == [second]) - - options = _default_query_options() - options["show"] = LogbookCatalog.DiscoveryFilter.CAUGHT - options["sort"] = LogbookCatalog.SortMode.CATCH_COUNT - options["descending"] = true - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(filtered == [first, second]) - - options = _default_query_options() - options["search"] = unknown.display_name - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(filtered.is_empty()) - options["search"] = str(unknown.catalog_number) - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(filtered == [unknown]) - - options = _default_query_options() - options["holding"] = LogbookCatalog.HoldingFilter.FAVORITED - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(filtered == [first]) - options["holding"] = LogbookCatalog.HoldingFilter.IN_COOLER - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(filtered == [first]) - - options = _default_query_options() - options["show"] = LogbookCatalog.DiscoveryFilter.CAUGHT - options["group"] = String(first.collection_group) - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(first in filtered) - for fish: FishDataType in filtered: - assert(fish.collection_group == first.collection_group) - - options = _default_query_options() - options["show"] = LogbookCatalog.DiscoveryFilter.CAUGHT - options["rarity"] = ( - int(first.rarity) + LogbookCatalog.RarityFilter.COMMON - ) - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(first in filtered) - for fish: FishDataType in filtered: - assert(fish.rarity == first.rarity) - - options = _default_query_options() - options["show"] = LogbookCatalog.DiscoveryFilter.CAUGHT - options["method"] = ( - int(first.collection_method) + LogbookCatalog.MethodFilter.FISHING - ) - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(first in filtered) - for fish: FishDataType in filtered: - assert(fish.collection_method == first.collection_method) - - var first_season := -1 - for season: int in 4: - if first.is_available_in_season(season): - first_season = season - break - assert(first_season >= 0) - options = _default_query_options() - options["show"] = LogbookCatalog.DiscoveryFilter.CAUGHT - options["season"] = ( - first_season + LogbookCatalog.SeasonFilter.SPRING - ) - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(first in filtered) - for fish: FishDataType in filtered: - assert(fish.is_available_in_season(first_season)) - - var first_is_available_by_day := ( - first.availability == null or first.availability.allow_day - ) - options = _default_query_options() - options["show"] = LogbookCatalog.DiscoveryFilter.CAUGHT - options["time"] = ( - LogbookCatalog.TimeFilter.DAY - if first_is_available_by_day - else LogbookCatalog.TimeFilter.NIGHT - ) - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(first in filtered) - - options = _default_query_options() - options["show"] = LogbookCatalog.DiscoveryFilter.CAUGHT - options["sort"] = LogbookCatalog.SortMode.QUALITY_PROGRESS - options["descending"] = true - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(filtered == [first, second]) - for sort_mode: LogbookCatalog.SortMode in [ - LogbookCatalog.SortMode.NAME, - LogbookCatalog.SortMode.RARITY, - LogbookCatalog.SortMode.VALUE, - LogbookCatalog.SortMode.WEIGHT, - ]: - options = _default_query_options() - options["sort"] = sort_mode - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(filtered[0] in [first, second]) - assert(filtered[1] in [first, second]) - assert(filtered[0] != filtered[1]) - assert(filtered[2] == unknown) - - _query_available_id = second.id - options = _default_query_options() - options["availability"] = ( - LogbookCatalog.AvailabilityFilter.AVAILABLE_NOW - ) - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - Callable(self, "_query_species_available_now"), - ) - assert(filtered == [second]) - - _query_available_id = unknown.id - options["show"] = LogbookCatalog.DiscoveryFilter.MISSING - options["rarity"] = ( - int(unknown.rarity) + LogbookCatalog.RarityFilter.COMMON - ) - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - Callable(self, "_query_species_available_now"), - ) - assert(filtered == [unknown]) - - options = _default_query_options() - options["show"] = LogbookCatalog.DiscoveryFilter.MISSING - options["group"] = String(unknown.collection_group) - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(unknown in filtered) - assert( - String(unknown.collection_group) - in LogbookCatalog.available_groups( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - ) - ) - - var unknown_is_available_by_day := ( - unknown.availability == null or unknown.availability.allow_day - ) - options = _default_query_options() - options["show"] = LogbookCatalog.DiscoveryFilter.MISSING - options["time"] = ( - LogbookCatalog.TimeFilter.DAY - if unknown_is_available_by_day - else LogbookCatalog.TimeFilter.NIGHT - ) - filtered = LogbookCatalog.filtered_species( - CatalogResource.candidates, - LogbookCatalog.Category.FRESH_WATER, - collection, - inventory, - options, - ) - assert(unknown in filtered) - inventory.free() - collection.free() - - -func _default_query_options() -> Dictionary: - return { - "search": "", - "show": LogbookCatalog.DiscoveryFilter.ALL, - "sort": LogbookCatalog.SortMode.CATALOG_NUMBER, - "descending": false, - "availability": LogbookCatalog.AvailabilityFilter.ANY, - "season": LogbookCatalog.SeasonFilter.ANY, - "time": LogbookCatalog.TimeFilter.ANY, - "rarity": LogbookCatalog.RarityFilter.ANY, - "method": LogbookCatalog.MethodFilter.ANY, - "holding": LogbookCatalog.HoldingFilter.ANY, - "group": "", - } - - -func _make_test_catch(fish: FishDataType, favorited: bool) -> FishCatchType: - var fish_catch := FishCatchType.new() - fish_catch.fish = fish - fish_catch.fish_id = fish.id - fish_catch.weight_lb = fish.get_minimum_weight() - fish_catch.display_scale = fish.get_display_scale_for_weight( - fish_catch.weight_lb - ) - fish_catch.quality = FishQualityType.Tier.BORING - fish_catch.sale_value = fish.get_sale_value_for_weight(fish_catch.weight_lb) - fish_catch.is_favorited = favorited - fish_catch.ensure_identity() - return fish_catch - - -func _query_species_available_now(fish: FishDataType) -> bool: - return fish != null and fish.id == _query_available_id - - func _validate_page() -> void: var collection := CollectionLogType.new() var inventory := FishInventoryType.new() @@ -436,10 +91,6 @@ func _validate_page() -> void: assert(outer_margin.get_theme_constant("margin_right") == 160) assert(outer_margin.get_theme_constant("margin_bottom") == 106) assert(is_equal_approx(book.offset_top, 65.0)) - page.call("_set_index_open", true, false) - await process_frame - _validate_index_content_bounds(page) - page.call("_set_index_open", false, false) page.set_compact_presentation(false) await process_frame assert(outer_margin.get_theme_constant("margin_left") == 52) @@ -452,9 +103,6 @@ func _validate_page() -> void: assert((page.get("_catalog_grid") as GridContainer).columns == 4) var catalog_scroll := page.get("_catalog_scroll") as ScrollContainer assert(catalog_scroll != null and catalog_scroll.follow_focus) - catalog_scroll.scroll_vertical = 37 - await create_timer(0.2).timeout - assert(catalog_scroll.scroll_vertical == 37) page.call( "_set_controller_zone", LogbookPage.ControllerZone.ENTRIES, @@ -507,61 +155,23 @@ func _validate_page() -> void: ) var initial_detail_body := page.get("_detail_body") as VBoxContainer assert(not initial_detail_body.get_parent() is ScrollContainer) - var index_tab := page.get("_index_tab") as Button - var index_body := page.get("_index_body") as VBoxContainer - assert(index_tab != null and index_body != null) - assert(index_tab.size == LogbookPage.INDEX_TAB_SIZE) - assert( - not index_tab.get_global_rect().intersects( - (category_tabs.back() as Button).get_global_rect() - ) - ) - page.call("_set_index_open", true, false) - await process_frame - assert(index_body.visible) - assert(not initial_detail_body.visible) - assert((page.get("_index_option_buttons") as Dictionary).size() == 10) - _validate_index_content_bounds(page) - page.call( - "_cycle_index_option", - &"show", - 1, - ) - await process_frame - assert((page.get("_entry_buttons") as Dictionary).is_empty()) - assert( - (page.get("_empty_state") as Label).text - == "No entries match this index." - ) - page.call("_reset_index") - await process_frame - assert((page.get("_entry_buttons") as Dictionary).size() == 108) - page.call("_set_index_open", false, false) - await process_frame - assert(not index_body.visible) - assert(initial_detail_body.visible) assert( page.call("_entry_label_text", "flathead catfish") == "flathead\ncatfish" ) - var shared_material: Material = null + var shared_material: Material var silhouette_count: int = 0 - var target_silhouette_area: float = ( - LogbookPage.CATALOG_PORTRAIT_SIZE.x - * LogbookPage.CATALOG_PORTRAIT_SIZE.y - * LogbookPortraitType.UNIFORM_FOOTPRINT_AREA_RATIO - ) for category: LogbookCatalog.Category in [ LogbookCatalog.Category.FRESH_WATER, LogbookCatalog.Category.SALT_WATER, ]: page.call("_select_category", category) await create_timer(0.25).timeout - var category_entries: Dictionary = page.get("_entry_buttons") + var entries: Dictionary = page.get("_entry_buttons") assert( - category_entries.size() - == (108 if category == LogbookCatalog.Category.FRESH_WATER else 202) + entries.size() + == (26 if category == LogbookCatalog.Category.FRESH_WATER else 34) ) for fish: FishDataType in LogbookCatalog.ordered_species( CatalogResource.candidates @@ -571,7 +181,7 @@ func _validate_page() -> void: var unknown_key := StringName( "unknown_%d" % LogbookCatalog.catalog_number(fish) ) - var entry := category_entries.get(unknown_key) as Button + var entry := entries.get(unknown_key) as Button assert(entry != null) assert(entry.text.is_empty()) assert(entry.tooltip_text.is_empty()) @@ -582,15 +192,8 @@ func _validate_page() -> void: assert(portrait != null) assert(portrait.source_texture == fish.display_texture) assert( - portrait.custom_minimum_size.x - <= LogbookPage.CATALOG_PORTRAIT_SIZE.x - and portrait.custom_minimum_size.y - <= LogbookPage.CATALOG_PORTRAIT_SIZE.y - ) - assert(portrait.get_parent() is CenterContainer) - assert( - (portrait.get_parent() as CenterContainer).custom_minimum_size - == LogbookPage.CATALOG_PORTRAIT_SIZE + portrait.custom_minimum_size + == LogbookPage.CATALOG_PORTRAIT_SIZE ) assert( portrait.expand_mode @@ -606,23 +209,6 @@ func _validate_page() -> void: else: assert(portrait.material == shared_material) assert(_texture_has_transparency(portrait.texture)) - var silhouette_area: float = ( - portrait.custom_minimum_size.x - * portrait.custom_minimum_size.y - ) - assert(silhouette_area > 0.0) - assert(silhouette_area <= target_silhouette_area * 1.05) - assert( - silhouette_area >= target_silhouette_area * 0.9 - or is_equal_approx( - portrait.custom_minimum_size.x, - LogbookPage.CATALOG_PORTRAIT_SIZE.x, - ) - or is_equal_approx( - portrait.custom_minimum_size.y, - LogbookPage.CATALOG_PORTRAIT_SIZE.y, - ) - ) silhouette_count += 1 for candidate: FishDataType in CatalogResource.candidates: assert(not entry.text.contains(candidate.display_name)) @@ -636,14 +222,11 @@ func _validate_page() -> void: candidate.display_name ) ) - assert(silhouette_count == 310) + assert(silhouette_count == 60) page.call("_select_category", LogbookCatalog.Category.SHELLFISH) await create_timer(0.25).timeout - assert((page.get("_entry_buttons") as Dictionary).size() == 3) - assert( - (page.get("_entry_buttons") as Dictionary).has(&"unknown_3902") - ) + assert((page.get("_entry_buttons") as Dictionary).size() == 2) assert( (page.get("_entry_buttons") as Dictionary).has(&"unknown_3906") ) @@ -686,11 +269,6 @@ func _validate_page() -> void: assert(known_portrait != null) assert(known_portrait.source_texture == bluegill.display_texture) assert(known_portrait.material == null) - assert(known_portrait.get_parent() is CenterContainer) - assert( - (known_portrait.get_parent() as CenterContainer).custom_minimum_size - == LogbookPage.CATALOG_PORTRAIT_SIZE - ) assert(known.button_pressed) _validate_handwritten_logbook_font(page) @@ -843,19 +421,8 @@ func _validate_page() -> void: (page.get("_portrait_overlay_backdrop") as Button).pressed.emit() await process_frame - var live_index_options := page.get("_index_options") as Dictionary - live_index_options["holding"] = LogbookCatalog.HoldingFilter.IN_COOLER - page.call("_refresh_catalog") - await process_frame - assert( - (page.get("_entry_buttons") as Dictionary).keys() - == [&"bluegill"] - ) inventory.remove_catch_by_id(fish_catch.catch_id) await process_frame - assert((page.get("_entry_buttons") as Dictionary).is_empty()) - page.call("_reset_index") - await process_frame assert(not _detail_text(page).contains("number owned")) page.queue_free() collection.queue_free() @@ -870,54 +437,6 @@ func _detail_text(page: LogbookPage) -> String: return "\n".join(values) -func _validate_index_content_bounds(page: LogbookPage) -> void: - var body := page.get("_index_body") as VBoxContainer - assert(body != null and body.visible) - var right_page := body.get_parent() as Control - assert(right_page != null) - var page_rect := right_page.get_global_rect() - var body_rect := body.get_global_rect() - var protected_rect := Rect2( - page_rect.position + Vector2( - LogbookPage.INDEX_CONTENT_LEFT_INSET, - LogbookPage.INDEX_CONTENT_TOP_INSET, - ), - page_rect.size - Vector2( - LogbookPage.INDEX_CONTENT_LEFT_INSET - + LogbookPage.INDEX_CONTENT_RIGHT_INSET, - LogbookPage.INDEX_CONTENT_TOP_INSET - + LogbookPage.INDEX_CONTENT_BOTTOM_INSET, - ), - ) - assert( - body_rect.position.x - >= page_rect.position.x + LogbookPage.INDEX_CONTENT_LEFT_INSET - 1.0 - ) - assert( - body_rect.end.x - <= page_rect.end.x - LogbookPage.INDEX_CONTENT_RIGHT_INSET + 1.0 - ) - assert( - body_rect.position.y >= page_rect.position.y, - "Index starts above the authored page: body=%s page=%s" - % [body_rect, page_rect], - ) - assert( - body_rect.end.y <= page_rect.end.y, - "Index extends below the authored page: body=%s page=%s" - % [body_rect, page_rect], - ) - var controls: Array = page.get("_index_controls") as Array - for value: Variant in controls: - var control := value as Control - if control != null and control.visible: - assert( - protected_rect.grow(2.0).encloses(control.get_global_rect()), - "Index control crossed the authored right-page boundary: %s" - % control.name, - ) - - func _descendant_label_text(parent: Node) -> String: var values: PackedStringArray = [] for node: Node in parent.find_children("*", "Label", true, false): diff --git a/tests/manual/terrain_chunk_generator/terrain_chunk_generator_test.tscn b/tests/manual/terrain_chunk_generator/terrain_chunk_generator_test.tscn index 5c1e046..df3a835 100644 --- a/tests/manual/terrain_chunk_generator/terrain_chunk_generator_test.tscn +++ b/tests/manual/terrain_chunk_generator/terrain_chunk_generator_test.tscn @@ -4,7 +4,7 @@ [ext_resource type="Script" path="res://world/generation/terrain_chunk_generator.gd" id="2_generator"] [ext_resource type="Resource" path="res://world/generation/chunks/terrain_chunk_catalog.tres" id="3_catalog"] [ext_resource type="PackedScene" path="res://player/player.tscn" id="4_player"] -[ext_resource type="Environment" path="res://world/environment/straywild_environment.tres" id="5_environment"] +[ext_resource type="Environment" path="res://world/environment/netfishing_environment.tres" id="5_environment"] [node name="TerrainChunkGeneratorTest" type="Node3D"] script = ExtResource("1_test") diff --git a/tests/movement_multiplayer_validation.gd b/tests/movement_multiplayer_validation.gd index 611658a..c6a98e5 100644 --- a/tests/movement_multiplayer_validation.gd +++ b/tests/movement_multiplayer_validation.gd @@ -34,14 +34,11 @@ func _validate_latency_smoothing() -> void: avatar.set_physics_process(false) _validate_compact_input_encoding() _validate_compact_snapshot_encoding() - _validate_authoritative_teleport_snapshot_guard() _validate_compact_animation_encoding() _validate_animation_action_ordering(avatar) _validate_transit_estimation() - await _validate_remote_snapshot_smoothing(avatar) - _validate_remote_locomotion_playback_recovery(avatar) + _validate_remote_snapshot_smoothing(avatar) _validate_reliable_jump_intent(avatar) - _validate_airborne_sitting(avatar) _validate_stale_input_expiry(avatar) avatar.queue_free() await process_frame @@ -73,12 +70,8 @@ func _validate_compact_snapshot_encoding() -> void: Vector3(4.5, 0.0, 0.0), 1, ) - var movement_snapshot_batch_size: int = ( - NetworkSession.MOVEMENT_SNAPSHOT_BATCH_SIZE - ) - var owner_snapshot_divisor: int = NetworkSession.OWNER_SNAPSHOT_DIVISOR - assert(movement_snapshot_batch_size == 8) - assert(owner_snapshot_divisor == 3) + assert(NetworkSession.MOVEMENT_SNAPSHOT_BATCH_SIZE == 8) + assert(NetworkSession.OWNER_SNAPSHOT_DIVISOR == 3) var encoded_snapshots: Array = [] for _peer: int in NetworkSession.MOVEMENT_SNAPSHOT_BATCH_SIZE: encoded_snapshots.append( @@ -105,50 +98,6 @@ func _validate_compact_snapshot_encoding() -> void: ) -func _validate_authoritative_teleport_snapshot_guard() -> void: - var session := NetworkSession.new() - var destination := Vector3(24.0, 0.0, -8.0) - session.set("_local_authoritative_teleport_guard_active", true) - session.set("_local_authoritative_teleport_guard_position", destination) - session.set("_local_authoritative_teleport_minimum_ack", 48) - - # A channel-two audit from before the reliable relocation must not move the - # local player back to its old position. - assert(bool(session.call( - "_reject_stale_authoritative_teleport_snapshot", - _network_snapshot(Vector3.ZERO, Vector3.ZERO, 48), - ))) - assert(bool(session.get("_local_authoritative_teleport_guard_active"))) - assert(bool(session.call( - "_reject_stale_authoritative_teleport_snapshot", - _network_snapshot(destination, Vector3.ZERO, 47), - ))) - - # A matching audit from the new location clears the barrier. A higher - # acknowledgement at the old position is not sufficient: movement input and - # the reliable teleport travelled on different channels, so it can still be - # a held packet from before recovery. - assert(not bool(session.call( - "_reject_stale_authoritative_teleport_snapshot", - _network_snapshot(destination + Vector3.RIGHT, Vector3.ZERO, 48), - ))) - assert(not bool(session.get("_local_authoritative_teleport_guard_active"))) - session.set("_local_authoritative_teleport_guard_active", true) - session.set("_local_authoritative_teleport_guard_position", destination) - session.set("_local_authoritative_teleport_minimum_ack", 48) - assert(bool(session.call( - "_reject_stale_authoritative_teleport_snapshot", - _network_snapshot(Vector3.ZERO, Vector3.ZERO, 49), - ))) - assert(bool(session.get("_local_authoritative_teleport_guard_active"))) - assert(not bool(session.call( - "_reject_stale_authoritative_teleport_snapshot", - _network_snapshot(destination, Vector3.ZERO, 49), - ))) - assert(not bool(session.get("_local_authoritative_teleport_guard_active"))) - session.free() - - func _validate_compact_animation_encoding() -> void: var paused_state := NetworkPlayerAnimationProtocol.make_state( NetworkPlayerAnimationProtocol.LOCOMOTION_IDLE, @@ -192,80 +141,6 @@ func _validate_compact_animation_encoding() -> void: ) -func _validate_airborne_sitting(avatar: Player) -> void: - avatar.reset_network_movement_state() - avatar.set_local_control(true) - avatar.global_position = Vector3(0.0, 2.0, 0.0) - avatar.velocity = Vector3(0.0, -1.0, 0.0) - avatar.toggle_sitting() - assert(avatar.get_network_sitting_intent()) - assert(not avatar.get_network_sitting_state()) - assert(bool(avatar.get("_sitting_intent_pending"))) - assert(not bool(avatar.make_network_snapshot(2)["sitting"])) - assert(bool(avatar.capture_network_input(1)["sitting"])) - - # Reproduce the high-RTT owner audit race: the host has reached the ground - # and reports the deferred sit while this client's predicted capsule is still - # airborne. Repeated seated snapshots must not zero its falling velocity. - var delayed_sit_snapshot: Dictionary = _network_snapshot( - avatar.global_position, - Vector3.ZERO, - 1, - ) - delayed_sit_snapshot["sitting"] = true - avatar.apply_local_prediction_correction( - delayed_sit_snapshot, - 1, - 1.0 / 30.0, - 0.3, - 0.1, - ) - assert(not avatar.is_sitting()) - assert(bool(avatar.get("_sit_after_landing"))) - assert(avatar.velocity.y < 0.0) - var airborne_height: float = avatar.global_position.y - avatar.call("_simulate_movement_physics", 0.1) - assert(avatar.global_position.y < airborne_height) - assert(avatar.velocity.y < -1.0) - for _delayed_audit: int in 3: - delayed_sit_snapshot["position"] = [ - avatar.global_position.x, - avatar.global_position.y, - avatar.global_position.z, - ] - var falling_velocity: float = avatar.velocity.y - avatar.apply_local_prediction_correction( - delayed_sit_snapshot, - 1, - 1.0 / 30.0, - 0.3, - 0.1, - ) - assert(not avatar.is_sitting()) - assert(is_equal_approx(avatar.velocity.y, falling_velocity)) - avatar.call("_simulate_movement_physics", 0.1) - assert(avatar.global_position.y < airborne_height) - avatar.call("_queue_local_network_jump_intent") - var jumping_input: Dictionary = avatar.capture_network_input(2) - assert(bool(jumping_input["jump"])) - assert(not bool(jumping_input["sitting"])) - avatar.call("_cancel_sitting_for_jump") - assert(not bool(avatar.get("_sit_after_landing"))) - assert(bool(avatar.get("_sitting_intent_pending"))) - avatar.reset_network_movement_state() - - # Even a malformed or stale reconciliation that marks an airborne avatar as - # seated must not bypass gravity and freeze it in place. - avatar.set("_sit_after_landing", false) - avatar.call("_set_sitting", true) - avatar.velocity = Vector3(0.0, 4.0, 0.0) - avatar.call("_simulate_movement_physics", 0.1) - assert(not avatar.is_sitting()) - assert(bool(avatar.get("_sit_after_landing"))) - assert(avatar.velocity.y < 4.0) - avatar.reset_network_movement_state() - - func _validate_animation_action_ordering(avatar: Player) -> void: var draw := NetworkPlayerAnimationProtocol.make_action_state( &"draw", 5, 0.2 @@ -407,24 +282,8 @@ func _validate_remote_snapshot_smoothing(avatar: Player) -> void: ) assert(avatar.global_position.x <= maximum_extrapolated_x + 0.1) - # Reconciliation only applies after both simulations report a grounded body. - # Give the unit avatar a real floor so this exercises the production path. - var floor_body := StaticBody3D.new() - floor_body.collision_layer = 1 - floor_body.collision_mask = 0 - floor_body.position = Vector3(0.0, -0.1, 0.0) - var floor_shape := CollisionShape3D.new() - var floor_box := BoxShape3D.new() - floor_box.size = Vector3(100.0, 0.2, 100.0) - floor_shape.shape = floor_box - floor_body.add_child(floor_shape) - root.add_child(floor_body) - await physics_frame avatar.set_local_control(true) avatar.global_position = Vector3(0.8, 0.0, 0.0) - avatar.velocity = Vector3.DOWN - avatar.move_and_slide() - assert(avatar.is_on_floor()) avatar.apply_local_prediction_correction( moving_snapshot, 2, @@ -477,42 +336,6 @@ func _validate_remote_snapshot_smoothing(avatar: Player) -> void: int(avatar.get("_local_prediction_soft_corrections")) == 1 ) - # Host and client jump timing naturally differs. An airborne authoritative - # snapshot must not drag the local capsule sideways or down before landing. - avatar.global_position = Vector3(3.0, 0.0, 0.0) - avatar.velocity = Vector3(0.0, 1.0, 0.0) - var airborne_snapshot: Dictionary = drift_snapshot.duplicate(true) - airborne_snapshot["grounded"] = false - for _audit: int in 6: - avatar.apply_local_prediction_correction( - airborne_snapshot, - 20, - 1.0 / 30.0, - 0.0, - 0.1, - ) - assert(avatar.global_position.is_equal_approx(Vector3(3.0, 0.0, 0.0))) - assert(int(avatar.get("_local_prediction_soft_corrections")) == 1) - avatar.velocity = Vector3.ZERO - - # The local body may reach its apex after the host has already landed. The - # local airborne state still owns presentation and must not be pulled toward - # the host until it has landed too. - avatar.global_position = Vector3(3.0, 2.0, 0.0) - avatar.velocity = Vector3.ZERO - avatar.move_and_slide() - assert(not avatar.is_on_floor()) - for _audit: int in 6: - avatar.apply_local_prediction_correction( - drift_snapshot, - 20, - 1.0 / 30.0, - 0.0, - 0.1, - ) - assert(avatar.global_position.is_equal_approx(Vector3(3.0, 2.0, 0.0))) - assert(int(avatar.get("_local_prediction_soft_corrections")) == 1) - # Genuine divergence still recovers immediately, as do the separate reliable # teleport and water-recovery paths used by gameplay transitions. avatar.global_position = Vector3(10.0, 0.0, 0.0) @@ -528,89 +351,6 @@ func _validate_remote_snapshot_smoothing(avatar: Player) -> void: int(avatar.get("_local_prediction_hard_corrections")) == 1 ) - # Recovery owns all local state until its reliable teleport arrives. A - # delayed audit must neither pull the body back nor acknowledge an old jump. - avatar.global_position = Vector3(10.0, 0.0, 0.0) - avatar.call("_queue_local_network_jump_intent") - avatar.capture_network_input(20) - avatar.set_water_recovery_active(true) - avatar.apply_local_prediction_correction( - drift_snapshot, - 20, - 1.0 / 30.0, - 0.0, - 0.1, - ) - assert(avatar.global_position == Vector3(10.0, 0.0, 0.0)) - assert(bool(avatar.get("_local_network_jump_intent_pending"))) - avatar.set_water_recovery_active(false) - avatar.call("_clear_local_network_jump_intent") - - # Soft reconciliation must respect the same terrain collision as ordinary - # player movement instead of phasing the capsule through a solid obstacle. - var blocker := StaticBody3D.new() - blocker.collision_layer = 1 - blocker.collision_mask = 0 - blocker.position = Vector3(1.0, 1.0, 0.0) - var blocker_shape := CollisionShape3D.new() - var blocker_box := BoxShape3D.new() - blocker_box.size = Vector3(0.2, 4.0, 4.0) - blocker_shape.shape = blocker_box - blocker.add_child(blocker_shape) - root.add_child(blocker) - await physics_frame - avatar.global_position = Vector3.ZERO - avatar.velocity = Vector3.ZERO - avatar.call("_clear_local_reconciliation_offsets") - var blocked_visual_position: Vector3 = ( - avatar.get_node("Visuals") as Node3D - ).global_position - var blocked_camera_position: Vector3 = ( - avatar.get_node("CameraYaw") as Node3D - ).global_position - assert(bool(avatar.call( - "_apply_camera_safe_local_correction", - Vector3(2.0, 0.0, 0.0), - ))) - assert(avatar.global_position.x > 0.0 and avatar.global_position.x < 0.6) - assert( - (avatar.get_node("Visuals") as Node3D).global_position - == blocked_visual_position - ) - assert( - (avatar.get_node("CameraYaw") as Node3D).global_position - == blocked_camera_position - ) - blocker.queue_free() - floor_body.queue_free() - await physics_frame - - -func _validate_remote_locomotion_playback_recovery(avatar: Player) -> void: - avatar.configure_network_remote(false) - avatar.push_network_snapshot( - _network_snapshot(Vector3.ZERO, Vector3(4.5, 0.0, 0.0), 21) - ) - avatar.call("_update_character_animation") - var animation_player := avatar.get_node( - "Visuals/CharacterRig/AnimationPlayer" - ) as AnimationPlayer - assert(animation_player.assigned_animation == &"running") - assert(animation_player.is_playing()) - - # Reproduce issue #111: locomotion replication still says RUNNING (and the - # dust therefore still emits), but the rig playback has fallen idle. The - # local presentation pass must repair that state without another packet. - animation_player.stop() - assert(not animation_player.is_playing()) - assert( - int(avatar.get("_network_target_locomotion_state")) - == Player.LocomotionState.RUNNING - ) - avatar.call("_update_character_animation") - assert(animation_player.assigned_animation == &"running") - assert(animation_player.is_playing()) - func _validate_reliable_jump_intent(avatar: Player) -> void: avatar.set_local_control(true) @@ -679,40 +419,6 @@ func _validate_stale_input_expiry(avatar: Player) -> void: assert(not bool(avatar.get("_network_input_stale"))) assert((avatar.get("_network_axis") as Vector2).length_squared() > 0.0) - # The reliable recovery request carries the last client-created sequence. - # A host uses it as a hard watermark, so every delayed input from before the - # request is discarded even if it arrives after the teleport RPC. - avatar.neutralize_authoritative_input_for_relocation(44) - assert(int(avatar.get("_last_network_input_sequence")) == 44) - assert((avatar.get("_network_axis") as Vector2) == Vector2.ZERO) - assert(not bool(avatar.get("_network_sprint"))) - assert(bool(avatar.get("_authoritative_relocation_input_quarantine"))) - avatar.apply_authoritative_network_input(_movement_input(41, true)) - assert((avatar.get("_network_axis") as Vector2) == Vector2.ZERO) - avatar.apply_authoritative_network_input(_movement_input(42, false, false)) - assert(int(avatar.get("_last_network_input_sequence")) == 44) - - # A non-neutral post-watermark packet cannot restart motion. The first - # neutral packet past the watermark releases the barrier; the following - # input is the first one allowed to move the recovered avatar. - avatar.apply_authoritative_network_input(_movement_input(45, false, true)) - assert((avatar.get("_network_axis") as Vector2) == Vector2.ZERO) - assert(bool(avatar.get("_authoritative_relocation_input_quarantine"))) - avatar.apply_authoritative_network_input(_movement_input(46, false, false)) - assert(not bool(avatar.get("_authoritative_relocation_input_quarantine"))) - avatar.apply_authoritative_network_input(_movement_input(47, false, true)) - assert((avatar.get("_network_axis") as Vector2).length_squared() > 0.0) - - # Recovery itself also consumes incoming movement rather than remembering a - # held axis which could resume on the exact frame recovery presentation ends. - avatar.set_water_recovery_active(true) - avatar.apply_authoritative_network_input(_movement_input(48, false, true)) - assert((avatar.get("_network_axis") as Vector2) == Vector2.ZERO) - avatar.set_water_recovery_active(false) - avatar.apply_authoritative_network_input(_movement_input(42, false, false)) - avatar.apply_authoritative_network_input(_movement_input(49, false, true)) - assert((avatar.get("_network_axis") as Vector2).length_squared() > 0.0) - func _network_snapshot( position: Vector3, @@ -739,22 +445,15 @@ func _run_host() -> void: var main: Node = await _create_initialized_main() var session := main.get_node("%NetworkSession") as NetworkSession var save_manager := main.get("_save_manager") as PlayerSaveManager - assert(bool(main.call( - "_apply_world", + assert(session.set_host_world( WorldLayout.STARTER_ISLAND, NetworkProtocol.DEFAULT_WORLD_SEED, - true, - ))) - assert(bool(main.call( - "_prepare_host_world", - WorldLayout.STARTER_ISLAND, - NetworkProtocol.DEFAULT_WORLD_SEED, - ))) + )) + assert(session.start_private_host(TEST_PORT)) assert(save_manager.initialize_new_game( NetworkProtocol.DEFAULT_WORLD_SEED, WorldLayout.STARTER_ISLAND, )) - assert(session.start_private_host(TEST_PORT)) main.call("_enter_gameplay") for _frame: int in 4: await physics_frame @@ -766,40 +465,31 @@ func _run_host() -> void: # to settle before emitting the one-shot locomotion/action sequence. await create_timer(3.0).timeout var player := main.get("_player") as Player - var world := main.get_node("TestWorld") as TestWorld player.configure_network_remote(true) - await _reset_locomotion_test_position(player, session, world) - var input_sequence: int = 1 - input_sequence = await _sustain_locomotion_input( - player, input_sequence, 1.5, true - ) - await _reset_locomotion_test_position(player, session, world) - input_sequence = await _sustain_locomotion_input( - player, input_sequence, 1.5, false - ) - await _reset_locomotion_test_position(player, session, world) - input_sequence = await _sustain_locomotion_input( - player, input_sequence, 1.5, false, true, true - ) - input_sequence = await _sustain_locomotion_input( - player, input_sequence, 1.5, false, false, true - ) + player.apply_authoritative_network_input(_movement_input(1, true)) + await create_timer(2.5).timeout + player.apply_authoritative_network_input(_movement_input(2, false)) + await create_timer(2.5).timeout player.apply_authoritative_network_input( - _movement_input(input_sequence, false, false, true, &"draw", 1) + _movement_input(3, false, true, true) ) - input_sequence += 1 - await create_timer(1.0).timeout - player.apply_authoritative_network_input( - _movement_input( - input_sequence, false, false, true, &"strike", 2, true - ) - ) - input_sequence += 1 await create_timer(2.0).timeout player.apply_authoritative_network_input( - _movement_input(input_sequence, false, false, false, &"", 3) + _movement_input(4, false, false, true) ) - var disconnect_deadline: int = Time.get_ticks_msec() + 15000 + await create_timer(2.0).timeout + player.apply_authoritative_network_input( + _movement_input(5, false, false, true, &"draw", 1) + ) + await create_timer(1.0).timeout + player.apply_authoritative_network_input( + _movement_input(6, false, false, true, &"strike", 2, true) + ) + await create_timer(2.0).timeout + player.apply_authoritative_network_input( + _movement_input(7, false, false, false, &"", 3) + ) + var disconnect_deadline: int = Time.get_ticks_msec() + 8000 while ( Time.get_ticks_msec() < disconnect_deadline and session.is_authenticated_peer(remote_peer_id) @@ -848,27 +538,12 @@ func _run_client() -> void: var saw_net_strike_paused: bool = false var saw_animation_advance: bool = false var saw_dust: bool = false - var observed_animations: Dictionary = {} - var observed_locomotion_states: Dictionary = {} - var maximum_sneak_speed: float = 0.0 var previous_animation: StringName = &"" var previous_animation_position: float = -1.0 - var observation_deadline: int = Time.get_ticks_msec() + 22000 + var observation_deadline: int = Time.get_ticks_msec() + 18000 while Time.get_ticks_msec() < observation_deadline: await process_frame var current_animation: StringName = animation_player.current_animation - observed_animations[current_animation] = true - var target_locomotion_state: int = int(host_avatar.get( - "_network_target_locomotion_state" - )) - observed_locomotion_states[target_locomotion_state] = true - if target_locomotion_state == Player.LocomotionState.SNEAKING: - maximum_sneak_speed = maxf( - maximum_sneak_speed, - Vector2( - host_avatar.velocity.x, host_avatar.velocity.z - ).length(), - ) saw_running = saw_running or current_animation.begins_with("running") saw_walking = saw_walking or current_animation.begins_with("walking") saw_sneaking = saw_sneaking or current_animation == &"sneaking" @@ -909,44 +584,15 @@ func _run_client() -> void: and saw_dust ): break - var missing_observations: Array[String] = [] - if not saw_running: - missing_observations.append("running") - if not saw_walking: - missing_observations.append("walking") - if not saw_sneaking: - missing_observations.append("sneaking") - if not saw_idle_sneak: - missing_observations.append("idle_sneak") - if not saw_net_draw: - missing_observations.append("net_draw") - if not saw_net_strike: - missing_observations.append("net_strike") - if not saw_net_strike_paused: - missing_observations.append("net_strike_paused") - if not saw_animation_advance: - missing_observations.append("animation_advance") - if not saw_dust: - missing_observations.append("sprint_dust") - if not missing_observations.is_empty(): - push_error( - ( - "Missing movement observations %s; observed animations: %s; " - + "locomotion states: %s; maximum sneak speed: %.3f" - ) % [ - missing_observations, - observed_animations.keys(), - observed_locomotion_states.keys(), - maximum_sneak_speed, - ] - ) - session.disconnect_session("") - main.queue_free() - for _frame: int in 4: - await process_frame - await create_timer(0.1).timeout - quit(1) - return + assert(saw_running) + assert(saw_walking) + assert(saw_sneaking) + assert(saw_idle_sneak) + assert(saw_net_draw) + assert(saw_net_strike) + assert(saw_net_strike_paused) + assert(saw_animation_advance) + assert(saw_dust) print("Movement multiplayer client validation: PASS") session.disconnect_session("") main.queue_free() @@ -984,39 +630,6 @@ func _movement_input( } -func _sustain_locomotion_input( - player: Player, - starting_sequence: int, - duration_seconds: float, - sprinting: bool, - moving: bool = true, - sneaking: bool = false, -) -> int: - var sequence: int = starting_sequence - var deadline: int = ( - Time.get_ticks_msec() + roundi(duration_seconds * 1000.0) - ) - while Time.get_ticks_msec() < deadline: - player.apply_authoritative_network_input( - _movement_input(sequence, sprinting, moving, sneaking) - ) - sequence += 1 - await create_timer(0.1).timeout - return sequence - - -func _reset_locomotion_test_position( - player: Player, - session: NetworkSession, - world: TestWorld, -) -> void: - player.velocity = Vector3.ZERO - player.global_transform = world.get_player_spawn_transform() - session.publish_authoritative_teleport(1) - for _frame: int in 4: - await physics_frame - - func _create_initialized_main() -> Node: root.size = Vector2i(1280, 720) var main: Node = MainScene.instantiate() diff --git a/tests/net_attachment_validation.gd b/tests/net_attachment_validation.gd index 6b53c08..15b8b7d 100644 --- a/tests/net_attachment_validation.gd +++ b/tests/net_attachment_validation.gd @@ -57,73 +57,23 @@ func _run() -> void: "Net rear face did not follow the socket direction guide.", ) - var model := catching_net.get_node_or_null("ModelMount/NetModel") as Node3D - _check(model != null, "Imported net model is missing.") - if model == null: - _finish(host_skeleton) - return - var skeleton := model.find_child("Skeleton3D", true, false) as Skeleton3D - _check(skeleton != null, "Imported net Skeleton3D is missing.") - if skeleton == null: - _finish(host_skeleton) - return - _check( - skeleton.find_bone("net_root") >= 0, - "Imported net_root bone is missing.", + var handle := catching_net.get_node_or_null("Handle") as MeshInstance3D + var hoop := catching_net.get_node_or_null("Hoop") as MeshInstance3D + var bag := catching_net.get_node_or_null("Bag") as MeshInstance3D + var impact_marker := ( + catching_net.get_node_or_null("ImpactMarker") as Marker3D ) - _check( - skeleton.find_bone("net_rim") >= 0, - "Imported net_rim bone is missing.", - ) - _check( - skeleton.find_bone("net_mid") >= 0, - "Imported net_mid bone is missing.", - ) - _check( - skeleton.find_bone("net_tip") >= 0, - "Imported net_tip bone is missing.", - ) - - var spring := skeleton.get_node_or_null("NetSpring") as SpringBoneSimulator3D - _check(spring != null, "Net spring simulator was not created.") - if spring != null: - _check(spring.get_setting_count() == 1, "Net spring settings changed.") + _check(handle != null and handle.mesh != null, "Placeholder handle is missing.") + _check(hoop != null and hoop.mesh != null, "Placeholder hoop is missing.") + _check(bag != null and bag.mesh != null, "Placeholder net bag is missing.") + _check(impact_marker != null, "Net impact marker is missing.") + if impact_marker != null: _check( - spring.get_root_bone_name(0) == &"net_mid", - "Net spring root must remain net_mid.", - ) - _check( - spring.get_end_bone_name(0) == &"net_tip", - "Net spring end must remain net_tip.", - ) - _check(not spring.active, "Hidden net spring must be suspended.") - catching_net.visible = true - await process_frame - await process_frame - _check(spring.active, "Visible net spring must be active.") - _check(spring.get_joint_count(0) == 2, "Net spring chain is incomplete.") - _check( - not attachment.get_impact_world_position().is_equal_approx( - catching_net.global_position + attachment.get_impact_world_position().is_equal_approx( + impact_marker.global_position ), - "Net impact position did not follow the authored rim bone.", + "Net impact position moved away from its marker.", ) - catching_net.visible = false - await process_frame - _check(not spring.active, "Hidden net spring did not suspend.") - - for child: Node in model.find_children("*", "MeshInstance3D", true, false): - var mesh_instance := child as MeshInstance3D - if mesh_instance.mesh == null: - continue - for surface_index: int in mesh_instance.mesh.get_surface_count(): - var material := mesh_instance.mesh.surface_get_material(surface_index) - if material is BaseMaterial3D: - _check( - (material as BaseMaterial3D).texture_filter - == BaseMaterial3D.TEXTURE_FILTER_NEAREST, - "Net material does not use nearest texture sampling.", - ) var rod_attachment := ( FishingRodAttachmentScene.instantiate() as BoneAttachment3D diff --git a/tests/network_chat_protocol_validation.gd b/tests/network_chat_protocol_validation.gd index 669d07a..9368189 100644 --- a/tests/network_chat_protocol_validation.gd +++ b/tests/network_chat_protocol_validation.gd @@ -10,7 +10,6 @@ func _initialize() -> void: func _validate_protocol() -> void: _validate_type_and_empty_handling() _validate_message_cleanup() - _validate_roleplay_commands() _validate_protocol_limits() print("Network chat protocol validation: PASS") quit() @@ -35,28 +34,6 @@ func _validate_message_cleanup() -> void: ) -func _validate_roleplay_commands() -> void: - assert(NetworkChatProtocol.is_roleplay_body("/me waves")) - assert(NetworkChatProtocol.is_roleplay_body("/ME waves")) - assert(NetworkChatProtocol.is_roleplay_body("/me")) - assert(not NetworkChatProtocol.is_roleplay_body("/meow")) - assert(NetworkChatProtocol.roleplay_action("/me waves") == "waves") - assert(NetworkChatProtocol.roleplay_action( - "/me [color=red]waves[/color]" - ) == "[color=red]waves[/color]") - assert(NetworkChatProtocol.valid_user_body("/me waves")) - assert(not NetworkChatProtocol.valid_user_body("/me")) - assert(not NetworkChatProtocol.valid_user_body("/me ")) - assert(NetworkChatProtocol.valid_user_body("/meow")) - var signed_fields: Array = NetworkChatProtocol.signature_fields({ - "session_id": "session", - "request_id": "request", - "sender_fingerprint": "fingerprint", - "body": "/me waves", - }) - assert(signed_fields.back() == "/me waves") - - func _validate_protocol_limits() -> void: var maximum_body: String = "a".repeat( NetworkChatProtocol.MAX_VISIBLE_CHARACTERS diff --git a/tests/on_screen_keyboard_validation.gd b/tests/on_screen_keyboard_validation.gd index e5b05d6..a685c65 100644 --- a/tests/on_screen_keyboard_validation.gd +++ b/tests/on_screen_keyboard_validation.gd @@ -307,13 +307,13 @@ func _validate_native_keyboard() -> void: await process_frame edit.grab_focus() assert(keyboard.is_open()) - var focus_exit_state: Dictionary = {"count": 0} + var focus_exit_count: int = 0 edit.focus_exited.connect(func() -> void: - focus_exit_state["count"] = int(focus_exit_state["count"]) + 1 + focus_exit_count += 1 ) assert(keyboard.request_for_control(edit)) assert(edit.has_focus()) - assert(int(focus_exit_state["count"]) == 0) + assert(focus_exit_count == 0) assert(not edit.virtual_keyboard_enabled) assert(not edit.virtual_keyboard_show_on_focus) assert(keyboard.shown_controls == [edit]) diff --git a/tests/player_experience_validation.gd b/tests/player_experience_validation.gd index a76a3dd..5e9dbef 100644 --- a/tests/player_experience_validation.gd +++ b/tests/player_experience_validation.gd @@ -143,7 +143,7 @@ func _validate_save_migration() -> void: version_five, 5, ) - assert(int(migrated.get("save_version", -1)) == 11) + assert(int(migrated.get("save_version", -1)) == 10) var experience_data: Dictionary = migrated.get("experience", {}) assert(int(experience_data.get("total_experience", -1)) == 0) var world_data: Dictionary = migrated.get("world", {}) @@ -155,9 +155,6 @@ func _validate_save_migration() -> void: assert( PlayerJobService.validate_save_data(migrated.get("jobs", {})) ) - assert(not PlayerHomeState.sanitize_save_data( - migrated.get("home", {}) - ).is_empty()) manager.queue_free() diff --git a/tests/player_gathering_animation_validation.gd b/tests/player_gathering_animation_validation.gd index 42f97ca..16e52c3 100644 --- a/tests/player_gathering_animation_validation.gd +++ b/tests/player_gathering_animation_validation.gd @@ -23,7 +23,7 @@ func _run() -> void: await process_frame assert(is_equal_approx( Player.get_catch_texture_resolution_scale(CrabBrown.display_texture), - 20.0, + 1.0, )) assert(is_equal_approx( Player.get_catch_texture_resolution_scale(ClamManila.display_texture), diff --git a/tests/profile_multiplayer_validation.gd b/tests/profile_multiplayer_validation.gd index b4ff5d0..4d2bd70 100644 --- a/tests/profile_multiplayer_validation.gd +++ b/tests/profile_multiplayer_validation.gd @@ -40,15 +40,6 @@ func _validate_voice_distance_attenuation() -> void: ChatUI.animalese_volume_offset_db_for_distance(24.0), -80.0, )) - assert(is_equal_approx(ChatUI.speech_scale_for_distance(0.0), 1.0)) - assert(is_equal_approx(ChatUI.speech_scale_for_distance(4.0), 1.0)) - var middle_distance_scale := ChatUI.speech_scale_for_distance(14.0) - assert(middle_distance_scale < 1.0) - assert(middle_distance_scale > ChatUI.SPEECH_MINIMUM_SCALE) - assert(is_equal_approx( - ChatUI.speech_scale_for_distance(24.0), - ChatUI.SPEECH_MINIMUM_SCALE, - )) func _run_host() -> void: @@ -57,8 +48,6 @@ func _run_host() -> void: var profile := main.get_node( "%NetworkProfilePreferences" ) as NetworkProfilePreferences - var save_manager := main.get("_save_manager") as PlayerSaveManager - assert(save_manager.initialize_new_game()) assert(profile.set_profile_identity( profile.display_name, "deep", @@ -66,6 +55,7 @@ func _run_host() -> void: profile.call_id, "kim", )) + var save_manager := main.get("_save_manager") as PlayerSaveManager assert(bool(main.call( "_apply_world", WorldLayout.STARTER_ISLAND, 1, true ))) @@ -77,6 +67,7 @@ func _run_host() -> void: assert(local_avatar != null) assert(local_avatar.get_animalese_voice_id() == "deep") assert(local_avatar.get_animalese_sample_set_id() == "kim") + assert(save_manager.initialize_new_game()) main.call("_enter_gameplay") for _frame: int in 4: await physics_frame @@ -108,7 +99,6 @@ func _run_host() -> void: await _wait_for_remote_appearance(session, remote_peer_id, changed) await _wait_for_remote_appearance(session, remote_peer_id, original) await _wait_for_remote_appearance(session, remote_peer_id, changed) - await _wait_for_remote_title(session, remote_peer_id, "trail guide") var avatar := main.get_node("%PlayerSpawnService").get_avatar( remote_peer_id ) as Player @@ -197,7 +187,6 @@ func _run_client() -> void: service.get_persisted_speech_speed_id(), service.get_persisted_call_id(), "kim", - "trail guide", )) var apply_deadline: int = Time.get_ticks_msec() + 8000 while Time.get_ticks_msec() < apply_deadline and apply_results.is_empty(): @@ -207,11 +196,6 @@ func _run_client() -> void: assert(service.get_persisted_appearance() == changed) assert(service.get_persisted_voice_id() == "deep") assert(service.get_persisted_sample_set_id() == "kim") - assert(service.get_persisted_title() == "trail guide") - assert( - session.get_peer_record(session.get_local_peer_id()).title - == "trail guide" - ) assert(Dictionary(session.get("_local_appearance_snapshot")) == changed) var player := main.get_node("%PlayerSpawnService").get_local_player() as Player assert(player.get_animalese_voice_id() == "deep") @@ -294,20 +278,6 @@ func _wait_for_remote_appearance( assert(false, "Timed out waiting for a remote appearance update.") -func _wait_for_remote_title( - session: NetworkSession, - peer_id: int, - expected: String, -) -> void: - var deadline: int = Time.get_ticks_msec() + 8000 - while Time.get_ticks_msec() < deadline: - await process_frame - var record := session.get_peer_record(peer_id) - if record != null and record.title == expected: - return - assert(false, "Timed out waiting for a remote player title update.") - - func _create_initialized_main() -> Node: root.size = Vector2i(1280, 720) var main: Node = MainScene.instantiate() diff --git a/tests/profile_title_validation.gd b/tests/profile_title_validation.gd deleted file mode 100644 index d441e35..0000000 --- a/tests/profile_title_validation.gd +++ /dev/null @@ -1,151 +0,0 @@ -extends SceneTree - - -func _initialize() -> void: - _run.call_deferred() - - -func _run() -> void: - _validate_profile_defaults_and_legacy_data() - _validate_network_payloads() - _validate_peer_registry_title() - await _validate_profile_layout() - print("Profile title validation: PASS") - quit(0) - - -func _validate_profile_defaults_and_legacy_data() -> void: - var preferences := NetworkProfilePreferences.new() - assert(preferences.display_name == "stray") - assert(preferences.title == "newbie") - assert(NetworkProfilePreferences.is_valid_title("trail guide")) - assert(not NetworkProfilePreferences.is_valid_title("")) - assert(not NetworkProfilePreferences.is_valid_title("x".repeat( - NetworkProtocol.MAX_PLAYER_TITLE_LENGTH + 1 - ))) - preferences.profile_id = "profile-id" - preferences.created_at_unix = 1 - var save_data := preferences.to_save_data() - assert(str(save_data.get("title", "")) == "newbie") - assert(NetworkProfilePreferences.validate_save_data(save_data)) - # Title was added without invalidating existing per-save character records. - var legacy_save := save_data.duplicate(true) - legacy_save.erase("title") - assert(NetworkProfilePreferences.validate_save_data(legacy_save)) - legacy_save["title"] = 7 - assert(not NetworkProfilePreferences.validate_save_data(legacy_save)) - preferences.free() - - -func _validate_network_payloads() -> void: - var appearance := CharacterCustomizationCatalog.default_snapshot() - var fingerprint := "a".repeat(64) - var hello := NetworkProtocol.make_client_hello( - "profile-id", - "stray", - "client-nonce", - appearance, - fingerprint, - PackedByteArray(), - "trail guide", - ) - assert(NetworkProtocol.validate_client_hello(hello).is_empty()) - assert(str(hello.get("player_title", "")) == "trail guide") - var invalid_hello := hello.duplicate(true) - invalid_hello["player_title"] = "" - assert(not NetworkProtocol.validate_client_hello(invalid_hello).is_empty()) - - var check_request := { - "request_id": "check", - "session_id": "session", - "display_name": "stray", - } - assert(NetworkProfileProtocol.valid_check_request(check_request)) - var apply_request := check_request.duplicate(true) - apply_request.merge({ - "player_title": "trail guide", - "appearance": appearance, - "use_anyway": false, - "sender_fingerprint": fingerprint, - "sender_signature": PackedByteArray(), - }) - assert(NetworkProfileProtocol.valid_apply_request(apply_request)) - var signed_fields := NetworkProfileProtocol.signature_fields(apply_request) - assert(signed_fields.has("trail guide")) - apply_request.erase("player_title") - assert(not NetworkProfileProtocol.valid_apply_request(apply_request)) - - -func _validate_peer_registry_title() -> void: - var registry := PeerRegistry.new() - assert(registry.add_peer( - 2, - "profile-id", - "stray", - NetworkProtocol.PROTOCOL_VERSION, - "", - "", - PackedStringArray(), - "trail guide", - )) - assert(registry.get_peer(2).title == "trail guide") - assert(registry.update_title(2, "river scout")) - assert(registry.get_peer(2).title == "river scout") - assert(not registry.update_title(2, "")) - assert(not registry.add_peer( - 3, - "invalid-profile", - "stray", - NetworkProtocol.PROTOCOL_VERSION, - "", - "", - PackedStringArray(), - "", - )) - - -func _validate_profile_layout() -> void: - root.size = Vector2i(1280, 720) - var page := ProfilePage.new() - page.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) - root.add_child(page) - await process_frame - await process_frame - var name_label := page.get("_name_label") as Label - var name_edit := page.get("_name_edit") as LineEdit - var title_edit := page.get("_title_edit") as LineEdit - var identity := page.find_child("IdentityFingerprint", true, false) as Label - var identity_stack := page.find_child( - "ProfileIdentityStack", true, false - ) as VBoxContainer - var experience_row := page.find_child( - "ProfileExperienceRow", true, false - ) as HBoxContainer - assert(name_label != null and name_edit != null and title_edit != null) - assert(name_label.text == "name") - assert(identity != null and identity_stack != null and experience_row != null) - assert(name_edit.placeholder_text == "stray") - assert(title_edit.placeholder_text == "newbie") - assert(title_edit.global_position.y > name_edit.global_position.y) - assert(is_equal_approx(title_edit.position.x, name_edit.position.x)) - assert(identity.get_parent() == identity_stack) - assert(experience_row.get_parent() == identity_stack) - assert(identity.horizontal_alignment == HORIZONTAL_ALIGNMENT_RIGHT) - assert(identity_stack.global_position.x > name_edit.global_position.x) - assert(name_label.tooltip_text.contains( - "Shown to other players in multiplayer." - )) - page.call("_set_name_status", "Name is available in this game.") - assert(name_label.tooltip_text.contains( - "Name is available in this game." - )) - for visible_label: Label in page.find_children("*", "Label", true, false): - if visible_label.visible: - assert(visible_label.text != "Shown to other players in multiplayer.") - assert(visible_label.text != "Name is available in this game.") - var account_controls: Array = page.call("_account_controller_controls") - assert(name_edit in account_controls) - assert(title_edit in account_controls) - page.queue_free() - for _frame: int in 4: - await process_frame diff --git a/tests/profile_title_validation.gd.uid b/tests/profile_title_validation.gd.uid deleted file mode 100644 index f095103..0000000 --- a/tests/profile_title_validation.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cat806v782sr7 diff --git a/tests/progression_archive_validation.gd b/tests/progression_archive_validation.gd index 0daae87..3fd9eff 100644 --- a/tests/progression_archive_validation.gd +++ b/tests/progression_archive_validation.gd @@ -22,45 +22,11 @@ func _run() -> void: var save_manager := main.get("_save_manager") as PlayerSaveManager var player := main.get("_player") as Player var data_root := main.get("_data_root") as PlayerDataRoot - var home_state := main.get("_home_state") as PlayerHomeState - var network_profile := main.get_node( - "%NetworkProfilePreferences" - ) as NetworkProfilePreferences - var appearance_store := main.get_node( - "%PlayerAppearanceStore" - ) as PlayerAppearanceStore - assert( - save_manager != null - and player != null - and data_root != null - and home_state != null - and network_profile != null - and appearance_store != null - ) + assert(save_manager != null and player != null and data_root != null) assert(save_manager.initialize_new_game(864209)) save_manager.set_autosave_enabled(true) - var first_profile_id: String = network_profile.profile_id - var first_appearance: Dictionary = appearance_store.get_snapshot() - first_appearance["scale"] = 0.8 - assert(CharacterCustomizationCatalog.validate_snapshot(first_appearance)) - assert(network_profile.set_profile_identity( - "first save character", - "deep", - network_profile.speech_speed_id, - network_profile.call_id, - network_profile.sample_set_id, - "trailblazer", - )) - assert(appearance_store.save_snapshot(first_appearance)) assert(player.wallet.restore_balance(4321)) assert(player.bag.add_item(&"coffee")) - assert(home_state.add_owned_decor(&"basic_cube")) - assert(not home_state.place_decor( - &"basic_cube", - Vector3.ZERO, - 0.0, - PlayerHomeState.PlacementMode.GRID, - ).is_empty()) assert(save_manager.save_now()) var save_path: String = str(save_manager.get("_save_path")) @@ -72,56 +38,7 @@ func _run() -> void: _assert_opaque(save_path) var decoded: Dictionary = ProgressionSaveCodec.read_local_save(save_path) assert(bool(decoded.get("ok", false))) - assert(int((decoded["data"] as Dictionary)["save_version"]) == 11) - var saved_character: Dictionary = ( - (decoded["data"] as Dictionary).get("character", {}) - ) - assert(NetworkProfilePreferences.validate_save_data( - (saved_character.get("profile", {}) as Dictionary) - )) - assert(str((saved_character["profile"] as Dictionary)["profile_id"]) - == first_profile_id) - assert(str((saved_character["profile"] as Dictionary)["display_name"]) - == "first save character") - assert(str((saved_character["profile"] as Dictionary)["title"]) - == "trailblazer") - assert( - (saved_character["appearance"] as Dictionary) - == first_appearance - ) - # Starting another save must feel like a new character, then loading this - # archive must restore only this slot's name, voice, and appearance. - assert(save_manager.initialize_new_game(97531)) - assert(network_profile.profile_id != first_profile_id) - assert(network_profile.display_name == "stray") - assert(network_profile.title == "newbie") - assert(network_profile.voice_id != "deep") - assert( - appearance_store.get_snapshot() - == CharacterCustomizationCatalog.default_snapshot() - ) - assert(save_manager.load_player_data()) - assert(network_profile.profile_id == first_profile_id) - assert(network_profile.display_name == "first save character") - assert(network_profile.title == "trailblazer") - assert(network_profile.voice_id == "deep") - assert(appearance_store.get_snapshot() == first_appearance) - assert(not PlayerHomeState.sanitize_save_data( - (decoded["data"] as Dictionary).get("home", {}) - ).is_empty()) - assert( - ((decoded["data"] as Dictionary)["home"] as Dictionary) - .get("placements", []).size() == 1 - ) - var legacy_container_path: String = data_root.progression_backup_directory().path_join( - "netfishing-container.nfsave" - ) - _assert_legacy_progression_container( - legacy_container_path, - decoded["data"] as Dictionary, - ) - _assert_legacy_data_manifest(data_root.root_path.get_base_dir()) - _assert_legacy_identity_backup(main, data_root) + assert(int((decoded["data"] as Dictionary)["save_version"]) == 10) var archive_path: String = data_root.progression_backup_directory().path_join( "progression-test.nfsave" @@ -148,8 +65,6 @@ func _run() -> void: assert(save_manager.load_player_data()) assert(player.wallet.get_balance() == 4321) assert(save_manager.get_world_seed() == 864209) - assert(home_state.get_owned_count(&"basic_cube") == 1) - assert(home_state.get_placed_count(&"basic_cube") == 1) var legacy_data: Dictionary = ( ProgressionSaveCodec.read_local_save(save_path)["data"] @@ -176,8 +91,6 @@ func _run() -> void: var adopted_slot_id: String = str(adopted_slots.front().get("slot_id", "")) assert(bool(adopted_slots.front().get("legacy", false))) assert(bool(adopted_slots.front().get("has_save", false))) - assert(save_slots.get_online_slot_id() == adopted_slot_id) - assert(bool(adopted_slots.front().get("online", false))) var duplicated: Dictionary = save_slots.duplicate_slot( adopted_slot_id, @@ -191,9 +104,6 @@ func _run() -> void: assert(int(duplicate_summary.get("wallet_balance", -1)) == 4321) assert(int(duplicate_summary.get("world_seed", -1)) == 97531) assert(save_slots.activate_slot(duplicated_slot_id)) - assert(save_slots.mark_slot_for_online(duplicated_slot_id)) - assert(save_slots.get_online_slot_id() == duplicated_slot_id) - assert(bool(save_slots.get_slot(duplicated_slot_id).get("online", false))) assert(save_manager.load_player_data()) assert(player.wallet.get_balance() == 4321) assert(save_manager.get_world_seed() == 97531) @@ -216,7 +126,6 @@ func _run() -> void: assert(save_slots.delete_slot(duplicated_slot_id)) assert(save_slots.get_slot(duplicated_slot_id).is_empty()) assert(save_slots.list_slots().size() == 2) - assert(save_slots.get_online_slot_id() == save_slots.get_active_slot_id()) var settings_panels: Array[Node] = main.find_children( "*", "SettingsPanel", true, false @@ -225,25 +134,6 @@ func _run() -> void: for settings_panel: SettingsPanel in settings_panels: assert(settings_panel.get_node_or_null("%ExportProgression") == null) assert(settings_panel.get_node_or_null("%ImportProgression") == null) - var settings_panel: SettingsPanel = settings_panels.front() as SettingsPanel - settings_panel.set( - "_presentation_mode", SettingsPanel.PresentationMode.TITLE_EMBEDDED - ) - var unchanged_root: String = data_root.root_path - settings_panel.call("_choose_data_folder") - var data_folder_dialog := ( - settings_panel.get("_data_folder_dialog") as FileDialog - ) - assert(data_folder_dialog != null) - assert(data_folder_dialog.current_dir == unchanged_root) - data_folder_dialog.hide() - settings_panel.call("_change_data_folder", unchanged_root + "/") - await process_frame - assert(data_root.root_path == unchanged_root) - assert( - (settings_panel.get_node("%SettingsFeedback") as Label).text - == "this data folder is already active." - ) var save_slots_page := main.find_child( "SaveSlotsPage", true, false ) as SaveSlotsPage @@ -251,26 +141,13 @@ func _run() -> void: assert(save_slots_page.get_node("%ExportSlotButton") is Button) assert(save_slots_page.get_node("%ImportSlotButton") is Button) - var unchanged_migration: Dictionary = ( - PortableDataMigration.migrate_active_to( - data_root, unchanged_root + "/" - ) - ) - assert(bool(unchanged_migration.get("ok", false))) - assert(not bool(unchanged_migration.get("changed", true))) - assert(data_root.root_path == unchanged_root) - var migrated_root: String = data_root.root_path.get_base_dir().path_join( "progression-migrated-data" ) - settings_panel.call("_change_data_folder", migrated_root) - for _frame: int in 4: - await process_frame - assert(data_root.root_path == migrated_root) - assert( - (settings_panel.get_node("%SettingsFeedback") as Label).text - == "data folder changed." + var data_migration: Dictionary = PortableDataMigration.migrate_active_to( + data_root, migrated_root ) + assert(bool(data_migration.get("ok", false))) var migrated_save: String = migrated_root.path_join( "player/player_save.nfsave" ) @@ -290,18 +167,6 @@ func _run() -> void: "ok", false ) )) - var live_slots: Array[Dictionary] = save_slots.list_slots() - assert(live_slots.size() == 2) - var live_created: Dictionary = save_slots.create_empty_slot( - "live root switch" - ) - assert(bool(live_created.get("ok", false))) - var live_slot_id: String = str(live_created.get("slot_id", "")) - assert(save_slots.rename_slot(live_slot_id, "live root ready")) - assert( - str(save_slots.get_slot(live_slot_id).get("display_name", "")) - == "live root ready" - ) main.queue_free() for _frame: int in 4: @@ -311,124 +176,6 @@ func _run() -> void: quit() -func _assert_legacy_progression_container( - path: String, - payload: Dictionary, -) -> void: - var payload_json: String = JSON.stringify(payload) - var envelope: Dictionary = { - "magic": ProgressionSaveCodec.LEGACY_MAGIC, - "format_version": ProgressionSaveCodec.FORMAT_VERSION, - "kind": ProgressionSaveCodec.LOCAL_KIND, - "game_version": "0.18.1-alpha", - "created_at_unix": 1, - "payload_sha256": PortableFileGuard.hash_bytes( - payload_json.to_utf8_buffer() - ), - "payload_json": payload_json, - } - var file: FileAccess = FileAccess.open_encrypted_with_pass( - path, - FileAccess.WRITE, - ProgressionSaveCodec.CONTAINER_PASSPHRASE, - ) - assert(file != null) - file.store_string(JSON.stringify(envelope)) - file.close() - var decoded: Dictionary = ProgressionSaveCodec.read_local_save(path) - assert(bool(decoded.get("ok", false))) - assert(bool(decoded.get("legacy_container", false))) - - -func _assert_legacy_data_manifest(parent: String) -> void: - var legacy_root: String = parent.path_join("netfishing-manifest-root") - assert(DirAccess.make_dir_recursive_absolute(legacy_root) == OK) - var legacy_id: String = "0123456789abcdef0123456789abcdef" - var legacy_manifest: Dictionary = { - "format_version": PlayerDataRoot.MANIFEST_VERSION, - "layout_version": PlayerDataRoot.LAYOUT_VERSION, - "application": PlayerDataRoot.LEGACY_APPLICATION_ID, - "root_id": legacy_id, - "created_at_unix": 1, - "last_opened_at_unix": 1, - } - var legacy_path: String = legacy_root.path_join( - PlayerDataRoot.LEGACY_MANIFEST_FILENAME - ) - var file := FileAccess.open(legacy_path, FileAccess.WRITE) - assert(file != null) - file.store_string(JSON.stringify(legacy_manifest, "\t")) - file.close() - var legacy_data_root := PlayerDataRoot.new() - root.add_child(legacy_data_root) - assert(legacy_data_root.use_existing_root(legacy_root)) - assert(legacy_data_root.root_id == legacy_id) - assert(FileAccess.file_exists(legacy_path)) - var canonical_path: String = legacy_root.path_join( - PlayerDataRoot.MANIFEST_FILENAME - ) - assert(FileAccess.file_exists(canonical_path)) - var parser := JSON.new() - assert(parser.parse(FileAccess.get_file_as_string(canonical_path)) == OK) - assert((parser.data as Dictionary).get("application") == PlayerDataRoot.APPLICATION_ID) - legacy_data_root.queue_free() - - -func _assert_legacy_identity_backup(main: Node, data_root: PlayerDataRoot) -> void: - var player_identity := main.get("_player_identity") as PlayerIdentityStore - var identity_backups := main.get("_identity_backups") as IdentityBackupService - assert(player_identity != null and player_identity.is_ready()) - assert(identity_backups != null) - var material: Dictionary = player_identity.export_identity_material() - var fingerprint: String = str(material.get("fingerprint", "")) - var private_key := CryptoKey.new() - assert(private_key.load_from_string(str(material.get("private_pem", ""))) == OK) - var canonical: PackedByteArray = NetworkIdentityCrypto.canonical_bytes_for_prefix( - NetworkIdentityCrypto.LEGACY_DOMAIN_PREFIX, - "identity_backup_self_test", - ["player", fingerprint], - ) - var context := HashingContext.new() - assert(context.start(HashingContext.HASH_SHA256) == OK) - context.update(canonical) - var signature: PackedByteArray = Crypto.new().sign( - HashingContext.HASH_SHA256, - context.finish(), - private_key, - ) - var envelope: Dictionary = { - "magic": IdentityBackupService.LEGACY_MAGIC, - "format_version": IdentityBackupService.FORMAT_VERSION, - "identity_type": "player", - "algorithm": NetworkIdentityCrypto.ALGORITHM, - "private_pem": material.get("private_pem", ""), - "public_pem": material.get("public_pem", ""), - "fingerprint": fingerprint, - "created_at_unix": 1, - "source_device_id": data_root.device_id, - "self_signature": Marshalls.raw_to_base64(signature), - } - var backup_path: String = data_root.identity_backup_directory().path_join( - "netfishing-player.nfidentity" - ) - var passphrase := "legacy-test-passphrase" - var file: FileAccess = FileAccess.open_encrypted_with_pass( - backup_path, - FileAccess.WRITE, - passphrase, - ) - assert(file != null) - file.store_string(JSON.stringify(envelope)) - file.close() - var inspected: Dictionary = identity_backups.inspect_backup( - backup_path, - passphrase, - "player", - ) - assert(bool(inspected.get("ok", false))) - assert(str(inspected.get("fingerprint", "")) == fingerprint) - - func _assert_opaque(path: String) -> void: var bytes: PackedByteArray = PortableFileGuard.read_bytes(path) assert(not bytes.is_empty()) diff --git a/tests/rain_puddle_runtime_validation.gd b/tests/rain_puddle_runtime_validation.gd deleted file mode 100644 index 6456276..0000000 --- a/tests/rain_puddle_runtime_validation.gd +++ /dev/null @@ -1,84 +0,0 @@ -extends SceneTree - -const MainScene: PackedScene = preload("res://main/main.tscn") - - -func _initialize() -> void: - call_deferred("_run") - - -func _run() -> void: - root.size = Vector2i(1280, 720) - var main: Node = MainScene.instantiate() - root.add_child(main) - for _frame: int in 4: - await process_frame - if not bool(main.get("_application_initialized")): - main.call("_activate_selected_data_path", "", true) - for _frame: int in 8: - await process_frame - assert(bool(main.get("_application_initialized"))) - assert(bool(main.call( - "_apply_world", - WorldLayout.GENERATED, - PlayerSaveManager.DEFAULT_WORLD_SEED, - true, - ))) - var weather := main.get_node( - "%WorldWeatherService" - ) as WorldWeatherService - assert(weather != null) - weather.apply_authoritative_snapshot( - WorldWeatherService.Weather.RAINY, - 60.0, - ) - main.call("_set_gameplay_active", true) - await physics_frame - await physics_frame - - var puddles := main.get_node( - "RainPuddlePresentation" - ) as RainPuddlePresentation - assert(puddles != null) - assert(not puddles.is_light_performance_profile()) - assert(puddles.is_processing()) - puddles.set_suppressed(true) - assert(not puddles.is_processing()) - puddles.set_suppressed(false) - assert(puddles.is_processing()) - puddles.set_active(false) - assert(not puddles.is_processing()) - puddles.set_active(true) - assert(puddles.is_processing()) - for _tick: int in 18: - puddles.call("_process", 0.25) - assert(puddles.get_active_puddle_count() > 0) - var visual_root := puddles.get_node("PuddleVisuals") as Node3D - assert(visual_root != null) - for puddle_visual: Node in visual_root.get_children(): - assert(puddle_visual is MeshInstance3D) - assert(puddle_visual.get_child_count() == 0) - - weather.apply_authoritative_snapshot( - WorldWeatherService.Weather.SUNNY, - 60.0, - ) - puddles.call("_process", 30.0) - assert(puddles.get_active_puddle_count() == 0) - _stop_audio_players(main) - main.queue_free() - for _frame: int in 8: - await process_frame - print("Rain puddle runtime validation: PASS") - quit() - - -func _stop_audio_players(root_node: Node) -> void: - if root_node is AudioStreamPlayer: - (root_node as AudioStreamPlayer).stop() - elif root_node is AudioStreamPlayer2D: - (root_node as AudioStreamPlayer2D).stop() - elif root_node is AudioStreamPlayer3D: - (root_node as AudioStreamPlayer3D).stop() - for child: Node in root_node.get_children(): - _stop_audio_players(child) diff --git a/tests/rain_puddle_runtime_validation.gd.uid b/tests/rain_puddle_runtime_validation.gd.uid deleted file mode 100644 index 2937f9c..0000000 --- a/tests/rain_puddle_runtime_validation.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://jo5lqk2n8bik diff --git a/tests/save_reload_conflict_validation.gd b/tests/save_reload_conflict_validation.gd deleted file mode 100644 index 8b4387d..0000000 --- a/tests/save_reload_conflict_validation.gd +++ /dev/null @@ -1,166 +0,0 @@ -extends SceneTree - -const MainScene: PackedScene = preload("res://main/main.tscn") -const WAIT_MILLISECONDS: int = 20_000 - -var _conflicts: Array[Dictionary] = [] - - -func _initialize() -> void: - _run.call_deferred() - - -func _run() -> void: - root.size = Vector2i(1280, 720) - var main: Node = MainScene.instantiate() - root.add_child(main) - for _frame: int in 4: - await process_frame - if not bool(main.get("_application_initialized")): - main.call("_activate_selected_data_path", "", true) - for _frame: int in 8: - await process_frame - assert(bool(main.get("_application_initialized"))) - - var data_root := main.get("_data_root") as PlayerDataRoot - var save_manager := main.get("_save_manager") as PlayerSaveManager - var save_slots := main.get("_save_slots") as PlayerSaveSlotCatalog - var player := main.get("_player") as Player - var session := main.get_node("%NetworkSession") as NetworkSession - var network_profile := main.get_node( - "%NetworkProfilePreferences" - ) as NetworkProfilePreferences - var appearance_store := main.get_node( - "%PlayerAppearanceStore" - ) as PlayerAppearanceStore - assert( - data_root != null - and save_manager != null - and save_slots != null - and player != null - and session != null - and network_profile != null - and appearance_store != null - ) - var conflict_dialog_callback := Callable(main, "_on_portable_conflict") - if data_root.conflict_detected.is_connected(conflict_dialog_callback): - data_root.conflict_detected.disconnect(conflict_dialog_callback) - data_root.conflict_detected.connect(_on_conflict_detected) - if OS.get_environment( - PlayerDataRoot.ISOLATED_VALIDATION_ENVIRONMENT - ) == "1": - assert( - PlayerDataRoot.ISOLATED_VALIDATION_DIRECTORY - in data_root.root_path - ) - - main.call( - "_on_new_slot_requested", - "reload regression", - WorldLayout.STARTER_ISLAND, - 424242, - "", - ) - assert(await _wait_for_gameplay(main, true)) - var slot_id: String = save_slots.get_active_slot_id() - assert(not slot_id.is_empty()) - assert(player.wallet.restore_balance(321)) - assert(network_profile.set_profile_identity( - "reload stray", - "deep", - network_profile.speech_speed_id, - network_profile.call_id, - network_profile.sample_set_id, - "returner", - )) - var custom_appearance: Dictionary = appearance_store.get_snapshot() - custom_appearance["scale"] = 0.8 - assert(appearance_store.save_snapshot(custom_appearance)) - main.call("_on_return_to_title_requested") - assert(await _wait_for_gameplay(main, false)) - assert(not save_manager.is_dirty()) - - # Establish the exact reported lifecycle once: load a local slot, return to - # title, then immediately select that same slot again in this process. - main.call("_on_slot_play_requested", slot_id) - assert(await _wait_for_gameplay(main, true)) - main.call("_on_return_to_title_requested") - assert(await _wait_for_gameplay(main, false)) - assert(not save_manager.is_dirty()) - - # A selected save owns its character state. An out-of-band edit to the - # compatibility profile mirror must not make that valid save unloadable or - # be overwritten merely by loading it. A later explicit profile edit must - # still detect the external mutation. - var profile_path: String = data_root.path_for(&"network_profile") - var external_profile_bytes := PortableFileGuard.read_bytes(profile_path) - assert(not external_profile_bytes.is_empty()) - external_profile_bytes.append(0x0a) - assert(_write_external_bytes(profile_path, external_profile_bytes)) - _conflicts.clear() - main.call("_on_slot_play_requested", slot_id) - assert(await _wait_for_gameplay(main, true)) - assert( - _conflicts.is_empty(), - "same-process same-slot reload reported false conflicts: %s" - % [_conflicts], - ) - assert(player.wallet.get_balance() == 321) - assert(network_profile.display_name == "reload stray") - assert(network_profile.title == "returner") - assert(appearance_store.get_snapshot() == custom_appearance) - assert( - PortableFileGuard.read_bytes(profile_path) - == external_profile_bytes - ) - _conflicts.clear() - assert(not network_profile.set_display_name("explicit overwrite")) - assert(_conflicts.size() == 1) - assert(FileAccess.file_exists(str(_conflicts.front().get("path", "")))) - - # A real out-of-band edit must still be caught. Mutating the canonical bytes - # after load simulates a Syncthing/device replacement while this process is - # holding an older expected hash. - var save_path: String = str(save_manager.get("_save_path")) - var external_bytes := PortableFileGuard.read_bytes(save_path) - assert(not external_bytes.is_empty()) - external_bytes.append(0x7f) - assert(_write_external_bytes(save_path, external_bytes)) - assert(player.wallet.restore_balance(654)) - _conflicts.clear() - assert(not save_manager.save_now()) - assert(_conflicts.size() == 1) - assert(FileAccess.file_exists(str(_conflicts.front().get("path", "")))) - - save_manager.set_autosave_enabled(false) - save_manager.cancel_pending_autosave() - session.disconnect_session("Save reload conflict validation complete.") - main.queue_free() - for _frame: int in 4: - await process_frame - print("Save reload conflict validation: PASS") - quit(0) - - -func _wait_for_gameplay(main: Node, expected: bool) -> bool: - var deadline: int = Time.get_ticks_msec() + WAIT_MILLISECONDS - while Time.get_ticks_msec() < deadline: - if bool(main.get("_gameplay_started")) == expected: - return true - await process_frame - return false - - -func _on_conflict_detected(message: String, path: String) -> void: - _conflicts.append({"message": message, "path": path}) - - -func _write_external_bytes(path: String, bytes: PackedByteArray) -> bool: - var file := FileAccess.open(path, FileAccess.WRITE) - if file == null: - return false - file.store_buffer(bytes) - file.flush() - var succeeded: bool = file.get_error() == OK - file.close() - return succeeded diff --git a/tests/save_reload_conflict_validation.gd.uid b/tests/save_reload_conflict_validation.gd.uid deleted file mode 100644 index fa26ace..0000000 --- a/tests/save_reload_conflict_validation.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cmd4elmipmywa diff --git a/tests/session_switch_multiplayer_validation.gd b/tests/session_switch_multiplayer_validation.gd index 37f5c5b..86c9a84 100644 --- a/tests/session_switch_multiplayer_validation.gd +++ b/tests/session_switch_multiplayer_validation.gd @@ -123,32 +123,6 @@ func _run_client() -> void: ) await _wait_for_join(main, session, SECOND_HOST_PORT) assert(bool(main.get("_gameplay_started"))) - var save_slots := main.get("_save_slots") as PlayerSaveSlotCatalog - var save_manager := main.get("_save_manager") as PlayerSaveManager - var local_slot_id: String = save_slots.get_active_slot_id() - assert(not local_slot_id.is_empty()) - main.call("_on_return_to_title_requested") - var title_deadline: int = Time.get_ticks_msec() + WAIT_SECONDS * 1000 - while ( - Time.get_ticks_msec() < title_deadline - and session.state != NetworkSession.State.INACTIVE - ): - await process_frame - assert(session.state == NetworkSession.State.INACTIVE) - assert(not bool(main.get("_gameplay_started"))) - assert(not save_manager.is_dirty()) - main.call("_on_slot_play_requested", local_slot_id) - var local_deadline: int = Time.get_ticks_msec() + WAIT_SECONDS * 1000 - while ( - Time.get_ticks_msec() < local_deadline - and ( - not session.is_host() - or not bool(main.get("_gameplay_started")) - ) - ): - await process_frame - assert(session.is_host()) - assert(bool(main.get("_gameplay_started"))) print("Session switch multiplayer client validation: PASS") session.disconnect_session("") main.queue_free() diff --git a/tests/shoreline_ambience_validation.gd b/tests/shoreline_ambience_validation.gd new file mode 100644 index 0000000..78829f1 --- /dev/null +++ b/tests/shoreline_ambience_validation.gd @@ -0,0 +1,50 @@ +extends SceneTree + +const ShorelineAmbienceType := preload("res://world/shoreline_ambience.gd") +const WavesStream := preload("res://audio/ambience/waves.wav") + + +func _initialize() -> void: + call_deferred("_run") + + +func _run() -> void: + var waves := WavesStream as AudioStreamWAV + assert(waves != null) + + var segments: Array[PackedVector2Array] = [ + PackedVector2Array([Vector2.ZERO, Vector2(10.0, 0.0)]), + ] + assert(is_equal_approx( + ShorelineAmbienceType.distance_to_segments(Vector2(5.0, 3.0), segments), + 3.0, + )) + assert(is_equal_approx( + ShorelineAmbienceType.distance_to_segments(Vector2(-4.0, 0.0), segments), + 4.0, + )) + + var controller := ShorelineAmbienceType.new() as ShorelineAmbience + var runtime_audio := AudioStreamPlayer.new() + runtime_audio.name = "WavesAudio" + runtime_audio.unique_name_in_owner = true + runtime_audio.stream = WavesStream + runtime_audio.bus = &"SFX" + controller.add_child(runtime_audio) + runtime_audio.owner = controller + root.add_child(controller) + await process_frame + assert(runtime_audio.bus == &"Environment") + assert(runtime_audio.stream == null) + controller.set_audio_enabled(true) + assert(controller.near_distance < controller.far_distance) + assert(controller.near_volume_db > controller.far_volume_db) + var runtime_waves := runtime_audio.stream as AudioStreamWAV + assert(runtime_waves.loop_mode == AudioStreamWAV.LOOP_FORWARD) + assert(runtime_waves.loop_begin == 0) + assert(runtime_waves.loop_end == 1044956) + controller.free() + await process_frame + + print("Shoreline ambience validation: PASS") + quit() diff --git a/tests/shoreline_ambience_validation.gd.uid b/tests/shoreline_ambience_validation.gd.uid new file mode 100644 index 0000000..4b7987b --- /dev/null +++ b/tests/shoreline_ambience_validation.gd.uid @@ -0,0 +1 @@ +uid://bwvhgpbkb00l1 diff --git a/tests/shoreline_ribbon_validation.gd b/tests/shoreline_ribbon_validation.gd new file mode 100644 index 0000000..e78acb0 --- /dev/null +++ b/tests/shoreline_ribbon_validation.gd @@ -0,0 +1,97 @@ +extends SceneTree + +const ShorelineMesh: ArrayMesh = preload( + "res://world/generated/shorelines/starter_ocean_shoreline.tres" +) +const GEOMETRY_EPSILON := 0.0001 +const CROSSING_NEIGHBORHOOD := 32 + + +func _initialize() -> void: + call_deferred("_run") + + +func _run() -> void: + assert(ShorelineMesh.get_surface_count() == 1) + var arrays := ShorelineMesh.surface_get_arrays(0) + var vertices := arrays[Mesh.ARRAY_VERTEX] as PackedVector3Array + var indices := arrays[Mesh.ARRAY_INDEX] as PackedInt32Array + assert(not vertices.is_empty()) + assert(vertices.size() % 2 == 0) + assert(indices.size() == vertices.size() * 3) + var point_count := vertices.size() / 2 + var land_edge := PackedVector2Array() + var water_edge := PackedVector2Array() + for index: int in point_count: + var land := vertices[index * 2] + var water := vertices[index * 2 + 1] + land_edge.append(Vector2(land.x, land.z)) + water_edge.append(Vector2(water.x, water.z)) + var ribbon_width := land.distance_to(water) + assert(ribbon_width >= 0.34) + assert(ribbon_width <= 1.5) + var crossing_count := ( + _count_local_crossings(water_edge) + + _count_local_crossings(land_edge) + ) + if crossing_count > 0: + push_error( + "Shoreline ribbon contains %d local edge crossings." + % crossing_count + ) + quit(1) + return + print("Shoreline ribbon validation: PASS") + quit() + + +func _count_local_crossings(points: PackedVector2Array) -> int: + var crossing_count := 0 + for first: int in points.size(): + var first_next := (first + 1) % points.size() + var checked_neighbors := mini( + CROSSING_NEIGHBORHOOD, + points.size() - 2, + ) + for offset: int in range(2, checked_neighbors + 1): + var second := (first + offset) % points.size() + var second_next := (second + 1) % points.size() + if second_next == first: + continue + if _segments_cross( + points[first], + points[first_next], + points[second], + points[second_next], + ): + crossing_count += 1 + return crossing_count + + +func _segments_cross( + a: Vector2, + b: Vector2, + c: Vector2, + d: Vector2, +) -> bool: + if ( + maxf(a.x, b.x) < minf(c.x, d.x) - GEOMETRY_EPSILON + or maxf(c.x, d.x) < minf(a.x, b.x) - GEOMETRY_EPSILON + or maxf(a.y, b.y) < minf(c.y, d.y) - GEOMETRY_EPSILON + or maxf(c.y, d.y) < minf(a.y, b.y) - GEOMETRY_EPSILON + ): + return false + var first_direction := b - a + var second_direction := d - c + var denominator := first_direction.cross(second_direction) + if absf(denominator) <= GEOMETRY_EPSILON: + return false + var offset := c - a + var first_amount := offset.cross(second_direction) / denominator + var second_amount := offset.cross(first_direction) / denominator + return ( + first_amount > GEOMETRY_EPSILON + and first_amount < 1.0 - GEOMETRY_EPSILON + and second_amount > GEOMETRY_EPSILON + and second_amount < 1.0 - GEOMETRY_EPSILON + ) diff --git a/tests/shoreline_ribbon_validation.gd.uid b/tests/shoreline_ribbon_validation.gd.uid new file mode 100644 index 0000000..7989d89 --- /dev/null +++ b/tests/shoreline_ribbon_validation.gd.uid @@ -0,0 +1 @@ +uid://c73frygpfhred diff --git a/tests/surface_drawing_multiplayer_validation.gd b/tests/surface_drawing_multiplayer_validation.gd index f79700e..d0508b2 100644 --- a/tests/surface_drawing_multiplayer_validation.gd +++ b/tests/surface_drawing_multiplayer_validation.gd @@ -27,12 +27,10 @@ func _run_host() -> void: assert(bool(main.call( "_apply_world", WorldLayout.STARTER_ISLAND, 1, true ))) - assert(bool(main.call( - "_prepare_host_world", WorldLayout.STARTER_ISLAND, 1 - ))) - var save_manager := main.get("_save_manager") as PlayerSaveManager - assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND)) + assert(session.set_host_world(WorldLayout.STARTER_ISLAND, 1)) assert(session.start_private_host(TEST_PORT)) + var save_manager := main.get("_save_manager") as PlayerSaveManager + assert(save_manager.initialize_new_game()) main.call("_enter_gameplay") await physics_frame await physics_frame @@ -64,40 +62,6 @@ func _run_host() -> void: remote_peer_id ) assert(remote_record != null) - var network_home := main.get_node( - "%NetworkHomeService" - ) as NetworkHomeService - var home_world := main.get_node("%HomeWorldService") as HomeWorldService - var spawn_service := main.get_node( - "%PlayerSpawnService" - ) as PlayerSpawnService - assert(await _wait_for_home( - network_home, remote_record.identity_fingerprint - )) - var remote_avatar: Player = spawn_service.get_avatar(remote_peer_id) - assert(remote_avatar != null) - var exterior_spawn: Transform3D = home_world.get_exterior_spawn_transform( - remote_record.identity_fingerprint - ) - var exterior_deadline: int = Time.get_ticks_msec() + 5000 - while ( - Time.get_ticks_msec() < exterior_deadline - and remote_avatar.global_position.distance_to(exterior_spawn.origin) > 0.25 - ): - await physics_frame - assert(remote_avatar.global_position.distance_to(exterior_spawn.origin) <= 0.25) - var canvas_state: Dictionary = service.get_canvas_state(canvas_id) - var canvas_origin: Vector3 = SurfaceDrawingProtocol.array_to_vector( - canvas_state["origin"] - ) - remote_avatar.global_position = Vector3( - canvas_origin.x + 1.0, - player.global_position.y, - canvas_origin.z, - ) - session.publish_authoritative_teleport(remote_peer_id) - for _frame: int in 4: - await physics_frame assert(session.peer_supports_capability( remote_peer_id, SurfaceDrawingProtocol.CAPABILITY )) @@ -188,9 +152,6 @@ func _run_host() -> void: ): await process_frame assert(service.get_canvas_ids().size() == 1) - # Keep the second stamp observable on the client before the ban removes all - # artwork carrying that participant fingerprint. - await create_timer(1.0).timeout var player_list := main.get_node( "%NetworkPlayerListService" ) as NetworkPlayerListService @@ -260,20 +221,6 @@ func _run_client() -> void: var canvas_id: String = service.get_canvas_ids()[0] var snapshot: Dictionary = service.get_canvas_state(canvas_id) assert(str(_find_cell(snapshot, 7, 7).get("color_id", "")) == "coral") - var canvas_origin: Vector3 = SurfaceDrawingProtocol.array_to_vector( - snapshot["origin"] - ) - var placement_deadline: int = Time.get_ticks_msec() + 10000 - while ( - Time.get_ticks_msec() < placement_deadline - and player.global_position.distance_to(canvas_origin) - > NetworkSurfaceDrawingService.MAX_DRAW_DISTANCE + 2.0 - ): - await physics_frame - assert( - player.global_position.distance_to(canvas_origin) - <= NetworkSurfaceDrawingService.MAX_DRAW_DISTANCE + 2.0 - ) assert(service.request_cell_edits(canvas_id, [{ "x": 7, "y": 7, @@ -434,18 +381,3 @@ func _create_initialized_main() -> Node: await process_frame assert(bool(main.get("_application_initialized"))) return main - - -func _wait_for_home( - network_home: NetworkHomeService, - fingerprint: String, -) -> bool: - var deadline: int = Time.get_ticks_msec() + 10000 - while Time.get_ticks_msec() < deadline: - await process_frame - var manifests: Dictionary = network_home.get( - "_manifests_by_fingerprint" - ) - if manifests.has(fingerprint): - return true - return false diff --git a/tests/surface_drawing_performance_validation.gd b/tests/surface_drawing_performance_validation.gd deleted file mode 100644 index 26158df..0000000 --- a/tests/surface_drawing_performance_validation.gd +++ /dev/null @@ -1,178 +0,0 @@ -# SPDX-License-Identifier: GPL-3.0-or-later -extends SceneTree - -const CANVAS_COUNT: int = 10 -const GRID_SIZE: int = 128 -const MAX_SETUP_MSEC: float = 2500.0 -const MAX_STATIC_MEMORY_MIB: float = 32.0 -const FINGERPRINT_A := ( - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" -) -const FINGERPRINT_B := ( - "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" -) - - -func _initialize() -> void: - call_deferred("_run") - - -func _run() -> void: - _validate_finalized_capacity() - _validate_dense_cells_and_author_index() - var drawing_root := Node3D.new() - root.add_child(drawing_root) - var colors := PackedByteArray() - colors.resize(GRID_SIZE * GRID_SIZE) - colors.fill(1) - var authors := PackedInt32Array() - authors.resize(GRID_SIZE * GRID_SIZE) - authors.fill(1) - var memory_before: int = OS.get_static_memory_usage() - var started_usec: int = Time.get_ticks_usec() - for canvas_index: int in CANVAS_COUNT: - var canvas := SurfaceDrawingCanvas.new() - drawing_root.add_child(canvas) - var state: Dictionary = _compact_state( - "canvas-%d" % canvas_index, - canvas_index, - colors, - authors, - ) - assert(SurfaceDrawingProtocol.validate_canvas_state(state)) - assert(canvas.setup(state, null)) - assert(canvas.get_rendered_pixel_count() == GRID_SIZE * GRID_SIZE) - var artwork := canvas.get("_pixel_instance") as MeshInstance3D - var arrays: Array = artwork.mesh.surface_get_arrays(0) - var vertices: PackedVector3Array = arrays[Mesh.ARRAY_VERTEX] - assert( - vertices.size() - <= (SurfaceDrawingCanvas.FINALIZED_MAX_SUBDIVISIONS + 1) ** 2 - ) - var setup_msec: float = ( - float(Time.get_ticks_usec() - started_usec) / 1000.0 - ) - var memory_mib: float = ( - float(OS.get_static_memory_usage() - memory_before) / 1048576.0 - ) - assert( - setup_msec <= MAX_SETUP_MSEC, - "finalized artwork setup took %.2f ms" % setup_msec, - ) - assert( - memory_mib <= MAX_STATIC_MEMORY_MIB, - "finalized artwork retained %.2f MiB" % memory_mib, - ) - print( - "Surface drawing performance validation: PASS (%.2f ms, %.2f MiB)" - % [setup_msec, memory_mib] - ) - drawing_root.queue_free() - await process_frame - quit() - - -func _validate_finalized_capacity() -> void: - var world_scene := load( - "res://world/generation/generated_world_region.tscn" - ) as PackedScene - assert(world_scene != null) - var world_region: Node = world_scene.instantiate() - var generator := world_region.get_node( - "Terrain/TerrainChunkGenerator" - ) as TerrainChunkGenerator - assert(generator != null and generator.catalog != null) - var canvas_extent: float = ( - float(SurfaceDrawingProtocol.MAX_GRID_SIZE) - * SurfaceDrawingProtocol.CELL_SIZE - ) - var required_columns: int = ceili( - float(generator.grid_size.x) * generator.catalog.chunk_size - / canvas_extent - ) - var required_rows: int = ceili( - float(generator.grid_size.y) * generator.catalog.chunk_size - / canvas_extent - ) - var required_canvases: int = required_columns * required_rows - var cells_per_canvas: int = ( - SurfaceDrawingProtocol.MAX_GRID_SIZE - * SurfaceDrawingProtocol.MAX_GRID_SIZE - ) - assert( - SurfaceDrawingProtocol.MAX_FINALIZED_CANVASES >= required_canvases, - "finalized canvas budget cannot tile the generated world", - ) - assert( - SurfaceDrawingProtocol.MAX_FINALIZED_GRID_CELLS - >= required_canvases * cells_per_canvas, - "finalized cell budget cannot tile the generated world", - ) - world_region.free() - - -func _validate_dense_cells_and_author_index() -> void: - var state: Dictionary = { - "session_id": "dense-cell-test", - "canvas_id": "dense-cell-canvas", - "origin": [0.0, 0.0, 0.0], - "normal": [0.0, 1.0, 0.0], - "tangent": [1.0, 0.0, 0.0], - "width": 16, - "height": 16, - "cell_size": SurfaceDrawingProtocol.CELL_SIZE, - "revision": 1, - "guide_visible": false, - "finalized": true, - "layer": 1, - "creator_fingerprint": FINGERPRINT_A, - "participant_fingerprints": [FINGERPRINT_A, FINGERPRINT_B], - "cells": [ - {"x": 1, "y": 2, "color_id": "coral", "author_fingerprint": FINGERPRINT_A}, - {"x": 3, "y": 4, "color_id": "blue", "author_fingerprint": FINGERPRINT_B}, - ], - } - var buffer := SurfaceDrawingCellBuffer.new() - assert(buffer.configure_from_state(state)) - assert(buffer.get_painted_count() == 2) - assert(buffer.get_author_cell_keys(FINGERPRINT_A) == PackedInt32Array([33])) - assert(buffer.get_author_cell_keys(FINGERPRINT_B) == PackedInt32Array([67])) - var compact: Dictionary = state.duplicate(true) - compact.erase("cells") - compact.merge(buffer.to_compact_fields(), true) - assert(SurfaceDrawingProtocol.validate_canvas_state(compact)) - var restored := SurfaceDrawingCellBuffer.new() - assert(restored.configure_from_state(compact)) - assert(restored.to_cells() == buffer.to_cells()) - assert(restored.apply_edits([ - {"x": 1, "y": 2, "color_id": "", "author_fingerprint": ""}, - ])) - assert(restored.get_author_cell_keys(FINGERPRINT_A).is_empty()) - assert(restored.get_painted_count() == 1) - - -func _compact_state( - canvas_id: String, - layer: int, - colors: PackedByteArray, - authors: PackedInt32Array, -) -> Dictionary: - return { - "session_id": "performance-test", - "canvas_id": canvas_id, - "origin": [float(layer) * 12.0, 0.0, 0.0], - "normal": [0.0, 1.0, 0.0], - "tangent": [1.0, 0.0, 0.0], - "width": GRID_SIZE, - "height": GRID_SIZE, - "cell_size": SurfaceDrawingProtocol.CELL_SIZE, - "revision": 1, - "guide_visible": false, - "finalized": true, - "layer": layer, - "creator_fingerprint": FINGERPRINT_A, - "participant_fingerprints": [FINGERPRINT_A], - "cell_encoding": SurfaceDrawingProtocol.CELL_ENCODING, - "cell_colors": colors, - "cell_authors": authors, - } diff --git a/tests/surface_drawing_performance_validation.gd.uid b/tests/surface_drawing_performance_validation.gd.uid deleted file mode 100644 index 85392a7..0000000 --- a/tests/surface_drawing_performance_validation.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://g73q2xuy33nm diff --git a/tests/surface_drawing_runtime_validation.gd b/tests/surface_drawing_runtime_validation.gd index 85110cd..e04afc2 100644 --- a/tests/surface_drawing_runtime_validation.gd +++ b/tests/surface_drawing_runtime_validation.gd @@ -20,13 +20,9 @@ func _run() -> void: await process_frame assert(bool(main.get("_application_initialized"))) var session := main.get_node("%NetworkSession") as NetworkSession - assert(bool(main.call( - "_apply_world", WorldLayout.STARTER_ISLAND, 1, true - ))) - assert(session.set_host_world(WorldLayout.STARTER_ISLAND, 1)) assert(session.start_private_host(TEST_PORT)) var save_manager := main.get("_save_manager") as PlayerSaveManager - assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND)) + assert(save_manager.initialize_new_game()) main.call("_enter_gameplay") await physics_frame await physics_frame diff --git a/tests/surface_drawing_texture_renderer_validation.gd b/tests/surface_drawing_texture_renderer_validation.gd index e4bf7f7..ed99383 100644 --- a/tests/surface_drawing_texture_renderer_validation.gd +++ b/tests/surface_drawing_texture_renderer_validation.gd @@ -94,16 +94,6 @@ func _run() -> void: if child is MeshInstance3D: artwork_mesh_count += 1 assert(artwork_mesh_count == 1) - var finalized_instance := canvas.get( - "_pixel_instance" - ) as MeshInstance3D - var finalized_material := finalized_instance.mesh.surface_get_material( - 0 - ) as StandardMaterial3D - assert( - finalized_material.albedo_texture - in persistent_textures - ) assert(canvas.get_export_image().get_size() == Vector2i(32, 32)) world.queue_free() await process_frame diff --git a/tests/surface_drawing_validation.gd b/tests/surface_drawing_validation.gd index d57b95a..ac48a67 100644 --- a/tests/surface_drawing_validation.gd +++ b/tests/surface_drawing_validation.gd @@ -40,31 +40,13 @@ func _validate_palette() -> void: func _validate_protocol_bounds() -> void: - var grid_width: int = SurfaceDrawingProtocol.GRID_WIDTH - var grid_height: int = SurfaceDrawingProtocol.GRID_HEIGHT - var grid_sizes: Variant = SurfaceDrawingProtocol.GRID_SIZES - var cell_size: float = SurfaceDrawingProtocol.CELL_SIZE - assert( - str(SurfaceDrawingProtocol.CAPABILITY) - == NetworkProtocol.SURFACE_DRAWING_CAPABILITY - ) - assert(grid_width == 16) - assert(grid_height == 16) - assert(grid_sizes == [16, 32, 64, 128]) - assert( - SurfaceDrawingProtocol.MAX_CANVASES - == SurfaceDrawingProtocol.MAX_ACTIVE_CANVASES - + SurfaceDrawingProtocol.MAX_FINALIZED_CANVASES - ) - assert( - SurfaceDrawingProtocol.MAX_FINALIZED_GRID_CELLS - >= SurfaceDrawingProtocol.MAX_FINALIZED_CANVASES - * SurfaceDrawingProtocol.MAX_GRID_SIZE - * SurfaceDrawingProtocol.MAX_GRID_SIZE - ) - assert(is_equal_approx(cell_size, 0.075)) + assert(SurfaceDrawingProtocol.GRID_WIDTH == 16) + assert(SurfaceDrawingProtocol.GRID_HEIGHT == 16) + assert(SurfaceDrawingProtocol.GRID_SIZES == [16, 32, 64, 128]) + assert(is_equal_approx(SurfaceDrawingProtocol.CELL_SIZE, 0.075)) assert(is_equal_approx( - float(grid_width) * cell_size, + float(SurfaceDrawingProtocol.GRID_WIDTH) + * SurfaceDrawingProtocol.CELL_SIZE, 1.2, )) var canvas_request: Dictionary = { @@ -175,14 +157,14 @@ func _validate_grid_snapping() -> void: "creator_fingerprint": FINGERPRINT_A, "cells": [], } - var snap_result: Dictionary = SurfaceDrawingPlacement.resolve( + var snapped: Dictionary = SurfaceDrawingPlacement.resolve( Vector3(1.08, 0.02, 0.08), Vector3.UP, Vector3.RIGHT, [anchor], ) - assert(bool(snap_result["snapped"])) - var snapped_origin: Vector3 = snap_result["origin"] + assert(bool(snapped["snapped"])) + var snapped_origin: Vector3 = snapped["origin"] assert(snapped_origin.is_equal_approx(Vector3(1.2, 0.0, 0.0))) var unsnapped: Dictionary = SurfaceDrawingPlacement.resolve( Vector3(0.6, 0.0, 0.0), @@ -257,12 +239,8 @@ func _validate_canvas_geometry_and_collaboration() -> void: assert(not canvas.is_guide_visible()) assert(canvas.is_finalized()) assert(not canvas.has_guide_geometry()) - var finalized_instance := canvas.get("_pixel_instance") as MeshInstance3D - var finalized_material := finalized_instance.mesh.surface_get_material( - 0 - ) as StandardMaterial3D - assert(finalized_instance.mesh != persistent_mesh) - assert(finalized_material.albedo_texture == persistent_texture) + assert(pixel_instance.mesh == persistent_mesh) + assert(pixel_material.albedo_texture == persistent_texture) await process_frame var finished_pixel_scale: float = canvas.get_rendered_pixel_size() assert( @@ -284,8 +262,8 @@ func _validate_canvas_geometry_and_collaboration() -> void: }], } assert(canvas.apply_update(second_update)) - assert(finalized_instance == canvas.get("_pixel_instance")) - assert(finalized_material.albedo_texture == persistent_texture) + assert(pixel_instance.mesh == persistent_mesh) + assert(pixel_material.albedo_texture == persistent_texture) var cells: Array[Dictionary] = canvas.get_authoritative_cells() assert(cells.size() == 1) assert(cells[0]["color_id"] == "blue") diff --git a/tests/tackle_order_validation.gd b/tests/tackle_order_validation.gd index bf93469..5a38e06 100644 --- a/tests/tackle_order_validation.gd +++ b/tests/tackle_order_validation.gd @@ -55,31 +55,6 @@ func _run() -> void: assert(bag.move_item_to_storage_slot(&"worms", shrimp_slot)) assert(bag.get_storage_slot(&"worms") == shrimp_slot) assert(bag.get_storage_slot(&"shrimp") == worms_slot) - - # Exhausting bait removes its owned record while retaining the unlock. A - # later refill therefore receives whichever inventory slot happens to be free - # at that moment. The tackle page must keep catalog order instead of exposing - # that incidental refill order. - for item_id: StringName in EXPECTED_BAIT_ORDER: - if bag.get_quantity(item_id) == 0: - assert(bag.add_item(item_id, 1)) - for item_id: StringName in EXPECTED_BAIT_ORDER: - assert(bag.remove_item(item_id, 1)) - var reverse_refill_order: Array[StringName] = EXPECTED_BAIT_ORDER.duplicate() - reverse_refill_order.reverse() - for item_id: StringName in reverse_refill_order: - assert(bag.add_item(item_id, 1)) - var refilled_items: Array[OwnedItem] = bag.get_unlocked_bait_items() - refilled_items.sort_custom( - func(first: OwnedItem, second: OwnedItem) -> bool: - return bool(player_menu.call( - "_sort_tackle_items", first, second - )) - ) - var refilled_ids: Array[StringName] = [] - for owned: OwnedItem in refilled_items: - refilled_ids.append(owned.item_id) - assert(refilled_ids == EXPECTED_BAIT_ORDER) bag.free() player_menu.free() print("Tackle order validation: PASS") diff --git a/tests/terrain_chunk_generator_validation.gd b/tests/terrain_chunk_generator_validation.gd index 4bbb5a3..b8d24cf 100644 --- a/tests/terrain_chunk_generator_validation.gd +++ b/tests/terrain_chunk_generator_validation.gd @@ -42,7 +42,6 @@ const EXPECTED_IDS: Array[String] = [ "chunk_0035", "chunk_0036", "chunk_0037", - "chunk_0038", "chunk_9999", "chunk_9998", "chunk_9997", @@ -99,7 +98,6 @@ const EXPECTED_VARIANT_COUNTS: Dictionary[StringName, int] = { &"chunk_0035": 4, &"chunk_0036": 4, &"chunk_0037": 4, - &"chunk_0038": 4, &"chunk_9999": 4, &"chunk_9998": 4, &"chunk_9997": 4, @@ -165,7 +163,6 @@ func _validate_catalog() -> void: var lake_narrow_to_regular := CATALOG.definition_for_id(&"chunk_0023") var river_edge := CATALOG.definition_for_id(&"chunk_0024") var river_edge_variant := CATALOG.definition_for_id(&"chunk_0025") - var river_stone_bridge := CATALOG.definition_for_id(&"chunk_0038") var river_source_right := CATALOG.definition_for_id(&"chunk_0029") var river_source_left := CATALOG.definition_for_id(&"chunk_0030") var river_outlet_right := CATALOG.definition_for_id(&"chunk_0031") @@ -211,7 +208,6 @@ func _validate_catalog() -> void: and lake_narrow_to_regular != null and river_edge != null and river_edge_variant != null - and river_stone_bridge != null and river_source_right != null and river_source_left != null and river_outlet_right != null @@ -259,7 +255,6 @@ func _validate_catalog() -> void: and lake_narrow_to_regular != null and river_edge != null and river_edge_variant != null - and river_stone_bridge != null and river_source_right != null and river_source_left != null and river_outlet_right != null @@ -447,7 +442,6 @@ func _validate_catalog() -> void: and stream_variant.water_inlet_edges == stream.water_inlet_edges and stream_variant.water_outlet_edges == stream.water_outlet_edges and stream_variant.water_surface_size == stream.water_surface_size - and stream.water_surface_size.x >= 4.0 and stream.water_surface_offset.x < 0.0 and stream_variant.water_surface_offset.x > 0.0 and is_equal_approx( @@ -456,7 +450,7 @@ func _validate_catalog() -> void: ), ( "Both pond-stream visuals must share one combined selection weight " - + "and waterline-wide mirrored water footprints." + + "and mirrored water footprints." ), ) _check( @@ -515,8 +509,6 @@ func _validate_catalog() -> void: ( not river_edge.participates_in_base_solver and not river_edge_variant.participates_in_base_solver - and not river_stone_bridge.participates_in_base_solver - and river_stone_bridge.maximum_placements == 2 and not river_source_right.participates_in_base_solver and not river_source_left.participates_in_base_solver and not river_outlet_right.participates_in_base_solver @@ -530,8 +522,6 @@ func _validate_catalog() -> void: and river_edge.water_outlet_edges == 14 and river_edge_variant.water_inlet_edges == 14 and river_edge_variant.water_outlet_edges == 14 - and river_stone_bridge.water_inlet_edges == 14 - and river_stone_bridge.water_outlet_edges == 14 and river_source_right.water_inlet_edges == 6 and river_source_right.water_outlet_edges == 6 and river_source_left.water_inlet_edges == 3 @@ -554,7 +544,6 @@ func _validate_catalog() -> void: and river_cap.water_outlet_edges == 6 and river_edge.water_surface_polygon.size() == 13 and river_edge_variant.water_surface_polygon.size() == 13 - and river_stone_bridge.water_surface_polygon.size() == 13 and river_source_right.water_surface_polygon.size() == 13 and river_source_left.water_surface_polygon.size() == 13 and river_outlet_right.water_surface_polygon.size() == 19 @@ -565,8 +554,6 @@ func _validate_catalog() -> void: and river_cap.primary_mesh_name == &"chunk_0020" and "river" in river_edge.tags and "river" in river_edge_variant.tags - and "river_bridge" in river_stone_bridge.tags - and "stepping_stones" in river_stone_bridge.tags and "river_source_right" in river_source_right.tags and "river_source_left" in river_source_left.tags and "river_outlet_right" in river_outlet_right.tags @@ -630,14 +617,13 @@ func _validate_catalog() -> void: ]: _check( transition.overlay_only - and transition.primary_mesh_name == &"chunk_0010" and transition.base_layer_scene != null and transition.base_layer_mesh_name == &"chunk_0007" and not transition.must_be_interior and transition.prefers_map_boundary and "transition" in transition.tags, ( - "Each raised-coast endpoint must layer the inland corner " + "Each raised-coast endpoint must layer the deep corner " + "over an authored level-one coastline." ), ) @@ -659,7 +645,6 @@ func _validate_catalog() -> void: ]: _check( transition.overlay_only - and transition.primary_mesh_name == &"chunk_0010" and transition.base_layer_scene != null and transition.base_layer_mesh_name == &"chunk_0008" and not transition.must_be_interior @@ -1476,10 +1461,6 @@ func _validate_authored_rotations(generator: TerrainChunkGenerator) -> void: var river_edge_variant_bottom := _find_variant(generator, &"chunk_0025", 2) var river_edge_vertical_left := _find_variant(generator, &"chunk_0024", 1) var river_edge_vertical_right := _find_variant(generator, &"chunk_0025", 3) - var river_stones_top := _find_variant(generator, &"chunk_0038", 0) - var river_stones_bottom := _find_variant(generator, &"chunk_0038", 2) - var river_stones_left := _find_variant(generator, &"chunk_0038", 1) - var river_stones_right := _find_variant(generator, &"chunk_0038", 3) var river_source_right := _find_variant(generator, &"chunk_0029", 0) var river_source_left := _find_variant(generator, &"chunk_0030", 0) var river_outlet_right := _find_variant(generator, &"chunk_0031", 0) @@ -1519,10 +1500,6 @@ func _validate_authored_rotations(generator: TerrainChunkGenerator) -> void: and river_edge_variant_bottom != null and river_edge_vertical_left != null and river_edge_vertical_right != null - and river_stones_top != null - and river_stones_bottom != null - and river_stones_left != null - and river_stones_right != null and river_source_right != null and river_source_left != null and river_outlet_right != null @@ -1548,10 +1525,6 @@ func _validate_authored_rotations(generator: TerrainChunkGenerator) -> void: and river_edge_variant_bottom != null and river_edge_vertical_left != null and river_edge_vertical_right != null - and river_stones_top != null - and river_stones_bottom != null - and river_stones_left != null - and river_stones_right != null and river_source_right != null and river_source_left != null and river_outlet_right != null @@ -1562,30 +1535,6 @@ func _validate_authored_rotations(generator: TerrainChunkGenerator) -> void: and river_bend_d != null and beach_east != null ): - _check( - generator._edges_are_compatible( - river_edge_top, - TerrainChunkTopology.Edge.EAST, - river_stones_top, - TerrainChunkTopology.Edge.WEST, - ) - and generator._edges_are_compatible( - river_stones_top, - TerrainChunkTopology.Edge.SOUTH, - river_stones_bottom, - TerrainChunkTopology.Edge.NORTH, - ) - and generator._edges_are_compatible( - river_stones_left, - TerrainChunkTopology.Edge.EAST, - river_stones_right, - TerrainChunkTopology.Edge.WEST, - ), - ( - "The stepping-stone banks must replace one paired straight river " - + "station in either orientation." - ), - ) _check( generator._edges_are_compatible( river_source_right, @@ -1801,8 +1750,8 @@ func _validate_authored_rotations(generator: TerrainChunkGenerator) -> void: func _validate_generation_summary(generator: TerrainChunkGenerator) -> void: var summary := generator._build_summary() _check( - int(summary.get("variant_count", 0)) == 174, - "The current catalog must expose all 174 authored rotations.", + int(summary.get("variant_count", 0)) == 170, + "The current catalog must expose all 170 authored rotations.", ) _check( int(summary.get("solver_variant_count", 0)) @@ -1879,7 +1828,7 @@ func _all_neighbor_edges_match(generator: TerrainChunkGenerator) -> bool: for index: int in generator._placements.size(): var coordinate := Vector2i( index % generator.grid_size.x, - int(float(index) / float(generator.grid_size.x)), + index / generator.grid_size.x, ) var current: TerrainChunkVariant = generator._placements[index] if coordinate.x > 0: @@ -1919,8 +1868,8 @@ func _validate_layout_rules(generator: TerrainChunkGenerator) -> void: "All walkable generated terrain must remain connected to spawn.", ) var center := Vector2i( - int(float(generator.grid_size.x) / 2.0), - int(float(generator.grid_size.y) / 2.0), + generator.grid_size.x / 2, + generator.grid_size.y / 2, ) var safe_spawn_neighbors := 0 for edge_value: int in TerrainChunkTopology.Edge.values(): @@ -1944,7 +1893,7 @@ func _validate_layout_rules(generator: TerrainChunkGenerator) -> void: var placement := generator._placements[index] var coordinate := Vector2i( index % generator.grid_size.x, - int(float(index) / float(generator.grid_size.x)), + index / generator.grid_size.x, ) if "coast" in placement.definition.tags: _check( diff --git a/tests/texture_sampling_validation.gd b/tests/texture_sampling_validation.gd index dcccc38..deeabce 100644 --- a/tests/texture_sampling_validation.gd +++ b/tests/texture_sampling_validation.gd @@ -1,11 +1,6 @@ extends SceneTree const POLICY := preload("res://main/texture_sampling_policy.gd") -const PROJECTED_TERRAIN_TEXTURE_IMPORTS: Array[String] = [ - "res://world/generation/chunks/assets/chunk_0000_grass_lite.png.import", - "res://world/generation/chunks/assets/chunk_0001_sand.png.import", - "res://world/generation/chunks/assets/chunk_0031_dirt.png.import", -] var failures: Array[String] = [] @@ -88,14 +83,9 @@ func _validate_repository_files(path: String) -> void: func _validate_import_file(path: String) -> void: var source := FileAccess.get_file_as_string(path) - var expects_mipmaps := path in PROJECTED_TERRAIN_TEXTURE_IMPORTS _check( - ("mipmaps/generate=true" in source) == expects_mipmaps, - ( - "Projected terrain mipmap policy mismatch: %s" - if expects_mipmaps - else "Texture import generates unapproved mipmaps: %s" - ) % path, + "mipmaps/generate=true" not in source, + "Texture import generates mipmaps: %s" % path, ) diff --git a/tests/title_credits_validation.gd b/tests/title_credits_validation.gd index e5ac4cc..5bbf632 100644 --- a/tests/title_credits_validation.gd +++ b/tests/title_credits_validation.gd @@ -21,10 +21,6 @@ func _run() -> void: var credits_button := title_screen.get_node( "%CreditsButton" ) as BubbleButton - var play_button := title_screen.get_node("%PlayButton") as BubbleButton - var continue_stats_drawer := title_screen.get_node( - "%ContinueStatsDrawer" - ) as RichTextLabel var credits_page := title_screen.get_node( "%CreditsPage" ) as TitleCreditsPageType @@ -38,32 +34,9 @@ func _run() -> void: await process_frame _expect(credits_button != null, "title menu exposes a credits button") - _expect(play_button != null, "title menu exposes the play button") - _expect( - continue_stats_drawer != null, - "play button owns a dedicated save-preview drawer", - ) - if play_button != null and continue_stats_drawer != null: - _expect( - continue_stats_drawer.get_parent() == play_button, - "save preview extends directly from the play button", - ) - _expect( - continue_stats_drawer.position.y < play_button.size.y - and ( - continue_stats_drawer.position.y - + continue_stats_drawer.size.y - ) > play_button.size.y, - "save preview overlaps the play edge and extends below it", - ) - _expect( - continue_stats_drawer.mouse_filter - == Control.MOUSE_FILTER_IGNORE, - "save preview drawer cannot intercept menu input", - ) _expect( credits_button.icon != null and credits_button.text.is_empty(), - "credits action uses its icon in the square-button presentation", + "credits bubble uses its authored icon", ) _expect(credits_page != null, "title screen contains the credits page") _expect(not credits_page.visible, "credits page starts closed") @@ -71,39 +44,29 @@ func _run() -> void: Rect2(Vector2.ZERO, bubble_field.size).encloses( Rect2(credits_button.position, credits_button.size) ), - "credits button stays inside the authored title field", + "credits bubble stays inside the authored title field", ) _expect( credits_button.mouse_filter == Control.MOUSE_FILTER_STOP, - "credits button accepts pointer input", + "credits bubble accepts pointer input", ) - if OS.has_environment("straywild_TITLE_MENU_CAPTURE"): + if OS.has_environment("NETFISHING_TITLE_MENU_CAPTURE"): (title_screen.get_node("%StartPromptCenter") as Control).hide() title_screen.set_process(true) await create_timer(0.5).timeout _expect( _save_capture( - OS.get_environment("straywild_TITLE_MENU_CAPTURE") + OS.get_environment("NETFISHING_TITLE_MENU_CAPTURE") ) == OK, "title menu validation capture saves successfully", ) title_screen.set_process(false) title_screen.set("_navigation_focus_active", false) - credits_button.call("_set_hovered", true) - credits_button.advance_emphasis(1.0) - _expect( - (credits_button.get_node("HoverDrawer") as Control).visible, - "pointer hover reveals the credits drawer before activation", - ) credits_button.pressed.emit() await process_frame _expect(credits_page.visible, "pointer activation opens credits") _expect(not presentation.visible, "credits replace the primary title menu") - _expect( - not (credits_button.get_node("HoverDrawer") as Control).visible, - "opening a title page collapses its hover drawer", - ) _expect( root.gui_get_focus_owner() != back_button, "pointer activation does not pseudo-select back", @@ -117,11 +80,11 @@ func _run() -> void: back_button.mouse_filter == Control.MOUSE_FILTER_STOP, "credits back button accepts pointer clicks", ) - if OS.has_environment("straywild_CREDITS_CAPTURE"): + if OS.has_environment("NETFISHING_CREDITS_CAPTURE"): await process_frame _expect( _save_capture( - OS.get_environment("straywild_CREDITS_CAPTURE") + OS.get_environment("NETFISHING_CREDITS_CAPTURE") ) == OK, "credits validation capture saves successfully", ) @@ -134,30 +97,6 @@ func _run() -> void: "pointer return leaves the title menu unfocused", ) - var online_button := title_screen.get_node( - "%JoinGameButton" - ) as BubbleButton - var join_game_page := title_screen.get_node("%JoinGamePage") as Control - online_button.call("_set_hovered", true) - online_button.advance_emphasis(1.0) - _expect( - (online_button.get_node("HoverDrawer") as Control).visible, - "pointer hover reveals the online drawer before activation", - ) - online_button.pressed.emit() - await process_frame - _expect(join_game_page.visible, "online activation opens the join page") - _expect( - not (online_button.get_node("HoverDrawer") as Control).visible, - "opening the join page collapses the online drawer", - ) - title_screen.call("_close_join_game") - await process_frame - _expect( - not (online_button.get_node("HoverDrawer") as Control).visible, - "returning from the join page does not restore stale pointer hover", - ) - title_screen.set("_navigation_focus_active", true) credits_button.grab_focus() credits_button.pressed.emit() @@ -195,7 +134,7 @@ func _run() -> void: _expect(not credits_page.visible, "ui cancel closes credits") _expect( root.gui_get_focus_owner() == credits_button, - "navigation return restores focus to the credits button", + "navigation return restores focus to the credits bubble", ) var chillnfill_name := credits_page.get_node( diff --git a/tests/tooltip_escape_validation.gd b/tests/tooltip_escape_validation.gd deleted file mode 100644 index 531476e..0000000 --- a/tests/tooltip_escape_validation.gd +++ /dev/null @@ -1,43 +0,0 @@ -extends SceneTree - -const MainScene: PackedScene = preload("res://main/main.tscn") - - -func _initialize() -> void: - call_deferred("_run") - - -func _run() -> void: - root.size = Vector2i(1280, 720) - var main: Node = MainScene.instantiate() - root.add_child(main) - for _frame: int in 4: - await process_frame - if not bool(main.get("_application_initialized")): - main.call("_activate_selected_data_path", "", true) - for _frame: int in 8: - await process_frame - assert(bool(main.get("_application_initialized"))) - - var game_ui: GameUI = main.get("_game_ui") as GameUI - var player_menu: PlayerMenu = game_ui.get_node("%PlayerMenu") as PlayerMenu - assert(game_ui != null and player_menu != null) - game_ui.get_title_screen().hide() - main.set("_gameplay_started", true) - player_menu.show() - player_menu.set("_transitioning", false) - - # Input.action_press updates global action state without delivering an - # InputEvent to Main._input. That reproduces the path used when a native - # tooltip window consumes Escape before the gameplay viewport receives it. - Input.action_press("ui_cancel") - await process_frame - Input.action_release("ui_cancel") - for _frame: int in 40: - await process_frame - assert(not player_menu.visible) - - main.queue_free() - await process_frame - print("Tooltip Escape validation: PASS") - quit(0) diff --git a/tests/tooltip_escape_validation.gd.uid b/tests/tooltip_escape_validation.gd.uid deleted file mode 100644 index f4049ab..0000000 --- a/tests/tooltip_escape_validation.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cwc8lnci5ccph diff --git a/tests/tree_gathering_prototype_validation.gd b/tests/tree_gathering_prototype_validation.gd index 2814e19..d97f67e 100644 --- a/tests/tree_gathering_prototype_validation.gd +++ b/tests/tree_gathering_prototype_validation.gd @@ -7,9 +7,6 @@ const Gatherables: GatherableCatalog = preload( "res://gathering/catalog/gatherable_catalog.tres" ) const FishCatalog: FishPool = preload("res://fish/pools/fish_catalog.tres") -const MeshSurfaceAnchorSamplerType = preload( - "res://world/generation/mesh_surface_anchor_sampler.gd" -) func _initialize() -> void: @@ -18,7 +15,6 @@ func _initialize() -> void: func _run() -> void: _validate_beetle_data() - await _validate_mesh_surface_sampler() await _validate_tree_anchors() _validate_anchored_presentation() _validate_three_dimensional_targeting() @@ -36,74 +32,11 @@ func _validate_beetle_data() -> void: assert(beetle.required_tool_id == &"crab_net") assert(beetle.spawn_anchor_set_id == &"starter_reachable_tree_trunks") assert(beetle.population == 3) - assert(is_equal_approx(beetle.spawn_anchor_occupancy_ratio, 0.35)) - assert(beetle.maximum_anchor_population == 64) - assert(beetle.target_population_for_anchor_count(8) == 3) - assert(beetle.target_population_for_anchor_count(40) == 14) - assert(beetle.target_population_for_anchor_count(400) == 64) - assert(is_equal_approx(beetle.sprite_pixel_size, 0.0075)) + assert(is_equal_approx(beetle.sprite_pixel_size, 0.005)) assert(beetle.is_stationary_spawn()) assert(not beetle.can_be_scared()) -func _validate_mesh_surface_sampler() -> void: - var prop := Node3D.new() - # The accessibility band is local to the planted prop, so the same tree on - # a raised cliff remains reachable from that cliff's walkable surface. - prop.position = Vector3(3.0, 12.0, -4.0) - root.add_child(prop) - var visual := MeshInstance3D.new() - var box := BoxMesh.new() - box.size = Vector3(2.0, 4.0, 2.0) - var wood := StandardMaterial3D.new() - wood.resource_name = "wood" - box.material = wood - visual.mesh = box - visual.position.y = 2.0 - prop.add_child(visual) - await process_frame - var random := RandomNumberGenerator.new() - random.seed = 115 - var sample: Dictionary = MeshSurfaceAnchorSamplerType.sample_vertical_surface( - prop, - prop, - PackedStringArray(["wood"]), - 0.7, - 1.5, - 0.35, - 0.025, - random, - ) - assert(not sample.is_empty()) - var surface_position: Vector3 = sample["surface_position"] - var anchor_position: Vector3 = sample["position"] - assert(surface_position.y >= 0.7 and surface_position.y <= 1.5) - var world_anchor_position := prop.to_global(anchor_position) - assert( - world_anchor_position.y >= 12.7 - and world_anchor_position.y <= 13.5 - ) - assert(is_equal_approx( - maxf(absf(surface_position.x), absf(surface_position.z)), - 1.0, - )) - assert(is_equal_approx( - anchor_position.distance_to(surface_position), - 0.025, - )) - assert(MeshSurfaceAnchorSamplerType.sample_vertical_surface( - prop, - prop, - PackedStringArray(["leaf"]), - 0.7, - 1.5, - 0.35, - 0.025, - random, - ).is_empty()) - prop.queue_free() - - func _validate_tree_anchors() -> void: var region := StarterIslandScene.instantiate() as WorldRegion root.add_child(region) @@ -128,7 +61,7 @@ func _validate_anchored_presentation() -> void: var sprite := presentation.get_node("GatherableSprite") as Sprite3D assert(sprite != null) assert(is_zero_approx(sprite.position.y)) - assert(is_equal_approx(sprite.pixel_size, 0.0075)) + assert(is_equal_approx(sprite.pixel_size, 0.005)) assert(not sprite.shaded) assert(sprite.billboard == BaseMaterial3D.BILLBOARD_ENABLED) assert(sprite.texture_filter == BaseMaterial3D.TEXTURE_FILTER_NEAREST) diff --git a/tests/ui_scaling_runtime_validation.gd b/tests/ui_scaling_runtime_validation.gd index 95316ae..b9e8bce 100644 --- a/tests/ui_scaling_runtime_validation.gd +++ b/tests/ui_scaling_runtime_validation.gd @@ -39,15 +39,6 @@ func _run() -> void: var canonical_stage := game_ui.get_node( "UIRoot/CanonicalStage" ) as Control - var gameplay_screen_effects := game_ui.get_node( - "UIRoot/GameplayScreenEffects" - ) as Control - var fishing_danger_vignette := game_ui.get_node( - "UIRoot/GameplayScreenEffects/FishingDangerVignette" - ) as ColorRect - var gameplay_transient_hud := game_ui.get_node( - "UIRoot/CanonicalStage/GameplayTransientHUD" - ) as Control var chat_ui := game_ui.get_node("UIRoot/ChatUI") as ChatUI var player_menu := game_ui.get_node( "UIRoot/CanonicalStage/PlayerMenu" @@ -58,15 +49,9 @@ func _run() -> void: var hotbar := game_ui.get_node( "UIRoot/CanonicalStage/Hotbar" ) as HotbarUI - var home_decor_toolbar := game_ui.get_node( - "UIRoot/CanonicalStage/HomeDecorToolbar" - ) as HomeDecorToolbar assert(game_ui.get_node_or_null( "UIRoot/CanonicalStage/GameplayTransientHUD/EffectStatus" ) == null) - assert(game_ui.get_node_or_null( - "UIRoot/CanonicalStage/GameplayTransientHUD/FishingDangerVignette" - ) == null) var screen_fade := game_ui.get_node("UIRoot/ScreenFade") as Control var title_screen := game_ui.get_node("UIRoot/TitleScreen") as TitleScreen var title_content_stage := title_screen.get_node( @@ -81,68 +66,26 @@ func _run() -> void: var pause_profile_stage := pause_menu.get_node( "ResponsivePauseStage" ) as Control + var decorative_fish_layer := title_screen.get_node( + "DecorativeFishLayer" + ) as Control + var decorative_bubble_layer := title_screen.get_node( + "DecorativeBubbleLayer" + ) as Control ui_viewport.add_child(game_ui) presenter.add_child(ui_viewport) root.add_child(presenter) await process_frame chat_ui.set_available(true) - var nameplate_layer := chat_ui.get("_nameplate_layer") as Control var speech_layer := chat_ui.get("_speech_layer") as Control - assert(nameplate_layer != null and nameplate_layer.visible) assert(speech_layer != null and speech_layer.visible) - home_decor_toolbar.set_active(true) - assert(home_decor_toolbar.visible) game_ui.call("_on_player_menu_visibility_changed", true) assert(not chat_ui.is_world_speech_visible()) - assert(not nameplate_layer.visible) assert(not speech_layer.visible) - assert(not home_decor_toolbar.visible) game_ui.call("_on_player_menu_visibility_changed", false) assert(chat_ui.is_world_speech_visible()) - assert(not nameplate_layer.visible) assert(speech_layer.visible) chat_ui.set_available(true) - assert(nameplate_layer.visible) - chat_ui.set_available(false) - assert(not nameplate_layer.visible) - assert(speech_layer.visible) - chat_ui.set_available(true) - assert(nameplate_layer.visible) - chat_ui.set_hud_hidden(true) - assert(not nameplate_layer.visible) - assert(speech_layer.visible) - chat_ui.set_hud_hidden(false) - assert(nameplate_layer.visible) - chat_ui.set_world_nameplates_hud_hidden(true) - assert(not chat_ui.is_hud_hidden()) - assert(not nameplate_layer.visible) - assert(speech_layer.visible) - chat_ui.set_world_nameplates_hud_hidden(false) - assert(nameplate_layer.visible) - assert(home_decor_toolbar.visible) - game_ui.set("_storage_open", true) - game_ui.call("_emit_interactive_pointer_ui_changed") - assert(not home_decor_toolbar.visible) - game_ui.call("_on_player_menu_visibility_changed", true) - game_ui.set("_storage_open", false) - game_ui.call("_emit_interactive_pointer_ui_changed") - assert(not home_decor_toolbar.visible) - game_ui.call("_on_player_menu_visibility_changed", false) - assert(home_decor_toolbar.visible) - home_decor_toolbar.set_active(false) - game_ui.set("_gameplay_ui_enabled", true) - game_ui.set("_gameplay_hud_hidden", false) - game_ui.call("_refresh_gameplay_hud_visibility") - assert(gameplay_screen_effects.visible) - assert(gameplay_transient_hud.visible) - game_ui.set("_system_menu_open", true) - game_ui.call("_refresh_gameplay_hud_visibility") - assert(not gameplay_screen_effects.visible) - assert(not gameplay_transient_hud.visible) - game_ui.set("_system_menu_open", false) - game_ui.set("_gameplay_ui_enabled", false) - game_ui.call("_refresh_gameplay_hud_visibility") - chat_ui.set_available(true) chat_ui.call( "_set_presentation_state", ChatUI.PresentationState.EXPANDED, @@ -184,16 +127,7 @@ func _run() -> void: assert(canonical_stage.position.is_equal_approx( UIReferencePresentationType.get_stage_position(display_size) )) - assert(gameplay_screen_effects.position.is_equal_approx(Vector2.ZERO)) - assert(gameplay_screen_effects.size.is_equal_approx( - expected_visible_size - )) - assert(fishing_danger_vignette.position.is_equal_approx(Vector2.ZERO)) - assert(fishing_danger_vignette.size.is_equal_approx( - expected_visible_size - )) assert(chat_ui.size.is_equal_approx(expected_visible_size)) - assert(nameplate_layer.size.is_equal_approx(expected_visible_size)) assert(screen_fade.size.is_equal_approx(expected_visible_size)) assert(player_menu.position.is_equal_approx(Vector2.ZERO)) assert(player_menu.size.is_equal_approx( @@ -231,6 +165,26 @@ func _run() -> void: assert(pause_profile_stage.position.is_equal_approx( expected_profile_position )) + assert(decorative_fish_layer.size.is_equal_approx( + expected_visible_size + )) + assert(decorative_bubble_layer.size.is_equal_approx( + expected_visible_size + )) + var left_to_right_bounds: Vector2 = ( + TitleScreen.get_decorative_fish_crossing_bounds( + expected_visible_size.x, 160.0, 1.0 + ) + ) + var right_to_left_bounds: Vector2 = ( + TitleScreen.get_decorative_fish_crossing_bounds( + expected_visible_size.x, 160.0, -1.0 + ) + ) + assert(left_to_right_bounds.x < -160.0) + assert(left_to_right_bounds.y > expected_visible_size.x) + assert(right_to_left_bounds.x > expected_visible_size.x) + assert(right_to_left_bounds.y < -160.0) assert(is_equal_approx(presenter.scale.x, presenter.scale.y)) assert(is_equal_approx(ui_root.scale.x, ui_root.scale.y)) var effective_scale: float = presenter.scale.x * ui_root.scale.x @@ -356,13 +310,13 @@ func _run() -> void: chat_panel.position.x * effective_scale, ] ) - if OS.has_environment("straywild_UI_SCALE_CAPTURE"): + if OS.has_environment("NETFISHING_UI_SCALE_CAPTURE"): await process_frame var capture: Image = root.get_texture().get_image() var capture_path: String = ( "%s-requested-%dx%d-actual-%dx%d.png" ) % [ - OS.get_environment("straywild_UI_SCALE_CAPTURE"), + OS.get_environment("NETFISHING_UI_SCALE_CAPTURE"), target_size.x, target_size.y, actual_size.x, diff --git a/tests/unified_inventory_validation.gd b/tests/unified_inventory_validation.gd index 5fe3d7d..dacc5a0 100644 --- a/tests/unified_inventory_validation.gd +++ b/tests/unified_inventory_validation.gd @@ -19,17 +19,15 @@ func _initialize() -> void: func _run() -> void: - var scene_root := Node.new() - get_root().add_child(scene_root) + var root := Node.new() + get_root().add_child(root) var bag := PlayerBag.new() var catches := FishInventory.new() var capacity := PlayerCoolerCapacity.new() - var home_state := PlayerHomeState.new() var layout := PlayerInventoryLayout.new() var hotbar := PlayerHotbar.new() - for node: Node in [bag, catches, capacity, home_state, layout, hotbar]: - scene_root.add_child(node) - capacity.bind_home_state(home_state) + for node: Node in [bag, catches, capacity, layout, hotbar]: + root.add_child(node) bag.setup(ItemCatalogResource) layout.setup(bag, catches, ItemCatalogResource, capacity) bag.set_inventory_layout(layout) @@ -37,76 +35,6 @@ func _run() -> void: hotbar.setup(bag, ItemCatalogResource, catches, layout) assert(PlayerInventoryLayout.INVENTORY_CAPACITIES == [9, 18, 27, 36]) assert(PlayerCoolerCapacity.CAPACITIES == [9, 18, 27, 36, 45, 54, 63, 72]) - var basic_cube: ItemData = ItemCatalogResource.get_item_by_id(&"basic_cube") - assert(basic_cube != null) - assert(basic_cube.icon != null) - assert(basic_cube.hotbar_allowed) - assert(not basic_cube.stackable) - assert(bag.add_item(&"basic_cube")) - assert(layout.is_item_in_inventory(&"basic_cube")) - assert(hotbar.assign_item(0, &"basic_cube")) - assert(hotbar.get_item_id(0) == &"basic_cube") - assert( - layout.get_container( - PlayerInventoryLayout.EntryKind.ITEM, - &"basic_cube", - ) == PlayerInventoryLayout.InventoryContainer.HOTBAR - ) - assert(hotbar.clear_slot(0)) - assert(layout.is_item_in_inventory(&"basic_cube")) - assert(bag.remove_item(&"basic_cube")) - var packed_decor_slot: int = hotbar.find_first_empty_slot() - assert(packed_decor_slot == 0) - assert(layout.prepare_new_item_placement( - &"basic_cube", - PlayerInventoryLayout.InventoryContainer.HOTBAR, - packed_decor_slot, - )) - assert(bag.add_item(&"basic_cube")) - assert( - layout.get_container( - PlayerInventoryLayout.EntryKind.ITEM, - &"basic_cube", - ) == PlayerInventoryLayout.InventoryContainer.HOTBAR - ) - assert(hotbar.assign_item(packed_decor_slot, &"basic_cube")) - assert(hotbar.select_slot(packed_decor_slot)) - assert(hotbar.get_selected_item_id() == &"basic_cube") - assert(bag.remove_item(&"basic_cube")) - - # Decor ownership remains an aggregate count for persistence, but each - # physical piece receives its own movable inventory placement. - assert(bag.add_item(&"basic_cube", 3)) - assert(bag.get_quantity(&"basic_cube") == 3) - assert(layout.get_inventory_count() == 3) - var decor_entries := layout.get_entries( - PlayerInventoryLayout.InventoryContainer.INVENTORY - ) - assert(decor_entries.size() == 3) - var decor_keys: Dictionary[String, bool] = {} - for entry: Dictionary in decor_entries: - assert(StringName(str(entry.get("identity", ""))) == &"basic_cube") - assert(int(entry.get("unit", -1)) >= 0) - decor_keys[str(entry.get("key", ""))] = true - assert(decor_keys.size() == 3) - var moved_decor_key: String = str(decor_entries[1].get("key", "")) - assert(layout.move_entry_key_to_first_free( - moved_decor_key, - PlayerInventoryLayout.InventoryContainer.STORAGE, - )) - assert(layout.get_inventory_count() == 2) - assert(layout.get_storage_count() == 1) - var decor_layout_save := layout.to_save_data() - assert(layout.move_entry_key_to_first_free( - moved_decor_key, - PlayerInventoryLayout.InventoryContainer.INVENTORY, - )) - assert(layout.restore_from_save_data(decor_layout_save)) - assert(layout.get_inventory_count() == 2) - assert(layout.get_storage_count() == 1) - assert(bag.remove_item(&"basic_cube", 3)) - assert(layout.get_inventory_count() == 0) - assert(layout.get_storage_count() == 0) assert(bag.add_item(&"coffee", 3)) assert(layout.get_inventory_count() == 1) @@ -134,7 +62,6 @@ func _run() -> void: fish_catch.sale_value = Bluegill.get_sale_value_for_weight( fish_catch.weight_lb ) - fish_catch.quality = FishQuality.Tier.IMPRESSIVE assert(catches.add_catch(fish_catch)) assert(layout.get_inventory_count() == 2) assert(layout.move_entry_to_first_free( @@ -146,7 +73,7 @@ func _run() -> void: assert(layout.get_storage_count() == 1) assert(layout.get_storage_capacity() == 9) var inventory_grid := GeneralInventoryGrid.new() - scene_root.add_child(inventory_grid) + root.add_child(inventory_grid) inventory_grid.set_slot_presentation(Vector2(78.0, 78.0), 10) inventory_grid.setup( layout, @@ -179,53 +106,8 @@ func _run() -> void: == Color(UtilityPageStyle.OCEAN_SELECTED, 0.92) ) staged_slot.set_staged(false) - var quality_slot := GeneralInventorySlot.new() - scene_root.add_child(quality_slot) - quality_slot.set_presentation_size(Vector2(78.0, 78.0)) - quality_slot.configure( - 0, - PlayerInventoryLayout.InventoryContainer.STORAGE, - false, - layout, - bag, - catches, - hotbar, - ItemCatalogResource, - ) - assert(quality_slot.entry_identity == fish_catch.catch_id) - assert( - (quality_slot.get_theme_stylebox("normal") as StyleBoxFlat).bg_color - == GeneralInventorySlot.quality_background_color( - FishQuality.Tier.IMPRESSIVE, - GeneralInventorySlot.QualityEmphasis.NORMAL, - ) - ) - quality_slot.set_staged(true) - assert( - (quality_slot.get_theme_stylebox("normal") as StyleBoxFlat).bg_color - == GeneralInventorySlot.quality_background_color( - FishQuality.Tier.IMPRESSIVE, - GeneralInventorySlot.QualityEmphasis.SELECTED, - ) - ) - var distinct_quality_colors: Dictionary[Color, bool] = {} - for quality: int in FishQuality.TIER_COUNT: - var quality_color := GeneralInventorySlot.quality_background_color( - quality, - GeneralInventorySlot.QualityEmphasis.NORMAL, - ) - assert(not distinct_quality_colors.has(quality_color)) - distinct_quality_colors[quality_color] = true - assert(distinct_quality_colors.size() == FishQuality.TIER_COUNT) var sale_tray_slot := ShopSaleTraySlot.new() - scene_root.add_child(sale_tray_slot) - sale_tray_slot.configure( - "catch:%s" % fish_catch.catch_id, - fish_catch.fish.display_texture, - fish_catch.fish.display_name, - 1, - fish_catch.quality, - ) + root.add_child(sale_tray_slot) assert( sale_tray_slot.custom_minimum_size == GeneralInventoryGrid.DEFAULT_SLOT_SIZE @@ -235,16 +117,8 @@ func _run() -> void: ) as StyleBoxFlat assert(sale_tray_style != null) assert(sale_tray_style.corner_radius_top_left == 26) - var expected_tray_quality_color := ( - GeneralInventorySlot.quality_background_color( - FishQuality.Tier.IMPRESSIVE, - GeneralInventorySlot.QualityEmphasis.NORMAL, - ) - ) - expected_tray_quality_color.a = 0.96 - assert(sale_tray_style.bg_color == expected_tray_quality_color) var wallet := PlayerWallet.new() - scene_root.add_child(wallet) + root.add_child(wallet) assert(wallet.restore_balance(15000)) assert(layout.get_next_backpack_cost() == 1500) assert(layout.purchase_backpack(wallet)) @@ -260,7 +134,7 @@ func _run() -> void: assert(inventory_grid.get_slots().size() == 36) assert(layout.get_next_backpack_cost() == -1) var storage_grid := GeneralInventoryGrid.new() - scene_root.add_child(storage_grid) + root.add_child(storage_grid) storage_grid.setup( layout, bag, @@ -276,12 +150,13 @@ func _run() -> void: (all_storage_slots[9] as GeneralInventorySlot).accessibility_name == "locked storage slot 10" ) - assert(not capacity.can_purchase(wallet)) - assert(not capacity.purchase(wallet)) - assert(home_state.upgrade_to_next_tier()) - assert(layout.get_storage_capacity() == 18) - assert(storage_grid.get_slots().size() == 18) - assert(not home_state.upgrade_to_next_tier()) + var storage_wallet := PlayerWallet.new() + root.add_child(storage_wallet) + assert(storage_wallet.restore_balance(9500)) + for expected_capacity: int in [18, 27, 36, 45, 54, 63, 72]: + assert(capacity.purchase(storage_wallet)) + assert(layout.get_storage_capacity() == expected_capacity) + assert(storage_grid.get_slots().size() == expected_capacity) assert(capacity.get_next_capacity() == -1) assert(capacity.get_next_cost() == -1) @@ -302,8 +177,8 @@ func _run() -> void: var network_sale := NetworkSaleService.new() var session := NetworkSession.new() - scene_root.add_child(session) - scene_root.add_child(network_sale) + root.add_child(session) + root.add_child(network_sale) network_sale.set("_session", session) network_sale.set("_item_catalog", ItemCatalogResource) network_sale.set("_fish_catalog", FishCatalogResource) @@ -320,5 +195,5 @@ func _run() -> void: assert((result.get("items", []) as Array).size() == 1) print("Unified inventory validation: PASS") - scene_root.free() + root.free() quit() diff --git a/tests/world_layout_validation.gd b/tests/world_layout_validation.gd index 473b45e..dd40fcf 100644 --- a/tests/world_layout_validation.gd +++ b/tests/world_layout_validation.gd @@ -68,9 +68,9 @@ func _validate_setup_page() -> void: page.call("_set_world_layout", WorldLayout.STARTER_ISLAND) assert(not (page.get_node("%SeedSection") as Control).visible) var request: Dictionary = {} - page.start_requested.connect(func(layout: StringName, world_seed: int) -> void: + page.start_requested.connect(func(layout: StringName, seed: int) -> void: request["layout"] = layout - request["seed"] = world_seed + request["seed"] = seed ) page.call("_request_start") assert(request.get("layout") == WorldLayout.STARTER_ISLAND) @@ -84,8 +84,6 @@ func _validate_world_switching() -> void: root.add_child(world) await process_frame assert(world.get_world_layout() == WorldLayout.GENERATED) - world.set_foliage_wind_strength_multiplier(2.0) - world.set_water_motion_strength_multiplier(2.0) var initial_generator := world.get_node( "Regions/GeneratedWorldRegion/Terrain/TerrainChunkGenerator" ) as TerrainChunkGenerator @@ -99,93 +97,18 @@ func _validate_world_switching() -> void: assert(world.get_generation_seed() == 13579) assert(world.get_node_or_null("Regions/StarterIslandRegion") != null) assert(world.get_node_or_null("Regions/GeneratedWorldRegion") == null) - var starter_region := world.get_node( - "Regions/StarterIslandRegion" - ) as StarterIslandRegion - assert(starter_region != null) - assert(is_equal_approx( - float(starter_region.get("_foliage_wind_strength_multiplier")), 2.0 - )) - var starter_ocean_motion := starter_region.get_node( - "WaterBodies/Ocean/VisualWater" - ) as WaterSurfaceMotion - assert(starter_ocean_motion != null) - assert(is_equal_approx( - starter_ocean_motion.get_motion_strength_multiplier(), 2.0 - )) assert(world.get_fishing_shop() != null) assert(world.get_player_storage() != null) assert(not world.get_fishable_water_regions().is_empty()) - _validate_starter_shopkeeper_roaming(world) - var starter_safe_points := world.get_safe_respawn_points() - assert(not starter_safe_points.is_empty()) - var authored_safe_point: SafeRespawnPoint = starter_safe_points.back() - assert( - world.get_water_recovery_position( - authored_safe_point.global_position - ).is_equal_approx(authored_safe_point.global_position) - ) assert(world.activate_world(WorldLayout.GENERATED, 24680)) assert(world.get_world_layout() == WorldLayout.GENERATED) assert(world.get_generation_seed() == 24680) assert(world.get_node_or_null("Regions/GeneratedWorldRegion") != null) assert(world.get_node_or_null("Regions/StarterIslandRegion") == null) - var generated_region := world.get_node( - "Regions/GeneratedWorldRegion" - ) as GeneratedWorldRegion - assert(generated_region != null) - assert(is_equal_approx( - float(generated_region.get("_foliage_wind_strength_multiplier")), 2.0 - )) - var generated_ocean_motion := generated_region.get_node( - "WaterBodies/OceanWater/VisualWater" - ) as WaterSurfaceMotion - assert(generated_ocean_motion != null) - assert(is_equal_approx( - generated_ocean_motion.get_motion_strength_multiplier(), 2.0 - )) world.queue_free() await process_frame -func _validate_starter_shopkeeper_roaming(world: TestWorld) -> void: - var starter_region := world.get_node( - "Regions/StarterIslandRegion" - ) as StarterIslandRegion - assert(starter_region != null) - for interaction: FishingShopInteraction in [ - starter_region.get_fishing_shop(), - starter_region.get_decor_shop(), - starter_region.get_rv_upgrade_shop(), - ]: - assert(interaction != null) - # Presentation patrols are inactive on a dedicated/headless world until a - # local player is bound, so they cannot spend physics-query budget there. - assert( - not interaction.is_processing() - and not interaction.is_physics_processing() - ) - var visual := interaction.get_node("../Shopkeeper") as Node3D - var visual_transform := visual.transform - var fixed_area_transform := interaction.global_transform - var route_found := false - for _attempt_cycle: int in 4: - interaction.call("_choose_roaming_destination") - if interaction.is_roaming_walking(): - route_found = true - break - assert(route_found) - assert(not (interaction.get("_roaming_route") as Array).is_empty()) - for _movement_slice: int in 24: - interaction.call("_advance_roaming_walk", 0.05) - if visual.position.distance_to(visual_transform.origin) > 0.01: - break - assert(visual.position.distance_to(visual_transform.origin) > 0.01) - assert(interaction.global_transform.is_equal_approx(fixed_area_transform)) - visual.transform = visual_transform - interaction.call("_schedule_idle") - - func _validate_world_boundary_clearance(world: TestWorld) -> void: var active_region := world.get("_active_region") as WorldRegion assert(active_region != null) diff --git a/tests/world_spawn_multiplayer_validation.gd b/tests/world_spawn_multiplayer_validation.gd index f5ffd2e..45be081 100644 --- a/tests/world_spawn_multiplayer_validation.gd +++ b/tests/world_spawn_multiplayer_validation.gd @@ -2,10 +2,9 @@ extends SceneTree const MainScene: PackedScene = preload("res://main/main.tscn") const TEST_PORT: int = 18170 -const EXPECTED_POPULATION: int = 12 +const EXPECTED_POPULATION: int = 8 const EXPECTED_BY_TYPE: Dictionary = { &"crab_brown": 2, - &"crab_blue": 4, &"clam_manila": 3, &"beetle_stag_common": 3, } @@ -162,10 +161,6 @@ func _validate_population( (position as Vector3).y >= entry.minimum_surface_y - 0.001 ) - if entry.type_id == &"crab_brown": - assert((position as Vector3).y > -0.45) - elif entry.type_id == &"crab_blue": - assert((position as Vector3).y < -0.45) if expect_authoritative_state: var quality: int = int(state.get("quality", -1)) assert(FishQuality.is_valid(quality)) @@ -201,10 +196,7 @@ func _validate_respawn_budget(service: Node) -> void: false, true, ) - assert( - (service.get("_entities") as Dictionary).size() - == EXPECTED_POPULATION - crab_ids.size() - ) + assert((service.get("_entities") as Dictionary).size() == 6) var now: float = Time.get_ticks_msec() / 1000.0 var respawns: Array = service.get("_respawns") @@ -217,27 +209,18 @@ func _validate_respawn_budget(service: Node) -> void: respawns[index] = respawn service.call("_update_respawns") - assert( - (service.get("_entities") as Dictionary).size() - == EXPECTED_POPULATION - 1 - ) + assert((service.get("_entities") as Dictionary).size() == 7) assert((service.get("_respawns") as Array).size() == 1) var next_by_type: Dictionary = service.get("_next_respawn_by_type") var next_allowed: float = float(next_by_type.get(&"crab_brown", 0.0)) assert(next_allowed - now >= 179.0) service.call("_update_respawns") - assert( - (service.get("_entities") as Dictionary).size() - == EXPECTED_POPULATION - 1 - ) + assert((service.get("_entities") as Dictionary).size() == 7) assert((service.get("_respawns") as Array).size() == 1) next_by_type[&"crab_brown"] = now - 1.0 service.call("_update_respawns") - assert( - (service.get("_entities") as Dictionary).size() - == EXPECTED_POPULATION - ) + assert((service.get("_entities") as Dictionary).size() == 8) assert((service.get("_respawns") as Array).is_empty()) _validate_population(service, true) diff --git a/tests/world_spawn_protocol_validation.gd b/tests/world_spawn_protocol_validation.gd index d828fdf..f529389 100644 --- a/tests/world_spawn_protocol_validation.gd +++ b/tests/world_spawn_protocol_validation.gd @@ -9,36 +9,21 @@ const GatheringControllerType = preload( ) const WorldGatherableType = preload("res://gathering/world_gatherable.gd") -const CRAB_PIXEL_SIZE: float = 0.01 -const CRAB_SURFACE_OFFSET: float = 0.11 -const CRAB_SPRITE_EXTENT: float = 0.64 +const CRAB_PIXEL_SIZE: float = 0.0005 const REDUCED_CATCH_RING_RADIUS: float = 0.175 const NET_STRIKE_MARKER_DISTANCE: float = 0.85 const CalendarSeasonType = preload("res://world/calendar_season.gd") func _initialize() -> void: - call_deferred(&"_run") - - -func _run() -> void: - var protocol_version: int = NetworkProtocol.PROTOCOL_VERSION - var world_spawn_capability: String = ( - NetworkWorldSpawnProtocol.CAPABILITY - ) - var protocol_world_spawn_capability: String = ( - NetworkProtocol.WORLD_SPAWN_CAPABILITY - ) - var snapshot_entities_per_envelope: int = ( - NetworkWorldSpawnProtocol.SNAPSHOT_ENTITIES_PER_ENVELOPE - ) - assert(protocol_version == 13) + assert(NetworkProtocol.PROTOCOL_VERSION == 10) assert( - world_spawn_capability == protocol_world_spawn_capability + NetworkWorldSpawnProtocol.CAPABILITY + == NetworkProtocol.WORLD_SPAWN_CAPABILITY ) - assert(snapshot_entities_per_envelope <= 4) + assert(NetworkWorldSpawnProtocol.SNAPSHOT_ENTITIES_PER_ENVELOPE <= 4) _validate_catalog_statuses() - await _validate_billboard_presentation() + _validate_billboard_presentation() _validate_envelopes() print("World spawn protocol validation: PASS") quit() @@ -58,10 +43,6 @@ func _validate_catalog_statuses() -> void: CRAB_PIXEL_SIZE, ) ) - assert(is_equal_approx( - brown.sprite_surface_offset, - CRAB_SURFACE_OFFSET, - )) _validate_quality_behavior(brown) assert(is_equal_approx(brown.capture_respawn_min_seconds, 480.0)) assert(is_equal_approx(brown.capture_respawn_max_seconds, 720.0)) @@ -70,17 +51,6 @@ func _validate_catalog_statuses() -> void: assert(is_equal_approx(brown.minimum_respawn_spacing_seconds, 180.0)) assert(brown.required_tool_id == &"crab_net") assert(is_equal_approx(brown.minimum_surface_y, -0.44)) - assert( - brown.surface_water_relation - == GatherableData.SurfaceWaterRelation.ABOVE_SALT_WATER - ) - assert(is_equal_approx( - brown.surface_population_per_100_square_meters, - 0.15, - )) - assert(brown.maximum_surface_population == 24) - assert(brown.target_population_for_surface_area(100.0) == 2) - assert(brown.target_population_for_surface_area(7500.0) == 12) assert(FishCatalog.get_fish_by_id(&"crab_brown") == brown.catch_data) assert(not brown.catch_data.is_fishable()) var clam: GatherableData = Gatherables.get_entry(&"clam_manila") @@ -103,8 +73,6 @@ func _validate_catalog_statuses() -> void: assert(beetle.catch_data.collection_method == FishData.CollectionMethod.NET) assert(beetle.required_tool_id == &"crab_net") assert(beetle.spawn_anchor_set_id == &"starter_reachable_tree_trunks") - assert(is_equal_approx(beetle.spawn_anchor_occupancy_ratio, 0.35)) - assert(beetle.maximum_anchor_population == 64) assert(beetle.is_stationary_spawn()) assert(not beetle.is_stationary_hotspot()) assert(not beetle.requires_sneaking) @@ -112,32 +80,11 @@ func _validate_catalog_statuses() -> void: assert(FishCatalog.get_fish_by_id(&"beetle_stag_common") == beetle.catch_data) assert(not beetle.catch_data.is_fishable()) - var blue: GatherableData = Gatherables.get_entry(&"crab_blue") - assert(blue != null and blue.is_available()) - assert(blue.catch_data.active) - assert(blue.is_available(CalendarSeasonType.Season.SUMMER)) - assert(blue.is_available(CalendarSeasonType.Season.FALL)) - assert(not blue.is_available(CalendarSeasonType.Season.WINTER)) - assert( - blue.surface_water_relation - == GatherableData.SurfaceWaterRelation.BELOW_SALT_WATER - ) - assert(is_equal_approx( - blue.surface_population_per_100_square_meters, - 0.4, - )) - assert(blue.maximum_surface_population == 16) - assert(is_equal_approx(blue.sprite_pixel_size, CRAB_PIXEL_SIZE)) - assert(is_equal_approx( - blue.sprite_surface_offset, - CRAB_SURFACE_OFFSET, - )) - assert(blue.target_population_for_surface_area(100.0) == 4) - assert(blue.target_population_for_surface_area(2250.0) == 9) - assert(FishCatalog.get_fish_by_id(&"crab_blue") == blue.catch_data) - assert(not blue.catch_data.is_fishable()) - - for type_id: StringName in [&"crab_ghost", &"crab_dungeness"]: + for type_id: StringName in [ + &"crab_ghost", + &"crab_blue", + &"crab_dungeness", + ]: var entry: GatherableData = Gatherables.get_entry(type_id) assert(entry != null) assert(entry.is_valid()) @@ -149,10 +96,6 @@ func _validate_catalog_statuses() -> void: CRAB_PIXEL_SIZE, ) ) - assert(is_equal_approx( - entry.sprite_surface_offset, - CRAB_SURFACE_OFFSET, - )) assert(entry.catch_data.collection_method == FishData.CollectionMethod.NET) assert( entry.catch_data.logbook_section @@ -160,9 +103,8 @@ func _validate_catalog_statuses() -> void: ) var available: Array[GatherableData] = Gatherables.get_available_entries() - assert(available.size() == 4) + assert(available.size() == 3) assert(available.has(brown)) - assert(available.has(blue)) assert(available.has(clam)) assert(available.has(beetle)) var winter_available: Array[GatherableData] = ( @@ -170,7 +112,6 @@ func _validate_catalog_statuses() -> void: ) assert(winter_available.has(brown)) assert(winter_available.has(clam)) - assert(not winter_available.has(blue)) assert(not winter_available.has(beetle)) var rng := RandomNumberGenerator.new() rng.seed = 24680 @@ -197,44 +138,16 @@ func _validate_catalog_statuses() -> void: func _validate_billboard_presentation() -> void: var gatherable := WorldGatherableType.new() - root.add_child(gatherable) - var brown: GatherableData = Gatherables.get_entry(&"crab_brown") - gatherable.configure("crab-size-validation", brown, Vector3.ZERO, 0.0) + gatherable.call("_ensure_visual") var sprite := gatherable.get_node("GatherableSprite") as Sprite3D assert(sprite != null) assert(sprite.billboard == BaseMaterial3D.BILLBOARD_ENABLED) assert(sprite.texture_filter == BaseMaterial3D.TEXTURE_FILTER_NEAREST) assert(not sprite.shaded) - assert(is_equal_approx(sprite.pixel_size, CRAB_PIXEL_SIZE)) - assert(is_equal_approx(sprite.position.y, CRAB_SURFACE_OFFSET)) - assert(is_equal_approx( - float(sprite.texture.get_width()) * sprite.pixel_size, - CRAB_SPRITE_EXTENT, - )) - gatherable.queue_free() - await process_frame + gatherable.free() - var unconfigured_hotspot := WorldGatherableType.new() - unconfigured_hotspot.call("_ensure_water_spurt_visual") - assert( - unconfigured_hotspot.get_node_or_null( - "WaterSpurt/WaterDroplets" - ) == null - ) - unconfigured_hotspot.free() - - var clam: GatherableData = Gatherables.get_entry(&"clam_manila") - assert(clam != null) var hotspot := WorldGatherableType.new() - root.add_child(hotspot) - var configured_position := Vector3(24.0, 0.3, -11.0) - hotspot.configure( - "world:clam-presentation-regression", - clam, - configured_position, - 0.0, - ) - assert(hotspot.global_position.is_equal_approx(configured_position)) + hotspot.call("_ensure_water_spurt_visual") var hole := hotspot.get_node("WaterSpurt/BurrowMark") as MeshInstance3D assert(hole != null) assert(hole.cast_shadow == GeometryInstance3D.SHADOW_CASTING_SETTING_OFF) @@ -243,18 +156,6 @@ func _validate_billboard_presentation() -> void: assert(hole_material.shading_mode == BaseMaterial3D.SHADING_MODE_UNSHADED) assert(hole_material.transparency == BaseMaterial3D.TRANSPARENCY_DISABLED) assert(is_equal_approx(hole_material.albedo_color.a, 1.0)) - var particles := hotspot.get_node( - "WaterSpurt/WaterDroplets" - ) as CPUParticles3D - assert(particles != null and particles.emitting) - assert(particles.local_coords) - assert(particles.global_position.is_equal_approx( - configured_position + Vector3.UP * 0.035 - )) - hotspot.set_process(false) - await create_timer(0.6).timeout - await process_frame - assert(hotspot.get_node_or_null("WaterSpurt/WaterDroplets") == null) hotspot.queue_free() diff --git a/tests/world_time_validation.gd b/tests/world_time_validation.gd index 2ccd2ab..17ddb49 100644 --- a/tests/world_time_validation.gd +++ b/tests/world_time_validation.gd @@ -42,15 +42,9 @@ func _run() -> void: func _validate_clock_boundaries_and_duration() -> void: - var real_seconds_per_cycle: float = ( - WorldTimeServiceType.REAL_SECONDS_PER_CYCLE - ) - var hours_per_real_second: float = ( - WorldTimeServiceType.HOURS_PER_REAL_SECOND - ) - assert(real_seconds_per_cycle == 86400.0) + assert(WorldTimeServiceType.REAL_SECONDS_PER_CYCLE == 86400.0) assert(is_equal_approx( - hours_per_real_second, + WorldTimeServiceType.HOURS_PER_REAL_SECOND, 1.0 / 3600.0, )) assert(is_equal_approx( @@ -310,7 +304,7 @@ func _validate_environment_presentation() -> void: var sky := Sky.new() var sky_material := ShaderMaterial.new() sky_material.shader = preload( - "res://world/environment/straywild_sky.gdshader" + "res://world/environment/netfishing_sky.gdshader" ) sky.sky_material = sky_material environment.sky = sky @@ -358,7 +352,7 @@ func _validate_environment_presentation() -> void: "res://world/materials/stylized_water.gdshader" ) var sky_shader: Shader = preload( - "res://world/environment/straywild_sky.gdshader" + "res://world/environment/netfishing_sky.gdshader" ) assert("uniform float fog_horizon_occlusion" in sky_shader.code) assert("fog_horizon_color.rgb" in sky_shader.code) diff --git a/tests/world_weather_validation.gd b/tests/world_weather_validation.gd index beb3541..c346e93 100644 --- a/tests/world_weather_validation.gd +++ b/tests/world_weather_validation.gd @@ -10,18 +10,12 @@ const WorldTimeServiceType = preload("res://world/world_time_service.gd") const WorldTimeVisualControllerType = preload( "res://world/world_time_visual_controller.gd" ) -const PrecipitationOcclusionType = preload( - "res://world/environment/precipitation_occlusion.gd" -) const FishingContextType = preload("res://fishing/fishing_context.gd") const FishingSpotType = preload("res://fishing/fishing_spot.gd") const FishAvailabilityType = preload("res://fish/fish_availability.gd") const FishableWaterRegionType = preload( "res://world/fishable_water_region.gd" ) -const RainPuddlePresentationType = preload( - "res://world/rain_puddle_presentation.gd" -) func _initialize() -> void: @@ -37,22 +31,11 @@ func _run() -> void: _validate_fishing_weather_seams() _validate_fishing_spot_context() _validate_weather_presentation() - _validate_rain_puddle_surface_rules() print("World weather validation: PASS") quit() func _validate_weather_scheduler() -> void: - assert(JobCatalog.FOGGY_WEATHER_WEIGHT < JobCatalog.SUNNY_WEATHER_WEIGHT) - assert(JobCatalog.FOGGY_WEATHER_WEIGHT < JobCatalog.CLOUDY_WEATHER_WEIGHT) - assert(JobCatalog.FOGGY_WEATHER_WEIGHT < JobCatalog.RAINY_WEATHER_WEIGHT) - assert(is_equal_approx( - JobCatalog.SUNNY_WEATHER_WEIGHT - + JobCatalog.CLOUDY_WEATHER_WEIGHT - + JobCatalog.RAINY_WEATHER_WEIGHT - + JobCatalog.FOGGY_WEATHER_WEIGHT, - 1.0, - )) var weather := WorldWeatherServiceType.new() root.add_child(weather) weather.begin_authoritative_session(20260802) @@ -289,53 +272,6 @@ func _validate_fishing_spot_context() -> void: weather.free() -func _validate_rain_puddle_surface_rules() -> void: - var dry_flat := PackedVector3Array([ - Vector3(-1.0, 0.0, -1.0), - Vector3(2.0, 0.0, -1.0), - Vector3(-1.0, 0.0, 2.0), - ]) - assert(RainPuddlePresentationType.is_puddle_surface_eligible( - dry_flat, - -0.25, - )) - var water_edge := PackedVector3Array([ - Vector3(-1.0, 0.0, -1.0), - Vector3(2.0, 0.0, -1.0), - Vector3(-1.0, -0.2, 2.0), - ]) - assert(not RainPuddlePresentationType.is_puddle_surface_eligible( - water_edge, - -0.25, - )) - var steep_ground := PackedVector3Array([ - Vector3(-1.0, 0.0, -1.0), - Vector3(2.0, 0.0, -1.0), - Vector3(-1.0, 2.0, -0.75), - ]) - assert(not RainPuddlePresentationType.is_puddle_surface_eligible( - steep_ground, - -0.25, - )) - var center := Vector3(4.0, 1.0, -3.0) - var radii := Vector2(1.0, 0.5) - assert(RainPuddlePresentationType.is_point_inside_puddle( - Vector3(4.75, 1.0, -3.0), - center, - radii, - )) - assert(not RainPuddlePresentationType.is_point_inside_puddle( - Vector3(5.1, 1.0, -3.0), - center, - radii, - )) - assert(not RainPuddlePresentationType.is_point_inside_puddle( - Vector3(4.0, 2.1, -3.0), - center, - radii, - )) - - func _validate_weather_presentation() -> void: var world_root := Node3D.new() root.add_child(world_root) @@ -344,7 +280,7 @@ func _validate_weather_presentation() -> void: var sky := Sky.new() var sky_material := ShaderMaterial.new() sky_material.shader = preload( - "res://world/environment/straywild_sky.gdshader" + "res://world/environment/netfishing_sky.gdshader" ) sky.sky_material = sky_material environment.sky = sky @@ -443,13 +379,11 @@ func _validate_weather_presentation() -> void: "res://world/environment/local_storm_cloud.gdshader" ) assert("cull_disabled" in cloud_shader.code) - var cloud_wrap_radius: float = LocalStormCloudLayer.WRAP_RADIUS - var cloud_maximum_opacity: float = LocalStormCloudLayer.MAXIMUM_OPACITY - var cloud_distance_fade_end: float = LocalStormCloudLayer.DISTANCE_FADE_END - assert(cloud_wrap_radius >= 315.0) - assert(is_equal_approx(cloud_maximum_opacity, 1.0)) + assert(LocalStormCloudLayer.WRAP_RADIUS >= 315.0) + assert(is_equal_approx(LocalStormCloudLayer.MAXIMUM_OPACITY, 1.0)) assert( - cloud_distance_fade_end < cloud_wrap_radius + LocalStormCloudLayer.DISTANCE_FADE_END + < LocalStormCloudLayer.WRAP_RADIUS ) assert(is_zero_approx(float(storm_clouds.call("get_storm_amount")))) visuals.apply_weather_immediately( @@ -587,48 +521,11 @@ func _validate_weather_presentation() -> void: assert(rain.emitting) assert(rain.amount_ratio > 0.99) assert(rain.amount == WorldTimeVisualControllerType.RAIN_PARTICLE_AMOUNT) - visuals.set_local_home_interior_active(true) - assert(not rain.visible) - assert(not rain.emitting) - assert(is_zero_approx(rain.amount_ratio)) - assert(not runtime_environment.fog_enabled) - assert(not storm_clouds.visible) - assert(is_zero_approx(float(storm_clouds.call("get_storm_amount")))) - visuals.set_local_home_interior_active(false) - assert(rain.visible) - assert(rain.emitting) - assert(rain.amount_ratio > 0.99) - assert(storm_clouds.visible) - var rain_emitter_offset: Vector3 = ( - WorldTimeVisualControllerType.RAIN_EMITTER_OFFSET - ) - var rain_supported_canopy_height: float = ( - WorldTimeVisualControllerType.RAIN_SUPPORTED_CANOPY_HEIGHT - ) - var rain_canopy_clearance: float = ( - WorldTimeVisualControllerType.RAIN_CANOPY_CLEARANCE - ) - assert( - rain_emitter_offset.y - >= rain_supported_canopy_height + rain_canopy_clearance - ) - assert(is_equal_approx( - rain.lifetime, - WorldTimeVisualControllerType.RAIN_LIFETIME_SECONDS, - )) assert(rain.visibility_aabb == ( WorldTimeVisualControllerType.RAIN_VISIBILITY_AABB )) var rain_material := rain.process_material as ParticleProcessMaterial assert(rain_material != null) - assert( - rain_material.collision_mode - == ParticleProcessMaterial.COLLISION_HIDE_ON_CONTACT - ) - assert(is_equal_approx( - rain.collision_base_size, - WorldTimeVisualControllerType.RAIN_COLLISION_BASE_SIZE, - )) assert(rain_material.emission_box_extents.is_equal_approx( WorldTimeVisualControllerType.RAIN_EMISSION_EXTENTS )) @@ -640,39 +537,11 @@ func _validate_weather_presentation() -> void: rain_material.initial_velocity_max, WorldTimeVisualControllerType.RAIN_VELOCITY_MAX, )) - assert(rain_material.gravity.is_equal_approx( - WorldTimeVisualControllerType.RAIN_GRAVITY - )) var rain_mesh := rain.draw_pass_1 as BoxMesh assert(rain_mesh != null) assert(rain_mesh.size.is_equal_approx( WorldTimeVisualControllerType.RAIN_DROP_SIZE )) - var rain_collision := visuals.get_node( - "LocalRainCanopyCollision" - ) as GPUParticlesCollisionHeightField3D - assert(rain_collision != null) - assert(rain_collision.follow_camera_enabled) - assert( - rain_collision.resolution - == GPUParticlesCollisionHeightField3D.RESOLUTION_256 - ) - assert( - rain_collision.update_mode - == GPUParticlesCollisionHeightField3D.UPDATE_MODE_WHEN_MOVED - ) - assert(rain_collision.size.is_equal_approx( - WorldTimeVisualControllerType.RAIN_COLLISION_SIZE - )) - assert( - rain_collision.size.y * 0.5 - > WorldTimeVisualControllerType.RAIN_EMITTER_OFFSET.y - + WorldTimeVisualControllerType.RAIN_EMISSION_EXTENTS.y - ) - assert( - rain_collision.heightfield_mask - == PrecipitationOcclusionType.RENDER_LAYER_MASK - ) visuals.call( "_on_weather_changed", WorldWeatherServiceType.Weather.SUNNY, diff --git a/tools/art/export_creature_art.py b/tools/art/export_creature_art.py deleted file mode 100644 index 758be87..0000000 --- a/tools/art/export_creature_art.py +++ /dev/null @@ -1,256 +0,0 @@ -#!/usr/bin/env python3 -"""Export cataloged creature artwork with consistent transparent margins.""" - -from __future__ import annotations - -import argparse -import hashlib -import re -import sys -import zipfile -import xml.etree.ElementTree as ET -from pathlib import Path - -from PIL import Image - - -TABLE_NAMESPACE = "urn:oasis:names:tc:opendocument:xmlns:table:1.0" -TABLE_ATTRIBUTE = "{%s}" % TABLE_NAMESPACE -NAMESPACES = {"table": TABLE_NAMESPACE} -VALID_EXPORT_SIZES = {64, 128, 256, 512} -SAFE_AREA_RATIO = 0.875 -KNOWN_SOURCE_ALIASES = { - # The delivered filename predates the catalog's authoritative species ID. - "bowfish": "bowfin", -} - - -def parse_arguments() -> argparse.Namespace: - parser = argparse.ArgumentParser( - description=( - "Export PNG creature art according to the catalog's recommended " - "canvas size, using alpha-bound trimming and nearest-neighbor scaling." - ) - ) - parser.add_argument("--tracker", required=True, type=Path) - parser.add_argument("--source", required=True, type=Path) - parser.add_argument("--output", required=True, type=Path) - parser.add_argument( - "--skip", - action="append", - default=[], - help="Catalog creature ID or source filename stem to skip; repeat as needed.", - ) - parser.add_argument( - "--dry-run", - action="store_true", - help="Validate and report the batch without writing output files.", - ) - return parser.parse_args() - - -def normalize_name(value: str) -> str: - normalized = value.strip().lower().replace("&", " and ") - normalized = re.sub(r"[^a-z0-9]+", "_", normalized) - return normalized.strip("_") - - -def expanded_row_values(row: ET.Element) -> list[str]: - values: list[str] = [] - for cell in row.findall("table:table-cell", NAMESPACES): - repeat = int( - cell.attrib.get( - TABLE_ATTRIBUTE + "number-columns-repeated", - "1", - ) - ) - values.extend(["".join(cell.itertext()).strip()] * repeat) - return values - - -def load_catalog(tracker_path: Path) -> list[dict[str, str]]: - with zipfile.ZipFile(tracker_path) as archive: - root = ET.fromstring(archive.read("content.xml")) - table = root.find(".//table:table", NAMESPACES) - if table is None: - raise ValueError("tracker does not contain a table") - rows = table.findall("table:table-row", NAMESPACES) - if not rows: - raise ValueError("tracker table is empty") - headers = expanded_row_values(rows[0]) - required_headers = { - "catalog_number", - "display_name", - "id", - "recommended_export_canvas_px", - } - missing_headers = required_headers.difference(headers) - if missing_headers: - raise ValueError( - "tracker is missing required columns: " - + ", ".join(sorted(missing_headers)) - ) - records: list[dict[str, str]] = [] - for row in rows[1:]: - values = expanded_row_values(row) - if not any(values): - continue - record = dict(zip(headers, values)) - if record.get("id", "").strip(): - records.append(record) - return records - - -def catalog_lookup(records: list[dict[str, str]]) -> dict[str, dict[str, str]]: - lookup: dict[str, dict[str, str]] = {} - for record in records: - keys = { - normalize_name(record["catalog_number"]), - normalize_name(record["id"]), - normalize_name(record["display_name"]), - } - for key in keys: - previous = lookup.get(key) - if previous is not None and previous["id"] != record["id"]: - raise ValueError( - f"ambiguous normalized catalog name {key!r}: " - f"{previous['id']} and {record['id']}" - ) - lookup[key] = record - return lookup - - -def resolve_record( - source_path: Path, - lookup: dict[str, dict[str, str]], -) -> dict[str, str]: - source_key = normalize_name(source_path.stem) - catalog_key = KNOWN_SOURCE_ALIASES.get(source_key, source_key) - record = lookup.get(catalog_key) - if record is None: - raise ValueError( - f"cannot map source {source_path.name!r} to one catalog creature" - ) - return record - - -def normalize_artwork(source_path: Path, canvas_size: int) -> tuple[Image.Image, tuple[int, int, int, int], tuple[int, int]]: - with Image.open(source_path) as source_image: - artwork = source_image.convert("RGBA") - alpha_bounds = artwork.getchannel("A").getbbox() - if alpha_bounds is None: - raise ValueError(f"source {source_path.name!r} is fully transparent") - visible = artwork.crop(alpha_bounds) - safe_long_side = round(canvas_size * SAFE_AREA_RATIO) - scale = safe_long_side / max(visible.width, visible.height) - scaled_size = ( - max(1, round(visible.width * scale)), - max(1, round(visible.height * scale)), - ) - visible = visible.resize(scaled_size, Image.Resampling.NEAREST) - canvas = Image.new("RGBA", (canvas_size, canvas_size), (0, 0, 0, 0)) - offset = ( - (canvas_size - scaled_size[0]) // 2, - (canvas_size - scaled_size[1]) // 2, - ) - canvas.alpha_composite(visible, offset) - return canvas, alpha_bounds, scaled_size - - -def sha256(path: Path) -> str: - digest = hashlib.sha256() - with path.open("rb") as source: - for block in iter(lambda: source.read(1024 * 1024), b""): - digest.update(block) - return digest.hexdigest() - - -def main() -> int: - arguments = parse_arguments() - records = load_catalog(arguments.tracker) - lookup = catalog_lookup(records) - skip_keys = {normalize_name(value) for value in arguments.skip} - source_paths = sorted(arguments.source.glob("*.png")) - if not source_paths: - raise ValueError(f"no PNG files found under {arguments.source}") - - resolved_by_output: dict[str, tuple[Path, dict[str, str]]] = {} - for source_path in source_paths: - record = resolve_record(source_path, lookup) - source_key = normalize_name(source_path.stem) - creature_key = normalize_name(record["id"]) - if source_key in skip_keys or creature_key in skip_keys: - print(f"SKIP {source_path.name} -> {record['id']}") - continue - output_name = f"{record['catalog_number']}.png" - previous = resolved_by_output.get(output_name) - if previous is not None: - previous_path, _previous_record = previous - catalog_key = normalize_name(record["catalog_number"]) - previous_is_numbered = ( - normalize_name(previous_path.stem) == catalog_key - ) - current_is_numbered = source_key == catalog_key - if current_is_numbered and not previous_is_numbered: - print( - "SUPERSEDE " - f"{previous_path.name} with numbered source " - f"{source_path.name} -> {record['id']}" - ) - resolved_by_output[output_name] = (source_path, record) - continue - if previous_is_numbered and not current_is_numbered: - print( - "SKIP " - f"{source_path.name}; numbered source " - f"{previous_path.name} takes precedence -> {record['id']}" - ) - continue - raise ValueError( - f"duplicate sources for output filename {output_name}: " - f"{previous_path.name} and {source_path.name}" - ) - resolved_by_output[output_name] = (source_path, record) - - resolved = list(resolved_by_output.values()) - - if not arguments.dry_run: - arguments.output.mkdir(parents=True, exist_ok=True) - - for source_path, record in resolved: - canvas_size = int(record["recommended_export_canvas_px"]) - if canvas_size not in VALID_EXPORT_SIZES: - raise ValueError( - f"{record['id']} has invalid export size {canvas_size}" - ) - image, alpha_bounds, scaled_size = normalize_artwork( - source_path, - canvas_size, - ) - output_path = arguments.output / f"{record['catalog_number']}.png" - if not arguments.dry_run: - image.save(output_path, format="PNG", optimize=False, compress_level=6) - output_hash = sha256(output_path) - else: - output_hash = "dry-run" - print( - "EXPORT " - f"{source_path.name} -> {output_path.name} " - f"id={record['id']} canvas={canvas_size}x{canvas_size} " - f"alpha_bounds={alpha_bounds} visible={scaled_size[0]}x{scaled_size[1]} " - f"source_sha256={sha256(source_path)} output_sha256={output_hash}" - ) - - print( - f"Complete: {len(resolved)} export(s), " - f"{len(source_paths) - len(resolved)} skipped." - ) - return 0 - - -if __name__ == "__main__": - try: - raise SystemExit(main()) - except (OSError, ValueError, zipfile.BadZipFile) as error: - print(f"ERROR: {error}", file=sys.stderr) - raise SystemExit(1) diff --git a/tools/blender/export_terrain_chunks.py b/tools/blender/export_terrain_chunks.py index d4a278e..2c35982 100644 --- a/tools/blender/export_terrain_chunks.py +++ b/tools/blender/export_terrain_chunks.py @@ -10,11 +10,10 @@ Run through Blender rather than a standalone Python interpreter: Collections use ``chunk_####_description`` and contain one primary terrain mesh named ``chunk_####``. Additional production objects may live in the same collection. Reusable procedural props use individual ``prop_description`` -mesh objects. Their child empties are exported with them so authored sockets -remain attached to the prop. Props may be arranged anywhere in the source file -because each root object's authored origin becomes the exported runtime anchor. -A same-named ``prop_description`` collection remains supported for multi-object -props. Unrelated objects and collections are ignored. +mesh objects. They may be arranged anywhere in the source file because each +object's authored origin becomes the exported runtime anchor. A same-named +``prop_description`` collection remains supported for multi-object props. +Unrelated objects and collections are ignored. """ from __future__ import annotations @@ -44,12 +43,6 @@ PROP_COLLECTION_PATTERN = re.compile( r"^prop_(?P