first commit
authorEduardo <[email protected]>
Sun, 7 Jul 2024 12:56:33 +0000 (14:56 +0200)
committerEduardo <[email protected]>
Sun, 7 Jul 2024 12:56:33 +0000 (14:56 +0200)
197 files changed:
addons/label_font_auto_sizer/LICENSE [new file with mode: 0644]
addons/label_font_auto_sizer/icon.svg [new file with mode: 0644]
addons/label_font_auto_sizer/icon.svg.import [new file with mode: 0644]
addons/label_font_auto_sizer/label_auto_sizer.gd [new file with mode: 0644]
addons/label_font_auto_sizer/label_font_auto_size_manager.gd [new file with mode: 0644]
addons/label_font_auto_sizer/plugin.cfg [new file with mode: 0644]
addons/label_font_auto_sizer/plugin.gd [new file with mode: 0644]
addons/label_font_auto_sizer/rich_label_auto_sizer.gd [new file with mode: 0644]
addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png [new file with mode: 0644]
addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png.import [new file with mode: 0644]
addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png [new file with mode: 0644]
addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png.import [new file with mode: 0644]
addons/phantom_camera/examples/credits.txt [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/2D-4.3/2d_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_framed_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_group_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_path_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/2D-4.3/2d_limit_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/2D-4.3/2d_tweening_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/2D/2d_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/2D/2d_follow_framed_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/2D/2d_follow_group_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/2D/2d_follow_path_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/2D/2d_limit_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/2D/2d_tweening_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/3D/3d_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/3D/3d_follow_framed_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/3D/3d_follow_glued_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/3D/3d_follow_group_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/3D/3d_follow_path_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/3D/3d_follow_simple_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/3D/3d_look_at_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/3D/3d_tweening_example_scene.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn [new file with mode: 0644]
addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_third_person_3d.tscn [new file with mode: 0644]
addons/phantom_camera/examples/models/3d_cube_dark.tscn [new file with mode: 0644]
addons/phantom_camera/examples/resources/tween/fixed_camera_tween.tres [new file with mode: 0644]
addons/phantom_camera/examples/resources/tween/inventory_phantom_camera_2d_tween.tres [new file with mode: 0644]
addons/phantom_camera/examples/resources/tween/item_focus_phantom_camera_2d_tween.tres [new file with mode: 0644]
addons/phantom_camera/examples/resources/tween/player_phantom_camera_2d_tween.tres [new file with mode: 0644]
addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres [new file with mode: 0644]
addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween.gd [new file with mode: 0644]
addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween_4.3.gd [new file with mode: 0644]
addons/phantom_camera/examples/scripts/2D/2d_trigger_area.gd [new file with mode: 0644]
addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd [new file with mode: 0644]
addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd [new file with mode: 0644]
addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd [new file with mode: 0644]
addons/phantom_camera/examples/scripts/3D/npc.gd [new file with mode: 0644]
addons/phantom_camera/examples/scripts/3D/path_follow.gd [new file with mode: 0644]
addons/phantom_camera/examples/scripts/3D/player_controller.gd [new file with mode: 0644]
addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd [new file with mode: 0644]
addons/phantom_camera/examples/textures/2D/inventory_container.png [new file with mode: 0644]
addons/phantom_camera/examples/textures/2D/inventory_container.png.import [new file with mode: 0644]
addons/phantom_camera/examples/textures/2D/level_spritesheet.png [new file with mode: 0644]
addons/phantom_camera/examples/textures/2D/level_spritesheet.png.import [new file with mode: 0644]
addons/phantom_camera/examples/textures/2D/phantom_camera_2d_sprite.png [new file with mode: 0644]
addons/phantom_camera/examples/textures/2D/phantom_camera_2d_sprite.png.import [new file with mode: 0644]
addons/phantom_camera/examples/textures/2D/player_sprite.svg [new file with mode: 0644]
addons/phantom_camera/examples/textures/2D/player_sprite.svg.import [new file with mode: 0644]
addons/phantom_camera/examples/textures/2D/sign_prompt.png [new file with mode: 0644]
addons/phantom_camera/examples/textures/2D/sign_prompt.png.import [new file with mode: 0644]
addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png [new file with mode: 0644]
addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png.import [new file with mode: 0644]
addons/phantom_camera/examples/ui/ui_inventory.tscn [new file with mode: 0644]
addons/phantom_camera/examples/ui/ui_sign.tscn [new file with mode: 0644]
addons/phantom_camera/fonts/Nunito-Black.ttf [new file with mode: 0644]
addons/phantom_camera/fonts/Nunito-Black.ttf.import [new file with mode: 0644]
addons/phantom_camera/fonts/Nunito-Regular.ttf [new file with mode: 0644]
addons/phantom_camera/fonts/Nunito-Regular.ttf.import [new file with mode: 0644]
addons/phantom_camera/gizmos/custom_gizmo.gd [new file with mode: 0644]
addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd [new file with mode: 0644]
addons/phantom_camera/icons/misc/PriorityOverride.svg [new file with mode: 0644]
addons/phantom_camera/icons/misc/PriorityOverride.svg.import [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_2d.svg [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_2d.svg.import [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_3d.svg [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_3d.svg.import [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg.import [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_gizmo.svg [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_gizmo.svg.import [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_glow_logo.png [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_glow_logo.png.import [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_host.svg [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_host.svg.import [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_logo.png [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_logo.png.import [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_tween.svg [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_tween.svg.import [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg [new file with mode: 0644]
addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg.import [new file with mode: 0644]
addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg [new file with mode: 0644]
addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg.import [new file with mode: 0644]
addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg [new file with mode: 0644]
addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg.import [new file with mode: 0644]
addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg [new file with mode: 0644]
addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg.import [new file with mode: 0644]
addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd [new file with mode: 0644]
addons/phantom_camera/panel/editor.gd [new file with mode: 0644]
addons/phantom_camera/panel/editor.tscn [new file with mode: 0644]
addons/phantom_camera/panel/updater/download_update_panel.tscn [new file with mode: 0644]
addons/phantom_camera/panel/updater/update_button.tscn [new file with mode: 0644]
addons/phantom_camera/panel/viewfinder/deadzone_style_box.tres [new file with mode: 0644]
addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn [new file with mode: 0644]
addons/phantom_camera/plugin.cfg [new file with mode: 0644]
addons/phantom_camera/plugin.gd [new file with mode: 0644]
addons/phantom_camera/scripts/managers/phantom_camera_manager.gd [new file with mode: 0644]
addons/phantom_camera/scripts/panel/updater/download_update_panel.gd [new file with mode: 0644]
addons/phantom_camera/scripts/panel/updater/update_button.gd [new file with mode: 0644]
addons/phantom_camera/scripts/panel/updater/updater_constants.gd [new file with mode: 0644]
addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd [new file with mode: 0644]
addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd [new file with mode: 0644]
addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd [new file with mode: 0644]
addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd [new file with mode: 0644]
addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd [new file with mode: 0644]
addons/phantom_camera/scripts/resources/camera_3d_resource.gd [new file with mode: 0644]
addons/phantom_camera/scripts/resources/tween_resource.gd [new file with mode: 0644]
addons/save_system/LICENSE [new file with mode: 0644]
addons/save_system/README.md [new file with mode: 0644]
addons/save_system/plugin.cfg [new file with mode: 0644]
addons/save_system/plugin_logo.png [new file with mode: 0644]
addons/save_system/plugin_logo.png.import [new file with mode: 0644]
addons/save_system/plugin_save_system.gd [new file with mode: 0644]
addons/save_system/save_system.gd [new file with mode: 0644]
addons/save_system/save_system_test/save_system_test.gd [new file with mode: 0644]
addons/save_system/save_system_test/save_system_test_resource.gd [new file with mode: 0644]
addons/save_system/save_system_test/save_system_test_subresource.gd [new file with mode: 0644]
addons/scene_manager/Dissolve2d.gdshader [new file with mode: 0644]
addons/scene_manager/LICENSE [new file with mode: 0644]
addons/scene_manager/NodeFlagsInspectorPlugin.gd [new file with mode: 0644]
addons/scene_manager/README.md [new file with mode: 0644]
addons/scene_manager/SceneManager.gd [new file with mode: 0644]
addons/scene_manager/SceneManager.tscn [new file with mode: 0644]
addons/scene_manager/SceneManagerConstants.gd [new file with mode: 0644]
addons/scene_manager/SceneManagerPlugin.gd [new file with mode: 0644]
addons/scene_manager/ShaderFade.tres [new file with mode: 0644]
addons/scene_manager/SingletonCheckProperty.gd [new file with mode: 0644]
addons/scene_manager/SingletonNameProperty.gd [new file with mode: 0644]
addons/scene_manager/icon.png [new file with mode: 0644]
addons/scene_manager/icon.png.import [new file with mode: 0644]
addons/scene_manager/plugin.cfg [new file with mode: 0644]
addons/scene_manager/shader_patterns/circle.png [new file with mode: 0644]
addons/scene_manager/shader_patterns/circle.png.import [new file with mode: 0644]
addons/scene_manager/shader_patterns/curtains.png [new file with mode: 0644]
addons/scene_manager/shader_patterns/curtains.png.import [new file with mode: 0644]
addons/scene_manager/shader_patterns/diagonal.png [new file with mode: 0644]
addons/scene_manager/shader_patterns/diagonal.png.import [new file with mode: 0644]
addons/scene_manager/shader_patterns/horizontal.png [new file with mode: 0644]
addons/scene_manager/shader_patterns/horizontal.png.import [new file with mode: 0644]
addons/scene_manager/shader_patterns/radial.png [new file with mode: 0644]
addons/scene_manager/shader_patterns/radial.png.import [new file with mode: 0644]
addons/scene_manager/shader_patterns/scribbles.png [new file with mode: 0644]
addons/scene_manager/shader_patterns/scribbles.png.import [new file with mode: 0644]
addons/scene_manager/shader_patterns/squares.png [new file with mode: 0644]
addons/scene_manager/shader_patterns/squares.png.import [new file with mode: 0644]
addons/scene_manager/shader_patterns/vertical.png [new file with mode: 0644]
addons/scene_manager/shader_patterns/vertical.png.import [new file with mode: 0644]
addons/script-tabs/LICENSE [new file with mode: 0644]
addons/script-tabs/plugin.cfg [new file with mode: 0644]
addons/script-tabs/plugin.gd [new file with mode: 0644]
assets/animations/player_animation.tres [new file with mode: 0644]
assets/resources/save_resource.gd [new file with mode: 0644]
assets/resources/save_resource.tres [new file with mode: 0644]
assets/shaders/water.gdshader [new file with mode: 0644]
assets/textures/Inner.png [new file with mode: 0644]
assets/textures/Inner.png.import [new file with mode: 0644]
assets/textures/NPC_test.png [new file with mode: 0644]
assets/textures/NPC_test.png.import [new file with mode: 0644]
assets/textures/Overworld.png [new file with mode: 0644]
assets/textures/Overworld.png.import [new file with mode: 0644]
assets/textures/cave.png [new file with mode: 0644]
assets/textures/cave.png.import [new file with mode: 0644]
assets/textures/character.png [new file with mode: 0644]
assets/textures/character.png.import [new file with mode: 0644]
assets/textures/font.png [new file with mode: 0644]
assets/textures/font.png.import [new file with mode: 0644]
assets/textures/log.png [new file with mode: 0644]
assets/textures/log.png.import [new file with mode: 0644]
assets/textures/objects.png [new file with mode: 0644]
assets/textures/objects.png.import [new file with mode: 0644]
icon.svg [new file with mode: 0644]
icon.svg.import [new file with mode: 0644]
project.godot [new file with mode: 0644]
scenes/elements/door_scene_manager.tscn [new file with mode: 0644]
scenes/elements/player.tscn [new file with mode: 0644]
scenes/house_template.tscn [new file with mode: 0644]
scenes/interfaces/pause_menu.tscn [new file with mode: 0644]
scenes/interfaces/save_menu.tscn [new file with mode: 0644]
scenes/main_level.tscn [new file with mode: 0644]
scripts/constants.gd [new file with mode: 0644]
scripts/door_scene_manager.gd [new file with mode: 0644]
scripts/globals.gd [new file with mode: 0644]
scripts/main_level.gd [new file with mode: 0644]
scripts/pause_menu.gd [new file with mode: 0644]
scripts/player.gd [new file with mode: 0644]

diff --git a/addons/label_font_auto_sizer/LICENSE b/addons/label_font_auto_sizer/LICENSE
new file mode 100644 (file)
index 0000000..485105b
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Lescandez
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/addons/label_font_auto_sizer/icon.svg b/addons/label_font_auto_sizer/icon.svg
new file mode 100644 (file)
index 0000000..5022cea
--- /dev/null
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   height="16"
+   viewBox="0 0 16 16"
+   width="16"
+   version="1.1"
+   id="svg1"
+   sodipodi:docname="Label.svg"
+   inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <defs
+     id="defs1" />
+  <sodipodi:namedview
+     id="namedview1"
+     pagecolor="#ffffff"
+     bordercolor="#999999"
+     borderopacity="1"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     showguides="true"
+     inkscape:zoom="25.65625"
+     inkscape:cx="8.3020706"
+     inkscape:cy="11.127893"
+     inkscape:window-width="1920"
+     inkscape:window-height="1017"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg1">
+    <sodipodi:guide
+       position="1.0377588,8.0048721"
+       orientation="0,-1"
+       id="guide1"
+       inkscape:locked="false" />
+  </sodipodi:namedview>
+  <path
+     id="path4"
+     style="fill:#8eef97"
+     inkscape:label="path4"
+     d="M 6 3 C 5.7347997 3.0000401 5.4804738 3.1054236 5.2929688 3.2929688 L 1.2929688 7.2929688 C 0.90254633 7.6834747 0.90254633 8.3165253 1.2929688 8.7070312 L 5.2929688 12.707031 C 5.4804738 12.894577 5.7347997 12.99996 6 13 L 14 13 C 14.552282 13 15 12.552282 15 12 L 15 4 C 15 3.447717 14.552282 3 14 3 L 6 3 z M 9.8554688 4.3359375 L 11.177734 4.3359375 L 13.890625 11.667969 L 12.833984 11.667969 L 12.103516 9.625 L 8.8789062 9.625 L 8.1484375 11.667969 L 7.1425781 11.667969 L 9.8554688 4.3359375 z M 10.490234 5.1894531 L 9.1796875 8.7871094 L 11.796875 8.7871094 L 10.490234 5.1894531 z M 5 7 C 6.3333288 7 6.3333288 9 5 9 C 3.6666712 9 3.6666712 7 5 7 z " />
+</svg>
diff --git a/addons/label_font_auto_sizer/icon.svg.import b/addons/label_font_auto_sizer/icon.svg.import
new file mode 100644 (file)
index 0000000..06dda9c
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://l40lr56f22vs"
+path="res://.godot/imported/icon.svg-678c72dc12642c8e5f0b56a46fd750a5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/label_font_auto_sizer/icon.svg"
+dest_files=["res://.godot/imported/icon.svg-678c72dc12642c8e5f0b56a46fd750a5.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/label_font_auto_sizer/label_auto_sizer.gd b/addons/label_font_auto_sizer/label_auto_sizer.gd
new file mode 100644 (file)
index 0000000..a4c3f59
--- /dev/null
@@ -0,0 +1,236 @@
+@tool
+@icon ("res://addons/label_font_auto_sizer/icon.svg")
+extends Label
+class_name LabelAutoSizer
+
+#region External variables
+@export_group("Size values")
+## The number of times the auto sizer will shrink the font to try to fit the text into the control rect.
+@export_range(1,100) var _max_steps: int = 4:
+       set(value):
+               _max_steps = value
+               if is_node_ready(): ## This setter gets called when the label enters the tree in the editor, before it's ready, which might not be desirable when using auto translate.
+                       call_deferred("_check_line_count") 
+## The size value in pixels that the auto sizer will shrink the font during each step.
+@export_range(1,100) var _size_per_step: int = 2:
+       set(value):
+               _size_per_step = value
+               if is_node_ready(): ## This setter gets called when the label enters the tree in the editor, before it's ready, which might not be desirable when using auto translate.
+                       call_deferred("_check_line_count")
+@export_group("")
+@export_group("Debug settings")
+## Set this to true if you want to debug the steps happening in the class. The calls are commented so you need to decomment them.
+@export var _print_debug_enabled: bool = false
+@export_group("")
+#endregion
+
+#region --Internal variables--
+var _base_font_size: int
+var _current_font_size: int
+var _last_size_state: LABEL_SIZE_STATE = LABEL_SIZE_STATE.IDLE
+var _size_just_modified_by_autosizer: bool = false
+var _label_settings_just_duplicated: bool = false
+var _set_defaults: bool = false
+
+enum LABEL_SIZE_STATE {JUST_SHRUNK, IDLE, JUST_ENLARGED} 
+#endregion
+
+
+#region --Signal funcs--
+## Gets called in-editor and in-game. Sets some default values if necessary.
+func _ready() -> void:
+       if !_set_defaults:
+               set_editor_defaults()
+       #else:
+               #_print_debug_message(str(name) + " Base font size: " + str(_base_font_size) + "px.")
+       if Engine.is_editor_hint():
+               call_deferred("_connect_signals")
+       else:
+               _check_line_count()
+       LabelFontAutoSizeManager.register_label(self)
+
+
+## Gets called when there are changes in either the Theme or Label Settings resources.
+## Checks if the change was made by the script of by the user and if not, sets the base font size value.
+func _on_font_resource_changed() -> void:
+       #_print_debug_message(str(name) + "' Font resource changed.")
+       if _size_just_modified_by_autosizer:
+               _size_just_modified_by_autosizer = false ## Early return because the change wasn't made by the user.
+       else:
+               call_deferred("_set_base_font_size")
+
+
+## Gets called whenever the size of the control rect is modified (in editor). Calls the line count check.
+func _on_label_rect_resized() -> void:
+       if !_set_defaults:
+               return
+       call_deferred("_check_line_count")
+
+
+## Called by autosize manager whenever the locale_chaged() method is called, as the tr() object changes don't trigger
+## the set_text() method of the label, thus the size and line_amount doesn't get checked.
+func _on_locale_changed() -> void:
+       call_deferred("_check_line_count")
+
+
+## Gets called on scene changes and when the label is freed and erases itself from the autosize manager.
+func _exit_tree() -> void:
+       LabelFontAutoSizeManager.erase_label(self)
+#endregion
+
+#region --Private funcs--
+##Only in-editor, keeps stuff in check while manually changing font resources and resizing the label.
+func _connect_signals() -> void:
+       if label_settings != null:
+               if !label_settings.changed.is_connected(_on_font_resource_changed):
+                       label_settings.changed.connect(_on_font_resource_changed)
+       if !theme_changed.is_connected(_on_font_resource_changed):
+               theme_changed.connect(_on_font_resource_changed)
+       if !resized.is_connected(_on_label_rect_resized):
+               resized.connect(_on_label_rect_resized)
+
+
+## Text can be changed via either: set_text(value), or _my_label.text = value. Both will trigger a line check.
+## This func also checks whenever a new LabelSettings resource is un/loaded.
+##**If you're doing some testing/developing, if you are changing the text from withit one of the label classes themselves, do it like self.set_text(value) or self.text = value, othersise it doesn't trigger a size check.
+##In a real scenario you wouldn't be changing the text from within the class itself though.**
+func _set(property: StringName, value: Variant) -> bool:
+       match property:
+               "text":
+                       text = value
+                       call_deferred("_check_line_count")
+                       return true
+               "label_settings":
+                       if _label_settings_just_duplicated: ## Need to check because this gets called whenever we duplicate the resource as well.
+                               _label_settings_just_duplicated = false
+                               return true
+                       else: 
+                               if value != null:
+                                       label_settings = value
+                                       _label_settings_just_duplicated = true
+                                       label_settings = label_settings.duplicate() ## Label Settings are not unique by default, so we it gets duplicated to not override every instance.
+                                       if !label_settings.changed.is_connected(_on_font_resource_changed):
+                                               label_settings.changed.connect(_on_font_resource_changed)
+                               else:
+                                       label_settings = null
+                               call_deferred("_set_base_font_size")
+                       return true
+               _:
+                       return false
+
+
+## Goes through the resources in the label and sets the base font size value.
+## Priority: Label Settings > Override Theme Font Size > Theme Font Size.
+func _set_base_font_size() -> void:
+       if label_settings != null:
+               _base_font_size = label_settings.font_size
+       elif get("theme_override_font_sizes/font_size") != null:
+               _base_font_size = get("theme_override_font_sizes/font_size")
+       elif get_theme_font_size("font_size") != null:
+               _base_font_size = get_theme_font_size("font_size")
+       _current_font_size = _base_font_size
+       #_print_debug_message(str(name) + " Base font size: " + str(_base_font_size) + "px.")
+
+
+## Makes variables persistent without exposing them in the editor.
+## Will get removed in Godot 4.3 with the upcoming @export_storage annotation.
+func _get_property_list():
+       var properties: Array = []
+       var bool_properties: Array[String] = ["_size_just_modified_by_autosizer","_set_defaults"]
+       for name in bool_properties:
+               properties.append({
+                       "name": name,
+                       "type": TYPE_BOOL,
+                       "usage": PROPERTY_USAGE_STORAGE,
+               })
+       var int_properties: Array[String] = ["_base_font_size", "_current_font_size", "_last_size_state"]
+       for name in int_properties:
+               properties.append({
+                       "name": name,
+                       "type": TYPE_INT,
+                       "usage": PROPERTY_USAGE_STORAGE,
+               })
+       return properties
+
+
+## Checks the current font size and amount of lines in the text against the visible lines inside the rect.
+## Calls for the shrink or enlarge methods accordingly.
+func _check_line_count() -> void:
+       #_print_debug_message("Checking lines of " + str(name))
+       if get_line_count() > get_visible_line_count() and _current_font_size > max(_base_font_size - (_size_per_step * _max_steps), 1):
+               _shrink_font()
+               return
+       elif get_line_count() == get_visible_line_count() and _current_font_size < _base_font_size:
+               _enlarge_font()
+               return
+       _last_size_state = LABEL_SIZE_STATE.IDLE
+
+
+## Makes the font size smaller. Rechecks or stops the cycle depending on the conditions.
+func _shrink_font():
+       #_print_debug_message(str(name) + "' shrink method called")
+       _override_font_size(_current_font_size - _size_per_step)
+       #_print_debug_message(str(name) + " shrunk " + str(_size_per_step) + "px.")
+       if _last_size_state == LABEL_SIZE_STATE.JUST_ENLARGED: ## To stop infinite cycles.
+               _last_size_state = LABEL_SIZE_STATE.IDLE
+               #_print_debug_message(str(name) + " finished shrinking. Was just enlarged.")
+       else:
+               _last_size_state = LABEL_SIZE_STATE.JUST_SHRUNK
+               _check_line_count()
+
+
+## Makes the font size larger. Rechecks/Shrinks/stops the cycle depending on the conditions.
+func _enlarge_font():
+       #_print_debug_message(str(name) + "' enlarge method called")
+       _override_font_size(_current_font_size + _size_per_step)
+       if _last_size_state == LABEL_SIZE_STATE.JUST_SHRUNK:
+               if  get_line_count() > get_visible_line_count():
+                       _last_size_state = LABEL_SIZE_STATE.JUST_ENLARGED
+                       _shrink_font()
+               else: ## To stop infinite cycles.
+                       #_print_debug_message(str(name) + " finished enlarging. Was just shrunk.")
+                       _last_size_state = LABEL_SIZE_STATE.IDLE
+       else:
+               _last_size_state = LABEL_SIZE_STATE.JUST_ENLARGED
+               _check_line_count()
+
+
+## Applies the new font size.
+func _override_font_size(new_size: int) -> void:
+       _size_just_modified_by_autosizer = true
+       if label_settings != null:
+               label_settings.font_size = new_size
+       else:
+               set("theme_override_font_sizes/font_size", new_size)
+       _current_font_size = new_size
+
+
+## Prints message on console, for debugging was used while developing. You can decomment all the calls to debug.
+func _print_debug_message(message: String) -> void:
+       if _print_debug_enabled:
+               print(message)
+#endregion
+
+
+#region --Public funcs--
+## Gets called in-editor and sets the default values.
+func set_editor_defaults() -> void:
+       _set_defaults =  true
+       clip_text = true
+       autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
+       if label_settings != null:
+               label_settings = label_settings.duplicate() ## These are not unique by default, so we it gets duplicated to not override every instance.
+               label_settings.changed.connect(_on_font_resource_changed)
+       call_deferred("_set_base_font_size")
+       set_deferred("_current_font_size", _base_font_size)
+       call_deferred("_connect_signals")
+
+
+## Text can be changed via either: set_text(value), or _my_label.text = value. Both will trigger a line check.
+##**If you're doing some testing/developing, if you are changing the text from withit one of the label classes themselves, do it like self.set_text(value) or self.text = value, othersise it doesn't trigger a size check.
+##In a real scenario you wouldn't be changing the text from within the class itself though.**
+func set_text(new_text: String) -> void:
+       text = new_text
+       call_deferred("_check_line_count")
+#endregion
+
diff --git a/addons/label_font_auto_sizer/label_font_auto_size_manager.gd b/addons/label_font_auto_sizer/label_font_auto_size_manager.gd
new file mode 100644 (file)
index 0000000..7c905b9
--- /dev/null
@@ -0,0 +1,21 @@
+@tool
+extends Node
+class_name  LabelFontAutoSizeManager
+
+static var _active_labels : Array[Control]
+
+
+static func register_label(label: Control) -> void:
+       _active_labels.append(label)
+
+
+static func erase_label(label: Control) -> void:
+       _active_labels.erase(label)
+
+
+## This function is to be called by the user after manually changing the locale of the game.
+## Will cause to check the size of all the active labels, useful after changing the language of text pieces.
+## Call it with: LabelFotAutoSizeManager.locale_changed()
+static func locale_chaged() -> void:
+       for label: Control in _active_labels:
+               label._on_locale_changed()
diff --git a/addons/label_font_auto_sizer/plugin.cfg b/addons/label_font_auto_sizer/plugin.cfg
new file mode 100644 (file)
index 0000000..cc12e56
--- /dev/null
@@ -0,0 +1,7 @@
+[plugin]
+
+name="LabelFontAutoSizer - Godot4"
+description="Tool that makes labels text fit into the rect."
+author="Lescandez"
+version="1.0.2"
+script="plugin.gd"
diff --git a/addons/label_font_auto_sizer/plugin.gd b/addons/label_font_auto_sizer/plugin.gd
new file mode 100644 (file)
index 0000000..2d65d83
--- /dev/null
@@ -0,0 +1,101 @@
+@tool
+extends EditorPlugin
+
+var _current_root: Node
+
+
+## Class setup.
+func _ready() -> void:
+       await _set_root(EditorInterface.get_edited_scene_root())
+       scene_changed.connect(_on_scene_changed.bind())
+       call_deferred("_check_nodes_in_scene")
+
+
+## Called whenever a new node is added to the scene. Calls for a label check.
+func _on_child_entered_tree(node: Node) -> void:
+       if !node.child_entered_tree.is_connected(_on_child_entered_tree.bind()): ##Keeps checking for nested children, looking for labels.
+                       node.child_entered_tree.connect(_on_child_entered_tree.bind())
+       if !node.child_exiting_tree.is_connected(_on_child_exiting_tree.bind()):
+                       node.child_exiting_tree.connect(_on_child_exiting_tree.bind())
+       _check_label(node)
+
+
+## Called when changing scene. Gets the new root and calls for a node scan in the tree.
+func _on_scene_changed(root: Node) -> void:
+       if _current_root != null and is_instance_valid(_current_root):
+               if _current_root.child_entered_tree.is_connected(_on_child_entered_tree.bind()):
+                       _current_root.child_entered_tree.disconnect(_on_child_entered_tree.bind())
+       _current_root = root
+       await _set_root(root)
+       call_deferred("_check_nodes_in_scene")
+
+
+## Gets called whenever any node is deleted, and when user changes scene.
+func _on_child_exiting_tree(node: Node) -> void:
+       if node.child_exiting_tree.is_connected(_on_child_exiting_tree):
+               node.child_exiting_tree.disconnect(_on_child_exiting_tree)
+       if node.child_entered_tree.is_connected(_on_child_entered_tree):
+               node.child_entered_tree.disconnect(_on_child_entered_tree)
+
+
+## Gets called whenever a label is deleted, and whenever user changes scene.
+func _on_label_exiting_tree(label: Node) -> void:
+       if label.tree_exiting.is_connected(_on_label_exiting_tree.bind(label)):
+               label.tree_exiting.disconnect(_on_label_exiting_tree.bind(label))
+       if label.script_changed.is_connected(_on_label_script_changed.bind(label)):
+               label.script_changed.disconnect(_on_label_script_changed.bind(label))
+
+
+## Gets called whenever any label on the scene gets a (new) script or is removed from it.
+## If it finds an autosizer added to the label, it sets the default values automatically (basically the reason of this class).
+func _on_label_script_changed(label: Node):
+       var script: Script = label.get_script()
+       if script == null:
+               return
+       elif script.resource_path.ends_with("label_auto_sizer.gd"):
+               label.set_editor_defaults()
+
+
+## Sets the current scene root and listens for nodes entering in the tree.
+func _set_root(root: Node) -> void:
+       _current_root = root
+       if _current_root == null:
+               await _check_root()
+       if !_current_root.child_entered_tree.is_connected(_on_child_entered_tree.bind()):
+                       _current_root.child_entered_tree.connect(_on_child_entered_tree.bind())
+
+
+## If no root is found (all scenes are closed) it keeps checking until one is opened.
+func _check_root() -> void:
+       while _current_root == null:
+               await get_tree().process_frame
+               _current_root = EditorInterface.get_edited_scene_root()
+
+
+## Goes through every node in the scene, children included. Calls for a label check.
+## get_children(true) is not returning nested children so it needs to be done manually.
+func _check_nodes_in_scene() -> void:
+       var nodes_to_check: Array[Node] = []
+       nodes_to_check.append(_current_root)
+       while nodes_to_check.size() > 0:
+               var current_node: Node = nodes_to_check.pop_front()
+               if !current_node.child_entered_tree.is_connected(_on_child_entered_tree.bind()):
+                       current_node.child_entered_tree.connect(_on_child_entered_tree.bind())
+               if !current_node.child_exiting_tree.is_connected(_on_child_exiting_tree.bind()):
+                       current_node.child_exiting_tree.connect(_on_child_exiting_tree.bind())
+               _check_label(current_node)
+               if current_node.get_child_count() > 0:
+                       for child_node in current_node.get_children():
+                               nodes_to_check.append(child_node)
+
+
+## Checks if the node is a label, starts listening for its attatched script.
+## If the node has the script already attached, it sets the defaults directly.
+func _check_label(node: Node) -> void:
+       if node is Label or node is RichTextLabel:
+               if !node.tree_exiting.is_connected(_on_label_exiting_tree.bind(node)):
+                       node.tree_exiting.connect(_on_label_exiting_tree.bind(node))
+               if !node.script_changed.is_connected(_on_label_script_changed.bind(node)):
+                       node.script_changed.connect(_on_label_script_changed.bind(node))
+               if node is LabelAutoSizer or node is RichLabelAutoSizer:
+                       node.set_editor_defaults()
diff --git a/addons/label_font_auto_sizer/rich_label_auto_sizer.gd b/addons/label_font_auto_sizer/rich_label_auto_sizer.gd
new file mode 100644 (file)
index 0000000..cb482a6
--- /dev/null
@@ -0,0 +1,218 @@
+@tool
+@icon ("res://addons/label_font_auto_sizer/icon.svg")
+extends RichTextLabel
+class_name RichLabelAutoSizer
+
+#region External variables
+@export_group("Size values")
+## The number of times the auto sizer will shrink the font to try to fit the text into the control rect.
+@export_range(1,100) var _max_steps: int = 4:
+       set(value):
+               _max_steps = value
+               if is_node_ready(): ## This setter gets called when the label enters the tree in the editor, before it's ready, which might not be desirable when using auto translate.
+                       call_deferred("_check_line_count") 
+## The size value in pixels that the auto sizer will shrink the font during each step.
+@export_range(1,100) var _size_per_step: int = 2:
+       set(value):
+               _size_per_step = value
+               if is_node_ready(): ## This setter gets called when the label enters the tree in the editor, before it's ready, which might not be desirable when using auto translate.
+                       call_deferred("_check_line_count")
+@export_group("")
+@export_group("Debug settings")
+## Set this to true if you want to debug the steps happening in the class. The calls are commented so you need to decomment them.
+@export var _print_debug_enabled: bool = false
+@export_group("")
+#endregion
+
+#region --Internal variables--
+var _base_font_size: int
+var _current_font_size: int
+var _last_size_state: LABEL_SIZE_STATE = LABEL_SIZE_STATE.IDLE
+var _size_just_modified_by_autosizer: bool = false
+var _label_settings_just_duplicated: bool = false
+var _set_defaults: bool = false
+
+enum LABEL_SIZE_STATE {JUST_SHRUNK, IDLE, JUST_ENLARGED} 
+#endregion
+
+
+
+#region --Signal funcs--
+## Gets called in-editor and in-game. Sets some default values if necessary.
+func _ready() -> void:
+       if !_set_defaults:
+               set_editor_defaults()
+       #else:
+               #_print_debug_message(str(name) + " Base font size: " + str(_base_font_size) + "px.")
+       if Engine.is_editor_hint():
+               call_deferred("_connect_signals")
+       else:
+               _check_line_count()
+       LabelFontAutoSizeManager.register_label(self)
+
+
+## Gets called when there are changes in either the Theme or Label Settings resources.
+## Checks if the change was made by the script of by the user and if not, sets the base font size value.
+func _on_font_resource_changed() -> void:
+       #_print_debug_message(str(name) + "' Font resource changed.")
+       if _size_just_modified_by_autosizer:
+               _size_just_modified_by_autosizer = false ## Early return because the change wasn't made by the user.
+       else:
+               call_deferred("_set_base_font_size")
+
+
+## Gets called whenever the size of the control rect is modified (in editor). Calls the line count check.
+func _on_label_rect_resized() -> void:
+       if !_set_defaults:
+               return
+       call_deferred("_check_line_count")
+
+
+## Called by autosize manager whenever the locale_chaged() method is called, as the tr() object changes don't trigger
+## the set_text() method of the label, thus the size and line_amount doesn't get checked.
+func _on_locale_changed() -> void:
+       call_deferred("_check_line_count")
+
+
+## Gets called on scene changes and when the label is freed and erases itself from the autosize manager.
+func _exit_tree() -> void:
+       LabelFontAutoSizeManager.erase_label(self)
+#endregion
+
+#region --Private funcs--
+##Only in-editor, keeps stuff in check while manually changing font resources and resizing the label.
+func _connect_signals() -> void:
+       if !theme_changed.is_connected(_on_font_resource_changed):
+               theme_changed.connect(_on_font_resource_changed)
+       if !resized.is_connected(_on_label_rect_resized):
+               resized.connect(_on_label_rect_resized)
+
+
+## Text can be changed via either: set_text(value), or _my_label.text = value. Both will trigger a line check.
+##**If you're doing some testing/developing, if you are changing the text from withit one of the label classes themselves, do it like self.set_text(value) or self.text = value, othersise it doesn't trigger a size check.
+##In a real scenario you wouldn't be changing the text from within the class itself though.**
+func _set(property: StringName, value: Variant) -> bool:
+       match property:
+               "text":
+                       text = value
+                       call_deferred("_check_line_count")
+                       return true
+               _:
+                       return false
+
+
+## Goes through the resources in the label and sets the base font size value.
+## Priority: Override Theme Font Size > Theme Font Size. (RichTextLabels don't allow Label Settings)
+func _set_base_font_size() -> void:
+       if get("theme_override_font_sizes/normal_font_size") != null:
+               _base_font_size = get("theme_override_font_sizes/normal_font_size")
+       elif get_theme_font_size("normal_font_size") != null:
+               _base_font_size = get_theme_font_size("normal_font_size")
+       _current_font_size = _base_font_size
+       #_print_debug_message(str(name) + " Base font size: " + str(_base_font_size) + "px.")
+
+
+## Makes variables persistent without exposing them in the editor.
+## Will get removed in Godot 4.3 with the upcoming @export_storage annotation.
+func _get_property_list():
+       var properties: Array = []
+       var bool_properties: Array[String] = ["_size_just_modified_by_autosizer","_set_defaults"]
+       for name in bool_properties:
+               properties.append({
+                       "name": name,
+                       "type": TYPE_BOOL,
+                       "usage": PROPERTY_USAGE_STORAGE,
+               })
+       var int_properties: Array[String] = ["_base_font_size", "_current_font_size", "_last_size_state"]
+       for name in int_properties:
+               properties.append({
+                       "name": name,
+                       "type": TYPE_INT,
+                       "usage": PROPERTY_USAGE_STORAGE,
+               })
+       return properties
+
+
+## Checks the current font size and amount of lines in the text against the visible lines inside the rect.
+## Calls for the shrink or enlarge methods accordingly.
+func _check_line_count() -> void:
+       #_print_debug_message("Checking lines of " + str(name))
+       if get_content_height() > size.y or get_content_width() > size.x:
+               if _current_font_size > max(_base_font_size - (_size_per_step * _max_steps), 1):
+                       _shrink_font()
+                       return
+       elif get_content_height() <= size.y or get_content_width() <= size.x:
+               if _current_font_size < _base_font_size:
+                       _enlarge_font()
+                       return
+       _last_size_state = LABEL_SIZE_STATE.IDLE
+
+
+## Makes the font size smaller. Rechecks or stops the cycle depending on the conditions.
+func _shrink_font():
+       #_print_debug_message(str(name) + "' shrink method called")
+       _override_font_size(_current_font_size - _size_per_step)
+       #_print_debug_message(str(name) + " shrunk " + str(_size_per_step) + "px.")
+       if _last_size_state == LABEL_SIZE_STATE.JUST_ENLARGED: ## To stop infinite cycles.
+               _last_size_state = LABEL_SIZE_STATE.IDLE
+               #_print_debug_message(str(name) + " finished shrinking. Was just enlarged.")
+       else:
+               _last_size_state = LABEL_SIZE_STATE.JUST_SHRUNK
+               _check_line_count()
+
+
+## Makes the font size larger. Rechecks/Shrinks/stops the cycle depending on the conditions.
+func _enlarge_font():
+       #_print_debug_message(str(name) + "' enlarge method called")
+       _override_font_size(_current_font_size + _size_per_step)
+       if _last_size_state == LABEL_SIZE_STATE.JUST_SHRUNK:
+               if  get_content_height() > size.y:
+                       _last_size_state = LABEL_SIZE_STATE.JUST_ENLARGED
+                       _shrink_font()
+               else: ## To stop infinite cycles.
+                       #_print_debug_message(str(name) + " finished enlarging. Was just shrunk.")
+                       _last_size_state = LABEL_SIZE_STATE.IDLE
+       else:
+               _last_size_state = LABEL_SIZE_STATE.JUST_ENLARGED
+               _check_line_count()
+
+
+## Applies the new font size.
+func _override_font_size(new_size: int) -> void:
+       _size_just_modified_by_autosizer = true
+       set("theme_override_font_sizes/normal_font_size", new_size)
+       _current_font_size = new_size
+
+
+## Prints message on console, for debugging was used while developing. You can decomment all the calls to debug.
+func _print_debug_message(message: String) -> void:
+       if _print_debug_enabled:
+               print(message)
+#endregion
+
+
+#region --Public funcs--
+## Gets called in-editor and sets the default values.
+func set_editor_defaults() -> void:
+       _set_defaults =  true
+       clip_contents = true
+       fit_content = false
+       scroll_active = false
+       autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
+       call_deferred("_set_base_font_size")
+       call_deferred("_set_current_font_size_to_base")
+       call_deferred("_connect_signals")
+
+## For some reason using set_deferred() wasn't doing it after setting the base size, so this gets called deferred.
+func _set_current_font_size_to_base() -> void:
+       _current_font_size = _base_font_size
+
+
+## Text can be changed via either: set_text(value), or _my_label.text = value. Both will trigger a line check.
+##**If you're doing some testing/developing, if you are changing the text from withit one of the label classes themselves, do it like self.set_text(value) or self.text = value, othersise it doesn't trigger a size check.
+##In a real scenario you wouldn't be changing the text from within the class itself though.**
+func set_text(new_text: String) -> void:
+       text = new_text
+       call_deferred("_check_line_count")
+#endregion
+
diff --git a/addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png b/addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png
new file mode 100644 (file)
index 0000000..3082789
Binary files /dev/null and b/addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png differ
diff --git a/addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png.import b/addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png.import
new file mode 100644 (file)
index 0000000..ad3a214
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://censw3w53gldn"
+path="res://.godot/imported/PhantomCameraBtnPrimaryDefault.png-fcf3696b583a82b1078609a5bfd648f5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png"
+dest_files=["res://.godot/imported/PhantomCameraBtnPrimaryDefault.png-fcf3696b583a82b1078609a5bfd648f5.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png b/addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png
new file mode 100644 (file)
index 0000000..1e0c31a
Binary files /dev/null and b/addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png differ
diff --git a/addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png.import b/addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png.import
new file mode 100644 (file)
index 0000000..dd6f1a4
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://pvr8mbvl1onm"
+path="res://.godot/imported/PhantomCameraBtnPrimaryHover.png-3d2e4d225f6a86ce8a9c981ee7926a16.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png"
+dest_files=["res://.godot/imported/PhantomCameraBtnPrimaryHover.png-3d2e4d225f6a86ce8a9c981ee7926a16.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/addons/phantom_camera/examples/credits.txt b/addons/phantom_camera/examples/credits.txt
new file mode 100644 (file)
index 0000000..d5e949a
--- /dev/null
@@ -0,0 +1,7 @@
+#####################
+EXAMPLE ASSET CREDITS
+#####################
+
+# level_spritesheet
+https://opengameart.org/content/a-platformer-in-the-forest
+https://opengameart.org/users/buch
diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_example_scene.tscn
new file mode 100644 (file)
index 0000000..5234e31
--- /dev/null
@@ -0,0 +1,641 @@
+[gd_scene load_steps=12 format=3 uid="uid://ohwjxojqcj63"]
+
+[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_foq54"]
+[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_kmt5y"]
+[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/ui_sign.tscn" id="3_1cmgi"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="4_4dx73"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="5_w68mw"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="6_i3g4f"]
+[ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_2d_tween.tres" id="7_j2i8l"]
+[ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="8_ytjsp"]
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="9_o4c4h"]
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"]
+texture = ExtResource("1_foq54")
+0:0/0 = 0
+0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_0/angular_velocity = 0.0
+0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_1/angular_velocity = 0.0
+1:0/0 = 0
+1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_0/angular_velocity = 0.0
+1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_1/angular_velocity = 0.0
+2:0/0 = 0
+2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_0/angular_velocity = 0.0
+2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_1/angular_velocity = 0.0
+3:0/0 = 0
+3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_0/angular_velocity = 0.0
+3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_1/angular_velocity = 0.0
+4:0/0 = 0
+4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_0/angular_velocity = 0.0
+4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_1/angular_velocity = 0.0
+5:0/0 = 0
+5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_0/angular_velocity = 0.0
+5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_1/angular_velocity = 0.0
+6:0/0 = 0
+6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_0/angular_velocity = 0.0
+6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_1/angular_velocity = 0.0
+7:0/0 = 0
+7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_0/angular_velocity = 0.0
+7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_1/angular_velocity = 0.0
+0:1/0 = 0
+0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_0/angular_velocity = 0.0
+0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_1/angular_velocity = 0.0
+1:1/0 = 0
+1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_0/angular_velocity = 0.0
+1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_1/angular_velocity = 0.0
+2:1/0 = 0
+2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_0/angular_velocity = 0.0
+2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_1/angular_velocity = 0.0
+3:1/0 = 0
+3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_0/angular_velocity = 0.0
+3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_1/angular_velocity = 0.0
+4:1/0 = 0
+4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_0/angular_velocity = 0.0
+4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_1/angular_velocity = 0.0
+5:1/0 = 0
+5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_0/angular_velocity = 0.0
+5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_1/angular_velocity = 0.0
+7:1/0 = 0
+7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_0/angular_velocity = 0.0
+7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_1/angular_velocity = 0.0
+2:2/0 = 0
+2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_0/angular_velocity = 0.0
+2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_1/angular_velocity = 0.0
+3:2/0 = 0
+3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_0/angular_velocity = 0.0
+3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_1/angular_velocity = 0.0
+4:2/0 = 0
+4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_0/angular_velocity = 0.0
+4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_1/angular_velocity = 0.0
+7:2/0 = 0
+7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_0/angular_velocity = 0.0
+7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_1/angular_velocity = 0.0
+3:3/0 = 0
+3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_0/angular_velocity = 0.0
+3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_1/angular_velocity = 0.0
+4:3/0 = 0
+4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_0/angular_velocity = 0.0
+4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_1/angular_velocity = 0.0
+5:3/0 = 0
+5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_0/angular_velocity = 0.0
+5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_1/angular_velocity = 0.0
+7:3/0 = 0
+7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_0/angular_velocity = 0.0
+7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_1/angular_velocity = 0.0
+3:4/0 = 0
+3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_0/angular_velocity = 0.0
+3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_1/angular_velocity = 0.0
+4:4/0 = 0
+4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_0/angular_velocity = 0.0
+4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_1/angular_velocity = 0.0
+5:4/0 = 0
+5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_0/angular_velocity = 0.0
+5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_1/angular_velocity = 0.0
+7:4/0 = 0
+7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_0/angular_velocity = 0.0
+7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_1/angular_velocity = 0.0
+3:5/0 = 0
+3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_0/angular_velocity = 0.0
+3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_1/angular_velocity = 0.0
+4:5/0 = 0
+4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_0/angular_velocity = 0.0
+4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_1/angular_velocity = 0.0
+7:5/0 = 0
+7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_0/angular_velocity = 0.0
+7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_1/angular_velocity = 0.0
+3:6/0 = 0
+3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_0/angular_velocity = 0.0
+3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_1/angular_velocity = 0.0
+4:6/0 = 0
+4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_0/angular_velocity = 0.0
+4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_1/angular_velocity = 0.0
+7:6/0 = 0
+7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_0/angular_velocity = 0.0
+7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_1/angular_velocity = 0.0
+2:7/0 = 0
+2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_0/angular_velocity = 0.0
+2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_1/angular_velocity = 0.0
+3:7/0 = 0
+3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_0/angular_velocity = 0.0
+3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_1/angular_velocity = 0.0
+4:7/0 = 0
+4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_0/angular_velocity = 0.0
+4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_1/angular_velocity = 0.0
+5:7/0 = 0
+5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_0/angular_velocity = 0.0
+5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_1/angular_velocity = 0.0
+8:0/0 = 0
+8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_0/angular_velocity = 0.0
+8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_1/angular_velocity = 0.0
+9:0/0 = 0
+9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_0/angular_velocity = 0.0
+9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_1/angular_velocity = 0.0
+10:0/0 = 0
+10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_0/angular_velocity = 0.0
+10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_1/angular_velocity = 0.0
+11:0/0 = 0
+11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_0/angular_velocity = 0.0
+11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_1/angular_velocity = 0.0
+12:0/0 = 0
+12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_0/angular_velocity = 0.0
+12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_1/angular_velocity = 0.0
+13:0/0 = 0
+13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_0/angular_velocity = 0.0
+13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0 = 0
+14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_0/angular_velocity = 0.0
+14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8)
+14:0/0/custom_data_0 = &"Sign"
+15:0/0 = 0
+15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_0/angular_velocity = 0.0
+15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_1/angular_velocity = 0.0
+16:0/0 = 0
+16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_0/angular_velocity = 0.0
+16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_1/angular_velocity = 0.0
+8:1/0 = 0
+8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_0/angular_velocity = 0.0
+8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_1/angular_velocity = 0.0
+9:1/0 = 0
+9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_0/angular_velocity = 0.0
+9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_1/angular_velocity = 0.0
+10:1/0 = 0
+10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_0/angular_velocity = 0.0
+10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_1/angular_velocity = 0.0
+11:1/0 = 0
+11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_0/angular_velocity = 0.0
+11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_1/angular_velocity = 0.0
+12:1/0 = 0
+12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_0/angular_velocity = 0.0
+12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_1/angular_velocity = 0.0
+13:1/0 = 0
+13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_0/angular_velocity = 0.0
+13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_1/angular_velocity = 0.0
+14:1/0 = 0
+14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_0/angular_velocity = 0.0
+14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_1/angular_velocity = 0.0
+15:1/0 = 0
+15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_0/angular_velocity = 0.0
+15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_1/angular_velocity = 0.0
+16:1/0 = 0
+16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_0/angular_velocity = 0.0
+16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_1/angular_velocity = 0.0
+8:2/0 = 0
+8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_0/angular_velocity = 0.0
+8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_1/angular_velocity = 0.0
+9:2/0 = 0
+9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_0/angular_velocity = 0.0
+9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_1/angular_velocity = 0.0
+10:2/0 = 0
+10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_0/angular_velocity = 0.0
+10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_1/angular_velocity = 0.0
+11:2/0 = 0
+11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_0/angular_velocity = 0.0
+11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_1/angular_velocity = 0.0
+12:2/0 = 0
+12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_0/angular_velocity = 0.0
+12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_1/angular_velocity = 0.0
+13:2/0 = 0
+13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_0/angular_velocity = 0.0
+13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_1/angular_velocity = 0.0
+14:2/0 = 0
+14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_0/angular_velocity = 0.0
+14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_1/angular_velocity = 0.0
+15:2/0 = 0
+15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_0/angular_velocity = 0.0
+15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_1/angular_velocity = 0.0
+16:2/0 = 0
+16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_0/angular_velocity = 0.0
+16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_1/angular_velocity = 0.0
+8:3/0 = 0
+8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_0/angular_velocity = 0.0
+8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_1/angular_velocity = 0.0
+9:3/0 = 0
+9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_0/angular_velocity = 0.0
+9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_1/angular_velocity = 0.0
+10:3/0 = 0
+10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_0/angular_velocity = 0.0
+10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_1/angular_velocity = 0.0
+11:3/0 = 0
+11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_0/angular_velocity = 0.0
+11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_1/angular_velocity = 0.0
+12:3/0 = 0
+12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_0/angular_velocity = 0.0
+12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_1/angular_velocity = 0.0
+13:3/0 = 0
+13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_0/angular_velocity = 0.0
+13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_1/angular_velocity = 0.0
+14:3/0 = 0
+14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_0/angular_velocity = 0.0
+14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_1/angular_velocity = 0.0
+15:3/0 = 0
+15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_0/angular_velocity = 0.0
+15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_1/angular_velocity = 0.0
+16:3/0 = 0
+16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_0/angular_velocity = 0.0
+16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_1/angular_velocity = 0.0
+8:4/0 = 0
+8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_0/angular_velocity = 0.0
+8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_1/angular_velocity = 0.0
+9:4/0 = 0
+9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_0/angular_velocity = 0.0
+9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_1/angular_velocity = 0.0
+10:4/0 = 0
+10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_0/angular_velocity = 0.0
+10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_1/angular_velocity = 0.0
+11:4/0 = 0
+11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_0/angular_velocity = 0.0
+11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8)
+11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_1/angular_velocity = 0.0
+12:4/0 = 0
+12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_0/angular_velocity = 0.0
+12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_1/angular_velocity = 0.0
+13:4/0 = 0
+13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_0/angular_velocity = 0.0
+13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8)
+13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0 = 0
+14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_0/angular_velocity = 0.0
+14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
+14:4/0/custom_data_0 = &"Inventory"
+15:4/0 = 0
+15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_0/angular_velocity = 0.0
+15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_1/angular_velocity = 0.0
+16:4/0 = 0
+16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_0/angular_velocity = 0.0
+16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_1/angular_velocity = 0.0
+8:5/0 = 0
+8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_0/angular_velocity = 0.0
+8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_1/angular_velocity = 0.0
+9:5/0 = 0
+9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_0/angular_velocity = 0.0
+9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_1/angular_velocity = 0.0
+10:5/0 = 0
+10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_0/angular_velocity = 0.0
+10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_1/angular_velocity = 0.0
+11:5/0 = 0
+11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_0/angular_velocity = 0.0
+11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_1/angular_velocity = 0.0
+12:5/0 = 0
+12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_0/angular_velocity = 0.0
+12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_1/angular_velocity = 0.0
+13:5/0 = 0
+13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_0/angular_velocity = 0.0
+13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_1/angular_velocity = 0.0
+14:5/0 = 0
+14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_0/angular_velocity = 0.0
+14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_1/angular_velocity = 0.0
+15:5/0 = 0
+15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_0/angular_velocity = 0.0
+15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_1/angular_velocity = 0.0
+16:5/0 = 0
+16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_0/angular_velocity = 0.0
+16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_1/angular_velocity = 0.0
+8:6/0 = 0
+8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_0/angular_velocity = 0.0
+8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_1/angular_velocity = 0.0
+9:6/0 = 0
+9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_0/angular_velocity = 0.0
+9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_1/angular_velocity = 0.0
+10:6/0 = 0
+10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_0/angular_velocity = 0.0
+10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_1/angular_velocity = 0.0
+11:6/0 = 0
+11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_0/angular_velocity = 0.0
+11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5)
+11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_1/angular_velocity = 0.0
+12:6/0 = 0
+12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_0/angular_velocity = 0.0
+12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_1/angular_velocity = 0.0
+13:6/0 = 0
+13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_0/angular_velocity = 0.0
+13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8)
+13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_1/angular_velocity = 0.0
+14:6/0 = 0
+14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_0/angular_velocity = 0.0
+14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_1/angular_velocity = 0.0
+15:6/0 = 0
+15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_0/angular_velocity = 0.0
+15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_1/angular_velocity = 0.0
+16:6/0 = 0
+16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_0/angular_velocity = 0.0
+16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_1/angular_velocity = 0.0
+
+[sub_resource type="TileSet" id="TileSet_kf7eg"]
+physics_layer_0/collision_layer = 1
+physics_layer_1/collision_layer = 2
+physics_layer_1/collision_mask = 2
+custom_data_layer_0/name = "Type"
+custom_data_layer_0/type = 21
+sources/0 = SubResource("TileSetAtlasSource_easgx")
+
+[node name="ExampleScene2D2" type="Node2D"]
+
+[node name="Background" type="CanvasLayer" parent="."]
+layer = -3
+
+[node name="ColorRect" type="ColorRect" parent="Background"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -311.0
+offset_top = -173.0
+offset_right = 981.0
+offset_bottom = 548.0
+grow_horizontal = 2
+grow_vertical = 2
+auto_translate = false
+localize_numeral_system = false
+color = Color(0.137255, 0.14902, 0.196078, 1)
+
+[node name="TileMap" type="TileMap" parent="."]
+z_index = -1
+scale = Vector2(3, 3)
+tile_set = SubResource("TileSet_kf7eg")
+format = 2
+layer_0/name = "Background"
+layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3)
+layer_1/name = "Terrain"
+layer_1/z_index = 1
+layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6)
+
+[node name="UI" type="CanvasLayer" parent="."]
+
+[node name="UIInventory" parent="UI" instance=ExtResource("2_kmt5y")]
+unique_name_in_owner = true
+visible = false
+
+[node name="UISign" parent="UI" instance=ExtResource("3_1cmgi")]
+unique_name_in_owner = true
+visible = false
+
+[node name="Controls" type="Label" parent="."]
+offset_left = 167.0
+offset_top = -145.0
+offset_right = 332.0
+offset_bottom = -81.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("4_4dx73")
+text = "[WASD] to move
+[Space] to jump"
+
+[node name="Camera2D" type="Camera2D" parent="."]
+position = Vector2(227, -28)
+zoom = Vector2(1.5, 1.5)
+editor_draw_limits = true
+
+[node name="PhantomCameraHost" type="Node" parent="Camera2D"]
+script = ExtResource("5_w68mw")
+
+[node name="Player" type="Node" parent="."]
+
+[node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")]
+unique_name_in_owner = true
+process_priority = -1
+position = Vector2(227, -28)
+script = ExtResource("6_i3g4f")
+priority = 10
+follow_mode = 2
+follow_target = NodePath("../CharacterBody2D")
+zoom = Vector2(1.5, 1.5)
+frame_preview = false
+tween_resource = ExtResource("7_j2i8l")
+tween_on_load = false
+follow_damping = true
+draw_limits = true
+
+[node name="CharacterBody2D" parent="Player" instance=ExtResource("8_ytjsp")]
+position = Vector2(227, -28)
+script = ExtResource("9_o4c4h")
diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_framed_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_framed_example_scene.tscn
new file mode 100644 (file)
index 0000000..df284df
--- /dev/null
@@ -0,0 +1,641 @@
+[gd_scene load_steps=12 format=3 uid="uid://dg1tuoxd3b4tw"]
+
+[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_nf5bo"]
+[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_5oggv"]
+[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/ui_sign.tscn" id="3_aku7q"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="4_j3ux0"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="5_uwr6r"]
+[ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_2d_tween.tres" id="6_4l0c3"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="7_briql"]
+[ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="8_i4m1d"]
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="9_m3lnd"]
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"]
+texture = ExtResource("1_nf5bo")
+0:0/0 = 0
+0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_0/angular_velocity = 0.0
+0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_1/angular_velocity = 0.0
+1:0/0 = 0
+1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_0/angular_velocity = 0.0
+1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_1/angular_velocity = 0.0
+2:0/0 = 0
+2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_0/angular_velocity = 0.0
+2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_1/angular_velocity = 0.0
+3:0/0 = 0
+3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_0/angular_velocity = 0.0
+3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_1/angular_velocity = 0.0
+4:0/0 = 0
+4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_0/angular_velocity = 0.0
+4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_1/angular_velocity = 0.0
+5:0/0 = 0
+5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_0/angular_velocity = 0.0
+5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_1/angular_velocity = 0.0
+6:0/0 = 0
+6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_0/angular_velocity = 0.0
+6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_1/angular_velocity = 0.0
+7:0/0 = 0
+7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_0/angular_velocity = 0.0
+7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_1/angular_velocity = 0.0
+0:1/0 = 0
+0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_0/angular_velocity = 0.0
+0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_1/angular_velocity = 0.0
+1:1/0 = 0
+1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_0/angular_velocity = 0.0
+1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_1/angular_velocity = 0.0
+2:1/0 = 0
+2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_0/angular_velocity = 0.0
+2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_1/angular_velocity = 0.0
+3:1/0 = 0
+3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_0/angular_velocity = 0.0
+3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_1/angular_velocity = 0.0
+4:1/0 = 0
+4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_0/angular_velocity = 0.0
+4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_1/angular_velocity = 0.0
+5:1/0 = 0
+5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_0/angular_velocity = 0.0
+5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_1/angular_velocity = 0.0
+7:1/0 = 0
+7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_0/angular_velocity = 0.0
+7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_1/angular_velocity = 0.0
+2:2/0 = 0
+2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_0/angular_velocity = 0.0
+2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_1/angular_velocity = 0.0
+3:2/0 = 0
+3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_0/angular_velocity = 0.0
+3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_1/angular_velocity = 0.0
+4:2/0 = 0
+4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_0/angular_velocity = 0.0
+4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_1/angular_velocity = 0.0
+7:2/0 = 0
+7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_0/angular_velocity = 0.0
+7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_1/angular_velocity = 0.0
+3:3/0 = 0
+3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_0/angular_velocity = 0.0
+3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_1/angular_velocity = 0.0
+4:3/0 = 0
+4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_0/angular_velocity = 0.0
+4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_1/angular_velocity = 0.0
+5:3/0 = 0
+5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_0/angular_velocity = 0.0
+5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_1/angular_velocity = 0.0
+7:3/0 = 0
+7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_0/angular_velocity = 0.0
+7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_1/angular_velocity = 0.0
+3:4/0 = 0
+3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_0/angular_velocity = 0.0
+3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_1/angular_velocity = 0.0
+4:4/0 = 0
+4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_0/angular_velocity = 0.0
+4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_1/angular_velocity = 0.0
+5:4/0 = 0
+5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_0/angular_velocity = 0.0
+5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_1/angular_velocity = 0.0
+7:4/0 = 0
+7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_0/angular_velocity = 0.0
+7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_1/angular_velocity = 0.0
+3:5/0 = 0
+3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_0/angular_velocity = 0.0
+3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_1/angular_velocity = 0.0
+4:5/0 = 0
+4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_0/angular_velocity = 0.0
+4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_1/angular_velocity = 0.0
+7:5/0 = 0
+7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_0/angular_velocity = 0.0
+7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_1/angular_velocity = 0.0
+3:6/0 = 0
+3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_0/angular_velocity = 0.0
+3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_1/angular_velocity = 0.0
+4:6/0 = 0
+4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_0/angular_velocity = 0.0
+4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_1/angular_velocity = 0.0
+7:6/0 = 0
+7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_0/angular_velocity = 0.0
+7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_1/angular_velocity = 0.0
+2:7/0 = 0
+2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_0/angular_velocity = 0.0
+2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_1/angular_velocity = 0.0
+3:7/0 = 0
+3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_0/angular_velocity = 0.0
+3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_1/angular_velocity = 0.0
+4:7/0 = 0
+4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_0/angular_velocity = 0.0
+4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_1/angular_velocity = 0.0
+5:7/0 = 0
+5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_0/angular_velocity = 0.0
+5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_1/angular_velocity = 0.0
+8:0/0 = 0
+8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_0/angular_velocity = 0.0
+8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_1/angular_velocity = 0.0
+9:0/0 = 0
+9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_0/angular_velocity = 0.0
+9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_1/angular_velocity = 0.0
+10:0/0 = 0
+10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_0/angular_velocity = 0.0
+10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_1/angular_velocity = 0.0
+11:0/0 = 0
+11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_0/angular_velocity = 0.0
+11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_1/angular_velocity = 0.0
+12:0/0 = 0
+12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_0/angular_velocity = 0.0
+12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_1/angular_velocity = 0.0
+13:0/0 = 0
+13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_0/angular_velocity = 0.0
+13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0 = 0
+14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_0/angular_velocity = 0.0
+14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8)
+14:0/0/custom_data_0 = &"Sign"
+15:0/0 = 0
+15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_0/angular_velocity = 0.0
+15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_1/angular_velocity = 0.0
+16:0/0 = 0
+16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_0/angular_velocity = 0.0
+16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_1/angular_velocity = 0.0
+8:1/0 = 0
+8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_0/angular_velocity = 0.0
+8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_1/angular_velocity = 0.0
+9:1/0 = 0
+9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_0/angular_velocity = 0.0
+9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_1/angular_velocity = 0.0
+10:1/0 = 0
+10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_0/angular_velocity = 0.0
+10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_1/angular_velocity = 0.0
+11:1/0 = 0
+11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_0/angular_velocity = 0.0
+11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_1/angular_velocity = 0.0
+12:1/0 = 0
+12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_0/angular_velocity = 0.0
+12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_1/angular_velocity = 0.0
+13:1/0 = 0
+13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_0/angular_velocity = 0.0
+13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_1/angular_velocity = 0.0
+14:1/0 = 0
+14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_0/angular_velocity = 0.0
+14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_1/angular_velocity = 0.0
+15:1/0 = 0
+15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_0/angular_velocity = 0.0
+15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_1/angular_velocity = 0.0
+16:1/0 = 0
+16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_0/angular_velocity = 0.0
+16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_1/angular_velocity = 0.0
+8:2/0 = 0
+8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_0/angular_velocity = 0.0
+8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_1/angular_velocity = 0.0
+9:2/0 = 0
+9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_0/angular_velocity = 0.0
+9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_1/angular_velocity = 0.0
+10:2/0 = 0
+10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_0/angular_velocity = 0.0
+10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_1/angular_velocity = 0.0
+11:2/0 = 0
+11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_0/angular_velocity = 0.0
+11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_1/angular_velocity = 0.0
+12:2/0 = 0
+12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_0/angular_velocity = 0.0
+12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_1/angular_velocity = 0.0
+13:2/0 = 0
+13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_0/angular_velocity = 0.0
+13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_1/angular_velocity = 0.0
+14:2/0 = 0
+14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_0/angular_velocity = 0.0
+14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_1/angular_velocity = 0.0
+15:2/0 = 0
+15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_0/angular_velocity = 0.0
+15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_1/angular_velocity = 0.0
+16:2/0 = 0
+16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_0/angular_velocity = 0.0
+16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_1/angular_velocity = 0.0
+8:3/0 = 0
+8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_0/angular_velocity = 0.0
+8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_1/angular_velocity = 0.0
+9:3/0 = 0
+9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_0/angular_velocity = 0.0
+9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_1/angular_velocity = 0.0
+10:3/0 = 0
+10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_0/angular_velocity = 0.0
+10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_1/angular_velocity = 0.0
+11:3/0 = 0
+11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_0/angular_velocity = 0.0
+11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_1/angular_velocity = 0.0
+12:3/0 = 0
+12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_0/angular_velocity = 0.0
+12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_1/angular_velocity = 0.0
+13:3/0 = 0
+13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_0/angular_velocity = 0.0
+13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_1/angular_velocity = 0.0
+14:3/0 = 0
+14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_0/angular_velocity = 0.0
+14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_1/angular_velocity = 0.0
+15:3/0 = 0
+15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_0/angular_velocity = 0.0
+15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_1/angular_velocity = 0.0
+16:3/0 = 0
+16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_0/angular_velocity = 0.0
+16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_1/angular_velocity = 0.0
+8:4/0 = 0
+8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_0/angular_velocity = 0.0
+8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_1/angular_velocity = 0.0
+9:4/0 = 0
+9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_0/angular_velocity = 0.0
+9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_1/angular_velocity = 0.0
+10:4/0 = 0
+10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_0/angular_velocity = 0.0
+10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_1/angular_velocity = 0.0
+11:4/0 = 0
+11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_0/angular_velocity = 0.0
+11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8)
+11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_1/angular_velocity = 0.0
+12:4/0 = 0
+12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_0/angular_velocity = 0.0
+12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_1/angular_velocity = 0.0
+13:4/0 = 0
+13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_0/angular_velocity = 0.0
+13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8)
+13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0 = 0
+14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_0/angular_velocity = 0.0
+14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
+14:4/0/custom_data_0 = &"Inventory"
+15:4/0 = 0
+15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_0/angular_velocity = 0.0
+15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_1/angular_velocity = 0.0
+16:4/0 = 0
+16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_0/angular_velocity = 0.0
+16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_1/angular_velocity = 0.0
+8:5/0 = 0
+8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_0/angular_velocity = 0.0
+8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_1/angular_velocity = 0.0
+9:5/0 = 0
+9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_0/angular_velocity = 0.0
+9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_1/angular_velocity = 0.0
+10:5/0 = 0
+10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_0/angular_velocity = 0.0
+10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_1/angular_velocity = 0.0
+11:5/0 = 0
+11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_0/angular_velocity = 0.0
+11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_1/angular_velocity = 0.0
+12:5/0 = 0
+12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_0/angular_velocity = 0.0
+12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_1/angular_velocity = 0.0
+13:5/0 = 0
+13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_0/angular_velocity = 0.0
+13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_1/angular_velocity = 0.0
+14:5/0 = 0
+14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_0/angular_velocity = 0.0
+14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_1/angular_velocity = 0.0
+15:5/0 = 0
+15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_0/angular_velocity = 0.0
+15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_1/angular_velocity = 0.0
+16:5/0 = 0
+16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_0/angular_velocity = 0.0
+16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_1/angular_velocity = 0.0
+8:6/0 = 0
+8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_0/angular_velocity = 0.0
+8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_1/angular_velocity = 0.0
+9:6/0 = 0
+9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_0/angular_velocity = 0.0
+9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_1/angular_velocity = 0.0
+10:6/0 = 0
+10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_0/angular_velocity = 0.0
+10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_1/angular_velocity = 0.0
+11:6/0 = 0
+11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_0/angular_velocity = 0.0
+11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5)
+11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_1/angular_velocity = 0.0
+12:6/0 = 0
+12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_0/angular_velocity = 0.0
+12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_1/angular_velocity = 0.0
+13:6/0 = 0
+13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_0/angular_velocity = 0.0
+13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8)
+13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_1/angular_velocity = 0.0
+14:6/0 = 0
+14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_0/angular_velocity = 0.0
+14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_1/angular_velocity = 0.0
+15:6/0 = 0
+15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_0/angular_velocity = 0.0
+15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_1/angular_velocity = 0.0
+16:6/0 = 0
+16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_0/angular_velocity = 0.0
+16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_1/angular_velocity = 0.0
+
+[sub_resource type="TileSet" id="TileSet_kf7eg"]
+physics_layer_0/collision_layer = 1
+physics_layer_1/collision_layer = 2
+physics_layer_1/collision_mask = 2
+custom_data_layer_0/name = "Type"
+custom_data_layer_0/type = 21
+sources/0 = SubResource("TileSetAtlasSource_easgx")
+
+[node name="ExampleScene2D" type="Node2D"]
+
+[node name="Background" type="CanvasLayer" parent="."]
+layer = -3
+
+[node name="ColorRect" type="ColorRect" parent="Background"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -345.0
+offset_top = -143.0
+offset_right = 947.0
+offset_bottom = 578.0
+grow_horizontal = 2
+grow_vertical = 2
+auto_translate = false
+localize_numeral_system = false
+color = Color(0.137255, 0.14902, 0.196078, 1)
+
+[node name="TileMap" type="TileMap" parent="."]
+z_index = -1
+scale = Vector2(3, 3)
+tile_set = SubResource("TileSet_kf7eg")
+format = 2
+layer_0/name = "Background"
+layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3)
+layer_1/name = "Terrain"
+layer_1/z_index = 1
+layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6)
+
+[node name="UI" type="CanvasLayer" parent="."]
+
+[node name="UIInventory" parent="UI" instance=ExtResource("2_5oggv")]
+unique_name_in_owner = true
+visible = false
+
+[node name="UISign" parent="UI" instance=ExtResource("3_aku7q")]
+unique_name_in_owner = true
+visible = false
+
+[node name="Camera2D" type="Camera2D" parent="."]
+position = Vector2(282, -29)
+zoom = Vector2(2, 2)
+
+[node name="PhantomCameraHost" type="Node" parent="Camera2D"]
+script = ExtResource("4_j3ux0")
+
+[node name="Player" type="Node" parent="."]
+
+[node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")]
+unique_name_in_owner = true
+position = Vector2(282, -29)
+script = ExtResource("5_uwr6r")
+priority = 5
+follow_mode = 5
+follow_target = NodePath("../CharacterBody2D")
+zoom = Vector2(2, 2)
+tween_resource = ExtResource("6_4l0c3")
+tween_on_load = false
+follow_damping = true
+dead_zone_width = 0.416
+dead_zone_height = 0.63
+show_viewfinder_in_play = true
+draw_limits = true
+
+[node name="Label" type="Label" parent="Player"]
+offset_left = 167.0
+offset_top = -145.0
+offset_right = 332.0
+offset_bottom = -81.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("7_briql")
+text = "[WASD] to move
+[Space] to jump"
+
+[node name="CharacterBody2D" parent="Player" instance=ExtResource("8_i4m1d")]
+position = Vector2(282, -29)
+script = ExtResource("9_m3lnd")
diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_group_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_group_example_scene.tscn
new file mode 100644 (file)
index 0000000..143e8d6
--- /dev/null
@@ -0,0 +1,648 @@
+[gd_scene load_steps=14 format=3 uid="uid://bio6mao7gtru2"]
+
+[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_8rflf"]
+[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_tafwr"]
+[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/ui_sign.tscn" id="3_37c7w"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="4_dxiro"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="5_gaaip"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="6_ojk83"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="7_awenl"]
+[ext_resource type="Texture2D" uid="uid://cwep0on2tthn7" path="res://addons/phantom_camera/examples/textures/2D/phantom_camera_2d_sprite.png" id="8_ys0m4"]
+[ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="9_witv0"]
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="10_aivri"]
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"]
+texture = ExtResource("1_8rflf")
+0:0/0 = 0
+0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_0/angular_velocity = 0.0
+0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_1/angular_velocity = 0.0
+1:0/0 = 0
+1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_0/angular_velocity = 0.0
+1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_1/angular_velocity = 0.0
+2:0/0 = 0
+2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_0/angular_velocity = 0.0
+2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_1/angular_velocity = 0.0
+3:0/0 = 0
+3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_0/angular_velocity = 0.0
+3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_1/angular_velocity = 0.0
+4:0/0 = 0
+4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_0/angular_velocity = 0.0
+4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_1/angular_velocity = 0.0
+5:0/0 = 0
+5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_0/angular_velocity = 0.0
+5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_1/angular_velocity = 0.0
+6:0/0 = 0
+6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_0/angular_velocity = 0.0
+6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_1/angular_velocity = 0.0
+7:0/0 = 0
+7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_0/angular_velocity = 0.0
+7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_1/angular_velocity = 0.0
+0:1/0 = 0
+0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_0/angular_velocity = 0.0
+0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_1/angular_velocity = 0.0
+1:1/0 = 0
+1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_0/angular_velocity = 0.0
+1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_1/angular_velocity = 0.0
+2:1/0 = 0
+2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_0/angular_velocity = 0.0
+2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_1/angular_velocity = 0.0
+3:1/0 = 0
+3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_0/angular_velocity = 0.0
+3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_1/angular_velocity = 0.0
+4:1/0 = 0
+4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_0/angular_velocity = 0.0
+4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_1/angular_velocity = 0.0
+5:1/0 = 0
+5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_0/angular_velocity = 0.0
+5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_1/angular_velocity = 0.0
+7:1/0 = 0
+7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_0/angular_velocity = 0.0
+7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_1/angular_velocity = 0.0
+2:2/0 = 0
+2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_0/angular_velocity = 0.0
+2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_1/angular_velocity = 0.0
+3:2/0 = 0
+3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_0/angular_velocity = 0.0
+3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_1/angular_velocity = 0.0
+4:2/0 = 0
+4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_0/angular_velocity = 0.0
+4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_1/angular_velocity = 0.0
+7:2/0 = 0
+7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_0/angular_velocity = 0.0
+7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_1/angular_velocity = 0.0
+3:3/0 = 0
+3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_0/angular_velocity = 0.0
+3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_1/angular_velocity = 0.0
+4:3/0 = 0
+4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_0/angular_velocity = 0.0
+4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_1/angular_velocity = 0.0
+5:3/0 = 0
+5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_0/angular_velocity = 0.0
+5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_1/angular_velocity = 0.0
+7:3/0 = 0
+7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_0/angular_velocity = 0.0
+7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_1/angular_velocity = 0.0
+3:4/0 = 0
+3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_0/angular_velocity = 0.0
+3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_1/angular_velocity = 0.0
+4:4/0 = 0
+4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_0/angular_velocity = 0.0
+4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_1/angular_velocity = 0.0
+5:4/0 = 0
+5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_0/angular_velocity = 0.0
+5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_1/angular_velocity = 0.0
+7:4/0 = 0
+7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_0/angular_velocity = 0.0
+7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_1/angular_velocity = 0.0
+3:5/0 = 0
+3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_0/angular_velocity = 0.0
+3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_1/angular_velocity = 0.0
+4:5/0 = 0
+4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_0/angular_velocity = 0.0
+4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_1/angular_velocity = 0.0
+7:5/0 = 0
+7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_0/angular_velocity = 0.0
+7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_1/angular_velocity = 0.0
+3:6/0 = 0
+3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_0/angular_velocity = 0.0
+3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_1/angular_velocity = 0.0
+4:6/0 = 0
+4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_0/angular_velocity = 0.0
+4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_1/angular_velocity = 0.0
+7:6/0 = 0
+7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_0/angular_velocity = 0.0
+7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_1/angular_velocity = 0.0
+2:7/0 = 0
+2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_0/angular_velocity = 0.0
+2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_1/angular_velocity = 0.0
+3:7/0 = 0
+3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_0/angular_velocity = 0.0
+3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_1/angular_velocity = 0.0
+4:7/0 = 0
+4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_0/angular_velocity = 0.0
+4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_1/angular_velocity = 0.0
+5:7/0 = 0
+5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_0/angular_velocity = 0.0
+5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_1/angular_velocity = 0.0
+8:0/0 = 0
+8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_0/angular_velocity = 0.0
+8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_1/angular_velocity = 0.0
+9:0/0 = 0
+9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_0/angular_velocity = 0.0
+9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_1/angular_velocity = 0.0
+10:0/0 = 0
+10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_0/angular_velocity = 0.0
+10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_1/angular_velocity = 0.0
+11:0/0 = 0
+11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_0/angular_velocity = 0.0
+11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_1/angular_velocity = 0.0
+12:0/0 = 0
+12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_0/angular_velocity = 0.0
+12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_1/angular_velocity = 0.0
+13:0/0 = 0
+13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_0/angular_velocity = 0.0
+13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0 = 0
+14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_0/angular_velocity = 0.0
+14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8)
+14:0/0/custom_data_0 = &"Sign"
+15:0/0 = 0
+15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_0/angular_velocity = 0.0
+15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_1/angular_velocity = 0.0
+16:0/0 = 0
+16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_0/angular_velocity = 0.0
+16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_1/angular_velocity = 0.0
+8:1/0 = 0
+8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_0/angular_velocity = 0.0
+8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_1/angular_velocity = 0.0
+9:1/0 = 0
+9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_0/angular_velocity = 0.0
+9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_1/angular_velocity = 0.0
+10:1/0 = 0
+10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_0/angular_velocity = 0.0
+10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_1/angular_velocity = 0.0
+11:1/0 = 0
+11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_0/angular_velocity = 0.0
+11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_1/angular_velocity = 0.0
+12:1/0 = 0
+12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_0/angular_velocity = 0.0
+12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_1/angular_velocity = 0.0
+13:1/0 = 0
+13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_0/angular_velocity = 0.0
+13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_1/angular_velocity = 0.0
+14:1/0 = 0
+14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_0/angular_velocity = 0.0
+14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_1/angular_velocity = 0.0
+15:1/0 = 0
+15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_0/angular_velocity = 0.0
+15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_1/angular_velocity = 0.0
+16:1/0 = 0
+16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_0/angular_velocity = 0.0
+16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_1/angular_velocity = 0.0
+8:2/0 = 0
+8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_0/angular_velocity = 0.0
+8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_1/angular_velocity = 0.0
+9:2/0 = 0
+9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_0/angular_velocity = 0.0
+9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_1/angular_velocity = 0.0
+10:2/0 = 0
+10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_0/angular_velocity = 0.0
+10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_1/angular_velocity = 0.0
+11:2/0 = 0
+11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_0/angular_velocity = 0.0
+11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_1/angular_velocity = 0.0
+12:2/0 = 0
+12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_0/angular_velocity = 0.0
+12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_1/angular_velocity = 0.0
+13:2/0 = 0
+13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_0/angular_velocity = 0.0
+13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_1/angular_velocity = 0.0
+14:2/0 = 0
+14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_0/angular_velocity = 0.0
+14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_1/angular_velocity = 0.0
+15:2/0 = 0
+15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_0/angular_velocity = 0.0
+15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_1/angular_velocity = 0.0
+16:2/0 = 0
+16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_0/angular_velocity = 0.0
+16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_1/angular_velocity = 0.0
+8:3/0 = 0
+8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_0/angular_velocity = 0.0
+8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_1/angular_velocity = 0.0
+9:3/0 = 0
+9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_0/angular_velocity = 0.0
+9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_1/angular_velocity = 0.0
+10:3/0 = 0
+10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_0/angular_velocity = 0.0
+10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_1/angular_velocity = 0.0
+11:3/0 = 0
+11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_0/angular_velocity = 0.0
+11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_1/angular_velocity = 0.0
+12:3/0 = 0
+12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_0/angular_velocity = 0.0
+12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_1/angular_velocity = 0.0
+13:3/0 = 0
+13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_0/angular_velocity = 0.0
+13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_1/angular_velocity = 0.0
+14:3/0 = 0
+14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_0/angular_velocity = 0.0
+14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_1/angular_velocity = 0.0
+15:3/0 = 0
+15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_0/angular_velocity = 0.0
+15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_1/angular_velocity = 0.0
+16:3/0 = 0
+16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_0/angular_velocity = 0.0
+16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_1/angular_velocity = 0.0
+8:4/0 = 0
+8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_0/angular_velocity = 0.0
+8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_1/angular_velocity = 0.0
+9:4/0 = 0
+9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_0/angular_velocity = 0.0
+9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_1/angular_velocity = 0.0
+10:4/0 = 0
+10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_0/angular_velocity = 0.0
+10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_1/angular_velocity = 0.0
+11:4/0 = 0
+11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_0/angular_velocity = 0.0
+11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8)
+11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_1/angular_velocity = 0.0
+12:4/0 = 0
+12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_0/angular_velocity = 0.0
+12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_1/angular_velocity = 0.0
+13:4/0 = 0
+13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_0/angular_velocity = 0.0
+13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8)
+13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0 = 0
+14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_0/angular_velocity = 0.0
+14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
+14:4/0/custom_data_0 = &"Inventory"
+15:4/0 = 0
+15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_0/angular_velocity = 0.0
+15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_1/angular_velocity = 0.0
+16:4/0 = 0
+16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_0/angular_velocity = 0.0
+16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_1/angular_velocity = 0.0
+8:5/0 = 0
+8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_0/angular_velocity = 0.0
+8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_1/angular_velocity = 0.0
+9:5/0 = 0
+9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_0/angular_velocity = 0.0
+9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_1/angular_velocity = 0.0
+10:5/0 = 0
+10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_0/angular_velocity = 0.0
+10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_1/angular_velocity = 0.0
+11:5/0 = 0
+11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_0/angular_velocity = 0.0
+11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_1/angular_velocity = 0.0
+12:5/0 = 0
+12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_0/angular_velocity = 0.0
+12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_1/angular_velocity = 0.0
+13:5/0 = 0
+13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_0/angular_velocity = 0.0
+13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_1/angular_velocity = 0.0
+14:5/0 = 0
+14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_0/angular_velocity = 0.0
+14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_1/angular_velocity = 0.0
+15:5/0 = 0
+15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_0/angular_velocity = 0.0
+15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_1/angular_velocity = 0.0
+16:5/0 = 0
+16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_0/angular_velocity = 0.0
+16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_1/angular_velocity = 0.0
+8:6/0 = 0
+8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_0/angular_velocity = 0.0
+8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_1/angular_velocity = 0.0
+9:6/0 = 0
+9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_0/angular_velocity = 0.0
+9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_1/angular_velocity = 0.0
+10:6/0 = 0
+10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_0/angular_velocity = 0.0
+10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_1/angular_velocity = 0.0
+11:6/0 = 0
+11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_0/angular_velocity = 0.0
+11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5)
+11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_1/angular_velocity = 0.0
+12:6/0 = 0
+12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_0/angular_velocity = 0.0
+12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_1/angular_velocity = 0.0
+13:6/0 = 0
+13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_0/angular_velocity = 0.0
+13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8)
+13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_1/angular_velocity = 0.0
+14:6/0 = 0
+14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_0/angular_velocity = 0.0
+14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_1/angular_velocity = 0.0
+15:6/0 = 0
+15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_0/angular_velocity = 0.0
+15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_1/angular_velocity = 0.0
+16:6/0 = 0
+16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_0/angular_velocity = 0.0
+16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_1/angular_velocity = 0.0
+
+[sub_resource type="TileSet" id="TileSet_kf7eg"]
+physics_layer_0/collision_layer = 1
+physics_layer_1/collision_layer = 2
+physics_layer_1/collision_mask = 2
+custom_data_layer_0/name = "Type"
+custom_data_layer_0/type = 21
+sources/0 = SubResource("TileSetAtlasSource_easgx")
+
+[sub_resource type="Resource" id="Resource_spy00"]
+script = ExtResource("7_awenl")
+duration = 0.3
+transition = 4
+ease = 2
+
+[node name="ExampleScene2D" type="Node2D"]
+
+[node name="Background" type="CanvasLayer" parent="."]
+layer = -3
+
+[node name="ColorRect" type="ColorRect" parent="Background"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -311.0
+offset_top = -173.0
+offset_right = 981.0
+offset_bottom = 548.0
+grow_horizontal = 2
+grow_vertical = 2
+auto_translate = false
+localize_numeral_system = false
+color = Color(0.137255, 0.14902, 0.196078, 1)
+
+[node name="TileMap" type="TileMap" parent="."]
+z_index = -1
+scale = Vector2(3, 3)
+tile_set = SubResource("TileSet_kf7eg")
+format = 2
+layer_0/name = "Background"
+layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3)
+layer_1/name = "Terrain"
+layer_1/z_index = 1
+layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5)
+
+[node name="UI" type="CanvasLayer" parent="."]
+
+[node name="UIInventory" parent="UI" instance=ExtResource("2_tafwr")]
+unique_name_in_owner = true
+visible = false
+
+[node name="UISign" parent="UI" instance=ExtResource("3_37c7w")]
+unique_name_in_owner = true
+visible = false
+
+[node name="Camera2D" type="Camera2D" parent="."]
+position = Vector2(107, -172.5)
+position_smoothing_speed = 8.0
+
+[node name="PhantomCameraHost" type="Node" parent="Camera2D"]
+script = ExtResource("4_dxiro")
+
+[node name="Label" type="Label" parent="."]
+offset_left = 167.0
+offset_top = -133.0
+offset_right = 332.0
+offset_bottom = -69.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("5_gaaip")
+text = "[WASD] to move
+[Space] to jump"
+
+[node name="PhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_targets")]
+position = Vector2(107, -172.5)
+script = ExtResource("6_ojk83")
+priority = 10
+follow_mode = 3
+follow_targets = [NodePath("../GroupNPCSprite"), NodePath("../CharacterBody2D")]
+tween_resource = SubResource("Resource_spy00")
+tween_on_load = false
+follow_damping = true
+auto_zoom = true
+auto_zoom_margin = Vector4(200, 0, 200, 0)
+draw_limits = true
+
+[node name="GroupNPCSprite" type="Sprite2D" parent="."]
+unique_name_in_owner = true
+position = Vector2(107, -316)
+texture = ExtResource("8_ys0m4")
+
+[node name="CharacterBody2D" parent="." instance=ExtResource("9_witv0")]
+position = Vector2(265, -29)
+script = ExtResource("10_aivri")
diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_path_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_path_example_scene.tscn
new file mode 100644 (file)
index 0000000..260aa31
--- /dev/null
@@ -0,0 +1,659 @@
+[gd_scene load_steps=13 format=3 uid="uid://b75giavcvh1mv"]
+
+[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_t003o"]
+[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_4ncqd"]
+[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/ui_sign.tscn" id="3_tpji3"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="4_w0rat"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="5_q77r4"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="6_y6hoa"]
+[ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_2d_tween.tres" id="7_wd55r"]
+[ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="8_fy81j"]
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="9_u6ygl"]
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"]
+texture = ExtResource("1_t003o")
+0:0/0 = 0
+0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_0/angular_velocity = 0.0
+0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_1/angular_velocity = 0.0
+1:0/0 = 0
+1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_0/angular_velocity = 0.0
+1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_1/angular_velocity = 0.0
+2:0/0 = 0
+2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_0/angular_velocity = 0.0
+2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_1/angular_velocity = 0.0
+3:0/0 = 0
+3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_0/angular_velocity = 0.0
+3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_1/angular_velocity = 0.0
+4:0/0 = 0
+4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_0/angular_velocity = 0.0
+4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_1/angular_velocity = 0.0
+5:0/0 = 0
+5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_0/angular_velocity = 0.0
+5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_1/angular_velocity = 0.0
+6:0/0 = 0
+6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_0/angular_velocity = 0.0
+6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_1/angular_velocity = 0.0
+7:0/0 = 0
+7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_0/angular_velocity = 0.0
+7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_1/angular_velocity = 0.0
+0:1/0 = 0
+0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_0/angular_velocity = 0.0
+0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_1/angular_velocity = 0.0
+1:1/0 = 0
+1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_0/angular_velocity = 0.0
+1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_1/angular_velocity = 0.0
+2:1/0 = 0
+2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_0/angular_velocity = 0.0
+2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_1/angular_velocity = 0.0
+3:1/0 = 0
+3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_0/angular_velocity = 0.0
+3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_1/angular_velocity = 0.0
+4:1/0 = 0
+4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_0/angular_velocity = 0.0
+4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_1/angular_velocity = 0.0
+5:1/0 = 0
+5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_0/angular_velocity = 0.0
+5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_1/angular_velocity = 0.0
+7:1/0 = 0
+7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_0/angular_velocity = 0.0
+7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_1/angular_velocity = 0.0
+2:2/0 = 0
+2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_0/angular_velocity = 0.0
+2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_1/angular_velocity = 0.0
+3:2/0 = 0
+3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_0/angular_velocity = 0.0
+3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_1/angular_velocity = 0.0
+4:2/0 = 0
+4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_0/angular_velocity = 0.0
+4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_1/angular_velocity = 0.0
+7:2/0 = 0
+7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_0/angular_velocity = 0.0
+7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_1/angular_velocity = 0.0
+3:3/0 = 0
+3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_0/angular_velocity = 0.0
+3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_1/angular_velocity = 0.0
+4:3/0 = 0
+4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_0/angular_velocity = 0.0
+4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_1/angular_velocity = 0.0
+5:3/0 = 0
+5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_0/angular_velocity = 0.0
+5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_1/angular_velocity = 0.0
+7:3/0 = 0
+7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_0/angular_velocity = 0.0
+7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_1/angular_velocity = 0.0
+3:4/0 = 0
+3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_0/angular_velocity = 0.0
+3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_1/angular_velocity = 0.0
+4:4/0 = 0
+4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_0/angular_velocity = 0.0
+4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_1/angular_velocity = 0.0
+5:4/0 = 0
+5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_0/angular_velocity = 0.0
+5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_1/angular_velocity = 0.0
+7:4/0 = 0
+7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_0/angular_velocity = 0.0
+7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_1/angular_velocity = 0.0
+3:5/0 = 0
+3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_0/angular_velocity = 0.0
+3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_1/angular_velocity = 0.0
+4:5/0 = 0
+4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_0/angular_velocity = 0.0
+4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_1/angular_velocity = 0.0
+7:5/0 = 0
+7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_0/angular_velocity = 0.0
+7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_1/angular_velocity = 0.0
+3:6/0 = 0
+3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_0/angular_velocity = 0.0
+3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_1/angular_velocity = 0.0
+4:6/0 = 0
+4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_0/angular_velocity = 0.0
+4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_1/angular_velocity = 0.0
+7:6/0 = 0
+7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_0/angular_velocity = 0.0
+7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_1/angular_velocity = 0.0
+2:7/0 = 0
+2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_0/angular_velocity = 0.0
+2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_1/angular_velocity = 0.0
+3:7/0 = 0
+3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_0/angular_velocity = 0.0
+3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_1/angular_velocity = 0.0
+4:7/0 = 0
+4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_0/angular_velocity = 0.0
+4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_1/angular_velocity = 0.0
+5:7/0 = 0
+5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_0/angular_velocity = 0.0
+5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_1/angular_velocity = 0.0
+8:0/0 = 0
+8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_0/angular_velocity = 0.0
+8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_1/angular_velocity = 0.0
+9:0/0 = 0
+9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_0/angular_velocity = 0.0
+9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_1/angular_velocity = 0.0
+10:0/0 = 0
+10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_0/angular_velocity = 0.0
+10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_1/angular_velocity = 0.0
+11:0/0 = 0
+11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_0/angular_velocity = 0.0
+11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_1/angular_velocity = 0.0
+12:0/0 = 0
+12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_0/angular_velocity = 0.0
+12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_1/angular_velocity = 0.0
+13:0/0 = 0
+13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_0/angular_velocity = 0.0
+13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0 = 0
+14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_0/angular_velocity = 0.0
+14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8)
+14:0/0/custom_data_0 = &"Sign"
+15:0/0 = 0
+15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_0/angular_velocity = 0.0
+15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_1/angular_velocity = 0.0
+16:0/0 = 0
+16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_0/angular_velocity = 0.0
+16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_1/angular_velocity = 0.0
+8:1/0 = 0
+8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_0/angular_velocity = 0.0
+8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_1/angular_velocity = 0.0
+9:1/0 = 0
+9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_0/angular_velocity = 0.0
+9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_1/angular_velocity = 0.0
+10:1/0 = 0
+10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_0/angular_velocity = 0.0
+10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_1/angular_velocity = 0.0
+11:1/0 = 0
+11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_0/angular_velocity = 0.0
+11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_1/angular_velocity = 0.0
+12:1/0 = 0
+12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_0/angular_velocity = 0.0
+12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_1/angular_velocity = 0.0
+13:1/0 = 0
+13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_0/angular_velocity = 0.0
+13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_1/angular_velocity = 0.0
+14:1/0 = 0
+14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_0/angular_velocity = 0.0
+14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_1/angular_velocity = 0.0
+15:1/0 = 0
+15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_0/angular_velocity = 0.0
+15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_1/angular_velocity = 0.0
+16:1/0 = 0
+16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_0/angular_velocity = 0.0
+16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_1/angular_velocity = 0.0
+8:2/0 = 0
+8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_0/angular_velocity = 0.0
+8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_1/angular_velocity = 0.0
+9:2/0 = 0
+9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_0/angular_velocity = 0.0
+9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_1/angular_velocity = 0.0
+10:2/0 = 0
+10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_0/angular_velocity = 0.0
+10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_1/angular_velocity = 0.0
+11:2/0 = 0
+11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_0/angular_velocity = 0.0
+11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_1/angular_velocity = 0.0
+12:2/0 = 0
+12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_0/angular_velocity = 0.0
+12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_1/angular_velocity = 0.0
+13:2/0 = 0
+13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_0/angular_velocity = 0.0
+13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_1/angular_velocity = 0.0
+14:2/0 = 0
+14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_0/angular_velocity = 0.0
+14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_1/angular_velocity = 0.0
+15:2/0 = 0
+15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_0/angular_velocity = 0.0
+15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_1/angular_velocity = 0.0
+16:2/0 = 0
+16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_0/angular_velocity = 0.0
+16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_1/angular_velocity = 0.0
+8:3/0 = 0
+8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_0/angular_velocity = 0.0
+8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_1/angular_velocity = 0.0
+9:3/0 = 0
+9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_0/angular_velocity = 0.0
+9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_1/angular_velocity = 0.0
+10:3/0 = 0
+10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_0/angular_velocity = 0.0
+10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_1/angular_velocity = 0.0
+11:3/0 = 0
+11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_0/angular_velocity = 0.0
+11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_1/angular_velocity = 0.0
+12:3/0 = 0
+12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_0/angular_velocity = 0.0
+12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_1/angular_velocity = 0.0
+13:3/0 = 0
+13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_0/angular_velocity = 0.0
+13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_1/angular_velocity = 0.0
+14:3/0 = 0
+14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_0/angular_velocity = 0.0
+14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_1/angular_velocity = 0.0
+15:3/0 = 0
+15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_0/angular_velocity = 0.0
+15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_1/angular_velocity = 0.0
+16:3/0 = 0
+16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_0/angular_velocity = 0.0
+16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_1/angular_velocity = 0.0
+8:4/0 = 0
+8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_0/angular_velocity = 0.0
+8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_1/angular_velocity = 0.0
+9:4/0 = 0
+9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_0/angular_velocity = 0.0
+9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_1/angular_velocity = 0.0
+10:4/0 = 0
+10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_0/angular_velocity = 0.0
+10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_1/angular_velocity = 0.0
+11:4/0 = 0
+11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_0/angular_velocity = 0.0
+11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8)
+11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_1/angular_velocity = 0.0
+12:4/0 = 0
+12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_0/angular_velocity = 0.0
+12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_1/angular_velocity = 0.0
+13:4/0 = 0
+13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_0/angular_velocity = 0.0
+13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8)
+13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0 = 0
+14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_0/angular_velocity = 0.0
+14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
+14:4/0/custom_data_0 = &"Inventory"
+15:4/0 = 0
+15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_0/angular_velocity = 0.0
+15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_1/angular_velocity = 0.0
+16:4/0 = 0
+16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_0/angular_velocity = 0.0
+16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_1/angular_velocity = 0.0
+8:5/0 = 0
+8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_0/angular_velocity = 0.0
+8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_1/angular_velocity = 0.0
+9:5/0 = 0
+9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_0/angular_velocity = 0.0
+9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_1/angular_velocity = 0.0
+10:5/0 = 0
+10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_0/angular_velocity = 0.0
+10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_1/angular_velocity = 0.0
+11:5/0 = 0
+11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_0/angular_velocity = 0.0
+11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_1/angular_velocity = 0.0
+12:5/0 = 0
+12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_0/angular_velocity = 0.0
+12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_1/angular_velocity = 0.0
+13:5/0 = 0
+13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_0/angular_velocity = 0.0
+13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_1/angular_velocity = 0.0
+14:5/0 = 0
+14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_0/angular_velocity = 0.0
+14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_1/angular_velocity = 0.0
+15:5/0 = 0
+15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_0/angular_velocity = 0.0
+15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_1/angular_velocity = 0.0
+16:5/0 = 0
+16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_0/angular_velocity = 0.0
+16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_1/angular_velocity = 0.0
+8:6/0 = 0
+8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_0/angular_velocity = 0.0
+8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_1/angular_velocity = 0.0
+9:6/0 = 0
+9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_0/angular_velocity = 0.0
+9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_1/angular_velocity = 0.0
+10:6/0 = 0
+10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_0/angular_velocity = 0.0
+10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_1/angular_velocity = 0.0
+11:6/0 = 0
+11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_0/angular_velocity = 0.0
+11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5)
+11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_1/angular_velocity = 0.0
+12:6/0 = 0
+12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_0/angular_velocity = 0.0
+12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_1/angular_velocity = 0.0
+13:6/0 = 0
+13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_0/angular_velocity = 0.0
+13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8)
+13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_1/angular_velocity = 0.0
+14:6/0 = 0
+14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_0/angular_velocity = 0.0
+14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_1/angular_velocity = 0.0
+15:6/0 = 0
+15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_0/angular_velocity = 0.0
+15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_1/angular_velocity = 0.0
+16:6/0 = 0
+16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_0/angular_velocity = 0.0
+16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_1/angular_velocity = 0.0
+
+[sub_resource type="TileSet" id="TileSet_kf7eg"]
+physics_layer_0/collision_layer = 1
+physics_layer_1/collision_layer = 2
+physics_layer_1/collision_mask = 2
+custom_data_layer_0/name = "Type"
+custom_data_layer_0/type = 21
+sources/0 = SubResource("TileSetAtlasSource_easgx")
+
+[sub_resource type="Curve2D" id="Curve2D_usrhf"]
+_data = {
+"points": PackedVector2Array(-96.4111, 42.3785, 0, 0, 222, 0, 0, 0, 0, 0, 1550, 0)
+}
+point_count = 2
+
+[node name="ExampleScene2D" type="Node2D"]
+
+[node name="Background" type="CanvasLayer" parent="."]
+layer = -3
+
+[node name="ColorRect" type="ColorRect" parent="Background"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -311.0
+offset_top = -173.0
+offset_right = 981.0
+offset_bottom = 548.0
+grow_horizontal = 2
+grow_vertical = 2
+auto_translate = false
+localize_numeral_system = false
+color = Color(0.137255, 0.14902, 0.196078, 1)
+
+[node name="TileMap" type="TileMap" parent="."]
+z_index = -1
+scale = Vector2(3, 3)
+tile_set = SubResource("TileSet_kf7eg")
+format = 2
+layer_0/name = "Background"
+layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3)
+layer_1/name = "Terrain"
+layer_1/z_index = 1
+layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -65509, 720896, 3, -65510, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6, -196569, 720896, 4, -131033, 720896, 5, -65497, 720896, 5, 39, 720896, 5, 65575, 720896, 5, 131111, 720896, 5, 196647, 720896, 5, 262183, 720896, 5, 327719, 720896, 5, 393255, 720896, 5, 458791, 720896, 5, 524327, 720896, 5, 589863, 720896, 5, 655399, 720896, 6, -262104, 917504, 6, -196568, 786432, 4, -131032, 786432, 5, -65496, 655360, 6, 40, 786432, 5, 65576, 786432, 5, 131112, 786432, 5, 196648, 786432, 5, 262184, 786432, 5, 327720, 786432, 5, 393256, 786432, 5, 458792, 786432, 5, 524328, 655360, 6, 589864, 786432, 5, 655400, 786432, 6, -262103, 983040, 5, -196567, 786432, 4, -131031, 786432, 5, -65495, 786432, 5, 41, 589824, 6, 65577, 786432, 5, 131113, 786432, 5, 196649, 786432, 5, 262185, 786432, 5, 327721, 786432, 5, 393257, 786432, 5, 458793, 786432, 5, 524329, 786432, 5, 589865, 786432, 5, 655401, 786432, 6, -262102, 720896, 3, -196566, 786432, 4, -131030, 786432, 5, -65494, 786432, 5, 42, 786432, 5, 65578, 786432, 5, 131114, 786432, 5, 196650, 786432, 5, 262186, 655360, 6, 327722, 786432, 5, 393258, 786432, 5, 458794, 786432, 5, 524330, 786432, 5, 589866, 786432, 5, 655402, 786432, 6, -262101, 1048576, 6, -196565, 786432, 4, -131029, 786432, 5, -65493, 786432, 5, 43, 786432, 5, 65579, 786432, 5, 131115, 786432, 5, 196651, 786432, 5, 262187, 786432, 5, 327723, 786432, 5, 393259, 655360, 6, 458795, 655360, 6, 524331, 786432, 5, 589867, 786432, 5, 655403, 786432, 6, -262100, 720896, 3, -196564, 786432, 4, -131028, 786432, 5, -65492, 786432, 5, 44, 786432, 5, 65580, 786432, 5, 131116, 786432, 5, 196652, 786432, 5, 262188, 786432, 5, 327724, 786432, 5, 393260, 786432, 5, 458796, 786432, 5, 524332, 786432, 5, 589868, 786432, 5, 655404, 786432, 6, -262099, 983040, 6, -196563, 786432, 4, -131027, 786432, 5, -65491, 786432, 5, 45, 589824, 6, 65581, 655360, 6, 131117, 655360, 6, 196653, 786432, 5, 262189, 786432, 5, 327725, 786432, 5, 393261, 786432, 5, 458797, 786432, 5, 524333, 786432, 5, 589869, 655360, 6, 655405, 786432, 6, -196562, 786432, 4, -131026, 786432, 5, -65490, 786432, 5, 46, 786432, 5, 65582, 786432, 5, 131118, 786432, 5, 196654, 786432, 5, 262190, 786432, 5, 327726, 786432, 5, 393262, 786432, 5, 458798, 786432, 5, 524334, 786432, 5, 589870, 786432, 5, 655406, 786432, 6, -196561, 851968, 4, -131025, 851968, 5, -65489, 851968, 5, 47, 851968, 5, 65583, 851968, 5, 131119, 851968, 5, 196655, 851968, 5, 262191, 851968, 5, 327727, 851968, 5, 393263, 851968, 5, 458799, 851968, 5, 524335, 851968, 5, 589871, 851968, 5, 655407, 851968, 6, -131042, 720896, 4, -65506, 720896, 5, 30, 720896, 5, 65566, 720896, 5, 131102, 720896, 5, 196638, 720896, 5, 262174, 720896, 5, 327710, 720896, 5, 393246, 720896, 5, 458782, 720896, 5, 524318, 720896, 5, -196577, 917504, 6, -131041, 786432, 4, -65505, 786432, 5, 31, 655360, 6, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 786432, 5, 458783, 786432, 5, 524319, 786432, 5, -196576, 983040, 5, -131040, 786432, 4, -65504, 786432, 5, 32, 786432, 5, 65568, 589824, 6, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 524320, 786432, 5, -196575, 720896, 3, -131039, 786432, 4, -65503, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 786432, 5, 196641, 786432, 5, 262177, 786432, 5, 327713, 655360, 6, 393249, 786432, 5, 458785, 786432, 5, 524321, 786432, 5, -196574, 1048576, 6, -131038, 786432, 4, -65502, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 786432, 5, 327714, 786432, 5, 393250, 786432, 5, 458786, 655360, 6, 524322, 655360, 6, -196573, 720896, 3, -131037, 786432, 4, -65501, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 524323, 786432, 5, -196572, 983040, 6, -131036, 786432, 4, -65500, 786432, 5, 36, 786432, 5, 65572, 589824, 6, 131108, 655360, 6, 196644, 655360, 6, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 786432, 5, 524324, 786432, 5, -131035, 786432, 4, -65499, 786432, 5, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524325, 786432, 5, -131034, 851968, 4, -65498, 851968, 5, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 524326, 851968, 5, 589854, 720896, 5, 655390, 720896, 5, 720926, 720896, 6, 589855, 655360, 6, 655391, 786432, 5, 720927, 786432, 6, 589856, 786432, 5, 655392, 786432, 5, 720928, 786432, 6, 589857, 786432, 5, 655393, 786432, 5, 720929, 786432, 6, 589858, 786432, 5, 655394, 786432, 5, 720930, 786432, 6, 589859, 786432, 5, 655395, 786432, 5, 720931, 786432, 6, 589860, 786432, 5, 655396, 655360, 6, 720932, 786432, 6, 589861, 786432, 5, 655397, 786432, 5, 720933, 786432, 6, 589862, 851968, 5, 655398, 851968, 5, 720934, 851968, 6, -458704, 720896, 4, -393168, 720896, 5, -327632, 720896, 5, -262096, 720896, 5, -196560, 720896, 5, -131024, 720896, 5, -65488, 720896, 5, 48, 720896, 5, 65584, 720896, 5, 131120, 720896, 5, 196656, 720896, 5, 262192, 720896, 5, 327728, 720896, 5, 393264, 720896, 6, -524239, 917504, 6, -458703, 786432, 4, -393167, 786432, 5, -327631, 655360, 6, -262095, 786432, 5, -196559, 786432, 5, -131023, 786432, 5, -65487, 786432, 5, 49, 786432, 5, 65585, 786432, 5, 131121, 786432, 5, 196657, 786432, 5, 262193, 655360, 6, 327729, 786432, 5, 393265, 786432, 6, -524238, 983040, 5, -458702, 786432, 4, -393166, 786432, 5, -327630, 786432, 5, -262094, 589824, 6, -196558, 786432, 5, -131022, 786432, 5, -65486, 786432, 5, 50, 786432, 5, 65586, 786432, 5, 131122, 786432, 5, 196658, 786432, 5, 262194, 786432, 5, 327730, 786432, 5, 393266, 786432, 6, -524237, 720896, 3, -458701, 786432, 4, -393165, 786432, 5, -327629, 786432, 5, -262093, 786432, 5, -196557, 786432, 5, -131021, 786432, 5, -65485, 786432, 5, 51, 655360, 6, 65587, 786432, 5, 131123, 786432, 5, 196659, 786432, 5, 262195, 786432, 5, 327731, 786432, 5, 393267, 786432, 6, -524236, 1048576, 6, -458700, 786432, 4, -393164, 786432, 5, -327628, 786432, 5, -262092, 786432, 5, -196556, 786432, 5, -131020, 786432, 5, -65484, 786432, 5, 52, 786432, 5, 65588, 786432, 5, 131124, 655360, 6, 196660, 655360, 6, 262196, 786432, 5, 327732, 786432, 5, 393268, 786432, 6, -524235, 720896, 3, -458699, 786432, 4, -393163, 786432, 5, -327627, 786432, 5, -262091, 786432, 5, -196555, 786432, 5, -131019, 786432, 5, -65483, 786432, 5, 53, 786432, 5, 65589, 786432, 5, 131125, 786432, 5, 196661, 786432, 5, 262197, 786432, 5, 327733, 786432, 5, 393269, 786432, 6, -524234, 983040, 6, -458698, 786432, 4, -393162, 786432, 5, -327626, 786432, 5, -262090, 589824, 6, -196554, 655360, 6, -131018, 655360, 6, -65482, 786432, 5, 54, 786432, 5, 65590, 786432, 5, 131126, 786432, 5, 196662, 786432, 5, 262198, 786432, 5, 327734, 655360, 6, 393270, 786432, 6, -458697, 786432, 4, -393161, 786432, 5, -327625, 786432, 5, -262089, 786432, 5, -196553, 786432, 5, -131017, 786432, 5, -65481, 786432, 5, 55, 786432, 5, 65591, 786432, 5, 131127, 786432, 5, 196663, 786432, 5, 262199, 786432, 5, 327735, 786432, 5, 393271, 786432, 6, -458696, 851968, 4, -393160, 851968, 5, -327624, 851968, 5, -262088, 851968, 5, -196552, 851968, 5, -131016, 851968, 5, -65480, 851968, 5, 56, 851968, 5, 65592, 851968, 5, 131128, 851968, 5, 196664, 851968, 5, 262200, 851968, 5, 327736, 851968, 5, 393272, 851968, 6)
+
+[node name="UI" type="CanvasLayer" parent="."]
+
+[node name="UIInventory" parent="UI" instance=ExtResource("2_4ncqd")]
+unique_name_in_owner = true
+visible = false
+
+[node name="UISign" parent="UI" instance=ExtResource("3_tpji3")]
+unique_name_in_owner = true
+visible = false
+
+[node name="Camera2D" type="Camera2D" parent="."]
+position = Vector2(374, -216)
+zoom = Vector2(1.5, 1.5)
+
+[node name="PhantomCameraHost" type="Node" parent="Camera2D"]
+script = ExtResource("4_w0rat")
+
+[node name="Label" type="Label" parent="."]
+offset_left = 167.0
+offset_top = -133.0
+offset_right = 332.0
+offset_bottom = -69.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("5_q77r4")
+text = "[WASD] to move
+[Space] to jump"
+
+[node name="Player" type="Node" parent="."]
+
+[node name="Label" type="Label" parent="Player"]
+visible = false
+offset_left = 167.0
+offset_top = -145.0
+offset_right = 332.0
+offset_bottom = -81.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("5_q77r4")
+text = "[WASD] to move
+[Space] to jump"
+
+[node name="PlayerPhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_target", "follow_path")]
+unique_name_in_owner = true
+position = Vector2(374, -216)
+script = ExtResource("6_y6hoa")
+priority = 10
+follow_mode = 4
+follow_target = NodePath("../CharacterBody2D")
+follow_path = NodePath("../Path2D")
+zoom = Vector2(1.5, 1.5)
+tween_resource = ExtResource("7_wd55r")
+tween_on_load = false
+draw_limits = true
+
+[node name="Path2D" type="Path2D" parent="."]
+position = Vector2(152, -216)
+curve = SubResource("Curve2D_usrhf")
+
+[node name="CharacterBody2D" parent="." instance=ExtResource("8_fy81j")]
+position = Vector2(225, -28)
+script = ExtResource("9_u6ygl")
diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_limit_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_limit_example_scene.tscn
new file mode 100644 (file)
index 0000000..d34057f
--- /dev/null
@@ -0,0 +1,718 @@
+[gd_scene load_steps=17 format=3 uid="uid://0ox7hgdpwpqp"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween_4.3.gd" id="1_bwr3f"]
+[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="2_f03of"]
+[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="3_cysy4"]
+[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/ui_sign.tscn" id="4_qqut6"]
+[ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="5_yv8tn"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="6_2n5r1"]
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="6_68ewj"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="7_ne05h"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="8_hulu3"]
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"]
+texture = ExtResource("2_f03of")
+0:0/0 = 0
+0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_0/angular_velocity = 0.0
+0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_1/angular_velocity = 0.0
+1:0/0 = 0
+1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_0/angular_velocity = 0.0
+1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_1/angular_velocity = 0.0
+2:0/0 = 0
+2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_0/angular_velocity = 0.0
+2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_1/angular_velocity = 0.0
+3:0/0 = 0
+3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_0/angular_velocity = 0.0
+3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_1/angular_velocity = 0.0
+4:0/0 = 0
+4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_0/angular_velocity = 0.0
+4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_1/angular_velocity = 0.0
+5:0/0 = 0
+5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_0/angular_velocity = 0.0
+5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_1/angular_velocity = 0.0
+6:0/0 = 0
+6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_0/angular_velocity = 0.0
+6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_1/angular_velocity = 0.0
+7:0/0 = 0
+7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_0/angular_velocity = 0.0
+7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_1/angular_velocity = 0.0
+0:1/0 = 0
+0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_0/angular_velocity = 0.0
+0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_1/angular_velocity = 0.0
+1:1/0 = 0
+1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_0/angular_velocity = 0.0
+1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_1/angular_velocity = 0.0
+2:1/0 = 0
+2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_0/angular_velocity = 0.0
+2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_1/angular_velocity = 0.0
+3:1/0 = 0
+3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_0/angular_velocity = 0.0
+3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_1/angular_velocity = 0.0
+4:1/0 = 0
+4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_0/angular_velocity = 0.0
+4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_1/angular_velocity = 0.0
+5:1/0 = 0
+5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_0/angular_velocity = 0.0
+5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_1/angular_velocity = 0.0
+7:1/0 = 0
+7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_0/angular_velocity = 0.0
+7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_1/angular_velocity = 0.0
+2:2/0 = 0
+2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_0/angular_velocity = 0.0
+2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_1/angular_velocity = 0.0
+3:2/0 = 0
+3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_0/angular_velocity = 0.0
+3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_1/angular_velocity = 0.0
+4:2/0 = 0
+4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_0/angular_velocity = 0.0
+4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_1/angular_velocity = 0.0
+7:2/0 = 0
+7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_0/angular_velocity = 0.0
+7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_1/angular_velocity = 0.0
+3:3/0 = 0
+3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_0/angular_velocity = 0.0
+3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_1/angular_velocity = 0.0
+4:3/0 = 0
+4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_0/angular_velocity = 0.0
+4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_1/angular_velocity = 0.0
+5:3/0 = 0
+5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_0/angular_velocity = 0.0
+5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_1/angular_velocity = 0.0
+7:3/0 = 0
+7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_0/angular_velocity = 0.0
+7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_1/angular_velocity = 0.0
+3:4/0 = 0
+3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_0/angular_velocity = 0.0
+3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_1/angular_velocity = 0.0
+4:4/0 = 0
+4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_0/angular_velocity = 0.0
+4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_1/angular_velocity = 0.0
+5:4/0 = 0
+5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_0/angular_velocity = 0.0
+5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_1/angular_velocity = 0.0
+7:4/0 = 0
+7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_0/angular_velocity = 0.0
+7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_1/angular_velocity = 0.0
+3:5/0 = 0
+3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_0/angular_velocity = 0.0
+3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_1/angular_velocity = 0.0
+4:5/0 = 0
+4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_0/angular_velocity = 0.0
+4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_1/angular_velocity = 0.0
+7:5/0 = 0
+7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_0/angular_velocity = 0.0
+7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_1/angular_velocity = 0.0
+3:6/0 = 0
+3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_0/angular_velocity = 0.0
+3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_1/angular_velocity = 0.0
+4:6/0 = 0
+4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_0/angular_velocity = 0.0
+4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_1/angular_velocity = 0.0
+7:6/0 = 0
+7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_0/angular_velocity = 0.0
+7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_1/angular_velocity = 0.0
+2:7/0 = 0
+2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_0/angular_velocity = 0.0
+2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_1/angular_velocity = 0.0
+3:7/0 = 0
+3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_0/angular_velocity = 0.0
+3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_1/angular_velocity = 0.0
+4:7/0 = 0
+4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_0/angular_velocity = 0.0
+4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_1/angular_velocity = 0.0
+5:7/0 = 0
+5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_0/angular_velocity = 0.0
+5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_1/angular_velocity = 0.0
+8:0/0 = 0
+8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_0/angular_velocity = 0.0
+8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_1/angular_velocity = 0.0
+9:0/0 = 0
+9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_0/angular_velocity = 0.0
+9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_1/angular_velocity = 0.0
+10:0/0 = 0
+10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_0/angular_velocity = 0.0
+10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_1/angular_velocity = 0.0
+11:0/0 = 0
+11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_0/angular_velocity = 0.0
+11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_1/angular_velocity = 0.0
+12:0/0 = 0
+12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_0/angular_velocity = 0.0
+12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_1/angular_velocity = 0.0
+13:0/0 = 0
+13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_0/angular_velocity = 0.0
+13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0 = 0
+14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_0/angular_velocity = 0.0
+14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8)
+14:0/0/custom_data_0 = &"Sign"
+15:0/0 = 0
+15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_0/angular_velocity = 0.0
+15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_1/angular_velocity = 0.0
+16:0/0 = 0
+16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_0/angular_velocity = 0.0
+16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_1/angular_velocity = 0.0
+8:1/0 = 0
+8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_0/angular_velocity = 0.0
+8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_1/angular_velocity = 0.0
+9:1/0 = 0
+9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_0/angular_velocity = 0.0
+9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_1/angular_velocity = 0.0
+10:1/0 = 0
+10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_0/angular_velocity = 0.0
+10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_1/angular_velocity = 0.0
+11:1/0 = 0
+11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_0/angular_velocity = 0.0
+11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_1/angular_velocity = 0.0
+12:1/0 = 0
+12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_0/angular_velocity = 0.0
+12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_1/angular_velocity = 0.0
+13:1/0 = 0
+13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_0/angular_velocity = 0.0
+13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_1/angular_velocity = 0.0
+14:1/0 = 0
+14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_0/angular_velocity = 0.0
+14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_1/angular_velocity = 0.0
+15:1/0 = 0
+15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_0/angular_velocity = 0.0
+15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_1/angular_velocity = 0.0
+16:1/0 = 0
+16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_0/angular_velocity = 0.0
+16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_1/angular_velocity = 0.0
+8:2/0 = 0
+8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_0/angular_velocity = 0.0
+8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_1/angular_velocity = 0.0
+9:2/0 = 0
+9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_0/angular_velocity = 0.0
+9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_1/angular_velocity = 0.0
+10:2/0 = 0
+10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_0/angular_velocity = 0.0
+10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_1/angular_velocity = 0.0
+11:2/0 = 0
+11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_0/angular_velocity = 0.0
+11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_1/angular_velocity = 0.0
+12:2/0 = 0
+12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_0/angular_velocity = 0.0
+12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_1/angular_velocity = 0.0
+13:2/0 = 0
+13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_0/angular_velocity = 0.0
+13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_1/angular_velocity = 0.0
+14:2/0 = 0
+14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_0/angular_velocity = 0.0
+14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_1/angular_velocity = 0.0
+15:2/0 = 0
+15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_0/angular_velocity = 0.0
+15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_1/angular_velocity = 0.0
+16:2/0 = 0
+16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_0/angular_velocity = 0.0
+16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_1/angular_velocity = 0.0
+8:3/0 = 0
+8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_0/angular_velocity = 0.0
+8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_1/angular_velocity = 0.0
+9:3/0 = 0
+9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_0/angular_velocity = 0.0
+9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_1/angular_velocity = 0.0
+10:3/0 = 0
+10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_0/angular_velocity = 0.0
+10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_1/angular_velocity = 0.0
+11:3/0 = 0
+11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_0/angular_velocity = 0.0
+11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_1/angular_velocity = 0.0
+12:3/0 = 0
+12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_0/angular_velocity = 0.0
+12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_1/angular_velocity = 0.0
+13:3/0 = 0
+13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_0/angular_velocity = 0.0
+13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_1/angular_velocity = 0.0
+14:3/0 = 0
+14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_0/angular_velocity = 0.0
+14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_1/angular_velocity = 0.0
+15:3/0 = 0
+15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_0/angular_velocity = 0.0
+15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_1/angular_velocity = 0.0
+16:3/0 = 0
+16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_0/angular_velocity = 0.0
+16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_1/angular_velocity = 0.0
+8:4/0 = 0
+8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_0/angular_velocity = 0.0
+8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_1/angular_velocity = 0.0
+9:4/0 = 0
+9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_0/angular_velocity = 0.0
+9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_1/angular_velocity = 0.0
+10:4/0 = 0
+10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_0/angular_velocity = 0.0
+10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_1/angular_velocity = 0.0
+11:4/0 = 0
+11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_0/angular_velocity = 0.0
+11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8)
+11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_1/angular_velocity = 0.0
+12:4/0 = 0
+12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_0/angular_velocity = 0.0
+12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_1/angular_velocity = 0.0
+13:4/0 = 0
+13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_0/angular_velocity = 0.0
+13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8)
+13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0 = 0
+14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_0/angular_velocity = 0.0
+14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
+14:4/0/custom_data_0 = &"Inventory"
+15:4/0 = 0
+15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_0/angular_velocity = 0.0
+15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_1/angular_velocity = 0.0
+16:4/0 = 0
+16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_0/angular_velocity = 0.0
+16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_1/angular_velocity = 0.0
+8:5/0 = 0
+8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_0/angular_velocity = 0.0
+8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_1/angular_velocity = 0.0
+9:5/0 = 0
+9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_0/angular_velocity = 0.0
+9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_1/angular_velocity = 0.0
+10:5/0 = 0
+10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_0/angular_velocity = 0.0
+10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_1/angular_velocity = 0.0
+11:5/0 = 0
+11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_0/angular_velocity = 0.0
+11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_1/angular_velocity = 0.0
+12:5/0 = 0
+12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_0/angular_velocity = 0.0
+12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_1/angular_velocity = 0.0
+13:5/0 = 0
+13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_0/angular_velocity = 0.0
+13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_1/angular_velocity = 0.0
+14:5/0 = 0
+14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_0/angular_velocity = 0.0
+14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_1/angular_velocity = 0.0
+15:5/0 = 0
+15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_0/angular_velocity = 0.0
+15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_1/angular_velocity = 0.0
+16:5/0 = 0
+16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_0/angular_velocity = 0.0
+16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_1/angular_velocity = 0.0
+8:6/0 = 0
+8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_0/angular_velocity = 0.0
+8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_1/angular_velocity = 0.0
+9:6/0 = 0
+9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_0/angular_velocity = 0.0
+9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_1/angular_velocity = 0.0
+10:6/0 = 0
+10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_0/angular_velocity = 0.0
+10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_1/angular_velocity = 0.0
+11:6/0 = 0
+11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_0/angular_velocity = 0.0
+11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5)
+11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_1/angular_velocity = 0.0
+12:6/0 = 0
+12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_0/angular_velocity = 0.0
+12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_1/angular_velocity = 0.0
+13:6/0 = 0
+13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_0/angular_velocity = 0.0
+13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8)
+13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_1/angular_velocity = 0.0
+14:6/0 = 0
+14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_0/angular_velocity = 0.0
+14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_1/angular_velocity = 0.0
+15:6/0 = 0
+15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_0/angular_velocity = 0.0
+15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_1/angular_velocity = 0.0
+16:6/0 = 0
+16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_0/angular_velocity = 0.0
+16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_1/angular_velocity = 0.0
+
+[sub_resource type="TileSet" id="TileSet_kf7eg"]
+physics_layer_0/collision_layer = 1
+physics_layer_1/collision_layer = 2
+physics_layer_1/collision_mask = 2
+custom_data_layer_0/name = "Type"
+custom_data_layer_0/type = 21
+sources/0 = SubResource("TileSetAtlasSource_easgx")
+
+[sub_resource type="Resource" id="Resource_ct1eh"]
+script = ExtResource("7_ne05h")
+duration = 0.9
+transition = 2
+ease = 2
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_xmxri"]
+size = Vector2(790, 410)
+
+[sub_resource type="Resource" id="Resource_exr3j"]
+script = ExtResource("7_ne05h")
+duration = 0.9
+transition = 2
+ease = 2
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_wtfjw"]
+size = Vector2(1530, 700)
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_daeuh"]
+size = Vector2(1027.5, 610.5)
+
+[node name="ExampleScene2D" type="Node2D"]
+script = ExtResource("1_bwr3f")
+
+[node name="Background" type="CanvasLayer" parent="."]
+layer = -3
+
+[node name="ColorRect" type="ColorRect" parent="Background"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -311.0
+offset_top = -173.0
+offset_right = 981.0
+offset_bottom = 548.0
+grow_horizontal = 2
+grow_vertical = 2
+auto_translate = false
+localize_numeral_system = false
+color = Color(0.137255, 0.14902, 0.196078, 1)
+metadata/_edit_lock_ = true
+
+[node name="TileMap" type="TileMap" parent="."]
+z_index = -1
+position = Vector2(-97, 0)
+scale = Vector2(3, 3)
+tile_set = SubResource("TileSet_kf7eg")
+format = 2
+layer_0/name = "Background"
+layer_0/tile_data = PackedInt32Array(-458743, 851968, 6, -458744, 786432, 6, -458745, 786432, 6, -458746, 786432, 6, -458747, 786432, 6, -458748, 786432, 6, -458749, 786432, 6, -458750, 786432, 6, -458751, 786432, 6, -393218, 786432, 6, -393219, 786432, 6, -393220, 786432, 6, -393221, 720896, 6, -458752, 786432, 6, -393217, 786432, 6, -524279, 851968, 5, -589815, 851968, 5, -655351, 851968, 5, -720887, 851968, 4, -720888, 786432, 4, -720889, 786432, 4, -720890, 786432, 4, -720891, 786432, 4, -720892, 786432, 4, -720893, 786432, 4, -720894, 786432, 4, -720895, 786432, 4, -720896, 786432, 4, -655361, 786432, 4, -655362, 786432, 4, -655363, 786432, 4, -655364, 786432, 4, -655365, 720896, 4, -589829, 720896, 5, -524293, 720896, 5, -458757, 720896, 5, -589828, 786432, 5, -524292, 786432, 5, -458756, 786432, 5, -589827, 786432, 5, -524291, 786432, 5, -458755, 786432, 5, -589826, 786432, 5, -524290, 786432, 5, -458754, 786432, 5, -589825, 786432, 5, -524289, 786432, 5, -458753, 786432, 5, -655360, 786432, 5, -589824, 786432, 5, -524288, 786432, 5, -655359, 786432, 5, -589823, 786432, 5, -524287, 786432, 5, -655358, 786432, 5, -589822, 786432, 5, -524286, 786432, 5, -655357, 786432, 5, -589821, 786432, 5, -524285, 786432, 5, -655356, 786432, 5, -589820, 786432, 5, -524284, 786432, 5, -655355, 786432, 5, -589819, 786432, 5, -524283, 786432, 5, -655354, 786432, 5, -589818, 786432, 5, -524282, 786432, 5, -655353, 786432, 5, -589817, 786432, 5, -524281, 786432, 5, -655352, 786432, 5, -589816, 786432, 5, -524280, 786432, 5)
+layer_1/name = "Terrain"
+layer_1/z_index = 1
+layer_1/tile_data = PackedInt32Array(65533, 720896, 0, 65534, 720896, 0, 65535, 720896, 0, 0, 720896, 0, 1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65532, 720896, 0, 65531, 655360, 0, 131067, 655360, 1, 196603, 655360, 1, 262139, 655360, 1, 327675, 655360, 1, 393211, 655360, 1, 131068, 720896, 1, 196604, 720896, 1, 262140, 720896, 1, 327676, 720896, 1, 393212, 720896, 1, 131069, 720896, 1, 196605, 720896, 1, 262141, 720896, 1, 327677, 720896, 1, 393213, 720896, 1, 131070, 720896, 1, 196606, 720896, 1, 262142, 720896, 1, 327678, 720896, 1, 393214, 720896, 1, 131071, 720896, 1, 196607, 720896, 1, 262143, 720896, 1, 327679, 720896, 1, 393215, 720896, 1, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 720896, 1, 327681, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 65540, 720896, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 720896, 1, 327685, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 720896, 1, 262152, 720896, 1, 327688, 720896, 1, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1)
+
+[node name="TileMap2" type="TileMap" parent="."]
+z_index = -1
+scale = Vector2(3, 3)
+tile_set = SubResource("TileSet_kf7eg")
+format = 2
+layer_0/name = "Background"
+layer_1/name = "Terrain"
+layer_1/z_index = 1
+layer_1/tile_data = PackedInt32Array(8, 786432, 4, 9, 786432, 4, 10, 786432, 4, 11, 786432, 4, 12, 786432, 4, 13, 786432, 4, 14, 786432, 4, 65528, 851968, 5, 65527, 786432, 5, 65526, 786432, 5, 65525, 786432, 5, 65524, 786432, 5, 65523, 786432, 5, 65544, 786432, 5, 131080, 786432, 5, 196616, 786432, 5, 262152, 786432, 5, 65545, 786432, 5, 131081, 786432, 5, 196617, 786432, 5, 262153, 786432, 5, 65546, 786432, 5, 131082, 786432, 5, 196618, 786432, 5, 262154, 786432, 5, 65547, 786432, 5, 131083, 786432, 5, 196619, 786432, 5, 262155, 786432, 5, 65548, 786432, 5, 131084, 786432, 5, 196620, 786432, 5, 262156, 786432, 5, 65549, 786432, 5, 131085, 786432, 5, 196621, 786432, 5, 262157, 786432, 5, 65550, 786432, 5, 131086, 786432, 5, 196622, 786432, 5, 262158, 786432, 5, 327694, 786432, 5, 327693, 786432, 5, 327692, 786432, 5, 327691, 786432, 5, 327690, 786432, 5, 327689, 786432, 5, 327688, 786432, 5, -131089, 720896, 5, -65553, 720896, 5, -17, 720896, 5, 65519, 720896, 6, -131088, 786432, 5, -65552, 786432, 5, -16, 786432, 5, 65520, 786432, 5, -131087, 786432, 5, -65551, 786432, 5, -15, 786432, 5, 65521, 786432, 5, -131086, 786432, 5, -65550, 786432, 5, -14, 786432, 5, 65522, 786432, 5, -131085, 786432, 5, -65549, 786432, 5, -13, 786432, 5, -131084, 786432, 5, -65548, 786432, 5, -12, 786432, 5, -131083, 786432, 5, -65547, 786432, 5, -11, 786432, 5, -131082, 786432, 5, -65546, 786432, 5, -10, 786432, 5, -131081, 786432, 5, -65545, 786432, 5, -9, 786432, 5, -131080, 851968, 5, -65544, 851968, 5, -8, 851968, 5, 131064, 851968, 5, 196600, 851968, 5, 262136, 851968, 5, 327672, 851968, 5, 393208, 851968, 5, 131056, 786432, 5, 196592, 786432, 5, 262128, 786432, 5, 327664, 786432, 5, 393200, 786432, 5, 131057, 786432, 5, 196593, 786432, 5, 262129, 786432, 5, 327665, 786432, 5, 393201, 786432, 5, 131058, 786432, 5, 196594, 786432, 5, 262130, 786432, 5, 327666, 786432, 5, 393202, 786432, 5, 131059, 786432, 5, 196595, 786432, 5, 262131, 786432, 5, 327667, 786432, 5, 393203, 786432, 5, 131060, 786432, 5, 196596, 786432, 5, 262132, 786432, 5, 327668, 786432, 5, 393204, 786432, 5, 131061, 786432, 5, 196597, 786432, 5, 262133, 786432, 5, 327669, 786432, 5, 393205, 786432, 5, 131062, 786432, 5, 196598, 786432, 5, 262134, 786432, 5, 327670, 786432, 5, 393206, 786432, 5, 131063, 786432, 5, 196599, 786432, 5, 262135, 786432, 5, 327671, 786432, 5, 393207, 786432, 5, 17, 786432, 4, 65553, 786432, 5, 131089, 786432, 5, 196625, 786432, 5, 262161, 786432, 5, 327697, 786432, 5, 18, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 327698, 786432, 5, 15, 786432, 4, 65551, 786432, 5, 131087, 786432, 5, 196623, 786432, 5, 262159, 786432, 5, 327695, 786432, 5, 16, 786432, 4, 65552, 786432, 5, 131088, 786432, 5, 196624, 786432, 5, 262160, 786432, 5, 327696, 786432, 5, 19, 786432, 4, 65555, 786432, 5, 131091, 786432, 5, 196627, 786432, 5, 262163, 786432, 5, 327699, 786432, 5, -458769, 720896, 5, -393233, 720896, 5, -458768, 786432, 5, -393232, 786432, 5, -458767, 786432, 5, -393231, 786432, 5, -458766, 786432, 5, -393230, 786432, 5, -458765, 786432, 5, -393229, 786432, 5, -458764, 786432, 5, -393228, 786432, 5, -458763, 786432, 5, -393227, 786432, 5, -458762, 786432, 5, -393226, 786432, 5, -458761, 786432, 5, -393225, 786432, 5, -458760, 851968, 5, -393224, 851968, 5, -655377, 720896, 4, -589841, 720896, 5, -524305, 720896, 5, -655376, 786432, 4, -589840, 786432, 5, -524304, 786432, 5, -655375, 786432, 4, -589839, 786432, 5, -524303, 786432, 5, -655374, 786432, 4, -589838, 786432, 5, -524302, 786432, 5, -655373, 786432, 4, -589837, 786432, 5, -524301, 786432, 5, -655372, 786432, 4, -589836, 786432, 5, -524300, 786432, 5, -655371, 786432, 4, -589835, 786432, 5, -524299, 786432, 5, -655370, 786432, 4, -589834, 786432, 5, -524298, 786432, 5, -655369, 786432, 4, -589833, 786432, 5, -524297, 786432, 5, -655368, 851968, 4, -589832, 851968, 5, -524296, 851968, 5, -327697, 720896, 5, -327696, 786432, 5, -327695, 786432, 5, -327694, 786432, 5, -327693, 786432, 5, -327692, 786432, 5, -327691, 786432, 5, -327690, 786432, 5, -327689, 786432, 5, -327688, 851968, 5, -262161, 720896, 5, -262160, 786432, 5, -262159, 786432, 5, -262158, 786432, 5, -262157, 786432, 5, -262156, 786432, 5, -262155, 786432, 5, -262154, 786432, 5, -262153, 786432, 5, -262152, 851968, 5, -196625, 720896, 5, -196624, 786432, 5, -196623, 786432, 5, -196622, 786432, 5, -196621, 786432, 5, -196620, 786432, 5, -196619, 786432, 5, -196618, 786432, 5, -196617, 786432, 5, -196616, 851968, 5, 20, 786432, 4, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 327700, 786432, 5, 21, 786432, 4, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 327701, 786432, 5, 22, 786432, 4, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 786432, 5, 327702, 786432, 5, 23, 786432, 4, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327703, 786432, 5, 24, 786432, 4, 65560, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 25, 786432, 4, 65561, 786432, 5, 131097, 786432, 5, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 26, 786432, 4, 65562, 786432, 5, 131098, 786432, 5, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 27, 786432, 4, 65563, 786432, 5, 131099, 786432, 5, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, -65498, 917504, 3, 38, 786432, 4, 65574, 786432, 5, 131110, 786432, 5, 196646, 786432, 5, 262182, 786432, 5, 327718, 786432, 5, 39, 786432, 4, 65575, 786432, 5, 131111, 786432, 5, 196647, 786432, 5, 262183, 786432, 5, 327719, 786432, 5, -65496, 983040, 3, 40, 786432, 4, 65576, 786432, 5, 131112, 786432, 5, 196648, 786432, 5, 262184, 786432, 5, 327720, 786432, 5, -65495, 983040, 3, 41, 786432, 4, 65577, 786432, 5, 131113, 786432, 5, 196649, 786432, 5, 262185, 786432, 5, 327721, 786432, 5, -65494, 983040, 3, 42, 786432, 4, 65578, 786432, 5, 131114, 786432, 5, 196650, 786432, 5, 262186, 786432, 5, 327722, 786432, 5, -65493, 983040, 3, 43, 786432, 4, 65579, 786432, 5, 131115, 786432, 5, 196651, 786432, 5, 262187, 786432, 5, 327723, 786432, 5, -65492, 983040, 3, 44, 786432, 4, 65580, 786432, 5, 131116, 786432, 5, 196652, 786432, 5, 262188, 786432, 5, 327724, 786432, 5, -65491, 983040, 3, 45, 786432, 4, 65581, 786432, 5, 131117, 786432, 5, 196653, 786432, 5, 262189, 786432, 5, 327725, 786432, 5, -65490, 983040, 3, 46, 786432, 4, 65582, 786432, 5, 131118, 786432, 5, 196654, 786432, 5, 262190, 786432, 5, 327726, 786432, 5, -65489, 983040, 3, 47, 786432, 4, 65583, 786432, 5, 131119, 786432, 5, 196655, 786432, 5, 262191, 786432, 5, 327727, 786432, 5, -65488, 1048576, 3, 48, 786432, 4, 65584, 786432, 5, 131120, 786432, 5, 196656, 786432, 5, 262192, 786432, 5, 327728, 786432, 5, 49, 851968, 4, 65585, 851968, 5, 131121, 851968, 5, 196657, 851968, 5, 262193, 851968, 5, 327729, 851968, 5, -65497, 983040, 3, -589774, 720896, 4, -524238, 720896, 5, -458702, 720896, 5, -393166, 720896, 5, -327630, 720896, 5, -262094, 720896, 5, -196558, 720896, 5, -131022, 720896, 5, -65486, 720896, 5, 50, 720896, 5, 65586, 720896, 5, 131122, 720896, 5, 196658, 720896, 5, 262194, 720896, 5, 327730, 720896, 5, -589773, 786432, 4, -524237, 786432, 5, -458701, 786432, 5, -393165, 786432, 5, -327629, 786432, 5, -262093, 786432, 5, -196557, 786432, 5, -131021, 786432, 5, -65485, 786432, 5, 51, 786432, 5, 65587, 786432, 5, 131123, 786432, 5, 196659, 786432, 5, 262195, 786432, 5, 327731, 786432, 5, -589772, 786432, 4, -524236, 786432, 5, -458700, 786432, 5, -393164, 786432, 5, -327628, 786432, 5, -262092, 786432, 5, -196556, 786432, 5, -131020, 786432, 5, -65484, 786432, 5, 52, 786432, 5, 65588, 786432, 5, 131124, 786432, 5, 196660, 786432, 5, 262196, 786432, 5, 327732, 786432, 5, -589771, 786432, 4, -524235, 786432, 5, -458699, 786432, 5, -393163, 786432, 5, -327627, 786432, 5, -262091, 786432, 5, -196555, 786432, 5, -131019, 786432, 5, -65483, 786432, 5, 53, 786432, 5, 65589, 786432, 5, 131125, 786432, 5, 196661, 786432, 5, 262197, 786432, 5, 327733, 786432, 5, -589770, 786432, 4, -524234, 786432, 5, -458698, 786432, 5, -393162, 786432, 5, -327626, 786432, 5, -262090, 786432, 5, -196554, 786432, 5, -131018, 786432, 5, -65482, 786432, 5, 54, 786432, 5, 65590, 786432, 5, 131126, 786432, 5, 196662, 786432, 5, 262198, 786432, 5, 327734, 786432, 5, -589769, 786432, 4, -524233, 786432, 5, -458697, 786432, 5, -393161, 786432, 5, -327625, 786432, 5, -262089, 786432, 5, -196553, 786432, 5, -131017, 786432, 5, -65481, 786432, 5, 55, 786432, 5, 65591, 786432, 5, 131127, 786432, 5, 196663, 786432, 5, 262199, 786432, 5, 327735, 786432, 5, -589768, 786432, 4, -524232, 786432, 5, -458696, 786432, 5, -393160, 786432, 5, -327624, 786432, 5, -262088, 786432, 5, -196552, 786432, 5, -131016, 786432, 5, -65480, 786432, 5, 56, 786432, 5, 65592, 786432, 5, 131128, 786432, 5, 196664, 786432, 5, 262200, 786432, 5, 327736, 786432, 5, -589767, 786432, 4, -524231, 786432, 5, -458695, 786432, 5, -393159, 786432, 5, -327623, 786432, 5, -262087, 786432, 5, -196551, 786432, 5, -131015, 786432, 5, -65479, 786432, 5, 57, 786432, 5, 65593, 786432, 5, 131129, 786432, 5, 196665, 786432, 5, 262201, 786432, 5, 327737, 786432, 5, -589766, 786432, 4, -524230, 786432, 5, -458694, 786432, 5, -393158, 786432, 5, -327622, 786432, 5, -262086, 786432, 5, -196550, 786432, 5, -131014, 786432, 5, -65478, 786432, 5, 58, 786432, 5, 65594, 786432, 5, 131130, 786432, 5, 196666, 786432, 5, 262202, 786432, 5, 327738, 786432, 5, -589765, 851968, 4, -524229, 851968, 5, -458693, 851968, 5, -393157, 851968, 5, -327621, 851968, 5, -262085, 851968, 5, -196549, 851968, 5, -131013, 851968, 5, -65477, 851968, 5, 59, 851968, 5, 65595, 851968, 5, 131131, 851968, 5, 196667, 851968, 5, 262203, 851968, 5, 327739, 851968, 5, 28, 786432, 4, 65564, 786432, 5, 131100, 786432, 5, 196636, 786432, 5, 262172, 786432, 5, 327708, 786432, 5, 29, 786432, 4, 65565, 786432, 5, 131101, 786432, 5, 196637, 786432, 5, 262173, 786432, 5, 327709, 786432, 5, 30, 786432, 4, 65566, 786432, 5, 131102, 786432, 5, 196638, 786432, 5, 262174, 786432, 5, 327710, 786432, 5, 31, 786432, 4, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 32, 786432, 4, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 33, 786432, 4, 65569, 786432, 5, 131105, 786432, 5, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 34, 786432, 4, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 786432, 5, 327714, 786432, 5, 35, 786432, 4, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 36, 786432, 4, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 37, 786432, 4, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, -65487, 458752, 6, -131023, 458752, 5, -196559, 458752, 5, -262095, 458752, 5, -327631, 458752, 5, -393167, 458752, 5, -458703, 458752, 5, -524239, 458752, 5, -589775, 458752, 4)
+
+[node name="UI" type="CanvasLayer" parent="."]
+
+[node name="UIInventory" parent="UI" instance=ExtResource("3_cysy4")]
+unique_name_in_owner = true
+visible = false
+
+[node name="UISign" parent="UI" instance=ExtResource("4_qqut6")]
+unique_name_in_owner = true
+visible = false
+
+[node name="CharacterBody2D" parent="." instance=ExtResource("5_yv8tn")]
+unique_name_in_owner = true
+position = Vector2(66, -50)
+script = ExtResource("6_68ewj")
+
+[node name="RoomLeftPhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_target")]
+unique_name_in_owner = true
+position = Vector2(66, -113.205)
+script = ExtResource("6_2n5r1")
+priority = 5
+follow_mode = 2
+follow_target = NodePath("../CharacterBody2D")
+zoom = Vector2(2, 2)
+tween_resource = SubResource("Resource_ct1eh")
+follow_offset = Vector2(0, -63.205)
+follow_damping = true
+draw_limits = true
+limit_target = NodePath("../TileMap")
+limit_margin = Vector4i(-50, 0, -50, 0)
+
+[node name="RoomLeftArea2D" type="Area2D" parent="."]
+unique_name_in_owner = true
+position = Vector2(117, -174)
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomLeftArea2D"]
+position = Vector2(-79, 43)
+shape = SubResource("RectangleShape2D_xmxri")
+debug_color = Color(0, 0.6, 0.701961, 0.0313726)
+
+[node name="RoomCentrePhantomCamera2D" type="Node2D" parent="."]
+unique_name_in_owner = true
+position = Vector2(1474, -149)
+script = ExtResource("6_2n5r1")
+follow_mode = 2
+zoom = Vector2(1.5, 1.5)
+tween_resource = SubResource("Resource_exr3j")
+follow_damping = true
+draw_limits = true
+limit_target = NodePath("../RoomCentreArea2D/CollisionShape2D")
+
+[node name="RoomCentreArea2D" type="Area2D" parent="."]
+unique_name_in_owner = true
+position = Vector2(755, -179)
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomCentreArea2D"]
+position = Vector2(338, -28)
+shape = SubResource("RectangleShape2D_wtfjw")
+debug_color = Color(0, 0.6, 0.701961, 0)
+
+[node name="RoomRightArea2D" type="Area2D" parent="."]
+unique_name_in_owner = true
+position = Vector2(2065, -160)
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomRightArea2D"]
+position = Vector2(255.75, -3.25)
+shape = SubResource("RectangleShape2D_daeuh")
+debug_color = Color(0, 0.6, 0.701961, 0)
+
+[node name="RoomRightPhantomCamera2D" type="Node2D" parent="."]
+unique_name_in_owner = true
+position = Vector2(2347, -156)
+scale = Vector2(1.0024, 1)
+script = ExtResource("6_2n5r1")
+follow_mode = 2
+zoom = Vector2(2, 2)
+tween_resource = SubResource("Resource_exr3j")
+follow_damping = true
+draw_limits = true
+
+[node name="Camera2D" type="Camera2D" parent="."]
+position = Vector2(66, -113.205)
+zoom = Vector2(2, 2)
+limit_left = -387
+limit_top = -528
+limit_right = 433
+limit_bottom = 288
+position_smoothing_speed = 10.0
+editor_draw_limits = true
+
+[node name="PhantomCameraHost" type="Node" parent="Camera2D"]
+script = ExtResource("8_hulu3")
diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_tweening_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_tweening_example_scene.tscn
new file mode 100644 (file)
index 0000000..4831baf
--- /dev/null
@@ -0,0 +1,793 @@
+[gd_scene load_steps=20 format=3 uid="uid://bvpp5na5054jd"]
+
+[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_h1rbo"]
+[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_1f2t2"]
+[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/ui_sign.tscn" id="3_o6nri"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="4_j7670"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="5_gvv7r"]
+[ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_2d_tween.tres" id="6_rwobr"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="7_ylx0h"]
+[ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="8_ytsgf"]
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/2d_trigger_area.gd" id="9_3r1pw"]
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="9_5jy5e"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="10_guf2v"]
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"]
+texture = ExtResource("1_h1rbo")
+0:0/0 = 0
+0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_0/angular_velocity = 0.0
+0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_1/angular_velocity = 0.0
+1:0/0 = 0
+1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_0/angular_velocity = 0.0
+1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_1/angular_velocity = 0.0
+2:0/0 = 0
+2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_0/angular_velocity = 0.0
+2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_1/angular_velocity = 0.0
+3:0/0 = 0
+3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_0/angular_velocity = 0.0
+3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_1/angular_velocity = 0.0
+4:0/0 = 0
+4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_0/angular_velocity = 0.0
+4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_1/angular_velocity = 0.0
+5:0/0 = 0
+5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_0/angular_velocity = 0.0
+5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_1/angular_velocity = 0.0
+6:0/0 = 0
+6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_0/angular_velocity = 0.0
+6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_1/angular_velocity = 0.0
+7:0/0 = 0
+7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_0/angular_velocity = 0.0
+7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_1/angular_velocity = 0.0
+0:1/0 = 0
+0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_0/angular_velocity = 0.0
+0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_1/angular_velocity = 0.0
+1:1/0 = 0
+1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_0/angular_velocity = 0.0
+1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_1/angular_velocity = 0.0
+2:1/0 = 0
+2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_0/angular_velocity = 0.0
+2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_1/angular_velocity = 0.0
+3:1/0 = 0
+3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_0/angular_velocity = 0.0
+3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_1/angular_velocity = 0.0
+4:1/0 = 0
+4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_0/angular_velocity = 0.0
+4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_1/angular_velocity = 0.0
+5:1/0 = 0
+5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_0/angular_velocity = 0.0
+5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_1/angular_velocity = 0.0
+7:1/0 = 0
+7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_0/angular_velocity = 0.0
+7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_1/angular_velocity = 0.0
+2:2/0 = 0
+2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_0/angular_velocity = 0.0
+2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_1/angular_velocity = 0.0
+3:2/0 = 0
+3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_0/angular_velocity = 0.0
+3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_1/angular_velocity = 0.0
+4:2/0 = 0
+4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_0/angular_velocity = 0.0
+4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_1/angular_velocity = 0.0
+7:2/0 = 0
+7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_0/angular_velocity = 0.0
+7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_1/angular_velocity = 0.0
+3:3/0 = 0
+3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_0/angular_velocity = 0.0
+3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_1/angular_velocity = 0.0
+4:3/0 = 0
+4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_0/angular_velocity = 0.0
+4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_1/angular_velocity = 0.0
+7:3/0 = 0
+7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_0/angular_velocity = 0.0
+7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_1/angular_velocity = 0.0
+3:4/0 = 0
+3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_0/angular_velocity = 0.0
+3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_1/angular_velocity = 0.0
+4:4/0 = 0
+4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_0/angular_velocity = 0.0
+4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_1/angular_velocity = 0.0
+5:4/0 = 0
+5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_0/angular_velocity = 0.0
+5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_1/angular_velocity = 0.0
+7:4/0 = 0
+7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_0/angular_velocity = 0.0
+7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_1/angular_velocity = 0.0
+3:5/0 = 0
+3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_0/angular_velocity = 0.0
+3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_1/angular_velocity = 0.0
+4:5/0 = 0
+4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_0/angular_velocity = 0.0
+4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_1/angular_velocity = 0.0
+7:5/0 = 0
+7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_0/angular_velocity = 0.0
+7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_1/angular_velocity = 0.0
+3:6/0 = 0
+3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_0/angular_velocity = 0.0
+3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_1/angular_velocity = 0.0
+4:6/0 = 0
+4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_0/angular_velocity = 0.0
+4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_1/angular_velocity = 0.0
+7:6/0 = 0
+7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_0/angular_velocity = 0.0
+7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_1/angular_velocity = 0.0
+2:7/0 = 0
+2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_0/angular_velocity = 0.0
+2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_1/angular_velocity = 0.0
+3:7/0 = 0
+3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_0/angular_velocity = 0.0
+3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_1/angular_velocity = 0.0
+4:7/0 = 0
+4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_0/angular_velocity = 0.0
+4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_1/angular_velocity = 0.0
+5:7/0 = 0
+5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_0/angular_velocity = 0.0
+5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_1/angular_velocity = 0.0
+8:0/0 = 0
+8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_0/angular_velocity = 0.0
+8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_1/angular_velocity = 0.0
+9:0/0 = 0
+9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_0/angular_velocity = 0.0
+9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_1/angular_velocity = 0.0
+10:0/0 = 0
+10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_0/angular_velocity = 0.0
+10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_1/angular_velocity = 0.0
+11:0/0 = 0
+11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_0/angular_velocity = 0.0
+11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_1/angular_velocity = 0.0
+12:0/0 = 0
+12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_0/angular_velocity = 0.0
+12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_1/angular_velocity = 0.0
+13:0/0 = 0
+13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_0/angular_velocity = 0.0
+13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0 = 0
+14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_0/angular_velocity = 0.0
+14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8)
+14:0/0/custom_data_0 = &"Sign"
+15:0/0 = 0
+15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_0/angular_velocity = 0.0
+15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_1/angular_velocity = 0.0
+16:0/0 = 0
+16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_0/angular_velocity = 0.0
+16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_1/angular_velocity = 0.0
+8:1/0 = 0
+8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_0/angular_velocity = 0.0
+8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_1/angular_velocity = 0.0
+9:1/0 = 0
+9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_0/angular_velocity = 0.0
+9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_1/angular_velocity = 0.0
+10:1/0 = 0
+10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_0/angular_velocity = 0.0
+10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_1/angular_velocity = 0.0
+11:1/0 = 0
+11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_0/angular_velocity = 0.0
+11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_1/angular_velocity = 0.0
+12:1/0 = 0
+12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_0/angular_velocity = 0.0
+12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_1/angular_velocity = 0.0
+13:1/0 = 0
+13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_0/angular_velocity = 0.0
+13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_1/angular_velocity = 0.0
+14:1/0 = 0
+14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_0/angular_velocity = 0.0
+14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_1/angular_velocity = 0.0
+15:1/0 = 0
+15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_0/angular_velocity = 0.0
+15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_1/angular_velocity = 0.0
+16:1/0 = 0
+16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_0/angular_velocity = 0.0
+16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_1/angular_velocity = 0.0
+8:2/0 = 0
+8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_0/angular_velocity = 0.0
+8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_1/angular_velocity = 0.0
+9:2/0 = 0
+9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_0/angular_velocity = 0.0
+9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_1/angular_velocity = 0.0
+10:2/0 = 0
+10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_0/angular_velocity = 0.0
+10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_1/angular_velocity = 0.0
+11:2/0 = 0
+11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_0/angular_velocity = 0.0
+11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_1/angular_velocity = 0.0
+12:2/0 = 0
+12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_0/angular_velocity = 0.0
+12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_1/angular_velocity = 0.0
+13:2/0 = 0
+13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_0/angular_velocity = 0.0
+13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_1/angular_velocity = 0.0
+14:2/0 = 0
+14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_0/angular_velocity = 0.0
+14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_1/angular_velocity = 0.0
+15:2/0 = 0
+15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_0/angular_velocity = 0.0
+15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_1/angular_velocity = 0.0
+16:2/0 = 0
+16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_0/angular_velocity = 0.0
+16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_1/angular_velocity = 0.0
+8:3/0 = 0
+8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_0/angular_velocity = 0.0
+8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_1/angular_velocity = 0.0
+9:3/0 = 0
+9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_0/angular_velocity = 0.0
+9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_1/angular_velocity = 0.0
+10:3/0 = 0
+10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_0/angular_velocity = 0.0
+10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_1/angular_velocity = 0.0
+11:3/0 = 0
+11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_0/angular_velocity = 0.0
+11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_1/angular_velocity = 0.0
+12:3/0 = 0
+12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_0/angular_velocity = 0.0
+12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_1/angular_velocity = 0.0
+13:3/0 = 0
+13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_0/angular_velocity = 0.0
+13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_1/angular_velocity = 0.0
+14:3/0 = 0
+14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_0/angular_velocity = 0.0
+14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_1/angular_velocity = 0.0
+15:3/0 = 0
+15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_0/angular_velocity = 0.0
+15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_1/angular_velocity = 0.0
+16:3/0 = 0
+16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_0/angular_velocity = 0.0
+16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_1/angular_velocity = 0.0
+8:4/0 = 0
+8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_0/angular_velocity = 0.0
+8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_1/angular_velocity = 0.0
+9:4/0 = 0
+9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_0/angular_velocity = 0.0
+9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_1/angular_velocity = 0.0
+10:4/0 = 0
+10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_0/angular_velocity = 0.0
+10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_1/angular_velocity = 0.0
+11:4/0 = 0
+11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_0/angular_velocity = 0.0
+11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8)
+11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_1/angular_velocity = 0.0
+12:4/0 = 0
+12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_0/angular_velocity = 0.0
+12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_1/angular_velocity = 0.0
+13:4/0 = 0
+13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_0/angular_velocity = 0.0
+13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8)
+13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0 = 0
+14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_0/angular_velocity = 0.0
+14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
+14:4/0/custom_data_0 = &"Inventory"
+15:4/0 = 0
+15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_0/angular_velocity = 0.0
+15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_1/angular_velocity = 0.0
+16:4/0 = 0
+16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_0/angular_velocity = 0.0
+16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_1/angular_velocity = 0.0
+8:5/0 = 0
+8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_0/angular_velocity = 0.0
+8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_1/angular_velocity = 0.0
+9:5/0 = 0
+9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_0/angular_velocity = 0.0
+9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_1/angular_velocity = 0.0
+10:5/0 = 0
+10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_0/angular_velocity = 0.0
+10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_1/angular_velocity = 0.0
+11:5/0 = 0
+11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_0/angular_velocity = 0.0
+11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_1/angular_velocity = 0.0
+12:5/0 = 0
+12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_0/angular_velocity = 0.0
+12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_1/angular_velocity = 0.0
+13:5/0 = 0
+13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_0/angular_velocity = 0.0
+13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_1/angular_velocity = 0.0
+14:5/0 = 0
+14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_0/angular_velocity = 0.0
+14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_1/angular_velocity = 0.0
+15:5/0 = 0
+15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_0/angular_velocity = 0.0
+15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_1/angular_velocity = 0.0
+16:5/0 = 0
+16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_0/angular_velocity = 0.0
+16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_1/angular_velocity = 0.0
+8:6/0 = 0
+8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_0/angular_velocity = 0.0
+8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_1/angular_velocity = 0.0
+9:6/0 = 0
+9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_0/angular_velocity = 0.0
+9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_1/angular_velocity = 0.0
+10:6/0 = 0
+10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_0/angular_velocity = 0.0
+10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_1/angular_velocity = 0.0
+11:6/0 = 0
+11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_0/angular_velocity = 0.0
+11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5)
+11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_1/angular_velocity = 0.0
+12:6/0 = 0
+12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_0/angular_velocity = 0.0
+12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_1/angular_velocity = 0.0
+13:6/0 = 0
+13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_0/angular_velocity = 0.0
+13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8)
+13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_1/angular_velocity = 0.0
+14:6/0 = 0
+14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_0/angular_velocity = 0.0
+14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_1/angular_velocity = 0.0
+15:6/0 = 0
+15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_0/angular_velocity = 0.0
+15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_1/angular_velocity = 0.0
+16:6/0 = 0
+16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_0/angular_velocity = 0.0
+16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_1/angular_velocity = 0.0
+5:3/0 = 0
+5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_0/angular_velocity = 0.0
+5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_1/angular_velocity = 0.0
+
+[sub_resource type="TileSet" id="TileSet_kf7eg"]
+physics_layer_0/collision_layer = 1
+physics_layer_1/collision_layer = 2
+physics_layer_1/collision_mask = 2
+custom_data_layer_0/name = "Type"
+custom_data_layer_0/type = 21
+sources/0 = SubResource("TileSetAtlasSource_easgx")
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_tgk1y"]
+size = Vector2(140, 160)
+
+[sub_resource type="Resource" id="Resource_mtp70"]
+script = ExtResource("10_guf2v")
+duration = 0.6
+transition = 1
+ease = 2
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_clm0y"]
+size = Vector2(104, 160)
+
+[sub_resource type="Resource" id="Resource_8jg5c"]
+script = ExtResource("10_guf2v")
+duration = 0.3
+transition = 8
+ease = 2
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_uka0w"]
+size = Vector2(560, 160)
+
+[sub_resource type="Resource" id="Resource_e4e41"]
+script = ExtResource("10_guf2v")
+duration = 1.2
+transition = 10
+ease = 2
+
+[node name="ExampleScene2D" type="Node2D"]
+
+[node name="Background" type="CanvasLayer" parent="."]
+layer = -3
+
+[node name="ColorRect" type="ColorRect" parent="Background"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -311.0
+offset_top = -173.0
+offset_right = 981.0
+offset_bottom = 548.0
+grow_horizontal = 2
+grow_vertical = 2
+auto_translate = false
+localize_numeral_system = false
+color = Color(0.137255, 0.14902, 0.196078, 1)
+
+[node name="TileMap" type="TileMap" parent="."]
+z_index = -1
+scale = Vector2(3, 3)
+tile_set = SubResource("TileSet_kf7eg")
+format = 2
+layer_0/name = "Background"
+layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3)
+layer_1/name = "Terrain"
+layer_1/z_index = 1
+layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 655360, 6, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 655360, 6, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524281, 720896, 5, 524285, 786432, 5, 524284, 786432, 5, 524283, 786432, 5, 524282, 786432, 5, 589818, 786432, 5, 589819, 786432, 5, 589820, 786432, 5, 655356, 786432, 5, 655357, 786432, 5, 589821, 786432, 5, 655355, 786432, 5, 655354, 786432, 5, 720890, 786432, 5, 720891, 786432, 5, 720892, 786432, 5, 720893, 786432, 5, 720894, 851968, 5, 786429, 786432, 5, 786428, 786432, 5, 786427, 786432, 5, 786426, 786432, 5, 851962, 786432, 5, 917498, 786432, 5, 917499, 786432, 5, 851964, 786432, 5, 851965, 786432, 5, 917501, 786432, 5, 917500, 786432, 5, 851963, 786432, 5, 589817, 720896, 5, 655353, 720896, 5, 720889, 720896, 5, 786425, 720896, 5, 851961, 720896, 5, 917497, 720896, 5, 524286, 851968, 5, 589822, 851968, 5, 655358, 851968, 5, 786430, 851968, 5, 851966, 851968, 5, 917502, 851968, 5, 589824, 720896, 1, 655360, 720896, 1, 720896, 720896, 1, 786432, 720896, 1, 851968, 720896, 1, 589825, 720896, 1, 655361, 720896, 1, 720897, 720896, 1, 786433, 720896, 1, 851969, 720896, 1, 589826, 720896, 1, 655362, 720896, 1, 720898, 720896, 1, 786434, 720896, 1, 851970, 720896, 1, 589827, 720896, 1, 655363, 720896, 1, 720899, 720896, 1, 786435, 720896, 1, 851971, 720896, 1, 589828, 720896, 1, 655364, 720896, 1, 720900, 720896, 1, 786436, 720896, 1, 851972, 720896, 1, 589829, 720896, 1, 655365, 720896, 1, 720901, 720896, 1, 786437, 720896, 1, 851973, 720896, 1, 589830, 720896, 1, 655366, 720896, 1, 720902, 720896, 1, 786438, 720896, 1, 851974, 720896, 1, 589831, 720896, 1, 655367, 720896, 1, 720903, 720896, 1, 786439, 720896, 1, 851975, 720896, 1, 589832, 720896, 1, 655368, 720896, 1, 720904, 720896, 1, 786440, 720896, 1, 851976, 720896, 1, 589833, 786432, 1, 655369, 786432, 1, 720905, 786432, 1, 786441, 786432, 1, 851977, 786432, 1, 655359, 655360, 1, 720895, 655360, 1, 786431, 655360, 1, 851967, 655360, 1, 917503, 655360, 1, 589834, 720896, 1, 655370, 720896, 1, 720906, 720896, 1, 786442, 720896, 1, 851978, 720896, 1, 589835, 720896, 1, 655371, 720896, 1, 720907, 720896, 1, 786443, 720896, 1, 851979, 720896, 1, 589836, 720896, 1, 655372, 720896, 1, 720908, 720896, 1, 786444, 720896, 1, 851980, 720896, 1, 589837, 720896, 1, 655373, 720896, 1, 720909, 720896, 1, 786445, 720896, 1, 851981, 720896, 1, 589838, 720896, 1, 655374, 720896, 1, 720910, 720896, 1, 786446, 720896, 1, 851982, 720896, 1, 589839, 720896, 1, 655375, 720896, 1, 720911, 720896, 1, 786447, 720896, 1, 851983, 720896, 1, 589840, 720896, 1, 655376, 720896, 1, 720912, 720896, 1, 786448, 720896, 1, 851984, 720896, 1, 851985, 720896, 6, 851986, 786432, 6, 851987, 786432, 6, 851988, 786432, 6, 851989, 786432, 6, 851990, 786432, 6, 851991, 786432, 6, 851992, 786432, 6, 851993, 786432, 6, 851994, 786432, 6, 851995, 786432, 6, 851996, 786432, 6, 851997, 851968, 6, 524306, 786432, 5, 589842, 786432, 5, 655378, 786432, 5, 720914, 786432, 5, 786450, 786432, 5, 524307, 786432, 5, 589843, 786432, 5, 655379, 786432, 5, 720915, 786432, 5, 786451, 786432, 5, 524308, 786432, 5, 589844, 786432, 5, 655380, 786432, 5, 720916, 786432, 5, 786452, 786432, 5, 524309, 786432, 5, 589845, 786432, 5, 655381, 786432, 5, 720917, 786432, 5, 786453, 786432, 5, 524310, 786432, 5, 589846, 786432, 5, 655382, 786432, 5, 720918, 786432, 5, 786454, 786432, 5, 524311, 786432, 5, 589847, 786432, 5, 655383, 786432, 5, 720919, 786432, 5, 786455, 786432, 5, 524312, 786432, 5, 589848, 786432, 5, 655384, 786432, 5, 720920, 786432, 5, 786456, 786432, 5, 524313, 786432, 5, 589849, 786432, 5, 655385, 786432, 5, 720921, 786432, 5, 786457, 786432, 5, 524314, 786432, 5, 589850, 786432, 5, 655386, 786432, 5, 720922, 786432, 5, 786458, 786432, 5, 524315, 786432, 5, 589851, 786432, 5, 655387, 786432, 5, 720923, 786432, 5, 786459, 786432, 5, 524316, 786432, 5, 589852, 786432, 5, 655388, 786432, 5, 720924, 786432, 5, 786460, 786432, 5, 524305, 720896, 5, 589841, 720896, 5, 655377, 720896, 5, 720913, 720896, 5, 786449, 720896, 5, 524317, 851968, 5, 589853, 851968, 5, 655389, 851968, 5, 720925, 851968, 5, 786461, 851968, 5, -262106, 786432, 5, -196570, 786432, 5, -131034, 786432, 5, -65498, 786432, 5, 38, 786432, 5, 65574, 786432, 5, 131110, 655360, 6, 196646, 786432, 5, 262182, 786432, 5, 327718, 786432, 5, 393254, 786432, 5, 458790, 786432, 5, -262105, 786432, 5, -196569, 786432, 5, -131033, 786432, 5, -65497, 786432, 5, 39, 786432, 5, 65575, 786432, 5, 131111, 786432, 5, 196647, 786432, 5, 262183, 786432, 5, 327719, 786432, 5, 393255, 655360, 6, 458791, 786432, 5, -262104, 786432, 5, -196568, 786432, 5, -131032, 786432, 5, -65496, 786432, 5, 40, 655360, 6, 65576, 786432, 5, 131112, 786432, 5, 196648, 786432, 5, 262184, 655360, 6, 327720, 786432, 5, 393256, 786432, 5, 458792, 786432, 5, -262103, 786432, 5, -196567, 655360, 6, -131031, 786432, 5, -65495, 786432, 5, 41, 786432, 5, 65577, 786432, 5, 131113, 786432, 5, 196649, 786432, 5, 262185, 786432, 5, 327721, 786432, 5, 393257, 786432, 5, 458793, 786432, 5, -262102, 786432, 5, -196566, 786432, 5, -131030, 786432, 5, -65494, 786432, 5, 42, 786432, 5, 65578, 786432, 5, 131114, 655360, 6, 196650, 786432, 5, 262186, 786432, 5, 327722, 786432, 5, 393258, 786432, 5, 458794, 655360, 6, 524326, 786432, 6, 524327, 786432, 6, 524328, 786432, 6, 524329, 786432, 6, 524330, 786432, 6, -327642, 786432, 4, -327641, 786432, 4, -327640, 786432, 4, -327639, 786432, 4, -327638, 786432, 4, -327632, 851968, 4, -262096, 851968, 5, -196560, 851968, 5, -131024, 851968, 5, -65488, 851968, 5, 48, 851968, 5, 65584, 851968, 5, 131120, 851968, 5, 196656, 851968, 5, 262192, 851968, 5, 327728, 851968, 5, 393264, 851968, 5, 458800, 851968, 5, 524336, 851968, 6, -327637, 786432, 4, -327636, 786432, 4, -327635, 786432, 4, -327634, 786432, 4, -327633, 786432, 4, -262101, 786432, 5, -196565, 786432, 5, -131029, 655360, 6, -65493, 786432, 5, 43, 786432, 5, 65579, 786432, 5, 131115, 786432, 5, 196651, 786432, 5, 262187, 786432, 5, 327723, 655360, 6, 393259, 786432, 5, 458795, 786432, 5, -262100, 786432, 5, -196564, 786432, 5, -131028, 786432, 5, -65492, 786432, 5, 44, 655360, 6, 65580, 786432, 5, 131116, 786432, 5, 196652, 786432, 5, 262188, 786432, 5, 327724, 786432, 5, 393260, 786432, 5, 458796, 786432, 5, -262099, 786432, 5, -196563, 786432, 5, -131027, 786432, 5, -65491, 786432, 5, 45, 786432, 5, 65581, 655360, 6, 131117, 786432, 5, 196653, 786432, 5, 262189, 786432, 5, 327725, 786432, 5, 393261, 786432, 5, 458797, 786432, 5, -262098, 655360, 6, -196562, 786432, 5, -131026, 786432, 5, -65490, 786432, 5, 46, 786432, 5, 65582, 786432, 5, 131118, 786432, 5, 196654, 655360, 6, 262190, 786432, 5, 327726, 786432, 5, 393262, 786432, 5, 458798, 655360, 6, -262097, 786432, 5, -196561, 786432, 5, -131025, 786432, 5, -65489, 786432, 5, 47, 786432, 5, 65583, 786432, 5, 131119, 786432, 5, 196655, 786432, 5, 262191, 786432, 5, 327727, 786432, 5, 393263, 786432, 5, 458799, 786432, 5, 524331, 786432, 6, 524332, 786432, 6, 524333, 786432, 6, 524334, 786432, 6, 524335, 786432, 6)
+
+[node name="UI" type="CanvasLayer" parent="."]
+
+[node name="UIInventory" parent="UI" instance=ExtResource("2_1f2t2")]
+unique_name_in_owner = true
+visible = false
+
+[node name="UISign" parent="UI" instance=ExtResource("3_o6nri")]
+unique_name_in_owner = true
+visible = false
+
+[node name="Camera2D" type="Camera2D" parent="."]
+position = Vector2(227, -28)
+position_smoothing_speed = 10.0
+
+[node name="PhantomCameraHost" type="Node" parent="Camera2D"]
+script = ExtResource("4_j7670")
+
+[node name="Player" type="Node" parent="."]
+
+[node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")]
+unique_name_in_owner = true
+position = Vector2(227, -28)
+script = ExtResource("5_gvv7r")
+priority = 5
+follow_mode = 2
+follow_target = NodePath("../CharacterBody2D/PlayerVisuals")
+tween_resource = ExtResource("6_rwobr")
+tween_on_load = false
+follow_damping = true
+draw_limits = true
+
+[node name="Label" type="Label" parent="Player"]
+offset_left = 167.0
+offset_top = -132.0
+offset_right = 332.0
+offset_bottom = -68.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("7_ylx0h")
+text = "[WASD] to move
+[Space] to jump"
+
+[node name="CharacterBody2D" parent="Player" instance=ExtResource("8_ytsgf")]
+position = Vector2(227, -28)
+script = ExtResource("9_5jy5e")
+
+[node name="WideArea" type="Area2D" parent="." node_paths=PackedStringArray("area_pcam")]
+position = Vector2(393, -40)
+collision_layer = 2
+collision_mask = 2
+script = ExtResource("9_3r1pw")
+area_pcam = NodePath("PhantomCamera2D")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="WideArea"]
+position = Vector2(0, -40)
+shape = SubResource("RectangleShape2D_tgk1y")
+
+[node name="ColorRect" type="ColorRect" parent="WideArea"]
+offset_left = -70.0
+offset_top = -120.0
+offset_right = 70.0
+offset_bottom = 40.0
+size_flags_horizontal = 0
+size_flags_vertical = 0
+color = Color(0.556863, 0.447059, 0.545098, 0.698039)
+
+[node name="Label" type="Label" parent="WideArea"]
+offset_left = -77.0
+offset_top = -250.0
+offset_right = 76.0
+offset_bottom = -120.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("7_ylx0h")
+text = "Transition Type:
+Sine
+
+Duration:
+0.6s"
+horizontal_alignment = 1
+
+[node name="PhantomCamera2D" type="Node2D" parent="WideArea"]
+position = Vector2(4, -100)
+script = ExtResource("5_gvv7r")
+zoom = Vector2(0.8, 0.8)
+tween_resource = SubResource("Resource_mtp70")
+draw_limits = true
+
+[node name="UpperZoomArea" type="Area2D" parent="." node_paths=PackedStringArray("area_pcam")]
+position = Vector2(649, -135)
+collision_layer = 2
+collision_mask = 2
+script = ExtResource("9_3r1pw")
+area_pcam = NodePath("PhantomCamera2D")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="UpperZoomArea"]
+position = Vector2(0, -40)
+shape = SubResource("RectangleShape2D_clm0y")
+
+[node name="CollisionShape2D2" type="CollisionShape2D" parent="UpperZoomArea"]
+position = Vector2(0, -40)
+shape = SubResource("RectangleShape2D_clm0y")
+
+[node name="ColorRect" type="ColorRect" parent="UpperZoomArea"]
+offset_left = -52.0
+offset_top = -120.0
+offset_right = 52.0
+offset_bottom = 40.0
+size_flags_horizontal = 0
+size_flags_vertical = 0
+color = Color(0.556863, 0.447059, 0.545098, 0.698039)
+
+[node name="Label" type="Label" parent="UpperZoomArea"]
+offset_left = -74.0
+offset_top = -251.0
+offset_right = 79.0
+offset_bottom = -121.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("7_ylx0h")
+text = "Transition Type:
+Circ
+
+Duration:
+0.3s"
+horizontal_alignment = 1
+
+[node name="PhantomCamera2D" type="Node2D" parent="UpperZoomArea"]
+position = Vector2(2, -83)
+script = ExtResource("5_gvv7r")
+zoom = Vector2(2, 2)
+tween_resource = SubResource("Resource_8jg5c")
+draw_limits = true
+
+[node name="ForwardArea" type="Area2D" parent="." node_paths=PackedStringArray("area_pcam")]
+position = Vector2(1136, -38)
+collision_layer = 2
+collision_mask = 2
+script = ExtResource("9_3r1pw")
+area_pcam = NodePath("PhantomCamera2D")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="ForwardArea"]
+position = Vector2(0, -42)
+shape = SubResource("RectangleShape2D_uka0w")
+
+[node name="ColorRect" type="ColorRect" parent="ForwardArea"]
+offset_left = -280.0
+offset_top = -122.0
+offset_right = 280.0
+offset_bottom = 38.0
+size_flags_horizontal = 0
+size_flags_vertical = 0
+color = Color(0.556863, 0.447059, 0.545098, 0.698039)
+
+[node name="Label" type="Label" parent="ForwardArea"]
+offset_left = -76.0
+offset_top = -252.0
+offset_right = 77.0
+offset_bottom = -122.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("7_ylx0h")
+text = "Transition Type:
+Back
+
+Duration:
+1.2s"
+horizontal_alignment = 1
+
+[node name="PhantomCamera2D" type="Node2D" parent="ForwardArea"]
+position = Vector2(344, -46)
+script = ExtResource("5_gvv7r")
+zoom = Vector2(0.9, 0.9)
+tween_resource = SubResource("Resource_e4e41")
+draw_limits = true
diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_example_scene.tscn
new file mode 100644 (file)
index 0000000..46d40be
--- /dev/null
@@ -0,0 +1,641 @@
+[gd_scene load_steps=11 format=3 uid="uid://drvexsp2t0nfy"]
+
+[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_1utlo"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="2_mgsut"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="4_54fc4"]
+[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/ui_sign.tscn" id="6_kqt1v"]
+[ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_2d_tween.tres" id="6_pxbym"]
+[ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="7_62i3t"]
+[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="7_fdx1s"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="12_k4p0h"]
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"]
+texture = ExtResource("1_1utlo")
+0:0/0 = 0
+0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_0/angular_velocity = 0.0
+0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_1/angular_velocity = 0.0
+1:0/0 = 0
+1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_0/angular_velocity = 0.0
+1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_1/angular_velocity = 0.0
+2:0/0 = 0
+2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_0/angular_velocity = 0.0
+2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_1/angular_velocity = 0.0
+3:0/0 = 0
+3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_0/angular_velocity = 0.0
+3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_1/angular_velocity = 0.0
+4:0/0 = 0
+4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_0/angular_velocity = 0.0
+4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_1/angular_velocity = 0.0
+5:0/0 = 0
+5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_0/angular_velocity = 0.0
+5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_1/angular_velocity = 0.0
+6:0/0 = 0
+6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_0/angular_velocity = 0.0
+6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_1/angular_velocity = 0.0
+7:0/0 = 0
+7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_0/angular_velocity = 0.0
+7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_1/angular_velocity = 0.0
+0:1/0 = 0
+0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_0/angular_velocity = 0.0
+0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_1/angular_velocity = 0.0
+1:1/0 = 0
+1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_0/angular_velocity = 0.0
+1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_1/angular_velocity = 0.0
+2:1/0 = 0
+2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_0/angular_velocity = 0.0
+2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_1/angular_velocity = 0.0
+3:1/0 = 0
+3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_0/angular_velocity = 0.0
+3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_1/angular_velocity = 0.0
+4:1/0 = 0
+4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_0/angular_velocity = 0.0
+4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_1/angular_velocity = 0.0
+5:1/0 = 0
+5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_0/angular_velocity = 0.0
+5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_1/angular_velocity = 0.0
+7:1/0 = 0
+7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_0/angular_velocity = 0.0
+7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_1/angular_velocity = 0.0
+2:2/0 = 0
+2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_0/angular_velocity = 0.0
+2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_1/angular_velocity = 0.0
+3:2/0 = 0
+3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_0/angular_velocity = 0.0
+3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_1/angular_velocity = 0.0
+4:2/0 = 0
+4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_0/angular_velocity = 0.0
+4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_1/angular_velocity = 0.0
+7:2/0 = 0
+7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_0/angular_velocity = 0.0
+7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_1/angular_velocity = 0.0
+3:3/0 = 0
+3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_0/angular_velocity = 0.0
+3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_1/angular_velocity = 0.0
+4:3/0 = 0
+4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_0/angular_velocity = 0.0
+4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_1/angular_velocity = 0.0
+5:3/0 = 0
+5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_0/angular_velocity = 0.0
+5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_1/angular_velocity = 0.0
+7:3/0 = 0
+7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_0/angular_velocity = 0.0
+7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_1/angular_velocity = 0.0
+3:4/0 = 0
+3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_0/angular_velocity = 0.0
+3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_1/angular_velocity = 0.0
+4:4/0 = 0
+4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_0/angular_velocity = 0.0
+4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_1/angular_velocity = 0.0
+5:4/0 = 0
+5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_0/angular_velocity = 0.0
+5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_1/angular_velocity = 0.0
+7:4/0 = 0
+7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_0/angular_velocity = 0.0
+7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_1/angular_velocity = 0.0
+3:5/0 = 0
+3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_0/angular_velocity = 0.0
+3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_1/angular_velocity = 0.0
+4:5/0 = 0
+4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_0/angular_velocity = 0.0
+4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_1/angular_velocity = 0.0
+7:5/0 = 0
+7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_0/angular_velocity = 0.0
+7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_1/angular_velocity = 0.0
+3:6/0 = 0
+3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_0/angular_velocity = 0.0
+3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_1/angular_velocity = 0.0
+4:6/0 = 0
+4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_0/angular_velocity = 0.0
+4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_1/angular_velocity = 0.0
+7:6/0 = 0
+7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_0/angular_velocity = 0.0
+7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_1/angular_velocity = 0.0
+2:7/0 = 0
+2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_0/angular_velocity = 0.0
+2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_1/angular_velocity = 0.0
+3:7/0 = 0
+3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_0/angular_velocity = 0.0
+3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_1/angular_velocity = 0.0
+4:7/0 = 0
+4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_0/angular_velocity = 0.0
+4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_1/angular_velocity = 0.0
+5:7/0 = 0
+5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_0/angular_velocity = 0.0
+5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_1/angular_velocity = 0.0
+8:0/0 = 0
+8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_0/angular_velocity = 0.0
+8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_1/angular_velocity = 0.0
+9:0/0 = 0
+9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_0/angular_velocity = 0.0
+9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_1/angular_velocity = 0.0
+10:0/0 = 0
+10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_0/angular_velocity = 0.0
+10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_1/angular_velocity = 0.0
+11:0/0 = 0
+11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_0/angular_velocity = 0.0
+11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_1/angular_velocity = 0.0
+12:0/0 = 0
+12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_0/angular_velocity = 0.0
+12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_1/angular_velocity = 0.0
+13:0/0 = 0
+13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_0/angular_velocity = 0.0
+13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0 = 0
+14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_0/angular_velocity = 0.0
+14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8)
+14:0/0/custom_data_0 = &"Sign"
+15:0/0 = 0
+15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_0/angular_velocity = 0.0
+15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_1/angular_velocity = 0.0
+16:0/0 = 0
+16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_0/angular_velocity = 0.0
+16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_1/angular_velocity = 0.0
+8:1/0 = 0
+8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_0/angular_velocity = 0.0
+8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_1/angular_velocity = 0.0
+9:1/0 = 0
+9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_0/angular_velocity = 0.0
+9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_1/angular_velocity = 0.0
+10:1/0 = 0
+10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_0/angular_velocity = 0.0
+10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_1/angular_velocity = 0.0
+11:1/0 = 0
+11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_0/angular_velocity = 0.0
+11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_1/angular_velocity = 0.0
+12:1/0 = 0
+12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_0/angular_velocity = 0.0
+12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_1/angular_velocity = 0.0
+13:1/0 = 0
+13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_0/angular_velocity = 0.0
+13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_1/angular_velocity = 0.0
+14:1/0 = 0
+14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_0/angular_velocity = 0.0
+14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_1/angular_velocity = 0.0
+15:1/0 = 0
+15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_0/angular_velocity = 0.0
+15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_1/angular_velocity = 0.0
+16:1/0 = 0
+16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_0/angular_velocity = 0.0
+16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_1/angular_velocity = 0.0
+8:2/0 = 0
+8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_0/angular_velocity = 0.0
+8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_1/angular_velocity = 0.0
+9:2/0 = 0
+9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_0/angular_velocity = 0.0
+9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_1/angular_velocity = 0.0
+10:2/0 = 0
+10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_0/angular_velocity = 0.0
+10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_1/angular_velocity = 0.0
+11:2/0 = 0
+11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_0/angular_velocity = 0.0
+11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_1/angular_velocity = 0.0
+12:2/0 = 0
+12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_0/angular_velocity = 0.0
+12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_1/angular_velocity = 0.0
+13:2/0 = 0
+13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_0/angular_velocity = 0.0
+13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_1/angular_velocity = 0.0
+14:2/0 = 0
+14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_0/angular_velocity = 0.0
+14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_1/angular_velocity = 0.0
+15:2/0 = 0
+15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_0/angular_velocity = 0.0
+15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_1/angular_velocity = 0.0
+16:2/0 = 0
+16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_0/angular_velocity = 0.0
+16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_1/angular_velocity = 0.0
+8:3/0 = 0
+8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_0/angular_velocity = 0.0
+8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_1/angular_velocity = 0.0
+9:3/0 = 0
+9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_0/angular_velocity = 0.0
+9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_1/angular_velocity = 0.0
+10:3/0 = 0
+10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_0/angular_velocity = 0.0
+10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_1/angular_velocity = 0.0
+11:3/0 = 0
+11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_0/angular_velocity = 0.0
+11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_1/angular_velocity = 0.0
+12:3/0 = 0
+12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_0/angular_velocity = 0.0
+12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_1/angular_velocity = 0.0
+13:3/0 = 0
+13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_0/angular_velocity = 0.0
+13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_1/angular_velocity = 0.0
+14:3/0 = 0
+14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_0/angular_velocity = 0.0
+14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_1/angular_velocity = 0.0
+15:3/0 = 0
+15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_0/angular_velocity = 0.0
+15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_1/angular_velocity = 0.0
+16:3/0 = 0
+16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_0/angular_velocity = 0.0
+16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_1/angular_velocity = 0.0
+8:4/0 = 0
+8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_0/angular_velocity = 0.0
+8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_1/angular_velocity = 0.0
+9:4/0 = 0
+9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_0/angular_velocity = 0.0
+9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_1/angular_velocity = 0.0
+10:4/0 = 0
+10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_0/angular_velocity = 0.0
+10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_1/angular_velocity = 0.0
+11:4/0 = 0
+11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_0/angular_velocity = 0.0
+11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8)
+11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_1/angular_velocity = 0.0
+12:4/0 = 0
+12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_0/angular_velocity = 0.0
+12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_1/angular_velocity = 0.0
+13:4/0 = 0
+13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_0/angular_velocity = 0.0
+13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8)
+13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0 = 0
+14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_0/angular_velocity = 0.0
+14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
+14:4/0/custom_data_0 = &"Inventory"
+15:4/0 = 0
+15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_0/angular_velocity = 0.0
+15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_1/angular_velocity = 0.0
+16:4/0 = 0
+16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_0/angular_velocity = 0.0
+16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_1/angular_velocity = 0.0
+8:5/0 = 0
+8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_0/angular_velocity = 0.0
+8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_1/angular_velocity = 0.0
+9:5/0 = 0
+9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_0/angular_velocity = 0.0
+9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_1/angular_velocity = 0.0
+10:5/0 = 0
+10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_0/angular_velocity = 0.0
+10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_1/angular_velocity = 0.0
+11:5/0 = 0
+11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_0/angular_velocity = 0.0
+11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_1/angular_velocity = 0.0
+12:5/0 = 0
+12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_0/angular_velocity = 0.0
+12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_1/angular_velocity = 0.0
+13:5/0 = 0
+13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_0/angular_velocity = 0.0
+13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_1/angular_velocity = 0.0
+14:5/0 = 0
+14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_0/angular_velocity = 0.0
+14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_1/angular_velocity = 0.0
+15:5/0 = 0
+15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_0/angular_velocity = 0.0
+15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_1/angular_velocity = 0.0
+16:5/0 = 0
+16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_0/angular_velocity = 0.0
+16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_1/angular_velocity = 0.0
+8:6/0 = 0
+8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_0/angular_velocity = 0.0
+8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_1/angular_velocity = 0.0
+9:6/0 = 0
+9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_0/angular_velocity = 0.0
+9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_1/angular_velocity = 0.0
+10:6/0 = 0
+10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_0/angular_velocity = 0.0
+10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_1/angular_velocity = 0.0
+11:6/0 = 0
+11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_0/angular_velocity = 0.0
+11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5)
+11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_1/angular_velocity = 0.0
+12:6/0 = 0
+12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_0/angular_velocity = 0.0
+12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_1/angular_velocity = 0.0
+13:6/0 = 0
+13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_0/angular_velocity = 0.0
+13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8)
+13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_1/angular_velocity = 0.0
+14:6/0 = 0
+14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_0/angular_velocity = 0.0
+14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_1/angular_velocity = 0.0
+15:6/0 = 0
+15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_0/angular_velocity = 0.0
+15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_1/angular_velocity = 0.0
+16:6/0 = 0
+16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_0/angular_velocity = 0.0
+16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_1/angular_velocity = 0.0
+
+[sub_resource type="TileSet" id="TileSet_kf7eg"]
+physics_layer_0/collision_layer = 1
+physics_layer_1/collision_layer = 2
+physics_layer_1/collision_mask = 2
+custom_data_layer_0/name = "Type"
+custom_data_layer_0/type = 21
+sources/0 = SubResource("TileSetAtlasSource_easgx")
+
+[node name="ExampleScene2D2" type="Node2D"]
+
+[node name="Background" type="CanvasLayer" parent="."]
+layer = -3
+
+[node name="ColorRect" type="ColorRect" parent="Background"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -311.0
+offset_top = -173.0
+offset_right = 981.0
+offset_bottom = 548.0
+grow_horizontal = 2
+grow_vertical = 2
+auto_translate = false
+localize_numeral_system = false
+color = Color(0.137255, 0.14902, 0.196078, 1)
+
+[node name="TileMap" type="TileMap" parent="."]
+z_index = -1
+scale = Vector2(3, 3)
+tile_set = SubResource("TileSet_kf7eg")
+format = 2
+layer_0/name = "Background"
+layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3)
+layer_1/name = "Terrain"
+layer_1/z_index = 1
+layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6)
+
+[node name="UI" type="CanvasLayer" parent="."]
+
+[node name="UIInventory" parent="UI" instance=ExtResource("7_fdx1s")]
+unique_name_in_owner = true
+visible = false
+
+[node name="UISign" parent="UI" instance=ExtResource("6_kqt1v")]
+unique_name_in_owner = true
+visible = false
+
+[node name="Controls" type="Label" parent="."]
+offset_left = 167.0
+offset_top = -145.0
+offset_right = 332.0
+offset_bottom = -81.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("12_k4p0h")
+text = "[WASD] to move
+[Space] to jump"
+
+[node name="Camera2D" type="Camera2D" parent="."]
+position = Vector2(227, -28)
+zoom = Vector2(1.5, 1.5)
+editor_draw_limits = true
+
+[node name="PhantomCameraHost" type="Node" parent="Camera2D"]
+script = ExtResource("4_54fc4")
+
+[node name="Player" type="Node" parent="."]
+
+[node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")]
+unique_name_in_owner = true
+process_priority = -1
+position = Vector2(227, -28)
+script = ExtResource("2_mgsut")
+priority = 10
+follow_mode = 2
+follow_target = NodePath("../CharacterBody2D/PlayerVisuals")
+zoom = Vector2(1.5, 1.5)
+frame_preview = false
+tween_resource = ExtResource("6_pxbym")
+tween_on_load = false
+follow_damping = true
+draw_limits = true
+
+[node name="CharacterBody2D" parent="Player" instance=ExtResource("7_62i3t")]
+position = Vector2(227, -28)
+
+[editable path="Player/CharacterBody2D"]
diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_follow_framed_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_follow_framed_example_scene.tscn
new file mode 100644 (file)
index 0000000..69d1d70
--- /dev/null
@@ -0,0 +1,641 @@
+[gd_scene load_steps=11 format=3 uid="uid://bxtsl6qlpq1ar"]
+
+[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_27o77"]
+[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_1tbys"]
+[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/ui_sign.tscn" id="3_1kfnp"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="4_mylkx"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="5_lwx5e"]
+[ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_2d_tween.tres" id="6_tju6r"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="8_bo8m7"]
+[ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="8_wlikg"]
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"]
+texture = ExtResource("1_27o77")
+0:0/0 = 0
+0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_0/angular_velocity = 0.0
+0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_1/angular_velocity = 0.0
+1:0/0 = 0
+1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_0/angular_velocity = 0.0
+1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_1/angular_velocity = 0.0
+2:0/0 = 0
+2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_0/angular_velocity = 0.0
+2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_1/angular_velocity = 0.0
+3:0/0 = 0
+3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_0/angular_velocity = 0.0
+3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_1/angular_velocity = 0.0
+4:0/0 = 0
+4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_0/angular_velocity = 0.0
+4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_1/angular_velocity = 0.0
+5:0/0 = 0
+5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_0/angular_velocity = 0.0
+5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_1/angular_velocity = 0.0
+6:0/0 = 0
+6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_0/angular_velocity = 0.0
+6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_1/angular_velocity = 0.0
+7:0/0 = 0
+7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_0/angular_velocity = 0.0
+7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_1/angular_velocity = 0.0
+0:1/0 = 0
+0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_0/angular_velocity = 0.0
+0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_1/angular_velocity = 0.0
+1:1/0 = 0
+1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_0/angular_velocity = 0.0
+1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_1/angular_velocity = 0.0
+2:1/0 = 0
+2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_0/angular_velocity = 0.0
+2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_1/angular_velocity = 0.0
+3:1/0 = 0
+3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_0/angular_velocity = 0.0
+3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_1/angular_velocity = 0.0
+4:1/0 = 0
+4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_0/angular_velocity = 0.0
+4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_1/angular_velocity = 0.0
+5:1/0 = 0
+5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_0/angular_velocity = 0.0
+5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_1/angular_velocity = 0.0
+7:1/0 = 0
+7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_0/angular_velocity = 0.0
+7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_1/angular_velocity = 0.0
+2:2/0 = 0
+2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_0/angular_velocity = 0.0
+2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_1/angular_velocity = 0.0
+3:2/0 = 0
+3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_0/angular_velocity = 0.0
+3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_1/angular_velocity = 0.0
+4:2/0 = 0
+4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_0/angular_velocity = 0.0
+4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_1/angular_velocity = 0.0
+7:2/0 = 0
+7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_0/angular_velocity = 0.0
+7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_1/angular_velocity = 0.0
+3:3/0 = 0
+3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_0/angular_velocity = 0.0
+3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_1/angular_velocity = 0.0
+4:3/0 = 0
+4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_0/angular_velocity = 0.0
+4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_1/angular_velocity = 0.0
+5:3/0 = 0
+5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_0/angular_velocity = 0.0
+5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_1/angular_velocity = 0.0
+7:3/0 = 0
+7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_0/angular_velocity = 0.0
+7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_1/angular_velocity = 0.0
+3:4/0 = 0
+3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_0/angular_velocity = 0.0
+3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_1/angular_velocity = 0.0
+4:4/0 = 0
+4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_0/angular_velocity = 0.0
+4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_1/angular_velocity = 0.0
+5:4/0 = 0
+5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_0/angular_velocity = 0.0
+5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_1/angular_velocity = 0.0
+7:4/0 = 0
+7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_0/angular_velocity = 0.0
+7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_1/angular_velocity = 0.0
+3:5/0 = 0
+3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_0/angular_velocity = 0.0
+3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_1/angular_velocity = 0.0
+4:5/0 = 0
+4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_0/angular_velocity = 0.0
+4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_1/angular_velocity = 0.0
+7:5/0 = 0
+7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_0/angular_velocity = 0.0
+7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_1/angular_velocity = 0.0
+3:6/0 = 0
+3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_0/angular_velocity = 0.0
+3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_1/angular_velocity = 0.0
+4:6/0 = 0
+4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_0/angular_velocity = 0.0
+4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_1/angular_velocity = 0.0
+7:6/0 = 0
+7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_0/angular_velocity = 0.0
+7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_1/angular_velocity = 0.0
+2:7/0 = 0
+2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_0/angular_velocity = 0.0
+2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_1/angular_velocity = 0.0
+3:7/0 = 0
+3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_0/angular_velocity = 0.0
+3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_1/angular_velocity = 0.0
+4:7/0 = 0
+4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_0/angular_velocity = 0.0
+4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_1/angular_velocity = 0.0
+5:7/0 = 0
+5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_0/angular_velocity = 0.0
+5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_1/angular_velocity = 0.0
+8:0/0 = 0
+8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_0/angular_velocity = 0.0
+8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_1/angular_velocity = 0.0
+9:0/0 = 0
+9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_0/angular_velocity = 0.0
+9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_1/angular_velocity = 0.0
+10:0/0 = 0
+10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_0/angular_velocity = 0.0
+10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_1/angular_velocity = 0.0
+11:0/0 = 0
+11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_0/angular_velocity = 0.0
+11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_1/angular_velocity = 0.0
+12:0/0 = 0
+12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_0/angular_velocity = 0.0
+12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_1/angular_velocity = 0.0
+13:0/0 = 0
+13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_0/angular_velocity = 0.0
+13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0 = 0
+14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_0/angular_velocity = 0.0
+14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8)
+14:0/0/custom_data_0 = &"Sign"
+15:0/0 = 0
+15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_0/angular_velocity = 0.0
+15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_1/angular_velocity = 0.0
+16:0/0 = 0
+16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_0/angular_velocity = 0.0
+16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_1/angular_velocity = 0.0
+8:1/0 = 0
+8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_0/angular_velocity = 0.0
+8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_1/angular_velocity = 0.0
+9:1/0 = 0
+9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_0/angular_velocity = 0.0
+9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_1/angular_velocity = 0.0
+10:1/0 = 0
+10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_0/angular_velocity = 0.0
+10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_1/angular_velocity = 0.0
+11:1/0 = 0
+11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_0/angular_velocity = 0.0
+11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_1/angular_velocity = 0.0
+12:1/0 = 0
+12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_0/angular_velocity = 0.0
+12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_1/angular_velocity = 0.0
+13:1/0 = 0
+13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_0/angular_velocity = 0.0
+13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_1/angular_velocity = 0.0
+14:1/0 = 0
+14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_0/angular_velocity = 0.0
+14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_1/angular_velocity = 0.0
+15:1/0 = 0
+15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_0/angular_velocity = 0.0
+15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_1/angular_velocity = 0.0
+16:1/0 = 0
+16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_0/angular_velocity = 0.0
+16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_1/angular_velocity = 0.0
+8:2/0 = 0
+8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_0/angular_velocity = 0.0
+8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_1/angular_velocity = 0.0
+9:2/0 = 0
+9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_0/angular_velocity = 0.0
+9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_1/angular_velocity = 0.0
+10:2/0 = 0
+10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_0/angular_velocity = 0.0
+10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_1/angular_velocity = 0.0
+11:2/0 = 0
+11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_0/angular_velocity = 0.0
+11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_1/angular_velocity = 0.0
+12:2/0 = 0
+12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_0/angular_velocity = 0.0
+12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_1/angular_velocity = 0.0
+13:2/0 = 0
+13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_0/angular_velocity = 0.0
+13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_1/angular_velocity = 0.0
+14:2/0 = 0
+14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_0/angular_velocity = 0.0
+14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_1/angular_velocity = 0.0
+15:2/0 = 0
+15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_0/angular_velocity = 0.0
+15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_1/angular_velocity = 0.0
+16:2/0 = 0
+16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_0/angular_velocity = 0.0
+16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_1/angular_velocity = 0.0
+8:3/0 = 0
+8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_0/angular_velocity = 0.0
+8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_1/angular_velocity = 0.0
+9:3/0 = 0
+9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_0/angular_velocity = 0.0
+9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_1/angular_velocity = 0.0
+10:3/0 = 0
+10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_0/angular_velocity = 0.0
+10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_1/angular_velocity = 0.0
+11:3/0 = 0
+11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_0/angular_velocity = 0.0
+11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_1/angular_velocity = 0.0
+12:3/0 = 0
+12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_0/angular_velocity = 0.0
+12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_1/angular_velocity = 0.0
+13:3/0 = 0
+13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_0/angular_velocity = 0.0
+13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_1/angular_velocity = 0.0
+14:3/0 = 0
+14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_0/angular_velocity = 0.0
+14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_1/angular_velocity = 0.0
+15:3/0 = 0
+15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_0/angular_velocity = 0.0
+15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_1/angular_velocity = 0.0
+16:3/0 = 0
+16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_0/angular_velocity = 0.0
+16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_1/angular_velocity = 0.0
+8:4/0 = 0
+8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_0/angular_velocity = 0.0
+8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_1/angular_velocity = 0.0
+9:4/0 = 0
+9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_0/angular_velocity = 0.0
+9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_1/angular_velocity = 0.0
+10:4/0 = 0
+10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_0/angular_velocity = 0.0
+10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_1/angular_velocity = 0.0
+11:4/0 = 0
+11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_0/angular_velocity = 0.0
+11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8)
+11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_1/angular_velocity = 0.0
+12:4/0 = 0
+12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_0/angular_velocity = 0.0
+12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_1/angular_velocity = 0.0
+13:4/0 = 0
+13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_0/angular_velocity = 0.0
+13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8)
+13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0 = 0
+14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_0/angular_velocity = 0.0
+14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
+14:4/0/custom_data_0 = &"Inventory"
+15:4/0 = 0
+15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_0/angular_velocity = 0.0
+15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_1/angular_velocity = 0.0
+16:4/0 = 0
+16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_0/angular_velocity = 0.0
+16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_1/angular_velocity = 0.0
+8:5/0 = 0
+8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_0/angular_velocity = 0.0
+8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_1/angular_velocity = 0.0
+9:5/0 = 0
+9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_0/angular_velocity = 0.0
+9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_1/angular_velocity = 0.0
+10:5/0 = 0
+10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_0/angular_velocity = 0.0
+10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_1/angular_velocity = 0.0
+11:5/0 = 0
+11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_0/angular_velocity = 0.0
+11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_1/angular_velocity = 0.0
+12:5/0 = 0
+12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_0/angular_velocity = 0.0
+12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_1/angular_velocity = 0.0
+13:5/0 = 0
+13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_0/angular_velocity = 0.0
+13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_1/angular_velocity = 0.0
+14:5/0 = 0
+14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_0/angular_velocity = 0.0
+14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_1/angular_velocity = 0.0
+15:5/0 = 0
+15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_0/angular_velocity = 0.0
+15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_1/angular_velocity = 0.0
+16:5/0 = 0
+16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_0/angular_velocity = 0.0
+16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_1/angular_velocity = 0.0
+8:6/0 = 0
+8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_0/angular_velocity = 0.0
+8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_1/angular_velocity = 0.0
+9:6/0 = 0
+9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_0/angular_velocity = 0.0
+9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_1/angular_velocity = 0.0
+10:6/0 = 0
+10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_0/angular_velocity = 0.0
+10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_1/angular_velocity = 0.0
+11:6/0 = 0
+11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_0/angular_velocity = 0.0
+11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5)
+11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_1/angular_velocity = 0.0
+12:6/0 = 0
+12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_0/angular_velocity = 0.0
+12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_1/angular_velocity = 0.0
+13:6/0 = 0
+13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_0/angular_velocity = 0.0
+13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8)
+13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_1/angular_velocity = 0.0
+14:6/0 = 0
+14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_0/angular_velocity = 0.0
+14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_1/angular_velocity = 0.0
+15:6/0 = 0
+15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_0/angular_velocity = 0.0
+15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_1/angular_velocity = 0.0
+16:6/0 = 0
+16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_0/angular_velocity = 0.0
+16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_1/angular_velocity = 0.0
+
+[sub_resource type="TileSet" id="TileSet_kf7eg"]
+physics_layer_0/collision_layer = 1
+physics_layer_1/collision_layer = 2
+physics_layer_1/collision_mask = 2
+custom_data_layer_0/name = "Type"
+custom_data_layer_0/type = 21
+sources/0 = SubResource("TileSetAtlasSource_easgx")
+
+[node name="ExampleScene2D" type="Node2D"]
+
+[node name="Background" type="CanvasLayer" parent="."]
+layer = -3
+
+[node name="ColorRect" type="ColorRect" parent="Background"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -345.0
+offset_top = -143.0
+offset_right = 947.0
+offset_bottom = 578.0
+grow_horizontal = 2
+grow_vertical = 2
+auto_translate = false
+localize_numeral_system = false
+color = Color(0.137255, 0.14902, 0.196078, 1)
+
+[node name="TileMap" type="TileMap" parent="."]
+z_index = -1
+scale = Vector2(3, 3)
+tile_set = SubResource("TileSet_kf7eg")
+format = 2
+layer_0/name = "Background"
+layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3)
+layer_1/name = "Terrain"
+layer_1/z_index = 1
+layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6)
+
+[node name="UI" type="CanvasLayer" parent="."]
+
+[node name="UIInventory" parent="UI" instance=ExtResource("2_1tbys")]
+unique_name_in_owner = true
+visible = false
+
+[node name="UISign" parent="UI" instance=ExtResource("3_1kfnp")]
+unique_name_in_owner = true
+visible = false
+
+[node name="Camera2D" type="Camera2D" parent="."]
+position = Vector2(282, -29)
+zoom = Vector2(2, 2)
+
+[node name="PhantomCameraHost" type="Node" parent="Camera2D"]
+script = ExtResource("4_mylkx")
+
+[node name="Player" type="Node" parent="."]
+
+[node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")]
+unique_name_in_owner = true
+position = Vector2(282, -29)
+script = ExtResource("5_lwx5e")
+priority = 5
+follow_mode = 5
+follow_target = NodePath("../CharacterBody2D/PlayerVisuals")
+zoom = Vector2(2, 2)
+tween_resource = ExtResource("6_tju6r")
+tween_on_load = false
+follow_damping = true
+dead_zone_width = 0.416
+dead_zone_height = 0.63
+show_viewfinder_in_play = true
+draw_limits = true
+
+[node name="Label" type="Label" parent="Player"]
+offset_left = 167.0
+offset_top = -145.0
+offset_right = 332.0
+offset_bottom = -81.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("8_bo8m7")
+text = "[WASD] to move
+[Space] to jump"
+
+[node name="CharacterBody2D" parent="Player" instance=ExtResource("8_wlikg")]
+position = Vector2(282, -29)
+
+[editable path="Player/CharacterBody2D"]
diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_follow_group_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_follow_group_example_scene.tscn
new file mode 100644 (file)
index 0000000..c07f5c1
--- /dev/null
@@ -0,0 +1,648 @@
+[gd_scene load_steps=13 format=3 uid="uid://brrncnp26lrco"]
+
+[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_5kqbp"]
+[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_xmntp"]
+[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/ui_sign.tscn" id="3_8dojy"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="4_2efwt"]
+[ext_resource type="Texture2D" uid="uid://cwep0on2tthn7" path="res://addons/phantom_camera/examples/textures/2D/phantom_camera_2d_sprite.png" id="5_0v2cd"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="6_diuy4"]
+[ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="7_ybwrw"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="9_wk0p3"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="12_uvcwb"]
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"]
+texture = ExtResource("1_5kqbp")
+0:0/0 = 0
+0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_0/angular_velocity = 0.0
+0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_1/angular_velocity = 0.0
+1:0/0 = 0
+1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_0/angular_velocity = 0.0
+1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_1/angular_velocity = 0.0
+2:0/0 = 0
+2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_0/angular_velocity = 0.0
+2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_1/angular_velocity = 0.0
+3:0/0 = 0
+3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_0/angular_velocity = 0.0
+3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_1/angular_velocity = 0.0
+4:0/0 = 0
+4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_0/angular_velocity = 0.0
+4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_1/angular_velocity = 0.0
+5:0/0 = 0
+5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_0/angular_velocity = 0.0
+5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_1/angular_velocity = 0.0
+6:0/0 = 0
+6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_0/angular_velocity = 0.0
+6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_1/angular_velocity = 0.0
+7:0/0 = 0
+7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_0/angular_velocity = 0.0
+7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_1/angular_velocity = 0.0
+0:1/0 = 0
+0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_0/angular_velocity = 0.0
+0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_1/angular_velocity = 0.0
+1:1/0 = 0
+1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_0/angular_velocity = 0.0
+1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_1/angular_velocity = 0.0
+2:1/0 = 0
+2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_0/angular_velocity = 0.0
+2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_1/angular_velocity = 0.0
+3:1/0 = 0
+3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_0/angular_velocity = 0.0
+3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_1/angular_velocity = 0.0
+4:1/0 = 0
+4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_0/angular_velocity = 0.0
+4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_1/angular_velocity = 0.0
+5:1/0 = 0
+5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_0/angular_velocity = 0.0
+5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_1/angular_velocity = 0.0
+7:1/0 = 0
+7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_0/angular_velocity = 0.0
+7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_1/angular_velocity = 0.0
+2:2/0 = 0
+2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_0/angular_velocity = 0.0
+2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_1/angular_velocity = 0.0
+3:2/0 = 0
+3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_0/angular_velocity = 0.0
+3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_1/angular_velocity = 0.0
+4:2/0 = 0
+4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_0/angular_velocity = 0.0
+4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_1/angular_velocity = 0.0
+7:2/0 = 0
+7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_0/angular_velocity = 0.0
+7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_1/angular_velocity = 0.0
+3:3/0 = 0
+3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_0/angular_velocity = 0.0
+3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_1/angular_velocity = 0.0
+4:3/0 = 0
+4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_0/angular_velocity = 0.0
+4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_1/angular_velocity = 0.0
+5:3/0 = 0
+5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_0/angular_velocity = 0.0
+5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_1/angular_velocity = 0.0
+7:3/0 = 0
+7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_0/angular_velocity = 0.0
+7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_1/angular_velocity = 0.0
+3:4/0 = 0
+3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_0/angular_velocity = 0.0
+3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_1/angular_velocity = 0.0
+4:4/0 = 0
+4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_0/angular_velocity = 0.0
+4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_1/angular_velocity = 0.0
+5:4/0 = 0
+5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_0/angular_velocity = 0.0
+5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_1/angular_velocity = 0.0
+7:4/0 = 0
+7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_0/angular_velocity = 0.0
+7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_1/angular_velocity = 0.0
+3:5/0 = 0
+3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_0/angular_velocity = 0.0
+3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_1/angular_velocity = 0.0
+4:5/0 = 0
+4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_0/angular_velocity = 0.0
+4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_1/angular_velocity = 0.0
+7:5/0 = 0
+7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_0/angular_velocity = 0.0
+7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_1/angular_velocity = 0.0
+3:6/0 = 0
+3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_0/angular_velocity = 0.0
+3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_1/angular_velocity = 0.0
+4:6/0 = 0
+4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_0/angular_velocity = 0.0
+4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_1/angular_velocity = 0.0
+7:6/0 = 0
+7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_0/angular_velocity = 0.0
+7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_1/angular_velocity = 0.0
+2:7/0 = 0
+2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_0/angular_velocity = 0.0
+2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_1/angular_velocity = 0.0
+3:7/0 = 0
+3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_0/angular_velocity = 0.0
+3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_1/angular_velocity = 0.0
+4:7/0 = 0
+4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_0/angular_velocity = 0.0
+4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_1/angular_velocity = 0.0
+5:7/0 = 0
+5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_0/angular_velocity = 0.0
+5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_1/angular_velocity = 0.0
+8:0/0 = 0
+8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_0/angular_velocity = 0.0
+8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_1/angular_velocity = 0.0
+9:0/0 = 0
+9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_0/angular_velocity = 0.0
+9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_1/angular_velocity = 0.0
+10:0/0 = 0
+10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_0/angular_velocity = 0.0
+10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_1/angular_velocity = 0.0
+11:0/0 = 0
+11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_0/angular_velocity = 0.0
+11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_1/angular_velocity = 0.0
+12:0/0 = 0
+12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_0/angular_velocity = 0.0
+12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_1/angular_velocity = 0.0
+13:0/0 = 0
+13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_0/angular_velocity = 0.0
+13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0 = 0
+14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_0/angular_velocity = 0.0
+14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8)
+14:0/0/custom_data_0 = &"Sign"
+15:0/0 = 0
+15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_0/angular_velocity = 0.0
+15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_1/angular_velocity = 0.0
+16:0/0 = 0
+16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_0/angular_velocity = 0.0
+16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_1/angular_velocity = 0.0
+8:1/0 = 0
+8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_0/angular_velocity = 0.0
+8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_1/angular_velocity = 0.0
+9:1/0 = 0
+9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_0/angular_velocity = 0.0
+9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_1/angular_velocity = 0.0
+10:1/0 = 0
+10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_0/angular_velocity = 0.0
+10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_1/angular_velocity = 0.0
+11:1/0 = 0
+11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_0/angular_velocity = 0.0
+11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_1/angular_velocity = 0.0
+12:1/0 = 0
+12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_0/angular_velocity = 0.0
+12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_1/angular_velocity = 0.0
+13:1/0 = 0
+13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_0/angular_velocity = 0.0
+13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_1/angular_velocity = 0.0
+14:1/0 = 0
+14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_0/angular_velocity = 0.0
+14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_1/angular_velocity = 0.0
+15:1/0 = 0
+15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_0/angular_velocity = 0.0
+15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_1/angular_velocity = 0.0
+16:1/0 = 0
+16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_0/angular_velocity = 0.0
+16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_1/angular_velocity = 0.0
+8:2/0 = 0
+8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_0/angular_velocity = 0.0
+8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_1/angular_velocity = 0.0
+9:2/0 = 0
+9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_0/angular_velocity = 0.0
+9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_1/angular_velocity = 0.0
+10:2/0 = 0
+10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_0/angular_velocity = 0.0
+10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_1/angular_velocity = 0.0
+11:2/0 = 0
+11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_0/angular_velocity = 0.0
+11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_1/angular_velocity = 0.0
+12:2/0 = 0
+12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_0/angular_velocity = 0.0
+12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_1/angular_velocity = 0.0
+13:2/0 = 0
+13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_0/angular_velocity = 0.0
+13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_1/angular_velocity = 0.0
+14:2/0 = 0
+14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_0/angular_velocity = 0.0
+14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_1/angular_velocity = 0.0
+15:2/0 = 0
+15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_0/angular_velocity = 0.0
+15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_1/angular_velocity = 0.0
+16:2/0 = 0
+16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_0/angular_velocity = 0.0
+16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_1/angular_velocity = 0.0
+8:3/0 = 0
+8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_0/angular_velocity = 0.0
+8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_1/angular_velocity = 0.0
+9:3/0 = 0
+9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_0/angular_velocity = 0.0
+9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_1/angular_velocity = 0.0
+10:3/0 = 0
+10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_0/angular_velocity = 0.0
+10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_1/angular_velocity = 0.0
+11:3/0 = 0
+11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_0/angular_velocity = 0.0
+11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_1/angular_velocity = 0.0
+12:3/0 = 0
+12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_0/angular_velocity = 0.0
+12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_1/angular_velocity = 0.0
+13:3/0 = 0
+13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_0/angular_velocity = 0.0
+13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_1/angular_velocity = 0.0
+14:3/0 = 0
+14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_0/angular_velocity = 0.0
+14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_1/angular_velocity = 0.0
+15:3/0 = 0
+15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_0/angular_velocity = 0.0
+15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_1/angular_velocity = 0.0
+16:3/0 = 0
+16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_0/angular_velocity = 0.0
+16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_1/angular_velocity = 0.0
+8:4/0 = 0
+8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_0/angular_velocity = 0.0
+8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_1/angular_velocity = 0.0
+9:4/0 = 0
+9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_0/angular_velocity = 0.0
+9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_1/angular_velocity = 0.0
+10:4/0 = 0
+10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_0/angular_velocity = 0.0
+10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_1/angular_velocity = 0.0
+11:4/0 = 0
+11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_0/angular_velocity = 0.0
+11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8)
+11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_1/angular_velocity = 0.0
+12:4/0 = 0
+12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_0/angular_velocity = 0.0
+12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_1/angular_velocity = 0.0
+13:4/0 = 0
+13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_0/angular_velocity = 0.0
+13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8)
+13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0 = 0
+14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_0/angular_velocity = 0.0
+14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
+14:4/0/custom_data_0 = &"Inventory"
+15:4/0 = 0
+15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_0/angular_velocity = 0.0
+15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_1/angular_velocity = 0.0
+16:4/0 = 0
+16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_0/angular_velocity = 0.0
+16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_1/angular_velocity = 0.0
+8:5/0 = 0
+8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_0/angular_velocity = 0.0
+8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_1/angular_velocity = 0.0
+9:5/0 = 0
+9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_0/angular_velocity = 0.0
+9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_1/angular_velocity = 0.0
+10:5/0 = 0
+10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_0/angular_velocity = 0.0
+10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_1/angular_velocity = 0.0
+11:5/0 = 0
+11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_0/angular_velocity = 0.0
+11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_1/angular_velocity = 0.0
+12:5/0 = 0
+12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_0/angular_velocity = 0.0
+12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_1/angular_velocity = 0.0
+13:5/0 = 0
+13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_0/angular_velocity = 0.0
+13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_1/angular_velocity = 0.0
+14:5/0 = 0
+14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_0/angular_velocity = 0.0
+14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_1/angular_velocity = 0.0
+15:5/0 = 0
+15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_0/angular_velocity = 0.0
+15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_1/angular_velocity = 0.0
+16:5/0 = 0
+16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_0/angular_velocity = 0.0
+16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_1/angular_velocity = 0.0
+8:6/0 = 0
+8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_0/angular_velocity = 0.0
+8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_1/angular_velocity = 0.0
+9:6/0 = 0
+9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_0/angular_velocity = 0.0
+9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_1/angular_velocity = 0.0
+10:6/0 = 0
+10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_0/angular_velocity = 0.0
+10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_1/angular_velocity = 0.0
+11:6/0 = 0
+11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_0/angular_velocity = 0.0
+11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5)
+11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_1/angular_velocity = 0.0
+12:6/0 = 0
+12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_0/angular_velocity = 0.0
+12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_1/angular_velocity = 0.0
+13:6/0 = 0
+13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_0/angular_velocity = 0.0
+13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8)
+13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_1/angular_velocity = 0.0
+14:6/0 = 0
+14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_0/angular_velocity = 0.0
+14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_1/angular_velocity = 0.0
+15:6/0 = 0
+15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_0/angular_velocity = 0.0
+15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_1/angular_velocity = 0.0
+16:6/0 = 0
+16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_0/angular_velocity = 0.0
+16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_1/angular_velocity = 0.0
+
+[sub_resource type="TileSet" id="TileSet_kf7eg"]
+physics_layer_0/collision_layer = 1
+physics_layer_1/collision_layer = 2
+physics_layer_1/collision_mask = 2
+custom_data_layer_0/name = "Type"
+custom_data_layer_0/type = 21
+sources/0 = SubResource("TileSetAtlasSource_easgx")
+
+[sub_resource type="Resource" id="Resource_spy00"]
+script = ExtResource("9_wk0p3")
+duration = 0.3
+transition = 4
+ease = 2
+
+[node name="ExampleScene2D" type="Node2D"]
+
+[node name="Background" type="CanvasLayer" parent="."]
+layer = -3
+
+[node name="ColorRect" type="ColorRect" parent="Background"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -311.0
+offset_top = -173.0
+offset_right = 981.0
+offset_bottom = 548.0
+grow_horizontal = 2
+grow_vertical = 2
+auto_translate = false
+localize_numeral_system = false
+color = Color(0.137255, 0.14902, 0.196078, 1)
+
+[node name="TileMap" type="TileMap" parent="."]
+z_index = -1
+scale = Vector2(3, 3)
+tile_set = SubResource("TileSet_kf7eg")
+format = 2
+layer_0/name = "Background"
+layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3)
+layer_1/name = "Terrain"
+layer_1/z_index = 1
+layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5)
+
+[node name="UI" type="CanvasLayer" parent="."]
+
+[node name="UIInventory" parent="UI" instance=ExtResource("2_xmntp")]
+unique_name_in_owner = true
+visible = false
+
+[node name="UISign" parent="UI" instance=ExtResource("3_8dojy")]
+unique_name_in_owner = true
+visible = false
+
+[node name="Camera2D" type="Camera2D" parent="."]
+position = Vector2(107, -172.5)
+position_smoothing_speed = 8.0
+
+[node name="PhantomCameraHost" type="Node" parent="Camera2D"]
+script = ExtResource("4_2efwt")
+
+[node name="Label" type="Label" parent="."]
+offset_left = 167.0
+offset_top = -133.0
+offset_right = 332.0
+offset_bottom = -69.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("12_uvcwb")
+text = "[WASD] to move
+[Space] to jump"
+
+[node name="PhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_targets")]
+position = Vector2(107, -172.5)
+script = ExtResource("6_diuy4")
+priority = 10
+follow_mode = 3
+follow_targets = [NodePath("../GroupNPCSprite"), NodePath("../CharacterBody2D/PlayerVisuals")]
+tween_resource = SubResource("Resource_spy00")
+tween_on_load = false
+follow_damping = true
+auto_zoom = true
+auto_zoom_margin = Vector4(200, 0, 200, 0)
+draw_limits = true
+
+[node name="GroupNPCSprite" type="Sprite2D" parent="."]
+unique_name_in_owner = true
+position = Vector2(107, -316)
+texture = ExtResource("5_0v2cd")
+
+[node name="CharacterBody2D" parent="." instance=ExtResource("7_ybwrw")]
+position = Vector2(265, -29)
+
+[editable path="CharacterBody2D"]
diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_follow_path_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_follow_path_example_scene.tscn
new file mode 100644 (file)
index 0000000..9fb9454
--- /dev/null
@@ -0,0 +1,659 @@
+[gd_scene load_steps=12 format=3 uid="uid://psbaaxnedqmq"]
+
+[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_17ngo"]
+[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_whpvu"]
+[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/ui_sign.tscn" id="3_rbo5b"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="4_yddet"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="5_x25dj"]
+[ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_2d_tween.tres" id="6_4vtmp"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="8_6pcaf"]
+[ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="8_a2pel"]
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"]
+texture = ExtResource("1_17ngo")
+0:0/0 = 0
+0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_0/angular_velocity = 0.0
+0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_1/angular_velocity = 0.0
+1:0/0 = 0
+1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_0/angular_velocity = 0.0
+1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_1/angular_velocity = 0.0
+2:0/0 = 0
+2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_0/angular_velocity = 0.0
+2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_1/angular_velocity = 0.0
+3:0/0 = 0
+3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_0/angular_velocity = 0.0
+3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_1/angular_velocity = 0.0
+4:0/0 = 0
+4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_0/angular_velocity = 0.0
+4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_1/angular_velocity = 0.0
+5:0/0 = 0
+5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_0/angular_velocity = 0.0
+5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_1/angular_velocity = 0.0
+6:0/0 = 0
+6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_0/angular_velocity = 0.0
+6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_1/angular_velocity = 0.0
+7:0/0 = 0
+7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_0/angular_velocity = 0.0
+7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_1/angular_velocity = 0.0
+0:1/0 = 0
+0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_0/angular_velocity = 0.0
+0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_1/angular_velocity = 0.0
+1:1/0 = 0
+1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_0/angular_velocity = 0.0
+1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_1/angular_velocity = 0.0
+2:1/0 = 0
+2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_0/angular_velocity = 0.0
+2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_1/angular_velocity = 0.0
+3:1/0 = 0
+3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_0/angular_velocity = 0.0
+3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_1/angular_velocity = 0.0
+4:1/0 = 0
+4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_0/angular_velocity = 0.0
+4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_1/angular_velocity = 0.0
+5:1/0 = 0
+5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_0/angular_velocity = 0.0
+5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_1/angular_velocity = 0.0
+7:1/0 = 0
+7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_0/angular_velocity = 0.0
+7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_1/angular_velocity = 0.0
+2:2/0 = 0
+2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_0/angular_velocity = 0.0
+2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_1/angular_velocity = 0.0
+3:2/0 = 0
+3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_0/angular_velocity = 0.0
+3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_1/angular_velocity = 0.0
+4:2/0 = 0
+4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_0/angular_velocity = 0.0
+4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_1/angular_velocity = 0.0
+7:2/0 = 0
+7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_0/angular_velocity = 0.0
+7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_1/angular_velocity = 0.0
+3:3/0 = 0
+3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_0/angular_velocity = 0.0
+3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_1/angular_velocity = 0.0
+4:3/0 = 0
+4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_0/angular_velocity = 0.0
+4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_1/angular_velocity = 0.0
+5:3/0 = 0
+5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_0/angular_velocity = 0.0
+5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_1/angular_velocity = 0.0
+7:3/0 = 0
+7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_0/angular_velocity = 0.0
+7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_1/angular_velocity = 0.0
+3:4/0 = 0
+3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_0/angular_velocity = 0.0
+3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_1/angular_velocity = 0.0
+4:4/0 = 0
+4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_0/angular_velocity = 0.0
+4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_1/angular_velocity = 0.0
+5:4/0 = 0
+5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_0/angular_velocity = 0.0
+5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_1/angular_velocity = 0.0
+7:4/0 = 0
+7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_0/angular_velocity = 0.0
+7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_1/angular_velocity = 0.0
+3:5/0 = 0
+3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_0/angular_velocity = 0.0
+3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_1/angular_velocity = 0.0
+4:5/0 = 0
+4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_0/angular_velocity = 0.0
+4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_1/angular_velocity = 0.0
+7:5/0 = 0
+7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_0/angular_velocity = 0.0
+7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_1/angular_velocity = 0.0
+3:6/0 = 0
+3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_0/angular_velocity = 0.0
+3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_1/angular_velocity = 0.0
+4:6/0 = 0
+4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_0/angular_velocity = 0.0
+4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_1/angular_velocity = 0.0
+7:6/0 = 0
+7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_0/angular_velocity = 0.0
+7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_1/angular_velocity = 0.0
+2:7/0 = 0
+2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_0/angular_velocity = 0.0
+2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_1/angular_velocity = 0.0
+3:7/0 = 0
+3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_0/angular_velocity = 0.0
+3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_1/angular_velocity = 0.0
+4:7/0 = 0
+4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_0/angular_velocity = 0.0
+4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_1/angular_velocity = 0.0
+5:7/0 = 0
+5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_0/angular_velocity = 0.0
+5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_1/angular_velocity = 0.0
+8:0/0 = 0
+8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_0/angular_velocity = 0.0
+8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_1/angular_velocity = 0.0
+9:0/0 = 0
+9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_0/angular_velocity = 0.0
+9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_1/angular_velocity = 0.0
+10:0/0 = 0
+10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_0/angular_velocity = 0.0
+10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_1/angular_velocity = 0.0
+11:0/0 = 0
+11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_0/angular_velocity = 0.0
+11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_1/angular_velocity = 0.0
+12:0/0 = 0
+12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_0/angular_velocity = 0.0
+12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_1/angular_velocity = 0.0
+13:0/0 = 0
+13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_0/angular_velocity = 0.0
+13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0 = 0
+14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_0/angular_velocity = 0.0
+14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8)
+14:0/0/custom_data_0 = &"Sign"
+15:0/0 = 0
+15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_0/angular_velocity = 0.0
+15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_1/angular_velocity = 0.0
+16:0/0 = 0
+16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_0/angular_velocity = 0.0
+16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_1/angular_velocity = 0.0
+8:1/0 = 0
+8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_0/angular_velocity = 0.0
+8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_1/angular_velocity = 0.0
+9:1/0 = 0
+9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_0/angular_velocity = 0.0
+9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_1/angular_velocity = 0.0
+10:1/0 = 0
+10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_0/angular_velocity = 0.0
+10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_1/angular_velocity = 0.0
+11:1/0 = 0
+11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_0/angular_velocity = 0.0
+11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_1/angular_velocity = 0.0
+12:1/0 = 0
+12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_0/angular_velocity = 0.0
+12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_1/angular_velocity = 0.0
+13:1/0 = 0
+13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_0/angular_velocity = 0.0
+13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_1/angular_velocity = 0.0
+14:1/0 = 0
+14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_0/angular_velocity = 0.0
+14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_1/angular_velocity = 0.0
+15:1/0 = 0
+15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_0/angular_velocity = 0.0
+15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_1/angular_velocity = 0.0
+16:1/0 = 0
+16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_0/angular_velocity = 0.0
+16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_1/angular_velocity = 0.0
+8:2/0 = 0
+8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_0/angular_velocity = 0.0
+8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_1/angular_velocity = 0.0
+9:2/0 = 0
+9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_0/angular_velocity = 0.0
+9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_1/angular_velocity = 0.0
+10:2/0 = 0
+10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_0/angular_velocity = 0.0
+10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_1/angular_velocity = 0.0
+11:2/0 = 0
+11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_0/angular_velocity = 0.0
+11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_1/angular_velocity = 0.0
+12:2/0 = 0
+12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_0/angular_velocity = 0.0
+12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_1/angular_velocity = 0.0
+13:2/0 = 0
+13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_0/angular_velocity = 0.0
+13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_1/angular_velocity = 0.0
+14:2/0 = 0
+14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_0/angular_velocity = 0.0
+14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_1/angular_velocity = 0.0
+15:2/0 = 0
+15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_0/angular_velocity = 0.0
+15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_1/angular_velocity = 0.0
+16:2/0 = 0
+16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_0/angular_velocity = 0.0
+16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_1/angular_velocity = 0.0
+8:3/0 = 0
+8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_0/angular_velocity = 0.0
+8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_1/angular_velocity = 0.0
+9:3/0 = 0
+9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_0/angular_velocity = 0.0
+9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_1/angular_velocity = 0.0
+10:3/0 = 0
+10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_0/angular_velocity = 0.0
+10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_1/angular_velocity = 0.0
+11:3/0 = 0
+11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_0/angular_velocity = 0.0
+11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_1/angular_velocity = 0.0
+12:3/0 = 0
+12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_0/angular_velocity = 0.0
+12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_1/angular_velocity = 0.0
+13:3/0 = 0
+13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_0/angular_velocity = 0.0
+13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_1/angular_velocity = 0.0
+14:3/0 = 0
+14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_0/angular_velocity = 0.0
+14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_1/angular_velocity = 0.0
+15:3/0 = 0
+15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_0/angular_velocity = 0.0
+15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_1/angular_velocity = 0.0
+16:3/0 = 0
+16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_0/angular_velocity = 0.0
+16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_1/angular_velocity = 0.0
+8:4/0 = 0
+8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_0/angular_velocity = 0.0
+8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_1/angular_velocity = 0.0
+9:4/0 = 0
+9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_0/angular_velocity = 0.0
+9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_1/angular_velocity = 0.0
+10:4/0 = 0
+10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_0/angular_velocity = 0.0
+10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_1/angular_velocity = 0.0
+11:4/0 = 0
+11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_0/angular_velocity = 0.0
+11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8)
+11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_1/angular_velocity = 0.0
+12:4/0 = 0
+12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_0/angular_velocity = 0.0
+12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_1/angular_velocity = 0.0
+13:4/0 = 0
+13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_0/angular_velocity = 0.0
+13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8)
+13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0 = 0
+14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_0/angular_velocity = 0.0
+14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
+14:4/0/custom_data_0 = &"Inventory"
+15:4/0 = 0
+15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_0/angular_velocity = 0.0
+15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_1/angular_velocity = 0.0
+16:4/0 = 0
+16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_0/angular_velocity = 0.0
+16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_1/angular_velocity = 0.0
+8:5/0 = 0
+8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_0/angular_velocity = 0.0
+8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_1/angular_velocity = 0.0
+9:5/0 = 0
+9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_0/angular_velocity = 0.0
+9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_1/angular_velocity = 0.0
+10:5/0 = 0
+10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_0/angular_velocity = 0.0
+10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_1/angular_velocity = 0.0
+11:5/0 = 0
+11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_0/angular_velocity = 0.0
+11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_1/angular_velocity = 0.0
+12:5/0 = 0
+12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_0/angular_velocity = 0.0
+12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_1/angular_velocity = 0.0
+13:5/0 = 0
+13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_0/angular_velocity = 0.0
+13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_1/angular_velocity = 0.0
+14:5/0 = 0
+14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_0/angular_velocity = 0.0
+14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_1/angular_velocity = 0.0
+15:5/0 = 0
+15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_0/angular_velocity = 0.0
+15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_1/angular_velocity = 0.0
+16:5/0 = 0
+16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_0/angular_velocity = 0.0
+16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_1/angular_velocity = 0.0
+8:6/0 = 0
+8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_0/angular_velocity = 0.0
+8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_1/angular_velocity = 0.0
+9:6/0 = 0
+9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_0/angular_velocity = 0.0
+9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_1/angular_velocity = 0.0
+10:6/0 = 0
+10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_0/angular_velocity = 0.0
+10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_1/angular_velocity = 0.0
+11:6/0 = 0
+11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_0/angular_velocity = 0.0
+11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5)
+11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_1/angular_velocity = 0.0
+12:6/0 = 0
+12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_0/angular_velocity = 0.0
+12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_1/angular_velocity = 0.0
+13:6/0 = 0
+13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_0/angular_velocity = 0.0
+13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8)
+13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_1/angular_velocity = 0.0
+14:6/0 = 0
+14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_0/angular_velocity = 0.0
+14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_1/angular_velocity = 0.0
+15:6/0 = 0
+15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_0/angular_velocity = 0.0
+15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_1/angular_velocity = 0.0
+16:6/0 = 0
+16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_0/angular_velocity = 0.0
+16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_1/angular_velocity = 0.0
+
+[sub_resource type="TileSet" id="TileSet_kf7eg"]
+physics_layer_0/collision_layer = 1
+physics_layer_1/collision_layer = 2
+physics_layer_1/collision_mask = 2
+custom_data_layer_0/name = "Type"
+custom_data_layer_0/type = 21
+sources/0 = SubResource("TileSetAtlasSource_easgx")
+
+[sub_resource type="Curve2D" id="Curve2D_usrhf"]
+_data = {
+"points": PackedVector2Array(-96.4111, 42.3785, 0, 0, 222, 0, 0, 0, 0, 0, 1550, 0)
+}
+point_count = 2
+
+[node name="ExampleScene2D" type="Node2D"]
+
+[node name="Background" type="CanvasLayer" parent="."]
+layer = -3
+
+[node name="ColorRect" type="ColorRect" parent="Background"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -311.0
+offset_top = -173.0
+offset_right = 981.0
+offset_bottom = 548.0
+grow_horizontal = 2
+grow_vertical = 2
+auto_translate = false
+localize_numeral_system = false
+color = Color(0.137255, 0.14902, 0.196078, 1)
+
+[node name="TileMap" type="TileMap" parent="."]
+z_index = -1
+scale = Vector2(3, 3)
+tile_set = SubResource("TileSet_kf7eg")
+format = 2
+layer_0/name = "Background"
+layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3)
+layer_1/name = "Terrain"
+layer_1/z_index = 1
+layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -65509, 720896, 3, -65510, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6, -196569, 720896, 4, -131033, 720896, 5, -65497, 720896, 5, 39, 720896, 5, 65575, 720896, 5, 131111, 720896, 5, 196647, 720896, 5, 262183, 720896, 5, 327719, 720896, 5, 393255, 720896, 5, 458791, 720896, 5, 524327, 720896, 5, 589863, 720896, 5, 655399, 720896, 6, -262104, 917504, 6, -196568, 786432, 4, -131032, 786432, 5, -65496, 655360, 6, 40, 786432, 5, 65576, 786432, 5, 131112, 786432, 5, 196648, 786432, 5, 262184, 786432, 5, 327720, 786432, 5, 393256, 786432, 5, 458792, 786432, 5, 524328, 655360, 6, 589864, 786432, 5, 655400, 786432, 6, -262103, 983040, 5, -196567, 786432, 4, -131031, 786432, 5, -65495, 786432, 5, 41, 589824, 6, 65577, 786432, 5, 131113, 786432, 5, 196649, 786432, 5, 262185, 786432, 5, 327721, 786432, 5, 393257, 786432, 5, 458793, 786432, 5, 524329, 786432, 5, 589865, 786432, 5, 655401, 786432, 6, -262102, 720896, 3, -196566, 786432, 4, -131030, 786432, 5, -65494, 786432, 5, 42, 786432, 5, 65578, 786432, 5, 131114, 786432, 5, 196650, 786432, 5, 262186, 655360, 6, 327722, 786432, 5, 393258, 786432, 5, 458794, 786432, 5, 524330, 786432, 5, 589866, 786432, 5, 655402, 786432, 6, -262101, 1048576, 6, -196565, 786432, 4, -131029, 786432, 5, -65493, 786432, 5, 43, 786432, 5, 65579, 786432, 5, 131115, 786432, 5, 196651, 786432, 5, 262187, 786432, 5, 327723, 786432, 5, 393259, 655360, 6, 458795, 655360, 6, 524331, 786432, 5, 589867, 786432, 5, 655403, 786432, 6, -262100, 720896, 3, -196564, 786432, 4, -131028, 786432, 5, -65492, 786432, 5, 44, 786432, 5, 65580, 786432, 5, 131116, 786432, 5, 196652, 786432, 5, 262188, 786432, 5, 327724, 786432, 5, 393260, 786432, 5, 458796, 786432, 5, 524332, 786432, 5, 589868, 786432, 5, 655404, 786432, 6, -262099, 983040, 6, -196563, 786432, 4, -131027, 786432, 5, -65491, 786432, 5, 45, 589824, 6, 65581, 655360, 6, 131117, 655360, 6, 196653, 786432, 5, 262189, 786432, 5, 327725, 786432, 5, 393261, 786432, 5, 458797, 786432, 5, 524333, 786432, 5, 589869, 655360, 6, 655405, 786432, 6, -196562, 786432, 4, -131026, 786432, 5, -65490, 786432, 5, 46, 786432, 5, 65582, 786432, 5, 131118, 786432, 5, 196654, 786432, 5, 262190, 786432, 5, 327726, 786432, 5, 393262, 786432, 5, 458798, 786432, 5, 524334, 786432, 5, 589870, 786432, 5, 655406, 786432, 6, -196561, 851968, 4, -131025, 851968, 5, -65489, 851968, 5, 47, 851968, 5, 65583, 851968, 5, 131119, 851968, 5, 196655, 851968, 5, 262191, 851968, 5, 327727, 851968, 5, 393263, 851968, 5, 458799, 851968, 5, 524335, 851968, 5, 589871, 851968, 5, 655407, 851968, 6, -131042, 720896, 4, -65506, 720896, 5, 30, 720896, 5, 65566, 720896, 5, 131102, 720896, 5, 196638, 720896, 5, 262174, 720896, 5, 327710, 720896, 5, 393246, 720896, 5, 458782, 720896, 5, 524318, 720896, 5, -196577, 917504, 6, -131041, 786432, 4, -65505, 786432, 5, 31, 655360, 6, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 786432, 5, 458783, 786432, 5, 524319, 786432, 5, -196576, 983040, 5, -131040, 786432, 4, -65504, 786432, 5, 32, 786432, 5, 65568, 589824, 6, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 524320, 786432, 5, -196575, 720896, 3, -131039, 786432, 4, -65503, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 786432, 5, 196641, 786432, 5, 262177, 786432, 5, 327713, 655360, 6, 393249, 786432, 5, 458785, 786432, 5, 524321, 786432, 5, -196574, 1048576, 6, -131038, 786432, 4, -65502, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 786432, 5, 327714, 786432, 5, 393250, 786432, 5, 458786, 655360, 6, 524322, 655360, 6, -196573, 720896, 3, -131037, 786432, 4, -65501, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 524323, 786432, 5, -196572, 983040, 6, -131036, 786432, 4, -65500, 786432, 5, 36, 786432, 5, 65572, 589824, 6, 131108, 655360, 6, 196644, 655360, 6, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 786432, 5, 524324, 786432, 5, -131035, 786432, 4, -65499, 786432, 5, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524325, 786432, 5, -131034, 851968, 4, -65498, 851968, 5, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 524326, 851968, 5, 589854, 720896, 5, 655390, 720896, 5, 720926, 720896, 6, 589855, 655360, 6, 655391, 786432, 5, 720927, 786432, 6, 589856, 786432, 5, 655392, 786432, 5, 720928, 786432, 6, 589857, 786432, 5, 655393, 786432, 5, 720929, 786432, 6, 589858, 786432, 5, 655394, 786432, 5, 720930, 786432, 6, 589859, 786432, 5, 655395, 786432, 5, 720931, 786432, 6, 589860, 786432, 5, 655396, 655360, 6, 720932, 786432, 6, 589861, 786432, 5, 655397, 786432, 5, 720933, 786432, 6, 589862, 851968, 5, 655398, 851968, 5, 720934, 851968, 6, -458704, 720896, 4, -393168, 720896, 5, -327632, 720896, 5, -262096, 720896, 5, -196560, 720896, 5, -131024, 720896, 5, -65488, 720896, 5, 48, 720896, 5, 65584, 720896, 5, 131120, 720896, 5, 196656, 720896, 5, 262192, 720896, 5, 327728, 720896, 5, 393264, 720896, 6, -524239, 917504, 6, -458703, 786432, 4, -393167, 786432, 5, -327631, 655360, 6, -262095, 786432, 5, -196559, 786432, 5, -131023, 786432, 5, -65487, 786432, 5, 49, 786432, 5, 65585, 786432, 5, 131121, 786432, 5, 196657, 786432, 5, 262193, 655360, 6, 327729, 786432, 5, 393265, 786432, 6, -524238, 983040, 5, -458702, 786432, 4, -393166, 786432, 5, -327630, 786432, 5, -262094, 589824, 6, -196558, 786432, 5, -131022, 786432, 5, -65486, 786432, 5, 50, 786432, 5, 65586, 786432, 5, 131122, 786432, 5, 196658, 786432, 5, 262194, 786432, 5, 327730, 786432, 5, 393266, 786432, 6, -524237, 720896, 3, -458701, 786432, 4, -393165, 786432, 5, -327629, 786432, 5, -262093, 786432, 5, -196557, 786432, 5, -131021, 786432, 5, -65485, 786432, 5, 51, 655360, 6, 65587, 786432, 5, 131123, 786432, 5, 196659, 786432, 5, 262195, 786432, 5, 327731, 786432, 5, 393267, 786432, 6, -524236, 1048576, 6, -458700, 786432, 4, -393164, 786432, 5, -327628, 786432, 5, -262092, 786432, 5, -196556, 786432, 5, -131020, 786432, 5, -65484, 786432, 5, 52, 786432, 5, 65588, 786432, 5, 131124, 655360, 6, 196660, 655360, 6, 262196, 786432, 5, 327732, 786432, 5, 393268, 786432, 6, -524235, 720896, 3, -458699, 786432, 4, -393163, 786432, 5, -327627, 786432, 5, -262091, 786432, 5, -196555, 786432, 5, -131019, 786432, 5, -65483, 786432, 5, 53, 786432, 5, 65589, 786432, 5, 131125, 786432, 5, 196661, 786432, 5, 262197, 786432, 5, 327733, 786432, 5, 393269, 786432, 6, -524234, 983040, 6, -458698, 786432, 4, -393162, 786432, 5, -327626, 786432, 5, -262090, 589824, 6, -196554, 655360, 6, -131018, 655360, 6, -65482, 786432, 5, 54, 786432, 5, 65590, 786432, 5, 131126, 786432, 5, 196662, 786432, 5, 262198, 786432, 5, 327734, 655360, 6, 393270, 786432, 6, -458697, 786432, 4, -393161, 786432, 5, -327625, 786432, 5, -262089, 786432, 5, -196553, 786432, 5, -131017, 786432, 5, -65481, 786432, 5, 55, 786432, 5, 65591, 786432, 5, 131127, 786432, 5, 196663, 786432, 5, 262199, 786432, 5, 327735, 786432, 5, 393271, 786432, 6, -458696, 851968, 4, -393160, 851968, 5, -327624, 851968, 5, -262088, 851968, 5, -196552, 851968, 5, -131016, 851968, 5, -65480, 851968, 5, 56, 851968, 5, 65592, 851968, 5, 131128, 851968, 5, 196664, 851968, 5, 262200, 851968, 5, 327736, 851968, 5, 393272, 851968, 6)
+
+[node name="UI" type="CanvasLayer" parent="."]
+
+[node name="UIInventory" parent="UI" instance=ExtResource("2_whpvu")]
+unique_name_in_owner = true
+visible = false
+
+[node name="UISign" parent="UI" instance=ExtResource("3_rbo5b")]
+unique_name_in_owner = true
+visible = false
+
+[node name="Camera2D" type="Camera2D" parent="."]
+position = Vector2(374, -216)
+zoom = Vector2(1.5, 1.5)
+
+[node name="PhantomCameraHost" type="Node" parent="Camera2D"]
+script = ExtResource("4_yddet")
+
+[node name="Label" type="Label" parent="."]
+offset_left = 167.0
+offset_top = -133.0
+offset_right = 332.0
+offset_bottom = -69.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("8_6pcaf")
+text = "[WASD] to move
+[Space] to jump"
+
+[node name="Player" type="Node" parent="."]
+
+[node name="Label" type="Label" parent="Player"]
+visible = false
+offset_left = 167.0
+offset_top = -145.0
+offset_right = 332.0
+offset_bottom = -81.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("8_6pcaf")
+text = "[WASD] to move
+[Space] to jump"
+
+[node name="PlayerPhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_target", "follow_path")]
+unique_name_in_owner = true
+position = Vector2(374, -216)
+script = ExtResource("5_x25dj")
+priority = 10
+follow_mode = 4
+follow_target = NodePath("../CharacterBody2D/PlayerVisuals")
+follow_path = NodePath("../Path2D")
+zoom = Vector2(1.5, 1.5)
+tween_resource = ExtResource("6_4vtmp")
+tween_on_load = false
+draw_limits = true
+
+[node name="Path2D" type="Path2D" parent="."]
+position = Vector2(152, -216)
+curve = SubResource("Curve2D_usrhf")
+
+[node name="CharacterBody2D" parent="." instance=ExtResource("8_a2pel")]
+position = Vector2(225, -28)
+
+[editable path="CharacterBody2D"]
diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_limit_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_limit_example_scene.tscn
new file mode 100644 (file)
index 0000000..fdfb571
--- /dev/null
@@ -0,0 +1,718 @@
+[gd_scene load_steps=16 format=3 uid="uid://w20wokw3ohsq"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween.gd" id="1_ijqyv"]
+[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_wmhqb"]
+[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_v5qg2"]
+[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/ui_sign.tscn" id="3_oqmwp"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="4_4b648"]
+[ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="5_pr2x5"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="9_twplb"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="9_w5e16"]
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"]
+texture = ExtResource("1_wmhqb")
+0:0/0 = 0
+0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_0/angular_velocity = 0.0
+0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_1/angular_velocity = 0.0
+1:0/0 = 0
+1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_0/angular_velocity = 0.0
+1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_1/angular_velocity = 0.0
+2:0/0 = 0
+2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_0/angular_velocity = 0.0
+2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_1/angular_velocity = 0.0
+3:0/0 = 0
+3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_0/angular_velocity = 0.0
+3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_1/angular_velocity = 0.0
+4:0/0 = 0
+4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_0/angular_velocity = 0.0
+4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_1/angular_velocity = 0.0
+5:0/0 = 0
+5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_0/angular_velocity = 0.0
+5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_1/angular_velocity = 0.0
+6:0/0 = 0
+6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_0/angular_velocity = 0.0
+6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_1/angular_velocity = 0.0
+7:0/0 = 0
+7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_0/angular_velocity = 0.0
+7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_1/angular_velocity = 0.0
+0:1/0 = 0
+0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_0/angular_velocity = 0.0
+0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_1/angular_velocity = 0.0
+1:1/0 = 0
+1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_0/angular_velocity = 0.0
+1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_1/angular_velocity = 0.0
+2:1/0 = 0
+2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_0/angular_velocity = 0.0
+2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_1/angular_velocity = 0.0
+3:1/0 = 0
+3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_0/angular_velocity = 0.0
+3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_1/angular_velocity = 0.0
+4:1/0 = 0
+4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_0/angular_velocity = 0.0
+4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_1/angular_velocity = 0.0
+5:1/0 = 0
+5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_0/angular_velocity = 0.0
+5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_1/angular_velocity = 0.0
+7:1/0 = 0
+7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_0/angular_velocity = 0.0
+7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_1/angular_velocity = 0.0
+2:2/0 = 0
+2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_0/angular_velocity = 0.0
+2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_1/angular_velocity = 0.0
+3:2/0 = 0
+3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_0/angular_velocity = 0.0
+3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_1/angular_velocity = 0.0
+4:2/0 = 0
+4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_0/angular_velocity = 0.0
+4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_1/angular_velocity = 0.0
+7:2/0 = 0
+7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_0/angular_velocity = 0.0
+7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_1/angular_velocity = 0.0
+3:3/0 = 0
+3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_0/angular_velocity = 0.0
+3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_1/angular_velocity = 0.0
+4:3/0 = 0
+4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_0/angular_velocity = 0.0
+4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_1/angular_velocity = 0.0
+5:3/0 = 0
+5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_0/angular_velocity = 0.0
+5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_1/angular_velocity = 0.0
+7:3/0 = 0
+7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_0/angular_velocity = 0.0
+7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_1/angular_velocity = 0.0
+3:4/0 = 0
+3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_0/angular_velocity = 0.0
+3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_1/angular_velocity = 0.0
+4:4/0 = 0
+4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_0/angular_velocity = 0.0
+4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_1/angular_velocity = 0.0
+5:4/0 = 0
+5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_0/angular_velocity = 0.0
+5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_1/angular_velocity = 0.0
+7:4/0 = 0
+7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_0/angular_velocity = 0.0
+7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_1/angular_velocity = 0.0
+3:5/0 = 0
+3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_0/angular_velocity = 0.0
+3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_1/angular_velocity = 0.0
+4:5/0 = 0
+4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_0/angular_velocity = 0.0
+4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_1/angular_velocity = 0.0
+7:5/0 = 0
+7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_0/angular_velocity = 0.0
+7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_1/angular_velocity = 0.0
+3:6/0 = 0
+3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_0/angular_velocity = 0.0
+3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_1/angular_velocity = 0.0
+4:6/0 = 0
+4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_0/angular_velocity = 0.0
+4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_1/angular_velocity = 0.0
+7:6/0 = 0
+7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_0/angular_velocity = 0.0
+7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_1/angular_velocity = 0.0
+2:7/0 = 0
+2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_0/angular_velocity = 0.0
+2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_1/angular_velocity = 0.0
+3:7/0 = 0
+3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_0/angular_velocity = 0.0
+3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_1/angular_velocity = 0.0
+4:7/0 = 0
+4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_0/angular_velocity = 0.0
+4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_1/angular_velocity = 0.0
+5:7/0 = 0
+5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_0/angular_velocity = 0.0
+5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_1/angular_velocity = 0.0
+8:0/0 = 0
+8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_0/angular_velocity = 0.0
+8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_1/angular_velocity = 0.0
+9:0/0 = 0
+9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_0/angular_velocity = 0.0
+9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_1/angular_velocity = 0.0
+10:0/0 = 0
+10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_0/angular_velocity = 0.0
+10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_1/angular_velocity = 0.0
+11:0/0 = 0
+11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_0/angular_velocity = 0.0
+11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_1/angular_velocity = 0.0
+12:0/0 = 0
+12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_0/angular_velocity = 0.0
+12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_1/angular_velocity = 0.0
+13:0/0 = 0
+13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_0/angular_velocity = 0.0
+13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0 = 0
+14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_0/angular_velocity = 0.0
+14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8)
+14:0/0/custom_data_0 = &"Sign"
+15:0/0 = 0
+15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_0/angular_velocity = 0.0
+15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_1/angular_velocity = 0.0
+16:0/0 = 0
+16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_0/angular_velocity = 0.0
+16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_1/angular_velocity = 0.0
+8:1/0 = 0
+8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_0/angular_velocity = 0.0
+8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_1/angular_velocity = 0.0
+9:1/0 = 0
+9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_0/angular_velocity = 0.0
+9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_1/angular_velocity = 0.0
+10:1/0 = 0
+10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_0/angular_velocity = 0.0
+10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_1/angular_velocity = 0.0
+11:1/0 = 0
+11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_0/angular_velocity = 0.0
+11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_1/angular_velocity = 0.0
+12:1/0 = 0
+12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_0/angular_velocity = 0.0
+12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_1/angular_velocity = 0.0
+13:1/0 = 0
+13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_0/angular_velocity = 0.0
+13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_1/angular_velocity = 0.0
+14:1/0 = 0
+14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_0/angular_velocity = 0.0
+14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_1/angular_velocity = 0.0
+15:1/0 = 0
+15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_0/angular_velocity = 0.0
+15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_1/angular_velocity = 0.0
+16:1/0 = 0
+16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_0/angular_velocity = 0.0
+16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_1/angular_velocity = 0.0
+8:2/0 = 0
+8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_0/angular_velocity = 0.0
+8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_1/angular_velocity = 0.0
+9:2/0 = 0
+9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_0/angular_velocity = 0.0
+9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_1/angular_velocity = 0.0
+10:2/0 = 0
+10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_0/angular_velocity = 0.0
+10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_1/angular_velocity = 0.0
+11:2/0 = 0
+11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_0/angular_velocity = 0.0
+11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_1/angular_velocity = 0.0
+12:2/0 = 0
+12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_0/angular_velocity = 0.0
+12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_1/angular_velocity = 0.0
+13:2/0 = 0
+13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_0/angular_velocity = 0.0
+13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_1/angular_velocity = 0.0
+14:2/0 = 0
+14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_0/angular_velocity = 0.0
+14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_1/angular_velocity = 0.0
+15:2/0 = 0
+15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_0/angular_velocity = 0.0
+15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_1/angular_velocity = 0.0
+16:2/0 = 0
+16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_0/angular_velocity = 0.0
+16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_1/angular_velocity = 0.0
+8:3/0 = 0
+8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_0/angular_velocity = 0.0
+8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_1/angular_velocity = 0.0
+9:3/0 = 0
+9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_0/angular_velocity = 0.0
+9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_1/angular_velocity = 0.0
+10:3/0 = 0
+10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_0/angular_velocity = 0.0
+10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_1/angular_velocity = 0.0
+11:3/0 = 0
+11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_0/angular_velocity = 0.0
+11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_1/angular_velocity = 0.0
+12:3/0 = 0
+12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_0/angular_velocity = 0.0
+12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_1/angular_velocity = 0.0
+13:3/0 = 0
+13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_0/angular_velocity = 0.0
+13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_1/angular_velocity = 0.0
+14:3/0 = 0
+14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_0/angular_velocity = 0.0
+14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_1/angular_velocity = 0.0
+15:3/0 = 0
+15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_0/angular_velocity = 0.0
+15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_1/angular_velocity = 0.0
+16:3/0 = 0
+16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_0/angular_velocity = 0.0
+16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_1/angular_velocity = 0.0
+8:4/0 = 0
+8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_0/angular_velocity = 0.0
+8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_1/angular_velocity = 0.0
+9:4/0 = 0
+9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_0/angular_velocity = 0.0
+9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_1/angular_velocity = 0.0
+10:4/0 = 0
+10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_0/angular_velocity = 0.0
+10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_1/angular_velocity = 0.0
+11:4/0 = 0
+11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_0/angular_velocity = 0.0
+11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8)
+11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_1/angular_velocity = 0.0
+12:4/0 = 0
+12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_0/angular_velocity = 0.0
+12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_1/angular_velocity = 0.0
+13:4/0 = 0
+13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_0/angular_velocity = 0.0
+13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8)
+13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0 = 0
+14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_0/angular_velocity = 0.0
+14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
+14:4/0/custom_data_0 = &"Inventory"
+15:4/0 = 0
+15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_0/angular_velocity = 0.0
+15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_1/angular_velocity = 0.0
+16:4/0 = 0
+16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_0/angular_velocity = 0.0
+16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_1/angular_velocity = 0.0
+8:5/0 = 0
+8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_0/angular_velocity = 0.0
+8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_1/angular_velocity = 0.0
+9:5/0 = 0
+9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_0/angular_velocity = 0.0
+9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_1/angular_velocity = 0.0
+10:5/0 = 0
+10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_0/angular_velocity = 0.0
+10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_1/angular_velocity = 0.0
+11:5/0 = 0
+11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_0/angular_velocity = 0.0
+11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_1/angular_velocity = 0.0
+12:5/0 = 0
+12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_0/angular_velocity = 0.0
+12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_1/angular_velocity = 0.0
+13:5/0 = 0
+13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_0/angular_velocity = 0.0
+13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_1/angular_velocity = 0.0
+14:5/0 = 0
+14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_0/angular_velocity = 0.0
+14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_1/angular_velocity = 0.0
+15:5/0 = 0
+15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_0/angular_velocity = 0.0
+15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_1/angular_velocity = 0.0
+16:5/0 = 0
+16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_0/angular_velocity = 0.0
+16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_1/angular_velocity = 0.0
+8:6/0 = 0
+8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_0/angular_velocity = 0.0
+8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_1/angular_velocity = 0.0
+9:6/0 = 0
+9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_0/angular_velocity = 0.0
+9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_1/angular_velocity = 0.0
+10:6/0 = 0
+10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_0/angular_velocity = 0.0
+10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_1/angular_velocity = 0.0
+11:6/0 = 0
+11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_0/angular_velocity = 0.0
+11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5)
+11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_1/angular_velocity = 0.0
+12:6/0 = 0
+12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_0/angular_velocity = 0.0
+12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_1/angular_velocity = 0.0
+13:6/0 = 0
+13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_0/angular_velocity = 0.0
+13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8)
+13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_1/angular_velocity = 0.0
+14:6/0 = 0
+14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_0/angular_velocity = 0.0
+14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_1/angular_velocity = 0.0
+15:6/0 = 0
+15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_0/angular_velocity = 0.0
+15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_1/angular_velocity = 0.0
+16:6/0 = 0
+16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_0/angular_velocity = 0.0
+16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_1/angular_velocity = 0.0
+
+[sub_resource type="TileSet" id="TileSet_kf7eg"]
+physics_layer_0/collision_layer = 1
+physics_layer_1/collision_layer = 2
+physics_layer_1/collision_mask = 2
+custom_data_layer_0/name = "Type"
+custom_data_layer_0/type = 21
+sources/0 = SubResource("TileSetAtlasSource_easgx")
+
+[sub_resource type="Resource" id="Resource_ct1eh"]
+script = ExtResource("9_twplb")
+duration = 0.9
+transition = 2
+ease = 2
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_xmxri"]
+size = Vector2(790, 410)
+
+[sub_resource type="Resource" id="Resource_exr3j"]
+script = ExtResource("9_twplb")
+duration = 0.9
+transition = 2
+ease = 2
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_wtfjw"]
+size = Vector2(1530, 700)
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_daeuh"]
+size = Vector2(1027.5, 610.5)
+
+[node name="ExampleScene2D" type="Node2D"]
+script = ExtResource("1_ijqyv")
+
+[node name="Background" type="CanvasLayer" parent="."]
+layer = -3
+
+[node name="ColorRect" type="ColorRect" parent="Background"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -311.0
+offset_top = -173.0
+offset_right = 981.0
+offset_bottom = 548.0
+grow_horizontal = 2
+grow_vertical = 2
+auto_translate = false
+localize_numeral_system = false
+color = Color(0.137255, 0.14902, 0.196078, 1)
+metadata/_edit_lock_ = true
+
+[node name="TileMap" type="TileMap" parent="."]
+z_index = -1
+position = Vector2(-97, 0)
+scale = Vector2(3, 3)
+tile_set = SubResource("TileSet_kf7eg")
+format = 2
+layer_0/name = "Background"
+layer_0/tile_data = PackedInt32Array(-458743, 851968, 6, -458744, 786432, 6, -458745, 786432, 6, -458746, 786432, 6, -458747, 786432, 6, -458748, 786432, 6, -458749, 786432, 6, -458750, 786432, 6, -458751, 786432, 6, -393218, 786432, 6, -393219, 786432, 6, -393220, 786432, 6, -393221, 720896, 6, -458752, 786432, 6, -393217, 786432, 6, -524279, 851968, 5, -589815, 851968, 5, -655351, 851968, 5, -720887, 851968, 4, -720888, 786432, 4, -720889, 786432, 4, -720890, 786432, 4, -720891, 786432, 4, -720892, 786432, 4, -720893, 786432, 4, -720894, 786432, 4, -720895, 786432, 4, -720896, 786432, 4, -655361, 786432, 4, -655362, 786432, 4, -655363, 786432, 4, -655364, 786432, 4, -655365, 720896, 4, -589829, 720896, 5, -524293, 720896, 5, -458757, 720896, 5, -589828, 786432, 5, -524292, 786432, 5, -458756, 786432, 5, -589827, 786432, 5, -524291, 786432, 5, -458755, 786432, 5, -589826, 786432, 5, -524290, 786432, 5, -458754, 786432, 5, -589825, 786432, 5, -524289, 786432, 5, -458753, 786432, 5, -655360, 786432, 5, -589824, 786432, 5, -524288, 786432, 5, -655359, 786432, 5, -589823, 786432, 5, -524287, 786432, 5, -655358, 786432, 5, -589822, 786432, 5, -524286, 786432, 5, -655357, 786432, 5, -589821, 786432, 5, -524285, 786432, 5, -655356, 786432, 5, -589820, 786432, 5, -524284, 786432, 5, -655355, 786432, 5, -589819, 786432, 5, -524283, 786432, 5, -655354, 786432, 5, -589818, 786432, 5, -524282, 786432, 5, -655353, 786432, 5, -589817, 786432, 5, -524281, 786432, 5, -655352, 786432, 5, -589816, 786432, 5, -524280, 786432, 5)
+layer_1/name = "Terrain"
+layer_1/z_index = 1
+layer_1/tile_data = PackedInt32Array(65533, 720896, 0, 65534, 720896, 0, 65535, 720896, 0, 0, 720896, 0, 1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65532, 720896, 0, 65531, 655360, 0, 131067, 655360, 1, 196603, 655360, 1, 262139, 655360, 1, 327675, 655360, 1, 393211, 655360, 1, 131068, 720896, 1, 196604, 720896, 1, 262140, 720896, 1, 327676, 720896, 1, 393212, 720896, 1, 131069, 720896, 1, 196605, 720896, 1, 262141, 720896, 1, 327677, 720896, 1, 393213, 720896, 1, 131070, 720896, 1, 196606, 720896, 1, 262142, 720896, 1, 327678, 720896, 1, 393214, 720896, 1, 131071, 720896, 1, 196607, 720896, 1, 262143, 720896, 1, 327679, 720896, 1, 393215, 720896, 1, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 720896, 1, 327681, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 65540, 720896, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 720896, 1, 327685, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 720896, 1, 262152, 720896, 1, 327688, 720896, 1, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1)
+
+[node name="TileMap2" type="TileMap" parent="."]
+z_index = -1
+scale = Vector2(3, 3)
+tile_set = SubResource("TileSet_kf7eg")
+format = 2
+layer_0/name = "Background"
+layer_1/name = "Terrain"
+layer_1/z_index = 1
+layer_1/tile_data = PackedInt32Array(8, 786432, 4, 9, 786432, 4, 10, 786432, 4, 11, 786432, 4, 12, 786432, 4, 13, 786432, 4, 14, 786432, 4, 65528, 851968, 5, 65527, 786432, 5, 65526, 786432, 5, 65525, 786432, 5, 65524, 786432, 5, 65523, 786432, 5, 65544, 786432, 5, 131080, 786432, 5, 196616, 786432, 5, 262152, 786432, 5, 65545, 786432, 5, 131081, 786432, 5, 196617, 786432, 5, 262153, 786432, 5, 65546, 786432, 5, 131082, 786432, 5, 196618, 786432, 5, 262154, 786432, 5, 65547, 786432, 5, 131083, 786432, 5, 196619, 786432, 5, 262155, 786432, 5, 65548, 786432, 5, 131084, 786432, 5, 196620, 786432, 5, 262156, 786432, 5, 65549, 786432, 5, 131085, 786432, 5, 196621, 786432, 5, 262157, 786432, 5, 65550, 786432, 5, 131086, 786432, 5, 196622, 786432, 5, 262158, 786432, 5, 327694, 786432, 5, 327693, 786432, 5, 327692, 786432, 5, 327691, 786432, 5, 327690, 786432, 5, 327689, 786432, 5, 327688, 786432, 5, -131089, 720896, 5, -65553, 720896, 5, -17, 720896, 5, 65519, 720896, 6, -131088, 786432, 5, -65552, 786432, 5, -16, 786432, 5, 65520, 786432, 5, -131087, 786432, 5, -65551, 786432, 5, -15, 786432, 5, 65521, 786432, 5, -131086, 786432, 5, -65550, 786432, 5, -14, 786432, 5, 65522, 786432, 5, -131085, 786432, 5, -65549, 786432, 5, -13, 786432, 5, -131084, 786432, 5, -65548, 786432, 5, -12, 786432, 5, -131083, 786432, 5, -65547, 786432, 5, -11, 786432, 5, -131082, 786432, 5, -65546, 786432, 5, -10, 786432, 5, -131081, 786432, 5, -65545, 786432, 5, -9, 786432, 5, -131080, 851968, 5, -65544, 851968, 5, -8, 851968, 5, 131064, 851968, 5, 196600, 851968, 5, 262136, 851968, 5, 327672, 851968, 5, 393208, 851968, 5, 131056, 786432, 5, 196592, 786432, 5, 262128, 786432, 5, 327664, 786432, 5, 393200, 786432, 5, 131057, 786432, 5, 196593, 786432, 5, 262129, 786432, 5, 327665, 786432, 5, 393201, 786432, 5, 131058, 786432, 5, 196594, 786432, 5, 262130, 786432, 5, 327666, 786432, 5, 393202, 786432, 5, 131059, 786432, 5, 196595, 786432, 5, 262131, 786432, 5, 327667, 786432, 5, 393203, 786432, 5, 131060, 786432, 5, 196596, 786432, 5, 262132, 786432, 5, 327668, 786432, 5, 393204, 786432, 5, 131061, 786432, 5, 196597, 786432, 5, 262133, 786432, 5, 327669, 786432, 5, 393205, 786432, 5, 131062, 786432, 5, 196598, 786432, 5, 262134, 786432, 5, 327670, 786432, 5, 393206, 786432, 5, 131063, 786432, 5, 196599, 786432, 5, 262135, 786432, 5, 327671, 786432, 5, 393207, 786432, 5, 17, 786432, 4, 65553, 786432, 5, 131089, 786432, 5, 196625, 786432, 5, 262161, 786432, 5, 327697, 786432, 5, 18, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 327698, 786432, 5, 15, 786432, 4, 65551, 786432, 5, 131087, 786432, 5, 196623, 786432, 5, 262159, 786432, 5, 327695, 786432, 5, 16, 786432, 4, 65552, 786432, 5, 131088, 786432, 5, 196624, 786432, 5, 262160, 786432, 5, 327696, 786432, 5, 19, 786432, 4, 65555, 786432, 5, 131091, 786432, 5, 196627, 786432, 5, 262163, 786432, 5, 327699, 786432, 5, -458769, 720896, 5, -393233, 720896, 5, -458768, 786432, 5, -393232, 786432, 5, -458767, 786432, 5, -393231, 786432, 5, -458766, 786432, 5, -393230, 786432, 5, -458765, 786432, 5, -393229, 786432, 5, -458764, 786432, 5, -393228, 786432, 5, -458763, 786432, 5, -393227, 786432, 5, -458762, 786432, 5, -393226, 786432, 5, -458761, 786432, 5, -393225, 786432, 5, -458760, 851968, 5, -393224, 851968, 5, -655377, 720896, 4, -589841, 720896, 5, -524305, 720896, 5, -655376, 786432, 4, -589840, 786432, 5, -524304, 786432, 5, -655375, 786432, 4, -589839, 786432, 5, -524303, 786432, 5, -655374, 786432, 4, -589838, 786432, 5, -524302, 786432, 5, -655373, 786432, 4, -589837, 786432, 5, -524301, 786432, 5, -655372, 786432, 4, -589836, 786432, 5, -524300, 786432, 5, -655371, 786432, 4, -589835, 786432, 5, -524299, 786432, 5, -655370, 786432, 4, -589834, 786432, 5, -524298, 786432, 5, -655369, 786432, 4, -589833, 786432, 5, -524297, 786432, 5, -655368, 851968, 4, -589832, 851968, 5, -524296, 851968, 5, -327697, 720896, 5, -327696, 786432, 5, -327695, 786432, 5, -327694, 786432, 5, -327693, 786432, 5, -327692, 786432, 5, -327691, 786432, 5, -327690, 786432, 5, -327689, 786432, 5, -327688, 851968, 5, -262161, 720896, 5, -262160, 786432, 5, -262159, 786432, 5, -262158, 786432, 5, -262157, 786432, 5, -262156, 786432, 5, -262155, 786432, 5, -262154, 786432, 5, -262153, 786432, 5, -262152, 851968, 5, -196625, 720896, 5, -196624, 786432, 5, -196623, 786432, 5, -196622, 786432, 5, -196621, 786432, 5, -196620, 786432, 5, -196619, 786432, 5, -196618, 786432, 5, -196617, 786432, 5, -196616, 851968, 5, 20, 786432, 4, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 327700, 786432, 5, 21, 786432, 4, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 327701, 786432, 5, 22, 786432, 4, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 786432, 5, 327702, 786432, 5, 23, 786432, 4, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327703, 786432, 5, 24, 786432, 4, 65560, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 25, 786432, 4, 65561, 786432, 5, 131097, 786432, 5, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 26, 786432, 4, 65562, 786432, 5, 131098, 786432, 5, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 27, 786432, 4, 65563, 786432, 5, 131099, 786432, 5, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, -65498, 917504, 3, 38, 786432, 4, 65574, 786432, 5, 131110, 786432, 5, 196646, 786432, 5, 262182, 786432, 5, 327718, 786432, 5, 39, 786432, 4, 65575, 786432, 5, 131111, 786432, 5, 196647, 786432, 5, 262183, 786432, 5, 327719, 786432, 5, -65496, 983040, 3, 40, 786432, 4, 65576, 786432, 5, 131112, 786432, 5, 196648, 786432, 5, 262184, 786432, 5, 327720, 786432, 5, -65495, 983040, 3, 41, 786432, 4, 65577, 786432, 5, 131113, 786432, 5, 196649, 786432, 5, 262185, 786432, 5, 327721, 786432, 5, -65494, 983040, 3, 42, 786432, 4, 65578, 786432, 5, 131114, 786432, 5, 196650, 786432, 5, 262186, 786432, 5, 327722, 786432, 5, -65493, 983040, 3, 43, 786432, 4, 65579, 786432, 5, 131115, 786432, 5, 196651, 786432, 5, 262187, 786432, 5, 327723, 786432, 5, -65492, 983040, 3, 44, 786432, 4, 65580, 786432, 5, 131116, 786432, 5, 196652, 786432, 5, 262188, 786432, 5, 327724, 786432, 5, -65491, 983040, 3, 45, 786432, 4, 65581, 786432, 5, 131117, 786432, 5, 196653, 786432, 5, 262189, 786432, 5, 327725, 786432, 5, -65490, 983040, 3, 46, 786432, 4, 65582, 786432, 5, 131118, 786432, 5, 196654, 786432, 5, 262190, 786432, 5, 327726, 786432, 5, -65489, 983040, 3, 47, 786432, 4, 65583, 786432, 5, 131119, 786432, 5, 196655, 786432, 5, 262191, 786432, 5, 327727, 786432, 5, -65488, 1048576, 3, 48, 786432, 4, 65584, 786432, 5, 131120, 786432, 5, 196656, 786432, 5, 262192, 786432, 5, 327728, 786432, 5, 49, 851968, 4, 65585, 851968, 5, 131121, 851968, 5, 196657, 851968, 5, 262193, 851968, 5, 327729, 851968, 5, -65497, 983040, 3, -589774, 720896, 4, -524238, 720896, 5, -458702, 720896, 5, -393166, 720896, 5, -327630, 720896, 5, -262094, 720896, 5, -196558, 720896, 5, -131022, 720896, 5, -65486, 720896, 5, 50, 720896, 5, 65586, 720896, 5, 131122, 720896, 5, 196658, 720896, 5, 262194, 720896, 5, 327730, 720896, 5, -589773, 786432, 4, -524237, 786432, 5, -458701, 786432, 5, -393165, 786432, 5, -327629, 786432, 5, -262093, 786432, 5, -196557, 786432, 5, -131021, 786432, 5, -65485, 786432, 5, 51, 786432, 5, 65587, 786432, 5, 131123, 786432, 5, 196659, 786432, 5, 262195, 786432, 5, 327731, 786432, 5, -589772, 786432, 4, -524236, 786432, 5, -458700, 786432, 5, -393164, 786432, 5, -327628, 786432, 5, -262092, 786432, 5, -196556, 786432, 5, -131020, 786432, 5, -65484, 786432, 5, 52, 786432, 5, 65588, 786432, 5, 131124, 786432, 5, 196660, 786432, 5, 262196, 786432, 5, 327732, 786432, 5, -589771, 786432, 4, -524235, 786432, 5, -458699, 786432, 5, -393163, 786432, 5, -327627, 786432, 5, -262091, 786432, 5, -196555, 786432, 5, -131019, 786432, 5, -65483, 786432, 5, 53, 786432, 5, 65589, 786432, 5, 131125, 786432, 5, 196661, 786432, 5, 262197, 786432, 5, 327733, 786432, 5, -589770, 786432, 4, -524234, 786432, 5, -458698, 786432, 5, -393162, 786432, 5, -327626, 786432, 5, -262090, 786432, 5, -196554, 786432, 5, -131018, 786432, 5, -65482, 786432, 5, 54, 786432, 5, 65590, 786432, 5, 131126, 786432, 5, 196662, 786432, 5, 262198, 786432, 5, 327734, 786432, 5, -589769, 786432, 4, -524233, 786432, 5, -458697, 786432, 5, -393161, 786432, 5, -327625, 786432, 5, -262089, 786432, 5, -196553, 786432, 5, -131017, 786432, 5, -65481, 786432, 5, 55, 786432, 5, 65591, 786432, 5, 131127, 786432, 5, 196663, 786432, 5, 262199, 786432, 5, 327735, 786432, 5, -589768, 786432, 4, -524232, 786432, 5, -458696, 786432, 5, -393160, 786432, 5, -327624, 786432, 5, -262088, 786432, 5, -196552, 786432, 5, -131016, 786432, 5, -65480, 786432, 5, 56, 786432, 5, 65592, 786432, 5, 131128, 786432, 5, 196664, 786432, 5, 262200, 786432, 5, 327736, 786432, 5, -589767, 786432, 4, -524231, 786432, 5, -458695, 786432, 5, -393159, 786432, 5, -327623, 786432, 5, -262087, 786432, 5, -196551, 786432, 5, -131015, 786432, 5, -65479, 786432, 5, 57, 786432, 5, 65593, 786432, 5, 131129, 786432, 5, 196665, 786432, 5, 262201, 786432, 5, 327737, 786432, 5, -589766, 786432, 4, -524230, 786432, 5, -458694, 786432, 5, -393158, 786432, 5, -327622, 786432, 5, -262086, 786432, 5, -196550, 786432, 5, -131014, 786432, 5, -65478, 786432, 5, 58, 786432, 5, 65594, 786432, 5, 131130, 786432, 5, 196666, 786432, 5, 262202, 786432, 5, 327738, 786432, 5, -589765, 851968, 4, -524229, 851968, 5, -458693, 851968, 5, -393157, 851968, 5, -327621, 851968, 5, -262085, 851968, 5, -196549, 851968, 5, -131013, 851968, 5, -65477, 851968, 5, 59, 851968, 5, 65595, 851968, 5, 131131, 851968, 5, 196667, 851968, 5, 262203, 851968, 5, 327739, 851968, 5, 28, 786432, 4, 65564, 786432, 5, 131100, 786432, 5, 196636, 786432, 5, 262172, 786432, 5, 327708, 786432, 5, 29, 786432, 4, 65565, 786432, 5, 131101, 786432, 5, 196637, 786432, 5, 262173, 786432, 5, 327709, 786432, 5, 30, 786432, 4, 65566, 786432, 5, 131102, 786432, 5, 196638, 786432, 5, 262174, 786432, 5, 327710, 786432, 5, 31, 786432, 4, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 32, 786432, 4, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 33, 786432, 4, 65569, 786432, 5, 131105, 786432, 5, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 34, 786432, 4, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 786432, 5, 327714, 786432, 5, 35, 786432, 4, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 36, 786432, 4, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 37, 786432, 4, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, -65487, 458752, 6, -131023, 458752, 5, -196559, 458752, 5, -262095, 458752, 5, -327631, 458752, 5, -393167, 458752, 5, -458703, 458752, 5, -524239, 458752, 5, -589775, 458752, 4)
+
+[node name="UI" type="CanvasLayer" parent="."]
+
+[node name="UIInventory" parent="UI" instance=ExtResource("2_v5qg2")]
+unique_name_in_owner = true
+visible = false
+
+[node name="UISign" parent="UI" instance=ExtResource("3_oqmwp")]
+unique_name_in_owner = true
+visible = false
+
+[node name="CharacterBody2D" parent="." instance=ExtResource("5_pr2x5")]
+unique_name_in_owner = true
+position = Vector2(66, -50)
+
+[node name="RoomLeftPhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_target")]
+unique_name_in_owner = true
+position = Vector2(66, -113.205)
+script = ExtResource("4_4b648")
+priority = 5
+follow_mode = 2
+follow_target = NodePath("../CharacterBody2D/PlayerVisuals")
+zoom = Vector2(2, 2)
+tween_resource = SubResource("Resource_ct1eh")
+follow_offset = Vector2(0, -63.205)
+follow_damping = true
+draw_limits = true
+limit_target = NodePath("../TileMap")
+limit_margin = Vector4i(-50, 0, -50, 0)
+
+[node name="RoomLeftArea2D" type="Area2D" parent="."]
+unique_name_in_owner = true
+position = Vector2(117, -174)
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomLeftArea2D"]
+position = Vector2(-79, 43)
+shape = SubResource("RectangleShape2D_xmxri")
+debug_color = Color(0, 0.6, 0.701961, 0.0313726)
+
+[node name="RoomCentrePhantomCamera2D" type="Node2D" parent="."]
+unique_name_in_owner = true
+position = Vector2(1474, -149)
+script = ExtResource("4_4b648")
+follow_mode = 2
+zoom = Vector2(1.5, 1.5)
+tween_resource = SubResource("Resource_exr3j")
+follow_damping = true
+draw_limits = true
+limit_target = NodePath("../RoomCentreArea2D/CollisionShape2D")
+
+[node name="RoomCentreArea2D" type="Area2D" parent="."]
+unique_name_in_owner = true
+position = Vector2(755, -179)
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomCentreArea2D"]
+position = Vector2(338, -28)
+shape = SubResource("RectangleShape2D_wtfjw")
+debug_color = Color(0, 0.6, 0.701961, 0)
+
+[node name="RoomRightArea2D" type="Area2D" parent="."]
+unique_name_in_owner = true
+position = Vector2(2065, -160)
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomRightArea2D"]
+position = Vector2(255.75, -3.25)
+shape = SubResource("RectangleShape2D_daeuh")
+debug_color = Color(0, 0.6, 0.701961, 0)
+
+[node name="RoomRightPhantomCamera2D" type="Node2D" parent="."]
+unique_name_in_owner = true
+position = Vector2(2347, -156)
+scale = Vector2(1.0024, 1)
+script = ExtResource("4_4b648")
+follow_mode = 2
+zoom = Vector2(2, 2)
+tween_resource = SubResource("Resource_exr3j")
+follow_damping = true
+draw_limits = true
+
+[node name="Camera2D" type="Camera2D" parent="."]
+position = Vector2(66, -113.205)
+zoom = Vector2(2, 2)
+limit_left = -387
+limit_top = -528
+limit_right = 433
+limit_bottom = 288
+position_smoothing_speed = 10.0
+editor_draw_limits = true
+
+[node name="PhantomCameraHost" type="Node" parent="Camera2D"]
+script = ExtResource("9_w5e16")
+
+[editable path="CharacterBody2D"]
diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_tweening_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_tweening_example_scene.tscn
new file mode 100644 (file)
index 0000000..24d9a1a
--- /dev/null
@@ -0,0 +1,793 @@
+[gd_scene load_steps=19 format=3 uid="uid://cpyb3ucwcqj8l"]
+
+[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_oo2bo"]
+[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_as4e6"]
+[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/ui_sign.tscn" id="3_6yi7w"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="4_bb7en"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="5_kikl5"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="6_8u8cj"]
+[ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_2d_tween.tres" id="6_gu0o0"]
+[ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="8_g1syc"]
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/2d_trigger_area.gd" id="9_184pu"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="11_myq47"]
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"]
+texture = ExtResource("1_oo2bo")
+0:0/0 = 0
+0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_0/angular_velocity = 0.0
+0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_1/angular_velocity = 0.0
+1:0/0 = 0
+1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_0/angular_velocity = 0.0
+1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_1/angular_velocity = 0.0
+2:0/0 = 0
+2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_0/angular_velocity = 0.0
+2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_1/angular_velocity = 0.0
+3:0/0 = 0
+3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_0/angular_velocity = 0.0
+3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_1/angular_velocity = 0.0
+4:0/0 = 0
+4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_0/angular_velocity = 0.0
+4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_1/angular_velocity = 0.0
+5:0/0 = 0
+5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_0/angular_velocity = 0.0
+5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_1/angular_velocity = 0.0
+6:0/0 = 0
+6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_0/angular_velocity = 0.0
+6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_1/angular_velocity = 0.0
+7:0/0 = 0
+7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_0/angular_velocity = 0.0
+7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_1/angular_velocity = 0.0
+0:1/0 = 0
+0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_0/angular_velocity = 0.0
+0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_1/angular_velocity = 0.0
+1:1/0 = 0
+1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_0/angular_velocity = 0.0
+1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_1/angular_velocity = 0.0
+2:1/0 = 0
+2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_0/angular_velocity = 0.0
+2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_1/angular_velocity = 0.0
+3:1/0 = 0
+3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_0/angular_velocity = 0.0
+3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_1/angular_velocity = 0.0
+4:1/0 = 0
+4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_0/angular_velocity = 0.0
+4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_1/angular_velocity = 0.0
+5:1/0 = 0
+5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_0/angular_velocity = 0.0
+5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_1/angular_velocity = 0.0
+7:1/0 = 0
+7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_0/angular_velocity = 0.0
+7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_1/angular_velocity = 0.0
+2:2/0 = 0
+2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_0/angular_velocity = 0.0
+2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_1/angular_velocity = 0.0
+3:2/0 = 0
+3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_0/angular_velocity = 0.0
+3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_1/angular_velocity = 0.0
+4:2/0 = 0
+4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_0/angular_velocity = 0.0
+4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_1/angular_velocity = 0.0
+7:2/0 = 0
+7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_0/angular_velocity = 0.0
+7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_1/angular_velocity = 0.0
+3:3/0 = 0
+3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_0/angular_velocity = 0.0
+3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_1/angular_velocity = 0.0
+4:3/0 = 0
+4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_0/angular_velocity = 0.0
+4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_1/angular_velocity = 0.0
+7:3/0 = 0
+7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_0/angular_velocity = 0.0
+7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_1/angular_velocity = 0.0
+3:4/0 = 0
+3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_0/angular_velocity = 0.0
+3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:4/0/physics_layer_1/angular_velocity = 0.0
+4:4/0 = 0
+4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_0/angular_velocity = 0.0
+4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_1/angular_velocity = 0.0
+5:4/0 = 0
+5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_0/angular_velocity = 0.0
+5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_1/angular_velocity = 0.0
+7:4/0 = 0
+7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_0/angular_velocity = 0.0
+7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_1/angular_velocity = 0.0
+3:5/0 = 0
+3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_0/angular_velocity = 0.0
+3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:5/0/physics_layer_1/angular_velocity = 0.0
+4:5/0 = 0
+4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_0/angular_velocity = 0.0
+4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:5/0/physics_layer_1/angular_velocity = 0.0
+7:5/0 = 0
+7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_0/angular_velocity = 0.0
+7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:5/0/physics_layer_1/angular_velocity = 0.0
+3:6/0 = 0
+3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_0/angular_velocity = 0.0
+3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:6/0/physics_layer_1/angular_velocity = 0.0
+4:6/0 = 0
+4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_0/angular_velocity = 0.0
+4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:6/0/physics_layer_1/angular_velocity = 0.0
+7:6/0 = 0
+7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_0/angular_velocity = 0.0
+7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+7:6/0/physics_layer_1/angular_velocity = 0.0
+2:7/0 = 0
+2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_0/angular_velocity = 0.0
+2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+2:7/0/physics_layer_1/angular_velocity = 0.0
+3:7/0 = 0
+3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_0/angular_velocity = 0.0
+3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+3:7/0/physics_layer_1/angular_velocity = 0.0
+4:7/0 = 0
+4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_0/angular_velocity = 0.0
+4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+4:7/0/physics_layer_1/angular_velocity = 0.0
+5:7/0 = 0
+5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_0/angular_velocity = 0.0
+5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:7/0/physics_layer_1/angular_velocity = 0.0
+8:0/0 = 0
+8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_0/angular_velocity = 0.0
+8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_1/angular_velocity = 0.0
+9:0/0 = 0
+9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_0/angular_velocity = 0.0
+9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_1/angular_velocity = 0.0
+10:0/0 = 0
+10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_0/angular_velocity = 0.0
+10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:0/0/physics_layer_1/angular_velocity = 0.0
+11:0/0 = 0
+11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_0/angular_velocity = 0.0
+11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:0/0/physics_layer_1/angular_velocity = 0.0
+12:0/0 = 0
+12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_0/angular_velocity = 0.0
+12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:0/0/physics_layer_1/angular_velocity = 0.0
+13:0/0 = 0
+13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_0/angular_velocity = 0.0
+13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0 = 0
+14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_0/angular_velocity = 0.0
+14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:0/0/physics_layer_1/angular_velocity = 0.0
+14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8)
+14:0/0/custom_data_0 = &"Sign"
+15:0/0 = 0
+15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_0/angular_velocity = 0.0
+15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:0/0/physics_layer_1/angular_velocity = 0.0
+16:0/0 = 0
+16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_0/angular_velocity = 0.0
+16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:0/0/physics_layer_1/angular_velocity = 0.0
+8:1/0 = 0
+8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_0/angular_velocity = 0.0
+8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_1/angular_velocity = 0.0
+9:1/0 = 0
+9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_0/angular_velocity = 0.0
+9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_1/angular_velocity = 0.0
+10:1/0 = 0
+10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_0/angular_velocity = 0.0
+10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:1/0/physics_layer_1/angular_velocity = 0.0
+11:1/0 = 0
+11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_0/angular_velocity = 0.0
+11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:1/0/physics_layer_1/angular_velocity = 0.0
+12:1/0 = 0
+12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_0/angular_velocity = 0.0
+12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:1/0/physics_layer_1/angular_velocity = 0.0
+13:1/0 = 0
+13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_0/angular_velocity = 0.0
+13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:1/0/physics_layer_1/angular_velocity = 0.0
+14:1/0 = 0
+14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_0/angular_velocity = 0.0
+14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:1/0/physics_layer_1/angular_velocity = 0.0
+15:1/0 = 0
+15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_0/angular_velocity = 0.0
+15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:1/0/physics_layer_1/angular_velocity = 0.0
+16:1/0 = 0
+16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_0/angular_velocity = 0.0
+16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:1/0/physics_layer_1/angular_velocity = 0.0
+8:2/0 = 0
+8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_0/angular_velocity = 0.0
+8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_1/angular_velocity = 0.0
+9:2/0 = 0
+9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_0/angular_velocity = 0.0
+9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_1/angular_velocity = 0.0
+10:2/0 = 0
+10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_0/angular_velocity = 0.0
+10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_1/angular_velocity = 0.0
+11:2/0 = 0
+11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_0/angular_velocity = 0.0
+11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:2/0/physics_layer_1/angular_velocity = 0.0
+12:2/0 = 0
+12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_0/angular_velocity = 0.0
+12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:2/0/physics_layer_1/angular_velocity = 0.0
+13:2/0 = 0
+13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_0/angular_velocity = 0.0
+13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:2/0/physics_layer_1/angular_velocity = 0.0
+14:2/0 = 0
+14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_0/angular_velocity = 0.0
+14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:2/0/physics_layer_1/angular_velocity = 0.0
+15:2/0 = 0
+15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_0/angular_velocity = 0.0
+15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:2/0/physics_layer_1/angular_velocity = 0.0
+16:2/0 = 0
+16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_0/angular_velocity = 0.0
+16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:2/0/physics_layer_1/angular_velocity = 0.0
+8:3/0 = 0
+8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_0/angular_velocity = 0.0
+8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_1/angular_velocity = 0.0
+9:3/0 = 0
+9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_0/angular_velocity = 0.0
+9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_1/angular_velocity = 0.0
+10:3/0 = 0
+10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_0/angular_velocity = 0.0
+10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_1/angular_velocity = 0.0
+11:3/0 = 0
+11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_0/angular_velocity = 0.0
+11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:3/0/physics_layer_1/angular_velocity = 0.0
+12:3/0 = 0
+12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_0/angular_velocity = 0.0
+12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:3/0/physics_layer_1/angular_velocity = 0.0
+13:3/0 = 0
+13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_0/angular_velocity = 0.0
+13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:3/0/physics_layer_1/angular_velocity = 0.0
+14:3/0 = 0
+14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_0/angular_velocity = 0.0
+14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:3/0/physics_layer_1/angular_velocity = 0.0
+15:3/0 = 0
+15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_0/angular_velocity = 0.0
+15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:3/0/physics_layer_1/angular_velocity = 0.0
+16:3/0 = 0
+16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_0/angular_velocity = 0.0
+16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:3/0/physics_layer_1/angular_velocity = 0.0
+8:4/0 = 0
+8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_0/angular_velocity = 0.0
+8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_1/angular_velocity = 0.0
+9:4/0 = 0
+9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_0/angular_velocity = 0.0
+9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:4/0/physics_layer_1/angular_velocity = 0.0
+10:4/0 = 0
+10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_0/angular_velocity = 0.0
+10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:4/0/physics_layer_1/angular_velocity = 0.0
+11:4/0 = 0
+11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_0/angular_velocity = 0.0
+11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8)
+11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:4/0/physics_layer_1/angular_velocity = 0.0
+12:4/0 = 0
+12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_0/angular_velocity = 0.0
+12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:4/0/physics_layer_1/angular_velocity = 0.0
+13:4/0 = 0
+13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_0/angular_velocity = 0.0
+13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8)
+13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0 = 0
+14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_0/angular_velocity = 0.0
+14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:4/0/physics_layer_1/angular_velocity = 0.0
+14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
+14:4/0/custom_data_0 = &"Inventory"
+15:4/0 = 0
+15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_0/angular_velocity = 0.0
+15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:4/0/physics_layer_1/angular_velocity = 0.0
+16:4/0 = 0
+16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_0/angular_velocity = 0.0
+16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:4/0/physics_layer_1/angular_velocity = 0.0
+8:5/0 = 0
+8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_0/angular_velocity = 0.0
+8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:5/0/physics_layer_1/angular_velocity = 0.0
+9:5/0 = 0
+9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_0/angular_velocity = 0.0
+9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:5/0/physics_layer_1/angular_velocity = 0.0
+10:5/0 = 0
+10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_0/angular_velocity = 0.0
+10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:5/0/physics_layer_1/angular_velocity = 0.0
+11:5/0 = 0
+11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_0/angular_velocity = 0.0
+11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:5/0/physics_layer_1/angular_velocity = 0.0
+12:5/0 = 0
+12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_0/angular_velocity = 0.0
+12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:5/0/physics_layer_1/angular_velocity = 0.0
+13:5/0 = 0
+13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_0/angular_velocity = 0.0
+13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:5/0/physics_layer_1/angular_velocity = 0.0
+14:5/0 = 0
+14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_0/angular_velocity = 0.0
+14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:5/0/physics_layer_1/angular_velocity = 0.0
+15:5/0 = 0
+15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_0/angular_velocity = 0.0
+15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:5/0/physics_layer_1/angular_velocity = 0.0
+16:5/0 = 0
+16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_0/angular_velocity = 0.0
+16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:5/0/physics_layer_1/angular_velocity = 0.0
+8:6/0 = 0
+8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_0/angular_velocity = 0.0
+8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+8:6/0/physics_layer_1/angular_velocity = 0.0
+9:6/0 = 0
+9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_0/angular_velocity = 0.0
+9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+9:6/0/physics_layer_1/angular_velocity = 0.0
+10:6/0 = 0
+10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_0/angular_velocity = 0.0
+10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+10:6/0/physics_layer_1/angular_velocity = 0.0
+11:6/0 = 0
+11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_0/angular_velocity = 0.0
+11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5)
+11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+11:6/0/physics_layer_1/angular_velocity = 0.0
+12:6/0 = 0
+12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_0/angular_velocity = 0.0
+12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+12:6/0/physics_layer_1/angular_velocity = 0.0
+13:6/0 = 0
+13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_0/angular_velocity = 0.0
+13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8)
+13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+13:6/0/physics_layer_1/angular_velocity = 0.0
+14:6/0 = 0
+14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_0/angular_velocity = 0.0
+14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+14:6/0/physics_layer_1/angular_velocity = 0.0
+15:6/0 = 0
+15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_0/angular_velocity = 0.0
+15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+15:6/0/physics_layer_1/angular_velocity = 0.0
+16:6/0 = 0
+16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_0/angular_velocity = 0.0
+16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+16:6/0/physics_layer_1/angular_velocity = 0.0
+5:3/0 = 0
+5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_0/angular_velocity = 0.0
+5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_1/angular_velocity = 0.0
+
+[sub_resource type="TileSet" id="TileSet_kf7eg"]
+physics_layer_0/collision_layer = 1
+physics_layer_1/collision_layer = 2
+physics_layer_1/collision_mask = 2
+custom_data_layer_0/name = "Type"
+custom_data_layer_0/type = 21
+sources/0 = SubResource("TileSetAtlasSource_easgx")
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_tgk1y"]
+size = Vector2(140, 160)
+
+[sub_resource type="Resource" id="Resource_mtp70"]
+script = ExtResource("6_8u8cj")
+duration = 0.6
+transition = 1
+ease = 2
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_clm0y"]
+size = Vector2(104, 160)
+
+[sub_resource type="Resource" id="Resource_8jg5c"]
+script = ExtResource("6_8u8cj")
+duration = 0.3
+transition = 8
+ease = 2
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_uka0w"]
+size = Vector2(560, 160)
+
+[sub_resource type="Resource" id="Resource_e4e41"]
+script = ExtResource("6_8u8cj")
+duration = 1.2
+transition = 10
+ease = 2
+
+[node name="ExampleScene2D" type="Node2D"]
+
+[node name="Background" type="CanvasLayer" parent="."]
+layer = -3
+
+[node name="ColorRect" type="ColorRect" parent="Background"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -311.0
+offset_top = -173.0
+offset_right = 981.0
+offset_bottom = 548.0
+grow_horizontal = 2
+grow_vertical = 2
+auto_translate = false
+localize_numeral_system = false
+color = Color(0.137255, 0.14902, 0.196078, 1)
+
+[node name="TileMap" type="TileMap" parent="."]
+z_index = -1
+scale = Vector2(3, 3)
+tile_set = SubResource("TileSet_kf7eg")
+format = 2
+layer_0/name = "Background"
+layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3)
+layer_1/name = "Terrain"
+layer_1/z_index = 1
+layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 655360, 6, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 655360, 6, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524281, 720896, 5, 524285, 786432, 5, 524284, 786432, 5, 524283, 786432, 5, 524282, 786432, 5, 589818, 786432, 5, 589819, 786432, 5, 589820, 786432, 5, 655356, 786432, 5, 655357, 786432, 5, 589821, 786432, 5, 655355, 786432, 5, 655354, 786432, 5, 720890, 786432, 5, 720891, 786432, 5, 720892, 786432, 5, 720893, 786432, 5, 720894, 851968, 5, 786429, 786432, 5, 786428, 786432, 5, 786427, 786432, 5, 786426, 786432, 5, 851962, 786432, 5, 917498, 786432, 5, 917499, 786432, 5, 851964, 786432, 5, 851965, 786432, 5, 917501, 786432, 5, 917500, 786432, 5, 851963, 786432, 5, 589817, 720896, 5, 655353, 720896, 5, 720889, 720896, 5, 786425, 720896, 5, 851961, 720896, 5, 917497, 720896, 5, 524286, 851968, 5, 589822, 851968, 5, 655358, 851968, 5, 786430, 851968, 5, 851966, 851968, 5, 917502, 851968, 5, 589824, 720896, 1, 655360, 720896, 1, 720896, 720896, 1, 786432, 720896, 1, 851968, 720896, 1, 589825, 720896, 1, 655361, 720896, 1, 720897, 720896, 1, 786433, 720896, 1, 851969, 720896, 1, 589826, 720896, 1, 655362, 720896, 1, 720898, 720896, 1, 786434, 720896, 1, 851970, 720896, 1, 589827, 720896, 1, 655363, 720896, 1, 720899, 720896, 1, 786435, 720896, 1, 851971, 720896, 1, 589828, 720896, 1, 655364, 720896, 1, 720900, 720896, 1, 786436, 720896, 1, 851972, 720896, 1, 589829, 720896, 1, 655365, 720896, 1, 720901, 720896, 1, 786437, 720896, 1, 851973, 720896, 1, 589830, 720896, 1, 655366, 720896, 1, 720902, 720896, 1, 786438, 720896, 1, 851974, 720896, 1, 589831, 720896, 1, 655367, 720896, 1, 720903, 720896, 1, 786439, 720896, 1, 851975, 720896, 1, 589832, 720896, 1, 655368, 720896, 1, 720904, 720896, 1, 786440, 720896, 1, 851976, 720896, 1, 589833, 786432, 1, 655369, 786432, 1, 720905, 786432, 1, 786441, 786432, 1, 851977, 786432, 1, 655359, 655360, 1, 720895, 655360, 1, 786431, 655360, 1, 851967, 655360, 1, 917503, 655360, 1, 589834, 720896, 1, 655370, 720896, 1, 720906, 720896, 1, 786442, 720896, 1, 851978, 720896, 1, 589835, 720896, 1, 655371, 720896, 1, 720907, 720896, 1, 786443, 720896, 1, 851979, 720896, 1, 589836, 720896, 1, 655372, 720896, 1, 720908, 720896, 1, 786444, 720896, 1, 851980, 720896, 1, 589837, 720896, 1, 655373, 720896, 1, 720909, 720896, 1, 786445, 720896, 1, 851981, 720896, 1, 589838, 720896, 1, 655374, 720896, 1, 720910, 720896, 1, 786446, 720896, 1, 851982, 720896, 1, 589839, 720896, 1, 655375, 720896, 1, 720911, 720896, 1, 786447, 720896, 1, 851983, 720896, 1, 589840, 720896, 1, 655376, 720896, 1, 720912, 720896, 1, 786448, 720896, 1, 851984, 720896, 1, 851985, 720896, 6, 851986, 786432, 6, 851987, 786432, 6, 851988, 786432, 6, 851989, 786432, 6, 851990, 786432, 6, 851991, 786432, 6, 851992, 786432, 6, 851993, 786432, 6, 851994, 786432, 6, 851995, 786432, 6, 851996, 786432, 6, 851997, 851968, 6, 524306, 786432, 5, 589842, 786432, 5, 655378, 786432, 5, 720914, 786432, 5, 786450, 786432, 5, 524307, 786432, 5, 589843, 786432, 5, 655379, 786432, 5, 720915, 786432, 5, 786451, 786432, 5, 524308, 786432, 5, 589844, 786432, 5, 655380, 786432, 5, 720916, 786432, 5, 786452, 786432, 5, 524309, 786432, 5, 589845, 786432, 5, 655381, 786432, 5, 720917, 786432, 5, 786453, 786432, 5, 524310, 786432, 5, 589846, 786432, 5, 655382, 786432, 5, 720918, 786432, 5, 786454, 786432, 5, 524311, 786432, 5, 589847, 786432, 5, 655383, 786432, 5, 720919, 786432, 5, 786455, 786432, 5, 524312, 786432, 5, 589848, 786432, 5, 655384, 786432, 5, 720920, 786432, 5, 786456, 786432, 5, 524313, 786432, 5, 589849, 786432, 5, 655385, 786432, 5, 720921, 786432, 5, 786457, 786432, 5, 524314, 786432, 5, 589850, 786432, 5, 655386, 786432, 5, 720922, 786432, 5, 786458, 786432, 5, 524315, 786432, 5, 589851, 786432, 5, 655387, 786432, 5, 720923, 786432, 5, 786459, 786432, 5, 524316, 786432, 5, 589852, 786432, 5, 655388, 786432, 5, 720924, 786432, 5, 786460, 786432, 5, 524305, 720896, 5, 589841, 720896, 5, 655377, 720896, 5, 720913, 720896, 5, 786449, 720896, 5, 524317, 851968, 5, 589853, 851968, 5, 655389, 851968, 5, 720925, 851968, 5, 786461, 851968, 5, -262106, 786432, 5, -196570, 786432, 5, -131034, 786432, 5, -65498, 786432, 5, 38, 786432, 5, 65574, 786432, 5, 131110, 655360, 6, 196646, 786432, 5, 262182, 786432, 5, 327718, 786432, 5, 393254, 786432, 5, 458790, 786432, 5, -262105, 786432, 5, -196569, 786432, 5, -131033, 786432, 5, -65497, 786432, 5, 39, 786432, 5, 65575, 786432, 5, 131111, 786432, 5, 196647, 786432, 5, 262183, 786432, 5, 327719, 786432, 5, 393255, 655360, 6, 458791, 786432, 5, -262104, 786432, 5, -196568, 786432, 5, -131032, 786432, 5, -65496, 786432, 5, 40, 655360, 6, 65576, 786432, 5, 131112, 786432, 5, 196648, 786432, 5, 262184, 655360, 6, 327720, 786432, 5, 393256, 786432, 5, 458792, 786432, 5, -262103, 786432, 5, -196567, 655360, 6, -131031, 786432, 5, -65495, 786432, 5, 41, 786432, 5, 65577, 786432, 5, 131113, 786432, 5, 196649, 786432, 5, 262185, 786432, 5, 327721, 786432, 5, 393257, 786432, 5, 458793, 786432, 5, -262102, 786432, 5, -196566, 786432, 5, -131030, 786432, 5, -65494, 786432, 5, 42, 786432, 5, 65578, 786432, 5, 131114, 655360, 6, 196650, 786432, 5, 262186, 786432, 5, 327722, 786432, 5, 393258, 786432, 5, 458794, 655360, 6, 524326, 786432, 6, 524327, 786432, 6, 524328, 786432, 6, 524329, 786432, 6, 524330, 786432, 6, -327642, 786432, 4, -327641, 786432, 4, -327640, 786432, 4, -327639, 786432, 4, -327638, 786432, 4, -327632, 851968, 4, -262096, 851968, 5, -196560, 851968, 5, -131024, 851968, 5, -65488, 851968, 5, 48, 851968, 5, 65584, 851968, 5, 131120, 851968, 5, 196656, 851968, 5, 262192, 851968, 5, 327728, 851968, 5, 393264, 851968, 5, 458800, 851968, 5, 524336, 851968, 6, -327637, 786432, 4, -327636, 786432, 4, -327635, 786432, 4, -327634, 786432, 4, -327633, 786432, 4, -262101, 786432, 5, -196565, 786432, 5, -131029, 655360, 6, -65493, 786432, 5, 43, 786432, 5, 65579, 786432, 5, 131115, 786432, 5, 196651, 786432, 5, 262187, 786432, 5, 327723, 655360, 6, 393259, 786432, 5, 458795, 786432, 5, -262100, 786432, 5, -196564, 786432, 5, -131028, 786432, 5, -65492, 786432, 5, 44, 655360, 6, 65580, 786432, 5, 131116, 786432, 5, 196652, 786432, 5, 262188, 786432, 5, 327724, 786432, 5, 393260, 786432, 5, 458796, 786432, 5, -262099, 786432, 5, -196563, 786432, 5, -131027, 786432, 5, -65491, 786432, 5, 45, 786432, 5, 65581, 655360, 6, 131117, 786432, 5, 196653, 786432, 5, 262189, 786432, 5, 327725, 786432, 5, 393261, 786432, 5, 458797, 786432, 5, -262098, 655360, 6, -196562, 786432, 5, -131026, 786432, 5, -65490, 786432, 5, 46, 786432, 5, 65582, 786432, 5, 131118, 786432, 5, 196654, 655360, 6, 262190, 786432, 5, 327726, 786432, 5, 393262, 786432, 5, 458798, 655360, 6, -262097, 786432, 5, -196561, 786432, 5, -131025, 786432, 5, -65489, 786432, 5, 47, 786432, 5, 65583, 786432, 5, 131119, 786432, 5, 196655, 786432, 5, 262191, 786432, 5, 327727, 786432, 5, 393263, 786432, 5, 458799, 786432, 5, 524331, 786432, 6, 524332, 786432, 6, 524333, 786432, 6, 524334, 786432, 6, 524335, 786432, 6)
+
+[node name="UI" type="CanvasLayer" parent="."]
+
+[node name="UIInventory" parent="UI" instance=ExtResource("2_as4e6")]
+unique_name_in_owner = true
+visible = false
+
+[node name="UISign" parent="UI" instance=ExtResource("3_6yi7w")]
+unique_name_in_owner = true
+visible = false
+
+[node name="Camera2D" type="Camera2D" parent="."]
+position = Vector2(227, -28)
+position_smoothing_speed = 10.0
+
+[node name="PhantomCameraHost" type="Node" parent="Camera2D"]
+script = ExtResource("4_bb7en")
+
+[node name="Player" type="Node" parent="."]
+
+[node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")]
+unique_name_in_owner = true
+position = Vector2(227, -28)
+script = ExtResource("5_kikl5")
+priority = 5
+follow_mode = 2
+follow_target = NodePath("../CharacterBody2D/PlayerVisuals")
+tween_resource = ExtResource("6_gu0o0")
+tween_on_load = false
+follow_damping = true
+draw_limits = true
+
+[node name="Label" type="Label" parent="Player"]
+offset_left = 167.0
+offset_top = -132.0
+offset_right = 332.0
+offset_bottom = -68.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("11_myq47")
+text = "[WASD] to move
+[Space] to jump"
+
+[node name="CharacterBody2D" parent="Player" instance=ExtResource("8_g1syc")]
+position = Vector2(227, -28)
+
+[node name="WideArea" type="Area2D" parent="." node_paths=PackedStringArray("area_pcam")]
+position = Vector2(393, -40)
+collision_layer = 2
+collision_mask = 2
+script = ExtResource("9_184pu")
+area_pcam = NodePath("PhantomCamera2D")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="WideArea"]
+position = Vector2(0, -40)
+shape = SubResource("RectangleShape2D_tgk1y")
+
+[node name="ColorRect" type="ColorRect" parent="WideArea"]
+offset_left = -70.0
+offset_top = -120.0
+offset_right = 70.0
+offset_bottom = 40.0
+size_flags_horizontal = 0
+size_flags_vertical = 0
+color = Color(0.556863, 0.447059, 0.545098, 0.698039)
+
+[node name="Label" type="Label" parent="WideArea"]
+offset_left = -77.0
+offset_top = -250.0
+offset_right = 76.0
+offset_bottom = -120.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("11_myq47")
+text = "Transition Type:
+Sine
+
+Duration:
+0.6s"
+horizontal_alignment = 1
+
+[node name="PhantomCamera2D" type="Node2D" parent="WideArea"]
+position = Vector2(4, -100)
+script = ExtResource("5_kikl5")
+zoom = Vector2(0.8, 0.8)
+tween_resource = SubResource("Resource_mtp70")
+draw_limits = true
+
+[node name="UpperZoomArea" type="Area2D" parent="." node_paths=PackedStringArray("area_pcam")]
+position = Vector2(649, -135)
+collision_layer = 2
+collision_mask = 2
+script = ExtResource("9_184pu")
+area_pcam = NodePath("PhantomCamera2D")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="UpperZoomArea"]
+position = Vector2(0, -40)
+shape = SubResource("RectangleShape2D_clm0y")
+
+[node name="CollisionShape2D2" type="CollisionShape2D" parent="UpperZoomArea"]
+position = Vector2(0, -40)
+shape = SubResource("RectangleShape2D_clm0y")
+
+[node name="ColorRect" type="ColorRect" parent="UpperZoomArea"]
+offset_left = -52.0
+offset_top = -120.0
+offset_right = 52.0
+offset_bottom = 40.0
+size_flags_horizontal = 0
+size_flags_vertical = 0
+color = Color(0.556863, 0.447059, 0.545098, 0.698039)
+
+[node name="Label" type="Label" parent="UpperZoomArea"]
+offset_left = -74.0
+offset_top = -251.0
+offset_right = 79.0
+offset_bottom = -121.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("11_myq47")
+text = "Transition Type:
+Circ
+
+Duration:
+0.3s"
+horizontal_alignment = 1
+
+[node name="PhantomCamera2D" type="Node2D" parent="UpperZoomArea"]
+position = Vector2(2, -83)
+script = ExtResource("5_kikl5")
+zoom = Vector2(2, 2)
+tween_resource = SubResource("Resource_8jg5c")
+draw_limits = true
+
+[node name="ForwardArea" type="Area2D" parent="." node_paths=PackedStringArray("area_pcam")]
+position = Vector2(1136, -38)
+collision_layer = 2
+collision_mask = 2
+script = ExtResource("9_184pu")
+area_pcam = NodePath("PhantomCamera2D")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="ForwardArea"]
+position = Vector2(0, -42)
+shape = SubResource("RectangleShape2D_uka0w")
+
+[node name="ColorRect" type="ColorRect" parent="ForwardArea"]
+offset_left = -280.0
+offset_top = -122.0
+offset_right = 280.0
+offset_bottom = 38.0
+size_flags_horizontal = 0
+size_flags_vertical = 0
+color = Color(0.556863, 0.447059, 0.545098, 0.698039)
+
+[node name="Label" type="Label" parent="ForwardArea"]
+offset_left = -76.0
+offset_top = -252.0
+offset_right = 77.0
+offset_bottom = -122.0
+theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1)
+theme_override_fonts/font = ExtResource("11_myq47")
+text = "Transition Type:
+Back
+
+Duration:
+1.2s"
+horizontal_alignment = 1
+
+[node name="PhantomCamera2D" type="Node2D" parent="ForwardArea"]
+position = Vector2(344, -46)
+script = ExtResource("5_kikl5")
+zoom = Vector2(0.9, 0.9)
+tween_resource = SubResource("Resource_e4e41")
+draw_limits = true
+
+[editable path="Player/CharacterBody2D"]
diff --git a/addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn b/addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn
new file mode 100644 (file)
index 0000000..7d2ec5c
--- /dev/null
@@ -0,0 +1,120 @@
+[gd_scene load_steps=10 format=3 uid="uid://7kh0xydx0b1o"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd" id="1_jnc14"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="2_62b2n"]
+[ext_resource type="Texture2D" uid="uid://ci76plsequlrq" path="res://addons/phantom_camera/examples/textures/2D/player_sprite.svg" id="2_yr8cm"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="4_rloon"]
+[ext_resource type="Resource" uid="uid://cecrnq0wnkexh" path="res://addons/phantom_camera/examples/resources/tween/item_focus_phantom_camera_2d_tween.tres" id="5_4iyk1"]
+[ext_resource type="Resource" uid="uid://cllveybboaqk5" path="res://addons/phantom_camera/examples/resources/tween/inventory_phantom_camera_2d_tween.tres" id="6_2h6fv"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5hryl"]
+bg_color = Color(0.85098, 0.894118, 0.937255, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0.113725, 0.113725, 0.113725, 1)
+corner_radius_top_left = 7
+corner_radius_top_right = 7
+corner_radius_bottom_right = 7
+corner_radius_bottom_left = 7
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_xj4ar"]
+size = Vector2(64, 57)
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_18i13"]
+size = Vector2(64, 57)
+
+[node name="CharacterBody2D" type="CharacterBody2D"]
+script = ExtResource("1_jnc14")
+
+[node name="DarkOverlay" type="ColorRect" parent="."]
+unique_name_in_owner = true
+visible = false
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -1000.0
+offset_top = -1000.0
+offset_right = 1000.0
+offset_bottom = 1000.0
+grow_horizontal = 2
+grow_vertical = 2
+color = Color(0, 0, 0, 0.615686)
+
+[node name="PlayerVisuals" type="Node2D" parent="."]
+unique_name_in_owner = true
+
+[node name="PlayerSprite" type="Sprite2D" parent="PlayerVisuals"]
+unique_name_in_owner = true
+scale = Vector2(0.5, 0.5)
+texture = ExtResource("2_yr8cm")
+
+[node name="InteractionPrompt" type="Panel" parent="PlayerVisuals"]
+unique_name_in_owner = true
+visible = false
+anchors_preset = 7
+anchor_left = 0.5
+anchor_top = 1.0
+anchor_right = 0.5
+anchor_bottom = 1.0
+offset_left = -16.0
+offset_top = -66.0
+offset_right = 16.0
+offset_bottom = -34.0
+grow_horizontal = 2
+grow_vertical = 0
+size_flags_vertical = 0
+theme_override_styles/panel = SubResource("StyleBoxFlat_5hryl")
+
+[node name="Label" type="Label" parent="PlayerVisuals/InteractionPrompt"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_top = -3.0
+offset_bottom = 5.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_colors/font_color = Color(0, 0, 0, 1)
+theme_override_fonts/font = ExtResource("2_62b2n")
+theme_override_font_sizes/font_size = 26
+text = "F"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+position = Vector2(0, -0.5)
+shape = SubResource("RectangleShape2D_xj4ar")
+
+[node name="PlayerArea2D" type="Area2D" parent="."]
+unique_name_in_owner = true
+collision_layer = 2
+collision_mask = 2
+priority = 20
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="PlayerArea2D"]
+position = Vector2(0, -0.5)
+shape = SubResource("RectangleShape2D_18i13")
+
+[node name="ItemFocusPhantomCamera2D" type="Node2D" parent="."]
+unique_name_in_owner = true
+position = Vector2(0, -122)
+script = ExtResource("4_rloon")
+zoom = Vector2(2, 2)
+frame_preview = false
+tween_resource = ExtResource("5_4iyk1")
+follow_damping_value = Vector2(0, 0)
+draw_limits = true
+
+[node name="InventoryPhantomCamera2D" type="Node2D" parent="."]
+unique_name_in_owner = true
+position = Vector2(-183, -5)
+script = ExtResource("4_rloon")
+zoom = Vector2(2.5, 2.5)
+frame_preview = false
+tween_resource = ExtResource("6_2h6fv")
+follow_damping_value = Vector2(0, 0)
+draw_limits = true
diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_example_scene.tscn
new file mode 100644 (file)
index 0000000..553ddeb
--- /dev/null
@@ -0,0 +1,379 @@
+[gd_scene load_steps=40 format=3 uid="uid://ci12ytew5vwty"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_wn7ww"]
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/npc.gd" id="2_2n1da"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="2_e7gxt"]
+[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="2_tvx5n"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_y3dy8"]
+[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="3_f5qrw"]
+[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres" id="4_a27nb"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_m2vbn"]
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd" id="4_moad5"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="7_jitt8"]
+
+[sub_resource type="Resource" id="Resource_jtk1d"]
+script = ExtResource("4_m2vbn")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="Resource" id="Resource_o161n"]
+script = ExtResource("4_m2vbn")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="BoxMesh" id="BoxMesh_7tjw4"]
+size = Vector3(2, 0.5, 4)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_hpllm"]
+transparency = 1
+albedo_color = Color(0.988235, 0.478431, 0.905882, 0.0901961)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_65o6h"]
+size = Vector3(2, 0.5, 4)
+
+[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_tpc7d"]
+
+[sub_resource type="CapsuleMesh" id="CapsuleMesh_g0eml"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_v5iy7"]
+albedo_color = Color(0.988235, 0.478431, 0.905882, 1)
+
+[sub_resource type="Resource" id="Resource_tpvee"]
+script = ExtResource("7_jitt8")
+duration = 0.0
+transition = 0
+ease = 2
+
+[sub_resource type="Resource" id="Resource_bxbnv"]
+script = ExtResource("4_m2vbn")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_wcrbb"]
+size = Vector3(6.8, 0.1, 5.4)
+
+[sub_resource type="Resource" id="Resource_7ih0k"]
+script = ExtResource("7_jitt8")
+duration = 0.0
+transition = 0
+ease = 2
+
+[sub_resource type="Resource" id="Resource_4iyps"]
+script = ExtResource("4_m2vbn")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_ctyr8"]
+size = Vector3(7.4, 0.1, 3.6)
+
+[sub_resource type="Resource" id="Resource_x5y0u"]
+script = ExtResource("7_jitt8")
+duration = 0.0
+transition = 0
+ease = 2
+
+[sub_resource type="Resource" id="Resource_pgiyx"]
+script = ExtResource("4_m2vbn")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_ua072"]
+size = Vector3(6.8, 0.1, 3.6)
+
+[sub_resource type="BoxMesh" id="BoxMesh_ugc3s"]
+size = Vector3(1, 1, 2)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_68thd"]
+albedo_color = Color(0.34902, 0.862745, 0.854902, 1)
+
+[sub_resource type="BoxMesh" id="BoxMesh_wphly"]
+size = Vector3(1, 0.5, 1)
+
+[sub_resource type="BoxMesh" id="BoxMesh_gyp5s"]
+size = Vector3(20, 40, 30)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_lfaqs"]
+size = Vector3(20, 40, 30)
+
+[sub_resource type="BoxMesh" id="BoxMesh_n70lt"]
+size = Vector3(14, 40, 6)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_jxmqm"]
+size = Vector3(14, 40, 6)
+
+[sub_resource type="BoxMesh" id="BoxMesh_x0tgm"]
+size = Vector3(8, 40, 1)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_t67ef"]
+size = Vector3(50, 40, 1)
+
+[sub_resource type="BoxMesh" id="BoxMesh_rmslh"]
+size = Vector3(0.5, 6, 13.5)
+
+[sub_resource type="BoxMesh" id="BoxMesh_242ij"]
+size = Vector3(2, 3, 3)
+
+[sub_resource type="BoxMesh" id="BoxMesh_niuda"]
+size = Vector3(8, 6, 0.5)
+
+[node name="Root" type="Node3D"]
+
+[node name="MainCamera3D" type="Camera3D" parent="."]
+unique_name_in_owner = true
+transform = Transform3D(0.999858, 0, 0, 0, 0.94884, 0.315632, 0, -0.315637, 0.948825, -2.53871, 2, 9.76232)
+
+[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"]
+script = ExtResource("1_wn7ww")
+
+[node name="PlayerGroup" type="Node" parent="."]
+
+[node name="PlayerCharacterBody3D" parent="PlayerGroup" instance=ExtResource("2_tvx5n")]
+unique_name_in_owner = true
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.53871, 0.5, 7.26232)
+
+[node name="MovementInstructionsLabel" type="Label3D" parent="PlayerGroup"]
+transform = Transform3D(1, 0, 0, 0, 0.866025, 0.5, 0, -0.5, 0.866025, -2.47682, -0.0708016, 7.93048)
+modulate = Color(0.294118, 1, 0.631373, 1)
+text = "[WASD] to move"
+font = ExtResource("2_e7gxt")
+font_size = 48
+
+[node name="PlayerPhantomCamera3D" type="Node3D" parent="PlayerGroup" node_paths=PackedStringArray("follow_target")]
+unique_name_in_owner = true
+transform = Transform3D(0.999858, 0, 0, 0, 0.94884, 0.315632, 0, -0.315637, 0.948825, -2.53871, 2, 9.76232)
+script = ExtResource("2_y3dy8")
+priority = 10
+follow_mode = 2
+follow_target = NodePath("../PlayerCharacterBody3D/PlayerVisual")
+tween_resource = ExtResource("4_a27nb")
+tween_on_load = false
+camera_3d_resource = SubResource("Resource_jtk1d")
+follow_offset = Vector3(0, 1.5, 2.5)
+follow_damping = true
+
+[node name="NPCGroup" type="Node" parent="."]
+
+[node name="NPCPhantomCamera3D" type="Node3D" parent="NPCGroup"]
+unique_name_in_owner = true
+transform = Transform3D(0.616596, -0.109786, 0.779587, -2.23517e-08, 0.990229, 0.13945, -0.78728, -0.0859841, 0.610571, -2.98802, 1.50739, 1.19719)
+script = ExtResource("2_y3dy8")
+tween_resource = ExtResource("4_a27nb")
+camera_3d_resource = SubResource("Resource_o161n")
+
+[node name="NPCDescriptionLabel" type="Label3D" parent="NPCGroup"]
+transform = Transform3D(1, 0, 0, 0, 0.866026, 0.5, 0, -0.5, 0.866025, -3.04693, 0.367287, 0.953757)
+text = "Input Example"
+font = ExtResource("2_e7gxt")
+
+[node name="NPCDialogueExampleLabel" type="Label3D" parent="NPCGroup"]
+unique_name_in_owner = true
+transform = Transform3D(1, 4.54671e-10, 1.65487e-10, 4.25644e-10, 0.939693, 0.34202, 0, -0.34202, 0.939693, -4.46738, 1.58641, -0.253679)
+modulate = Color(1, 0.603922, 0.254902, 1)
+text = "Press [ F ] to change camera"
+font = ExtResource("2_e7gxt")
+
+[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="NPCGroup"]
+transform = Transform3D(0.819152, 4.83851e-10, -0.573576, -3.92481e-09, 1, -6.3473e-09, 0.573576, 7.45058e-09, 0.819152, -3.46138, -0.4, 0.875321)
+mesh = SubResource("BoxMesh_7tjw4")
+skeleton = NodePath("../..")
+surface_material_override/0 = SubResource("StandardMaterial3D_hpllm")
+metadata/_edit_group_ = true
+
+[node name="NPCInteractionArea3D" type="Area3D" parent="NPCGroup/NPCInteractionZoneMesh"]
+unique_name_in_owner = true
+transform = Transform3D(1, -2.68591e-26, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+monitorable = false
+
+[node name="NPCInterationCollisionShape3D" type="CollisionShape3D" parent="NPCGroup/NPCInteractionZoneMesh/NPCInteractionArea3D"]
+shape = SubResource("BoxShape3D_65o6h")
+
+[node name="NPC" type="StaticBody3D" parent="NPCGroup"]
+transform = Transform3D(1, 4.83851e-10, 0, 4.25644e-10, 1, -7.45058e-09, 0, 7.45058e-09, 1, -4.56338, 0.5, -0.272679)
+script = ExtResource("2_2n1da")
+
+[node name="PlayerCollisionShape3D2" type="CollisionShape3D" parent="NPCGroup/NPC"]
+transform = Transform3D(1, -2.68591e-26, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+shape = SubResource("CapsuleShape3D_tpc7d")
+
+[node name="NPCMesh" type="MeshInstance3D" parent="NPCGroup/NPC"]
+transform = Transform3D(1, -2.68591e-26, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+mesh = SubResource("CapsuleMesh_g0eml")
+skeleton = NodePath("../../..")
+surface_material_override/0 = SubResource("StandardMaterial3D_v5iy7")
+
+[node name="MoveToLocation" type="Node3D" parent="NPCGroup"]
+unique_name_in_owner = true
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.70084, 0.5, 0.962891)
+
+[node name="FixedCameraTriggerZone" type="Node" parent="."]
+
+[node name="FixedCameraLabel" type="Label3D" parent="FixedCameraTriggerZone"]
+unique_name_in_owner = true
+transform = Transform3D(0.939693, 0.280167, -0.196175, 1.49012e-08, 0.573577, 0.819152, 0.34202, -0.769751, 0.538986, -0.538716, -0.247626, 3.13456)
+text = "Fixed Camera
+Example"
+font = ExtResource("2_e7gxt")
+
+[node name="NorthRoomPhantomCamera3D" type="Node3D" parent="FixedCameraTriggerZone"]
+transform = Transform3D(0.38357, -0.555836, 0.737507, -0.105898, 0.766851, 0.633027, -0.917417, -0.320912, 0.235279, 6.89638, 4.73986, 0.115512)
+script = ExtResource("2_y3dy8")
+tween_resource = SubResource("Resource_tpvee")
+camera_3d_resource = SubResource("Resource_bxbnv")
+
+[node name="NorthRoomTrigger" type="Area3D" parent="FixedCameraTriggerZone" node_paths=PackedStringArray("area_pcam")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, -0.45, -0.9)
+priority = 5
+script = ExtResource("4_moad5")
+area_pcam = NodePath("../NorthRoomPhantomCamera3D")
+metadata/_edit_group_ = true
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="FixedCameraTriggerZone/NorthRoomTrigger"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 0, -0.4)
+shape = SubResource("BoxShape3D_wcrbb")
+
+[node name="EntryRoomPhantomCamera3D" type="Node3D" parent="FixedCameraTriggerZone"]
+transform = Transform3D(0.258818, -0.482963, 0.836515, 1.3027e-15, 0.866025, 0.499999, -0.965924, -0.129409, 0.224143, 6.69741, 4.73364, 4.02374)
+script = ExtResource("2_y3dy8")
+tween_resource = SubResource("Resource_7ih0k")
+camera_3d_resource = SubResource("Resource_4iyps")
+
+[node name="EntryRoomTrigger" type="Area3D" parent="FixedCameraTriggerZone" node_paths=PackedStringArray("area_pcam")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.00003, -0.454982, 3.00572)
+priority = 5
+script = ExtResource("4_moad5")
+area_pcam = NodePath("../EntryRoomPhantomCamera3D")
+metadata/_edit_group_ = true
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="FixedCameraTriggerZone/EntryRoomTrigger"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.3, 0, 0.2)
+shape = SubResource("BoxShape3D_ctyr8")
+
+[node name="SouthRoomPhantomCamera3D" type="Node3D" parent="FixedCameraTriggerZone"]
+transform = Transform3D(-0.766043, -0.492403, 0.413175, 0, 0.642787, 0.766043, -0.642786, 0.586825, -0.492403, 6.89741, 4.73364, 5.62374)
+script = ExtResource("2_y3dy8")
+tween_resource = SubResource("Resource_x5y0u")
+camera_3d_resource = SubResource("Resource_pgiyx")
+
+[node name="SouthRoomTrigger" type="Area3D" parent="FixedCameraTriggerZone" node_paths=PackedStringArray("area_pcam")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, -0.45, 6.7)
+priority = 5
+script = ExtResource("4_moad5")
+area_pcam = NodePath("../SouthRoomPhantomCamera3D")
+metadata/_edit_group_ = true
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="FixedCameraTriggerZone/SouthRoomTrigger"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 0, 0.1)
+shape = SubResource("BoxShape3D_ua072")
+
+[node name="CSGMesh3D" type="CSGMesh3D" parent="FixedCameraTriggerZone"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.14238, 1.82571, 2.88655)
+mesh = SubResource("BoxMesh_ugc3s")
+material = SubResource("StandardMaterial3D_68thd")
+
+[node name="CSGMesh3D2" type="CSGMesh3D" parent="FixedCameraTriggerZone/CSGMesh3D"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.00192642, -0.0120339, 0.00494432)
+operation = 2
+mesh = SubResource("BoxMesh_wphly")
+material = SubResource("StandardMaterial3D_68thd")
+
+[node name="Environment" type="Node" parent="."]
+
+[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0)
+metadata/_edit_lock_ = true
+
+[node name="Environment" type="Node3D" parent="Environment"]
+
+[node name="Floor" parent="Environment/Environment" instance=ExtResource("3_f5qrw")]
+transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0)
+metadata/_edit_lock_ = true
+
+[node name="West Wall" type="StaticBody3D" parent="Environment/Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16, 0.5, 0)
+metadata/_edit_group_ = true
+metadata/_edit_lock_ = true
+
+[node name="MeshInstance3D2" type="MeshInstance3D" parent="Environment/Environment/West Wall"]
+mesh = SubResource("BoxMesh_gyp5s")
+skeleton = NodePath("")
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Environment/Environment/West Wall"]
+shape = SubResource("BoxShape3D_lfaqs")
+
+[node name="East Wall" type="StaticBody3D" parent="Environment/Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 16.999, 0.502, 0)
+metadata/_edit_group_ = true
+metadata/_edit_lock_ = true
+
+[node name="MeshInstance3D2" type="MeshInstance3D" parent="Environment/Environment/East Wall"]
+mesh = SubResource("BoxMesh_gyp5s")
+skeleton = NodePath("")
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Environment/Environment/East Wall"]
+shape = SubResource("BoxShape3D_lfaqs")
+
+[node name="North Wall" type="StaticBody3D" parent="Environment/Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, -6.90828)
+metadata/_edit_group_ = true
+metadata/_edit_lock_ = true
+
+[node name="MeshInstance3D2" type="MeshInstance3D" parent="Environment/Environment/North Wall"]
+mesh = SubResource("BoxMesh_n70lt")
+skeleton = NodePath("")
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Environment/Environment/North Wall"]
+shape = SubResource("BoxShape3D_jxmqm")
+
+[node name="South Wall" type="StaticBody3D" parent="Environment/Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.25, 0.5, 9.087)
+metadata/_edit_group_ = true
+
+[node name="MeshInstance3D3" type="MeshInstance3D" parent="Environment/Environment/South Wall"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, 0)
+mesh = SubResource("BoxMesh_x0tgm")
+skeleton = NodePath("")
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Environment/Environment/South Wall"]
+shape = SubResource("BoxShape3D_t67ef")
+
+[node name="FixedCamOuterWall" type="CSGMesh3D" parent="Environment/Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, 2)
+use_collision = true
+mesh = SubResource("BoxMesh_rmslh")
+
+[node name="FixedCamOuterDoorway" type="CSGMesh3D" parent="Environment/Environment/FixedCamOuterWall"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.5, 1)
+operation = 2
+mesh = SubResource("BoxMesh_242ij")
+
+[node name="FixedCamNorthWall" type="CSGMesh3D" parent="Environment/Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 2.5, 1)
+use_collision = true
+mesh = SubResource("BoxMesh_niuda")
+
+[node name="FixedCamNorthDoorway" type="CSGMesh3D" parent="Environment/Environment/FixedCamNorthWall"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.5, 0)
+operation = 2
+mesh = SubResource("BoxMesh_242ij")
+
+[node name="FixedCamSouthWall" type="CSGMesh3D" parent="Environment/Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 2.5, 5.1)
+use_collision = true
+mesh = SubResource("BoxMesh_niuda")
+
+[node name="FixedCamSouthDoorway" type="CSGMesh3D" parent="Environment/Environment/FixedCamSouthWall"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.50541, 1.19209e-07)
+operation = 2
+mesh = SubResource("BoxMesh_242ij")
+
+[editable path="PlayerGroup/PlayerCharacterBody3D"]
diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_framed_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_framed_example_scene.tscn
new file mode 100644 (file)
index 0000000..b17abcf
--- /dev/null
@@ -0,0 +1,147 @@
+[gd_scene load_steps=10 format=3 uid="uid://c4llb3gsbfv1a"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_7824u"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_g1bv4"]
+[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres" id="3_420vh"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_oqbub"]
+[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="4_t4fso"]
+[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="5_c0upu"]
+[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="5_f2w3x"]
+
+[sub_resource type="Resource" id="Resource_wg1pr"]
+script = ExtResource("4_oqbub")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"]
+albedo_texture = ExtResource("5_c0upu")
+uv1_triplanar = true
+uv1_world_triplanar = true
+
+[node name="Root" type="Node3D"]
+
+[node name="MainCamera3D" type="Camera3D" parent="."]
+unique_name_in_owner = true
+transform = Transform3D(0.99995, 0, 0, 0, 0.79324, 0.608671, 0, -0.608675, 0.793235, 0.083587, 2.94168, 5.22787)
+
+[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"]
+script = ExtResource("1_7824u")
+
+[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0)
+metadata/_edit_lock_ = true
+
+[node name="Player" type="Node" parent="."]
+
+[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_target")]
+unique_name_in_owner = true
+transform = Transform3D(0.99995, 0, 0, 0, 0.79324, 0.608671, 0, -0.608675, 0.793235, 0.083587, 2.94168, 5.22787)
+script = ExtResource("2_g1bv4")
+follow_mode = 5
+follow_target = NodePath("../PlayerCharacterBody3D2/PlayerVisual")
+tween_resource = ExtResource("3_420vh")
+tween_on_load = false
+camera_3d_resource = SubResource("Resource_wg1pr")
+follow_damping = true
+follow_distance = 4.0
+dead_zone_width = 0.384
+dead_zone_height = 0.669
+show_viewfinder_in_play = true
+spring_length = 4.0
+
+[node name="PlayerCharacterBody3D2" parent="Player" instance=ExtResource("5_f2w3x")]
+
+[node name="Environment" type="Node" parent="."]
+
+[node name="Floor" parent="Environment" instance=ExtResource("4_t4fso")]
+transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0)
+metadata/_edit_lock_ = true
+
+[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.636134, 0.805455, -6.37532)
+use_collision = true
+radius = 1.71971
+height = 2.61091
+sides = 32
+
+[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.54597, -0.540694, -3.39517)
+use_collision = true
+radius = 1.53269
+height = 2.5036
+sides = 32
+
+[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.64877, -1.50101, 1.22863)
+use_collision = true
+radius = 1.57419
+height = 3.47475
+sides = 32
+
+[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.4732, 0.805455, -8.78984)
+use_collision = true
+radius = 0.956285
+height = 2.61091
+sides = 32
+
+[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.40027, -1.69814, 3.36997)
+use_collision = true
+radius = 3.34732
+rings = 32
+
+[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.13768, -0.599204, -1.04651)
+use_collision = true
+radius = 2.65844
+rings = 32
+
+[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.7976, -0.599204, -2.42244)
+use_collision = true
+radius = 2.14606
+rings = 32
+
+[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.84078, -0.497663, 4.44352)
+use_collision = true
+inner_radius = 0.971543
+outer_radius = 2.15226
+sides = 32
+ring_sides = 18
+
+[node name="CSGBox3D" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.52545, 6.53866, -12.6331)
+use_collision = true
+size = Vector3(178.429, 14.0773, 1)
+material = SubResource("StandardMaterial3D_auy8m")
+
+[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.88916, 0.760708, -6.1376)
+use_collision = true
+size = Vector3(2.64182, 2.52142, 2.30997)
+
+[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.83837, -0.241718, 7.14677)
+use_collision = true
+size = Vector3(3.80964, 1.67049, 0.932048)
+
+[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.34377, 0.138478, -4.36159)
+use_collision = true
+size = Vector3(1.53893, 1.27695, 1.80814)
+
+[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.9834, 0.138478, -1.89037)
+use_collision = true
+size = Vector3(4.03502, 1.27695, 5.2198)
+
+[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.38147, 0.0440434, 8.36617)
+use_collision = true
+size = Vector3(4.57784, 1.08809, 3.11285)
+
+[editable path="Player/PlayerCharacterBody3D2"]
diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_glued_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_glued_example_scene.tscn
new file mode 100644 (file)
index 0000000..0d7b543
--- /dev/null
@@ -0,0 +1,199 @@
+[gd_scene load_steps=14 format=3 uid="uid://dw2yflu7up2rr"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_pmeux"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_q1ygp"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_hpix1"]
+[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="4_8qqha"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_evdoo"]
+[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="5_vqgn5"]
+[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="5_wr3bq"]
+
+[sub_resource type="Resource" id="Resource_ucp3e"]
+script = ExtResource("3_hpix1")
+duration = 1.0
+transition = 0
+ease = 2
+
+[sub_resource type="Resource" id="Resource_ab013"]
+script = ExtResource("4_evdoo")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_w3olp"]
+albedo_color = Color(0.227451, 0.337255, 0.576471, 1)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cw102"]
+albedo_color = Color(0.227451, 0.337255, 0.576471, 1)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"]
+albedo_texture = ExtResource("5_wr3bq")
+uv1_triplanar = true
+uv1_world_triplanar = true
+
+[node name="Node3D" type="Node3D"]
+
+[node name="MainCamera3D" type="Camera3D" parent="."]
+unique_name_in_owner = true
+transform = Transform3D(0.999954, 0, 0, 0, 0.638683, 0.769345, 0, -0.769298, 0.638723, -5.60519e-45, 6.39, 7)
+
+[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"]
+script = ExtResource("1_pmeux")
+
+[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0)
+metadata/_edit_lock_ = true
+
+[node name="Player" type="Node" parent="."]
+
+[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_target")]
+unique_name_in_owner = true
+transform = Transform3D(0.999954, 0, 0, 0, 0.638683, 0.769345, 0, -0.769298, 0.638723, -5.60519e-45, 6.39, 7)
+script = ExtResource("2_q1ygp")
+priority = 5
+follow_mode = 1
+follow_target = NodePath("../PlayerCharacterBody3D/PlayerVisual")
+tween_resource = SubResource("Resource_ucp3e")
+tween_on_load = false
+camera_3d_resource = SubResource("Resource_ab013")
+follow_damping = true
+follow_damping_value = Vector3(0.3, 0.3, 0.3)
+
+[node name="PlayerCharacterBody3D" parent="Player" instance=ExtResource("5_vqgn5")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 6.39, 7)
+enable_gravity = false
+
+[node name="PlayerVisual" parent="Player/PlayerCharacterBody3D" index="2"]
+visible = false
+
+[node name="NPCs" type="Node" parent="."]
+
+[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="NPCs"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.04486, 0.519002, -1.52506)
+mesh = SubResource("CapsuleMesh_2h36r")
+skeleton = NodePath("")
+surface_material_override/0 = SubResource("StandardMaterial3D_w3olp")
+
+[node name="PlayerMeshInstance3D2" type="MeshInstance3D" parent="NPCs"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.51494, 0.519, 4.06618)
+mesh = SubResource("CapsuleMesh_2h36r")
+skeleton = NodePath("")
+surface_material_override/0 = SubResource("StandardMaterial3D_cw102")
+
+[node name="Environment" type="Node" parent="."]
+
+[node name="Floor" parent="Environment" instance=ExtResource("4_8qqha")]
+transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0)
+metadata/_edit_lock_ = true
+
+[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.62737, 0.805455, -6.37532)
+use_collision = true
+radius = 1.71971
+height = 2.61091
+sides = 32
+
+[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 24.9378, 0.31181, -5.46661)
+use_collision = true
+radius = 2.77591
+height = 1.62362
+sides = 32
+
+[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.58617, 0.31181, 6.6322)
+use_collision = true
+radius = 1.57419
+height = 3.47475
+sides = 32
+
+[node name="CSGCylinder3D3" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.774, 0.201103, 2.71259)
+use_collision = true
+radius = 1.41311
+height = 1.40221
+sides = 32
+
+[node name="CSGCylinder3D4" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.40488, 0.201101, 11.6804)
+use_collision = true
+radius = 2.21673
+height = 7.88261
+sides = 32
+
+[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.20971, 0.805455, -8.78984)
+use_collision = true
+radius = 0.956285
+height = 2.61091
+sides = 32
+
+[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.9771, -1.69814, -6.51262)
+use_collision = true
+radius = 3.34732
+rings = 32
+
+[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.555532, -0.599204, 8.81048)
+use_collision = true
+radius = 2.65844
+rings = 32
+
+[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.0611, -0.599204, -2.42244)
+use_collision = true
+radius = 2.14606
+rings = 32
+
+[node name="CSGTorus3D" type="CSGTorus3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.21187, -1.90735e-06, 0.346393)
+use_collision = true
+inner_radius = 1.3
+outer_radius = 2.0
+sides = 32
+ring_sides = 18
+
+[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 21.9283, -1.90735e-06, 7.89765)
+use_collision = true
+inner_radius = 0.971543
+outer_radius = 2.15226
+sides = 32
+ring_sides = 18
+
+[node name="CSGBox3D" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.49828, 6.53866, -12.6331)
+use_collision = true
+size = Vector3(178.429, 14.0773, 1)
+material = SubResource("StandardMaterial3D_auy8m")
+
+[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.15267, 0.760708, -6.1376)
+use_collision = true
+size = Vector3(2.64182, 2.52142, 2.30997)
+
+[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.3427, 0.335247, 8.22829)
+use_collision = true
+size = Vector3(3.80964, 1.67049, 0.932048)
+
+[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.08027, 0.138478, -4.36159)
+use_collision = true
+size = Vector3(1.53893, 1.27695, 1.80814)
+
+[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.7748, 0.138478, 5.20734)
+use_collision = true
+size = Vector3(4.03502, 1.27695, 5.2198)
+
+[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30.1473, 1.78638, -1.60318)
+use_collision = true
+size = Vector3(4.57784, 4.57276, 3.11285)
+
+[editable path="Player/PlayerCharacterBody3D"]
diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_group_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_group_example_scene.tscn
new file mode 100644 (file)
index 0000000..9ef95a5
--- /dev/null
@@ -0,0 +1,171 @@
+[gd_scene load_steps=13 format=3 uid="uid://dbfiy6svpcqap"]
+
+[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="1_r00ve"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_pi7mp"]
+[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="2_wnlkq"]
+[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres" id="3_1eb12"]
+[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="3_a5igg"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="3_wr1tj"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="5_70gws"]
+
+[sub_resource type="Resource" id="Resource_1iman"]
+script = ExtResource("5_70gws")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_w3olp"]
+albedo_color = Color(0.227451, 0.337255, 0.576471, 1)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cw102"]
+albedo_color = Color(0.227451, 0.337255, 0.576471, 1)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"]
+albedo_texture = ExtResource("3_a5igg")
+uv1_triplanar = true
+uv1_world_triplanar = true
+
+[node name="Node3D" type="Node3D"]
+
+[node name="MainCamera3D" type="Camera3D" parent="."]
+unique_name_in_owner = true
+transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -7.26116, 5.72974, 12.279)
+
+[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"]
+script = ExtResource("3_wr1tj")
+
+[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0)
+metadata/_edit_lock_ = true
+
+[node name="Player" type="Node" parent="."]
+
+[node name="PlayerCharacterBody3D2" parent="Player" instance=ExtResource("2_wnlkq")]
+
+[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_targets")]
+unique_name_in_owner = true
+transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -7.26116, 5.72974, 12.279)
+script = ExtResource("2_pi7mp")
+priority = 5
+follow_mode = 3
+follow_targets = [NodePath("../PlayerCharacterBody3D2"), NodePath("../../NPCs/PlayerMeshInstance3D"), NodePath("../../NPCs/PlayerMeshInstance3D2")]
+tween_resource = ExtResource("3_1eb12")
+tween_on_load = false
+camera_3d_resource = SubResource("Resource_1iman")
+follow_damping = true
+follow_distance = 5.0
+auto_follow_distance = true
+auto_follow_distance_min = 5.0
+auto_follow_distance_max = 15.0
+auto_follow_distance_divisor = 20.0
+spring_length = 5.0
+
+[node name="NPCs" type="Node" parent="."]
+
+[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="NPCs"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.6059, 0.519002, 0.128472)
+mesh = SubResource("CapsuleMesh_2h36r")
+skeleton = NodePath("")
+surface_material_override/0 = SubResource("StandardMaterial3D_w3olp")
+
+[node name="PlayerMeshInstance3D2" type="MeshInstance3D" parent="NPCs"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.0461, 0.519, 0.249913)
+mesh = SubResource("CapsuleMesh_2h36r")
+skeleton = NodePath("")
+surface_material_override/0 = SubResource("StandardMaterial3D_cw102")
+
+[node name="Environment" type="Node" parent="."]
+
+[node name="Floor" parent="Environment" instance=ExtResource("1_r00ve")]
+transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0)
+metadata/_edit_lock_ = true
+
+[node name="Wall" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.52545, 6.53866, -12.6331)
+use_collision = true
+size = Vector3(178.429, 14.0773, 1)
+material = SubResource("StandardMaterial3D_auy8m")
+
+[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.6511, 0.805455, -6.37532)
+use_collision = true
+radius = 1.71971
+height = 2.61091
+sides = 32
+
+[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.9141, 0.31181, -5.46661)
+use_collision = true
+radius = 2.77591
+height = 1.62362
+sides = 32
+
+[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.6099, 0.31181, 6.6322)
+use_collision = true
+radius = 1.57419
+height = 3.47475
+sides = 32
+
+[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.81402, 0.805455, -8.78984)
+use_collision = true
+radius = 0.956285
+height = 2.61091
+sides = 32
+
+[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.95333, -1.69814, -6.51262)
+use_collision = true
+radius = 3.34732
+rings = 32
+
+[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.4682, -0.599204, 8.81048)
+use_collision = true
+radius = 2.65844
+rings = 32
+
+[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.0848, -0.599204, -2.42244)
+use_collision = true
+radius = 2.14606
+rings = 32
+
+[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.90455, -1.90735e-06, 7.89765)
+use_collision = true
+inner_radius = 0.971543
+outer_radius = 2.15226
+sides = 32
+ring_sides = 18
+
+[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.1764, 0.760708, -6.1376)
+use_collision = true
+size = Vector3(2.64182, 2.52142, 2.30997)
+
+[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.31901, 0.335247, 8.22829)
+use_collision = true
+size = Vector3(3.80964, 1.67049, 0.932048)
+
+[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.94346, 0.138478, -4.36159)
+use_collision = true
+size = Vector3(1.53893, 1.27695, 1.80814)
+
+[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.7985, 0.138478, 5.20734)
+use_collision = true
+size = Vector3(4.03502, 1.27695, 5.2198)
+
+[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18.1236, 1.78638, -1.60318)
+use_collision = true
+size = Vector3(4.57784, 4.57276, 3.11285)
+
+[editable path="Player/PlayerCharacterBody3D2"]
diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_path_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_path_example_scene.tscn
new file mode 100644 (file)
index 0000000..4228afd
--- /dev/null
@@ -0,0 +1,221 @@
+[gd_scene load_steps=24 format=3 uid="uid://dxx7ngi0emt8h"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_lm5n8"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="3_bd7x3"]
+[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres" id="3_od2r4"]
+[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="4_dfdlo"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_hni7n"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="4_lfwkm"]
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/path_follow.gd" id="5_vdqkm"]
+[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="5_vms5c"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="6_obo83"]
+
+[sub_resource type="Resource" id="Resource_ofv2c"]
+script = ExtResource("4_hni7n")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="Resource" id="Resource_01tho"]
+script = ExtResource("4_lfwkm")
+duration = 1.2
+transition = 3
+ease = 2
+
+[sub_resource type="Resource" id="Resource_syh5m"]
+script = ExtResource("4_hni7n")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="Curve3D" id="Curve3D_b33df"]
+_data = {
+"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10),
+"tilts": PackedFloat32Array(0, 0)
+}
+point_count = 2
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_aovgi"]
+size = Vector3(6, 0.1, 10)
+
+[sub_resource type="BoxMesh" id="BoxMesh_0hdeh"]
+size = Vector3(6, 0.1, 10)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_fsm1b"]
+transparency = 1
+albedo_color = Color(0.988235, 0.478431, 0.905882, 0.0901961)
+
+[sub_resource type="Resource" id="Resource_xci4c"]
+script = ExtResource("4_hni7n")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="Curve3D" id="Curve3D_8uw2x"]
+_data = {
+"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0),
+"tilts": PackedFloat32Array(0, 0)
+}
+point_count = 2
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_ctnqu"]
+size = Vector3(12, 0.1, 4)
+
+[sub_resource type="BoxMesh" id="BoxMesh_f6dp8"]
+size = Vector3(12, 0.1, 4)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_gwnkj"]
+transparency = 1
+albedo_color = Color(0.568403, 0.988235, 0.762724, 0.0901961)
+
+[sub_resource type="BoxMesh" id="BoxMesh_7l3dh"]
+
+[sub_resource type="BoxMesh" id="BoxMesh_as6ok"]
+
+[node name="Root" type="Node3D"]
+
+[node name="MainCamera3D" type="Camera3D" parent="."]
+unique_name_in_owner = true
+transform = Transform3D(0.999807, -0.00216249, 0.00184445, 0, 0.648836, 0.760728, -0.00284214, -0.760718, 0.648839, 0, 2.507, 1.5)
+
+[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"]
+script = ExtResource("1_lm5n8")
+
+[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0)
+metadata/_edit_lock_ = true
+
+[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")]
+unique_name_in_owner = true
+transform = Transform3D(0.999807, -0.00216249, 0.00184445, 0, 0.648836, 0.760728, -0.00284214, -0.760718, 0.648839, 0, 2.507, 1.5)
+script = ExtResource("3_bd7x3")
+priority = 10
+follow_mode = 2
+follow_target = NodePath("../PlayerCharacterBody3D2/PlayerVisual")
+tween_resource = ExtResource("3_od2r4")
+tween_on_load = false
+camera_3d_resource = SubResource("Resource_ofv2c")
+follow_offset = Vector3(0, 2, 1.5)
+follow_damping = true
+
+[node name="PlayerCharacterBody3D2" parent="." instance=ExtResource("5_vms5c")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.507, 0)
+
+[node name="Paths" type="Node" parent="."]
+
+[node name="PathPhantomCamera3D" type="Node3D" parent="Paths" node_paths=PackedStringArray("follow_target", "follow_path")]
+transform = Transform3D(-4.37114e-08, -1, -4.37114e-08, 0, -4.37114e-08, 1, -1, 4.37114e-08, 1.91069e-15, -0.31028, 7.9199, -1.60976)
+script = ExtResource("3_bd7x3")
+priority = 2
+follow_mode = 4
+follow_target = NodePath("../../PlayerCharacterBody3D2/PlayerVisual")
+follow_path = NodePath("../FollowPath")
+tween_resource = SubResource("Resource_01tho")
+camera_3d_resource = SubResource("Resource_syh5m")
+follow_damping = true
+
+[node name="FollowPath" type="Path3D" parent="Paths"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.31028, 7.9199, -1.60976)
+curve = SubResource("Curve3D_b33df")
+
+[node name="StraightPathFollowTrigger" type="Area3D" parent="Paths" node_paths=PackedStringArray("path_pcam")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0420399, -0.45, -6.73666)
+priority = 5
+script = ExtResource("5_vdqkm")
+path_pcam = NodePath("../PathPhantomCamera3D")
+metadata/_edit_group_ = true
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Paths/StraightPathFollowTrigger"]
+shape = SubResource("BoxShape3D_aovgi")
+
+[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Paths/StraightPathFollowTrigger/CollisionShape3D"]
+mesh = SubResource("BoxMesh_0hdeh")
+skeleton = NodePath("../../../..")
+surface_material_override/0 = SubResource("StandardMaterial3D_fsm1b")
+metadata/_edit_group_ = true
+
+[node name="PathPhantomCamera3D2" type="Node3D" parent="Paths" node_paths=PackedStringArray("follow_target", "follow_path")]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 7.9199, -13.4572)
+visible = false
+script = ExtResource("3_bd7x3")
+priority = 2
+follow_mode = 4
+follow_target = NodePath("../../PlayerCharacterBody3D2/PlayerVisual")
+follow_path = NodePath("../FollowPath2")
+tween_resource = SubResource("Resource_01tho")
+camera_3d_resource = SubResource("Resource_xci4c")
+follow_damping = true
+follow_damping_value = Vector3(0.6, 0.1, 0.1)
+
+[node name="FollowPath2" type="Path3D" parent="Paths"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.97141, 7.9199, -13.4572)
+curve = SubResource("Curve3D_8uw2x")
+
+[node name="StraightPathFollowTrigger2" type="Area3D" parent="Paths" node_paths=PackedStringArray("path_pcam")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0420399, 0, -13.7367)
+priority = 5
+script = ExtResource("5_vdqkm")
+path_pcam = NodePath("../PathPhantomCamera3D2")
+metadata/_edit_group_ = true
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Paths/StraightPathFollowTrigger2"]
+shape = SubResource("BoxShape3D_ctnqu")
+
+[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Paths/StraightPathFollowTrigger2/CollisionShape3D"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.45, 0)
+mesh = SubResource("BoxMesh_f6dp8")
+skeleton = NodePath("../../../..")
+surface_material_override/0 = SubResource("StandardMaterial3D_gwnkj")
+metadata/_edit_group_ = true
+
+[node name="Environment" type="Node" parent="."]
+
+[node name="Floor" parent="Environment" instance=ExtResource("4_dfdlo")]
+transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0)
+metadata/_edit_lock_ = true
+
+[node name="Floor3" parent="Environment" instance=ExtResource("4_dfdlo")]
+transform = Transform3D(6, 0, 0, 0, 1, 0, 0, 0, 1, -0.44204, 0, 1.76334)
+
+[node name="Floor2" parent="Environment/Floor3" instance=ExtResource("4_dfdlo")]
+transform = Transform3D(0.166667, 0, 0, 0, 3, 0, 0, 0, 14, -0.516667, 1, -6.5)
+
+[node name="Floor5" parent="Environment/Floor3" instance=ExtResource("4_dfdlo")]
+transform = Transform3D(0.166667, 0, 0, 0, 3, 0, 0, 0, 14, 0.65, 1, -6.5)
+
+[node name="Floor4" parent="Environment/Floor3" instance=ExtResource("4_dfdlo")]
+transform = Transform3D(2, 0, 0, 0, 3, 0, 0, 0, 1, 0.0666667, 1, -18)
+
+[node name="Floor6" parent="Environment/Floor3" instance=ExtResource("4_dfdlo")]
+transform = Transform3D(0.333333, 0, 0, 0, 3, 0, 0, 0, 1, -0.766667, 1, -13)
+mesh = SubResource("BoxMesh_7l3dh")
+
+[node name="Floor8" parent="Environment/Floor3" instance=ExtResource("4_dfdlo")]
+transform = Transform3D(0.166667, 0, 0, 0, 3, 0, 0, 0, 6, -1.01667, 1, -15.5)
+mesh = SubResource("BoxMesh_as6ok")
+
+[node name="Floor9" parent="Environment/Floor3" instance=ExtResource("4_dfdlo")]
+transform = Transform3D(0.166667, 0, 0, 0, 3, 0, 0, 0, 6, 1.15, 1, -15.5)
+mesh = SubResource("BoxMesh_as6ok")
+
+[node name="Floor7" parent="Environment/Floor3" instance=ExtResource("4_dfdlo")]
+transform = Transform3D(0.333333, 0, 0, 0, 3, 0, 0, 0, 1, 0.9, 1, -13)
+mesh = SubResource("BoxMesh_7l3dh")
+
+[node name="NPCDescriptionLabel" type="Label3D" parent="Environment"]
+transform = Transform3D(5.21541e-08, -1, -7.7486e-07, -1.10675e-15, 2.23517e-07, 0.999999, -0.999999, -7.45058e-08, -5.68829e-14, -3.47306, 2.59595, -5.51755)
+text = "Camera follows player while confined to a Path3D"
+font = ExtResource("6_obo83")
+font_size = 64
+
+[node name="MovementInstructionsLabel" type="Label3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.02174, -0.455369, 0.570585)
+modulate = Color(0.294118, 1, 0.631373, 1)
+text = "[WASD] to move"
+font = ExtResource("6_obo83")
+font_size = 48
+
+[editable path="PlayerCharacterBody3D2"]
diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_simple_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_simple_example_scene.tscn
new file mode 100644 (file)
index 0000000..f81396f
--- /dev/null
@@ -0,0 +1,174 @@
+[gd_scene load_steps=14 format=3 uid="uid://buglvjwpn85ny"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_3tok8"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_grjck"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_j3f4l"]
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller.gd" id="3_uymu2"]
+[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="4_4u2y6"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_sielv"]
+[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="5_1tybo"]
+
+[sub_resource type="Resource" id="Resource_28vpp"]
+script = ExtResource("3_j3f4l")
+duration = 1.0
+transition = 0
+ease = 2
+
+[sub_resource type="Resource" id="Resource_axopo"]
+script = ExtResource("4_sielv")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="CapsuleMesh" id="CapsuleMesh_pda7a"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_u74j7"]
+albedo_color = Color(0.988235, 0.498039, 0.498039, 1)
+
+[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_3xplc"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"]
+albedo_texture = ExtResource("5_1tybo")
+uv1_triplanar = true
+uv1_world_triplanar = true
+
+[node name="Node3D2" type="Node3D"]
+
+[node name="MainCamera3D" type="Camera3D" parent="."]
+unique_name_in_owner = true
+transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -13.1946, 2.34415, 10.4086)
+
+[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"]
+script = ExtResource("1_3tok8")
+
+[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0)
+metadata/_edit_lock_ = true
+
+[node name="Player" type="Node" parent="."]
+
+[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_target")]
+unique_name_in_owner = true
+transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -13.1946, 2.34415, 10.4086)
+script = ExtResource("2_grjck")
+priority = 10
+follow_mode = 2
+follow_target = NodePath("../PlayerCharacterBody3D2")
+tween_resource = SubResource("Resource_28vpp")
+tween_on_load = false
+camera_3d_resource = SubResource("Resource_axopo")
+follow_offset = Vector3(0, 2, 2)
+follow_damping = true
+
+[node name="PlayerCharacterBody3D2" type="CharacterBody3D" parent="Player"]
+unique_name_in_owner = true
+transform = Transform3D(0.999897, 0.0143636, 0, -0.0143636, 0.999897, 0, 0, 0, 1, -13.1946, 0.344147, 8.40857)
+script = ExtResource("3_uymu2")
+metadata/_edit_group_ = true
+
+[node name="PlayerModel" type="MeshInstance3D" parent="Player/PlayerCharacterBody3D2"]
+unique_name_in_owner = true
+mesh = SubResource("CapsuleMesh_pda7a")
+surface_material_override/0 = SubResource("StandardMaterial3D_u74j7")
+
+[node name="PlayerArea3D" type="Area3D" parent="Player/PlayerCharacterBody3D2"]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D2/PlayerArea3D"]
+shape = SubResource("CapsuleShape3D_3xplc")
+
+[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D2"]
+shape = SubResource("CapsuleShape3D_3xplc")
+
+[node name="NPCs" type="Node" parent="."]
+
+[node name="Environment" type="Node" parent="."]
+
+[node name="Floor" parent="Environment" instance=ExtResource("4_4u2y6")]
+transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0)
+metadata/_edit_lock_ = true
+
+[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.6511, 0.805455, -6.37532)
+use_collision = true
+radius = 1.71971
+height = 2.61091
+sides = 32
+
+[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.8332, -0.540694, -3.39517)
+use_collision = true
+radius = 1.53269
+height = 2.5036
+sides = 32
+
+[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.936, -1.50101, 1.22863)
+use_collision = true
+radius = 1.57419
+height = 3.47475
+sides = 32
+
+[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.81402, 0.805455, -8.78984)
+use_collision = true
+radius = 0.956285
+height = 2.61091
+sides = 32
+
+[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23.6875, -1.69814, 3.36997)
+use_collision = true
+radius = 3.34732
+rings = 32
+
+[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.14955, -0.599204, -1.04651)
+use_collision = true
+radius = 2.65844
+rings = 32
+
+[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.0848, -0.599204, -2.42244)
+use_collision = true
+radius = 2.14606
+rings = 32
+
+[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.44645, -0.497663, 4.44352)
+use_collision = true
+inner_radius = 0.971543
+outer_radius = 2.15226
+sides = 32
+ring_sides = 18
+
+[node name="CSGBox3D" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.52545, 6.53866, -12.6331)
+use_collision = true
+size = Vector3(178.429, 14.0773, 1)
+material = SubResource("StandardMaterial3D_auy8m")
+
+[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.1764, 0.760708, -6.1376)
+use_collision = true
+size = Vector3(2.64182, 2.52142, 2.30997)
+
+[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -18.1256, 0.335247, 7.14677)
+use_collision = true
+size = Vector3(3.80964, 1.67049, 0.932048)
+
+[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.94346, 0.138478, -4.36159)
+use_collision = true
+size = Vector3(1.53893, 1.27695, 1.80814)
+
+[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.30382, 0.138478, -1.89037)
+use_collision = true
+size = Vector3(4.03502, 1.27695, 5.2198)
+
+[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.04727, 0.0440434, 8.36617)
+use_collision = true
+size = Vector3(4.57784, 1.08809, 3.11285)
diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_example_scene.tscn
new file mode 100644 (file)
index 0000000..5c1f34c
--- /dev/null
@@ -0,0 +1,171 @@
+[gd_scene load_steps=16 format=3 uid="uid://4i5csj0s34nb"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="2_47xf2"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_whx47"]
+[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="4_lii5s"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="5_jt2lp"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="5_oc4q1"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="7_kg7u1"]
+[ext_resource type="PackedScene" uid="uid://mskcwn1a1v6d" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_third_person_3d.tscn" id="7_kut0u"]
+
+[sub_resource type="Resource" id="Resource_8fhct"]
+script = ExtResource("2_47xf2")
+duration = 0.3
+transition = 3
+ease = 1
+
+[sub_resource type="Resource" id="Resource_7m0fv"]
+script = ExtResource("5_jt2lp")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="Resource" id="Resource_e7t18"]
+script = ExtResource("2_47xf2")
+duration = 0.4
+transition = 2
+ease = 1
+
+[sub_resource type="Resource" id="Resource_jogxh"]
+script = ExtResource("5_jt2lp")
+cull_mask = 1048575
+h_offset = 1.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="BoxMesh" id="BoxMesh_wsigl"]
+size = Vector3(1, 10, 20)
+
+[sub_resource type="BoxMesh" id="BoxMesh_bj3re"]
+size = Vector3(1, 7, 7)
+
+[sub_resource type="Resource" id="Resource_afrr1"]
+script = ExtResource("2_47xf2")
+duration = 0.6
+transition = 3
+ease = 1
+
+[sub_resource type="Resource" id="Resource_y5dqe"]
+script = ExtResource("5_jt2lp")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[node name="Root" type="Node3D"]
+
+[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")]
+unique_name_in_owner = true
+transform = Transform3D(1, 0, 0, 0, 0.866025, 0.499999, 0, -0.5, 0.866023, -0.0194088, 2.25688, 3.01476)
+script = ExtResource("2_whx47")
+priority = 10
+follow_mode = 6
+follow_target = NodePath("../PlayerCharacterBody3D/PlayerVisual")
+tween_resource = SubResource("Resource_8fhct")
+tween_on_load = null
+camera_3d_resource = SubResource("Resource_7m0fv")
+follow_damping = true
+follow_distance = 3.5
+spring_length = 3.5
+
+[node name="PlayerAimPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")]
+unique_name_in_owner = true
+transform = Transform3D(0.953716, -0.0104945, 0.300522, 0, 0.99939, 0.0348995, -0.300706, -0.0332842, 0.953135, 0.431374, 1.35923, 1.41338)
+script = ExtResource("2_whx47")
+follow_mode = 6
+follow_target = NodePath("../PlayerCharacterBody3D/PlayerVisual")
+tween_resource = SubResource("Resource_e7t18")
+tween_on_load = null
+camera_3d_resource = SubResource("Resource_jogxh")
+follow_offset = Vector3(0, 0.8, 0)
+follow_damping = true
+follow_distance = 1.5
+spring_length = 1.5
+
+[node name="PlayerCharacterBody3D" parent="." instance=ExtResource("7_kut0u")]
+unique_name_in_owner = true
+
+[node name="MainCamera3D" type="Camera3D" parent="."]
+unique_name_in_owner = true
+transform = Transform3D(1, 0, 0, 0, 0.866025, 0.499999, 0, -0.5, 0.866023, -0.0194088, 2.25688, 3.01476)
+current = true
+
+[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"]
+script = ExtResource("5_oc4q1")
+
+[node name="Environment" type="Node" parent="."]
+
+[node name="Floor" parent="Environment" instance=ExtResource("4_lii5s")]
+transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0)
+metadata/_edit_lock_ = true
+
+[node name="Wall" parent="Environment" instance=ExtResource("4_lii5s")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.5, 4.5, 0)
+mesh = SubResource("BoxMesh_wsigl")
+metadata/_edit_lock_ = true
+
+[node name="Wall5" parent="Environment" instance=ExtResource("4_lii5s")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.133, 3, -6.5)
+mesh = SubResource("BoxMesh_bj3re")
+metadata/_edit_lock_ = true
+
+[node name="Wall6" parent="Environment" instance=ExtResource("4_lii5s")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 3, 0)
+mesh = SubResource("BoxMesh_bj3re")
+metadata/_edit_lock_ = true
+
+[node name="Wall7" parent="Environment" instance=ExtResource("4_lii5s")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.5, 3, 0)
+mesh = SubResource("BoxMesh_bj3re")
+metadata/_edit_lock_ = true
+
+[node name="Wall2" parent="Environment" instance=ExtResource("4_lii5s")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.5, 4.5, 0)
+mesh = SubResource("BoxMesh_wsigl")
+metadata/_edit_lock_ = true
+
+[node name="Wall3" parent="Environment" instance=ExtResource("4_lii5s")]
+transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 4.5, 10.5)
+mesh = SubResource("BoxMesh_wsigl")
+metadata/_edit_lock_ = true
+
+[node name="Wall4" parent="Environment" instance=ExtResource("4_lii5s")]
+transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 4.5, -9.5)
+mesh = SubResource("BoxMesh_wsigl")
+metadata/_edit_lock_ = true
+
+[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0)
+metadata/_edit_lock_ = true
+
+[node name="CeilingPhantomCamera3D" type="Node3D" parent="."]
+unique_name_in_owner = true
+transform = Transform3D(-4.37114e-08, -1, 2.98023e-08, 0, 2.98023e-08, 1, -1, 4.37114e-08, -1.3027e-15, -0.200665, 13.366, -0.162648)
+script = ExtResource("2_whx47")
+tween_resource = SubResource("Resource_afrr1")
+tween_on_load = null
+camera_3d_resource = SubResource("Resource_y5dqe")
+
+[node name="MovementInstructionsLabel" type="Label3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 1.44357)
+modulate = Color(0.294118, 1, 0.631373, 1)
+text = "[WASD] to move"
+font = ExtResource("7_kg7u1")
+font_size = 48
+
+[node name="MovementInstructionsLabel3" type="Label3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 0.817134)
+modulate = Color(0.294118, 1, 0.631373, 1)
+text = "[Right Mouse Click] to \"aim\""
+font = ExtResource("7_kg7u1")
+font_size = 48
+
+[node name="MovementInstructionsLabel2" type="Label3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.0440154, -0.490478, -6.30248)
+modulate = Color(0.294118, 1, 0.631373, 1)
+text = "[Space] to toggle PCam"
+font = ExtResource("7_kg7u1")
+font_size = 48
+
+[editable path="PlayerCharacterBody3D"]
diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_look_at_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_look_at_example_scene.tscn
new file mode 100644 (file)
index 0000000..d6fa268
--- /dev/null
@@ -0,0 +1,193 @@
+[gd_scene load_steps=14 format=3 uid="uid://bdhrdhbux7sjg"]
+
+[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="1_i2pjc"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_lldvu"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_8md3q"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_dqss1"]
+[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="4_2i811"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_m3qpq"]
+[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="5_u5qhp"]
+
+[sub_resource type="Resource" id="Resource_pwcgo"]
+script = ExtResource("3_dqss1")
+duration = 1.0
+transition = 0
+ease = 2
+
+[sub_resource type="Resource" id="Resource_ft2w3"]
+script = ExtResource("4_m3qpq")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_w3olp"]
+albedo_color = Color(0.227451, 0.337255, 0.576471, 1)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cw102"]
+albedo_color = Color(0.227451, 0.337255, 0.576471, 1)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"]
+albedo_texture = ExtResource("5_u5qhp")
+uv1_triplanar = true
+uv1_world_triplanar = true
+
+[node name="Node3D" type="Node3D"]
+
+[node name="MainCamera3D" type="Camera3D" parent="."]
+unique_name_in_owner = true
+transform = Transform3D(0.998682, 0.0324725, -0.0397495, 0, 0.774433, 0.632656, 0.0513272, -0.631822, 0.773413, -0.137901, 4.03222, 6.36446)
+
+[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"]
+process_priority = 100
+script = ExtResource("1_lldvu")
+
+[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0)
+metadata/_edit_lock_ = true
+
+[node name="PhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("look_at_target", "look_at_targets")]
+transform = Transform3D(0.998682, 0.0324725, -0.0397495, 0, 0.774433, 0.632656, 0.0513272, -0.631822, 0.773413, -0.137901, 4.03222, 6.36446)
+script = ExtResource("2_8md3q")
+priority = 10
+look_at_mode = 2
+look_at_target = NodePath("../PlayerCharacterBody3D2/PlayerVisual")
+look_at_targets = [null, NodePath("../NPCs/PlayerMeshInstance3D")]
+tween_resource = SubResource("Resource_pwcgo")
+tween_on_load = false
+camera_3d_resource = SubResource("Resource_ft2w3")
+look_at_damping = true
+look_at_damping_value = 0.1
+
+[node name="PlayerCharacterBody3D2" parent="." instance=ExtResource("1_i2pjc")]
+
+[node name="NPCs" type="Node" parent="."]
+
+[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="NPCs"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.96028, 0.519002, -1.52506)
+mesh = SubResource("CapsuleMesh_2h36r")
+skeleton = NodePath("")
+surface_material_override/0 = SubResource("StandardMaterial3D_w3olp")
+
+[node name="PlayerMeshInstance3D2" type="MeshInstance3D" parent="NPCs"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.59952, 0.519, 4.06618)
+mesh = SubResource("CapsuleMesh_2h36r")
+skeleton = NodePath("")
+surface_material_override/0 = SubResource("StandardMaterial3D_cw102")
+
+[node name="Environment" type="Node" parent="."]
+
+[node name="Floor" parent="Environment" instance=ExtResource("4_2i811")]
+transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0)
+metadata/_edit_lock_ = true
+
+[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.00548, 0.805455, -6.37532)
+use_collision = true
+radius = 1.71971
+height = 2.61091
+sides = 32
+
+[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 25.5597, 0.31181, -5.46661)
+use_collision = true
+radius = 2.77591
+height = 1.62362
+sides = 32
+
+[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.96428, 0.31181, 6.6322)
+use_collision = true
+radius = 1.57419
+height = 3.47475
+sides = 32
+
+[node name="CSGCylinder3D3" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15.3959, 0.201103, 2.71259)
+use_collision = true
+radius = 1.41311
+height = 1.40221
+sides = 32
+
+[node name="CSGCylinder3D4" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.02677, 0.201101, 11.6804)
+use_collision = true
+radius = 2.21673
+height = 7.88261
+sides = 32
+
+[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.8316, 0.805455, -8.78984)
+use_collision = true
+radius = 0.956285
+height = 2.61091
+sides = 32
+
+[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15.5989, -1.69814, -6.51262)
+use_collision = true
+radius = 3.34732
+rings = 32
+
+[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.17742, -0.599204, 8.81048)
+use_collision = true
+radius = 2.65844
+rings = 32
+
+[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.4392, -0.599204, -2.42244)
+use_collision = true
+radius = 2.14606
+rings = 32
+
+[node name="CSGTorus3D" type="CSGTorus3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.58998, -1.90735e-06, 0.346393)
+use_collision = true
+inner_radius = 1.3
+outer_radius = 2.0
+sides = 32
+ring_sides = 18
+
+[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 22.5502, -1.90735e-06, 7.89765)
+use_collision = true
+inner_radius = 0.971543
+outer_radius = 2.15226
+sides = 32
+ring_sides = 18
+
+[node name="CSGBox3D" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.1202, 6.53866, -12.6331)
+use_collision = true
+size = Vector3(178.429, 14.0773, 1)
+material = SubResource("StandardMaterial3D_auy8m")
+
+[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.53078, 0.760708, -6.1376)
+use_collision = true
+size = Vector3(2.64182, 2.52142, 2.30997)
+
+[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.9646, 0.335247, 8.22829)
+use_collision = true
+size = Vector3(3.80964, 1.67049, 0.932048)
+
+[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.70216, 0.138478, -4.36159)
+use_collision = true
+size = Vector3(1.53893, 1.27695, 1.80814)
+
+[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.1529, 0.138478, 5.20734)
+use_collision = true
+size = Vector3(4.03502, 1.27695, 5.2198)
+
+[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30.7692, 1.78638, -1.60318)
+use_collision = true
+size = Vector3(4.57784, 4.57276, 3.11285)
+
+[editable path="PlayerCharacterBody3D2"]
diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_tweening_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_tweening_example_scene.tscn
new file mode 100644 (file)
index 0000000..eeba110
--- /dev/null
@@ -0,0 +1,258 @@
+[gd_scene load_steps=22 format=3 uid="uid://5xtssqdfilal"]
+
+[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="1_ydeog"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="2_b2yrt"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="3_m2w30"]
+[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres" id="4_425ma"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="5_cn3g7"]
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd" id="5_h0ouh"]
+[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="6_gcjyn"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="6_wup4d"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="8_60rny"]
+
+[sub_resource type="Resource" id="Resource_0dtvs"]
+script = ExtResource("5_cn3g7")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_j6fha"]
+size = Vector3(5, 0.1, 4)
+
+[sub_resource type="BoxMesh" id="BoxMesh_xg4en"]
+size = Vector3(5, 0.1, 4)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2dct5"]
+transparency = 1
+albedo_color = Color(0.988235, 0.478431, 0.905882, 0.0901961)
+
+[sub_resource type="Resource" id="Resource_v8ndi"]
+script = ExtResource("6_wup4d")
+duration = 0.6
+transition = 0
+ease = 2
+
+[sub_resource type="Resource" id="Resource_kmep1"]
+script = ExtResource("5_cn3g7")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="Resource" id="Resource_uxg44"]
+script = ExtResource("6_wup4d")
+duration = 0.3
+transition = 1
+ease = 2
+
+[sub_resource type="Resource" id="Resource_eu3bc"]
+script = ExtResource("5_cn3g7")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="Resource" id="Resource_0nci0"]
+script = ExtResource("6_wup4d")
+duration = 0.3
+transition = 8
+ease = 2
+
+[sub_resource type="Resource" id="Resource_u0lff"]
+script = ExtResource("5_cn3g7")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[sub_resource type="Resource" id="Resource_50m5g"]
+script = ExtResource("6_wup4d")
+duration = 1.2
+transition = 10
+ease = 2
+
+[sub_resource type="Resource" id="Resource_rexf8"]
+script = ExtResource("5_cn3g7")
+cull_mask = 1048575
+h_offset = 0.0
+v_offset = 0.0
+fov = 75.0
+
+[node name="Root" type="Node3D"]
+
+[node name="Environment" type="Node" parent="."]
+
+[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"]
+transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0)
+metadata/_edit_lock_ = true
+
+[node name="Floor" parent="Environment" instance=ExtResource("1_ydeog")]
+transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0)
+metadata/_edit_lock_ = true
+
+[node name="MainCamera3D" type="Camera3D" parent="."]
+unique_name_in_owner = true
+transform = Transform3D(0.999889, 0, 0, 0, 0.707092, 0.707088, 0, -0.707092, 0.707088, 0.083587, 2.507, 4.05493)
+
+[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"]
+script = ExtResource("2_b2yrt")
+
+[node name="------------------" type="Node" parent="."]
+
+[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")]
+unique_name_in_owner = true
+transform = Transform3D(0.999889, 0, 0, 0, 0.707092, 0.707088, 0, -0.707092, 0.707088, 0.083587, 2.507, 4.05493)
+script = ExtResource("3_m2w30")
+priority = 3
+follow_mode = 2
+follow_target = NodePath("../PlayerCharacterBody3D2/PlayerVisual")
+tween_resource = ExtResource("4_425ma")
+tween_on_load = false
+camera_3d_resource = SubResource("Resource_0dtvs")
+follow_offset = Vector3(0, 2, 2)
+follow_damping = true
+
+[node name="PlayerCharacterBody3D2" parent="." instance=ExtResource("6_gcjyn")]
+
+[node name="-------------------" type="Node" parent="."]
+
+[node name="Tweening Example" type="Node3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1.97)
+
+[node name="Linear" type="Node3D" parent="Tweening Example"]
+
+[node name="EntryRoomTrigger" type="Area3D" parent="Tweening Example/Linear" node_paths=PackedStringArray("area_pcam")]
+priority = 5
+script = ExtResource("5_h0ouh")
+area_pcam = NodePath("../PhantomCamera3D")
+metadata/_edit_group_ = true
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Tweening Example/Linear/EntryRoomTrigger"]
+shape = SubResource("BoxShape3D_j6fha")
+
+[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Tweening Example/Linear/EntryRoomTrigger"]
+mesh = SubResource("BoxMesh_xg4en")
+skeleton = NodePath("../../../../..")
+surface_material_override/0 = SubResource("StandardMaterial3D_2dct5")
+metadata/_edit_group_ = true
+
+[node name="PhantomCamera3D" type="Node3D" parent="Tweening Example/Linear"]
+transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, 0, 4.8, 3.3)
+script = ExtResource("3_m2w30")
+tween_resource = SubResource("Resource_v8ndi")
+camera_3d_resource = SubResource("Resource_kmep1")
+
+[node name="TweenNameLabel" type="Label3D" parent="Tweening Example/Linear"]
+transform = Transform3D(1, 0, 0, 0, 0.695913, 0.718126, 0, -0.718126, 0.695913, -1.8, 0.5, 0)
+text = "Transition Type:
+Linear
+
+Duration:
+0.6s"
+font = ExtResource("8_60rny")
+font_size = 48
+
+[node name="Sine" type="Node3D" parent="Tweening Example"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -7.4)
+
+[node name="EntryRoomTrigger" type="Area3D" parent="Tweening Example/Sine" node_paths=PackedStringArray("area_pcam")]
+priority = 5
+script = ExtResource("5_h0ouh")
+area_pcam = NodePath("../PhantomCamera3D")
+metadata/_edit_group_ = true
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Tweening Example/Sine/EntryRoomTrigger"]
+shape = SubResource("BoxShape3D_j6fha")
+
+[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Tweening Example/Sine/EntryRoomTrigger"]
+mesh = SubResource("BoxMesh_xg4en")
+skeleton = NodePath("../../../../..")
+surface_material_override/0 = SubResource("StandardMaterial3D_2dct5")
+metadata/_edit_group_ = true
+
+[node name="PhantomCamera3D" type="Node3D" parent="Tweening Example/Sine"]
+transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, 0, 4.8, 3.3)
+script = ExtResource("3_m2w30")
+tween_resource = SubResource("Resource_uxg44")
+camera_3d_resource = SubResource("Resource_eu3bc")
+
+[node name="TweenNameLabel" type="Label3D" parent="Tweening Example/Sine"]
+transform = Transform3D(1, 0, 0, 0, 0.695913, 0.718126, 0, -0.718126, 0.695913, 1.7, 0.5, 0)
+text = "Transition Type:
+Sine
+
+Duration:
+0.3s"
+font = ExtResource("8_60rny")
+font_size = 72
+
+[node name="Circ" type="Node3D" parent="Tweening Example"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -14.1)
+
+[node name="EntryRoomTrigger" type="Area3D" parent="Tweening Example/Circ" node_paths=PackedStringArray("area_pcam")]
+priority = 5
+script = ExtResource("5_h0ouh")
+area_pcam = NodePath("../PhantomCamera3D")
+metadata/_edit_group_ = true
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Tweening Example/Circ/EntryRoomTrigger"]
+shape = SubResource("BoxShape3D_j6fha")
+
+[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Tweening Example/Circ/EntryRoomTrigger"]
+mesh = SubResource("BoxMesh_xg4en")
+skeleton = NodePath("../../../../..")
+surface_material_override/0 = SubResource("StandardMaterial3D_2dct5")
+metadata/_edit_group_ = true
+
+[node name="PhantomCamera3D" type="Node3D" parent="Tweening Example/Circ"]
+transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, 0, 4.8, 3.3)
+script = ExtResource("3_m2w30")
+tween_resource = SubResource("Resource_0nci0")
+camera_3d_resource = SubResource("Resource_u0lff")
+
+[node name="TweenNameLabel" type="Label3D" parent="Tweening Example/Circ"]
+transform = Transform3D(1, 0, 0, 0, 0.695913, 0.718126, 0, -0.718126, 0.695913, -1.8, 0.5, 0)
+text = "Transition Type:
+Circ
+
+Duration:
+0.3s"
+font = ExtResource("8_60rny")
+font_size = 72
+
+[node name="Back" type="Node3D" parent="Tweening Example"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -21)
+
+[node name="EntryRoomTrigger" type="Area3D" parent="Tweening Example/Back" node_paths=PackedStringArray("area_pcam")]
+priority = 5
+script = ExtResource("5_h0ouh")
+area_pcam = NodePath("../PhantomCamera3D")
+metadata/_edit_group_ = true
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Tweening Example/Back/EntryRoomTrigger"]
+shape = SubResource("BoxShape3D_j6fha")
+
+[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Tweening Example/Back/EntryRoomTrigger"]
+mesh = SubResource("BoxMesh_xg4en")
+skeleton = NodePath("../../../../..")
+surface_material_override/0 = SubResource("StandardMaterial3D_2dct5")
+metadata/_edit_group_ = true
+
+[node name="PhantomCamera3D" type="Node3D" parent="Tweening Example/Back"]
+transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, -0.8, 4.8, 3.3)
+script = ExtResource("3_m2w30")
+tween_resource = SubResource("Resource_50m5g")
+camera_3d_resource = SubResource("Resource_rexf8")
+
+[node name="TweenNameLabel" type="Label3D" parent="Tweening Example/Back"]
+transform = Transform3D(1, 0, 0, 0, 0.695913, 0.718126, 0, -0.718126, 0.695913, 1.7, 0.5, 0)
+text = "Transition Type:
+Back
+
+Duration:
+1.2s"
+font = ExtResource("8_60rny")
+font_size = 48
+
+[editable path="PlayerCharacterBody3D2"]
diff --git a/addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn b/addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn
new file mode 100644 (file)
index 0000000..2198ced
--- /dev/null
@@ -0,0 +1,31 @@
+[gd_scene load_steps=5 format=3 uid="uid://bulsh7s0ibmao"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller.gd" id="1_6hh6c"]
+
+[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_8efyg"]
+
+[sub_resource type="CapsuleMesh" id="CapsuleMesh_2cfaw"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_r3ldp"]
+albedo_color = Color(0.988235, 0.498039, 0.498039, 1)
+
+[node name="PlayerCharacterBody3D2" type="CharacterBody3D"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.083587, 0.507, 2.05493)
+script = ExtResource("1_6hh6c")
+metadata/_edit_group_ = true
+
+[node name="PlayerArea3D" type="Area3D" parent="."]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerArea3D"]
+shape = SubResource("CapsuleShape3D_8efyg")
+
+[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="."]
+shape = SubResource("CapsuleShape3D_8efyg")
+
+[node name="PlayerVisual" type="Node3D" parent="."]
+unique_name_in_owner = true
+
+[node name="PlayerModel" type="MeshInstance3D" parent="PlayerVisual"]
+mesh = SubResource("CapsuleMesh_2cfaw")
+skeleton = NodePath("../..")
+surface_material_override/0 = SubResource("StandardMaterial3D_r3ldp")
diff --git a/addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_third_person_3d.tscn b/addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_third_person_3d.tscn
new file mode 100644 (file)
index 0000000..ecfd6f9
--- /dev/null
@@ -0,0 +1,43 @@
+[gd_scene load_steps=6 format=3 uid="uid://mskcwn1a1v6d"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd" id="1_0dnfe"]
+
+[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_s61dn"]
+
+[sub_resource type="CapsuleMesh" id="CapsuleMesh_47f0o"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_mv4do"]
+albedo_color = Color(0.988235, 0.498039, 0.498039, 1)
+
+[sub_resource type="PrismMesh" id="PrismMesh_wg1x3"]
+size = Vector3(0.5, 0.5, 0.3)
+
+[node name="PlayerCharacterBody3D" type="CharacterBody3D"]
+transform = Transform3D(0.999903, 0.0139622, 0, -0.0139622, 0.999903, 0, 0, 0, 1, -0.0194088, 0.506884, -0.0163251)
+collision_layer = 2
+script = ExtResource("1_0dnfe")
+metadata/_edit_group_ = true
+
+[node name="PlayerArea3D" type="Area3D" parent="."]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerArea3D"]
+shape = SubResource("CapsuleShape3D_s61dn")
+
+[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="."]
+shape = SubResource("CapsuleShape3D_s61dn")
+
+[node name="PlayerVisual" type="Node3D" parent="."]
+unique_name_in_owner = true
+
+[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="PlayerVisual"]
+transform = Transform3D(1, 0, 0, 0, 1, 4.65661e-10, 0, 0, 1, 0, 0, 0)
+mesh = SubResource("CapsuleMesh_47f0o")
+skeleton = NodePath("../..")
+surface_material_override/0 = SubResource("StandardMaterial3D_mv4do")
+
+[node name="PlayerDirection" type="MeshInstance3D" parent="PlayerVisual"]
+unique_name_in_owner = true
+transform = Transform3D(1, 0, 0, -9.31323e-10, 1, 4.65661e-10, 2.98023e-08, 0, 1, -0.0156226, 1.08631, 0)
+mesh = SubResource("PrismMesh_wg1x3")
+skeleton = NodePath("../..")
+surface_material_override/0 = SubResource("StandardMaterial3D_mv4do")
diff --git a/addons/phantom_camera/examples/models/3d_cube_dark.tscn b/addons/phantom_camera/examples/models/3d_cube_dark.tscn
new file mode 100644 (file)
index 0000000..627dc6f
--- /dev/null
@@ -0,0 +1,15 @@
+[gd_scene load_steps=4 format=3 uid="uid://cixlwqycoox8h"]
+
+[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="1_836jx"]
+
+[sub_resource type="BoxMesh" id="BoxMesh_d24c3"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_aox6v"]
+albedo_texture = ExtResource("1_836jx")
+uv1_triplanar = true
+uv1_world_triplanar = true
+
+[node name="3DPrototypeCube" type="CSGMesh3D"]
+use_collision = true
+mesh = SubResource("BoxMesh_d24c3")
+material = SubResource("StandardMaterial3D_aox6v")
diff --git a/addons/phantom_camera/examples/resources/tween/fixed_camera_tween.tres b/addons/phantom_camera/examples/resources/tween/fixed_camera_tween.tres
new file mode 100644 (file)
index 0000000..640b6ae
--- /dev/null
@@ -0,0 +1,9 @@
+[gd_resource type="Resource" script_class="PhantomCameraTween" load_steps=2 format=3 uid="uid://c1v786g5agaw5"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="1_ptlie"]
+
+[resource]
+script = ExtResource("1_ptlie")
+duration = 0.0
+transition = 0
+ease = 2
diff --git a/addons/phantom_camera/examples/resources/tween/inventory_phantom_camera_2d_tween.tres b/addons/phantom_camera/examples/resources/tween/inventory_phantom_camera_2d_tween.tres
new file mode 100644 (file)
index 0000000..38d9879
--- /dev/null
@@ -0,0 +1,9 @@
+[gd_resource type="Resource" script_class="PhantomCameraTweenResource" load_steps=2 format=3 uid="uid://cllveybboaqk5"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="1_7yoy0"]
+
+[resource]
+script = ExtResource("1_7yoy0")
+duration = 0.6
+transition = 5
+ease = 1
diff --git a/addons/phantom_camera/examples/resources/tween/item_focus_phantom_camera_2d_tween.tres b/addons/phantom_camera/examples/resources/tween/item_focus_phantom_camera_2d_tween.tres
new file mode 100644 (file)
index 0000000..3a09b1e
--- /dev/null
@@ -0,0 +1,9 @@
+[gd_resource type="Resource" script_class="PhantomCameraTweenResource" load_steps=2 format=3 uid="uid://cecrnq0wnkexh"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="1_sq5ls"]
+
+[resource]
+script = ExtResource("1_sq5ls")
+duration = 0.6
+transition = 8
+ease = 1
diff --git a/addons/phantom_camera/examples/resources/tween/player_phantom_camera_2d_tween.tres b/addons/phantom_camera/examples/resources/tween/player_phantom_camera_2d_tween.tres
new file mode 100644 (file)
index 0000000..e23bdbe
--- /dev/null
@@ -0,0 +1,9 @@
+[gd_resource type="Resource" script_class="PhantomCameraTween" load_steps=2 format=3 uid="uid://euybd2w0bax"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="1_by4ei"]
+
+[resource]
+script = ExtResource("1_by4ei")
+duration = 0.6
+transition = 3
+ease = 1
diff --git a/addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres b/addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres
new file mode 100644 (file)
index 0000000..7edea42
--- /dev/null
@@ -0,0 +1,9 @@
+[gd_resource type="Resource" script_class="PhantomCameraTween" load_steps=2 format=3 uid="uid://cptfoggk2ok67"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="1_q5tix"]
+
+[resource]
+script = ExtResource("1_q5tix")
+duration = 0.6
+transition = 3
+ease = 2
diff --git a/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween.gd b/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween.gd
new file mode 100644 (file)
index 0000000..06e9180
--- /dev/null
@@ -0,0 +1,36 @@
+extends Node2D
+
+@onready var pcam_room_left: PhantomCamera2D = %RoomLeftPhantomCamera2D
+@onready var pcam_room_centre: PhantomCamera2D = %RoomCentrePhantomCamera2D
+@onready var pcam_room_right: PhantomCamera2D = %RoomRightPhantomCamera2D
+
+@onready var player: Node2D = %CharacterBody2D/%PlayerVisuals
+
+@onready var area_2d_room_left: Area2D = %RoomLeftArea2D
+@onready var area_2d_room_centre: Area2D = %RoomCentreArea2D
+@onready var area_2d_room_right: Area2D = %RoomRightArea2D
+
+
+func _ready():
+       pcam_room_left.set_follow_offset(Vector2(0, -80))
+       pcam_room_right.set_follow_offset(Vector2(0, -80))
+
+       area_2d_room_left.body_entered.connect(_on_body_entered.bind(pcam_room_left))
+       area_2d_room_centre.body_entered.connect(_on_body_entered.bind(pcam_room_centre))
+       area_2d_room_right.body_entered.connect(_on_body_entered.bind(pcam_room_right))
+
+       area_2d_room_left.body_exited.connect(_on_body_exited.bind(pcam_room_left))
+       area_2d_room_centre.body_exited.connect(_on_body_exited.bind(pcam_room_centre))
+       area_2d_room_right.body_exited.connect(_on_body_exited.bind(pcam_room_right))
+
+
+func _on_body_entered(body: Node2D, pcam: PhantomCamera2D) -> void:
+       if body == player.get_parent():
+               pcam.set_follow_target(player)
+               pcam.set_priority(20)
+
+
+func _on_body_exited(body: Node2D, pcam: PhantomCamera2D) -> void:
+       if body == player.get_parent():
+               pcam.set_priority(0)
+               pcam.set_follow_target(null)
diff --git a/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween_4.3.gd b/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween_4.3.gd
new file mode 100644 (file)
index 0000000..970c52e
--- /dev/null
@@ -0,0 +1,36 @@
+extends Node2D
+
+@onready var pcam_room_left: PhantomCamera2D = %RoomLeftPhantomCamera2D
+@onready var pcam_room_centre: PhantomCamera2D = %RoomCentrePhantomCamera2D
+@onready var pcam_room_right: PhantomCamera2D = %RoomRightPhantomCamera2D
+
+@onready var player: Node2D = %CharacterBody2D
+
+@onready var area_2d_room_left: Area2D = %RoomLeftArea2D
+@onready var area_2d_room_centre: Area2D = %RoomCentreArea2D
+@onready var area_2d_room_right: Area2D = %RoomRightArea2D
+
+
+func _ready():
+       pcam_room_left.set_follow_offset(Vector2(0, -80))
+       pcam_room_right.set_follow_offset(Vector2(0, -80))
+
+       area_2d_room_left.body_entered.connect(_on_body_entered.bind(pcam_room_left))
+       area_2d_room_centre.body_entered.connect(_on_body_entered.bind(pcam_room_centre))
+       area_2d_room_right.body_entered.connect(_on_body_entered.bind(pcam_room_right))
+
+       area_2d_room_left.body_exited.connect(_on_body_exited.bind(pcam_room_left))
+       area_2d_room_centre.body_exited.connect(_on_body_exited.bind(pcam_room_centre))
+       area_2d_room_right.body_exited.connect(_on_body_exited.bind(pcam_room_right))
+
+
+func _on_body_entered(body: Node2D, pcam: PhantomCamera2D) -> void:
+       if body == player:
+               pcam.set_follow_target(player)
+               pcam.set_priority(20)
+
+
+func _on_body_exited(body: Node2D, pcam: PhantomCamera2D) -> void:
+       if body == player:
+               pcam.set_priority(0)
+               pcam.set_follow_target(null)
diff --git a/addons/phantom_camera/examples/scripts/2D/2d_trigger_area.gd b/addons/phantom_camera/examples/scripts/2D/2d_trigger_area.gd
new file mode 100644 (file)
index 0000000..db0209c
--- /dev/null
@@ -0,0 +1,16 @@
+extends Area2D
+
+@export var area_pcam: PhantomCamera2D
+
+func _ready() -> void:
+       connect("area_entered", _entered_area)
+       connect("area_exited", _exited_area)
+
+func _entered_area(area_2d: Area2D) -> void:
+       if area_2d.get_parent() is CharacterBody2D:
+               area_pcam.set_priority(20)
+
+func _exited_area(area_2d: Area2D) -> void:
+       if area_2d.get_parent() is CharacterBody2D:
+               area_pcam.set_priority(0)
+
diff --git a/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd
new file mode 100644 (file)
index 0000000..c7fd488
--- /dev/null
@@ -0,0 +1,190 @@
+extends CharacterBody2D
+
+@onready var _player_area2d = %PlayerArea2D
+@onready var _player_visuals: Node2D = %PlayerVisuals
+@onready var _player_sprite: Sprite2D = %PlayerSprite
+@onready var _interaction_prompt: Panel = %InteractionPrompt
+@onready var _ui_sign: Control
+@onready var _dark_overlay: ColorRect = %DarkOverlay
+
+const KEY_STRINGNAME: StringName = "Key"
+const ACTION_STRINGNAME: StringName = "Action"
+const INPUT_MOVE_LEFT_STRINGNAME: StringName = "move_left"
+const INPUT_MOVE_RIGHT_STRINGNAME: StringName = "move_right"
+
+const SPEED = 350.0
+const JUMP_VELOCITY = -750.0
+
+# Get the gravity from the project settings to be synced with RigidBody nodes.
+var gravity: int = 2400
+var _is_interactive: bool
+var _can_open_inventory: bool
+var _movement_disabled: bool
+var tween: Tween
+var _interactive_UI: Control
+var _active_pcam: PhantomCamera2D
+
+var _physics_body_trans_last: Transform2D
+var _physics_body_trans_current: Transform2D
+
+enum InteractiveType {
+       NONE = 0,
+       ITEM = 1,
+       INVENTORY = 2,
+}
+var _interactive_object: InteractiveType = InteractiveType.NONE
+
+var InputMovementDic: Dictionary = {
+       INPUT_MOVE_LEFT_STRINGNAME: {
+               KEY_STRINGNAME: KEY_A,
+               ACTION_STRINGNAME: INPUT_MOVE_LEFT_STRINGNAME
+       },
+       INPUT_MOVE_RIGHT_STRINGNAME: {
+               KEY_STRINGNAME: KEY_D,
+               ACTION_STRINGNAME: INPUT_MOVE_RIGHT_STRINGNAME
+       },
+}
+
+
+func _ready() -> void:
+       _player_area2d.connect("body_shape_entered", _show_prompt)
+       _player_area2d.connect("body_shape_exited", _hide_prompt)
+
+       _ui_sign = owner.get_node("%UISign")
+
+       for input in InputMovementDic:
+               var key_val = InputMovementDic[input].get(KEY_STRINGNAME)
+               var action_val = InputMovementDic[input].get(ACTION_STRINGNAME)
+
+               var movement_input = InputEventKey.new()
+               movement_input.physical_keycode = key_val
+               InputMap.add_action(action_val)
+               InputMap.action_add_event(action_val, movement_input)
+
+       _player_visuals.top_level = true
+
+       if Engine.get_version_info().major == 4 and \
+               Engine.get_version_info().minor >= 3:
+               printerr("Please run the other 2D example scenes, in the 2D-4.3 directory, for more up-to-date example setups.")
+
+
+func _unhandled_input(event: InputEvent) -> void:
+       if _is_interactive:
+               if Input.is_physical_key_pressed(KEY_F):
+                       if tween:
+                               tween.kill()
+
+                       if not _movement_disabled:
+                               tween = get_tree().create_tween()
+
+                               _movement_disabled = true
+                               _active_pcam.set_priority(10)
+
+                               _show_interactive_node(_interactive_UI)
+                               _interactive_node_logic()
+
+                       else:
+                               _hide_interactive_node(_interactive_UI)
+                               _interactive_node_logic()
+
+
+               if Input.is_physical_key_pressed(KEY_ESCAPE) and _movement_disabled:
+                       _hide_interactive_node(_interactive_UI)
+                       _interactive_node_logic()
+
+
+func _show_interactive_node(UI: Control) -> void:
+       UI.modulate.a = 0
+       UI.visible = true
+       tween.tween_property(UI, "modulate", Color.WHITE, 1).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_CIRC)
+
+
+func _hide_interactive_node(UI: Control) -> void:
+       _movement_disabled = false
+       _active_pcam.set_priority(0)
+       UI.visible = false
+
+
+func _interactive_node_logic() -> void:
+       match _interactive_object:
+               2:
+                       if _movement_disabled:
+                               _dark_overlay.set_visible(true)
+                       else:
+                               _dark_overlay.set_visible(false)
+
+
+func _physics_process(delta: float) -> void:
+       _physics_body_trans_last = _physics_body_trans_current
+       _physics_body_trans_current = global_transform
+
+       if not is_on_floor():
+               velocity.y += gravity * delta
+
+       if Input.is_action_just_pressed("ui_accept") and is_on_floor():
+               velocity.y = JUMP_VELOCITY
+
+       if _movement_disabled: return
+
+       var input_dir: = Input.get_axis(
+               INPUT_MOVE_LEFT_STRINGNAME,
+               INPUT_MOVE_RIGHT_STRINGNAME
+       )
+
+       if input_dir:
+               velocity.x = input_dir * SPEED
+               if input_dir > 0:
+                       _player_sprite.set_flip_h(false)
+               elif input_dir < 0:
+                       _player_sprite.set_flip_h(true)
+       else:
+               velocity.x = move_toward(velocity.x, 0, SPEED)
+
+       move_and_slide()
+
+
+func _process(delta) -> void:
+       _player_visuals.global_position = _physics_body_trans_last.interpolate_with(
+               _physics_body_trans_current,
+               Engine.get_physics_interpolation_fraction()
+       ).origin
+
+
+func _show_prompt(body_rid: RID, body: Node2D, body_shape_index: int, local_shape: int) -> void:
+       if body is TileMap:
+               var tile_map: TileMap = body
+
+               var tile_coords: Vector2i = tile_map.get_coords_for_body_rid(body_rid)
+               var cell_data: TileData = tile_map.get_cell_tile_data(1, tile_coords)
+
+               if cell_data:
+                       var cell_data_type: StringName = cell_data.get_custom_data("Type")
+#                      var cell_global_pos: Vector2 = tile_map.to_global(tile_map.map_to_local(tile_coords))
+                       _is_interactive = true
+                       _interaction_prompt.set_visible(true)
+
+                       match cell_data_type:
+                               "Sign":
+                                       _interactive_UI = owner.get_node("%UISign")
+                                       _active_pcam = %ItemFocusPhantomCamera2D
+                                       _interactive_object = InteractiveType.ITEM
+                               "Inventory":
+                                       _interactive_UI = owner.get_node("%UIInventory")
+                                       _interactive_object = InteractiveType.INVENTORY
+                                       _active_pcam = %InventoryPhantomCamera2D
+
+
+func _hide_prompt(body_rid: RID, body: Node2D, body_shape_index: int, local_shape: int) -> void:
+       if body is TileMap:
+               var tile_map: TileMap = body
+
+               var tile_coords: Vector2i = tile_map.get_coords_for_body_rid(body_rid)
+               var cell_data: TileData = tile_map.get_cell_tile_data(1, tile_coords)
+
+               if cell_data:
+                       _interaction_prompt.set_visible(false)
+                       _is_interactive = false
+                       _interactive_UI = null
+                       _interactive_object = InteractiveType.NONE
+                       _active_pcam = null
+
diff --git a/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd
new file mode 100644 (file)
index 0000000..590b5ae
--- /dev/null
@@ -0,0 +1,176 @@
+extends CharacterBody2D
+
+@onready var _player_area2d = %PlayerArea2D
+@onready var _player_visuals: Node2D = %PlayerVisuals
+@onready var _player_sprite: Sprite2D = %PlayerSprite
+@onready var _interaction_prompt: Panel = %InteractionPrompt
+@onready var _ui_sign: Control
+@onready var _dark_overlay: ColorRect = %DarkOverlay
+
+const KEY_STRINGNAME: StringName = "Key"
+const ACTION_STRINGNAME: StringName = "Action"
+const INPUT_MOVE_LEFT_STRINGNAME: StringName = "move_left"
+const INPUT_MOVE_RIGHT_STRINGNAME: StringName = "move_right"
+
+const SPEED = 350.0
+const JUMP_VELOCITY = -750.0
+
+# Get the gravity from the project settings to be synced with RigidBody nodes.
+var gravity: int = 2400
+var _is_interactive: bool
+var _can_open_inventory: bool
+var _movement_disabled: bool
+var tween: Tween
+var _interactive_UI: Control
+var _active_pcam: PhantomCamera2D
+
+enum InteractiveType {
+       NONE = 0,
+       ITEM = 1,
+       INVENTORY = 2,
+}
+var _interactive_object: InteractiveType = InteractiveType.NONE
+
+var InputMovementDic: Dictionary = {
+       INPUT_MOVE_LEFT_STRINGNAME: {
+               KEY_STRINGNAME: KEY_A,
+               ACTION_STRINGNAME: INPUT_MOVE_LEFT_STRINGNAME
+       },
+       INPUT_MOVE_RIGHT_STRINGNAME: {
+               KEY_STRINGNAME: KEY_D,
+               ACTION_STRINGNAME: INPUT_MOVE_RIGHT_STRINGNAME
+       },
+}
+
+
+func _ready() -> void:
+       _player_area2d.connect("body_shape_entered", _show_prompt)
+       _player_area2d.connect("body_shape_exited", _hide_prompt)
+
+       _ui_sign = owner.get_node("%UISign")
+
+       for input in InputMovementDic:
+               var key_val = InputMovementDic[input].get(KEY_STRINGNAME)
+               var action_val = InputMovementDic[input].get(ACTION_STRINGNAME)
+
+               var movement_input = InputEventKey.new()
+               movement_input.physical_keycode = key_val
+               InputMap.add_action(action_val)
+               InputMap.action_add_event(action_val, movement_input)
+
+       if Engine.get_version_info().major == 4 and \
+               Engine.get_version_info().minor < 3:
+                       printerr("This scene is designed to only work properly in Godot 4.3 or later that supports 2D Physics Interpolation.")
+                       printerr("Please run the other 2D example scenes in the other directory.")
+
+
+func _unhandled_input(event: InputEvent) -> void:
+       if _is_interactive:
+               if Input.is_physical_key_pressed(KEY_F):
+                       if tween:
+                               tween.kill()
+
+                       if not _movement_disabled:
+                               tween = get_tree().create_tween()
+
+                               _movement_disabled = true
+                               _active_pcam.set_priority(10)
+
+                               _show_interactive_node(_interactive_UI)
+                               _interactive_node_logic()
+
+                       else:
+                               _hide_interactive_node(_interactive_UI)
+                               _interactive_node_logic()
+
+
+               if Input.is_physical_key_pressed(KEY_ESCAPE) and _movement_disabled:
+                       _hide_interactive_node(_interactive_UI)
+                       _interactive_node_logic()
+
+
+func _show_interactive_node(UI: Control) -> void:
+       UI.modulate.a = 0
+       UI.visible = true
+       tween.tween_property(UI, "modulate", Color.WHITE, 1).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_CIRC)
+
+
+func _hide_interactive_node(UI: Control) -> void:
+       _movement_disabled = false
+       _active_pcam.set_priority(0)
+       UI.visible = false
+
+
+func _interactive_node_logic() -> void:
+       match _interactive_object:
+               2:
+                       if _movement_disabled:
+                               _dark_overlay.set_visible(true)
+                       else:
+                               _dark_overlay.set_visible(false)
+
+
+func _physics_process(delta: float) -> void:
+       if not is_on_floor():
+               velocity.y += gravity * delta
+
+       if Input.is_action_just_pressed("ui_accept") and is_on_floor():
+               velocity.y = JUMP_VELOCITY
+
+       if _movement_disabled: return
+
+       var input_dir: = Input.get_axis(
+               INPUT_MOVE_LEFT_STRINGNAME,
+               INPUT_MOVE_RIGHT_STRINGNAME
+       )
+
+       if input_dir:
+               velocity.x = input_dir * SPEED
+               if input_dir > 0:
+                       _player_sprite.set_flip_h(false)
+               elif input_dir < 0:
+                       _player_sprite.set_flip_h(true)
+       else:
+               velocity.x = move_toward(velocity.x, 0, SPEED)
+
+       move_and_slide()
+
+
+func _show_prompt(body_rid: RID, body: Node2D, body_shape_index: int, local_shape: int) -> void:
+       if body is TileMap:
+               var tile_map: TileMap = body
+
+               var tile_coords: Vector2i = tile_map.get_coords_for_body_rid(body_rid)
+               var cell_data: TileData = tile_map.get_cell_tile_data(1, tile_coords)
+
+               if cell_data:
+                       var cell_data_type: StringName = cell_data.get_custom_data("Type")
+#                      var cell_global_pos: Vector2 = tile_map.to_global(tile_map.map_to_local(tile_coords))
+                       _is_interactive = true
+                       _interaction_prompt.set_visible(true)
+
+                       match cell_data_type:
+                               "Sign":
+                                       _interactive_UI = owner.get_node("%UISign")
+                                       _active_pcam = %ItemFocusPhantomCamera2D
+                                       _interactive_object = InteractiveType.ITEM
+                               "Inventory":
+                                       _interactive_UI = owner.get_node("%UIInventory")
+                                       _interactive_object = InteractiveType.INVENTORY
+                                       _active_pcam = %InventoryPhantomCamera2D
+
+
+func _hide_prompt(body_rid: RID, body: Node2D, body_shape_index: int, local_shape: int) -> void:
+       if body is TileMap:
+               var tile_map: TileMap = body
+
+               var tile_coords: Vector2i = tile_map.get_coords_for_body_rid(body_rid)
+               var cell_data: TileData = tile_map.get_cell_tile_data(1, tile_coords)
+
+               if cell_data:
+                       _interaction_prompt.set_visible(false)
+                       _is_interactive = false
+                       _interactive_UI = null
+                       _interactive_object = InteractiveType.NONE
+                       _active_pcam = null
+
diff --git a/addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd b/addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd
new file mode 100644 (file)
index 0000000..4fc9764
--- /dev/null
@@ -0,0 +1,26 @@
+extends Area3D
+
+@export var area_pcam: PhantomCamera3D
+
+var initial_camera_position: Vector3
+var initial_camera_rotation: Vector3
+
+var tween: Tween
+var tween_duration: float = 0.9
+
+
+func _ready() -> void:
+       connect("area_entered", _entered_area)
+       connect("area_exited", _exited_area)
+
+
+func _entered_area(area_3D: Area3D) -> void:
+       if area_3D.get_parent() is CharacterBody3D:
+               area_pcam.set_priority(20)
+
+
+func _exited_area(area_3D: Area3D) -> void:
+       if area_3D.get_parent() is CharacterBody3D:
+               area_pcam.set_priority(0)
+
+
diff --git a/addons/phantom_camera/examples/scripts/3D/npc.gd b/addons/phantom_camera/examples/scripts/3D/npc.gd
new file mode 100644 (file)
index 0000000..3d9a523
--- /dev/null
@@ -0,0 +1,71 @@
+extends Node3D
+
+@onready var npc_pcam: PhantomCamera3D = %NPCPhantomCamera3D
+@onready var dialogueArea: Area3D = %NPCInteractionArea3D
+@onready var dialogueLabel3D: Label3D = %NPCDialogueExampleLabel
+
+@onready var player: CharacterBody3D = %PlayerCharacterBody3D
+
+@onready var move_to_location: Vector3 = %MoveToLocation.get_global_position()
+
+var dialogue_label_initial_position: Vector3
+var dialogue_label_initial_rotation: Vector3
+
+var tween: Tween
+var tween_duration: float = 0.9
+var tween_transition: Tween.TransitionType = Tween.TRANS_QUAD
+
+var interactable: bool
+var is_interacting: bool
+
+func _ready() -> void:
+       dialogueArea.connect("area_entered", _interactable)
+       dialogueArea.connect("area_exited", _not_interactable)
+
+       dialogueLabel3D.set_visible(false)
+
+       dialogue_label_initial_position = dialogueLabel3D.get_global_position()
+       dialogue_label_initial_rotation = dialogueLabel3D.get_global_rotation()
+
+       npc_pcam.tween_completed.connect(_on_tween_started)
+
+
+
+func _on_tween_started() -> void:
+       player.movement_enabled = false
+
+
+func _interactable(area_3D: Area3D) -> void:
+       if area_3D.get_parent() is CharacterBody3D:
+               dialogueLabel3D.set_visible(true)
+               interactable = true
+
+               var tween: Tween = get_tree().create_tween().set_trans(tween_transition).set_ease(Tween.EASE_IN_OUT).set_loops()
+               tween.tween_property(dialogueLabel3D, "global_position", dialogue_label_initial_position - Vector3(0, -0.2, 0), tween_duration)
+               tween.tween_property(dialogueLabel3D, "position", dialogue_label_initial_position, tween_duration)
+
+
+func _not_interactable(area_3D: Area3D) -> void:
+       if area_3D.get_parent() is CharacterBody3D:
+               dialogueLabel3D.set_visible(false)
+               interactable = false
+
+
+func _input(event) -> void:
+       if not interactable: return
+
+       if event is InputEventKey and event.pressed:
+               if event.keycode == KEY_F:
+                       var tween: Tween = get_tree().create_tween() \
+                               .set_parallel(true) \
+                               .set_trans(Tween.TRANS_QUART) \
+                               .set_ease(Tween.EASE_IN_OUT)
+                       if not is_interacting:
+                               npc_pcam.priority = 20
+                               tween.tween_property(player, "global_position", move_to_location, 0.6).set_trans(tween_transition)
+                               tween.tween_property(dialogueLabel3D, "rotation", Vector3(deg_to_rad(-20), deg_to_rad(53), 0), 0.6).set_trans(tween_transition)
+                       else:
+                               npc_pcam.priority = 0
+                               tween.tween_property(dialogueLabel3D, "rotation", dialogue_label_initial_rotation, 0.9)
+                               player.movement_enabled = true
+                       is_interacting = !is_interacting
diff --git a/addons/phantom_camera/examples/scripts/3D/path_follow.gd b/addons/phantom_camera/examples/scripts/3D/path_follow.gd
new file mode 100644 (file)
index 0000000..22973ec
--- /dev/null
@@ -0,0 +1,18 @@
+extends Node
+
+@export var path_pcam: PhantomCamera3D
+
+func _ready() -> void:
+       connect("area_entered", _entered_area)
+       connect("area_exited", _exited_area)
+
+
+func _entered_area(area_3D: Area3D) -> void:
+       if area_3D.get_parent() is CharacterBody3D:
+               path_pcam.set_priority(20)
+
+
+func _exited_area(area_3D: Area3D) -> void:
+       if area_3D.get_parent() is CharacterBody3D:
+               path_pcam.set_priority(0)
+
diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller.gd b/addons/phantom_camera/examples/scripts/3D/player_controller.gd
new file mode 100644 (file)
index 0000000..b136103
--- /dev/null
@@ -0,0 +1,103 @@
+extends CharacterBody3D
+
+@export var SPEED: float = 5.0
+@export var JUMP_VELOCITY: float = 4.5
+@export var enable_gravity = true
+
+@onready var _camera: Camera3D
+
+@onready var _player_visual: Node3D = %PlayerVisual
+
+# Get the gravity from the project settings to be synced with RigidBody nodes.
+var gravity: float = 9.8
+
+var movement_enabled: bool = true
+
+var _physics_body_trans_last: Transform3D
+var _physics_body_trans_current: Transform3D
+
+const KEY_STRINGNAME: StringName = "Key"
+const ACTION_STRINGNAME: StringName = "Action"
+
+const INPUT_MOVE_UP_STRINGNAME: StringName = "move_up"
+const INPUT_MOVE_DOWM_STRINGNAME: StringName = "move_down"
+const INPUT_MOVE_LEFT_STRINGNAME: StringName = "move_left"
+const INPUT_MOVE_RIGHT_STRINGNAME: StringName = "move_right"
+
+var InputMovementDic: Dictionary = {
+       INPUT_MOVE_UP_STRINGNAME: {
+               KEY_STRINGNAME: KEY_W,
+               ACTION_STRINGNAME: INPUT_MOVE_UP_STRINGNAME
+       },
+       INPUT_MOVE_DOWM_STRINGNAME: {
+               KEY_STRINGNAME: KEY_S,
+               ACTION_STRINGNAME: INPUT_MOVE_DOWM_STRINGNAME
+       },
+       INPUT_MOVE_LEFT_STRINGNAME: {
+               KEY_STRINGNAME: KEY_A,
+               ACTION_STRINGNAME: INPUT_MOVE_LEFT_STRINGNAME
+       },
+       INPUT_MOVE_RIGHT_STRINGNAME: {
+               KEY_STRINGNAME: KEY_D,
+               ACTION_STRINGNAME: INPUT_MOVE_RIGHT_STRINGNAME
+       },
+}
+
+
+func _ready() -> void:
+       for input in InputMovementDic:
+               var key_val = InputMovementDic[input].get(KEY_STRINGNAME)
+               var action_val = InputMovementDic[input].get(ACTION_STRINGNAME)
+
+               _camera = owner.get_node("%MainCamera3D")
+
+               var movement_input = InputEventKey.new()
+               movement_input.physical_keycode = key_val
+               InputMap.add_action(action_val)
+               InputMap.action_add_event(action_val, movement_input)
+
+               _player_visual.top_level = true
+
+
+func _physics_process(delta: float) -> void:
+       _physics_body_trans_last = _physics_body_trans_current
+       _physics_body_trans_current = global_transform
+
+       # Add the gravity.
+       if enable_gravity and not is_on_floor():
+               velocity.y -= gravity * delta
+
+       if not movement_enabled: return
+
+       # Get the input direction and handle the movement/deceleration.
+       # As good practice, you should replace UI actions with custom gameplay actions.
+       var input_dir: Vector2 = Input.get_vector(
+               INPUT_MOVE_LEFT_STRINGNAME,
+               INPUT_MOVE_RIGHT_STRINGNAME,
+               INPUT_MOVE_UP_STRINGNAME,
+               INPUT_MOVE_DOWM_STRINGNAME
+       )
+
+       var cam_dir: Vector3 = -_camera.global_transform.basis.z
+
+       var direction: Vector3 = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
+       if direction:
+               var move_dir: Vector3 = Vector3.ZERO
+               move_dir.x = direction.x
+               move_dir.z = direction.z
+
+               move_dir = move_dir.rotated(Vector3.UP, _camera.rotation.y).normalized()
+               velocity.x = move_dir.x * SPEED
+               velocity.z = move_dir.z * SPEED
+       else:
+               velocity.x = move_toward(velocity.x, 0, SPEED)
+               velocity.z = move_toward(velocity.z, 0, SPEED)
+
+       move_and_slide()
+
+
+func _process(_delta: float) -> void:
+       _player_visual.global_transform = _physics_body_trans_last.interpolate_with(
+               _physics_body_trans_current,
+               Engine.get_physics_interpolation_fraction()
+       )
diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd
new file mode 100644 (file)
index 0000000..9bd3a76
--- /dev/null
@@ -0,0 +1,88 @@
+extends "player_controller.gd"
+
+@onready var _player_pcam: PhantomCamera3D
+@onready var _aim_pcam: PhantomCamera3D
+@onready var _player_direction: Node3D = %PlayerDirection
+@onready var _ceiling_pcam: PhantomCamera3D
+
+@export var mouse_sensitivity: float = 0.05
+
+@export var min_pitch: float = -89.9
+@export var max_pitch: float = 50
+
+@export var min_yaw: float = 0
+@export var max_yaw: float = 360
+
+
+
+func _ready() -> void:
+       super()
+       
+       _player_pcam = owner.get_node("%PlayerPhantomCamera3D")
+       _aim_pcam = owner.get_node("%PlayerAimPhantomCamera3D")
+       _ceiling_pcam = owner.get_node("%CeilingPhantomCamera3D")
+       
+       if _player_pcam.get_follow_mode() == _player_pcam.FollowMode.THIRD_PERSON:
+               Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
+
+
+func _physics_process(delta: float) -> void:
+       super(delta)
+
+       if velocity.length() > 0.2:
+               var look_direction: Vector2 = Vector2(velocity.z, velocity.x)
+               _player_direction.rotation.y = look_direction.angle()
+
+
+func _unhandled_input(event: InputEvent) -> void:
+       if _player_pcam.get_follow_mode() == _player_pcam.FollowMode.THIRD_PERSON:
+               var active_pcam: PhantomCamera3D
+
+               if is_instance_valid(_aim_pcam):
+                       _set_pcam_rotation(_player_pcam, event)
+                       _set_pcam_rotation(_aim_pcam, event)
+                       if _player_pcam.get_priority() > _aim_pcam.get_priority():
+                               _toggle_aim_pcam(event)
+                       else:
+                               _toggle_aim_pcam(event)
+
+               if event is InputEventKey and event.pressed:
+                       if event.keycode == KEY_SPACE:
+                               if _ceiling_pcam.get_priority() < 30 and _player_pcam.is_active():
+                                       _ceiling_pcam.set_priority(30)
+                               else:
+                                       _ceiling_pcam.set_priority(1)
+
+
+func _set_pcam_rotation(pcam: PhantomCamera3D, event: InputEvent) -> void:
+       if event is InputEventMouseMotion:
+               var pcam_rotation_degrees: Vector3
+
+               # Assigns the current 3D rotation of the SpringArm3D node - so it starts off where it is in the editor
+               pcam_rotation_degrees = pcam.get_third_person_rotation_degrees()
+
+               # Change the X rotation
+               pcam_rotation_degrees.x -= event.relative.y * mouse_sensitivity
+
+               # Clamp the rotation in the X axis so it go over or under the target
+               pcam_rotation_degrees.x = clampf(pcam_rotation_degrees.x, min_pitch, max_pitch)
+
+               # Change the Y rotation value
+               pcam_rotation_degrees.y -= event.relative.x * mouse_sensitivity
+
+               # Sets the rotation to fully loop around its target, but witout going below or exceeding 0 and 360 degrees respectively
+               pcam_rotation_degrees.y = wrapf(pcam_rotation_degrees.y, min_yaw, max_yaw)
+
+               # Change the SpringArm3D node's rotation and rotate around its target
+               pcam.set_third_person_rotation_degrees(pcam_rotation_degrees)
+
+
+func _toggle_aim_pcam(event: InputEvent) -> void:
+       if event is InputEventMouseButton \
+               and event.is_pressed() \
+               and event.button_index == 2 \
+               and (_player_pcam.is_active() or _aim_pcam.is_active()):
+               if _player_pcam.get_priority() > _aim_pcam.get_priority():
+                       _aim_pcam.set_priority(30)
+               else:
+                       _aim_pcam.set_priority(0)
diff --git a/addons/phantom_camera/examples/textures/2D/inventory_container.png b/addons/phantom_camera/examples/textures/2D/inventory_container.png
new file mode 100644 (file)
index 0000000..7dd5178
Binary files /dev/null and b/addons/phantom_camera/examples/textures/2D/inventory_container.png differ
diff --git a/addons/phantom_camera/examples/textures/2D/inventory_container.png.import b/addons/phantom_camera/examples/textures/2D/inventory_container.png.import
new file mode 100644 (file)
index 0000000..72be1e5
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b7cs6me43ufh3"
+path="res://.godot/imported/inventory_container.png-12241277f279bfc4bf7d5dad6b3e8ff2.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/examples/textures/2D/inventory_container.png"
+dest_files=["res://.godot/imported/inventory_container.png-12241277f279bfc4bf7d5dad6b3e8ff2.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/addons/phantom_camera/examples/textures/2D/level_spritesheet.png b/addons/phantom_camera/examples/textures/2D/level_spritesheet.png
new file mode 100644 (file)
index 0000000..939cb28
Binary files /dev/null and b/addons/phantom_camera/examples/textures/2D/level_spritesheet.png differ
diff --git a/addons/phantom_camera/examples/textures/2D/level_spritesheet.png.import b/addons/phantom_camera/examples/textures/2D/level_spritesheet.png.import
new file mode 100644 (file)
index 0000000..520372a
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c77npili4pel4"
+path="res://.godot/imported/level_spritesheet.png-26a44dd21a040a5480d5ccba54377d99.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png"
+dest_files=["res://.godot/imported/level_spritesheet.png-26a44dd21a040a5480d5ccba54377d99.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/addons/phantom_camera/examples/textures/2D/phantom_camera_2d_sprite.png b/addons/phantom_camera/examples/textures/2D/phantom_camera_2d_sprite.png
new file mode 100644 (file)
index 0000000..2012b3a
Binary files /dev/null and b/addons/phantom_camera/examples/textures/2D/phantom_camera_2d_sprite.png differ
diff --git a/addons/phantom_camera/examples/textures/2D/phantom_camera_2d_sprite.png.import b/addons/phantom_camera/examples/textures/2D/phantom_camera_2d_sprite.png.import
new file mode 100644 (file)
index 0000000..425002e
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cwep0on2tthn7"
+path="res://.godot/imported/phantom_camera_2d_sprite.png-deab230b83ae03aeb308a08ff66b8dbc.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/examples/textures/2D/phantom_camera_2d_sprite.png"
+dest_files=["res://.godot/imported/phantom_camera_2d_sprite.png-deab230b83ae03aeb308a08ff66b8dbc.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/addons/phantom_camera/examples/textures/2D/player_sprite.svg b/addons/phantom_camera/examples/textures/2D/player_sprite.svg
new file mode 100644 (file)
index 0000000..ce261b1
--- /dev/null
@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12.5361 7.10309C13.6839 7.10309 14.6144 7.94367 14.6144 8.98059C14.6144 9.5197 14.3629 10.0057 13.9601 10.3482C14.1589 10.5805 14.1526 10.8503 14.1526 11.1362L16 10.0236V14.1959L14.1526 13.0833V13.3614C14.1526 13.8223 13.739 14.1959 13.2289 14.1959H9.07216C8.56201 14.1959 8.14845 13.8223 8.14845 13.3614V12.0029C7.34123 11.7452 6.76289 11.0497 6.76289 10.2323C6.76289 9.19534 7.69339 8.35476 8.84124 8.35476C9.49502 8.35476 10.0783 8.62747 10.4593 9.05381C10.4454 8.72765 10.5274 8.40055 10.6897 8.11774C11.0356 7.51496 11.7326 7.10309 12.5361 7.10309Z" fill="#8DA5F3"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M4.8 1C7.45097 1 9.6 3.08749 9.6 5.66254V7.11532C9.38344 7.06886 9.16015 7.04201 8.93273 7.03632C9.02973 6.78223 9.08571 6.48275 9.08571 6.1621C9.08571 5.24244 8.62521 4.49691 8.05714 4.49691C7.48908 4.49691 7.02857 5.24244 7.02857 6.1621C7.02857 6.63483 7.15025 7.06155 7.34566 7.36466C6.25657 7.86676 5.4433 8.90657 5.4433 10.2323C5.4433 11.3311 6.01594 12.2448 6.82887 12.8078V13.3614C6.82887 13.4831 6.8386 13.6006 6.85714 13.7139V14.3216C6.85714 14.6894 6.55014 14.9876 6.17143 14.9876C5.79272 14.9876 5.48571 14.6894 5.48571 14.3216V13.6555C5.48571 13.2876 5.17871 12.9894 4.8 12.9894C4.42129 12.9894 4.11429 13.2876 4.11429 13.6555V14.3216C4.11429 14.6894 3.80728 14.9876 3.42857 14.9876C3.04986 14.9876 2.74286 14.6894 2.74286 14.3216V13.6555C2.74286 13.2876 2.43585 12.9894 2.05714 12.9894C1.67843 12.9894 1.37143 13.2876 1.37143 13.6555V14.3216C1.37143 14.6894 1.06442 14.9876 0.685714 14.9876C0.307005 14.9876 0 14.6894 0 14.3216V5.66254C0 3.08749 2.14903 1 4.8 1ZM4.62857 7.8273C5.19664 7.8273 5.65714 7.08176 5.65714 6.1621C5.65714 5.24244 5.19664 4.49691 4.62857 4.49691C4.06051 4.49691 3.6 5.24244 3.6 6.1621C3.6 7.08176 4.06051 7.8273 4.62857 7.8273Z" fill="#8DA5F3"/>
+</svg>
diff --git a/addons/phantom_camera/examples/textures/2D/player_sprite.svg.import b/addons/phantom_camera/examples/textures/2D/player_sprite.svg.import
new file mode 100644 (file)
index 0000000..41dc9dc
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ci76plsequlrq"
+path="res://.godot/imported/player_sprite.svg-8862ecb19e12152eb892607676f3831f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/examples/textures/2D/player_sprite.svg"
+dest_files=["res://.godot/imported/player_sprite.svg-8862ecb19e12152eb892607676f3831f.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
+svg/scale=8.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/phantom_camera/examples/textures/2D/sign_prompt.png b/addons/phantom_camera/examples/textures/2D/sign_prompt.png
new file mode 100644 (file)
index 0000000..a730837
Binary files /dev/null and b/addons/phantom_camera/examples/textures/2D/sign_prompt.png differ
diff --git a/addons/phantom_camera/examples/textures/2D/sign_prompt.png.import b/addons/phantom_camera/examples/textures/2D/sign_prompt.png.import
new file mode 100644 (file)
index 0000000..a5799d3
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bloouh2jtndx1"
+path="res://.godot/imported/sign_prompt.png-18d451127e1cd1a16367acd23cec47e5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/examples/textures/2D/sign_prompt.png"
+dest_files=["res://.godot/imported/sign_prompt.png-18d451127e1cd1a16367acd23cec47e5.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png b/addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png
new file mode 100644 (file)
index 0000000..4aeae6c
Binary files /dev/null and b/addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png differ
diff --git a/addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png.import b/addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png.import
new file mode 100644 (file)
index 0000000..cfcc34e
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c7ja4woxol8yc"
+path.bptc="res://.godot/imported/checker_pattern_dark.png-70cedad2d3abf4ad6166d6614eefa7fb.bptc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png"
+dest_files=["res://.godot/imported/checker_pattern_dark.png-70cedad2d3abf4ad6166d6614eefa7fb.bptc.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=true
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+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/addons/phantom_camera/examples/ui/ui_inventory.tscn b/addons/phantom_camera/examples/ui/ui_inventory.tscn
new file mode 100644 (file)
index 0000000..cddd377
--- /dev/null
@@ -0,0 +1,37 @@
+[gd_scene load_steps=3 format=3 uid="uid://dg7rhrymsrrrm"]
+
+[ext_resource type="Texture2D" uid="uid://b7cs6me43ufh3" path="res://addons/phantom_camera/examples/textures/2D/inventory_container.png" id="1_pi2dp"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="2_0rdcn"]
+
+[node name="Control" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="TextureRect" type="TextureRect" parent="."]
+layout_mode = 1
+anchors_preset = 4
+anchor_top = 0.5
+anchor_bottom = 0.5
+offset_left = 28.0
+offset_top = -255.0
+offset_right = 908.0
+offset_bottom = 183.0
+grow_vertical = 2
+texture = ExtResource("1_pi2dp")
+
+[node name="Label" type="Label" parent="TextureRect"]
+layout_mode = 0
+offset_left = 345.0
+offset_top = 12.0
+offset_right = 535.0
+offset_bottom = 60.0
+theme_override_colors/font_color = Color(0.356863, 0.105882, 0.133333, 1)
+theme_override_fonts/font = ExtResource("2_0rdcn")
+theme_override_font_sizes/font_size = 32
+text = "Inventory"
+horizontal_alignment = 1
+uppercase = true
diff --git a/addons/phantom_camera/examples/ui/ui_sign.tscn b/addons/phantom_camera/examples/ui/ui_sign.tscn
new file mode 100644 (file)
index 0000000..1b891ef
--- /dev/null
@@ -0,0 +1,83 @@
+[gd_scene load_steps=4 format=3 uid="uid://iq5xd1ob1res"]
+
+[ext_resource type="Texture2D" uid="uid://bloouh2jtndx1" path="res://addons/phantom_camera/examples/textures/2D/sign_prompt.png" id="1_tftrk"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="2_y5454"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_r4h3u"]
+bg_color = Color(0.470588, 0.6, 0.45098, 1)
+corner_radius_top_right = 47
+corner_radius_bottom_left = 40
+
+[node name="Control" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="TextureRect" type="TextureRect" parent="."]
+layout_mode = 1
+anchors_preset = 5
+anchor_left = 0.5
+anchor_right = 0.5
+offset_left = -273.568
+offset_top = 47.0
+offset_right = 273.568
+offset_bottom = 413.0
+grow_horizontal = 2
+texture = ExtResource("1_tftrk")
+metadata/_edit_group_ = true
+
+[node name="Label" type="Label" parent="TextureRect"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 25.0
+offset_top = 64.0
+offset_right = -25.0
+offset_bottom = -88.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_colors/font_color = Color(0.207843, 0.0470588, 0.0666667, 1)
+theme_override_fonts/font = ExtResource("2_y5454")
+theme_override_font_sizes/font_size = 62
+text = "Stay Awhile
+and read"
+horizontal_alignment = 1
+vertical_alignment = 1
+uppercase = true
+
+[node name="Panel" type="Panel" parent="."]
+visible = false
+layout_mode = 1
+anchors_preset = 5
+anchor_left = 0.5
+anchor_right = 0.5
+offset_left = -240.0
+offset_right = 240.0
+offset_bottom = 200.0
+grow_horizontal = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+theme_override_styles/panel = SubResource("StyleBoxFlat_r4h3u")
+metadata/_edit_use_anchors_ = true
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Panel"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+alignment = 1
+
+[node name="Label2" type="Label" parent="Panel/VBoxContainer"]
+layout_mode = 2
+text = "Example Textsdadassa
+"
+horizontal_alignment = 1
+vertical_alignment = 1
diff --git a/addons/phantom_camera/fonts/Nunito-Black.ttf b/addons/phantom_camera/fonts/Nunito-Black.ttf
new file mode 100644 (file)
index 0000000..1081731
Binary files /dev/null and b/addons/phantom_camera/fonts/Nunito-Black.ttf differ
diff --git a/addons/phantom_camera/fonts/Nunito-Black.ttf.import b/addons/phantom_camera/fonts/Nunito-Black.ttf.import
new file mode 100644 (file)
index 0000000..ac96a49
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://c4mm3of2mc8o5"
+path="res://.godot/imported/Nunito-Black.ttf-2a374efbc207a97a99b8c70bdc4b7cbb.fontdata"
+
+[deps]
+
+source_file="res://addons/phantom_camera/fonts/Nunito-Black.ttf"
+dest_files=["res://.godot/imported/Nunito-Black.ttf-2a374efbc207a97a99b8c70bdc4b7cbb.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+hinting=1
+subpixel_positioning=1
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/addons/phantom_camera/fonts/Nunito-Regular.ttf b/addons/phantom_camera/fonts/Nunito-Regular.ttf
new file mode 100644 (file)
index 0000000..dfd0fcb
Binary files /dev/null and b/addons/phantom_camera/fonts/Nunito-Regular.ttf differ
diff --git a/addons/phantom_camera/fonts/Nunito-Regular.ttf.import b/addons/phantom_camera/fonts/Nunito-Regular.ttf.import
new file mode 100644 (file)
index 0000000..393153f
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://dve7mgsjik4dg"
+path="res://.godot/imported/Nunito-Regular.ttf-b6054d499efa1a10921004862b1e217a.fontdata"
+
+[deps]
+
+source_file="res://addons/phantom_camera/fonts/Nunito-Regular.ttf"
+dest_files=["res://.godot/imported/Nunito-Regular.ttf-b6054d499efa1a10921004862b1e217a.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+disable_embedded_bitmaps=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8
+msdf_size=48
+allow_system_fallback=true
+force_autohinter=false
+hinting=1
+subpixel_positioning=1
+oversampling=0.0
+Fallbacks=null
+fallbacks=[]
+Compress=null
+compress=true
+preload=[]
+language_support={}
+script_support={}
+opentype_features={}
diff --git a/addons/phantom_camera/gizmos/custom_gizmo.gd b/addons/phantom_camera/gizmos/custom_gizmo.gd
new file mode 100644 (file)
index 0000000..f094f7b
--- /dev/null
@@ -0,0 +1,93 @@
+extends EditorNode3DGizmoPlugin
+class_name CustomPluginGizmo
+
+var _gizmo_name
+var gizmo_name: String: set = set_gizmo_name
+
+var _gizmo_icon: Texture2D
+var gizmo_icon: Texture2D: set = set_gizmo_icon
+
+var _gizmo_spatial_script: Script
+var gizmo_spatial_script: Script: set = set_gizmo_spatial_script
+
+var _gizmo_scale: float = 0.035
+
+
+func set_gizmo_name(name: String) -> void:
+       _gizmo_name = name
+
+
+func set_gizmo_icon(icon: Texture2D) -> void:
+       _gizmo_icon = icon
+
+
+func set_gizmo_spatial_script(script: Script) -> void:
+       _gizmo_spatial_script = script
+
+
+func _get_gizmo_name() -> String:
+       return _gizmo_name
+
+func _has_gizmo(spatial: Node3D):
+       return spatial.get_script() == _gizmo_spatial_script
+
+
+func _init() -> void:
+       create_icon_material(_gizmo_name, _gizmo_icon, false, Color.WHITE)
+       create_material("main", Color8(252, 127, 127, 255))
+
+
+func _draw_frustum() -> PackedVector3Array:
+       var lines = PackedVector3Array()
+       
+       var dis: float          = 0.25
+       var width: float        = dis * 1.25
+       var len: float          = dis * 1.5
+
+       # Straight line
+#      lines.push_back(Vector3(0, 0, 0))
+#      lines.push_back(Vector3(0, 0, -len))
+
+
+       # Trapezoid
+       lines.push_back(Vector3(0, 0, 0))
+       lines.push_back(Vector3(-width, dis, -len))
+       
+       lines.push_back(Vector3(0, 0, 0))
+       lines.push_back(Vector3(width, dis, -len))
+       
+       lines.push_back(Vector3(0, 0, 0))
+       lines.push_back(Vector3(-width, -dis, -len))
+       
+       lines.push_back(Vector3(0, 0, 0))
+       lines.push_back(Vector3(width, -dis, -len))
+       
+       
+       # Square
+       ## Left
+       lines.push_back(Vector3(-width, dis, -len))
+       lines.push_back(Vector3(-width, -dis, -len))
+       
+       ## Bottom
+       lines.push_back(Vector3(-width, -dis, -len))
+       lines.push_back(Vector3(width, -dis, -len))
+       
+       ## Right
+       lines.push_back(Vector3(width, -dis, -len))
+       lines.push_back(Vector3(width, dis, -len))
+       
+       ## Top
+       lines.push_back(Vector3(width, dis, -len))
+       lines.push_back(Vector3(-width, dis, -len))
+       
+       return lines
+
+
+func _redraw(gizmo: EditorNode3DGizmo):
+       gizmo.clear()
+
+       var icon: Material = get_material(_gizmo_name, gizmo)
+       gizmo.add_unscaled_billboard(icon, _gizmo_scale)
+       
+       var material = get_material("main", gizmo)
+       gizmo.add_lines(_draw_frustum(), material)
diff --git a/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd b/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd
new file mode 100644 (file)
index 0000000..bef8180
--- /dev/null
@@ -0,0 +1,11 @@
+extends CustomPluginGizmo
+
+var _spatial_script: Script = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd")
+var _icon: Texture2D = preload("res://addons/phantom_camera/icons/phantom_camera_gizmo.svg")
+
+
+func _init() -> void:
+       set_gizmo_name("PhantomCamera")
+       set_gizmo_spatial_script(_spatial_script)
+       set_gizmo_icon(_icon)
+       super()
diff --git a/addons/phantom_camera/icons/misc/PriorityOverride.svg b/addons/phantom_camera/icons/misc/PriorityOverride.svg
new file mode 100644 (file)
index 0000000..de7fd01
--- /dev/null
@@ -0,0 +1,14 @@
+<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M14.5474 30C14.5474 28.8954 15.4428 28 16.5474 28H47.453C48.5576 28 49.453 28.8954 49.453 30V34C49.453 35.1046 48.5576 36 47.453 36H16.5474C15.4428 36 14.5474 35.1046 14.5474 34V30Z" fill="url(#paint0_linear_1180_3884)"/>
+<path opacity="0.4" fill-rule="evenodd" clip-rule="evenodd" d="M9 12C7.89543 12 7 12.8954 7 14V18C7 19.1046 7.89543 20 9 20H55C56.1046 20 57 19.1046 57 18V14C57 12.8954 56.1046 12 55 12H9ZM21.2639 44C20.1593 44 19.2639 44.8954 19.2639 46V50C19.2639 51.1046 20.1593 52 21.2639 52H42.7356C43.8402 52 44.7356 51.1046 44.7356 50V46C44.7356 44.8954 43.8402 44 42.7356 44H21.2639Z" fill="url(#paint1_linear_1180_3884)"/>
+<defs>
+<linearGradient id="paint0_linear_1180_3884" x1="31.5639" y1="28.5595" x2="31.7511" y2="36.0063" gradientUnits="userSpaceOnUse">
+<stop stop-color="#3AB99A"/>
+<stop offset="1" stop-color="#1B9E7F"/>
+</linearGradient>
+<linearGradient id="paint1_linear_1180_3884" x1="31.375" y1="14.7976" x2="34.6201" y2="51.77" gradientUnits="userSpaceOnUse">
+<stop stop-color="#3AB99A"/>
+<stop offset="1" stop-color="#1B9E7F"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/addons/phantom_camera/icons/misc/PriorityOverride.svg.import b/addons/phantom_camera/icons/misc/PriorityOverride.svg.import
new file mode 100644 (file)
index 0000000..d78acf5
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dy8eifa6aw2en"
+path="res://.godot/imported/PriorityOverride.svg-e76e07f4bbd98169f119e17fe5f2f03f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/icons/misc/PriorityOverride.svg"
+dest_files=["res://.godot/imported/PriorityOverride.svg-e76e07f4bbd98169f119e17fe5f2f03f.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/phantom_camera/icons/phantom_camera_2d.svg b/addons/phantom_camera/icons/phantom_camera_2d.svg
new file mode 100644 (file)
index 0000000..0c67805
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" fill="none"><path fill="#8DA5F3" d="M100.289 56.825c9.182 0 16.626 6.724 16.626 15.02 0 4.313-2.012 8.2-5.234 10.94 1.59 1.859 1.54 4.017 1.54 6.305L128 80.19v33.377l-14.779-8.901v2.225c0 3.687-3.309 6.676-7.39 6.676H72.577c-4.08 0-7.39-2.989-7.39-6.676V96.023c-6.457-2.061-11.084-7.625-11.084-14.165 0-8.295 7.444-15.02 16.627-15.02 5.23 0 9.896 2.182 12.944 5.593-.11-2.61.546-5.227 1.844-7.49 2.767-4.821 8.343-8.116 14.771-8.116"/><path fill="#8DA5F3" fill-rule="evenodd" d="M38.4 8c21.208 0 38.4 16.7 38.4 37.3v11.623a29 29 0 0 0-5.338-.632c.776-2.033 1.224-4.429 1.224-6.994 0-7.357-3.684-13.322-8.229-13.322S56.23 41.94 56.23 49.297c0 3.782.973 7.195 2.536 9.62-8.712 4.017-15.219 12.336-15.219 22.941 0 8.79 4.581 16.1 11.085 20.604v4.429c0 .973.078 1.914.226 2.82v4.861c0 2.943-2.456 5.329-5.486 5.329s-5.485-2.386-5.485-5.329v-5.328c0-2.943-2.456-5.329-5.486-5.329s-5.486 2.386-5.486 5.329v5.328c0 2.943-2.456 5.329-5.485 5.329s-5.486-2.386-5.486-5.329v-5.328c0-2.943-2.456-5.329-5.486-5.329s-5.486 2.386-5.486 5.329v5.328c0 2.943-2.456 5.329-5.485 5.329S0 117.515 0 114.572V45.3C0 24.7 17.192 8 38.4 8m-1.371 54.618c4.544 0 8.228-5.964 8.228-13.321s-3.684-13.322-8.228-13.322c-4.545 0-8.229 5.965-8.229 13.322s3.684 13.321 8.229 13.321" clip-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/addons/phantom_camera/icons/phantom_camera_2d.svg.import b/addons/phantom_camera/icons/phantom_camera_2d.svg.import
new file mode 100644 (file)
index 0000000..b10d490
--- /dev/null
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cmcvv0edbbpv4"
+path="res://.godot/imported/phantom_camera_2d.svg-e5483cbc858fc5f95f7210b1649dff0d.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/icons/phantom_camera_2d.svg"
+dest_files=["res://.godot/imported/phantom_camera_2d.svg-e5483cbc858fc5f95f7210b1649dff0d.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/phantom_camera/icons/phantom_camera_3d.svg b/addons/phantom_camera/icons/phantom_camera_3d.svg
new file mode 100644 (file)
index 0000000..db18730
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" fill="none"><path fill="#FC7F7F" d="M100.289 56.825c9.182 0 16.626 6.724 16.626 15.02 0 4.313-2.012 8.2-5.234 10.94 1.59 1.859 1.54 4.017 1.54 6.305L128 80.19v33.377l-14.779-8.901v2.225c0 3.687-3.309 6.676-7.39 6.676H72.577c-4.08 0-7.39-2.989-7.39-6.676V96.023c-6.457-2.061-11.084-7.625-11.084-14.165 0-8.295 7.444-15.02 16.627-15.02 5.23 0 9.896 2.182 12.944 5.593-.11-2.61.546-5.227 1.844-7.49 2.767-4.821 8.343-8.116 14.771-8.116"/><path fill="#FC7F7F" fill-rule="evenodd" d="M38.4 8c21.208 0 38.4 16.7 38.4 37.3v11.623a29 29 0 0 0-5.338-.632c.776-2.033 1.224-4.429 1.224-6.994 0-7.357-3.684-13.322-8.229-13.322S56.23 41.94 56.23 49.297c0 3.782.973 7.195 2.536 9.62-8.712 4.017-15.219 12.336-15.219 22.941 0 8.79 4.581 16.1 11.085 20.604v4.429c0 .973.078 1.914.226 2.82v4.861c0 2.943-2.456 5.329-5.486 5.329s-5.485-2.386-5.485-5.329v-5.328c0-2.943-2.456-5.329-5.486-5.329s-5.486 2.386-5.486 5.329v5.328c0 2.943-2.456 5.329-5.485 5.329s-5.486-2.386-5.486-5.329v-5.328c0-2.943-2.456-5.329-5.486-5.329s-5.486 2.386-5.486 5.329v5.328c0 2.943-2.456 5.329-5.485 5.329S0 117.515 0 114.572V45.3C0 24.7 17.192 8 38.4 8m-1.371 54.618c4.544 0 8.228-5.964 8.228-13.321s-3.684-13.322-8.228-13.322c-4.545 0-8.229 5.965-8.229 13.322s3.684 13.321 8.229 13.321" clip-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/addons/phantom_camera/icons/phantom_camera_3d.svg.import b/addons/phantom_camera/icons/phantom_camera_3d.svg.import
new file mode 100644 (file)
index 0000000..6542a24
--- /dev/null
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bf8bxgxx71qki"
+path="res://.godot/imported/phantom_camera_3d.svg-41ed612e834470377fb56eebffa083fe.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/icons/phantom_camera_3d.svg"
+dest_files=["res://.godot/imported/phantom_camera_3d.svg-41ed612e834470377fb56eebffa083fe.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg b/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg
new file mode 100644 (file)
index 0000000..282adf2
--- /dev/null
@@ -0,0 +1,3 @@
+<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M52.3068 21.4737C52.3068 14.9335 46.4687 9.63159 39.2671 9.63159C34.226 9.63159 29.853 12.2294 27.6829 16.0314C26.6647 17.8152 26.1501 19.8783 26.237 21.9355C23.8466 19.2464 20.1871 17.5263 16.0852 17.5263C8.88357 17.5263 3.04547 22.8282 3.04547 29.3684C3.04547 34.5246 6.67403 38.911 11.7386 40.5367V49.1053C11.7386 52.012 14.3334 54.3684 17.5341 54.3684H43.6136C46.8144 54.3684 49.4091 52.012 49.4091 49.1053V47.3509L61 54.3684V28.0526L49.4091 35.0702C49.4091 35.0163 49.4091 34.9625 49.4092 34.9088C49.4103 33.1652 49.4114 31.5208 48.2014 30.0995C50.7287 27.9397 52.3068 24.874 52.3068 21.4737ZM42.9861 30.74L30.4059 24.9741C30.1414 24.8529 29.8371 24.8529 29.5726 24.9741L16.9924 30.74L16.9924 30.7401V45.3616L29.9893 51.3185L42.9861 45.3616V44.7218V44.7198V30.7401V30.74ZM18.617 33.4481L27.8231 37.2388V48.0686L18.617 43.7364V33.4481ZM20.2416 30.7402L29.9893 26.4079L39.7369 30.7402L29.9893 34.5309L20.2416 30.7402Z" fill="#F5F5F5"/>
+</svg>
diff --git a/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg.import b/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg.import
new file mode 100644 (file)
index 0000000..d880530
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dkpwb4k1bkbvn"
+path="res://.godot/imported/phantom_camera_camera_3d_resource.svg-f8bf8d1a5b7442fd6933bfbed999d57d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg"
+dest_files=["res://.godot/imported/phantom_camera_camera_3d_resource.svg-f8bf8d1a5b7442fd6933bfbed999d57d.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/phantom_camera/icons/phantom_camera_gizmo.svg b/addons/phantom_camera/icons/phantom_camera_gizmo.svg
new file mode 100644 (file)
index 0000000..d791ce0
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" fill="none"><path fill="#E0E0E0" d="M95.753 57.722c8.034 0 14.548 5.884 14.548 13.142 0 3.774-1.761 7.176-4.58 9.573 1.391 1.626 1.347 3.515 1.347 5.517L120 78.166v29.205l-12.932-7.788v1.947c0 3.226-2.895 5.841-6.466 5.841H71.505c-3.57 0-6.466-2.615-6.466-5.841v-9.51c-5.65-1.804-9.699-6.672-9.699-12.394 0-7.259 6.514-13.143 14.549-13.143 4.576 0 8.659 1.91 11.326 4.894a12.2 12.2 0 0 1 1.613-6.553c2.421-4.22 7.3-7.102 12.925-7.102"/><path fill="#E0E0E0" fill-rule="evenodd" d="M41.6 15c18.557 0 33.6 14.612 33.6 32.638v10.17a25.3 25.3 0 0 0-4.67-.554c.678-1.778 1.07-3.875 1.07-6.12 0-6.437-3.224-11.656-7.2-11.656s-7.2 5.22-7.2 11.657c0 3.309.852 6.296 2.22 8.418-7.624 3.514-13.317 10.793-13.317 20.073 0 7.692 4.009 14.087 9.7 18.028v3.876q.001 1.277.197 2.467v4.254c0 2.575-2.149 4.662-4.8 4.662s-4.8-2.087-4.8-4.662v-4.663c0-2.575-2.149-4.662-4.8-4.662s-4.8 2.087-4.8 4.662v4.663c0 2.575-2.149 4.662-4.8 4.662s-4.8-2.087-4.8-4.662v-4.663c0-2.575-2.149-4.662-4.8-4.662s-4.8 2.087-4.8 4.662v4.663c0 2.575-2.149 4.662-4.8 4.662S8 110.826 8 108.251V47.638C8 29.612 23.043 15 41.6 15m-1.2 47.791c3.977 0 7.2-5.219 7.2-11.656s-3.224-11.657-7.2-11.657-7.2 5.22-7.2 11.657 3.224 11.656 7.2 11.656" clip-rule="evenodd"/><path stroke="#000" stroke-opacity=".3" d="m107.568 100.468 12.174 7.331.758.457V77.281l-.758.456-12.175 7.333c-.014-1.552-.139-3.142-1.162-4.57 2.709-2.46 4.396-5.865 4.396-9.636 0-7.581-6.786-13.642-15.048-13.642-5.793 0-10.843 2.97-13.359 7.353a12.75 12.75 0 0 0-1.669 5.584c-2.174-2.046-5.045-3.473-8.26-3.976a18 18 0 0 0-.77-.102 17 17 0 0 0-1.806-.098c-8.262 0-15.049 6.062-15.049 13.643 0 5.853 4.055 10.81 9.7 12.755v9.149c0 3.549 3.167 6.341 6.965 6.341h29.097c3.798 0 6.966-2.792 6.966-6.341zM75.095 58.296l.605.13V47.637C75.7 29.324 60.42 14.5 41.6 14.5S7.5 29.323 7.5 47.638v60.613c0 2.865 2.387 5.162 5.3 5.162s5.3-2.297 5.3-5.162v-4.663c0-2.285 1.911-4.162 4.3-4.162s4.3 1.877 4.3 4.162v4.663c0 2.865 2.387 5.162 5.3 5.162s5.3-2.297 5.3-5.162v-4.663c0-2.285 1.911-4.162 4.3-4.162s4.3 1.877 4.3 4.162v4.663c0 2.865 2.387 5.162 5.3 5.162s5.3-2.297 5.3-5.162v-4.295l-.007-.04a15 15 0 0 1-.19-2.386v-4.137l-.216-.15c-5.574-3.86-9.484-10.11-9.484-17.617 0-9.056 5.551-16.173 13.026-19.62l.523-.24-.312-.484c-1.308-2.028-2.14-4.917-2.14-8.147 0-3.142.787-5.961 2.034-7.98 1.252-2.026 2.915-3.177 4.666-3.177 1.75 0 3.414 1.15 4.666 3.177 1.246 2.019 2.034 4.838 2.034 7.98 0 2.188-.382 4.223-1.038 5.94l-.252.661.707.018c1.56.04 3.093.223 4.578.542ZM47.1 51.135c0 3.14-.788 5.96-2.034 7.98-1.252 2.026-2.915 3.176-4.666 3.176-1.75 0-3.414-1.15-4.666-3.177-1.247-2.018-2.034-4.838-2.034-7.98 0-3.14.787-5.96 2.034-7.979 1.252-2.026 2.915-3.177 4.666-3.177 1.75 0 3.414 1.15 4.666 3.177 1.246 2.019 2.034 4.838 2.034 7.98Z"/></svg>
\ No newline at end of file
diff --git a/addons/phantom_camera/icons/phantom_camera_gizmo.svg.import b/addons/phantom_camera/icons/phantom_camera_gizmo.svg.import
new file mode 100644 (file)
index 0000000..7b49608
--- /dev/null
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://e36npe2rbxyg"
+path.s3tc="res://.godot/imported/phantom_camera_gizmo.svg-ba1aacb9b1c5f4ef401d3bd3697a542b.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/icons/phantom_camera_gizmo.svg"
+dest_files=["res://.godot/imported/phantom_camera_gizmo.svg-ba1aacb9b1c5f4ef401d3bd3697a542b.s3tc.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+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
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/phantom_camera/icons/phantom_camera_glow_logo.png b/addons/phantom_camera/icons/phantom_camera_glow_logo.png
new file mode 100644 (file)
index 0000000..41ad8de
Binary files /dev/null and b/addons/phantom_camera/icons/phantom_camera_glow_logo.png differ
diff --git a/addons/phantom_camera/icons/phantom_camera_glow_logo.png.import b/addons/phantom_camera/icons/phantom_camera_glow_logo.png.import
new file mode 100644 (file)
index 0000000..d68be86
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cjli3p2b8mfyh"
+path="res://.godot/imported/phantom_camera_glow_logo.png-078f944973b55b32029ba02980211fe0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/icons/phantom_camera_glow_logo.png"
+dest_files=["res://.godot/imported/phantom_camera_glow_logo.png-078f944973b55b32029ba02980211fe0.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/addons/phantom_camera/icons/phantom_camera_host.svg b/addons/phantom_camera/icons/phantom_camera_host.svg
new file mode 100644 (file)
index 0000000..4ff3ada
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" fill="none"><path fill="#fff" fill-rule="evenodd" d="M36 16c11.046 0 20 8.357 20 18.667v6.275C42.684 44.12 32 55.048 32 69.333v2.134a3 3 0 0 1-1.714.533c-1.578 0-2.857-1.194-2.857-2.667v-2.666c0-1.473-1.28-2.667-2.858-2.667s-2.857 1.194-2.857 2.667v2.666c0 1.473-1.279 2.667-2.857 2.667S16 70.806 16 69.333V34.667C16 24.357 24.954 16 36 16m-6.55 27.333c2.367 0 4.286-2.984 4.286-6.666S31.817 30 29.45 30s-4.285 2.985-4.285 6.667 1.918 6.666 4.285 6.666m18.572-6.666c0 3.682-1.919 6.666-4.286 6.666s-4.286-2.984-4.286-6.666S41.37 30 43.736 30c2.367 0 4.286 2.985 4.286 6.667M96 69.333v2.134a3 3 0 0 0 1.714.533c1.578 0 2.857-1.194 2.857-2.667v-2.666c0-1.473 1.28-2.667 2.858-2.667s2.857 1.194 2.857 2.667v2.666c0 1.473 1.279 2.667 2.857 2.667S112 70.806 112 69.333V34.667C112 24.357 103.046 16 92 16s-20 8.357-20 18.667v6.275c13.316 3.178 24 14.106 24 28.391m-10.55-26c2.367 0 4.286-2.984 4.286-6.666S87.817 30 85.45 30s-4.285 2.985-4.285 6.667 1.918 6.666 4.285 6.666m18.572-6.666c0 3.682-1.919 6.666-4.286 6.666s-4.286-2.984-4.286-6.666S97.37 30 99.736 30c2.367 0 4.286 2.985 4.286 6.667" clip-rule="evenodd"/><path fill="#fff" fill-rule="evenodd" d="M64 48c13.255 0 24 9.551 24 21.333v39.619c0 1.684-1.535 3.048-3.429 3.048s-3.428-1.364-3.428-3.048v-3.047c0-1.683-1.535-3.048-3.429-3.048s-3.428 1.365-3.428 3.048v3.047c0 1.684-1.535 3.048-3.429 3.048s-3.428-1.364-3.428-3.048v-3.047c0-1.683-1.535-3.048-3.429-3.048s-3.429 1.365-3.429 3.048v3.047c0 1.684-1.535 3.048-3.428 3.048s-3.429-1.364-3.429-3.048v-3.047c0-1.683-1.535-3.048-3.428-3.048s-3.429 1.365-3.429 3.048v3.047c0 1.684-1.535 3.048-3.428 3.048S40 110.636 40 108.952V69.333C40 57.551 50.745 48 64 48m-7.86 31.238c2.84 0 5.143-3.411 5.143-7.619S58.981 64 56.14 64s-5.142 3.411-5.142 7.619 2.302 7.62 5.142 7.62m22.286-7.619c0 4.208-2.302 7.62-5.143 7.62s-5.143-3.412-5.143-7.62S70.443 64 73.283 64s5.143 3.411 5.143 7.619" clip-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/addons/phantom_camera/icons/phantom_camera_host.svg.import b/addons/phantom_camera/icons/phantom_camera_host.svg.import
new file mode 100644 (file)
index 0000000..430d67d
--- /dev/null
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://5fatldiu7dd5"
+path="res://.godot/imported/phantom_camera_host.svg-3150f8f2d82ca9ecab9a3a415da21c5b.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/icons/phantom_camera_host.svg"
+dest_files=["res://.godot/imported/phantom_camera_host.svg-3150f8f2d82ca9ecab9a3a415da21c5b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/phantom_camera/icons/phantom_camera_logo.png b/addons/phantom_camera/icons/phantom_camera_logo.png
new file mode 100644 (file)
index 0000000..bc43e56
Binary files /dev/null and b/addons/phantom_camera/icons/phantom_camera_logo.png differ
diff --git a/addons/phantom_camera/icons/phantom_camera_logo.png.import b/addons/phantom_camera/icons/phantom_camera_logo.png.import
new file mode 100644 (file)
index 0000000..6f51cf4
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cc0wmici0eic8"
+path="res://.godot/imported/phantom_camera_logo.png-8b8d347b5e4800c86cd8095d030a3e5a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/icons/phantom_camera_logo.png"
+dest_files=["res://.godot/imported/phantom_camera_logo.png-8b8d347b5e4800c86cd8095d030a3e5a.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/addons/phantom_camera/icons/phantom_camera_tween.svg b/addons/phantom_camera/icons/phantom_camera_tween.svg
new file mode 100644 (file)
index 0000000..6956fb5
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="none"><path fill="#E0E0E0" d="M18.877 22.144q-.594 0-.954-.324a1.12 1.12 0 0 1-.378-.828q0-.504.414-1.026l2.664-3.24v1.422l-2.448-2.988q-.414-.54-.414-1.026.018-.504.378-.828t.954-.324q.576 0 .936.198.378.18.72.612l1.674 2.16h-1.116l1.674-2.16q.342-.432.72-.612.378-.198.936-.198.612 0 .954.324.36.324.36.828.018.504-.414 1.026l-2.448 2.988v-1.422l2.682 3.24q.432.504.414 1.008a1.18 1.18 0 0 1-.378.846q-.36.324-.972.324-.558 0-.936-.18-.378-.198-.72-.63l-1.872-2.394h1.098l-1.89 2.394q-.324.414-.702.612-.36.198-.936.198M53.916 39.198q-1.35 0-2.232-.414a2.77 2.77 0 0 1-1.296-1.242q-.432-.846-.432-2.106v-2.934h-.612q-.576 0-.9-.306-.306-.306-.306-.882t.306-.864q.324-.306.9-.306h.612v-1.116q0-.792.414-1.206t1.188-.414 1.188.414.414 1.206v1.116h1.476q.594 0 .9.306.324.288.324.864t-.324.882q-.306.306-.9.306H53.16v2.826q0 .666.306.99.324.306 1.008.306.252 0 .486-.054t.432-.054a.55.55 0 0 1 .468.18q.18.18.18.846 0 .54-.162.918-.162.36-.576.522-.252.09-.684.144a4.5 4.5 0 0 1-.702.072"/><path fill="#E0E0E0" fill-rule="evenodd" d="M9 12.5a3.5 3.5 0 0 1 3.5 3.5v27.436c7.342-.458 10.764-3.277 12.592-5.959 1.73-2.536 2.257-5.067 2.724-7.314.155-.741.303-1.451.485-2.12.576-2.113 1.756-6.171 5.713-9.589 3.963-3.422 10.191-5.776 19.986-5.776a3.5 3.5 0 1 1 0 7c-8.705 0-13.104 2.082-15.41 4.074-2.313 1.997-3.044 4.331-3.536 6.132-.055.203-.12.53-.204.956-.42 2.122-1.325 6.694-3.974 10.58a19 19 0 0 1-1.732 2.184H54a3.5 3.5 0 1 1 0 7H11a5.5 5.5 0 0 1-5.5-5.5V16A3.5 3.5 0 0 1 9 12.5" clip-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/addons/phantom_camera/icons/phantom_camera_tween.svg.import b/addons/phantom_camera/icons/phantom_camera_tween.svg.import
new file mode 100644 (file)
index 0000000..3db67fb
--- /dev/null
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dphl04mdf3220"
+path="res://.godot/imported/phantom_camera_tween.svg-16faced08ef4a5f3458264d894230dbd.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/icons/phantom_camera_tween.svg"
+dest_files=["res://.godot/imported/phantom_camera_tween.svg-16faced08ef4a5f3458264d894230dbd.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg b/addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg
new file mode 100644 (file)
index 0000000..6d3bcd4
--- /dev/null
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M4 7.68333L8 4M8 4L12 7.68333M8 4V13" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg.import b/addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg.import
new file mode 100644 (file)
index 0000000..c182784
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d4j4hrb7yusyq"
+path="res://.godot/imported/phantom_camera_updater_panel_icon.svg-19823e6cbee8115f8b2554d0ee6e79db.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg"
+dest_files=["res://.godot/imported/phantom_camera_updater_panel_icon.svg-19823e6cbee8115f8b2554d0ee6e79db.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg b/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg
new file mode 100644 (file)
index 0000000..59efad4
--- /dev/null
@@ -0,0 +1,3 @@
+<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M39.2002 10.4004C46.3578 10.4004 52.1602 15.615 52.1602 22.0474C52.1602 25.3918 50.5917 28.4069 48.0799 30.5311C49.3195 31.9721 49.2802 33.6462 49.2802 35.42L60.8002 28.518V54.4003L49.2802 47.4984V49.2239C49.2802 52.0828 46.7013 54.4003 43.5202 54.4003H17.6002C14.419 54.4003 11.8402 52.0828 11.8402 49.2239V40.7964C6.80656 39.1976 3.2002 34.8833 3.2002 29.8121C3.2002 23.3796 9.00258 18.1651 16.1602 18.1651C20.237 18.1651 23.8741 19.8569 26.2499 22.5017C26.1635 20.4783 26.6749 18.4492 27.6869 16.6948C29.8438 12.9554 34.19 10.4004 39.2002 10.4004Z" fill="#8DA5F3"/>
+</svg>
diff --git a/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg.import b/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg.import
new file mode 100644 (file)
index 0000000..e8fb35d
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ccnsrg8hq74p2"
+path="res://.godot/imported/Camera2DIcon.svg-300e6f57281180711c5ecf391104d4ba.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg"
+dest_files=["res://.godot/imported/Camera2DIcon.svg-300e6f57281180711c5ecf391104d4ba.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg b/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg
new file mode 100644 (file)
index 0000000..2366c3f
--- /dev/null
@@ -0,0 +1,3 @@
+<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M39.2002 10.4004C46.3578 10.4004 52.1602 15.615 52.1602 22.0474C52.1602 25.3918 50.5917 28.4069 48.0799 30.5311C49.3195 31.9721 49.2802 33.6462 49.2802 35.42L60.8002 28.518V54.4003L49.2802 47.4984V49.2239C49.2802 52.0828 46.7013 54.4003 43.5202 54.4003H17.6002C14.419 54.4003 11.8402 52.0828 11.8402 49.2239V40.7964C6.80656 39.1976 3.2002 34.8833 3.2002 29.8121C3.2002 23.3796 9.00258 18.1651 16.1602 18.1651C20.237 18.1651 23.8741 19.8569 26.2499 22.5017C26.1635 20.4783 26.6749 18.4492 27.6869 16.6948C29.8438 12.9554 34.19 10.4004 39.2002 10.4004Z" fill="#FC7F7F"/>
+</svg>
diff --git a/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg.import b/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg.import
new file mode 100644 (file)
index 0000000..79708e2
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dkiefpjsrj37n"
+path="res://.godot/imported/Camera3DIcon.svg-4805c46004db1c89cc9443dd740693f5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg"
+dest_files=["res://.godot/imported/Camera3DIcon.svg-4805c46004db1c89cc9443dd740693f5.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg b/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg
new file mode 100644 (file)
index 0000000..87e3f79
--- /dev/null
@@ -0,0 +1,4 @@
+<svg width="148" height="64" viewBox="0 0 148 64" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M43.1201 20.605V27.7013C43.1201 29.3783 45.0599 30.3107 46.3695 29.263L59.9304 18.4143C60.9313 17.6136 60.9313 16.0914 59.9304 15.2908L46.3695 4.44202C45.0599 3.3944 43.1201 4.32674 43.1201 6.00375V13.1L13.1 13.1L13.1 43.1201H6.00376C4.32674 43.1201 3.3944 45.0599 4.44202 46.3695L15.2908 59.9304C16.0914 60.9313 17.6136 60.9313 18.4143 59.9304L29.2631 46.3695C30.3107 45.0599 29.3783 43.1201 27.7013 43.1201H20.605V20.605L43.1201 20.605Z" fill="#F5F5F5"/>
+<path d="M104.605 21.561H111.701C113.378 21.561 114.311 19.6211 113.263 18.3116L102.414 4.75061C101.614 3.7498 100.091 3.7498 99.2908 4.75061L88.442 18.3116C87.3944 19.6211 88.3267 21.561 90.0038 21.561H97.1V53.4576H127.12V58.6773C127.12 60.3543 129.06 61.2867 130.369 60.239L143.93 49.3903C144.931 48.5896 144.931 47.0674 143.93 46.2668L130.369 35.418C129.06 34.3704 127.12 35.3027 127.12 36.9797V45.9525H109.912L129.707 26.1573L134.148 30.598C135.334 31.7838 137.365 31.0714 137.55 29.4046L139.468 12.1443C139.609 10.8705 138.533 9.79417 137.259 9.9357L119.999 11.8535C118.332 12.0387 117.62 14.0697 118.805 15.2555L124.4 20.8504L104.605 40.6457V21.561Z" fill="#F5F5F5"/>
+</svg>
diff --git a/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg.import b/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg.import
new file mode 100644 (file)
index 0000000..364c4ed
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dk7omm0x44suj"
+path="res://.godot/imported/SceneTypesIcon.svg-66e2255bd3398007bec03a5cbfa4d0aa.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg"
+dest_files=["res://.godot/imported/SceneTypesIcon.svg-66e2255bd3398007bec03a5cbfa4d0aa.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd b/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd
new file mode 100644 (file)
index 0000000..d5a0d22
--- /dev/null
@@ -0,0 +1,46 @@
+@tool
+extends EditorInspectorPlugin
+
+#var _phantom_camera_script: Script = preload("res://addons/phantom_camera/scripts/phantom_camera.gd")
+
+
+#      TODO - Enable again once work is resumed for inspector based tasks
+
+#func _can_handle(object) -> bool:
+#      return object is _phantom_camera_script
+
+
+func _parse_category(object: Object, category: String) -> void:
+
+       var _margin_container: MarginContainer = MarginContainer.new()
+       var _margin_v: float = 20
+       _margin_container.add_theme_constant_override("margin_left", 10)
+       _margin_container.add_theme_constant_override("margin_top", _margin_v)
+       _margin_container.add_theme_constant_override("margin_right", 10)
+       _margin_container.add_theme_constant_override("margin_bottom", _margin_v)
+       add_custom_control(_margin_container)
+
+       var _vbox_container: VBoxContainer = VBoxContainer.new()
+       _margin_container.add_child(_vbox_container)
+
+       var align_with_view_button = Button.new()
+       align_with_view_button.connect("pressed", _align_camera_with_view.bind(object))
+       align_with_view_button.set_custom_minimum_size(Vector2(0, 60))
+       align_with_view_button.set_text("Align with view")
+       _vbox_container.add_child(align_with_view_button)
+
+       var preview_camera_button = Button.new()
+       preview_camera_button.connect("pressed", _preview_camera.bind(object))
+       preview_camera_button.set_custom_minimum_size(Vector2(0, 60))
+       preview_camera_button.set_text("Preview Camera")
+       _vbox_container.add_child(preview_camera_button)
+
+
+
+func _align_camera_with_view(object: Object) -> void:
+       print("Aligning camera with view")
+       print(object)
+
+func _preview_camera(object: Object) -> void:
+       print("Previewing camera")
+       print(object)
diff --git a/addons/phantom_camera/panel/editor.gd b/addons/phantom_camera/panel/editor.gd
new file mode 100644 (file)
index 0000000..9f52b8f
--- /dev/null
@@ -0,0 +1,11 @@
+@tool
+extends VBoxContainer
+
+var editor_plugin: EditorPlugin
+
+@onready var updater: Control = %UpdateButton
+@onready var viewfinder: Control = %ViewfinderPanel
+
+
+func _ready():
+       updater.editor_plugin = editor_plugin
diff --git a/addons/phantom_camera/panel/editor.tscn b/addons/phantom_camera/panel/editor.tscn
new file mode 100644 (file)
index 0000000..da1574c
--- /dev/null
@@ -0,0 +1,23 @@
+[gd_scene load_steps=4 format=3 uid="uid://cfdoaceoosi1w"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/panel/editor.gd" id="1_86hp7"]
+[ext_resource type="PackedScene" uid="uid://cuqkqsp3ikv5u" path="res://addons/phantom_camera/panel/updater/update_button.tscn" id="1_oowcd"]
+[ext_resource type="PackedScene" uid="uid://dbkr3d716wtx0" path="res://addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn" id="2_xecnk"]
+
+[node name="EditorPanel" type="VBoxContainer"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_86hp7")
+
+[node name="UpdateButton" parent="." instance=ExtResource("1_oowcd")]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 8
+size_flags_vertical = 1
+
+[node name="ViewfinderPanel" parent="." instance=ExtResource("2_xecnk")]
+unique_name_in_owner = true
+layout_mode = 2
diff --git a/addons/phantom_camera/panel/updater/download_update_panel.tscn b/addons/phantom_camera/panel/updater/download_update_panel.tscn
new file mode 100644 (file)
index 0000000..240ed5f
--- /dev/null
@@ -0,0 +1,253 @@
+[gd_scene load_steps=15 format=3 uid="uid://b25fl4usw0nlp"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/panel/updater/download_update_panel.gd" id="1_sx5xq"]
+[ext_resource type="Texture2D" uid="uid://cc0wmici0eic8" path="res://addons/phantom_camera/icons/phantom_camera_logo.png" id="2_f3yo7"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="3_h8uk3"]
+[ext_resource type="FontFile" uid="uid://dve7mgsjik4dg" path="res://addons/phantom_camera/fonts/Nunito-Regular.ttf" id="4_gwh4i"]
+[ext_resource type="Texture2D" uid="uid://censw3w53gldn" path="res://addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png" id="5_bonti"]
+
+[sub_resource type="ImageTexture" id="ImageTexture_sjwi2"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_insma"]
+bg_color = Color(0.0190018, 0.21903, 0.16997, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0.0980392, 0.572549, 0.458824, 1)
+border_blend = true
+corner_radius_bottom_right = 12
+corner_radius_bottom_left = 12
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8m63d"]
+bg_color = Color(0.0784314, 0.109804, 0.129412, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0.105882, 0.619608, 0.498039, 1)
+corner_radius_bottom_right = 12
+corner_radius_bottom_left = 12
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yn22d"]
+bg_color = Color(0.0117647, 0.164706, 0.12549, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0.0980392, 0.572549, 0.458824, 1)
+border_blend = true
+corner_radius_bottom_right = 12
+corner_radius_bottom_left = 12
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_djsbc"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_xtrn6"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_o12j0"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_buptb"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_g3tf0"]
+
+[node name="DownloadUpdatePanel" type="Control"]
+custom_minimum_size = Vector2(300, 350)
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_bottom = -61.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_sx5xq")
+
+[node name="DownloadHTTPRequest" type="HTTPRequest" parent="."]
+unique_name_in_owner = true
+
+[node name="Timer" type="Timer" parent="DownloadHTTPRequest"]
+one_shot = true
+
+[node name="VBox" type="VBoxContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/separation = 2
+
+[node name="VBoxContainer2" type="VBoxContainer" parent="VBox"]
+layout_mode = 2
+theme_override_constants/separation = -20
+
+[node name="MarginContainer" type="MarginContainer" parent="VBox/VBoxContainer2"]
+layout_mode = 2
+theme_override_constants/margin_top = 12
+
+[node name="Logo" type="TextureRect" parent="VBox/VBoxContainer2/MarginContainer"]
+unique_name_in_owner = true
+clip_contents = true
+custom_minimum_size = Vector2(300, 160)
+layout_mode = 2
+texture = ExtResource("2_f3yo7")
+expand_mode = 3
+stretch_mode = 5
+
+[node name="VBoxContainer" type="VBoxContainer" parent="VBox/VBoxContainer2"]
+layout_mode = 2
+theme_override_constants/separation = -5
+
+[node name="NameLabel" type="Label" parent="VBox/VBoxContainer2/VBoxContainer"]
+layout_mode = 2
+theme_override_colors/font_color = Color(0.960784, 0.960784, 0.960784, 1)
+theme_override_fonts/font = ExtResource("3_h8uk3")
+theme_override_font_sizes/font_size = 32
+text = "Phantom Camera"
+horizontal_alignment = 1
+
+[node name="DownloadVersionLabel" type="Label" parent="VBox/VBoxContainer2/VBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+theme_override_colors/font_color = Color(0.960784, 0.960784, 0.960784, 1)
+theme_override_fonts/font = ExtResource("4_gwh4i")
+theme_override_font_sizes/font_size = 18
+text = "v1.2.3 is available for download."
+horizontal_alignment = 1
+
+[node name="CurrentVersionLabel" type="Label" parent="VBox"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+theme_override_fonts/font = ExtResource("4_gwh4i")
+text = "Current version: 0.0.0"
+horizontal_alignment = 1
+
+[node name="Center2" type="CenterContainer" parent="VBox"]
+layout_mode = 2
+
+[node name="NotesButton" type="LinkButton" parent="VBox/Center2"]
+layout_mode = 2
+theme_override_colors/font_color = Color(0.917647, 0.631373, 0.368627, 1)
+theme_override_colors/font_hover_color = Color(0.721569, 0.454902, 0.192157, 1)
+theme_override_fonts/font = ExtResource("3_h8uk3")
+theme_override_font_sizes/font_size = 18
+text = "Release Notes"
+
+[node name="Center" type="CenterContainer" parent="VBox"]
+layout_mode = 2
+
+[node name="VBoxContainer" type="VBoxContainer" parent="VBox/Center"]
+layout_mode = 2
+
+[node name="BreakingLabel" type="Label" parent="VBox/Center/VBoxContainer"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+theme_override_colors/font_color = Color(0.72549, 0.227451, 0.34902, 1)
+theme_override_fonts/font = ExtResource("3_h8uk3")
+theme_override_font_sizes/font_size = 18
+text = "Potential Breaking Changes
+in new release"
+horizontal_alignment = 1
+uppercase = true
+
+[node name="BreakingMarginContainer" type="MarginContainer" parent="VBox/Center/VBoxContainer"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+
+[node name="VBoxContainer" type="VBoxContainer" parent="VBox/Center/VBoxContainer/BreakingMarginContainer"]
+layout_mode = 2
+
+[node name="RichTextLabel2" type="RichTextLabel" parent="VBox/Center/VBoxContainer/BreakingMarginContainer/VBoxContainer"]
+layout_mode = 2
+theme_override_fonts/normal_font = ExtResource("4_gwh4i")
+theme_override_fonts/bold_font = ExtResource("3_h8uk3")
+theme_override_fonts/mono_font = ExtResource("3_h8uk3")
+theme_override_font_sizes/normal_font_size = 18
+theme_override_font_sizes/bold_font_size = 14
+theme_override_font_sizes/mono_font_size = 12
+bbcode_enabled = true
+text = "[center][b]I am prepared for any breaking
+changes that may occur from this update[/b][/center]"
+fit_content = true
+
+[node name="BreakingOptionButton" type="OptionButton" parent="VBox/Center/VBoxContainer/BreakingMarginContainer/VBoxContainer"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+mouse_default_cursor_shape = 2
+theme_override_fonts/font = ExtResource("3_h8uk3")
+theme_override_font_sizes/font_size = 18
+theme_override_icons/arrow = SubResource("ImageTexture_sjwi2")
+theme_override_styles/normal = SubResource("StyleBoxFlat_insma")
+theme_override_styles/hover = SubResource("StyleBoxFlat_8m63d")
+theme_override_styles/pressed = SubResource("StyleBoxFlat_yn22d")
+alignment = 1
+item_count = 2
+selected = 0
+popup/item_0/text = "Confirm choice"
+popup/item_0/id = 0
+popup/item_1/text = "Yes, I am prepared"
+popup/item_1/id = 1
+
+[node name="DownloadButton" type="Button" parent="VBox/Center/VBoxContainer"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(240, 90)
+layout_mode = 2
+mouse_default_cursor_shape = 2
+theme_override_styles/normal = SubResource("StyleBoxEmpty_djsbc")
+theme_override_styles/hover = SubResource("StyleBoxEmpty_xtrn6")
+theme_override_styles/pressed = SubResource("StyleBoxEmpty_o12j0")
+theme_override_styles/disabled = SubResource("StyleBoxEmpty_buptb")
+theme_override_styles/focus = SubResource("StyleBoxEmpty_g3tf0")
+
+[node name="DownloadButtonBG" type="NinePatchRect" parent="VBox/Center/VBoxContainer/DownloadButton"]
+unique_name_in_owner = true
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource("5_bonti")
+patch_margin_left = 38
+patch_margin_top = 37
+patch_margin_right = 38
+patch_margin_bottom = 39
+
+[node name="UpdateLabel" type="Label" parent="VBox/Center/VBoxContainer/DownloadButton"]
+unique_name_in_owner = true
+layout_mode = 1
+anchors_preset = 14
+anchor_top = 0.5
+anchor_right = 1.0
+anchor_bottom = 0.5
+offset_top = -14.5
+offset_bottom = 14.5
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_colors/font_color = Color(0.960784, 0.960784, 0.960784, 1)
+theme_override_colors/font_shadow_color = Color(0, 0, 0, 1)
+theme_override_fonts/font = ExtResource("3_h8uk3")
+theme_override_font_sizes/font_size = 20
+text = "Update"
+horizontal_alignment = 1
+uppercase = true
+
+[node name="MarginContainer" type="MarginContainer" parent="VBox"]
+layout_mode = 2
+theme_override_constants/margin_top = 10
+
+[node name="RichTextLabel" type="RichTextLabel" parent="VBox/MarginContainer"]
+layout_mode = 2
+theme_override_fonts/normal_font = ExtResource("4_gwh4i")
+theme_override_fonts/mono_font = ExtResource("3_h8uk3")
+theme_override_font_sizes/normal_font_size = 12
+theme_override_font_sizes/mono_font_size = 12
+bbcode_enabled = true
+text = "[center]The updater can be disabled within:
+[code]Project Settings / Phantom Camera / Updater / Enable Updater[/code][/center]"
+fit_content = true
+
+[connection signal="pressed" from="VBox/Center2/NotesButton" to="." method="_on_notes_button_pressed"]
diff --git a/addons/phantom_camera/panel/updater/update_button.tscn b/addons/phantom_camera/panel/updater/update_button.tscn
new file mode 100644 (file)
index 0000000..00c80de
--- /dev/null
@@ -0,0 +1,101 @@
+[gd_scene load_steps=10 format=3 uid="uid://cuqkqsp3ikv5u"]
+
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="1_5e5k4"]
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/panel/updater/update_button.gd" id="1_xtaw5"]
+[ext_resource type="Texture2D" uid="uid://d4j4hrb7yusyq" path="res://addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg" id="2_c4d83"]
+[ext_resource type="PackedScene" uid="uid://b25fl4usw0nlp" path="res://addons/phantom_camera/panel/updater/download_update_panel.tscn" id="2_vtgcx"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_c7fd1"]
+content_margin_left = 10.0
+content_margin_top = 4.0
+content_margin_right = 10.0
+content_margin_bottom = 4.0
+bg_color = Color(0.0980392, 0.415686, 0.341176, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0.227451, 0.72549, 0.603922, 1)
+corner_radius_top_left = 20
+corner_radius_top_right = 20
+corner_radius_bottom_right = 20
+corner_radius_bottom_left = 20
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_y83dj"]
+content_margin_left = 10.0
+content_margin_top = 4.0
+content_margin_right = 10.0
+content_margin_bottom = 4.0
+bg_color = Color(0.0784314, 0.109804, 0.129412, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0.960784, 0.960784, 0.960784, 1)
+corner_radius_top_left = 20
+corner_radius_top_right = 20
+corner_radius_bottom_right = 20
+corner_radius_bottom_left = 20
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_slf6e"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_lekqh"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_dr4n4"]
+content_margin_bottom = 20.0
+bg_color = Color(0.0784314, 0.109804, 0.129412, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0.227451, 0.72549, 0.603922, 1)
+
+[node name="UpdateButton" type="Button"]
+visible = false
+offset_left = 1.0
+offset_right = 149.0
+offset_bottom = 28.0
+size_flags_vertical = 3
+theme_override_colors/font_color = Color(0.960784, 0.960784, 0.960784, 1)
+theme_override_colors/font_hover_color = Color(0.939288, 0.917743, 0.892615, 1)
+theme_override_colors/icon_normal_color = Color(0.960784, 0.960784, 0.960784, 1)
+theme_override_fonts/font = ExtResource("1_5e5k4")
+theme_override_font_sizes/font_size = 14
+theme_override_styles/normal = SubResource("StyleBoxFlat_c7fd1")
+theme_override_styles/hover = SubResource("StyleBoxFlat_y83dj")
+theme_override_styles/pressed = SubResource("StyleBoxEmpty_slf6e")
+theme_override_styles/focus = SubResource("StyleBoxEmpty_lekqh")
+text = "Update available"
+icon = ExtResource("2_c4d83")
+script = ExtResource("1_xtaw5")
+
+[node name="HTTPRequest" type="HTTPRequest" parent="."]
+unique_name_in_owner = true
+
+[node name="DownloadDialog" type="AcceptDialog" parent="."]
+unique_name_in_owner = true
+transparent_bg = true
+title = "New Update"
+initial_position = 2
+size = Vector2i(450, 480)
+transient = false
+unresizable = true
+borderless = true
+keep_title_visible = false
+content_scale_mode = 1
+theme_override_constants/buttons_separation = 30
+theme_override_styles/panel = SubResource("StyleBoxFlat_dr4n4")
+ok_button_text = "Close"
+
+[node name="DownloadUpdatePanel" parent="DownloadDialog" instance=ExtResource("2_vtgcx")]
+unique_name_in_owner = true
+offset_left = 2.0
+offset_top = 2.0
+offset_right = -2.0
+offset_bottom = -80.0
+
+[node name="NeedsReloadDialog" type="ConfirmationDialog" parent="."]
+unique_name_in_owner = true
+
+[node name="UpdateFailedDialog" type="AcceptDialog" parent="."]
+unique_name_in_owner = true
diff --git a/addons/phantom_camera/panel/viewfinder/deadzone_style_box.tres b/addons/phantom_camera/panel/viewfinder/deadzone_style_box.tres
new file mode 100644 (file)
index 0000000..7353299
--- /dev/null
@@ -0,0 +1,14 @@
+[gd_resource type="StyleBoxFlat" format=3 uid="uid://dpa7yvxlq043a"]
+
+[resource]
+bg_color = Color(0.227451, 0.72549, 0.603922, 0.2)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0.227451, 0.72549, 0.603922, 1)
+corner_detail = 1
+expand_margin_left = 1.0
+expand_margin_top = 1.0
+expand_margin_right = 1.0
+expand_margin_bottom = 1.0
diff --git a/addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn b/addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn
new file mode 100644 (file)
index 0000000..5d26888
--- /dev/null
@@ -0,0 +1,445 @@
+[gd_scene load_steps=22 format=3 uid="uid://dbkr3d716wtx0"]
+
+[ext_resource type="Script" path="res://addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd" id="1_utvi8"]
+[ext_resource type="StyleBox" uid="uid://dpa7yvxlq043a" path="res://addons/phantom_camera/panel/viewfinder/deadzone_style_box.tres" id="2_uabt4"]
+[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="3_li3i3"]
+[ext_resource type="Texture2D" uid="uid://5fatldiu7dd5" path="res://addons/phantom_camera/icons/phantom_camera_host.svg" id="4_lcg1p"]
+[ext_resource type="FontFile" uid="uid://dve7mgsjik4dg" path="res://addons/phantom_camera/fonts/Nunito-Regular.ttf" id="5_4jhax"]
+[ext_resource type="Texture2D" uid="uid://dy8eifa6aw2en" path="res://addons/phantom_camera/icons/misc/PriorityOverride.svg" id="6_ptuth"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fle8t"]
+bg_color = Color(0.227451, 0.72549, 0.603922, 0.2)
+draw_center = false
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0.227451, 0.72549, 0.603922, 1)
+corner_detail = 1
+expand_margin_left = 1.0
+expand_margin_top = 1.0
+expand_margin_right = 1.0
+expand_margin_bottom = 1.0
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_xmo1t"]
+draw_center = false
+border_width_left = 1
+border_width_top = 1
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(0.745098, 0.858824, 0.380392, 1)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_q7vs4"]
+bg_color = Color(0.929412, 0.87451, 0.619608, 1)
+border_width_left = 1
+border_width_top = 1
+border_width_right = 1
+border_width_bottom = 1
+border_color = Color(0, 0, 0, 1)
+corner_radius_top_left = 10
+corner_radius_top_right = 10
+corner_radius_bottom_right = 10
+corner_radius_bottom_left = 10
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_iho1a"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_obaj6"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fsxik"]
+content_margin_left = 10.0
+content_margin_top = 10.0
+content_margin_right = 10.0
+content_margin_bottom = 10.0
+bg_color = Color(0.129412, 0.407843, 0.337255, 1)
+border_width_left = 4
+border_width_top = 4
+border_width_right = 4
+border_width_bottom = 4
+border_color = Color(0.227451, 0.72549, 0.603922, 1)
+corner_radius_top_left = 10
+corner_radius_top_right = 10
+corner_radius_bottom_right = 10
+corner_radius_bottom_left = 10
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yh38y"]
+content_margin_left = 10.0
+content_margin_top = 10.0
+content_margin_right = 10.0
+content_margin_bottom = 10.0
+bg_color = Color(0.129412, 0.407843, 0.337255, 1)
+border_width_left = 4
+border_width_top = 4
+border_width_right = 4
+border_width_bottom = 4
+border_color = Color(0.552941, 0.647059, 0.952941, 1)
+corner_radius_top_left = 10
+corner_radius_top_right = 10
+corner_radius_bottom_right = 10
+corner_radius_bottom_left = 10
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_gci88"]
+content_margin_left = 10.0
+content_margin_top = 10.0
+content_margin_right = 10.0
+content_margin_bottom = 10.0
+bg_color = Color(0.180392, 0.576471, 0.482353, 1)
+corner_radius_top_left = 10
+corner_radius_top_right = 10
+corner_radius_bottom_right = 10
+corner_radius_bottom_left = 10
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4b76l"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_g5wua"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_x4bx8"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_agqdu"]
+bg_color = Color(0.72549, 0.227451, 0.34902, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_blend = true
+corner_radius_top_left = 10
+corner_radius_top_right = 10
+corner_radius_bottom_right = 10
+corner_radius_bottom_left = 10
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ja3vm"]
+bg_color = Color(0.53, 0.1643, 0.255725, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_blend = true
+corner_radius_top_left = 10
+corner_radius_top_right = 10
+corner_radius_bottom_right = 10
+corner_radius_bottom_left = 10
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mk273"]
+bg_color = Color(0.43, 0.1333, 0.207475, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_blend = true
+corner_radius_top_left = 10
+corner_radius_top_right = 10
+corner_radius_bottom_right = 10
+corner_radius_bottom_left = 10
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_840sd"]
+
+[node name="ViewfinderPanel" type="Control"]
+clip_contents = true
+custom_minimum_size = Vector2(0, 300)
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+mouse_filter = 2
+script = ExtResource("1_utvi8")
+
+[node name="FramedViewfinder" type="Control" parent="."]
+unique_name_in_owner = true
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+metadata/_edit_lock_ = true
+
+[node name="SubViewportContainer" type="SubViewportContainer" parent="FramedViewfinder"]
+unique_name_in_owner = true
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+stretch = true
+
+[node name="SubViewport" type="SubViewport" parent="FramedViewfinder/SubViewportContainer"]
+unique_name_in_owner = true
+handle_input_locally = false
+gui_disable_input = true
+size = Vector2i(1152, 648)
+size_2d_override_stretch = true
+render_target_update_mode = 4
+
+[node name="Camera2D" type="Camera2D" parent="FramedViewfinder/SubViewportContainer/SubViewport"]
+unique_name_in_owner = true
+editor_draw_screen = false
+
+[node name="DeadZoneHBoxContainer" type="HBoxContainer" parent="FramedViewfinder"]
+unique_name_in_owner = true
+clip_contents = true
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/separation = 0
+
+[node name="DeadZoneLeftHBoxContainer" type="VBoxContainer" parent="FramedViewfinder/DeadZoneHBoxContainer"]
+clip_contents = true
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_constants/separation = 0
+
+[node name="DeadZoneLeftTopPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneLeftHBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_styles/panel = ExtResource("2_uabt4")
+
+[node name="DeadZoneLeftCenterPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneLeftHBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+theme_override_styles/panel = ExtResource("2_uabt4")
+
+[node name="DeadZoneLeftBottomPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneLeftHBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_styles/panel = ExtResource("2_uabt4")
+
+[node name="DeadZoneCenterHBoxContainer" type="VBoxContainer" parent="FramedViewfinder/DeadZoneHBoxContainer"]
+unique_name_in_owner = true
+clip_contents = true
+layout_mode = 2
+size_flags_horizontal = 4
+theme_override_constants/separation = 0
+
+[node name="DeadZoneCenterTopPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneCenterHBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_styles/panel = ExtResource("2_uabt4")
+
+[node name="DeadZoneCenterCenterPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneCenterHBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_vertical = 4
+theme_override_styles/panel = SubResource("StyleBoxFlat_fle8t")
+
+[node name="DeadZoneCenterBottomPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneCenterHBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_styles/panel = ExtResource("2_uabt4")
+
+[node name="DeadZoneRightHBoxContainer" type="VBoxContainer" parent="FramedViewfinder/DeadZoneHBoxContainer"]
+clip_contents = true
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_constants/separation = 0
+
+[node name="DeadZoneRightTopPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneRightHBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_styles/panel = ExtResource("2_uabt4")
+
+[node name="DeadZoneRightCenterPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneRightHBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+theme_override_styles/panel = ExtResource("2_uabt4")
+
+[node name="DeadZoneRightBottomPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneRightHBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_styles/panel = ExtResource("2_uabt4")
+
+[node name="AspectRatioContainer" type="AspectRatioContainer" parent="FramedViewfinder"]
+unique_name_in_owner = true
+clip_contents = true
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+ratio = 1.77778
+
+[node name="CameraViewportPanel" type="Panel" parent="FramedViewfinder/AspectRatioContainer"]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_xmo1t")
+
+[node name="TargetPoint" type="Panel" parent="FramedViewfinder/AspectRatioContainer/CameraViewportPanel"]
+unique_name_in_owner = true
+layout_mode = 1
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -3.0
+offset_top = -3.0
+offset_right = 3.0
+offset_bottom = 3.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_q7vs4")
+
+[node name="NoSupportMsg" type="Label" parent="."]
+unique_name_in_owner = true
+visible = false
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_top = -8.0
+offset_bottom = -8.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_fonts/font = ExtResource("3_li3i3")
+theme_override_font_sizes/font_size = 24
+theme_override_styles/normal = SubResource("StyleBoxEmpty_iho1a")
+text = "Control scenes are not supported"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="EmptyStateControl" type="Control" parent="."]
+unique_name_in_owner = true
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="BGColorRect" type="ColorRect" parent="EmptyStateControl"]
+visible = false
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+color = Color(0, 0, 0, 1)
+metadata/_edit_lock_ = true
+
+[node name="VBoxContainer" type="VBoxContainer" parent="EmptyStateControl"]
+layout_mode = 1
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -200.0
+offset_top = -112.0
+offset_right = 200.0
+offset_bottom = 112.0
+grow_horizontal = 2
+grow_vertical = 2
+alignment = 1
+
+[node name="EmptyStateIcon" type="TextureRect" parent="EmptyStateControl/VBoxContainer"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(0, 64)
+layout_mode = 2
+texture = ExtResource("4_lcg1p")
+expand_mode = 1
+stretch_mode = 5
+
+[node name="EmptyStateText" type="RichTextLabel" parent="EmptyStateControl/VBoxContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+theme_override_colors/default_color = Color(1, 1, 1, 1)
+theme_override_fonts/normal_font = ExtResource("5_4jhax")
+theme_override_fonts/bold_font = ExtResource("3_li3i3")
+theme_override_font_sizes/normal_font_size = 24
+theme_override_font_sizes/bold_font_size = 24
+theme_override_styles/focus = SubResource("StyleBoxEmpty_obaj6")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_iho1a")
+bbcode_enabled = true
+text = "[center][b]NodeType[/b] Description [/center]"
+fit_content = true
+
+[node name="AddNodeButton" type="Button" parent="EmptyStateControl/VBoxContainer"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(400, 54)
+layout_mode = 2
+size_flags_horizontal = 4
+focus_mode = 0
+theme_override_colors/font_color = Color(1, 1, 1, 1)
+theme_override_fonts/font = ExtResource("3_li3i3")
+theme_override_font_sizes/font_size = 24
+theme_override_styles/normal = SubResource("StyleBoxFlat_fsxik")
+theme_override_styles/hover = SubResource("StyleBoxFlat_yh38y")
+theme_override_styles/pressed = SubResource("StyleBoxFlat_gci88")
+theme_override_styles/focus = SubResource("StyleBoxEmpty_4b76l")
+
+[node name="AddNodeTypeText" type="RichTextLabel" parent="EmptyStateControl/VBoxContainer/AddNodeButton"]
+unique_name_in_owner = true
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_top = 9.0
+offset_bottom = -11.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme_override_colors/default_color = Color(1, 1, 1, 1)
+theme_override_fonts/normal_font = ExtResource("5_4jhax")
+theme_override_fonts/bold_font = ExtResource("3_li3i3")
+theme_override_font_sizes/normal_font_size = 24
+theme_override_font_sizes/bold_font_size = 24
+theme_override_styles/focus = SubResource("StyleBoxEmpty_g5wua")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_x4bx8")
+bbcode_enabled = true
+text = "[center]Add [img=32]res://addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg[/img] [b]{NodeType}[/b][/center]"
+scroll_active = false
+
+[node name="PriorityOverrideButton" type="Button" parent="."]
+unique_name_in_owner = true
+visible = false
+layout_mode = 1
+offset_left = 5.0
+offset_top = 5.0
+offset_right = 165.0
+offset_bottom = 57.0
+mouse_default_cursor_shape = 2
+theme_override_styles/normal = SubResource("StyleBoxFlat_agqdu")
+theme_override_styles/hover = SubResource("StyleBoxFlat_ja3vm")
+theme_override_styles/pressed = SubResource("StyleBoxFlat_mk273")
+theme_override_styles/focus = SubResource("StyleBoxEmpty_840sd")
+
+[node name="PriorityOverrideIcon" type="TextureRect" parent="PriorityOverrideButton"]
+layout_mode = 1
+offset_left = 8.0
+offset_top = 4.0
+offset_right = 32.0
+offset_bottom = 28.0
+texture = ExtResource("6_ptuth")
+expand_mode = 1
+
+[node name="PriorityOverrideByLabel" type="Label" parent="PriorityOverrideButton"]
+layout_mode = 0
+offset_left = 30.0
+offset_top = 1.0
+offset_right = 140.0
+offset_bottom = 24.0
+theme_override_fonts/font = ExtResource("3_li3i3")
+theme_override_font_sizes/font_size = 14
+text = "OVERRIDDEN BY"
+vertical_alignment = 1
+
+[node name="PriorityOverrideNameLabel" type="Label" parent="PriorityOverrideButton"]
+unique_name_in_owner = true
+layout_mode = 0
+offset_left = 6.0
+offset_top = 21.0
+offset_right = 153.0
+offset_bottom = 44.0
+theme_override_fonts/font = ExtResource("5_4jhax")
+theme_override_font_sizes/font_size = 14
+text = "PCam_Name
+"
+vertical_alignment = 1
+text_overrun_behavior = 3
diff --git a/addons/phantom_camera/plugin.cfg b/addons/phantom_camera/plugin.cfg
new file mode 100644 (file)
index 0000000..dd90728
--- /dev/null
@@ -0,0 +1,7 @@
+[plugin]
+
+name="Phantom Camera"
+description="Control the movement and dynamically tween 2D & 3D cameras positions. Built for Godot 4. Inspired by Cinemachine."
+author="Marcus Skov"
+version="0.7.2.1"
+script="plugin.gd"
diff --git a/addons/phantom_camera/plugin.gd b/addons/phantom_camera/plugin.gd
new file mode 100644 (file)
index 0000000..e4759de
--- /dev/null
@@ -0,0 +1,124 @@
+@tool
+extends EditorPlugin
+
+#region Constants
+
+const PCAM_HOST: String = "PhantomCameraHost"
+const PCAM_2D: String = "PhantomCamera2D"
+const PCAM_3D: String = "PhantomCamera3D"
+
+const Pcam3DPlugin = preload("res://addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd")
+
+const EditorPanel = preload("res://addons/phantom_camera/panel/editor.tscn")
+
+const updater_constants := preload("res://addons/phantom_camera/scripts/panel/updater/updater_constants.gd")
+
+const PHANTOM_CAMERA_MANAGER: StringName = "PhantomCameraManager"
+
+#endregion
+
+
+#region Variables
+
+var pcam_3D_gizmo_plugin = Pcam3DPlugin.new()
+
+var editor_panel_instance: Control
+var panel_button: Button
+#var viewfinder_panel_instance
+
+#endregion
+
+
+#region Private Functions
+
+func _enter_tree() -> void:
+       add_autoload_singleton(PHANTOM_CAMERA_MANAGER, "res://addons/phantom_camera/scripts/managers/phantom_camera_manager.gd")
+
+       # Phantom Camera Nodes
+       add_custom_type(PCAM_2D, "Node2D", preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_2d.svg"))
+       add_custom_type(PCAM_3D, "Node3D", preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_2d.svg"))
+       add_custom_type(PCAM_HOST, "Node", preload("res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_2d.svg"))
+
+
+       # Phantom Camera 3D Gizmo
+       add_node_3d_gizmo_plugin(pcam_3D_gizmo_plugin)
+
+       # TODO - Should be disabled unless in editor
+       # Viewfinder
+       editor_panel_instance = EditorPanel.instantiate()
+       editor_panel_instance.editor_plugin = self
+       panel_button = add_control_to_bottom_panel(editor_panel_instance, "Phantom Camera")
+
+       # Trigger events in the viewfinder whenever
+       panel_button.toggled.connect(_btn_toggled)
+
+       scene_changed.connect(editor_panel_instance.viewfinder.scene_changed)
+
+       scene_changed.connect(_scene_changed)
+
+       ## Sets Updater Disabling option for non-forked projects
+       if not FileAccess.file_exists("res://dev_scenes/3d/dev_scene_3d.tscn"):
+               if not ProjectSettings.has_setting(updater_constants.setting_updater_enabled):
+                       ProjectSettings.set_setting(updater_constants.setting_updater_enabled, true)
+               ProjectSettings.set_initial_value(updater_constants.setting_updater_enabled, true)
+
+       ## Adds Release console log disabler
+       if not ProjectSettings.has_setting(updater_constants.setting_updater_notify_release):
+               ProjectSettings.set_setting(updater_constants.setting_updater_notify_release, true)
+       ProjectSettings.set_initial_value(updater_constants.setting_updater_notify_release, true)
+
+       ## Enables or disable
+       if not ProjectSettings.has_setting("phantom_camera/tips/show_jitter_tips"):
+               ProjectSettings.set_setting("phantom_camera/tips/show_jitter_tips", true)
+       ProjectSettings.set_initial_value("phantom_camera/tips/show_jitter_tips", true)
+
+
+func _btn_toggled(toggled_on: bool):
+       if toggled_on:
+               editor_panel_instance.viewfinder.viewfinder_visible = true
+               editor_panel_instance.viewfinder.visibility_check()
+       else:
+               editor_panel_instance.viewfinder.viewfinder_visible = false
+
+
+func _exit_tree() -> void:
+       remove_custom_type(PCAM_2D)
+       remove_custom_type(PCAM_3D)
+       remove_custom_type(PCAM_HOST)
+
+       remove_node_3d_gizmo_plugin(pcam_3D_gizmo_plugin)
+
+       remove_control_from_bottom_panel(editor_panel_instance)
+       editor_panel_instance.queue_free()
+#      if framed_viewfinder_panel_instance:
+       scene_changed.disconnect(_scene_changed)
+
+       remove_autoload_singleton(PHANTOM_CAMERA_MANAGER)
+
+       panel_button.toggled.disconnect(_btn_toggled)
+       scene_changed.disconnect(editor_panel_instance.viewfinder.scene_changed)
+       scene_changed.disconnect(_scene_changed)
+
+#func _has_main_screen():
+#      return true;
+
+
+func _make_visible(visible):
+       if editor_panel_instance:
+               editor_panel_instance.set_visible(visible)
+
+
+func _scene_changed(scene_root: Node) -> void:
+       editor_panel_instance.viewfinder.scene_changed(scene_root)
+
+#endregion
+
+
+#region Public Functions
+
+func get_version() -> String:
+       var config: ConfigFile = ConfigFile.new()
+       config.load(get_script().resource_path.get_base_dir() + "/plugin.cfg")
+       return config.get_value("plugin", "version")
+
+#endregion
diff --git a/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd b/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd
new file mode 100644 (file)
index 0000000..8a53e05
--- /dev/null
@@ -0,0 +1,72 @@
+@tool
+extends Node
+
+const PHANTOM_CAMERA_CONSTS = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd")
+
+var phantom_camera_hosts: Array[PhantomCameraHost]:
+       get:
+               return _phantom_camera_host_list
+var _phantom_camera_host_list: Array[PhantomCameraHost]
+
+var phantom_camera_2ds: Array[PhantomCamera2D]:
+       get:
+               return _phantom_camera_2d_list
+var _phantom_camera_2d_list: Array[PhantomCamera2D]
+
+var phantom_camera_3ds: Array: ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed.
+       get:
+               return _phantom_camera_3d_list
+var _phantom_camera_3d_list: Array ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed.
+
+
+func _enter_tree():
+       Engine.physics_jitter_fix = 0
+
+
+func pcam_host_added(caller: Node) -> void:
+       if is_instance_of(caller, PhantomCameraHost):
+               _phantom_camera_host_list.append(caller)
+       else:
+               printerr("This method can only be called from a PhantomCameraHost node")
+
+func pcam_host_removed(caller: Node) -> void:
+       if is_instance_of(caller, PhantomCameraHost):
+               _phantom_camera_host_list.erase(caller)
+       else:
+               printerr("This method can only be called from a PhantomCameraHost node")
+
+
+func pcam_added(caller, host_slot: int = 0) -> void:
+       if is_instance_of(caller, PhantomCamera2D):
+               _phantom_camera_2d_list.append(caller)
+               #print("Added PCam2D to PCamManager")
+       elif caller.is_class("PhantomCamera3D"): ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed.
+               _phantom_camera_3d_list.append(caller)
+               #print("Added PCam3D to PCamManager")
+
+       if not _phantom_camera_host_list.is_empty():
+               _phantom_camera_host_list[host_slot].pcam_added_to_scene(caller)
+
+func pcam_removed(caller) -> void:
+       if is_instance_of(caller, PhantomCamera2D):
+               _phantom_camera_2d_list.erase(caller)
+       elif caller.is_class("PhantomCamera3D"): ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed.
+               _phantom_camera_3d_list.erase(caller)
+       else:
+               printerr("This method can only be called from a PhantomCamera node")
+
+
+func get_phantom_camera_hosts() -> Array[PhantomCameraHost]:
+       return _phantom_camera_host_list
+
+func get_phantom_camera_2ds() -> Array[PhantomCamera2D]:
+       return _phantom_camera_2d_list
+
+func get_phantom_camera_3ds() -> Array: ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed.
+       return _phantom_camera_3d_list
+
+
+func scene_changed() -> void:
+       _phantom_camera_2d_list.clear()
+       _phantom_camera_3d_list.clear()
+       _phantom_camera_host_list.clear()
diff --git a/addons/phantom_camera/scripts/panel/updater/download_update_panel.gd b/addons/phantom_camera/scripts/panel/updater/download_update_panel.gd
new file mode 100644 (file)
index 0000000..b19beb9
--- /dev/null
@@ -0,0 +1,162 @@
+#######################################################################
+# Credit goes to the Dialogue Manager plugin for this script
+# Check it out at: https://github.com/nathanhoad/godot_dialogue_manager
+#######################################################################
+
+@tool
+extends Control
+
+#region Constants
+
+const TEMP_FILE_NAME = "user://temp.zip"
+
+#endregion
+
+
+#region Signals
+
+signal failed()
+signal updated(updated_to_version: String)
+
+#endregion
+
+
+#region @onready
+
+#@onready var logo: TextureRect = %Logo
+@onready var _download_verion: Label = %DownloadVersionLabel
+@onready var _download_http_request: HTTPRequest = %DownloadHTTPRequest
+@onready var _download_button: Button = %DownloadButton
+@onready var _download_button_bg: NinePatchRect = %DownloadButtonBG
+@onready var _download_label: Label = %UpdateLabel
+
+@onready var _breaking_label: Label = %BreakingLabel
+@onready var _breaking_margin_container: MarginContainer = %BreakingMarginContainer
+@onready var _breaking_options_button: OptionButton = %BreakingOptionButton
+#@onready var current_version_label: Label = %CurrentVersionLabel
+
+#endregion
+
+
+#region Variables
+
+# Todo - For 4.2 upgrade - Shows current version
+var _download_dialogue: AcceptDialog
+var _button_texture_default: Texture2D = load("res://addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png")
+var _button_texture_hover: Texture2D = load("res://addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png")
+
+var next_version_release: Dictionary:
+       set(value):
+               next_version_release = value
+               _download_verion.text = "%s update is available for download" % value.tag_name.substr(1)
+               # Todo - For 4.2 upgrade
+               #current_version_label.text = "Current version is " + editor_plugin.get_version()
+       get:
+               return next_version_release
+
+var _breaking_window_height: float = 520
+var _breaking_window_height_update: float = 600
+
+#endregion
+
+
+#region Private Functions
+
+func _ready() -> void:
+       _download_http_request.request_completed.connect(_on_http_request_request_completed)
+       _download_button.pressed.connect(_on_download_button_pressed)
+       _download_button.mouse_entered.connect(_on_mouse_entered)
+       _download_button.mouse_exited.connect(_on_mouse_exited)
+
+       _breaking_label.hide()
+       _breaking_margin_container.hide()
+       _breaking_options_button.hide()
+
+       _breaking_options_button.item_selected.connect(_on_item_selected)
+
+
+func _on_item_selected(index: int) -> void:
+       if index == 1:
+               _download_button.show()
+               _download_dialogue.size = Vector2(_download_dialogue.size.x, _breaking_window_height_update)
+       else:
+               _download_button.hide()
+               _download_dialogue.size = Vector2(_download_dialogue.size.x, _breaking_window_height)
+
+
+func _on_download_button_pressed() -> void:
+       _download_http_request.request(next_version_release.zipball_url)
+       _download_button.disabled = true
+       _download_label.text = "Downloading..."
+       _download_button_bg.hide()
+
+
+func _on_mouse_entered() -> void:
+       _download_button_bg.set_texture(_button_texture_hover)
+
+
+func _on_mouse_exited() -> void:
+       _download_button_bg.set_texture(_button_texture_default)
+
+
+func _on_http_request_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void:
+       if result != HTTPRequest.RESULT_SUCCESS:
+               failed.emit()
+               return
+
+       # Save the downloaded zip
+       var zip_file: FileAccess = FileAccess.open(TEMP_FILE_NAME, FileAccess.WRITE)
+       zip_file.store_buffer(body)
+       zip_file.close()
+
+       OS.move_to_trash(ProjectSettings.globalize_path("res://addons/phantom_camera"))
+
+       var zip_reader: ZIPReader = ZIPReader.new()
+       zip_reader.open(TEMP_FILE_NAME)
+       var files: PackedStringArray = zip_reader.get_files()
+
+       var base_path = files[1]
+       # Remove archive folder
+       files.remove_at(0)
+       # Remove assets folder
+       files.remove_at(0)
+
+       for path in files:
+               var new_file_path: String = path.replace(base_path, "")
+               if path.ends_with("/"):
+                       DirAccess.make_dir_recursive_absolute("res://addons/%s" % new_file_path)
+               else:
+                       var file: FileAccess = FileAccess.open("res://addons/%s" % new_file_path, FileAccess.WRITE)
+                       file.store_buffer(zip_reader.read_file(path))
+
+       zip_reader.close()
+       DirAccess.remove_absolute(TEMP_FILE_NAME)
+
+       updated.emit(next_version_release.tag_name.substr(1))
+
+
+func _on_notes_button_pressed() -> void:
+       OS.shell_open(next_version_release.html_url)
+
+#endregion
+
+#region Public Functions
+
+func show_updater_warning(next_version_number: Array, current_version_number: Array) -> void:
+       var current_version_number_0: int = current_version_number[0] as int
+       var current_version_number_1: int = current_version_number[1] as int
+
+       var next_version_number_0: int = next_version_number[0] as int # Major release number in the new release
+       var next_version_number_1: int = next_version_number[1] as int # Minor release number in the new release
+
+       if next_version_number_0 > current_version_number_0 or \
+       next_version_number_1 > current_version_number_1:
+               _breaking_label.show()
+               _breaking_margin_container.show()
+               _breaking_options_button.show()
+               _download_button.hide()
+
+               _download_dialogue = get_parent()
+               _download_dialogue.size = Vector2(_download_dialogue.size.x, _breaking_window_height)
+
+#endregion
diff --git a/addons/phantom_camera/scripts/panel/updater/update_button.gd b/addons/phantom_camera/scripts/panel/updater/update_button.gd
new file mode 100644 (file)
index 0000000..965e394
--- /dev/null
@@ -0,0 +1,175 @@
+#######################################################################
+# Credit goes to the Dialogue Manager plugin for this script
+# Check it out at: https://github.com/nathanhoad/godot_dialogue_manager
+#######################################################################
+
+@tool
+extends Button
+
+#region Constants
+
+const REMOTE_RELEASE_URL: StringName = "https://api.github.com/repos/ramokz/phantom-camera/releases"
+const UPDATER_CONSTANTS := preload("res://addons/phantom_camera/scripts/panel/updater/updater_constants.gd")
+
+#endregion
+
+
+#region @onready
+
+@onready var http_request: HTTPRequest = %HTTPRequest
+@onready var download_dialog: AcceptDialog = %DownloadDialog
+@onready var download_update_panel: Control = %DownloadUpdatePanel
+@onready var needs_reload_dialog: AcceptDialog = %NeedsReloadDialog
+@onready var update_failed_dialog: AcceptDialog = %UpdateFailedDialog
+
+#endregion
+
+
+#region Variables
+
+# The main editor plugin
+var editor_plugin: EditorPlugin
+
+var needs_reload: bool = false
+
+# A lambda that gets called just before refreshing the plugin. Return false to stop the reload.
+var on_before_refresh: Callable = func(): return true
+
+#endregion
+
+
+#region Private Functions
+
+func _ready() -> void:
+       hide()
+
+       # Check for updates on GitHub Releases
+       check_for_update()
+
+       pressed.connect(_on_update_button_pressed)
+       http_request.request_completed.connect(_request_request_completed)
+       download_update_panel.updated.connect(_on_download_update_panel_updated)
+       needs_reload_dialog.confirmed.connect(_on_needs_reload_dialog_confirmed)
+
+
+func _request_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void:
+       if result != HTTPRequest.RESULT_SUCCESS: return
+
+       if not editor_plugin: return
+       var current_version: String = editor_plugin.get_version()
+
+       # Work out the next version from the releases information on GitHub
+       var response: Array = JSON.parse_string(body.get_string_from_utf8())
+       if typeof(response) != TYPE_ARRAY: return
+
+       # GitHub releases are in order of creation, not order of version
+       var versions: Array = response.filter(func(release):
+               var version: String = release.tag_name.substr(1)
+               return version_to_number(version) > version_to_number(current_version)
+       )
+
+       if versions.size() > 0:
+               # Safeguard forks from being updated itself
+               if FileAccess.file_exists("res://dev_scenes/3d/dev_scene_3d.tscn") or \
+                       not ProjectSettings.get_setting(UPDATER_CONSTANTS.setting_updater_enabled):
+
+                       if not ProjectSettings.get_setting(UPDATER_CONSTANTS.setting_updater_notify_release): return
+
+                       print_rich("
+[color=#3AB99A]   ********[/color]
+[color=#3AB99A] ************[/color]
+[color=#3AB99A]**************[/color]
+[color=#3AB99A]******  ***  *[/color]
+[color=#3AB99A]******  ***[/color]
+[color=#3AB99A]**********      *****[/color]
+[color=#3AB99A]********   ***********[/color]
+[color=#3AB99A]********  ***********  **[/color]
+[color=#3AB99A]*********  **************[/color]
+[color=#3AB99A]**********  *************[/color]
+[color=#3AB99A]**  **  **   *******   **[/color]
+[font_size=18][b]New Phantom Camera version is available[/b][/font_size]")
+
+                       if FileAccess.file_exists("res://dev_scenes/3d/dev_scene_3d.tscn"):
+                               print_rich("[font_size=14][color=#EAA15E][b]As you're using a fork of the project, you will need to update it manually[/b][/color][/font_size]")
+
+                       print_rich("[font_size=12]If you don't want to see this message, then it can be disabled inside:\n[code]Project Settings/Phantom Camera/Updater/Show New Release Info on Editor Launch in Output[/code]")
+
+                       return
+
+               download_update_panel.next_version_release = versions[0]
+               download_update_panel.show_updater_warning(
+                       versions[0].tag_name.substr(1).split("."),
+                       current_version.split(".")
+               )
+               _set_scale()
+               editor_plugin.panel_button.add_theme_color_override("font_color", Color("#3AB99A"))
+               editor_plugin.panel_button.icon = load("res://addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg")
+               editor_plugin.panel_button.add_theme_color_override("icon_normal_color", Color("#3AB99A"))
+               show()
+
+
+func _on_update_button_pressed() -> void:
+       if needs_reload:
+               var will_refresh = on_before_refresh.call()
+               if will_refresh:
+                       EditorInterface.restart_editor(true)
+       else:
+               _set_scale()
+               download_dialog.popup_centered()
+
+
+func _set_scale() -> void:
+       var scale: float = EditorInterface.get_editor_scale()
+       download_dialog.min_size = Vector2(300, 250) * scale
+
+
+func _on_download_dialog_close_requested() -> void:
+       download_dialog.hide()
+
+
+func _on_download_update_panel_updated(updated_to_version: String) -> void:
+       download_dialog.hide()
+
+       needs_reload_dialog.dialog_text = "Reload to finish update"
+       needs_reload_dialog.ok_button_text = "Reload"
+       needs_reload_dialog.cancel_button_text = "Cancel"
+       needs_reload_dialog.popup_centered()
+
+       needs_reload = true
+       text = "Reload Project"
+
+
+func _on_download_update_panel_failed() -> void:
+       download_dialog.hide()
+       update_failed_dialog.dialog_text = "Updated Failed"
+       update_failed_dialog.popup_centered()
+
+
+func _on_needs_reload_dialog_confirmed() -> void:
+       EditorInterface.restart_editor(true)
+
+
+func _on_timer_timeout() -> void:
+       if not needs_reload:
+               check_for_update()
+
+#endregion
+
+
+#region Public Functions
+
+# Convert a version number to an actually comparable number
+func version_to_number(version: String) -> int:
+       var bits = version.split(".")
+       var version_bit: int
+       var multiplier: int = 10000
+       for i in bits.size():
+               version_bit += bits[i].to_int() * multiplier / (10 ** (i))
+
+       return version_bit
+
+
+func check_for_update() -> void:
+       http_request.request(REMOTE_RELEASE_URL)
+
+#endregion
diff --git a/addons/phantom_camera/scripts/panel/updater/updater_constants.gd b/addons/phantom_camera/scripts/panel/updater/updater_constants.gd
new file mode 100644 (file)
index 0000000..2cd69cb
--- /dev/null
@@ -0,0 +1,9 @@
+extends RefCounted
+
+# Plugin Project Settings Sections
+const setting_phantom_camera: StringName = "phantom_camera/"
+const setting_updater_name: StringName = setting_phantom_camera + "updater/"
+
+# Updater Settings
+const setting_updater_enabled: StringName = setting_updater_name + "enable_updater"
+const setting_updater_notify_release: StringName = setting_updater_name + "show_new_release_info_on_editor_launch_in_output"
diff --git a/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd b/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd
new file mode 100644 (file)
index 0000000..c183876
--- /dev/null
@@ -0,0 +1,469 @@
+@tool
+extends Control
+
+#region Constants
+
+const _constants = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd")
+
+# TODO - Should be in a central location
+const _camera_2d_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg")
+const _camera_3d_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg")
+const _pcam_host_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/phantom_camera_host.svg")
+const _pcam_2D_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/phantom_camera_2d.svg")
+const _pcam_3D_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/phantom_camera_3d.svg")
+
+const _overlay_color_alpha: float = 0.3
+
+#endregion
+
+#region @onready
+
+@onready var dead_zone_center_hbox: VBoxContainer = %DeadZoneCenterHBoxContainer
+@onready var dead_zone_center_center_panel: Panel = %DeadZoneCenterCenterPanel
+@onready var dead_zone_left_center_panel: Panel = %DeadZoneLeftCenterPanel
+@onready var dead_zone_right_center_panel: Panel = %DeadZoneRightCenterPanel
+@onready var target_point: Panel = %TargetPoint
+
+@onready var aspect_ratio_container: AspectRatioContainer = %AspectRatioContainer
+@onready var camera_viewport_panel: Panel = aspect_ratio_container.get_child(0)
+@onready var _framed_viewfinder: Control = %FramedViewfinder
+@onready var _dead_zone_h_box_container: Control = %DeadZoneHBoxContainer
+@onready var sub_viewport: SubViewport = %SubViewport
+
+@onready var _empty_state_control: Control = %EmptyStateControl
+@onready var _empty_state_icon: Control = %EmptyStateIcon
+@onready var _empty_state_text: RichTextLabel = %EmptyStateText
+@onready var _add_node_button: Button = %AddNodeButton
+@onready var _add_node_button_text: RichTextLabel = %AddNodeTypeText
+
+@onready var _priority_override_button: Button = %PriorityOverrideButton
+@onready var _priority_override_name_label: Label = %PriorityOverrideNameLabel
+
+@onready var _camera_2d: Camera2D = %Camera2D
+
+#endregion
+
+#region Private Variables
+var _no_open_scene_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg")
+var _no_open_scene_string: String = "[b]2D[/b] or [b]3D[/b] scene open"
+
+var _selected_camera: Node
+var _active_pcam: Node
+
+var _is_2d: bool
+
+var root_node: Node
+
+#endregion
+
+#region Public variables
+
+var pcam_host_group: Array[PhantomCameraHost]
+
+var is_scene: bool
+
+var viewfinder_visible: bool
+
+var min_horizontal: float
+var max_horizontal: float
+var min_vertical: float
+var max_vertical: float
+
+var pcam_host: PhantomCameraHost
+
+#endregion
+
+
+#region Private Functions
+
+func _ready() -> void:
+       if not Engine.is_editor_hint():
+               set_process(true)
+               camera_viewport_panel.self_modulate.a = 0
+
+       root_node = get_tree().current_scene
+
+       if root_node is Node2D || root_node is Node3D:
+               %SubViewportContainer.set_visible(false)
+               if root_node is Node2D:
+                       _is_2d = true
+               else:
+                       _is_2d = false
+
+               _set_viewfinder(root_node, false)
+
+       if Engine.is_editor_hint():
+               # BUG - Both signals below are called whenever a noe is selected in the scenetree
+               # Should only be triggered whenever a node is added or removed.
+               get_tree().node_added.connect(_node_added_or_removed)
+               get_tree().node_removed.connect(_node_added_or_removed)
+       else:
+               _empty_state_control.set_visible(false)
+
+       _priority_override_button.set_visible(false)
+
+       # Triggered when viewport size is changed in Project Settings
+       ProjectSettings.settings_changed.connect(_settings_changed)
+
+
+func _exit_tree() -> void:
+       if Engine.is_editor_hint():
+               if get_tree().node_added.is_connected(_node_added_or_removed):
+                       get_tree().node_added.disconnect(_node_added_or_removed)
+                       get_tree().node_removed.disconnect(_node_added_or_removed)
+
+       if aspect_ratio_container.resized.is_connected(_resized):
+               aspect_ratio_container.resized.disconnect(_resized)
+
+       if _add_node_button.pressed.is_connected(visibility_check):
+               _add_node_button.pressed.disconnect(visibility_check)
+
+       if is_instance_valid(_active_pcam):
+               if _active_pcam.dead_zone_changed.is_connected(_on_dead_zone_changed):
+                       _active_pcam.dead_zone_changed.disconnect(_on_dead_zone_changed)
+
+       if _priority_override_button.pressed.is_connected(_select_override_pcam):
+               _priority_override_button.pressed.disconnect(_select_override_pcam)
+
+
+func _process(_delta: float) -> void:
+       if Engine.is_editor_hint() and not viewfinder_visible: return
+       if not is_instance_valid(_active_pcam): return
+
+       var unprojected_position_clamped: Vector2 = Vector2(
+               clamp(_active_pcam.viewport_position.x, min_horizontal, max_horizontal),
+               clamp(_active_pcam.viewport_position.y, min_vertical, max_vertical)
+       )
+
+       if not Engine.is_editor_hint():
+               target_point.position = camera_viewport_panel.size * unprojected_position_clamped - target_point.size / 2
+
+       if _is_2d:
+               if not is_instance_valid(pcam_host): return
+               if not is_instance_valid(pcam_host.camera_2d): return
+
+               var window_size_height: float = ProjectSettings.get_setting("display/window/size/viewport_height")
+               sub_viewport.size_2d_override = sub_viewport.size * (window_size_height / sub_viewport.size.y)
+
+               _camera_2d.global_transform = pcam_host.camera_2d.global_transform
+               _camera_2d.offset = pcam_host.camera_2d.offset
+               _camera_2d.zoom = pcam_host.camera_2d.zoom
+               _camera_2d.ignore_rotation = pcam_host.camera_2d.ignore_rotation
+               _camera_2d.anchor_mode = pcam_host.camera_2d.anchor_mode
+               _camera_2d.limit_left = pcam_host.camera_2d.limit_left
+               _camera_2d.limit_top = pcam_host.camera_2d.limit_top
+               _camera_2d.limit_right = pcam_host.camera_2d.limit_right
+               _camera_2d.limit_bottom = pcam_host.camera_2d.limit_bottom
+
+
+func _settings_changed() -> void:
+       var viewport_width: float = ProjectSettings.get_setting("display/window/size/viewport_width")
+       var viewport_height: float = ProjectSettings.get_setting("display/window/size/viewport_height")
+       var ratio: float = viewport_width / viewport_height
+       aspect_ratio_container.set_ratio(ratio)
+       camera_viewport_panel.size.x = viewport_width / (viewport_height / sub_viewport.size.y)
+       # TODO - Add resizer for Framed Viewfinder
+
+
+func _node_added_or_removed(_node: Node) -> void:
+       visibility_check()
+
+
+func visibility_check() -> void:
+       if not viewfinder_visible: return
+
+       var phantom_camera_host: PhantomCameraHost
+       var has_camera: bool = false
+       if not get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME).get_phantom_camera_hosts().is_empty():
+               has_camera = true
+               phantom_camera_host = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME).get_phantom_camera_hosts()[0]
+
+       var root: Node = EditorInterface.get_edited_scene_root()
+
+       if root is Node2D:
+               var camera_2d: Camera2D
+
+               if has_camera:
+                       camera_2d = phantom_camera_host.camera_2d
+               else:
+                       camera_2d = _get_camera_2d()
+
+               _is_2d = true
+               is_scene = true
+               _add_node_button.set_visible(true)
+               _check_camera(root, camera_2d, true)
+       elif root is Node3D:
+               var camera_3d: Camera3D
+
+               if has_camera:
+                       camera_3d = phantom_camera_host.camera_3d
+               else:
+                       camera_3d = root.get_viewport().get_camera_3d()
+
+               _is_2d = false
+               is_scene = true
+               _add_node_button.set_visible(true)
+               _check_camera(root, camera_3d, false)
+       else:
+               is_scene = false
+#              Is not a 2D or 3D scene
+               _set_empty_viewfinder_state(_no_open_scene_string, _no_open_scene_icon)
+               _add_node_button.set_visible(false)
+
+       if not _priority_override_button.pressed.is_connected(_select_override_pcam):
+               _priority_override_button.pressed.connect(_select_override_pcam)
+
+
+func _get_camera_2d() -> Camera2D:
+       var camerasGroupName = "__cameras_%d" % EditorInterface.get_edited_scene_root().get_viewport().get_viewport_rid().get_id()
+       var cameras = get_tree().get_nodes_in_group(camerasGroupName)
+
+       for camera in cameras:
+               if camera is Camera2D and camera.is_current:
+                       return camera
+       return null
+
+
+func _check_camera(root: Node, camera: Node, is_2D: bool) -> void:
+       var camera_string: String
+       var pcam_string: String
+       var color: Color
+       var color_alpha: Color
+       var camera_icon: CompressedTexture2D
+       var pcam_icon: CompressedTexture2D
+
+       if is_2D:
+               camera_string = _constants.CAMERA_2D_NODE_NAME
+               pcam_string = _constants.PCAM_2D_NODE_NAME
+               color = _constants.COLOR_2D
+               camera_icon = _camera_2d_icon
+               pcam_icon = _pcam_2D_icon
+       else:
+               camera_string = _constants.CAMERA_3D_NODE_NAME
+               pcam_string = _constants.PCAM_3D_NODE_NAME
+               color = _constants.COLOR_3D
+               camera_icon = _camera_3d_icon
+               pcam_icon = _pcam_3D_icon
+
+       if camera:
+#              Has Camera
+               if camera.get_children().size() > 0:
+                       for cam_child in camera.get_children():
+                               if cam_child is PhantomCameraHost:
+                                       pcam_host = cam_child
+
+                               if pcam_host:
+                                       if get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME).get_phantom_camera_2ds() or \
+                                       get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME).get_phantom_camera_3ds():
+                                               # Pcam exists in tree
+                                               _set_viewfinder(root, true)
+#                                                      if pcam_host.get_active_pcam().get_get_follow_mode():
+#                                                              _on_dead_zone_changed()
+
+                                               _set_viewfinder_state()
+
+                                               %NoSupportMsg.set_visible(false)
+
+                                       else:
+#                                              No PCam in scene
+                                               _update_button(pcam_string, pcam_icon, color)
+                                               _set_empty_viewfinder_state(pcam_string, pcam_icon)
+                               else:
+#                                      No PCamHost in scene
+                                       _update_button(_constants.PCAM_HOST_NODE_NAME, _pcam_host_icon, _constants.PCAM_HOST_COLOR)
+                                       _set_empty_viewfinder_state(_constants.PCAM_HOST_NODE_NAME, _pcam_host_icon)
+               else:
+#                      No PCamHost in scene
+                       _update_button(_constants.PCAM_HOST_NODE_NAME, _pcam_host_icon, _constants.PCAM_HOST_COLOR)
+                       _set_empty_viewfinder_state(_constants.PCAM_HOST_NODE_NAME, _pcam_host_icon)
+       else:
+#              No Camera
+               _update_button(camera_string, camera_icon, color)
+               _set_empty_viewfinder_state(camera_string, camera_icon)
+
+
+func _update_button(text: String, icon: CompressedTexture2D, color: Color) -> void:
+       _add_node_button_text.set_text("[center]Add [img=32]" + icon.resource_path + "[/img] [b]"+ text + "[/b][/center]");
+       var button_theme_hover: StyleBoxFlat = _add_node_button.get_theme_stylebox("hover")
+       button_theme_hover.border_color = color
+       _add_node_button.add_theme_stylebox_override("hover", button_theme_hover)
+
+
+func _set_viewfinder_state() -> void:
+       _empty_state_control.set_visible(false)
+
+       _framed_viewfinder.set_visible(true)
+
+       if is_instance_valid(_active_pcam):
+               if _active_pcam.get_follow_mode() == _active_pcam.FollowMode.FRAMED:
+                       _dead_zone_h_box_container.set_visible(true)
+                       target_point.set_visible(true)
+               else:
+                       _dead_zone_h_box_container.set_visible(false)
+                       target_point.set_visible(false)
+
+
+func _set_empty_viewfinder_state(text: String, icon: CompressedTexture2D) -> void:
+       _framed_viewfinder.set_visible(false)
+       target_point.set_visible(false)
+
+       _empty_state_control.set_visible(true)
+       _empty_state_icon.set_texture(icon)
+       if icon == _no_open_scene_icon:
+               _empty_state_text.set_text("[center]No " + text + "[/center]")
+       else:
+               _empty_state_text.set_text("[center]No [b]" + text + "[/b] in scene[/center]")
+
+       if _add_node_button.pressed.is_connected(_add_node):
+               _add_node_button.pressed.disconnect(_add_node)
+
+       _add_node_button.pressed.connect(_add_node.bind(text))
+
+
+func _add_node(node_type: String) -> void:
+       var root: Node = EditorInterface.get_edited_scene_root()
+
+       match node_type:
+               _no_open_scene_string:
+                       pass
+               _constants.CAMERA_2D_NODE_NAME:
+                       var camera: Camera2D = Camera2D.new()
+                       _instantiate_node(root, camera, _constants.CAMERA_2D_NODE_NAME)
+               _constants.CAMERA_3D_NODE_NAME:
+                       var camera: Camera3D = Camera3D.new()
+                       _instantiate_node(root, camera, _constants.CAMERA_3D_NODE_NAME)
+               _constants.PCAM_HOST_NODE_NAME:
+                       var pcam_host: PhantomCameraHost = PhantomCameraHost.new()
+                       pcam_host.set_name(_constants.PCAM_HOST_NODE_NAME)
+                       if _is_2d:
+#                              get_tree().get_edited_scene_root().get_viewport().get_camera_2d().add_child(pcam_host)
+                               _get_camera_2d().add_child(pcam_host)
+                               pcam_host.set_owner(get_tree().get_edited_scene_root())
+                       else:
+#                              var pcam_3D := get_tree().get_edited_scene_root().get_viewport().get_camera_3d()
+                               get_tree().get_edited_scene_root().get_viewport().get_camera_3d().add_child(pcam_host)
+                               pcam_host.set_owner(get_tree().get_edited_scene_root())
+               _constants.PCAM_2D_NODE_NAME:
+                       var pcam_2D: PhantomCamera2D = PhantomCamera2D.new()
+                       _instantiate_node(root, pcam_2D, _constants.PCAM_2D_NODE_NAME)
+               _constants.PCAM_3D_NODE_NAME:
+                       var pcam_3D: PhantomCamera3D = PhantomCamera3D.new()
+                       _instantiate_node(root, pcam_3D, _constants.PCAM_3D_NODE_NAME)
+
+
+func _instantiate_node(root: Node, node: Node, name: String) -> void:
+       node.set_name(name)
+       root.add_child(node)
+       node.set_owner(get_tree().get_edited_scene_root())
+
+
+func _set_viewfinder(root: Node, editor: bool) -> void:
+       pcam_host_group = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME).get_phantom_camera_hosts()
+       if pcam_host_group.size() != 0:
+               if pcam_host_group.size() == 1:
+                       var pcam_host: PhantomCameraHost = pcam_host_group[0]
+                       if _is_2d:
+                               _selected_camera = pcam_host.camera_2d
+                               _active_pcam = pcam_host.get_active_pcam() as PhantomCamera2D
+                               if editor:
+                                       var camera_2d_rid: RID = _selected_camera.get_canvas()
+                                       sub_viewport.disable_3d = true
+                                       _camera_2d.zoom = pcam_host.camera_2d.zoom
+                                       _camera_2d.offset = pcam_host.camera_2d.offset
+                                       _camera_2d.ignore_rotation = pcam_host.camera_2d.ignore_rotation
+
+                                       sub_viewport.world_2d = pcam_host.camera_2d.get_world_2d()
+                                       sub_viewport.render_target_update_mode = SubViewport.UPDATE_ALWAYS
+                                       sub_viewport.render_target_clear_mode = SubViewport.CLEAR_MODE_ALWAYS
+                                       sub_viewport.size_2d_override_stretch = true
+                       else:
+                               _selected_camera = pcam_host.camera_3d
+                               _active_pcam = pcam_host.get_active_pcam() as PhantomCamera3D
+                               if editor:
+                                       var camera_3d_rid: RID = _selected_camera.get_camera_rid()
+                                       sub_viewport.disable_3d = false
+                                       sub_viewport.world_3d = pcam_host.camera_3d.get_world_3d()
+                                       RenderingServer.viewport_attach_camera(sub_viewport.get_viewport_rid(), camera_3d_rid)
+
+                               if _selected_camera.keep_aspect == Camera3D.KeepAspect.KEEP_HEIGHT:
+                                       aspect_ratio_container.set_stretch_mode(AspectRatioContainer.STRETCH_HEIGHT_CONTROLS_WIDTH)
+                               else:
+                                       aspect_ratio_container.set_stretch_mode(AspectRatioContainer.STRETCH_WIDTH_CONTROLS_HEIGHT)
+
+                       _on_dead_zone_changed()
+                       set_process(true)
+
+                       if not pcam_host.update_editor_viewfinder.is_connected(_on_update_editor_viewfinder):
+                               pcam_host.update_editor_viewfinder.connect(_on_update_editor_viewfinder.bind(pcam_host))
+
+                       if not aspect_ratio_container.resized.is_connected(_resized):
+                               aspect_ratio_container.resized.connect(_resized)
+
+                       if not _active_pcam.dead_zone_changed.is_connected(_on_dead_zone_changed):
+                               _active_pcam.dead_zone_changed.connect(_on_dead_zone_changed)
+
+
+func _resized() -> void:
+       _on_dead_zone_changed()
+
+
+func _on_dead_zone_changed() -> void:
+       if not is_instance_valid(_active_pcam): return
+       if not _active_pcam.follow_mode == _active_pcam.FollowMode.FRAMED: return
+
+       # Waits until the camera_viewport_panel has been resized when launching the game
+       if camera_viewport_panel.size.x == 0:
+               await camera_viewport_panel.resized
+
+       #print(_active_pcam.get_pcam_host_owner())
+       if is_instance_valid(_active_pcam.get_pcam_host_owner()):
+               pcam_host = _active_pcam.get_pcam_host_owner()
+               if not _active_pcam == pcam_host.get_active_pcam():
+                       _active_pcam == pcam_host.get_active_pcam()
+                       print("Active pcam in viewfinder: ", _active_pcam)
+
+       var dead_zone_width: float = _active_pcam.dead_zone_width * camera_viewport_panel.size.x
+       var dead_zone_height: float = _active_pcam.dead_zone_height * camera_viewport_panel.size.y
+       dead_zone_center_hbox.set_custom_minimum_size(Vector2(dead_zone_width, 0))
+       dead_zone_center_center_panel.set_custom_minimum_size(Vector2(0, dead_zone_height))
+       dead_zone_left_center_panel.set_custom_minimum_size(Vector2(0, dead_zone_height))
+       dead_zone_right_center_panel.set_custom_minimum_size(Vector2(0, dead_zone_height))
+
+       min_horizontal = 0.5 - _active_pcam.dead_zone_width / 2
+       max_horizontal = 0.5 + _active_pcam.dead_zone_width / 2
+       min_vertical = 0.5 - _active_pcam.dead_zone_height / 2
+       max_vertical = 0.5 + _active_pcam.dead_zone_height / 2
+
+
+####################
+## Priority Override
+####################
+func _on_update_editor_viewfinder(pcam_host: PhantomCameraHost) -> void:
+       if pcam_host.get_active_pcam().priority_override:
+               _active_pcam = pcam_host.get_active_pcam()
+               _priority_override_button.set_visible(true)
+               _priority_override_name_label.set_text(_active_pcam.name)
+               _priority_override_button.set_tooltip_text(_active_pcam.name)
+       else:
+               _priority_override_button.set_visible(false)
+
+func _select_override_pcam() -> void:
+       EditorInterface.get_selection().clear()
+       EditorInterface.get_selection().add_node(_active_pcam)
+
+#endregion
+
+
+#region Public Functions
+
+func update_dead_zone() -> void:
+       _set_viewfinder(root_node, true)
+
+
+func scene_changed(scene_root: Node) -> void:
+       if not scene_root is Node2D and not scene_root is Node3D:
+               is_scene = false
+               _set_empty_viewfinder_state(_no_open_scene_string, _no_open_scene_icon)
+               _add_node_button.set_visible(false)
+
+#endregion
diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd
new file mode 100644 (file)
index 0000000..85081b0
--- /dev/null
@@ -0,0 +1,1304 @@
+@tool
+@icon("res://addons/phantom_camera/icons/phantom_camera_2d.svg")
+class_name PhantomCamera2D
+extends Node2D
+
+## Controls a scene's [Camera2D] and applies logic to it.
+##
+## The scene's [param Camera2D] will follow the position of the
+## [param PhantomCamera2D] with the highest priority.
+## Each instance can have different positional and rotational logic applied
+## to them.
+
+#region Constants
+
+const _constants := preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd")
+
+#endregion
+
+
+#region Signals
+
+## Emitted when the [param PhantomCamera2D] becomes active.
+signal became_active
+## Emitted when the [param PhantomCamera2D] becomes inactive.
+signal became_inactive
+
+## Emitted when [member follow_target] changes.
+signal follow_target_changed
+
+## Emitted when dead zones changes.[br]
+## [b]Note:[/b] Only applicable in [param Framed] [enum FollowMode].
+signal dead_zone_changed
+
+## Emitted when the [param Camera2D] starts to tween to another [param PhantomCamera2D].
+signal tween_started
+## Emitted when the [param Camera2D] is to tweening towards another [param PhantomCamera2D].
+signal is_tweening
+## Emitted when the tween is interrupted due to another [param PhantomCamera2D]
+## becoming active. The argument is the [param PhantomCamera2D] that interrupted
+## the tween.
+signal tween_interrupted(pcam_2d: PhantomCamera2D)
+## Emitted when the [param Camera2D] completes its tween to the
+## [param PhantomCamera2D].
+signal tween_completed
+
+#endregion
+
+#region Enums
+
+## Determines the positional logic for a given [param PCamPhantomCamera2D]
+## [br][br]
+## The different modes have different functionalities and purposes, so choosing
+## the correct one depends on what each [param PhantomCamera2D] is meant to do.
+enum FollowMode {
+       NONE                    = 0, ## Default - No follow logic is applied.
+       GLUED                   = 1, ## Sticks to its target.
+       SIMPLE                  = 2, ## Follows its target with an optional offset.
+       GROUP                   = 3, ## Follows multiple targets with option to dynamically reframe itself.
+       PATH                    = 4, ## Follows a target while being positionally confined to a [Path2D] node.
+       FRAMED                  = 5, ## Applies a dead zone on the frame and only follows its target when it tries to leave it.
+}
+
+## Determines how often an inactive [param PhantomCamera2D] should update
+## its positional and rotational values. This is meant to reduce the amount
+## of calculations inactive [param PhantomCamera2D] are doing when idling to
+## improve performance.
+enum InactiveUpdateMode {
+       ALWAYS, ## Always updates the [param PhantomCamera2D], even when it's inactive.
+       NEVER, ## Never updates the [param PhantomCamera2D] when it's inactive. Reduces the amount of computational resources when inactive.
+#      EXPONENTIALLY,
+}
+
+#endregion
+
+#region Variables
+
+var _is_active: bool = false
+
+## The [PhantomCameraHost] that owns this [param PhantomCamera2D].
+var pcam_host_owner: PhantomCameraHost = null:
+       set = set_pcam_host_owner,
+       get = get_pcam_host_owner
+
+## To quickly preview a [param PhantomCamera2D] without adjusting its
+## [member priority], this property allows the selected PCam to ignore the
+## Priority system altogether and forcefully become the active one. It's
+## partly designed to work within the Viewfinder, and will be disabled when
+## running a build export of the game.
+@export var priority_override: bool = false:
+       set(value):
+               if Engine.is_editor_hint() and _has_valid_pcam_owner():
+                       if value == true:
+                               priority_override = value
+                               get_pcam_host_owner().pcam_priority_override(self)
+                       else:
+                               priority_override = value
+                               get_pcam_host_owner().pcam_priority_updated(self)
+                               get_pcam_host_owner().pcam_priority_override_disabled()
+       get:
+               return priority_override
+
+## It defines which [param PhantomCamera2D] a scene's [param Camera2D] should
+## be corresponding with and be attached to. This is decided by the PCam with
+## the highest [param Priority].
+## [br][br]
+## Changing [param Priority] will send an event to the scene's
+## [PhantomCameraHost], which will then determine whether if the
+## [param Priority] value is greater than or equal to the currently
+## highest [param PhantomCamera2D]'s in the scene. The [param PhantomCamera2D]
+## with the highest value will then reattach the [param Camera2D] accordingly.
+@export var priority: int = 0:
+       set = set_priority,
+       get = get_priority
+
+## Determines the positional logic for a given [param PhantomCamera2D].
+## The different modes have different functionalities and purposes, so
+## choosing the correct one depends on what each [param PhantomCamera2D]
+## is meant to do.
+@export var follow_mode: FollowMode = FollowMode.NONE:
+       set(value):
+               follow_mode = value
+
+               if value == FollowMode.FRAMED:
+                       if _follow_framed_initial_set and follow_target:
+                               _follow_framed_initial_set = false
+                               dead_zone_changed.connect(_on_dead_zone_changed)
+               else:
+                       if dead_zone_changed.is_connected(_on_dead_zone_changed):
+                               dead_zone_changed.disconnect(_on_dead_zone_changed)
+
+               if follow_mode == FollowMode.NONE:
+                       _should_follow = false
+               elif follow_mode == FollowMode.GROUP and follow_targets or follow_target:
+                       _should_follow = true
+               notify_property_list_changed()
+       get:
+               return follow_mode
+
+
+## Determines which target should be followed.
+## The [param Camera2D] will follow the position of the Follow Target
+## based on the [member follow_mode] type and its parameters.
+@export var follow_target: Node2D = null:
+       set = set_follow_target,
+       get = get_follow_target
+var _should_follow: bool = false
+var _follow_framed_offset: Vector2 = Vector2.ZERO
+var _follow_target_physics_based: bool = false
+var _physics_interpolation_enabled = false # NOTE - Enable for Godot 4.3 and when PhysicsInterpolationMode bug is resolved
+
+### Defines the targets that the [param PhantomCamera2D] should be following.
+@export var follow_targets: Array[Node2D] = []:
+       set = set_follow_targets,
+       get = get_follow_targets
+var _has_multiple_follow_targets: bool = false
+
+
+## Determines the [Path2D] the [param PhantomCamera2D]
+## should be bound to.
+## The [param PhantomCamera2D] will follow the position of the
+## [member follow_target] while sticking to the closest point on this path.
+@export var follow_path: Path2D = null:
+       set = set_follow_path,
+       get = get_follow_path
+var _has_follow_path: bool = false
+
+## Applies a zoom level to the [param PhantomCamera2D], which effectively
+## overrides the [param zoom] property of the [param Camera2D] node.
+@export var zoom: Vector2 = Vector2.ONE:
+       set = set_zoom,
+       get = get_zoom
+
+## If enabled, will snap the [param Camera2D] to whole pixels as it moves.
+## [br][br]
+## This should be particularly useful in pixel art projects,
+## where assets should always be aligned to the monitor's pixels to avoid
+## unintended stretching.
+@export var snap_to_pixel: bool = false:
+       set = set_snap_to_pixel,
+       get = get_snap_to_pixel
+
+## Enables a preview of what the [PhantomCamera2D] will see in the
+## scene. It works identically to how a [param Camera2D] shows which area
+## will be visible during runtime. Likewise, this too will be affected by the
+## [member zoom] property and the [param viewport_width] and
+## [param Viewport Height] defined in the [param Project Settings].
+@export var frame_preview: bool = true:
+       set(value):
+               frame_preview = value
+               queue_redraw()
+       get:
+               return frame_preview
+
+## Defines how the [param PhantomCamera2D] transition between one another.
+## Changing the tween values for a given [param PhantomCamera2D]
+## determines how transitioning to that instance will look like.
+## This is a resource type that can be either used for one
+## [param PhantomCamera] or reused across multiple - both 2D and 3D.
+## By default, all [param PhantomCameras] will use a [param linear]
+## transition, [param easeInOut] ease with a [param 1s] duration.
+@export var tween_resource: PhantomCameraTween = PhantomCameraTween.new():
+       set = set_tween_resource,
+       get = get_tween_resource
+var _has_tweened: bool = false
+
+## If enabled, the moment a [param PhantomCamera3D] is instantiated into
+## a scene, and has the highest priority, it will perform its tween transition.
+## This is most obvious if a [param PhantomCamera3D] has a long duration and
+## is attached to a playable character that can be moved the moment a scene
+## is loaded. Disabling the [param tween_on_load] property will
+## disable this behaviour and skip the tweening entirely when instantiated.
+@export var tween_on_load: bool = true:
+       set = set_tween_on_load,
+       get = get_tween_on_load
+
+## Determines how often an inactive [param PhantomCamera2D] should update
+## its positional and rotational values. This is meant to reduce the amount
+## of calculations inactive [param PhantomCamera2Ds] are doing when idling
+## to improve performance.
+@export var inactive_update_mode: InactiveUpdateMode = InactiveUpdateMode.ALWAYS
+
+@export_group("Follow Parameters")
+## Offsets the [member follow_target] position.
+@export var follow_offset: Vector2 = Vector2.ZERO:
+       set = set_follow_offset,
+       get = get_follow_offset
+
+## Applies a damping effect on the [param Camera2D]'s movement.
+## Leading to heavier / slower camera movement as the targeted node moves around.
+## This is useful to avoid sharp and rapid camera movement.
+@export var follow_damping: bool = false:
+       set = set_follow_damping,
+       get = get_follow_damping
+
+## Defines the damping amount. The ideal range should be somewhere between 0-1.[br][br]
+## The damping amount can be specified in the individual axis.[br][br]
+## [b]Lower value[/b] = faster / sharper camera movement.[br]
+## [b]Higher value[/b] = slower / heavier camera movement.
+@export var follow_damping_value: Vector2 = Vector2(0.1, 0.1):
+       set = set_follow_damping_value,
+       get = get_follow_damping_value
+var _velocity_ref: Vector2 = Vector2.ZERO # Stores and applies the velocity of the movement
+
+@export_subgroup("Follow Group")
+## Enables the [param PhantomCamera2D] to dynamically zoom in and out based on
+## the targets' distances between each other.
+## Once enabled, the [param Camera2D] will stay as zoomed in as possible,
+## limited by the [member auto_zoom_max] and start zooming out as the targets
+## move further apart, limited by the [member auto_zoom_min].
+## Note: Enabling this property hides and disables the [member zoom] property
+## as this effectively overrides that value.
+@export var auto_zoom: bool = false:
+       set = set_auto_zoom,
+       get = get_auto_zoom
+## Sets the param minimum zoom amount, in other words how far away the
+## [param Camera2D] can be from scene.[br][br]
+## This only works when [member auto_zoom] is enabled.
+@export var auto_zoom_min: float = 1:
+       set = set_auto_zoom_min,
+       get = get_auto_zoom_min
+
+## Sets the maximum zoom amount, in other words how close the [param Camera2D]
+## can move towards the scene.[br][br]
+## This only works when [member auto_zoom] is enabled.
+@export var auto_zoom_max: float = 5:
+       set = set_auto_zoom_max,
+       get = get_auto_zoom_max
+## Determines how close to the edges the targets are allowed to be.
+## This is useful to avoid targets being cut off at the edges of the screen.
+## [br][br]
+
+## The Vector4 parameter order goes: [param Left] - [param Top] - [param Right]
+## - [param Bottom].
+@export var auto_zoom_margin: Vector4 = Vector4.ZERO:
+       set = set_auto_zoom_margin,
+       get = get_auto_zoom_margin
+
+@export_subgroup("Dead Zones")
+## Defines the horizontal dead zone area. While the target is within it, the
+## [param PhantomCamera2D] will not move in the horizontal axis.
+## If the targeted node leaves the horizontal bounds, the
+## [param PhantomCamera2D] will follow the target horizontally to keep
+## it within bounds.
+@export_range(0, 1) var dead_zone_width: float = 0:
+       set(value):
+               dead_zone_width = value
+               dead_zone_changed.emit()
+       get:
+               return dead_zone_width
+
+## Defines the vertical dead zone area. While the target is within it, the
+## [param PhantomCamera2D] will not move in the vertical axis.
+## If the targeted node leaves the vertical bounds, the
+## [param PhantomCamera2D] will follow the target horizontally to keep
+## it within bounds.
+@export_range(0, 1) var dead_zone_height: float = 0:
+       set(value):
+               dead_zone_height = value
+               dead_zone_changed.emit()
+       get:
+               return dead_zone_height
+
+## Enables the [param dead zones] to be visible when running the game from the editor.
+## [br]
+## [param dead zones] will never be visible in build exports.
+@export var show_viewfinder_in_play: bool = false
+
+## Defines the position of the [member follow_target] within the viewport.[br]
+## This is only used for when [member follow_mode] is set to [param Framed].
+var viewport_position: Vector2
+var _follow_framed_initial_set: bool = false
+
+@export_group("Limit")
+
+## Shows the [param Camera2D]'s built-in limit border.[br]
+## The [param PhantomCamera2D] and [param Camera2D] can move around anywhere within it.
+@export var draw_limits: bool = false:
+       set(value):
+               _draw_limits = value
+               if Engine.is_editor_hint():
+                       _draw_camera_2d_limit()
+       get:
+               return _draw_limits
+
+static var _draw_limits: bool
+
+var _limit_sides: Vector4i
+var _limit_sides_default: Vector4i = Vector4i(-10000000, -10000000, 10000000, 10000000)
+## Defines the left side of the [param Camera2D] limit.
+## The camera will not be able to move past this point.
+@export var limit_left: int = -10000000:
+       set = set_limit_left,
+       get = get_limit_left
+## Defines the top side of the [param Camera2D] limit.
+## The camera will not be able to move past this point.
+@export var limit_top: int = -10000000:
+       set = set_limit_top,
+       get = get_limit_top
+## Defines the right side of the [param Camera2D] limit.
+## The camera will not be able to move past this point.
+@export var limit_right: int = 10000000:
+       set = set_limit_right,
+       get = get_limit_right
+## Defines the bottom side of the [param Camera2D] limit.
+## The camera will not be able to move past this point.
+@export var limit_bottom: int = 10000000:
+       set = set_limit_bottom,
+       get = get_limit_bottom
+
+## Allows for setting either a [TileMap] or [CollisionShape2D] node to
+## automatically apply a limit size instead of manually adjusting the Left,
+## Top, Right and Left properties.[br][br]
+## [b]TileMap[/b][br]
+## The Limit will update after the [TileSet] of the [TileMap] has changed.[br]
+## [b]Note:[/b] The limit size will only update after closing the TileMap editor
+## bottom panel.
+## [br][br]
+## [b]CollisionShape2D[/b][br]
+## The limit will update in realtime as the Shape2D changes its size.
+## Note: For performance reasons, resizing the [Shape2D] during runtime will not change the Limits sides.
+@export_node_path("TileMap", "CollisionShape2D") var limit_target = NodePath(""):
+       set = set_limit_target,
+       get = get_limit_target
+var _limit_node: Node2D
+## Applies an offset to the [TileMap] Limit or [Shape2D] Limit.
+## The values goes from [param Left], [param Top], [param Right]
+## and [param Bottom].
+@export var limit_margin: Vector4i:
+       set = set_limit_margin,
+       get = get_limit_margin
+#@export var limit_smoothed: bool = false: # TODO - Needs proper support
+       #set = set_limit_smoothing,
+       #get = get_limit_smoothing
+var _limit_inactive_pcam: bool
+
+#endregion
+
+# NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box.
+var _phantom_camera_manager: Node
+
+
+func _validate_property(property: Dictionary) -> void:
+       ################
+       ## Follow Target
+       ################
+       if property.name == "follow_target":
+               if follow_mode == FollowMode.NONE or \
+               follow_mode == FollowMode.GROUP:
+                       property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       elif property.name == "follow_path" and \
+       follow_mode != FollowMode.PATH:
+               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+
+       ####################
+       ## Follow Parameters
+       ####################
+
+
+       if follow_mode == FollowMode.NONE:
+               match property.name:
+                       "follow_offset", \
+                       "follow_damping", \
+                       "follow_damping_value":
+                               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       if property.name == "follow_offset":
+               if follow_mode == FollowMode.PATH or \
+               follow_mode == FollowMode.GLUED:
+                       property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       if property.name == "follow_damping_value" and not follow_damping:
+               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       ###############
+       ## Follow Group
+       ###############
+       if follow_mode != FollowMode.GROUP:
+               match property.name:
+                       "follow_targets", \
+                       "auto_zoom":
+                               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+               if not auto_zoom:
+                       match property.name:
+                               "auto_zoom_min", \
+                               "auto_zoom_max", \
+                               "auto_zoom_margin":
+                                       property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       ################
+       ## Follow Framed
+       ################
+       if not follow_mode == FollowMode.FRAMED:
+               match property.name:
+                       "dead_zone_width", \
+                       "dead_zone_height", \
+                       "show_viewfinder_in_play":
+                               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       #######
+       ## Zoom
+       #######
+       if property.name == "zoom" and auto_zoom:
+               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       ########
+       ## Limit
+       ########
+       if is_instance_valid(_limit_node):
+               match property.name:
+                       "limit_left", \
+                       "limit_top", \
+                       "limit_right", \
+                       "limit_bottom":
+                               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       if property.name == "limit_margin" and not _limit_node:
+               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       ################
+       ## Frame Preview
+       ################
+       if property.name == "frame_preview" and _is_active:
+               property.usage |= PROPERTY_USAGE_READ_ONLY
+
+       notify_property_list_changed()
+
+#region Private Functions
+
+func _enter_tree() -> void:
+       _phantom_camera_manager = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME)
+       _phantom_camera_manager.pcam_added(self)
+       update_limit_all_sides()
+
+       if not _phantom_camera_manager.get_phantom_camera_hosts().is_empty():
+               set_pcam_host_owner(_phantom_camera_manager.get_phantom_camera_hosts()[0])
+
+
+func _exit_tree() -> void:
+       _phantom_camera_manager.pcam_removed(self)
+
+       if _has_valid_pcam_owner():
+               get_pcam_host_owner().pcam_removed_from_scene(self)
+
+
+func _process(delta: float) -> void:
+       if _follow_target_physics_based: return
+       _process_logic(delta)
+
+
+func _physics_process(delta: float):
+       if not _follow_target_physics_based: return
+       _process_logic(delta)
+
+
+func _process_logic(delta: float) -> void:
+       if not _is_active:
+               match inactive_update_mode:
+                       InactiveUpdateMode.NEVER: return
+                       InactiveUpdateMode.ALWAYS:
+                               # Only triggers if limit isn't default
+                               if _limit_inactive_pcam:
+                                       global_position = _set_limit_clamp_position(global_position)
+#                      InactiveUpdateMode.EXPONENTIALLY:
+#                              TODO - Trigger positional updates less frequently as more Pcams gets added
+       _limit_checker()
+       if _should_follow:
+               _follow(delta)
+
+
+func _limit_checker() -> void:
+       ## TODO - Needs to see if this can be triggerd only from CollisionShape2D Transform changes
+       if Engine.is_editor_hint():
+               if draw_limits:
+                       update_limit_all_sides()
+
+
+func _follow(delta: float) -> void:
+       var follow_position: Vector2
+
+       match follow_mode:
+               FollowMode.GLUED:
+                       if follow_target:
+                               follow_position = follow_target.global_position
+               FollowMode.SIMPLE:
+                       if follow_target:
+                               follow_position = _target_position_with_offset()
+               FollowMode.GROUP:
+                       if follow_targets.size() == 1:
+                               follow_position = follow_targets[0].global_position
+                       elif _has_multiple_follow_targets and follow_targets.size() > 1:
+                               var rect: Rect2 = Rect2(follow_targets[0].global_position, Vector2.ZERO)
+                               for node in follow_targets:
+                                       rect = rect.expand(node.global_position)
+                                       if auto_zoom:
+                                               rect = rect.grow_individual(
+                                                       auto_zoom_margin.x,
+                                                       auto_zoom_margin.y,
+                                                       auto_zoom_margin.z,
+                                                       auto_zoom_margin.w
+                                               )
+#                                              else:
+#                                                      rect = rect.grow_individual(-80, 0, 0, 0)
+                               if auto_zoom:
+                                       var screen_size: Vector2 = get_viewport_rect().size
+                                       if rect.size.x > rect.size.y * screen_size.aspect():
+                                               zoom = clamp(screen_size.x / rect.size.x, auto_zoom_min, auto_zoom_max) * Vector2.ONE
+                                       else:
+                                               zoom = clamp(screen_size.y / rect.size.y, auto_zoom_min, auto_zoom_max) * Vector2.ONE
+                               follow_position = rect.get_center()
+               FollowMode.PATH:
+                               if follow_target and follow_path:
+                                       var path_position: Vector2 = follow_path.global_position
+
+                                       follow_position = \
+                                               follow_path.curve.get_closest_point(
+                                                       _target_position_with_offset() - path_position
+                                               ) + path_position
+
+               FollowMode.FRAMED:
+                       if follow_target:
+                               if not Engine.is_editor_hint():
+                                       viewport_position = (get_follow_target().get_global_transform_with_canvas().get_origin() + follow_offset) / get_viewport_rect().size
+
+                                       if _get_framed_side_offset() != Vector2.ZERO:
+                                               var glo_pos: Vector2
+                                               var target_position: Vector2 = _target_position_with_offset() + _follow_framed_offset
+
+                                               if dead_zone_width == 0 || dead_zone_height == 0:
+                                                       if dead_zone_width == 0 && dead_zone_height != 0:
+                                                               follow_position = _target_position_with_offset()
+                                                       elif dead_zone_width != 0 && dead_zone_height == 0:
+                                                               glo_pos = _target_position_with_offset()
+                                                               glo_pos.x += target_position.x - global_position.x
+                                                               follow_position = glo_pos
+                                                       else:
+                                                               follow_position = _target_position_with_offset()
+                                               else:
+                                                       follow_position = target_position
+                                       else:
+                                               _follow_framed_offset = global_position - _target_position_with_offset()
+                                               return
+                               else:
+                                       follow_position = _target_position_with_offset()
+
+       _interpolate_position(follow_position, delta)
+
+
+func _set_velocity(index: int, value: float):
+       _velocity_ref[index] = value
+
+
+func _interpolate_position(target_position: Vector2, delta: float) -> void:
+       if _limit_inactive_pcam and not _has_tweened:
+               target_position = _set_limit_clamp_position(target_position)
+
+       if follow_damping:
+               for index in 2:
+                       global_position[index] = \
+                               _smooth_damp(
+                                       target_position[index],
+                                       global_position[index],
+                                       index,
+                                       _velocity_ref[index],
+                                       _set_velocity,
+                                       follow_damping_value[index],
+                                       delta
+                               )
+       else:
+               global_position = target_position
+
+
+func _smooth_damp(target_axis: float, self_axis: float, index: int, current_velocity: float, set_velocity: Callable, damping_time: float, delta: float) -> float:
+               damping_time = maxf(0.0001, damping_time)
+               var omega: float = 2 / damping_time
+               var x: float = omega * delta
+               var exponential: float = 1 / (1 + x + 0.48 * x * x + 0.235 * x * x * x)
+               var diff: float = self_axis - target_axis
+               var _target_axis: float = target_axis
+
+               var max_change: float = INF * damping_time
+               diff = clampf(diff, -max_change, max_change)
+               target_axis = self_axis - diff
+
+               var temp: float = (current_velocity + omega * diff) * delta
+               set_velocity.call(index, (current_velocity - omega * temp) * exponential)
+               var output: float = target_axis + (diff + temp) * exponential
+
+               ## To prevent overshooting
+               if (_target_axis - self_axis > 0.0) == (output > _target_axis):
+                       output = _target_axis
+                       set_velocity.call(index, (output - _target_axis) / delta)
+
+               return output
+
+
+func _set_limit_clamp_position(value: Vector2) -> Vector2:
+       var camera_frame_rect_size: Vector2 = _camera_frame_rect().size
+       value.x = clampf(value.x, _limit_sides.x + camera_frame_rect_size.x / 2, _limit_sides.z - camera_frame_rect_size.x / 2)
+       value.y = clampf(value.y, _limit_sides.y + camera_frame_rect_size.y / 2, _limit_sides.w - camera_frame_rect_size.y / 2)
+       return value
+
+
+func _draw():
+       if not Engine.is_editor_hint(): return
+
+       if frame_preview and not _is_active:
+               var screen_size_width: int = ProjectSettings.get_setting("display/window/size/viewport_width")
+               var screen_size_height: int = ProjectSettings.get_setting("display/window/size/viewport_height")
+               var screen_size_zoom: Vector2 = Vector2(screen_size_width / get_zoom().x, screen_size_height / get_zoom().y)
+               draw_rect(_camera_frame_rect(), Color("3ab99a"), false, 2)
+
+
+func _camera_frame_rect() -> Rect2:
+       var screen_size_width: int = ProjectSettings.get_setting("display/window/size/viewport_width")
+       var screen_size_height: int = ProjectSettings.get_setting("display/window/size/viewport_height")
+       var screen_size_zoom: Vector2 = Vector2(screen_size_width / get_zoom().x, screen_size_height / get_zoom().y)
+
+       return Rect2(-screen_size_zoom / 2, screen_size_zoom)
+
+
+func _on_tile_map_changed() -> void:
+       update_limit_all_sides()
+
+
+func _target_position_with_offset() -> Vector2:
+       return follow_target.global_position + follow_offset
+
+
+func _on_dead_zone_changed() -> void:
+       set_global_position( _target_position_with_offset() )
+
+
+func _has_valid_pcam_owner() -> bool:
+       if not is_instance_valid(get_pcam_host_owner()): return false
+       if not is_instance_valid(get_pcam_host_owner().camera_2d): return false
+       return true
+
+
+func _get_framed_side_offset() -> Vector2:
+       var frame_out_bounds: Vector2
+
+       if viewport_position.x < 0.5 - dead_zone_width / 2:
+               # Is outside left edge
+               frame_out_bounds.x = -1
+
+       if viewport_position.y < 0.5 - dead_zone_height / 2:
+               # Is outside top edge
+               frame_out_bounds.y = 1
+
+       if viewport_position.x > 0.5 + dead_zone_width / 2:
+               # Is outside right edge
+               frame_out_bounds.x = 1
+
+       if viewport_position.y > 0.5001 + dead_zone_height / 2: # 0.501 to resolve an issue where the bottom vertical Dead Zone never becoming 0 when the Dead Zone Vertical parameter is set to 0
+               # Is outside bottom edge
+               frame_out_bounds.y = -1
+
+       return frame_out_bounds
+
+
+func _draw_camera_2d_limit() -> void:
+       if _has_valid_pcam_owner():
+               get_pcam_host_owner().camera_2d.set_limit_drawing_enabled(draw_limits)
+
+
+func _check_limit_is_not_default() -> void:
+       if _limit_sides == _limit_sides_default:
+               _limit_inactive_pcam = false
+       else:
+               _limit_inactive_pcam = true
+
+
+func _set_camera_2d_limit(side: int, limit: int) -> void:
+       if not _has_valid_pcam_owner(): return
+       if not _is_active: return
+       get_pcam_host_owner().camera_2d.set_limit(side, limit)
+
+#endregion
+
+
+#region Public Functions
+
+## Updates the limit sides based what has been set to define it
+## This should be automatic, but can be called manully if need be.
+func update_limit_all_sides() -> void:
+       var limit_rect: Rect2
+
+       if not is_instance_valid(_limit_node):
+               _limit_sides.x = limit_left
+               _limit_sides.y = limit_top
+               _limit_sides.z = limit_right
+               _limit_sides.w = limit_bottom
+       elif _limit_node is TileMap:
+               var tile_map: TileMap = _limit_node as TileMap
+               var tile_map_size: Vector2 = Vector2(tile_map.get_used_rect().size) * Vector2(tile_map.tile_set.tile_size) * tile_map.get_scale()
+               var tile_map_position: Vector2 = tile_map.global_position + Vector2(tile_map.get_used_rect().position) * Vector2(tile_map.tile_set.tile_size) * tile_map.get_scale()
+
+               ## Calculates the Rect2 based on the Tile Map position and size + margin
+               limit_rect = Rect2(
+                       tile_map_position + Vector2(limit_margin.x, limit_margin.y),
+                       tile_map_size - Vector2(limit_margin.x, limit_margin.y) - Vector2(limit_margin.z, limit_margin.w)
+               )
+
+               # Left
+               _limit_sides.x = roundi(limit_rect.position.x)
+               # Top
+               _limit_sides.y = roundi(limit_rect.position.y)
+               # Right
+               _limit_sides.z = roundi(limit_rect.position.x + limit_rect.size.x)
+               # Bottom
+               _limit_sides.w = roundi(limit_rect.position.y + limit_rect.size.y)
+       elif _limit_node is CollisionShape2D:
+               var collision_shape_2d = _limit_node as CollisionShape2D
+
+               if not collision_shape_2d.get_shape(): return
+
+               var shape_2d: Shape2D = collision_shape_2d.get_shape()
+               var shape_2d_size: Vector2 = shape_2d.get_rect().size
+               var shape_2d_position: Vector2 = collision_shape_2d.global_position + Vector2(shape_2d.get_rect().position)
+
+               ## Calculates the Rect2 based on the Tile Map position and size
+               limit_rect = Rect2(shape_2d_position, shape_2d_size)
+
+               ## Calculates the Rect2 based on the Tile Map position and size + margin
+               limit_rect = Rect2(
+                       limit_rect.position + Vector2(limit_margin.x, limit_margin.y),
+                       limit_rect.size - Vector2(limit_margin.x, limit_margin.y) - Vector2(limit_margin.z, limit_margin.w)
+               )
+
+               # Left
+               _limit_sides.x = roundi(limit_rect.position.x)
+               # Top
+               _limit_sides.y = roundi(limit_rect.position.y)
+               # Right
+               _limit_sides.z = roundi(limit_rect.position.x + limit_rect.size.x)
+               # Bottom
+               _limit_sides.w = roundi(limit_rect.position.y + limit_rect.size.y)
+
+       _check_limit_is_not_default()
+
+       if _is_active and _has_valid_pcam_owner():
+               _set_camera_2d_limit(SIDE_LEFT, _limit_sides.x)
+               _set_camera_2d_limit(SIDE_TOP, _limit_sides.y)
+               _set_camera_2d_limit(SIDE_RIGHT, _limit_sides.z)
+               _set_camera_2d_limit(SIDE_BOTTOM, _limit_sides.w)
+
+
+func reset_limit() -> void:
+       if not _has_valid_pcam_owner(): return
+       if not _is_active: return
+       get_pcam_host_owner().camera_2d.set_limit(SIDE_LEFT, _limit_sides_default.x)
+       get_pcam_host_owner().camera_2d.set_limit(SIDE_TOP, _limit_sides_default.y)
+       get_pcam_host_owner().camera_2d.set_limit(SIDE_RIGHT, _limit_sides_default.z)
+       get_pcam_host_owner().camera_2d.set_limit(SIDE_BOTTOM, _limit_sides_default.w)
+
+
+## Assigns the value of the [param has_tweened] property.
+## [b][color=yellow]Important:[/color][/b] This value can only be changed
+## from the [PhantomCameraHost] script.
+func set_has_tweened(caller: Node, value: bool) -> void:
+       if is_instance_of(caller, PhantomCameraHost):
+               _has_tweened = value
+       else:
+               printerr("Can only be called PhantomCameraHost class")
+## Returns the current [param has_tweened] value.
+func get_has_tweened() -> bool:
+       return _has_tweened
+
+#endregion
+
+
+#region Setter & Getter Functions
+
+## Assigns the [param PhantomCamera2D] to a new [PhantomCameraHost].[br]
+## [b][color=yellow]Important:[/color][/b] This is currently restricted to
+## plugin internals. Proper support will be added in issue #26.
+func set_pcam_host_owner(value: PhantomCameraHost) -> void:
+       pcam_host_owner = value
+       if is_instance_valid(pcam_host_owner):
+               pcam_host_owner.pcam_added_to_scene(self)
+       #if value.size() == 1:
+#      else:
+#              for camera_host in camera_host_group:
+#                      print("Multiple PhantomCameraBases in scene")
+#                      print(pcam_host_group)
+#                      print(pcam.get_tree().get_nodes_in_group(PhantomCameraGroupNames.PHANTOM_CAMERA_HOST_GROUP_NAME))
+#                      multiple_pcam_host_group.append(camera_host)
+#                      return nullfunc assign_pcam_host() -> void:
+## Gets the current [PhantomCameraHost] this [param PhantomCamera2D] is
+## assigned to.
+func get_pcam_host_owner() -> PhantomCameraHost:
+       return pcam_host_owner
+
+
+## Assigns new Zoom value.
+func set_zoom(value: Vector2) -> void:
+       zoom = value
+       queue_redraw()
+
+## Gets current Zoom value.
+func get_zoom() -> Vector2:
+       return zoom
+
+
+## Assigns new Priority value.
+func set_priority(value: int) -> void:
+       priority = abs(value)
+       if _has_valid_pcam_owner():
+               get_pcam_host_owner().pcam_priority_updated(self)
+
+## Gets current Priority value.
+func get_priority() -> int:
+       return priority
+
+
+## Assigns a new PhantomCameraTween resource to the PhantomCamera2D
+func set_tween_resource(value: PhantomCameraTween) -> void:
+       tween_resource = value
+
+## Gets the PhantomCameraTween resource assigned to the PhantomCamera2D
+## Returns null if there's nothing assigned to it.
+func get_tween_resource() -> PhantomCameraTween:
+       return tween_resource
+
+
+## Assigns a new [param Tween Duration] to the [member tween_resource] value.[br]
+## The duration value is in seconds.
+func set_tween_duration(value: float) -> void:
+       tween_resource.duration = value
+
+## Gets the current [param Tween Duration] value inside the
+## [member tween_resource].[br]
+## The duration value is in seconds.
+func get_tween_duration() -> float:
+       return tween_resource.duration
+
+
+## Assigns a new [param Tween Transition] value inside the
+## [member tween_resource].
+func set_tween_transition(value: int) -> void:
+       tween_resource.transition = value
+
+## Gets the current [param Tween Transition] value  inside the
+## [member tween_resource].
+func get_tween_transition() -> int:
+       return tween_resource.transition
+
+
+## Assigns a new [param Tween Ease] value inside the [member tween_resource].
+func set_tween_ease(value: int) -> void:
+       tween_resource.ease = value
+
+## Gets the current [param Tween Ease] value inside the [member tween_resource].
+func get_tween_ease() -> int:
+       return tween_resource.ease
+
+
+## Sets the [param PhantomCamera2D] active state.[br]
+## [b][color=yellow]Important:[/color][/b] This value can only be changed
+## from the [PhantomCameraHost] script.
+func set_is_active(node, value) -> void:
+       if node is PhantomCameraHost:
+               _is_active = value
+       else:
+               printerr("PCams can only be set from the PhantomCameraHost")
+
+## Gets current active state of the [param PhantomCamera2D].
+## If it returns true, it means the [param PhantomCamera2D] is what the
+## [param Camera2D] is currently following.
+func is_active() -> bool:
+       return _is_active
+
+
+## Enables or disables the [member tween_on_load].
+func set_tween_on_load(value: bool) -> void:
+       tween_on_load = value
+
+## Gets the current [member tween_on_load] value.
+func get_tween_on_load() -> bool:
+       return tween_on_load
+
+
+## Gets the current follow mode as an enum int based on [enum FollowMode].[br]
+## [b]Note:[/b] Setting [enum FollowMode] purposely not added.
+## A separate PCam should be used instead.
+func get_follow_mode() -> int:
+       return follow_mode
+
+
+## Assigns a new [Node2D] as the [member follow_target].
+func set_follow_target(value: Node2D) -> void:
+       if follow_target == value: return
+       follow_target = value
+       _follow_target_physics_based = false
+       if is_instance_valid(value):
+               _should_follow = true
+               _check_physics_body(value)
+       else:
+               _should_follow = false
+       follow_target_changed.emit()
+       notify_property_list_changed()
+
+## Erases the current [member follow_target].
+func erase_follow_target() -> void:
+       if follow_target == null: return
+       _should_follow = false
+       follow_target = null
+       _follow_target_physics_based = false
+       follow_target_changed.emit()
+
+## Gets the current [member follow_target].
+func get_follow_target() -> Node2D:
+       return follow_target
+
+
+## Assigns a new [Path2D] to the [member follow_path].
+func set_follow_path(value: Path2D) -> void:
+       follow_path = value
+
+## Erases the current [Path2D] from the [member follow_path] property.
+func erase_follow_path() -> void:
+       follow_path = null
+
+## Gets the current [Path2D] from the [member follow_path].
+func get_follow_path() -> Path2D:
+       return follow_path
+
+
+## Assigns a new [param follow_targets] array value.
+func set_follow_targets(value: Array[Node2D]) -> void:
+       if follow_targets == value: return
+
+       follow_targets = value
+
+       if follow_targets.is_empty():
+               _should_follow = false
+               _has_multiple_follow_targets = false
+               return
+
+       _follow_target_physics_based = false
+       var valid_instances: int = 0
+       for target in follow_targets:
+               if is_instance_valid(target):
+                       _should_follow = true
+                       valid_instances += 1
+
+                       _check_physics_body(target)
+
+                       if valid_instances > 1:
+                               _has_multiple_follow_targets = true
+
+## Appends a single [Node2D] to [member follow_targets].
+func append_follow_targets(value: Node2D) -> void:
+       if not is_instance_valid(value):
+               printerr(value, " is not a valid Node2D instance.")
+               return
+       if not follow_targets.has(value):
+               follow_targets.append(value)
+               _should_follow = true
+               _has_multiple_follow_targets = true
+               _check_physics_body(value)
+       else:
+               printerr(value, " is already part of Follow Group")
+
+## Adds an Array of type [Node2D] to [member follow_targets].
+func append_follow_targets_array(value: Array[Node2D]) -> void:
+       for target in value:
+               if not is_instance_valid(target): continue
+               if not follow_targets.has(target):
+                       follow_targets.append(target)
+                       _should_follow = true
+                       _check_physics_body(target)
+                       if follow_targets.size() > 1:
+                               _has_multiple_follow_targets = true
+               else:
+                       printerr(value, " is already part of Follow Group")
+
+## Removes a [Node2D] from [member follow_targets] array.
+func erase_follow_targets(value: Node2D) -> void:
+       follow_targets.erase(value)
+       _follow_target_physics_based = false
+       for target in follow_targets:
+               _check_physics_body(target)
+       if follow_targets.size() < 2:
+               _has_multiple_follow_targets = false
+       if follow_targets.size() < 1:
+               _should_follow = false
+
+## Gets all [Node2D] from [member follow_targets] array.
+func get_follow_targets() -> Array[Node2D]:
+       return follow_targets
+
+
+func _check_physics_body(target: Node2D) -> void:
+       if target is PhysicsBody2D:
+               ## NOTE - Feature Toggle
+               if Engine.get_version_info().major == 4 and \
+               Engine.get_version_info().minor < 3:
+                       if ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips"):
+                               print_rich("Following a [b]PhysicsBody2D[/b] node will likely result in jitter - on lower physics ticks in particular.")
+                               print_rich("Once Godot 4.3 is released, will strongly recommend upgrading to that as it has built-in support for 2D Physics Interpolation.")
+                               print_rich("Until then, try following the guide on the [url=https://phantom-camera.dev/support/faq#i-m-seeing-jitter-what-can-i-do]documentation site[/url] for better results.")
+                               print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]")
+                       return
+               ## NOTE - Only supported in Godot 4.3 or above
+               elif not ProjectSettings.get_setting("physics/common/physics_interpolation") and ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips"):
+                               printerr("Physics Interpolation is disabled in the Project Settings, recommend enabling it to smooth out physics-based camera movement")
+                               print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]")
+               _follow_target_physics_based = true
+
+
+## Assigns a new Vector2 for the Follow Target Offset property.
+func set_follow_offset(value: Vector2) -> void:
+       follow_offset = value
+
+## Gets the current Vector2 for the Follow Target Offset property.
+func get_follow_offset() -> Vector2:
+       return follow_offset
+
+
+## Enables or disables Follow Damping.
+func set_follow_damping(value: bool) -> void:
+       follow_damping = value
+       notify_property_list_changed()
+
+## Gets the current Follow Damping property.
+func get_follow_damping() -> bool:
+       return follow_damping
+
+
+## Assigns new Damping value.
+func set_follow_damping_value(value: Vector2) -> void:
+       ## TODO - Should be using @export_range once minimum version support is Godot 4.3
+       if value.x < 0: value.x = 0
+       elif value.y < 0: value.y = 0
+       follow_damping_value = value
+
+## Gets the current Follow Damping value.
+func get_follow_damping_value() -> Vector2:
+       return follow_damping_value
+
+
+## Enables or disables [member snap_to_pixel].
+func set_snap_to_pixel(value: bool) -> void:
+       snap_to_pixel = value
+
+## Gets the current [member snap_to_pixel] value.
+func get_snap_to_pixel() -> bool:
+       return snap_to_pixel
+
+
+## Returns true if the [param PhantomCamera2D] has more than one member in the
+## [follow_targets] array.
+func get_has_multiple_follow_targets() -> bool:
+       return _has_multiple_follow_targets
+
+
+## Enables or disables Auto zoom when using Group Follow.
+func set_auto_zoom(value: bool) -> void:
+       auto_zoom = value
+       notify_property_list_changed()
+
+## Gets Auto Zoom state.
+func get_auto_zoom() -> bool:
+       return auto_zoom
+
+
+## Assigns new Min Auto Zoom value.
+func set_auto_zoom_min(value: float) -> void:
+       auto_zoom_min = value
+
+## Gets Min Auto Zoom value.
+func get_auto_zoom_min() -> float:
+       return auto_zoom_min
+
+
+## Assigns new Max Auto Zoom value.
+func set_auto_zoom_max(value: float) -> void:
+       auto_zoom_max = value
+
+## Gets Max Auto Zoom value.
+func get_auto_zoom_max() -> float:
+       return auto_zoom_max
+
+
+## Assigns new Zoom Auto Margin value.
+func set_auto_zoom_margin(value: Vector4) -> void:
+       auto_zoom_margin = value
+
+## Gets Zoom Auto Margin value.
+func get_auto_zoom_margin() -> Vector4:
+       return auto_zoom_margin
+
+
+## Sets a limit side based on the side parameter.[br]
+## It's recommended to pass the [enum Side] enum as the sid parameter.
+func set_limit(side: int, value: int) -> void:
+       match side:
+               SIDE_LEFT:              limit_left = value
+               SIDE_TOP:               limit_top = value
+               SIDE_RIGHT:     limit_right = value
+               SIDE_BOTTOM:    limit_bottom = value
+               _:                              printerr("Not a valid Side.")
+
+## Gets the limit side
+func get_limit(value: int) -> int:
+       match value:
+               SIDE_LEFT:              return limit_left
+               SIDE_TOP:               return limit_top
+               SIDE_RIGHT:     return limit_right
+               SIDE_BOTTOM:    return limit_bottom
+               _:
+                                               printerr("Not a valid Side.")
+                                               return -1
+
+
+## Assign a the Camera2D Left Limit Side value.
+func set_limit_left(value: int) -> void:
+       _limit_target_exist_error()
+       limit_left = value
+       update_limit_all_sides()
+
+## Gets the Camera2D Left Limit value.
+func get_limit_left() -> int:
+       return limit_left
+
+
+## Assign a the Camera2D Top Limit Side value.
+func set_limit_top(value: int) -> void:
+       _limit_target_exist_error()
+       limit_top = value
+       update_limit_all_sides()
+
+## Gets the Camera2D Top Limit value.
+func get_limit_top() -> int:
+       return limit_top
+
+
+## Assign a the Camera2D Right Limit Side value.
+func set_limit_right(value: int) -> void:
+       _limit_target_exist_error()
+       limit_right = value
+       update_limit_all_sides()
+
+## Gets the Camera2D Right Limit value.
+func get_limit_right() -> int:
+       return limit_right
+
+
+## Assign a the Camera2D Bottom Limit Side value.
+func set_limit_bottom(value: int) -> void:
+       _limit_target_exist_error()
+       limit_bottom = value
+       update_limit_all_sides()
+
+## Gets the Camera2D Bottom Limit value.
+func get_limit_bottom() -> int:
+       return limit_bottom
+
+
+func _limit_target_exist_error() -> void:
+       if not limit_target.is_empty():
+               printerr("Unable to set Limit Side due to Limit Target ", _limit_node.name,  " being assigned")
+
+
+# Sets a [memeber limit_target] node.
+func set_limit_target(value: NodePath) -> void:
+       limit_target = value
+
+       # Waits for PCam2d's _ready() before trying to validate limit_node_path
+       if not is_node_ready(): await ready
+
+       # Removes signal from existing TileMap node
+       if is_instance_valid(get_node_or_null(value)):
+               var prev_limit_node: Node2D = _limit_node
+               var new_limit_node: Node2D = get_node(value)
+
+               if prev_limit_node is TileMap:
+                       if prev_limit_node.changed.is_connected(_on_tile_map_changed):
+                               prev_limit_node.changed.disconnect(_on_tile_map_changed)
+
+               if new_limit_node is TileMap:
+                       if not new_limit_node.changed.is_connected(_on_tile_map_changed):
+                               new_limit_node.changed.connect(_on_tile_map_changed)
+               elif new_limit_node is CollisionShape2D:
+                       var col_shape: CollisionShape2D = get_node(value)
+
+                       if col_shape.shape == null:
+                               printerr("No Shape2D in: ", col_shape.name)
+                               reset_limit()
+                               limit_target = null
+                               return
+               else:
+                       printerr("Limit Target is not a TileMap or CollisionShape2D node")
+                       return
+
+       elif value == NodePath(""):
+               reset_limit()
+               limit_target = null
+       else:
+               printerr("Limit Target cannot be found")
+               return
+
+       _limit_node = get_node_or_null(value)
+
+       notify_property_list_changed()
+       update_limit_all_sides()
+
+## Get [member limit_target] node.
+func get_limit_target() -> NodePath:
+       if not limit_target: # TODO - Fixes an spam error if if limit_taret is empty
+               return NodePath("")
+       else:
+               return limit_target
+
+
+## Set Tile Map Limit Margin.
+func set_limit_margin(value: Vector4i) -> void:
+       limit_margin = value
+       update_limit_all_sides()
+## Get Tile Map Limit Margin.
+func get_limit_margin() -> Vector4i:
+       return limit_margin
+
+
+### Enables or disables the Limit Smoothing beaviour.
+#func set_limit_smoothing(value: bool) -> void:
+       #limit_smoothed = value
+       #if is_active() and _has_valid_pcam_owner():
+               #get_pcam_host_owner().camera_2d.reset_smoothing()
+### Returns the Limit Smoothing beaviour.
+#func get_limit_smoothing() -> bool:
+       #return limit_smoothed
+
+
+## Sets [member inactive_update_mode] property.
+func set_inactive_update_mode(value: int) -> void:
+       inactive_update_mode = value
+
+## Gets [enum InactiveUpdateMode] value.
+func get_inactive_update_mode() -> int:
+       return inactive_update_mode
+
+
+func set_follow_target_physics_based(value: bool, caller: Node) -> void:
+       if is_instance_of(caller, PhantomCameraHost):
+               _follow_target_physics_based = value
+       else:
+               printerr("set_follow_target_physics_based() is for internal use only.")
+func get_follow_target_physics_based() -> bool:
+       return _follow_target_physics_based
+
+
+func get_class() -> String:
+       return "PhantomCamera2D"
+
+
+func is_class(value) -> bool:
+       return value == "PhantomCamera2D"
+
+#endregion
diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd
new file mode 100644 (file)
index 0000000..2342157
--- /dev/null
@@ -0,0 +1,1562 @@
+@tool
+@icon("res://addons/phantom_camera/icons/phantom_camera_3d.svg")
+class_name PhantomCamera3D
+extends Node3D
+
+## Controls a scene's [Camera3D] and applies logic to it.
+##
+## The scene's [param Camera3D] will follow the position of the
+## [param PhantomCamera3D] with the highest priority.
+## Each instance can have different positional and rotational logic applied
+## to them.
+
+#region Constants
+
+const _constants = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd")
+
+#endregion
+
+
+#region Signals
+
+## Emitted when the [param PhantomCamera3D] becomes active.
+signal became_active
+## Emitted when the [param PhantomCamera3D] becomes inactive.
+signal became_inactive
+
+## Emitted when [member follow_target] changes.
+signal follow_target_changed
+
+## Emitted when [member look_at_target] changes.
+signal look_at_target_changed
+
+## Emitted when dead zones changes. [br]
+## [b]Note:[/b] Only applicable in [param Framed] [member FollowMode].
+signal dead_zone_changed
+
+## Emitted when the [param Camera3D] starts to tween to another
+## [param PhantomCamera3D].
+signal tween_started
+## Emitted when the [param Camera3D] is to tweening towards another
+## [param PhantomCamera3D].
+signal is_tweening
+## Emitted when the tween is interrupted due to another [param PhantomCamera3D]
+## becoming active. The argument is the [param PhantomCamera3D] that
+## interrupted the tween.
+signal tween_interrupted(pcam_3d: PhantomCamera3D)
+## Emitted when the [param Camera3D] completes its tween to the
+## [param PhantomCamera3D].
+signal tween_completed
+
+#endregion
+
+
+#region Enums
+
+## Determines the positional logic for a given [param PhantomCamera3D]
+## [br][br]
+## The different modes have different functionalities and purposes, so choosing
+## the correct one depends on what each [param PhantomCamera3D] is meant to do.
+enum FollowMode {
+       NONE                    = 0, ## Default - No follow logic is applied.
+       GLUED                   = 1, ## Sticks to its target.
+       SIMPLE                  = 2, ## Follows its target with an optional offset.
+       GROUP                   = 3, ## Follows multiple targets with option to dynamically reframe itself.
+       PATH                    = 4, ## Follows a target while being positionally confined to a [Path3D] node.
+       FRAMED                  = 5, ## Applies a dead zone on the frame and only follows its target when it tries to leave it.
+       THIRD_PERSON    = 6, ## Applies a [SpringArm3D] node to the target's position and allows for rotating around it.
+}
+
+## Determines the rotational logic for a given [param PhantomCamera3D].[br][br]
+## The different modes has different functionalities and purposes, so
+## choosing the correct mode depends on what each [param PhantomCamera3D]
+## is meant to do.
+enum LookAtMode {
+       NONE    = 0, ## Default - No Look At logic is applied.
+       MIMIC   = 1, ## Copies its target's rotational value.
+       SIMPLE  = 2, ## Looks at its target in a straight line.
+       GROUP   = 3, ## Looks at the centre of its targets.
+}
+
+## Determines how often an inactive [param PhantomCamera3D] should update
+## its positional and rotational values. This is meant to reduce the amount
+## of calculations inactive [param PhantomCamera3D] are doing when idling
+## to improve performance.
+enum InactiveUpdateMode {
+       ALWAYS, ## Always updates the [param PhantomCamera3D], even when it's inactive.
+       NEVER,  ## Never updates the [param PhantomCamera3D] when it's inactive. Reduces the amount of computational resources when inactive.
+#      EXPONENTIALLY,
+}
+
+#endregion
+
+
+#region Variables
+
+## The [PhantomCameraHost] that owns this [param PhantomCamera2D].
+var pcam_host_owner: PhantomCameraHost = null:
+       set = set_pcam_host_owner,
+       get = get_pcam_host_owner
+
+var _is_active: bool = false
+
+## To quickly preview a [param PhantomCamera3D] without adjusting its
+## [member Priority], this property allows the selected [param PhantomCamera3D]
+## to ignore the Priority system altogether and forcefully become the active
+## one. It's partly designed to work within the [param viewfinder], and will be
+## disabled when running a build export of the game.
+@export var priority_override: bool = false:
+       set(value):
+               if Engine.is_editor_hint() and _has_valid_pcam_owner():
+                       if value == true:
+                               priority_override = value
+                               get_pcam_host_owner().pcam_priority_override(self)
+                       else:
+                               priority_override = value
+                               get_pcam_host_owner().pcam_priority_updated(self)
+                               get_pcam_host_owner().pcam_priority_override_disabled()
+       get:
+               return priority_override
+
+## It defines which [param PhantomCamera3D] a scene's [param Camera3D] should
+## be corresponding with and be attached to. This is decided by the
+## [param PhantomCamera3D] with the highest [param priority].
+## [br][br]
+## Changing [param priority] will send an event to the scene's
+## [PhantomCameraHost], which will then determine whether if the
+## [param priority] value is greater than or equal to the currently
+## highest [param PhantomCamera3D]'s in the scene. The
+## [param PhantomCamera3D] with the highest value will then reattach the
+## Camera accordingly.
+@export var priority: int = 0:
+       set = set_priority,
+       get = get_priority
+
+## Determines the positional logic for a given [param PhantomCamera3D].
+## The different modes have different functionalities and purposes, so
+## choosing the correct one depends on what each [param PhantomCamera3D]
+## is meant to do.
+@export var follow_mode: FollowMode = FollowMode.NONE:
+       set(value):
+               follow_mode = value
+
+               if value == FollowMode.FRAMED:
+                       if _follow_framed_initial_set and follow_target:
+                               _follow_framed_initial_set = false
+                               dead_zone_changed.connect(_on_dead_zone_changed)
+               else:
+                       if  dead_zone_changed.is_connected(_on_dead_zone_changed):
+                               dead_zone_changed.disconnect(_on_dead_zone_changed)
+
+               if follow_mode == FollowMode.NONE:
+                       _should_follow = false
+               elif follow_mode == FollowMode.GROUP and follow_targets or follow_target:
+                       _should_follow = true
+
+               notify_property_list_changed()
+       get:
+               return follow_mode
+
+
+## Determines which target should be followed.
+## The [param Camera3D] will follow the position of the Follow Target based on
+## the [member follow_mode] type and its parameters.
+@export var follow_target: Node3D = null:
+       set = set_follow_target,
+       get = get_follow_target
+var _should_follow: bool = false
+var _follow_target_physics_based: bool = false
+var _physics_interpolation_enabled = false ## TOOD - Should be anbled once toggling physics_interpolation_mode ON, when previously OFF, works in 3D
+
+## Defines the targets that the [param PhantomCamera3D] should be following.
+@export var follow_targets: Array[Node3D] = []:
+       set = set_follow_targets,
+       get = get_follow_targets
+var _has_multiple_follow_targets: bool = false
+
+
+## Determines the [Path3D] node the [param PhantomCamera3D]
+## should be bound to.
+## The [param PhantomCamera3D] will follow the position of the
+## [member follow_target] while sticking to the closest point on this path.
+@export var follow_path: Path3D = null:
+       set = set_follow_path,
+       get = get_follow_path
+
+
+## Determines the rotational logic for a given [param PhantomCamera3D].
+## The different modes has different functionalities and purposes,
+## so choosing the correct mode depends on what each
+## [param PhantomCamera3D] is meant to do.
+@export var look_at_mode: LookAtMode = LookAtMode.NONE:
+       set(value):
+               look_at_mode = value
+               if look_at_target is Node3D:
+                       _should_look_at = true
+
+               if look_at_mode == LookAtMode.NONE:
+                       _should_look_at = false
+               elif  look_at_mode == LookAtMode.GROUP and look_at_targets or look_at_target:
+                       _should_look_at = true
+
+               notify_property_list_changed()
+       get:
+               return look_at_mode
+var _should_look_at: bool = false
+var _multiple_look_at_targets: bool = false
+
+## Determines which target should be looked at.
+## The [param PhantomCamera3D] will update its rotational value as the
+## target changes its position.
+@export var look_at_target: Node3D = null:
+       set = set_look_at_target,
+       get = get_look_at_target
+
+## Defines the targets that the camera should looking at.
+## It will be looking at the centre of all the assigned targets.
+@export var look_at_targets: Array[Node3D] = []:
+       set = set_look_at_targets,
+       get = get_look_at_targets
+var _valid_look_at_targets: Array[Node3D] = []
+
+## Defines how [param ]PhantomCamera3Ds] transition between one another.
+## Changing the tween values for a given [param PhantomCamera3D]
+## determines how transitioning to that instance will look like.
+## This is a resource type that can be either used for one
+## [param PhantomCamera] or reused across multiple - both 2D and 3D.
+## By default, all [param PhantomCameras] will use a [param linear]
+## transition, [param easeInOut] ease with a [param 1s] duration.
+@export var tween_resource: PhantomCameraTween = PhantomCameraTween.new():
+       set = set_tween_resource,
+       get = get_tween_resource
+var _has_tweened: bool = false
+
+## If enabled, the moment a [param PhantomCamera3D] is instantiated into
+## a scene, and has the highest priority, it will perform its tween transition.
+## This is most obvious if a [param PhantomCamera3D] has a long duration and
+## is attached to a playable character that can be moved the moment a scene
+## is loaded. Disabling the [param tween_on_load] property will
+## disable this behaviour and skip the tweening entirely when instantiated.
+@export var tween_on_load: bool = true:
+       set = set_tween_on_load,
+       get = get_tween_on_load
+
+## Determines how often an inactive [param PhantomCamera3D] should update
+## its positional and rotational values. This is meant to reduce the amount
+## of calculations inactive [param PhantomCamera3Ds] are doing when idling
+## to improve performance.
+@export var inactive_update_mode: InactiveUpdateMode = InactiveUpdateMode.ALWAYS:
+       set = set_inactive_update_mode,
+       get = get_inactive_update_mode
+
+
+## A resource type that allows for overriding the [param Camera3D] node's
+## properties.
+@export var camera_3d_resource: Camera3DResource = Camera3DResource.new():
+       set = set_camera_3d_resource,
+       get = get_camera_3d_resource
+
+@export_group("Follow Parameters")
+## Offsets the [member follow_target] position.
+@export var follow_offset: Vector3 = Vector3.ZERO:
+       set = set_follow_offset,
+       get = get_follow_offset
+
+## Applies a damping effect on the camera's movement.
+## Leading to heavier / slower camera movement as the targeted node moves around.
+## This is useful to avoid sharp and rapid camera movement.
+@export var follow_damping: bool = false:
+       set = set_follow_damping,
+       get = get_follow_damping
+
+## Defines the damping amount. The ideal range should be somewhere between 0-1.[br][br]
+## The damping amount can be specified in the individual axis.[br][br]
+## [b]Lower value[/b] = faster / sharper camera movement.[br]
+## [b]Higher value[/b] = slower / heavier camera movement.
+@export var follow_damping_value: Vector3 = Vector3(0.1, 0.1, 0.1):
+       set = set_follow_damping_value,
+       get = get_follow_damping_value
+var _follow_velocity_ref: Vector3 = Vector3.ZERO # Stores and applies the velocity of the movement
+
+## Sets a distance offset from the centre of the target's position.
+## The distance is applied to the [param PhantomCamera3D]'s local z axis.
+@export var follow_distance: float = 1:
+       set = set_follow_distance,
+       get = get_follow_distance
+
+## Enables the [param PhantomCamera3D] to automatically distance
+## itself as the [param follow targets] move further apart.[br]
+## It looks at the longest axis between the different targets and interpolates
+## the distance length between the [member auto_follow_distance_min] and
+## [member follow_group_distance] properties.[br][br]
+## Note: Enabling this property hides and disables the [member follow_distance]
+## property as this effectively overrides that property.
+@export var auto_follow_distance: bool = false:
+       set = set_auto_follow_distance,
+       get = get_auto_follow_distance
+
+## Sets the minimum distance between the Camera and centre of [AABB].
+## [br][br]
+## Note: This distance will only ever be reached when all the targets are in
+## the exact same [param Vector3] coordinate, which will very unlikely
+## happen, so adjust the value here accordingly.
+@export var auto_follow_distance_min: float = 1:
+       set = set_auto_follow_distance_min,
+       get = get_auto_follow_distance_min
+
+## Sets the maximum distance between the Camera and centre of [AABB].
+@export var auto_follow_distance_max: float = 5:
+       set = set_auto_follow_distance_max,
+       get = get_auto_follow_distance_max
+
+## Determines how fast the [member auto_follow_distance] moves between the
+## maximum and minimum distance. The higher the value, the sooner the
+## maximum distance is reached.[br][br]
+## This value should be based on the sizes of the [member auto_follow_distance_min]
+## and [member auto_follow_distance_max].[br]
+## E.g. if the value between the [member auto_follow_distance_min] and
+## [member auto_follow_distance_max] is small, consider keeping the number low
+## and vice versa.
+@export var auto_follow_distance_divisor: float = 10:
+       set = set_auto_follow_distance_divisor,
+       get = get_auto_follow_distance_divisor
+
+@export_subgroup("Dead Zones")
+## Defines the horizontal dead zone area. While the target is within it, the
+## [param PhantomCamera3D] will not move in the horizontal axis.
+## If the targeted node leaves the horizontal bounds, the
+## [param PhantomCamera3D] will follow the target horizontally to keep
+## it within bounds.
+@export_range(0, 1) var dead_zone_width: float = 0:
+       set(value):
+               dead_zone_width = value
+               dead_zone_changed.emit()
+       get:
+               return dead_zone_width
+
+## Defines the vertical dead zone area. While the target is within it, the
+## [param PhantomCamera3D] will not move in the vertical axis.
+## If the targeted node leaves the vertical bounds, the
+## [param PhantomCamera3D] will follow the target horizontally to keep
+## it within bounds.
+@export_range(0, 1) var dead_zone_height: float = 0:
+       set(value):
+               dead_zone_height = value
+               dead_zone_changed.emit()
+       get:
+               return dead_zone_height
+
+## Enables the dead zones to be visible when running the game from the editor.
+## Dead zones will never be visible in build exports.
+@export var show_viewfinder_in_play: bool = false
+
+## Defines the position of the [member follow_target] within the viewport.[br]
+## This is only used for when [member follow_mode] is set to [param Framed].
+var viewport_position: Vector2
+var _follow_framed_initial_set: bool = false
+var _follow_framed_offset: Vector3
+
+@export_subgroup("Spring Arm")
+var _follow_spring_arm: SpringArm3D
+
+## Defines the [member SpringArm3D.spring_length].
+@export var spring_length: float = 1:
+       set = set_spring_length,
+       get = get_spring_length
+
+## Defines the [member SpringArm3D.collision_mask] node's Collision Mask.
+@export_flags_3d_physics var collision_mask: int = 1:
+       set = set_collision_mask,
+       get = get_collision_mask
+
+## Defines the [member SpringArm3D.shape] node's Shape3D.
+@export var shape: Shape3D = null:
+       set = set_shape,
+       get = get_shape
+
+## Defines the [member SpringArm3D.margin] node's Margin.
+@export var margin: float = 0.01:
+       set = set_margin,
+       get = get_margin
+
+@export_group("Look At Parameters")
+## Offsets the target's [param Vector3] position that the
+## [param PhantomCamera3D] is looking at.
+@export var look_at_offset: Vector3 = Vector3.ZERO:
+       set = set_look_at_offset,
+       get = get_look_at_offset
+
+## Applies a damping effect on the camera's rotation.
+## Leading to heavier / slower camera movement as the targeted node moves around.
+## This is useful to avoid sharp and rapid camera rotation.
+@export var look_at_damping: bool = false:
+       set = set_look_at_damping,
+       get = get_look_at_damping
+
+## Defines the Rotational damping amount. The ideal range is typicall somewhere between 0-1.[br][br]
+## The damping amount can be specified in the individual axis.[br][br]
+## [b]Lower value[/b] = faster / sharper camera rotation.[br]
+## [b]Higher value[/b] = slower / heavier camera rotation.
+@export_range(0.0, 1.0, 0.001, "or_greater") var look_at_damping_value: float = 0.25:
+       set = set_look_at_damping_value,
+       get = get_look_at_damping_value
+
+var _current_rotation: Vector3
+
+#endregion
+
+# NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box.
+var _phantom_camera_manager: Node
+
+
+#region Property Validator
+
+func _validate_property(property: Dictionary) -> void:
+       ################
+       ## Follow Target
+       ################
+       if property.name == "follow_target":
+               if follow_mode == FollowMode.NONE or \
+               follow_mode == FollowMode.GROUP:
+                       property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       if property.name == "follow_path" and \
+       follow_mode != FollowMode.PATH:
+               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       ####################
+       ## Follow Parameters
+       ####################
+
+       if follow_mode == FollowMode.NONE:
+               match property.name:
+                       "follow_offset", \
+                       "follow_damping", \
+                       "follow_damping_value":
+                               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       if property.name == "follow_offset":
+               if follow_mode == FollowMode.PATH or \
+               follow_mode == FollowMode.GLUED:
+                       property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       if property.name == "follow_damping_value" and not follow_damping:
+               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       if property.name == "follow_distance":
+               if not follow_mode == FollowMode.FRAMED:
+                       if not follow_mode == FollowMode.GROUP or \
+                       auto_follow_distance: \
+                               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       ###############
+       ## Group Follow
+       ###############
+       if property.name == "follow_targets" and \
+       not follow_mode == FollowMode.GROUP:
+               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       if property.name == "auto_follow_distance" and \
+       not follow_mode == FollowMode.GROUP:
+               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       if not auto_follow_distance:
+               match property.name:
+                       "auto_follow_distance_min", \
+                       "auto_follow_distance_max", \
+                       "auto_follow_distance_divisor":
+                               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       ###############
+       ## Framed Follow
+       ###############
+       if not follow_mode == FollowMode.FRAMED:
+               match property.name:
+                       "dead_zone_width", \
+                       "dead_zone_height", \
+                       "show_viewfinder_in_play":
+                               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       ######################
+       ## Third Person Follow
+       ######################
+       if not follow_mode == FollowMode.THIRD_PERSON:
+               match property.name:
+                       "spring_length", \
+                       "collision_mask", \
+                       "shape", \
+                       "margin":
+                               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       ##########
+       ## Look At
+       ##########
+       if look_at_mode == LookAtMode.NONE:
+               match property.name:
+                       "look_at_target", \
+                       "look_at_offset" , \
+                       "look_at_damping", \
+                       "look_at_damping_value":
+                               property.usage = PROPERTY_USAGE_NO_EDITOR
+       elif look_at_mode == LookAtMode.GROUP:
+               match property.name:
+                       "look_at_target":
+                               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       if property.name == "look_at_target":
+               if look_at_mode == LookAtMode.NONE or \
+               look_at_mode == LookAtMode.GROUP:
+                       property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       if property.name == "look_at_targets" and \
+       not look_at_mode == LookAtMode.GROUP:
+               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       if property.name == "look_at_damping_value" and \
+       not look_at_damping:
+               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       notify_property_list_changed()
+#endregion
+
+#region Private Functions
+
+func _enter_tree() -> void:
+       _phantom_camera_manager = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME)
+
+       _phantom_camera_manager.pcam_added(self)
+
+       if not _phantom_camera_manager.get_phantom_camera_hosts().is_empty():
+               set_pcam_host_owner(_phantom_camera_manager.get_phantom_camera_hosts()[0])
+
+       #if not get_parent() is SpringArm3D:
+               #if look_at_target:
+                       #_look_at_target_node = look_at_target
+               #elif look_at_targets:
+                       #_look_at_group_nodes.clear()
+                       #for path in look_at_targets:
+                               #if not path.is_empty() and path:
+                                       #_should_look_at = true
+                                       #_has_look_at_targets = true
+                                       #_look_at_group_nodes.append(path)
+
+
+func _exit_tree() -> void:
+       _phantom_camera_manager.pcam_removed(self)
+
+       if _has_valid_pcam_owner():
+               get_pcam_host_owner().pcam_removed_from_scene(self)
+
+
+
+func _ready():
+       if follow_mode == FollowMode.THIRD_PERSON:
+               if not Engine.is_editor_hint():
+                       if not is_instance_valid(_follow_spring_arm):
+                               _follow_spring_arm = SpringArm3D.new()
+                               _follow_spring_arm.top_level = true
+                               _follow_spring_arm.rotation = global_rotation
+                               _follow_spring_arm.position = _get_target_position_offset() if is_instance_valid(follow_target) else global_position
+                               _follow_spring_arm.spring_length = spring_length
+                               _follow_spring_arm.collision_mask = collision_mask
+                               _follow_spring_arm.shape = shape
+                               _follow_spring_arm.margin = margin
+                               get_parent().add_child.call_deferred(_follow_spring_arm)
+                               reparent.call_deferred(_follow_spring_arm)
+       if follow_mode == FollowMode.FRAMED:
+               if not Engine.is_editor_hint():
+                       _follow_framed_offset = global_position - _get_target_position_offset()
+                       _current_rotation = global_rotation
+
+
+func _process(delta: float) -> void:
+       if not _follow_target_physics_based:
+               _process_logic(delta)
+
+
+func _physics_process(delta: float):
+       if _follow_target_physics_based:
+               _process_logic(delta)
+
+
+func _process_logic(delta: float) -> void:
+       if not _is_active:
+               match inactive_update_mode:
+                       InactiveUpdateMode.NEVER:       return
+                       # InactiveUpdateMode.EXPONENTIALLY:
+                       # TODO - Trigger positional updates less frequently as more Pcams gets added
+       if _should_follow:
+               _follow(delta)
+       if _should_look_at:
+               _look_at() # TODO - Delta needs to be applied, pending Godot's 3D Physics Interpolation to be implemented
+
+
+func _follow(delta: float) -> void:
+       var follow_position: Vector3
+
+       var follow_target_node: Node3D = self
+
+       match follow_mode:
+               FollowMode.GLUED:
+                       if follow_target:
+                               follow_position = follow_target.global_position
+               FollowMode.SIMPLE:
+                       if follow_target:
+                               follow_position = _get_target_position_offset()
+               FollowMode.GROUP:
+                       if follow_targets:
+                               if follow_targets.size() == 1:
+                                       follow_position = \
+                                               follow_targets[0].global_position + \
+                                               follow_offset + \
+                                               get_transform().basis.z * \
+                                               Vector3(follow_distance, follow_distance, follow_distance)
+
+                               elif follow_targets.size() > 1:
+                                       var bounds: AABB = AABB(follow_targets[0].global_position, Vector3.ZERO)
+                                       for node in follow_targets:
+                                               if is_instance_valid(node):
+                                                       bounds = bounds.expand(node.global_position)
+
+                                       var distance: float
+                                       if auto_follow_distance:
+                                               distance = lerp(auto_follow_distance_min, auto_follow_distance_max, bounds.get_longest_axis_size() / auto_follow_distance_divisor)
+                                               distance = clamp(distance, auto_follow_distance_min, auto_follow_distance_max)
+                                       else:
+                                               distance = follow_distance
+
+                                       follow_position = \
+                                               bounds.get_center() + \
+                                               follow_offset + \
+                                               get_transform().basis.z * \
+                                               Vector3(distance, distance, distance)
+               FollowMode.PATH:
+                       if follow_target and follow_path:
+                               var path_position: Vector3 = follow_path.global_position
+                               follow_position = \
+                                       follow_path.curve.get_closest_point(
+                                               follow_target.global_position - path_position
+                                       ) + path_position
+               FollowMode.FRAMED:
+                       if follow_target:
+                               if not Engine.is_editor_hint():
+                                       if not _is_active || get_pcam_host_owner().get_trigger_pcam_tween():
+                                               follow_position = _get_position_offset_distance()
+                                               _interpolate_position(follow_position, delta)
+                                               return
+
+                                       viewport_position = get_viewport().get_camera_3d().unproject_position(_get_target_position_offset())
+                                       var visible_rect_size: Vector2 = get_viewport().get_viewport().size
+                                       viewport_position = viewport_position / visible_rect_size
+                                       _current_rotation = global_rotation
+
+                                       if _current_rotation != global_rotation:
+                                               follow_position = _get_position_offset_distance()
+
+                                       if _get_framed_side_offset() != Vector2.ZERO:
+                                               var target_position: Vector3 = _get_target_position_offset() + _follow_framed_offset
+                                               var glo_pos: Vector3
+
+                                               if dead_zone_width == 0 || dead_zone_height == 0:
+                                                       if dead_zone_width == 0 && dead_zone_height != 0:
+                                                               glo_pos = _get_position_offset_distance()
+                                                               glo_pos.z = target_position.z
+                                                               follow_position = glo_pos
+                                                       elif dead_zone_width != 0 && dead_zone_height == 0:
+                                                               glo_pos = _get_position_offset_distance()
+                                                               glo_pos.x = target_position.x
+                                                               follow_position = glo_pos
+                                                       else:
+                                                               follow_position = _get_position_offset_distance()
+                                               else:
+                                                       if _current_rotation != global_rotation:
+                                                               var opposite: float = sin(-global_rotation.x) * follow_distance + _get_target_position_offset().y
+                                                               glo_pos.y = _get_target_position_offset().y + opposite
+                                                               glo_pos.z = sqrt(pow(follow_distance, 2) - pow(opposite, 2)) + _get_target_position_offset().z
+                                                               glo_pos.x = global_position.x
+
+                                                               follow_position = glo_pos
+                                                               _current_rotation = global_rotation
+                                                       else:
+                                                               follow_position = target_position
+                                       else:
+                                               _follow_framed_offset = global_position - _get_target_position_offset()
+                                               _current_rotation = global_rotation
+                                               return
+                               else:
+                                       follow_position = _get_position_offset_distance()
+                                       var unprojected_position: Vector2 = _get_raw_unprojected_position()
+                                       var viewport_width: float = get_viewport().size.x
+                                       var viewport_height: float = get_viewport().size.y
+                                       var camera_aspect: Camera3D.KeepAspect = get_viewport().get_camera_3d().keep_aspect
+                                       var visible_rect_size: Vector2 = get_viewport().get_viewport().size
+
+                                       unprojected_position = unprojected_position - visible_rect_size / 2
+                                       if camera_aspect == Camera3D.KeepAspect.KEEP_HEIGHT:
+#                                                      Landscape View
+                                               var aspect_ratio_scale: float = viewport_width / viewport_height
+                                               unprojected_position.x = (unprojected_position.x / aspect_ratio_scale + 1) / 2
+                                               unprojected_position.y = (unprojected_position.y + 1) / 2
+                                       else:
+#                                                      Portrait View
+                                               var aspect_ratio_scale: float = viewport_height / viewport_width
+                                               unprojected_position.x = (unprojected_position.x + 1) / 2
+                                               unprojected_position.y = (unprojected_position.y / aspect_ratio_scale + 1) / 2
+
+                                       viewport_position = unprojected_position
+               FollowMode.THIRD_PERSON:
+                       if follow_target:
+                               if not Engine.is_editor_hint():
+                                       if is_instance_valid(follow_target) and is_instance_valid(_follow_spring_arm):
+                                               follow_position = _get_target_position_offset()
+                                               follow_target_node = _follow_spring_arm
+                               else:
+                                       follow_position = _get_position_offset_distance()
+
+       _interpolate_position(follow_position, delta, follow_target_node)
+
+
+func _look_at() -> void:
+       match look_at_mode:
+               LookAtMode.MIMIC:
+                       global_rotation = look_at_target.global_rotation
+               LookAtMode.SIMPLE:
+                       _interpolate_rotation(look_at_target.global_position)
+               LookAtMode.GROUP:
+                       if not _multiple_look_at_targets:
+                               if look_at_targets.size() == 0: return
+                               _interpolate_rotation(look_at_targets[0].global_position)
+                       else:
+                               var bounds: AABB = AABB(look_at_targets[0].global_position, Vector3.ZERO)
+                               for node in look_at_targets:
+                                       bounds = bounds.expand(node.global_position)
+                               _interpolate_rotation(bounds.get_center())
+
+
+func _get_target_position_offset() -> Vector3:
+       return follow_target.global_position + follow_offset
+
+
+func _get_position_offset_distance() -> Vector3:
+       return _get_target_position_offset() + \
+       get_transform().basis.z * Vector3(follow_distance, follow_distance, follow_distance)
+
+
+func _set_follow_velocity(index: int, value: float) -> void:
+       _follow_velocity_ref[index] = value
+func _interpolate_position(target_position: Vector3, delta: float, camera_target: Node3D = self) -> void:
+       if follow_damping:
+               for index in 3:
+                       camera_target.global_position[index] = _smooth_damp(
+                               target_position[index],
+                               camera_target.global_position[index],
+                               index,
+                               _follow_velocity_ref[index],
+                               _set_follow_velocity,
+                               follow_damping_value[index]
+                       )
+       else:
+               camera_target.global_position = target_position
+
+
+func _interpolate_rotation(target_trans: Vector3) -> void:
+       var direction: Vector3 = (target_trans - global_position + look_at_offset).normalized()
+       var target_basis: Basis = Basis().looking_at(direction)
+       var target_quat: Quaternion = target_basis.get_rotation_quaternion().normalized()
+       if look_at_damping:
+               var current_quat: Quaternion = quaternion.normalized()
+
+               var damping_time: float = max(0.0001, look_at_damping_value)
+               var t: float = min(1.0, get_process_delta_time() / damping_time)
+
+               var dot: float = current_quat.dot(target_quat)
+
+               if dot < 0.0:
+                       target_quat = -target_quat
+                       dot = -dot
+
+               dot = clampf(dot, -1.0, 1.0)
+
+               var theta: float = acos(dot) * t
+               var sin_theta: float = sin(theta)
+               var sin_theta_total: float = sin(acos(dot))
+
+               # Stop interpolating once sin_theta_total reaches a very low value or 0
+               if sin_theta_total < 0.00001:
+                       return
+
+               var ratio_a: float = cos(theta) - dot * sin_theta / sin_theta_total
+               var ratio_b: float = sin_theta / sin_theta_total
+
+               quaternion = current_quat * ratio_a + target_quat * ratio_b
+       else:
+               quaternion = target_quat
+
+
+func _smooth_damp(target_axis: float, self_axis: float, index: int, current_velocity: float, set_velocity: Callable, damping_time: float, rot: bool = false) -> float:
+               damping_time = maxf(0.0001, damping_time)
+               var omega: float = 2 / damping_time
+               var delta: float = get_process_delta_time()
+               var x: float = omega * delta
+               var exponential: float = 1 / (1 + x + 0.48 * x * x + 0.235 * x * x * x)
+               var diff: float = self_axis - target_axis
+               var _target_axis: float = target_axis
+
+               var max_change: float = INF * damping_time
+               diff = clampf(diff, -max_change, max_change)
+               target_axis = self_axis - diff
+
+               var temp: float = (current_velocity + omega * diff) * delta
+               set_velocity.call(index, (current_velocity - omega * temp) * exponential)
+               var output: float = target_axis + (diff + temp) * exponential
+
+               ## To prevent overshooting
+               if (_target_axis - self_axis > 0.0) == (output > _target_axis):
+                       output = _target_axis
+                       set_velocity.call(index, (output - _target_axis) / delta)
+
+               return output
+
+
+func _get_raw_unprojected_position() -> Vector2:
+       return get_viewport().get_camera_3d().unproject_position(follow_target.global_position + follow_offset)
+
+
+func _on_dead_zone_changed() -> void:
+       global_position = _get_position_offset_distance()
+
+
+func _get_framed_side_offset() -> Vector2:
+       var frame_out_bounds: Vector2
+
+       if viewport_position.x < 0.5 - dead_zone_width / 2:
+               # Is outside left edge
+               frame_out_bounds.x = -1
+
+       if viewport_position.y < 0.5 - dead_zone_height / 2:
+               # Is outside top edge
+               frame_out_bounds.y = 1
+
+       if viewport_position.x > 0.5 + dead_zone_width / 2:
+               # Is outside right edge
+               frame_out_bounds.x = 1
+
+       if viewport_position.y > 0.5001 + dead_zone_height / 2: # 0.501 to resolve an issue where the bottom vertical Dead Zone never becoming 0 when the Dead Zone Vertical parameter is set to 0
+               # Is outside bottom edge
+               frame_out_bounds.y = -1
+
+       return frame_out_bounds
+
+func _set_layer(current_layers: int, layer_number: int, value: bool) -> int:
+       var mask: int = current_layers
+
+       # From https://github.com/godotengine/godot/blob/51991e20143a39e9ef0107163eaf283ca0a761ea/scene/3d/camera_3d.cpp#L638
+       if layer_number < 1 or layer_number > 20:
+               printerr("Render layer must be between 1 and 20.")
+       else:
+               if value:
+                       mask |= 1 << (layer_number - 1)
+               else:
+                       mask &= ~(1 << (layer_number - 1))
+
+       return mask
+
+func _has_valid_pcam_owner() -> bool:
+       if not is_instance_valid(get_pcam_host_owner()): return false
+       if not is_instance_valid(get_pcam_host_owner().camera_3d): return false
+       return true
+
+#endregion
+
+# TBD
+#func get_unprojected_position() -> Vector2:
+       #var unprojected_position: Vector2 = _get_raw_unprojected_position()
+       #var viewport_width: float = get_viewport().size.x
+       #var viewport_height: float = get_viewport().size.y
+       #var camera_aspect: Camera3D.KeepAspect = get_viewport().get_camera_3d().keep_aspect
+       #var visible_rect_size: Vector2 = get_viewport().size
+#
+       #unprojected_position = unprojected_position - visible_rect_size / 2
+       #if camera_aspect == Camera3D.KeepAspect.KEEP_HEIGHT:
+##     print("Landscape View")
+               #var aspect_ratio_scale: float = viewport_width / viewport_height
+               #unprojected_position.x = (unprojected_position.x / aspect_ratio_scale + 1) / 2
+               #unprojected_position.y = (unprojected_position.y + 1) / 2
+       #else:
+##     print("Portrait View")
+               #var aspect_ratio_scale: float = viewport_height / viewport_width
+               #unprojected_position.x = (unprojected_position.x + 1) / 2
+               #unprojected_position.y = (unprojected_position.y / aspect_ratio_scale + 1) / 2
+#
+       #return unprojected_position
+
+
+#region Setter & Getter Functions
+
+## Assigns the value of the [param has_tweened] property.[br]
+## [b][color=yellow]Important:[/color][/b] This value can only be changed
+## from the [PhantomCameraHost] script.
+func set_has_tweened(caller: Node, value: bool) -> void:
+       if is_instance_of(caller, PhantomCameraHost):
+               _has_tweened = value
+       else:
+               printerr("Can only be called PhantomCameraHost class")
+## Returns the current [param has_tweened] value.
+func get_has_tweened() -> bool:
+       return _has_tweened
+
+
+## Assigns the [param PhantomCamera3D] to a new [PhantomCameraHost].[br]
+## [b][color=yellow]Important:[/color][/b] This is currently restricted to
+## plugin internals. Proper support will be added in issue #26.
+func set_pcam_host_owner(value: PhantomCameraHost) -> void:
+       pcam_host_owner = value
+       if is_instance_valid(pcam_host_owner):
+               pcam_host_owner.pcam_added_to_scene(self)
+
+       #if value.size() == 1:
+#      else:
+#              for camera_host in camera_host_group:
+#                      print("Multiple PhantomCameraBases in scene")
+#                      print(pcam_host_group)
+#                      print(pcam.get_tree().get_nodes_in_group(PhantomCameraGroupNames.PHANTOM_CAMERA_HOST_GROUP_NAME))
+#                      multiple_pcam_host_group.append(camera_host)
+#                      return null
+## Sets a PCamHost to
+#func assign_pcam_host(value: PhantomCameraHost) -> void:
+       #pcam_host_owner = value
+## Gets the current [PhantomCameraHost] this [param PhantomCamera3D] is
+## assigned to.
+func get_pcam_host_owner() -> PhantomCameraHost:
+       return pcam_host_owner
+
+
+## Assigns new [member priority] value.
+func set_priority(value: int) -> void:
+       priority = abs(value) # TODO - Make any minus values be 0
+       if _has_valid_pcam_owner():
+               get_pcam_host_owner().pcam_priority_updated(self)
+## Gets current [param Priority] value.
+func get_priority() -> int:
+       return priority
+
+
+## Assigns a new [PhantomCameraTween] resource to the [param PhantomCamera3D].
+func set_tween_resource(value: PhantomCameraTween) -> void:
+       tween_resource = value
+## Gets the [param PhantomCameraTween] resource assigned to the [param PhantomCamera3D].
+## Returns null if there's nothing assigned to it.
+func get_tween_resource() -> PhantomCameraTween:
+       return tween_resource
+
+## Assigns a new [param Tween Duration] to the [member tween_resource] value.[br]
+## The duration value is in seconds.
+func set_tween_duration(value: float) -> void:
+       tween_resource.duration = value
+## Gets the current [param Tween] Duration value. The duration value is in
+## [param seconds].
+func get_tween_duration() -> float:
+       return tween_resource.duration
+
+## Assigns a new [param Tween Transition] to the [member tween_resource] value.[br]
+## The duration value is in seconds.
+func set_tween_transition(value: int) -> void:
+       tween_resource.transition = value
+## Gets the current [param Tween Transition] value.
+func get_tween_transition() -> int:
+       return tween_resource.transition
+
+## Assigns a new [param Tween Ease] to the [member tween_resource] value.[br]
+## The duration value is in seconds.
+func set_tween_ease(value: int) -> void:
+       tween_resource.ease = value
+## Gets the current [param Tween Ease] value.
+func get_tween_ease() -> int:
+       return tween_resource.ease
+
+## Sets the [param PhantomCamera3D] active state[br]
+## [b][color=yellow]Important:[/color][/b] This value can only be changed
+## from the [PhantomCameraHost] script.
+func set_is_active(node: Node, value: bool) -> void:
+       if node is PhantomCameraHost:
+               _is_active = value
+       else:
+               printerr("PCams can only be set from the PhantomCameraHost")
+## Gets current active state of the [param PhantomCamera3D].
+## If it returns true, it means the [param PhantomCamera3D] is what the
+## [param Camera3D] is currently following.
+func is_active() -> bool:
+       return _is_active
+
+
+## Enables or disables the [member tween_on_load].
+func set_tween_on_load(value: bool) -> void:
+       tween_on_load = value
+## Gets the current [member tween_on_load] value.
+func get_tween_on_load() -> bool:
+       return tween_on_load
+
+
+## Gets the current follow mode as an enum int based on [member FollowMode] enum.[br]
+## [b]Note:[/b] Setting [member follow_mode] has purposely not been added.
+## A separate [param PhantomCamera3D] instance should be used instead.
+func get_follow_mode() -> int:
+       return follow_mode
+
+
+## Assigns a new [Node3D] as the [member follow_target].
+func set_follow_target(value: Node3D) -> void:
+       if follow_target == value: return
+       follow_target = value
+
+       _follow_target_physics_based = false
+       if is_instance_valid(value):
+               _should_follow = true
+               _check_physics_body(value)
+       else:
+               _should_follow = false
+       follow_target_changed.emit()
+       notify_property_list_changed()
+## Removes the current [Node3D] [member follow_target].
+func erase_follow_target() -> void:
+       if follow_target == null: return
+       _follow_target_physics_based = false
+       _should_follow = false
+       follow_target = null
+       follow_target_changed.emit()
+## Gets the current Node3D target.
+func get_follow_target() -> Node3D:
+       return follow_target
+
+
+## Assigns a new [Path3D] to the [member follow_path] property.
+func set_follow_path(value: Path3D) -> void:
+       follow_path = value
+## Erases the current [Path3D] from [member follow_path] property.
+func erase_follow_path() -> void:
+       follow_path = null
+## Gets the current [Path3D] from the [member follow_path] property.
+func get_follow_path() -> Path3D:
+       return follow_path
+
+
+## Assigns a new [param follow_targets] array value.
+func set_follow_targets(value: Array[Node3D]) -> void:
+       if follow_targets == value: return
+
+       follow_targets = value
+
+       if follow_targets.is_empty():
+               _should_follow = false
+               _has_multiple_follow_targets = false
+               _follow_target_physics_based = false
+               return
+
+       var valid_instances: int
+       _follow_target_physics_based = false
+       for target in follow_targets:
+               if is_instance_valid(target):
+                       _should_follow = true
+                       valid_instances += 1
+
+                       _check_physics_body(target)
+
+                       if valid_instances > 1:
+                               _has_multiple_follow_targets = true
+## Adds a single [Node3D] to [member follow_targets] array.
+func append_follow_targets(value: Node3D) -> void:
+       if not is_instance_valid(value):
+               printerr(value, " is not a valid instance")
+               return
+
+       if not follow_targets.has(value):
+               follow_targets.append(value)
+               _should_follow = true
+               _has_multiple_follow_targets = true
+               _check_physics_body(value)
+       else:
+               printerr(value, " is already part of Follow Group")
+## Adds an Array of type [Node3D] to [member follow_targets] array.
+func append_follow_targets_array(value: Array[Node3D]) -> void:
+       for target in value:
+               if not is_instance_valid(target): continue
+               if not follow_targets.has(target):
+                       follow_targets.append(target)
+                       _should_follow = true
+                       _check_physics_body(target)
+                       if follow_targets.size() > 1:
+                               _has_multiple_follow_targets = true
+               else:
+                       printerr(value, " is already part of Follow Group")
+## Removes [Node3D] from [member follow_targets].
+func erase_follow_targets(value: Node3D) -> void:
+       follow_targets.erase(value)
+       _follow_target_physics_based = false
+       for target in follow_targets:
+               _check_physics_body(target)
+
+       if follow_targets.size() < 2:
+               _has_multiple_follow_targets = false
+       if follow_targets.size() < 1:
+               _should_follow = false
+## Gets all [Node3D] from [follow_targets].
+func get_follow_targets() -> Array[Node3D]:
+       return follow_targets
+
+## Returns true if the [param PhantomCamera3D] has more than one member in the
+## [member follow_targets] array.
+func get_has_multiple_follow_targets() -> bool:
+       return _has_multiple_follow_targets
+
+func _check_physics_body(target: Node3D) -> void:
+       if target is PhysicsBody3D:
+               ## NOTE - Feature Toggle
+               #if Engine.get_version_info().major == 4 and \
+               #Engine.get_version_info().minor < XX:
+               if ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips"):
+                       print_rich("Following or Looking at a [b]PhysicsBody3D[/b] node will likely result in jitter - on lower physics ticks in particular.")
+                       print_rich("Will have proper support once 3D Physics Interpolation becomes part of the core Godot engine.")
+                       print_rich("Until then, try following the guide on the [url=https://phantom-camera.dev/support/faq#i-m-seeing-jitter-what-can-i-do]documentation site[/url] for better results.")
+                       print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]")
+               return
+               ## TODO - Enable once Godot supports 3D Physics Interpolation
+               #elif not ProjectSettings.get_setting("physics/common/physics_interpolation"):
+                               #printerr("Physics Interpolation is disabled in the Project Settings, recommend enabling it to smooth out physics-based camera movement")
+               #_follow_target_physics_based = true
+
+
+## Assigns a new [param Vector3] for the [param follow_offset] property.
+func set_follow_offset(value: Vector3) -> void:
+       follow_offset = value
+
+## Gets the current [param Vector3] for the [param follow_offset] property.
+func get_follow_offset() -> Vector3:
+       return follow_offset
+
+
+## Enables or disables [member follow_damping].
+func set_follow_damping(value: bool) -> void:
+       follow_damping = value
+       notify_property_list_changed()
+
+## Gets the currents [member follow_damping] property.
+func get_follow_damping() -> bool:
+       return follow_damping
+
+
+## Assigns new [member follow_damping_value] value.
+func set_follow_damping_value(value: Vector3) -> void:
+       ## TODO - Should be using @export_range once minimum version support is Godot 4.3
+       if value.x < 0: value.x = 0
+       elif value.y < 0: value.y = 0
+       elif value.z < 0: value.z = 0
+       follow_damping_value = value
+
+## Gets the currents [member follow_damping_value] value.
+func get_follow_damping_value() -> Vector3:
+       return follow_damping_value
+
+
+## Assigns a new [member follow_distance] value.
+func set_follow_distance(value: float) -> void:
+       follow_distance = value
+
+## Gets [member follow_distance] value.
+func get_follow_distance() -> float:
+       return follow_distance
+
+
+## Enables or disables [member auto_follow_distance] when using Group Follow.
+func set_auto_follow_distance(value: bool) -> void:
+       auto_follow_distance = value
+       notify_property_list_changed()
+
+## Gets [member auto_follow_distance] state.
+func get_auto_follow_distance() -> bool:
+       return auto_follow_distance
+
+
+## Assigns new [member auto_follow_distance_min] value.
+func set_auto_follow_distance_min(value: float) -> void:
+       auto_follow_distance_min = value
+
+## Gets [member auto_follow_distance_min] value.
+func get_auto_follow_distance_min() -> float:
+       return auto_follow_distance_min
+
+
+## Assigns new [member auto_follow_distance_max] value.
+func set_auto_follow_distance_max(value: float) -> void:
+       auto_follow_distance_max = value
+## Gets [member auto_follow_distance_max] value.
+func get_auto_follow_distance_max() -> float:
+       return auto_follow_distance_max
+
+
+## Assigns new [member auto_follow_distance_divisor] value.
+func set_auto_follow_distance_divisor(value: float) -> void:
+       auto_follow_distance_divisor = value
+
+## Gets [member auto_follow_distance_divisor] value.
+func get_auto_follow_distance_divisor() -> float:
+       return auto_follow_distance_divisor
+
+
+## Assigns new rotation (in radians) value to [SpringArm3D] for
+## [param ThirdPerson] [enum FollowMode].
+func set_third_person_rotation(value: Vector3) -> void:
+       _follow_spring_arm.rotation = value
+
+## Gets the rotation value (in radians) from the [SpringArm3D] for
+## [param ThirdPerson] [enum FollowMode].
+func get_third_person_rotation() -> Vector3:
+       return _follow_spring_arm.rotation
+
+
+## Assigns new rotation (in degrees) value to [SpringArm3D] for
+## [param ThirdPerson] [enum FollowMode].
+func set_third_person_rotation_degrees(value: Vector3) -> void:
+       _follow_spring_arm.rotation_degrees = value
+
+## Gets the rotation value (in degrees) from the [SpringArm3D] for
+## [param ThirdPerson] [enum FollowMode].
+func get_third_person_rotation_degrees() -> Vector3:
+       return _follow_spring_arm.rotation_degrees
+
+
+## Assigns new [Quaternion] value to [SpringArm3D] for [param ThirdPerson]
+## [enum FollowMode].
+func set_third_person_quaternion(value: Quaternion) -> void:
+       _follow_spring_arm.quaternion = value
+
+## Gets the [Quaternion] value of the [SpringArm3D] for [param ThirdPerson]
+## [enum Follow mode].
+func get_third_person_quaternion() -> Quaternion:
+       return _follow_spring_arm.quaternion
+
+
+## Assigns a new ThirdPerson [member SpringArm3D.length] value.
+func set_spring_length(value: float) -> void:
+       follow_distance = value
+       if is_instance_valid(_follow_spring_arm):
+               _follow_spring_arm.spring_length = value
+
+## Gets the [member SpringArm3D.length]
+## from a [param ThirdPerson] [enum follow_mode] instance.
+func get_spring_length() -> float:
+       return follow_distance
+
+
+## Assigns a new [member collision_mask] to the [SpringArm3D] when [enum FollowMode]
+## is set to [param ThirdPerson].
+func set_collision_mask(value: int) -> void:
+       collision_mask = value
+       if is_instance_valid(_follow_spring_arm):
+               _follow_spring_arm.collision_mask = collision_mask
+
+## Enables or disables a specific [member collision_mask] layer for the
+## [SpringArm3D] when [enum FollowMode] is set to [param ThirdPerson].
+func set_collision_mask_value(value: int, enabled: bool) -> void:
+       collision_mask = _set_layer(collision_mask, value, enabled)
+       if is_instance_valid(_follow_spring_arm):
+               _follow_spring_arm.collision_mask = collision_mask
+
+## Gets [member collision_mask] from the [SpringArm3D] when [enum FollowMode]
+## is set to [param ThirdPerson].
+func get_collision_mask() -> int:
+       return collision_mask
+
+
+## Assigns a new [SpringArm3D.shape] when [enum FollowMode]
+## is set to [param ThirdPerson].
+func set_shape(value: Shape3D) -> void:
+       shape = value
+       if is_instance_valid(_follow_spring_arm):
+               _follow_spring_arm.shape = shape
+
+## Gets [param ThirdPerson] [member SpringArm3D.shape] value.
+func get_shape() -> Shape3D:
+       return shape
+
+
+## Assigns a new [member SpringArm3D.margin] value when [enum FollowMode]
+## is set to [param ThirdPerson].
+func set_margin(value: float) -> void:
+       margin = value
+       if is_instance_valid(_follow_spring_arm):
+               _follow_spring_arm.margin = margin
+
+## Gets the [SpringArm3D.margin] when [enum FollowMode] is set to
+## [param ThirdPerson].
+func get_margin() -> float:
+       return margin
+
+
+## Gets the current [member look_at_mode]. Value is based on [enum LookAtMode]
+## enum.[br]
+## Note: To set a new [member look_at_mode], a separate [param PhantomCamera3D] should
+## be used.
+func get_look_at_mode() -> int:
+       return look_at_mode
+
+
+## Assigns new [Node3D] as [member look_at_target].
+func set_look_at_target(value: Node3D) -> void:
+       look_at_target = value
+       _check_physics_body(value)
+       #_look_at_target_node = get_node_or_null(value)
+       look_at_target_changed
+       if is_instance_valid(look_at_target):
+               _should_look_at = true
+       else:
+               _should_look_at = false
+       notify_property_list_changed()
+
+## Gets current [Node3D] from [member look_at_target] property.
+func get_look_at_target():
+       return look_at_target
+
+
+## Sets an array of type [Node3D] to [member set_look_at_targets].
+func set_look_at_targets(value: Array[Node3D]) -> void:
+       if look_at_targets == value: return
+       look_at_targets = value
+
+       if look_at_mode != LookAtMode.GROUP: return
+
+       if look_at_targets.is_empty():
+               _should_look_at = false
+               _multiple_look_at_targets = false
+       else:
+               var valid_instances: int = 0
+               for target in look_at_targets:
+                       if is_instance_valid(target):
+                               valid_instances += 1
+                               _should_look_at = true
+                               _valid_look_at_targets.append(target)
+                               _check_physics_body(target)
+
+                       if valid_instances > 1:
+                               _multiple_look_at_targets = true
+                       elif valid_instances == 0:
+                               _should_look_at = false
+                               _multiple_look_at_targets = false
+       notify_property_list_changed()
+
+## Appends a [Node3D] to [member look_at_targets] array.
+func append_look_at_target(value: Node3D) -> void:
+       if not look_at_targets.has(value):
+               look_at_targets.append(value)
+               _valid_look_at_targets.append(value)
+               _check_physics_body(value)
+               if look_at_targets.size() > 1:
+                       _multiple_look_at_targets = true
+       else:
+               printerr(value, " is already part of Look At Group")
+
+## Appends an array of type [Node3D] to [member look_at_targets] array.
+func append_look_at_targets_array(value: Array[NodePath]) -> void:
+       for val in value:
+               if not look_at_targets.has(get_node(val)):
+                       var node: Node3D = get_node(val)
+                       look_at_targets.append(node)
+                       _valid_look_at_targets.append(node)
+                       _check_physics_body(node)
+                       if look_at_targets.size() > 1:
+                               _multiple_look_at_targets = true
+               else:
+                       printerr(val, " is already part of Look At Group")
+
+## Removes [Node3D] from [member look_at_targets] array.
+func erase_look_at_targets_member(value: Node3D) -> void:
+       look_at_targets.erase(value)
+       _valid_look_at_targets.erase(value)
+       _check_physics_body(value)
+       if look_at_targets.size() < 1:
+               _multiple_look_at_targets = false
+
+## Gets all the [Node3D] instances in [member look_at_targets].
+func get_look_at_targets() -> Array[Node3D]:
+       return look_at_targets
+
+
+## Assigns a new [Vector3] to the [member look_at_offset] value.
+func set_look_at_offset(value: Vector3) -> void:
+       look_at_offset = value
+
+## Gets the current [member look_at_offset] value.
+func get_look_at_offset() -> Vector3:
+       return look_at_offset
+
+
+## Enables or disables [member look_at_damping].
+func set_look_at_damping(value: bool) -> void:
+       look_at_damping = value
+       notify_property_list_changed()
+
+## Gets the currents [member look_at_damping] property.
+func get_look_at_damping() -> bool:
+       return look_at_damping
+
+
+## Assigns new [member look_at_damping_value] value.
+func set_look_at_damping_value(value: float) -> void:
+       look_at_damping_value = value
+
+## Gets the currents [member look_at_damping_value] value.
+func get_look_at_damping_value() -> float:
+       return look_at_damping_value
+
+
+## Sets [member inactive_update_mode] property.
+func set_inactive_update_mode(value: int) -> void:
+       inactive_update_mode = value
+
+## Gets [member inactive_update_mode] property.
+func get_inactive_update_mode() -> int:
+       return inactive_update_mode
+
+
+## Assigns a [Camera3DResource].
+func set_camera_3d_resource(value: Camera3DResource) -> void:
+       camera_3d_resource = value
+
+## Gets the [Camera3DResource]
+func get_camera_3d_resource() -> Camera3DResource:
+       return camera_3d_resource
+
+
+## Assigns a new [member Camera3D.cull_mask] value.[br]
+## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to
+## this [param PhantomCamera3D].
+func set_cull_mask(value: int) -> void:
+       camera_3d_resource.cull_mask = value
+       if _is_active: get_pcam_host_owner().camera_3d.cull_mask = value
+
+## Enables or disables a specific [member Camera3D.cull_mask] layer.[br]
+## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to
+## this [param PhantomCamera3D].
+func set_cull_mask_value(layer_number: int, value: bool) -> void:
+       var mask: int = _set_layer(get_cull_mask(), layer_number, value)
+       camera_3d_resource.cull_mask = mask
+       if _is_active: get_pcam_host_owner().camera_3d.cull_mask = mask
+
+## Gets the [member Camera3D.cull_mask] value assigned to the [Camera3DResource].
+func get_cull_mask() -> int:
+       return camera_3d_resource.cull_mask
+
+
+## Assigns a new [member Camera3D.h_offset] value.[br]
+## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to
+## this [param PhantomCamera3D].
+func set_h_offset(value: float) -> void:
+       camera_3d_resource.h_offset = value
+       if _is_active: get_pcam_host_owner().camera_3d.h_offset = value
+
+## Gets the [member Camera3D.h_offset] value assigned to the [param Camera3DResource].
+func get_h_offset() -> float:
+       return camera_3d_resource.h_offset
+
+
+## Assigns a new [Camera3D.v_offset] value.[br]
+## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to
+## this [param PhantomCamera3D].
+func set_v_offset(value: float) -> void:
+       camera_3d_resource.v_offset = value
+       if _is_active: get_pcam_host_owner().camera_3d.v_offset = value
+
+## Gets the [member Camera3D.v_offset] value assigned to the [param Camera3DResource].
+func get_v_offset() -> float:
+       return camera_3d_resource.v_offset
+
+
+## Assigns a new [Camera3D.projection] value.[br]
+## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to
+## this [param PhantomCamera3D].
+func set_projection(value: int) -> void:
+       camera_3d_resource.projection = value
+       if _is_active: get_pcam_host_owner().camera_3d.projection = value
+
+## Gets the [member Camera3D.projection] value assigned to the [param Camera3DResource].
+func get_projection() -> int:
+       return camera_3d_resource.projection
+
+
+## Assigns a new [member Camera3D.fov] value.[br]
+## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to
+## this [param PhantomCamera3D].
+func set_fov(value: float) -> void:
+       camera_3d_resource.fov = value
+       if _is_active: get_pcam_host_owner().camera_3d.fov = value
+
+## Gets the [member Camera3D.fov] value assigned to the [param Camera3DResource].
+func get_fov() -> float:
+       return camera_3d_resource.fov
+
+
+## Assigns a new [member Camera3D.size] value.[br]
+## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to
+## this [param PhantomCamera3D].
+func set_size(value: float) -> void:
+       camera_3d_resource.size = value
+       if _is_active: get_pcam_host_owner().camera_3d.size = value
+
+## Gets the [member Camera3D.size] value assigned to the [param Camera3DResource].
+func get_size() -> float:
+       return camera_3d_resource.size
+
+
+## Assigns a new [member Camera3D.frustum_offset] value.[br]
+## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to
+## this [param PhantomCamera3D].
+func set_frustum_offset(value: Vector2) -> void:
+       camera_3d_resource.frustum_offset = value
+       if _is_active: get_pcam_host_owner().camera_3d.frustum_offset = value
+
+## Gets the [member Camera3D.frustum_offset] value assigned to the [param Camera3DResource].
+func get_frustum_offset() -> Vector2:
+       return camera_3d_resource.frustum_offset
+
+
+## Assigns a new [member Camera3D.near] value.[br]
+## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to
+## this [param PhantomCamera3D].
+func set_near(value: float) -> void:
+       camera_3d_resource.near = value
+       if _is_active: get_pcam_host_owner().camera_3d.near = value
+
+## Gets the [member Camera3D.near] value assigned to the [param Camera3DResource].
+func get_near() -> float:
+       return camera_3d_resource.near
+
+
+## Assigns a new [member Camera3D.far] value.[br]
+## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to
+## this [param PhantomCamera3D].
+func set_far(value: float) -> void:
+       camera_3d_resource.far = value
+       if _is_active: get_pcam_host_owner().camera_3d.far = value
+
+## Gets the [member Camera3D.far] value assigned to the [param Camera3DResource].
+func get_far() -> float:
+       return camera_3d_resource.far
+
+
+func set_follow_target_physics_based(value: bool, caller: Node) -> void:
+       if is_instance_of(caller, PhantomCameraHost):
+               _follow_target_physics_based = value
+       else:
+               printerr("set_follow_target_physics_based is for internal use only.")
+
+func get_follow_target_physics_based() -> bool:
+       return _follow_target_physics_based
+
+
+func get_class() -> String:
+       return "PhantomCamera3D"
+
+
+func is_class(value) -> bool:
+       return value == "PhantomCamera3D"
+
+#endregion
diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd
new file mode 100644 (file)
index 0000000..43f6cf4
--- /dev/null
@@ -0,0 +1,29 @@
+@tool
+extends RefCounted
+
+#region Constants
+
+#const PhantomCameraHost: Script = preload("res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd")
+
+const CAMERA_2D_NODE_NAME: StringName = "Camera2D"
+const CAMERA_3D_NODE_NAME: StringName = "Camera3D"
+const PCAM_HOST_NODE_NAME: StringName = "PhantomCameraHost"
+const PCAM_MANAGER_NODE_NAME: String = "PhantomCameraManager" # TODO - Convert to StringName once https://github.com/godotengine/godot/pull/72702 is merged
+const PCAM_2D_NODE_NAME: StringName = "PhantomCamera2D"
+const PCAM_3D_NODE_NAME: StringName = "PhantomCamera3D"
+const PCAM_HOST: StringName = "phantom_camera_host"
+
+const COLOR_2D: Color = Color("8DA5F3")
+const COLOR_3D: Color = Color("FC7F7F")
+const COLOR_PCAM: Color = Color("3AB99A")
+const COLOR_PCAM_33: Color = Color("3ab99a33")
+const PCAM_HOST_COLOR: Color = Color("E0E0E0")
+
+#endregion
+
+#region Group Names
+
+const PCAM_GROUP_NAME: StringName = "phantom_camera_group"
+const PCAM_HOST_GROUP_NAME: StringName = "phantom_camera_host_group"
+
+#endregion
diff --git a/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd b/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd
new file mode 100644 (file)
index 0000000..77e8f29
--- /dev/null
@@ -0,0 +1,701 @@
+@tool
+@icon("res://addons/phantom_camera/icons/phantom_camera_host.svg")
+class_name PhantomCameraHost
+extends Node
+
+## Controls a scene's [Camera2D] (2D scenes) and [Camera3D] (3D scenes).
+##
+## All instantiated [param PhantomCameras] in a scene are assign to and managed by a
+## PhantomCameraHost. It is what determines which [param PhantomCamera] should
+## be active.
+
+#region Constants
+
+const _constants := preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd")
+
+#endregion
+
+
+#region Signals
+
+## Updates the viewfinder [param dead zones] sizes.[br]
+## [b]Note:[/b] This is only being used in the editor viewfinder UI.
+signal update_editor_viewfinder
+
+#endregion
+
+
+#region Variables
+
+enum InterpolationMode {
+       AUTO = 0,
+       IDLE = 1,
+       PHYSICS = 2,
+}
+
+## TBD - For when Godot 4.3 becomes the minimum version
+#@export var interpolation_mode: InterpolationMode = InterpolationMode.AUTO:
+       #set = set_interpolation_mode,
+       #get = get_interpolation_mode
+
+
+## For 2D scenes, is the [Camera2D] instance the [param PhantomCameraHost] controls.
+var camera_2d: Camera2D = null
+## For 3D scenes, is the [Camera3D] instance the [param PhantomCameraHost] controls.
+var camera_3d = null ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed.
+
+var _pcam_list: Array[Node] = []
+
+var _active_pcam_2d: PhantomCamera2D = null
+var _active_pcam_3d = null ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed.
+var _active_pcam_priority: int = -1
+var _active_pcam_missing: bool = true
+var _active_pcam_has_damping: bool = false
+var _follow_target_physics_based: bool = false
+
+var _prev_active_pcam_2d_transform: Transform2D = Transform2D()
+var _prev_active_pcam_3d_transform: Transform3D = Transform3D()
+
+var _trigger_pcam_tween: bool = false
+var _tween_elapsed_time: float = 0
+var _tween_duration: float = 0
+
+var _multiple_pcam_hosts: bool = false
+
+var _is_child_of_camera: bool = false
+var _is_2D: bool = false
+
+
+var _viewfinder_node: Control = null
+var _viewfinder_needed_check: bool = true
+
+var _camera_zoom: Vector2 = Vector2.ONE
+
+#region Camera3DResource
+var _prev_cam_h_offset: float = 0
+var _cam_h_offset_changed: bool = false
+
+var _prev_cam_v_offset: float = 0
+var _cam_v_offset_changed: bool = false
+
+var _prev_cam_fov: float = 75
+var _cam_fov_changed: bool = false
+
+var _prev_cam_size: float = 1
+var _cam_size_changed: bool = false
+
+var _prev_cam_frustum_offset: Vector2 = Vector2.ZERO
+var _cam_frustum_offset_changed: bool = false
+
+var _prev_cam_near: float = 0.05
+var _cam_near_changed: bool = false
+
+var _prev_cam_far: float = 4000
+var _cam_far_changed: bool = false
+#endregion
+
+var _active_pcam_2d_glob_transform: Transform2D = Transform2D()
+var _active_pcam_3d_glob_transform: Transform3D = Transform3D()
+
+#endregion
+
+# NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box.
+var _phantom_camera_manager: Node
+
+#region Private Functions
+
+## TBD - For when Godot 4.3 becomes a minimum version
+#func _validate_property(property: Dictionary) -> void:
+       #if property.name == "interpolation_mode" and get_parent() is Node3D:
+               #property.usage = PROPERTY_USAGE_NO_EDITOR
+
+
+func _get_configuration_warnings() -> PackedStringArray:
+       var parent = get_parent()
+
+       if _is_2D:
+               if not parent is Camera2D:
+                       return ["Needs to be a child of a Camera2D in order to work."]
+               else:
+                       return []
+       else:
+               if not parent.is_class("Camera3D"): ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed.
+                       return ["Needs to be a child of a Camera3D in order to work."]
+               else:
+                       return []
+
+
+func _enter_tree() -> void:
+       _phantom_camera_manager = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME)
+
+       var parent = get_parent()
+
+       if parent is Camera2D or parent.is_class("Camera3D"): ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed.
+               _is_child_of_camera = true
+               if parent is Camera2D:
+                       _is_2D = true
+                       camera_2d = parent
+                       ## Force applies position smoothing to be disabled
+                       ## This is to prevent overlap with the interpolation of the PCam2D.
+                       camera_2d.set_position_smoothing_enabled(false)
+               else:
+                       _is_2D = false
+                       camera_3d = parent
+
+               _phantom_camera_manager.pcam_host_added(self)
+#              var already_multi_hosts: bool = multiple_pcam_hosts
+
+               _check_camera_host_amount()
+
+               if _multiple_pcam_hosts:
+                       printerr(
+                               "Only one PhantomCameraHost can exist in a scene",
+                               "\n",
+                               "Multiple PhantomCameraHosts will be supported in https://github.com/ramokz/phantom-camera/issues/26"
+                       )
+                       queue_free()
+
+               if _is_2D:
+                       if not _phantom_camera_manager.get_phantom_camera_2ds().is_empty():
+                               for pcam in _phantom_camera_manager.get_phantom_camera_2ds():
+                                       pcam_added_to_scene(pcam)
+                                       pcam.set_pcam_host_owner(self)
+               else:
+                       if not _phantom_camera_manager.get_phantom_camera_3ds().is_empty():
+                               for pcam in _phantom_camera_manager.get_phantom_camera_3ds():
+                                       pcam_added_to_scene(pcam)
+                                       pcam.set_pcam_host_owner(self)
+
+
+func _exit_tree() -> void:
+       _phantom_camera_manager.pcam_host_removed(self)
+       _check_camera_host_amount()
+
+
+func _ready() -> void:
+       if not is_instance_valid(_active_pcam_2d) or is_instance_valid(_active_pcam_3d): return
+       if _is_2D:
+               _active_pcam_2d_glob_transform = _active_pcam_2d.get_global_transform()
+       else:
+               _active_pcam_3d_glob_transform = _active_pcam_3d.get_global_transform()
+
+
+func _check_camera_host_amount() -> void:
+       if _phantom_camera_manager.get_phantom_camera_hosts().size() > 1:
+               _multiple_pcam_hosts = true
+       else:
+               _multiple_pcam_hosts = false
+
+
+func _assign_new_active_pcam(pcam: Node) -> void:
+       var no_previous_pcam: bool
+
+       if is_instance_valid(_active_pcam_2d) or is_instance_valid(_active_pcam_3d):
+               if _is_2D:
+                       _prev_active_pcam_2d_transform = camera_2d.get_global_transform()
+                       _active_pcam_2d.queue_redraw()
+                       _active_pcam_2d.set_is_active(self, false)
+                       _active_pcam_2d.became_inactive.emit()
+
+                       if _trigger_pcam_tween:
+                               _active_pcam_2d.tween_interrupted.emit(pcam)
+               else:
+                       _prev_active_pcam_3d_transform = camera_3d.get_global_transform()
+
+                       _prev_cam_h_offset = camera_3d.h_offset
+                       _prev_cam_v_offset = camera_3d.v_offset
+                       _prev_cam_fov = camera_3d.fov
+                       _prev_cam_size = camera_3d.size
+                       _prev_cam_frustum_offset = camera_3d.frustum_offset
+                       _prev_cam_near = camera_3d.near
+                       _prev_cam_far = camera_3d.far
+
+                       _active_pcam_3d.set_is_active(self, false)
+                       _active_pcam_3d.became_inactive.emit()
+
+                       if _trigger_pcam_tween:
+                               _active_pcam_3d.tween_interrupted.emit(pcam)
+       else:
+               no_previous_pcam = true
+
+       ## Assign newly active pcam
+       if _is_2D:
+               _active_pcam_2d = pcam
+               _active_pcam_priority = _active_pcam_2d.priority
+               _active_pcam_has_damping = _active_pcam_2d.follow_damping
+               _tween_duration = _active_pcam_2d.get_tween_duration()
+       else:
+               _active_pcam_3d = pcam
+               _active_pcam_priority = _active_pcam_3d.priority
+               _active_pcam_has_damping = _active_pcam_3d.follow_damping
+               _tween_duration = _active_pcam_3d.get_tween_duration()
+
+               # Checks if the Camera3DResource has changed from previous Active PCam3D
+               if _active_pcam_3d.get_camera_3d_resource():
+                       if _prev_cam_h_offset != _active_pcam_3d.get_h_offset():
+                               _cam_h_offset_changed = true
+                       if _prev_cam_v_offset != _active_pcam_3d.get_v_offset():
+                               _cam_v_offset_changed = true
+                       if _prev_cam_fov != _active_pcam_3d.get_fov():
+                               _cam_fov_changed = true
+                       if _prev_cam_size != _active_pcam_3d.get_size():
+                               _cam_size_changed = true
+                       if _prev_cam_frustum_offset != _active_pcam_3d.get_frustum_offset():
+                               _cam_frustum_offset_changed = true
+                       if _prev_cam_near != _active_pcam_3d.get_near():
+                               _cam_near_changed = true
+                       if _prev_cam_far != _active_pcam_3d.get_far():
+                               _cam_far_changed = true
+
+       if _is_2D:
+               if _active_pcam_2d.show_viewfinder_in_play:
+                       _viewfinder_needed_check = true
+
+               _active_pcam_2d.set_is_active(self, true)
+               _active_pcam_2d.became_active.emit()
+               _camera_zoom = camera_2d.get_zoom()
+               ## TODO - Needs 3D variant once Godot supports physics_interpolation for 3D scenes.
+               var _physics_based: bool
+
+               ## NOTE - Only supported in Godot 4.3 or above
+               if Engine.get_version_info().major == 4 and \
+               Engine.get_version_info().minor >= 3:
+                       ## TBD - For when Godot 4.3 becomes the minimum version
+                       #if interpolation_mode == InterpolationMode.IDLE:
+                               #_physics_based = false
+                       #elif interpolation_mode == InterpolationMode.PHYSICS:
+                               #_physics_based = true
+                       #else:
+                               #_physics_based = _active_pcam.follow_target_physics_based
+
+                       # TBD - REMOVE this line once Godot 4.3 becomes the minimum version
+                       _physics_based = _active_pcam_2d.get_follow_target_physics_based()
+
+                       if _physics_based:
+                               _follow_target_physics_based = true
+                               _active_pcam_2d.set_follow_target_physics_based(true, self)
+                               ## TODO - Temporary solution to support Godot 4.2
+                               ## Remove line below and uncomment the following once Godot 4.3 is min verison.
+                               camera_2d.call("reset_physics_interpolation")
+                               camera_2d.set("physics_interpolation_mode", 1)
+                               #camera_2d.reset_physics_interpolation()
+                               #camera_2d.physics_interpolation_mode = Node.PHYSICS_INTERPOLATION_MODE_ON
+                       else:
+                               _follow_target_physics_based = false
+                               _active_pcam_2d.set_follow_target_physics_based(false, self)
+                               ## TODO - Temporary solution to support Godot 4.2
+                               ## Remove line below and uncomment the following once Godot 4.3 is min verison.
+                               camera_2d.set("physics_interpolation_mode", 2)
+                               #camera_2d.physics_interpolation_mode = Node.PHYSICS_INTERPOLATION_MODE_OFF
+       else:
+               _follow_target_physics_based = false
+               if _active_pcam_3d.show_viewfinder_in_play:
+                       _viewfinder_needed_check = true
+
+               _active_pcam_3d.set_is_active(self, true)
+               _active_pcam_3d.became_active.emit()
+               if _active_pcam_3d.get_camera_3d_resource():
+                       camera_3d.cull_mask = _active_pcam_3d.get_cull_mask()
+                       camera_3d.projection = _active_pcam_3d.get_projection()
+
+       if no_previous_pcam:
+               if _is_2D:
+                       _prev_active_pcam_2d_transform = _active_pcam_2d.get_global_transform()
+               else:
+                       _prev_active_pcam_3d_transform = _active_pcam_3d.get_global_transform()
+
+       _tween_elapsed_time = 0
+       if not pcam.get_has_tweened():
+               _trigger_pcam_tween = true
+       else:
+               _trigger_pcam_tween = false
+
+
+func _find_pcam_with_highest_priority() -> void:
+       for pcam in _pcam_list:
+               if pcam.get_priority() > _active_pcam_priority:
+                       _assign_new_active_pcam(pcam)
+
+               pcam.set_has_tweened(self, false)
+
+               _active_pcam_missing = false
+
+
+func _process(delta: float):
+       if _follow_target_physics_based or _active_pcam_missing: return
+
+       if _is_2D:
+               _active_pcam_2d_glob_transform = _active_pcam_2d.get_global_transform()
+       else:
+               _active_pcam_3d_glob_transform = _active_pcam_3d.get_global_transform()
+
+       if _trigger_pcam_tween:
+               _pcam_tween(delta)
+       else:
+               _pcam_follow(delta)
+
+
+func _physics_process(delta: float):
+       if not _follow_target_physics_based or _active_pcam_missing: return
+
+       if _is_2D:
+               _active_pcam_2d_glob_transform = _active_pcam_2d.get_global_transform()
+       else:
+               _active_pcam_3d_glob_transform = _active_pcam_3d.get_global_transform()
+
+       if _trigger_pcam_tween:
+               _pcam_tween(delta)
+       else:
+               _pcam_follow(delta)
+
+
+func _pcam_follow(delta: float) -> void:
+       if _is_2D:
+               if not is_instance_valid(_active_pcam_2d): return
+       else:
+               if not is_instance_valid(_active_pcam_3d): return
+
+       if _active_pcam_missing or not _is_child_of_camera: return
+       # When following
+       _pcam_set_position(delta)
+
+       if _viewfinder_needed_check:
+               _show_viewfinder_in_play()
+               _viewfinder_needed_check = false
+
+       # TODO - Should be able to find a more efficient way using signals
+       if Engine.is_editor_hint():
+               if not _is_2D:
+                       if _active_pcam_3d.get_camera_3d_resource():
+                               camera_3d.cull_mask = _active_pcam_3d.get_cull_mask()
+                               camera_3d.h_offset = _active_pcam_3d.get_h_offset()
+                               camera_3d.v_offset = _active_pcam_3d.get_v_offset()
+                               camera_3d.projection = _active_pcam_3d.get_projection()
+                               camera_3d.fov = _active_pcam_3d.get_fov()
+                               camera_3d.size = _active_pcam_3d.get_size()
+                               camera_3d.frustum_offset = _active_pcam_3d.get_frustum_offset()
+                               camera_3d.near = _active_pcam_3d.get_near()
+                               camera_3d.far = _active_pcam_3d.get_far()
+
+
+func _pcam_set_position(delta: float) -> void:
+       if _is_2D:
+               if _active_pcam_2d.snap_to_pixel:
+                       var snap_to_pixel_glob_transform: Transform2D = _active_pcam_2d_glob_transform
+                       snap_to_pixel_glob_transform.origin = snap_to_pixel_glob_transform.origin.round()
+                       camera_2d.global_transform = snap_to_pixel_glob_transform
+               else:
+                       camera_2d.global_transform =_active_pcam_2d_glob_transform
+               camera_2d.zoom = _active_pcam_2d.zoom
+       else:
+               camera_3d.global_transform = _active_pcam_3d_glob_transform
+
+
+func _pcam_tween(delta: float) -> void:
+       if _tween_elapsed_time < _tween_duration:
+               _pcam_tween_properties(delta)
+       else: # First frame when tweening completes
+               _tween_elapsed_time = 0
+               _trigger_pcam_tween = false
+               #_show_viewfinder_in_play() # NOTE - Likely not needed
+               _pcam_follow(delta)
+
+               if _is_2D:
+                       _active_pcam_2d.update_limit_all_sides()
+                       _active_pcam_2d.tween_completed.emit()
+                       if Engine.is_editor_hint():
+                               _active_pcam_2d.queue_redraw()
+               else:
+                       _cam_h_offset_changed = false
+                       _cam_v_offset_changed = false
+                       _cam_fov_changed = false
+                       _cam_size_changed = false
+                       _cam_frustum_offset_changed = false
+                       _cam_near_changed = false
+                       _cam_far_changed = false
+
+                       _active_pcam_3d.tween_completed.emit()
+
+
+func _pcam_tween_properties(delta: float) -> void:
+       # Run at the first tween frame
+       if _tween_elapsed_time == 0:
+               if _is_2D:
+                       _active_pcam_2d.tween_started.emit()
+                       _active_pcam_2d.reset_limit()
+               else:
+                       _active_pcam_3d.tween_started.emit()
+
+       _tween_elapsed_time = min(_tween_duration, _tween_elapsed_time + delta)
+
+       if _is_2D:
+               _active_pcam_2d.is_tweening.emit()
+               var interpolation_destination: Vector2 = _tween_interpolate_value(
+                       _prev_active_pcam_2d_transform.origin,
+                       _active_pcam_2d_glob_transform.origin,
+                       _active_pcam_2d.get_tween_duration(),
+                       _active_pcam_2d.get_tween_transition(),
+                       _active_pcam_2d.get_tween_ease()
+               )
+
+               if _active_pcam_2d.snap_to_pixel:
+                       camera_2d.global_position = interpolation_destination.round()
+               else:
+                       camera_2d.global_position = interpolation_destination
+
+               camera_2d.rotation = _tween_interpolate_value(
+                       _prev_active_pcam_2d_transform.get_rotation(),
+                       _active_pcam_2d_glob_transform.get_rotation(),
+                       _active_pcam_2d.get_tween_duration(),
+                       _active_pcam_2d.get_tween_transition(),
+                       _active_pcam_2d.get_tween_ease()
+               )
+               camera_2d.zoom = _tween_interpolate_value(
+                       _camera_zoom,
+                       _active_pcam_2d.zoom,
+                       _active_pcam_2d.get_tween_duration(),
+                       _active_pcam_2d.get_tween_transition(),
+                       _active_pcam_2d.get_tween_ease()
+               )
+       else:
+               _active_pcam_3d.is_tweening.emit()
+               camera_3d.global_position = _tween_interpolate_value(
+                       _prev_active_pcam_3d_transform.origin,
+                       _active_pcam_3d_glob_transform.origin,
+                       _active_pcam_3d.get_tween_duration(),
+                       _active_pcam_3d.get_tween_transition(),
+                       _active_pcam_3d.get_tween_ease()
+               )
+
+               var prev_active_pcam_3d_quat: Quaternion = Quaternion(_prev_active_pcam_3d_transform.basis.orthonormalized())
+               camera_3d.quaternion = \
+                       Tween.interpolate_value(
+                               prev_active_pcam_3d_quat, \
+                               prev_active_pcam_3d_quat.inverse() * Quaternion(_active_pcam_3d_glob_transform.basis.orthonormalized()),
+                               _tween_elapsed_time, \
+                               _active_pcam_3d.get_tween_duration(), \
+                               _active_pcam_3d.get_tween_transition(),
+                               _active_pcam_3d.get_tween_ease()
+                       )
+
+               if _cam_fov_changed:
+                       camera_3d.fov = \
+                               _tween_interpolate_value(
+                                       _prev_cam_fov,
+                                       _active_pcam_3d.get_fov(),
+                                       _active_pcam_3d.get_tween_duration(),
+                                       _active_pcam_3d.get_tween_transition(),
+                                       _active_pcam_3d.get_tween_ease()
+                               )
+
+               if _cam_size_changed:
+                       camera_3d.size = \
+                               _tween_interpolate_value(
+                                       _prev_cam_size,
+                                       _active_pcam_3d.get_size(),
+                                       _active_pcam_3d.get_tween_duration(),
+                                       _active_pcam_3d.get_tween_transition(),
+                                       _active_pcam_3d.get_tween_ease()
+                               )
+
+               if _cam_frustum_offset_changed:
+                       camera_3d.frustum_offset = \
+                               _tween_interpolate_value(
+                                       _prev_cam_frustum_offset,
+                                       _active_pcam_3d.get_frustum_offset(),
+                                       _active_pcam_3d.get_tween_duration(),
+                                       _active_pcam_3d.get_tween_transition(),
+                                       _active_pcam_3d.get_tween_ease()
+                               )
+
+               if _cam_h_offset_changed:
+                       camera_3d.h_offset = \
+                               _tween_interpolate_value(
+                                       _prev_cam_h_offset,
+                                       _active_pcam_3d.get_h_offset(),
+                                       _active_pcam_3d.get_tween_duration(),
+                                       _active_pcam_3d.get_tween_transition(),
+                                       _active_pcam_3d.get_tween_ease()
+                               )
+
+               if _cam_v_offset_changed:
+                       camera_3d.v_offset = \
+                               _tween_interpolate_value(
+                                       _prev_cam_v_offset,
+                                       _active_pcam_3d.get_v_offset(),
+                                       _active_pcam_3d.get_tween_duration(),
+                                       _active_pcam_3d.get_tween_transition(),
+                                       _active_pcam_3d.get_tween_ease()
+                               )
+
+               if _cam_near_changed:
+                       camera_3d.near = \
+                               _tween_interpolate_value(
+                                       _prev_cam_near,
+                                       _active_pcam_3d.get_near(),
+                                       _active_pcam_3d.get_tween_duration(),
+                                       _active_pcam_3d.get_tween_transition(),
+                                       _active_pcam_3d.get_tween_ease()
+                               )
+
+               if _cam_far_changed:
+                       camera_3d.far = \
+                               _tween_interpolate_value(
+                                       _prev_cam_far,
+                                       _active_pcam_3d.get_far(),
+                                       _active_pcam_3d.get_tween_duration(),
+                                       _active_pcam_3d.get_tween_transition(),
+                                       _active_pcam_3d.get_tween_ease()
+                               )
+
+
+func _tween_interpolate_value(from: Variant, to: Variant, duration: float, transition_type: int, ease_type: int) -> Variant:
+       return Tween.interpolate_value(
+               from, \
+               to - from,
+               _tween_elapsed_time, \
+               duration, \
+               transition_type,
+               ease_type,
+       )
+
+#endregion
+
+
+#region Public Functions
+
+func _show_viewfinder_in_play() -> void:
+       # Don't show the viewfinder in the actual editor or project builds
+       if Engine.is_editor_hint() or !OS.has_feature("editor"): return
+
+       # We default the viewfinder node to hidden
+       if is_instance_valid(_viewfinder_node):
+               _viewfinder_node.visible = false
+
+       if _is_2D:
+               if not _active_pcam_2d.show_viewfinder_in_play: return
+               if _active_pcam_2d.follow_mode != _active_pcam_2d.FollowMode.FRAMED: return
+       else:
+               if not _active_pcam_3d.show_viewfinder_in_play: return
+               if _active_pcam_3d.follow_mode != _active_pcam_2d.FollowMode.FRAMED: return
+
+       var canvas_layer: CanvasLayer = CanvasLayer.new()
+       get_tree().get_root().add_child(canvas_layer)
+
+       # Instantiate the viewfinder scene if it isn't already
+       if not is_instance_valid(_viewfinder_node):
+               var _viewfinder_scene := load("res://addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn")
+               _viewfinder_node = _viewfinder_scene.instantiate()
+               canvas_layer.add_child(_viewfinder_node)
+
+       _viewfinder_node.visible = true
+       _viewfinder_node.update_dead_zone()
+
+
+## Called when a [param PhantomCamera] is added to the scene.[br]
+## [b]Note:[/b] This can only be called internally from a
+## [param PhantomCamera] node.
+func pcam_added_to_scene(pcam) -> void:
+       if is_instance_of(pcam, PhantomCamera2D) or pcam.is_class("PhantomCamera3D"): ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed.
+               if not _pcam_list.has(pcam):
+                       _pcam_list.append(pcam)
+                       if not pcam.tween_on_load:
+                               pcam.set_has_tweened(self, true) # Skips its tween if it has the highest priority on load
+                       _find_pcam_with_highest_priority()
+       else:
+               printerr("This function should only be called from PhantomCamera scripts")
+
+
+## Called when a [param PhantomCamera] is removed from the scene.[br]
+## [b]Note:[/b] This can only be called internally from a
+## [param PhantomCamera] node.
+func pcam_removed_from_scene(pcam) -> void:
+       if is_instance_of(pcam, PhantomCamera2D) or pcam.is_class("PhantomCamera3D"): ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed.
+               _pcam_list.erase(pcam)
+               if _is_2D:
+                       if pcam == _active_pcam_2d:
+                               _active_pcam_missing = true
+                               _active_pcam_priority = -1
+                               _find_pcam_with_highest_priority()
+               else:
+                       if pcam == _active_pcam_3d:
+                               _active_pcam_missing = true
+                               _active_pcam_priority = -1
+                               _find_pcam_with_highest_priority()
+       else:
+               printerr("This function should only be called from PhantomCamera scripts")
+
+
+## Triggers a recalculation to determine which PhantomCamera has the highest
+## priority.
+func pcam_priority_updated(pcam: Node) -> void:
+       if Engine.is_editor_hint():
+               if _is_2D:
+                       if _active_pcam_2d.priority_override: return
+               else:
+                       if _active_pcam_3d.priority_override: return
+
+       if not is_instance_valid(pcam): return
+
+       var current_pcam_priority: int = pcam.get_priority()
+
+       if current_pcam_priority >= _active_pcam_priority:
+               if _is_2D:
+                       if pcam != _active_pcam_2d:
+                               _assign_new_active_pcam(pcam)
+               else:
+                       if pcam != _active_pcam_3d:
+                               _assign_new_active_pcam(pcam)
+
+       if pcam == _active_pcam_2d or pcam == _active_pcam_3d:
+               if current_pcam_priority <= _active_pcam_priority:
+                       _active_pcam_priority = current_pcam_priority
+                       _find_pcam_with_highest_priority()
+               else:
+                       _active_pcam_priority = current_pcam_priority
+
+
+## Updates the viewfinder when a [param PhantomCamera] has its
+## [param priority_ovrride] enabled.[br]
+## [b]Note:[/b] This only affects the editor.
+func pcam_priority_override(pcam: Node) -> void:
+       if Engine.is_editor_hint():
+               if _is_2D:
+                       if _active_pcam_2d.priority_override:
+                               _active_pcam_2d.priority_override = false
+               else:
+                       if _active_pcam_3d.priority_override:
+                               _active_pcam_3d.priority_override = false
+
+       _assign_new_active_pcam(pcam)
+       update_editor_viewfinder.emit()
+
+
+## Updates the viewfinder when a [param PhantomCamera] has its
+## [param priority_ovrride] disabled.[br]
+## [b]Note:[/b] This only affects the editor.
+func pcam_priority_override_disabled() -> void:
+       update_editor_viewfinder.emit()
+
+
+## Returns the currently active [param PhantomCamera]
+func get_active_pcam() -> Node:
+       if _is_2D:
+               return _active_pcam_2d
+       else:
+               return _active_pcam_3d
+
+
+## Returns whether if a [param PhantomCamera] should tween when it becomes
+## active. If it's already active, the value will always be false.
+## [b]Note:[/b] This can only be called internally from a
+## [param PhantomCamera] node.
+func get_trigger_pcam_tween() -> bool:
+       return _trigger_pcam_tween
+
+#func set_interpolation_mode(value: int) -> void:
+       #interpolation_mode = value
+#func get_interpolation_mode() -> int:
+       #return interpolation_mode
+
+#endregion
diff --git a/addons/phantom_camera/scripts/resources/camera_3d_resource.gd b/addons/phantom_camera/scripts/resources/camera_3d_resource.gd
new file mode 100644 (file)
index 0000000..70a0487
--- /dev/null
@@ -0,0 +1,59 @@
+@tool
+@icon("res://addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg")
+class_name Camera3DResource
+extends Resource
+
+## Resource for [PhantomCamera3D] to override various [Camera3D] properties.
+##
+## The overrides defined here will be applied to the [Camera3D] upon the
+## [PhantomCamera3D] becoming active.
+
+## Overrides [member Camera3D.cull_mask].
+@export_flags_3d_render var cull_mask: int = 1048575
+
+## Overrides [member Camera3D.h_offset].
+@export_range(0, 1, 0.001, "hide_slider", "suffix:m") var h_offset: float = 0
+
+## Overrides [member Camera3D.v_offset].
+@export_range(0, 1, 0.001, "hide_slider", "suffix:m") var v_offset: float = 0
+
+
+enum ProjectionType {
+       PERSPECTIVE =   0, ## Perspective projection. Objects on the screen becomes smaller when they are far away.
+       ORTHOGONAL =    1, ## Orthogonal projection, also known as orthographic projection. Objects remain the same size on the screen no matter how far away they are.
+       FRUSTUM =               2, ## Frustum projection. This mode allows adjusting frustum_offset to create "tilted frustum" effects.
+}
+
+## Overrides [member Camera3D.projection].
+@export var projection: ProjectionType = ProjectionType.PERSPECTIVE:
+       set(value):
+               projection = value
+               notify_property_list_changed()
+       get:
+               return projection
+
+## Overrides [member Camera3D.fov].
+@export_range(1, 179, 0.1, "degrees") var fov: float = 75
+
+## Overrides [member Camera3D.size].
+@export_range(0.001, 100, 0.001, "suffix:m", "or_greater") var size: float = 1
+
+## Overrides [member Camera3d.frustum_offset].
+@export var frustum_offset: Vector2 = Vector2.ZERO
+
+## Overrides [member Camera3D.near].
+@export_range(0.001, 10, 0.001, "suffix:m", "or_greater") var near: float = 0.05
+
+## Overrides [member Camera3D.far].
+@export_range(0.01, 4000, 0.001, "suffix:m","or_greater") var far: float = 4000
+
+
+func _validate_property(property: Dictionary) -> void:
+       if property.name == "fov" and not projection == ProjectionType.PERSPECTIVE:
+               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       if property.name == "size" and projection == ProjectionType.PERSPECTIVE:
+               property.usage = PROPERTY_USAGE_NO_EDITOR
+
+       if property.name == "frustum_offset" and not projection == ProjectionType.FRUSTUM:
+               property.usage = PROPERTY_USAGE_NO_EDITOR
diff --git a/addons/phantom_camera/scripts/resources/tween_resource.gd b/addons/phantom_camera/scripts/resources/tween_resource.gd
new file mode 100644 (file)
index 0000000..997ddb8
--- /dev/null
@@ -0,0 +1,41 @@
+@icon("res://addons/phantom_camera/icons/phantom_camera_tween.svg")
+class_name PhantomCameraTween
+extends Resource
+
+## Tweening resource for [PhantomCamera2D] and [PhantomCamera3D].
+##
+## Defines how [param PhantomCameras] transition between one another.
+## Changing the tween values for a given [param PhantomCamera] determines how
+## transitioning to that instance will look like.
+
+enum TransitionType {
+       LINEAR  = 0, ## The animation is interpolated linearly.
+       SINE    = 1, ## The animation is interpolated using a sine function.
+       QUINT   = 2, ## The animation is interpolated with a quintic (to the power of 5) function.
+       QUART   = 3, ## The animation is interpolated with a quartic (to the power of 4) function.
+       QUAD    = 4, ## The animation is interpolated with a quadratic (to the power of 2) function.
+       EXPO    = 5, ## The animation is interpolated with an exponential (to the power of x) function.
+       ELASTIC = 6, ## The animation is interpolated with elasticity, wiggling around the edges.
+       CUBIC   = 7, ## The animation is interpolated with a cubic (to the power of 3) function.
+       CIRC    = 8, ## The animation is interpolated with a function using square roots.
+       BOUNCE  = 9, ## The animation is interpolated by bouncing at the end.
+       BACK    = 10, ## The animation is interpolated backing out at ends.
+#      CUSTOM  = 11,
+#      NONE    = 12,
+}
+
+enum EaseType {
+       EASE_IN         = 0, ## The interpolation starts slowly and speeds up towards the end.
+       EASE_OUT        = 1, ## The interpolation starts quickly and slows down towards the end.
+       EASE_IN_OUT = 2, ## A combination of EASE_IN and EASE_OUT. The interpolation is slowest at both ends.
+       EASE_OUT_IN = 3, ## A combination of EASE_IN and EASE_OUT. The interpolation is fastest at both ends.
+}
+
+## The time it takes to tween to this PhantomCamera in [param seconds].
+@export var duration: float = 1
+
+## The transition bezier type for the tween. The options are defined in the [enum TransitionType].
+@export var transition: TransitionType = TransitionType.LINEAR
+
+## The ease type for the tween. The options are defined in the [enum EaseType].
+@export var ease: EaseType = EaseType.EASE_IN_OUT
diff --git a/addons/save_system/LICENSE b/addons/save_system/LICENSE
new file mode 100644 (file)
index 0000000..76b2a2c
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 AdamKormos
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/addons/save_system/README.md b/addons/save_system/README.md
new file mode 100644 (file)
index 0000000..e555ef5
--- /dev/null
@@ -0,0 +1,46 @@
+# Save Made Easy - A simple, diverse Save/Load plugin for Godot 4
+An easy to use, versatile Save/Load System inspired by the simplicity of Unity's PlayerPrefs. Supports nested variables, Resources and encryption.
+I've browsed multiple forum sites and checked the Asset Library, only to find out there are no plugins made to simplify saving data really, while this is default built-in functionality in Unity.
+New programmers (and people who don't want to spend too much time coding) shouldn't have to struggle with save systems, as they are quite finicky to debug if something is not set up right in the core code. Thus, here we go.
+This compact plugin stores all the data in an encrypted save file (encoded with the player's unique OS ID - meaning, players cannot exchange save files), which is automatically loaded at start-up.
+
+# Instructions
+1. Download the plugin from the Godot Asset Library or the zip file of this repo by clicking on "Code", and the "Local" menu. You should see a "Download ZIP" option.
+2. If you downloaded manually, place the addons/save_system file into your project directory, ideally into a folder called "addons".
+3. Go to Godot's Plugins tab (Project -> Project Settings -> Plugins) and tick "Enable" by the plugin. (If the plugin doesn't show up, you may need to restart the editor.)
+4. You're good to go! Don't forget to read the documentation. You can modify the save file name ("const file_name") at the top of the SaveSystem.gd script.
+
+# Contact
+If you have any questions/concerns or just wanna say hi, you can message me on [Twitter](https://twitter.com/olcgreen) or add me on Discord. My handle is olcgreen on both.
+
+# Documentation
+While you can find complete documentation in the plugin code, let me highlight the most important functions:
+- set_var(key_path, value): **Use this for storing a variable.**
+- get_var(key_path, default): **Use this for retrieving a variable.** If the variable at "key_path" doesn't exist, "default" is returned.
+- delete(key_path): **Deletes variable at "key_path".**
+- delete_all: **Deletes all data.** (Still need to call save() for the file to be overwritten.)
+- has(key_path): **Checks if a variable exists at "key_path".**
+- save: **Use this to save data and write the file.**
+
+You can also notice functions intended for internal use begin their names with an underscore in the code.
+
+**Note: Your save file will go into what Godot refers to as the user:// directory, on Windows, this is C:\Users\UserName\AppData\Roaming\Godot\app_userdata.**
+
+# Demonstration
+_Here's a class of our Resource created for testing this system:_
+
+
+![Screenshot_43](https://github.com/AdamKormos/SaveMadeEasy/assets/49873113/d9547f06-9253-4005-9e3b-989ca69e92f3)
+
+_You may use the set_var and get_var variables of the SaveSystem Singleton for the core functionality: (This code sample can be found in SaveSystem.gd)_
+
+![Screenshot_41](https://github.com/AdamKormos/SaveMadeEasy/assets/49873113/f860e709-c108-4ebc-a0f8-c18e3e7925af)
+
+**Nesting is expressed by the colon symbol (:). You may also access dictionary values with this notation.**
+
+# Support
+If you like my work and wanna support me, please consider checking out my [YouTube](https://www.youtube.com/@AdamsGodotTutorials) channel, which has a handful of tutorials - with more to come as time goes on!
+
+I also have a [Discord](https://discord.gg/vhpYfYZSWh) server for my community, you're welcome to hop in. :)
+
+Aaand last but not least, I'm working on games too. Wishlists are appreciated! [Odyssey of Dremid'ir](https://store.steampowered.com/app/2134530/Odyssey_of_Dremidir/) is a hand-drawn RPG, and [Frieseria](https://store.steampowered.com/app/2591170/Frieseria_The_Grand_Reopening/) is a restaurant management game.
diff --git a/addons/save_system/plugin.cfg b/addons/save_system/plugin.cfg
new file mode 100644 (file)
index 0000000..a551f5d
--- /dev/null
@@ -0,0 +1,7 @@
+[plugin]
+
+name="SaveSystem"
+description="An easy to use, versatile Save/Load System inspired by the simplicity of Unity's PlayerPrefs"
+author="Ádám Kormos"
+version="1.3"
+script="plugin_save_system.gd"
diff --git a/addons/save_system/plugin_logo.png b/addons/save_system/plugin_logo.png
new file mode 100644 (file)
index 0000000..d418e26
Binary files /dev/null and b/addons/save_system/plugin_logo.png differ
diff --git a/addons/save_system/plugin_logo.png.import b/addons/save_system/plugin_logo.png.import
new file mode 100644 (file)
index 0000000..2f19ba1
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dhsqvh4qbp6ot"
+path="res://.godot/imported/plugin_logo.png-1f0305143f7a1a7c79d7f4bc7c21433d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/save_system/plugin_logo.png"
+dest_files=["res://.godot/imported/plugin_logo.png-1f0305143f7a1a7c79d7f4bc7c21433d.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/addons/save_system/plugin_save_system.gd b/addons/save_system/plugin_save_system.gd
new file mode 100644 (file)
index 0000000..07130b7
--- /dev/null
@@ -0,0 +1,13 @@
+@tool
+extends EditorPlugin
+
+
+const AUTOLOAD_NAME = "SaveSystem"
+
+
+func _enter_tree():
+       add_autoload_singleton(AUTOLOAD_NAME, "res://addons/save_system/save_system.gd")
+
+
+func _exit_tree():
+       remove_autoload_singleton(AUTOLOAD_NAME)
diff --git a/addons/save_system/save_system.gd b/addons/save_system/save_system.gd
new file mode 100644 (file)
index 0000000..a4934a8
--- /dev/null
@@ -0,0 +1,432 @@
+#@tool # Temporarily disabled for maintenance
+extends Node
+
+# ---------------------------------------------------------------------
+# --- SaveMadeEasy - A Save System inspired by Unity's PlayerPrefs     ---
+# -----------                          Made by Ádám Kormos                           -----------
+# ---------------------------------------------------------------------
+# The Save System is a drag-and-drop, easy to use plugin that even allows
+# nested Dictionaries and Resources to be stored & accessed conveniently!
+# Save data is encrypted based on an encryption key variable. (Note: As of
+# v1.2, OS.get_unique_id isn't used anymore, as it may change upon the user
+# reinstalling their OS. :UniqueIDDeprecated)
+# A Resource is broken down to a Dictionary internally. Let's say you're saving
+# a Resource under the key name of "res", and it has variables "a", "b" and "c". 
+# You can access its first variable like this:
+#   get_var("res:a")
+# Simple, right?
+#
+# I'd like to thank Loppansson for the awesome setup of the test environment and the naming
+# conventions cleanup, and Nevereven for pointing out a handful of things that can make
+# the plugin more diverse. :) My gratitude goes to all of you using the plugin and helping me 
+# make it better by reporting arising issues!
+#
+# You can use this plugin in your Godot project as you wish. 
+# Crediting me is appreciated, but not a must!
+#
+# If you rely on save data in an AutoLoad's _ready function, you may need to wait for the
+# "loaded" signal of this AutoLoad. 
+
+
+# The default file path of your save data. You can freely modify this.
+const default_file_path : String = "user://save_data.sav"
+const encryption_key : String = "abcdefg1234567"
+const use_encryption : bool = false
+# Typecasting the keys manually may increase loading times, so if you feel like
+# this feature is irrelevant in your project, set this to false.
+# You typically only need this enabled if you are using dictionary keys
+# that aren't Strings.
+const perform_typecast_on_dictionary_keys : bool = false
+
+@export var current_state_dictionary := {}
+
+# I wished to create a separate Dock for the controls, but connecting 
+# clear_save_data_on_start to a dock control was very problematic and
+# never seemed to work as intended, so I had to put these as exports. Unfortunate :(
+## Set this to true to clear every save data you have, when starting the game.
+@export var clear_save_data_on_start : bool = false
+## Set this to true to clear every save data you have. Automatically resets to false
+## afterwards
+@export var clear_all_data : bool = false : set = set_clear_data
+func set_clear_data(value):
+       if value:
+               delete_all()
+               can_save_empty_in_editor_with_permission = true
+               save()
+               clear_all_data = false
+
+# This variable is created because if you try to disable the plugin,
+# due to this script's exit_tree, the file gets saved, but it will be
+# empty (= current_state_dictionary is empty)! I'm assuming the script
+# gets deloaded and that's why, but it still doesn't completely click. 
+# Anyway, we *do* want to clear our save file with the exported 
+# variable though, so this permission is given in that case. 
+# :EditorEmptySavingPermission
+var can_save_empty_in_editor_with_permission : bool = false
+
+var base_resource_property_names := []
+
+signal loaded
+signal saved
+
+
+func _ready():
+       # Locating what properties a Resource has by default, so that they do not get
+       # added to a Dictionary when it is formed based on a Resource.
+       var res := Resource.new()
+       for property in res.get_property_list():
+               base_resource_property_names.append(property.name)
+       
+       # If we boot the game and want to erase data on start -
+       if !Engine.is_editor_hint() and clear_save_data_on_start:
+               delete_all()
+               save()
+       else:
+               _load() # Load save data.
+       
+# Test stuff for demonstration of the plugin --------------------------
+#      
+#      print(get_var("Bob"))
+#      set_var("Bob", TestResource.new())
+#      set_var("Bob:e", Vector2(4, 9))
+#      
+       # Saving arrays with resources and nested resources:
+#      var my_arr := [TestSubresource.new(), TestSubresource.new()]
+#      my_arr[0].c[0].b = 66
+#      set_var("Bob:f", my_arr)
+#      print(get_var("Bob:f")[0].c[0].b)
+#      save()
+#      
+       # Saving primitive types, dictionaries and non-resource arrays:
+#      set_var("Bob:a:b", 3)
+#      set_var("Bob:a:c:d", {"abcf" : 5})
+#      print(has("Bob"))
+#      set_var("Bob:a:b", null)
+#      set_var("Bob:a:c", TestResource.new())
+#      set_var("Bob:a:c:c", 10)
+#      delete("Bob:a:c:d")
+#      print(get_var("Bob"))
+#      print(_sanitize_key_path("Bob:a:c:d"))
+#      print(_sanitize_key_path(":::::Bob::::a:c:::d::"))
+#      print(has("Z"))
+
+
+func _exit_tree():
+       save() # Save on exit.
+
+
+# Deletes every existing save data.
+func delete_all():
+       current_state_dictionary.clear()
+
+
+# Deletes a specific key's information.
+func delete(key_path : String):
+       if not has(key_path):
+               return
+       
+       if not _is_hierarchical(key_path): # If the key has no hierarchy, it can be simply erased.
+               current_state_dictionary.erase(key_path)
+               return
+       
+       # In case of a hierarchical key, we need to break it down to body and head,
+       # where body means every part of the key until the last colon and the head
+       # is the rest of it, at the bottom of the hierarchy, as it's inside the
+       # body's dictionary key set.
+       # A path is a certain variable's identifier with which you can access it. 
+       # :KeyParts 
+       var body = _get_variable_name_body(key_path)
+       var head = _get_variable_name_head(key_path)
+       _get_variable_at_path(body).erase(head)
+
+
+# Returns whether a key exists or not. A variable can exist and be null, 
+# so you can get a null returned, because the condition only checks if the key's 
+# parent is null. It's made this way because despite the value being null, the variable
+# itself is still around and is in the save info tree. Returning false in case it's null
+# would make it impossible to assign anything to it once it is set to null!
+# :HasIncludesNull
+# (Note: Might consider making a function called has_and_valid)
+func has(key_path : String) -> bool:
+       if _is_hierarchical(key_path):
+               var variable_head = _get_variable_name_head(key_path)
+               var key_parent = _get_variable_at_path(_get_variable_name_body(key_path))
+               if key_parent == null:
+                       return false
+               
+               var valid_as_object : bool = (key_parent is Object and variable_head in key_parent)
+               var valid_as_dict : bool = (not key_parent is Object and key_parent.has(variable_head))
+               return key_parent != null and (valid_as_object or valid_as_dict)
+       else:
+               return current_state_dictionary.has(key_path)
+
+
+# Assigns a value to a key.
+func set_var(key_path : String, value):
+       key_path = _sanitize_key_path(key_path)
+       if _is_hierarchical(key_path):
+               if value is Resource:
+                       value = _resource_to_dict(value)
+               elif value is Array:
+                       value = _parse_array(value)
+               elif value is Dictionary:
+                       value = _typecast_dictionary_keys(value)
+               
+               if not has(key_path): # Read :HasIncludesNull
+                       return
+               
+               # Hierarchical variable assignment can be achieved by tracking the key's direct parent
+               # dictionary, and then getting the head of it so that we can overwrite the value. 
+               var result = _get_parent_dictionary(key_path)
+               var variable_name : String = _get_variable_name_head(key_path)
+               result[variable_name] = value
+               return
+       
+       if value is Resource: # Resource, has to be nested and translated.
+               current_state_dictionary[key_path] = _resource_to_dict(value)
+       else: # Simple value.
+               current_state_dictionary[key_path] = value
+
+
+# Saves the current state. You may use a different file path for multi-slot saving.
+func save(file_path : String = default_file_path):
+       # :EditorEmptySavingPermission
+       if current_state_dictionary.is_empty() and Engine.is_editor_hint():
+               if !can_save_empty_in_editor_with_permission:
+                       return
+       
+       var file : FileAccess
+       if use_encryption:
+               file = FileAccess.open_encrypted_with_pass(file_path, FileAccess.WRITE, encryption_key)
+       else:
+               file = FileAccess.open(file_path, FileAccess.WRITE)
+       
+       # We need to call typecasting when saving too, so that Resources that
+       # weren't manually added with set_var but are parts of an object that
+       # were, can be broken down to Dictionaries.
+       current_state_dictionary = _typecast_dictionary_keys(current_state_dictionary)
+       file.store_string(JSON.stringify(current_state_dictionary, "\t"))
+       can_save_empty_in_editor_with_permission = false
+       emit_signal("saved")
+
+
+# Returns a variable.
+func get_var(key_path : String, default = null):
+       key_path = _sanitize_key_path(key_path)
+       var var_at_path = _get_variable_at_path(key_path)
+       if var_at_path != null:
+               return var_at_path
+       else:
+               return default
+
+
+# --------------------------------- INTERNAL FUNCTIONS ---------------------------------
+
+
+# Performs a recursive look-up on its elements to "unpack" potential resources in arrays,
+# and return an array of data that only holds primitives and dictionaries.
+func _parse_array(array : Array) -> Array:
+       var result := []
+       for element in array:
+               if element is Resource:
+                       result.append(_resource_to_dict(element))
+               elif element is Array:
+                       result.append(_parse_array(element))
+               else:
+                       result.append(element)
+       return result
+
+
+# A hierarchical key has a colon separating its body and head. Read :KeyParts
+func _is_hierarchical(key : String) -> bool:
+       return key.find(":") != -1
+
+
+# Loads the root dictionary stored in the save file. You may use a different
+# file path for multi-slot saving.
+func _load(file_path : String = default_file_path):
+       var file : FileAccess
+       if use_encryption:
+               file = FileAccess.open_encrypted_with_pass(file_path, FileAccess.READ, encryption_key)
+       else:
+               file = FileAccess.open(file_path, FileAccess.READ)
+       
+       if file:
+               current_state_dictionary = JSON.parse_string(file.get_as_text())
+               if perform_typecast_on_dictionary_keys:
+                       current_state_dictionary = _typecast_dictionary_keys(current_state_dictionary)
+       
+       emit_signal("loaded")
+
+
+# By default, JSON parsing doesn't typecast the keys of a Dictionary, which can be
+# an issue. So when the file is loaded, a manual typecast is performed on Dictionary
+# keys to ensure you can access them as intended, without having to stringify all
+# your Dictionary keys.
+func _typecast_dictionary_keys(input_dict : Dictionary) -> Dictionary:
+       var typed_dict := {}
+       for key in input_dict.keys():
+               var value = input_dict[key]
+               
+               var typed_key = _get_typed_key(key)
+               # If our key's value is a Dictionary, its keys must go through recursive 
+               # typecasting, and be assigned in that form to our result dictionary's key. 
+               if value is Dictionary:
+                       typed_dict[typed_key] = _typecast_dictionary_keys(value)
+               else:
+                       # If the value is an Array, we have to account for underlying Dictionaries
+                       # among its elements and recursively typecast them.
+                       if value is Array:
+                               for i in range(value.size()):
+                                       if value[i] is Dictionary:
+                                               value[i] = _typecast_dictionary_keys(value[i])
+                       typed_dict[typed_key] = value
+       return typed_dict
+
+
+# Typecasts a key value and returns it. We cannot simply use str_to_var in every case,
+# as for Strings (text value - which is also what we read out of files) that cannot 
+# be typecasted, it returns null, and it doesn't parse Vectors properly!
+# :StrToVarIsNullOnString
+func _get_typed_key(key):
+       # Since str_to_var lacks converting the sheer coordinate values into a Vector 
+       # automatically, we have to add some conditions to predict whether the key is 
+       # a Vector value or not.
+       if key is String and key.begins_with("(") and key.ends_with(")") and key.find(",") != -1:
+               var comma_count : int = key.count(",")
+               # To better understand this parsing, imagine we store a 2D Vector of
+               # (2, 5). "(2, 5)" is what's being stored in the file, and we have one comma,
+               # so the result parameter of str_to_var is "Vector2(2, 5)", which the 
+               # function can conveniently work with.
+               var supposed_vector_value = str_to_var("Vector" + str(comma_count + 1) + key)
+               if supposed_vector_value != null:
+                       return supposed_vector_value
+               # Here we can get around the :StrToVarIsNullOnString limitation, as we
+               # already know our key is a String, given the branch entry conditions.
+               else:
+                       return key
+       # We cannot typecast Resource keys, because when we load them back,
+       # there is no reliable way to know what type of Resource it was,
+       # so the recommended approach is to call _resource_to_dict on your
+       # resource before using it as a key, if the Dictionary is in an object
+       # you're saving.
+       # TODO: Perhaps we could add the Resource's resource_path as an additional
+       # key when we convert it to a Dictionary, and immediately convert the
+       # Dictionary back to a Resource on load? We'd still need a manual
+       # lookup method though, because Godot compares Resources based on their
+       # unique IDs, not based on their variables matching, of course.
+       # :NoResourceKeyTypecast
+#      elif key is Resource:
+#              return _typecast_dictionary_keys(_resource_to_dict(key))
+       # :StrToVarIsNullOnString
+       elif (key is String and str_to_var(key) == null) or (not key is String):
+               return key
+       else:
+               return str_to_var(key)
+
+
+# Sanitizes the input key path. It must be performed on every input that goes into 
+# internal functions.
+func _sanitize_key_path(key_path : String) -> String:
+       var sanitized_string : String = ""
+       key_path = key_path.lstrip(":").rstrip(":") # Remove : from beginning and end
+       
+       var i : int = 0
+       while i < key_path.length():
+               sanitized_string += key_path[i]
+               if key_path[i] == ":": # Skip over multiple colons placed after each other.
+                       while(key_path[i + 1] == ":"): # No need to look for going OOB because the edges of the key are uncolonised (lol)
+                               i += 1
+               i += 1
+       return sanitized_string
+
+
+# Returns the top element of a key path.
+func _get_variable_root(key_path : String) -> String:
+       key_path = _sanitize_key_path(key_path)
+       if _is_hierarchical(key_path): 
+               return key_path.substr(0, key_path.find(":"))
+       else:
+               return key_path
+
+
+# :KeyParts
+func _get_variable_name_body(key_path : String) -> String:
+       key_path = _sanitize_key_path(key_path)
+       if _is_hierarchical(key_path): 
+               return key_path.substr(0, key_path.rfind(":"))
+       else:
+               return key_path
+
+
+# :KeyParts
+func _get_variable_name_head(key_path : String) -> String:
+       key_path = _sanitize_key_path(key_path)
+       if _is_hierarchical(key_path): 
+               return key_path.substr(key_path.rfind(":") + 1)
+       else:
+               return key_path
+
+
+# Retrieves a key's parent dictionary using recursion. If path is not hierarchical,
+# the base is used.
+func _get_parent_dictionary(key_path : String, carried_dict : Dictionary = current_state_dictionary):
+       key_path = _sanitize_key_path(key_path)
+       var depth_count = key_path.count(":")
+       if depth_count == 0:
+               return carried_dict
+       elif depth_count == 1:
+               return carried_dict[key_path.split(":")[0]]
+       
+       var first_splitter_index = key_path.find(":")
+       var first_name = key_path.substr(0, first_splitter_index)
+       key_path = key_path.trim_prefix(first_name + key_path[first_splitter_index])
+       
+       if carried_dict[first_name] is Object:
+               carried_dict[first_name] = _resource_to_dict(carried_dict[first_name])
+       return _get_parent_dictionary(key_path, carried_dict[first_name])
+
+
+# Initiates recursive search for a variable.
+func _get_variable_at_path(key_path : String, carried_dict : Dictionary = current_state_dictionary):
+       key_path = _sanitize_key_path(key_path)
+       var parent_dict = _get_parent_dictionary(key_path)
+       if parent_dict != null:
+               var variable_head = _get_variable_name_head(key_path)
+               if not parent_dict is Object and parent_dict.has(variable_head):
+                       return parent_dict[variable_head]
+               elif parent_dict is Object and variable_head in parent_dict:
+                       return parent_dict.get(variable_head)
+               else:
+                       return null
+       else:
+               return null
+
+
+# Converts a Resource to a Dictionary so that it can be stored as save data. The
+# default properties of a Resource aren't included because they would just flood the dictionary.
+func _resource_to_dict(resource : Resource) -> Dictionary:
+       var dict := {}
+       for property in resource.get_property_list():
+               if base_resource_property_names.has(property.name) or property.name.ends_with(".gd"): 
+                       continue
+               
+               var property_value = resource.get(property.name)
+               # Arrays have to be interpreted recursively, see _parse_array function description.
+               if property_value is Array:
+                       dict[property.name] = _parse_array(property_value)
+               else:
+                       dict[property.name] = property_value
+       return dict
+
+
+# Converts a Dictionary's information into a Resource. We need a resource as the
+# 2nd parameter so that the instance has the given fields our Dictionary assigns.
+# The simplest approach is using a new instance of the Resource type in question
+# (e.g TestResource.new())
+func _dict_to_resource(dict : Dictionary, target_resource : Resource) -> Resource:
+       for i in range(dict.size()):
+               var key = dict.keys()[i]
+               var value = dict.values()[i]
+               target_resource.set(key, value)
+       return target_resource
diff --git a/addons/save_system/save_system_test/save_system_test.gd b/addons/save_system/save_system_test/save_system_test.gd
new file mode 100644 (file)
index 0000000..b508944
--- /dev/null
@@ -0,0 +1,129 @@
+extends Node
+
+# Scipt used to test the save system. Ctrl+Drag script into the scene and the 
+# current scene twice to test.
+
+
+var _tests := []
+var _number_of_test_done : int = 0
+var _longest_input_len : int = 0
+
+
+func _ready():
+       await get_tree().create_timer(0.2).timeout
+       var first_load = not SaveSystem.has("test_resource")
+       
+       if first_load:
+               var res := SaveSystemTestResource.new()
+               res.id = 2
+               SaveSystem.set_var("test_resource", res)
+               # Notice how we get_var the test_resource and separately assign its "resource" variable,
+               # without a set_var call. Later in the tests, you can see the reference makes it so
+               # when you get/set_var "test_resource:resource", the code will refer to what 
+               # we've just set here.
+               SaveSystem.get_var("test_resource").resource = SaveSystemTestResource.new()
+               SaveSystem.set_var("test_resource:resource:id", 1)
+               SaveSystem.set_var("test_resource:resource:data:tags", {
+                       "primary_tag" : "resource",
+                       "secondary_tag" : "test_resource"
+               })
+               SaveSystem.set_var("test_resource:resource:name", null)
+               SaveSystem.set_var("test_resource:resource:resource", SaveSystemTestResource.new())
+               SaveSystem.set_var("test_resource:resource:resource:id", 2)
+               SaveSystem.get_var("test_resource:resource_arr")[0].id = 44
+               SaveSystem.delete("test_resource:resource:resource:data")
+       
+       var test_resource = SaveSystem.get_var("test_resource", SaveSystemTestResource.new())
+       _test('test_resource.id', test_resource.id, 2)
+       _test('test_resource.resource.id', test_resource.resource.id, 1)
+       # Example: You don't have to manually set_var test_resource:name!
+       _test('test_resource.name', test_resource.name, 'abc')
+       _test('test_resource.data["position"]', test_resource.data["position"], 0)
+       _test('test_resource.data["tags"]', test_resource.data["tags"], {"primary_tag": "", "secondary_tag": ""})
+       _test('SaveSystem.has("test_resource")', SaveSystem.has("test_resource"), true)
+       _test('SaveSystem.has("test_resource:id")', SaveSystem.has("test_resource:id"), true)
+       _test('SaveSystem.has("test_resource:no")', SaveSystem.has("test_resource:no"), false)
+       _test('SaveSystem.has("non_existent_var")', SaveSystem.has("non_existent_var"), false)
+       _test(
+                       'SaveSystem._sanitize_key_path(":::::test_resource::::a:c:::d::")', 
+                       SaveSystem._sanitize_key_path(":::::test_resource::::a:c:::d::"),
+                       'test_resource:a:c:d'
+       )
+       _test(
+               'test_resource.resource_arr[0].id',
+               test_resource.resource_arr[0].id,
+               44
+       )
+       
+       if SaveSystem.perform_typecast_on_dictionary_keys:
+               _test(
+                       'test_resource.non_string_key_dictionary[123]',
+                       test_resource.non_string_key_dictionary[123],
+                       "abc"
+               )
+               _test(
+                       'test_resource.non_string_key_dictionary[true]',
+                       test_resource.non_string_key_dictionary[true],
+                       Vector2.ONE
+               )
+               _test(
+                       'test_resource.non_string_key_dictionary[Vector2(1, 1)][0]["name"]',
+                       test_resource.non_string_key_dictionary[Vector2(1, 1)][0]["name"],
+                       "Bob"
+               )
+               _test(
+                       'test_resource.non_string_key_dictionary[Vector2(1, 1)][0][false]',
+                       test_resource.non_string_key_dictionary[Vector2(1, 1)][0][false],
+                       "False :("
+               )
+               # Experimental test, this won't work with the current plugin yet,
+               # if the positions Dictionary has a Resource as the key.
+               # :ExperimentalResKey
+#              _test(
+#                      'test_resource.positions[SaveSystem._resource_to_dict(SaveSystemTestSubresource.new())]',
+#                      test_resource.positions[SaveSystem._resource_to_dict(SaveSystemTestSubresource.new())],
+#                      Vector2(2, 3)
+#              )
+       
+       _render_tests()
+       
+       # Quit after printing results
+       await get_tree().create_timer(1.0).timeout
+       get_tree().quit()
+
+
+func _test(input : String, result, expected_result):
+       var success_state = ""
+       if str(result) == str(expected_result):
+               success_state = "OK"
+       else:
+               success_state = "ER"
+       
+       _tests.append({
+               "input" : input,
+               "result" : str(result),
+               "expected_result" : str(expected_result),
+               "success_state" : success_state
+       })
+       
+       _longest_input_len = max(len(input), _longest_input_len)
+       _number_of_test_done += 1
+
+
+func _render_tests():
+       print("State  Input")
+       var number_of_ok : int = 0
+       var _test_rendered : int = 0
+       for test in _tests:
+               if test["success_state"] == "ER":
+                       print("ER     " + test["input"])
+                       print(" L____ Expected: ", test["expected_result"])
+                       print(" L____ Recieved: ", test["result"])
+                       if not _test_rendered + 1 == _number_of_test_done:
+                               print(" |")
+               else:
+                       print("OK     " + test["input"])
+                       number_of_ok += 1
+               _test_rendered += 1
+       print()
+       print("OVER ALL: [",  number_of_ok, "/", _number_of_test_done, "] OK")
diff --git a/addons/save_system/save_system_test/save_system_test_resource.gd b/addons/save_system/save_system_test/save_system_test_resource.gd
new file mode 100644 (file)
index 0000000..d62a3f7
--- /dev/null
@@ -0,0 +1,27 @@
+class_name SaveSystemTestResource
+extends Resource
+
+
+var id : int
+var name : String = "abc"
+var resource : Resource
+var resource_arr := [SaveSystemTestSubresource.new(), SaveSystemTestSubresource.new()]
+var data : Dictionary = {
+       "position" : 0,
+       "tags" : {
+               "primary_tag" : "",
+               "secondary_tag" : ""
+       }
+}
+
+var non_string_key_dictionary : Dictionary = {
+       123 : "abc",
+       true : Vector2.ONE,
+       Vector2(-1, 0.5) : "aaaaa",
+       Vector2(1, 1) : [{"name" : "Bob", "cast" : "Warrior", "mana" : 5, false : "False :("}, 235]
+}
+
+# :ExperimentalResKey
+var positions : Dictionary = {
+       SaveSystemTestSubresource.new() : Vector2(2, 3)
+}
diff --git a/addons/save_system/save_system_test/save_system_test_subresource.gd b/addons/save_system/save_system_test/save_system_test_subresource.gd
new file mode 100644 (file)
index 0000000..74a2fc9
--- /dev/null
@@ -0,0 +1,7 @@
+class_name SaveSystemTestSubresource
+extends Resource
+
+
+var id : int
+var name : String
+
diff --git a/addons/scene_manager/Dissolve2d.gdshader b/addons/scene_manager/Dissolve2d.gdshader
new file mode 100644 (file)
index 0000000..1076041
--- /dev/null
@@ -0,0 +1,19 @@
+shader_type canvas_item;
+
+uniform sampler2D dissolve_texture;
+uniform float dissolve_amount : hint_range(0.0, 1.0) = 0.5;
+uniform vec4 fade_color : source_color = vec4(1.0, 1.0, 1.0, 1.0);
+uniform bool fade = false;
+uniform bool inverted = false;
+
+void fragment() {
+       if (dissolve_amount < 0.0001 || dissolve_amount > 0.9999 || fade) {
+               COLOR = vec4(fade_color.rgb, dissolve_amount);
+       } else {
+               float sample = texture(dissolve_texture, UV).r;
+               if (inverted) {
+                       sample = 1.0 - sample;
+               }
+               COLOR = vec4(fade_color.rgb, step(sample, dissolve_amount));
+       }
+}
diff --git a/addons/scene_manager/LICENSE b/addons/scene_manager/LICENSE
new file mode 100644 (file)
index 0000000..9665923
--- /dev/null
@@ -0,0 +1,9 @@
+The MIT License (MIT)
+
+Copyright © 2021 GlassBrick
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/addons/scene_manager/NodeFlagsInspectorPlugin.gd b/addons/scene_manager/NodeFlagsInspectorPlugin.gd
new file mode 100644 (file)
index 0000000..b848eb2
--- /dev/null
@@ -0,0 +1,13 @@
+extends EditorInspectorPlugin
+
+var SingletonCheckProperty = load('res://addons/scene_manager/SingletonCheckProperty.gd')
+var SingletonNameProperty = load('res://addons/scene_manager/SingletonNameProperty.gd')
+
+
+func _can_handle(object: Variant):
+       return object is Node
+
+
+func _parse_begin(object: Object):
+       add_property_editor("singleton_check", SingletonCheckProperty.new())
+       add_property_editor("singleton_name", SingletonNameProperty.new())
diff --git a/addons/scene_manager/README.md b/addons/scene_manager/README.md
new file mode 100644 (file)
index 0000000..b99e74d
--- /dev/null
@@ -0,0 +1,16 @@
+# Godot Scene Manager
+
+![Logo](/logo.png)
+
+Plugin for managing transitions and Node references between scenes. Expect more features to be added in the future!
+
+![Demonstration of Shader Fades](/scene_manager_demo.gif)
+
+---
+
+All the README info has been moved to the new wiki!
+
+- [Wiki](https://github.com/glass-brick/Scene-Manager/wiki)
+  - [Getting Started](https://github.com/glass-brick/Scene-Manager/wiki/Getting-started)
+  - [Features](https://github.com/glass-brick/Scene-Manager/wiki/Features)
+  - [API docs](<https://github.com/glass-brick/Scene-Manager/wiki/API-(Godot-4)>)
diff --git a/addons/scene_manager/SceneManager.gd b/addons/scene_manager/SceneManager.gd
new file mode 100644 (file)
index 0000000..df09009
--- /dev/null
@@ -0,0 +1,172 @@
+extends Node2D
+
+signal fade_complete
+signal scene_unloaded
+signal scene_loaded
+signal transition_finished
+
+var is_transitioning := false
+@onready var _tree := get_tree()
+@onready var _root := _tree.get_root()
+@onready var _current_scene := _tree.current_scene
+@onready var _animation_player : AnimationPlayer = $AnimationPlayer
+@onready var _shader_blend_rect : ColorRect = $CanvasLayer/ColorRect
+
+var default_options := {
+       "speed": 2,
+       "color": Color("#000000"),
+       "pattern": "fade",
+       "wait_time": 0.5,
+       "invert": false,
+       "invert_on_leave": true,
+       "ease": 1.0,
+       "skip_scene_change": false,
+       "skip_fade_out": false,
+       "skip_fade_in": false,
+       "on_tree_enter": func(scene): null,
+       "on_ready": func(scene): null,
+       "on_fade_out": func(): null,
+       "on_fade_in": func(): null,
+}
+# extra_options = {
+#   "pattern_enter": DEFAULT_IMAGE,
+#   "pattern_leave": DEFAULT_IMAGE,
+#   "ease_enter": 1.0,
+#   "ease_leave": 1.0,
+# }
+
+var singleton_entities := {}
+var _previous_scene = null
+
+func _ready() -> void:
+       _set_singleton_entities()
+       scene_loaded.emit()
+
+func _set_singleton_entities() -> void:
+       singleton_entities = {}
+       var entities = _current_scene.get_tree().get_nodes_in_group(
+               SceneManagerConstants.SINGLETON_GROUP_NAME
+       )
+       for entity in entities:
+               var has_entity_name : bool = entity.has_meta(SceneManagerConstants.SINGLETON_META_NAME)
+               assert(has_entity_name,"The node was set as a singleton entity, but no entity name was provided.")
+               var entity_name = entity.get_meta(SceneManagerConstants.SINGLETON_META_NAME)
+               assert(not singleton_entities.has(entity_name),"The entity name %s is already being used more than once! Please check that your entity name is unique within the scene.")
+               singleton_entities[entity_name] = entity
+
+func get_entity(entity_name: String) -> Node:
+       assert(singleton_entities.has(entity_name),"Entity is not set as a singleton entity. Please define it in the editor.")
+       return singleton_entities[entity_name]
+
+func _load_pattern(pattern) -> Texture:
+       assert(pattern is Texture or pattern is String, "Pattern is not a valid Texture, absolute path, or built-in texture.")
+       if pattern is String:
+               if pattern.is_absolute_path():
+                       return load(pattern)
+               elif pattern == 'fade':
+                       return null
+               return load("res://addons/scene_manager/shader_patterns/%s.png" % pattern)
+       return pattern
+
+func _get_final_options(initial_options: Dictionary) -> Dictionary:
+       var options = initial_options.duplicate()
+
+       for key in default_options.keys():
+               if not options.has(key):
+                       options[key] = default_options[key]
+
+       for pattern_key in ["pattern_enter", "pattern_leave"]:
+               options[pattern_key] = (
+                       _load_pattern(options[pattern_key])
+                       if pattern_key in options
+                       else _load_pattern(options["pattern"])
+               )
+
+       for ease_key in ["ease_enter", "ease_leave"]:
+               if not ease_key in options:
+                       options[ease_key] = options["ease"]
+
+       return options
+
+func _process(_delta: float) -> void:
+       if not is_instance_valid(_previous_scene) and _tree.current_scene:
+               _previous_scene = _tree.current_scene
+               _current_scene = _tree.current_scene
+               _set_singleton_entities()
+               scene_loaded.emit()
+       if _tree.current_scene != _previous_scene:
+               _previous_scene = _tree.current_scene
+
+func change_scene(path: Variant, setted_options: Dictionary = {}) -> void:
+       assert(path == null or path is String, 'Path must be a string')
+       var options = _get_final_options(setted_options)
+       if not options["skip_fade_out"]:
+               await fade_out(setted_options)
+       if not options["skip_scene_change"]:
+               if path == null:
+                       _reload_scene()
+               else:
+                       _replace_scene(path, options)
+       await _tree.create_timer(options["wait_time"]).timeout
+       if not options["skip_fade_in"]:
+               await fade_in(setted_options)
+
+func reload_scene(setted_options: Dictionary = {}) -> void:
+       await change_scene(null, setted_options)
+
+func _reload_scene() -> void:
+       _tree.reload_current_scene()
+       await _tree.create_timer(0.0).timeout
+       _current_scene = _tree.current_scene
+
+func fade_in_place(setted_options: Dictionary = {}) -> void:
+       setted_options["no_scene_change"] = true
+       await change_scene(null, setted_options)
+
+func _replace_scene(path: String, options: Dictionary) -> void:
+       _current_scene.queue_free()
+       scene_unloaded.emit()
+       var following_scene: PackedScene = ResourceLoader.load(path, "PackedScene", 0)
+       _current_scene = following_scene.instantiate()
+       _current_scene.tree_entered.connect(options["on_tree_enter"].bind(_current_scene))
+       _current_scene.ready.connect(options["on_ready"].bind(_current_scene))
+       await _tree.create_timer(0.0).timeout
+       _root.add_child(_current_scene)
+       _tree.set_current_scene(_current_scene)
+
+func fade_out(setted_options: Dictionary= {}) -> void:
+       var options = _get_final_options(setted_options)
+       is_transitioning = true
+       _animation_player.speed_scale = options["speed"]
+
+       _shader_blend_rect.material.set_shader_parameter(
+               "dissolve_texture", options["pattern_enter"]
+       )
+       _shader_blend_rect.material.set_shader_parameter("fade", !options["pattern_enter"])
+       _shader_blend_rect.material.set_shader_parameter("fade_color", options["color"])
+       _shader_blend_rect.material.set_shader_parameter("inverted", false)
+       var animation = _animation_player.get_animation("ShaderFade")
+       animation.track_set_key_transition(0, 0, options["ease_enter"])
+       _animation_player.play("ShaderFade")
+
+       await _animation_player.animation_finished
+       fade_complete.emit()
+       options["on_fade_out"].call()
+
+func fade_in(setted_options: Dictionary = {}) -> void:
+       var options = _get_final_options(setted_options)
+       _animation_player.speed_scale = options["speed"]
+       _shader_blend_rect.material.set_shader_parameter(
+               "dissolve_texture", options["pattern_leave"]
+       )
+       _shader_blend_rect.material.set_shader_parameter("fade", !options["pattern_leave"])
+       _shader_blend_rect.material.set_shader_parameter("fade_color", options["color"])
+       _shader_blend_rect.material.set_shader_parameter("inverted", options["invert_on_leave"])
+       var animation = _animation_player.get_animation("ShaderFade")
+       animation.track_set_key_transition(0, 0, options["ease_leave"])
+       _animation_player.play_backwards("ShaderFade")
+
+       await _animation_player.animation_finished
+       is_transitioning = false
+       transition_finished.emit()
+       options["on_fade_in"].call()
diff --git a/addons/scene_manager/SceneManager.tscn b/addons/scene_manager/SceneManager.tscn
new file mode 100644 (file)
index 0000000..9a96c7b
--- /dev/null
@@ -0,0 +1,27 @@
+[gd_scene load_steps=5 format=3 uid="uid://j20v4cg7v8m1"]
+
+[ext_resource type="Script" path="res://addons/scene_manager/SceneManager.gd" id="1_22br8"]
+[ext_resource type="Shader" path="res://addons/scene_manager/Dissolve2d.gdshader" id="2_853wq"]
+[ext_resource type="Animation" uid="uid://dxr1r78uxitcq" path="res://addons/scene_manager/ShaderFade.tres" id="5_anecj"]
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_0imdi"]
+shader = ExtResource( "2_853wq" )
+shader_parameter/dissolve_amount = 0.0
+shader_parameter/fade_color = Color(0, 0, 0, 1)
+shader_parameter/fade = null
+shader_parameter/inverted = null
+
+[node name="SceneManager" type="Node2D"]
+script = ExtResource( "1_22br8" )
+
+[node name="CanvasLayer" type="CanvasLayer" parent="."]
+layer = 3
+
+[node name="ColorRect" type="ColorRect" parent="CanvasLayer"]
+material = SubResource( "ShaderMaterial_0imdi" )
+anchor_right = 1.0
+anchor_bottom = 1.0
+mouse_filter = 2
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
+anims/ShaderFade = ExtResource( "5_anecj" )
diff --git a/addons/scene_manager/SceneManagerConstants.gd b/addons/scene_manager/SceneManagerConstants.gd
new file mode 100644 (file)
index 0000000..1e11a57
--- /dev/null
@@ -0,0 +1,4 @@
+class_name SceneManagerConstants extends Object
+
+const SINGLETON_GROUP_NAME = "scene_manager_entity_nodes"
+const SINGLETON_META_NAME = "entity_name"
diff --git a/addons/scene_manager/SceneManagerPlugin.gd b/addons/scene_manager/SceneManagerPlugin.gd
new file mode 100644 (file)
index 0000000..9c616e5
--- /dev/null
@@ -0,0 +1,13 @@
+@tool
+extends EditorPlugin
+var _inspector_plugin
+
+func _enter_tree():
+       add_autoload_singleton("SceneManager", "res://addons/scene_manager/SceneManager.tscn")
+       _inspector_plugin = load("res://addons/scene_manager/NodeFlagsInspectorPlugin.gd").new()
+       add_inspector_plugin(_inspector_plugin)
+
+
+func _exit_tree():
+       remove_autoload_singleton("SceneManager")
+       remove_inspector_plugin(_inspector_plugin)
diff --git a/addons/scene_manager/ShaderFade.tres b/addons/scene_manager/ShaderFade.tres
new file mode 100644 (file)
index 0000000..abe3db4
--- /dev/null
@@ -0,0 +1,16 @@
+[gd_resource type="Animation" format=3 uid="uid://dxr1r78uxitcq"]
+
+[resource]
+resource_name = "ShaderFade"
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("CanvasLayer/ColorRect:material:shader_parameter/dissolve_amount")
+tracks/0/interp = 2
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0, 1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [0.0, 1.0]
+}
diff --git a/addons/scene_manager/SingletonCheckProperty.gd b/addons/scene_manager/SingletonCheckProperty.gd
new file mode 100644 (file)
index 0000000..1960485
--- /dev/null
@@ -0,0 +1,32 @@
+extends EditorProperty
+
+var checkbox := CheckBox.new()
+var edited_control = null
+var group_name = SceneManagerConstants.SINGLETON_GROUP_NAME
+
+func _ready():
+       edited_control = get_edited_object()
+
+       label = "Singleton entity"
+
+       checkbox.connect("toggled", Callable(self, "_on_checkbox_checked"))
+       add_child(checkbox)
+
+
+func _physics_process(_delta):
+       if not edited_control and get_edited_object():
+               edited_control = get_edited_object()
+               checkbox.set_pressed_no_signal(edited_control.is_in_group(group_name))
+       checkbox.text = "Yes" if checkbox.pressed else "No"
+
+
+func _on_checkbox_checked(is_checked):
+       var new_groups = edited_control.get_groups()
+       if is_checked:
+               new_groups.append(group_name)
+               edited_control.add_to_group(group_name, true)
+       else:
+               var index = new_groups.find(group_name)
+               new_groups.remove(index)
+               edited_control.remove_from_group(group_name)
+       emit_changed('groups', new_groups)
diff --git a/addons/scene_manager/SingletonNameProperty.gd b/addons/scene_manager/SingletonNameProperty.gd
new file mode 100644 (file)
index 0000000..63ede31
--- /dev/null
@@ -0,0 +1,34 @@
+extends EditorProperty
+
+var line_edit = LineEdit.new()
+var edited_control = null
+var meta_name = SceneManagerConstants.SINGLETON_META_NAME
+var group_name = SceneManagerConstants.SINGLETON_GROUP_NAME
+
+func _ready():
+       label = "Entity name"
+
+       line_edit.connect("text_changed", Callable(self, "_on_text_changed"))
+       add_child(line_edit)
+
+
+func _physics_process(_delta):
+       if not edited_control and get_edited_object():
+               edited_control = get_edited_object()
+               if edited_control.has_meta(meta_name):
+                       line_edit.text = edited_control.get_meta(meta_name)
+       if edited_control:
+               pass
+#              XXX
+#              draw_red = (
+#                      not edited_control.has_meta(meta_name)
+#                      and edited_control.is_in_group(group_name)
+#              )
+
+
+func _on_text_changed(new_text: String):
+       if new_text == "":
+               edited_control.set_meta(meta_name, null)
+       else:
+               edited_control.set_meta(meta_name, new_text)
+       emit_changed("meta", new_text, meta_name)
diff --git a/addons/scene_manager/icon.png b/addons/scene_manager/icon.png
new file mode 100644 (file)
index 0000000..41fb36c
Binary files /dev/null and b/addons/scene_manager/icon.png differ
diff --git a/addons/scene_manager/icon.png.import b/addons/scene_manager/icon.png.import
new file mode 100644 (file)
index 0000000..b3772de
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b7x3qxooitt0l"
+path="res://.godot/imported/icon.png-1ae74eb651b355b4baf5d77f5493a2f8.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/scene_manager/icon.png"
+dest_files=["res://.godot/imported/icon.png-1ae74eb651b355b4baf5d77f5493a2f8.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/addons/scene_manager/plugin.cfg b/addons/scene_manager/plugin.cfg
new file mode 100644 (file)
index 0000000..28388cc
--- /dev/null
@@ -0,0 +1,7 @@
+[plugin]
+
+name="Scene Manager"
+description="Scene Manager"
+author="GlassBrick"
+version="1.0.1"
+script="SceneManagerPlugin.gd"
diff --git a/addons/scene_manager/shader_patterns/circle.png b/addons/scene_manager/shader_patterns/circle.png
new file mode 100644 (file)
index 0000000..7e3eb48
Binary files /dev/null and b/addons/scene_manager/shader_patterns/circle.png differ
diff --git a/addons/scene_manager/shader_patterns/circle.png.import b/addons/scene_manager/shader_patterns/circle.png.import
new file mode 100644 (file)
index 0000000..c30fa93
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bpskbib6w4gdp"
+path.s3tc="res://.godot/imported/circle.png-49deb66a2171d4476d4de5b40b7c62d8.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/scene_manager/shader_patterns/circle.png"
+dest_files=["res://.godot/imported/circle.png-49deb66a2171d4476d4de5b40b7c62d8.s3tc.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+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/addons/scene_manager/shader_patterns/curtains.png b/addons/scene_manager/shader_patterns/curtains.png
new file mode 100644 (file)
index 0000000..c9f096e
Binary files /dev/null and b/addons/scene_manager/shader_patterns/curtains.png differ
diff --git a/addons/scene_manager/shader_patterns/curtains.png.import b/addons/scene_manager/shader_patterns/curtains.png.import
new file mode 100644 (file)
index 0000000..ec5e7e4
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://nglientb4rxo"
+path.s3tc="res://.godot/imported/curtains.png-f5a25cbc897d336641cfbab203b5832e.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/scene_manager/shader_patterns/curtains.png"
+dest_files=["res://.godot/imported/curtains.png-f5a25cbc897d336641cfbab203b5832e.s3tc.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+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/addons/scene_manager/shader_patterns/diagonal.png b/addons/scene_manager/shader_patterns/diagonal.png
new file mode 100644 (file)
index 0000000..30ce2f9
Binary files /dev/null and b/addons/scene_manager/shader_patterns/diagonal.png differ
diff --git a/addons/scene_manager/shader_patterns/diagonal.png.import b/addons/scene_manager/shader_patterns/diagonal.png.import
new file mode 100644 (file)
index 0000000..fee571c
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cgmfhc32g6va6"
+path.s3tc="res://.godot/imported/diagonal.png-fda70de082e7ad6bc449e3580ab09c7f.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/scene_manager/shader_patterns/diagonal.png"
+dest_files=["res://.godot/imported/diagonal.png-fda70de082e7ad6bc449e3580ab09c7f.s3tc.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+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/addons/scene_manager/shader_patterns/horizontal.png b/addons/scene_manager/shader_patterns/horizontal.png
new file mode 100644 (file)
index 0000000..6dc32d5
Binary files /dev/null and b/addons/scene_manager/shader_patterns/horizontal.png differ
diff --git a/addons/scene_manager/shader_patterns/horizontal.png.import b/addons/scene_manager/shader_patterns/horizontal.png.import
new file mode 100644 (file)
index 0000000..a688c8d
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://7ypismovx1sv"
+path.s3tc="res://.godot/imported/horizontal.png-350a31fe557936e31f870194c26cef69.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/scene_manager/shader_patterns/horizontal.png"
+dest_files=["res://.godot/imported/horizontal.png-350a31fe557936e31f870194c26cef69.s3tc.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+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/addons/scene_manager/shader_patterns/radial.png b/addons/scene_manager/shader_patterns/radial.png
new file mode 100644 (file)
index 0000000..926330b
Binary files /dev/null and b/addons/scene_manager/shader_patterns/radial.png differ
diff --git a/addons/scene_manager/shader_patterns/radial.png.import b/addons/scene_manager/shader_patterns/radial.png.import
new file mode 100644 (file)
index 0000000..4e240ba
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dpipc6av3p107"
+path.s3tc="res://.godot/imported/radial.png-45b81257cf212bc197b861ea33052002.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/scene_manager/shader_patterns/radial.png"
+dest_files=["res://.godot/imported/radial.png-45b81257cf212bc197b861ea33052002.s3tc.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+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/addons/scene_manager/shader_patterns/scribbles.png b/addons/scene_manager/shader_patterns/scribbles.png
new file mode 100644 (file)
index 0000000..428b956
Binary files /dev/null and b/addons/scene_manager/shader_patterns/scribbles.png differ
diff --git a/addons/scene_manager/shader_patterns/scribbles.png.import b/addons/scene_manager/shader_patterns/scribbles.png.import
new file mode 100644 (file)
index 0000000..4b84f71
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bgcid7fyjtd30"
+path.s3tc="res://.godot/imported/scribbles.png-430a0f7331a442eb053961f8e9bb82f0.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/scene_manager/shader_patterns/scribbles.png"
+dest_files=["res://.godot/imported/scribbles.png-430a0f7331a442eb053961f8e9bb82f0.s3tc.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+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/addons/scene_manager/shader_patterns/squares.png b/addons/scene_manager/shader_patterns/squares.png
new file mode 100644 (file)
index 0000000..d471ef7
Binary files /dev/null and b/addons/scene_manager/shader_patterns/squares.png differ
diff --git a/addons/scene_manager/shader_patterns/squares.png.import b/addons/scene_manager/shader_patterns/squares.png.import
new file mode 100644 (file)
index 0000000..4f97374
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b45fitoojqhxe"
+path.s3tc="res://.godot/imported/squares.png-a8c8144d665aa3e0d712474304ad6e6f.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/scene_manager/shader_patterns/squares.png"
+dest_files=["res://.godot/imported/squares.png-a8c8144d665aa3e0d712474304ad6e6f.s3tc.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+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/addons/scene_manager/shader_patterns/vertical.png b/addons/scene_manager/shader_patterns/vertical.png
new file mode 100644 (file)
index 0000000..394ca1e
Binary files /dev/null and b/addons/scene_manager/shader_patterns/vertical.png differ
diff --git a/addons/scene_manager/shader_patterns/vertical.png.import b/addons/scene_manager/shader_patterns/vertical.png.import
new file mode 100644 (file)
index 0000000..3ec5293
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cwci7g18k0mgh"
+path.s3tc="res://.godot/imported/vertical.png-5d237b9ea3cdd66e653ef032da0bd507.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/scene_manager/shader_patterns/vertical.png"
+dest_files=["res://.godot/imported/vertical.png-5d237b9ea3cdd66e653ef032da0bd507.s3tc.ctex"]
+
+[params]
+
+compress/mode=2
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+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/addons/script-tabs/LICENSE b/addons/script-tabs/LICENSE
new file mode 100644 (file)
index 0000000..ca61fab
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Maxim Kovkel
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/addons/script-tabs/plugin.cfg b/addons/script-tabs/plugin.cfg
new file mode 100644 (file)
index 0000000..13217ed
--- /dev/null
@@ -0,0 +1,7 @@
+[plugin]
+
+name="script-tabs"
+description="Move scripts list to tabs."
+author="kovkel"
+version="1.0.0"
+script="plugin.gd"
diff --git a/addons/script-tabs/plugin.gd b/addons/script-tabs/plugin.gd
new file mode 100644 (file)
index 0000000..13e472a
--- /dev/null
@@ -0,0 +1,213 @@
+@tool
+extends EditorPlugin
+
+const HIDE_NATIVE_LIST = true
+
+var _scripts_tab_container: TabContainer
+var _scripts_tab_bar: TabBar
+var _scripts_item_list: ItemList
+var _prev_state := TabContainerState.new()
+var _last_tab_selected = -1
+var _last_tab_hovered = -1
+
+
+func _enter_tree() -> void:
+       var script_editor = get_editor_interface().get_script_editor()
+       _scripts_tab_container = first_or_null(script_editor.find_children(
+                       "*", "TabContainer", true, false
+               )
+       )
+       _scripts_item_list = first_or_null(script_editor.find_children(
+               "*", "ItemList", true, false
+       ))
+       if _scripts_tab_container:
+               _scripts_tab_bar = get_tab_bar_of(_scripts_tab_container)
+               _prev_state.save(_scripts_tab_container, _scripts_tab_bar)
+               _scripts_tab_container.tabs_visible = true
+               _scripts_tab_container.drag_to_rearrange_enabled = true
+               _scripts_tab_container.sort_children.connect(_update_tabs)
+       if _scripts_tab_bar:
+               _scripts_tab_bar.tab_close_display_policy = TabBar.CLOSE_BUTTON_SHOW_ACTIVE_ONLY
+               _scripts_tab_bar.select_with_rmb = true
+               _scripts_tab_bar.drag_to_rearrange_enabled = true
+               _scripts_tab_bar.tab_close_pressed.connect(_on_tab_close)
+               _scripts_tab_bar.tab_rmb_clicked.connect(_on_tab_rmb)
+               _scripts_tab_bar.tab_selected.connect(_on_tab_selected)
+               _scripts_tab_bar.tab_hovered.connect(_on_tab_hovered)
+               _scripts_tab_bar.mouse_exited.connect(_on_tab_bar_mouse_exited)
+               _scripts_tab_bar.active_tab_rearranged.connect(_on_active_tab_rearranged)
+               _scripts_tab_bar.gui_input.connect(_on_scripts_tab_bar_gui_input)
+       if _scripts_item_list:
+               if HIDE_NATIVE_LIST:
+                       _scripts_item_list.get_parent().visible = false
+               _scripts_item_list.property_list_changed.connect(_on_item_list_property_list_changed)
+       _update_tabs()
+
+
+func _exit_tree() -> void:
+       if _scripts_tab_container:
+               _scripts_tab_bar = get_tab_bar_of(_scripts_tab_container)
+               _prev_state.restore(_scripts_tab_container, _scripts_tab_bar)
+               _scripts_tab_container.sort_children.disconnect(_update_tabs)
+       if _scripts_item_list:
+               if HIDE_NATIVE_LIST:
+                       _scripts_item_list.get_parent().visible = true
+               _scripts_item_list.property_list_changed.disconnect(_on_item_list_property_list_changed)
+       if _scripts_tab_bar:
+               _scripts_tab_bar.mouse_exited.disconnect(_on_tab_bar_mouse_exited)
+               _scripts_tab_bar.gui_input.disconnect(_on_scripts_tab_bar_gui_input)
+               _scripts_tab_bar.tab_close_pressed.disconnect(_on_tab_close)
+               _scripts_tab_bar.tab_rmb_clicked.disconnect(_on_tab_rmb)
+               _scripts_tab_bar.tab_selected.disconnect(_on_tab_selected)
+               _scripts_tab_bar.tab_hovered.disconnect(_on_tab_hovered)
+               _scripts_tab_bar.active_tab_rearranged.disconnect(_on_active_tab_rearranged)
+
+
+func _on_tab_bar_mouse_exited():
+       _last_tab_hovered = -1
+       
+
+func _on_tab_hovered(idx):
+       _last_tab_hovered = idx
+
+
+func _on_scripts_tab_bar_gui_input(event: InputEvent):
+       if event is InputEventMouseMotion:
+               var tab_control = _scripts_tab_container.get_tab_control(_last_tab_hovered)
+               var path = ''
+               if tab_control:
+                       path = tab_control.get("metadata/_edit_res_path")
+               _scripts_tab_bar.tooltip_text = '' if path == null else path
+       if _last_tab_hovered == -1: return
+       if event is InputEventMouseButton:
+               if event.is_pressed() and event.button_index == MOUSE_BUTTON_MIDDLE:
+                       _simulate_item_clicked(_last_tab_hovered, MOUSE_BUTTON_MIDDLE)
+
+
+func _on_active_tab_rearranged(_idx_to):
+       var control = _scripts_tab_container.get_tab_control(_last_tab_selected)
+       if not control:
+               return
+       _scripts_tab_container.move_child(control, _idx_to)
+       _scripts_tab_container.current_tab = _scripts_tab_container.current_tab
+       _trigger_script_editor_update_script_names()
+
+
+func _on_tab_selected(tab_idx):
+       _last_tab_selected = tab_idx
+       var item_idx = _find_list_item_idx_by_tab_idx(tab_idx)
+       if item_idx != -1:
+               if not _scripts_item_list.is_selected(item_idx):
+                       var select_scripts_item = func():
+                               _scripts_item_list.select(item_idx)
+                               _scripts_item_list.item_selected.emit(item_idx)
+                       select_scripts_item.call_deferred()
+
+
+func _on_tab_rmb(tab_idx):
+       _simulate_item_clicked(tab_idx, MOUSE_BUTTON_RIGHT)
+
+
+func _on_tab_close(tab_idx):
+       _simulate_item_clicked(tab_idx, MOUSE_BUTTON_MIDDLE)
+
+
+func _on_item_list_property_list_changed():
+       _update_tabs.call_deferred()
+
+
+func _simulate_item_clicked(tab_idx, mouse_idx):
+       if _scripts_item_list:
+               var item_idx = _find_list_item_idx_by_tab_idx(tab_idx)
+               if item_idx != -1:
+                       _scripts_item_list.item_clicked.emit(
+                               item_idx,
+                               _scripts_item_list.get_local_mouse_position(),
+                               mouse_idx
+                       )
+
+
+func _update_tabs():
+       _update_tab_names()
+       _update_tab_icons()
+
+
+func _update_tab_names():
+       if not _scripts_tab_container or not _scripts_item_list:
+               return
+
+       for item_idx in _scripts_item_list.item_count:
+               var tab_idx = _get_item_list_tab_idx(item_idx)
+               if tab_idx != -1:
+                       _scripts_tab_container.set_tab_title(
+                               tab_idx, _scripts_item_list.get_item_text(item_idx)
+                       )
+
+
+func _update_tab_icons():
+       if not _scripts_tab_container or not _scripts_item_list:
+               return
+       
+       for item_idx in _scripts_item_list.item_count:
+               var tab_idx = _get_item_list_tab_idx(item_idx)
+               if tab_idx != -1:
+                       _scripts_tab_container.set_tab_icon(
+                               tab_idx, _scripts_item_list.get_item_icon(item_idx)
+                       )
+
+
+func _get_item_list_tab_idx(item_idx) -> int:
+       var metadata = _scripts_item_list.get_item_metadata(item_idx)
+       if not metadata is int:
+               return -1
+       else:
+               return metadata
+
+
+func _find_list_item_idx_by_tab_idx(tab_idx) -> int:
+       for i in _scripts_item_list.item_count:
+               if _scripts_item_list.get_item_metadata(i) == tab_idx:
+                       return i
+       return -1
+
+
+func _trigger_script_editor_update_script_names():
+       var script_editor = get_editor_interface().get_script_editor()
+       # for now it is the only way to trigger script_edtior._update_script_names
+       script_editor.notification(Control.NOTIFICATION_THEME_CHANGED)
+
+
+static func first_or_null(arr):
+       if len(arr) == 0:
+               return null
+       return arr[0]
+
+
+static func get_tab_bar_of(src) -> TabBar:
+       for c in src.get_children(true):
+               if c is TabBar:
+                       return c
+       return null
+
+
+class TabContainerState:
+       var _tabs_visible
+       var _drag_to_rearrange_enabled
+       var _tab_close_display_policy
+       var _select_with_rmb
+       
+       func save(src: TabContainer, tab_bar: TabBar):
+               if src:
+                       _tabs_visible = src.tabs_visible
+               if tab_bar:
+                       _drag_to_rearrange_enabled = tab_bar.drag_to_rearrange_enabled
+                       _tab_close_display_policy = tab_bar.tab_close_display_policy
+                       _select_with_rmb = tab_bar.select_with_rmb
+       
+       func restore(src: TabContainer, tab_bar: TabBar):
+               if src:
+                       src.tabs_visible = _tabs_visible
+               if tab_bar:
+                       tab_bar.drag_to_rearrange_enabled = _drag_to_rearrange_enabled
+                       tab_bar.tab_close_display_policy = _tab_close_display_policy
+                       tab_bar.select_with_rmb = _select_with_rmb
diff --git a/assets/animations/player_animation.tres b/assets/animations/player_animation.tres
new file mode 100644 (file)
index 0000000..938ca26
--- /dev/null
@@ -0,0 +1,129 @@
+[gd_resource type="SpriteFrames" load_steps=16 format=3 uid="uid://dum0mxk5oajvu"]
+
+[ext_resource type="Texture2D" uid="uid://bieln87fe7533" path="res://assets/textures/character.png" id="1_06o7x"]
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_m52mq"]
+atlas = ExtResource("1_06o7x")
+region = Rect2(0, 0, 16, 36)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_4nxqo"]
+atlas = ExtResource("1_06o7x")
+region = Rect2(216, 0, 16, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_6lthj"]
+atlas = ExtResource("1_06o7x")
+region = Rect2(0, 64, 16, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_0bexk"]
+atlas = ExtResource("1_06o7x")
+region = Rect2(16, 64, 16, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_oehvp"]
+atlas = ExtResource("1_06o7x")
+region = Rect2(32, 64, 16, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_65p5i"]
+atlas = ExtResource("1_06o7x")
+region = Rect2(48, 64, 16, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_lir7y"]
+atlas = ExtResource("1_06o7x")
+region = Rect2(0, 0, 16, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_qctxi"]
+atlas = ExtResource("1_06o7x")
+region = Rect2(16, 0, 16, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_3se7e"]
+atlas = ExtResource("1_06o7x")
+region = Rect2(32, 0, 16, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_2ixv7"]
+atlas = ExtResource("1_06o7x")
+region = Rect2(48, 0, 16, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_cpgi2"]
+atlas = ExtResource("1_06o7x")
+region = Rect2(0, 32, 16, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_22k82"]
+atlas = ExtResource("1_06o7x")
+region = Rect2(16, 32, 16, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_xitbn"]
+atlas = ExtResource("1_06o7x")
+region = Rect2(32, 32, 16, 32)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_ntwlo"]
+atlas = ExtResource("1_06o7x")
+region = Rect2(48, 32, 16, 32)
+
+[resource]
+animations = [{
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_m52mq")
+}],
+"loop": true,
+"name": &"idle",
+"speed": 1.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_4nxqo")
+}],
+"loop": true,
+"name": &"pick_item",
+"speed": 1.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_6lthj")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_0bexk")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_oehvp")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_65p5i")
+}],
+"loop": true,
+"name": &"walk_back",
+"speed": 7.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_lir7y")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_qctxi")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_3se7e")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_2ixv7")
+}],
+"loop": true,
+"name": &"walk_front",
+"speed": 7.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_cpgi2")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_22k82")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_xitbn")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_ntwlo")
+}],
+"loop": true,
+"name": &"walk_side",
+"speed": 7.0
+}]
diff --git a/assets/resources/save_resource.gd b/assets/resources/save_resource.gd
new file mode 100644 (file)
index 0000000..c287c6a
--- /dev/null
@@ -0,0 +1,4 @@
+class_name SaveResource extends Resource
+
+var scene: Constants.LEVELS_NAMES
+var player_position: Vector2
diff --git a/assets/resources/save_resource.tres b/assets/resources/save_resource.tres
new file mode 100644 (file)
index 0000000..0e4e2d0
--- /dev/null
@@ -0,0 +1,6 @@
+[gd_resource type="Resource" script_class="SaveResource" load_steps=2 format=3 uid="uid://ci0v1u7i67vvu"]
+
+[ext_resource type="Script" path="res://assets/resources/save_resource.gd" id="1_ohq41"]
+
+[resource]
+script = ExtResource("1_ohq41")
diff --git a/assets/shaders/water.gdshader b/assets/shaders/water.gdshader
new file mode 100644 (file)
index 0000000..022d090
--- /dev/null
@@ -0,0 +1,134 @@
+// source: https://godotshaders.com/shader/pixel-art-water/
+shader_type canvas_item;
+
+uniform float aspectRatio = 1.0f;
+uniform float pixelization = 2048.0f;
+
+uniform sampler2D waterDepthGradient : hint_default_black;
+
+uniform vec4 causticColor = vec4(0.455f, 0.773f, 0.765f, 1.0f);
+uniform vec4 causticHighlightColor = vec4(0.741f, 0.894f, 0.898f, 1.0f);
+uniform sampler2D causticTexture : hint_default_white, repeat_enable;
+uniform sampler2D causticHighlightTexture : hint_default_white, repeat_enable;
+uniform sampler2D causticNoiseTexture : hint_default_white, repeat_enable;
+uniform sampler2D causticFadeNoiseTexture : hint_default_white, repeat_enable;
+uniform float causticScale = 12.0f;
+uniform float causticSpeed = 0.005f;
+uniform float causticMovementAmount = 0.15f;
+uniform float causticFaderMultiplier = 1.45f;
+
+uniform vec4 specularColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
+uniform sampler2D specularNoiseTexture : hint_default_white, repeat_enable;
+uniform sampler2D specularMovementLeftNoiseTexture : hint_default_white, repeat_enable;
+uniform sampler2D specularMovementRightNoiseTexture : hint_default_white, repeat_enable;
+uniform float specularThreshold = 0.35f;
+uniform float specularSpeed = 0.025f;
+uniform float specularScale = 15.0f;
+
+uniform vec4 foamColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
+uniform sampler2D foamTexture : hint_default_white, repeat_enable;
+uniform float foamIntensity = 0.2f;
+uniform float foamScale = 15.0f;
+
+uniform vec4 outlineColor = vec4(0.675f, 0.86f, 1.0f, 1.0f);
+uniform float generalTransparency = 1.0f;
+
+
+// ------------------------------------------------------------------------------------
+// Helper functions
+
+// Blends two vec2's by subtracting them. Compare this to Photoshop blend mode "Subtract".
+// Source:
+// https://docs.unity3d.com/Packages/[email protected]/manual/Blend-Node.html
+vec2 blendSubtract_vec2(vec2 base, vec2 blend, float opacity)
+{
+       vec2 result = base - blend;
+       return mix(base, result, opacity);
+}
+
+// Blends two floats by subtracting them. Compare this to Photoshop blend mode "Subtract".
+// Source:
+// https://docs.unity3d.com/Packages/[email protected]/manual/Blend-Node.html
+float blendSubtract_float(float base, float blend, float opacity)
+{
+       float result = base - blend;
+       return mix(base, result, opacity);
+}
+
+// Blends two vec2's by overlaying them. Compare this to Photoshop blend mode "Overlay".
+// Source:
+// https://docs.unity3d.com/Packages/[email protected]/manual/Blend-Node.html
+float blendOverlay_float(float base, float blend, float opacity)
+{
+       float result1 = 1.0f - 2.0f * (1.0f - base) * (1.0f - blend);
+    float result2 = 2.0f * base * blend;
+    float zeroOrOne = step(0.5f, base);
+    float res = result2 * zeroOrOne + (1.0 - zeroOrOne) * result1;
+    return mix(base, res, opacity);
+}
+
+// Pixelizes the given coordinate.
+vec2 pixelizeCoordinates(vec2 coordinates)
+{
+       return floor(coordinates * pixelization) / pixelization;
+}
+
+// Applies the aspect ratio to the coordinates.
+vec2 applyAspectRatio(vec2 coordinates)
+{
+       return vec2(coordinates.x, coordinates.y * aspectRatio);
+}
+
+// ------------------------------------------------------------------------------------
+// Shader layers
+
+vec4 caustics(vec2 pixelizedCoordinates)
+{
+       vec4 causticNoise = texture(causticNoiseTexture, TIME * causticSpeed + pixelizedCoordinates);
+       vec2 noiseCoordinates = blendSubtract_vec2(pixelizedCoordinates * causticScale, causticNoise.rg, causticMovementAmount);
+       vec4 causticHighlight = texture(causticHighlightTexture, noiseCoordinates) * causticHighlightColor;
+       vec4 caustic = texture(causticTexture, noiseCoordinates) * causticColor;
+       vec4 interpolatedCaustics = mix(caustic, causticHighlight, causticHighlight.a);
+       float fadeNoise = texture(causticFadeNoiseTexture, noiseCoordinates).r * causticFaderMultiplier;
+       return vec4(interpolatedCaustics.r, interpolatedCaustics.g, interpolatedCaustics.b, clamp(interpolatedCaustics.a - fadeNoise, 0.0, 1.0));
+}
+
+vec4 specular(vec2 pixelizedCoordinates)
+{
+       vec2 scaledCoordinates = pixelizedCoordinates * specularScale;
+       float specularNoise = texture(specularNoiseTexture, scaledCoordinates).r;
+       float leftScrollingNoise = texture(specularMovementLeftNoiseTexture, scaledCoordinates + vec2(TIME * specularSpeed, 0.0f)).r;
+       float rightScrollingNoise = texture(specularMovementRightNoiseTexture, scaledCoordinates + vec2(TIME * specularSpeed * -1.0f, 0.0f)).r;
+       return step(specularThreshold, blendSubtract_float(blendOverlay_float(leftScrollingNoise, rightScrollingNoise, 1.0f), specularNoise, 1.0f)) * specularColor;
+}
+
+vec4 foam(vec2 pixelizedCoordinates, vec4 mainTexColor)
+{
+       vec4 colorizedFoam = texture(foamTexture, pixelizedCoordinates * foamScale) * foamColor;
+       float intensity = clamp(mainTexColor.g * mainTexColor.a - foamIntensity, 0.0f, 1.0f);
+       return vec4(colorizedFoam.r, colorizedFoam.g, colorizedFoam.b, colorizedFoam.a * intensity);
+}
+
+// ------------------------------------------------------------------------------------
+// Fragment Shader code
+
+void fragment()
+{
+       vec2 pixelizedCoordinates = pixelizeCoordinates(applyAspectRatio(UV));
+       vec4 mainTex = texture(TEXTURE, UV);
+       vec4 depthBasedWaterColor = texture(waterDepthGradient, vec2(1.0f - mainTex.b, 1.0f));
+
+       vec4 finalCaustics = caustics(pixelizedCoordinates);
+       vec4 finalSpecular = specular(pixelizedCoordinates);
+       vec4 finalFoam = foam(pixelizedCoordinates, mainTex);
+
+       vec4 waterWithCausticLayer = mix(depthBasedWaterColor, finalCaustics, finalCaustics.a);
+       vec4 waterWithCausticAndSpecularLayer = mix(waterWithCausticLayer, finalSpecular, ceil(finalCaustics.a) * finalSpecular.a);
+       vec4 waterWithCausticAndSpecularAndFoamLayer = mix(waterWithCausticAndSpecularLayer, finalFoam, finalFoam.a);
+
+       float outline = mainTex.a * mainTex.r;
+       vec4 finalOutlineColor = outline * outlineColor;
+
+       vec4 finalRGBColor = mix(waterWithCausticAndSpecularAndFoamLayer, finalOutlineColor, outline);
+       COLOR = vec4(finalRGBColor.r, finalRGBColor.g, finalRGBColor.b, mainTex.b * generalTransparency);
+}
\ No newline at end of file
diff --git a/assets/textures/Inner.png b/assets/textures/Inner.png
new file mode 100644 (file)
index 0000000..a07be97
Binary files /dev/null and b/assets/textures/Inner.png differ
diff --git a/assets/textures/Inner.png.import b/assets/textures/Inner.png.import
new file mode 100644 (file)
index 0000000..d8b61f4
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d4j4ulftsvn5c"
+path="res://.godot/imported/Inner.png-8dae7d1b6be963567fa029c7fbda5eac.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/textures/Inner.png"
+dest_files=["res://.godot/imported/Inner.png-8dae7d1b6be963567fa029c7fbda5eac.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/assets/textures/NPC_test.png b/assets/textures/NPC_test.png
new file mode 100644 (file)
index 0000000..4e3c1c9
Binary files /dev/null and b/assets/textures/NPC_test.png differ
diff --git a/assets/textures/NPC_test.png.import b/assets/textures/NPC_test.png.import
new file mode 100644 (file)
index 0000000..b428e8e
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cb0hu1gyv0wg"
+path="res://.godot/imported/NPC_test.png-a07e6bba6829e6d0cf0f0ac2c7f0dfdf.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/textures/NPC_test.png"
+dest_files=["res://.godot/imported/NPC_test.png-a07e6bba6829e6d0cf0f0ac2c7f0dfdf.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/assets/textures/Overworld.png b/assets/textures/Overworld.png
new file mode 100644 (file)
index 0000000..c03c380
Binary files /dev/null and b/assets/textures/Overworld.png differ
diff --git a/assets/textures/Overworld.png.import b/assets/textures/Overworld.png.import
new file mode 100644 (file)
index 0000000..33f10f4
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bj3fteudhyal6"
+path="res://.godot/imported/Overworld.png-e315fbbcf5bdc25194885c8807eb08a7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/textures/Overworld.png"
+dest_files=["res://.godot/imported/Overworld.png-e315fbbcf5bdc25194885c8807eb08a7.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/assets/textures/cave.png b/assets/textures/cave.png
new file mode 100644 (file)
index 0000000..1df7b3e
Binary files /dev/null and b/assets/textures/cave.png differ
diff --git a/assets/textures/cave.png.import b/assets/textures/cave.png.import
new file mode 100644 (file)
index 0000000..3b93a1f
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b4uxpn3r3muim"
+path="res://.godot/imported/cave.png-f8be29d1f2c7bcc38711ae73d96021ca.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/textures/cave.png"
+dest_files=["res://.godot/imported/cave.png-f8be29d1f2c7bcc38711ae73d96021ca.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/assets/textures/character.png b/assets/textures/character.png
new file mode 100644 (file)
index 0000000..a50ceb0
Binary files /dev/null and b/assets/textures/character.png differ
diff --git a/assets/textures/character.png.import b/assets/textures/character.png.import
new file mode 100644 (file)
index 0000000..980dbab
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bieln87fe7533"
+path="res://.godot/imported/character.png-eb7682b625186be15380dfb417abf04b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/textures/character.png"
+dest_files=["res://.godot/imported/character.png-eb7682b625186be15380dfb417abf04b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/assets/textures/font.png b/assets/textures/font.png
new file mode 100644 (file)
index 0000000..0128151
Binary files /dev/null and b/assets/textures/font.png differ
diff --git a/assets/textures/font.png.import b/assets/textures/font.png.import
new file mode 100644 (file)
index 0000000..2dd331b
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dullrv8en6u01"
+path="res://.godot/imported/font.png-de8fd18f5403d270eb35a6d0e08b006f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/textures/font.png"
+dest_files=["res://.godot/imported/font.png-de8fd18f5403d270eb35a6d0e08b006f.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/assets/textures/log.png b/assets/textures/log.png
new file mode 100644 (file)
index 0000000..b952a9a
Binary files /dev/null and b/assets/textures/log.png differ
diff --git a/assets/textures/log.png.import b/assets/textures/log.png.import
new file mode 100644 (file)
index 0000000..8703b69
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bdmfufth6l6ib"
+path="res://.godot/imported/log.png-60efc52c78f0cf441c4603014cef1389.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/textures/log.png"
+dest_files=["res://.godot/imported/log.png-60efc52c78f0cf441c4603014cef1389.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/assets/textures/objects.png b/assets/textures/objects.png
new file mode 100644 (file)
index 0000000..f76813f
Binary files /dev/null and b/assets/textures/objects.png differ
diff --git a/assets/textures/objects.png.import b/assets/textures/objects.png.import
new file mode 100644 (file)
index 0000000..0a871e0
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bpwdgjw2mw2xc"
+path="res://.godot/imported/objects.png-b847ac66b4012096f361a4c6b05392d3.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/textures/objects.png"
+dest_files=["res://.godot/imported/objects.png-b847ac66b4012096f361a4c6b05392d3.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
diff --git a/icon.svg b/icon.svg
new file mode 100644 (file)
index 0000000..3fe4f4a
--- /dev/null
+++ b/icon.svg
@@ -0,0 +1 @@
+<svg height="128" width="128" xmlns="http://www.w3.org/2000/svg"><rect x="2" y="2" width="124" height="124" rx="14" fill="#363d52" stroke="#212532" stroke-width="4"/><g transform="scale(.101) translate(122 122)"><g fill="#fff"><path d="M105 673v33q407 354 814 0v-33z"/><path d="m105 673 152 14q12 1 15 14l4 67 132 10 8-61q2-11 15-15h162q13 4 15 15l8 61 132-10 4-67q3-13 15-14l152-14V427q30-39 56-81-35-59-83-108-43 20-82 47-40-37-88-64 7-51 8-102-59-28-123-42-26 43-46 89-49-7-98 0-20-46-46-89-64 14-123 42 1 51 8 102-48 27-88 64-39-27-82-47-48 49-83 108 26 42 56 81zm0 33v39c0 276 813 276 814 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H446l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z" fill="#478cbf"/><path d="M483 600c0 34 58 34 58 0v-86c0-34-58-34-58 0z"/><circle cx="725" cy="526" r="90"/><circle cx="299" cy="526" r="90"/></g><g fill="#414042"><circle cx="307" cy="532" r="60"/><circle cx="717" cy="532" r="60"/></g></g></svg>
diff --git a/icon.svg.import b/icon.svg.import
new file mode 100644 (file)
index 0000000..ed747e2
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cuvqgno4i1wuh"
+path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon.svg"
+dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+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/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=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/project.godot b/project.godot
new file mode 100644 (file)
index 0000000..08e08f4
--- /dev/null
@@ -0,0 +1,67 @@
+; Engine configuration file.
+; It's best edited using the editor UI and not directly,
+; since the parameters that go here are not all obvious.
+;
+; Format:
+;   [section] ; section goes between []
+;   param=value ; assign values to parameters
+
+config_version=5
+
+[application]
+
+config/name="RPG template"
+run/main_scene="res://scenes/main_level.tscn"
+config/features=PackedStringArray("4.3", "Forward Plus")
+config/icon="res://icon.svg"
+
+[autoload]
+
+Constants="*res://scripts/constants.gd"
+SaveSystem="*res://addons/save_system/save_system.gd"
+SceneManager="*res://addons/scene_manager/SceneManager.tscn"
+PhantomCameraManager="*res://addons/phantom_camera/scripts/managers/phantom_camera_manager.gd"
+Globals="*res://scripts/globals.gd"
+
+[editor_plugins]
+
+enabled=PackedStringArray("res://addons/label_font_auto_sizer/plugin.cfg", "res://addons/phantom_camera/plugin.cfg", "res://addons/save_system/plugin.cfg", "res://addons/scene_manager/plugin.cfg", "res://addons/script-tabs/plugin.cfg")
+
+[input]
+
+ui_left={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
+]
+}
+ui_right={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194321,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
+]
+}
+ui_up={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194320,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
+]
+}
+ui_down={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194322,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
+]
+}
+
+[rendering]
+
+textures/canvas_textures/default_texture_filter=0
diff --git a/scenes/elements/door_scene_manager.tscn b/scenes/elements/door_scene_manager.tscn
new file mode 100644 (file)
index 0000000..929c15d
--- /dev/null
@@ -0,0 +1,29 @@
+[gd_scene load_steps=3 format=3 uid="uid://da1uex028xkv1"]
+
+[ext_resource type="Script" path="res://scripts/door_scene_manager.gd" id="1_ph76m"]
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_sglud"]
+size = Vector2(14, 20)
+
+[node name="DoorSceneManager" type="Node2D"]
+script = ExtResource("1_ph76m")
+
+[node name="Area2D" type="Area2D" parent="."]
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
+shape = SubResource("RectangleShape2D_sglud")
+
+[node name="editor_icon" type="Line2D" parent="."]
+z_index = 4096
+z_as_relative = false
+position = Vector2(0, 0.937227)
+scale = Vector2(1, 1.11715)
+points = PackedVector2Array(-7, 7.5, -2, 7.21725, -2, -0.838942, -6, -0.838942, 0, -9, 6, -0.838942, 2, -0.838942, 2, 7.21725, 7, 7.5)
+closed = true
+width = 1.0
+default_color = Color(1, 0, 0.360784, 1)
+sharp_limit = 3.0
+round_precision = 1
+
+[connection signal="body_entered" from="Area2D" to="." method="_on_area_2d_body_entered"]
+[connection signal="body_exited" from="Area2D" to="." method="_on_area_2d_body_exited"]
diff --git a/scenes/elements/player.tscn b/scenes/elements/player.tscn
new file mode 100644 (file)
index 0000000..c83d6c0
--- /dev/null
@@ -0,0 +1,21 @@
+[gd_scene load_steps=4 format=3 uid="uid://k76535tjepm3"]
+
+[ext_resource type="Script" path="res://scripts/player.gd" id="1_1webx"]
+[ext_resource type="SpriteFrames" uid="uid://dum0mxk5oajvu" path="res://assets/animations/player_animation.tres" id="1_qf5ok"]
+
+[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_geqid"]
+radius = 6.0
+height = 18.0
+
+[node name="Player" type="CharacterBody2D"]
+script = ExtResource("1_1webx")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+position = Vector2(0, -9)
+shape = SubResource("CapsuleShape2D_geqid")
+
+[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
+position = Vector2(0, -8)
+sprite_frames = ExtResource("1_qf5ok")
+animation = &"idle"
+frame_progress = 0.577081
diff --git a/scenes/house_template.tscn b/scenes/house_template.tscn
new file mode 100644 (file)
index 0000000..14fa3ed
--- /dev/null
@@ -0,0 +1,486 @@
+[gd_scene load_steps=6 format=4 uid="uid://bk4h1frr4r8tq"]
+
+[ext_resource type="Texture2D" uid="uid://d4j4ulftsvn5c" path="res://assets/textures/Inner.png" id="1_w2ggh"]
+[ext_resource type="PackedScene" uid="uid://k76535tjepm3" path="res://scenes/elements/player.tscn" id="2_07rl6"]
+[ext_resource type="PackedScene" uid="uid://da1uex028xkv1" path="res://scenes/elements/door_scene_manager.tscn" id="3_3eu8f"]
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_q4fiy"]
+texture = ExtResource("1_w2ggh")
+0:0/0 = 0
+1:0/0 = 0
+1:0/0/z_index = -1
+2:0/0 = 0
+2:0/0/z_index = -1
+3:0/0 = 0
+3:0/0/z_index = -1
+4:0/0 = 0
+4:0/0/z_index = -1
+5:0/0 = 0
+5:0/0/z_index = -1
+6:0/0 = 0
+6:0/0/z_index = -1
+7:0/0 = 0
+7:0/0/z_index = -1
+8:0/0 = 0
+8:0/0/z_index = -1
+9:0/0 = 0
+10:0/0 = 0
+11:0/0 = 0
+12:0/0 = 0
+12:0/0/z_index = 1
+13:0/0 = 0
+13:0/0/z_index = 1
+14:0/0 = 0
+14:0/0/z_index = 1
+15:0/0 = 0
+15:0/0/z_index = 1
+16:0/0 = 0
+16:0/0/z_index = 1
+17:0/0 = 0
+17:0/0/z_index = 1
+0:1/0 = 0
+0:1/0/z_index = -1
+1:1/0 = 0
+1:1/0/z_index = -1
+2:1/0 = 0
+2:1/0/z_index = -1
+3:1/0 = 0
+3:1/0/z_index = -1
+4:1/0 = 0
+4:1/0/z_index = -1
+5:1/0 = 0
+5:1/0/z_index = -1
+6:1/0 = 0
+6:1/0/z_index = -1
+7:1/0 = 0
+7:1/0/z_index = -1
+8:1/0 = 0
+8:1/0/z_index = -1
+9:1/0 = 0
+16:1/0 = 0
+16:1/0/z_index = 1
+17:1/0 = 0
+17:1/0/z_index = 1
+18:1/0 = 0
+18:1/0/z_index = 1
+19:1/0 = 0
+19:1/0/z_index = 1
+20:1/0 = 0
+20:1/0/z_index = 1
+21:1/0 = 0
+21:1/0/z_index = 1
+0:2/0 = 0
+0:2/0/z_index = -1
+1:2/0 = 0
+1:2/0/z_index = -1
+2:2/0 = 0
+2:2/0/z_index = -1
+3:2/0 = 0
+3:2/0/z_index = -1
+4:2/0 = 0
+5:2/0 = 0
+5:2/0/z_index = -1
+6:2/0 = 0
+6:2/0/z_index = -1
+7:2/0 = 0
+7:2/0/z_index = -1
+8:2/0 = 0
+8:2/0/z_index = -1
+9:2/0 = 0
+9:2/0/z_index = -1
+16:2/0 = 0
+16:2/0/z_index = 1
+17:2/0 = 0
+17:2/0/z_index = 1
+18:2/0 = 0
+18:2/0/z_index = 1
+19:2/0 = 0
+19:2/0/z_index = 1
+20:2/0 = 0
+20:2/0/z_index = 1
+21:2/0 = 0
+21:2/0/z_index = 1
+0:3/0 = 0
+0:3/0/z_index = -1
+1:3/0 = 0
+1:3/0/z_index = -1
+2:3/0 = 0
+2:3/0/z_index = -1
+3:3/0 = 0
+3:3/0/z_index = -1
+4:3/0 = 0
+5:3/0 = 0
+5:3/0/z_index = -1
+6:3/0 = 0
+6:3/0/z_index = -1
+7:3/0 = 0
+7:3/0/z_index = -1
+8:3/0 = 0
+8:3/0/z_index = -1
+9:3/0 = 0
+9:3/0/z_index = -1
+16:3/0 = 0
+16:3/0/z_index = 1
+17:3/0 = 0
+17:3/0/z_index = 1
+18:3/0 = 0
+18:3/0/z_index = 1
+19:3/0 = 0
+19:3/0/z_index = 1
+20:3/0 = 0
+20:3/0/z_index = 1
+21:3/0 = 0
+21:3/0/z_index = 1
+0:4/0 = 0
+0:4/0/z_index = -1
+1:4/0 = 0
+1:4/0/z_index = -1
+2:4/0 = 0
+2:4/0/z_index = -1
+3:4/0 = 0
+3:4/0/z_index = -1
+4:4/0 = 0
+5:4/0 = 0
+5:4/0/z_index = -1
+6:4/0 = 0
+6:4/0/z_index = -1
+7:4/0 = 0
+8:4/0 = 0
+9:4/0 = 0
+9:4/0/z_index = 1
+10:4/0 = 0
+10:4/0/z_index = 1
+11:4/0 = 0
+11:4/0/z_index = 1
+12:4/0 = 0
+12:4/0/z_index = 1
+13:4/0 = 0
+13:4/0/z_index = 1
+14:4/0 = 0
+14:4/0/z_index = 1
+0:5/0 = 0
+0:5/0/z_index = -1
+1:5/0 = 0
+1:5/0/z_index = -1
+2:5/0 = 0
+2:5/0/z_index = -1
+3:5/0 = 0
+3:5/0/z_index = -1
+4:5/0 = 0
+5:5/0 = 0
+5:5/0/z_index = -1
+6:5/0 = 0
+6:5/0/z_index = -1
+7:5/0 = 0
+8:5/0 = 0
+9:5/0 = 0
+9:5/0/z_index = 1
+10:5/0 = 0
+10:5/0/z_index = 1
+11:5/0 = 0
+11:5/0/z_index = 1
+12:5/0 = 0
+12:5/0/z_index = 1
+13:5/0 = 0
+13:5/0/z_index = 1
+14:5/0 = 0
+14:5/0/z_index = 1
+0:6/0 = 0
+2:6/0 = 0
+3:6/0 = 0
+4:6/0 = 0
+5:6/0 = 0
+6:6/0 = 0
+7:6/0 = 0
+8:6/0 = 0
+9:6/0 = 0
+10:6/0 = 0
+10:6/0/z_index = 1
+11:6/0 = 0
+11:6/0/z_index = 1
+12:6/0 = 0
+12:6/0/z_index = 1
+13:6/0 = 0
+13:6/0/z_index = 1
+14:6/0 = 0
+14:6/0/z_index = 1
+0:7/0 = 0
+0:7/0/z_index = 1
+1:7/0 = 0
+1:7/0/z_index = 1
+2:7/0 = 0
+2:7/0/z_index = 1
+3:7/0 = 0
+3:7/0/z_index = 1
+4:7/0 = 0
+4:7/0/z_index = 1
+5:7/0 = 0
+5:7/0/z_index = 1
+6:7/0 = 0
+6:7/0/z_index = 1
+7:7/0 = 0
+7:7/0/z_index = 1
+8:7/0 = 0
+8:7/0/z_index = 1
+9:7/0 = 0
+9:7/0/z_index = 1
+10:7/0 = 0
+10:7/0/z_index = 1
+11:7/0 = 0
+11:7/0/z_index = 1
+12:7/0 = 0
+12:7/0/z_index = 1
+13:7/0 = 0
+13:7/0/z_index = 1
+14:7/0 = 0
+14:7/0/z_index = 1
+15:7/0 = 0
+15:7/0/z_index = 1
+16:7/0 = 0
+16:7/0/z_index = 1
+0:8/0 = 0
+0:8/0/z_index = 1
+1:8/0 = 0
+1:8/0/z_index = 1
+2:8/0 = 0
+2:8/0/z_index = 1
+3:8/0 = 0
+3:8/0/z_index = 1
+4:8/0 = 0
+4:8/0/z_index = 1
+5:8/0 = 0
+5:8/0/z_index = 1
+6:8/0 = 0
+6:8/0/z_index = 1
+7:8/0 = 0
+7:8/0/z_index = 1
+8:8/0 = 0
+8:8/0/z_index = 1
+9:8/0 = 0
+9:8/0/z_index = 1
+10:8/0 = 0
+10:8/0/z_index = 1
+11:8/0 = 0
+11:8/0/z_index = 1
+12:8/0 = 0
+12:8/0/z_index = 1
+13:8/0 = 0
+13:8/0/z_index = 1
+14:8/0 = 0
+14:8/0/z_index = 1
+15:8/0 = 0
+15:8/0/z_index = 1
+16:8/0 = 0
+0:9/0 = 0
+0:9/0/z_index = 1
+1:9/0 = 0
+1:9/0/z_index = 1
+2:9/0 = 0
+2:9/0/z_index = 1
+3:9/0 = 0
+3:9/0/z_index = 1
+4:9/0 = 0
+4:9/0/z_index = 1
+5:9/0 = 0
+5:9/0/z_index = 1
+6:9/0 = 0
+6:9/0/z_index = 1
+7:9/0 = 0
+7:9/0/z_index = 1
+8:9/0 = 0
+8:9/0/z_index = 1
+9:9/0 = 0
+10:9/0 = 0
+10:9/0/z_index = 1
+11:9/0 = 0
+12:9/0 = 0
+12:9/0/z_index = 1
+13:9/0 = 0
+13:9/0/z_index = 1
+14:9/0 = 0
+14:9/0/z_index = 1
+15:9/0 = 0
+15:9/0/z_index = 1
+16:9/0 = 0
+16:9/0/z_index = 1
+0:10/0 = 0
+0:10/0/z_index = 1
+1:10/0 = 0
+1:10/0/z_index = 1
+2:10/0 = 0
+2:10/0/z_index = 1
+3:10/0 = 0
+3:10/0/z_index = 1
+4:10/0 = 0
+4:10/0/z_index = 1
+5:10/0 = 0
+5:10/0/z_index = 1
+6:10/0 = 0
+6:10/0/z_index = 1
+7:10/0 = 0
+7:10/0/z_index = 1
+8:10/0 = 0
+8:10/0/z_index = 1
+9:10/0 = 0
+9:10/0/z_index = 1
+10:10/0 = 0
+10:10/0/z_index = 1
+11:10/0 = 0
+12:10/0 = 0
+12:10/0/z_index = 1
+13:10/0 = 0
+13:10/0/z_index = 1
+0:11/0 = 0
+0:11/0/z_index = 1
+1:11/0 = 0
+1:11/0/z_index = 1
+2:11/0 = 0
+2:11/0/z_index = 1
+3:11/0 = 0
+3:11/0/z_index = 1
+4:11/0 = 0
+4:11/0/z_index = 1
+5:11/0 = 0
+5:11/0/z_index = 1
+6:11/0 = 0
+6:11/0/z_index = 1
+7:11/0 = 0
+7:11/0/z_index = 1
+8:11/0 = 0
+8:11/0/z_index = 1
+9:11/0 = 0
+9:11/0/z_index = 1
+10:11/0 = 0
+10:11/0/z_index = 1
+11:11/0 = 0
+11:11/0/z_index = 1
+12:11/0 = 0
+12:11/0/z_index = 1
+13:11/0 = 0
+13:11/0/z_index = 1
+0:12/0 = 0
+0:12/0/z_index = 1
+1:12/0 = 0
+1:12/0/z_index = 1
+2:12/0 = 0
+2:12/0/z_index = 1
+3:12/0 = 0
+3:12/0/z_index = 1
+4:12/0 = 0
+4:12/0/z_index = 1
+5:12/0 = 0
+5:12/0/z_index = 1
+6:12/0 = 0
+6:12/0/z_index = 1
+7:12/0 = 0
+7:12/0/z_index = 1
+8:12/0 = 0
+8:12/0/z_index = 1
+9:12/0 = 0
+9:12/0/z_index = 1
+10:12/0 = 0
+10:12/0/z_index = 1
+11:12/0 = 0
+11:12/0/z_index = 1
+12:12/0 = 0
+12:12/0/z_index = 1
+13:12/0 = 0
+13:12/0/z_index = 1
+0:13/0 = 0
+0:13/0/z_index = 1
+1:13/0 = 0
+1:13/0/z_index = 1
+2:13/0 = 0
+2:13/0/z_index = 1
+3:13/0 = 0
+3:13/0/z_index = 1
+4:13/0 = 0
+4:13/0/z_index = 1
+5:13/0 = 0
+5:13/0/z_index = 1
+6:13/0 = 0
+6:13/0/z_index = 1
+7:13/0 = 0
+7:13/0/z_index = 1
+8:13/0 = 0
+8:13/0/z_index = 1
+0:14/0 = 0
+0:14/0/z_index = 1
+1:14/0 = 0
+1:14/0/z_index = 1
+2:14/0 = 0
+2:14/0/z_index = 1
+3:14/0 = 0
+3:14/0/z_index = 1
+4:14/0 = 0
+4:14/0/z_index = 1
+6:14/0 = 0
+6:14/0/z_index = 1
+7:14/0 = 0
+7:14/0/z_index = 1
+0:15/0 = 0
+1:15/0 = 0
+1:15/0/z_index = 1
+2:15/0 = 0
+2:15/0/z_index = 1
+3:15/0 = 0
+3:15/0/z_index = 1
+4:15/0 = 0
+4:15/0/z_index = 1
+6:15/0 = 0
+6:15/0/z_index = 1
+7:15/0 = 0
+7:15/0/z_index = 1
+0:16/0 = 0
+0:16/0/z_index = 1
+1:16/0 = 0
+1:16/0/z_index = 1
+2:16/0 = 0
+2:16/0/z_index = 1
+3:16/0 = 0
+3:16/0/z_index = 1
+4:16/0 = 0
+4:16/0/z_index = 1
+2:17/0 = 0
+2:17/0/z_index = 1
+3:17/0 = 0
+3:17/0/z_index = 1
+10:1/size_in_atlas = Vector2i(3, 3)
+10:1/0 = 0
+13:1/size_in_atlas = Vector2i(3, 3)
+13:1/0 = 0
+16:4/size_in_atlas = Vector2i(1, 3)
+16:4/0 = 0
+15:4/size_in_atlas = Vector2i(1, 3)
+15:4/0 = 0
+17:4/size_in_atlas = Vector2i(1, 3)
+17:4/0 = 0
+18:4/size_in_atlas = Vector2i(1, 3)
+18:4/0 = 0
+
+[sub_resource type="TileSet" id="TileSet_5bd38"]
+physics_layer_0/collision_layer = 1
+navigation_layer_0/layers = 1
+sources/0 = SubResource("TileSetAtlasSource_q4fiy")
+
+[node name="HouseTemplate" type="Node2D"]
+
+[node name="TileMapLayer" type="TileMapLayer" parent="."]
+rotation = -0.000322629
+tile_map_data = PackedByteArray("AAAIAAIAAAACAAEAAAAIAAMAAAACAAEAAAAIAAQAAAACAAEAAAAIAAUAAAACAAEAAAAIAAYAAAACAAEAAAAIAAcAAAACAAEAAAAIAAgAAAACAAEAAAAIAAkAAAACAAEAAAAJAAoAAAACAAEAAAAJAAsAAAACAAEAAAAJAAwAAAACAAEAAAAKAA0AAAACAAEAAAALAA4AAAACAAEAAAAMAA8AAAACAAEAAAANAA8AAAACAAEAAAANABAAAAACAAEAAAAOABAAAAACAAEAAAAPABAAAAACAAEAAAAQABAAAAACAAEAAAARABAAAAACAAEAAAASABAAAAACAAEAAAATABAAAAACAAEAAAAUABAAAAACAAEAAAAVABAAAAACAAEAAAAWABAAAAACAAEAAAAWAA8AAAACAAEAAAAWAAwAAAACAAEAAAAWAAsAAAACAAEAAAAVAAoAAAACAAEAAAAUAAoAAAACAAEAAAATAAkAAAACAAEAAAASAAkAAAACAAEAAAARAAgAAAACAAEAAAAQAAgAAAACAAEAAAAPAAgAAAACAAEAAAAOAAgAAAACAAEAAAANAAcAAAACAAEAAAAMAAcAAAACAAEAAAALAAcAAAACAAEAAAAKAAcAAAACAAEAAAAJAAcAAAACAAEAAAAHAAkAAAACAAEAAAAHAAoAAAACAAEAAAAHAAsAAAACAAEAAAAHAAwAAAACAAEAAAAHAA0AAAACAAEAAAAHAA4AAAACAAEAAAAHAA8AAAACAAEAAAAIABAAAAACAAEAAAAJABAAAAACAAEAAAAKABEAAAACAAEAAAALABIAAAACAAEAAAAMABMAAAACAAEAAAANABMAAAACAAEAAAAOABMAAAACAAEAAAAPABMAAAACAAEAAAAQABQAAAACAAEAAAARABQAAAACAAEAAAASABQAAAACAAEAAAATABQAAAACAAEAAAAUABQAAAACAAEAAAAVABQAAAACAAEAAAAWABQAAAACAAEAAAAVAAwAAAACAAEAAAAUAA0AAAACAAEAAAAUAA4AAAACAAEAAAATAA8AAAACAAEAAAATABEAAAACAAEAAAATABIAAAACAAEAAAAUABMAAAACAAEAAAAWABUAAAACAAEAAAAAAAAAAAACAAEAAAAAAAEAAAACAAEAAAAAAAIAAAACAAEAAAAAAAMAAAACAAEAAAAAAAQAAAACAAEAAAAAAAUAAAACAAEAAAAAAAYAAAACAAEAAAAAAAcAAAACAAEAAAAAAAgAAAACAAEAAAAAAAkAAAACAAEAAAAAAAoAAAACAAEAAAAAAAsAAAACAAEAAAAAAAwAAAACAAEAAAAAAA0AAAACAAEAAAAAAA4AAAACAAEAAAAAAA8AAAACAAEAAAAAABAAAAACAAEAAAAAABEAAAACAAEAAAAAABIAAAACAAEAAAAAABMAAAACAAEAAAAAABQAAAACAAEAAAAAABUAAAACAAEAAAAAABYAAAACAAEAAAAAABcAAAACAAEAAAAAABgAAAACAAEAAAAAABkAAAACAAEAAAAAABoAAAACAAEAAAAAABsAAAACAAEAAAAAABwAAAACAAEAAAAAAB0AAAACAAEAAAAAAB4AAAACAAEAAAAAAB8AAAACAAEAAAAAACAAAAACAAEAAAAAACEAAAACAAEAAAAAACIAAAACAAEAAAAAACMAAAACAAEAAAAAACQAAAACAAEAAAAAACUAAAACAAEAAAAAACYAAAACAAEAAAAAACcAAAACAAEAAAAAACgAAAACAAEAAAABAAAAAAACAAEAAAABAAEAAAACAAEAAAABAAIAAAACAAEAAAABAAMAAAACAAEAAAABAAQAAAACAAEAAAABAAUAAAACAAEAAAABAAYAAAACAAEAAAABAAcAAAACAAEAAAABAAgAAAACAAEAAAABAAkAAAACAAEAAAABAAoAAAACAAEAAAABAAsAAAACAAEAAAABAAwAAAACAAEAAAABAA0AAAACAAEAAAABAA4AAAACAAEAAAABAA8AAAACAAEAAAABABAAAAACAAEAAAABABEAAAACAAEAAAABABIAAAACAAEAAAABABMAAAACAAEAAAABABQAAAACAAEAAAABABUAAAACAAEAAAABABYAAAACAAEAAAABABcAAAACAAEAAAABABgAAAACAAEAAAABABkAAAACAAEAAAABABoAAAACAAEAAAABABsAAAACAAEAAAABABwAAAACAAEAAAABAB0AAAACAAEAAAABAB4AAAACAAEAAAABAB8AAAACAAEAAAABACAAAAACAAEAAAABACEAAAACAAEAAAABACIAAAACAAEAAAABACMAAAACAAEAAAABACQAAAACAAEAAAABACUAAAACAAEAAAABACYAAAACAAEAAAABACcAAAACAAEAAAABACgAAAACAAEAAAACAAAAAAACAAEAAAACAAEAAAACAAEAAAACAAIAAAACAAEAAAACAAMAAAACAAEAAAACAAQAAAACAAEAAAACAAUAAAACAAEAAAACAAYAAAACAAEAAAACAAcAAAACAAEAAAACAAgAAAACAAEAAAACAAkAAAACAAEAAAACAAoAAAACAAEAAAACAAsAAAACAAEAAAACAAwAAAACAAEAAAACAA0AAAACAAEAAAACAA4AAAACAAEAAAACAA8AAAACAAEAAAACABAAAAACAAEAAAACABEAAAACAAEAAAACABIAAAACAAEAAAACABMAAAACAAEAAAACABQAAAACAAEAAAACABUAAAACAAEAAAACABYAAAACAAEAAAACABcAAAACAAEAAAACABgAAAACAAEAAAACABkAAAACAAEAAAACABoAAAACAAEAAAACABsAAAACAAEAAAACABwAAAACAAEAAAACAB0AAAACAAEAAAACAB4AAAACAAEAAAACAB8AAAACAAEAAAACACAAAAACAAEAAAACACEAAAACAAEAAAACACIAAAACAAEAAAACACMAAAACAAEAAAACACQAAAACAAEAAAACACUAAAACAAEAAAACACYAAAACAAEAAAACACcAAAACAAEAAAACACgAAAACAAEAAAADAAAAAAACAAEAAAADAAEAAAACAAEAAAADAAIAAAACAAEAAAADAAMAAAACAAEAAAADAAQAAAACAAEAAAADAAUAAAACAAEAAAADAAYAAAACAAEAAAADAAcAAAACAAEAAAADAAgAAAACAAEAAAADAAkAAAACAAEAAAADAAoAAAACAAEAAAADAAsAAAACAAEAAAADAAwAAAACAAEAAAADAA0AAAACAAEAAAADAA4AAAACAAEAAAADAA8AAAACAAEAAAADABAAAAACAAEAAAADABEAAAACAAEAAAADABIAAAACAAEAAAADABMAAAACAAEAAAADABQAAAACAAEAAAADABUAAAACAAEAAAADABYAAAACAAEAAAADABcAAAACAAEAAAADABgAAAACAAEAAAADABkAAAACAAEAAAADABoAAAACAAEAAAADABsAAAACAAEAAAADABwAAAACAAEAAAADAB0AAAACAAEAAAADAB4AAAACAAEAAAADAB8AAAACAAEAAAADACAAAAACAAEAAAADACEAAAACAAEAAAADACIAAAACAAEAAAADACMAAAACAAEAAAADACQAAAACAAEAAAADACUAAAACAAEAAAADACYAAAACAAEAAAADACcAAAACAAEAAAADACgAAAACAAEAAAAEAAAAAAACAAEAAAAEAAEAAAACAAEAAAAEAAIAAAACAAEAAAAEAAMAAAACAAEAAAAEAAQAAAACAAEAAAAEAAUAAAACAAEAAAAEAAYAAAACAAEAAAAEAAcAAAACAAEAAAAEAAgAAAACAAEAAAAEAAkAAAACAAEAAAAEAAoAAAACAAEAAAAEAAsAAAACAAEAAAAEAAwAAAACAAEAAAAEAA0AAAACAAEAAAAEAA4AAAACAAEAAAAEAA8AAAACAAEAAAAEABAAAAACAAEAAAAEABEAAAACAAEAAAAEABIAAAACAAEAAAAEABMAAAACAAEAAAAEABQAAAACAAEAAAAEABUAAAACAAEAAAAEABYAAAACAAEAAAAEABcAAAACAAEAAAAEABgAAAACAAEAAAAEABkAAAACAAEAAAAEABoAAAACAAEAAAAEABsAAAACAAEAAAAEABwAAAACAAEAAAAEAB0AAAACAAEAAAAEAB4AAAACAAEAAAAEAB8AAAACAAEAAAAEACAAAAACAAEAAAAEACEAAAACAAEAAAAEACIAAAACAAEAAAAEACMAAAACAAEAAAAEACQAAAACAAEAAAAEACUAAAACAAEAAAAEACYAAAACAAEAAAAEACcAAAACAAEAAAAEACgAAAACAAEAAAAFAAAAAAACAAEAAAAFAAEAAAACAAEAAAAFAAIAAAACAAEAAAAFAAMAAAACAAEAAAAFAAQAAAACAAEAAAAFAAUAAAACAAEAAAAFAAYAAAACAAEAAAAFAAcAAAACAAEAAAAFAAgAAAACAAEAAAAFAAkAAAACAAEAAAAFAAoAAAACAAEAAAAFAAsAAAACAAEAAAAFAAwAAAACAAEAAAAFAA0AAAACAAEAAAAFAA4AAAACAAEAAAAFAA8AAAACAAEAAAAFABAAAAACAAEAAAAFABEAAAACAAEAAAAFABIAAAACAAEAAAAFABMAAAACAAEAAAAFABQAAAACAAEAAAAFABUAAAACAAEAAAAFABYAAAACAAEAAAAFABcAAAACAAEAAAAFABgAAAACAAEAAAAFABkAAAACAAEAAAAFABoAAAACAAEAAAAFABsAAAACAAEAAAAFABwAAAACAAEAAAAFAB0AAAACAAEAAAAFAB4AAAACAAEAAAAFAB8AAAACAAEAAAAFACAAAAACAAEAAAAFACEAAAACAAEAAAAFACIAAAACAAEAAAAFACMAAAACAAEAAAAFACQAAAACAAEAAAAFACUAAAACAAEAAAAFACYAAAACAAEAAAAFACcAAAACAAEAAAAFACgAAAACAAEAAAAGAAAAAAACAAEAAAAGAAEAAAACAAEAAAAGAAIAAAACAAEAAAAGAAMAAAACAAEAAAAGAAQAAAACAAEAAAAGAAUAAAACAAEAAAAGAAYAAAACAAEAAAAGAAcAAAACAAEAAAAGAAgAAAACAAEAAAAGAAkAAAACAAEAAAAGAAoAAAACAAEAAAAGAAsAAAACAAEAAAAGAAwAAAACAAEAAAAGAA0AAAACAAEAAAAGAA4AAAACAAEAAAAGAA8AAAACAAEAAAAGABAAAAACAAEAAAAGABEAAAACAAEAAAAGABIAAAACAAEAAAAGABMAAAACAAEAAAAGABQAAAACAAEAAAAGABUAAAACAAEAAAAGABYAAAACAAEAAAAGABcAAAACAAEAAAAGABgAAAACAAEAAAAGABkAAAACAAEAAAAGABoAAAACAAEAAAAGABsAAAACAAEAAAAGABwAAAACAAEAAAAGAB0AAAACAAEAAAAGAB4AAAACAAEAAAAGAB8AAAACAAEAAAAGACAAAAACAAEAAAAGACEAAAACAAEAAAAGACIAAAACAAEAAAAGACMAAAACAAEAAAAGACQAAAACAAEAAAAGACUAAAACAAEAAAAGACYAAAACAAEAAAAGACcAAAACAAEAAAAGACgAAAACAAEAAAAHAAAAAAACAAEAAAAHAAEAAAACAAEAAAAHAAIAAAACAAEAAAAHAAMAAAACAAEAAAAHAAQAAAACAAEAAAAHAAUAAAACAAEAAAAHAAYAAAACAAEAAAAHAAcAAAACAAEAAAAHAAgAAAACAAEAAAAHABAAAAACAAEAAAAHABEAAAACAAEAAAAHABIAAAACAAEAAAAHABMAAAACAAEAAAAHABQAAAACAAEAAAAHABUAAAACAAEAAAAHABYAAAACAAEAAAAHABcAAAACAAEAAAAHABgAAAACAAEAAAAHABkAAAACAAEAAAAHABoAAAACAAEAAAAHABsAAAACAAEAAAAHABwAAAACAAEAAAAHAB0AAAACAAEAAAAHAB4AAAACAAEAAAAHAB8AAAACAAEAAAAHACAAAAACAAEAAAAHACEAAAACAAEAAAAHACIAAAACAAEAAAAHACMAAAACAAEAAAAHACQAAAACAAEAAAAHACUAAAACAAEAAAAHACYAAAACAAEAAAAHACcAAAACAAEAAAAHACgAAAACAAEAAAAIAAAAAAACAAEAAAAIAAEAAAACAAEAAAAIAAoAAAACAAEAAAAIAAsAAAACAAEAAAAIAAwAAAACAAEAAAAIAA0AAAACAAEAAAAIAA4AAAACAAEAAAAIAA8AAAACAAEAAAAIABEAAAACAAEAAAAIABIAAAACAAEAAAAIABMAAAACAAEAAAAIABQAAAACAAEAAAAIABUAAAACAAEAAAAIABYAAAACAAEAAAAIABcAAAACAAEAAAAIABgAAAACAAEAAAAIABkAAAACAAEAAAAIABoAAAACAAEAAAAIABsAAAACAAEAAAAIABwAAAACAAEAAAAIAB0AAAACAAEAAAAIAB4AAAACAAEAAAAIAB8AAAACAAEAAAAIACAAAAACAAEAAAAIACEAAAACAAEAAAAIACIAAAACAAEAAAAIACMAAAACAAEAAAAIACQAAAACAAEAAAAIACUAAAACAAEAAAAIACYAAAACAAEAAAAIACcAAAACAAEAAAAIACgAAAACAAEAAAAJAAAAAAACAAEAAAAJAAEAAAACAAEAAAAJAAIAAAACAAEAAAAJAAMAAAACAAEAAAAJAAQAAAACAAEAAAAJAAUAAAACAAEAAAAJAAYAAAACAAEAAAAJAAgAAAACAAEAAAAJAAkAAAACAAEAAAAJAA0AAAACAAEAAAAJAA4AAAACAAEAAAAJAA8AAAACAAEAAAAJABEAAAACAAEAAAAJABIAAAACAAEAAAAJABMAAAACAAEAAAAJABQAAAACAAEAAAAJABUAAAACAAEAAAAJABYAAAACAAEAAAAJABcAAAACAAEAAAAJABgAAAACAAEAAAAJABkAAAACAAEAAAAJABoAAAACAAEAAAAJABsAAAACAAEAAAAJABwAAAACAAEAAAAJAB0AAAACAAEAAAAJAB4AAAACAAEAAAAJAB8AAAACAAEAAAAJACAAAAACAAEAAAAJACEAAAACAAEAAAAJACIAAAACAAEAAAAJACMAAAACAAEAAAAJACQAAAACAAEAAAAJACUAAAACAAEAAAAJACYAAAACAAEAAAAJACcAAAACAAEAAAAJACgAAAACAAEAAAAKAAAAAAACAAEAAAAKAAEAAAACAAEAAAAKAAIAAAACAAEAAAAKAAMAAAACAAEAAAAKAAQAAAACAAEAAAAKAAUAAAACAAEAAAAKAAYAAAACAAEAAAAKAAgAAAACAAEAAAAKAAkAAAACAAEAAAAKAAoAAAACAAEAAAAKAAsAAAACAAEAAAAKAAwAAAACAAEAAAAKAA4AAAACAAEAAAAKAA8AAAACAAEAAAAKABAAAAACAAEAAAAKABIAAAACAAEAAAAKABMAAAACAAEAAAAKABQAAAACAAEAAAAKABUAAAACAAEAAAAKABYAAAACAAEAAAAKABcAAAACAAEAAAAKABgAAAACAAEAAAAKABkAAAACAAEAAAAKABoAAAACAAEAAAAKABsAAAACAAEAAAAKABwAAAACAAEAAAAKAB0AAAACAAEAAAAKAB4AAAACAAEAAAAKAB8AAAACAAEAAAAKACAAAAACAAEAAAAKACEAAAACAAEAAAAKACIAAAACAAEAAAAKACMAAAACAAEAAAAKACQAAAACAAEAAAAKACUAAAACAAEAAAAKACYAAAACAAEAAAAKACcAAAACAAEAAAAKACgAAAACAAEAAAALAAAAAAACAAEAAAALAAEAAAACAAEAAAALAAIAAAACAAEAAAALAAMAAAACAAEAAAALAAQAAAACAAEAAAALAAUAAAACAAEAAAALAAYAAAACAAEAAAALAAgAAAACAAEAAAALAAkAAAACAAEAAAALAAoAAAACAAEAAAALAAsAAAACAAEAAAALAAwAAAACAAEAAAALAA0AAAACAAEAAAALAA8AAAACAAEAAAALABAAAAACAAEAAAALABEAAAACAAEAAAALABMAAAACAAEAAAALABQAAAACAAEAAAALABUAAAACAAEAAAALABYAAAACAAEAAAALABcAAAACAAEAAAALABgAAAACAAEAAAALABkAAAACAAEAAAALABoAAAACAAEAAAALABsAAAACAAEAAAALABwAAAACAAEAAAALAB0AAAACAAEAAAALAB4AAAACAAEAAAALAB8AAAACAAEAAAALACAAAAACAAEAAAALACEAAAACAAEAAAALACIAAAACAAEAAAALACMAAAACAAEAAAALACQAAAACAAEAAAALACUAAAACAAEAAAALACYAAAACAAEAAAALACcAAAACAAEAAAALACgAAAACAAEAAAAMAAAAAAACAAEAAAAMAAEAAAACAAEAAAAMAAIAAAACAAEAAAAMAAMAAAACAAEAAAAMAAQAAAACAAEAAAAMAAUAAAACAAEAAAAMAAYAAAACAAEAAAAMAAgAAAACAAEAAAAMAAkAAAACAAEAAAAMAAoAAAACAAEAAAAMAAsAAAACAAEAAAAMAAwAAAACAAEAAAAMAA0AAAACAAEAAAAMAA4AAAACAAEAAAAMABAAAAACAAEAAAAMABEAAAACAAEAAAAMABIAAAACAAEAAAAMABQAAAACAAEAAAAMABUAAAACAAEAAAAMABYAAAACAAEAAAAMABcAAAACAAEAAAAMABgAAAACAAEAAAAMABkAAAACAAEAAAAMABoAAAACAAEAAAAMABsAAAACAAEAAAAMABwAAAACAAEAAAAMAB0AAAACAAEAAAAMAB4AAAACAAEAAAAMAB8AAAACAAEAAAAMACAAAAACAAEAAAAMACEAAAACAAEAAAAMACIAAAACAAEAAAAMACMAAAACAAEAAAAMACQAAAACAAEAAAAMACUAAAACAAEAAAAMACYAAAACAAEAAAAMACcAAAACAAEAAAAMACgAAAACAAEAAAANAAAAAAACAAEAAAANAAEAAAACAAEAAAANAAIAAAACAAEAAAANAAMAAAACAAEAAAANAAQAAAACAAEAAAANAAUAAAACAAEAAAANAAYAAAACAAEAAAANAAgAAAACAAEAAAANAAkAAAACAAEAAAANAAoAAAACAAEAAAANAAsAAAACAAEAAAANAAwAAAACAAEAAAANAA0AAAACAAEAAAANAA4AAAACAAEAAAANABEAAAACAAEAAAANABIAAAACAAEAAAANABQAAAACAAEAAAANABUAAAACAAEAAAANABYAAAACAAEAAAANABcAAAACAAEAAAANABgAAAACAAEAAAANABkAAAACAAEAAAANABoAAAACAAEAAAANABsAAAACAAEAAAANABwAAAACAAEAAAANAB0AAAACAAEAAAANAB4AAAACAAEAAAANAB8AAAACAAEAAAANACAAAAACAAEAAAANACEAAAACAAEAAAANACIAAAACAAEAAAANACMAAAACAAEAAAANACQAAAACAAEAAAANACUAAAACAAEAAAANACYAAAACAAEAAAANACcAAAACAAEAAAANACgAAAACAAEAAAAOAAAAAAACAAEAAAAOAAEAAAACAAEAAAAOAAIAAAACAAEAAAAOAAMAAAACAAEAAAAOAAQAAAACAAEAAAAOAAUAAAACAAEAAAAOAAYAAAACAAEAAAAOAAcAAAACAAEAAAAOAAkAAAACAAEAAAAOAAoAAAACAAEAAAAOAAsAAAACAAEAAAAOAAwAAAACAAEAAAAOAA0AAAACAAEAAAAOAA4AAAACAAEAAAAOAA8AAAACAAEAAAAOABEAAAACAAEAAAAOABIAAAACAAEAAAAOABQAAAACAAEAAAAOABUAAAACAAEAAAAOABYAAAACAAEAAAAOABcAAAACAAEAAAAOABgAAAACAAEAAAAOABkAAAACAAEAAAAOABoAAAACAAEAAAAOABsAAAACAAEAAAAOABwAAAACAAEAAAAOAB0AAAACAAEAAAAOAB4AAAACAAEAAAAOAB8AAAACAAEAAAAOACAAAAACAAEAAAAOACEAAAACAAEAAAAOACIAAAACAAEAAAAOACMAAAACAAEAAAAOACQAAAACAAEAAAAOACUAAAACAAEAAAAOACYAAAACAAEAAAAOACcAAAACAAEAAAAOACgAAAACAAEAAAAPAAAAAAACAAEAAAAPAAEAAAACAAEAAAAPAAIAAAACAAEAAAAPAAMAAAACAAEAAAAPAAQAAAACAAEAAAAPAAUAAAACAAEAAAAPAAYAAAACAAEAAAAPAAcAAAACAAEAAAAPAAkAAAACAAEAAAAPAAoAAAACAAEAAAAPAAsAAAACAAEAAAAPAAwAAAACAAEAAAAPAA0AAAACAAEAAAAPAA4AAAACAAEAAAAPAA8AAAACAAEAAAAPABEAAAACAAEAAAAPABIAAAACAAEAAAAPABQAAAACAAEAAAAPABUAAAACAAEAAAAPABYAAAACAAEAAAAPABcAAAACAAEAAAAPABgAAAACAAEAAAAPABkAAAACAAEAAAAPABoAAAACAAEAAAAPABsAAAACAAEAAAAPABwAAAACAAEAAAAPAB0AAAACAAEAAAAPAB4AAAACAAEAAAAPAB8AAAACAAEAAAAPACAAAAACAAEAAAAPACEAAAACAAEAAAAPACIAAAACAAEAAAAPACMAAAACAAEAAAAPACQAAAACAAEAAAAPACUAAAACAAEAAAAPACYAAAACAAEAAAAPACcAAAACAAEAAAAPACgAAAACAAEAAAAQAAAAAAACAAEAAAAQAAEAAAACAAEAAAAQAAIAAAACAAEAAAAQAAMAAAACAAEAAAAQAAQAAAACAAEAAAAQAAUAAAACAAEAAAAQAAYAAAACAAEAAAAQAAcAAAACAAEAAAAQAAkAAAACAAEAAAAQAAoAAAACAAEAAAAQAAsAAAACAAEAAAAQAAwAAAACAAEAAAAQAA0AAAACAAEAAAAQAA4AAAACAAEAAAAQAA8AAAACAAEAAAAQABEAAAACAAEAAAAQABIAAAACAAEAAAAQABMAAAACAAEAAAAQABUAAAACAAEAAAAQABYAAAACAAEAAAAQABcAAAACAAEAAAAQABgAAAACAAEAAAAQABkAAAACAAEAAAAQABoAAAACAAEAAAAQABsAAAACAAEAAAAQABwAAAACAAEAAAAQAB0AAAACAAEAAAAQAB4AAAACAAEAAAAQAB8AAAACAAEAAAAQACAAAAACAAEAAAAQACEAAAACAAEAAAAQACIAAAACAAEAAAAQACMAAAACAAEAAAAQACQAAAACAAEAAAAQACUAAAACAAEAAAAQACYAAAACAAEAAAAQACcAAAACAAEAAAAQACgAAAACAAEAAAARAAAAAAACAAEAAAARAAEAAAACAAEAAAARAAIAAAACAAEAAAARAAMAAAACAAEAAAARAAQAAAACAAEAAAARAAUAAAACAAEAAAARAAYAAAACAAEAAAARAAcAAAACAAEAAAARAAkAAAACAAEAAAARAAoAAAACAAEAAAARAAsAAAACAAEAAAARAAwAAAACAAEAAAARAA0AAAACAAEAAAARAA4AAAACAAEAAAARAA8AAAACAAEAAAARABEAAAACAAEAAAARABIAAAACAAEAAAARABMAAAACAAEAAAARABUAAAACAAEAAAARABYAAAACAAEAAAARABcAAAACAAEAAAARABgAAAACAAEAAAARABkAAAACAAEAAAARABoAAAACAAEAAAARABsAAAACAAEAAAARABwAAAACAAEAAAARAB0AAAACAAEAAAARAB4AAAACAAEAAAARAB8AAAACAAEAAAARACAAAAACAAEAAAARACEAAAACAAEAAAARACIAAAACAAEAAAARACMAAAACAAEAAAARACQAAAACAAEAAAARACUAAAACAAEAAAARACYAAAACAAEAAAARACcAAAACAAEAAAARACgAAAACAAEAAAASAAAAAAACAAEAAAASAAEAAAACAAEAAAASAAIAAAACAAEAAAASAAMAAAACAAEAAAASAAQAAAACAAEAAAASAAUAAAACAAEAAAASAAYAAAACAAEAAAASAAcAAAACAAEAAAASAAgAAAACAAEAAAASAAoAAAACAAEAAAASAAsAAAACAAEAAAASAAwAAAACAAEAAAASAA0AAAACAAEAAAASAA4AAAACAAEAAAASAA8AAAACAAEAAAASABEAAAACAAEAAAASABIAAAACAAEAAAASABMAAAACAAEAAAASABUAAAACAAEAAAASABYAAAACAAEAAAASABcAAAACAAEAAAASABgAAAACAAEAAAASABkAAAACAAEAAAASABoAAAACAAEAAAASABsAAAACAAEAAAASABwAAAACAAEAAAASAB0AAAACAAEAAAASAB4AAAACAAEAAAASAB8AAAACAAEAAAASACAAAAACAAEAAAASACEAAAACAAEAAAASACIAAAACAAEAAAASACMAAAACAAEAAAASACQAAAACAAEAAAASACUAAAACAAEAAAASACYAAAACAAEAAAASACcAAAACAAEAAAASACgAAAACAAEAAAATAAAAAAACAAEAAAATAAEAAAACAAEAAAATAAIAAAACAAEAAAATAAMAAAACAAEAAAATAAQAAAACAAEAAAATAAUAAAACAAEAAAATAAYAAAACAAEAAAATAAcAAAACAAEAAAATAAgAAAACAAEAAAATAAoAAAACAAEAAAATAAsAAAACAAEAAAATAAwAAAACAAEAAAATAA0AAAACAAEAAAATAA4AAAACAAEAAAATABMAAAACAAEAAAATABUAAAACAAEAAAATABYAAAACAAEAAAATABcAAAACAAEAAAATABgAAAACAAEAAAATABkAAAACAAEAAAATABoAAAACAAEAAAATABsAAAACAAEAAAATABwAAAACAAEAAAATAB0AAAACAAEAAAATAB4AAAACAAEAAAATAB8AAAACAAEAAAATACAAAAACAAEAAAATACEAAAACAAEAAAATACIAAAACAAEAAAATACMAAAACAAEAAAATACQAAAACAAEAAAATACUAAAACAAEAAAATACYAAAACAAEAAAATACcAAAACAAEAAAATACgAAAACAAEAAAAUAAAAAAACAAEAAAAUAAEAAAACAAEAAAAUAAIAAAACAAEAAAAUAAMAAAACAAEAAAAUAAQAAAACAAEAAAAUAAUAAAACAAEAAAAUAAYAAAACAAEAAAAUAAcAAAACAAEAAAAUAAgAAAACAAEAAAAUAAkAAAACAAEAAAAUAAsAAAACAAEAAAAUAAwAAAACAAEAAAAUAA8AAAACAAEAAAAUABEAAAACAAEAAAAUABIAAAACAAEAAAAUABUAAAACAAEAAAAUABYAAAACAAEAAAAUABcAAAACAAEAAAAUABgAAAACAAEAAAAUABkAAAACAAEAAAAUABoAAAACAAEAAAAUABsAAAACAAEAAAAUABwAAAACAAEAAAAUAB0AAAACAAEAAAAUAB4AAAACAAEAAAAUAB8AAAACAAEAAAAUACAAAAACAAEAAAAUACEAAAACAAEAAAAUACIAAAACAAEAAAAUACMAAAACAAEAAAAUACQAAAACAAEAAAAUACUAAAACAAEAAAAUACYAAAACAAEAAAAUACcAAAACAAEAAAAUACgAAAACAAEAAAAVAAAAAAACAAEAAAAVAAEAAAACAAEAAAAVAAIAAAACAAEAAAAVAAMAAAACAAEAAAAVAAQAAAACAAEAAAAVAAUAAAACAAEAAAAVAAYAAAACAAEAAAAVAAcAAAACAAEAAAAVAAgAAAACAAEAAAAVAAkAAAACAAEAAAAVAAsAAAACAAEAAAAVAA0AAAACAAEAAAAVAA4AAAACAAEAAAAVAA8AAAACAAEAAAAVABEAAAACAAEAAAAVABIAAAACAAEAAAAVABMAAAACAAEAAAAVABUAAAACAAEAAAAVABYAAAACAAEAAAAVABcAAAACAAEAAAAVABgAAAACAAEAAAAVABkAAAACAAEAAAAVABoAAAACAAEAAAAVABsAAAACAAEAAAAVABwAAAACAAEAAAAVAB0AAAACAAEAAAAVAB4AAAACAAEAAAAVAB8AAAACAAEAAAAVACAAAAACAAEAAAAVACEAAAACAAEAAAAVACIAAAACAAEAAAAVACMAAAACAAEAAAAVACQAAAACAAEAAAAVACUAAAACAAEAAAAVACYAAAACAAEAAAAVACcAAAACAAEAAAAVACgAAAACAAEAAAAWAAAAAAACAAEAAAAWAAEAAAACAAEAAAAWAAIAAAACAAEAAAAWAAMAAAACAAEAAAAWAAQAAAACAAEAAAAWAAUAAAACAAEAAAAWAAYAAAACAAEAAAAWAAcAAAACAAEAAAAWAAgAAAACAAEAAAAWAAkAAAACAAEAAAAWAAoAAAACAAEAAAAWAA0AAAACAAEAAAAWAA4AAAACAAEAAAAWABEAAAACAAEAAAAWABIAAAACAAEAAAAWABMAAAACAAEAAAAWABYAAAACAAEAAAAWABcAAAACAAEAAAAWABgAAAACAAEAAAAWABkAAAACAAEAAAAWABoAAAACAAEAAAAWABsAAAACAAEAAAAWABwAAAACAAEAAAAWAB0AAAACAAEAAAAWAB4AAAACAAEAAAAWAB8AAAACAAEAAAAWACAAAAACAAEAAAAWACEAAAACAAEAAAAWACIAAAACAAEAAAAWACMAAAACAAEAAAAWACQAAAACAAEAAAAWACUAAAACAAEAAAAWACYAAAACAAEAAAAWACcAAAACAAEAAAAWACgAAAACAAEAAAAXAAAAAAACAAEAAAAXAAEAAAACAAEAAAAXAAIAAAACAAEAAAAXAAMAAAACAAEAAAAXAAQAAAACAAEAAAAXAAUAAAACAAEAAAAXABkAAAACAAEAAAAXABoAAAACAAEAAAAXABsAAAACAAEAAAAXABwAAAACAAEAAAAXAB0AAAACAAEAAAAXAB4AAAACAAEAAAAXAB8AAAACAAEAAAAXACAAAAACAAEAAAAXACEAAAACAAEAAAAXACIAAAACAAEAAAAXACMAAAACAAEAAAAXACQAAAACAAEAAAAXACUAAAACAAEAAAAXACYAAAACAAEAAAAXACcAAAACAAEAAAAXACgAAAACAAEAAAAYAAAAAAACAAEAAAAYAAEAAAACAAEAAAAYAAIAAAACAAEAAAAYAAMAAAACAAEAAAAYAAQAAAACAAEAAAAYAAUAAAACAAEAAAAYABkAAAACAAEAAAAYABoAAAACAAEAAAAYABsAAAACAAEAAAAYABwAAAACAAEAAAAYAB0AAAACAAEAAAAYAB4AAAACAAEAAAAYAB8AAAACAAEAAAAYACAAAAACAAEAAAAYACEAAAACAAEAAAAYACIAAAACAAEAAAAYACMAAAACAAEAAAAYACQAAAACAAEAAAAYACUAAAACAAEAAAAYACYAAAACAAEAAAAYACcAAAACAAEAAAAYACgAAAACAAEAAAAZAAAAAAACAAEAAAAZAAEAAAACAAEAAAAZAAIAAAACAAEAAAAZAAMAAAACAAEAAAAZAAQAAAACAAEAAAAZAAUAAAACAAEAAAAZABkAAAACAAEAAAAZABoAAAACAAEAAAAZABsAAAACAAEAAAAZABwAAAACAAEAAAAZAB0AAAACAAEAAAAZAB4AAAACAAEAAAAZAB8AAAACAAEAAAAZACAAAAACAAEAAAAZACEAAAACAAEAAAAZACIAAAACAAEAAAAZACMAAAACAAEAAAAZACQAAAACAAEAAAAZACUAAAACAAEAAAAZACYAAAACAAEAAAAZACcAAAACAAEAAAAZACgAAAACAAEAAAAaAAAAAAACAAEAAAAaAAEAAAACAAEAAAAaAAIAAAACAAEAAAAaAAMAAAACAAEAAAAaAAQAAAACAAEAAAAaAAUAAAACAAEAAAAaABkAAAACAAEAAAAaABoAAAACAAEAAAAaABsAAAACAAEAAAAaABwAAAACAAEAAAAaAB0AAAACAAEAAAAaAB4AAAACAAEAAAAaAB8AAAACAAEAAAAaACAAAAACAAEAAAAaACEAAAACAAEAAAAaACIAAAACAAEAAAAaACMAAAACAAEAAAAaACQAAAACAAEAAAAaACUAAAACAAEAAAAaACYAAAACAAEAAAAaACcAAAACAAEAAAAaACgAAAACAAEAAAAbAAAAAAACAAEAAAAbAAEAAAACAAEAAAAbAAIAAAACAAEAAAAbAAMAAAACAAEAAAAbAAQAAAACAAEAAAAbAAUAAAACAAEAAAAbABkAAAACAAEAAAAbABoAAAACAAEAAAAbABsAAAACAAEAAAAbABwAAAACAAEAAAAbAB0AAAACAAEAAAAbAB4AAAACAAEAAAAbAB8AAAACAAEAAAAbACAAAAACAAEAAAAbACEAAAACAAEAAAAbACIAAAACAAEAAAAbACMAAAACAAEAAAAbACQAAAACAAEAAAAbACUAAAACAAEAAAAbACYAAAACAAEAAAAbACcAAAACAAEAAAAbACgAAAACAAEAAAAcAAAAAAACAAEAAAAcAAEAAAACAAEAAAAcAAIAAAACAAEAAAAcAAMAAAACAAEAAAAcAAQAAAACAAEAAAAcAAUAAAACAAEAAAAcABkAAAABAAEAAAAcABoAAAABAAEAAAAcABsAAAABAAEAAAAcABwAAAABAAIAAAAcAB0AAAACAAEAAAAcAB4AAAACAAEAAAAcAB8AAAACAAEAAAAcACAAAAACAAEAAAAcACEAAAACAAEAAAAcACIAAAACAAEAAAAcACMAAAACAAEAAAAcACQAAAACAAEAAAAcACUAAAACAAEAAAAcACYAAAACAAEAAAAcACcAAAACAAEAAAAcACgAAAACAAEAAAAdAAAAAAACAAEAAAAdAAEAAAACAAEAAAAdAAIAAAACAAEAAAAdAAMAAAACAAEAAAAdAAQAAAACAAEAAAAdAAUAAAACAAEAAAAdABkAAAAAAAIAAAAdABoAAAAAAAIAAAAdABsAAAAAAAIAAAAdABwAAAACAAIAAAAdAB0AAAACAAEAAAAdAB4AAAACAAEAAAAdAB8AAAACAAEAAAAdACAAAAACAAEAAAAdACEAAAACAAEAAAAdACIAAAACAAEAAAAdACMAAAACAAEAAAAdACQAAAACAAEAAAAdACUAAAACAAEAAAAdACYAAAACAAEAAAAdACcAAAACAAEAAAAdACgAAAACAAEAAAAeAAAAAAACAAEAAAAeAAEAAAACAAEAAAAeAAIAAAACAAEAAAAeAAMAAAACAAEAAAAeAAQAAAACAAEAAAAeAAUAAAACAAEAAAAeABkAAAAAAAIAAAAeABoAAAAAAAIAAAAeABsAAAAAAAIAAAAeABwAAAACAAIAAAAeAB0AAAACAAEAAAAeAB4AAAACAAEAAAAeAB8AAAACAAEAAAAeACAAAAACAAEAAAAeACEAAAACAAEAAAAeACIAAAACAAEAAAAeACMAAAACAAEAAAAeACQAAAACAAEAAAAeACUAAAACAAEAAAAeACYAAAACAAEAAAAeACcAAAACAAEAAAAeACgAAAACAAEAAAAfAAAAAAACAAEAAAAfAAEAAAACAAEAAAAfAAIAAAACAAEAAAAfAAMAAAACAAEAAAAfAAQAAAACAAEAAAAfAAUAAAACAAEAAAAfABkAAAAAAAIAAAAfABoAAAAAAAIAAAAfABsAAAAAAAIAAAAfABwAAAACAAIAAAAfAB0AAAACAAEAAAAfAB4AAAACAAEAAAAfAB8AAAACAAEAAAAfACAAAAACAAEAAAAfACEAAAACAAEAAAAfACIAAAACAAEAAAAfACMAAAACAAEAAAAfACQAAAACAAEAAAAfACUAAAACAAEAAAAfACYAAAACAAEAAAAfACcAAAACAAEAAAAfACgAAAACAAEAAAAgAAAAAAACAAEAAAAgAAEAAAACAAEAAAAgAAIAAAACAAEAAAAgAAMAAAACAAEAAAAgAAQAAAACAAEAAAAgAAUAAAACAAEAAAAgABkAAAAAAAIAAAAgABoAAAAAAAIAAAAgABsAAAAAAAIAAAAgABwAAAACAAIAAAAgAB0AAAACAAEAAAAgAB4AAAACAAEAAAAgAB8AAAACAAEAAAAgACAAAAACAAEAAAAgACEAAAACAAEAAAAgACIAAAACAAEAAAAgACMAAAACAAEAAAAgACQAAAACAAEAAAAgACUAAAACAAEAAAAgACYAAAACAAEAAAAgACcAAAACAAEAAAAgACgAAAACAAEAAAAhAAAAAAACAAEAAAAhAAEAAAACAAEAAAAhAAIAAAACAAEAAAAhAAMAAAACAAEAAAAhAAQAAAACAAEAAAAhAAUAAAACAAEAAAAhABkAAAAAAAIAAAAhABoAAAAAAAIAAAAhABsAAAAAAAIAAAAhABwAAAACAAIAAAAhAB0AAAACAAEAAAAhAB4AAAACAAEAAAAhAB8AAAACAAEAAAAhACAAAAACAAEAAAAhACEAAAACAAEAAAAhACIAAAACAAEAAAAhACMAAAACAAEAAAAhACQAAAACAAEAAAAhACUAAAACAAEAAAAhACYAAAACAAEAAAAhACcAAAACAAEAAAAhACgAAAACAAEAAAAiAAAAAAACAAEAAAAiAAEAAAACAAEAAAAiAAIAAAACAAEAAAAiAAMAAAACAAEAAAAiAAQAAAACAAEAAAAiAAUAAAACAAEAAAAiABkAAAAAAAIAAAAiABoAAAAAAAIAAAAiABsAAAAAAAIAAAAiABwAAAACAAIAAAAiAB0AAAACAAEAAAAiAB4AAAACAAEAAAAiAB8AAAACAAEAAAAiACAAAAACAAEAAAAiACEAAAACAAEAAAAiACIAAAACAAEAAAAiACMAAAACAAEAAAAiACQAAAACAAEAAAAiACUAAAACAAEAAAAiACYAAAACAAEAAAAiACcAAAACAAEAAAAiACgAAAACAAEAAAAjAAAAAAACAAEAAAAjAAEAAAACAAEAAAAjAAIAAAACAAEAAAAjAAMAAAACAAEAAAAjAAQAAAACAAEAAAAjAAUAAAACAAEAAAAjABkAAAAAAAIAAAAjABoAAAAAAAIAAAAjABsAAAAAAAIAAAAjABwAAAAAAAAAAAAjAB0AAAACAAEAAAAjAB4AAAACAAEAAAAjAB8AAAACAAEAAAAjACAAAAACAAEAAAAjACEAAAACAAEAAAAjACIAAAACAAEAAAAjACMAAAACAAEAAAAjACQAAAACAAEAAAAjACUAAAACAAEAAAAjACYAAAACAAEAAAAjACcAAAACAAEAAAAjACgAAAACAAEAAAAkAAAAAAACAAEAAAAkAAEAAAACAAEAAAAkAAIAAAACAAEAAAAkAAMAAAACAAEAAAAkAAQAAAACAAEAAAAkAAUAAAACAAEAAAAkABkAAAAAAAIAAAAkABoAAAAAAAIAAAAkABsAAAAAAAIAAAAkABwAAAAAAAAAAAAkAB0AAAACAAEAAAAkAB4AAAACAAEAAAAkAB8AAAACAAEAAAAkACAAAAACAAEAAAAkACEAAAACAAEAAAAkACIAAAACAAEAAAAkACMAAAACAAEAAAAkACQAAAACAAEAAAAkACUAAAACAAEAAAAkACYAAAACAAEAAAAkACcAAAACAAEAAAAkACgAAAACAAEAAAAlAAAAAAACAAEAAAAlAAEAAAACAAEAAAAlAAIAAAACAAEAAAAlAAMAAAACAAEAAAAlAAQAAAACAAEAAAAlAAUAAAACAAEAAAAlABkAAAAAAAIAAAAlABoAAAAAAAIAAAAlABsAAAAAAAIAAAAlABwAAAAAAAAAAAAlAB0AAAACAAEAAAAlAB4AAAACAAEAAAAlAB8AAAACAAEAAAAlACAAAAACAAEAAAAlACEAAAACAAEAAAAlACIAAAACAAEAAAAlACMAAAACAAEAAAAlACQAAAACAAEAAAAlACUAAAACAAEAAAAlACYAAAACAAEAAAAlACcAAAACAAEAAAAlACgAAAACAAEAAAAmAAAAAAACAAEAAAAmAAEAAAACAAEAAAAmAAIAAAACAAEAAAAmAAMAAAACAAEAAAAmAAQAAAACAAEAAAAmAAUAAAACAAEAAAAmABkAAAAAAAIAAAAmABoAAAAAAAIAAAAmABsAAAAAAAIAAAAmABwAAAACAAIAAAAmAB0AAAACAAEAAAAmAB4AAAACAAEAAAAmAB8AAAACAAEAAAAmACAAAAACAAEAAAAmACEAAAACAAEAAAAmACIAAAACAAEAAAAmACMAAAACAAEAAAAmACQAAAACAAEAAAAmACUAAAACAAEAAAAmACYAAAACAAEAAAAmACcAAAACAAEAAAAmACgAAAACAAEAAAAnAAAAAAACAAEAAAAnAAEAAAACAAEAAAAnAAIAAAACAAEAAAAnAAMAAAACAAEAAAAnAAQAAAACAAEAAAAnAAUAAAACAAEAAAAnABkAAAAAAAIAAAAnABoAAAAAAAIAAAAnABsAAAAAAAIAAAAnABwAAAACAAIAAAAnAB0AAAACAAEAAAAnAB4AAAACAAEAAAAnAB8AAAACAAEAAAAnACAAAAACAAEAAAAnACEAAAACAAEAAAAnACIAAAACAAEAAAAnACMAAAACAAEAAAAnACQAAAACAAEAAAAnACUAAAACAAEAAAAnACYAAAACAAEAAAAnACcAAAACAAEAAAAnACgAAAACAAEAAAAoAAAAAAACAAEAAAAoAAEAAAACAAEAAAAoAAIAAAACAAEAAAAoAAMAAAACAAEAAAAoAAQAAAACAAEAAAAoAAUAAAACAAEAAAAoABkAAAAAAAIAAAAoABoAAAAAAAIAAAAoABsAAAAAAAIAAAAoABwAAAACAAIAAAAoAB0AAAACAAEAAAAoAB4AAAACAAEAAAAoAB8AAAACAAEAAAAoACAAAAACAAEAAAAoACEAAAACAAEAAAAoACIAAAACAAEAAAAoACMAAAACAAEAAAAoACQAAAACAAEAAAAoACUAAAACAAEAAAAoACYAAAACAAEAAAAoACcAAAACAAEAAAAoACgAAAACAAEAAAApAAAAAAACAAEAAAApAAEAAAACAAEAAAApAAIAAAACAAEAAAApAAMAAAACAAEAAAApAAQAAAACAAEAAAApAAUAAAACAAEAAAApABkAAAAAAAIAAAApABoAAAAAAAIAAAApABsAAAAAAAIAAAApABwAAAACAAIAAAApAB0AAAACAAEAAAApAB4AAAACAAEAAAApAB8AAAACAAEAAAApACAAAAACAAEAAAApACEAAAACAAEAAAApACIAAAACAAEAAAApACMAAAACAAEAAAApACQAAAACAAEAAAApACUAAAACAAEAAAApACYAAAACAAEAAAApACcAAAACAAEAAAApACgAAAACAAEAAAAqAAAAAAACAAEAAAAqAAEAAAACAAEAAAAqAAIAAAACAAEAAAAqAAMAAAACAAEAAAAqAAQAAAACAAEAAAAqAAUAAAACAAEAAAAqAAYAAAACAAEAAAAqAAcAAAACAAEAAAAqAAgAAAACAAEAAAAqAAkAAAACAAEAAAAqAAoAAAACAAEAAAAqAAsAAAACAAEAAAAqAAwAAAACAAMAAAAqAA0AAAACAAQAAAAqAA4AAAACAAUAAAAqAA8AAAAAAAIAAAAqABAAAAAAAAIAAAAqABEAAAAAAAIAAAAqABIAAAAAAAIAAAAqABMAAAAAAAIAAAAqABQAAAAAAAIAAAAqABUAAAAAAAIAAAAqABYAAAAAAAIAAAAqABcAAAAAAAIAAAAqABgAAAAAAAIAAAAqABkAAAAAAAIAAAAqABoAAAAAAAIAAAAqABsAAAAAAAIAAAAqABwAAAACAAIAAAAqAB0AAAACAAEAAAAqAB4AAAACAAEAAAAqAB8AAAACAAEAAAAqACAAAAACAAEAAAAqACEAAAACAAEAAAAqACIAAAACAAEAAAAqACMAAAACAAEAAAAqACQAAAACAAEAAAAqACUAAAACAAEAAAAqACYAAAACAAEAAAAqACcAAAACAAEAAAAqACgAAAACAAEAAAArAAAAAAACAAEAAAArAAEAAAACAAEAAAArAAIAAAACAAEAAAArAAMAAAACAAEAAAArAAQAAAACAAEAAAArAAUAAAACAAEAAAArAAYAAAACAAEAAAArAAcAAAACAAEAAAArAAgAAAACAAEAAAArAAkAAAACAAEAAAArAAoAAAACAAEAAAArAAsAAAACAAEAAAArAAwAAAADAAMAAAArAA0AAAADAAQAAAArAA4AAAADAAUAAAArAA8AAAAAAAIAAAArABAAAAAAAAIAAAArABEAAAAAAAIAAAArABIAAAAAAAIAAAArABMAAAAAAAIAAAArABQAAAAAAAIAAAArABYAAAAAAAIAAAArABcAAAAAAAIAAAArABgAAAAAAAIAAAArABkAAAAAAAIAAAArABoAAAAAAAIAAAArABsAAAAAAAIAAAArABwAAAACAAIAAAArAB0AAAACAAEAAAArAB4AAAACAAEAAAArAB8AAAACAAEAAAArACAAAAACAAEAAAArACEAAAACAAEAAAArACIAAAACAAEAAAArACMAAAACAAEAAAArACQAAAACAAEAAAArACUAAAACAAEAAAArACYAAAACAAEAAAArACcAAAACAAEAAAArACgAAAACAAEAAAAsAAAAAAACAAEAAAAsAAEAAAACAAEAAAAsAAIAAAACAAEAAAAsAAMAAAACAAEAAAAsAAQAAAACAAEAAAAsAAUAAAACAAEAAAAsAAYAAAACAAEAAAAsAAcAAAACAAEAAAAsAAgAAAACAAEAAAAsAAkAAAACAAEAAAAsAAoAAAACAAEAAAAsAAsAAAACAAEAAAAsAAwAAAACAAEAAAAsAA0AAAACAAEAAAAsAA4AAAADAAAAAAAsABAAAAADAAEAAAAsABEAAAADAAEAAAAsABIAAAADAAEAAAAsABMAAAADAAEAAAAsABQAAAADAAEAAAAsABUAAAADAAEAAAAsABYAAAADAAEAAAAsABcAAAADAAEAAAAsABgAAAADAAEAAAAsABkAAAADAAEAAAAsABoAAAADAAEAAAAsABsAAAADAAEAAAAsABwAAAADAAIAAAAsAB0AAAACAAEAAAAsAB4AAAACAAEAAAAsAB8AAAACAAEAAAAsACAAAAACAAEAAAAsACEAAAACAAEAAAAsACIAAAACAAEAAAAsACMAAAACAAEAAAAsACQAAAACAAEAAAAsACUAAAACAAEAAAAsACYAAAACAAEAAAAsACcAAAACAAEAAAAsACgAAAACAAEAAAAtAAAAAAACAAEAAAAtAAEAAAACAAEAAAAtAAIAAAACAAEAAAAtAAMAAAACAAEAAAAtAAQAAAACAAEAAAAtAAUAAAACAAEAAAAtAAYAAAACAAEAAAAtAAcAAAACAAEAAAAtAAgAAAACAAEAAAAtAAkAAAACAAEAAAAtAAoAAAACAAEAAAAtAAsAAAACAAEAAAAtAAwAAAACAAEAAAAtAA0AAAACAAEAAAAtAA4AAAACAAEAAAAtAA8AAAACAAEAAAAtABAAAAACAAEAAAAtABEAAAACAAEAAAAtABIAAAACAAEAAAAtABMAAAACAAEAAAAtABQAAAACAAEAAAAtABUAAAACAAEAAAAtABYAAAACAAEAAAAtABcAAAACAAEAAAAtABgAAAACAAEAAAAtABkAAAACAAEAAAAtABoAAAACAAEAAAAtABsAAAACAAEAAAAtABwAAAACAAEAAAAtAB0AAAACAAEAAAAtAB4AAAACAAEAAAAtAB8AAAACAAEAAAAtACAAAAACAAEAAAAtACEAAAACAAEAAAAtACIAAAACAAEAAAAtACMAAAACAAEAAAAtACQAAAACAAEAAAAtACUAAAACAAEAAAAtACYAAAACAAEAAAAtACcAAAACAAEAAAAtACgAAAACAAEAAAAuAAAAAAACAAEAAAAuAAEAAAACAAEAAAAuAAIAAAACAAEAAAAuAAMAAAACAAEAAAAuAAQAAAACAAEAAAAuAAUAAAACAAEAAAAuAAYAAAACAAEAAAAuAAcAAAACAAEAAAAuAAgAAAACAAEAAAAuAAkAAAACAAEAAAAuAAoAAAACAAEAAAAuAAsAAAACAAEAAAAuAAwAAAACAAEAAAAuAA0AAAACAAEAAAAuAA4AAAACAAEAAAAuAA8AAAACAAEAAAAuABAAAAACAAEAAAAuABEAAAACAAEAAAAuABIAAAACAAEAAAAuABMAAAACAAEAAAAuABQAAAACAAEAAAAuABUAAAACAAEAAAAuABYAAAACAAEAAAAuABcAAAACAAEAAAAuABgAAAACAAEAAAAuABkAAAACAAEAAAAuABoAAAACAAEAAAAuABsAAAACAAEAAAAuABwAAAACAAEAAAAuAB0AAAACAAEAAAAuAB4AAAACAAEAAAAuAB8AAAACAAEAAAAuACAAAAACAAEAAAAuACEAAAACAAEAAAAuACIAAAACAAEAAAAuACMAAAACAAEAAAAuACQAAAACAAEAAAAuACUAAAACAAEAAAAuACYAAAACAAEAAAAuACcAAAACAAEAAAAuACgAAAACAAEAAAAvAAAAAAACAAEAAAAvAAEAAAACAAEAAAAvAAIAAAACAAEAAAAvAAMAAAACAAEAAAAvAAQAAAACAAEAAAAvAAUAAAACAAEAAAAvAAYAAAACAAEAAAAvAAcAAAACAAEAAAAvAAgAAAACAAEAAAAvAAkAAAACAAEAAAAvAAoAAAACAAEAAAAvAAsAAAACAAEAAAAvAAwAAAACAAEAAAAvAA0AAAACAAEAAAAvAA4AAAACAAEAAAAvAA8AAAACAAEAAAAvABAAAAACAAEAAAAvABEAAAACAAEAAAAvABIAAAACAAEAAAAvABMAAAACAAEAAAAvABQAAAACAAEAAAAvABUAAAACAAEAAAAvABYAAAACAAEAAAAvABcAAAACAAEAAAAvABgAAAACAAEAAAAvABkAAAACAAEAAAAvABoAAAACAAEAAAAvABsAAAACAAEAAAAvABwAAAACAAEAAAAvAB0AAAACAAEAAAAvAB4AAAACAAEAAAAvAB8AAAACAAEAAAAvACAAAAACAAEAAAAvACEAAAACAAEAAAAvACIAAAACAAEAAAAvACMAAAACAAEAAAAvACQAAAACAAEAAAAvACUAAAACAAEAAAAvACYAAAACAAEAAAAvACcAAAACAAEAAAAvACgAAAACAAEAAAAwAAAAAAACAAEAAAAwAAEAAAACAAEAAAAwAAIAAAACAAEAAAAwAAMAAAACAAEAAAAwAAQAAAACAAEAAAAwAAUAAAACAAEAAAAwAAYAAAACAAEAAAAwAAcAAAACAAEAAAAwAAgAAAACAAEAAAAwAAkAAAACAAEAAAAwAAoAAAACAAEAAAAwAAsAAAACAAEAAAAwAAwAAAACAAEAAAAwAA0AAAACAAEAAAAwAA4AAAACAAEAAAAwAA8AAAACAAEAAAAwABAAAAACAAEAAAAwABEAAAACAAEAAAAwABIAAAACAAEAAAAwABMAAAACAAEAAAAwABQAAAACAAEAAAAwABUAAAACAAEAAAAwABYAAAACAAEAAAAwABcAAAACAAEAAAAwABgAAAACAAEAAAAwABkAAAACAAEAAAAwABoAAAACAAEAAAAwABsAAAACAAEAAAAwABwAAAACAAEAAAAwAB0AAAACAAEAAAAwAB4AAAACAAEAAAAwAB8AAAACAAEAAAAwACAAAAACAAEAAAAwACEAAAACAAEAAAAwACIAAAACAAEAAAAwACMAAAACAAEAAAAwACQAAAACAAEAAAAwACUAAAACAAEAAAAwACYAAAACAAEAAAAwACcAAAACAAEAAAAwACgAAAACAAEAAAAxAAAAAAACAAEAAAAxAAEAAAACAAEAAAAxAAIAAAACAAEAAAAxAAMAAAACAAEAAAAxAAQAAAACAAEAAAAxAAUAAAACAAEAAAAxAAYAAAACAAEAAAAxAAcAAAACAAEAAAAxAAgAAAACAAEAAAAxAAkAAAACAAEAAAAxAAoAAAACAAEAAAAxAAsAAAACAAEAAAAxAAwAAAACAAEAAAAxAA0AAAACAAEAAAAxAA4AAAACAAEAAAAxAA8AAAACAAEAAAAxABAAAAACAAEAAAAxABEAAAACAAEAAAAxABIAAAACAAEAAAAxABMAAAACAAEAAAAxABQAAAACAAEAAAAxABUAAAACAAEAAAAxABYAAAACAAEAAAAxABcAAAACAAEAAAAxABgAAAACAAEAAAAxABkAAAACAAEAAAAxABoAAAACAAEAAAAxABsAAAACAAEAAAAxABwAAAACAAEAAAAxAB0AAAACAAEAAAAxAB4AAAACAAEAAAAxAB8AAAACAAEAAAAxACAAAAACAAEAAAAxACEAAAACAAEAAAAxACIAAAACAAEAAAAxACMAAAACAAEAAAAxACQAAAACAAEAAAAxACUAAAACAAEAAAAxACYAAAACAAEAAAAxACcAAAACAAEAAAAxACgAAAACAAEAAAAyAAAAAAACAAEAAAAyAAEAAAACAAEAAAAyAAIAAAACAAEAAAAyAAMAAAACAAEAAAAyAAQAAAACAAEAAAAyAAUAAAACAAEAAAAyAAYAAAACAAEAAAAyAAcAAAACAAEAAAAyAAgAAAACAAEAAAAyAAkAAAACAAEAAAAyAAoAAAACAAEAAAAyAAsAAAACAAEAAAAyAAwAAAACAAEAAAAyAA0AAAACAAEAAAAyAA4AAAACAAEAAAAyAA8AAAACAAEAAAAyABAAAAACAAEAAAAyABEAAAACAAEAAAAyABIAAAACAAEAAAAyABMAAAACAAEAAAAyABQAAAACAAEAAAAyABUAAAACAAEAAAAyABYAAAACAAEAAAAyABcAAAACAAEAAAAyABgAAAACAAEAAAAyABkAAAACAAEAAAAyABoAAAACAAEAAAAyABsAAAACAAEAAAAyABwAAAACAAEAAAAyAB0AAAACAAEAAAAyAB4AAAACAAEAAAAyAB8AAAACAAEAAAAyACAAAAACAAEAAAAyACEAAAACAAEAAAAyACIAAAACAAEAAAAyACMAAAACAAEAAAAyACQAAAACAAEAAAAyACUAAAACAAEAAAAyACYAAAACAAEAAAAyACcAAAACAAEAAAAyACgAAAACAAEAAAAzAAAAAAACAAEAAAAzAAEAAAACAAEAAAAzAAIAAAACAAEAAAAzAAMAAAACAAEAAAAzAAQAAAACAAEAAAAzAAUAAAACAAEAAAAzAAYAAAACAAEAAAAzAAcAAAACAAEAAAAzAAgAAAACAAEAAAAzAAkAAAACAAEAAAAzAAoAAAACAAEAAAAzAAsAAAACAAEAAAAzAAwAAAACAAEAAAAzAA0AAAACAAEAAAAzAA4AAAACAAEAAAAzAA8AAAACAAEAAAAzABAAAAACAAEAAAAzABEAAAACAAEAAAAzABIAAAACAAEAAAAzABMAAAACAAEAAAAzABQAAAACAAEAAAAzABUAAAACAAEAAAAzABYAAAACAAEAAAAzABcAAAACAAEAAAAzABgAAAACAAEAAAAzABkAAAACAAEAAAAzABoAAAACAAEAAAAzABsAAAACAAEAAAAzABwAAAACAAEAAAAzAB0AAAACAAEAAAAzAB4AAAACAAEAAAAzAB8AAAACAAEAAAAzACAAAAACAAEAAAAzACEAAAACAAEAAAAzACIAAAACAAEAAAAzACMAAAACAAEAAAAzACQAAAACAAEAAAAzACUAAAACAAEAAAAzACYAAAACAAEAAAAzACcAAAACAAEAAAAzACgAAAACAAEAAAA0AAAAAAACAAEAAAA0AAEAAAACAAEAAAA0AAIAAAACAAEAAAA0AAMAAAACAAEAAAA0AAQAAAACAAEAAAA0AAUAAAACAAEAAAA0AAYAAAACAAEAAAA0AAcAAAACAAEAAAA0AAgAAAACAAEAAAA0AAkAAAACAAEAAAA0AAoAAAACAAEAAAA0AAsAAAACAAEAAAA0AAwAAAACAAEAAAA0AA0AAAACAAEAAAA0AA4AAAACAAEAAAA0AA8AAAACAAEAAAA0ABAAAAACAAEAAAA0ABEAAAACAAEAAAA0ABIAAAACAAEAAAA0ABMAAAACAAEAAAA0ABQAAAACAAEAAAA0ABUAAAACAAEAAAA0ABYAAAACAAEAAAA0ABcAAAACAAEAAAA0ABgAAAACAAEAAAA0ABkAAAACAAEAAAA0ABoAAAACAAEAAAA0ABsAAAACAAEAAAA0ABwAAAACAAEAAAA0AB0AAAACAAEAAAA0AB4AAAACAAEAAAA0AB8AAAACAAEAAAA0ACAAAAACAAEAAAA0ACEAAAACAAEAAAA0ACIAAAACAAEAAAA0ACMAAAACAAEAAAA0ACQAAAACAAEAAAA0ACUAAAACAAEAAAA0ACYAAAACAAEAAAA0ACcAAAACAAEAAAA0ACgAAAACAAEAAAA1AAAAAAACAAEAAAA1AAEAAAACAAEAAAA1AAIAAAACAAEAAAA1AAMAAAACAAEAAAA1AAQAAAACAAEAAAA1AAUAAAACAAEAAAA1AAYAAAACAAEAAAA1AAcAAAACAAEAAAA1AAgAAAACAAEAAAA1AAkAAAACAAEAAAA1AAoAAAACAAEAAAA1AAsAAAACAAEAAAA1AAwAAAACAAEAAAA1AA0AAAACAAEAAAA1AA4AAAACAAEAAAA1AA8AAAACAAEAAAA1ABAAAAACAAEAAAA1ABEAAAACAAEAAAA1ABIAAAACAAEAAAA1ABMAAAACAAEAAAA1ABQAAAACAAEAAAA1ABUAAAACAAEAAAA1ABYAAAACAAEAAAA1ABcAAAACAAEAAAA1ABgAAAACAAEAAAA1ABkAAAACAAEAAAA1ABoAAAACAAEAAAA1ABsAAAACAAEAAAA1ABwAAAACAAEAAAA1AB0AAAACAAEAAAA1AB4AAAACAAEAAAA1AB8AAAACAAEAAAA1ACAAAAACAAEAAAA1ACEAAAACAAEAAAA1ACIAAAACAAEAAAA1ACMAAAACAAEAAAA1ACQAAAACAAEAAAA1ACUAAAACAAEAAAA1ACYAAAACAAEAAAA1ACcAAAACAAEAAAA1ACgAAAACAAEAAAA2AAAAAAACAAEAAAA2AAEAAAACAAEAAAA2AAIAAAACAAEAAAA2AAMAAAACAAEAAAA2AAQAAAACAAEAAAA2AAUAAAACAAEAAAA2AAYAAAACAAEAAAA2AAcAAAACAAEAAAA2AAgAAAACAAEAAAA2AAkAAAACAAEAAAA2AAoAAAACAAEAAAA2AAsAAAACAAEAAAA2AAwAAAACAAEAAAA2AA0AAAACAAEAAAA2AA4AAAACAAEAAAA2AA8AAAACAAEAAAA2ABAAAAACAAEAAAA2ABEAAAACAAEAAAA2ABIAAAACAAEAAAA2ABMAAAACAAEAAAA2ABQAAAACAAEAAAA2ABUAAAACAAEAAAA2ABYAAAACAAEAAAA2ABcAAAACAAEAAAA2ABgAAAACAAEAAAA2ABkAAAACAAEAAAA2ABoAAAACAAEAAAA2ABsAAAACAAEAAAA2ABwAAAACAAEAAAA2AB0AAAACAAEAAAA2AB4AAAACAAEAAAA2AB8AAAACAAEAAAA2ACAAAAACAAEAAAA2ACEAAAACAAEAAAA2ACIAAAACAAEAAAA2ACMAAAACAAEAAAA2ACQAAAACAAEAAAA2ACUAAAACAAEAAAA2ACYAAAACAAEAAAA2ACcAAAACAAEAAAA2ACgAAAACAAEAAAA3AAAAAAACAAEAAAA3AAEAAAACAAEAAAA3AAIAAAACAAEAAAA3AAMAAAACAAEAAAA3AAQAAAACAAEAAAA3AAUAAAACAAEAAAA3AAYAAAACAAEAAAA3AAcAAAACAAEAAAA3AAgAAAACAAEAAAA3AAkAAAACAAEAAAA3AAoAAAACAAEAAAA3AAsAAAACAAEAAAA3AAwAAAACAAEAAAA3AA0AAAACAAEAAAA3AA4AAAACAAEAAAA3AA8AAAACAAEAAAA3ABAAAAACAAEAAAA3ABEAAAACAAEAAAA3ABIAAAACAAEAAAA3ABMAAAACAAEAAAA3ABQAAAACAAEAAAA3ABUAAAACAAEAAAA3ABYAAAACAAEAAAA3ABcAAAACAAEAAAA3ABgAAAACAAEAAAA3ABkAAAACAAEAAAA3ABoAAAACAAEAAAA3ABsAAAACAAEAAAA3ABwAAAACAAEAAAA3AB0AAAACAAEAAAA3AB4AAAACAAEAAAA3AB8AAAACAAEAAAA3ACAAAAACAAEAAAA3ACEAAAACAAEAAAA3ACIAAAACAAEAAAA3ACMAAAACAAEAAAA3ACQAAAACAAEAAAA3ACUAAAACAAEAAAA3ACYAAAACAAEAAAA3ACcAAAACAAEAAAA3ACgAAAACAAEAAAA4AAAAAAACAAEAAAA4AAEAAAACAAEAAAA4AAIAAAACAAEAAAA4AAMAAAACAAEAAAA4AAQAAAACAAEAAAA4AAUAAAACAAEAAAA4AAYAAAACAAEAAAA4AAcAAAACAAEAAAA4AAgAAAACAAEAAAA4AAkAAAACAAEAAAA4AAoAAAACAAEAAAA4AAsAAAACAAEAAAA4AAwAAAACAAEAAAA4AA0AAAACAAEAAAA4AA4AAAACAAEAAAA4AA8AAAACAAEAAAA4ABAAAAACAAEAAAA4ABEAAAACAAEAAAA4ABIAAAACAAEAAAA4ABMAAAACAAEAAAA4ABQAAAACAAEAAAA4ABUAAAACAAEAAAA4ABYAAAACAAEAAAA4ABcAAAACAAEAAAA4ABgAAAACAAEAAAA4ABkAAAACAAEAAAA4ABoAAAACAAEAAAA4ABsAAAACAAEAAAA4ABwAAAACAAEAAAA4AB0AAAACAAEAAAA4AB4AAAACAAEAAAA4AB8AAAACAAEAAAA4ACAAAAACAAEAAAA4ACEAAAACAAEAAAA4ACIAAAACAAEAAAA4ACMAAAACAAEAAAA4ACQAAAACAAEAAAA4ACUAAAACAAEAAAA4ACYAAAACAAEAAAA4ACcAAAACAAEAAAA4ACgAAAACAAEAAAA5AAAAAAACAAEAAAA5AAEAAAACAAEAAAA5AAIAAAACAAEAAAA5AAMAAAACAAEAAAA5AAQAAAACAAEAAAA5AAUAAAACAAEAAAA5AAYAAAACAAEAAAA5AAcAAAACAAEAAAA5AAgAAAACAAEAAAA5AAkAAAACAAEAAAA5AAoAAAACAAEAAAA5AAsAAAACAAEAAAA5AAwAAAACAAEAAAA5AA0AAAACAAEAAAA5AA4AAAACAAEAAAA5AA8AAAACAAEAAAA5ABAAAAACAAEAAAA5ABEAAAACAAEAAAA5ABIAAAACAAEAAAA5ABMAAAACAAEAAAA5ABQAAAACAAEAAAA5ABUAAAACAAEAAAA5ABYAAAACAAEAAAA5ABcAAAACAAEAAAA5ABgAAAACAAEAAAA5ABkAAAACAAEAAAA5ABoAAAACAAEAAAA5ABsAAAACAAEAAAA5ABwAAAACAAEAAAA5AB0AAAACAAEAAAA5AB4AAAACAAEAAAA5AB8AAAACAAEAAAA5ACAAAAACAAEAAAA5ACEAAAACAAEAAAA5ACIAAAACAAEAAAA5ACMAAAACAAEAAAA5ACQAAAACAAEAAAA5ACUAAAACAAEAAAA5ACYAAAACAAEAAAA5ACcAAAACAAEAAAA5ACgAAAACAAEAAAA6AAAAAAACAAEAAAA6AAEAAAACAAEAAAA6AAIAAAACAAEAAAA6AAMAAAACAAEAAAA6AAQAAAACAAEAAAA6AAUAAAACAAEAAAA6AAYAAAACAAEAAAA6AAcAAAACAAEAAAA6AAgAAAACAAEAAAA6AAkAAAACAAEAAAA6AAoAAAACAAEAAAA6AAsAAAACAAEAAAA6AAwAAAACAAEAAAA6AA0AAAACAAEAAAA6AA4AAAACAAEAAAA6AA8AAAACAAEAAAA6ABAAAAACAAEAAAA6ABEAAAACAAEAAAA6ABIAAAACAAEAAAA6ABMAAAACAAEAAAA6ABQAAAACAAEAAAA6ABUAAAACAAEAAAA6ABYAAAACAAEAAAA6ABcAAAACAAEAAAA6ABgAAAACAAEAAAA6ABkAAAACAAEAAAA6ABoAAAACAAEAAAA6ABsAAAACAAEAAAA6ABwAAAACAAEAAAA6AB0AAAACAAEAAAA6AB4AAAACAAEAAAA6AB8AAAACAAEAAAA6ACAAAAACAAEAAAA6ACEAAAACAAEAAAA6ACIAAAACAAEAAAA6ACMAAAACAAEAAAA6ACQAAAACAAEAAAA6ACUAAAACAAEAAAA6ACYAAAACAAEAAAA6ACcAAAACAAEAAAA6ACgAAAACAAEAAAA7AAAAAAACAAEAAAA7AAEAAAACAAEAAAA7AAIAAAACAAEAAAA7AAMAAAACAAEAAAA7AAQAAAACAAEAAAA7AAUAAAACAAEAAAA7AAYAAAACAAEAAAA7AAcAAAACAAEAAAA7AAgAAAACAAEAAAA7AAkAAAACAAEAAAA7AAoAAAACAAEAAAA7AAsAAAACAAEAAAA7AAwAAAACAAEAAAA7AA0AAAACAAEAAAA7AA4AAAACAAEAAAA7AA8AAAACAAEAAAA7ABAAAAACAAEAAAA7ABEAAAACAAEAAAA7ABIAAAACAAEAAAA7ABMAAAACAAEAAAA7ABQAAAACAAEAAAA7ABUAAAACAAEAAAA7ABYAAAACAAEAAAA7ABcAAAACAAEAAAA7ABgAAAACAAEAAAA7ABkAAAACAAEAAAA7ABoAAAACAAEAAAA7ABsAAAACAAEAAAA7ABwAAAACAAEAAAA7AB0AAAACAAEAAAA7AB4AAAACAAEAAAA7AB8AAAACAAEAAAA7ACAAAAACAAEAAAA7ACEAAAACAAEAAAA7ACIAAAACAAEAAAA7ACMAAAACAAEAAAA7ACQAAAACAAEAAAA7ACUAAAACAAEAAAA7ACYAAAACAAEAAAA7ACcAAAACAAEAAAA7ACgAAAACAAEAAAA8AAAAAAACAAEAAAA8AAEAAAACAAEAAAA8AAIAAAACAAEAAAA8AAMAAAACAAEAAAA8AAQAAAACAAEAAAA8AAUAAAACAAEAAAA8AAYAAAACAAEAAAA8AAcAAAACAAEAAAA8AAgAAAACAAEAAAA8AAkAAAACAAEAAAA8AAoAAAACAAEAAAA8AAsAAAACAAEAAAA8AAwAAAACAAEAAAA8AA0AAAACAAEAAAA8AA4AAAACAAEAAAA8AA8AAAACAAEAAAA8ABAAAAACAAEAAAA8ABEAAAACAAEAAAA8ABIAAAACAAEAAAA8ABMAAAACAAEAAAA8ABQAAAACAAEAAAA8ABUAAAACAAEAAAA8ABYAAAACAAEAAAA8ABcAAAACAAEAAAA8ABgAAAACAAEAAAA8ABkAAAACAAEAAAA8ABoAAAACAAEAAAA8ABsAAAACAAEAAAA8ABwAAAACAAEAAAA8AB0AAAACAAEAAAA8AB4AAAACAAEAAAA8AB8AAAACAAEAAAA8ACAAAAACAAEAAAA8ACEAAAACAAEAAAA8ACIAAAACAAEAAAA8ACMAAAACAAEAAAA8ACQAAAACAAEAAAA8ACUAAAACAAEAAAA8ACYAAAACAAEAAAA8ACcAAAACAAEAAAA8ACgAAAACAAEAAAA9AAAAAAACAAEAAAA9AAEAAAACAAEAAAA9AAIAAAACAAEAAAA9AAMAAAACAAEAAAA9AAQAAAACAAEAAAA9AAUAAAACAAEAAAA9AAYAAAACAAEAAAA9AAcAAAACAAEAAAA9AAgAAAACAAEAAAA9AAkAAAACAAEAAAA9AAoAAAACAAEAAAA9AAsAAAACAAEAAAA9AAwAAAACAAEAAAA9AA0AAAACAAEAAAA9AA4AAAACAAEAAAA9AA8AAAACAAEAAAA9ABAAAAACAAEAAAA9ABEAAAACAAEAAAA9ABIAAAACAAEAAAA9ABMAAAACAAEAAAA9ABQAAAACAAEAAAA9ABUAAAACAAEAAAA9ABYAAAACAAEAAAA9ABcAAAACAAEAAAA9ABgAAAACAAEAAAA9ABkAAAACAAEAAAA9ABoAAAACAAEAAAA9ABsAAAACAAEAAAA9ABwAAAACAAEAAAA9AB0AAAACAAEAAAA9AB4AAAACAAEAAAA9AB8AAAACAAEAAAA9ACAAAAACAAEAAAA9ACEAAAACAAEAAAA9ACIAAAACAAEAAAA9ACMAAAACAAEAAAA9ACQAAAACAAEAAAA9ACUAAAACAAEAAAA9ACYAAAACAAEAAAA9ACcAAAACAAEAAAA9ACgAAAACAAEAAAA+AAAAAAACAAEAAAA+AAEAAAACAAEAAAA+AAIAAAACAAEAAAA+AAMAAAACAAEAAAA+AAQAAAACAAEAAAA+AAUAAAACAAEAAAA+AAYAAAACAAEAAAA+AAcAAAACAAEAAAA+AAgAAAACAAEAAAA+AAkAAAACAAEAAAA+AAoAAAACAAEAAAA+AAsAAAACAAEAAAA+AAwAAAACAAEAAAA+AA0AAAACAAEAAAA+AA4AAAACAAEAAAA+AA8AAAACAAEAAAA+ABAAAAACAAEAAAA+ABEAAAACAAEAAAA+ABIAAAACAAEAAAA+ABMAAAACAAEAAAA+ABQAAAACAAEAAAA+ABUAAAACAAEAAAA+ABYAAAACAAEAAAA+ABcAAAACAAEAAAA+ABgAAAACAAEAAAA+ABkAAAACAAEAAAA+ABoAAAACAAEAAAA+ABsAAAACAAEAAAA+ABwAAAACAAEAAAA+AB0AAAACAAEAAAA+AB4AAAACAAEAAAA+AB8AAAACAAEAAAA+ACAAAAACAAEAAAA+ACEAAAACAAEAAAA+ACIAAAACAAEAAAA+ACMAAAACAAEAAAA+ACQAAAACAAEAAAA+ACUAAAACAAEAAAA+ACYAAAACAAEAAAA+ACcAAAACAAEAAAA+ACgAAAACAAEAAAA/AAAAAAACAAEAAAA/AAEAAAACAAEAAAA/AAIAAAACAAEAAAA/AAMAAAACAAEAAAA/AAQAAAACAAEAAAA/AAUAAAACAAEAAAA/AAYAAAACAAEAAAA/AAcAAAACAAEAAAA/AAgAAAACAAEAAAA/AAkAAAACAAEAAAA/AAoAAAACAAEAAAA/AAsAAAACAAEAAAA/AAwAAAACAAEAAAA/AA0AAAACAAEAAAA/AA4AAAACAAEAAAA/AA8AAAACAAEAAAA/ABAAAAACAAEAAAA/ABEAAAACAAEAAAA/ABIAAAACAAEAAAA/ABMAAAACAAEAAAA/ABQAAAACAAEAAAA/ABUAAAACAAEAAAA/ABYAAAACAAEAAAA/ABcAAAACAAEAAAA/ABgAAAACAAEAAAA/ABkAAAACAAEAAAA/ABoAAAACAAEAAAA/ABsAAAACAAEAAAA/ABwAAAACAAEAAAA/AB0AAAACAAEAAAA/AB4AAAACAAEAAAA/AB8AAAACAAEAAAA/ACAAAAACAAEAAAA/ACEAAAACAAEAAAA/ACIAAAACAAEAAAA/ACMAAAACAAEAAAA/ACQAAAACAAEAAAA/ACUAAAACAAEAAAA/ACYAAAACAAEAAAA/ACcAAAACAAEAAAA/ACgAAAACAAEAAABAAAAAAAACAAEAAABAAAEAAAACAAEAAABAAAIAAAACAAEAAABAAAMAAAACAAEAAABAAAQAAAACAAEAAABAAAUAAAACAAEAAABAAAYAAAACAAEAAABAAAcAAAACAAEAAABAAAgAAAACAAEAAABAAAkAAAACAAEAAABAAAoAAAACAAEAAABAAAsAAAACAAEAAABAAAwAAAACAAEAAABAAA0AAAACAAEAAABAAA4AAAACAAEAAABAAA8AAAACAAEAAABAABAAAAACAAEAAABAABEAAAACAAEAAABAABIAAAACAAEAAABAABMAAAACAAEAAABAABQAAAACAAEAAABAABUAAAACAAEAAABAABYAAAACAAEAAABAABcAAAACAAEAAABAABgAAAACAAEAAABAABkAAAACAAEAAABAABoAAAACAAEAAABAABsAAAACAAEAAABAABwAAAACAAEAAABAAB0AAAACAAEAAABAAB4AAAACAAEAAABAAB8AAAACAAEAAABAACAAAAACAAEAAABAACEAAAACAAEAAABAACIAAAACAAEAAABAACMAAAACAAEAAABAACQAAAACAAEAAABAACUAAAACAAEAAABAACYAAAACAAEAAABAACcAAAACAAEAAABAACgAAAACAAEAAABBAAAAAAACAAEAAABBAAEAAAACAAEAAABBAAIAAAACAAEAAABBAAMAAAACAAEAAABBAAQAAAACAAEAAABBAAUAAAACAAEAAABBAAYAAAACAAEAAABBAAcAAAACAAEAAABBAAgAAAACAAEAAABBAAkAAAACAAEAAABBAAoAAAACAAEAAABBAAsAAAACAAEAAABBAAwAAAACAAEAAABBAA0AAAACAAEAAABBAA4AAAACAAEAAABBAA8AAAACAAEAAABBABAAAAACAAEAAABBABEAAAACAAEAAABBABIAAAACAAEAAABBABMAAAACAAEAAABBABQAAAACAAEAAABBABUAAAACAAEAAABBABYAAAACAAEAAABBABcAAAACAAEAAABBABgAAAACAAEAAABBABkAAAACAAEAAABBABoAAAACAAEAAABBABsAAAACAAEAAABBABwAAAACAAEAAABBAB0AAAACAAEAAABBAB4AAAACAAEAAABBAB8AAAACAAEAAABBACAAAAACAAEAAABBACEAAAACAAEAAABBACIAAAACAAEAAABBACMAAAACAAEAAABBACQAAAACAAEAAABBACUAAAACAAEAAABBACYAAAACAAEAAABBACcAAAACAAEAAABBACgAAAACAAEAAABCAAAAAAACAAEAAABCAAEAAAACAAEAAABCAAIAAAACAAEAAABCAAMAAAACAAEAAABCAAQAAAACAAEAAABCAAUAAAACAAEAAABCAAYAAAACAAEAAABCAAcAAAACAAEAAABCAAgAAAACAAEAAABCAAkAAAACAAEAAABCAAoAAAACAAEAAABCAAsAAAACAAEAAABCAAwAAAACAAEAAABCAA0AAAACAAEAAABCAA4AAAACAAEAAABCAA8AAAACAAEAAABCABAAAAACAAEAAABCABEAAAACAAEAAABCABIAAAACAAEAAABCABMAAAACAAEAAABCABQAAAACAAEAAABCABUAAAACAAEAAABCABYAAAACAAEAAABCABcAAAACAAEAAABCABgAAAACAAEAAABCABkAAAACAAEAAABCABoAAAACAAEAAABCABsAAAACAAEAAABCABwAAAACAAEAAABCAB0AAAACAAEAAABCAB4AAAACAAEAAABCAB8AAAACAAEAAABCACAAAAACAAEAAABCACEAAAACAAEAAABCACIAAAACAAEAAABCACMAAAACAAEAAABCACQAAAACAAEAAABCACUAAAACAAEAAABCACYAAAACAAEAAABCACcAAAACAAEAAABCACgAAAACAAEAAABDAAAAAAACAAEAAABDAAEAAAACAAEAAABDAAIAAAACAAEAAABDAAMAAAACAAEAAABDAAQAAAACAAEAAABDAAUAAAACAAEAAABDAAYAAAACAAEAAABDAAcAAAACAAEAAABDAAgAAAACAAEAAABDAAkAAAACAAEAAABDAAoAAAACAAEAAABDAAsAAAACAAEAAABDAAwAAAACAAEAAABDAA0AAAACAAEAAABDAA4AAAACAAEAAABDAA8AAAACAAEAAABDABAAAAACAAEAAABDABEAAAACAAEAAABDABIAAAACAAEAAABDABMAAAACAAEAAABDABQAAAACAAEAAABDABUAAAACAAEAAABDABYAAAACAAEAAABDABcAAAACAAEAAABDABgAAAACAAEAAABDABkAAAACAAEAAABDABoAAAACAAEAAABDABsAAAACAAEAAABDABwAAAACAAEAAABDAB0AAAACAAEAAABDAB4AAAACAAEAAABDAB8AAAACAAEAAABDACAAAAACAAEAAABDACEAAAACAAEAAABDACIAAAACAAEAAABDACMAAAACAAEAAABDACQAAAACAAEAAABDACUAAAACAAEAAABDACYAAAACAAEAAABDACcAAAACAAEAAABDACgAAAACAAEAAABEAAAAAAACAAEAAABEAAEAAAACAAEAAABEAAIAAAACAAEAAABEAAMAAAACAAEAAABEAAQAAAACAAEAAABEAAUAAAACAAEAAABEAAYAAAACAAEAAABEAAcAAAACAAEAAABEAAgAAAACAAEAAABEAAkAAAACAAEAAABEAAoAAAACAAEAAABEAAsAAAACAAEAAABEAAwAAAACAAEAAABEAA0AAAACAAEAAABEAA4AAAACAAEAAABEAA8AAAACAAEAAABEABAAAAACAAEAAABEABEAAAACAAEAAABEABIAAAACAAEAAABEABMAAAACAAEAAABEABQAAAACAAEAAABEABUAAAACAAEAAABEABYAAAACAAEAAABEABcAAAACAAEAAABEABgAAAACAAEAAABEABkAAAACAAEAAABEABoAAAACAAEAAABEABsAAAACAAEAAABEABwAAAACAAEAAABEAB0AAAACAAEAAABEAB4AAAACAAEAAABEAB8AAAACAAEAAABEACAAAAACAAEAAABEACEAAAACAAEAAABEACIAAAACAAEAAABEACMAAAACAAEAAABEACQAAAACAAEAAABEACUAAAACAAEAAABEACYAAAACAAEAAABEACcAAAACAAEAAABEACgAAAACAAEAAABFAAAAAAACAAEAAABFAAEAAAACAAEAAABFAAIAAAACAAEAAABFAAMAAAACAAEAAABFAAQAAAACAAEAAABFAAUAAAACAAEAAABFAAYAAAACAAEAAABFAAcAAAACAAEAAABFAAgAAAACAAEAAABFAAkAAAACAAEAAABFAAoAAAACAAEAAABFAAsAAAACAAEAAABFAAwAAAACAAEAAABFAA0AAAACAAEAAABFAA4AAAACAAEAAABFAA8AAAACAAEAAABFABAAAAACAAEAAABFABEAAAACAAEAAABFABIAAAACAAEAAABFABMAAAACAAEAAABFABQAAAACAAEAAABFABUAAAACAAEAAABFABYAAAACAAEAAABFABcAAAACAAEAAABFABgAAAACAAEAAABFABkAAAACAAEAAABFABoAAAACAAEAAABFABsAAAACAAEAAABFABwAAAACAAEAAABFAB0AAAACAAEAAABFAB4AAAACAAEAAABFAB8AAAACAAEAAABFACAAAAACAAEAAABFACEAAAACAAEAAABFACIAAAACAAEAAABFACMAAAACAAEAAABFACQAAAACAAEAAABFACUAAAACAAEAAABFACYAAAACAAEAAABFACcAAAACAAEAAABFACgAAAACAAEAAABGAAAAAAACAAEAAABGAAEAAAACAAEAAABGAAIAAAACAAEAAABGAAMAAAACAAEAAABGAAQAAAACAAEAAABGAAUAAAACAAEAAABGAAYAAAACAAEAAABGAAcAAAACAAEAAABGAAgAAAACAAEAAABGAAkAAAACAAEAAABGAAoAAAACAAEAAABGAAsAAAACAAEAAABGAAwAAAACAAEAAABGAA0AAAACAAEAAABGAA4AAAACAAEAAABGAA8AAAACAAEAAABGABAAAAACAAEAAABGABEAAAACAAEAAABGABIAAAACAAEAAABGABMAAAACAAEAAABGABQAAAACAAEAAABGABUAAAACAAEAAABGABYAAAACAAEAAABGABcAAAACAAEAAABGABgAAAACAAEAAABGABkAAAACAAEAAABGABoAAAACAAEAAABGABsAAAACAAEAAABGABwAAAACAAEAAABGAB0AAAACAAEAAABGAB4AAAACAAEAAABGAB8AAAACAAEAAABGACAAAAACAAEAAABGACEAAAACAAEAAABGACIAAAACAAEAAABGACMAAAACAAEAAABGACQAAAACAAEAAABGACUAAAACAAEAAABGACYAAAACAAEAAABGACcAAAACAAEAAABGACgAAAACAAEAAABHAAAAAAACAAEAAABHAAEAAAACAAEAAABHAAIAAAACAAEAAABHAAMAAAACAAEAAABHAAQAAAACAAEAAABHAAUAAAACAAEAAABHAAYAAAACAAEAAABHAAcAAAACAAEAAABHAAgAAAACAAEAAABHAAkAAAACAAEAAABHAAoAAAACAAEAAABHAAsAAAACAAEAAABHAAwAAAACAAEAAABHAA0AAAACAAEAAABHAA4AAAACAAEAAABHAA8AAAACAAEAAABHABAAAAACAAEAAABHABEAAAACAAEAAABHABIAAAACAAEAAABHABMAAAACAAEAAABHABQAAAACAAEAAABHABUAAAACAAEAAABHABYAAAACAAEAAABHABcAAAACAAEAAABHABgAAAACAAEAAABHABkAAAACAAEAAABHABoAAAACAAEAAABHABsAAAACAAEAAABHABwAAAACAAEAAABHAB0AAAACAAEAAABHAB4AAAACAAEAAABHAB8AAAACAAEAAABHACAAAAACAAEAAABHACEAAAACAAEAAABHACIAAAACAAEAAABHACMAAAACAAEAAABHACQAAAACAAEAAABHACUAAAACAAEAAABHACYAAAACAAEAAABHACcAAAACAAEAAABHACgAAAACAAEAAAAsAA8AAAADAAEAAAArABUAAAAAAAIAAAAbAAsAAAACAAEAAAAbAAwAAAACAAEAAAAbAA0AAAACAAEAAAAbAA4AAAACAAEAAAAbAA8AAAACAAEAAAAbABAAAAACAAEAAAAbABEAAAACAAEAAAAbABIAAAACAAEAAAAbABMAAAACAAEAAAAbABQAAAACAAEAAAAbABUAAAACAAEAAAAbABYAAAACAAEAAAAbABcAAAACAAEAAAAbABgAAAACAAEAAAAcAAsAAAACAAEAAAAcAAwAAAACAAEAAAAcAA0AAAACAAEAAAAcAA4AAAABAAAAAAAcAA8AAAABAAEAAAAcABAAAAABAAEAAAAcABEAAAABAAEAAAAcABIAAAABAAEAAAAcABMAAAABAAEAAAAcABQAAAABAAEAAAAcABUAAAABAAEAAAAcABYAAAABAAEAAAAcABcAAAABAAEAAAAcABgAAAABAAEAAAAdAAsAAAACAAEAAAAdAAwAAAABAAMAAAAdAA0AAAABAAQAAAAdAA4AAAABAAUAAAAdAA8AAAAAAAIAAAAdABAAAAAAAAIAAAAdABEAAAAAAAIAAAAdABIAAAAAAAIAAAAdABMAAAAAAAIAAAAdABQAAAAAAAIAAAAdABUAAAAAAAIAAAAdABYAAAAAAAIAAAAdABcAAAAAAAIAAAAdABgAAAAAAAIAAAAeAAsAAAACAAEAAAAeAAwAAAACAAMAAAAeAA0AAAAMAAAAAAAeAA4AAAACAAUAAAAeAA8AAAAAAAIAAAAeABAAAAAAAAIAAAAeABEAAAAAAAIAAAAeABIAAAAAAAIAAAAeABMAAAAAAAIAAAAeABQAAAAAAAIAAAAeABUAAAAAAAIAAAAeABYAAAAAAAIAAAAeABcAAAAAAAIAAAAeABgAAAAAAAIAAAAfAAsAAAACAAEAAAAfAAwAAAADAAMAAAAfAA0AAAANAAAAAAAfAA4AAAADAAUAAAAfAA8AAAAAAAIAAAAfABAAAAAAAAIAAAAfABEAAAAAAAIAAAAfABIAAAAAAAIAAAAfABMAAAAAAAIAAAAfABQAAAAAAAIAAAAfABUAAAAAAAIAAAAfABYAAAAAAAIAAAAfABcAAAAAAAIAAAAfABgAAAAAAAIAAAAgAAsAAAACAAEAAAAgAAwAAAABAAMAAAAgAA0AAAACAAQAAAAgAA4AAAABAAUAAAAgAA8AAAAAAAIAAAAgABAAAAAAAAIAAAAgABEAAAAAAAIAAAAgABIAAAAAAAIAAAAgABMAAAAAAAIAAAAgABQAAAAAAAIAAAAgABUAAAAAAAIAAAAgABYAAAAAAAIAAAAgABcAAAAAAAIAAAAgABgAAAAAAAIAAAAhAAsAAAACAAEAAAAhAAwAAAACAAMAAAAhAA0AAAACAAQAAAAhAA4AAAACAAUAAAAhAA8AAAAAAAIAAAAhABAAAAAAAAIAAAAhABEAAAAAAAIAAAAhABIAAAAAAAIAAAAhABMAAAAAAAIAAAAhABQAAAAAAAIAAAAhABUAAAAAAAIAAAAhABYAAAAAAAIAAAAhABcAAAAAAAIAAAAhABgAAAAAAAIAAAAiAAsAAAACAAEAAAAiAAwAAAADAAMAAAAiAA0AAAAMAAoAAAAiAA4AAAAMAAsAAAAiAA8AAAAMAAwAAAAiABAAAAAAAAIAAAAiABEAAAAAAAIAAAAiABIAAAAAAAIAAAAiABMAAAAAAAIAAAAiABQAAAAAAAIAAAAiABUAAAAAAAIAAAAiABYAAAAAAAIAAAAiABcAAAAQAAQAAAAiABgAAAAAAAIAAAAjAAsAAAACAAEAAAAjAAwAAAACAAMAAAAjAA0AAAANAAoAAAAjAA4AAAANAAsAAAAjAA8AAAANAAwAAAAjABAAAAAAAAIAAAAjABEAAAAAAAIAAAAjABIAAAAAAAIAAAAjABMAAAAAAAIAAAAjABQAAAAAAAIAAAAjABUAAAAAAAIAAAAjABYAAAAAAAIAAAAjABcAAAAAAAIAAAAjABgAAAAAAAIAAAAkAAsAAAACAAEAAAAkAAwAAAACAAMAAAAkAA0AAAACAAQAAAAkAA4AAAACAAUAAAAkAA8AAAAAAAIAAAAkABAAAAAAAAIAAAAkABEAAAAAAAIAAAAkABIAAAAAAAIAAAAkABMAAAAAAAIAAAAkABQAAAAAAAIAAAAkABUAAAAPAAQAAAAkABYAAAAAAAIAAAAkABcAAAANAAEAAAAkABgAAAARAAQAAAAlAAsAAAACAAEAAAAlAAwAAAADAAMAAAAlAA0AAAADAAQAAAAlAA4AAAADAAUAAAAlAA8AAAAAAAIAAAAlABAAAAAAAAIAAAAlABEAAAAAAAIAAAAlABIAAAAAAAIAAAAlABMAAAAAAAIAAAAlABQAAAAAAAIAAAAlABUAAAAAAAIAAAAlABYAAAAAAAIAAAAlABcAAAAAAAIAAAAlABgAAAAAAAIAAAAmAAsAAAACAAEAAAAmAAwAAAABAAMAAAAmAA0AAAABAAQAAAAmAA4AAAABAAUAAAAmAA8AAAAAAAIAAAAmABAAAAAAAAIAAAAmABEAAAAAAAcAAAAmABIAAAAAAAgAAAAmABMAAAAAAAkAAAAmABQAAAAAAAIAAAAmABUAAAAAAAIAAAAmABYAAAAAAAIAAAAmABcAAAASAAQAAAAmABgAAAAAAAIAAAAnAAsAAAACAAEAAAAnAAwAAAACAAMAAAAnAA0AAAACAAQAAAAnAA4AAAACAAUAAAAnAA8AAAAAAAIAAAAnABAAAAAAAAIAAAAnABEAAAABAAcAAAAnABIAAAABAAgAAAAnABMAAAABAAkAAAAnABQAAAAAAAIAAAAnABUAAAAAAAIAAAAnABYAAAAAAAIAAAAnABcAAAAAAAIAAAAnABgAAAAAAAIAAAAoAAsAAAACAAEAAAAoAAwAAAADAAMAAAAoAA0AAAADAAQAAAAoAA4AAAADAAUAAAAoAA8AAAAAAAIAAAAoABAAAAAAAAIAAAAoABEAAAACAAcAAAAoABIAAAACAAgAAAAoABMAAAACAAkAAAAoABQAAAAAAAIAAAAoABUAAAAAAAIAAAAoABYAAAAAAAIAAAAoABcAAAAAAAIAAAAoABgAAAAAAAIAAAApAAsAAAACAAEAAAApAAwAAAABAAMAAAApAA0AAAABAAQAAAApAA4AAAABAAUAAAApAA8AAAATAAEAAAApABAAAAATAAIAAAApABEAAAATAAMAAAApABIAAAAAAAIAAAApABMAAAAAAAIAAAApABQAAAAAAAIAAAApABUAAAAAAAIAAAApABYAAAAAAAIAAAApABcAAAAAAAIAAAApABgAAAAAAAIAAAAXAAYAAAACAAEAAAAXAAcAAAACAAEAAAAXAAgAAAACAAEAAAAXAAkAAAACAAEAAAAXAAoAAAACAAEAAAAXAAsAAAACAAEAAAAXAAwAAAACAAEAAAAXAA0AAAACAAEAAAAXAA4AAAACAAEAAAAXAA8AAAACAAEAAAAXABAAAAACAAEAAAAXABEAAAACAAEAAAAXABIAAAACAAEAAAAYAAYAAAACAAEAAAAYAAcAAAACAAEAAAAYAAgAAAACAAEAAAAYAAkAAAACAAEAAAAYAAoAAAACAAEAAAAYAAsAAAACAAEAAAAYAAwAAAACAAEAAAAYAA0AAAACAAEAAAAYAA4AAAACAAEAAAAYAA8AAAACAAEAAAAYABAAAAACAAEAAAAYABEAAAACAAEAAAAYABIAAAACAAEAAAAZAAYAAAACAAEAAAAZAAcAAAACAAEAAAAZAAgAAAACAAEAAAAZAAkAAAACAAEAAAAZAAoAAAACAAEAAAAZAAsAAAACAAEAAAAZAAwAAAACAAEAAAAZAA0AAAACAAEAAAAZAA4AAAACAAEAAAAZAA8AAAACAAEAAAAZABAAAAACAAEAAAAZABEAAAACAAEAAAAZABIAAAACAAEAAAAaAAYAAAACAAEAAAAaAAcAAAACAAEAAAAaAAgAAAACAAEAAAAaAAkAAAACAAEAAAAaAAoAAAACAAEAAAAaAAsAAAACAAEAAAAaAAwAAAACAAEAAAAaAA0AAAACAAEAAAAaAA4AAAACAAEAAAAaAA8AAAACAAEAAAAaABAAAAACAAEAAAAaABEAAAACAAEAAAAaABIAAAACAAEAAAAbAAYAAAACAAEAAAAbAAcAAAACAAEAAAAbAAgAAAACAAEAAAAbAAkAAAACAAEAAAAbAAoAAAACAAEAAAAXABMAAAACAAEAAAAXABQAAAACAAEAAAAXABUAAAACAAEAAAAXABYAAAACAAEAAAAXABcAAAACAAEAAAAXABgAAAACAAEAAAAYABMAAAACAAEAAAAYABQAAAACAAEAAAAYABUAAAACAAEAAAAYABYAAAACAAEAAAAYABcAAAACAAEAAAAYABgAAAACAAEAAAAZABMAAAACAAEAAAAZABQAAAACAAEAAAAZABUAAAACAAEAAAAZABYAAAACAAEAAAAZABcAAAACAAEAAAAZABgAAAACAAEAAAAaABMAAAACAAEAAAAaABQAAAACAAEAAAAaABUAAAACAAEAAAAaABYAAAACAAEAAAAaABcAAAACAAEAAAAaABgAAAACAAEAAAAcAAYAAAACAAEAAAAcAAcAAAACAAEAAAAcAAgAAAACAAEAAAAcAAkAAAACAAEAAAAcAAoAAAACAAEAAAAdAAYAAAACAAEAAAAdAAcAAAACAAEAAAAdAAgAAAACAAEAAAAdAAkAAAACAAEAAAAdAAoAAAACAAEAAAAeAAYAAAACAAEAAAAeAAcAAAACAAEAAAAeAAgAAAACAAEAAAAeAAkAAAACAAEAAAAeAAoAAAACAAEAAAAfAAYAAAACAAEAAAAfAAcAAAACAAEAAAAfAAgAAAACAAEAAAAfAAkAAAACAAEAAAAfAAoAAAACAAEAAAAgAAYAAAACAAEAAAAgAAcAAAACAAEAAAAgAAgAAAACAAEAAAAgAAkAAAACAAEAAAAgAAoAAAACAAEAAAAhAAYAAAACAAEAAAAhAAcAAAACAAEAAAAhAAgAAAACAAEAAAAhAAkAAAACAAEAAAAhAAoAAAACAAEAAAAiAAYAAAACAAEAAAAiAAcAAAACAAEAAAAiAAgAAAACAAEAAAAiAAkAAAACAAEAAAAiAAoAAAACAAEAAAAjAAYAAAACAAEAAAAjAAcAAAACAAEAAAAjAAgAAAACAAEAAAAjAAkAAAACAAEAAAAjAAoAAAACAAEAAAAkAAYAAAACAAEAAAAkAAcAAAACAAEAAAAkAAgAAAACAAEAAAAkAAkAAAACAAEAAAAkAAoAAAACAAEAAAAlAAYAAAACAAEAAAAlAAcAAAACAAEAAAAlAAgAAAACAAEAAAAlAAkAAAACAAEAAAAlAAoAAAACAAEAAAAmAAYAAAACAAEAAAAmAAcAAAACAAEAAAAmAAgAAAACAAEAAAAmAAkAAAACAAEAAAAmAAoAAAACAAEAAAAnAAYAAAACAAEAAAAnAAcAAAACAAEAAAAnAAgAAAACAAEAAAAnAAkAAAACAAEAAAAnAAoAAAACAAEAAAAoAAYAAAACAAEAAAAoAAcAAAACAAEAAAAoAAgAAAACAAEAAAAoAAkAAAACAAEAAAAoAAoAAAACAAEAAAApAAYAAAACAAEAAAApAAcAAAACAAEAAAApAAgAAAACAAEAAAApAAkAAAACAAEAAAApAAoAAAACAAEAAAD0////AAACAAEAAAD1////AAACAAEAAAD1/wAAAAACAAEAAAD2/wAAAAACAAEAAAD2/wEAAAACAAEAAAD3/wIAAAACAAEAAAD4/wMAAAACAAEAAAD4/wQAAAACAAEAAAD5/wUAAAACAAEAAAD6/wYAAAACAAEAAAD6/wcAAAACAAEAAAD7/wgAAAACAAEAAAD8/wkAAAACAAEAAAD9/woAAAACAAEAAAD+/wsAAAACAAEAAAD+/wwAAAACAAEAAAD//w0AAAACAAEAAADl//T/AAACAAEAAADl//X/AAACAAEAAADl//b/AAACAAEAAADl//f/AAACAAEAAADl//j/AAACAAEAAADl//n/AAACAAEAAADl//r/AAACAAEAAADl//v/AAACAAEAAADl//z/AAACAAEAAADl//3/AAACAAEAAADl//7/AAACAAEAAADl////AAACAAEAAADl/wAAAAACAAEAAADl/wEAAAACAAEAAADl/wIAAAACAAEAAADl/wMAAAACAAEAAADl/wQAAAACAAEAAADl/wUAAAACAAEAAADl/wYAAAACAAEAAADl/wcAAAACAAEAAADl/wgAAAACAAEAAADl/wkAAAACAAEAAADl/woAAAACAAEAAADl/wsAAAACAAEAAADl/wwAAAACAAEAAADl/w0AAAACAAEAAADl/w4AAAACAAEAAADl/w8AAAACAAEAAADl/xAAAAACAAEAAADl/xEAAAACAAEAAADl/xIAAAACAAEAAADl/xMAAAACAAEAAADl/xQAAAACAAEAAADl/xUAAAACAAEAAADl/xYAAAACAAEAAADl/xcAAAACAAEAAADl/xgAAAACAAEAAADl/xkAAAACAAEAAADl/xoAAAACAAEAAADl/xsAAAACAAEAAADl/xwAAAACAAEAAADl/x0AAAACAAEAAADl/x4AAAACAAEAAADl/x8AAAACAAEAAADl/yAAAAACAAEAAADl/yEAAAACAAEAAADl/yIAAAACAAEAAADl/yMAAAACAAEAAADl/yQAAAACAAEAAADl/yUAAAACAAEAAADl/yYAAAACAAEAAADl/ycAAAACAAEAAADl/ygAAAACAAEAAADl/ykAAAACAAEAAADl/yoAAAACAAEAAADl/ysAAAACAAEAAADl/ywAAAACAAEAAADl/y0AAAACAAEAAADl/y4AAAACAAEAAADl/y8AAAACAAEAAADl/zAAAAACAAEAAADl/zEAAAACAAEAAADl/zIAAAACAAEAAADl/zMAAAACAAEAAADl/zQAAAACAAEAAADl/zUAAAACAAEAAADl/zYAAAACAAEAAADl/zcAAAACAAEAAADl/zgAAAACAAEAAADm//T/AAACAAEAAADm//X/AAACAAEAAADm//b/AAACAAEAAADm//f/AAACAAEAAADm//j/AAACAAEAAADm//n/AAACAAEAAADm//r/AAACAAEAAADm//v/AAACAAEAAADm//z/AAACAAEAAADm//3/AAACAAEAAADm//7/AAACAAEAAADm////AAACAAEAAADm/wAAAAACAAEAAADm/wEAAAACAAEAAADm/wIAAAACAAEAAADm/wMAAAACAAEAAADm/wQAAAACAAEAAADm/wUAAAACAAEAAADm/wYAAAACAAEAAADm/wcAAAACAAEAAADm/wgAAAACAAEAAADm/wkAAAACAAEAAADm/woAAAACAAEAAADm/wsAAAACAAEAAADm/wwAAAACAAEAAADm/w0AAAACAAEAAADm/w4AAAACAAEAAADm/w8AAAACAAEAAADm/xAAAAACAAEAAADm/xEAAAACAAEAAADm/xIAAAACAAEAAADm/xMAAAACAAEAAADm/xQAAAACAAEAAADm/xUAAAACAAEAAADm/xYAAAACAAEAAADm/xcAAAACAAEAAADm/xgAAAACAAEAAADm/xkAAAACAAEAAADm/xoAAAACAAEAAADm/xsAAAACAAEAAADm/xwAAAACAAEAAADm/x0AAAACAAEAAADm/x4AAAACAAEAAADm/x8AAAACAAEAAADm/yAAAAACAAEAAADm/yEAAAACAAEAAADm/yIAAAACAAEAAADm/yMAAAACAAEAAADm/yQAAAACAAEAAADm/yUAAAACAAEAAADm/yYAAAACAAEAAADm/ycAAAACAAEAAADm/ygAAAACAAEAAADm/ykAAAACAAEAAADm/yoAAAACAAEAAADm/ysAAAACAAEAAADm/ywAAAACAAEAAADm/y0AAAACAAEAAADm/y4AAAACAAEAAADm/y8AAAACAAEAAADm/zAAAAACAAEAAADm/zEAAAACAAEAAADm/zIAAAACAAEAAADm/zMAAAACAAEAAADm/zQAAAACAAEAAADm/zUAAAACAAEAAADm/zYAAAACAAEAAADm/zcAAAACAAEAAADm/zgAAAACAAEAAADn//T/AAACAAEAAADn//X/AAACAAEAAADn//b/AAACAAEAAADn//f/AAACAAEAAADn//j/AAACAAEAAADn//n/AAACAAEAAADn//r/AAACAAEAAADn//v/AAACAAEAAADn//z/AAACAAEAAADn//3/AAACAAEAAADn//7/AAACAAEAAADn////AAACAAEAAADn/wAAAAACAAEAAADn/wEAAAACAAEAAADn/wIAAAACAAEAAADn/wMAAAACAAEAAADn/wQAAAACAAEAAADn/wUAAAACAAEAAADn/wYAAAACAAEAAADn/wcAAAACAAEAAADn/wgAAAACAAEAAADn/wkAAAACAAEAAADn/woAAAACAAEAAADn/wsAAAACAAEAAADn/wwAAAACAAEAAADn/w0AAAACAAEAAADn/w4AAAACAAEAAADn/w8AAAACAAEAAADn/xAAAAACAAEAAADn/xEAAAACAAEAAADn/xIAAAACAAEAAADn/xMAAAACAAEAAADn/xQAAAACAAEAAADn/xUAAAACAAEAAADn/xYAAAACAAEAAADn/xcAAAACAAEAAADn/xgAAAACAAEAAADn/xkAAAACAAEAAADn/xoAAAACAAEAAADn/xsAAAACAAEAAADn/xwAAAACAAEAAADn/x0AAAACAAEAAADn/x4AAAACAAEAAADn/x8AAAACAAEAAADn/yAAAAACAAEAAADn/yEAAAACAAEAAADn/yIAAAACAAEAAADn/yMAAAACAAEAAADn/yQAAAACAAEAAADn/yUAAAACAAEAAADn/yYAAAACAAEAAADn/ycAAAACAAEAAADn/ygAAAACAAEAAADn/ykAAAACAAEAAADn/yoAAAACAAEAAADn/ysAAAACAAEAAADn/ywAAAACAAEAAADn/y0AAAACAAEAAADn/y4AAAACAAEAAADn/y8AAAACAAEAAADn/zAAAAACAAEAAADn/zEAAAACAAEAAADn/zIAAAACAAEAAADn/zMAAAACAAEAAADn/zQAAAACAAEAAADn/zUAAAACAAEAAADn/zYAAAACAAEAAADn/zcAAAACAAEAAADn/zgAAAACAAEAAADo//T/AAACAAEAAADo//X/AAACAAEAAADo//b/AAACAAEAAADo//f/AAACAAEAAADo//j/AAACAAEAAADo//n/AAACAAEAAADo//r/AAACAAEAAADo//v/AAACAAEAAADo//z/AAACAAEAAADo//3/AAACAAEAAADo//7/AAACAAEAAADo////AAACAAEAAADo/wAAAAACAAEAAADo/wEAAAACAAEAAADo/wIAAAACAAEAAADo/wMAAAACAAEAAADo/wQAAAACAAEAAADo/wUAAAACAAEAAADo/wYAAAACAAEAAADo/wcAAAACAAEAAADo/wgAAAACAAEAAADo/wkAAAACAAEAAADo/woAAAACAAEAAADo/wsAAAACAAEAAADo/wwAAAACAAEAAADo/w0AAAACAAEAAADo/w4AAAACAAEAAADo/w8AAAACAAEAAADo/xAAAAACAAEAAADo/xEAAAACAAEAAADo/xIAAAACAAEAAADo/xMAAAACAAEAAADo/xQAAAACAAEAAADo/xUAAAACAAEAAADo/xYAAAACAAEAAADo/xcAAAACAAEAAADo/xgAAAACAAEAAADo/xkAAAACAAEAAADo/xoAAAACAAEAAADo/xsAAAACAAEAAADo/xwAAAACAAEAAADo/x0AAAACAAEAAADo/x4AAAACAAEAAADo/x8AAAACAAEAAADo/yAAAAACAAEAAADo/yEAAAACAAEAAADo/yIAAAACAAEAAADo/yMAAAACAAEAAADo/yQAAAACAAEAAADo/yUAAAACAAEAAADo/yYAAAACAAEAAADo/ycAAAACAAEAAADo/ygAAAACAAEAAADo/ykAAAACAAEAAADo/yoAAAACAAEAAADo/ysAAAACAAEAAADo/ywAAAACAAEAAADo/y0AAAACAAEAAADo/y4AAAACAAEAAADo/y8AAAACAAEAAADo/zAAAAACAAEAAADo/zEAAAACAAEAAADo/zIAAAACAAEAAADo/zMAAAACAAEAAADo/zQAAAACAAEAAADo/zUAAAACAAEAAADo/zYAAAACAAEAAADo/zcAAAACAAEAAADo/zgAAAACAAEAAADp//T/AAACAAEAAADp//X/AAACAAEAAADp//b/AAACAAEAAADp//f/AAACAAEAAADp//j/AAACAAEAAADp//n/AAACAAEAAADp//r/AAACAAEAAADp//v/AAACAAEAAADp//z/AAACAAEAAADp//3/AAACAAEAAADp//7/AAACAAEAAADp////AAACAAEAAADp/wAAAAACAAEAAADp/wEAAAACAAEAAADp/wIAAAACAAEAAADp/wMAAAACAAEAAADp/wQAAAACAAEAAADp/wUAAAACAAEAAADp/wYAAAACAAEAAADp/wcAAAACAAEAAADp/wgAAAACAAEAAADp/wkAAAACAAEAAADp/woAAAACAAEAAADp/wsAAAACAAEAAADp/wwAAAACAAEAAADp/w0AAAACAAEAAADp/w4AAAACAAEAAADp/w8AAAACAAEAAADp/xAAAAACAAEAAADp/xEAAAACAAEAAADp/xIAAAACAAEAAADp/xMAAAACAAEAAADp/xQAAAACAAEAAADp/xUAAAACAAEAAADp/xYAAAACAAEAAADp/xcAAAACAAEAAADp/xgAAAACAAEAAADp/xkAAAACAAEAAADp/xoAAAACAAEAAADp/xsAAAACAAEAAADp/xwAAAACAAEAAADp/x0AAAACAAEAAADp/x4AAAACAAEAAADp/x8AAAACAAEAAADp/yAAAAACAAEAAADp/yEAAAACAAEAAADp/yIAAAACAAEAAADp/yMAAAACAAEAAADp/yQAAAACAAEAAADp/yUAAAACAAEAAADp/yYAAAACAAEAAADp/ycAAAACAAEAAADp/ygAAAACAAEAAADp/ykAAAACAAEAAADp/yoAAAACAAEAAADp/ysAAAACAAEAAADp/ywAAAACAAEAAADp/y0AAAACAAEAAADp/y4AAAACAAEAAADp/y8AAAACAAEAAADp/zAAAAACAAEAAADp/zEAAAACAAEAAADp/zIAAAACAAEAAADp/zMAAAACAAEAAADp/zQAAAACAAEAAADp/zUAAAACAAEAAADp/zYAAAACAAEAAADp/zcAAAACAAEAAADp/zgAAAACAAEAAADq//T/AAACAAEAAADq//X/AAACAAEAAADq//b/AAACAAEAAADq//f/AAACAAEAAADq//j/AAACAAEAAADq//n/AAACAAEAAADq//r/AAACAAEAAADq//v/AAACAAEAAADq//z/AAACAAEAAADq//3/AAACAAEAAADq//7/AAACAAEAAADq////AAACAAEAAADq/wAAAAACAAEAAADq/wEAAAACAAEAAADq/wIAAAACAAEAAADq/wMAAAACAAEAAADq/wQAAAACAAEAAADq/wUAAAACAAEAAADq/wYAAAACAAEAAADq/wcAAAACAAEAAADq/wgAAAACAAEAAADq/wkAAAACAAEAAADq/woAAAACAAEAAADq/wsAAAACAAEAAADq/wwAAAACAAEAAADq/w0AAAACAAEAAADq/w4AAAACAAEAAADq/w8AAAACAAEAAADq/xAAAAACAAEAAADq/xEAAAACAAEAAADq/xIAAAACAAEAAADq/xMAAAACAAEAAADq/xQAAAACAAEAAADq/xUAAAACAAEAAADq/xYAAAACAAEAAADq/xcAAAACAAEAAADq/xgAAAACAAEAAADq/xkAAAACAAEAAADq/xoAAAACAAEAAADq/xsAAAACAAEAAADq/xwAAAACAAEAAADq/x0AAAACAAEAAADq/x4AAAACAAEAAADq/x8AAAACAAEAAADq/yAAAAACAAEAAADq/yEAAAACAAEAAADq/yIAAAACAAEAAADq/yMAAAACAAEAAADq/yQAAAACAAEAAADq/yUAAAACAAEAAADq/yYAAAACAAEAAADq/ycAAAACAAEAAADq/ygAAAACAAEAAADq/ykAAAACAAEAAADq/yoAAAACAAEAAADq/ysAAAACAAEAAADq/ywAAAACAAEAAADq/y0AAAACAAEAAADq/y4AAAACAAEAAADq/y8AAAACAAEAAADq/zAAAAACAAEAAADq/zEAAAACAAEAAADq/zIAAAACAAEAAADq/zMAAAACAAEAAADq/zQAAAACAAEAAADq/zUAAAACAAEAAADq/zYAAAACAAEAAADq/zcAAAACAAEAAADq/zgAAAACAAEAAADr//T/AAACAAEAAADr//X/AAACAAEAAADr//b/AAACAAEAAADr//f/AAACAAEAAADr//j/AAACAAEAAADr//n/AAACAAEAAADr//r/AAACAAEAAADr//v/AAACAAEAAADr//z/AAACAAEAAADr//3/AAACAAEAAADr//7/AAACAAEAAADr////AAACAAEAAADr/wAAAAACAAEAAADr/wEAAAACAAEAAADr/wIAAAACAAEAAADr/wMAAAACAAEAAADr/wQAAAACAAEAAADr/wUAAAACAAEAAADr/wYAAAACAAEAAADr/wcAAAACAAEAAADr/wgAAAACAAEAAADr/wkAAAACAAEAAADr/woAAAACAAEAAADr/wsAAAACAAEAAADr/wwAAAACAAEAAADr/w0AAAACAAEAAADr/w4AAAACAAEAAADr/w8AAAACAAEAAADr/xAAAAACAAEAAADr/xEAAAACAAEAAADr/xIAAAACAAEAAADr/xMAAAACAAEAAADr/xQAAAACAAEAAADr/xUAAAACAAEAAADr/xYAAAACAAEAAADr/xcAAAACAAEAAADr/xgAAAACAAEAAADr/xkAAAACAAEAAADr/xoAAAACAAEAAADr/xsAAAACAAEAAADr/xwAAAACAAEAAADr/x0AAAACAAEAAADr/x4AAAACAAEAAADr/x8AAAACAAEAAADr/yAAAAACAAEAAADr/yEAAAACAAEAAADr/yIAAAACAAEAAADr/yMAAAACAAEAAADr/yQAAAACAAEAAADr/yUAAAACAAEAAADr/yYAAAACAAEAAADr/ycAAAACAAEAAADr/ygAAAACAAEAAADr/ykAAAACAAEAAADr/yoAAAACAAEAAADr/ysAAAACAAEAAADr/ywAAAACAAEAAADr/y0AAAACAAEAAADr/y4AAAACAAEAAADr/y8AAAACAAEAAADr/zAAAAACAAEAAADr/zEAAAACAAEAAADr/zIAAAACAAEAAADr/zMAAAACAAEAAADr/zQAAAACAAEAAADr/zUAAAACAAEAAADr/zYAAAACAAEAAADr/zcAAAACAAEAAADr/zgAAAACAAEAAADs//T/AAACAAEAAADs//X/AAACAAEAAADs//b/AAACAAEAAADs//f/AAACAAEAAADs//j/AAACAAEAAADs//n/AAACAAEAAADs//r/AAACAAEAAADs//v/AAACAAEAAADs//z/AAACAAEAAADs//3/AAACAAEAAADs//7/AAACAAEAAADs////AAACAAEAAADs/wAAAAACAAEAAADs/wEAAAACAAEAAADs/wIAAAACAAEAAADs/wMAAAACAAEAAADs/wQAAAACAAEAAADs/wUAAAACAAEAAADs/wYAAAACAAEAAADs/wcAAAACAAEAAADs/wgAAAACAAEAAADs/wkAAAACAAEAAADs/woAAAACAAEAAADs/wsAAAACAAEAAADs/wwAAAACAAEAAADs/w0AAAACAAEAAADs/w4AAAACAAEAAADs/w8AAAACAAEAAADs/xAAAAACAAEAAADs/xEAAAACAAEAAADs/xIAAAACAAEAAADs/xMAAAACAAEAAADs/xQAAAACAAEAAADs/xUAAAACAAEAAADs/xYAAAACAAEAAADs/xcAAAACAAEAAADs/xgAAAACAAEAAADs/xkAAAACAAEAAADs/xoAAAACAAEAAADs/xsAAAACAAEAAADs/xwAAAACAAEAAADs/x0AAAACAAEAAADs/x4AAAACAAEAAADs/x8AAAACAAEAAADs/yAAAAACAAEAAADs/yEAAAACAAEAAADs/yIAAAACAAEAAADs/yMAAAACAAEAAADs/yQAAAACAAEAAADs/yUAAAACAAEAAADs/yYAAAACAAEAAADs/ycAAAACAAEAAADs/ygAAAACAAEAAADs/ykAAAACAAEAAADs/yoAAAACAAEAAADs/ysAAAACAAEAAADs/ywAAAACAAEAAADs/y0AAAACAAEAAADs/y4AAAACAAEAAADs/y8AAAACAAEAAADs/zAAAAACAAEAAADs/zEAAAACAAEAAADs/zIAAAACAAEAAADs/zMAAAACAAEAAADs/zQAAAACAAEAAADs/zUAAAACAAEAAADs/zYAAAACAAEAAADs/zcAAAACAAEAAADs/zgAAAACAAEAAADt//T/AAACAAEAAADt//X/AAACAAEAAADt//b/AAACAAEAAADt//f/AAACAAEAAADt//j/AAACAAEAAADt//n/AAACAAEAAADt//r/AAACAAEAAADt//v/AAACAAEAAADt//z/AAACAAEAAADt//3/AAACAAEAAADt//7/AAACAAEAAADt////AAACAAEAAADt/wAAAAACAAEAAADt/wEAAAACAAEAAADt/wIAAAACAAEAAADt/wMAAAACAAEAAADt/wQAAAACAAEAAADt/wUAAAACAAEAAADt/wYAAAACAAEAAADt/wcAAAACAAEAAADt/wgAAAACAAEAAADt/wkAAAACAAEAAADt/woAAAACAAEAAADt/wsAAAACAAEAAADt/wwAAAACAAEAAADt/w0AAAACAAEAAADt/w4AAAACAAEAAADt/w8AAAACAAEAAADt/xAAAAACAAEAAADt/xEAAAACAAEAAADt/xIAAAACAAEAAADt/xMAAAACAAEAAADt/xQAAAACAAEAAADt/xUAAAACAAEAAADt/xYAAAACAAEAAADt/xcAAAACAAEAAADt/xgAAAACAAEAAADt/xkAAAACAAEAAADt/xoAAAACAAEAAADt/xsAAAACAAEAAADt/xwAAAACAAEAAADt/x0AAAACAAEAAADt/x4AAAACAAEAAADt/x8AAAACAAEAAADt/yAAAAACAAEAAADt/yEAAAACAAEAAADt/yIAAAACAAEAAADt/yMAAAACAAEAAADt/yQAAAACAAEAAADt/yUAAAACAAEAAADt/yYAAAACAAEAAADt/ycAAAACAAEAAADt/ygAAAACAAEAAADt/ykAAAACAAEAAADt/yoAAAACAAEAAADt/ysAAAACAAEAAADt/ywAAAACAAEAAADt/y0AAAACAAEAAADt/y4AAAACAAEAAADt/y8AAAACAAEAAADt/zAAAAACAAEAAADt/zEAAAACAAEAAADt/zIAAAACAAEAAADt/zMAAAACAAEAAADt/zQAAAACAAEAAADt/zUAAAACAAEAAADt/zYAAAACAAEAAADt/zcAAAACAAEAAADt/zgAAAACAAEAAADu//T/AAACAAEAAADu//X/AAACAAEAAADu//b/AAACAAEAAADu//f/AAACAAEAAADu//j/AAACAAEAAADu//n/AAACAAEAAADu//r/AAACAAEAAADu//v/AAACAAEAAADu//z/AAACAAEAAADu//3/AAACAAEAAADu//7/AAACAAEAAADu////AAACAAEAAADu/wAAAAACAAEAAADu/wEAAAACAAEAAADu/wIAAAACAAEAAADu/wMAAAACAAEAAADu/wQAAAACAAEAAADu/wUAAAACAAEAAADu/wYAAAACAAEAAADu/wcAAAACAAEAAADu/wgAAAACAAEAAADu/wkAAAACAAEAAADu/woAAAACAAEAAADu/wsAAAACAAEAAADu/wwAAAACAAEAAADu/w0AAAACAAEAAADu/w4AAAACAAEAAADu/w8AAAACAAEAAADu/xAAAAACAAEAAADu/xEAAAACAAEAAADu/xIAAAACAAEAAADu/xMAAAACAAEAAADu/xQAAAACAAEAAADu/xUAAAACAAEAAADu/xYAAAACAAEAAADu/xcAAAACAAEAAADu/xgAAAACAAEAAADu/xkAAAACAAEAAADu/xoAAAACAAEAAADu/xsAAAACAAEAAADu/xwAAAACAAEAAADu/x0AAAACAAEAAADu/x4AAAACAAEAAADu/x8AAAACAAEAAADu/yAAAAACAAEAAADu/yEAAAACAAEAAADu/yIAAAACAAEAAADu/yMAAAACAAEAAADu/yQAAAACAAEAAADu/yUAAAACAAEAAADu/yYAAAACAAEAAADu/ycAAAACAAEAAADu/ygAAAACAAEAAADu/ykAAAACAAEAAADu/yoAAAACAAEAAADu/ysAAAACAAEAAADu/ywAAAACAAEAAADu/y0AAAACAAEAAADu/y4AAAACAAEAAADu/y8AAAACAAEAAADu/zAAAAACAAEAAADu/zEAAAACAAEAAADu/zIAAAACAAEAAADu/zMAAAACAAEAAADu/zQAAAACAAEAAADu/zUAAAACAAEAAADu/zYAAAACAAEAAADu/zcAAAACAAEAAADu/zgAAAACAAEAAADv//T/AAACAAEAAADv//X/AAACAAEAAADv//b/AAACAAEAAADv//f/AAACAAEAAADv//j/AAACAAEAAADv//n/AAACAAEAAADv//r/AAACAAEAAADv//v/AAACAAEAAADv//z/AAACAAEAAADv//3/AAACAAEAAADv//7/AAACAAEAAADv////AAACAAEAAADv/wAAAAACAAEAAADv/wEAAAACAAEAAADv/wIAAAACAAEAAADv/wMAAAACAAEAAADv/wQAAAACAAEAAADv/wUAAAACAAEAAADv/wYAAAACAAEAAADv/wcAAAACAAEAAADv/wgAAAACAAEAAADv/wkAAAACAAEAAADv/woAAAACAAEAAADv/wsAAAACAAEAAADv/wwAAAACAAEAAADv/w0AAAACAAEAAADv/w4AAAACAAEAAADv/w8AAAACAAEAAADv/xAAAAACAAEAAADv/xEAAAACAAEAAADv/xIAAAACAAEAAADv/xMAAAACAAEAAADv/xQAAAACAAEAAADv/xUAAAACAAEAAADv/xYAAAACAAEAAADv/xcAAAACAAEAAADv/xgAAAACAAEAAADv/xkAAAACAAEAAADv/xoAAAACAAEAAADv/xsAAAACAAEAAADv/xwAAAACAAEAAADv/x0AAAACAAEAAADv/x4AAAACAAEAAADv/x8AAAACAAEAAADv/yAAAAACAAEAAADv/yEAAAACAAEAAADv/yIAAAACAAEAAADv/yMAAAACAAEAAADv/yQAAAACAAEAAADv/yUAAAACAAEAAADv/yYAAAACAAEAAADv/ycAAAACAAEAAADv/ygAAAACAAEAAADv/ykAAAACAAEAAADv/yoAAAACAAEAAADv/ysAAAACAAEAAADv/ywAAAACAAEAAADv/y0AAAACAAEAAADv/y4AAAACAAEAAADv/y8AAAACAAEAAADv/zAAAAACAAEAAADv/zEAAAACAAEAAADv/zIAAAACAAEAAADv/zMAAAACAAEAAADv/zQAAAACAAEAAADv/zUAAAACAAEAAADv/zYAAAACAAEAAADv/zcAAAACAAEAAADv/zgAAAACAAEAAADw//T/AAACAAEAAADw//X/AAACAAEAAADw//b/AAACAAEAAADw//f/AAACAAEAAADw//j/AAACAAEAAADw//n/AAACAAEAAADw//r/AAACAAEAAADw//v/AAACAAEAAADw//z/AAACAAEAAADw//3/AAACAAEAAADw//7/AAACAAEAAADw////AAACAAEAAADw/wAAAAACAAEAAADw/wEAAAACAAEAAADw/wIAAAACAAEAAADw/wMAAAACAAEAAADw/wQAAAACAAEAAADw/wUAAAACAAEAAADw/wYAAAACAAEAAADw/wcAAAACAAEAAADw/wgAAAACAAEAAADw/wkAAAACAAEAAADw/woAAAACAAEAAADw/wsAAAACAAEAAADw/wwAAAACAAEAAADw/w0AAAACAAEAAADw/w4AAAACAAEAAADw/w8AAAACAAEAAADw/xAAAAACAAEAAADw/xEAAAACAAEAAADw/xIAAAACAAEAAADw/xMAAAACAAEAAADw/xQAAAACAAEAAADw/xUAAAACAAEAAADw/xYAAAACAAEAAADw/xcAAAACAAEAAADw/xgAAAACAAEAAADw/xkAAAACAAEAAADw/xoAAAACAAEAAADw/xsAAAACAAEAAADw/xwAAAACAAEAAADw/x0AAAACAAEAAADw/x4AAAACAAEAAADw/x8AAAACAAEAAADw/yAAAAACAAEAAADw/yEAAAACAAEAAADw/yIAAAACAAEAAADw/yMAAAACAAEAAADw/yQAAAACAAEAAADw/yUAAAACAAEAAADw/yYAAAACAAEAAADw/ycAAAACAAEAAADw/ygAAAACAAEAAADw/ykAAAACAAEAAADw/yoAAAACAAEAAADw/ysAAAACAAEAAADw/ywAAAACAAEAAADw/y0AAAACAAEAAADw/y4AAAACAAEAAADw/y8AAAACAAEAAADw/zAAAAACAAEAAADw/zEAAAACAAEAAADw/zIAAAACAAEAAADw/zMAAAACAAEAAADw/zQAAAACAAEAAADw/zUAAAACAAEAAADw/zYAAAACAAEAAADw/zcAAAACAAEAAADw/zgAAAACAAEAAADx//T/AAACAAEAAADx//X/AAACAAEAAADx//b/AAACAAEAAADx//f/AAACAAEAAADx//j/AAACAAEAAADx//n/AAACAAEAAADx//r/AAACAAEAAADx//v/AAACAAEAAADx//z/AAACAAEAAADx//3/AAACAAEAAADx//7/AAACAAEAAADx////AAACAAEAAADx/wAAAAACAAEAAADx/wEAAAACAAEAAADx/wIAAAACAAEAAADx/wMAAAACAAEAAADx/wQAAAACAAEAAADx/wUAAAACAAEAAADx/wYAAAACAAEAAADx/wcAAAACAAEAAADx/wgAAAACAAEAAADx/wkAAAACAAEAAADx/woAAAACAAEAAADx/wsAAAACAAEAAADx/wwAAAACAAEAAADx/w0AAAACAAEAAADx/w4AAAACAAEAAADx/w8AAAACAAEAAADx/xAAAAACAAEAAADx/xEAAAACAAEAAADx/xIAAAACAAEAAADx/xMAAAACAAEAAADx/xQAAAACAAEAAADx/xUAAAACAAEAAADx/xYAAAACAAEAAADx/xcAAAACAAEAAADx/xgAAAACAAEAAADx/xkAAAACAAEAAADx/xoAAAACAAEAAADx/xsAAAACAAEAAADx/xwAAAACAAEAAADx/x0AAAACAAEAAADx/x4AAAACAAEAAADx/x8AAAACAAEAAADx/yAAAAACAAEAAADx/yEAAAACAAEAAADx/yIAAAACAAEAAADx/yMAAAACAAEAAADx/yQAAAACAAEAAADx/yUAAAACAAEAAADx/yYAAAACAAEAAADx/ycAAAACAAEAAADx/ygAAAACAAEAAADx/ykAAAACAAEAAADx/yoAAAACAAEAAADx/ysAAAACAAEAAADx/ywAAAACAAEAAADx/y0AAAACAAEAAADx/y4AAAACAAEAAADx/y8AAAACAAEAAADx/zAAAAACAAEAAADx/zEAAAACAAEAAADx/zIAAAACAAEAAADx/zMAAAACAAEAAADx/zQAAAACAAEAAADx/zUAAAACAAEAAADx/zYAAAACAAEAAADx/zcAAAACAAEAAADx/zgAAAACAAEAAADy//T/AAACAAEAAADy//X/AAACAAEAAADy//b/AAACAAEAAADy//f/AAACAAEAAADy//j/AAACAAEAAADy//n/AAACAAEAAADy//r/AAACAAEAAADy//v/AAACAAEAAADy//z/AAACAAEAAADy//3/AAACAAEAAADy//7/AAACAAEAAADy////AAACAAEAAADy/wAAAAACAAEAAADy/wEAAAACAAEAAADy/wIAAAACAAEAAADy/wMAAAACAAEAAADy/wQAAAACAAEAAADy/wUAAAACAAEAAADy/wYAAAACAAEAAADy/wcAAAACAAEAAADy/wgAAAACAAEAAADy/wkAAAACAAEAAADy/woAAAACAAEAAADy/wsAAAACAAEAAADy/wwAAAACAAEAAADy/w0AAAACAAEAAADy/w4AAAACAAEAAADy/w8AAAACAAEAAADy/xAAAAACAAEAAADy/xEAAAACAAEAAADy/xIAAAACAAEAAADy/xMAAAACAAEAAADy/xQAAAACAAEAAADy/xUAAAACAAEAAADy/xYAAAACAAEAAADy/xcAAAACAAEAAADy/xgAAAACAAEAAADy/xkAAAACAAEAAADy/xoAAAACAAEAAADy/xsAAAACAAEAAADy/xwAAAACAAEAAADy/x0AAAACAAEAAADy/x4AAAACAAEAAADy/x8AAAACAAEAAADy/yAAAAACAAEAAADy/yEAAAACAAEAAADy/yIAAAACAAEAAADy/yMAAAACAAEAAADy/yQAAAACAAEAAADy/yUAAAACAAEAAADy/yYAAAACAAEAAADy/ycAAAACAAEAAADy/ygAAAACAAEAAADy/ykAAAACAAEAAADy/yoAAAACAAEAAADy/ysAAAACAAEAAADy/ywAAAACAAEAAADy/y0AAAACAAEAAADy/y4AAAACAAEAAADy/y8AAAACAAEAAADy/zAAAAACAAEAAADy/zEAAAACAAEAAADy/zIAAAACAAEAAADy/zMAAAACAAEAAADy/zQAAAACAAEAAADy/zUAAAACAAEAAADy/zYAAAACAAEAAADy/zcAAAACAAEAAADy/zgAAAACAAEAAADz//T/AAACAAEAAADz//X/AAACAAEAAADz//b/AAACAAEAAADz//f/AAACAAEAAADz//j/AAACAAEAAADz//n/AAACAAEAAADz//r/AAACAAEAAADz//v/AAACAAEAAADz//z/AAACAAEAAADz//3/AAACAAEAAADz//7/AAACAAEAAADz////AAACAAEAAADz/wAAAAACAAEAAADz/wEAAAACAAEAAADz/wIAAAACAAEAAADz/wMAAAACAAEAAADz/wQAAAACAAEAAADz/wUAAAACAAEAAADz/wYAAAACAAEAAADz/wcAAAACAAEAAADz/wgAAAACAAEAAADz/wkAAAACAAEAAADz/woAAAACAAEAAADz/wsAAAACAAEAAADz/wwAAAACAAEAAADz/w0AAAACAAEAAADz/w4AAAACAAEAAADz/w8AAAACAAEAAADz/xAAAAACAAEAAADz/xEAAAACAAEAAADz/xIAAAACAAEAAADz/xMAAAACAAEAAADz/xQAAAACAAEAAADz/xUAAAACAAEAAADz/xYAAAACAAEAAADz/xcAAAACAAEAAADz/xgAAAACAAEAAADz/xkAAAACAAEAAADz/xoAAAACAAEAAADz/xsAAAACAAEAAADz/xwAAAACAAEAAADz/x0AAAACAAEAAADz/x4AAAACAAEAAADz/x8AAAACAAEAAADz/yAAAAACAAEAAADz/yEAAAACAAEAAADz/yIAAAACAAEAAADz/yMAAAACAAEAAADz/yQAAAACAAEAAADz/yUAAAACAAEAAADz/yYAAAACAAEAAADz/ycAAAACAAEAAADz/ygAAAACAAEAAADz/ykAAAACAAEAAADz/yoAAAACAAEAAADz/ysAAAACAAEAAADz/ywAAAACAAEAAADz/y0AAAACAAEAAADz/y4AAAACAAEAAADz/y8AAAACAAEAAADz/zAAAAACAAEAAADz/zEAAAACAAEAAADz/zIAAAACAAEAAADz/zMAAAACAAEAAADz/zQAAAACAAEAAADz/zUAAAACAAEAAADz/zYAAAACAAEAAADz/zcAAAACAAEAAADz/zgAAAACAAEAAAD0//T/AAACAAEAAAD0//X/AAACAAEAAAD0//b/AAACAAEAAAD0//f/AAACAAEAAAD0//j/AAACAAEAAAD0//n/AAACAAEAAAD0//r/AAACAAEAAAD0//v/AAACAAEAAAD0//z/AAACAAEAAAD0//3/AAACAAEAAAD0//7/AAACAAEAAAD0/wAAAAACAAEAAAD0/wEAAAACAAEAAAD0/wIAAAACAAEAAAD0/wMAAAACAAEAAAD0/wQAAAACAAEAAAD0/wUAAAACAAEAAAD0/wYAAAACAAEAAAD0/wcAAAACAAEAAAD0/wgAAAACAAEAAAD0/wkAAAACAAEAAAD0/woAAAACAAEAAAD0/wsAAAACAAEAAAD0/wwAAAACAAEAAAD0/w0AAAACAAEAAAD0/w4AAAACAAEAAAD0/w8AAAACAAEAAAD0/xAAAAACAAEAAAD0/xEAAAACAAEAAAD0/xIAAAACAAEAAAD0/xMAAAACAAEAAAD0/xQAAAACAAEAAAD0/xUAAAACAAEAAAD0/xYAAAACAAEAAAD0/xcAAAACAAEAAAD0/xgAAAACAAEAAAD0/xkAAAACAAEAAAD0/xoAAAACAAEAAAD0/xsAAAACAAEAAAD0/xwAAAACAAEAAAD0/x0AAAACAAEAAAD0/x4AAAACAAEAAAD0/x8AAAACAAEAAAD0/yAAAAACAAEAAAD0/yEAAAACAAEAAAD0/yIAAAACAAEAAAD0/yMAAAACAAEAAAD0/yQAAAACAAEAAAD0/yUAAAACAAEAAAD0/yYAAAACAAEAAAD0/ycAAAACAAEAAAD0/ygAAAACAAEAAAD0/ykAAAACAAEAAAD0/yoAAAACAAEAAAD0/ysAAAACAAEAAAD0/ywAAAACAAEAAAD0/y0AAAACAAEAAAD0/y4AAAACAAEAAAD0/y8AAAACAAEAAAD0/zAAAAACAAEAAAD0/zEAAAACAAEAAAD0/zIAAAACAAEAAAD0/zMAAAACAAEAAAD0/zQAAAACAAEAAAD0/zUAAAACAAEAAAD0/zYAAAACAAEAAAD0/zcAAAACAAEAAAD0/zgAAAACAAEAAAD1//T/AAACAAEAAAD1//X/AAACAAEAAAD1//b/AAACAAEAAAD1//f/AAACAAEAAAD1//j/AAACAAEAAAD1//n/AAACAAEAAAD1//r/AAACAAEAAAD1//v/AAACAAEAAAD1//z/AAACAAEAAAD1//3/AAACAAEAAAD1//7/AAACAAEAAAD1/wEAAAACAAEAAAD1/wIAAAACAAEAAAD1/wMAAAACAAEAAAD1/wQAAAACAAEAAAD1/wUAAAACAAEAAAD1/wYAAAACAAEAAAD1/wcAAAACAAEAAAD1/wgAAAACAAEAAAD1/wkAAAACAAEAAAD1/woAAAACAAEAAAD1/wsAAAACAAEAAAD1/wwAAAACAAEAAAD1/w0AAAACAAEAAAD1/w4AAAACAAEAAAD1/w8AAAACAAEAAAD1/xAAAAACAAEAAAD1/xEAAAACAAEAAAD1/xIAAAACAAEAAAD1/xMAAAACAAEAAAD1/xQAAAACAAEAAAD1/xUAAAACAAEAAAD1/xYAAAACAAEAAAD1/xcAAAACAAEAAAD1/xgAAAACAAEAAAD1/xkAAAACAAEAAAD1/xoAAAACAAEAAAD1/xsAAAACAAEAAAD1/xwAAAACAAEAAAD1/x0AAAACAAEAAAD1/x4AAAACAAEAAAD1/x8AAAACAAEAAAD1/yAAAAACAAEAAAD1/yEAAAACAAEAAAD1/yIAAAACAAEAAAD1/yMAAAACAAEAAAD1/yQAAAACAAEAAAD1/yUAAAACAAEAAAD1/yYAAAACAAEAAAD1/ycAAAACAAEAAAD1/ygAAAACAAEAAAD1/ykAAAACAAEAAAD1/yoAAAACAAEAAAD1/ysAAAACAAEAAAD1/ywAAAACAAEAAAD1/y0AAAACAAEAAAD1/y4AAAACAAEAAAD1/y8AAAACAAEAAAD1/zAAAAACAAEAAAD1/zEAAAACAAEAAAD1/zIAAAACAAEAAAD1/zMAAAACAAEAAAD1/zQAAAACAAEAAAD1/zUAAAACAAEAAAD1/zYAAAACAAEAAAD1/zcAAAACAAEAAAD1/zgAAAACAAEAAAD2//T/AAACAAEAAAD2//X/AAACAAEAAAD2//b/AAACAAEAAAD2//f/AAACAAEAAAD2//j/AAACAAEAAAD2//n/AAACAAEAAAD2//r/AAACAAEAAAD2//v/AAACAAEAAAD2//z/AAACAAEAAAD2//3/AAACAAEAAAD2//7/AAACAAEAAAD2////AAACAAEAAAD2/wIAAAACAAEAAAD2/wMAAAACAAEAAAD2/wQAAAACAAEAAAD2/wUAAAACAAEAAAD2/wYAAAACAAEAAAD2/wcAAAACAAEAAAD2/wgAAAACAAEAAAD2/wkAAAACAAEAAAD2/woAAAACAAEAAAD2/wsAAAACAAEAAAD2/wwAAAACAAEAAAD2/w0AAAACAAEAAAD2/w4AAAACAAEAAAD2/w8AAAACAAEAAAD2/xAAAAACAAEAAAD2/xEAAAACAAEAAAD2/xIAAAACAAEAAAD2/xMAAAACAAEAAAD2/xQAAAACAAEAAAD2/xUAAAACAAEAAAD2/xYAAAACAAEAAAD2/xcAAAACAAEAAAD2/xgAAAACAAEAAAD2/xkAAAACAAEAAAD2/xoAAAACAAEAAAD2/xsAAAACAAEAAAD2/xwAAAACAAEAAAD2/x0AAAACAAEAAAD2/x4AAAACAAEAAAD2/x8AAAACAAEAAAD2/yAAAAACAAEAAAD2/yEAAAACAAEAAAD2/yIAAAACAAEAAAD2/yMAAAACAAEAAAD2/yQAAAACAAEAAAD2/yUAAAACAAEAAAD2/yYAAAACAAEAAAD2/ycAAAACAAEAAAD2/ygAAAACAAEAAAD2/ykAAAACAAEAAAD2/yoAAAACAAEAAAD2/ysAAAACAAEAAAD2/ywAAAACAAEAAAD2/y0AAAACAAEAAAD2/y4AAAACAAEAAAD2/y8AAAACAAEAAAD2/zAAAAACAAEAAAD2/zEAAAACAAEAAAD2/zIAAAACAAEAAAD2/zMAAAACAAEAAAD2/zQAAAACAAEAAAD2/zUAAAACAAEAAAD2/zYAAAACAAEAAAD2/zcAAAACAAEAAAD2/zgAAAACAAEAAAD3//T/AAACAAEAAAD3//X/AAACAAEAAAD3//b/AAACAAEAAAD3//f/AAACAAEAAAD3//j/AAACAAEAAAD3//n/AAACAAEAAAD3//r/AAACAAEAAAD3//v/AAACAAEAAAD3//z/AAACAAEAAAD3//3/AAACAAEAAAD3//7/AAACAAEAAAD3////AAACAAEAAAD3/wAAAAACAAEAAAD3/wEAAAACAAEAAAD3/wMAAAACAAEAAAD3/wQAAAACAAEAAAD3/wUAAAACAAEAAAD3/wYAAAACAAEAAAD3/wcAAAACAAEAAAD3/wgAAAACAAEAAAD3/wkAAAACAAEAAAD3/woAAAACAAEAAAD3/wsAAAACAAEAAAD3/wwAAAACAAEAAAD3/w0AAAACAAEAAAD3/w4AAAACAAEAAAD3/w8AAAACAAEAAAD3/xAAAAACAAEAAAD3/xEAAAACAAEAAAD3/xIAAAACAAEAAAD3/xMAAAACAAEAAAD3/xQAAAACAAEAAAD3/xUAAAACAAEAAAD3/xYAAAACAAEAAAD3/xcAAAACAAEAAAD3/xgAAAACAAEAAAD3/xkAAAACAAEAAAD3/xoAAAACAAEAAAD3/xsAAAACAAEAAAD3/xwAAAACAAEAAAD3/x0AAAACAAEAAAD3/x4AAAACAAEAAAD3/x8AAAACAAEAAAD3/yAAAAACAAEAAAD3/yEAAAACAAEAAAD3/yIAAAACAAEAAAD3/yMAAAACAAEAAAD3/yQAAAACAAEAAAD3/yUAAAACAAEAAAD3/yYAAAACAAEAAAD3/ycAAAACAAEAAAD3/ygAAAACAAEAAAD3/ykAAAACAAEAAAD3/yoAAAACAAEAAAD3/ysAAAACAAEAAAD3/ywAAAACAAEAAAD3/y0AAAACAAEAAAD3/y4AAAACAAEAAAD3/y8AAAACAAEAAAD3/zAAAAACAAEAAAD3/zEAAAACAAEAAAD3/zIAAAACAAEAAAD3/zMAAAACAAEAAAD3/zQAAAACAAEAAAD3/zUAAAACAAEAAAD3/zYAAAACAAEAAAD3/zcAAAACAAEAAAD3/zgAAAACAAEAAAD4//T/AAACAAEAAAD4//X/AAACAAEAAAD4//b/AAACAAEAAAD4//f/AAACAAEAAAD4//j/AAACAAEAAAD4//n/AAACAAEAAAD4//r/AAACAAEAAAD4//v/AAACAAEAAAD4//z/AAACAAEAAAD4//3/AAACAAEAAAD4//7/AAACAAEAAAD4////AAACAAEAAAD4/wAAAAACAAEAAAD4/wEAAAACAAEAAAD4/wIAAAACAAEAAAD4/wUAAAACAAEAAAD4/wYAAAACAAEAAAD4/wcAAAACAAEAAAD4/wgAAAACAAEAAAD4/wkAAAACAAEAAAD4/woAAAACAAEAAAD4/wsAAAACAAEAAAD4/wwAAAACAAEAAAD4/w0AAAACAAEAAAD4/w4AAAACAAEAAAD4/w8AAAACAAEAAAD4/xAAAAACAAEAAAD4/xEAAAACAAEAAAD4/xIAAAACAAEAAAD4/xMAAAACAAEAAAD4/xQAAAACAAEAAAD4/xUAAAACAAEAAAD4/xYAAAACAAEAAAD4/xcAAAACAAEAAAD4/xgAAAACAAEAAAD4/xkAAAACAAEAAAD4/xoAAAACAAEAAAD4/xsAAAACAAEAAAD4/xwAAAACAAEAAAD4/x0AAAACAAEAAAD4/x4AAAACAAEAAAD4/x8AAAACAAEAAAD4/yAAAAACAAEAAAD4/yEAAAACAAEAAAD4/yIAAAACAAEAAAD4/yMAAAACAAEAAAD4/yQAAAACAAEAAAD4/yUAAAACAAEAAAD4/yYAAAACAAEAAAD4/ycAAAACAAEAAAD4/ygAAAACAAEAAAD4/ykAAAACAAEAAAD4/yoAAAACAAEAAAD4/ysAAAACAAEAAAD4/ywAAAACAAEAAAD4/y0AAAACAAEAAAD4/y4AAAACAAEAAAD4/y8AAAACAAEAAAD4/zAAAAACAAEAAAD4/zEAAAACAAEAAAD4/zIAAAACAAEAAAD4/zMAAAACAAEAAAD4/zQAAAACAAEAAAD4/zUAAAACAAEAAAD4/zYAAAACAAEAAAD4/zcAAAACAAEAAAD4/zgAAAACAAEAAAD5//T/AAACAAEAAAD5//X/AAACAAEAAAD5//b/AAACAAEAAAD5//f/AAACAAEAAAD5//j/AAACAAEAAAD5//n/AAACAAEAAAD5//r/AAACAAEAAAD5//v/AAACAAEAAAD5//z/AAACAAEAAAD5//3/AAACAAEAAAD5//7/AAACAAEAAAD5////AAACAAEAAAD5/wAAAAACAAEAAAD5/wEAAAACAAEAAAD5/wIAAAACAAEAAAD5/wMAAAACAAEAAAD5/wQAAAACAAEAAAD5/wYAAAACAAEAAAD5/wcAAAACAAEAAAD5/wgAAAACAAEAAAD5/wkAAAACAAEAAAD5/woAAAACAAEAAAD5/wsAAAACAAEAAAD5/wwAAAACAAEAAAD5/w0AAAACAAEAAAD5/w4AAAACAAEAAAD5/w8AAAACAAEAAAD5/xAAAAACAAEAAAD5/xEAAAACAAEAAAD5/xIAAAACAAEAAAD5/xMAAAACAAEAAAD5/xQAAAACAAEAAAD5/xUAAAACAAEAAAD5/xYAAAACAAEAAAD5/xcAAAACAAEAAAD5/xgAAAACAAEAAAD5/xkAAAACAAEAAAD5/xoAAAACAAEAAAD5/xsAAAACAAEAAAD5/xwAAAACAAEAAAD5/x0AAAACAAEAAAD5/x4AAAACAAEAAAD5/x8AAAACAAEAAAD5/yAAAAACAAEAAAD5/yEAAAACAAEAAAD5/yIAAAACAAEAAAD5/yMAAAACAAEAAAD5/yQAAAACAAEAAAD5/yUAAAACAAEAAAD5/yYAAAACAAEAAAD5/ycAAAACAAEAAAD5/ygAAAACAAEAAAD5/ykAAAACAAEAAAD5/yoAAAACAAEAAAD5/ysAAAACAAEAAAD5/ywAAAACAAEAAAD5/y0AAAACAAEAAAD5/y4AAAACAAEAAAD5/y8AAAACAAEAAAD5/zAAAAACAAEAAAD5/zEAAAACAAEAAAD5/zIAAAACAAEAAAD5/zMAAAACAAEAAAD5/zQAAAACAAEAAAD5/zUAAAACAAEAAAD5/zYAAAACAAEAAAD5/zcAAAACAAEAAAD5/zgAAAACAAEAAAD6//T/AAACAAEAAAD6//X/AAACAAEAAAD6//b/AAACAAEAAAD6//f/AAACAAEAAAD6//j/AAACAAEAAAD6//n/AAACAAEAAAD6//r/AAACAAEAAAD6//v/AAACAAEAAAD6//z/AAACAAEAAAD6//3/AAACAAEAAAD6//7/AAACAAEAAAD6////AAACAAEAAAD6/wAAAAACAAEAAAD6/wEAAAACAAEAAAD6/wIAAAACAAEAAAD6/wMAAAACAAEAAAD6/wQAAAACAAEAAAD6/wUAAAACAAEAAAD6/wgAAAACAAEAAAD6/wkAAAACAAEAAAD6/woAAAACAAEAAAD6/wsAAAACAAEAAAD6/wwAAAACAAEAAAD6/w0AAAACAAEAAAD6/w4AAAACAAEAAAD6/w8AAAACAAEAAAD6/xAAAAACAAEAAAD6/xEAAAACAAEAAAD6/xIAAAACAAEAAAD6/xMAAAACAAEAAAD6/xQAAAACAAEAAAD6/xUAAAACAAEAAAD6/xYAAAACAAEAAAD6/xcAAAACAAEAAAD6/xgAAAACAAEAAAD6/xkAAAACAAEAAAD6/xoAAAACAAEAAAD6/xsAAAACAAEAAAD6/xwAAAACAAEAAAD6/x0AAAACAAEAAAD6/x4AAAACAAEAAAD6/x8AAAACAAEAAAD6/yAAAAACAAEAAAD6/yEAAAACAAEAAAD6/yIAAAACAAEAAAD6/yMAAAACAAEAAAD6/yQAAAACAAEAAAD6/yUAAAACAAEAAAD6/yYAAAACAAEAAAD6/ycAAAACAAEAAAD6/ygAAAACAAEAAAD6/ykAAAACAAEAAAD6/yoAAAACAAEAAAD6/ysAAAACAAEAAAD6/ywAAAACAAEAAAD6/y0AAAACAAEAAAD6/y4AAAACAAEAAAD6/y8AAAACAAEAAAD6/zAAAAACAAEAAAD6/zEAAAACAAEAAAD6/zIAAAACAAEAAAD6/zMAAAACAAEAAAD6/zQAAAACAAEAAAD6/zUAAAACAAEAAAD6/zYAAAACAAEAAAD6/zcAAAACAAEAAAD6/zgAAAACAAEAAAD7//T/AAACAAEAAAD7//X/AAACAAEAAAD7//b/AAACAAEAAAD7//f/AAACAAEAAAD7//j/AAACAAEAAAD7//n/AAACAAEAAAD7//r/AAACAAEAAAD7//v/AAACAAEAAAD7//z/AAACAAEAAAD7//3/AAACAAEAAAD7//7/AAACAAEAAAD7////AAACAAEAAAD7/wAAAAACAAEAAAD7/wEAAAACAAEAAAD7/wIAAAACAAEAAAD7/wMAAAACAAEAAAD7/wQAAAACAAEAAAD7/wUAAAACAAEAAAD7/wYAAAACAAEAAAD7/wcAAAACAAEAAAD7/wkAAAACAAEAAAD7/woAAAACAAEAAAD7/wsAAAACAAEAAAD7/wwAAAACAAEAAAD7/w0AAAACAAEAAAD7/w4AAAACAAEAAAD7/w8AAAACAAEAAAD7/xAAAAACAAEAAAD7/xEAAAACAAEAAAD7/xIAAAACAAEAAAD7/xMAAAACAAEAAAD7/xQAAAACAAEAAAD7/xUAAAACAAEAAAD7/xYAAAACAAEAAAD7/xcAAAACAAEAAAD7/xgAAAACAAEAAAD7/xkAAAACAAEAAAD7/xoAAAACAAEAAAD7/xsAAAACAAEAAAD7/xwAAAACAAEAAAD7/x0AAAACAAEAAAD7/x4AAAACAAEAAAD7/x8AAAACAAEAAAD7/yAAAAACAAEAAAD7/yEAAAACAAEAAAD7/yIAAAACAAEAAAD7/yMAAAACAAEAAAD7/yQAAAACAAEAAAD7/yUAAAACAAEAAAD7/yYAAAACAAEAAAD7/ycAAAACAAEAAAD7/ygAAAACAAEAAAD7/ykAAAACAAEAAAD7/yoAAAACAAEAAAD7/ysAAAACAAEAAAD7/ywAAAACAAEAAAD7/y0AAAACAAEAAAD7/y4AAAACAAEAAAD7/y8AAAACAAEAAAD7/zAAAAACAAEAAAD7/zEAAAACAAEAAAD7/zIAAAACAAEAAAD7/zMAAAACAAEAAAD7/zQAAAACAAEAAAD7/zUAAAACAAEAAAD7/zYAAAACAAEAAAD7/zcAAAACAAEAAAD7/zgAAAACAAEAAAD8//T/AAACAAEAAAD8//X/AAACAAEAAAD8//b/AAACAAEAAAD8//f/AAACAAEAAAD8//j/AAACAAEAAAD8//n/AAACAAEAAAD8//r/AAACAAEAAAD8//v/AAACAAEAAAD8//z/AAACAAEAAAD8//3/AAACAAEAAAD8//7/AAACAAEAAAD8////AAACAAEAAAD8/wAAAAACAAEAAAD8/wEAAAACAAEAAAD8/wIAAAACAAEAAAD8/wMAAAACAAEAAAD8/wQAAAACAAEAAAD8/wUAAAACAAEAAAD8/wYAAAACAAEAAAD8/wcAAAACAAEAAAD8/wgAAAACAAEAAAD8/woAAAACAAEAAAD8/wsAAAACAAEAAAD8/wwAAAACAAEAAAD8/w0AAAACAAEAAAD8/w4AAAACAAEAAAD8/w8AAAACAAEAAAD8/xAAAAACAAEAAAD8/xEAAAACAAEAAAD8/xIAAAACAAEAAAD8/xMAAAACAAEAAAD8/xQAAAACAAEAAAD8/xUAAAACAAEAAAD8/xYAAAACAAEAAAD8/xcAAAACAAEAAAD8/xgAAAACAAEAAAD8/xkAAAACAAEAAAD8/xoAAAACAAEAAAD8/xsAAAACAAEAAAD8/xwAAAACAAEAAAD8/x0AAAACAAEAAAD8/x4AAAACAAEAAAD8/x8AAAACAAEAAAD8/yAAAAACAAEAAAD8/yEAAAACAAEAAAD8/yIAAAACAAEAAAD8/yMAAAACAAEAAAD8/yQAAAACAAEAAAD8/yUAAAACAAEAAAD8/yYAAAACAAEAAAD8/ycAAAACAAEAAAD8/ygAAAACAAEAAAD8/ykAAAACAAEAAAD8/yoAAAACAAEAAAD8/ysAAAACAAEAAAD8/ywAAAACAAEAAAD8/y0AAAACAAEAAAD8/y4AAAACAAEAAAD8/y8AAAACAAEAAAD8/zAAAAACAAEAAAD8/zEAAAACAAEAAAD8/zIAAAACAAEAAAD8/zMAAAACAAEAAAD8/zQAAAACAAEAAAD8/zUAAAACAAEAAAD8/zYAAAACAAEAAAD8/zcAAAACAAEAAAD8/zgAAAACAAEAAAD9//T/AAACAAEAAAD9//X/AAACAAEAAAD9//b/AAACAAEAAAD9//f/AAACAAEAAAD9//j/AAACAAEAAAD9//n/AAACAAEAAAD9//r/AAACAAEAAAD9//v/AAACAAEAAAD9//z/AAACAAEAAAD9//3/AAACAAEAAAD9//7/AAACAAEAAAD9////AAACAAEAAAD9/wAAAAACAAEAAAD9/wEAAAACAAEAAAD9/wIAAAACAAEAAAD9/wMAAAACAAEAAAD9/wQAAAACAAEAAAD9/wUAAAACAAEAAAD9/wYAAAACAAEAAAD9/wcAAAACAAEAAAD9/wgAAAACAAEAAAD9/wkAAAACAAEAAAD9/wsAAAACAAEAAAD9/wwAAAACAAEAAAD9/w0AAAACAAEAAAD9/w4AAAACAAEAAAD9/w8AAAACAAEAAAD9/xAAAAACAAEAAAD9/xEAAAACAAEAAAD9/xIAAAACAAEAAAD9/xMAAAACAAEAAAD9/xQAAAACAAEAAAD9/xUAAAACAAEAAAD9/xYAAAACAAEAAAD9/xcAAAACAAEAAAD9/xgAAAACAAEAAAD9/xkAAAACAAEAAAD9/xoAAAACAAEAAAD9/xsAAAACAAEAAAD9/xwAAAACAAEAAAD9/x0AAAACAAEAAAD9/x4AAAACAAEAAAD9/x8AAAACAAEAAAD9/yAAAAACAAEAAAD9/yEAAAACAAEAAAD9/yIAAAACAAEAAAD9/yMAAAACAAEAAAD9/yQAAAACAAEAAAD9/yUAAAACAAEAAAD9/yYAAAACAAEAAAD9/ycAAAACAAEAAAD9/ygAAAACAAEAAAD9/ykAAAACAAEAAAD9/yoAAAACAAEAAAD9/ysAAAACAAEAAAD9/ywAAAACAAEAAAD9/y0AAAACAAEAAAD9/y4AAAACAAEAAAD9/y8AAAACAAEAAAD9/zAAAAACAAEAAAD9/zEAAAACAAEAAAD9/zIAAAACAAEAAAD9/zMAAAACAAEAAAD9/zQAAAACAAEAAAD9/zUAAAACAAEAAAD9/zYAAAACAAEAAAD9/zcAAAACAAEAAAD9/zgAAAACAAEAAAD+//T/AAACAAEAAAD+//X/AAACAAEAAAD+//b/AAACAAEAAAD+//f/AAACAAEAAAD+//j/AAACAAEAAAD+//n/AAACAAEAAAD+//r/AAACAAEAAAD+//v/AAACAAEAAAD+//z/AAACAAEAAAD+//3/AAACAAEAAAD+//7/AAACAAEAAAD+////AAACAAEAAAD+/wAAAAACAAEAAAD+/wEAAAACAAEAAAD+/wIAAAACAAEAAAD+/wMAAAACAAEAAAD+/wQAAAACAAEAAAD+/wUAAAACAAEAAAD+/wYAAAACAAEAAAD+/wcAAAACAAEAAAD+/wgAAAACAAEAAAD+/wkAAAACAAEAAAD+/woAAAACAAEAAAD+/w0AAAACAAEAAAD+/w4AAAACAAEAAAD+/w8AAAACAAEAAAD+/xAAAAACAAEAAAD+/xEAAAACAAEAAAD+/xIAAAACAAEAAAD+/xMAAAACAAEAAAD+/xQAAAACAAEAAAD+/xUAAAACAAEAAAD+/xYAAAACAAEAAAD+/xcAAAACAAEAAAD+/xgAAAACAAEAAAD+/xkAAAACAAEAAAD+/xoAAAACAAEAAAD+/xsAAAACAAEAAAD+/xwAAAACAAEAAAD+/x0AAAACAAEAAAD+/x4AAAACAAEAAAD+/x8AAAACAAEAAAD+/yAAAAACAAEAAAD+/yEAAAACAAEAAAD+/yIAAAACAAEAAAD+/yMAAAACAAEAAAD+/yQAAAACAAEAAAD+/yUAAAACAAEAAAD+/yYAAAACAAEAAAD+/ycAAAACAAEAAAD+/ygAAAACAAEAAAD+/ykAAAACAAEAAAD+/yoAAAACAAEAAAD+/ysAAAACAAEAAAD+/ywAAAACAAEAAAD+/y0AAAACAAEAAAD+/y4AAAACAAEAAAD+/y8AAAACAAEAAAD+/zAAAAACAAEAAAD+/zEAAAACAAEAAAD+/zIAAAACAAEAAAD+/zMAAAACAAEAAAD+/zQAAAACAAEAAAD+/zUAAAACAAEAAAD+/zYAAAACAAEAAAD+/zcAAAACAAEAAAD+/zgAAAACAAEAAAD///T/AAACAAEAAAD///X/AAACAAEAAAD///b/AAACAAEAAAD///f/AAACAAEAAAD///j/AAACAAEAAAD///n/AAACAAEAAAD///r/AAACAAEAAAD///v/AAACAAEAAAD///z/AAACAAEAAAD///3/AAACAAEAAAD///7/AAACAAEAAAD/////AAACAAEAAAD//wAAAAACAAEAAAD//wEAAAACAAEAAAD//wIAAAACAAEAAAD//wMAAAACAAEAAAD//wQAAAACAAEAAAD//wUAAAACAAEAAAD//wYAAAACAAEAAAD//wcAAAACAAEAAAD//wgAAAACAAEAAAD//wkAAAACAAEAAAD//woAAAACAAEAAAD//wsAAAACAAEAAAD//wwAAAACAAEAAAD//w4AAAACAAEAAAD//w8AAAACAAEAAAD//xAAAAACAAEAAAD//xEAAAACAAEAAAD//xIAAAACAAEAAAD//xMAAAACAAEAAAD//xQAAAACAAEAAAD//xUAAAACAAEAAAD//xYAAAACAAEAAAD//xcAAAACAAEAAAD//xgAAAACAAEAAAD//xkAAAACAAEAAAD//xoAAAACAAEAAAD//xsAAAACAAEAAAD//xwAAAACAAEAAAD//x0AAAACAAEAAAD//x4AAAACAAEAAAD//x8AAAACAAEAAAD//yAAAAACAAEAAAD//yEAAAACAAEAAAD//yIAAAACAAEAAAD//yMAAAACAAEAAAD//yQAAAACAAEAAAD//yUAAAACAAEAAAD//yYAAAACAAEAAAD//ycAAAACAAEAAAD//ygAAAACAAEAAAD//ykAAAACAAEAAAD//yoAAAACAAEAAAD//ysAAAACAAEAAAD//ywAAAACAAEAAAD//y0AAAACAAEAAAD//y4AAAACAAEAAAD//y8AAAACAAEAAAD//zAAAAACAAEAAAD//zEAAAACAAEAAAD//zIAAAACAAEAAAD//zMAAAACAAEAAAD//zQAAAACAAEAAAD//zUAAAACAAEAAAD//zYAAAACAAEAAAD//zcAAAACAAEAAAD//zgAAAACAAEAAAAAAPT/AAACAAEAAAAAAPX/AAACAAEAAAAAAPb/AAACAAEAAAAAAPf/AAACAAEAAAAAAPj/AAACAAEAAAAAAPn/AAACAAEAAAAAAPr/AAACAAEAAAAAAPv/AAACAAEAAAAAAPz/AAACAAEAAAAAAP3/AAACAAEAAAAAAP7/AAACAAEAAAAAAP//AAACAAEAAAAAACkAAAACAAEAAAAAACoAAAACAAEAAAAAACsAAAACAAEAAAAAACwAAAACAAEAAAAAAC0AAAACAAEAAAAAAC4AAAACAAEAAAAAAC8AAAACAAEAAAAAADAAAAACAAEAAAAAADEAAAACAAEAAAAAADIAAAACAAEAAAAAADMAAAACAAEAAAAAADQAAAACAAEAAAAAADUAAAACAAEAAAAAADYAAAACAAEAAAAAADcAAAACAAEAAAAAADgAAAACAAEAAAABAPT/AAACAAEAAAABAPX/AAACAAEAAAABAPb/AAACAAEAAAABAPf/AAACAAEAAAABAPj/AAACAAEAAAABAPn/AAACAAEAAAABAPr/AAACAAEAAAABAPv/AAACAAEAAAABAPz/AAACAAEAAAABAP3/AAACAAEAAAABAP7/AAACAAEAAAABAP//AAACAAEAAAABACkAAAACAAEAAAABACoAAAACAAEAAAABACsAAAACAAEAAAABACwAAAACAAEAAAABAC0AAAACAAEAAAABAC4AAAACAAEAAAABAC8AAAACAAEAAAABADAAAAACAAEAAAABADEAAAACAAEAAAABADIAAAACAAEAAAABADMAAAACAAEAAAABADQAAAACAAEAAAABADUAAAACAAEAAAABADYAAAACAAEAAAABADcAAAACAAEAAAABADgAAAACAAEAAAACAPT/AAACAAEAAAACAPX/AAACAAEAAAACAPb/AAACAAEAAAACAPf/AAACAAEAAAACAPj/AAACAAEAAAACAPn/AAACAAEAAAACAPr/AAACAAEAAAACAPv/AAACAAEAAAACAPz/AAACAAEAAAACAP3/AAACAAEAAAACAP7/AAACAAEAAAACAP//AAACAAEAAAACACkAAAACAAEAAAACACoAAAACAAEAAAACACsAAAACAAEAAAACACwAAAACAAEAAAACAC0AAAACAAEAAAACAC4AAAACAAEAAAACAC8AAAACAAEAAAACADAAAAACAAEAAAACADEAAAACAAEAAAACADIAAAACAAEAAAACADMAAAACAAEAAAACADQAAAACAAEAAAACADUAAAACAAEAAAACADYAAAACAAEAAAACADcAAAACAAEAAAACADgAAAACAAEAAAADAPT/AAACAAEAAAADAPX/AAACAAEAAAADAPb/AAACAAEAAAADAPf/AAACAAEAAAADAPj/AAACAAEAAAADAPn/AAACAAEAAAADAPr/AAACAAEAAAADAPv/AAACAAEAAAADAPz/AAACAAEAAAADAP3/AAACAAEAAAADAP7/AAACAAEAAAADAP//AAACAAEAAAADACkAAAACAAEAAAADACoAAAACAAEAAAADACsAAAACAAEAAAADACwAAAACAAEAAAADAC0AAAACAAEAAAADAC4AAAACAAEAAAADAC8AAAACAAEAAAADADAAAAACAAEAAAADADEAAAACAAEAAAADADIAAAACAAEAAAADADMAAAACAAEAAAADADQAAAACAAEAAAADADUAAAACAAEAAAADADYAAAACAAEAAAADADcAAAACAAEAAAADADgAAAACAAEAAAAEAPT/AAACAAEAAAAEAPX/AAACAAEAAAAEAPb/AAACAAEAAAAEAPf/AAACAAEAAAAEAPj/AAACAAEAAAAEAPn/AAACAAEAAAAEAPr/AAACAAEAAAAEAPv/AAACAAEAAAAEAPz/AAACAAEAAAAEAP3/AAACAAEAAAAEAP7/AAACAAEAAAAEAP//AAACAAEAAAAEACkAAAACAAEAAAAEACoAAAACAAEAAAAEACsAAAACAAEAAAAEACwAAAACAAEAAAAEAC0AAAACAAEAAAAEAC4AAAACAAEAAAAEAC8AAAACAAEAAAAEADAAAAACAAEAAAAEADEAAAACAAEAAAAEADIAAAACAAEAAAAEADMAAAACAAEAAAAEADQAAAACAAEAAAAEADUAAAACAAEAAAAEADYAAAACAAEAAAAEADcAAAACAAEAAAAEADgAAAACAAEAAAAFAPT/AAACAAEAAAAFAPX/AAACAAEAAAAFAPb/AAACAAEAAAAFAPf/AAACAAEAAAAFAPj/AAACAAEAAAAFAPn/AAACAAEAAAAFAPr/AAACAAEAAAAFAPv/AAACAAEAAAAFAPz/AAACAAEAAAAFAP3/AAACAAEAAAAFAP7/AAACAAEAAAAFAP//AAACAAEAAAAFACkAAAACAAEAAAAFACoAAAACAAEAAAAFACsAAAACAAEAAAAFACwAAAACAAEAAAAFAC0AAAACAAEAAAAFAC4AAAACAAEAAAAFAC8AAAACAAEAAAAFADAAAAACAAEAAAAFADEAAAACAAEAAAAFADIAAAACAAEAAAAFADMAAAACAAEAAAAFADQAAAACAAEAAAAFADUAAAACAAEAAAAFADYAAAACAAEAAAAFADcAAAACAAEAAAAFADgAAAACAAEAAAAGAPT/AAACAAEAAAAGAPX/AAACAAEAAAAGAPb/AAACAAEAAAAGAPf/AAACAAEAAAAGAPj/AAACAAEAAAAGAPn/AAACAAEAAAAGAPr/AAACAAEAAAAGAPv/AAACAAEAAAAGAPz/AAACAAEAAAAGAP3/AAACAAEAAAAGAP7/AAACAAEAAAAGAP//AAACAAEAAAAGACkAAAACAAEAAAAGACoAAAACAAEAAAAGACsAAAACAAEAAAAGACwAAAACAAEAAAAGAC0AAAACAAEAAAAGAC4AAAACAAEAAAAGAC8AAAACAAEAAAAGADAAAAACAAEAAAAGADEAAAACAAEAAAAGADIAAAACAAEAAAAGADMAAAACAAEAAAAGADQAAAACAAEAAAAGADUAAAACAAEAAAAGADYAAAACAAEAAAAGADcAAAACAAEAAAAGADgAAAACAAEAAAAHAPT/AAACAAEAAAAHAPX/AAACAAEAAAAHAPb/AAACAAEAAAAHAPf/AAACAAEAAAAHAPj/AAACAAEAAAAHAPn/AAACAAEAAAAHAPr/AAACAAEAAAAHAPv/AAACAAEAAAAHAPz/AAACAAEAAAAHAP3/AAACAAEAAAAHAP7/AAACAAEAAAAHAP//AAACAAEAAAAHACkAAAACAAEAAAAHACoAAAACAAEAAAAHACsAAAACAAEAAAAHACwAAAACAAEAAAAHAC0AAAACAAEAAAAHAC4AAAACAAEAAAAHAC8AAAACAAEAAAAHADAAAAACAAEAAAAHADEAAAACAAEAAAAHADIAAAACAAEAAAAHADMAAAACAAEAAAAHADQAAAACAAEAAAAHADUAAAACAAEAAAAHADYAAAACAAEAAAAHADcAAAACAAEAAAAHADgAAAACAAEAAAAIACkAAAACAAEAAAAIACoAAAACAAEAAAAIACsAAAACAAEAAAAIACwAAAACAAEAAAAIAC0AAAACAAEAAAAIAC4AAAACAAEAAAAIAC8AAAACAAEAAAAIADAAAAACAAEAAAAIADEAAAACAAEAAAAIADIAAAACAAEAAAAIADMAAAACAAEAAAAIADQAAAACAAEAAAAIADUAAAACAAEAAAAIADYAAAACAAEAAAAIADcAAAACAAEAAAAIADgAAAACAAEAAAAJACkAAAACAAEAAAAJACoAAAACAAEAAAAJACsAAAACAAEAAAAJACwAAAACAAEAAAAJAC0AAAACAAEAAAAJAC4AAAACAAEAAAAJAC8AAAACAAEAAAAJADAAAAACAAEAAAAJADEAAAACAAEAAAAJADIAAAACAAEAAAAJADMAAAACAAEAAAAJADQAAAACAAEAAAAJADUAAAACAAEAAAAJADYAAAACAAEAAAAJADcAAAACAAEAAAAJADgAAAACAAEAAAAKACkAAAACAAEAAAAKACoAAAACAAEAAAAKACsAAAACAAEAAAAKACwAAAACAAEAAAAKAC0AAAACAAEAAAAKAC4AAAACAAEAAAAKAC8AAAACAAEAAAAKADAAAAACAAEAAAAKADEAAAACAAEAAAAKADIAAAACAAEAAAAKADMAAAACAAEAAAAKADQAAAACAAEAAAAKADUAAAACAAEAAAAKADYAAAACAAEAAAAKADcAAAACAAEAAAAKADgAAAACAAEAAAALACkAAAACAAEAAAALACoAAAACAAEAAAALACsAAAACAAEAAAALACwAAAACAAEAAAALAC0AAAACAAEAAAALAC4AAAACAAEAAAALAC8AAAACAAEAAAALADAAAAACAAEAAAALADEAAAACAAEAAAALADIAAAACAAEAAAALADMAAAACAAEAAAALADQAAAACAAEAAAALADUAAAACAAEAAAALADYAAAACAAEAAAALADcAAAACAAEAAAALADgAAAACAAEAAAAMACkAAAACAAEAAAAMACoAAAACAAEAAAAMACsAAAACAAEAAAAMACwAAAACAAEAAAAMAC0AAAACAAEAAAAMAC4AAAACAAEAAAAMAC8AAAACAAEAAAAMADAAAAACAAEAAAAMADEAAAACAAEAAAAMADIAAAACAAEAAAAMADMAAAACAAEAAAAMADQAAAACAAEAAAAMADUAAAACAAEAAAAMADYAAAACAAEAAAAMADcAAAACAAEAAAAMADgAAAACAAEAAAANACkAAAACAAEAAAANACoAAAACAAEAAAANACsAAAACAAEAAAANACwAAAACAAEAAAANAC0AAAACAAEAAAANAC4AAAACAAEAAAANAC8AAAACAAEAAAANADAAAAACAAEAAAANADEAAAACAAEAAAANADIAAAACAAEAAAANADMAAAACAAEAAAANADQAAAACAAEAAAANADUAAAACAAEAAAANADYAAAACAAEAAAANADcAAAACAAEAAAANADgAAAACAAEAAAAOACkAAAACAAEAAAAOACoAAAACAAEAAAAOACsAAAACAAEAAAAOACwAAAACAAEAAAAOAC0AAAACAAEAAAAOAC4AAAACAAEAAAAOAC8AAAACAAEAAAAOADAAAAACAAEAAAAOADEAAAACAAEAAAAOADIAAAACAAEAAAAOADMAAAACAAEAAAAOADQAAAACAAEAAAAOADUAAAACAAEAAAAOADYAAAACAAEAAAAOADcAAAACAAEAAAAOADgAAAACAAEAAAAPACkAAAACAAEAAAAPACoAAAACAAEAAAAPACsAAAACAAEAAAAPACwAAAACAAEAAAAPAC0AAAACAAEAAAAPAC4AAAACAAEAAAAPAC8AAAACAAEAAAAPADAAAAACAAEAAAAPADEAAAACAAEAAAAPADIAAAACAAEAAAAPADMAAAACAAEAAAAPADQAAAACAAEAAAAPADUAAAACAAEAAAAPADYAAAACAAEAAAAPADcAAAACAAEAAAAPADgAAAACAAEAAAAQACkAAAACAAEAAAAQACoAAAACAAEAAAAQACsAAAACAAEAAAAQACwAAAACAAEAAAAQAC0AAAACAAEAAAAQAC4AAAACAAEAAAAQAC8AAAACAAEAAAAQADAAAAACAAEAAAAQADEAAAACAAEAAAAQADIAAAACAAEAAAAQADMAAAACAAEAAAAQADQAAAACAAEAAAAQADUAAAACAAEAAAAQADYAAAACAAEAAAAQADcAAAACAAEAAAAQADgAAAACAAEAAAARACkAAAACAAEAAAARACoAAAACAAEAAAARACsAAAACAAEAAAARACwAAAACAAEAAAARAC0AAAACAAEAAAARAC4AAAACAAEAAAARAC8AAAACAAEAAAARADAAAAACAAEAAAARADEAAAACAAEAAAARADIAAAACAAEAAAARADMAAAACAAEAAAARADQAAAACAAEAAAARADUAAAACAAEAAAARADYAAAACAAEAAAARADcAAAACAAEAAAARADgAAAACAAEAAAASACkAAAACAAEAAAASACoAAAACAAEAAAASACsAAAACAAEAAAASACwAAAACAAEAAAASAC0AAAACAAEAAAASAC4AAAACAAEAAAASAC8AAAACAAEAAAASADAAAAACAAEAAAASADEAAAACAAEAAAASADIAAAACAAEAAAASADMAAAACAAEAAAASADQAAAACAAEAAAASADUAAAACAAEAAAASADYAAAACAAEAAAASADcAAAACAAEAAAASADgAAAACAAEAAAATACkAAAACAAEAAAATACoAAAACAAEAAAATACsAAAACAAEAAAATACwAAAACAAEAAAATAC0AAAACAAEAAAATAC4AAAACAAEAAAATAC8AAAACAAEAAAATADAAAAACAAEAAAATADEAAAACAAEAAAATADIAAAACAAEAAAATADMAAAACAAEAAAATADQAAAACAAEAAAATADUAAAACAAEAAAATADYAAAACAAEAAAATADcAAAACAAEAAAATADgAAAACAAEAAAAUACkAAAACAAEAAAAUACoAAAACAAEAAAAUACsAAAACAAEAAAAUACwAAAACAAEAAAAUAC0AAAACAAEAAAAUAC4AAAACAAEAAAAUAC8AAAACAAEAAAAUADAAAAACAAEAAAAUADEAAAACAAEAAAAUADIAAAACAAEAAAAUADMAAAACAAEAAAAUADQAAAACAAEAAAAUADUAAAACAAEAAAAUADYAAAACAAEAAAAUADcAAAACAAEAAAAUADgAAAACAAEAAAAVACkAAAACAAEAAAAVACoAAAACAAEAAAAVACsAAAACAAEAAAAVACwAAAACAAEAAAAVAC0AAAACAAEAAAAVAC4AAAACAAEAAAAVAC8AAAACAAEAAAAVADAAAAACAAEAAAAVADEAAAACAAEAAAAVADIAAAACAAEAAAAVADMAAAACAAEAAAAVADQAAAACAAEAAAAVADUAAAACAAEAAAAVADYAAAACAAEAAAAVADcAAAACAAEAAAAVADgAAAACAAEAAAAWACkAAAACAAEAAAAWACoAAAACAAEAAAAWACsAAAACAAEAAAAWACwAAAACAAEAAAAWAC0AAAACAAEAAAAWAC4AAAACAAEAAAAWAC8AAAACAAEAAAAWADAAAAACAAEAAAAWADEAAAACAAEAAAAWADIAAAACAAEAAAAWADMAAAACAAEAAAAWADQAAAACAAEAAAAWADUAAAACAAEAAAAWADYAAAACAAEAAAAWADcAAAACAAEAAAAWADgAAAACAAEAAAAXACkAAAACAAEAAAAXACoAAAACAAEAAAAXACsAAAACAAEAAAAXACwAAAACAAEAAAAXAC0AAAACAAEAAAAXAC4AAAACAAEAAAAXAC8AAAACAAEAAAAXADAAAAACAAEAAAAXADEAAAACAAEAAAAXADIAAAACAAEAAAAXADMAAAACAAEAAAAXADQAAAACAAEAAAAXADUAAAACAAEAAAAXADYAAAACAAEAAAAXADcAAAACAAEAAAAXADgAAAACAAEAAAAYACkAAAACAAEAAAAYACoAAAACAAEAAAAYACsAAAACAAEAAAAYACwAAAACAAEAAAAYAC0AAAACAAEAAAAYAC4AAAACAAEAAAAYAC8AAAACAAEAAAAYADAAAAACAAEAAAAYADEAAAACAAEAAAAYADIAAAACAAEAAAAYADMAAAACAAEAAAAYADQAAAACAAEAAAAYADUAAAACAAEAAAAYADYAAAACAAEAAAAYADcAAAACAAEAAAAYADgAAAACAAEAAAAZACkAAAACAAEAAAAZACoAAAACAAEAAAAZACsAAAACAAEAAAAZACwAAAACAAEAAAAZAC0AAAACAAEAAAAZAC4AAAACAAEAAAAZAC8AAAACAAEAAAAZADAAAAACAAEAAAAZADEAAAACAAEAAAAZADIAAAACAAEAAAAZADMAAAACAAEAAAAZADQAAAACAAEAAAAZADUAAAACAAEAAAAZADYAAAACAAEAAAAZADcAAAACAAEAAAAZADgAAAACAAEAAAAaACkAAAACAAEAAAAaACoAAAACAAEAAAAaACsAAAACAAEAAAAaACwAAAACAAEAAAAaAC0AAAACAAEAAAAaAC4AAAACAAEAAAAaAC8AAAACAAEAAAAaADAAAAACAAEAAAAaADEAAAACAAEAAAAaADIAAAACAAEAAAAaADMAAAACAAEAAAAaADQAAAACAAEAAAAaADUAAAACAAEAAAAaADYAAAACAAEAAAAaADcAAAACAAEAAAAaADgAAAACAAEAAAAbACkAAAACAAEAAAAbACoAAAACAAEAAAAbACsAAAACAAEAAAAbACwAAAACAAEAAAAbAC0AAAACAAEAAAAbAC4AAAACAAEAAAAbAC8AAAACAAEAAAAbADAAAAACAAEAAAAbADEAAAACAAEAAAAbADIAAAACAAEAAAAbADMAAAACAAEAAAAbADQAAAACAAEAAAAbADUAAAACAAEAAAAbADYAAAACAAEAAAAbADcAAAACAAEAAAAbADgAAAACAAEAAAAcACkAAAACAAEAAAAcACoAAAACAAEAAAAcACsAAAACAAEAAAAcACwAAAACAAEAAAAcAC0AAAACAAEAAAAcAC4AAAACAAEAAAAcAC8AAAACAAEAAAAcADAAAAACAAEAAAAcADEAAAACAAEAAAAcADIAAAACAAEAAAAcADMAAAACAAEAAAAcADQAAAACAAEAAAAcADUAAAACAAEAAAAcADYAAAACAAEAAAAcADcAAAACAAEAAAAcADgAAAACAAEAAAAdACkAAAACAAEAAAAdACoAAAACAAEAAAAdACsAAAACAAEAAAAdACwAAAACAAEAAAAdAC0AAAACAAEAAAAdAC4AAAACAAEAAAAdAC8AAAACAAEAAAAdADAAAAACAAEAAAAdADEAAAACAAEAAAAdADIAAAACAAEAAAAdADMAAAACAAEAAAAdADQAAAACAAEAAAAdADUAAAACAAEAAAAdADYAAAACAAEAAAAdADcAAAACAAEAAAAdADgAAAACAAEAAAAeACkAAAACAAEAAAAeACoAAAACAAEAAAAeACsAAAACAAEAAAAeACwAAAACAAEAAAAeAC0AAAACAAEAAAAeAC4AAAACAAEAAAAeAC8AAAACAAEAAAAeADAAAAACAAEAAAAeADEAAAACAAEAAAAeADIAAAACAAEAAAAeADMAAAACAAEAAAAeADQAAAACAAEAAAAeADUAAAACAAEAAAAeADYAAAACAAEAAAAeADcAAAACAAEAAAAeADgAAAACAAEAAAAfACkAAAACAAEAAAAfACoAAAACAAEAAAAfACsAAAACAAEAAAAfACwAAAACAAEAAAAfAC0AAAACAAEAAAAfAC4AAAACAAEAAAAfAC8AAAACAAEAAAAfADAAAAACAAEAAAAfADEAAAACAAEAAAAfADIAAAACAAEAAAAfADMAAAACAAEAAAAfADQAAAACAAEAAAAfADUAAAACAAEAAAAfADYAAAACAAEAAAAfADcAAAACAAEAAAAfADgAAAACAAEAAAAgACkAAAACAAEAAAAgACoAAAACAAEAAAAgACsAAAACAAEAAAAgACwAAAACAAEAAAAgAC0AAAACAAEAAAAgAC4AAAACAAEAAAAgAC8AAAACAAEAAAAgADAAAAACAAEAAAAgADEAAAACAAEAAAAgADIAAAACAAEAAAAgADMAAAACAAEAAAAgADQAAAACAAEAAAAgADUAAAACAAEAAAAgADYAAAACAAEAAAAgADcAAAACAAEAAAAgADgAAAACAAEAAAAhACkAAAACAAEAAAAhACoAAAACAAEAAAAhACsAAAACAAEAAAAhACwAAAACAAEAAAAhAC0AAAACAAEAAAAhAC4AAAACAAEAAAAhAC8AAAACAAEAAAAhADAAAAACAAEAAAAhADEAAAACAAEAAAAhADIAAAACAAEAAAAhADMAAAACAAEAAAAhADQAAAACAAEAAAAhADUAAAACAAEAAAAhADYAAAACAAEAAAAhADcAAAACAAEAAAAhADgAAAACAAEAAAAiACkAAAACAAEAAAAiACoAAAACAAEAAAAiACsAAAACAAEAAAAiACwAAAACAAEAAAAiAC0AAAACAAEAAAAiAC4AAAACAAEAAAAiAC8AAAACAAEAAAAiADAAAAACAAEAAAAiADEAAAACAAEAAAAiADIAAAACAAEAAAAiADMAAAACAAEAAAAiADQAAAACAAEAAAAiADUAAAACAAEAAAAiADYAAAACAAEAAAAiADcAAAACAAEAAAAiADgAAAACAAEAAAAjACkAAAACAAEAAAAjACoAAAACAAEAAAAjACsAAAACAAEAAAAjACwAAAACAAEAAAAjAC0AAAACAAEAAAAjAC4AAAACAAEAAAAjAC8AAAACAAEAAAAjADAAAAACAAEAAAAjADEAAAACAAEAAAAjADIAAAACAAEAAAAjADMAAAACAAEAAAAjADQAAAACAAEAAAAjADUAAAACAAEAAAAjADYAAAACAAEAAAAjADcAAAACAAEAAAAjADgAAAACAAEAAAAkACkAAAACAAEAAAAkACoAAAACAAEAAAAkACsAAAACAAEAAAAkACwAAAACAAEAAAAkAC0AAAACAAEAAAAkAC4AAAACAAEAAAAkAC8AAAACAAEAAAAkADAAAAACAAEAAAAkADEAAAACAAEAAAAkADIAAAACAAEAAAAkADMAAAACAAEAAAAkADQAAAACAAEAAAAkADUAAAACAAEAAAAkADYAAAACAAEAAAAkADcAAAACAAEAAAAkADgAAAACAAEAAAAlACkAAAACAAEAAAAlACoAAAACAAEAAAAlACsAAAACAAEAAAAlACwAAAACAAEAAAAlAC0AAAACAAEAAAAlAC4AAAACAAEAAAAlAC8AAAACAAEAAAAlADAAAAACAAEAAAAlADEAAAACAAEAAAAlADIAAAACAAEAAAAlADMAAAACAAEAAAAlADQAAAACAAEAAAAlADUAAAACAAEAAAAlADYAAAACAAEAAAAlADcAAAACAAEAAAAlADgAAAACAAEAAAAmACkAAAACAAEAAAAmACoAAAACAAEAAAAmACsAAAACAAEAAAAmACwAAAACAAEAAAAmAC0AAAACAAEAAAAmAC4AAAACAAEAAAAmAC8AAAACAAEAAAAmADAAAAACAAEAAAAmADEAAAACAAEAAAAmADIAAAACAAEAAAAmADMAAAACAAEAAAAmADQAAAACAAEAAAAmADUAAAACAAEAAAAmADYAAAACAAEAAAAmADcAAAACAAEAAAAmADgAAAACAAEAAAAnACkAAAACAAEAAAAnACoAAAACAAEAAAAnACsAAAACAAEAAAAnACwAAAACAAEAAAAnAC0AAAACAAEAAAAnAC4AAAACAAEAAAAnAC8AAAACAAEAAAAnADAAAAACAAEAAAAnADEAAAACAAEAAAAnADIAAAACAAEAAAAnADMAAAACAAEAAAAnADQAAAACAAEAAAAnADUAAAACAAEAAAAnADYAAAACAAEAAAAnADcAAAACAAEAAAAnADgAAAACAAEAAAAoACkAAAACAAEAAAAoACoAAAACAAEAAAAoACsAAAACAAEAAAAoACwAAAACAAEAAAAoAC0AAAACAAEAAAAoAC4AAAACAAEAAAAoAC8AAAACAAEAAAAoADAAAAACAAEAAAAoADEAAAACAAEAAAAoADIAAAACAAEAAAAoADMAAAACAAEAAAAoADQAAAACAAEAAAAoADUAAAACAAEAAAAoADYAAAACAAEAAAAoADcAAAACAAEAAAAoADgAAAACAAEAAAApACkAAAACAAEAAAApACoAAAACAAEAAAApACsAAAACAAEAAAApACwAAAACAAEAAAApAC0AAAACAAEAAAApAC4AAAACAAEAAAApAC8AAAACAAEAAAApADAAAAACAAEAAAApADEAAAACAAEAAAApADIAAAACAAEAAAApADMAAAACAAEAAAApADQAAAACAAEAAAApADUAAAACAAEAAAApADYAAAACAAEAAAApADcAAAACAAEAAAApADgAAAACAAEAAAAqACkAAAACAAEAAAAqACoAAAACAAEAAAAqACsAAAACAAEAAAAqACwAAAACAAEAAAAqAC0AAAACAAEAAAAqAC4AAAACAAEAAAAqAC8AAAACAAEAAAAqADAAAAACAAEAAAAqADEAAAACAAEAAAAqADIAAAACAAEAAAAqADMAAAACAAEAAAAqADQAAAACAAEAAAAqADUAAAACAAEAAAAqADYAAAACAAEAAAAqADcAAAACAAEAAAAqADgAAAACAAEAAAArACkAAAACAAEAAAArACoAAAACAAEAAAArACsAAAACAAEAAAArACwAAAACAAEAAAArAC0AAAACAAEAAAArAC4AAAACAAEAAAArAC8AAAACAAEAAAArADAAAAACAAEAAAArADEAAAACAAEAAAArADIAAAACAAEAAAArADMAAAACAAEAAAArADQAAAACAAEAAAArADUAAAACAAEAAAArADYAAAACAAEAAAArADcAAAACAAEAAAArADgAAAACAAEAAAAsACkAAAACAAEAAAAsACoAAAACAAEAAAAsACsAAAACAAEAAAAsACwAAAACAAEAAAAsAC0AAAACAAEAAAAsAC4AAAACAAEAAAAsAC8AAAACAAEAAAAsADAAAAACAAEAAAAsADEAAAACAAEAAAAsADIAAAACAAEAAAAsADMAAAACAAEAAAAsADQAAAACAAEAAAAsADUAAAACAAEAAAAsADYAAAACAAEAAAAsADcAAAACAAEAAAAsADgAAAACAAEAAAAtACkAAAACAAEAAAAtACoAAAACAAEAAAAtACsAAAACAAEAAAAtACwAAAACAAEAAAAtAC0AAAACAAEAAAAtAC4AAAACAAEAAAAtAC8AAAACAAEAAAAtADAAAAACAAEAAAAtADEAAAACAAEAAAAtADIAAAACAAEAAAAtADMAAAACAAEAAAAtADQAAAACAAEAAAAtADUAAAACAAEAAAAtADYAAAACAAEAAAAtADcAAAACAAEAAAAtADgAAAACAAEAAAAuACkAAAACAAEAAAAuACoAAAACAAEAAAAuACsAAAACAAEAAAAuACwAAAACAAEAAAAuAC0AAAACAAEAAAAuAC4AAAACAAEAAAAuAC8AAAACAAEAAAAuADAAAAACAAEAAAAuADEAAAACAAEAAAAuADIAAAACAAEAAAAuADMAAAACAAEAAAAuADQAAAACAAEAAAAuADUAAAACAAEAAAAuADYAAAACAAEAAAAuADcAAAACAAEAAAAuADgAAAACAAEAAAAvACkAAAACAAEAAAAvACoAAAACAAEAAAAvACsAAAACAAEAAAAvACwAAAACAAEAAAAvAC0AAAACAAEAAAAvAC4AAAACAAEAAAAvAC8AAAACAAEAAAAvADAAAAACAAEAAAAvADEAAAACAAEAAAAvADIAAAACAAEAAAAvADMAAAACAAEAAAAvADQAAAACAAEAAAAvADUAAAACAAEAAAAvADYAAAACAAEAAAAvADcAAAACAAEAAAAvADgAAAACAAEAAAAwACkAAAACAAEAAAAwACoAAAACAAEAAAAwACsAAAACAAEAAAAwACwAAAACAAEAAAAwAC0AAAACAAEAAAAwAC4AAAACAAEAAAAwAC8AAAACAAEAAAAwADAAAAACAAEAAAAwADEAAAACAAEAAAAwADIAAAACAAEAAAAwADMAAAACAAEAAAAwADQAAAACAAEAAAAwADUAAAACAAEAAAAwADYAAAACAAEAAAAwADcAAAACAAEAAAAwADgAAAACAAEAAAAxACkAAAACAAEAAAAxACoAAAACAAEAAAAxACsAAAACAAEAAAAxACwAAAACAAEAAAAxAC0AAAACAAEAAAAxAC4AAAACAAEAAAAxAC8AAAACAAEAAAAxADAAAAACAAEAAAAxADEAAAACAAEAAAAxADIAAAACAAEAAAAxADMAAAACAAEAAAAxADQAAAACAAEAAAAxADUAAAACAAEAAAAxADYAAAACAAEAAAAxADcAAAACAAEAAAAxADgAAAACAAEAAAAyACkAAAACAAEAAAAyACoAAAACAAEAAAAyACsAAAACAAEAAAAyACwAAAACAAEAAAAyAC0AAAACAAEAAAAyAC4AAAACAAEAAAAyAC8AAAACAAEAAAAyADAAAAACAAEAAAAyADEAAAACAAEAAAAyADIAAAACAAEAAAAyADMAAAACAAEAAAAyADQAAAACAAEAAAAyADUAAAACAAEAAAAyADYAAAACAAEAAAAyADcAAAACAAEAAAAyADgAAAACAAEAAAAzACkAAAACAAEAAAAzACoAAAACAAEAAAAzACsAAAACAAEAAAAzACwAAAACAAEAAAAzAC0AAAACAAEAAAAzAC4AAAACAAEAAAAzAC8AAAACAAEAAAAzADAAAAACAAEAAAAzADEAAAACAAEAAAAzADIAAAACAAEAAAAzADMAAAACAAEAAAAzADQAAAACAAEAAAAzADUAAAACAAEAAAAzADYAAAACAAEAAAAzADcAAAACAAEAAAAzADgAAAACAAEAAAA0ACkAAAACAAEAAAA0ACoAAAACAAEAAAA0ACsAAAACAAEAAAA0ACwAAAACAAEAAAA0AC0AAAACAAEAAAA0AC4AAAACAAEAAAA0AC8AAAACAAEAAAA0ADAAAAACAAEAAAA0ADEAAAACAAEAAAA0ADIAAAACAAEAAAA0ADMAAAACAAEAAAA0ADQAAAACAAEAAAA0ADUAAAACAAEAAAA0ADYAAAACAAEAAAA0ADcAAAACAAEAAAA0ADgAAAACAAEAAAA1ACkAAAACAAEAAAA1ACoAAAACAAEAAAA1ACsAAAACAAEAAAA1ACwAAAACAAEAAAA1AC0AAAACAAEAAAA1AC4AAAACAAEAAAA1AC8AAAACAAEAAAA1ADAAAAACAAEAAAA1ADEAAAACAAEAAAA1ADIAAAACAAEAAAA1ADMAAAACAAEAAAA1ADQAAAACAAEAAAA1ADUAAAACAAEAAAA1ADYAAAACAAEAAAA1ADcAAAACAAEAAAA1ADgAAAACAAEAAAA2ACkAAAACAAEAAAA2ACoAAAACAAEAAAA2ACsAAAACAAEAAAA2ACwAAAACAAEAAAA2AC0AAAACAAEAAAA2AC4AAAACAAEAAAA2AC8AAAACAAEAAAA2ADAAAAACAAEAAAA2ADEAAAACAAEAAAA2ADIAAAACAAEAAAA2ADMAAAACAAEAAAA2ADQAAAACAAEAAAA2ADUAAAACAAEAAAA2ADYAAAACAAEAAAA2ADcAAAACAAEAAAA2ADgAAAACAAEAAAA3ACkAAAACAAEAAAA3ACoAAAACAAEAAAA3ACsAAAACAAEAAAA3ACwAAAACAAEAAAA3AC0AAAACAAEAAAA3AC4AAAACAAEAAAA3AC8AAAACAAEAAAA3ADAAAAACAAEAAAA3ADEAAAACAAEAAAA3ADIAAAACAAEAAAA3ADMAAAACAAEAAAA3ADQAAAACAAEAAAA3ADUAAAACAAEAAAA3ADYAAAACAAEAAAA3ADcAAAACAAEAAAA3ADgAAAACAAEAAAA4ACkAAAACAAEAAAA4ACoAAAACAAEAAAA4ACsAAAACAAEAAAA4ACwAAAACAAEAAAA4AC0AAAACAAEAAAA4AC4AAAACAAEAAAA4AC8AAAACAAEAAAA4ADAAAAACAAEAAAA4ADEAAAACAAEAAAA4ADIAAAACAAEAAAA4ADMAAAACAAEAAAA4ADQAAAACAAEAAAA4ADUAAAACAAEAAAA4ADYAAAACAAEAAAA4ADcAAAACAAEAAAA4ADgAAAACAAEAAAA5ACkAAAACAAEAAAA5ACoAAAACAAEAAAA5ACsAAAACAAEAAAA5ACwAAAACAAEAAAA5AC0AAAACAAEAAAA5AC4AAAACAAEAAAA5AC8AAAACAAEAAAA5ADAAAAACAAEAAAA5ADEAAAACAAEAAAA5ADIAAAACAAEAAAA5ADMAAAACAAEAAAA5ADQAAAACAAEAAAA5ADUAAAACAAEAAAA5ADYAAAACAAEAAAA5ADcAAAACAAEAAAA5ADgAAAACAAEAAAA6ACkAAAACAAEAAAA6ACoAAAACAAEAAAA6ACsAAAACAAEAAAA6ACwAAAACAAEAAAA6AC0AAAACAAEAAAA6AC4AAAACAAEAAAA6AC8AAAACAAEAAAA6ADAAAAACAAEAAAA6ADEAAAACAAEAAAA6ADIAAAACAAEAAAA6ADMAAAACAAEAAAA6ADQAAAACAAEAAAA6ADUAAAACAAEAAAA6ADYAAAACAAEAAAA6ADcAAAACAAEAAAA6ADgAAAACAAEAAAA7ACkAAAACAAEAAAA7ACoAAAACAAEAAAA7ACsAAAACAAEAAAA7ACwAAAACAAEAAAA7AC0AAAACAAEAAAA7AC4AAAACAAEAAAA7AC8AAAACAAEAAAA7ADAAAAACAAEAAAA7ADEAAAACAAEAAAA7ADIAAAACAAEAAAA7ADMAAAACAAEAAAA7ADQAAAACAAEAAAA7ADUAAAACAAEAAAA7ADYAAAACAAEAAAA7ADcAAAACAAEAAAA7ADgAAAACAAEAAAA8ACkAAAACAAEAAAA8ACoAAAACAAEAAAA8ACsAAAACAAEAAAA8ACwAAAACAAEAAAA8AC0AAAACAAEAAAA8AC4AAAACAAEAAAA8AC8AAAACAAEAAAA8ADAAAAACAAEAAAA8ADEAAAACAAEAAAA8ADIAAAACAAEAAAA8ADMAAAACAAEAAAA8ADQAAAACAAEAAAA8ADUAAAACAAEAAAA8ADYAAAACAAEAAAA8ADcAAAACAAEAAAA8ADgAAAACAAEAAAA9ACkAAAACAAEAAAA9ACoAAAACAAEAAAA9ACsAAAACAAEAAAA9ACwAAAACAAEAAAA9AC0AAAACAAEAAAA9AC4AAAACAAEAAAA9AC8AAAACAAEAAAA9ADAAAAACAAEAAAA9ADEAAAACAAEAAAA9ADIAAAACAAEAAAA9ADMAAAACAAEAAAA9ADQAAAACAAEAAAA9ADUAAAACAAEAAAA9ADYAAAACAAEAAAA9ADcAAAACAAEAAAA9ADgAAAACAAEAAAA+ACkAAAACAAEAAAA+ACoAAAACAAEAAAA+ACsAAAACAAEAAAA+ACwAAAACAAEAAAA+AC0AAAACAAEAAAA+AC4AAAACAAEAAAA+AC8AAAACAAEAAAA+ADAAAAACAAEAAAA+ADEAAAACAAEAAAA+ADIAAAACAAEAAAA+ADMAAAACAAEAAAA+ADQAAAACAAEAAAA+ADUAAAACAAEAAAA+ADYAAAACAAEAAAA+ADcAAAACAAEAAAA+ADgAAAACAAEAAAA/ACkAAAACAAEAAAA/ACoAAAACAAEAAAA/ACsAAAACAAEAAAA/ACwAAAACAAEAAAA/AC0AAAACAAEAAAA/AC4AAAACAAEAAAA/AC8AAAACAAEAAAA/ADAAAAACAAEAAAA/ADEAAAACAAEAAAA/ADIAAAACAAEAAAA/ADMAAAACAAEAAAA/ADQAAAACAAEAAAA/ADUAAAACAAEAAAA/ADYAAAACAAEAAAA/ADcAAAACAAEAAAA/ADgAAAACAAEAAABAACkAAAACAAEAAABAACoAAAACAAEAAABAACsAAAACAAEAAABAACwAAAACAAEAAABAAC0AAAACAAEAAABAAC4AAAACAAEAAABAAC8AAAACAAEAAABAADAAAAACAAEAAABAADEAAAACAAEAAABAADIAAAACAAEAAABAADMAAAACAAEAAABAADQAAAACAAEAAABAADUAAAACAAEAAABAADYAAAACAAEAAABAADcAAAACAAEAAABAADgAAAACAAEAAABBACkAAAACAAEAAABBACoAAAACAAEAAABBACsAAAACAAEAAABBACwAAAACAAEAAABBAC0AAAACAAEAAABBAC4AAAACAAEAAABBAC8AAAACAAEAAABBADAAAAACAAEAAABBADEAAAACAAEAAABBADIAAAACAAEAAABBADMAAAACAAEAAABBADQAAAACAAEAAABBADUAAAACAAEAAABBADYAAAACAAEAAABBADcAAAACAAEAAABBADgAAAACAAEAAABCACkAAAACAAEAAABCACoAAAACAAEAAABCACsAAAACAAEAAABCACwAAAACAAEAAABCAC0AAAACAAEAAABCAC4AAAACAAEAAABCAC8AAAACAAEAAABCADAAAAACAAEAAABCADEAAAACAAEAAABCADIAAAACAAEAAABCADMAAAACAAEAAABCADQAAAACAAEAAABCADUAAAACAAEAAABCADYAAAACAAEAAABCADcAAAACAAEAAABCADgAAAACAAEAAABDACkAAAACAAEAAABDACoAAAACAAEAAABDACsAAAACAAEAAABDACwAAAACAAEAAABDAC0AAAACAAEAAABDAC4AAAACAAEAAABDAC8AAAACAAEAAABDADAAAAACAAEAAABDADEAAAACAAEAAABDADIAAAACAAEAAABDADMAAAACAAEAAABDADQAAAACAAEAAABDADUAAAACAAEAAABDADYAAAACAAEAAABDADcAAAACAAEAAABDADgAAAACAAEAAABEACkAAAACAAEAAABEACoAAAACAAEAAABEACsAAAACAAEAAABEACwAAAACAAEAAABEAC0AAAACAAEAAABEAC4AAAACAAEAAABEAC8AAAACAAEAAABEADAAAAACAAEAAABEADEAAAACAAEAAABEADIAAAACAAEAAABEADMAAAACAAEAAABEADQAAAACAAEAAABEADUAAAACAAEAAABEADYAAAACAAEAAABEADcAAAACAAEAAABEADgAAAACAAEAAABFACkAAAACAAEAAABFACoAAAACAAEAAABFACsAAAACAAEAAABFACwAAAACAAEAAABFAC0AAAACAAEAAABFAC4AAAACAAEAAABFAC8AAAACAAEAAABFADAAAAACAAEAAABFADEAAAACAAEAAABFADIAAAACAAEAAABFADMAAAACAAEAAABFADQAAAACAAEAAABFADUAAAACAAEAAABFADYAAAACAAEAAABFADcAAAACAAEAAABFADgAAAACAAEAAABGACkAAAACAAEAAABGACoAAAACAAEAAABGACsAAAACAAEAAABGACwAAAACAAEAAABGAC0AAAACAAEAAABGAC4AAAACAAEAAABGAC8AAAACAAEAAABGADAAAAACAAEAAABGADEAAAACAAEAAABGADIAAAACAAEAAABGADMAAAACAAEAAABGADQAAAACAAEAAABGADUAAAACAAEAAABGADYAAAACAAEAAABGADcAAAACAAEAAABGADgAAAACAAEAAABHACkAAAACAAEAAABHACoAAAACAAEAAABHACsAAAACAAEAAABHACwAAAACAAEAAABHAC0AAAACAAEAAABHAC4AAAACAAEAAABHAC8AAAACAAEAAABHADAAAAACAAEAAABHADEAAAACAAEAAABHADIAAAACAAEAAABHADMAAAACAAEAAABHADQAAAACAAEAAABHADUAAAACAAEAAABHADYAAAACAAEAAABHADcAAAACAAEAAABHADgAAAACAAEAAABIACYAAAACAAEAAABIACcAAAACAAEAAABIACgAAAACAAEAAABIACkAAAACAAEAAABIACoAAAACAAEAAABIACsAAAACAAEAAABIACwAAAACAAEAAABIAC0AAAACAAEAAABIAC4AAAACAAEAAABIAC8AAAACAAEAAABIADAAAAACAAEAAABIADEAAAACAAEAAABIADIAAAACAAEAAABIADMAAAACAAEAAABIADQAAAACAAEAAABIADUAAAACAAEAAABIADYAAAACAAEAAABIADcAAAACAAEAAABIADgAAAACAAEAAABJACYAAAACAAEAAABJACcAAAACAAEAAABJACgAAAACAAEAAABJACkAAAACAAEAAABJACoAAAACAAEAAABJACsAAAACAAEAAABJACwAAAACAAEAAABJAC0AAAACAAEAAABJAC4AAAACAAEAAABJAC8AAAACAAEAAABJADAAAAACAAEAAABJADEAAAACAAEAAABJADIAAAACAAEAAABJADMAAAACAAEAAABJADQAAAACAAEAAABJADUAAAACAAEAAABJADYAAAACAAEAAABJADcAAAACAAEAAABJADgAAAACAAEAAABKACYAAAACAAEAAABKACcAAAACAAEAAABKACgAAAACAAEAAABKACkAAAACAAEAAABKACoAAAACAAEAAABKACsAAAACAAEAAABKACwAAAACAAEAAABKAC0AAAACAAEAAABKAC4AAAACAAEAAABKAC8AAAACAAEAAABKADAAAAACAAEAAABKADEAAAACAAEAAABKADIAAAACAAEAAABKADMAAAACAAEAAABKADQAAAACAAEAAABKADUAAAACAAEAAABKADYAAAACAAEAAABKADcAAAACAAEAAABKADgAAAACAAEAAABLACYAAAACAAEAAABLACcAAAACAAEAAABLACgAAAACAAEAAABLACkAAAACAAEAAABLACoAAAACAAEAAABLACsAAAACAAEAAABLACwAAAACAAEAAABLAC0AAAACAAEAAABLAC4AAAACAAEAAABLAC8AAAACAAEAAABLADAAAAACAAEAAABLADEAAAACAAEAAABLADIAAAACAAEAAABLADMAAAACAAEAAABLADQAAAACAAEAAABLADUAAAACAAEAAABLADYAAAACAAEAAABLADcAAAACAAEAAABLADgAAAACAAEAAABMACYAAAACAAEAAABMACcAAAACAAEAAABMACgAAAACAAEAAABMACkAAAACAAEAAABMACoAAAACAAEAAABMACsAAAACAAEAAABMACwAAAACAAEAAABMAC0AAAACAAEAAABMAC4AAAACAAEAAABMAC8AAAACAAEAAABMADAAAAACAAEAAABMADEAAAACAAEAAABMADIAAAACAAEAAABMADMAAAACAAEAAABMADQAAAACAAEAAABMADUAAAACAAEAAABMADYAAAACAAEAAABMADcAAAACAAEAAABMADgAAAACAAEAAABNACYAAAACAAEAAABNACcAAAACAAEAAABNACgAAAACAAEAAABNACkAAAACAAEAAABNACoAAAACAAEAAABNACsAAAACAAEAAABNACwAAAACAAEAAABNAC0AAAACAAEAAABNAC4AAAACAAEAAABNAC8AAAACAAEAAABNADAAAAACAAEAAABNADEAAAACAAEAAABNADIAAAACAAEAAABNADMAAAACAAEAAABNADQAAAACAAEAAABNADUAAAACAAEAAABNADYAAAACAAEAAABNADcAAAACAAEAAABNADgAAAACAAEAAABOACYAAAACAAEAAABOACcAAAACAAEAAABOACgAAAACAAEAAABOACkAAAACAAEAAABOACoAAAACAAEAAABOACsAAAACAAEAAABOACwAAAACAAEAAABOAC0AAAACAAEAAABOAC4AAAACAAEAAABOAC8AAAACAAEAAABOADAAAAACAAEAAABOADEAAAACAAEAAABOADIAAAACAAEAAABOADMAAAACAAEAAABOADQAAAACAAEAAABOADUAAAACAAEAAABOADYAAAACAAEAAABOADcAAAACAAEAAABOADgAAAACAAEAAABPACYAAAACAAEAAABPACcAAAACAAEAAABPACgAAAACAAEAAABPACkAAAACAAEAAABPACoAAAACAAEAAABPACsAAAACAAEAAABPACwAAAACAAEAAABPAC0AAAACAAEAAABPAC4AAAACAAEAAABPAC8AAAACAAEAAABPADAAAAACAAEAAABPADEAAAACAAEAAABPADIAAAACAAEAAABPADMAAAACAAEAAABPADQAAAACAAEAAABPADUAAAACAAEAAABPADYAAAACAAEAAABPADcAAAACAAEAAABPADgAAAACAAEAAABQACYAAAACAAEAAABQACcAAAACAAEAAABQACgAAAACAAEAAABQACkAAAACAAEAAABQACoAAAACAAEAAABQACsAAAACAAEAAABQACwAAAACAAEAAABQAC0AAAACAAEAAABQAC4AAAACAAEAAABQAC8AAAACAAEAAABQADAAAAACAAEAAABQADEAAAACAAEAAABQADIAAAACAAEAAABQADMAAAACAAEAAABQADQAAAACAAEAAABQADUAAAACAAEAAABQADYAAAACAAEAAABQADcAAAACAAEAAABQADgAAAACAAEAAABRACYAAAACAAEAAABRACcAAAACAAEAAABRACgAAAACAAEAAABRACkAAAACAAEAAABRACoAAAACAAEAAABRACsAAAACAAEAAABRACwAAAACAAEAAABRAC0AAAACAAEAAABRAC4AAAACAAEAAABRAC8AAAACAAEAAABRADAAAAACAAEAAABRADEAAAACAAEAAABRADIAAAACAAEAAABRADMAAAACAAEAAABRADQAAAACAAEAAABRADUAAAACAAEAAABRADYAAAACAAEAAABRADcAAAACAAEAAABRADgAAAACAAEAAABSACYAAAACAAEAAABSACcAAAACAAEAAABSACgAAAACAAEAAABSACkAAAACAAEAAABSACoAAAACAAEAAABSACsAAAACAAEAAABSACwAAAACAAEAAABSAC0AAAACAAEAAABSAC4AAAACAAEAAABSAC8AAAACAAEAAABSADAAAAACAAEAAABSADEAAAACAAEAAABSADIAAAACAAEAAABSADMAAAACAAEAAABSADQAAAACAAEAAABSADUAAAACAAEAAABSADYAAAACAAEAAABSADcAAAACAAEAAABSADgAAAACAAEAAABTACYAAAACAAEAAABTACcAAAACAAEAAABTACgAAAACAAEAAABTACkAAAACAAEAAABTACoAAAACAAEAAABTACsAAAACAAEAAABTACwAAAACAAEAAABTAC0AAAACAAEAAABTAC4AAAACAAEAAABTAC8AAAACAAEAAABTADAAAAACAAEAAABTADEAAAACAAEAAABTADIAAAACAAEAAABTADMAAAACAAEAAABTADQAAAACAAEAAABTADUAAAACAAEAAABTADYAAAACAAEAAABTADcAAAACAAEAAABTADgAAAACAAEAAABUACYAAAACAAEAAABUACcAAAACAAEAAABUACgAAAACAAEAAABUACkAAAACAAEAAABUACoAAAACAAEAAABUACsAAAACAAEAAABUACwAAAACAAEAAABUAC0AAAACAAEAAABUAC4AAAACAAEAAABUAC8AAAACAAEAAABUADAAAAACAAEAAABUADEAAAACAAEAAABUADIAAAACAAEAAABUADMAAAACAAEAAABUADQAAAACAAEAAABUADUAAAACAAEAAABUADYAAAACAAEAAABUADcAAAACAAEAAABUADgAAAACAAEAAABVACYAAAACAAEAAABVACcAAAACAAEAAABVACgAAAACAAEAAABVACkAAAACAAEAAABVACoAAAACAAEAAABVACsAAAACAAEAAABVACwAAAACAAEAAABVAC0AAAACAAEAAABVAC4AAAACAAEAAABVAC8AAAACAAEAAABVADAAAAACAAEAAABVADEAAAACAAEAAABVADIAAAACAAEAAABVADMAAAACAAEAAABVADQAAAACAAEAAABVADUAAAACAAEAAABVADYAAAACAAEAAABVADcAAAACAAEAAABVADgAAAACAAEAAABWACYAAAACAAEAAABWACcAAAACAAEAAABWACgAAAACAAEAAABWACkAAAACAAEAAABWACoAAAACAAEAAABWACsAAAACAAEAAABWACwAAAACAAEAAABWAC0AAAACAAEAAABWAC4AAAACAAEAAABWAC8AAAACAAEAAABWADAAAAACAAEAAABWADEAAAACAAEAAABWADIAAAACAAEAAABWADMAAAACAAEAAABWADQAAAACAAEAAABWADUAAAACAAEAAABWADYAAAACAAEAAABWADcAAAACAAEAAABWADgAAAACAAEAAABXACYAAAACAAEAAABXACcAAAACAAEAAABXACgAAAACAAEAAABXACkAAAACAAEAAABXACoAAAACAAEAAABXACsAAAACAAEAAABXACwAAAACAAEAAABXAC0AAAACAAEAAABXAC4AAAACAAEAAABXAC8AAAACAAEAAABXADAAAAACAAEAAABXADEAAAACAAEAAABXADIAAAACAAEAAABXADMAAAACAAEAAABXADQAAAACAAEAAABXADUAAAACAAEAAABXADYAAAACAAEAAABXADcAAAACAAEAAABXADgAAAACAAEAAABYACYAAAACAAEAAABYACcAAAACAAEAAABYACgAAAACAAEAAABYACkAAAACAAEAAABYACoAAAACAAEAAABYACsAAAACAAEAAABYACwAAAACAAEAAABYAC0AAAACAAEAAABYAC4AAAACAAEAAABYAC8AAAACAAEAAABYADAAAAACAAEAAABYADEAAAACAAEAAABYADIAAAACAAEAAABYADMAAAACAAEAAABYADQAAAACAAEAAABYADUAAAACAAEAAABYADYAAAACAAEAAABYADcAAAACAAEAAABYADgAAAACAAEAAABZACYAAAACAAEAAABZACcAAAACAAEAAABZACgAAAACAAEAAABZACkAAAACAAEAAABZACoAAAACAAEAAABZACsAAAACAAEAAABZACwAAAACAAEAAABZAC0AAAACAAEAAABZAC4AAAACAAEAAABZAC8AAAACAAEAAABZADAAAAACAAEAAABZADEAAAACAAEAAABZADIAAAACAAEAAABZADMAAAACAAEAAABZADQAAAACAAEAAABZADUAAAACAAEAAABZADYAAAACAAEAAABZADcAAAACAAEAAABZADgAAAACAAEAAABaACYAAAACAAEAAABaACcAAAACAAEAAABaACgAAAACAAEAAABaACkAAAACAAEAAABaACoAAAACAAEAAABaACsAAAACAAEAAABaACwAAAACAAEAAABaAC0AAAACAAEAAABaAC4AAAACAAEAAABaAC8AAAACAAEAAABaADAAAAACAAEAAABaADEAAAACAAEAAABaADIAAAACAAEAAABaADMAAAACAAEAAABaADQAAAACAAEAAABaADUAAAACAAEAAABaADYAAAACAAEAAABaADcAAAACAAEAAABaADgAAAACAAEAAABbACYAAAACAAEAAABbACcAAAACAAEAAABbACgAAAACAAEAAABbACkAAAACAAEAAABbACoAAAACAAEAAABbACsAAAACAAEAAABbACwAAAACAAEAAABbAC0AAAACAAEAAABbAC4AAAACAAEAAABbAC8AAAACAAEAAABbADAAAAACAAEAAABbADEAAAACAAEAAABbADIAAAACAAEAAABbADMAAAACAAEAAABbADQAAAACAAEAAABbADUAAAACAAEAAABbADYAAAACAAEAAABbADcAAAACAAEAAABbADgAAAACAAEAAABcACYAAAACAAEAAABcACcAAAACAAEAAABcACgAAAACAAEAAABcACkAAAACAAEAAABcACoAAAACAAEAAABcACsAAAACAAEAAABcACwAAAACAAEAAABcAC0AAAACAAEAAABcAC4AAAACAAEAAABcAC8AAAACAAEAAABcADAAAAACAAEAAABcADEAAAACAAEAAABcADIAAAACAAEAAABcADMAAAACAAEAAABcADQAAAACAAEAAABcADUAAAACAAEAAABcADYAAAACAAEAAABcADcAAAACAAEAAABcADgAAAACAAEAAABdACYAAAACAAEAAABdACcAAAACAAEAAABdACgAAAACAAEAAABdACkAAAACAAEAAABdACoAAAACAAEAAABdACsAAAACAAEAAABdACwAAAACAAEAAABdAC0AAAACAAEAAABdAC4AAAACAAEAAABdAC8AAAACAAEAAABdADAAAAACAAEAAABdADEAAAACAAEAAABdADIAAAACAAEAAABdADMAAAACAAEAAABdADQAAAACAAEAAABdADUAAAACAAEAAABdADYAAAACAAEAAABdADcAAAACAAEAAABdADgAAAACAAEAAABeACYAAAACAAEAAABeACcAAAACAAEAAABeACgAAAACAAEAAABeACkAAAACAAEAAABeACoAAAACAAEAAABeACsAAAACAAEAAABeACwAAAACAAEAAABeAC0AAAACAAEAAABeAC4AAAACAAEAAABeAC8AAAACAAEAAABeADAAAAACAAEAAABeADEAAAACAAEAAABeADIAAAACAAEAAABeADMAAAACAAEAAABeADQAAAACAAEAAABeADUAAAACAAEAAABeADYAAAACAAEAAABeADcAAAACAAEAAABeADgAAAACAAEAAABfACYAAAACAAEAAABfACcAAAACAAEAAABfACgAAAACAAEAAABfACkAAAACAAEAAABfACoAAAACAAEAAABfACsAAAACAAEAAABfACwAAAACAAEAAABfAC0AAAACAAEAAABfAC4AAAACAAEAAABfAC8AAAACAAEAAABfADAAAAACAAEAAABfADEAAAACAAEAAABfADIAAAACAAEAAABfADMAAAACAAEAAABfADQAAAACAAEAAABfADUAAAACAAEAAABfADYAAAACAAEAAABfADcAAAACAAEAAABfADgAAAACAAEAAABgACYAAAACAAEAAABgACcAAAACAAEAAABgACgAAAACAAEAAABgACkAAAACAAEAAABgACoAAAACAAEAAABgACsAAAACAAEAAABgACwAAAACAAEAAABgAC0AAAACAAEAAABgAC4AAAACAAEAAABgAC8AAAACAAEAAABgADAAAAACAAEAAABgADEAAAACAAEAAABgADIAAAACAAEAAABgADMAAAACAAEAAABgADQAAAACAAEAAABgADUAAAACAAEAAABgADYAAAACAAEAAABgADcAAAACAAEAAABgADgAAAACAAEAAABhACYAAAACAAEAAABhACcAAAACAAEAAABhACgAAAACAAEAAABhACkAAAACAAEAAABhACoAAAACAAEAAABhACsAAAACAAEAAABhACwAAAACAAEAAABhAC0AAAACAAEAAABhAC4AAAACAAEAAABhAC8AAAACAAEAAABhADAAAAACAAEAAABhADEAAAACAAEAAABhADIAAAACAAEAAABhADMAAAACAAEAAABhADQAAAACAAEAAABhADUAAAACAAEAAABhADYAAAACAAEAAABhADcAAAACAAEAAABhADgAAAACAAEAAABiACYAAAACAAEAAABiACcAAAACAAEAAABiACgAAAACAAEAAABiACkAAAACAAEAAABiACoAAAACAAEAAABiACsAAAACAAEAAABiACwAAAACAAEAAABiAC0AAAACAAEAAABiAC4AAAACAAEAAABiAC8AAAACAAEAAABiADAAAAACAAEAAABiADEAAAACAAEAAABiADIAAAACAAEAAABiADMAAAACAAEAAABiADQAAAACAAEAAABiADUAAAACAAEAAABiADYAAAACAAEAAABiADcAAAACAAEAAABiADgAAAACAAEAAABjACYAAAACAAEAAABjACcAAAACAAEAAABjACgAAAACAAEAAABjACkAAAACAAEAAABjACoAAAACAAEAAABjACsAAAACAAEAAABjACwAAAACAAEAAABjAC0AAAACAAEAAABjAC4AAAACAAEAAABjAC8AAAACAAEAAABjADAAAAACAAEAAABjADEAAAACAAEAAABjADIAAAACAAEAAABjADMAAAACAAEAAABjADQAAAACAAEAAABjADUAAAACAAEAAABjADYAAAACAAEAAABjADcAAAACAAEAAABjADgAAAACAAEAAABkACYAAAACAAEAAABkACcAAAACAAEAAABkACgAAAACAAEAAABkACkAAAACAAEAAABkACoAAAACAAEAAABkACsAAAACAAEAAABkACwAAAACAAEAAABkAC0AAAACAAEAAABkAC4AAAACAAEAAABkAC8AAAACAAEAAABkADAAAAACAAEAAABkADEAAAACAAEAAABkADIAAAACAAEAAABkADMAAAACAAEAAABkADQAAAACAAEAAABkADUAAAACAAEAAABkADYAAAACAAEAAABkADcAAAACAAEAAABkADgAAAACAAEAAABlACYAAAACAAEAAABlACcAAAACAAEAAABlACgAAAACAAEAAABlACkAAAACAAEAAABlACoAAAACAAEAAABlACsAAAACAAEAAABlACwAAAACAAEAAABlAC0AAAACAAEAAABlAC4AAAACAAEAAABlAC8AAAACAAEAAABlADAAAAACAAEAAABlADEAAAACAAEAAABlADIAAAACAAEAAABlADMAAAACAAEAAABlADQAAAACAAEAAABlADUAAAACAAEAAABlADYAAAACAAEAAABlADcAAAACAAEAAABlADgAAAACAAEAAABmACYAAAACAAEAAABmACcAAAACAAEAAABmACgAAAACAAEAAABmACkAAAACAAEAAABmACoAAAACAAEAAABmACsAAAACAAEAAABmACwAAAACAAEAAABmAC0AAAACAAEAAABmAC4AAAACAAEAAABmAC8AAAACAAEAAABmADAAAAACAAEAAABmADEAAAACAAEAAABmADIAAAACAAEAAABmADMAAAACAAEAAABmADQAAAACAAEAAABmADUAAAACAAEAAABmADYAAAACAAEAAABmADcAAAACAAEAAABmADgAAAACAAEAAABGAPL/AAACAAEAAABGAPP/AAACAAEAAABGAPT/AAACAAEAAABGAPX/AAACAAEAAABGAPb/AAACAAEAAABGAPf/AAACAAEAAABGAPj/AAACAAEAAABGAPn/AAACAAEAAABGAPr/AAACAAEAAABGAPv/AAACAAEAAABGAPz/AAACAAEAAABGAP3/AAACAAEAAABGAP7/AAACAAEAAABGAP//AAACAAEAAABHAPL/AAACAAEAAABHAPP/AAACAAEAAABHAPT/AAACAAEAAABHAPX/AAACAAEAAABHAPb/AAACAAEAAABHAPf/AAACAAEAAABHAPj/AAACAAEAAABHAPn/AAACAAEAAABHAPr/AAACAAEAAABHAPv/AAACAAEAAABHAPz/AAACAAEAAABHAP3/AAACAAEAAABHAP7/AAACAAEAAABHAP//AAACAAEAAABIAPL/AAACAAEAAABIAPP/AAACAAEAAABIAPT/AAACAAEAAABIAPX/AAACAAEAAABIAPb/AAACAAEAAABIAPf/AAACAAEAAABIAPj/AAACAAEAAABIAPn/AAACAAEAAABIAPr/AAACAAEAAABIAPv/AAACAAEAAABIAPz/AAACAAEAAABIAP3/AAACAAEAAABIAP7/AAACAAEAAABIAP//AAACAAEAAABIAAAAAAACAAEAAABIAAEAAAACAAEAAABIAAIAAAACAAEAAABIAAMAAAACAAEAAABIAAQAAAACAAEAAABIAAUAAAACAAEAAABIAAYAAAACAAEAAABIAAcAAAACAAEAAABIAAgAAAACAAEAAABIAAkAAAACAAEAAABIAAoAAAACAAEAAABIAAsAAAACAAEAAABIAAwAAAACAAEAAABIAA0AAAACAAEAAABIAA4AAAACAAEAAABIAA8AAAACAAEAAABIABAAAAACAAEAAABIABEAAAACAAEAAABIABIAAAACAAEAAABIABMAAAACAAEAAABIABQAAAACAAEAAABIABUAAAACAAEAAABIABYAAAACAAEAAABIABcAAAACAAEAAABIABgAAAACAAEAAABIABkAAAACAAEAAABIABoAAAACAAEAAABIABsAAAACAAEAAABIABwAAAACAAEAAABIAB0AAAACAAEAAABIAB4AAAACAAEAAABIAB8AAAACAAEAAABIACAAAAACAAEAAABIACEAAAACAAEAAABIACIAAAACAAEAAABIACMAAAACAAEAAABIACQAAAACAAEAAABIACUAAAACAAEAAABJAPL/AAACAAEAAABJAPP/AAACAAEAAABJAPT/AAACAAEAAABJAPX/AAACAAEAAABJAPb/AAACAAEAAABJAPf/AAACAAEAAABJAPj/AAACAAEAAABJAPn/AAACAAEAAABJAPr/AAACAAEAAABJAPv/AAACAAEAAABJAPz/AAACAAEAAABJAP3/AAACAAEAAABJAP7/AAACAAEAAABJAP//AAACAAEAAABJAAAAAAACAAEAAABJAAEAAAACAAEAAABJAAIAAAACAAEAAABJAAMAAAACAAEAAABJAAQAAAACAAEAAABJAAUAAAACAAEAAABJAAYAAAACAAEAAABJAAcAAAACAAEAAABJAAgAAAACAAEAAABJAAkAAAACAAEAAABJAAoAAAACAAEAAABJAAsAAAACAAEAAABJAAwAAAACAAEAAABJAA0AAAACAAEAAABJAA4AAAACAAEAAABJAA8AAAACAAEAAABJABAAAAACAAEAAABJABEAAAACAAEAAABJABIAAAACAAEAAABJABMAAAACAAEAAABJABQAAAACAAEAAABJABUAAAACAAEAAABJABYAAAACAAEAAABJABcAAAACAAEAAABJABgAAAACAAEAAABJABkAAAACAAEAAABJABoAAAACAAEAAABJABsAAAACAAEAAABJABwAAAACAAEAAABJAB0AAAACAAEAAABJAB4AAAACAAEAAABJAB8AAAACAAEAAABJACAAAAACAAEAAABJACEAAAACAAEAAABJACIAAAACAAEAAABJACMAAAACAAEAAABJACQAAAACAAEAAABJACUAAAACAAEAAABKAPL/AAACAAEAAABKAPP/AAACAAEAAABKAPT/AAACAAEAAABKAPX/AAACAAEAAABKAPb/AAACAAEAAABKAPf/AAACAAEAAABKAPj/AAACAAEAAABKAPn/AAACAAEAAABKAPr/AAACAAEAAABKAPv/AAACAAEAAABKAPz/AAACAAEAAABKAP3/AAACAAEAAABKAP7/AAACAAEAAABKAP//AAACAAEAAABKAAAAAAACAAEAAABKAAEAAAACAAEAAABKAAIAAAACAAEAAABKAAMAAAACAAEAAABKAAQAAAACAAEAAABKAAUAAAACAAEAAABKAAYAAAACAAEAAABKAAcAAAACAAEAAABKAAgAAAACAAEAAABKAAkAAAACAAEAAABKAAoAAAACAAEAAABKAAsAAAACAAEAAABKAAwAAAACAAEAAABKAA0AAAACAAEAAABKAA4AAAACAAEAAABKAA8AAAACAAEAAABKABAAAAACAAEAAABKABEAAAACAAEAAABKABIAAAACAAEAAABKABMAAAACAAEAAABKABQAAAACAAEAAABKABUAAAACAAEAAABKABYAAAACAAEAAABKABcAAAACAAEAAABKABgAAAACAAEAAABKABkAAAACAAEAAABKABoAAAACAAEAAABKABsAAAACAAEAAABKABwAAAACAAEAAABKAB0AAAACAAEAAABKAB4AAAACAAEAAABKAB8AAAACAAEAAABKACAAAAACAAEAAABKACEAAAACAAEAAABKACIAAAACAAEAAABKACMAAAACAAEAAABKACQAAAACAAEAAABKACUAAAACAAEAAABLAPL/AAACAAEAAABLAPP/AAACAAEAAABLAPT/AAACAAEAAABLAPX/AAACAAEAAABLAPb/AAACAAEAAABLAPf/AAACAAEAAABLAPj/AAACAAEAAABLAPn/AAACAAEAAABLAPr/AAACAAEAAABLAPv/AAACAAEAAABLAPz/AAACAAEAAABLAP3/AAACAAEAAABLAP7/AAACAAEAAABLAP//AAACAAEAAABLAAAAAAACAAEAAABLAAEAAAACAAEAAABLAAIAAAACAAEAAABLAAMAAAACAAEAAABLAAQAAAACAAEAAABLAAUAAAACAAEAAABLAAYAAAACAAEAAABLAAcAAAACAAEAAABLAAgAAAACAAEAAABLAAkAAAACAAEAAABLAAoAAAACAAEAAABLAAsAAAACAAEAAABLAAwAAAACAAEAAABLAA0AAAACAAEAAABLAA4AAAACAAEAAABLAA8AAAACAAEAAABLABAAAAACAAEAAABLABEAAAACAAEAAABLABIAAAACAAEAAABLABMAAAACAAEAAABLABQAAAACAAEAAABLABUAAAACAAEAAABLABYAAAACAAEAAABLABcAAAACAAEAAABLABgAAAACAAEAAABLABkAAAACAAEAAABLABoAAAACAAEAAABLABsAAAACAAEAAABLABwAAAACAAEAAABLAB0AAAACAAEAAABLAB4AAAACAAEAAABLAB8AAAACAAEAAABLACAAAAACAAEAAABLACEAAAACAAEAAABLACIAAAACAAEAAABLACMAAAACAAEAAABLACQAAAACAAEAAABLACUAAAACAAEAAABMAPL/AAACAAEAAABMAPP/AAACAAEAAABMAPT/AAACAAEAAABMAPX/AAACAAEAAABMAPb/AAACAAEAAABMAPf/AAACAAEAAABMAPj/AAACAAEAAABMAPn/AAACAAEAAABMAPr/AAACAAEAAABMAPv/AAACAAEAAABMAPz/AAACAAEAAABMAP3/AAACAAEAAABMAP7/AAACAAEAAABMAP//AAACAAEAAABMAAAAAAACAAEAAABMAAEAAAACAAEAAABMAAIAAAACAAEAAABMAAMAAAACAAEAAABMAAQAAAACAAEAAABMAAUAAAACAAEAAABMAAYAAAACAAEAAABMAAcAAAACAAEAAABMAAgAAAACAAEAAABMAAkAAAACAAEAAABMAAoAAAACAAEAAABMAAsAAAACAAEAAABMAAwAAAACAAEAAABMAA0AAAACAAEAAABMAA4AAAACAAEAAABMAA8AAAACAAEAAABMABAAAAACAAEAAABMABEAAAACAAEAAABMABIAAAACAAEAAABMABMAAAACAAEAAABMABQAAAACAAEAAABMABUAAAACAAEAAABMABYAAAACAAEAAABMABcAAAACAAEAAABMABgAAAACAAEAAABMABkAAAACAAEAAABMABoAAAACAAEAAABMABsAAAACAAEAAABMABwAAAACAAEAAABMAB0AAAACAAEAAABMAB4AAAACAAEAAABMAB8AAAACAAEAAABMACAAAAACAAEAAABMACEAAAACAAEAAABMACIAAAACAAEAAABMACMAAAACAAEAAABMACQAAAACAAEAAABMACUAAAACAAEAAABNAPL/AAACAAEAAABNAPP/AAACAAEAAABNAPT/AAACAAEAAABNAPX/AAACAAEAAABNAPb/AAACAAEAAABNAPf/AAACAAEAAABNAPj/AAACAAEAAABNAPn/AAACAAEAAABNAPr/AAACAAEAAABNAPv/AAACAAEAAABNAPz/AAACAAEAAABNAP3/AAACAAEAAABNAP7/AAACAAEAAABNAP//AAACAAEAAABNAAAAAAACAAEAAABNAAEAAAACAAEAAABNAAIAAAACAAEAAABNAAMAAAACAAEAAABNAAQAAAACAAEAAABNAAUAAAACAAEAAABNAAYAAAACAAEAAABNAAcAAAACAAEAAABNAAgAAAACAAEAAABNAAkAAAACAAEAAABNAAoAAAACAAEAAABNAAsAAAACAAEAAABNAAwAAAACAAEAAABNAA0AAAACAAEAAABNAA4AAAACAAEAAABNAA8AAAACAAEAAABNABAAAAACAAEAAABNABEAAAACAAEAAABNABIAAAACAAEAAABNABMAAAACAAEAAABNABQAAAACAAEAAABNABUAAAACAAEAAABNABYAAAACAAEAAABNABcAAAACAAEAAABNABgAAAACAAEAAABNABkAAAACAAEAAABNABoAAAACAAEAAABNABsAAAACAAEAAABNABwAAAACAAEAAABNAB0AAAACAAEAAABNAB4AAAACAAEAAABNAB8AAAACAAEAAABNACAAAAACAAEAAABNACEAAAACAAEAAABNACIAAAACAAEAAABNACMAAAACAAEAAABNACQAAAACAAEAAABNACUAAAACAAEAAABOAPL/AAACAAEAAABOAPP/AAACAAEAAABOAPT/AAACAAEAAABOAPX/AAACAAEAAABOAPb/AAACAAEAAABOAPf/AAACAAEAAABOAPj/AAACAAEAAABOAPn/AAACAAEAAABOAPr/AAACAAEAAABOAPv/AAACAAEAAABOAPz/AAACAAEAAABOAP3/AAACAAEAAABOAP7/AAACAAEAAABOAP//AAACAAEAAABOAAAAAAACAAEAAABOAAEAAAACAAEAAABOAAIAAAACAAEAAABOAAMAAAACAAEAAABOAAQAAAACAAEAAABOAAUAAAACAAEAAABOAAYAAAACAAEAAABOAAcAAAACAAEAAABOAAgAAAACAAEAAABOAAkAAAACAAEAAABOAAoAAAACAAEAAABOAAsAAAACAAEAAABOAAwAAAACAAEAAABOAA0AAAACAAEAAABOAA4AAAACAAEAAABOAA8AAAACAAEAAABOABAAAAACAAEAAABOABEAAAACAAEAAABOABIAAAACAAEAAABOABMAAAACAAEAAABOABQAAAACAAEAAABOABUAAAACAAEAAABOABYAAAACAAEAAABOABcAAAACAAEAAABOABgAAAACAAEAAABOABkAAAACAAEAAABOABoAAAACAAEAAABOABsAAAACAAEAAABOABwAAAACAAEAAABOAB0AAAACAAEAAABOAB4AAAACAAEAAABOAB8AAAACAAEAAABOACAAAAACAAEAAABOACEAAAACAAEAAABOACIAAAACAAEAAABOACMAAAACAAEAAABOACQAAAACAAEAAABOACUAAAACAAEAAABPAPL/AAACAAEAAABPAPP/AAACAAEAAABPAPT/AAACAAEAAABPAPX/AAACAAEAAABPAPb/AAACAAEAAABPAPf/AAACAAEAAABPAPj/AAACAAEAAABPAPn/AAACAAEAAABPAPr/AAACAAEAAABPAPv/AAACAAEAAABPAPz/AAACAAEAAABPAP3/AAACAAEAAABPAP7/AAACAAEAAABPAP//AAACAAEAAABPAAAAAAACAAEAAABPAAEAAAACAAEAAABPAAIAAAACAAEAAABPAAMAAAACAAEAAABPAAQAAAACAAEAAABPAAUAAAACAAEAAABPAAYAAAACAAEAAABPAAcAAAACAAEAAABPAAgAAAACAAEAAABPAAkAAAACAAEAAABPAAoAAAACAAEAAABPAAsAAAACAAEAAABPAAwAAAACAAEAAABPAA0AAAACAAEAAABPAA4AAAACAAEAAABPAA8AAAACAAEAAABPABAAAAACAAEAAABPABEAAAACAAEAAABPABIAAAACAAEAAABPABMAAAACAAEAAABPABQAAAACAAEAAABPABUAAAACAAEAAABPABYAAAACAAEAAABPABcAAAACAAEAAABPABgAAAACAAEAAABPABkAAAACAAEAAABPABoAAAACAAEAAABPABsAAAACAAEAAABPABwAAAACAAEAAABPAB0AAAACAAEAAABPAB4AAAACAAEAAABPAB8AAAACAAEAAABPACAAAAACAAEAAABPACEAAAACAAEAAABPACIAAAACAAEAAABPACMAAAACAAEAAABPACQAAAACAAEAAABPACUAAAACAAEAAABQAPL/AAACAAEAAABQAPP/AAACAAEAAABQAPT/AAACAAEAAABQAPX/AAACAAEAAABQAPb/AAACAAEAAABQAPf/AAACAAEAAABQAPj/AAACAAEAAABQAPn/AAACAAEAAABQAPr/AAACAAEAAABQAPv/AAACAAEAAABQAPz/AAACAAEAAABQAP3/AAACAAEAAABQAP7/AAACAAEAAABQAP//AAACAAEAAABQAAAAAAACAAEAAABQAAEAAAACAAEAAABQAAIAAAACAAEAAABQAAMAAAACAAEAAABQAAQAAAACAAEAAABQAAUAAAACAAEAAABQAAYAAAACAAEAAABQAAcAAAACAAEAAABQAAgAAAACAAEAAABQAAkAAAACAAEAAABQAAoAAAACAAEAAABQAAsAAAACAAEAAABQAAwAAAACAAEAAABQAA0AAAACAAEAAABQAA4AAAACAAEAAABQAA8AAAACAAEAAABQABAAAAACAAEAAABQABEAAAACAAEAAABQABIAAAACAAEAAABQABMAAAACAAEAAABQABQAAAACAAEAAABQABUAAAACAAEAAABQABYAAAACAAEAAABQABcAAAACAAEAAABQABgAAAACAAEAAABQABkAAAACAAEAAABQABoAAAACAAEAAABQABsAAAACAAEAAABQABwAAAACAAEAAABQAB0AAAACAAEAAABQAB4AAAACAAEAAABQAB8AAAACAAEAAABQACAAAAACAAEAAABQACEAAAACAAEAAABQACIAAAACAAEAAABQACMAAAACAAEAAABQACQAAAACAAEAAABQACUAAAACAAEAAABRAPL/AAACAAEAAABRAPP/AAACAAEAAABRAPT/AAACAAEAAABRAPX/AAACAAEAAABRAPb/AAACAAEAAABRAPf/AAACAAEAAABRAPj/AAACAAEAAABRAPn/AAACAAEAAABRAPr/AAACAAEAAABRAPv/AAACAAEAAABRAPz/AAACAAEAAABRAP3/AAACAAEAAABRAP7/AAACAAEAAABRAP//AAACAAEAAABRAAAAAAACAAEAAABRAAEAAAACAAEAAABRAAIAAAACAAEAAABRAAMAAAACAAEAAABRAAQAAAACAAEAAABRAAUAAAACAAEAAABRAAYAAAACAAEAAABRAAcAAAACAAEAAABRAAgAAAACAAEAAABRAAkAAAACAAEAAABRAAoAAAACAAEAAABRAAsAAAACAAEAAABRAAwAAAACAAEAAABRAA0AAAACAAEAAABRAA4AAAACAAEAAABRAA8AAAACAAEAAABRABAAAAACAAEAAABRABEAAAACAAEAAABRABIAAAACAAEAAABRABMAAAACAAEAAABRABQAAAACAAEAAABRABUAAAACAAEAAABRABYAAAACAAEAAABRABcAAAACAAEAAABRABgAAAACAAEAAABRABkAAAACAAEAAABRABoAAAACAAEAAABRABsAAAACAAEAAABRABwAAAACAAEAAABRAB0AAAACAAEAAABRAB4AAAACAAEAAABRAB8AAAACAAEAAABRACAAAAACAAEAAABRACEAAAACAAEAAABRACIAAAACAAEAAABRACMAAAACAAEAAABRACQAAAACAAEAAABRACUAAAACAAEAAABSAPL/AAACAAEAAABSAPP/AAACAAEAAABSAPT/AAACAAEAAABSAPX/AAACAAEAAABSAPb/AAACAAEAAABSAPf/AAACAAEAAABSAPj/AAACAAEAAABSAPn/AAACAAEAAABSAPr/AAACAAEAAABSAPv/AAACAAEAAABSAPz/AAACAAEAAABSAP3/AAACAAEAAABSAP7/AAACAAEAAABSAP//AAACAAEAAABSAAAAAAACAAEAAABSAAEAAAACAAEAAABSAAIAAAACAAEAAABSAAMAAAACAAEAAABSAAQAAAACAAEAAABSAAUAAAACAAEAAABSAAYAAAACAAEAAABSAAcAAAACAAEAAABSAAgAAAACAAEAAABSAAkAAAACAAEAAABSAAoAAAACAAEAAABSAAsAAAACAAEAAABSAAwAAAACAAEAAABSAA0AAAACAAEAAABSAA4AAAACAAEAAABSAA8AAAACAAEAAABSABAAAAACAAEAAABSABEAAAACAAEAAABSABIAAAACAAEAAABSABMAAAACAAEAAABSABQAAAACAAEAAABSABUAAAACAAEAAABSABYAAAACAAEAAABSABcAAAACAAEAAABSABgAAAACAAEAAABSABkAAAACAAEAAABSABoAAAACAAEAAABSABsAAAACAAEAAABSABwAAAACAAEAAABSAB0AAAACAAEAAABSAB4AAAACAAEAAABSAB8AAAACAAEAAABSACAAAAACAAEAAABSACEAAAACAAEAAABSACIAAAACAAEAAABSACMAAAACAAEAAABSACQAAAACAAEAAABSACUAAAACAAEAAABTAPL/AAACAAEAAABTAPP/AAACAAEAAABTAPT/AAACAAEAAABTAPX/AAACAAEAAABTAPb/AAACAAEAAABTAPf/AAACAAEAAABTAPj/AAACAAEAAABTAPn/AAACAAEAAABTAPr/AAACAAEAAABTAPv/AAACAAEAAABTAPz/AAACAAEAAABTAP3/AAACAAEAAABTAP7/AAACAAEAAABTAP//AAACAAEAAABTAAAAAAACAAEAAABTAAEAAAACAAEAAABTAAIAAAACAAEAAABTAAMAAAACAAEAAABTAAQAAAACAAEAAABTAAUAAAACAAEAAABTAAYAAAACAAEAAABTAAcAAAACAAEAAABTAAgAAAACAAEAAABTAAkAAAACAAEAAABTAAoAAAACAAEAAABTAAsAAAACAAEAAABTAAwAAAACAAEAAABTAA0AAAACAAEAAABTAA4AAAACAAEAAABTAA8AAAACAAEAAABTABAAAAACAAEAAABTABEAAAACAAEAAABTABIAAAACAAEAAABTABMAAAACAAEAAABTABQAAAACAAEAAABTABUAAAACAAEAAABTABYAAAACAAEAAABTABcAAAACAAEAAABTABgAAAACAAEAAABTABkAAAACAAEAAABTABoAAAACAAEAAABTABsAAAACAAEAAABTABwAAAACAAEAAABTAB0AAAACAAEAAABTAB4AAAACAAEAAABTAB8AAAACAAEAAABTACAAAAACAAEAAABTACEAAAACAAEAAABTACIAAAACAAEAAABTACMAAAACAAEAAABTACQAAAACAAEAAABTACUAAAACAAEAAABUAPL/AAACAAEAAABUAPP/AAACAAEAAABUAPT/AAACAAEAAABUAPX/AAACAAEAAABUAPb/AAACAAEAAABUAPf/AAACAAEAAABUAPj/AAACAAEAAABUAPn/AAACAAEAAABUAPr/AAACAAEAAABUAPv/AAACAAEAAABUAPz/AAACAAEAAABUAP3/AAACAAEAAABUAP7/AAACAAEAAABUAP//AAACAAEAAABUAAAAAAACAAEAAABUAAEAAAACAAEAAABUAAIAAAACAAEAAABUAAMAAAACAAEAAABUAAQAAAACAAEAAABUAAUAAAACAAEAAABUAAYAAAACAAEAAABUAAcAAAACAAEAAABUAAgAAAACAAEAAABUAAkAAAACAAEAAABUAAoAAAACAAEAAABUAAsAAAACAAEAAABUAAwAAAACAAEAAABUAA0AAAACAAEAAABUAA4AAAACAAEAAABUAA8AAAACAAEAAABUABAAAAACAAEAAABUABEAAAACAAEAAABUABIAAAACAAEAAABUABMAAAACAAEAAABUABQAAAACAAEAAABUABUAAAACAAEAAABUABYAAAACAAEAAABUABcAAAACAAEAAABUABgAAAACAAEAAABUABkAAAACAAEAAABUABoAAAACAAEAAABUABsAAAACAAEAAABUABwAAAACAAEAAABUAB0AAAACAAEAAABUAB4AAAACAAEAAABUAB8AAAACAAEAAABUACAAAAACAAEAAABUACEAAAACAAEAAABUACIAAAACAAEAAABUACMAAAACAAEAAABUACQAAAACAAEAAABUACUAAAACAAEAAABVAPL/AAACAAEAAABVAPP/AAACAAEAAABVAPT/AAACAAEAAABVAPX/AAACAAEAAABVAPb/AAACAAEAAABVAPf/AAACAAEAAABVAPj/AAACAAEAAABVAPn/AAACAAEAAABVAPr/AAACAAEAAABVAPv/AAACAAEAAABVAPz/AAACAAEAAABVAP3/AAACAAEAAABVAP7/AAACAAEAAABVAP//AAACAAEAAABVAAAAAAACAAEAAABVAAEAAAACAAEAAABVAAIAAAACAAEAAABVAAMAAAACAAEAAABVAAQAAAACAAEAAABVAAUAAAACAAEAAABVAAYAAAACAAEAAABVAAcAAAACAAEAAABVAAgAAAACAAEAAABVAAkAAAACAAEAAABVAAoAAAACAAEAAABVAAsAAAACAAEAAABVAAwAAAACAAEAAABVAA0AAAACAAEAAABVAA4AAAACAAEAAABVAA8AAAACAAEAAABVABAAAAACAAEAAABVABEAAAACAAEAAABVABIAAAACAAEAAABVABMAAAACAAEAAABVABQAAAACAAEAAABVABUAAAACAAEAAABVABYAAAACAAEAAABVABcAAAACAAEAAABVABgAAAACAAEAAABVABkAAAACAAEAAABVABoAAAACAAEAAABVABsAAAACAAEAAABVABwAAAACAAEAAABVAB0AAAACAAEAAABVAB4AAAACAAEAAABVAB8AAAACAAEAAABVACAAAAACAAEAAABVACEAAAACAAEAAABVACIAAAACAAEAAABVACMAAAACAAEAAABVACQAAAACAAEAAABVACUAAAACAAEAAABWAPL/AAACAAEAAABWAPP/AAACAAEAAABWAPT/AAACAAEAAABWAPX/AAACAAEAAABWAPb/AAACAAEAAABWAPf/AAACAAEAAABWAPj/AAACAAEAAABWAPn/AAACAAEAAABWAPr/AAACAAEAAABWAPv/AAACAAEAAABWAPz/AAACAAEAAABWAP3/AAACAAEAAABWAP7/AAACAAEAAABWAP//AAACAAEAAABWAAAAAAACAAEAAABWAAEAAAACAAEAAABWAAIAAAACAAEAAABWAAMAAAACAAEAAABWAAQAAAACAAEAAABWAAUAAAACAAEAAABWAAYAAAACAAEAAABWAAcAAAACAAEAAABWAAgAAAACAAEAAABWAAkAAAACAAEAAABWAAoAAAACAAEAAABWAAsAAAACAAEAAABWAAwAAAACAAEAAABWAA0AAAACAAEAAABWAA4AAAACAAEAAABWAA8AAAACAAEAAABWABAAAAACAAEAAABWABEAAAACAAEAAABWABIAAAACAAEAAABWABMAAAACAAEAAABWABQAAAACAAEAAABWABUAAAACAAEAAABWABYAAAACAAEAAABWABcAAAACAAEAAABWABgAAAACAAEAAABWABkAAAACAAEAAABWABoAAAACAAEAAABWABsAAAACAAEAAABWABwAAAACAAEAAABWAB0AAAACAAEAAABWAB4AAAACAAEAAABWAB8AAAACAAEAAABWACAAAAACAAEAAABWACEAAAACAAEAAABWACIAAAACAAEAAABWACMAAAACAAEAAABWACQAAAACAAEAAABWACUAAAACAAEAAABXAPL/AAACAAEAAABXAPP/AAACAAEAAABXAPT/AAACAAEAAABXAPX/AAACAAEAAABXAPb/AAACAAEAAABXAPf/AAACAAEAAABXAPj/AAACAAEAAABXAPn/AAACAAEAAABXAPr/AAACAAEAAABXAPv/AAACAAEAAABXAPz/AAACAAEAAABXAP3/AAACAAEAAABXAP7/AAACAAEAAABXAP//AAACAAEAAABXAAAAAAACAAEAAABXAAEAAAACAAEAAABXAAIAAAACAAEAAABXAAMAAAACAAEAAABXAAQAAAACAAEAAABXAAUAAAACAAEAAABXAAYAAAACAAEAAABXAAcAAAACAAEAAABXAAgAAAACAAEAAABXAAkAAAACAAEAAABXAAoAAAACAAEAAABXAAsAAAACAAEAAABXAAwAAAACAAEAAABXAA0AAAACAAEAAABXAA4AAAACAAEAAABXAA8AAAACAAEAAABXABAAAAACAAEAAABXABEAAAACAAEAAABXABIAAAACAAEAAABXABMAAAACAAEAAABXABQAAAACAAEAAABXABUAAAACAAEAAABXABYAAAACAAEAAABXABcAAAACAAEAAABXABgAAAACAAEAAABXABkAAAACAAEAAABXABoAAAACAAEAAABXABsAAAACAAEAAABXABwAAAACAAEAAABXAB0AAAACAAEAAABXAB4AAAACAAEAAABXAB8AAAACAAEAAABXACAAAAACAAEAAABXACEAAAACAAEAAABXACIAAAACAAEAAABXACMAAAACAAEAAABXACQAAAACAAEAAABXACUAAAACAAEAAABYAPL/AAACAAEAAABYAPP/AAACAAEAAABYAPT/AAACAAEAAABYAPX/AAACAAEAAABYAPb/AAACAAEAAABYAPf/AAACAAEAAABYAPj/AAACAAEAAABYAPn/AAACAAEAAABYAPr/AAACAAEAAABYAPv/AAACAAEAAABYAPz/AAACAAEAAABYAP3/AAACAAEAAABYAP7/AAACAAEAAABYAP//AAACAAEAAABYAAAAAAACAAEAAABYAAEAAAACAAEAAABYAAIAAAACAAEAAABYAAMAAAACAAEAAABYAAQAAAACAAEAAABYAAUAAAACAAEAAABYAAYAAAACAAEAAABYAAcAAAACAAEAAABYAAgAAAACAAEAAABYAAkAAAACAAEAAABYAAoAAAACAAEAAABYAAsAAAACAAEAAABYAAwAAAACAAEAAABYAA0AAAACAAEAAABYAA4AAAACAAEAAABYAA8AAAACAAEAAABYABAAAAACAAEAAABYABEAAAACAAEAAABYABIAAAACAAEAAABYABMAAAACAAEAAABYABQAAAACAAEAAABYABUAAAACAAEAAABYABYAAAACAAEAAABYABcAAAACAAEAAABYABgAAAACAAEAAABYABkAAAACAAEAAABYABoAAAACAAEAAABYABsAAAACAAEAAABYABwAAAACAAEAAABYAB0AAAACAAEAAABYAB4AAAACAAEAAABYAB8AAAACAAEAAABYACAAAAACAAEAAABYACEAAAACAAEAAABYACIAAAACAAEAAABYACMAAAACAAEAAABYACQAAAACAAEAAABYACUAAAACAAEAAABZAPL/AAACAAEAAABZAPP/AAACAAEAAABZAPT/AAACAAEAAABZAPX/AAACAAEAAABZAPb/AAACAAEAAABZAPf/AAACAAEAAABZAPj/AAACAAEAAABZAPn/AAACAAEAAABZAPr/AAACAAEAAABZAPv/AAACAAEAAABZAPz/AAACAAEAAABZAP3/AAACAAEAAABZAP7/AAACAAEAAABZAP//AAACAAEAAABZAAAAAAACAAEAAABZAAEAAAACAAEAAABZAAIAAAACAAEAAABZAAMAAAACAAEAAABZAAQAAAACAAEAAABZAAUAAAACAAEAAABZAAYAAAACAAEAAABZAAcAAAACAAEAAABZAAgAAAACAAEAAABZAAkAAAACAAEAAABZAAoAAAACAAEAAABZAAsAAAACAAEAAABZAAwAAAACAAEAAABZAA0AAAACAAEAAABZAA4AAAACAAEAAABZAA8AAAACAAEAAABZABAAAAACAAEAAABZABEAAAACAAEAAABZABIAAAACAAEAAABZABMAAAACAAEAAABZABQAAAACAAEAAABZABUAAAACAAEAAABZABYAAAACAAEAAABZABcAAAACAAEAAABZABgAAAACAAEAAABZABkAAAACAAEAAABZABoAAAACAAEAAABZABsAAAACAAEAAABZABwAAAACAAEAAABZAB0AAAACAAEAAABZAB4AAAACAAEAAABZAB8AAAACAAEAAABZACAAAAACAAEAAABZACEAAAACAAEAAABZACIAAAACAAEAAABZACMAAAACAAEAAABZACQAAAACAAEAAABZACUAAAACAAEAAABaAPL/AAACAAEAAABaAPP/AAACAAEAAABaAPT/AAACAAEAAABaAPX/AAACAAEAAABaAPb/AAACAAEAAABaAPf/AAACAAEAAABaAPj/AAACAAEAAABaAPn/AAACAAEAAABaAPr/AAACAAEAAABaAPv/AAACAAEAAABaAPz/AAACAAEAAABaAP3/AAACAAEAAABaAP7/AAACAAEAAABaAP//AAACAAEAAABaAAAAAAACAAEAAABaAAEAAAACAAEAAABaAAIAAAACAAEAAABaAAMAAAACAAEAAABaAAQAAAACAAEAAABaAAUAAAACAAEAAABaAAYAAAACAAEAAABaAAcAAAACAAEAAABaAAgAAAACAAEAAABaAAkAAAACAAEAAABaAAoAAAACAAEAAABaAAsAAAACAAEAAABaAAwAAAACAAEAAABaAA0AAAACAAEAAABaAA4AAAACAAEAAABaAA8AAAACAAEAAABaABAAAAACAAEAAABaABEAAAACAAEAAABaABIAAAACAAEAAABaABMAAAACAAEAAABaABQAAAACAAEAAABaABUAAAACAAEAAABaABYAAAACAAEAAABaABcAAAACAAEAAABaABgAAAACAAEAAABaABkAAAACAAEAAABaABoAAAACAAEAAABaABsAAAACAAEAAABaABwAAAACAAEAAABaAB0AAAACAAEAAABaAB4AAAACAAEAAABaAB8AAAACAAEAAABaACAAAAACAAEAAABaACEAAAACAAEAAABaACIAAAACAAEAAABaACMAAAACAAEAAABaACQAAAACAAEAAABaACUAAAACAAEAAABbAPL/AAACAAEAAABbAPP/AAACAAEAAABbAPT/AAACAAEAAABbAPX/AAACAAEAAABbAPb/AAACAAEAAABbAPf/AAACAAEAAABbAPj/AAACAAEAAABbAPn/AAACAAEAAABbAPr/AAACAAEAAABbAPv/AAACAAEAAABbAPz/AAACAAEAAABbAP3/AAACAAEAAABbAP7/AAACAAEAAABbAP//AAACAAEAAABbAAAAAAACAAEAAABbAAEAAAACAAEAAABbAAIAAAACAAEAAABbAAMAAAACAAEAAABbAAQAAAACAAEAAABbAAUAAAACAAEAAABbAAYAAAACAAEAAABbAAcAAAACAAEAAABbAAgAAAACAAEAAABbAAkAAAACAAEAAABbAAoAAAACAAEAAABbAAsAAAACAAEAAABbAAwAAAACAAEAAABbAA0AAAACAAEAAABbAA4AAAACAAEAAABbAA8AAAACAAEAAABbABAAAAACAAEAAABbABEAAAACAAEAAABbABIAAAACAAEAAABbABMAAAACAAEAAABbABQAAAACAAEAAABbABUAAAACAAEAAABbABYAAAACAAEAAABbABcAAAACAAEAAABbABgAAAACAAEAAABbABkAAAACAAEAAABbABoAAAACAAEAAABbABsAAAACAAEAAABbABwAAAACAAEAAABbAB0AAAACAAEAAABbAB4AAAACAAEAAABbAB8AAAACAAEAAABbACAAAAACAAEAAABbACEAAAACAAEAAABbACIAAAACAAEAAABbACMAAAACAAEAAABbACQAAAACAAEAAABbACUAAAACAAEAAABcAPL/AAACAAEAAABcAPP/AAACAAEAAABcAPT/AAACAAEAAABcAPX/AAACAAEAAABcAPb/AAACAAEAAABcAPf/AAACAAEAAABcAPj/AAACAAEAAABcAPn/AAACAAEAAABcAPr/AAACAAEAAABcAPv/AAACAAEAAABcAPz/AAACAAEAAABcAP3/AAACAAEAAABcAP7/AAACAAEAAABcAP//AAACAAEAAABcAAAAAAACAAEAAABcAAEAAAACAAEAAABcAAIAAAACAAEAAABcAAMAAAACAAEAAABcAAQAAAACAAEAAABcAAUAAAACAAEAAABcAAYAAAACAAEAAABcAAcAAAACAAEAAABcAAgAAAACAAEAAABcAAkAAAACAAEAAABcAAoAAAACAAEAAABcAAsAAAACAAEAAABcAAwAAAACAAEAAABcAA0AAAACAAEAAABcAA4AAAACAAEAAABcAA8AAAACAAEAAABcABAAAAACAAEAAABcABEAAAACAAEAAABcABIAAAACAAEAAABcABMAAAACAAEAAABcABQAAAACAAEAAABcABUAAAACAAEAAABcABYAAAACAAEAAABcABcAAAACAAEAAABcABgAAAACAAEAAABcABkAAAACAAEAAABcABoAAAACAAEAAABcABsAAAACAAEAAABcABwAAAACAAEAAABcAB0AAAACAAEAAABcAB4AAAACAAEAAABcAB8AAAACAAEAAABcACAAAAACAAEAAABcACEAAAACAAEAAABcACIAAAACAAEAAABcACMAAAACAAEAAABcACQAAAACAAEAAABcACUAAAACAAEAAABdAPL/AAACAAEAAABdAPP/AAACAAEAAABdAPT/AAACAAEAAABdAPX/AAACAAEAAABdAPb/AAACAAEAAABdAPf/AAACAAEAAABdAPj/AAACAAEAAABdAPn/AAACAAEAAABdAPr/AAACAAEAAABdAPv/AAACAAEAAABdAPz/AAACAAEAAABdAP3/AAACAAEAAABdAP7/AAACAAEAAABdAP//AAACAAEAAABdAAAAAAACAAEAAABdAAEAAAACAAEAAABdAAIAAAACAAEAAABdAAMAAAACAAEAAABdAAQAAAACAAEAAABdAAUAAAACAAEAAABdAAYAAAACAAEAAABdAAcAAAACAAEAAABdAAgAAAACAAEAAABdAAkAAAACAAEAAABdAAoAAAACAAEAAABdAAsAAAACAAEAAABdAAwAAAACAAEAAABdAA0AAAACAAEAAABdAA4AAAACAAEAAABdAA8AAAACAAEAAABdABAAAAACAAEAAABdABEAAAACAAEAAABdABIAAAACAAEAAABdABMAAAACAAEAAABdABQAAAACAAEAAABdABUAAAACAAEAAABdABYAAAACAAEAAABdABcAAAACAAEAAABdABgAAAACAAEAAABdABkAAAACAAEAAABdABoAAAACAAEAAABdABsAAAACAAEAAABdABwAAAACAAEAAABdAB0AAAACAAEAAABdAB4AAAACAAEAAABdAB8AAAACAAEAAABdACAAAAACAAEAAABdACEAAAACAAEAAABdACIAAAACAAEAAABdACMAAAACAAEAAABdACQAAAACAAEAAABdACUAAAACAAEAAABeAPL/AAACAAEAAABeAPP/AAACAAEAAABeAPT/AAACAAEAAABeAPX/AAACAAEAAABeAPb/AAACAAEAAABeAPf/AAACAAEAAABeAPj/AAACAAEAAABeAPn/AAACAAEAAABeAPr/AAACAAEAAABeAPv/AAACAAEAAABeAPz/AAACAAEAAABeAP3/AAACAAEAAABeAP7/AAACAAEAAABeAP//AAACAAEAAABeAAAAAAACAAEAAABeAAEAAAACAAEAAABeAAIAAAACAAEAAABeAAMAAAACAAEAAABeAAQAAAACAAEAAABeAAUAAAACAAEAAABeAAYAAAACAAEAAABeAAcAAAACAAEAAABeAAgAAAACAAEAAABeAAkAAAACAAEAAABeAAoAAAACAAEAAABeAAsAAAACAAEAAABeAAwAAAACAAEAAABeAA0AAAACAAEAAABeAA4AAAACAAEAAABeAA8AAAACAAEAAABeABAAAAACAAEAAABeABEAAAACAAEAAABeABIAAAACAAEAAABeABMAAAACAAEAAABeABQAAAACAAEAAABeABUAAAACAAEAAABeABYAAAACAAEAAABeABcAAAACAAEAAABeABgAAAACAAEAAABeABkAAAACAAEAAABeABoAAAACAAEAAABeABsAAAACAAEAAABeABwAAAACAAEAAABeAB0AAAACAAEAAABeAB4AAAACAAEAAABeAB8AAAACAAEAAABeACAAAAACAAEAAABeACEAAAACAAEAAABeACIAAAACAAEAAABeACMAAAACAAEAAABeACQAAAACAAEAAABeACUAAAACAAEAAABfAPL/AAACAAEAAABfAPP/AAACAAEAAABfAPT/AAACAAEAAABfAPX/AAACAAEAAABfAPb/AAACAAEAAABfAPf/AAACAAEAAABfAPj/AAACAAEAAABfAPn/AAACAAEAAABfAPr/AAACAAEAAABfAPv/AAACAAEAAABfAPz/AAACAAEAAABfAP3/AAACAAEAAABfAP7/AAACAAEAAABfAP//AAACAAEAAABfAAAAAAACAAEAAABfAAEAAAACAAEAAABfAAIAAAACAAEAAABfAAMAAAACAAEAAABfAAQAAAACAAEAAABfAAUAAAACAAEAAABfAAYAAAACAAEAAABfAAcAAAACAAEAAABfAAgAAAACAAEAAABfAAkAAAACAAEAAABfAAoAAAACAAEAAABfAAsAAAACAAEAAABfAAwAAAACAAEAAABfAA0AAAACAAEAAABfAA4AAAACAAEAAABfAA8AAAACAAEAAABfABAAAAACAAEAAABfABEAAAACAAEAAABfABIAAAACAAEAAABfABMAAAACAAEAAABfABQAAAACAAEAAABfABUAAAACAAEAAABfABYAAAACAAEAAABfABcAAAACAAEAAABfABgAAAACAAEAAABfABkAAAACAAEAAABfABoAAAACAAEAAABfABsAAAACAAEAAABfABwAAAACAAEAAABfAB0AAAACAAEAAABfAB4AAAACAAEAAABfAB8AAAACAAEAAABfACAAAAACAAEAAABfACEAAAACAAEAAABfACIAAAACAAEAAABfACMAAAACAAEAAABfACQAAAACAAEAAABfACUAAAACAAEAAABgAPL/AAACAAEAAABgAPP/AAACAAEAAABgAPT/AAACAAEAAABgAPX/AAACAAEAAABgAPb/AAACAAEAAABgAPf/AAACAAEAAABgAPj/AAACAAEAAABgAPn/AAACAAEAAABgAPr/AAACAAEAAABgAPv/AAACAAEAAABgAPz/AAACAAEAAABgAP3/AAACAAEAAABgAP7/AAACAAEAAABgAP//AAACAAEAAABgAAAAAAACAAEAAABgAAEAAAACAAEAAABgAAIAAAACAAEAAABgAAMAAAACAAEAAABgAAQAAAACAAEAAABgAAUAAAACAAEAAABgAAYAAAACAAEAAABgAAcAAAACAAEAAABgAAgAAAACAAEAAABgAAkAAAACAAEAAABgAAoAAAACAAEAAABgAAsAAAACAAEAAABgAAwAAAACAAEAAABgAA0AAAACAAEAAABgAA4AAAACAAEAAABgAA8AAAACAAEAAABgABAAAAACAAEAAABgABEAAAACAAEAAABgABIAAAACAAEAAABgABMAAAACAAEAAABgABQAAAACAAEAAABgABUAAAACAAEAAABgABYAAAACAAEAAABgABcAAAACAAEAAABgABgAAAACAAEAAABgABkAAAACAAEAAABgABoAAAACAAEAAABgABsAAAACAAEAAABgABwAAAACAAEAAABgAB0AAAACAAEAAABgAB4AAAACAAEAAABgAB8AAAACAAEAAABgACAAAAACAAEAAABgACEAAAACAAEAAABgACIAAAACAAEAAABgACMAAAACAAEAAABgACQAAAACAAEAAABgACUAAAACAAEAAABhAPL/AAACAAEAAABhAPP/AAACAAEAAABhAPT/AAACAAEAAABhAPX/AAACAAEAAABhAPb/AAACAAEAAABhAPf/AAACAAEAAABhAPj/AAACAAEAAABhAPn/AAACAAEAAABhAPr/AAACAAEAAABhAPv/AAACAAEAAABhAPz/AAACAAEAAABhAP3/AAACAAEAAABhAP7/AAACAAEAAABhAP//AAACAAEAAABhAAAAAAACAAEAAABhAAEAAAACAAEAAABhAAIAAAACAAEAAABhAAMAAAACAAEAAABhAAQAAAACAAEAAABhAAUAAAACAAEAAABhAAYAAAACAAEAAABhAAcAAAACAAEAAABhAAgAAAACAAEAAABhAAkAAAACAAEAAABhAAoAAAACAAEAAABhAAsAAAACAAEAAABhAAwAAAACAAEAAABhAA0AAAACAAEAAABhAA4AAAACAAEAAABhAA8AAAACAAEAAABhABAAAAACAAEAAABhABEAAAACAAEAAABhABIAAAACAAEAAABhABMAAAACAAEAAABhABQAAAACAAEAAABhABUAAAACAAEAAABhABYAAAACAAEAAABhABcAAAACAAEAAABhABgAAAACAAEAAABhABkAAAACAAEAAABhABoAAAACAAEAAABhABsAAAACAAEAAABhABwAAAACAAEAAABhAB0AAAACAAEAAABhAB4AAAACAAEAAABhAB8AAAACAAEAAABhACAAAAACAAEAAABhACEAAAACAAEAAABhACIAAAACAAEAAABhACMAAAACAAEAAABhACQAAAACAAEAAABhACUAAAACAAEAAABiAPL/AAACAAEAAABiAPP/AAACAAEAAABiAPT/AAACAAEAAABiAPX/AAACAAEAAABiAPb/AAACAAEAAABiAPf/AAACAAEAAABiAPj/AAACAAEAAABiAPn/AAACAAEAAABiAPr/AAACAAEAAABiAPv/AAACAAEAAABiAPz/AAACAAEAAABiAP3/AAACAAEAAABiAP7/AAACAAEAAABiAP//AAACAAEAAABiAAAAAAACAAEAAABiAAEAAAACAAEAAABiAAIAAAACAAEAAABiAAMAAAACAAEAAABiAAQAAAACAAEAAABiAAUAAAACAAEAAABiAAYAAAACAAEAAABiAAcAAAACAAEAAABiAAgAAAACAAEAAABiAAkAAAACAAEAAABiAAoAAAACAAEAAABiAAsAAAACAAEAAABiAAwAAAACAAEAAABiAA0AAAACAAEAAABiAA4AAAACAAEAAABiAA8AAAACAAEAAABiABAAAAACAAEAAABiABEAAAACAAEAAABiABIAAAACAAEAAABiABMAAAACAAEAAABiABQAAAACAAEAAABiABUAAAACAAEAAABiABYAAAACAAEAAABiABcAAAACAAEAAABiABgAAAACAAEAAABiABkAAAACAAEAAABiABoAAAACAAEAAABiABsAAAACAAEAAABiABwAAAACAAEAAABiAB0AAAACAAEAAABiAB4AAAACAAEAAABiAB8AAAACAAEAAABiACAAAAACAAEAAABiACEAAAACAAEAAABiACIAAAACAAEAAABiACMAAAACAAEAAABiACQAAAACAAEAAABiACUAAAACAAEAAABjAPL/AAACAAEAAABjAPP/AAACAAEAAABjAPT/AAACAAEAAABjAPX/AAACAAEAAABjAPb/AAACAAEAAABjAPf/AAACAAEAAABjAPj/AAACAAEAAABjAPn/AAACAAEAAABjAPr/AAACAAEAAABjAPv/AAACAAEAAABjAPz/AAACAAEAAABjAP3/AAACAAEAAABjAP7/AAACAAEAAABjAP//AAACAAEAAABjAAAAAAACAAEAAABjAAEAAAACAAEAAABjAAIAAAACAAEAAABjAAMAAAACAAEAAABjAAQAAAACAAEAAABjAAUAAAACAAEAAABjAAYAAAACAAEAAABjAAcAAAACAAEAAABjAAgAAAACAAEAAABjAAkAAAACAAEAAABjAAoAAAACAAEAAABjAAsAAAACAAEAAABjAAwAAAACAAEAAABjAA0AAAACAAEAAABjAA4AAAACAAEAAABjAA8AAAACAAEAAABjABAAAAACAAEAAABjABEAAAACAAEAAABjABIAAAACAAEAAABjABMAAAACAAEAAABjABQAAAACAAEAAABjABUAAAACAAEAAABjABYAAAACAAEAAABjABcAAAACAAEAAABjABgAAAACAAEAAABjABkAAAACAAEAAABjABoAAAACAAEAAABjABsAAAACAAEAAABjABwAAAACAAEAAABjAB0AAAACAAEAAABjAB4AAAACAAEAAABjAB8AAAACAAEAAABjACAAAAACAAEAAABjACEAAAACAAEAAABjACIAAAACAAEAAABjACMAAAACAAEAAABjACQAAAACAAEAAABjACUAAAACAAEAAABkAPL/AAACAAEAAABkAPP/AAACAAEAAABkAPT/AAACAAEAAABkAPX/AAACAAEAAABkAPb/AAACAAEAAABkAPf/AAACAAEAAABkAPj/AAACAAEAAABkAPn/AAACAAEAAABkAPr/AAACAAEAAABkAPv/AAACAAEAAABkAPz/AAACAAEAAABkAP3/AAACAAEAAABkAP7/AAACAAEAAABkAP//AAACAAEAAABkAAAAAAACAAEAAABkAAEAAAACAAEAAABkAAIAAAACAAEAAABkAAMAAAACAAEAAABkAAQAAAACAAEAAABkAAUAAAACAAEAAABkAAYAAAACAAEAAABkAAcAAAACAAEAAABkAAgAAAACAAEAAABkAAkAAAACAAEAAABkAAoAAAACAAEAAABkAAsAAAACAAEAAABkAAwAAAACAAEAAABkAA0AAAACAAEAAABkAA4AAAACAAEAAABkAA8AAAACAAEAAABkABAAAAACAAEAAABkABEAAAACAAEAAABkABIAAAACAAEAAABkABMAAAACAAEAAABkABQAAAACAAEAAABkABUAAAACAAEAAABkABYAAAACAAEAAABkABcAAAACAAEAAABkABgAAAACAAEAAABkABkAAAACAAEAAABkABoAAAACAAEAAABkABsAAAACAAEAAABkABwAAAACAAEAAABkAB0AAAACAAEAAABkAB4AAAACAAEAAABkAB8AAAACAAEAAABkACAAAAACAAEAAABkACEAAAACAAEAAABkACIAAAACAAEAAABkACMAAAACAAEAAABkACQAAAACAAEAAABkACUAAAACAAEAAABlAPL/AAACAAEAAABlAPP/AAACAAEAAABlAPT/AAACAAEAAABlAPX/AAACAAEAAABlAPb/AAACAAEAAABlAPf/AAACAAEAAABlAPj/AAACAAEAAABlAPn/AAACAAEAAABlAPr/AAACAAEAAABlAPv/AAACAAEAAABlAPz/AAACAAEAAABlAP3/AAACAAEAAABlAP7/AAACAAEAAABlAP//AAACAAEAAABlAAAAAAACAAEAAABlAAEAAAACAAEAAABlAAIAAAACAAEAAABlAAMAAAACAAEAAABlAAQAAAACAAEAAABlAAUAAAACAAEAAABlAAYAAAACAAEAAABlAAcAAAACAAEAAABlAAgAAAACAAEAAABlAAkAAAACAAEAAABlAAoAAAACAAEAAABlAAsAAAACAAEAAABlAAwAAAACAAEAAABlAA0AAAACAAEAAABlAA4AAAACAAEAAABlAA8AAAACAAEAAABlABAAAAACAAEAAABlABEAAAACAAEAAABlABIAAAACAAEAAABlABMAAAACAAEAAABlABQAAAACAAEAAABlABUAAAACAAEAAABlABYAAAACAAEAAABlABcAAAACAAEAAABlABgAAAACAAEAAABlABkAAAACAAEAAABlABoAAAACAAEAAABlABsAAAACAAEAAABlABwAAAACAAEAAABlAB0AAAACAAEAAABlAB4AAAACAAEAAABlAB8AAAACAAEAAABlACAAAAACAAEAAABlACEAAAACAAEAAABlACIAAAACAAEAAABlACMAAAACAAEAAABlACQAAAACAAEAAABlACUAAAACAAEAAABmAPL/AAACAAEAAABmAPP/AAACAAEAAABmAPT/AAACAAEAAABmAPX/AAACAAEAAABmAPb/AAACAAEAAABmAPf/AAACAAEAAABmAPj/AAACAAEAAABmAPn/AAACAAEAAABmAPr/AAACAAEAAABmAPv/AAACAAEAAABmAPz/AAACAAEAAABmAP3/AAACAAEAAABmAP7/AAACAAEAAABmAP//AAACAAEAAABmAAAAAAACAAEAAABmAAEAAAACAAEAAABmAAIAAAACAAEAAABmAAMAAAACAAEAAABmAAQAAAACAAEAAABmAAUAAAACAAEAAABmAAYAAAACAAEAAABmAAcAAAACAAEAAABmAAgAAAACAAEAAABmAAkAAAACAAEAAABmAAoAAAACAAEAAABmAAsAAAACAAEAAABmAAwAAAACAAEAAABmAA0AAAACAAEAAABmAA4AAAACAAEAAABmAA8AAAACAAEAAABmABAAAAACAAEAAABmABEAAAACAAEAAABmABIAAAACAAEAAABmABMAAAACAAEAAABmABQAAAACAAEAAABmABUAAAACAAEAAABmABYAAAACAAEAAABmABcAAAACAAEAAABmABgAAAACAAEAAABmABkAAAACAAEAAABmABoAAAACAAEAAABmABsAAAACAAEAAABmABwAAAACAAEAAABmAB0AAAACAAEAAABmAB4AAAACAAEAAABmAB8AAAACAAEAAABmACAAAAACAAEAAABmACEAAAACAAEAAABmACIAAAACAAEAAABmACMAAAACAAEAAABmACQAAAACAAEAAABmACUAAAACAAEAAADl//L/AAACAAEAAADl//P/AAACAAEAAADm//L/AAACAAEAAADm//P/AAACAAEAAADn//L/AAACAAEAAADn//P/AAACAAEAAADo//L/AAACAAEAAADo//P/AAACAAEAAADp//L/AAACAAEAAADp//P/AAACAAEAAADq//L/AAACAAEAAADq//P/AAACAAEAAADr//L/AAACAAEAAADr//P/AAACAAEAAADs//L/AAACAAEAAADs//P/AAACAAEAAADt//L/AAACAAEAAADt//P/AAACAAEAAADu//L/AAACAAEAAADu//P/AAACAAEAAADv//L/AAACAAEAAADv//P/AAACAAEAAADw//L/AAACAAEAAADw//P/AAACAAEAAADx//L/AAACAAEAAADx//P/AAACAAEAAADy//L/AAACAAEAAADy//P/AAACAAEAAADz//L/AAACAAEAAADz//P/AAACAAEAAAD0//L/AAACAAEAAAD0//P/AAACAAEAAAD1//L/AAACAAEAAAD1//P/AAACAAEAAAD2//L/AAACAAEAAAD2//P/AAACAAEAAAD3//L/AAACAAEAAAD3//P/AAACAAEAAAD4//L/AAACAAEAAAD4//P/AAACAAEAAAD5//L/AAACAAEAAAD5//P/AAACAAEAAAD6//L/AAACAAEAAAD6//P/AAACAAEAAAD7//L/AAACAAEAAAD7//P/AAACAAEAAAD8//L/AAACAAEAAAD8//P/AAACAAEAAAD9//L/AAACAAEAAAD9//P/AAACAAEAAAD+//L/AAACAAEAAAD+//P/AAACAAEAAAD///L/AAACAAEAAAD///P/AAACAAEAAAAAAPL/AAACAAEAAAAAAPP/AAACAAEAAAABAPL/AAACAAEAAAABAPP/AAACAAEAAAACAPL/AAACAAEAAAACAPP/AAACAAEAAAADAPL/AAACAAEAAAADAPP/AAACAAEAAAAEAPL/AAACAAEAAAAEAPP/AAACAAEAAAAFAPL/AAACAAEAAAAFAPP/AAACAAEAAAAGAPL/AAACAAEAAAAGAPP/AAACAAEAAAAHAPL/AAACAAEAAAAHAPP/AAACAAEAAAAIAPL/AAACAAEAAAAIAPP/AAACAAEAAAAIAPT/AAACAAEAAAAIAPX/AAACAAEAAAAIAPb/AAACAAEAAAAIAPf/AAACAAEAAAAIAPj/AAACAAEAAAAIAPn/AAACAAEAAAAIAPr/AAACAAEAAAAIAPv/AAACAAEAAAAIAPz/AAACAAEAAAAIAP3/AAACAAEAAAAIAP7/AAACAAEAAAAIAP//AAACAAEAAAAJAPL/AAACAAEAAAAJAPP/AAACAAEAAAAJAPT/AAACAAEAAAAJAPX/AAACAAEAAAAJAPb/AAACAAEAAAAJAPf/AAACAAEAAAAJAPj/AAACAAEAAAAJAPn/AAACAAEAAAAJAPr/AAACAAEAAAAJAPv/AAACAAEAAAAJAPz/AAACAAEAAAAJAP3/AAACAAEAAAAJAP7/AAACAAEAAAAJAP//AAACAAEAAAAKAPL/AAACAAEAAAAKAPP/AAACAAEAAAAKAPT/AAACAAEAAAAKAPX/AAACAAEAAAAKAPb/AAACAAEAAAAKAPf/AAACAAEAAAAKAPj/AAACAAEAAAAKAPn/AAACAAEAAAAKAPr/AAACAAEAAAAKAPv/AAACAAEAAAAKAPz/AAACAAEAAAAKAP3/AAACAAEAAAAKAP7/AAACAAEAAAAKAP//AAACAAEAAAALAPL/AAACAAEAAAALAPP/AAACAAEAAAALAPT/AAACAAEAAAALAPX/AAACAAEAAAALAPb/AAACAAEAAAALAPf/AAACAAEAAAALAPj/AAACAAEAAAALAPn/AAACAAEAAAALAPr/AAACAAEAAAALAPv/AAACAAEAAAALAPz/AAACAAEAAAALAP3/AAACAAEAAAALAP7/AAACAAEAAAALAP//AAACAAEAAAAMAPL/AAACAAEAAAAMAPP/AAACAAEAAAAMAPT/AAACAAEAAAAMAPX/AAACAAEAAAAMAPb/AAACAAEAAAAMAPf/AAACAAEAAAAMAPj/AAACAAEAAAAMAPn/AAACAAEAAAAMAPr/AAACAAEAAAAMAPv/AAACAAEAAAAMAPz/AAACAAEAAAAMAP3/AAACAAEAAAAMAP7/AAACAAEAAAAMAP//AAACAAEAAAANAPL/AAACAAEAAAANAPP/AAACAAEAAAANAPT/AAACAAEAAAANAPX/AAACAAEAAAANAPb/AAACAAEAAAANAPf/AAACAAEAAAANAPj/AAACAAEAAAANAPn/AAACAAEAAAANAPr/AAACAAEAAAANAPv/AAACAAEAAAANAPz/AAACAAEAAAANAP3/AAACAAEAAAANAP7/AAACAAEAAAANAP//AAACAAEAAAAOAPL/AAACAAEAAAAOAPP/AAACAAEAAAAOAPT/AAACAAEAAAAOAPX/AAACAAEAAAAOAPb/AAACAAEAAAAOAPf/AAACAAEAAAAOAPj/AAACAAEAAAAOAPn/AAACAAEAAAAOAPr/AAACAAEAAAAOAPv/AAACAAEAAAAOAPz/AAACAAEAAAAOAP3/AAACAAEAAAAOAP7/AAACAAEAAAAOAP//AAACAAEAAAAPAPL/AAACAAEAAAAPAPP/AAACAAEAAAAPAPT/AAACAAEAAAAPAPX/AAACAAEAAAAPAPb/AAACAAEAAAAPAPf/AAACAAEAAAAPAPj/AAACAAEAAAAPAPn/AAACAAEAAAAPAPr/AAACAAEAAAAPAPv/AAACAAEAAAAPAPz/AAACAAEAAAAPAP3/AAACAAEAAAAPAP7/AAACAAEAAAAPAP//AAACAAEAAAAQAPL/AAACAAEAAAAQAPP/AAACAAEAAAAQAPT/AAACAAEAAAAQAPX/AAACAAEAAAAQAPb/AAACAAEAAAAQAPf/AAACAAEAAAAQAPj/AAACAAEAAAAQAPn/AAACAAEAAAAQAPr/AAACAAEAAAAQAPv/AAACAAEAAAAQAPz/AAACAAEAAAAQAP3/AAACAAEAAAAQAP7/AAACAAEAAAAQAP//AAACAAEAAAARAPL/AAACAAEAAAARAPP/AAACAAEAAAARAPT/AAACAAEAAAARAPX/AAACAAEAAAARAPb/AAACAAEAAAARAPf/AAACAAEAAAARAPj/AAACAAEAAAARAPn/AAACAAEAAAARAPr/AAACAAEAAAARAPv/AAACAAEAAAARAPz/AAACAAEAAAARAP3/AAACAAEAAAARAP7/AAACAAEAAAARAP//AAACAAEAAAASAPL/AAACAAEAAAASAPP/AAACAAEAAAASAPT/AAACAAEAAAASAPX/AAACAAEAAAASAPb/AAACAAEAAAASAPf/AAACAAEAAAASAPj/AAACAAEAAAASAPn/AAACAAEAAAASAPr/AAACAAEAAAASAPv/AAACAAEAAAASAPz/AAACAAEAAAASAP3/AAACAAEAAAASAP7/AAACAAEAAAASAP//AAACAAEAAAATAPL/AAACAAEAAAATAPP/AAACAAEAAAATAPT/AAACAAEAAAATAPX/AAACAAEAAAATAPb/AAACAAEAAAATAPf/AAACAAEAAAATAPj/AAACAAEAAAATAPn/AAACAAEAAAATAPr/AAACAAEAAAATAPv/AAACAAEAAAATAPz/AAACAAEAAAATAP3/AAACAAEAAAATAP7/AAACAAEAAAATAP//AAACAAEAAAAUAPL/AAACAAEAAAAUAPP/AAACAAEAAAAUAPT/AAACAAEAAAAUAPX/AAACAAEAAAAUAPb/AAACAAEAAAAUAPf/AAACAAEAAAAUAPj/AAACAAEAAAAUAPn/AAACAAEAAAAUAPr/AAACAAEAAAAUAPv/AAACAAEAAAAUAPz/AAACAAEAAAAUAP3/AAACAAEAAAAUAP7/AAACAAEAAAAUAP//AAACAAEAAAAVAPL/AAACAAEAAAAVAPP/AAACAAEAAAAVAPT/AAACAAEAAAAVAPX/AAACAAEAAAAVAPb/AAACAAEAAAAVAPf/AAACAAEAAAAVAPj/AAACAAEAAAAVAPn/AAACAAEAAAAVAPr/AAACAAEAAAAVAPv/AAACAAEAAAAVAPz/AAACAAEAAAAVAP3/AAACAAEAAAAVAP7/AAACAAEAAAAVAP//AAACAAEAAAAWAPL/AAACAAEAAAAWAPP/AAACAAEAAAAWAPT/AAACAAEAAAAWAPX/AAACAAEAAAAWAPb/AAACAAEAAAAWAPf/AAACAAEAAAAWAPj/AAACAAEAAAAWAPn/AAACAAEAAAAWAPr/AAACAAEAAAAWAPv/AAACAAEAAAAWAPz/AAACAAEAAAAWAP3/AAACAAEAAAAWAP7/AAACAAEAAAAWAP//AAACAAEAAAAXAPL/AAACAAEAAAAXAPP/AAACAAEAAAAXAPT/AAACAAEAAAAXAPX/AAACAAEAAAAXAPb/AAACAAEAAAAXAPf/AAACAAEAAAAXAPj/AAACAAEAAAAXAPn/AAACAAEAAAAXAPr/AAACAAEAAAAXAPv/AAACAAEAAAAXAPz/AAACAAEAAAAXAP3/AAACAAEAAAAXAP7/AAACAAEAAAAXAP//AAACAAEAAAAYAPL/AAACAAEAAAAYAPP/AAACAAEAAAAYAPT/AAACAAEAAAAYAPX/AAACAAEAAAAYAPb/AAACAAEAAAAYAPf/AAACAAEAAAAYAPj/AAACAAEAAAAYAPn/AAACAAEAAAAYAPr/AAACAAEAAAAYAPv/AAACAAEAAAAYAPz/AAACAAEAAAAYAP3/AAACAAEAAAAYAP7/AAACAAEAAAAYAP//AAACAAEAAAAZAPL/AAACAAEAAAAZAPP/AAACAAEAAAAZAPT/AAACAAEAAAAZAPX/AAACAAEAAAAZAPb/AAACAAEAAAAZAPf/AAACAAEAAAAZAPj/AAACAAEAAAAZAPn/AAACAAEAAAAZAPr/AAACAAEAAAAZAPv/AAACAAEAAAAZAPz/AAACAAEAAAAZAP3/AAACAAEAAAAZAP7/AAACAAEAAAAZAP//AAACAAEAAAAaAPL/AAACAAEAAAAaAPP/AAACAAEAAAAaAPT/AAACAAEAAAAaAPX/AAACAAEAAAAaAPb/AAACAAEAAAAaAPf/AAACAAEAAAAaAPj/AAACAAEAAAAaAPn/AAACAAEAAAAaAPr/AAACAAEAAAAaAPv/AAACAAEAAAAaAPz/AAACAAEAAAAaAP3/AAACAAEAAAAaAP7/AAACAAEAAAAaAP//AAACAAEAAAAbAPL/AAACAAEAAAAbAPP/AAACAAEAAAAbAPT/AAACAAEAAAAbAPX/AAACAAEAAAAbAPb/AAACAAEAAAAbAPf/AAACAAEAAAAbAPj/AAACAAEAAAAbAPn/AAACAAEAAAAbAPr/AAACAAEAAAAbAPv/AAACAAEAAAAbAPz/AAACAAEAAAAbAP3/AAACAAEAAAAbAP7/AAACAAEAAAAbAP//AAACAAEAAAAcAPL/AAACAAEAAAAcAPP/AAACAAEAAAAcAPT/AAACAAEAAAAcAPX/AAACAAEAAAAcAPb/AAACAAEAAAAcAPf/AAACAAEAAAAcAPj/AAACAAEAAAAcAPn/AAACAAEAAAAcAPr/AAACAAEAAAAcAPv/AAACAAEAAAAcAPz/AAACAAEAAAAcAP3/AAACAAEAAAAcAP7/AAACAAEAAAAcAP//AAACAAEAAAAdAPL/AAACAAEAAAAdAPP/AAACAAEAAAAdAPT/AAACAAEAAAAdAPX/AAACAAEAAAAdAPb/AAACAAEAAAAdAPf/AAACAAEAAAAdAPj/AAACAAEAAAAdAPn/AAACAAEAAAAdAPr/AAACAAEAAAAdAPv/AAACAAEAAAAdAPz/AAACAAEAAAAdAP3/AAACAAEAAAAdAP7/AAACAAEAAAAdAP//AAACAAEAAAAeAPL/AAACAAEAAAAeAPP/AAACAAEAAAAeAPT/AAACAAEAAAAeAPX/AAACAAEAAAAeAPb/AAACAAEAAAAeAPf/AAACAAEAAAAeAPj/AAACAAEAAAAeAPn/AAACAAEAAAAeAPr/AAACAAEAAAAeAPv/AAACAAEAAAAeAPz/AAACAAEAAAAeAP3/AAACAAEAAAAeAP7/AAACAAEAAAAeAP//AAACAAEAAAAfAPL/AAACAAEAAAAfAPP/AAACAAEAAAAfAPT/AAACAAEAAAAfAPX/AAACAAEAAAAfAPb/AAACAAEAAAAfAPf/AAACAAEAAAAfAPj/AAACAAEAAAAfAPn/AAACAAEAAAAfAPr/AAACAAEAAAAfAPv/AAACAAEAAAAfAPz/AAACAAEAAAAfAP3/AAACAAEAAAAfAP7/AAACAAEAAAAfAP//AAACAAEAAAAgAPL/AAACAAEAAAAgAPP/AAACAAEAAAAgAPT/AAACAAEAAAAgAPX/AAACAAEAAAAgAPb/AAACAAEAAAAgAPf/AAACAAEAAAAgAPj/AAACAAEAAAAgAPn/AAACAAEAAAAgAPr/AAACAAEAAAAgAPv/AAACAAEAAAAgAPz/AAACAAEAAAAgAP3/AAACAAEAAAAgAP7/AAACAAEAAAAgAP//AAACAAEAAAAhAPL/AAACAAEAAAAhAPP/AAACAAEAAAAhAPT/AAACAAEAAAAhAPX/AAACAAEAAAAhAPb/AAACAAEAAAAhAPf/AAACAAEAAAAhAPj/AAACAAEAAAAhAPn/AAACAAEAAAAhAPr/AAACAAEAAAAhAPv/AAACAAEAAAAhAPz/AAACAAEAAAAhAP3/AAACAAEAAAAhAP7/AAACAAEAAAAhAP//AAACAAEAAAAiAPL/AAACAAEAAAAiAPP/AAACAAEAAAAiAPT/AAACAAEAAAAiAPX/AAACAAEAAAAiAPb/AAACAAEAAAAiAPf/AAACAAEAAAAiAPj/AAACAAEAAAAiAPn/AAACAAEAAAAiAPr/AAACAAEAAAAiAPv/AAACAAEAAAAiAPz/AAACAAEAAAAiAP3/AAACAAEAAAAiAP7/AAACAAEAAAAiAP//AAACAAEAAAAjAPL/AAACAAEAAAAjAPP/AAACAAEAAAAjAPT/AAACAAEAAAAjAPX/AAACAAEAAAAjAPb/AAACAAEAAAAjAPf/AAACAAEAAAAjAPj/AAACAAEAAAAjAPn/AAACAAEAAAAjAPr/AAACAAEAAAAjAPv/AAACAAEAAAAjAPz/AAACAAEAAAAjAP3/AAACAAEAAAAjAP7/AAACAAEAAAAjAP//AAACAAEAAAAkAPL/AAACAAEAAAAkAPP/AAACAAEAAAAkAPT/AAACAAEAAAAkAPX/AAACAAEAAAAkAPb/AAACAAEAAAAkAPf/AAACAAEAAAAkAPj/AAACAAEAAAAkAPn/AAACAAEAAAAkAPr/AAACAAEAAAAkAPv/AAACAAEAAAAkAPz/AAACAAEAAAAkAP3/AAACAAEAAAAkAP7/AAACAAEAAAAkAP//AAACAAEAAAAlAPL/AAACAAEAAAAlAPP/AAACAAEAAAAlAPT/AAACAAEAAAAlAPX/AAACAAEAAAAlAPb/AAACAAEAAAAlAPf/AAACAAEAAAAlAPj/AAACAAEAAAAlAPn/AAACAAEAAAAlAPr/AAACAAEAAAAlAPv/AAACAAEAAAAlAPz/AAACAAEAAAAlAP3/AAACAAEAAAAlAP7/AAACAAEAAAAlAP//AAACAAEAAAAmAPL/AAACAAEAAAAmAPP/AAACAAEAAAAmAPT/AAACAAEAAAAmAPX/AAACAAEAAAAmAPb/AAACAAEAAAAmAPf/AAACAAEAAAAmAPj/AAACAAEAAAAmAPn/AAACAAEAAAAmAPr/AAACAAEAAAAmAPv/AAACAAEAAAAmAPz/AAACAAEAAAAmAP3/AAACAAEAAAAmAP7/AAACAAEAAAAmAP//AAACAAEAAAAnAPL/AAACAAEAAAAnAPP/AAACAAEAAAAnAPT/AAACAAEAAAAnAPX/AAACAAEAAAAnAPb/AAACAAEAAAAnAPf/AAACAAEAAAAnAPj/AAACAAEAAAAnAPn/AAACAAEAAAAnAPr/AAACAAEAAAAnAPv/AAACAAEAAAAnAPz/AAACAAEAAAAnAP3/AAACAAEAAAAnAP7/AAACAAEAAAAnAP//AAACAAEAAAAoAPL/AAACAAEAAAAoAPP/AAACAAEAAAAoAPT/AAACAAEAAAAoAPX/AAACAAEAAAAoAPb/AAACAAEAAAAoAPf/AAACAAEAAAAoAPj/AAACAAEAAAAoAPn/AAACAAEAAAAoAPr/AAACAAEAAAAoAPv/AAACAAEAAAAoAPz/AAACAAEAAAAoAP3/AAACAAEAAAAoAP7/AAACAAEAAAAoAP//AAACAAEAAAApAPL/AAACAAEAAAApAPP/AAACAAEAAAApAPT/AAACAAEAAAApAPX/AAACAAEAAAApAPb/AAACAAEAAAApAPf/AAACAAEAAAApAPj/AAACAAEAAAApAPn/AAACAAEAAAApAPr/AAACAAEAAAApAPv/AAACAAEAAAApAPz/AAACAAEAAAApAP3/AAACAAEAAAApAP7/AAACAAEAAAApAP//AAACAAEAAAAqAPL/AAACAAEAAAAqAPP/AAACAAEAAAAqAPT/AAACAAEAAAAqAPX/AAACAAEAAAAqAPb/AAACAAEAAAAqAPf/AAACAAEAAAAqAPj/AAACAAEAAAAqAPn/AAACAAEAAAAqAPr/AAACAAEAAAAqAPv/AAACAAEAAAAqAPz/AAACAAEAAAAqAP3/AAACAAEAAAAqAP7/AAACAAEAAAAqAP//AAACAAEAAAArAPL/AAACAAEAAAArAPP/AAACAAEAAAArAPT/AAACAAEAAAArAPX/AAACAAEAAAArAPb/AAACAAEAAAArAPf/AAACAAEAAAArAPj/AAACAAEAAAArAPn/AAACAAEAAAArAPr/AAACAAEAAAArAPv/AAACAAEAAAArAPz/AAACAAEAAAArAP3/AAACAAEAAAArAP7/AAACAAEAAAArAP//AAACAAEAAAAsAPL/AAACAAEAAAAsAPP/AAACAAEAAAAsAPT/AAACAAEAAAAsAPX/AAACAAEAAAAsAPb/AAACAAEAAAAsAPf/AAACAAEAAAAsAPj/AAACAAEAAAAsAPn/AAACAAEAAAAsAPr/AAACAAEAAAAsAPv/AAACAAEAAAAsAPz/AAACAAEAAAAsAP3/AAACAAEAAAAsAP7/AAACAAEAAAAsAP//AAACAAEAAAAtAPL/AAACAAEAAAAtAPP/AAACAAEAAAAtAPT/AAACAAEAAAAtAPX/AAACAAEAAAAtAPb/AAACAAEAAAAtAPf/AAACAAEAAAAtAPj/AAACAAEAAAAtAPn/AAACAAEAAAAtAPr/AAACAAEAAAAtAPv/AAACAAEAAAAtAPz/AAACAAEAAAAtAP3/AAACAAEAAAAtAP7/AAACAAEAAAAtAP//AAACAAEAAAAuAPL/AAACAAEAAAAuAPP/AAACAAEAAAAuAPT/AAACAAEAAAAuAPX/AAACAAEAAAAuAPb/AAACAAEAAAAuAPf/AAACAAEAAAAuAPj/AAACAAEAAAAuAPn/AAACAAEAAAAuAPr/AAACAAEAAAAuAPv/AAACAAEAAAAuAPz/AAACAAEAAAAuAP3/AAACAAEAAAAuAP7/AAACAAEAAAAuAP//AAACAAEAAAAvAPL/AAACAAEAAAAvAPP/AAACAAEAAAAvAPT/AAACAAEAAAAvAPX/AAACAAEAAAAvAPb/AAACAAEAAAAvAPf/AAACAAEAAAAvAPj/AAACAAEAAAAvAPn/AAACAAEAAAAvAPr/AAACAAEAAAAvAPv/AAACAAEAAAAvAPz/AAACAAEAAAAvAP3/AAACAAEAAAAvAP7/AAACAAEAAAAvAP//AAACAAEAAAAwAPL/AAACAAEAAAAwAPP/AAACAAEAAAAwAPT/AAACAAEAAAAwAPX/AAACAAEAAAAwAPb/AAACAAEAAAAwAPf/AAACAAEAAAAwAPj/AAACAAEAAAAwAPn/AAACAAEAAAAwAPr/AAACAAEAAAAwAPv/AAACAAEAAAAwAPz/AAACAAEAAAAwAP3/AAACAAEAAAAwAP7/AAACAAEAAAAwAP//AAACAAEAAAAxAPL/AAACAAEAAAAxAPP/AAACAAEAAAAxAPT/AAACAAEAAAAxAPX/AAACAAEAAAAxAPb/AAACAAEAAAAxAPf/AAACAAEAAAAxAPj/AAACAAEAAAAxAPn/AAACAAEAAAAxAPr/AAACAAEAAAAxAPv/AAACAAEAAAAxAPz/AAACAAEAAAAxAP3/AAACAAEAAAAxAP7/AAACAAEAAAAxAP//AAACAAEAAAAyAPL/AAACAAEAAAAyAPP/AAACAAEAAAAyAPT/AAACAAEAAAAyAPX/AAACAAEAAAAyAPb/AAACAAEAAAAyAPf/AAACAAEAAAAyAPj/AAACAAEAAAAyAPn/AAACAAEAAAAyAPr/AAACAAEAAAAyAPv/AAACAAEAAAAyAPz/AAACAAEAAAAyAP3/AAACAAEAAAAyAP7/AAACAAEAAAAyAP//AAACAAEAAAAzAPL/AAACAAEAAAAzAPP/AAACAAEAAAAzAPT/AAACAAEAAAAzAPX/AAACAAEAAAAzAPb/AAACAAEAAAAzAPf/AAACAAEAAAAzAPj/AAACAAEAAAAzAPn/AAACAAEAAAAzAPr/AAACAAEAAAAzAPv/AAACAAEAAAAzAPz/AAACAAEAAAAzAP3/AAACAAEAAAAzAP7/AAACAAEAAAAzAP//AAACAAEAAAA0APL/AAACAAEAAAA0APP/AAACAAEAAAA0APT/AAACAAEAAAA0APX/AAACAAEAAAA0APb/AAACAAEAAAA0APf/AAACAAEAAAA0APj/AAACAAEAAAA0APn/AAACAAEAAAA0APr/AAACAAEAAAA0APv/AAACAAEAAAA0APz/AAACAAEAAAA0AP3/AAACAAEAAAA0AP7/AAACAAEAAAA0AP//AAACAAEAAAA1APL/AAACAAEAAAA1APP/AAACAAEAAAA1APT/AAACAAEAAAA1APX/AAACAAEAAAA1APb/AAACAAEAAAA1APf/AAACAAEAAAA1APj/AAACAAEAAAA1APn/AAACAAEAAAA1APr/AAACAAEAAAA1APv/AAACAAEAAAA1APz/AAACAAEAAAA1AP3/AAACAAEAAAA1AP7/AAACAAEAAAA1AP//AAACAAEAAAA2APL/AAACAAEAAAA2APP/AAACAAEAAAA2APT/AAACAAEAAAA2APX/AAACAAEAAAA2APb/AAACAAEAAAA2APf/AAACAAEAAAA2APj/AAACAAEAAAA2APn/AAACAAEAAAA2APr/AAACAAEAAAA2APv/AAACAAEAAAA2APz/AAACAAEAAAA2AP3/AAACAAEAAAA2AP7/AAACAAEAAAA2AP//AAACAAEAAAA3APL/AAACAAEAAAA3APP/AAACAAEAAAA3APT/AAACAAEAAAA3APX/AAACAAEAAAA3APb/AAACAAEAAAA3APf/AAACAAEAAAA3APj/AAACAAEAAAA3APn/AAACAAEAAAA3APr/AAACAAEAAAA3APv/AAACAAEAAAA3APz/AAACAAEAAAA3AP3/AAACAAEAAAA3AP7/AAACAAEAAAA3AP//AAACAAEAAAA4APL/AAACAAEAAAA4APP/AAACAAEAAAA4APT/AAACAAEAAAA4APX/AAACAAEAAAA4APb/AAACAAEAAAA4APf/AAACAAEAAAA4APj/AAACAAEAAAA4APn/AAACAAEAAAA4APr/AAACAAEAAAA4APv/AAACAAEAAAA4APz/AAACAAEAAAA4AP3/AAACAAEAAAA4AP7/AAACAAEAAAA4AP//AAACAAEAAAA5APL/AAACAAEAAAA5APP/AAACAAEAAAA5APT/AAACAAEAAAA5APX/AAACAAEAAAA5APb/AAACAAEAAAA5APf/AAACAAEAAAA5APj/AAACAAEAAAA5APn/AAACAAEAAAA5APr/AAACAAEAAAA5APv/AAACAAEAAAA5APz/AAACAAEAAAA5AP3/AAACAAEAAAA5AP7/AAACAAEAAAA5AP//AAACAAEAAAA6APL/AAACAAEAAAA6APP/AAACAAEAAAA6APT/AAACAAEAAAA6APX/AAACAAEAAAA6APb/AAACAAEAAAA6APf/AAACAAEAAAA6APj/AAACAAEAAAA6APn/AAACAAEAAAA6APr/AAACAAEAAAA6APv/AAACAAEAAAA6APz/AAACAAEAAAA6AP3/AAACAAEAAAA6AP7/AAACAAEAAAA6AP//AAACAAEAAAA7APL/AAACAAEAAAA7APP/AAACAAEAAAA7APT/AAACAAEAAAA7APX/AAACAAEAAAA7APb/AAACAAEAAAA7APf/AAACAAEAAAA7APj/AAACAAEAAAA7APn/AAACAAEAAAA7APr/AAACAAEAAAA7APv/AAACAAEAAAA7APz/AAACAAEAAAA7AP3/AAACAAEAAAA7AP7/AAACAAEAAAA7AP//AAACAAEAAAA8APL/AAACAAEAAAA8APP/AAACAAEAAAA8APT/AAACAAEAAAA8APX/AAACAAEAAAA8APb/AAACAAEAAAA8APf/AAACAAEAAAA8APj/AAACAAEAAAA8APn/AAACAAEAAAA8APr/AAACAAEAAAA8APv/AAACAAEAAAA8APz/AAACAAEAAAA8AP3/AAACAAEAAAA8AP7/AAACAAEAAAA8AP//AAACAAEAAAA9APL/AAACAAEAAAA9APP/AAACAAEAAAA9APT/AAACAAEAAAA9APX/AAACAAEAAAA9APb/AAACAAEAAAA9APf/AAACAAEAAAA9APj/AAACAAEAAAA9APn/AAACAAEAAAA9APr/AAACAAEAAAA9APv/AAACAAEAAAA9APz/AAACAAEAAAA9AP3/AAACAAEAAAA9AP7/AAACAAEAAAA9AP//AAACAAEAAAA+APL/AAACAAEAAAA+APP/AAACAAEAAAA+APT/AAACAAEAAAA+APX/AAACAAEAAAA+APb/AAACAAEAAAA+APf/AAACAAEAAAA+APj/AAACAAEAAAA+APn/AAACAAEAAAA+APr/AAACAAEAAAA+APv/AAACAAEAAAA+APz/AAACAAEAAAA+AP3/AAACAAEAAAA+AP7/AAACAAEAAAA+AP//AAACAAEAAAA/APL/AAACAAEAAAA/APP/AAACAAEAAAA/APT/AAACAAEAAAA/APX/AAACAAEAAAA/APb/AAACAAEAAAA/APf/AAACAAEAAAA/APj/AAACAAEAAAA/APn/AAACAAEAAAA/APr/AAACAAEAAAA/APv/AAACAAEAAAA/APz/AAACAAEAAAA/AP3/AAACAAEAAAA/AP7/AAACAAEAAAA/AP//AAACAAEAAABAAPL/AAACAAEAAABAAPP/AAACAAEAAABAAPT/AAACAAEAAABAAPX/AAACAAEAAABAAPb/AAACAAEAAABAAPf/AAACAAEAAABAAPj/AAACAAEAAABAAPn/AAACAAEAAABAAPr/AAACAAEAAABAAPv/AAACAAEAAABAAPz/AAACAAEAAABAAP3/AAACAAEAAABAAP7/AAACAAEAAABAAP//AAACAAEAAABBAPL/AAACAAEAAABBAPP/AAACAAEAAABBAPT/AAACAAEAAABBAPX/AAACAAEAAABBAPb/AAACAAEAAABBAPf/AAACAAEAAABBAPj/AAACAAEAAABBAPn/AAACAAEAAABBAPr/AAACAAEAAABBAPv/AAACAAEAAABBAPz/AAACAAEAAABBAP3/AAACAAEAAABBAP7/AAACAAEAAABBAP//AAACAAEAAABCAPL/AAACAAEAAABCAPP/AAACAAEAAABCAPT/AAACAAEAAABCAPX/AAACAAEAAABCAPb/AAACAAEAAABCAPf/AAACAAEAAABCAPj/AAACAAEAAABCAPn/AAACAAEAAABCAPr/AAACAAEAAABCAPv/AAACAAEAAABCAPz/AAACAAEAAABCAP3/AAACAAEAAABCAP7/AAACAAEAAABCAP//AAACAAEAAABDAPL/AAACAAEAAABDAPP/AAACAAEAAABDAPT/AAACAAEAAABDAPX/AAACAAEAAABDAPb/AAACAAEAAABDAPf/AAACAAEAAABDAPj/AAACAAEAAABDAPn/AAACAAEAAABDAPr/AAACAAEAAABDAPv/AAACAAEAAABDAPz/AAACAAEAAABDAP3/AAACAAEAAABDAP7/AAACAAEAAABDAP//AAACAAEAAABEAPL/AAACAAEAAABEAPP/AAACAAEAAABEAPT/AAACAAEAAABEAPX/AAACAAEAAABEAPb/AAACAAEAAABEAPf/AAACAAEAAABEAPj/AAACAAEAAABEAPn/AAACAAEAAABEAPr/AAACAAEAAABEAPv/AAACAAEAAABEAPz/AAACAAEAAABEAP3/AAACAAEAAABEAP7/AAACAAEAAABEAP//AAACAAEAAABFAPL/AAACAAEAAABFAPP/AAACAAEAAABFAPT/AAACAAEAAABFAPX/AAACAAEAAABFAPb/AAACAAEAAABFAPf/AAACAAEAAABFAPj/AAACAAEAAABFAPn/AAACAAEAAABFAPr/AAACAAEAAABFAPv/AAACAAEAAABFAPz/AAACAAEAAABFAP3/AAACAAEAAABFAP7/AAACAAEAAABFAP//AAACAAEAAAA=")
+tile_set = SubResource("TileSet_5bd38")
+
+[node name="Player" parent="." instance=ExtResource("2_07rl6")]
+position = Vector2(584, 442)
+
+[node name="DoorSceneManager" parent="." node_paths=PackedStringArray("player") instance=ExtResource("3_3eu8f")]
+position = Vector2(584, 456)
+scale = Vector2(3.44061, 0.770942)
+player = NodePath("../Player")
+current_scene = 1
+push_direction = 2
+
+[node name="Camera2D" type="Camera2D" parent="."]
+z_index = 4096
+position = Vector2(582, 328)
+zoom = Vector2(2, 2)
diff --git a/scenes/interfaces/pause_menu.tscn b/scenes/interfaces/pause_menu.tscn
new file mode 100644 (file)
index 0000000..d7b0b57
--- /dev/null
@@ -0,0 +1,12 @@
+[gd_scene load_steps=2 format=3 uid="uid://d11oo2pxcah1g"]
+
+[ext_resource type="Script" path="res://scripts/pause_menu.gd" id="1_aq3as"]
+
+[node name="PauseMenu" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_aq3as")
diff --git a/scenes/interfaces/save_menu.tscn b/scenes/interfaces/save_menu.tscn
new file mode 100644 (file)
index 0000000..d16b259
--- /dev/null
@@ -0,0 +1,9 @@
+[gd_scene format=3 uid="uid://bsiy7irf1p5e1"]
+
+[node name="SaveMenu" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
diff --git a/scenes/main_level.tscn b/scenes/main_level.tscn
new file mode 100644 (file)
index 0000000..469592f
--- /dev/null
@@ -0,0 +1,1660 @@
+[gd_scene load_steps=7 format=4 uid="uid://ds1fjw3marbia"]
+
+[ext_resource type="PackedScene" uid="uid://k76535tjepm3" path="res://scenes/elements/player.tscn" id="1_6iuf6"]
+[ext_resource type="Script" path="res://scripts/main_level.gd" id="1_fdviv"]
+[ext_resource type="Texture2D" uid="uid://bj3fteudhyal6" path="res://assets/textures/Overworld.png" id="1_pt2os"]
+[ext_resource type="PackedScene" uid="uid://da1uex028xkv1" path="res://scenes/elements/door_scene_manager.tscn" id="1_qqjfh"]
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_n0o3p"]
+texture = ExtResource("1_pt2os")
+0:0/0 = 0
+0:0/0/terrain_set = 0
+0:0/0/terrain = 0
+0:0/0/terrains_peering_bit/right_side = 0
+0:0/0/terrains_peering_bit/bottom_right_corner = 0
+0:0/0/terrains_peering_bit/bottom_side = 0
+0:0/0/terrains_peering_bit/bottom_left_corner = 0
+0:0/0/terrains_peering_bit/left_side = 0
+0:0/0/terrains_peering_bit/top_left_corner = 0
+0:0/0/terrains_peering_bit/top_side = 0
+0:0/0/terrains_peering_bit/top_right_corner = 0
+1:0/0 = 0
+2:0/0 = 0
+3:0/0 = 0
+4:0/0 = 0
+5:0/0 = 0
+25:0/0 = 0
+26:0/0 = 0
+27:0/0 = 0
+28:0/0 = 0
+29:0/0 = 0
+30:0/0 = 0
+31:0/0 = 0
+32:0/0 = 0
+33:0/0 = 0
+34:0/0 = 0
+35:0/0 = 0
+36:0/0 = 0
+37:0/0 = 0
+25:1/0 = 0
+26:1/0 = 0
+27:1/0 = 0
+28:1/0 = 0
+29:1/0 = 0
+30:1/0 = 0
+31:1/0 = 0
+32:1/0 = 0
+33:1/0 = 0
+34:1/0 = 0
+35:1/0 = 0
+36:1/0 = 0
+37:1/0 = 0
+38:1/0 = 0
+25:2/0 = 0
+26:2/0 = 0
+27:2/0 = 0
+28:2/0 = 0
+29:2/0 = 0
+30:2/0 = 0
+31:2/0 = 0
+32:2/0 = 0
+33:2/0 = 0
+34:2/0 = 0
+35:2/0 = 0
+36:2/0 = 0
+37:2/0 = 0
+38:2/0 = 0
+3:3/0 = 0
+4:3/0 = 0
+5:3/0 = 0
+25:3/0 = 0
+26:3/0 = 0
+27:3/0 = 0
+28:3/0 = 0
+29:3/0 = 0
+30:3/0 = 0
+31:3/0 = 0
+32:3/0 = 0
+33:3/0 = 0
+34:3/0 = 0
+35:3/0 = 0
+36:3/0 = 0
+37:3/0 = 0
+38:3/0 = 0
+3:4/0 = 0
+4:4/0 = 0
+5:4/0 = 0
+21:4/0 = 0
+25:4/0 = 0
+26:4/0 = 0
+27:4/0 = 0
+28:4/0 = 0
+29:4/0 = 0
+30:4/0 = 0
+31:4/0 = 0
+32:4/0 = 0
+33:4/0 = 0
+34:4/0 = 0
+35:4/0 = 0
+36:4/0 = 0
+37:4/0 = 0
+38:4/0 = 0
+6:5/0 = 0
+7:5/0 = 0
+8:5/0 = 0
+9:5/0 = 0
+10:5/0 = 0
+21:5/0 = 0
+25:5/0 = 0
+26:5/0 = 0
+27:5/0 = 0
+28:5/0 = 0
+29:5/0 = 0
+30:5/0 = 0
+31:5/0 = 0
+32:5/0 = 0
+33:5/0 = 0
+34:5/0 = 0
+35:5/0 = 0
+36:5/0 = 0
+37:5/0 = 0
+38:5/0 = 0
+39:5/0 = 0
+5:6/0 = 0
+6:6/0 = 0
+7:6/0 = 0
+8:6/0 = 0
+9:6/0 = 0
+10:6/0 = 0
+15:6/0 = 0
+15:6/0/terrain_set = 0
+15:6/0/terrain = 2
+15:6/0/terrains_peering_bit/right_side = 2
+15:6/0/terrains_peering_bit/bottom_right_corner = 1
+15:6/0/terrains_peering_bit/bottom_side = 2
+15:6/0/terrains_peering_bit/bottom_left_corner = 2
+15:6/0/terrains_peering_bit/left_side = 2
+15:6/0/terrains_peering_bit/top_left_corner = 2
+15:6/0/terrains_peering_bit/top_side = 2
+15:6/0/terrains_peering_bit/top_right_corner = 2
+16:6/0 = 0
+16:6/0/terrain_set = 0
+16:6/0/terrain = 2
+16:6/0/terrains_peering_bit/right_side = 2
+16:6/0/terrains_peering_bit/bottom_right_corner = 1
+16:6/0/terrains_peering_bit/bottom_side = 1
+16:6/0/terrains_peering_bit/bottom_left_corner = 1
+16:6/0/terrains_peering_bit/left_side = 2
+16:6/0/terrains_peering_bit/top_left_corner = 2
+16:6/0/terrains_peering_bit/top_side = 2
+16:6/0/terrains_peering_bit/top_right_corner = 2
+17:6/0 = 0
+17:6/0/terrain_set = 0
+17:6/0/terrain = 2
+17:6/0/terrains_peering_bit/right_side = 2
+17:6/0/terrains_peering_bit/bottom_right_corner = 2
+17:6/0/terrains_peering_bit/bottom_side = 2
+17:6/0/terrains_peering_bit/bottom_left_corner = 1
+17:6/0/terrains_peering_bit/left_side = 2
+17:6/0/terrains_peering_bit/top_left_corner = 2
+17:6/0/terrains_peering_bit/top_side = 2
+17:6/0/terrains_peering_bit/top_right_corner = 2
+18:6/0 = 0
+18:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+19:6/0 = 0
+19:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+20:6/0 = 0
+20:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+21:6/0 = 0
+22:6/0 = 0
+23:6/0 = 0
+24:6/0 = 0
+25:6/0 = 0
+26:6/0 = 0
+27:6/0 = 0
+28:6/0 = 0
+29:6/0 = 0
+30:6/0 = 0
+31:6/0 = 0
+32:6/0 = 0
+33:6/0 = 0
+34:6/0 = 0
+35:6/0 = 0
+36:6/0 = 0
+37:6/0 = 0
+38:6/0 = 0
+39:6/0 = 0
+5:7/0 = 0
+6:7/0 = 0
+7:7/0 = 0
+8:7/0 = 0
+9:7/0 = 0
+10:7/0 = 0
+11:7/0 = 0
+12:7/0 = 0
+15:7/0 = 0
+15:7/0/terrain_set = 0
+15:7/0/terrain = 2
+15:7/0/terrains_peering_bit/right_side = 1
+15:7/0/terrains_peering_bit/bottom_right_corner = 1
+15:7/0/terrains_peering_bit/bottom_side = 2
+15:7/0/terrains_peering_bit/bottom_left_corner = 2
+15:7/0/terrains_peering_bit/left_side = 2
+15:7/0/terrains_peering_bit/top_left_corner = 2
+15:7/0/terrains_peering_bit/top_side = 2
+15:7/0/terrains_peering_bit/top_right_corner = 1
+17:7/0 = 0
+17:7/0/terrain_set = 0
+17:7/0/terrain = 2
+17:7/0/terrains_peering_bit/right_side = 2
+17:7/0/terrains_peering_bit/bottom_right_corner = 2
+17:7/0/terrains_peering_bit/bottom_side = 2
+17:7/0/terrains_peering_bit/bottom_left_corner = 1
+17:7/0/terrains_peering_bit/left_side = 1
+17:7/0/terrains_peering_bit/top_left_corner = 1
+17:7/0/terrains_peering_bit/top_side = 2
+17:7/0/terrains_peering_bit/top_right_corner = 2
+18:7/0 = 0
+18:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+19:7/0 = 0
+19:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+20:7/0 = 0
+20:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+26:7/0 = 0
+27:7/0 = 0
+28:7/0 = 0
+29:7/0 = 0
+30:7/0 = 0
+35:7/0 = 0
+36:7/0 = 0
+37:7/0 = 0
+38:7/0 = 0
+39:7/0 = 0
+0:8/0 = 0
+1:8/0 = 0
+5:8/0 = 0
+6:8/0 = 0
+7:8/0 = 0
+8:8/0 = 0
+9:8/0 = 0
+10:8/0 = 0
+11:8/0 = 0
+12:8/0 = 0
+13:8/0 = 0
+14:8/0 = 0
+15:8/0 = 0
+15:8/0/terrain_set = 0
+15:8/0/terrain = 2
+15:8/0/terrains_peering_bit/right_side = 2
+15:8/0/terrains_peering_bit/bottom_right_corner = 2
+15:8/0/terrains_peering_bit/bottom_side = 2
+15:8/0/terrains_peering_bit/bottom_left_corner = 2
+15:8/0/terrains_peering_bit/left_side = 2
+15:8/0/terrains_peering_bit/top_left_corner = 2
+15:8/0/terrains_peering_bit/top_side = 2
+15:8/0/terrains_peering_bit/top_right_corner = 1
+16:8/0 = 0
+16:8/0/terrain_set = 0
+16:8/0/terrain = 2
+16:8/0/terrains_peering_bit/right_side = 2
+16:8/0/terrains_peering_bit/bottom_right_corner = 2
+16:8/0/terrains_peering_bit/bottom_side = 2
+16:8/0/terrains_peering_bit/bottom_left_corner = 2
+16:8/0/terrains_peering_bit/left_side = 2
+16:8/0/terrains_peering_bit/top_left_corner = 1
+16:8/0/terrains_peering_bit/top_side = 1
+16:8/0/terrains_peering_bit/top_right_corner = 1
+17:8/0 = 0
+17:8/0/terrain_set = 0
+17:8/0/terrain = 2
+17:8/0/terrains_peering_bit/right_side = 2
+17:8/0/terrains_peering_bit/bottom_right_corner = 2
+17:8/0/terrains_peering_bit/bottom_side = 2
+17:8/0/terrains_peering_bit/bottom_left_corner = 2
+17:8/0/terrains_peering_bit/left_side = 2
+17:8/0/terrains_peering_bit/top_left_corner = 1
+17:8/0/terrains_peering_bit/top_side = 2
+17:8/0/terrains_peering_bit/top_right_corner = 2
+18:8/0 = 0
+18:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+19:8/0 = 0
+19:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+20:8/0 = 0
+20:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+26:8/0 = 0
+26:8/0/z_index = 1
+28:8/0 = 0
+28:8/0/z_index = 1
+29:8/0 = 0
+29:8/0/z_index = 1
+31:8/0 = 0
+32:8/0 = 0
+33:8/0 = 0
+35:8/0 = 0
+36:8/0 = 0
+37:8/0 = 0
+38:8/0 = 0
+39:8/0 = 0
+0:9/0 = 0
+0:9/0/terrain_set = 0
+0:9/0/terrain = 0
+0:9/0/terrains_peering_bit/right_side = 0
+0:9/0/terrains_peering_bit/bottom_side = 0
+0:9/0/terrains_peering_bit/bottom_left_corner = 0
+0:9/0/terrains_peering_bit/left_side = 0
+0:9/0/terrains_peering_bit/top_left_corner = 0
+0:9/0/terrains_peering_bit/top_side = 0
+0:9/0/terrains_peering_bit/top_right_corner = 0
+1:9/0 = 0
+1:9/0/terrain_set = 0
+1:9/0/terrain = 0
+1:9/0/terrains_peering_bit/right_side = 0
+1:9/0/terrains_peering_bit/bottom_right_corner = 0
+1:9/0/terrains_peering_bit/bottom_side = 0
+1:9/0/terrains_peering_bit/left_side = 0
+1:9/0/terrains_peering_bit/top_left_corner = 0
+1:9/0/terrains_peering_bit/top_side = 0
+1:9/0/terrains_peering_bit/top_right_corner = 0
+2:9/0 = 0
+2:9/0/terrain_set = 0
+2:9/0/terrain = 0
+2:9/0/terrains_peering_bit/right_side = 0
+2:9/0/terrains_peering_bit/bottom_right_corner = 0
+2:9/0/terrains_peering_bit/bottom_side = 0
+2:9/0/terrains_peering_bit/bottom_left_corner = 1
+2:9/0/terrains_peering_bit/left_side = 1
+2:9/0/terrains_peering_bit/top_left_corner = 1
+2:9/0/terrains_peering_bit/top_side = 1
+2:9/0/terrains_peering_bit/top_right_corner = 1
+3:9/0 = 0
+3:9/0/terrain_set = 0
+3:9/0/terrain = 0
+3:9/0/terrains_peering_bit/right_side = 1
+3:9/0/terrains_peering_bit/bottom_right_corner = 1
+3:9/0/terrains_peering_bit/bottom_side = 0
+3:9/0/terrains_peering_bit/bottom_left_corner = 0
+3:9/0/terrains_peering_bit/left_side = 0
+3:9/0/terrains_peering_bit/top_left_corner = 1
+3:9/0/terrains_peering_bit/top_side = 1
+3:9/0/terrains_peering_bit/top_right_corner = 1
+4:9/0 = 0
+5:9/0 = 0
+5:9/0/terrain_set = 0
+5:9/0/terrain = 0
+5:9/0/terrains_peering_bit/right_side = 0
+5:9/0/terrains_peering_bit/bottom_right_corner = 0
+5:9/0/terrains_peering_bit/bottom_side = 0
+5:9/0/terrains_peering_bit/bottom_left_corner = 0
+5:9/0/terrains_peering_bit/left_side = 0
+5:9/0/terrains_peering_bit/top_left_corner = 0
+5:9/0/terrains_peering_bit/top_side = 0
+5:9/0/terrains_peering_bit/top_right_corner = 0
+6:9/0 = 0
+7:9/0 = 0
+7:9/0/terrain_set = 0
+7:9/0/terrain = 0
+7:9/0/terrains_peering_bit/right_side = 0
+7:9/0/terrains_peering_bit/bottom_right_corner = 0
+7:9/0/terrains_peering_bit/bottom_side = 0
+7:9/0/terrains_peering_bit/bottom_left_corner = 0
+7:9/0/terrains_peering_bit/left_side = 0
+7:9/0/terrains_peering_bit/top_left_corner = 0
+7:9/0/terrains_peering_bit/top_side = 0
+7:9/0/terrains_peering_bit/top_right_corner = 0
+8:9/0 = 0
+8:9/0/terrain_set = 0
+8:9/0/terrain = 0
+8:9/0/terrains_peering_bit/right_side = 0
+8:9/0/terrains_peering_bit/bottom_right_corner = 0
+8:9/0/terrains_peering_bit/bottom_side = 0
+8:9/0/terrains_peering_bit/bottom_left_corner = 0
+8:9/0/terrains_peering_bit/left_side = 0
+8:9/0/terrains_peering_bit/top_left_corner = 0
+8:9/0/terrains_peering_bit/top_side = 0
+8:9/0/terrains_peering_bit/top_right_corner = 0
+10:9/0 = 0
+11:9/0 = 0
+12:9/0 = 0
+13:9/0 = 0
+14:9/0 = 0
+15:9/0 = 0
+15:9/0/terrain_set = 0
+15:9/0/terrain = 2
+15:9/0/terrains_peering_bit/right_side = 2
+15:9/0/terrains_peering_bit/bottom_right_corner = 2
+15:9/0/terrains_peering_bit/bottom_side = 2
+15:9/0/terrains_peering_bit/bottom_left_corner = 1
+15:9/0/terrains_peering_bit/left_side = 1
+15:9/0/terrains_peering_bit/top_left_corner = 1
+15:9/0/terrains_peering_bit/top_side = 1
+15:9/0/terrains_peering_bit/top_right_corner = 1
+16:9/0 = 0
+16:9/0/terrain_set = 0
+16:9/0/terrain = 2
+16:9/0/terrains_peering_bit/right_side = 1
+16:9/0/terrains_peering_bit/bottom_right_corner = 1
+16:9/0/terrains_peering_bit/bottom_side = 2
+16:9/0/terrains_peering_bit/bottom_left_corner = 2
+16:9/0/terrains_peering_bit/left_side = 2
+16:9/0/terrains_peering_bit/top_left_corner = 1
+16:9/0/terrains_peering_bit/top_side = 1
+16:9/0/terrains_peering_bit/top_right_corner = 1
+17:9/0 = 0
+18:9/0 = 0
+19:9/0 = 0
+32:9/0 = 0
+34:9/0 = 0
+35:9/0 = 0
+36:9/0 = 0
+37:9/0 = 0
+0:10/0 = 0
+0:10/0/terrain_set = 0
+0:10/0/terrain = 0
+0:10/0/terrains_peering_bit/right_side = 0
+0:10/0/terrains_peering_bit/bottom_right_corner = 0
+0:10/0/terrains_peering_bit/bottom_side = 0
+0:10/0/terrains_peering_bit/bottom_left_corner = 0
+0:10/0/terrains_peering_bit/left_side = 0
+0:10/0/terrains_peering_bit/top_left_corner = 0
+0:10/0/terrains_peering_bit/top_side = 0
+1:10/0 = 0
+1:10/0/terrain_set = 0
+1:10/0/terrain = 0
+1:10/0/terrains_peering_bit/right_side = 0
+1:10/0/terrains_peering_bit/bottom_right_corner = 0
+1:10/0/terrains_peering_bit/bottom_side = 0
+1:10/0/terrains_peering_bit/bottom_left_corner = 0
+1:10/0/terrains_peering_bit/left_side = 0
+1:10/0/terrains_peering_bit/top_side = 0
+1:10/0/terrains_peering_bit/top_right_corner = 0
+2:10/0 = 0
+2:10/0/terrain_set = 0
+2:10/0/terrain = 0
+2:10/0/terrains_peering_bit/right_side = 0
+2:10/0/terrains_peering_bit/bottom_right_corner = 1
+2:10/0/terrains_peering_bit/bottom_side = 1
+2:10/0/terrains_peering_bit/bottom_left_corner = 1
+2:10/0/terrains_peering_bit/left_side = 1
+2:10/0/terrains_peering_bit/top_left_corner = 1
+2:10/0/terrains_peering_bit/top_side = 0
+2:10/0/terrains_peering_bit/top_right_corner = 0
+3:10/0 = 0
+3:10/0/terrain_set = 0
+3:10/0/terrain = 0
+3:10/0/terrains_peering_bit/right_side = 1
+3:10/0/terrains_peering_bit/bottom_right_corner = 1
+3:10/0/terrains_peering_bit/bottom_side = 1
+3:10/0/terrains_peering_bit/bottom_left_corner = 1
+3:10/0/terrains_peering_bit/left_side = 0
+3:10/0/terrains_peering_bit/top_left_corner = 0
+3:10/0/terrains_peering_bit/top_side = 0
+3:10/0/terrains_peering_bit/top_right_corner = 1
+4:10/0 = 0
+5:10/0 = 0
+5:10/0/terrain_set = 0
+5:10/0/terrain = 0
+5:10/0/terrains_peering_bit/right_side = 0
+5:10/0/terrains_peering_bit/bottom_right_corner = 0
+5:10/0/terrains_peering_bit/bottom_side = 0
+5:10/0/terrains_peering_bit/bottom_left_corner = 0
+5:10/0/terrains_peering_bit/left_side = 0
+5:10/0/terrains_peering_bit/top_left_corner = 0
+5:10/0/terrains_peering_bit/top_side = 0
+5:10/0/terrains_peering_bit/top_right_corner = 0
+6:10/0 = 0
+7:10/0 = 0
+7:10/0/terrain_set = 0
+7:10/0/terrain = 0
+7:10/0/terrains_peering_bit/right_side = 0
+7:10/0/terrains_peering_bit/bottom_right_corner = 0
+7:10/0/terrains_peering_bit/bottom_side = 0
+7:10/0/terrains_peering_bit/bottom_left_corner = 0
+7:10/0/terrains_peering_bit/left_side = 0
+7:10/0/terrains_peering_bit/top_left_corner = 0
+7:10/0/terrains_peering_bit/top_side = 0
+7:10/0/terrains_peering_bit/top_right_corner = 0
+8:10/0 = 0
+8:10/0/terrain_set = 0
+8:10/0/terrain = 0
+8:10/0/terrains_peering_bit/right_side = 0
+8:10/0/terrains_peering_bit/bottom_right_corner = 0
+8:10/0/terrains_peering_bit/bottom_side = 0
+8:10/0/terrains_peering_bit/bottom_left_corner = 0
+8:10/0/terrains_peering_bit/left_side = 0
+8:10/0/terrains_peering_bit/top_left_corner = 0
+8:10/0/terrains_peering_bit/top_side = 0
+8:10/0/terrains_peering_bit/top_right_corner = 0
+9:10/0 = 0
+10:10/0 = 0
+11:10/0 = 0
+12:10/0 = 0
+13:10/0 = 0
+14:10/0 = 0
+15:10/0 = 0
+15:10/0/terrain_set = 0
+15:10/0/terrain = 2
+15:10/0/terrains_peering_bit/right_side = 2
+15:10/0/terrains_peering_bit/bottom_right_corner = 1
+15:10/0/terrains_peering_bit/bottom_side = 1
+15:10/0/terrains_peering_bit/bottom_left_corner = 1
+15:10/0/terrains_peering_bit/left_side = 1
+15:10/0/terrains_peering_bit/top_left_corner = 1
+15:10/0/terrains_peering_bit/top_side = 2
+15:10/0/terrains_peering_bit/top_right_corner = 2
+16:10/0 = 0
+16:10/0/terrain_set = 0
+16:10/0/terrain = 2
+16:10/0/terrains_peering_bit/right_side = 1
+16:10/0/terrains_peering_bit/bottom_right_corner = 1
+16:10/0/terrains_peering_bit/bottom_side = 1
+16:10/0/terrains_peering_bit/bottom_left_corner = 1
+16:10/0/terrains_peering_bit/left_side = 2
+16:10/0/terrains_peering_bit/top_left_corner = 2
+16:10/0/terrains_peering_bit/top_side = 2
+16:10/0/terrains_peering_bit/top_right_corner = 1
+17:10/0 = 0
+18:10/0 = 0
+19:10/0 = 0
+32:10/0 = 0
+33:10/0 = 0
+34:10/0 = 0
+35:10/0 = 0
+36:10/0 = 0
+37:10/0 = 0
+0:11/0 = 0
+0:11/0/terrain_set = 0
+0:11/0/terrain = 0
+0:11/0/terrains_peering_bit/right_side = 0
+0:11/0/terrains_peering_bit/bottom_right_corner = 0
+0:11/0/terrains_peering_bit/bottom_side = 0
+1:11/0 = 0
+1:11/0/terrain_set = 0
+1:11/0/terrain = 0
+1:11/0/terrains_peering_bit/right_side = 0
+1:11/0/terrains_peering_bit/bottom_right_corner = 0
+1:11/0/terrains_peering_bit/bottom_side = 0
+1:11/0/terrains_peering_bit/bottom_left_corner = 0
+1:11/0/terrains_peering_bit/left_side = 0
+2:11/0 = 0
+2:11/0/terrain_set = 0
+2:11/0/terrain = 0
+2:11/0/terrains_peering_bit/bottom_side = 0
+2:11/0/terrains_peering_bit/bottom_left_corner = 0
+2:11/0/terrains_peering_bit/left_side = 0
+3:11/0 = 0
+4:11/0 = 0
+5:11/0 = 0
+6:11/0 = 0
+7:11/0 = 0
+8:11/0 = 0
+9:11/0 = 0
+10:11/0 = 0
+11:11/0 = 0
+12:11/0 = 0
+13:11/0 = 0
+14:11/0 = 0
+15:11/0 = 0
+16:11/0 = 0
+17:11/0 = 0
+18:11/0 = 0
+19:11/0 = 0
+20:11/0 = 0
+32:11/0 = 0
+34:11/0 = 0
+35:11/0 = 0
+36:11/0 = 0
+37:11/0 = 0
+0:12/0 = 0
+1:12/0 = 0
+2:12/0 = 0
+3:12/0 = 0
+4:12/0 = 0
+5:12/0 = 0
+6:12/0 = 0
+7:12/0 = 0
+9:12/0 = 0
+10:12/0 = 0
+11:12/0 = 0
+12:12/0 = 0
+13:12/0 = 0
+14:12/0 = 0
+15:12/0 = 0
+16:12/0 = 0
+17:12/0 = 0
+18:12/0 = 0
+19:12/0 = 0
+20:12/0 = 0
+22:12/0 = 0
+23:12/0 = 0
+25:12/0 = 0
+26:12/0 = 0
+27:12/0 = 0
+30:12/0 = 0
+32:12/0 = 0
+34:12/0 = 0
+35:12/0 = 0
+36:12/0 = 0
+37:12/0 = 0
+0:13/0 = 0
+1:13/0 = 0
+2:13/0 = 0
+3:13/0 = 0
+4:13/0 = 0
+5:13/0 = 0
+6:13/0 = 0
+7:13/0 = 0
+8:13/0 = 0
+8:13/0/terrain_set = 0
+8:13/0/terrain = 0
+8:13/0/terrains_peering_bit/right_side = 0
+8:13/0/terrains_peering_bit/bottom_right_corner = 0
+8:13/0/terrains_peering_bit/bottom_side = 0
+8:13/0/terrains_peering_bit/bottom_left_corner = 1
+8:13/0/terrains_peering_bit/left_side = 1
+8:13/0/terrains_peering_bit/top_left_corner = 1
+8:13/0/terrains_peering_bit/top_side = 2
+8:13/0/terrains_peering_bit/top_right_corner = 2
+9:13/0 = 0
+9:13/0/terrain_set = 0
+9:13/0/terrain = 0
+9:13/0/terrains_peering_bit/right_side = 1
+9:13/0/terrains_peering_bit/bottom_right_corner = 1
+9:13/0/terrains_peering_bit/bottom_side = 0
+9:13/0/terrains_peering_bit/bottom_left_corner = 0
+9:13/0/terrains_peering_bit/left_side = 0
+9:13/0/terrains_peering_bit/top_left_corner = 2
+9:13/0/terrains_peering_bit/top_side = 2
+9:13/0/terrains_peering_bit/top_right_corner = 1
+10:13/0 = 0
+10:13/0/terrain_set = 0
+10:13/0/terrain = 0
+10:13/0/terrains_peering_bit/right_side = 0
+10:13/0/terrains_peering_bit/bottom_right_corner = 0
+10:13/0/terrains_peering_bit/bottom_side = 0
+10:13/0/terrains_peering_bit/bottom_left_corner = 2
+10:13/0/terrains_peering_bit/left_side = 2
+10:13/0/terrains_peering_bit/top_left_corner = 1
+10:13/0/terrains_peering_bit/top_side = 1
+10:13/0/terrains_peering_bit/top_right_corner = 1
+11:13/0 = 0
+11:13/0/terrain_set = 0
+11:13/0/terrain = 0
+11:13/0/terrains_peering_bit/right_side = 2
+11:13/0/terrains_peering_bit/bottom_right_corner = 2
+11:13/0/terrains_peering_bit/bottom_side = 0
+11:13/0/terrains_peering_bit/bottom_left_corner = 0
+11:13/0/terrains_peering_bit/left_side = 0
+11:13/0/terrains_peering_bit/top_left_corner = 1
+11:13/0/terrains_peering_bit/top_side = 1
+11:13/0/terrains_peering_bit/top_right_corner = 1
+12:13/0 = 0
+13:13/0 = 0
+14:13/0 = 0
+15:13/0 = 0
+16:13/0 = 0
+17:13/0 = 0
+18:13/0 = 0
+19:13/0 = 0
+20:13/0 = 0
+23:13/0 = 0
+24:13/0 = 0
+25:13/0 = 0
+26:13/0 = 0
+27:13/0 = 0
+28:13/0 = 0
+29:13/0 = 0
+30:13/0 = 0
+32:13/0 = 0
+34:13/0 = 0
+35:13/0 = 0
+36:13/0 = 0
+0:14/0 = 0
+1:14/0 = 0
+2:14/0 = 0
+3:14/0 = 0
+4:14/0 = 0
+5:14/0 = 0
+6:14/0 = 0
+7:14/0 = 0
+8:14/0 = 0
+8:14/0/terrain_set = 0
+8:14/0/terrain = 0
+8:14/0/terrains_peering_bit/right_side = 0
+8:14/0/terrains_peering_bit/bottom_right_corner = 2
+8:14/0/terrains_peering_bit/bottom_side = 2
+8:14/0/terrains_peering_bit/bottom_left_corner = 1
+8:14/0/terrains_peering_bit/left_side = 1
+8:14/0/terrains_peering_bit/top_left_corner = 1
+8:14/0/terrains_peering_bit/top_side = 0
+8:14/0/terrains_peering_bit/top_right_corner = 0
+9:14/0 = 0
+9:14/0/terrain_set = 0
+9:14/0/terrain = 0
+9:14/0/terrains_peering_bit/right_side = 1
+9:14/0/terrains_peering_bit/bottom_right_corner = 1
+9:14/0/terrains_peering_bit/bottom_side = 2
+9:14/0/terrains_peering_bit/bottom_left_corner = 2
+9:14/0/terrains_peering_bit/left_side = 0
+9:14/0/terrains_peering_bit/top_left_corner = 0
+9:14/0/terrains_peering_bit/top_side = 0
+9:14/0/terrains_peering_bit/top_right_corner = 1
+10:14/0 = 0
+10:14/0/terrain_set = 0
+10:14/0/terrain = 0
+10:14/0/terrains_peering_bit/right_side = 0
+10:14/0/terrains_peering_bit/bottom_right_corner = 1
+10:14/0/terrains_peering_bit/bottom_side = 1
+10:14/0/terrains_peering_bit/bottom_left_corner = 1
+10:14/0/terrains_peering_bit/left_side = 2
+10:14/0/terrains_peering_bit/top_left_corner = 2
+10:14/0/terrains_peering_bit/top_side = 0
+10:14/0/terrains_peering_bit/top_right_corner = 0
+11:14/0 = 0
+11:14/0/terrain_set = 0
+11:14/0/terrain = 0
+11:14/0/terrains_peering_bit/right_side = 2
+11:14/0/terrains_peering_bit/bottom_right_corner = 1
+11:14/0/terrains_peering_bit/bottom_side = 1
+11:14/0/terrains_peering_bit/bottom_left_corner = 1
+11:14/0/terrains_peering_bit/left_side = 0
+11:14/0/terrains_peering_bit/top_left_corner = 0
+11:14/0/terrains_peering_bit/top_side = 0
+11:14/0/terrains_peering_bit/top_right_corner = 2
+12:14/0 = 0
+13:14/0 = 0
+14:14/0 = 0
+15:14/0 = 0
+16:14/0 = 0
+18:14/0 = 0
+19:14/0 = 0
+20:14/0 = 0
+21:14/0 = 0
+22:14/0 = 0
+23:14/0 = 0
+24:14/0 = 0
+25:14/0 = 0
+26:14/0 = 0
+27:14/0 = 0
+28:14/0 = 0
+29:14/0 = 0
+30:14/0 = 0
+32:14/0 = 0
+34:14/0 = 0
+35:14/0 = 0
+36:14/0 = 0
+0:15/0 = 0
+1:15/0 = 0
+2:15/0 = 0
+3:15/0 = 0
+4:15/0 = 0
+5:15/0 = 0
+6:15/0 = 0
+7:15/0 = 0
+8:15/0 = 0
+9:15/0 = 0
+11:15/0 = 0
+12:15/0 = 0
+13:15/0 = 0
+14:15/0 = 0
+15:15/0 = 0
+16:15/0 = 0
+17:15/0 = 0
+18:15/0 = 0
+23:15/0 = 0
+24:15/0 = 0
+25:15/0 = 0
+26:15/0 = 0
+27:15/0 = 0
+28:15/0 = 0
+29:15/0 = 0
+0:16/0 = 0
+1:16/0 = 0
+2:16/0 = 0
+3:16/0 = 0
+4:16/0 = 0
+5:16/0 = 0
+6:16/0 = 0
+7:16/0 = 0
+11:16/0 = 0
+12:16/0 = 0
+13:16/0 = 0
+14:16/0 = 0
+17:16/0 = 0
+18:16/0 = 0
+23:16/0 = 0
+24:16/0 = 0
+28:16/0 = 0
+29:16/0 = 0
+33:16/0 = 0
+0:17/0 = 0
+2:17/0 = 0
+3:17/0 = 0
+4:17/0 = 0
+5:17/0 = 0
+6:17/0 = 0
+7:17/0 = 0
+9:17/0 = 0
+10:17/0 = 0
+11:17/0 = 0
+12:17/0 = 0
+13:17/0 = 0
+14:17/0 = 0
+15:17/0 = 0
+16:17/0 = 0
+19:17/0 = 0
+20:17/0 = 0
+21:17/0 = 0
+22:17/0 = 0
+23:17/0 = 0
+24:17/0 = 0
+25:17/0 = 0
+27:17/0 = 0
+28:17/0 = 0
+29:17/0 = 0
+30:17/0 = 0
+31:17/0 = 0
+32:17/0 = 0
+33:17/0 = 0
+34:17/0 = 0
+35:17/0 = 0
+36:17/0 = 0
+37:17/0 = 0
+38:17/0 = 0
+39:17/0 = 0
+0:18/0 = 0
+2:18/0 = 0
+3:18/0 = 0
+4:18/0 = 0
+5:18/0 = 0
+6:18/0 = 0
+7:18/0 = 0
+8:18/0 = 0
+9:18/0 = 0
+10:18/0 = 0
+11:18/0 = 0
+12:18/0 = 0
+13:18/0 = 0
+14:18/0 = 0
+15:18/0 = 0
+16:18/0 = 0
+17:18/0 = 0
+18:18/0 = 0
+19:18/0 = 0
+20:18/0 = 0
+21:18/0 = 0
+22:18/0 = 0
+23:18/0 = 0
+24:18/0 = 0
+25:18/0 = 0
+27:18/0 = 0
+28:18/0 = 0
+29:18/0 = 0
+30:18/0 = 0
+31:18/0 = 0
+32:18/0 = 0
+33:18/0 = 0
+34:18/0 = 0
+35:18/0 = 0
+36:18/0 = 0
+37:18/0 = 0
+38:18/0 = 0
+39:18/0 = 0
+0:19/0 = 0
+1:19/0 = 0
+3:19/0 = 0
+4:19/0 = 0
+5:19/0 = 0
+6:19/0 = 0
+7:19/0 = 0
+8:19/0 = 0
+9:19/0 = 0
+10:19/0 = 0
+11:19/0 = 0
+12:19/0 = 0
+13:19/0 = 0
+14:19/0 = 0
+15:19/0 = 0
+16:19/0 = 0
+17:19/0 = 0
+18:19/0 = 0
+19:19/0 = 0
+20:19/0 = 0
+21:19/0 = 0
+22:19/0 = 0
+23:19/0 = 0
+24:19/0 = 0
+27:19/0 = 0
+28:19/0 = 0
+29:19/0 = 0
+30:19/0 = 0
+31:19/0 = 0
+32:19/0 = 0
+33:19/0 = 0
+34:19/0 = 0
+35:19/0 = 0
+36:19/0 = 0
+37:19/0 = 0
+38:19/0 = 0
+39:19/0 = 0
+0:20/0 = 0
+1:20/0 = 0
+2:20/0 = 0
+3:20/0 = 0
+4:20/0 = 0
+5:20/0 = 0
+6:20/0 = 0
+7:20/0 = 0
+9:20/0 = 0
+10:20/0 = 0
+11:20/0 = 0
+12:20/0 = 0
+13:20/0 = 0
+14:20/0 = 0
+15:20/0 = 0
+16:20/0 = 0
+17:20/0 = 0
+18:20/0 = 0
+19:20/0 = 0
+20:20/0 = 0
+21:20/0 = 0
+22:20/0 = 0
+23:20/0 = 0
+24:20/0 = 0
+25:20/0 = 0
+26:20/0 = 0
+27:20/0 = 0
+28:20/0 = 0
+29:20/0 = 0
+0:21/0 = 0
+1:21/0 = 0
+2:21/0 = 0
+3:21/0 = 0
+4:21/0 = 0
+5:21/0 = 0
+6:21/0 = 0
+7:21/0 = 0
+9:21/0 = 0
+10:21/0 = 0
+11:21/0 = 0
+12:21/0 = 0
+13:21/0 = 0
+14:21/0 = 0
+15:21/0 = 0
+16:21/0 = 0
+17:21/0 = 0
+18:21/0 = 0
+19:21/0 = 0
+20:21/0 = 0
+21:21/0 = 0
+22:21/0 = 0
+23:21/0 = 0
+24:21/0 = 0
+25:21/0 = 0
+26:21/0 = 0
+27:21/0 = 0
+28:21/0 = 0
+29:21/0 = 0
+0:22/0 = 0
+1:22/0 = 0
+2:22/0 = 0
+3:22/0 = 0
+4:22/0 = 0
+5:22/0 = 0
+6:22/0 = 0
+7:22/0 = 0
+8:22/0 = 0
+9:22/0 = 0
+10:22/0 = 0
+11:22/0 = 0
+12:22/0 = 0
+13:22/0 = 0
+15:22/0 = 0
+16:22/0 = 0
+17:22/0 = 0
+18:22/0 = 0
+19:22/0 = 0
+20:22/0 = 0
+21:22/0 = 0
+22:22/0 = 0
+23:22/0 = 0
+24:22/0 = 0
+25:22/0 = 0
+26:22/0 = 0
+28:22/0 = 0
+29:22/0 = 0
+0:23/0 = 0
+1:23/0 = 0
+2:23/0 = 0
+3:23/0 = 0
+4:23/0 = 0
+5:23/0 = 0
+6:23/0 = 0
+7:23/0 = 0
+8:23/0 = 0
+9:23/0 = 0
+10:23/0 = 0
+11:23/0 = 0
+12:23/0 = 0
+13:23/0 = 0
+15:23/0 = 0
+16:23/0 = 0
+18:23/0 = 0
+19:23/0 = 0
+20:23/0 = 0
+21:23/0 = 0
+22:23/0 = 0
+23:23/0 = 0
+24:23/0 = 0
+25:23/0 = 0
+26:23/0 = 0
+27:23/0 = 0
+28:23/0 = 0
+29:23/0 = 0
+0:24/0 = 0
+1:24/0 = 0
+2:24/0 = 0
+3:24/0 = 0
+4:24/0 = 0
+5:24/0 = 0
+8:24/0 = 0
+9:24/0 = 0
+10:24/0 = 0
+12:24/0 = 0
+13:24/0 = 0
+15:24/0 = 0
+16:24/0 = 0
+18:24/0 = 0
+19:24/0 = 0
+20:24/0 = 0
+21:24/0 = 0
+22:24/0 = 0
+25:24/0 = 0
+26:24/0 = 0
+27:24/0 = 0
+28:24/0 = 0
+29:24/0 = 0
+0:25/0 = 0
+1:25/0 = 0
+2:25/0 = 0
+3:25/0 = 0
+4:25/0 = 0
+5:25/0 = 0
+8:25/0 = 0
+9:25/0 = 0
+10:25/0 = 0
+11:25/0 = 0
+12:25/0 = 0
+13:25/0 = 0
+14:25/0 = 0
+15:25/0 = 0
+16:25/0 = 0
+17:25/0 = 0
+18:25/0 = 0
+19:25/0 = 0
+20:25/0 = 0
+21:25/0 = 0
+22:25/0 = 0
+25:25/0 = 0
+26:25/0 = 0
+27:25/0 = 0
+28:25/0 = 0
+29:25/0 = 0
+0:26/0 = 0
+1:26/0 = 0
+2:26/0 = 0
+3:26/0 = 0
+4:26/0 = 0
+5:26/0 = 0
+6:26/0 = 0
+7:26/0 = 0
+8:26/0 = 0
+9:26/0 = 0
+11:26/0 = 0
+12:26/0 = 0
+13:26/0 = 0
+14:26/0 = 0
+15:26/0 = 0
+16:26/0 = 0
+17:26/0 = 0
+18:26/0 = 0
+19:26/0 = 0
+20:26/0 = 0
+21:26/0 = 0
+22:26/0 = 0
+25:26/0 = 0
+26:26/0 = 0
+27:26/0 = 0
+28:26/0 = 0
+29:26/0 = 0
+0:27/0 = 0
+1:27/0 = 0
+2:27/0 = 0
+3:27/0 = 0
+4:27/0 = 0
+5:27/0 = 0
+6:27/0 = 0
+7:27/0 = 0
+8:27/0 = 0
+9:27/0 = 0
+10:27/0 = 0
+11:27/0 = 0
+12:27/0 = 0
+13:27/0 = 0
+14:27/0 = 0
+15:27/0 = 0
+16:27/0 = 0
+17:27/0 = 0
+18:27/0 = 0
+19:27/0 = 0
+20:27/0 = 0
+21:27/0 = 0
+22:27/0 = 0
+25:27/0 = 0
+26:27/0 = 0
+27:27/0 = 0
+28:27/0 = 0
+29:27/0 = 0
+0:28/0 = 0
+1:28/0 = 0
+2:28/0 = 0
+3:28/0 = 0
+4:28/0 = 0
+5:28/0 = 0
+6:28/0 = 0
+7:28/0 = 0
+8:28/0 = 0
+9:28/0 = 0
+10:28/0 = 0
+11:28/0 = 0
+12:28/0 = 0
+13:28/0 = 0
+14:28/0 = 0
+15:28/0 = 0
+16:28/0 = 0
+17:28/0 = 0
+19:28/0 = 0
+20:28/0 = 0
+21:28/0 = 0
+22:28/0 = 0
+23:28/0 = 0
+25:28/0 = 0
+26:28/0 = 0
+28:28/0 = 0
+29:28/0 = 0
+0:29/0 = 0
+1:29/0 = 0
+2:29/0 = 0
+3:29/0 = 0
+4:29/0 = 0
+5:29/0 = 0
+6:29/0 = 0
+7:29/0 = 0
+8:29/0 = 0
+9:29/0 = 0
+10:29/0 = 0
+11:29/0 = 0
+12:29/0 = 0
+14:29/0 = 0
+15:29/0 = 0
+16:29/0 = 0
+17:29/0 = 0
+18:29/0 = 0
+19:29/0 = 0
+20:29/0 = 0
+21:29/0 = 0
+22:29/0 = 0
+23:29/0 = 0
+0:30/0 = 0
+1:30/0 = 0
+2:30/0 = 0
+3:30/0 = 0
+4:30/0 = 0
+5:30/0 = 0
+6:30/0 = 0
+7:30/0 = 0
+8:30/0 = 0
+9:30/0 = 0
+10:30/0 = 0
+11:30/0 = 0
+12:30/0 = 0
+14:30/0 = 0
+15:30/0 = 0
+16:30/0 = 0
+17:30/0 = 0
+18:30/0 = 0
+19:30/0 = 0
+20:30/0 = 0
+21:30/0 = 0
+22:30/0 = 0
+23:30/0 = 0
+0:31/0 = 0
+1:31/0 = 0
+2:31/0 = 0
+3:31/0 = 0
+4:31/0 = 0
+5:31/0 = 0
+6:31/0 = 0
+7:31/0 = 0
+8:31/0 = 0
+9:31/0 = 0
+10:31/0 = 0
+11:31/0 = 0
+12:31/0 = 0
+13:31/0 = 0
+14:31/0 = 0
+15:31/0 = 0
+16:31/0 = 0
+19:31/0 = 0
+20:31/0 = 0
+21:31/0 = 0
+22:31/0 = 0
+23:31/0 = 0
+24:31/0 = 0
+25:31/0 = 0
+26:31/0 = 0
+27:31/0 = 0
+0:32/0 = 0
+1:32/0 = 0
+2:32/0 = 0
+3:32/0 = 0
+4:32/0 = 0
+5:32/0 = 0
+6:32/0 = 0
+7:32/0 = 0
+8:32/0 = 0
+9:32/0 = 0
+10:32/0 = 0
+11:32/0 = 0
+12:32/0 = 0
+13:32/0 = 0
+14:32/0 = 0
+15:32/0 = 0
+16:32/0 = 0
+17:32/0 = 0
+18:32/0 = 0
+19:32/0 = 0
+20:32/0 = 0
+21:32/0 = 0
+22:32/0 = 0
+23:32/0 = 0
+24:32/0 = 0
+27:32/0 = 0
+0:33/0 = 0
+1:33/0 = 0
+4:33/0 = 0
+5:33/0 = 0
+6:33/0 = 0
+7:33/0 = 0
+8:33/0 = 0
+9:33/0 = 0
+10:33/0 = 0
+11:33/0 = 0
+12:33/0 = 0
+13:33/0 = 0
+14:33/0 = 0
+15:33/0 = 0
+16:33/0 = 0
+17:33/0 = 0
+18:33/0 = 0
+24:33/0 = 0
+25:33/0 = 0
+26:33/0 = 0
+27:33/0 = 0
+0:34/0 = 0
+1:34/0 = 0
+4:34/0 = 0
+5:34/0 = 0
+6:34/0 = 0
+7:34/0 = 0
+0:35/0 = 0
+1:35/0 = 0
+6:0/size_in_atlas = Vector2i(5, 5)
+6:0/0 = 0
+6:0/0/z_index = 1
+6:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, -24, 32, -24, 32, 12, 32, 24, -32, 24, -32, 12)
+4:1/size_in_atlas = Vector2i(2, 2)
+4:1/0 = 0
+4:1/0/z_index = 1
+16:0/size_in_atlas = Vector2i(2, 2)
+16:0/0 = 0
+16:2/size_in_atlas = Vector2i(2, 2)
+16:2/0 = 0
+18:2/size_in_atlas = Vector2i(2, 2)
+18:2/0 = 0
+18:0/size_in_atlas = Vector2i(2, 2)
+18:0/0 = 0
+20:0/size_in_atlas = Vector2i(2, 2)
+20:0/0 = 0
+20:2/size_in_atlas = Vector2i(2, 2)
+20:2/0 = 0
+22:0/size_in_atlas = Vector2i(3, 6)
+22:0/0 = 0
+3:5/size_in_atlas = Vector2i(3, 1)
+3:5/0 = 0
+11:5/size_in_atlas = Vector2i(2, 2)
+11:5/0 = 0
+13:5/size_in_atlas = Vector2i(2, 3)
+13:5/0 = 0
+13:5/0/z_index = 1
+22:9/size_in_atlas = Vector2i(3, 3)
+22:9/0 = 0
+22:9/0/z_index = 1
+25:9/size_in_atlas = Vector2i(3, 3)
+25:9/0 = 0
+25:9/0/z_index = 1
+28:9/size_in_atlas = Vector2i(3, 3)
+28:9/0 = 0
+28:9/0/z_index = 1
+27:8/0 = 0
+27:8/0/z_index = 1
+21:7/size_in_atlas = Vector2i(1, 2)
+21:7/0 = 0
+21:7/0/z_index = 1
+22:7/0 = 0
+22:7/0/z_index = 1
+22:8/0 = 0
+22:8/0/z_index = 1
+23:7/size_in_atlas = Vector2i(1, 2)
+23:7/0 = 0
+23:7/0/z_index = 1
+24:7/size_in_atlas = Vector2i(1, 2)
+24:7/0 = 0
+24:7/0/z_index = 1
+0:3/0 = 0
+0:3/0/terrain_set = 0
+0:3/0/terrain = 0
+0:3/0/terrains_peering_bit/right_side = 0
+0:3/0/terrains_peering_bit/bottom_right_corner = 2
+0:3/0/terrains_peering_bit/bottom_side = 0
+0:3/0/terrains_peering_bit/bottom_left_corner = 0
+0:3/0/terrains_peering_bit/left_side = 0
+0:3/0/terrains_peering_bit/top_left_corner = 0
+0:3/0/terrains_peering_bit/top_side = 0
+0:3/0/terrains_peering_bit/top_right_corner = 0
+1:3/0 = 0
+1:3/0/terrain_set = 0
+1:3/0/terrain = 0
+1:3/0/terrains_peering_bit/right_side = 0
+1:3/0/terrains_peering_bit/bottom_right_corner = 2
+1:3/0/terrains_peering_bit/bottom_side = 2
+1:3/0/terrains_peering_bit/bottom_left_corner = 2
+1:3/0/terrains_peering_bit/left_side = 0
+1:3/0/terrains_peering_bit/top_left_corner = 0
+1:3/0/terrains_peering_bit/top_side = 0
+1:3/0/terrains_peering_bit/top_right_corner = 0
+2:3/0 = 0
+2:3/0/terrain_set = 0
+2:3/0/terrain = 0
+2:3/0/terrains_peering_bit/right_side = 0
+2:3/0/terrains_peering_bit/bottom_right_corner = 0
+2:3/0/terrains_peering_bit/bottom_side = 0
+2:3/0/terrains_peering_bit/bottom_left_corner = 2
+2:3/0/terrains_peering_bit/left_side = 0
+2:3/0/terrains_peering_bit/top_left_corner = 0
+2:3/0/terrains_peering_bit/top_side = 0
+2:3/0/terrains_peering_bit/top_right_corner = 0
+2:4/0 = 0
+2:4/0/terrain_set = 0
+2:4/0/terrain = 0
+2:4/0/terrains_peering_bit/right_side = 0
+2:4/0/terrains_peering_bit/bottom_right_corner = 0
+2:4/0/terrains_peering_bit/bottom_side = 0
+2:4/0/terrains_peering_bit/bottom_left_corner = 2
+2:4/0/terrains_peering_bit/left_side = 2
+2:4/0/terrains_peering_bit/top_left_corner = 2
+2:4/0/terrains_peering_bit/top_side = 0
+2:4/0/terrains_peering_bit/top_right_corner = 0
+2:5/0 = 0
+2:5/0/terrain_set = 0
+2:5/0/terrain = 0
+2:5/0/terrains_peering_bit/right_side = 0
+2:5/0/terrains_peering_bit/bottom_right_corner = 0
+2:5/0/terrains_peering_bit/bottom_side = 0
+2:5/0/terrains_peering_bit/bottom_left_corner = 0
+2:5/0/terrains_peering_bit/left_side = 0
+2:5/0/terrains_peering_bit/top_left_corner = 2
+2:5/0/terrains_peering_bit/top_side = 0
+2:5/0/terrains_peering_bit/top_right_corner = 0
+1:5/0 = 0
+1:5/0/terrain_set = 0
+1:5/0/terrain = 0
+1:5/0/terrains_peering_bit/right_side = 0
+1:5/0/terrains_peering_bit/bottom_right_corner = 0
+1:5/0/terrains_peering_bit/bottom_side = 0
+1:5/0/terrains_peering_bit/bottom_left_corner = 0
+1:5/0/terrains_peering_bit/left_side = 0
+1:5/0/terrains_peering_bit/top_left_corner = 2
+1:5/0/terrains_peering_bit/top_side = 2
+1:5/0/terrains_peering_bit/top_right_corner = 2
+1:4/0 = 0
+1:4/0/terrain_set = 0
+1:4/0/terrain = 2
+1:4/0/terrains_peering_bit/right_side = 2
+1:4/0/terrains_peering_bit/bottom_right_corner = 2
+1:4/0/terrains_peering_bit/bottom_side = 2
+1:4/0/terrains_peering_bit/bottom_left_corner = 2
+1:4/0/terrains_peering_bit/left_side = 2
+1:4/0/terrains_peering_bit/top_left_corner = 2
+1:4/0/terrains_peering_bit/top_side = 2
+1:4/0/terrains_peering_bit/top_right_corner = 2
+0:4/0 = 0
+0:4/0/terrain_set = 0
+0:4/0/terrain = 0
+0:4/0/terrains_peering_bit/right_side = 2
+0:4/0/terrains_peering_bit/bottom_right_corner = 2
+0:4/0/terrains_peering_bit/bottom_side = 0
+0:4/0/terrains_peering_bit/bottom_left_corner = 0
+0:4/0/terrains_peering_bit/left_side = 0
+0:4/0/terrains_peering_bit/top_left_corner = 0
+0:4/0/terrains_peering_bit/top_side = 0
+0:4/0/terrains_peering_bit/top_right_corner = 2
+0:5/0 = 0
+0:5/0/terrain_set = 0
+0:5/0/terrain = 0
+0:5/0/terrains_peering_bit/right_side = 0
+0:5/0/terrains_peering_bit/bottom_right_corner = 0
+0:5/0/terrains_peering_bit/bottom_side = 0
+0:5/0/terrains_peering_bit/bottom_left_corner = 0
+0:5/0/terrains_peering_bit/left_side = 0
+0:5/0/terrains_peering_bit/top_left_corner = 0
+0:5/0/terrains_peering_bit/top_side = 0
+0:5/0/terrains_peering_bit/top_right_corner = 2
+1:6/0 = 0
+1:6/0/terrain_set = 0
+1:6/0/terrain = 0
+1:6/0/terrains_peering_bit/right_side = 2
+1:6/0/terrains_peering_bit/bottom_right_corner = 2
+1:6/0/terrains_peering_bit/bottom_side = 0
+1:6/0/terrains_peering_bit/bottom_left_corner = 0
+1:6/0/terrains_peering_bit/left_side = 0
+1:6/0/terrains_peering_bit/top_left_corner = 2
+1:6/0/terrains_peering_bit/top_side = 2
+1:6/0/terrains_peering_bit/top_right_corner = 2
+0:6/0 = 0
+0:6/0/terrain_set = 0
+0:6/0/terrain = 0
+0:6/0/terrains_peering_bit/right_side = 0
+0:6/0/terrains_peering_bit/bottom_right_corner = 0
+0:6/0/terrains_peering_bit/bottom_side = 0
+0:6/0/terrains_peering_bit/bottom_left_corner = 2
+0:6/0/terrains_peering_bit/left_side = 2
+0:6/0/terrains_peering_bit/top_left_corner = 2
+0:6/0/terrains_peering_bit/top_side = 2
+0:6/0/terrains_peering_bit/top_right_corner = 2
+0:7/0 = 0
+0:7/0/terrain_set = 0
+0:7/0/terrain = 0
+0:7/0/terrains_peering_bit/right_side = 0
+0:7/0/terrains_peering_bit/bottom_right_corner = 2
+0:7/0/terrains_peering_bit/bottom_side = 2
+0:7/0/terrains_peering_bit/bottom_left_corner = 2
+0:7/0/terrains_peering_bit/left_side = 2
+0:7/0/terrains_peering_bit/top_left_corner = 2
+0:7/0/terrains_peering_bit/top_side = 0
+0:7/0/terrains_peering_bit/top_right_corner = 0
+1:7/0 = 0
+1:7/0/terrain_set = 0
+1:7/0/terrain = 0
+1:7/0/terrains_peering_bit/right_side = 2
+1:7/0/terrains_peering_bit/bottom_right_corner = 2
+1:7/0/terrains_peering_bit/bottom_side = 2
+1:7/0/terrains_peering_bit/bottom_left_corner = 2
+1:7/0/terrains_peering_bit/left_side = 0
+1:7/0/terrains_peering_bit/top_left_corner = 0
+1:7/0/terrains_peering_bit/top_side = 0
+1:7/0/terrains_peering_bit/top_right_corner = 2
+2:6/0 = 0
+2:6/0/terrain_set = 0
+2:6/0/terrain = 0
+2:6/0/terrains_peering_bit/right_side = 0
+2:6/0/terrains_peering_bit/bottom_right_corner = 1
+2:6/0/terrains_peering_bit/bottom_side = 0
+2:6/0/terrains_peering_bit/bottom_left_corner = 0
+2:6/0/terrains_peering_bit/left_side = 0
+2:6/0/terrains_peering_bit/top_left_corner = 0
+2:6/0/terrains_peering_bit/top_side = 0
+2:6/0/terrains_peering_bit/top_right_corner = 0
+3:6/0 = 0
+3:6/0/terrain_set = 0
+3:6/0/terrain = 0
+3:6/0/terrains_peering_bit/right_side = 0
+3:6/0/terrains_peering_bit/bottom_right_corner = 1
+3:6/0/terrains_peering_bit/bottom_side = 1
+3:6/0/terrains_peering_bit/bottom_left_corner = 1
+3:6/0/terrains_peering_bit/left_side = 0
+3:6/0/terrains_peering_bit/top_left_corner = 0
+3:6/0/terrains_peering_bit/top_side = 0
+3:6/0/terrains_peering_bit/top_right_corner = 0
+4:6/0 = 0
+4:6/0/terrain_set = 0
+4:6/0/terrain = 0
+4:6/0/terrains_peering_bit/right_side = 0
+4:6/0/terrains_peering_bit/bottom_right_corner = 0
+4:6/0/terrains_peering_bit/bottom_side = 0
+4:6/0/terrains_peering_bit/bottom_left_corner = 1
+4:6/0/terrains_peering_bit/left_side = 0
+4:6/0/terrains_peering_bit/top_left_corner = 0
+4:6/0/terrains_peering_bit/top_side = 0
+4:6/0/terrains_peering_bit/top_right_corner = 0
+4:7/0 = 0
+4:7/0/terrain_set = 0
+4:7/0/terrain = 0
+4:7/0/terrains_peering_bit/right_side = 0
+4:7/0/terrains_peering_bit/bottom_right_corner = 0
+4:7/0/terrains_peering_bit/bottom_side = 0
+4:7/0/terrains_peering_bit/bottom_left_corner = 1
+4:7/0/terrains_peering_bit/left_side = 1
+4:7/0/terrains_peering_bit/top_left_corner = 1
+4:7/0/terrains_peering_bit/top_side = 0
+4:7/0/terrains_peering_bit/top_right_corner = 0
+3:7/0 = 0
+3:7/0/terrain_set = 0
+3:7/0/terrain = 1
+3:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+3:7/0/terrains_peering_bit/right_side = 1
+3:7/0/terrains_peering_bit/bottom_right_corner = 1
+3:7/0/terrains_peering_bit/bottom_side = 1
+3:7/0/terrains_peering_bit/bottom_left_corner = 1
+3:7/0/terrains_peering_bit/left_side = 1
+3:7/0/terrains_peering_bit/top_left_corner = 1
+3:7/0/terrains_peering_bit/top_side = 1
+3:7/0/terrains_peering_bit/top_right_corner = 1
+2:7/0 = 0
+2:7/0/terrain_set = 0
+2:7/0/terrain = 0
+2:7/0/terrains_peering_bit/right_side = 1
+2:7/0/terrains_peering_bit/bottom_right_corner = 1
+2:7/0/terrains_peering_bit/bottom_side = 0
+2:7/0/terrains_peering_bit/bottom_left_corner = 0
+2:7/0/terrains_peering_bit/left_side = 0
+2:7/0/terrains_peering_bit/top_left_corner = 0
+2:7/0/terrains_peering_bit/top_side = 0
+2:7/0/terrains_peering_bit/top_right_corner = 1
+2:8/0 = 0
+2:8/0/terrain_set = 0
+2:8/0/terrain = 0
+2:8/0/terrains_peering_bit/right_side = 0
+2:8/0/terrains_peering_bit/bottom_right_corner = 0
+2:8/0/terrains_peering_bit/bottom_side = 0
+2:8/0/terrains_peering_bit/bottom_left_corner = 0
+2:8/0/terrains_peering_bit/left_side = 0
+2:8/0/terrains_peering_bit/top_left_corner = 0
+2:8/0/terrains_peering_bit/top_side = 0
+2:8/0/terrains_peering_bit/top_right_corner = 1
+3:8/0 = 0
+3:8/0/terrain_set = 0
+3:8/0/terrain = 0
+3:8/0/terrains_peering_bit/right_side = 0
+3:8/0/terrains_peering_bit/bottom_right_corner = 0
+3:8/0/terrains_peering_bit/bottom_side = 0
+3:8/0/terrains_peering_bit/bottom_left_corner = 0
+3:8/0/terrains_peering_bit/left_side = 0
+3:8/0/terrains_peering_bit/top_left_corner = 1
+3:8/0/terrains_peering_bit/top_side = 1
+3:8/0/terrains_peering_bit/top_right_corner = 1
+4:8/0 = 0
+4:8/0/terrain_set = 0
+4:8/0/terrain = 0
+4:8/0/terrains_peering_bit/right_side = 0
+4:8/0/terrains_peering_bit/bottom_right_corner = 0
+4:8/0/terrains_peering_bit/bottom_side = 0
+4:8/0/terrains_peering_bit/bottom_left_corner = 0
+4:8/0/terrains_peering_bit/left_side = 0
+4:8/0/terrains_peering_bit/top_left_corner = 1
+4:8/0/terrains_peering_bit/top_side = 0
+4:8/0/terrains_peering_bit/top_right_corner = 0
+0:1/animation_columns = 4
+0:1/animation_mode = 1
+0:1/animation_frame_0/duration = 0.5
+0:1/animation_frame_1/duration = 0.5
+0:1/animation_frame_2/duration = 0.5
+0:1/animation_frame_3/duration = 0.5
+0:1/animation_frame_4/duration = 0.5
+0:1/animation_frame_5/duration = 0.5
+0:1/animation_frame_6/duration = 0.5
+0:1/animation_frame_7/duration = 0.5
+0:1/0 = 0
+0:1/0/terrain_set = 0
+0:1/0/terrain = 1
+0:1/0/probability = 0.3
+0:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+0:1/0/terrains_peering_bit/right_side = 1
+0:1/0/terrains_peering_bit/bottom_right_corner = 1
+0:1/0/terrains_peering_bit/bottom_side = 1
+0:1/0/terrains_peering_bit/bottom_left_corner = 1
+0:1/0/terrains_peering_bit/left_side = 1
+0:1/0/terrains_peering_bit/top_left_corner = 1
+0:1/0/terrains_peering_bit/top_side = 1
+0:1/0/terrains_peering_bit/top_right_corner = 1
+11:0/size_in_atlas = Vector2i(2, 2)
+11:0/0 = 0
+11:0/0/texture_origin = Vector2i(8, 8)
+11:0/0/z_index = 2
+14:0/size_in_atlas = Vector2i(2, 2)
+14:0/0 = 0
+14:0/0/texture_origin = Vector2i(-8, 8)
+14:0/0/z_index = 2
+11:2/size_in_atlas = Vector2i(5, 3)
+11:2/0 = 0
+11:2/0/z_index = 1
+25:7/size_in_atlas = Vector2i(1, 2)
+25:7/0 = 0
+25:7/0/z_index = 1
+16:4/size_in_atlas = Vector2i(1, 2)
+16:4/0 = 0
+16:4/0/texture_origin = Vector2i(0, 8)
+16:4/0/z_index = 1
+17:4/size_in_atlas = Vector2i(1, 2)
+17:4/0 = 0
+17:4/0/texture_origin = Vector2i(0, 8)
+17:4/0/z_index = 1
+18:4/size_in_atlas = Vector2i(1, 2)
+18:4/0 = 0
+18:4/0/texture_origin = Vector2i(0, 8)
+18:4/0/z_index = 1
+19:4/size_in_atlas = Vector2i(1, 2)
+19:4/0 = 0
+19:4/0/texture_origin = Vector2i(0, 8)
+19:4/0/z_index = 1
+20:4/size_in_atlas = Vector2i(1, 2)
+20:4/0 = 0
+20:4/0/texture_origin = Vector2i(0, 8)
+20:4/0/z_index = 1
+
+[sub_resource type="TileSet" id="TileSet_snsnx"]
+physics_layer_0/collision_layer = 1
+terrain_set_0/mode = 0
+terrain_set_0/terrain_0/name = "Grass"
+terrain_set_0/terrain_0/color = Color(0.34902, 0.890196, 0.352941, 1)
+terrain_set_0/terrain_1/name = "Water"
+terrain_set_0/terrain_1/color = Color(0.223529, 0.6, 0.882353, 1)
+terrain_set_0/terrain_2/name = "Grass Paths"
+terrain_set_0/terrain_2/color = Color(0.588235, 0.713726, 0.239216, 1)
+sources/0 = SubResource("TileSetAtlasSource_n0o3p")
+
+[node name="MainLevel" type="Node2D"]
+script = ExtResource("1_fdviv")
+
+[node name="TileMapLayer" type="TileMapLayer" parent="."]
+tile_map_data = PackedByteArray("AAAAAP//AAASACEAAAD/////AAARACEAAAD+////AAARACEAAAD9////AAARACEAAAD7////AAAQACEAAAD6////AAAHAAoAAAD5////AAAHAAkAAAD4////AAAHAAkAAAD5/wAAAAAFAAoAAAD6/wAAAAAAAAMAAAD7/wAAAAABAAMAAAD8/wAAAAABAAMAAAD9/wAAAAABAAMAAAD+/wAAAAABAAMAAAD//wAAAAABAAMAAAAAAAAAAAABAAMAAAABAAAAAAABAAMAAAACAAEAAAABAAQAAAADAAEAAAABAAQAAAAEAAEAAAABAAQAAAD4/wAAAAANABwAAAD3/wAAAAAIAAoAAAACAAAAAAABAAMAAAADAAAAAAABAAMAAAAEAAAAAAABAAMAAAAFAAAAAAABAAMAAAAGAAAAAAABAAcAAAAHAAAAAAABAAQAAAAIAAAAAAAAAAcAAAABAP//AAAIAAoAAAACAP//AAAIAAoAAAADAP//AAAFAAkAAAAEAP//AAAHAAoAAAAFAP//AAAFAAkAAAAGAP//AAAAAAMAAAD2/wAAAAAMABwAAAD1/wAAAAALABwAAAD9/wEAAAABAAQAAAD+/wEAAAABAAQAAAD//wEAAAABAAQAAAAAAAEAAAABAAQAAAABAAEAAAABAAQAAAAFAAEAAAABAAQAAAAGAAEAAAABAAQAAAAHAAEAAAABAAQAAAAIAAEAAAABAAQAAAAJAAEAAAABAAQAAAD8/wEAAAABAAQAAAD7/wEAAAABAAQAAAD6/wEAAAABAAcAAAD5/wEAAAABAAMAAAD4/wEAAAAAAAMAAAD3/wEAAAAHAAkAAAD2/wEAAAAFAAoAAAD1/wEAAAAFAAkAAAD0/wEAAAAHAAoAAAD5//7/AAAFAAkAAAD6//7/AAAIAAoAAAD7//7/AAAQACAAAAD8//7/AAARACAAAAD9//7/AAARACAAAAD+//7/AAARACAAAAD///7/AAARACAAAAAAAP7/AAASACAAAAABAP7/AAAFAAoAAAACAP7/AAAIAAoAAAADAP7/AAAFAAoAAAAFAP7/AAAFAAkAAAAGAP7/AAAAAAAAAAAIAP7/AAACAAMAAAAJAP7/AAAHAAkAAAALAP7/AAAFAAoAAAAMAP7/AAAAAAAAAAD4//7/AAAFAAoAAAD3//7/AAAAAAAAAAD3//3/AAANABwAAAD4//3/AAAHAAoAAAD5//3/AAAFAAoAAAD6//3/AAAHAAoAAAD7//3/AAAHAAoAAAD8//3/AAAIAAkAAAD9//3/AAAFAAkAAAD+//3/AAAAAAAAAAD///3/AAAIAAoAAAAAAP3/AAAIAAkAAAABAP3/AAAIAAoAAAACAP3/AAAHAAkAAAADAP3/AAANABwAAAAEAPz/AAAHAAkAAAAFAPz/AAAAAAAAAAAHAPz/AAAIAAoAAAADAPz/AAAFAAkAAAACAPz/AAAIAAoAAAABAPz/AAAIAAkAAAAAAPz/AAAHAAoAAAD///z/AAAHAAoAAAD+//z/AAAIAAoAAAD9//z/AAAFAAoAAAD8//z/AAAAAAAAAAD7//z/AAAFAAoAAAD6//z/AAAAAAAAAAD5//z/AAANABwAAAD4//z/AAAIAAkAAAD3//z/AAAFAAkAAAAEAP3/AAAAAAAAAAAFAP3/AAAFAAkAAAAGAP3/AAAAAAAAAAAIAP3/AAAFAAoAAAAJAP3/AAAHAAoAAAALAP3/AAAIAAkAAAAMAP3/AAAFAAoAAAANAP7/AAAHAAoAAAAJAPz/AAAHAAoAAAAKAPz/AAAIAAoAAAALAPz/AAAFAAoAAAD+//v/AAAHAAoAAAD9//v/AAAFAAkAAAD8//v/AAAHAAoAAAD7//v/AAAIAAoAAAD6//v/AAAAAAAAAAD5//v/AAAIAAkAAAD4//v/AAAFAAkAAAD3//v/AAAIAAkAAAD2//v/AAAAAAAAAAD///v/AAANABwAAAAAAPv/AAAHAAkAAAABAPv/AAAIAAkAAAACAPv/AAAHAAkAAAADAPv/AAAAAAAAAAAEAPv/AAAFAAoAAAAFAPv/AAAHAAoAAAAGAPv/AAAHAAoAAAAHAPv/AAAIAAoAAAAJAPv/AAAFAAkAAAAKAPv/AAAFAAoAAAALAPv/AAAFAAoAAAAMAPv/AAAAAAAAAAD1//v/AAAFAAkAAAD0//v/AAAIAAkAAADz//r/AAAFAAkAAADy//r/AAAFAAkAAADy//v/AAAHAAoAAADz//v/AAAAAAAAAAAAAPr/AAAFAAoAAAD///r/AAAFAAoAAAD+//r/AAAFAAoAAAD9//r/AAAHAAoAAAD8//r/AAAHAAkAAAD7//r/AAAAAAAAAAD6//r/AAAHAAoAAAD5//r/AAAAAAAAAAD4//r/AAAIAAkAAAD3//r/AAAHAAoAAAD2//r/AAAFAAkAAAD1//r/AAAIAAkAAAD0//r/AAAFAAkAAAABAPr/AAAIAAkAAAACAPr/AAAFAAoAAAADAPr/AAAHAAkAAAAEAPr/AAAFAAoAAAAFAPr/AAAIAAoAAAAGAPr/AAAIAAkAAAAHAPr/AAAIAAkAAAAIAPr/AAAFAAoAAAAJAPr/AAAFAAoAAAAKAPr/AAAIAAoAAAALAPr/AAAHAAkAAAD6//n/AAAHAAkAAAD5//n/AAAIAAkAAAD4//n/AAAAAAAAAAD3//n/AAAIAAkAAAD2//n/AAAFAAoAAAD1//n/AAAFAAoAAAD0//n/AAAHAAoAAAAMAPr/AAAFAAkAAAANAPr/AAAHAAoAAAAOAPr/AAAIAAoAAAAPAPr/AAAAAAAAAAAQAPr/AAAFAAkAAAAIAPn/AAAFAAkAAAAHAPn/AAAHAAkAAAAGAPn/AAAAAAAAAAAFAPn/AAAAAAAAAAAEAPn/AAAFAAkAAAADAPn/AAAFAAoAAAACAPn/AAAAAAAAAAABAPn/AAAFAAkAAAAAAPn/AAAIAAkAAAD///n/AAAHAAoAAAD+//n/AAAFAAkAAAD9//n/AAAHAAkAAAD8//n/AAAFAAkAAAD7//n/AAAFAAoAAAD2//j/AAAHAAoAAAD1//j/AAAHAAkAAAD0//j/AAAHAAoAAADz//j/AAAFAAoAAADy//j/AAAFAAkAAADx//j/AAAFAAoAAAAJAPn/AAAFAAkAAAD///j/AAAFAAkAAAD+//j/AAAIAAkAAAD9//j/AAAFAAkAAAD8//j/AAAIAAkAAAD7//j/AAAFAAoAAAD6//j/AAAFAAoAAAD5//j/AAAIAAoAAAD4//j/AAAIAAkAAAD3//j/AAAFAAkAAAAAAPj/AAAIAAoAAAABAPj/AAAHAAoAAAACAPj/AAAFAAoAAAADAPj/AAAHAAoAAAAEAPj/AAAIAAkAAAAFAPj/AAAHAAoAAAAGAPj/AAAAAAAAAAAHAPj/AAAIAAoAAAAIAPj/AAAHAAkAAAAJAPj/AAAFAAoAAAAKAPj/AAAAAAAAAAAEAPf/AAAHAAkAAAADAPf/AAAFAAkAAAACAPf/AAAHAAkAAAABAPf/AAAIAAoAAAAAAPf/AAAFAAkAAAD///f/AAAIAAoAAAD+//f/AAAHAAoAAAD9//f/AAAIAAoAAAD8//f/AAAIAAkAAAD7//f/AAAIAAoAAAD6//f/AAAIAAkAAAD5//f/AAAHAAoAAAD4//f/AAAIAAkAAAD3//f/AAAIAAoAAAD2//f/AAAIAAkAAAD1//f/AAAHAAkAAAD0//f/AAAFAAoAAADz//f/AAAFAAkAAAALAPj/AAAFAAoAAAAMAPj/AAAHAAoAAAANAPj/AAAFAAoAAAAOAPj/AAAHAAoAAAAPAPj/AAAHAAoAAAAQAPn/AAAIAAkAAAARAPn/AAAIAAkAAAASAPn/AAAFAAkAAAATAPn/AAAFAAoAAAAPAPn/AAAHAAoAAAAOAPn/AAAHAAoAAADx//7/AAADAAcAAADx//3/AAADAAcAAADx//z/AAADAAYAAADx//v/AAAFAAkAAADx//r/AAAFAAoAAADx//n/AAAAAAAAAADy//n/AAAFAAoAAADz//n/AAAAAAAAAADy//z/AAAEAAYAAADy//3/AAACAAoAAADy//7/AAAAAAEAAADy////AAADAAcAAADx////AAADAAcAAADx/wAAAAADAAcAAADx/wEAAAAAAAEAAADy/wEAAAACAAkAAADy/wAAAAADAAcAAADz/wAAAAACAAkAAADz////AAADAAcAAADz//7/AAADAAcAAADz//3/AAADAAYAAADz//z/AAAFAAoAAAD0//z/AAAIAAkAAAD0//3/AAAEAAYAAAD0//7/AAAEAAcAAAD0////AAAEAAcAAAD0/wAAAAAEAAgAAAD1////AAAAAAAAAAD1//7/AAAFAAoAAAD1//3/AAAFAAoAAAD1//z/AAAAAAAAAAD2//z/AAAIAAoAAAD2//3/AAAAAAAAAAD2//7/AAAHAAkAAAD2////AAAIAAkAAAD3////AAAHAAoAAADz/wEAAAAEAAgAAADy//f/AAAHAAoAAADx//f/AAAFAAoAAAAIAPf/AAAIAAoAAAAHAPf/AAAIAAoAAAAGAPf/AAAIAAkAAAAFAPf/AAAFAAkAAAAJAPf/AAAIAAoAAAAKAPf/AAAIAAkAAAALAPf/AAAHAAoAAAAMAPf/AAAHAAoAAAANAPf/AAAAAAAAAAAOAPf/AAAAAAAAAAAPAPf/AAAHAAkAAAAQAPf/AAAAAAAAAAAQAPj/AAAHAAkAAAARAPj/AAAHAAoAAAARAPf/AAAIAAkAAAASAPf/AAAAAAAAAAASAPj/AAAIAAoAAAATAPj/AAAFAAoAAAATAPf/AAAIAAoAAAAMAPn/AAAHAAkAAAALAPn/AAAIAAkAAAAKAPn/AAAFAAoAAAANAPn/AAAIAAkAAAASAPv/AAAFAAkAAAASAPr/AAAFAAoAAAARAPr/AAAHAAkAAAARAPv/AAAAAAAAAAAQAPv/AAAFAAkAAAAPAPv/AAAFAAkAAAAOAPv/AAAAAAAAAAANAPv/AAAAAAAAAAANAPz/AAAHAAkAAAAMAPz/AAAFAAkAAAANAP3/AAAFAAoAAAAOAP3/AAANABwAAAAOAPz/AAAAAAAAAAAPAPz/AAAFAAkAAAAPAP3/AAAFAAoAAAAPAP7/AAAHAAkAAAAOAP7/AAAIAAkAAAAOAP//AAAHAAkAAAANAP//AAAIAAoAAAAMAP//AAAIAAoAAAALAP//AAAHAAkAAAAKAP//AAAIAAoAAAAJAP//AAAAAAAAAAAIAP//AAACAAQAAAAJAAAAAAABAAMAAAAKAAAAAAABAAMAAAAKAAEAAAABAAQAAAALAAEAAAABAAQAAAALAAAAAAABAAMAAAAMAAAAAAABAAMAAAAMAAEAAAABAAQAAAANAAEAAAABAAQAAAANAAAAAAABAAMAAAAOAAAAAAABAAMAAAAOAAEAAAABAAQAAAAPAP//AAAIAAkAAAAQAP//AAAIAAoAAAAQAP7/AAAIAAoAAAAQAP3/AAAHAAkAAAAQAPz/AAAHAAoAAAARAPz/AAAIAAoAAAARAP3/AAAHAAoAAAARAP7/AAAAAAAAAAARAP//AAAAAAAAAAASAAEAAAABAAQAAAASAAAAAAABAAMAAAASAP//AAAFAAoAAAASAP7/AAAIAAkAAAASAP3/AAAAAAAAAAASAPz/AAAFAAoAAAATAPz/AAAAAAAAAAATAPv/AAAHAAoAAAATAPr/AAAIAAkAAAATAP3/AAAFAAoAAAATAP7/AAAAAAAAAAATAP//AAAHAAkAAAATAAAAAAABAAMAAAATAAEAAAABAAQAAADi//D/AAAAAAsAAADi//H/AAABAAoAAADi//L/AAABAAkAAADi//P/AAABAAoAAADi//T/AAABAAkAAADi//X/AAABAAoAAADi//b/AAABAAkAAADi//f/AAABAAoAAADi//j/AAABAAkAAADi//n/AAABAAoAAADi//r/AAABAAkAAADi//v/AAABAAoAAADi//z/AAABAAkAAADi//3/AAABAAkAAADi//7/AAABAAkAAADi////AAABAAkAAADi/wAAAAABAAMAAADi/wEAAAABAAQAAADi/wIAAAABAAUAAADi/wMAAAAHAAkAAADi/wQAAAABAAkAAADi/wUAAAABAAkAAADi/wYAAAABAAoAAADi/wcAAAABAAkAAADi/wgAAAABAAoAAADi/wkAAAABAAkAAADi/woAAAABAAoAAADi/wsAAAABAAkAAADi/wwAAAABAAoAAADi/w0AAAABAAkAAADi/w4AAAABAAoAAADi/w8AAAABAAkAAADi/xAAAAABAAoAAADi/xEAAAABAAkAAADi/xIAAAABAAoAAADi/xMAAAABAAkAAADi/xQAAAABAAoAAADi/xUAAAABAAkAAADi/xYAAAABAAoAAADi/xcAAAABAAkAAADi/xgAAAABAAoAAADi/xkAAAABAAkAAADi/xoAAAABAAoAAADi/xsAAAABAAkAAADi/xwAAAABAAoAAADi/x0AAAABAAkAAADi/x4AAAABAAoAAADi/x8AAAABAAkAAADi/yAAAAABAAoAAADi/yEAAAABAAkAAADi/yIAAAABAAoAAADi/yMAAAABAAkAAADi/yQAAAABAAoAAADi/yUAAAABAAkAAADi/yYAAAABAAoAAADi/ycAAAABAAkAAADi/ygAAAABAAoAAADi/ykAAAAIAA4AAADi/yoAAAARAAcAAADi/ysAAAABAAQAAADi/ywAAAABAAUAAADi/y0AAAABAAkAAADi/y4AAAABAAoAAADi/y8AAAABAAkAAADi/zAAAAABAAoAAADi/zEAAAABAAkAAADi/zIAAAABAAoAAADi/zMAAAABAAkAAADj//D/AAABAAsAAADj//H/AAAIAAoAAADj//L/AAAIAAoAAADj//P/AAAHAAoAAADj//T/AAAIAAkAAADj//X/AAAIAAoAAADj//b/AAAFAAkAAADj//f/AAAIAAoAAADj//j/AAAFAAkAAADj//n/AAAHAAoAAADj//r/AAAHAAkAAADj//v/AAAIAAkAAADj//z/AAAHAAkAAADj//3/AAAFAAoAAADj//7/AAAIAAoAAADj////AAAIAAoAAADj/wAAAAABAAMAAADj/wEAAAABAAQAAADj/wIAAAABAAUAAADj/wMAAAAHAAoAAADj/wQAAAAIAAoAAADj/wUAAAAAAAAAAADj/wYAAAAFAAoAAADj/wcAAAAFAAoAAADj/wgAAAAHAAoAAADj/wkAAAAAAAAAAADj/woAAAAFAAkAAADj/wsAAAAFAAoAAADj/wwAAAAFAAkAAADj/w0AAAAFAAoAAADj/w4AAAAHAAoAAADj/w8AAAAAAAAAAADj/xAAAAAHAAkAAADj/xEAAAAIAAoAAADj/xIAAAAAAAAAAADj/xMAAAAIAAoAAADj/xQAAAAFAAoAAADj/xUAAAAIAAkAAADj/xYAAAAFAAoAAADj/xcAAAAFAAoAAADj/xgAAAAAAAAAAADj/xkAAAAIAAkAAADj/xoAAAAIAAkAAADj/xsAAAAHAAoAAADj/xwAAAAHAAkAAADj/x0AAAAFAAkAAADj/x4AAAAHAAoAAADj/x8AAAAHAAoAAADj/yAAAAAHAAkAAADj/yEAAAAIAAoAAADj/yIAAAAIAAkAAADj/yMAAAAFAAkAAADj/yQAAAAHAAoAAADj/yUAAAAAAAAAAADj/yYAAAAFAAoAAADj/ycAAAAIAAoAAADj/ygAAAAFAAkAAADj/ykAAAABAAMAAADj/yoAAAABAAQAAADj/ysAAAABAAQAAADj/ywAAAABAAUAAADj/y0AAAAFAAkAAADj/y4AAAAIAAkAAADj/y8AAAAHAAoAAADj/zAAAAAIAAkAAADj/zEAAAAHAAkAAADj/zIAAAAIAAkAAADj/zMAAAAFAAkAAADk//D/AAABAAsAAADk//H/AAAHAAkAAADk//L/AAAHAAoAAADk//P/AAAIAAkAAADk//T/AAAFAAoAAADk//X/AAAIAAkAAADk//b/AAAHAAoAAADk//f/AAAFAAoAAADk//j/AAAIAAoAAADk//n/AAAHAAkAAADk//r/AAAIAAkAAADk//v/AAAFAAoAAADk//z/AAAFAAoAAADk//3/AAAIAAkAAADk//7/AAAIAAoAAADk////AAAAAAAAAADk/wAAAAABAAMAAADk/wEAAAABAAQAAADk/wIAAAABAAUAAADk/wMAAAAIAAkAAADk/wQAAAAAAAAAAADk/wUAAAAAAAAAAADk/wYAAAAIAAoAAADk/wcAAAAAAAAAAADk/wgAAAAAAAAAAADk/wkAAAAAAAAAAADk/woAAAAIAAkAAADk/wsAAAAHAAoAAADk/wwAAAAHAAoAAADk/w0AAAAFAAoAAADk/w4AAAAAAAAAAADk/w8AAAAAAAAAAADk/xAAAAAFAAoAAADk/xEAAAAFAAoAAADk/xIAAAAHAAoAAADk/xMAAAAAAAAAAADk/xQAAAAFAAoAAADk/xUAAAAIAAoAAADk/xYAAAAIAAoAAADk/xcAAAAFAAkAAADk/xgAAAAFAAoAAADk/xkAAAAAAAAAAADk/xoAAAAHAAoAAADk/xsAAAAHAAkAAADk/xwAAAAHAAkAAADk/x0AAAAFAAoAAADk/x4AAAAAAAAAAADk/x8AAAAFAAkAAADk/yAAAAAIAAkAAADk/yEAAAAHAAkAAADk/yIAAAAIAAoAAADk/yMAAAAFAAkAAADk/yQAAAAHAAkAAADk/yUAAAAIAAoAAADk/yYAAAAIAAoAAADk/ycAAAAFAAoAAADk/ygAAAAFAAoAAADk/ykAAAABAAMAAADk/yoAAAABAAQAAADk/ysAAAABAAQAAADk/ywAAAABAAUAAADk/y0AAAAHAAkAAADk/y4AAAAHAAoAAADk/y8AAAAHAAkAAADk/zAAAAAHAAkAAADk/zEAAAAHAAoAAADk/zIAAAAAAAAAAADk/zMAAAAHAAkAAADl//D/AAABAAsAAADl//H/AAAIAAkAAADl//L/AAAIAAoAAADl//P/AAAHAAkAAADl//T/AAAFAAoAAADl//X/AAAAAAAAAADl//b/AAAHAAoAAADl//f/AAAFAAoAAADl//j/AAAHAAoAAADl//n/AAAFAAkAAADl//r/AAAFAAkAAADl//v/AAAHAAkAAADl//z/AAAIAAkAAADl//3/AAAIAAoAAADl//7/AAAHAAoAAADl////AAAFAAoAAADl/wAAAAABAAMAAADl/wEAAAABAAQAAADl/wIAAAABAAUAAADl/wMAAAAFAAkAAADl/wQAAAAHAAoAAADl/wUAAAAHAAkAAADl/wYAAAAIAAoAAADl/wcAAAAIAAkAAADl/wgAAAAIAAoAAADl/wkAAAAIAAoAAADl/woAAAAHAAoAAADl/wsAAAAHAAkAAADl/wwAAAAIAAkAAADl/w0AAAAAAAAAAADl/w4AAAAIAAoAAADl/w8AAAAFAAoAAADl/xAAAAAIAAkAAADl/xEAAAAFAAoAAADl/xIAAAAFAAoAAADl/xMAAAAFAAoAAADl/xQAAAAFAAoAAADl/xUAAAAFAAkAAADl/xYAAAAHAAoAAADl/xcAAAAIAAkAAADl/xgAAAAIAAoAAADl/xkAAAAIAAoAAADl/xoAAAAFAAoAAADl/xsAAAAHAAkAAADl/xwAAAAHAAoAAADl/x0AAAAAAAAAAADl/x4AAAAIAAkAAADl/x8AAAAIAAoAAADl/yAAAAAIAAoAAADl/yEAAAAIAAkAAADl/yIAAAAHAAkAAADl/yMAAAAIAAoAAADl/yQAAAAFAAkAAADl/yUAAAAAAAAAAADl/yYAAAAHAAoAAADl/ycAAAAFAAkAAADl/ygAAAAAAAAAAADl/ykAAAABAAMAAADl/yoAAAABAAQAAADl/ysAAAABAAQAAADl/ywAAAABAAUAAADl/y0AAAAIAAkAAADl/y4AAAAAAAAAAADl/y8AAAAAAAAAAADl/zAAAAAHAAkAAADl/zEAAAAHAAkAAADl/zIAAAAFAAkAAADl/zMAAAAAAAAAAADm//D/AAABAAsAAADm//H/AAAIAAoAAADm//L/AAAFAAoAAADm//P/AAAHAAkAAADm//T/AAAIAAkAAADm//X/AAAHAAoAAADm//b/AAAFAAkAAADm//f/AAAFAAkAAADm//j/AAAHAAoAAADm//n/AAAHAAkAAADm//r/AAAAAAAAAADm//v/AAAHAAkAAADm//z/AAAAAAAAAADm//3/AAAIAAkAAADm//7/AAAAAAAAAADm////AAAIAAkAAADm/wAAAAABAAMAAADm/wEAAAABAAQAAADm/wIAAAABAAUAAADm/wMAAAAIAAkAAADm/wQAAAAHAAoAAADm/wUAAAAIAAoAAADm/wYAAAAHAAoAAADm/wcAAAAHAAkAAADm/wgAAAAIAAoAAADm/wkAAAAHAAoAAADm/woAAAAFAAoAAADm/wsAAAAIAAkAAADm/wwAAAAHAAkAAADm/w0AAAAIAAkAAADm/w4AAAAAAAAAAADm/w8AAAAIAAoAAADm/xAAAAAFAAkAAADm/xEAAAAFAAkAAADm/xIAAAAFAAoAAADm/xMAAAAIAAoAAADm/xQAAAAFAAkAAADm/xUAAAAFAAoAAADm/xYAAAAIAAoAAADm/xcAAAAFAAkAAADm/xgAAAAHAAoAAADm/xkAAAAIAAoAAADm/xoAAAAFAAkAAADm/xsAAAAFAAoAAADm/xwAAAAHAAoAAADm/x0AAAAIAAoAAADm/x4AAAAIAAoAAADm/x8AAAAIAAoAAADm/yAAAAAAAAAAAADm/yEAAAAFAAkAAADm/yIAAAAFAAoAAADm/yMAAAAHAAoAAADm/yQAAAAIAAoAAADm/yUAAAAFAAoAAADm/yYAAAAFAAoAAADm/ycAAAAAAAAAAADm/ygAAAAHAAkAAADm/ykAAAABAAMAAADm/yoAAAABAAQAAADm/ysAAAABAAQAAADm/ywAAAABAAYAAADm/y0AAAAAAAUAAADm/y4AAAAIAAoAAADm/y8AAAAIAAkAAADm/zAAAAAIAAoAAADm/zEAAAAHAAoAAADm/zIAAAAHAAkAAADm/zMAAAAIAAkAAADn//D/AAABAAsAAADn//H/AAAFAAoAAADn//L/AAAIAAoAAADn//P/AAAHAAkAAADn//T/AAAIAAkAAADn//X/AAAFAAoAAADn//b/AAAAAAAAAADn//f/AAAFAAoAAADn//j/AAAHAAkAAADn//n/AAAIAAkAAADn//r/AAAHAAoAAADn//v/AAAAAAAAAADn//z/AAAFAAkAAADn//3/AAAFAAkAAADn//7/AAAFAAoAAADn////AAAHAAoAAADn/wAAAAABAAMAAADn/wEAAAABAAQAAADn/wIAAAABAAUAAADn/wMAAAAFAAoAAADn/wQAAAAHAAoAAADn/wUAAAAHAAoAAADn/wYAAAAIAAoAAADn/wcAAAAAAAAAAADn/wgAAAAIAAoAAADn/wkAAAAHAAkAAADn/woAAAAHAAoAAADn/wsAAAAIAAoAAADn/wwAAAAHAAoAAADn/w0AAAAIAAoAAADn/w4AAAAFAAkAAADn/w8AAAAFAAoAAADn/xAAAAAFAAoAAADn/xEAAAAIAAoAAADn/xIAAAAHAAkAAADn/xMAAAAIAAoAAADn/xQAAAAAAAAAAADn/xUAAAAIAAkAAADn/xYAAAAFAAkAAADn/xcAAAAIAAoAAADn/xgAAAAHAAoAAADn/xkAAAAFAAkAAADn/xoAAAAHAAoAAADn/xsAAAAIAAkAAADn/xwAAAAFAAkAAADn/x0AAAAIAAoAAADn/x4AAAAHAAoAAADn/x8AAAAIAAoAAADn/yAAAAAHAAoAAADn/yEAAAAIAAoAAADn/yIAAAAIAAoAAADn/yMAAAAFAAoAAADn/yQAAAAIAAoAAADn/yUAAAAFAAoAAADn/yYAAAAHAAoAAADn/ycAAAAFAAoAAADn/ygAAAAIAAkAAADn/ykAAAABAAMAAADn/yoAAAABAAQAAADn/ysAAAABAAQAAADn/ywAAAABAAQAAADn/y0AAAABAAUAAADn/y4AAAAFAAkAAADn/y8AAAAHAAkAAADn/zAAAAAAAAAAAADn/zEAAAAFAAkAAADn/zIAAAAFAAoAAADn/zMAAAAFAAkAAADo//D/AAABAAsAAADo//H/AAAFAAkAAADo//L/AAAFAAkAAADo//P/AAAAAAAAAADo//T/AAAFAAoAAADo//X/AAAFAAoAAADo//b/AAAHAAkAAADo//f/AAAIAAkAAADo//j/AAAHAAkAAADo//n/AAAAAAAAAADo//r/AAAFAAkAAADo//v/AAAIAAkAAADo//z/AAAFAAkAAADo//3/AAAFAAoAAADo//7/AAAHAAkAAADo////AAAAAAAAAADo/wAAAAABAAMAAADo/wEAAAABAAQAAADo/wIAAAABAAYAAADo/wMAAAAAAAQAAADo/wQAAAAAAAQAAADo/wUAAAAAAAUAAADo/wYAAAAIAAkAAADo/wcAAAAFAAkAAADo/wgAAAAHAAkAAADo/wkAAAAFAAoAAADo/woAAAAHAAkAAADo/wsAAAAAAAAAAADo/wwAAAAFAAkAAADo/w0AAAAIAAoAAADo/w4AAAAIAAkAAADo/w8AAAAAAAAAAADo/xAAAAAAAAAAAADo/xEAAAAHAAoAAADo/xIAAAAHAAkAAADo/xMAAAAIAAoAAADo/xQAAAAFAAoAAADo/xUAAAAAAAAAAADo/xYAAAAIAAoAAADo/xcAAAAHAAkAAADo/xgAAAAFAAkAAADo/xkAAAAAAAAAAADo/xoAAAAFAAoAAADo/xsAAAAHAAoAAADo/xwAAAAAAAAAAADo/x0AAAAHAAoAAADo/x4AAAAFAAkAAADo/x8AAAAFAAkAAADo/yAAAAAIAAoAAADo/yEAAAAHAAoAAADo/yIAAAAFAAkAAADo/yMAAAAFAAkAAADo/yQAAAAIAAkAAADo/yUAAAAFAAoAAADo/yYAAAAAAAAAAADo/ycAAAAFAAkAAADo/ygAAAAHAAkAAADo/ykAAAABAAMAAADo/yoAAAABAAQAAADo/ysAAAABAAQAAADo/ywAAAABAAQAAADo/y0AAAABAAYAAADo/y4AAAAAAAUAAADo/y8AAAAHAAoAAADo/zAAAAAHAAoAAADo/zEAAAAAAAAAAADo/zIAAAAIAAoAAADo/zMAAAAAAAAAAADp//D/AAABAAsAAADp//H/AAAFAAoAAADp//L/AAAFAAkAAADp//P/AAAAAAAAAADp//T/AAAHAAkAAADp//X/AAAFAAoAAADp//b/AAAFAAoAAADp//f/AAAFAAkAAADp//j/AAAHAAoAAADp//n/AAAFAAkAAADp//r/AAAFAAoAAADp//v/AAAFAAoAAADp//z/AAAAAAAAAADp//3/AAAAAAAAAADp//7/AAAFAAkAAADp////AAAHAAoAAADp/wAAAAABAAMAAADp/wEAAAABAAQAAADp/wIAAAABAAQAAADp/wMAAAABAAQAAADp/wQAAAABAAQAAADp/wUAAAABAAYAAADp/wYAAAAAAAQAAADp/wcAAAAAAAUAAADp/wgAAAAFAAoAAADp/wkAAAAAAAAAAADp/woAAAAHAAkAAADp/wsAAAAFAAoAAADp/wwAAAAFAAoAAADp/w0AAAAFAAoAAADp/w4AAAAAAAAAAADp/w8AAAAIAAoAAADp/xAAAAAHAAoAAADp/xEAAAAFAAoAAADp/xIAAAAIAAkAAADp/xMAAAAFAAoAAADp/xQAAAAFAAkAAADp/xUAAAAFAAoAAADp/xYAAAAIAAoAAADp/xcAAAAHAAoAAADp/xgAAAAAAAAAAADp/xkAAAAFAAoAAADp/xoAAAAFAAkAAADp/xsAAAAAAAAAAADp/xwAAAAHAAkAAADp/x0AAAAFAAoAAADp/x4AAAAHAAkAAADp/x8AAAAIAAoAAADp/yAAAAAIAAkAAADp/yEAAAAAAAAAAADp/yIAAAAIAAkAAADp/yMAAAAIAAkAAADp/yQAAAAFAAoAAADp/yUAAAAAAAAAAADp/yYAAAAFAAkAAADp/ycAAAAIAAoAAADp/ygAAAAFAAoAAADp/ykAAAACAAMAAADp/yoAAAAAAAcAAADp/ysAAAABAAQAAADp/ywAAAABAAQAAADp/y0AAAABAAQAAADp/y4AAAABAAUAAADp/y8AAAAIAAoAAADp/zAAAAAFAAkAAADp/zEAAAAHAAkAAADp/zIAAAAFAAoAAADp/zMAAAAAAAAAAADq//D/AAABAAsAAADq//H/AAAFAAoAAADq//L/AAAIAAoAAADq//P/AAAAAAAAAADq//T/AAAIAAoAAADq//X/AAAHAAoAAADq//b/AAAFAAkAAADq//f/AAAHAAkAAADq//j/AAAAAAAAAADq//n/AAAHAAkAAADq//r/AAAAAAAAAADq//v/AAAFAAkAAADq//z/AAAFAAkAAADq//3/AAAFAAkAAADq//7/AAAFAAoAAADq////AAAIAAkAAADq/wAAAAACAAMAAADq/wEAAAACAAQAAADq/wIAAAACAAQAAADq/wMAAAACAAQAAADq/wQAAAAAAAcAAADq/wUAAAABAAQAAADq/wYAAAABAAQAAADq/wcAAAABAAYAAADq/wgAAAAAAAUAAADq/wkAAAAIAAoAAADq/woAAAAAAAAAAADq/wsAAAAIAAoAAADq/wwAAAAHAAoAAADq/w0AAAAIAAkAAADq/w4AAAAFAAoAAADq/w8AAAAIAAkAAADq/xAAAAAHAAoAAADq/xEAAAAHAAkAAADq/xIAAAAFAAkAAADq/xMAAAAHAAoAAADq/xQAAAAHAAoAAADq/xUAAAAFAAoAAADq/xYAAAAHAAoAAADq/xcAAAAIAAkAAADq/xgAAAAAAAAAAADq/xkAAAAHAAkAAADq/xoAAAAHAAkAAADq/xsAAAAHAAoAAADq/xwAAAAAAAAAAADq/x0AAAAHAAkAAADq/x4AAAAFAAoAAADq/x8AAAAIAAkAAADq/yAAAAAAAAAAAADq/yEAAAAAAAAAAADq/yIAAAAFAAoAAADq/yMAAAAIAAkAAADq/yQAAAAIAAkAAADq/yUAAAAIAAoAAADq/yYAAAAFAAkAAADq/ycAAAAIAAkAAADq/ygAAAAHAAoAAADq/ykAAAAFAAoAAADq/yoAAAACAAMAAADq/ysAAAAAAAcAAADq/ywAAAABAAQAAADq/y0AAAABAAQAAADq/y4AAAABAAYAAADq/y8AAAAAAAUAAADq/zAAAAAIAAoAAADq/zEAAAAHAAkAAADq/zIAAAAFAAkAAADq/zMAAAAAAAAAAADr//D/AAABAAsAAADr//H/AAAAAAAAAADr//L/AAAIAAkAAADr//P/AAAIAAkAAADr//T/AAAHAAoAAADr//X/AAAFAAkAAADr//b/AAAHAAkAAADr//f/AAAIAAoAAADr//j/AAAIAAkAAADr//n/AAAFAAoAAADr//r/AAAIAAkAAADr//v/AAAIAAoAAADr//z/AAAIAAoAAADr//3/AAAFAAkAAADr//7/AAAFAAkAAADr////AAAAAAAAAADr/wAAAAAHAAkAAADr/wEAAAAFAAoAAADr/wIAAAAIAAoAAADr/wMAAAAFAAoAAADr/wQAAAACAAMAAADr/wUAAAAAAAcAAADr/wYAAAABAAQAAADr/wcAAAABAAQAAADr/wgAAAABAAYAAADr/wkAAAAAAAUAAADr/woAAAAIAAoAAADr/wsAAAAIAAoAAADr/wwAAAAIAAkAAADr/w0AAAAFAAoAAADr/w4AAAAFAAoAAADr/w8AAAAIAAkAAADr/xAAAAAFAAkAAADr/xEAAAAFAAkAAADr/xIAAAAIAAoAAADr/xMAAAAFAAkAAADr/xQAAAAHAAoAAADr/xUAAAAHAAoAAADr/xYAAAAIAAkAAADr/xcAAAAIAAkAAADr/xgAAAAHAAoAAADr/xkAAAAIAAoAAADr/xoAAAAFAAoAAADr/xsAAAAIAAoAAADr/xwAAAAHAAkAAADr/x0AAAAAAAAAAADr/x4AAAAFAAoAAADr/x8AAAAAAAAAAADr/yAAAAAAAAAAAADr/yEAAAAHAAkAAADr/yIAAAAFAAkAAADr/yMAAAAAAAAAAADr/yQAAAAIAAkAAADr/yUAAAAIAAkAAADr/yYAAAAFAAkAAADr/ycAAAAAAAAAAADr/ygAAAAFAAkAAADr/ykAAAAHAAoAAADr/yoAAAAIAAoAAADr/ysAAAACAAMAAADr/ywAAAAAAAcAAADr/y0AAAABAAQAAADr/y4AAAABAAQAAADr/y8AAAABAAUAAADr/zAAAAAHAAoAAADr/zEAAAAFAAoAAADr/zIAAAAFAAoAAADr/zMAAAAAAAAAAADs//D/AAABAAsAAADs//H/AAAFAAkAAADs//L/AAAAAAAAAADs//P/AAAIAAkAAADs//T/AAAIAAoAAADs//X/AAAHAAoAAADs//b/AAAHAAoAAADs//f/AAAIAAoAAADs//j/AAAFAAkAAADs//n/AAAIAAoAAADs//r/AAAAAAAAAADs//v/AAAAAAAAAADs//z/AAAIAAkAAADs//3/AAAIAAkAAADs//7/AAAFAAkAAADs////AAAFAAkAAADs/wAAAAAFAAoAAADs/wEAAAAIAAoAAADs/wIAAAAIAAkAAADs/wMAAAAFAAoAAADs/wQAAAAIAAoAAADs/wUAAAACAAMAAADs/wYAAAAAAAcAAADs/wcAAAABAAQAAADs/wgAAAABAAQAAADs/wkAAAABAAYAAADs/woAAAAAAAUAAADs/wsAAAAFAAoAAADs/wwAAAAIAAoAAADs/w0AAAAIAAkAAADs/w4AAAAIAAoAAADs/w8AAAAHAAoAAADs/xAAAAAIAAoAAADs/xEAAAAHAAkAAADs/xIAAAAAAAAAAADs/xMAAAAHAAoAAADs/xQAAAAHAAkAAADs/xUAAAAHAAkAAADs/xYAAAAIAAkAAADs/xcAAAAAAAAAAADs/xgAAAAFAAoAAADs/xkAAAAHAAoAAADs/xoAAAAHAAkAAADs/xsAAAAHAAkAAADs/xwAAAAFAAoAAADs/x0AAAAHAAkAAADs/x4AAAAHAAoAAADs/x8AAAAHAAoAAADs/yAAAAAHAAkAAADs/yEAAAAIAAoAAADs/yIAAAAIAAoAAADs/yMAAAAFAAoAAADs/yQAAAAHAAkAAADs/yUAAAAHAAoAAADs/yYAAAAHAAkAAADs/ycAAAAIAAkAAADs/ygAAAAAAAAAAADs/ykAAAAIAAkAAADs/yoAAAAHAAoAAADs/ysAAAAHAAoAAADs/ywAAAABAAMAAADs/y0AAAABAAQAAADs/y4AAAABAAQAAADs/y8AAAABAAYAAADs/zAAAAAAAAUAAADs/zEAAAAIAAkAAADs/zIAAAAHAAkAAADs/zMAAAAIAAoAAADt//D/AAABAAsAAADt//H/AAAIAAoAAADt//L/AAAIAAoAAADt//P/AAAHAAoAAADt//T/AAAAAAAAAADt//X/AAAAAAAAAADt//b/AAAAAAAAAADt//f/AAAIAAkAAADt//j/AAAIAAkAAADt//n/AAAIAAkAAADt//r/AAAAAAAAAADt//v/AAAHAAoAAADt//z/AAAAAAAAAADt//3/AAAFAAkAAADt//7/AAAFAAkAAADt////AAAIAAoAAADt/wAAAAAFAAoAAADt/wEAAAAIAAoAAADt/wIAAAAIAAoAAADt/wMAAAAFAAoAAADt/wQAAAAIAAoAAADt/wUAAAAFAAoAAADt/wYAAAACAAMAAADt/wcAAAAAAAcAAADt/wgAAAABAAQAAADt/wkAAAABAAQAAADt/woAAAABAAYAAADt/wsAAAAAAAUAAADt/wwAAAAIAAoAAADt/w0AAAAIAAkAAADt/w4AAAAFAAoAAADt/w8AAAAIAAoAAADt/xAAAAAAAAAAAADt/xEAAAAHAAoAAADt/xIAAAAHAAkAAADt/xMAAAAFAAoAAADt/xQAAAAAAAAAAADt/xUAAAAFAAoAAADt/xYAAAAHAAoAAADt/xcAAAAAAAAAAADt/xgAAAAIAAoAAADt/xkAAAAIAAkAAADt/xoAAAAIAAoAAADt/xsAAAAHAAkAAADt/xwAAAAHAAkAAADt/x0AAAAHAAoAAADt/x4AAAAFAAoAAADt/x8AAAAAAAAAAADt/yAAAAAFAAoAAADt/yEAAAAHAAkAAADt/yIAAAAAAAAAAADt/yMAAAAIAAkAAADt/yQAAAAIAAoAAADt/yUAAAAFAAoAAADt/yYAAAAFAAoAAADt/ycAAAAFAAkAAADt/ygAAAAFAAoAAADt/ykAAAAFAAkAAADt/yoAAAAHAAkAAADt/ysAAAAIAAoAAADt/ywAAAABAAMAAADt/y0AAAABAAQAAADt/y4AAAABAAQAAADt/y8AAAABAAQAAADt/zAAAAABAAUAAADt/zEAAAAHAAoAAADt/zIAAAAIAAkAAADt/zMAAAAHAAoAAADu//D/AAABAAsAAADu//H/AAAIAAoAAADu//L/AAAIAAoAAADu//P/AAAFAAoAAADu//T/AAAHAAoAAADu//X/AAAIAAkAAADu//b/AAAIAAoAAADu//f/AAAFAAoAAADu//j/AAAFAAkAAADu//n/AAAHAAoAAADu//r/AAAFAAkAAADu//v/AAAHAAkAAADu//z/AAAIAAoAAADu//3/AAACAAYAAADu//7/AAACAAcAAADu////AAACAAcAAADu/wAAAAACAAgAAADu/wEAAAAAAAAAAADu/wIAAAAFAAkAAADu/wMAAAAIAAkAAADu/wQAAAAFAAkAAADu/wUAAAAFAAoAAADu/wYAAAAIAAoAAADu/wcAAAACAAMAAADu/wgAAAAAAAcAAADu/wkAAAABAAQAAADu/woAAAABAAQAAADu/wsAAAABAAUAAADu/wwAAAAFAAkAAADu/w0AAAAFAAkAAADu/w4AAAAIAAoAAADu/w8AAAAIAAoAAADu/xAAAAAHAAkAAADu/xEAAAAAAAAAAADu/xIAAAAAAAAAAADu/xMAAAAAAAAAAADu/xQAAAAFAAkAAADu/xUAAAAHAAkAAADu/xYAAAAHAAkAAADu/xcAAAAFAAkAAADu/xgAAAAIAAoAAADu/xkAAAAIAAoAAADu/xoAAAAFAAoAAADu/xsAAAAIAAkAAADu/xwAAAAHAAkAAADu/x0AAAAHAAkAAADu/x4AAAAFAAoAAADu/x8AAAAFAAkAAADu/yAAAAAFAAoAAADu/yEAAAAIAAoAAADu/yIAAAAAAAAAAADu/yMAAAAFAAoAAADu/yQAAAAFAAoAAADu/yUAAAAFAAoAAADu/yYAAAAFAAkAAADu/ycAAAAAAAAAAADu/ygAAAAHAAkAAADu/ykAAAAHAAoAAADu/yoAAAAIAAkAAADu/ysAAAAIAAkAAADu/ywAAAACAAMAAADu/y0AAAAAAAcAAADu/y4AAAABAAQAAADu/y8AAAABAAQAAADu/zAAAAABAAUAAADu/zEAAAAAAAAAAADu/zIAAAAAAAAAAADu/zMAAAAFAAoAAADv//D/AAABAAsAAADv//H/AAAFAAoAAADv//L/AAAHAAkAAADv//P/AAAIAAkAAADv//T/AAAIAAkAAADv//X/AAAAAAAAAADv//b/AAAFAAkAAADv//f/AAAHAAoAAADv//j/AAAFAAoAAADv//n/AAAIAAoAAADv//r/AAAAAAAAAADv//v/AAAFAAkAAADv//z/AAACAAYAAADv//3/AAADAAoAAADv//7/AAADAAcAAADv////AAAAAAEAAADv/wAAAAADAAkAAADv/wEAAAACAAgAAADv/wIAAAAIAAoAAADv/wMAAAAHAAkAAADv/wQAAAAFAAkAAADv/wUAAAAHAAoAAADv/wYAAAAFAAkAAADv/wcAAAAHAAoAAADv/wgAAAACAAMAAADv/wkAAAAAAAcAAADv/woAAAABAAQAAADv/wsAAAABAAYAAADv/wwAAAAAAAUAAADv/w0AAAAIAAkAAADv/w4AAAAFAAkAAADv/w8AAAAFAAoAAADv/xAAAAAFAAoAAADv/xEAAAAIAAoAAADv/xIAAAAAAAAAAADv/xMAAAAAAAAAAADv/xQAAAAFAAkAAADv/xUAAAAHAAoAAADv/xYAAAAHAAoAAADv/xcAAAAHAAkAAADv/xgAAAAHAAoAAADv/xkAAAAHAAoAAADv/xoAAAAFAAkAAADv/xsAAAAAAAAAAADv/xwAAAAFAAkAAADv/x0AAAAIAAkAAADv/x4AAAAHAAoAAADv/x8AAAAHAAoAAADv/yAAAAAIAAkAAADv/yEAAAAFAAkAAADv/yIAAAAAAAAAAADv/yMAAAAFAAoAAADv/yQAAAAAAAAAAADv/yUAAAAHAAoAAADv/yYAAAAIAAkAAADv/ycAAAAIAAoAAADv/ygAAAAHAAkAAADv/ykAAAAIAAkAAADv/yoAAAAFAAoAAADv/ysAAAAFAAoAAADv/ywAAAAAAAMAAADv/y0AAAABAAcAAADv/y4AAAABAAQAAADv/y8AAAABAAQAAADv/zAAAAABAAUAAADv/zEAAAAHAAoAAADv/zIAAAAIAAoAAADv/zMAAAAHAAoAAADw//D/AAABAAsAAADw//H/AAAIAAoAAADw//L/AAAHAAoAAADw//P/AAAHAAoAAADw//T/AAAHAAoAAADw//X/AAAIAAoAAADw//b/AAAHAAkAAADw//f/AAAFAAkAAADw//j/AAAAAAAAAADw//n/AAAHAAkAAADw//r/AAAIAAkAAADw//v/AAAIAAkAAADw//z/AAADAAYAAADw//3/AAAAAAEAAADw//7/AAADAAcAAADw////AAADAAcAAADw/wAAAAADAAcAAADw/wEAAAADAAkAAADw/wIAAAACAAgAAADw/wMAAAAHAAoAAADw/wQAAAAAAAAAAADw/wUAAAAHAAoAAADw/wYAAAAFAAkAAADw/wcAAAAHAAkAAADw/wgAAAAHAAkAAADw/wkAAAABAAMAAADw/woAAAABAAQAAADw/wsAAAABAAQAAADw/wwAAAABAAYAAADw/w0AAAAAAAQAAADw/w4AAAAAAAUAAADw/w8AAAAAAAAAAADw/xAAAAAFAAoAAADw/xEAAAAAAAAAAADw/xIAAAAAAAAAAADw/xMAAAAHAAoAAADw/xQAAAAFAAoAAADw/xUAAAAHAAkAAADw/xYAAAAFAAoAAADw/xcAAAAAAAAAAADw/xgAAAAIAAkAAADw/xkAAAAHAAkAAADw/xoAAAAAAAAAAADw/xsAAAAHAAoAAADw/xwAAAAAAAAAAADw/x0AAAAFAAkAAADw/x4AAAAIAAkAAADw/x8AAAAHAAoAAADw/yAAAAAIAAoAAADw/yEAAAAAAAAAAADw/yIAAAAFAAoAAADw/yMAAAAAAAAAAADw/yQAAAAHAAkAAADw/yUAAAAIAAkAAADw/yYAAAAFAAoAAADw/ycAAAAIAAoAAADw/ygAAAAIAAoAAADw/ykAAAAIAAkAAADw/yoAAAAHAAkAAADw/ysAAAAIAAkAAADw/ywAAAABAAMAAADw/y0AAAABAAQAAADw/y4AAAABAAQAAADw/y8AAAABAAQAAADw/zAAAAABAAUAAADw/zEAAAAIAAoAAADw/zIAAAAAAAAAAADw/zMAAAAIAAoAAADx//D/AAABAAsAAADx//H/AAAHAAkAAADx//L/AAAFAAkAAADx//P/AAAHAAoAAADx//T/AAAHAAkAAADx//X/AAAHAAkAAADx//b/AAAAAAAAAADx/wIAAAADAAgAAADx/wMAAAAIAAoAAADx/wQAAAAHAAoAAADx/wUAAAAHAAoAAADx/wYAAAAHAAkAAADx/wcAAAAHAAkAAADx/wgAAAAFAAkAAADx/wkAAAABAAMAAADx/woAAAABAAQAAADx/wsAAAABAAQAAADx/wwAAAABAAQAAADx/w0AAAABAAQAAADx/w4AAAABAAYAAADx/w8AAAAAAAQAAADx/xAAAAAAAAQAAADx/xEAAAAAAAUAAADx/xIAAAAIAAkAAADx/xMAAAAFAAkAAADx/xQAAAAIAAoAAADx/xUAAAAFAAkAAADx/xYAAAAIAAoAAADx/xcAAAAIAAkAAADx/xgAAAAAAAAAAADx/xkAAAAAAAAAAADx/xoAAAAAAAAAAADx/xsAAAAHAAkAAADx/xwAAAAIAAkAAADx/x0AAAAIAAkAAADx/x4AAAAIAAoAAADx/x8AAAAHAAkAAADx/yAAAAAIAAkAAADx/yEAAAAAAAAAAADx/yIAAAAIAAoAAADx/yMAAAAHAAoAAADx/yQAAAAIAAkAAADx/yUAAAAHAAoAAADx/yYAAAAIAAoAAADx/ycAAAAFAAkAAADx/ygAAAAHAAoAAADx/ykAAAAAAAAAAADx/yoAAAAFAAkAAADx/ysAAAAIAAoAAADx/ywAAAABAAMAAADx/y0AAAABAAQAAADx/y4AAAABAAQAAADx/y8AAAABAAQAAADx/zAAAAABAAUAAADx/zEAAAAIAAkAAADx/zIAAAAHAAoAAADx/zMAAAAAAAAAAADy//D/AAABAAsAAADy//H/AAAFAAoAAADy//L/AAAFAAkAAADy//P/AAAIAAkAAADy//T/AAAFAAoAAADy//X/AAAHAAkAAADy//b/AAAIAAkAAADy/wIAAAAEAAgAAADy/wMAAAAFAAoAAADy/wQAAAAIAAoAAADy/wUAAAAHAAoAAADy/wYAAAAHAAkAAADy/wcAAAAHAAoAAADy/wgAAAAAAAMAAADy/wkAAAABAAcAAADy/woAAAABAAQAAADy/wsAAAABAAQAAADy/wwAAAABAAQAAADy/w0AAAABAAQAAADy/w4AAAABAAQAAADy/w8AAAABAAQAAADy/xAAAAABAAQAAADy/xEAAAABAAYAAADy/xIAAAAAAAQAAADy/xMAAAAAAAQAAADy/xQAAAAAAAUAAADy/xUAAAAHAAkAAADy/xYAAAAHAAkAAADy/xcAAAAIAAkAAADy/xgAAAAIAAkAAADy/xkAAAAHAAkAAADy/xoAAAAIAAoAAADy/xsAAAAAAAAAAADy/xwAAAAFAAkAAADy/x0AAAAFAAkAAADy/x4AAAAAAAAAAADy/x8AAAAFAAoAAADy/yAAAAAFAAoAAADy/yEAAAAAAAAAAADy/yIAAAAFAAoAAADy/yMAAAAAAAAAAADy/yQAAAAIAAkAAADy/yUAAAAHAAoAAADy/yYAAAAAAAAAAADy/ycAAAAHAAkAAADy/ygAAAAIAAoAAADy/ykAAAAFAAkAAADy/yoAAAAIAAoAAADy/ysAAAAAAAAAAADy/ywAAAABAAMAAADy/y0AAAABAAQAAADy/y4AAAABAAQAAADy/y8AAAABAAQAAADy/zAAAAABAAUAAADy/zEAAAAIAAkAAADy/zIAAAAFAAoAAADy/zMAAAAIAAoAAADz//D/AAABAAsAAADz//H/AAAIAAoAAADz//L/AAAHAAoAAADz//P/AAAFAAkAAADz//T/AAAFAAoAAADz//X/AAAFAAoAAADz//b/AAAHAAoAAADz/wIAAAAAAAAAAADz/wMAAAAHAAoAAADz/wQAAAAIAAkAAADz/wUAAAAHAAkAAADz/wYAAAAIAAkAAADz/wcAAAAIAAkAAADz/wgAAAABAAMAAADz/wkAAAABAAQAAADz/woAAAABAAQAAADz/wsAAAAAAAYAAADz/wwAAAACAAQAAADz/w0AAAAAAAcAAADz/w4AAAABAAQAAADz/w8AAAABAAQAAADz/xAAAAABAAQAAADz/xEAAAABAAQAAADz/xIAAAABAAQAAADz/xMAAAABAAQAAADz/xQAAAABAAYAAADz/xUAAAAAAAQAAADz/xYAAAAAAAUAAADz/xcAAAAAAAAAAADz/xgAAAAHAAoAAADz/xkAAAAAAAAAAADz/xoAAAAFAAkAAADz/xsAAAAFAAkAAADz/xwAAAAHAAkAAADz/x0AAAAAAAAAAADz/x4AAAAFAAoAAADz/x8AAAAFAAkAAADz/yAAAAAIAAkAAADz/yEAAAAIAAkAAADz/yIAAAAAAAAAAADz/yMAAAAFAAoAAADz/yQAAAAFAAoAAADz/yUAAAAIAAkAAADz/yYAAAAIAAoAAADz/ycAAAAIAAkAAADz/ygAAAAIAAkAAADz/ykAAAAHAAoAAADz/yoAAAAIAAkAAADz/ysAAAAAAAMAAADz/ywAAAABAAcAAADz/y0AAAABAAQAAADz/y4AAAABAAQAAADz/y8AAAABAAQAAADz/zAAAAABAAUAAADz/zEAAAAHAAoAAADz/zIAAAAIAAkAAADz/zMAAAAHAAoAAAD0//D/AAABAAsAAAD0//H/AAAFAAoAAAD0//L/AAAFAAkAAAD0//P/AAAFAAkAAAD0//T/AAAAAAAAAAD0//X/AAAFAAkAAAD0//b/AAAHAAoAAAD0/wIAAAAFAAkAAAD0/wMAAAAHAAoAAAD0/wQAAAANABwAAAD0/wUAAAAHAAkAAAD0/wYAAAAFAAkAAAD0/wcAAAAAAAMAAAD0/wgAAAABAAcAAAD0/wkAAAABAAQAAAD0/woAAAAAAAYAAAD0/wsAAAACAAUAAAD0/wwAAAAHAAkAAAD0/w0AAAACAAMAAAD0/w4AAAACAAQAAAD0/w8AAAAAAAcAAAD0/xAAAAABAAQAAAD0/xEAAAABAAQAAAD0/xIAAAABAAQAAAD0/xMAAAABAAQAAAD0/xQAAAABAAQAAAD0/xUAAAABAAQAAAD0/xYAAAABAAYAAAD0/xcAAAAAAAQAAAD0/xgAAAAAAAUAAAD0/xkAAAAHAAkAAAD0/xoAAAAAAAAAAAD0/xsAAAAIAAkAAAD0/xwAAAAFAAoAAAD0/x0AAAAIAAoAAAD0/x4AAAAHAAkAAAD0/x8AAAAIAAkAAAD0/yAAAAAIAAkAAAD0/yEAAAAHAAoAAAD0/yIAAAAFAAkAAAD0/yMAAAAIAAkAAAD0/yQAAAAAAAAAAAD0/yUAAAAIAAoAAAD0/yYAAAAAAAAAAAD0/ycAAAAFAAkAAAD0/ygAAAAIAAoAAAD0/ykAAAAHAAkAAAD0/yoAAAAHAAoAAAD0/ysAAAABAAMAAAD0/ywAAAABAAQAAAD0/y0AAAABAAQAAAD0/y4AAAABAAQAAAD0/y8AAAAAAAYAAAD0/zAAAAACAAUAAAD0/zEAAAAFAAkAAAD0/zIAAAAIAAoAAAD0/zMAAAAIAAoAAAD1//D/AAABAAsAAAD1//H/AAAFAAkAAAD1//L/AAAIAAkAAAD1//P/AAAFAAkAAAD1//T/AAAHAAkAAAD1//X/AAAAAAAAAAD1//b/AAAHAAkAAAD1/wIAAAAFAAoAAAD1/wMAAAAHAAoAAAD1/wQAAAAFAAkAAAD1/wUAAAAIAAkAAAD1/wYAAAAAAAMAAAD1/wcAAAABAAcAAAD1/wgAAAABAAQAAAD1/wkAAAABAAQAAAD1/woAAAABAAUAAAD1/wsAAAAAAAAAAAD1/wwAAAAIAAoAAAD1/w0AAAAIAAoAAAD1/w4AAAAIAAoAAAD1/w8AAAACAAMAAAD1/xAAAAAAAAcAAAD1/xEAAAABAAQAAAD1/xIAAAABAAQAAAD1/xMAAAABAAQAAAD1/xQAAAABAAQAAAD1/xUAAAABAAQAAAD1/xYAAAABAAQAAAD1/xcAAAABAAQAAAD1/xgAAAABAAYAAAD1/xkAAAAAAAQAAAD1/xoAAAAAAAUAAAD1/xsAAAAFAAkAAAD1/xwAAAAFAAoAAAD1/x0AAAAFAAkAAAD1/x4AAAAIAAkAAAD1/x8AAAAAAAAAAAD1/yAAAAAHAAoAAAD1/yEAAAAAAAAAAAD1/yIAAAAIAAoAAAD1/yMAAAAIAAkAAAD1/yQAAAAFAAoAAAD1/yUAAAAFAAkAAAD1/yYAAAAHAAoAAAD1/ycAAAAAAAAAAAD1/ygAAAAIAAkAAAD1/ykAAAAFAAkAAAD1/yoAAAAAAAMAAAD1/ysAAAABAAcAAAD1/ywAAAABAAQAAAD1/y0AAAABAAQAAAD1/y4AAAAAAAYAAAD1/y8AAAACAAUAAAD1/zAAAAAAAAAAAAD1/zEAAAAHAAoAAAD1/zIAAAAFAAoAAAD1/zMAAAAHAAoAAAD2//D/AAABAAsAAAD2//H/AAAAAAAAAAD2//L/AAAHAAoAAAD2//P/AAAAAAAAAAD2//T/AAAAAAAAAAD2//X/AAAHAAoAAAD2//b/AAAAAAAAAAD2/wIAAAAAAAAAAAD2/wMAAAAAAAAAAAD2/wQAAAAAAAMAAAD2/wUAAAAAAAQAAAD2/wYAAAABAAcAAAD2/wcAAAABAAQAAAD2/wgAAAABAAQAAAD2/wkAAAAAAAYAAAD2/woAAAACAAUAAAD2/wsAAAAAAAAAAAD2/wwAAAAIAAkAAAD2/w0AAAAFAAoAAAD2/w4AAAAFAAoAAAD2/w8AAAAFAAoAAAD2/xAAAAACAAMAAAD2/xEAAAACAAQAAAD2/xIAAAACAAQAAAD2/xMAAAACAAQAAAD2/xQAAAAAAAcAAAD2/xUAAAABAAQAAAD2/xYAAAABAAQAAAD2/xcAAAABAAQAAAD2/xgAAAABAAQAAAD2/xkAAAABAAQAAAD2/xoAAAABAAYAAAD2/xsAAAAAAAUAAAD2/xwAAAAFAAkAAAD2/x0AAAAFAAkAAAD2/x4AAAAHAAkAAAD2/x8AAAAFAAkAAAD2/yAAAAAFAAkAAAD2/yEAAAAFAAkAAAD2/yIAAAAIAAkAAAD2/yMAAAAFAAkAAAD2/yQAAAAFAAkAAAD2/yUAAAAFAAkAAAD2/yYAAAAAAAAAAAD2/ycAAAAIAAkAAAD2/ygAAAAHAAoAAAD2/ykAAAAAAAMAAAD2/yoAAAABAAcAAAD2/ysAAAABAAQAAAD2/ywAAAABAAQAAAD2/y0AAAAAAAYAAAD2/y4AAAACAAUAAAD2/y8AAAAFAAoAAAD2/zAAAAAFAAkAAAD2/zEAAAAFAAoAAAD2/zIAAAAFAAkAAAD2/zMAAAAHAAkAAAD3//D/AAABAAsAAAD3//H/AAAFAAoAAAD3//L/AAAFAAkAAAD3//P/AAAFAAkAAAD3//T/AAAIAAoAAAD3//X/AAAIAAoAAAD3//b/AAAIAAkAAAD3/wIAAAAAAAMAAAD3/wMAAAAAAAQAAAD3/wQAAAABAAcAAAD3/wUAAAABAAQAAAD3/wYAAAABAAQAAAD3/wcAAAABAAQAAAD3/wgAAAAAAAYAAAD3/wkAAAACAAUAAAD3/woAAAAHAAkAAAD3/wsAAAAIAAkAAAD3/wwAAAAIAAkAAAD3/w0AAAAIAAkAAAD3/w4AAAAHAAkAAAD3/w8AAAAHAAoAAAD3/xAAAAAIAAkAAAD3/xEAAAAIAAkAAAD3/xIAAAAAAAAAAAD3/xMAAAAHAAoAAAD3/xQAAAACAAMAAAD3/xUAAAACAAQAAAD3/xYAAAAAAAcAAAD3/xcAAAABAAQAAAD3/xgAAAABAAQAAAD3/xkAAAABAAQAAAD3/xoAAAABAAQAAAD3/xsAAAABAAYAAAD3/xwAAAAAAAUAAAD3/x0AAAAHAAoAAAD3/x4AAAAHAAkAAAD3/x8AAAAHAAoAAAD3/yAAAAAFAAoAAAD3/yEAAAAFAAoAAAD3/yIAAAAIAAkAAAD3/yMAAAAHAAkAAAD3/yQAAAAFAAkAAAD3/yUAAAAFAAkAAAD3/yYAAAAHAAoAAAD3/ycAAAAHAAkAAAD3/ygAAAAHAAoAAAD3/ykAAAABAAMAAAD3/yoAAAABAAQAAAD3/ysAAAABAAQAAAD3/ywAAAABAAQAAAD3/y0AAAABAAUAAAD3/y4AAAAHAAkAAAD3/y8AAAAFAAkAAAD3/zAAAAAHAAoAAAD3/zEAAAAIAAoAAAD3/zIAAAAIAAkAAAD3/zMAAAAAAAAAAAD4//D/AAABAAsAAAD4//H/AAAIAAoAAAD4//L/AAAIAAkAAAD4//P/AAAFAAkAAAD4//T/AAAFAAoAAAD4//X/AAAFAAkAAAD4//b/AAAHAAoAAAD4/wIAAAABAAcAAAD4/wMAAAABAAQAAAD4/wQAAAABAAQAAAD4/wUAAAAAAAYAAAD4/wYAAAACAAQAAAD4/wcAAAACAAQAAAD4/wgAAAACAAUAAAD4/wkAAAAHAAoAAAD4/woAAAAHAAkAAAD4/wsAAAAHAAoAAAD4/wwAAAAIAAkAAAD4/w0AAAAIAAkAAAD4/w4AAAAHAAkAAAD4/w8AAAAHAAoAAAD4/xAAAAAAAAAAAAD4/xEAAAAHAAkAAAD4/xIAAAAAAAAAAAD4/xMAAAAIAAkAAAD4/xQAAAAAAAAAAAD4/xUAAAAIAAkAAAD4/xYAAAACAAMAAAD4/xcAAAACAAQAAAD4/xgAAAAAAAcAAAD4/xkAAAABAAQAAAD4/xoAAAABAAQAAAD4/xsAAAABAAQAAAD4/xwAAAABAAYAAAD4/x0AAAAAAAUAAAD4/x4AAAAFAAkAAAD4/x8AAAAFAAkAAAD4/yAAAAAHAAkAAAD4/yEAAAAHAAkAAAD4/yIAAAAIAAkAAAD4/yMAAAAHAAkAAAD4/yQAAAAHAAkAAAD4/yUAAAAFAAkAAAD4/yYAAAAHAAoAAAD4/ycAAAAIAAkAAAD4/ygAAAAAAAMAAAD4/ykAAAABAAcAAAD4/yoAAAABAAQAAAD4/ysAAAABAAQAAAD4/ywAAAABAAQAAAD4/y0AAAABAAUAAAD4/y4AAAAIAAoAAAD4/y8AAAAIAAoAAAD4/zAAAAAHAAkAAAD4/zEAAAAFAAoAAAD4/zIAAAAFAAoAAAD4/zMAAAAAAAAAAAD5//D/AAABAAsAAAD5//H/AAAIAAkAAAD5//L/AAAFAAoAAAD5//P/AAAIAAkAAAD5//T/AAAFAAoAAAD5//X/AAAFAAkAAAD5//b/AAAFAAoAAAD5/wIAAAABAAQAAAD5/wMAAAAAAAYAAAD5/wQAAAACAAQAAAD5/wUAAAACAAUAAAD5/wYAAAAFAAkAAAD5/wcAAAAHAAkAAAD5/wgAAAAFAAkAAAD5/wkAAAAFAAkAAAD5/woAAAAIAAoAAAD5/wsAAAAFAAkAAAD5/wwAAAAFAAoAAAD5/w0AAAAHAAkAAAD5/w4AAAAHAAoAAAD5/w8AAAAAAAAAAAD5/xAAAAAIAAoAAAD5/xEAAAAIAAoAAAD5/xIAAAAHAAkAAAD5/xMAAAAHAAoAAAD5/xQAAAAFAAkAAAD5/xUAAAAHAAoAAAD5/xYAAAAIAAkAAAD5/xcAAAAIAAoAAAD5/xgAAAACAAMAAAD5/xkAAAAAAAcAAAD5/xoAAAABAAQAAAD5/xsAAAABAAQAAAD5/xwAAAABAAQAAAD5/x0AAAABAAYAAAD5/x4AAAAAAAUAAAD5/x8AAAAFAAkAAAD5/yAAAAAFAAkAAAD5/yEAAAAHAAkAAAD5/yIAAAAHAAoAAAD5/yMAAAAHAAkAAAD5/yQAAAAHAAkAAAD5/yUAAAAHAAoAAAD5/yYAAAAAAAAAAAD5/ycAAAAFAAkAAAD5/ygAAAABAAMAAAD5/ykAAAABAAQAAAD5/yoAAAABAAQAAAD5/ysAAAABAAQAAAD5/ywAAAAAAAYAAAD5/y0AAAACAAUAAAD5/y4AAAAHAAkAAAD5/y8AAAAHAAoAAAD5/zAAAAAFAAkAAAD5/zEAAAAAAAAAAAD5/zIAAAAFAAkAAAD5/zMAAAAHAAkAAAD6//D/AAABAAsAAAD6//H/AAAHAAoAAAD6//L/AAAIAAoAAAD6//P/AAAFAAkAAAD6//T/AAAHAAkAAAD6//X/AAAIAAoAAAD6//b/AAAIAAkAAAD6/wIAAAABAAQAAAD6/wMAAAABAAUAAAD6/wQAAAAIAAoAAAD6/wUAAAAIAAoAAAD6/wYAAAAFAAkAAAD6/wcAAAAIAAoAAAD6/wgAAAAHAAkAAAD6/wkAAAAFAAoAAAD6/woAAAAHAAoAAAD6/wsAAAAHAAkAAAD6/wwAAAAIAAoAAAD6/w0AAAAHAAoAAAD6/w4AAAAFAAoAAAD6/w8AAAAHAAkAAAD6/xAAAAAHAAoAAAD6/xEAAAAFAAkAAAD6/xIAAAAFAAkAAAD6/xMAAAAHAAkAAAD6/xQAAAAIAAkAAAD6/xUAAAAHAAkAAAD6/xYAAAAIAAoAAAD6/xcAAAAHAAkAAAD6/xgAAAAIAAkAAAD6/xkAAAACAAMAAAD6/xoAAAAAAAcAAAD6/xsAAAABAAQAAAD6/xwAAAABAAQAAAD6/x0AAAABAAQAAAD6/x4AAAABAAYAAAD6/x8AAAAAAAUAAAD6/yAAAAAIAAkAAAD6/yEAAAAFAAoAAAD6/yIAAAAIAAkAAAD6/yMAAAAHAAkAAAD6/yQAAAAFAAkAAAD6/yUAAAAFAAkAAAD6/yYAAAAAAAMAAAD6/ycAAAAAAAQAAAD6/ygAAAABAAcAAAD6/ykAAAABAAQAAAD6/yoAAAABAAQAAAD6/ysAAAAAAAYAAAD6/ywAAAACAAUAAAD6/y0AAAAFAAkAAAD6/y4AAAAIAAoAAAD6/y8AAAAHAAkAAAD6/zAAAAAIAAoAAAD6/zEAAAAIAAoAAAD6/zIAAAAIAAoAAAD6/zMAAAAHAAkAAAD7//D/AAABAAsAAAD7//H/AAAIAAkAAAD7//L/AAAFAAoAAAD7//P/AAAFAAkAAAD7//T/AAAFAAoAAAD7//X/AAAFAAkAAAD7//b/AAAIAAoAAAD7/wIAAAABAAQAAAD7/wMAAAABAAUAAAD7/wQAAAAHAAkAAAD7/wUAAAAFAAoAAAD7/wYAAAAIAAoAAAD7/wcAAAAAAAAAAAD7/wgAAAAHAAoAAAD7/wkAAAAIAAkAAAD7/woAAAAIAAkAAAD7/wsAAAAIAAoAAAD7/wwAAAAIAAkAAAD7/w0AAAAAAAAAAAD7/w4AAAAAAAAAAAD7/w8AAAAFAAkAAAD7/xAAAAAIAAkAAAD7/xEAAAAFAAoAAAD7/xIAAAAAAAAAAAD7/xMAAAAIAAoAAAD7/xQAAAAAAAAAAAD7/xUAAAAIAAoAAAD7/xYAAAAHAAoAAAD7/xcAAAAAAAAAAAD7/xgAAAAIAAkAAAD7/xkAAAAFAAkAAAD7/xoAAAACAAMAAAD7/xsAAAAAAAcAAAD7/xwAAAABAAQAAAD7/x0AAAABAAQAAAD7/x4AAAABAAQAAAD7/x8AAAABAAUAAAD7/yAAAAAFAAoAAAD7/yEAAAAFAAkAAAD7/yIAAAAIAAoAAAD7/yMAAAAFAAoAAAD7/yQAAAAHAAkAAAD7/yUAAAAAAAMAAAD7/yYAAAABAAcAAAD7/ycAAAABAAQAAAD7/ygAAAABAAQAAAD7/ykAAAABAAQAAAD7/yoAAAAAAAYAAAD7/ysAAAACAAUAAAD7/ywAAAAIAAkAAAD7/y0AAAAIAAkAAAD7/y4AAAAHAAoAAAD7/y8AAAAIAAoAAAD7/zAAAAAFAAoAAAD7/zEAAAAHAAkAAAD7/zIAAAAHAAkAAAD7/zMAAAAHAAoAAAD8//D/AAABAAsAAAD8//H/AAAHAAoAAAD8//L/AAAHAAoAAAD8//P/AAAFAAkAAAD8//T/AAAFAAkAAAD8//X/AAAIAAkAAAD8//b/AAAAAAAAAAD8/wIAAAAAAAYAAAD8/wMAAAACAAUAAAD8/wQAAAANABwAAAD8/wUAAAAFAAkAAAD8/wYAAAAFAAkAAAD8/wcAAAAIAAoAAAD8/wgAAAAHAAoAAAD8/wkAAAAHAAoAAAD8/woAAAAAAAAAAAD8/wsAAAAHAAkAAAD8/wwAAAAAAAAAAAD8/w0AAAAIAAkAAAD8/w4AAAAHAAkAAAD8/w8AAAAAAAAAAAD8/xAAAAAFAAkAAAD8/xEAAAAFAAkAAAD8/xIAAAAFAAoAAAD8/xMAAAAHAAoAAAD8/xQAAAAFAAkAAAD8/xUAAAAFAAkAAAD8/xYAAAAIAAkAAAD8/xcAAAAIAAkAAAD8/xgAAAAIAAoAAAD8/xkAAAAHAAoAAAD8/xoAAAAIAAkAAAD8/xsAAAABAAMAAAD8/xwAAAABAAQAAAD8/x0AAAABAAQAAAD8/x4AAAABAAQAAAD8/x8AAAABAAYAAAD8/yAAAAAAAAUAAAD8/yEAAAAFAAoAAAD8/yIAAAAFAAoAAAD8/yMAAAAFAAkAAAD8/yQAAAAAAAMAAAD8/yUAAAABAAcAAAD8/yYAAAABAAQAAAD8/ycAAAABAAQAAAD8/ygAAAABAAQAAAD8/ykAAAAAAAYAAAD8/yoAAAACAAUAAAD8/ysAAAAHAAkAAAD8/ywAAAAAAAAAAAD8/y0AAAAFAAoAAAD8/y4AAAAAAAAAAAD8/y8AAAAIAAkAAAD8/zAAAAAHAAoAAAD8/zEAAAAIAAkAAAD8/zIAAAAHAAkAAAD8/zMAAAAFAAoAAAD9//D/AAABAAsAAAD9//H/AAAIAAoAAAD9//L/AAAIAAkAAAD9//P/AAAAAAAAAAD9//T/AAAAAAAAAAD9//X/AAAIAAkAAAD9//b/AAAAAAAAAAD9/wIAAAABAAUAAAD9/wMAAAAAAAAAAAD9/wQAAAAHAAoAAAD9/wUAAAAHAAkAAAD9/wYAAAALABwAAAD9/wcAAAAIAAkAAAD9/wgAAAAIAAoAAAD9/wkAAAAIAAoAAAD9/woAAAAIAAoAAAD9/wsAAAAHAAoAAAD9/wwAAAAFAAkAAAD9/w0AAAAFAAoAAAD9/w4AAAAAAAAAAAD9/w8AAAAIAAkAAAD9/xAAAAAIAAoAAAD9/xEAAAAFAAkAAAD9/xIAAAAAAAAAAAD9/xMAAAAFAAkAAAD9/xQAAAAFAAkAAAD9/xUAAAAHAAkAAAD9/xYAAAAFAAoAAAD9/xcAAAAFAAoAAAD9/xgAAAAHAAkAAAD9/xkAAAAFAAoAAAD9/xoAAAAAAAAAAAD9/xsAAAACAAMAAAD9/xwAAAAAAAcAAAD9/x0AAAABAAQAAAD9/x4AAAABAAQAAAD9/x8AAAABAAQAAAD9/yAAAAABAAUAAAD9/yEAAAAHAAoAAAD9/yIAAAAFAAkAAAD9/yMAAAAIAAoAAAD9/yQAAAABAAMAAAD9/yUAAAABAAQAAAD9/yYAAAABAAQAAAD9/ycAAAABAAQAAAD9/ygAAAABAAQAAAD9/ykAAAABAAUAAAD9/yoAAAAIAAoAAAD9/ysAAAAHAAoAAAD9/ywAAAAHAAoAAAD9/y0AAAAHAAkAAAD9/y4AAAAHAAkAAAD9/y8AAAAAAAAAAAD9/zAAAAAIAAoAAAD9/zEAAAAIAAkAAAD9/zIAAAAAAAAAAAD9/zMAAAAFAAkAAAD+//D/AAABAAsAAAD+//H/AAAHAAoAAAD+//L/AAAHAAoAAAD+//P/AAAIAAkAAAD+//T/AAAFAAkAAAD+//X/AAAIAAkAAAD+//b/AAAIAAoAAAD+/wIAAAABAAUAAAD+/wMAAAANABwAAAD+/wQAAAAFAAkAAAD+/wUAAAAIAAkAAAD+/wYAAAAMABwAAAD+/wgAAAAHAAkAAAD+/wkAAAAIAAoAAAD+/woAAAAHAAoAAAD+/wsAAAAHAAkAAAD+/wwAAAAHAAoAAAD+/w0AAAAFAAoAAAD+/w4AAAAIAAoAAAD+/w8AAAAIAAkAAAD+/xAAAAAIAAkAAAD+/xEAAAAHAAkAAAD+/xIAAAAFAAoAAAD+/xMAAAAAAAAAAAD+/xQAAAAFAAoAAAD+/xUAAAAIAAkAAAD+/xYAAAAHAAkAAAD+/xcAAAAHAAkAAAD+/xgAAAAIAAkAAAD+/xkAAAAAAAAAAAD+/xoAAAAHAAkAAAD+/xsAAAAAAAAAAAD+/xwAAAABAAMAAAD+/x0AAAABAAQAAAD+/x4AAAABAAQAAAD+/x8AAAABAAQAAAD+/yAAAAABAAUAAAD+/yEAAAAAAAAAAAD+/yIAAAAFAAkAAAD+/yMAAAAAAAMAAAD+/yQAAAABAAcAAAD+/yUAAAABAAQAAAD+/yYAAAABAAQAAAD+/ycAAAAAAAYAAAD+/ygAAAACAAQAAAD+/ykAAAACAAUAAAD+/yoAAAAHAAoAAAD+/ysAAAAIAAoAAAD+/ywAAAAIAAkAAAD+/y0AAAAHAAkAAAD+/y4AAAAFAAoAAAD+/y8AAAAIAAoAAAD+/zAAAAAHAAkAAAD+/zEAAAAHAAkAAAD+/zIAAAAHAAkAAAD+/zMAAAAFAAoAAAD///D/AAABAAsAAAD///H/AAAFAAkAAAD///L/AAAFAAoAAAD///P/AAAIAAoAAAD///T/AAAAAAAAAAD///X/AAAIAAkAAAD///b/AAAHAAkAAAD//wIAAAABAAUAAAD//wMAAAAIAAoAAAD//wQAAAAIAAkAAAD//wUAAAAFAAoAAAD//wYAAAAHAAoAAAD//wcAAAAIAAoAAAD//wgAAAAFAAkAAAD//wkAAAAHAAoAAAD//woAAAAAAAAAAAD//wsAAAAHAAkAAAD//wwAAAAFAAkAAAD//w0AAAAIAAkAAAD//w4AAAAHAAkAAAD//w8AAAAFAAkAAAD//xAAAAAHAAoAAAD//xEAAAAHAAoAAAD//xIAAAAIAAkAAAD//xMAAAAFAAkAAAD//xQAAAAIAAoAAAD//xUAAAAAAAAAAAD//xYAAAAFAAkAAAD//xcAAAAAAAAAAAD//xgAAAAIAAoAAAD//xkAAAAHAAkAAAD//xoAAAAFAAoAAAD//xsAAAAFAAkAAAD//xwAAAACAAMAAAD//x0AAAACAAQAAAD//x4AAAAAAAcAAAD//x8AAAABAAQAAAD//yAAAAABAAYAAAD//yEAAAAAAAQAAAD//yIAAAAAAAQAAAD//yMAAAABAAcAAAD//yQAAAABAAQAAAD//yUAAAABAAQAAAD//yYAAAAAAAYAAAD//ycAAAACAAUAAAD//ygAAAAFAAkAAAD//ykAAAAAAAAAAAD//yoAAAAHAAoAAAD//ysAAAAAAAAAAAD//ywAAAAHAAkAAAD//y0AAAAFAAoAAAD//y4AAAAFAAoAAAD//y8AAAAIAAoAAAD//zAAAAAIAAkAAAD//zEAAAAIAAkAAAD//zIAAAAIAAkAAAD//zMAAAAHAAoAAAAAAPD/AAABAAsAAAAAAPH/AAAIAAoAAAAAAPL/AAAIAAkAAAAAAPP/AAAHAAoAAAAAAPT/AAAIAAoAAAAAAPX/AAAAAAAAAAAAAPb/AAAIAAoAAAAAAAIAAAABAAUAAAAAAAMAAAAHAAoAAAAAAAQAAAALABwAAAAAAAUAAAAIAAkAAAAAAAYAAAANABwAAAAAAAcAAAAAAAAAAAAAAAgAAAAHAAkAAAAAAAkAAAAAAAAAAAAAAAoAAAAFAAkAAAAAAAsAAAAHAAkAAAAAAAwAAAAIAAoAAAAAAA0AAAAIAAkAAAAAAA4AAAAIAAkAAAAAAA8AAAAFAAoAAAAAABAAAAAHAAkAAAAAABEAAAAIAAkAAAAAABIAAAAHAAoAAAAAABMAAAAFAAoAAAAAABQAAAAAAAAAAAAAABUAAAAHAAkAAAAAABYAAAAAAAAAAAAAABcAAAAFAAkAAAAAABgAAAAIAAkAAAAAABkAAAAIAAoAAAAAABoAAAAIAAkAAAAAABsAAAAFAAoAAAAAABwAAAAIAAoAAAAAAB0AAAAFAAkAAAAAAB4AAAABAAMAAAAAAB8AAAABAAQAAAAAACAAAAABAAQAAAAAACEAAAABAAQAAAAAACIAAAABAAQAAAAAACMAAAABAAQAAAAAACQAAAABAAQAAAAAACUAAAABAAQAAAAAACYAAAABAAUAAAAAACcAAAAFAAoAAAAAACgAAAAFAAoAAAAAACkAAAAIAAoAAAAAACoAAAAFAAkAAAAAACsAAAAIAAkAAAAAACwAAAAFAAkAAAAAAC0AAAAAAAAAAAAAAC4AAAAAAAAAAAAAAC8AAAAIAAkAAAAAADAAAAAHAAkAAAAAADEAAAAIAAoAAAAAADIAAAAAAAAAAAAAADMAAAAFAAkAAAABAPD/AAABAAsAAAABAPH/AAAFAAkAAAABAPL/AAAHAAoAAAABAPP/AAAAAAAAAAABAPT/AAAAAAAAAAABAPX/AAAHAAkAAAABAPb/AAAFAAkAAAABAAIAAAABAAUAAAABAAMAAAAAAAAAAAABAAQAAAAMABwAAAABAAUAAAAAAAAAAAABAAYAAAAFAAoAAAABAAcAAAAHAAoAAAABAAgAAAAAAAAAAAABAAkAAAAHAAoAAAABAAoAAAAIAAoAAAABAAsAAAAIAAkAAAABAAwAAAAIAAkAAAABAA0AAAAIAAoAAAABAA4AAAAHAAkAAAABAA8AAAAIAAoAAAABABAAAAAIAAkAAAABABEAAAAAAAAAAAABABIAAAAFAAkAAAABABMAAAAAAAAAAAABABQAAAAHAAoAAAABABUAAAAFAAkAAAABABYAAAAFAAkAAAABABcAAAAHAAkAAAABABgAAAAAAAAAAAABABkAAAAFAAoAAAABABoAAAAFAAkAAAABABsAAAAIAAoAAAABABwAAAAHAAkAAAABAB0AAAAIAAoAAAABAB4AAAABAAMAAAABAB8AAAABAAQAAAABACAAAAABAAQAAAABACEAAAABAAQAAAABACIAAAABAAQAAAABACMAAAABAAQAAAABACQAAAAAAAYAAAABACUAAAACAAQAAAABACYAAAACAAUAAAABACcAAAAFAAkAAAABACgAAAAIAAkAAAABACkAAAAIAAoAAAABACoAAAAFAAoAAAABACsAAAAFAAkAAAABACwAAAAFAAoAAAABAC0AAAAHAAoAAAABAC4AAAAFAAoAAAABAC8AAAAFAAoAAAABADAAAAAIAAoAAAABADEAAAAIAAkAAAABADIAAAAAAAAAAAABADMAAAAFAAoAAAACAPD/AAABAAsAAAACAPH/AAAAAAAAAAACAPL/AAAFAAkAAAACAPP/AAAIAAoAAAACAPT/AAAFAAoAAAACAPX/AAAFAAoAAAACAPb/AAAFAAkAAAACAAIAAAABAAUAAAACAAMAAAAIAAoAAAACAAQAAAAFAAoAAAACAAUAAAAIAAkAAAACAAYAAAAFAAkAAAACAAcAAAAIAAoAAAACAAgAAAAAAAAAAAACAAkAAAAIAAkAAAACAAoAAAAFAAkAAAACAAsAAAAIAAkAAAACAAwAAAAAAAAAAAACAA0AAAAFAAkAAAACAA4AAAAFAAkAAAACAA8AAAAFAAkAAAACABAAAAAFAAkAAAACABEAAAAIAAoAAAACABIAAAAAAAAAAAACABMAAAAHAAoAAAACABQAAAAAAAAAAAACABUAAAAFAAoAAAACABYAAAAIAAoAAAACABcAAAAHAAoAAAACABgAAAAFAAoAAAACABkAAAAHAAoAAAACABoAAAAFAAkAAAACABsAAAAIAAkAAAACABwAAAAIAAkAAAACAB0AAAAHAAkAAAACAB4AAAACAAMAAAACAB8AAAAAAAcAAAACACAAAAABAAQAAAACACEAAAABAAQAAAACACIAAAABAAQAAAACACMAAAAAAAYAAAACACQAAAACAAUAAAACACUAAAAFAAkAAAACACYAAAAHAAkAAAACACcAAAAAAAAAAAACACgAAAAFAAoAAAACACkAAAAIAAkAAAACACoAAAAFAAoAAAACACsAAAAAAAAAAAACACwAAAAAAAAAAAACAC0AAAAFAAkAAAACAC4AAAAHAAkAAAACAC8AAAAIAAoAAAACADAAAAAFAAoAAAACADEAAAAAAAAAAAACADIAAAAHAAkAAAACADMAAAAFAAkAAAADAPD/AAABAAsAAAADAPH/AAAFAAkAAAADAPL/AAAHAAoAAAADAPP/AAAFAAoAAAADAPT/AAAAAAAAAAADAPX/AAAIAAkAAAADAPb/AAAIAAkAAAADAAIAAAABAAUAAAADAAMAAAAFAAkAAAADAAQAAAANABwAAAADAAUAAAAFAAkAAAADAAYAAAAIAAkAAAADAAcAAAANABwAAAADAAgAAAAFAAoAAAADAAkAAAAFAAoAAAADAAoAAAAIAAoAAAADAAsAAAAHAAkAAAADAAwAAAAHAAoAAAADAA0AAAAFAAoAAAADAA4AAAAFAAoAAAADAA8AAAAFAAoAAAADABAAAAAIAAoAAAADABEAAAAHAAkAAAADABIAAAAAAAAAAAADABMAAAAHAAkAAAADABQAAAAIAAoAAAADABUAAAAIAAoAAAADABYAAAAFAAoAAAADABcAAAAFAAoAAAADABgAAAAHAAkAAAADABkAAAAIAAoAAAADABoAAAAFAAkAAAADABsAAAAFAAoAAAADABwAAAAHAAoAAAADAB0AAAAAAAAAAAADAB4AAAAAAAAAAAADAB8AAAABAAMAAAADACAAAAABAAQAAAADACEAAAABAAQAAAADACIAAAAAAAYAAAADACMAAAACAAUAAAADACQAAAAAAAAAAAADACUAAAAHAAoAAAADACYAAAAAAAAAAAADACcAAAAHAAoAAAADACgAAAAIAAkAAAADACkAAAAHAAkAAAADACoAAAAIAAkAAAADACsAAAAHAAoAAAADACwAAAAIAAkAAAADAC0AAAAHAAkAAAADAC4AAAAHAAoAAAADAC8AAAAHAAoAAAADADAAAAAIAAkAAAADADEAAAAIAAoAAAADADIAAAAHAAkAAAADADMAAAAFAAkAAAAEAPD/AAABAAsAAAAEAPH/AAAAAAAAAAAEAPL/AAAHAAkAAAAEAPP/AAAFAAoAAAAEAPT/AAAFAAoAAAAEAPX/AAAIAAkAAAAEAPb/AAAFAAoAAAAEAAIAAAABAAUAAAAEAAMAAAAHAAoAAAAEAAQAAAAIAAkAAAAEAAUAAAAAAAAAAAAEAAYAAAAFAAoAAAAEAAcAAAAHAAkAAAAEAAgAAAAFAAoAAAAEAAkAAAAIAAkAAAAEAAoAAAAAAAAAAAAEAAsAAAAAAAAAAAAEAAwAAAAAAAAAAAAEAA0AAAAAAAAAAAAEAA4AAAAFAAkAAAAEAA8AAAAIAAkAAAAEABAAAAAFAAoAAAAEABEAAAAIAAkAAAAEABIAAAAIAAoAAAAEABMAAAAIAAoAAAAEABQAAAAFAAoAAAAEABUAAAAFAAkAAAAEABYAAAAHAAoAAAAEABcAAAAHAAoAAAAEABgAAAAFAAoAAAAEABkAAAAAAAAAAAAEABoAAAAHAAkAAAAEABsAAAAIAAoAAAAEABwAAAAFAAoAAAAEAB0AAAAFAAoAAAAEAB4AAAAFAAkAAAAEAB8AAAABAAMAAAAEACAAAAABAAQAAAAEACEAAAABAAQAAAAEACIAAAABAAUAAAAEACMAAAAHAAoAAAAEACQAAAAFAAkAAAAEACUAAAAAAAAAAAAEACYAAAAFAAoAAAAEACcAAAAIAAoAAAAEACgAAAAHAAkAAAAEACkAAAAHAAoAAAAEACoAAAAIAAkAAAAEACsAAAAFAAoAAAAEACwAAAAFAAkAAAAEAC0AAAAHAAkAAAAEAC4AAAAHAAkAAAAEAC8AAAAIAAkAAAAEADAAAAAFAAoAAAAEADEAAAAFAAoAAAAEADIAAAAFAAkAAAAEADMAAAAHAAkAAAAFAPD/AAABAAsAAAAFAPH/AAAHAAkAAAAFAPL/AAAHAAoAAAAFAPP/AAAFAAkAAAAFAPT/AAAIAAoAAAAFAPX/AAAHAAkAAAAFAPb/AAAFAAkAAAAFAAIAAAABAAUAAAAFAAMAAAAHAAoAAAAFAAQAAAAIAAoAAAAFAAUAAAAIAAoAAAAFAAYAAAAHAAoAAAAFAAcAAAAFAAoAAAAFAAgAAAAHAAkAAAAFAAkAAAAFAAkAAAAFAAoAAAAAAAAAAAAFAAsAAAAHAAkAAAAFAAwAAAAHAAoAAAAFAA0AAAAHAAkAAAAFAA4AAAAFAAoAAAAFAA8AAAAHAAkAAAAFABAAAAAHAAoAAAAFABEAAAAAAAAAAAAFABIAAAAAAAAAAAAFABMAAAAHAAkAAAAFABQAAAAHAAkAAAAFABUAAAAIAAkAAAAFABYAAAAHAAkAAAAFABcAAAAHAAkAAAAFABgAAAAIAAoAAAAFABkAAAAIAAkAAAAFABoAAAAHAAkAAAAFABsAAAAFAAoAAAAFABwAAAAFAAoAAAAFAB0AAAAIAAoAAAAFAB4AAAAHAAoAAAAFAB8AAAABAAMAAAAFACAAAAABAAQAAAAFACEAAAABAAQAAAAFACIAAAABAAUAAAAFACMAAAAIAAoAAAAFACQAAAAIAAkAAAAFACUAAAAHAAoAAAAFACYAAAAFAAoAAAAFACcAAAAFAAoAAAAFACgAAAAIAAoAAAAFACkAAAAFAAoAAAAFACoAAAAAAAAAAAAFACsAAAAFAAoAAAAFACwAAAAFAAkAAAAFAC0AAAAIAAkAAAAFAC4AAAAAAAAAAAAFAC8AAAAIAAoAAAAFADAAAAAAAAAAAAAFADEAAAAFAAkAAAAFADIAAAAAAAAAAAAFADMAAAAIAAoAAAAGAPD/AAABAAsAAAAGAPH/AAAIAAoAAAAGAPL/AAAHAAkAAAAGAPP/AAAFAAoAAAAGAPT/AAAFAAkAAAAGAPX/AAAHAAoAAAAGAPb/AAAFAAkAAAAGAAIAAAABAAYAAAAGAAQAAAAAAAUAAAAGAAUAAAAAAAAAAAAGAAYAAAAHAAoAAAAGAAcAAAAIAAoAAAAGAAgAAAAHAAkAAAAGAAkAAAAFAAoAAAAGAAoAAAAIAAkAAAAGAAsAAAAAAAAAAAAGAAwAAAAHAAoAAAAGAA0AAAAHAAkAAAAGAA4AAAAHAAoAAAAGAA8AAAAHAAkAAAAGABAAAAAHAAkAAAAGABEAAAAFAAkAAAAGABIAAAAHAAoAAAAGABMAAAAIAAoAAAAGABQAAAAFAAoAAAAGABUAAAAAAAAAAAAGABYAAAAFAAkAAAAGABcAAAAFAAoAAAAGABgAAAAIAAkAAAAGABkAAAAFAAoAAAAGABoAAAAHAAoAAAAGABsAAAAIAAoAAAAGABwAAAAFAAoAAAAGAB0AAAAHAAkAAAAGAB4AAAAIAAoAAAAGAB8AAAABAAMAAAAGACAAAAABAAQAAAAGACEAAAABAAQAAAAGACIAAAABAAUAAAAGACMAAAAIAAkAAAAGACQAAAAHAAkAAAAGACUAAAAFAAoAAAAGACYAAAAIAAoAAAAGACcAAAAFAAoAAAAGACgAAAAIAAkAAAAGACkAAAAFAAkAAAAGACoAAAAAAAAAAAAGACsAAAAIAAkAAAAGACwAAAAIAAoAAAAGAC0AAAAFAAkAAAAGAC4AAAAHAAoAAAAGAC8AAAAFAAoAAAAGADAAAAAHAAoAAAAGADEAAAAHAAkAAAAGADIAAAAAAAAAAAAGADMAAAAAAAAAAAAHAPD/AAABAAsAAAAHAPH/AAAHAAkAAAAHAPL/AAAHAAkAAAAHAPP/AAAAAAAAAAAHAPT/AAAHAAkAAAAHAPX/AAAHAAkAAAAHAPb/AAAHAAkAAAAHAAIAAAABAAQAAAAHAAMAAAABAAQAAAAHAAQAAAAGAAAAAAAHAAUAAAALAAIAAAAHAAYAAAAHAAoAAAAHAAcAAAAIAAoAAAAHAAgAAAAHAAkAAAAHAAkAAAAFAAoAAAAHAAoAAAAFAAoAAAAHAAsAAAAAAAAAAAAHAAwAAAAHAAoAAAAHAA0AAAAAAAAAAAAHAA4AAAAAAAAAAAAHAA8AAAAIAAkAAAAHABAAAAAIAAkAAAAHABEAAAAHAAkAAAAHABIAAAAHAAoAAAAHABMAAAAIAAkAAAAHABQAAAAIAAkAAAAHABUAAAAFAAoAAAAHABYAAAAIAAoAAAAHABcAAAAFAAkAAAAHABgAAAAAAAMAAAAHABkAAAAAAAQAAAAHABoAAAAAAAQAAAAHABsAAAAAAAQAAAAHABwAAAAAAAQAAAAHAB0AAAAAAAUAAAAHAB4AAAAHAAoAAAAHAB8AAAABAAMAAAAHACAAAAABAAQAAAAHACEAAAABAAQAAAAHACIAAAABAAUAAAAHACMAAAAIAAkAAAAHACQAAAAIAAkAAAAHACUAAAAHAAkAAAAHACYAAAAFAAoAAAAHACcAAAAIAAoAAAAHACgAAAAIAAoAAAAHACkAAAAAAAAAAAAHACoAAAAIAAkAAAAHACsAAAAHAAkAAAAHACwAAAAFAAoAAAAHAC0AAAAFAAkAAAAHAC4AAAAHAAkAAAAHAC8AAAAIAAkAAAAHADAAAAAAAAAAAAAHADEAAAAAAAAAAAAHADIAAAAHAAkAAAAHADMAAAAFAAkAAAAIAPD/AAABAAsAAAAIAPH/AAAIAAkAAAAIAPL/AAAFAAkAAAAIAPP/AAAIAAoAAAAIAPT/AAAIAAoAAAAIAPX/AAAAAAAAAAAIAPb/AAAFAAoAAAAIAAIAAAAAAAYAAAAIAAMAAAACAAQAAAAIAAQAAAABAAkAAAAIAAUAAAABAAoAAAAIAAYAAAAIAAoAAAAIAAcAAAAIAAoAAAAIAAgAAAAIAAkAAAAIAAkAAAAHAAoAAAAIAAoAAAAFAAkAAAAIAAsAAAAAAAAAAAAIAAwAAAAAAAAAAAAIAA0AAAAAAAAAAAAIAA4AAAAAAAAAAAAIAA8AAAAIAAkAAAAIABAAAAAHAAoAAAAIABEAAAAFAAkAAAAIABIAAAAFAAkAAAAIABMAAAAFAAoAAAAIABUAAAAHAAkAAAAIABYAAAAFAAoAAAAIABcAAAAAAAMAAAAIABgAAAABAAcAAAAIABkAAAABAAQAAAAIABoAAAABAAQAAAAIABsAAAABAAQAAAAIABwAAAABAAQAAAAIAB0AAAABAAYAAAAIAB4AAAAAAAQAAAAIAB8AAAABAAcAAAAIACAAAAABAAQAAAAIACEAAAABAAQAAAAIACIAAAABAAUAAAAIACMAAAAIAAoAAAAIACQAAAAAAAAAAAAIACUAAAAIAAoAAAAIACYAAAAHAAkAAAAIACcAAAAAAAAAAAAIACgAAAAFAAkAAAAIACkAAAAFAAoAAAAIACoAAAAIAAoAAAAIACsAAAAHAAoAAAAIACwAAAAIAAoAAAAIAC0AAAAHAAkAAAAIAC4AAAAIAAkAAAAIAC8AAAAAAAAAAAAIADAAAAAAAAAAAAAIADEAAAAAAAAAAAAIADIAAAAHAAoAAAAIADMAAAAHAAoAAAAJAPD/AAABAAsAAAAJAPH/AAAIAAoAAAAJAPL/AAAAAAAAAAAJAPP/AAAFAAoAAAAJAPT/AAAFAAkAAAAJAPX/AAAHAAoAAAAJAPb/AAAIAAkAAAAJAAIAAAABAAUAAAAJAAMAAAAFAAkAAAAJAAQAAAAHAAkAAAAJAAUAAAAAAAAAAAAJAAYAAAAIAAoAAAAJAAcAAAAFAAoAAAAJAAgAAAAIAAoAAAAJAAkAAAAIAAkAAAAJAAoAAAAIAAkAAAAJAAsAAAAHAAkAAAAJAAwAAAAFAAkAAAAJAA0AAAAFAAoAAAAJAA4AAAAIAAkAAAAJAA8AAAAFAAkAAAAJABAAAAAIAAoAAAAJABEAAAAIAAkAAAAJABIAAAAFAAoAAAAJABMAAAAHAAkAAAAJABQAAAAAAAAAAAAJABUAAAAIAAkAAAAJABYAAAAAAAMAAAAJABcAAAABAAcAAAAJABgAAAABAAQAAAAJABkAAAABAAQAAAAJABoAAAAAAAYAAAAJABsAAAAAAAcAAAAJABwAAAABAAQAAAAJAB0AAAABAAQAAAAJAB4AAAABAAQAAAAJAB8AAAABAAQAAAAJACAAAAABAAQAAAAJACEAAAABAAQAAAAJACIAAAABAAUAAAAJACMAAAAAAAAAAAAJACQAAAAFAAkAAAAJACUAAAAIAAoAAAAJACYAAAAIAAoAAAAJACcAAAAHAAkAAAAJACgAAAAHAAoAAAAJACkAAAAFAAoAAAAJACoAAAAIAAkAAAAJACsAAAAFAAkAAAAJACwAAAAFAAoAAAAJAC0AAAAFAAoAAAAJAC4AAAAFAAkAAAAJAC8AAAAHAAoAAAAJADAAAAAIAAoAAAAJADEAAAAHAAoAAAAJADIAAAAIAAkAAAAJADMAAAAFAAkAAAAKAPD/AAABAAsAAAAKAPH/AAAIAAkAAAAKAPL/AAAHAAoAAAAKAPP/AAAIAAoAAAAKAPT/AAAIAAkAAAAKAPX/AAAFAAoAAAAKAPb/AAAIAAkAAAAKAAIAAAABAAUAAAAKAAMAAAAIAAkAAAAKAAQAAAAFAAoAAAAKAAUAAAAHAAoAAAAKAAYAAAAIAAkAAAAKAAcAAAAFAAoAAAAKAAgAAAAIAAoAAAAKAAkAAAAIAAoAAAAKAAoAAAAIAAkAAAAKAAsAAAAIAAoAAAAKAAwAAAAIAAkAAAAKAA0AAAAIAAoAAAAKAA4AAAAHAAoAAAAKAA8AAAAFAAkAAAAKABAAAAAIAAkAAAAKABEAAAAFAAoAAAAKABIAAAAHAAoAAAAKABMAAAAIAAoAAAAKABQAAAAHAAkAAAAKABUAAAAAAAMAAAAKABYAAAABAAcAAAAKABcAAAABAAQAAAAKABgAAAABAAQAAAAKABkAAAAAAAYAAAAKABoAAAACAAUAAAAKABsAAAACAAMAAAAKABwAAAACAAQAAAAKAB0AAAACAAQAAAAKAB4AAAACAAQAAAAKAB8AAAAAAAcAAAAKACAAAAABAAQAAAAKACEAAAABAAQAAAAKACIAAAABAAUAAAAKACMAAAAHAAoAAAAKACQAAAAAAAAAAAAKACUAAAAAAAAAAAAKACYAAAAHAAoAAAAKACcAAAAHAAkAAAAKACgAAAAHAAkAAAAKACkAAAAIAAoAAAAKACoAAAAFAAoAAAAKACsAAAAHAAkAAAAKACwAAAAAAAAAAAAKAC0AAAAHAAkAAAAKAC4AAAAIAAkAAAAKAC8AAAAHAAoAAAAKADAAAAAIAAkAAAAKADEAAAAHAAoAAAAKADIAAAAHAAoAAAAKADMAAAAIAAoAAAALAPD/AAABAAsAAAALAPH/AAAIAAkAAAALAPL/AAAHAAoAAAALAPP/AAAHAAkAAAALAPT/AAAIAAoAAAALAPX/AAAHAAkAAAALAPb/AAAAAAAAAAALAAIAAAABAAUAAAALAAMAAAAIAAoAAAALAAQAAAAAAAAAAAALAAUAAAAFAAkAAAALAAYAAAAHAAkAAAALAAcAAAAHAAoAAAALAAgAAAAFAAkAAAALAAkAAAAIAAoAAAALAAoAAAAIAAoAAAALAAsAAAAFAAoAAAALAAwAAAAIAAoAAAALAA0AAAAIAAkAAAALAA4AAAAFAAkAAAALAA8AAAAIAAkAAAALABAAAAAIAAkAAAALABEAAAAFAAkAAAALABIAAAAIAAkAAAALABMAAAAIAAoAAAALABQAAAAAAAMAAAALABUAAAABAAcAAAALABYAAAABAAQAAAALABcAAAAAAAYAAAALABgAAAACAAQAAAALABkAAAACAAUAAAALABoAAAAHAAoAAAALABsAAAAAAAAAAAALABwAAAAAAAAAAAALAB0AAAAFAAkAAAALAB4AAAAFAAkAAAALAB8AAAABAAMAAAALACAAAAABAAQAAAALACEAAAABAAQAAAALACIAAAABAAUAAAALACMAAAAFAAoAAAALACQAAAAHAAoAAAALACUAAAAHAAkAAAALACYAAAAHAAkAAAALACcAAAAAAAAAAAALACgAAAAFAAkAAAALACkAAAAIAAkAAAALACoAAAAFAAoAAAALACsAAAAAAAAAAAALACwAAAAHAAoAAAALAC0AAAAIAAkAAAALAC4AAAAAAAAAAAALAC8AAAAHAAkAAAALADAAAAAIAAoAAAALADEAAAAHAAoAAAALADIAAAAIAAoAAAALADMAAAAFAAoAAAAMAPD/AAABAAsAAAAMAPH/AAAFAAoAAAAMAPL/AAAIAAkAAAAMAPP/AAAAAAAAAAAMAPT/AAAIAAkAAAAMAPX/AAAHAAoAAAAMAPb/AAAAAAAAAAAMAAIAAAABAAUAAAAMAAMAAAAIAAoAAAAMAAQAAAAIAAkAAAAMAAUAAAAIAAkAAAAMAAcAAAAAAAAAAAAMAAgAAAAIAAoAAAAMAAkAAAAIAAkAAAAMAAoAAAAAAAAAAAAMAAsAAAAIAAoAAAAMAAwAAAAAAAAAAAAMAA0AAAAAAAAAAAAMAA4AAAAAAAAAAAAMAA8AAAAHAAoAAAAMABAAAAAAAAAAAAAMABEAAAAFAAkAAAAMABIAAAAFAAkAAAAMABMAAAAFAAkAAAAMABQAAAABAAMAAAAMABUAAAABAAQAAAAMABYAAAABAAQAAAAMABcAAAABAAUAAAAMABgAAAAHAAkAAAAMABkAAAAIAAoAAAAMABoAAAAFAAoAAAAMABsAAAAAAAAAAAAMABwAAAAHAAkAAAAMAB0AAAAIAAoAAAAMAB4AAAAIAAkAAAAMAB8AAAABAAMAAAAMACAAAAABAAQAAAAMACEAAAABAAQAAAAMACIAAAABAAUAAAAMACMAAAAIAAoAAAAMACQAAAAIAAkAAAAMACUAAAAAAAAAAAAMACYAAAAHAAoAAAAMACcAAAAFAAkAAAAMACgAAAAIAAoAAAAMACkAAAAFAAoAAAAMACoAAAAFAAkAAAAMACsAAAAIAAoAAAAMACwAAAAAAAAAAAAMAC0AAAAFAAoAAAAMAC4AAAAHAAoAAAAMAC8AAAAAAAAAAAAMADAAAAAHAAkAAAAMADEAAAAFAAkAAAAMADIAAAAIAAkAAAAMADMAAAAFAAkAAAANAPD/AAABAAsAAAANAPH/AAAFAAkAAAANAPL/AAAFAAoAAAANAPP/AAAAAAAAAAANAPT/AAAIAAoAAAANAPX/AAAIAAoAAAANAPb/AAAAAAAAAAANAAIAAAABAAUAAAANAAMAAAAFAAkAAAANAAQAAAAHAAkAAAANAAUAAAAIAAoAAAANAAYAAAAAAAAAAAANAAcAAAAHAAkAAAANAAgAAAAAAAAAAAANAAkAAAAIAAkAAAANAAoAAAAIAAoAAAANAAsAAAAHAAoAAAANAAwAAAAAAAAAAAANAA0AAAAFAAkAAAANAA4AAAAHAAoAAAANAA8AAAAHAAoAAAANABAAAAAAAAAAAAANABEAAAAAAAAAAAANABIAAAAAAAAAAAANABMAAAAAAAMAAAANABQAAAABAAcAAAANABUAAAABAAQAAAANABYAAAAAAAYAAAANABcAAAACAAUAAAANABgAAAAFAAoAAAANABkAAAAIAAkAAAANABoAAAAIAAkAAAANABsAAAAAAAAAAAANABwAAAAIAAkAAAANAB0AAAAAAAAAAAANAB4AAAAHAAoAAAANAB8AAAABAAMAAAANACAAAAABAAQAAAANACEAAAABAAQAAAANACIAAAABAAUAAAANACMAAAAFAAoAAAANACQAAAAIAAkAAAANACUAAAAIAAkAAAANACYAAAAFAAoAAAANACcAAAAIAAkAAAANACgAAAAHAAoAAAANACkAAAAIAAkAAAANACoAAAAHAAoAAAANACsAAAAHAAkAAAANACwAAAAAAAAAAAANAC0AAAAIAAkAAAANAC4AAAAHAAoAAAANAC8AAAAHAAoAAAANADAAAAAHAAoAAAANADEAAAAFAAoAAAANADIAAAAAAAAAAAANADMAAAAHAAoAAAAOAPD/AAABAAsAAAAOAPH/AAAHAAkAAAAOAPL/AAAIAAkAAAAOAPP/AAAHAAkAAAAOAPT/AAAFAAkAAAAOAPX/AAAAAAAAAAAOAPb/AAAFAAkAAAAOAAIAAAABAAUAAAAOAAMAAAAAAAAAAAAOAAQAAAAHAAoAAAAOAAUAAAAIAAoAAAAOAAcAAAAFAAoAAAAOAAgAAAAIAAoAAAAOAAkAAAAFAAkAAAAOAAoAAAAFAAoAAAAOAAsAAAAFAAkAAAAOAAwAAAAFAAoAAAAOAA0AAAAIAAoAAAAOAA4AAAAFAAkAAAAOAA8AAAAIAAoAAAAOABAAAAAIAAoAAAAOABEAAAAGAAAAAAAOABIAAAAAAAAAAAAOABMAAAABAAQAAAAOABQAAAABAAQAAAAOABUAAAABAAQAAAAOABYAAAABAAUAAAAOABcAAAAFAAkAAAAOABgAAAAHAAkAAAAOABkAAAAHAAoAAAAOABoAAAAFAAoAAAAOABsAAAAIAAkAAAAOABwAAAAHAAkAAAAOAB0AAAAAAAAAAAAOAB4AAAAAAAAAAAAOAB8AAAABAAMAAAAOACAAAAABAAQAAAAOACEAAAABAAQAAAAOACIAAAABAAUAAAAOACMAAAAHAAkAAAAOACQAAAAFAAkAAAAOACUAAAAIAAoAAAAOACYAAAAFAAoAAAAOACcAAAAHAAoAAAAOACgAAAAHAAkAAAAOACkAAAAIAAoAAAAOACoAAAAIAAkAAAAOACsAAAAFAAkAAAAOACwAAAAHAAoAAAAOAC0AAAAIAAkAAAAOAC4AAAAAAAAAAAAOAC8AAAAIAAkAAAAOADAAAAAIAAkAAAAOADEAAAAHAAoAAAAOADIAAAAAAAAAAAAOADMAAAAAAAAAAAAPAPD/AAABAAsAAAAPAPH/AAAFAAkAAAAPAPL/AAAFAAoAAAAPAPP/AAAHAAkAAAAPAPT/AAAFAAoAAAAPAPX/AAAHAAoAAAAPAPb/AAAAAAAAAAAPAAMAAAAIAAkAAAAPAAQAAAAIAAoAAAAPAAUAAAAHAAkAAAAPAAYAAAAFAAkAAAAPAAcAAAAFAAoAAAAPAAgAAAAFAAkAAAAPAAkAAAAFAAoAAAAPAAoAAAAFAAkAAAAPAAsAAAAIAAoAAAAPAAwAAAAIAAkAAAAPAA0AAAAAAAAAAAAPAA4AAAAIAAoAAAAPAA8AAAAIAAkAAAAPABAAAAAOAAAAAAAPABEAAAAFAAoAAAAPABIAAAACAAMAAAAPABMAAAACAAQAAAAPABQAAAAAAAcAAAAPABUAAAABAAQAAAAPABYAAAABAAUAAAAPABcAAAAHAAkAAAAPABgAAAAFAAkAAAAPABkAAAAFAAoAAAAPABoAAAAAAAAAAAAPABsAAAAFAAoAAAAPABwAAAAFAAoAAAAPAB0AAAAIAAkAAAAPAB4AAAAFAAoAAAAPAB8AAAABAAMAAAAPACAAAAABAAQAAAAPACEAAAABAAQAAAAPACIAAAABAAUAAAAPACMAAAAFAAkAAAAPACQAAAAFAAoAAAAPACUAAAAHAAkAAAAPACYAAAAIAAkAAAAPACcAAAAHAAkAAAAPACgAAAAHAAkAAAAPACkAAAAFAAoAAAAPACoAAAAFAAkAAAAPACsAAAAFAAoAAAAPACwAAAAHAAoAAAAPAC0AAAAHAAoAAAAPAC4AAAAHAAoAAAAPAC8AAAAIAAoAAAAPADAAAAAHAAkAAAAPADEAAAAIAAoAAAAPADIAAAAFAAoAAAAPADMAAAAFAAoAAAAQAPD/AAABAAsAAAAQAPH/AAAIAAoAAAAQAPL/AAAFAAkAAAAQAPP/AAAIAAkAAAAQAPT/AAAIAAkAAAAQAPX/AAAAAAAAAAAQAPb/AAAFAAoAAAAQAAMAAAAAAAAAAAAQAAQAAAAHAAkAAAAQAAUAAAAHAAoAAAAQAAYAAAAFAAkAAAAQAAcAAAAIAAoAAAAQAAgAAAAAAAAAAAAQAAkAAAAHAAoAAAAQAAoAAAAAAAAAAAAQAAsAAAAAAAAAAAAQAAwAAAAHAAoAAAAQAA0AAAAIAAoAAAAQAA4AAAAFAAoAAAAQAA8AAAAFAAkAAAAQABAAAAAHAAoAAAAQABEAAAAHAAoAAAAQABIAAAAHAAkAAAAQABMAAAAAAAAAAAAQABQAAAABAAMAAAAQABUAAAABAAQAAAAQABYAAAABAAYAAAAQABcAAAAAAAUAAAAQABgAAAAIAAoAAAAQABkAAAAAAAAAAAAQABoAAAAHAAkAAAAQABsAAAAFAAkAAAAQABwAAAAFAAoAAAAQAB0AAAAIAAkAAAAQAB4AAAAHAAoAAAAQAB8AAAABAAMAAAAQACAAAAABAAQAAAAQACEAAAABAAQAAAAQACIAAAABAAUAAAAQACMAAAAFAAkAAAAQACQAAAAAAAAAAAAQACUAAAAHAAoAAAAQACYAAAAIAAoAAAAQACcAAAAAAAAAAAAQACgAAAAFAAoAAAAQACkAAAAFAAoAAAAQACoAAAAAAAAAAAAQACsAAAAHAAkAAAAQACwAAAAFAAkAAAAQAC0AAAAFAAoAAAAQAC4AAAAIAAkAAAAQAC8AAAAHAAkAAAAQADAAAAAFAAkAAAAQADEAAAAFAAoAAAAQADIAAAAAAAAAAAAQADMAAAAHAAoAAAARAPD/AAABAAsAAAARAPH/AAAIAAoAAAARAPL/AAAFAAoAAAARAPP/AAAIAAkAAAARAPT/AAAAAAAAAAARAPX/AAAAAAAAAAARAPb/AAAIAAoAAAARAAMAAAAAAAAAAAARAAQAAAAAAAAAAAARAAUAAAAFAAoAAAARAAYAAAAAAAAAAAARAAcAAAAAAAAAAAARAAgAAAAHAAkAAAARAAkAAAAAAAAAAAARAAoAAAAHAAkAAAARAAsAAAACAAYAAAARAAwAAAACAAcAAAARAA0AAAACAAgAAAARAA4AAAAAAAAAAAARAA8AAAAAAAAAAAARABAAAAAIAAkAAAARABEAAAAIAAoAAAARABIAAAAAAAAAAAARABMAAAAFAAoAAAARABQAAAABAAMAAAARABUAAAABAAQAAAARABYAAAABAAQAAAARABcAAAABAAYAAAARABgAAAAAAAUAAAARABkAAAAHAAkAAAARABoAAAAAAAAAAAARABsAAAAIAAoAAAARABwAAAAIAAoAAAARAB0AAAAHAAoAAAARAB4AAAAFAAoAAAARAB8AAAABAAMAAAARACAAAAABAAQAAAARACEAAAABAAQAAAARACIAAAABAAUAAAARACMAAAAIAAoAAAARACQAAAAIAAkAAAARACUAAAAFAAoAAAARACYAAAAIAAkAAAARACcAAAAIAAoAAAARACgAAAAIAAoAAAARACkAAAAHAAoAAAARACoAAAAFAAkAAAARACsAAAAFAAoAAAARACwAAAAFAAoAAAARAC0AAAAIAAoAAAARAC4AAAAAAAAAAAARAC8AAAAAAAAAAAARADAAAAAAAAAAAAARADEAAAAFAAoAAAARADIAAAAHAAkAAAARADMAAAAIAAoAAAASAPD/AAABAAsAAAASAPH/AAAHAAoAAAASAPL/AAAHAAoAAAASAPP/AAAFAAoAAAASAPT/AAAFAAoAAAASAPX/AAAFAAkAAAASAPb/AAAIAAkAAAASAAIAAAABAAUAAAASAAMAAAAFAAoAAAASAAQAAAAHAAoAAAASAAUAAAAFAAoAAAASAAYAAAAHAAkAAAASAAcAAAAFAAoAAAASAAgAAAAHAAkAAAASAAkAAAAIAAoAAAASAAoAAAACAAYAAAASAAsAAAADAAoAAAASAAwAAAADAAcAAAASAA0AAAADAAkAAAASAA4AAAACAAcAAAASAA8AAAACAAgAAAASABAAAAAHAAkAAAASABEAAAAFAAkAAAASABIAAAAAAAAAAAASABMAAAAHAAoAAAASABQAAAACAAMAAAASABUAAAAAAAcAAAASABYAAAABAAQAAAASABcAAAABAAQAAAASABgAAAABAAYAAAASABkAAAAAAAUAAAASABoAAAAFAAoAAAASABsAAAAIAAoAAAASABwAAAAFAAoAAAASAB0AAAAFAAkAAAASAB4AAAAFAAkAAAASAB8AAAABAAMAAAASACAAAAABAAQAAAASACEAAAABAAQAAAASACIAAAABAAUAAAASACMAAAAIAAoAAAASACQAAAAFAAoAAAASACUAAAAHAAkAAAASACYAAAAAAAAAAAASACcAAAAIAAkAAAASACgAAAAHAAkAAAASACkAAAAIAAkAAAASACoAAAAHAAkAAAASACsAAAAAAAAAAAASACwAAAAIAAkAAAASAC0AAAAIAAkAAAASAC4AAAAFAAoAAAASAC8AAAAAAAAAAAASADAAAAAAAAAAAAASADEAAAAIAAoAAAASADIAAAAHAAoAAAASADMAAAAIAAkAAAATAPD/AAABAAsAAAATAPH/AAAAAAAAAAATAPL/AAAHAAoAAAATAPP/AAAHAAoAAAATAPT/AAAIAAkAAAATAPX/AAAIAAoAAAATAPb/AAAFAAkAAAATAAIAAAABAAYAAAATAAMAAAAAAAUAAAATAAQAAAAHAAoAAAATAAUAAAAFAAkAAAATAAYAAAAFAAoAAAATAAcAAAAFAAoAAAATAAgAAAAHAAoAAAATAAkAAAACAAYAAAATAAoAAAADAAoAAAATAAsAAAADAAcAAAATAAwAAAAAAAEAAAATAA0AAAADAAcAAAATAA4AAAAAAAEAAAATAA8AAAADAAkAAAATABAAAAACAAgAAAATABEAAAAIAAkAAAATABIAAAAIAAkAAAATABMAAAAAAAAAAAATABQAAAAIAAkAAAATABUAAAACAAMAAAATABYAAAAAAAcAAAATABcAAAABAAQAAAATABgAAAABAAQAAAATABkAAAABAAYAAAATABoAAAAAAAUAAAATABsAAAAFAAoAAAATABwAAAAHAAoAAAATAB0AAAAIAAoAAAATAB4AAAAIAAoAAAATAB8AAAABAAMAAAATACAAAAABAAQAAAATACEAAAABAAQAAAATACIAAAABAAUAAAATACMAAAAAAAAAAAATACQAAAAIAAoAAAATACUAAAAAAAAAAAATACYAAAAHAAoAAAATACcAAAAIAAkAAAATACgAAAAHAAoAAAATACkAAAAAAAAAAAATACoAAAAFAAkAAAATACsAAAAHAAkAAAATACwAAAAHAAoAAAATAC0AAAAIAAkAAAATAC4AAAAAAAAAAAATAC8AAAAAAAAAAAATADAAAAAHAAoAAAATADEAAAAAAAAAAAATADIAAAAAAAAAAAATADMAAAAHAAkAAAAUAPD/AAABAAsAAAAUAPH/AAAAAAAAAAAUAPL/AAAFAAoAAAAUAPP/AAAIAAkAAAAUAPT/AAAFAAoAAAAUAPX/AAAIAAkAAAAUAPb/AAACAAYAAAAUAPf/AAACAAcAAAAUAPj/AAACAAcAAAAUAPn/AAACAAcAAAAUAPr/AAACAAgAAAAUAPv/AAAIAAoAAAAUAPz/AAAHAAkAAAAUAP3/AAAFAAkAAAAUAP7/AAAIAAoAAAAUAP//AAAFAAoAAAAUAAAAAAACAAMAAAAUAAEAAAAAAAcAAAAUAAIAAAABAAQAAAAUAAMAAAABAAYAAAAUAAQAAAAAAAUAAAAUAAUAAAAFAAkAAAAUAAYAAAAHAAoAAAAUAAcAAAAAAAAAAAAUAAgAAAAFAAoAAAAUAAkAAAADAAYAAAAUAAoAAAADAAcAAAAUAAsAAAADAAcAAAAUAAwAAAADAAcAAAAUAA0AAAADAAcAAAAUAA4AAAADAAcAAAAUAA8AAAADAAcAAAAUABAAAAADAAkAAAAUABEAAAACAAgAAAAUABIAAAAFAAoAAAAUABMAAAAHAAkAAAAUABQAAAAAAAAAAAAUABUAAAAHAAoAAAAUABYAAAACAAMAAAAUABcAAAAAAAcAAAAUABgAAAABAAQAAAAUABkAAAABAAQAAAAUABoAAAABAAYAAAAUABsAAAAAAAUAAAAUABwAAAAAAAAAAAAUAB0AAAAFAAkAAAAUAB4AAAAFAAkAAAAUAB8AAAABAAMAAAAUACAAAAABAAQAAAAUACEAAAABAAQAAAAUACIAAAABAAUAAAAUACMAAAAHAAkAAAAUACQAAAAHAAoAAAAUACUAAAAHAAkAAAAUACYAAAAHAAkAAAAUACcAAAAFAAoAAAAUACgAAAAFAAoAAAAUACkAAAAAAAAAAAAUACoAAAAAAAAAAAAUACsAAAAFAAkAAAAUACwAAAAHAAoAAAAUAC0AAAAFAAoAAAAUAC4AAAAIAAkAAAAUAC8AAAAFAAoAAAAUADAAAAAHAAoAAAAUADEAAAAHAAoAAAAUADIAAAAHAAkAAAAUADMAAAAIAAoAAAAVAPD/AAABAAsAAAAVAPH/AAAHAAkAAAAVAPL/AAAIAAoAAAAVAPP/AAAIAAkAAAAVAPT/AAAFAAoAAAAVAPX/AAACAAYAAAAVAPb/AAADAAoAAAAVAPf/AAAAAAEAAAAVAPj/AAAAAAEAAAAVAPn/AAAAAAEAAAAVAPr/AAADAAkAAAAVAPv/AAACAAgAAAAVAPz/AAAHAAoAAAAVAP3/AAAIAAkAAAAVAP7/AAAFAAoAAAAVAP//AAAFAAkAAAAVAAAAAAAHAAoAAAAVAAEAAAACAAMAAAAVAAIAAAAAAAcAAAAVAAMAAAABAAQAAAAVAAQAAAABAAYAAAAVAAUAAAAAAAUAAAAVAAYAAAAFAAoAAAAVAAcAAAAHAAkAAAAVAAgAAAAFAAkAAAAVAAkAAAADAAYAAAAVAAoAAAADAAcAAAAVAAsAAAADAAcAAAAVAAwAAAACAAkAAAAVAA0AAAAEAAcAAAAVAA4AAAACAAoAAAAVAA8AAAADAAcAAAAVABAAAAADAAcAAAAVABEAAAADAAgAAAAVABIAAAAHAAkAAAAVABMAAAAHAAkAAAAVABQAAAAIAAkAAAAVABUAAAAFAAkAAAAVABYAAAAIAAkAAAAVABcAAAACAAMAAAAVABgAAAAAAAcAAAAVABkAAAABAAQAAAAVABoAAAABAAQAAAAVABsAAAABAAYAAAAVABwAAAAAAAUAAAAVAB0AAAAHAAkAAAAVAB4AAAAAAAAAAAAVAB8AAAABAAMAAAAVACAAAAABAAQAAAAVACEAAAABAAQAAAAVACIAAAABAAUAAAAVACMAAAAAAAAAAAAVACQAAAAFAAoAAAAVACUAAAAIAAoAAAAVACYAAAAFAAoAAAAVACcAAAAFAAkAAAAVACgAAAAIAAoAAAAVACkAAAAHAAoAAAAVACoAAAAIAAkAAAAVACsAAAAHAAoAAAAVACwAAAAAAAAAAAAVAC0AAAAIAAoAAAAVAC4AAAAAAAAAAAAVAC8AAAAIAAoAAAAVADAAAAAIAAoAAAAVADEAAAAHAAkAAAAVADIAAAAHAAkAAAAVADMAAAAFAAkAAAAWAPD/AAABAAsAAAAWAPH/AAAHAAoAAAAWAPL/AAAAAAAAAAAWAPP/AAAFAAkAAAAWAPT/AAACAAYAAAAWAPX/AAADAAoAAAAWAPb/AAAAAAEAAAAWAPf/AAADAAcAAAAWAPj/AAAAAAEAAAAWAPn/AAADAAcAAAAWAPr/AAAAAAEAAAAWAPv/AAADAAgAAAAWAPz/AAAIAAkAAAAWAP3/AAAFAAkAAAAWAP7/AAAHAAoAAAAWAP//AAAIAAkAAAAWAAAAAAAIAAkAAAAWAAEAAAAFAAkAAAAWAAIAAAABAAMAAAAWAAMAAAABAAQAAAAWAAQAAAABAAQAAAAWAAUAAAABAAYAAAAWAAYAAAAAAAQAAAAWAAcAAAAAAAUAAAAWAAgAAAAAAAMAAAAWAAkAAAABAAcAAAAWAAoAAAAPAAoAAAAWAAsAAAAAAAEAAAAWAA0AAAACAAcAAAAWAA4AAAADAAoAAAAWAA8AAAADAAcAAAAWABAAAAAAAAEAAAAWABEAAAADAAgAAAAWABIAAAAFAAoAAAAWABMAAAAFAAoAAAAWABQAAAAAAAAAAAAWABUAAAAHAAoAAAAWABYAAAAIAAoAAAAWABcAAAAFAAkAAAAWABgAAAACAAMAAAAWABkAAAAAAAcAAAAWABoAAAABAAQAAAAWABsAAAABAAQAAAAWABwAAAABAAYAAAAWAB0AAAAAAAUAAAAWAB4AAAAFAAkAAAAWAB8AAAABAAMAAAAWACAAAAABAAQAAAAWACEAAAABAAQAAAAWACIAAAABAAUAAAAWACMAAAAIAAoAAAAWACQAAAAHAAkAAAAWACUAAAAAAAAAAAAWACYAAAAFAAkAAAAWACcAAAAAAAAAAAAWACgAAAAHAAoAAAAWACkAAAAHAAkAAAAWACoAAAAFAAoAAAAWACsAAAAIAAkAAAAWACwAAAAFAAkAAAAWAC0AAAAIAAkAAAAWAC4AAAAHAAkAAAAWAC8AAAAAAAAAAAAWADAAAAAIAAkAAAAWADEAAAAIAAkAAAAWADIAAAAHAAkAAAAWADMAAAAFAAkAAAAXAPD/AAABAAsAAAAXAPH/AAAHAAkAAAAXAPL/AAACAAYAAAAXAPP/AAACAAcAAAAXAPT/AAADAAoAAAAXAPX/AAADAAcAAAAXAPb/AAADAAcAAAAXAPf/AAADAAcAAAAXAPj/AAAAAAEAAAAXAPn/AAADAAcAAAAXAPr/AAAAAAEAAAAXAPv/AAADAAkAAAAXAPz/AAACAAgAAAAXAP3/AAAFAAkAAAAXAP7/AAAAAAAAAAAXAP//AAAHAAoAAAAXAAAAAAAHAAkAAAAXAAEAAAAIAAkAAAAXAAIAAAACAAMAAAAXAAMAAAAAAAcAAAAXAAQAAAABAAQAAAAXAAUAAAABAAQAAAAXAAYAAAABAAQAAAAXAAcAAAABAAYAAAAXAAgAAAABAAcAAAAXAAkAAAABAAQAAAAXAAoAAAAQAAYAAAAXAAsAAAADAAcAAAAXAAwAAAADAAcAAAAXAA0AAAAAAAEAAAAXAA4AAAAAAAEAAAAXAA8AAAADAAcAAAAXABAAAAAAAAEAAAAXABEAAAADAAgAAAAXABIAAAAIAAkAAAAXABMAAAAIAAoAAAAXABQAAAAFAAoAAAAXABUAAAAIAAkAAAAXABYAAAAHAAoAAAAXABcAAAAFAAoAAAAXABgAAAAAAAAAAAAXABkAAAACAAMAAAAXABoAAAAAAAcAAAAXABsAAAABAAQAAAAXABwAAAABAAQAAAAXAB0AAAABAAYAAAAXAB4AAAAAAAUAAAAXAB8AAAABAAMAAAAXACAAAAABAAQAAAAXACEAAAABAAQAAAAXACIAAAABAAUAAAAXACMAAAAFAAkAAAAXACQAAAAFAAoAAAAXACUAAAAAAAAAAAAXACYAAAAIAAoAAAAXACcAAAAIAAoAAAAXACgAAAAAAAAAAAAXACkAAAAFAAkAAAAXACoAAAAHAAkAAAAXACsAAAAIAAoAAAAXACwAAAAIAAkAAAAXAC0AAAAHAAkAAAAXAC4AAAAHAAoAAAAXAC8AAAAHAAkAAAAXADAAAAAIAAkAAAAXADEAAAAHAAoAAAAXADIAAAAHAAoAAAAXADMAAAAHAAkAAAAYAPD/AAABAAsAAAAYAPH/AAAIAAkAAAAYAPL/AAADAAYAAAAYAPP/AAADAAcAAAAYAPT/AAADAAcAAAAYAPX/AAADAAcAAAAYAPb/AAADAAcAAAAYAPf/AAADAAcAAAAYAPn/AAADAAcAAAAYAPr/AAADAAcAAAAYAPv/AAADAAcAAAAYAPz/AAADAAgAAAAYAP3/AAAFAAkAAAAYAP7/AAAIAAkAAAAYAP//AAAFAAoAAAAYAAAAAAAIAAoAAAAYAAEAAAAIAAoAAAAYAAIAAAAFAAoAAAAYAAMAAAACAAMAAAAYAAQAAAACAAQAAAAYAAUAAAAAAAcAAAAYAAYAAAABAAQAAAAYAAcAAAABAAQAAAAYAAgAAAABAAQAAAAYAAkAAAABAAQAAAAYAAoAAAARAAYAAAAYAAsAAAAIAA0AAAAYAAwAAAAEAAcAAAAYAA0AAAAEAAcAAAAYAA4AAAACAAoAAAAYAA8AAAADAAcAAAAYABAAAAADAAcAAAAYABEAAAADAAkAAAAYABIAAAACAAgAAAAYABMAAAAFAAoAAAAYABQAAAAHAAoAAAAYABUAAAAFAAoAAAAYABYAAAAHAAoAAAAYABcAAAAFAAkAAAAYABgAAAAHAAkAAAAYABkAAAAHAAoAAAAYABoAAAACAAMAAAAYABsAAAAAAAcAAAAYABwAAAABAAQAAAAYAB0AAAABAAQAAAAYAB4AAAABAAUAAAAYAB8AAAABAAMAAAAYACAAAAABAAQAAAAYACEAAAABAAQAAAAYACIAAAABAAUAAAAYACMAAAAHAAkAAAAYACQAAAAIAAkAAAAYACUAAAAIAAoAAAAYACYAAAAIAAoAAAAYACcAAAAHAAoAAAAYACgAAAAIAAoAAAAYACkAAAAFAAoAAAAYACoAAAAFAAoAAAAYACsAAAAIAAkAAAAYACwAAAAHAAoAAAAYAC0AAAAHAAoAAAAYAC4AAAAIAAkAAAAYAC8AAAAAAAAAAAAYADAAAAAAAAAAAAAYADEAAAAFAAoAAAAYADIAAAAIAAoAAAAYADMAAAAFAAoAAAAZAPD/AAACAAYAAAAZAPH/AAACAAcAAAAZAPL/AAADAAoAAAAZAPP/AAADAAcAAAAZAPT/AAADAAcAAAAZAPX/AAAAAAEAAAAZAPb/AAADAAcAAAAZAPf/AAADAAcAAAAZAPj/AAADAAcAAAAZAPn/AAADAAcAAAAZAPr/AAADAAcAAAAZAPv/AAADAAcAAAAZAPz/AAADAAgAAAAZAP3/AAAIAAkAAAAZAP7/AAAAAAAAAAAZAP//AAAFAAoAAAAZAAAAAAAFAAkAAAAZAAEAAAAAAAAAAAAZAAIAAAAFAAkAAAAZAAMAAAAFAAkAAAAZAAQAAAAHAAoAAAAZAAUAAAACAAMAAAAZAAYAAAACAAQAAAAZAAcAAAACAAQAAAAZAAgAAAAAAAcAAAAZAAkAAAABAAQAAAAZAAoAAAABAAQAAAAZAAsAAAABAAUAAAAZAAwAAAAAAAAAAAAZAA0AAAAAAAAAAAAZAA4AAAADAAYAAAAZAA8AAAADAAcAAAAZABAAAAADAAcAAAAZABEAAAADAAcAAAAZABIAAAADAAgAAAAZABMAAAAHAAoAAAAZABQAAAAHAAoAAAAZABUAAAAIAAoAAAAZABYAAAAHAAoAAAAZABcAAAAIAAoAAAAZABgAAAAAAAAAAAAZABkAAAAIAAkAAAAZABoAAAAIAAoAAAAZABsAAAACAAMAAAAZABwAAAAAAAcAAAAZAB0AAAABAAQAAAAZAB4AAAABAAUAAAAZAB8AAAABAAMAAAAZACAAAAABAAQAAAAZACEAAAABAAQAAAAZACIAAAABAAUAAAAZACMAAAAHAAkAAAAZACQAAAAIAAkAAAAZACUAAAAAAAAAAAAZACYAAAAAAAAAAAAZACcAAAAHAAoAAAAZACgAAAAIAAkAAAAZACkAAAAAAAAAAAAZACoAAAAIAAkAAAAZACsAAAAIAAoAAAAZACwAAAAIAAkAAAAZAC0AAAAIAAoAAAAZAC4AAAAHAAoAAAAZAC8AAAAIAAoAAAAZADAAAAAAAAAAAAAZADEAAAAIAAkAAAAZADIAAAAIAAkAAAAZADMAAAAFAAoAAAAaAPD/AAADAAYAAAAaAPH/AAAAAAEAAAAaAPL/AAADAAcAAAAaAPP/AAADAAcAAAAaAPT/AAADAAcAAAAaAPX/AAAAAAEAAAAaAPb/AAADAAcAAAAaAPf/AAAAAAEAAAAaAPj/AAAAAAEAAAAaAPn/AAAAAAEAAAAaAPr/AAADAAcAAAAaAPv/AAAAAAEAAAAaAPz/AAADAAkAAAAaAP3/AAACAAcAAAAaAP7/AAACAAcAAAAaAP//AAACAAgAAAAaAAAAAAAIAAoAAAAaAAEAAAAHAAoAAAAaAAIAAAAIAAkAAAAaAAMAAAAHAAkAAAAaAAQAAAAIAAkAAAAaAAUAAAAHAAkAAAAaAAYAAAAAAAAAAAAaAAcAAAAFAAoAAAAaAAgAAAABAAMAAAAaAAkAAAABAAQAAAAaAAoAAAAAAAYAAAAaAAsAAAACAAUAAAAaAAwAAAAAAAAAAAAaAA0AAAAAAAAAAAAaAA4AAAAEAAYAAAAaAA8AAAACAAoAAAAaABAAAAAAAAEAAAAaABEAAAADAAcAAAAaABIAAAADAAgAAAAaABMAAAAHAAkAAAAaABQAAAAHAAkAAAAaABUAAAAFAAkAAAAaABYAAAAAAAAAAAAaABcAAAAIAAoAAAAaABgAAAAIAAoAAAAaABkAAAAHAAkAAAAaABoAAAAFAAoAAAAaABsAAAAAAAMAAAAaABwAAAABAAcAAAAaAB0AAAABAAQAAAAaAB4AAAABAAUAAAAaAB8AAAABAAMAAAAaACAAAAABAAQAAAAaACEAAAABAAQAAAAaACIAAAABAAUAAAAaACMAAAAIAAkAAAAaACQAAAAHAAoAAAAaACUAAAAHAAkAAAAaACYAAAAFAAoAAAAaACcAAAAIAAoAAAAaACgAAAAHAAoAAAAaACkAAAAFAAoAAAAaACoAAAAIAAoAAAAaACsAAAAFAAkAAAAaACwAAAAFAAoAAAAaAC0AAAAAAAAAAAAaAC4AAAAHAAkAAAAaAC8AAAAHAAoAAAAaADAAAAAFAAkAAAAaADEAAAAIAAoAAAAaADIAAAAFAAkAAAAaADMAAAAFAAkAAAAbAPD/AAADAAoAAAAbAPH/AAAAAAEAAAAbAPL/AAADAAcAAAAbAPP/AAADAAcAAAAbAPT/AAAAAAEAAAAbAPX/AAADAAcAAAAbAPb/AAADAAcAAAAbAPf/AAADAAcAAAAbAPj/AAADAAcAAAAbAPn/AAADAAcAAAAbAPr/AAADAAcAAAAbAPv/AAADAAcAAAAbAPz/AAAAAAEAAAAbAP3/AAADAAcAAAAbAP7/AAADAAcAAAAbAP//AAADAAkAAAAbAAAAAAACAAgAAAAbAAEAAAAFAAoAAAAbAAIAAAAIAAoAAAAbAAMAAAAHAAoAAAAbAAQAAAAAAAAAAAAbAAUAAAAFAAkAAAAbAAYAAAAAAAMAAAAbAAcAAAAAAAQAAAAbAAgAAAABAAcAAAAbAAkAAAABAAQAAAAbAAoAAAABAAUAAAAbAAsAAAAAAAAAAAAbAAwAAAAAAAAAAAAbAA0AAAAAAAAAAAAbAA4AAAACAAYAAAAbAA8AAAADAAoAAAAbABAAAAADAAcAAAAbABEAAAACAAkAAAAbABIAAAAEAAgAAAAbABMAAAAIAAkAAAAbABQAAAAIAAoAAAAbABUAAAAHAAkAAAAbABYAAAAIAAkAAAAbABcAAAAFAAkAAAAbABgAAAAIAAoAAAAbABkAAAAAAAAAAAAbABoAAAAAAAAAAAAbABsAAAABAAMAAAAbABwAAAABAAQAAAAbAB0AAAAAAAYAAAAbAB4AAAACAAUAAAAbAB8AAAABAAMAAAAbACAAAAABAAQAAAAbACEAAAABAAQAAAAbACIAAAABAAUAAAAbACMAAAAHAAoAAAAbACQAAAAFAAkAAAAbACUAAAAHAAkAAAAbACYAAAAHAAoAAAAbACcAAAAFAAkAAAAbACgAAAAHAAkAAAAbACkAAAAFAAoAAAAbACoAAAAAAAAAAAAbACsAAAAIAAoAAAAbACwAAAAIAAoAAAAbAC0AAAAHAAkAAAAbAC4AAAAIAAkAAAAbAC8AAAAAAAAAAAAbADAAAAAFAAoAAAAbADEAAAAFAAkAAAAbADIAAAAFAAoAAAAbADMAAAAIAAkAAAAcAPD/AAADAAcAAAAcAPH/AAADAAcAAAAcAPL/AAADAAcAAAAcAPP/AAADAAcAAAAcAPT/AAADAAcAAAAcAPX/AAAAAAEAAAAcAPb/AAADAAcAAAAcAPf/AAADAAcAAAAcAPj/AAADAAcAAAAcAPn/AAADAAcAAAAcAPr/AAADAAcAAAAcAPv/AAADAAcAAAAcAPz/AAADAAcAAAAcAP3/AAADAAcAAAAcAP7/AAADAAcAAAAcAP//AAAAAAEAAAAcAAAAAAADAAkAAAAcAAEAAAACAAgAAAAcAAIAAAAFAAoAAAAcAAMAAAAAAAAAAAAcAAQAAAAFAAkAAAAcAAUAAAAIAAkAAAAcAAYAAAABAAMAAAAcAAcAAAABAAQAAAAcAAgAAAABAAQAAAAcAAkAAAAAAAYAAAAcAAoAAAACAAUAAAAcAAsAAAAAAAAAAAAcAAwAAAAAAAAAAAAcAA0AAAACAAYAAAAcAA4AAAADAAoAAAAcAA8AAAADAAcAAAAcABAAAAADAAcAAAAcABEAAAADAAgAAAAcABIAAAAFAAoAAAAcABMAAAAIAAoAAAAcABQAAAAFAAoAAAAcABUAAAAFAAkAAAAcABYAAAAHAAoAAAAcABcAAAAHAAkAAAAcABgAAAAIAAkAAAAcABkAAAAIAAkAAAAcABoAAAAAAAMAAAAcABsAAAABAAcAAAAcABwAAAABAAQAAAAcAB0AAAABAAUAAAAcAB4AAAAFAAoAAAAcAB8AAAABAAMAAAAcACAAAAABAAQAAAAcACEAAAABAAQAAAAcACIAAAABAAUAAAAcACMAAAAFAAkAAAAcACQAAAAIAAkAAAAcACUAAAAIAAkAAAAcACYAAAAHAAkAAAAcACcAAAAIAAkAAAAcACgAAAAIAAkAAAAcACkAAAAHAAkAAAAcACoAAAAAAAAAAAAcACsAAAAHAAkAAAAcACwAAAAFAAkAAAAcAC0AAAAAAAAAAAAcAC4AAAAIAAoAAAAcAC8AAAAHAAkAAAAcADAAAAAHAAoAAAAcADEAAAAIAAoAAAAcADIAAAAHAAoAAAAcADMAAAAIAAoAAAAdAPD/AAADAAcAAAAdAPH/AAADAAcAAAAdAPL/AAAAAAEAAAAdAPP/AAAAAAEAAAAdAPT/AAADAAcAAAAdAPX/AAADAAcAAAAdAPb/AAADAAcAAAAdAPf/AAAAAAEAAAAdAPj/AAAAAAEAAAAdAPn/AAADAAcAAAAdAPr/AAADAAcAAAAdAPv/AAAAAAEAAAAdAPz/AAADAAcAAAAdAP3/AAADAAcAAAAdAP7/AAADAAcAAAAdAP//AAADAAcAAAAdAAAAAAADAAcAAAAdAAEAAAADAAgAAAAdAAIAAAAHAAoAAAAdAAMAAAAHAAkAAAAdAAQAAAAHAAoAAAAdAAUAAAAFAAoAAAAdAAYAAAABAAMAAAAdAAcAAAABAAQAAAAdAAgAAAAAAAYAAAAdAAkAAAACAAUAAAAdAAoAAAAAAAAAAAAdAAsAAAAAAAAAAAAdAAwAAAAAAAAAAAAdAA0AAAADAAYAAAAdAA4AAAADAAcAAAAdAA8AAAADAAcAAAAdABAAAAACAAkAAAAdABEAAAAEAAgAAAAdABIAAAAHAAkAAAAdABMAAAAHAAkAAAAdABQAAAAFAAoAAAAdABUAAAAHAAkAAAAdABYAAAAHAAoAAAAdABcAAAAIAAkAAAAdABgAAAAHAAkAAAAdABkAAAAAAAMAAAAdABoAAAABAAcAAAAdABsAAAABAAQAAAAdABwAAAABAAQAAAAdAB0AAAABAAUAAAAdAB4AAAAAAAAAAAAdAB8AAAABAAMAAAAdACAAAAABAAQAAAAdACEAAAABAAQAAAAdACIAAAABAAUAAAAdACMAAAAFAAkAAAAdACQAAAAIAAkAAAAdACUAAAAAAAAAAAAdACYAAAAHAAoAAAAdACcAAAAFAAkAAAAdACgAAAAIAAoAAAAdACkAAAAHAAoAAAAdACoAAAAFAAoAAAAdACsAAAAHAAoAAAAdACwAAAAIAAoAAAAdAC0AAAAAAAAAAAAdAC4AAAAIAAoAAAAdAC8AAAAHAAoAAAAdADAAAAAHAAkAAAAdADEAAAAIAAkAAAAdADIAAAAIAAoAAAAdADMAAAAFAAoAAAAeAPD/AAAAAAEAAAAeAPH/AAAAAAEAAAAeAPL/AAADAAcAAAAeAPP/AAADAAcAAAAeAPT/AAADAAcAAAAeAPX/AAAAAAEAAAAeAPb/AAADAAcAAAAeAPf/AAAAAAEAAAAeAPj/AAAAAAEAAAAeAPn/AAAAAAEAAAAeAPr/AAADAAcAAAAeAPv/AAADAAcAAAAeAPz/AAAAAAEAAAAeAP3/AAADAAcAAAAeAP7/AAAAAAEAAAAeAP//AAADAAcAAAAeAAAAAAADAAcAAAAeAAEAAAADAAgAAAAeAAIAAAAHAAkAAAAeAAMAAAAHAAkAAAAeAAQAAAAIAAoAAAAeAAUAAAAHAAkAAAAeAAYAAAABAAMAAAAeAAcAAAABAAQAAAAeAAgAAAABAAUAAAAeAAkAAAAAAAAAAAAeAAoAAAAAAAAAAAAeAAsAAAAAAAAAAAAeAAwAAAACAAYAAAAeAA0AAAADAAoAAAAeAA4AAAADAAcAAAAeAA8AAAACAAkAAAAeABAAAAAEAAgAAAAeABEAAAAFAAoAAAAeABIAAAAHAAoAAAAeABMAAAAIAAoAAAAeABQAAAAFAAkAAAAeABUAAAAAAAAAAAAeABYAAAAIAAkAAAAeABcAAAAIAAkAAAAeABgAAAAAAAMAAAAeABkAAAABAAcAAAAeABoAAAABAAQAAAAeABsAAAABAAQAAAAeABwAAAAAAAYAAAAeAB0AAAACAAUAAAAeAB4AAAAFAAoAAAAeAB8AAAABAAMAAAAeACAAAAABAAQAAAAeACEAAAABAAQAAAAeACIAAAABAAUAAAAeACMAAAAFAAkAAAAeACQAAAAIAAoAAAAeACUAAAAIAAkAAAAeACYAAAAHAAkAAAAeACcAAAAIAAoAAAAeACgAAAAHAAkAAAAeACkAAAAFAAkAAAAeACoAAAAFAAkAAAAeACsAAAAHAAkAAAAeACwAAAAHAAoAAAAeAC0AAAAIAAkAAAAeAC4AAAAAAAAAAAAeAC8AAAAHAAoAAAAeADAAAAAFAAkAAAAeADEAAAAIAAoAAAAeADIAAAAIAAoAAAAeADMAAAAHAAkAAAAfAPD/AAADAAcAAAAfAPH/AAAAAAEAAAAfAPL/AAADAAcAAAAfAPP/AAADAAcAAAAfAPT/AAADAAcAAAAfAPX/AAAAAAEAAAAfAPb/AAADAAcAAAAfAPf/AAAAAAEAAAAfAPj/AAADAAcAAAAfAPn/AAAAAAEAAAAfAPr/AAADAAcAAAAfAPv/AAADAAcAAAAfAPz/AAADAAcAAAAfAP3/AAADAAcAAAAfAP7/AAADAAcAAAAfAP//AAAAAAEAAAAfAAAAAAADAAcAAAAfAAEAAAADAAgAAAAfAAIAAAAFAAoAAAAfAAMAAAAFAAoAAAAfAAQAAAAIAAoAAAAfAAUAAAAHAAkAAAAfAAYAAAABAAMAAAAfAAcAAAABAAQAAAAfAAgAAAABAAUAAAAfAAkAAAAAAAAAAAAfAAoAAAAAAAAAAAAfAAsAAAAAAAAAAAAfAAwAAAADAAYAAAAfAA0AAAADAAcAAAAfAA4AAAADAAcAAAAfAA8AAAADAAgAAAAfABAAAAAFAAkAAAAfABEAAAAFAAkAAAAfABIAAAAIAAkAAAAfABMAAAAHAAkAAAAfABQAAAAAAAAAAAAfABUAAAAAAAAAAAAfABYAAAAIAAkAAAAfABcAAAAAAAAAAAAfABgAAAABAAMAAAAfABkAAAABAAQAAAAfABoAAAABAAQAAAAfABsAAAAAAAYAAAAfABwAAAACAAUAAAAfAB0AAAAAAAAAAAAfAB4AAAAFAAoAAAAfAB8AAAABAAMAAAAfACAAAAABAAQAAAAfACEAAAABAAQAAAAfACIAAAABAAUAAAAfACMAAAAFAAkAAAAfACQAAAAAAAAAAAAfACUAAAAAAAAAAAAfACYAAAAHAAkAAAAfACcAAAAHAAoAAAAfACgAAAAIAAkAAAAfACkAAAAIAAoAAAAfACoAAAAIAAoAAAAfACsAAAAHAAkAAAAfACwAAAAHAAoAAAAfAC0AAAAFAAoAAAAfAC4AAAAHAAoAAAAfAC8AAAAIAAkAAAAfADAAAAAIAAoAAAAfADEAAAAHAAkAAAAfADIAAAAFAAkAAAAfADMAAAAHAAkAAAAgAPD/AAADAAcAAAAgAPH/AAAAAAEAAAAgAPL/AAADAAcAAAAgAPP/AAADAAcAAAAgAPT/AAADAAcAAAAgAPX/AAAAAAEAAAAgAPb/AAADAAcAAAAgAPf/AAADAAcAAAAgAPj/AAADAAcAAAAgAPn/AAAAAAEAAAAgAPr/AAAAAAEAAAAgAPv/AAADAAcAAAAgAPz/AAAAAAEAAAAgAP3/AAADAAcAAAAgAP7/AAADAAcAAAAgAP//AAAAAAEAAAAgAAAAAAADAAcAAAAgAAEAAAADAAgAAAAgAAIAAAAFAAkAAAAgAAMAAAAFAAkAAAAgAAQAAAAIAAkAAAAgAAUAAAAIAAkAAAAgAAYAAAABAAMAAAAgAAcAAAABAAQAAAAgAAgAAAABAAYAAAAgAAkAAAAAAAUAAAAgAAoAAAAAAAAAAAAgAAsAAAAAAAAAAAAgAAwAAAADAAYAAAAgAA0AAAADAAcAAAAgAA4AAAACAAkAAAAgAA8AAAAEAAgAAAAgABAAAAAFAAoAAAAgABEAAAAAAAAAAAAgABIAAAAHAAkAAAAgABMAAAAIAAoAAAAgABQAAAAIAAoAAAAgABUAAAAFAAoAAAAgABYAAAAAAAAAAAAgABcAAAAAAAMAAAAgABgAAAABAAcAAAAgABkAAAABAAQAAAAgABoAAAAAAAYAAAAgABsAAAACAAUAAAAgABwAAAAFAAkAAAAgAB0AAAAFAAoAAAAgAB4AAAAHAAoAAAAgAB8AAAABAAMAAAAgACAAAAABAAQAAAAgACEAAAABAAQAAAAgACIAAAABAAUAAAAgACMAAAAHAAkAAAAgACQAAAAIAAkAAAAgACUAAAAFAAkAAAAgACYAAAAFAAkAAAAgACcAAAAFAAoAAAAgACgAAAAHAAoAAAAgACkAAAAHAAoAAAAgACoAAAAFAAkAAAAgACsAAAAIAAkAAAAgACwAAAAFAAkAAAAgAC0AAAAAAAAAAAAgAC4AAAAIAAoAAAAgAC8AAAAIAAoAAAAgADAAAAAFAAkAAAAgADEAAAAFAAoAAAAgADIAAAAIAAoAAAAgADMAAAAFAAoAAAAhAPD/AAADAAcAAAAhAPH/AAADAAcAAAAhAPL/AAADAAcAAAAhAPP/AAAAAAEAAAAhAPT/AAADAAcAAAAhAPX/AAAAAAEAAAAhAPb/AAADAAcAAAAhAPf/AAAAAAEAAAAhAPj/AAADAAcAAAAhAPn/AAADAAcAAAAhAPr/AAADAAcAAAAhAPv/AAADAAcAAAAhAPz/AAADAAcAAAAhAP3/AAADAAcAAAAhAP7/AAADAAcAAAAhAP//AAADAAcAAAAhAAAAAAADAAcAAAAhAAEAAAADAAgAAAAhAAIAAAAFAAkAAAAhAAMAAAAIAAoAAAAhAAQAAAAHAAoAAAAhAAUAAAAAAAAAAAAhAAYAAAABAAMAAAAhAAcAAAABAAQAAAAhAAgAAAABAAQAAAAhAAkAAAABAAUAAAAhAAoAAAAAAAAAAAAhAAsAAAAAAAAAAAAhAAwAAAADAAYAAAAhAA0AAAADAAcAAAAhAA4AAAADAAgAAAAhAA8AAAAIAAoAAAAhABAAAAAHAAkAAAAhABEAAAAIAAoAAAAhABIAAAAHAAoAAAAhABMAAAAFAAoAAAAhABQAAAAHAAoAAAAhABUAAAAFAAkAAAAhABYAAAAAAAMAAAAhABcAAAABAAcAAAAhABgAAAABAAQAAAAhABkAAAAAAAYAAAAhABoAAAACAAUAAAAhABsAAAAIAAkAAAAhABwAAAAIAAoAAAAhAB0AAAAIAAkAAAAhAB4AAAAIAAoAAAAhAB8AAAABAAMAAAAhACAAAAABAAQAAAAhACEAAAABAAQAAAAhACIAAAABAAUAAAAhACMAAAAIAAkAAAAhACQAAAAFAAoAAAAhACUAAAAFAAoAAAAhACYAAAAFAAoAAAAhACcAAAAHAAoAAAAhACgAAAAAAAAAAAAhACkAAAAHAAkAAAAhACoAAAAHAAoAAAAhACsAAAAAAAAAAAAhACwAAAAIAAoAAAAhAC0AAAAHAAoAAAAhAC4AAAAHAAkAAAAhAC8AAAAAAAAAAAAhADAAAAAHAAoAAAAhADEAAAAFAAkAAAAhADIAAAAFAAkAAAAhADMAAAAIAAoAAAAiAPD/AAADAAcAAAAiAPH/AAADAAcAAAAiAPL/AAADAAcAAAAiAPP/AAADAAcAAAAiAPT/AAAAAAEAAAAiAPX/AAADAAcAAAAiAPb/AAADAAcAAAAiAPf/AAAAAAEAAAAiAPj/AAADAAcAAAAiAPn/AAADAAcAAAAiAPr/AAAAAAEAAAAiAPv/AAADAAcAAAAiAPz/AAADAAcAAAAiAP3/AAADAAcAAAAiAP7/AAADAAcAAAAiAP//AAADAAcAAAAiAAAAAAAAAAEAAAAiAAEAAAADAAgAAAAiAAIAAAAIAAoAAAAiAAMAAAAAAAAAAAAiAAQAAAAIAAkAAAAiAAUAAAAFAAoAAAAiAAYAAAABAAMAAAAiAAcAAAABAAQAAAAiAAgAAAABAAQAAAAiAAkAAAABAAUAAAAiAAoAAAAAAAAAAAAiAAsAAAACAAYAAAAiAAwAAAADAAoAAAAiAA0AAAADAAcAAAAiAA4AAAADAAgAAAAiAA8AAAAFAAkAAAAiABAAAAAHAAoAAAAiABEAAAAFAAkAAAAiABIAAAAIAAkAAAAiABMAAAAIAAoAAAAiABQAAAAHAAkAAAAiABUAAAAAAAAAAAAiABYAAAABAAMAAAAiABcAAAABAAQAAAAiABgAAAABAAQAAAAiABkAAAABAAUAAAAiABoAAAAHAAkAAAAiABsAAAAFAAoAAAAiABwAAAAFAAkAAAAiAB0AAAAFAAoAAAAiAB4AAAAIAAoAAAAiAB8AAAABAAMAAAAiACAAAAABAAQAAAAiACEAAAABAAQAAAAiACIAAAABAAUAAAAiACMAAAAHAAoAAAAiACQAAAAHAAoAAAAiACUAAAAHAAoAAAAiACYAAAAFAAoAAAAiACcAAAAFAAkAAAAiACgAAAAIAAoAAAAiACkAAAAFAAkAAAAiACoAAAAAAAAAAAAiACsAAAAIAAoAAAAiACwAAAAAAAAAAAAiAC0AAAAHAAoAAAAiAC4AAAAFAAkAAAAiAC8AAAAFAAoAAAAiADAAAAAFAAkAAAAiADEAAAAHAAkAAAAiADIAAAAFAAoAAAAiADMAAAAFAAkAAAAjAPD/AAADAAcAAAAjAPH/AAADAAcAAAAjAPL/AAAAAAEAAAAjAPP/AAADAAcAAAAjAPT/AAAAAAEAAAAjAPX/AAAAAAEAAAAjAPb/AAADAAcAAAAjAPf/AAADAAcAAAAjAPj/AAADAAcAAAAjAPn/AAADAAcAAAAjAPr/AAADAAcAAAAjAPv/AAAAAAEAAAAjAPz/AAADAAcAAAAjAP3/AAADAAcAAAAjAP7/AAADAAcAAAAjAP//AAADAAcAAAAjAAAAAAADAAcAAAAjAAEAAAADAAgAAAAjAAIAAAAHAAoAAAAjAAMAAAAHAAkAAAAjAAQAAAAIAAkAAAAjAAUAAAAIAAkAAAAjAAYAAAACAAMAAAAjAAcAAAAAAAcAAAAjAAgAAAABAAQAAAAjAAkAAAABAAUAAAAjAAoAAAACAAcAAAAjAAsAAAADAAoAAAAjAAwAAAADAAcAAAAjAA0AAAADAAcAAAAjAA4AAAALAA0AAAAjAA8AAAAAAAQAAAAjABAAAAAAAAQAAAAjABEAAAAAAAUAAAAjABIAAAAFAAkAAAAjABMAAAAIAAkAAAAjABQAAAAIAAkAAAAjABUAAAAHAAkAAAAjABYAAAABAAMAAAAjABcAAAABAAQAAAAjABgAAAAAAAYAAAAjABkAAAACAAUAAAAjABoAAAAFAAkAAAAjABsAAAAHAAkAAAAjABwAAAAFAAkAAAAjAB0AAAAHAAoAAAAjAB4AAAAIAAoAAAAjAB8AAAABAAMAAAAjACAAAAABAAQAAAAjACEAAAABAAQAAAAjACIAAAABAAUAAAAjACMAAAAAAAAAAAAjACQAAAAAAAAAAAAjACUAAAAHAAkAAAAjACYAAAAAAAAAAAAjACcAAAAFAAoAAAAjACgAAAAHAAoAAAAjACkAAAAFAAoAAAAjACoAAAAIAAoAAAAjACsAAAAIAAoAAAAjACwAAAAFAAoAAAAjAC0AAAAFAAkAAAAjAC4AAAAHAAoAAAAjAC8AAAAFAAoAAAAjADAAAAAHAAoAAAAjADEAAAAIAAoAAAAjADIAAAAIAAkAAAAjADMAAAAFAAkAAAAkAPD/AAADAAcAAAAkAPH/AAADAAcAAAAkAPL/AAADAAcAAAAkAPP/AAAAAAEAAAAkAPT/AAAAAAEAAAAkAPX/AAADAAcAAAAkAPb/AAADAAcAAAAkAPf/AAAAAAEAAAAkAPj/AAADAAcAAAAkAPn/AAADAAcAAAAkAPr/AAADAAcAAAAkAPv/AAADAAcAAAAkAPz/AAADAAcAAAAkAP3/AAADAAcAAAAkAP7/AAADAAcAAAAkAP//AAADAAcAAAAkAAAAAAADAAcAAAAkAAEAAAADAAgAAAAkAAIAAAAHAAkAAAAkAAMAAAAAAAAAAAAkAAQAAAAIAAkAAAAkAAUAAAAIAAoAAAAkAAYAAAAIAAkAAAAkAAcAAAABAAMAAAAkAAgAAAABAAQAAAAkAAkAAAAQAAYAAAAkAAwAAAAAAAEAAAAkAA0AAAAAAAEAAAAkAA4AAAAQAAgAAAAkAA8AAAABAAQAAAAkABAAAAABAAQAAAAkABEAAAABAAYAAAAkABIAAAAAAAUAAAAkABMAAAAFAAoAAAAkABQAAAAFAAoAAAAkABUAAAAIAAkAAAAkABYAAAABAAMAAAAkABcAAAABAAQAAAAkABgAAAABAAUAAAAkABkAAAAFAAkAAAAkABoAAAAAAAAAAAAkABsAAAAHAAkAAAAkABwAAAAFAAoAAAAkAB0AAAAIAAoAAAAkAB4AAAAHAAoAAAAkAB8AAAABAAMAAAAkACAAAAABAAQAAAAkACEAAAABAAQAAAAkACIAAAABAAUAAAAkACMAAAAHAAkAAAAkACQAAAAHAAkAAAAkACUAAAAAAAAAAAAkACYAAAAIAAkAAAAkACcAAAAIAAoAAAAkACgAAAAHAAoAAAAkACkAAAAFAAoAAAAkACoAAAAHAAoAAAAkACsAAAAFAAoAAAAkACwAAAAHAAoAAAAkAC0AAAAHAAkAAAAkAC4AAAAFAAkAAAAkAC8AAAAIAAoAAAAkADAAAAAIAAoAAAAkADEAAAAHAAkAAAAkADIAAAAFAAoAAAAkADMAAAAIAAoAAAAlAPD/AAADAAcAAAAlAPH/AAADAAcAAAAlAPL/AAADAAcAAAAlAPP/AAAAAAEAAAAlAPT/AAADAAcAAAAlAPX/AAADAAcAAAAlAPb/AAADAAcAAAAlAPf/AAADAAcAAAAlAPj/AAADAAcAAAAlAPn/AAADAAcAAAAlAPr/AAADAAcAAAAlAPv/AAADAAcAAAAlAPz/AAADAAcAAAAlAP3/AAADAAcAAAAlAP7/AAADAAcAAAAlAP//AAADAAcAAAAlAAAAAAACAAkAAAAlAAEAAAAEAAgAAAAlAAIAAAAHAAoAAAAlAAMAAAAIAAkAAAAlAAQAAAAFAAoAAAAlAAUAAAAFAAkAAAAlAAYAAAAAAAAAAAAlAAcAAAABAAMAAAAlAAgAAAABAAQAAAAlAAkAAAAQAAYAAAAlAA0AAAADAAcAAAAlAA4AAAAQAAgAAAAlAA8AAAABAAQAAAAlABAAAAABAAQAAAAlABEAAAABAAQAAAAlABIAAAABAAYAAAAlABMAAAAAAAQAAAAlABQAAAAAAAUAAAAlABUAAAAAAAMAAAAlABYAAAABAAcAAAAlABcAAAABAAQAAAAlABgAAAABAAUAAAAlABkAAAAHAAkAAAAlABoAAAAFAAoAAAAlABsAAAAIAAoAAAAlABwAAAAIAAkAAAAlAB0AAAAIAAkAAAAlAB4AAAAHAAkAAAAlAB8AAAABAAMAAAAlACAAAAABAAQAAAAlACEAAAABAAQAAAAlACIAAAABAAUAAAAlACMAAAAHAAoAAAAlACQAAAAIAAkAAAAlACUAAAAHAAkAAAAlACYAAAAIAAoAAAAlACcAAAAFAAoAAAAlACgAAAAFAAoAAAAlACkAAAAFAAoAAAAlACoAAAAIAAkAAAAlACsAAAAHAAkAAAAlACwAAAAHAAoAAAAlAC0AAAAFAAoAAAAlAC4AAAAIAAkAAAAlAC8AAAAHAAoAAAAlADAAAAAIAAkAAAAlADEAAAAHAAkAAAAlADIAAAAIAAkAAAAlADMAAAAFAAkAAAAmAPD/AAADAAcAAAAmAPH/AAADAAcAAAAmAPL/AAADAAcAAAAmAPP/AAADAAcAAAAmAPT/AAAAAAEAAAAmAPX/AAADAAcAAAAmAPb/AAAAAAEAAAAmAPf/AAADAAcAAAAmAPj/AAADAAcAAAAmAPn/AAAAAAEAAAAmAPr/AAAAAAEAAAAmAPv/AAADAAcAAAAmAPz/AAADAAcAAAAmAP3/AAADAAcAAAAmAP7/AAADAAcAAAAmAP//AAACAAkAAAAmAAAAAAAEAAgAAAAmAAEAAAAFAAoAAAAmAAIAAAAFAAkAAAAmAAMAAAAFAAkAAAAmAAQAAAAIAAkAAAAmAAUAAAAIAAkAAAAmAAYAAAAHAAkAAAAmAAcAAAABAAMAAAAmAAgAAAABAAQAAAAmAAkAAAAQAAYAAAAmAA0AAAADAAcAAAAmAA4AAAAKAA0AAAAmAA8AAAACAAQAAAAmABAAAAAAAAcAAAAmABEAAAABAAQAAAAmABIAAAABAAQAAAAmABMAAAABAAQAAAAmABQAAAABAAYAAAAmABUAAAABAAcAAAAmABYAAAABAAQAAAAmABcAAAABAAQAAAAmABgAAAABAAUAAAAmABkAAAAFAAoAAAAmABoAAAAHAAkAAAAmABsAAAAIAAoAAAAmABwAAAAFAAoAAAAmAB0AAAAFAAkAAAAmAB4AAAAAAAAAAAAmAB8AAAABAAMAAAAmACAAAAABAAQAAAAmACEAAAABAAQAAAAmACIAAAABAAUAAAAmACMAAAAIAAoAAAAmACQAAAAIAAoAAAAmACUAAAAFAAoAAAAmACYAAAAFAAoAAAAmACcAAAAIAAoAAAAmACgAAAAIAAoAAAAmACkAAAAAAAAAAAAmACoAAAAHAAkAAAAmACsAAAAHAAoAAAAmACwAAAAAAAAAAAAmAC0AAAAFAAkAAAAmAC4AAAAFAAoAAAAmAC8AAAAFAAkAAAAmADAAAAAHAAkAAAAmADEAAAAHAAoAAAAmADIAAAAHAAkAAAAmADMAAAAIAAkAAAAnAPD/AAADAAcAAAAnAPH/AAADAAcAAAAnAPL/AAADAAcAAAAnAPP/AAAAAAEAAAAnAPT/AAAAAAEAAAAnAPX/AAADAAcAAAAnAPb/AAADAAcAAAAnAPf/AAADAAcAAAAnAPj/AAADAAcAAAAnAPn/AAADAAcAAAAnAPr/AAADAAcAAAAnAPv/AAADAAcAAAAnAPz/AAADAAcAAAAnAP3/AAADAAcAAAAnAP7/AAADAAcAAAAnAP//AAADAAgAAAAnAAAAAAAAAAAAAAAnAAEAAAAHAAkAAAAnAAIAAAAAAAAAAAAnAAMAAAAIAAkAAAAnAAQAAAAHAAoAAAAnAAUAAAAAAAAAAAAnAAYAAAAAAAMAAAAnAAcAAAABAAcAAAAnAAgAAAABAAQAAAAnAAkAAAAQAAYAAAAnAAwAAAAAAAEAAAAnAA0AAAACAAkAAAAnAA4AAAAEAAgAAAAnAA8AAAAAAAAAAAAnABAAAAACAAMAAAAnABEAAAACAAQAAAAnABIAAAAAAAcAAAAnABMAAAABAAQAAAAnABQAAAABAAQAAAAnABUAAAABAAQAAAAnABYAAAABAAQAAAAnABcAAAAAAAYAAAAnABgAAAACAAUAAAAnABkAAAAFAAkAAAAnABoAAAAIAAkAAAAnABsAAAAFAAkAAAAnABwAAAAHAAoAAAAnAB0AAAAFAAoAAAAnAB4AAAAIAAkAAAAnAB8AAAABAAMAAAAnACAAAAABAAQAAAAnACEAAAABAAQAAAAnACIAAAABAAUAAAAnACMAAAAAAAAAAAAnACQAAAAHAAkAAAAnACUAAAAFAAoAAAAnACYAAAAHAAkAAAAnACcAAAAAAAAAAAAnACgAAAAFAAkAAAAnACkAAAAFAAoAAAAnACoAAAAHAAkAAAAnACsAAAAIAAoAAAAnACwAAAAAAAAAAAAnAC0AAAAIAAkAAAAnAC4AAAAAAAAAAAAnAC8AAAAIAAkAAAAnADAAAAAIAAkAAAAnADEAAAAFAAoAAAAnADIAAAAHAAoAAAAnADMAAAAAAAAAAAAoAPD/AAADAAcAAAAoAPH/AAAAAAEAAAAoAPL/AAADAAcAAAAoAPP/AAADAAcAAAAoAPT/AAADAAcAAAAoAPX/AAADAAcAAAAoAPb/AAADAAcAAAAoAPf/AAADAAcAAAAoAPj/AAAAAAEAAAAoAPn/AAAAAAEAAAAoAPr/AAAAAAEAAAAoAPv/AAADAAcAAAAoAPz/AAADAAcAAAAoAP3/AAAAAAEAAAAoAP7/AAADAAcAAAAoAP//AAADAAgAAAAoAAAAAAAIAAoAAAAoAAEAAAAHAAkAAAAoAAIAAAAFAAkAAAAoAAMAAAAAAAMAAAAoAAQAAAAAAAQAAAAoAAUAAAAAAAQAAAAoAAYAAAABAAcAAAAoAAcAAAABAAQAAAAoAAgAAAAPAAYAAAAoAAkAAAAQAAoAAAAoAAoAAAAAAAEAAAAoAAwAAAADAAcAAAAoAA0AAAADAAgAAAAoAA4AAAAHAAkAAAAoAA8AAAAFAAkAAAAoABAAAAAFAAoAAAAoABEAAAAFAAoAAAAoABIAAAACAAMAAAAoABMAAAACAAQAAAAoABQAAAACAAQAAAAoABUAAAACAAQAAAAoABYAAAACAAQAAAAoABcAAAACAAUAAAAoABgAAAAFAAkAAAAoABkAAAAIAAkAAAAoABoAAAAFAAkAAAAoABsAAAAFAAkAAAAoABwAAAAIAAoAAAAoAB0AAAAIAAkAAAAoAB4AAAAIAAkAAAAoAB8AAAABAAMAAAAoACAAAAABAAQAAAAoACEAAAABAAQAAAAoACIAAAABAAUAAAAoACMAAAAIAAkAAAAoACQAAAAFAAkAAAAoACUAAAAFAAkAAAAoACYAAAAIAAkAAAAoACcAAAAHAAoAAAAoACgAAAAAAAAAAAAoACkAAAAHAAoAAAAoACoAAAAIAAoAAAAoACsAAAAFAAoAAAAoACwAAAAHAAkAAAAoAC0AAAAIAAkAAAAoAC4AAAAHAAoAAAAoAC8AAAAFAAkAAAAoADAAAAAHAAkAAAAoADEAAAAHAAkAAAAoADIAAAAFAAoAAAAoADMAAAAFAAkAAAApAPD/AAAAAAEAAAApAPH/AAAAAAEAAAApAPL/AAADAAcAAAApAPP/AAADAAcAAAApAPT/AAADAAcAAAApAPX/AAADAAcAAAApAPb/AAADAAcAAAApAPf/AAADAAcAAAApAPr/AAADAAcAAAApAPv/AAADAAcAAAApAPz/AAADAAcAAAApAP3/AAADAAcAAAApAP7/AAADAAcAAAApAP//AAADAAkAAAApAAAAAAACAAgAAAApAAEAAAAFAAoAAAApAAIAAAAAAAAAAAApAAMAAAABAAMAAAApAAQAAAABAAQAAAApAAUAAAABAAQAAAApAAYAAAABAAQAAAApAAcAAAABAAQAAAApAAgAAAAQAAYAAAApAAkAAAAAAAEAAAApAAoAAAADAAcAAAApAAsAAAACAAkAAAApAAwAAAAEAAcAAAApAA0AAAAEAAgAAAApAA4AAAAIAAkAAAApAA8AAAAIAAoAAAApABAAAAAAAAAAAAApABEAAAAIAAkAAAApABIAAAAFAAoAAAApABMAAAAAAAAAAAApABQAAAAIAAkAAAApABUAAAAIAAoAAAApABYAAAAIAAkAAAApABcAAAAIAAoAAAApABgAAAAAAAAAAAApABkAAAAFAAoAAAApABoAAAAIAAkAAAApABsAAAAHAAoAAAApABwAAAAAAAAAAAApAB0AAAAHAAkAAAApAB4AAAAFAAoAAAApAB8AAAABAAMAAAApACAAAAABAAQAAAApACEAAAABAAQAAAApACIAAAABAAUAAAApACMAAAAIAAoAAAApACQAAAAIAAoAAAApACUAAAAFAAkAAAApACYAAAAIAAoAAAApACcAAAAFAAoAAAApACgAAAAHAAoAAAApACkAAAAFAAoAAAApACoAAAAHAAoAAAApACsAAAAHAAkAAAApACwAAAAIAAoAAAApAC0AAAAIAAkAAAApAC4AAAAHAAkAAAApAC8AAAAIAAkAAAApADAAAAAHAAoAAAApADEAAAAIAAoAAAApADIAAAAHAAkAAAApADMAAAAAAAAAAAAqAPD/AAADAAcAAAAqAPH/AAADAAcAAAAqAPL/AAADAAcAAAAqAPP/AAAAAAEAAAAqAPT/AAADAAcAAAAqAPX/AAADAAcAAAAqAPb/AAADAAcAAAAqAPf/AAADAAcAAAAqAPr/AAAAAAEAAAAqAPv/AAADAAcAAAAqAPz/AAADAAcAAAAqAP3/AAADAAcAAAAqAP7/AAADAAcAAAAqAP//AAAAAAEAAAAqAAAAAAADAAgAAAAqAAEAAAAFAAkAAAAqAAIAAAAFAAoAAAAqAAMAAAABAAMAAAAqAAQAAAABAAQAAAAqAAUAAAAAAAYAAAAqAAYAAAAAAAcAAAAqAAcAAAABAAQAAAAqAAgAAAAQAAYAAAAqAAkAAAADAAcAAAAqAAoAAAADAAcAAAAqAAsAAAADAAgAAAAqAAwAAAAAAAAAAAAqAA0AAAAFAAoAAAAqAA4AAAAHAAoAAAAqAA8AAAAFAAoAAAAqABAAAAAHAAoAAAAqABEAAAAAAAAAAAAqABIAAAAHAAkAAAAqABMAAAAIAAkAAAAqABQAAAAIAAkAAAAqABUAAAAFAAkAAAAqABYAAAAAAAAAAAAqABcAAAAHAAoAAAAqABgAAAAIAAkAAAAqABkAAAAHAAkAAAAqABoAAAAFAAkAAAAqABsAAAAFAAoAAAAqABwAAAAHAAkAAAAqAB0AAAAAAAAAAAAqAB4AAAAIAAoAAAAqAB8AAAABAAMAAAAqACAAAAABAAQAAAAqACEAAAABAAQAAAAqACIAAAABAAUAAAAqACMAAAAFAAoAAAAqACQAAAAIAAoAAAAqACUAAAAFAAkAAAAqACYAAAAAAAAAAAAqACcAAAAFAAkAAAAqACgAAAAIAAkAAAAqACkAAAAHAAoAAAAqACoAAAAFAAoAAAAqACsAAAAFAAoAAAAqACwAAAAFAAkAAAAqAC0AAAAHAAkAAAAqAC4AAAAIAAkAAAAqAC8AAAAFAAoAAAAqADAAAAAIAAoAAAAqADEAAAAAAAAAAAAqADIAAAAHAAkAAAAqADMAAAAIAAoAAAArAPD/AAADAAcAAAArAPH/AAADAAcAAAArAPL/AAADAAcAAAArAPP/AAADAAcAAAArAPT/AAAAAAEAAAArAPX/AAADAAcAAAArAPb/AAAAAAEAAAArAPf/AAADAAcAAAArAPj/AAAAAAEAAAArAPn/AAAAAAEAAAArAPr/AAADAAcAAAArAPv/AAAAAAEAAAArAPz/AAADAAcAAAArAP3/AAAAAAEAAAArAP7/AAADAAcAAAArAP//AAADAAcAAAArAAAAAAADAAkAAAArAAEAAAACAAgAAAArAAIAAAAIAAkAAAArAAMAAAABAAMAAAArAAQAAAABAAQAAAArAAUAAAABAAYAAAArAAYAAAABAAcAAAArAAcAAAAPAAYAAAArAAgAAAAQAAoAAAArAAkAAAADAAcAAAArAAoAAAACAAkAAAArAAsAAAAEAAgAAAArAAwAAAAHAAoAAAArAA0AAAAHAAoAAAArAA4AAAAFAAoAAAArAA8AAAAFAAoAAAArABAAAAAHAAkAAAArABEAAAAIAAkAAAArABIAAAAAAAAAAAArABMAAAAAAAAAAAArABQAAAAIAAkAAAArABUAAAAAAAAAAAArABYAAAAAAAAAAAArABcAAAAHAAoAAAArABgAAAAAAAAAAAArABkAAAAHAAkAAAArABoAAAAAAAAAAAArABsAAAAHAAoAAAArABwAAAAFAAkAAAArAB0AAAAFAAoAAAArAB4AAAAIAAkAAAArAB8AAAABAAMAAAArACAAAAABAAQAAAArACEAAAABAAQAAAArACIAAAABAAUAAAArACMAAAAFAAoAAAArACQAAAAFAAoAAAArACUAAAAIAAoAAAArACYAAAAIAAoAAAArACcAAAAHAAkAAAArACgAAAAIAAoAAAArACkAAAAIAAkAAAArACoAAAAFAAoAAAArACsAAAAIAAkAAAArACwAAAAFAAoAAAArAC0AAAAFAAkAAAArAC4AAAAHAAoAAAArAC8AAAAHAAkAAAArADAAAAAHAAkAAAArADEAAAAFAAkAAAArADIAAAAFAAkAAAArADMAAAAFAAoAAAAsAPD/AAADAAcAAAAsAPH/AAADAAcAAAAsAPL/AAADAAcAAAAsAPP/AAAAAAEAAAAsAPT/AAADAAcAAAAsAPX/AAADAAcAAAAsAPb/AAADAAcAAAAsAPf/AAADAAcAAAAsAPj/AAADAAcAAAAsAPn/AAADAAcAAAAsAPr/AAAAAAEAAAAsAPv/AAADAAcAAAAsAPz/AAADAAcAAAAsAP3/AAADAAcAAAAsAP7/AAAAAAEAAAAsAP//AAAAAAEAAAAsAAAAAAADAAcAAAAsAAEAAAADAAgAAAAsAAIAAAAIAAoAAAAsAAMAAAABAAMAAAAsAAQAAAABAAQAAAAsAAUAAAABAAQAAAAsAAYAAAAPAAYAAAAsAAcAAAAQAAoAAAAsAAgAAAADAAcAAAAsAAkAAAADAAcAAAAsAAoAAAADAAgAAAAsAAsAAAAFAAoAAAAsAAwAAAAHAAkAAAAsAA0AAAAFAAkAAAAsAA4AAAAIAAkAAAAsAA8AAAAIAAkAAAAsABAAAAAFAAoAAAAsABEAAAAFAAoAAAAsABIAAAAAAAAAAAAsABMAAAAFAAkAAAAsABQAAAAFAAoAAAAsABUAAAAHAAkAAAAsABYAAAAHAAoAAAAsABcAAAAIAAoAAAAsABgAAAAFAAoAAAAsABkAAAAAAAAAAAAsABoAAAAIAAoAAAAsABsAAAAFAAkAAAAsABwAAAAFAAkAAAAsAB0AAAAHAAoAAAAsAB4AAAAAAAAAAAAsAB8AAAABAAMAAAAsACAAAAABAAQAAAAsACEAAAABAAQAAAAsACIAAAABAAUAAAAsACMAAAAAAAAAAAAsACQAAAAIAAoAAAAsACUAAAAHAAkAAAAsACYAAAAFAAoAAAAsACcAAAAFAAkAAAAsACgAAAAFAAkAAAAsACkAAAAFAAkAAAAsACoAAAAAAAAAAAAsACsAAAAFAAoAAAAsACwAAAAFAAoAAAAsAC0AAAAHAAoAAAAsAC4AAAAIAAoAAAAsAC8AAAAHAAoAAAAsADAAAAAFAAoAAAAsADEAAAAFAAkAAAAsADIAAAAHAAkAAAAsADMAAAAIAAkAAAAtAPD/AAADAAcAAAAtAPH/AAADAAcAAAAtAPL/AAADAAcAAAAtAPP/AAADAAcAAAAtAPT/AAADAAcAAAAtAPX/AAADAAcAAAAtAPb/AAADAAcAAAAtAPf/AAADAAcAAAAtAPj/AAADAAcAAAAtAPn/AAADAAcAAAAtAPr/AAADAAcAAAAtAPv/AAADAAcAAAAtAPz/AAADAAcAAAAtAP3/AAAAAAEAAAAtAP7/AAADAAcAAAAtAP//AAADAAcAAAAtAAAAAAADAAcAAAAtAAEAAAADAAgAAAAtAAIAAAAHAAkAAAAtAAMAAAACAAMAAAAtAAQAAAACAAQAAAAtAAUAAAAAAAcAAAAtAAYAAAAQAAoAAAAtAAcAAAADAAcAAAAtAAgAAAADAAcAAAAtAAkAAAACAAkAAAAtAAoAAAAEAAgAAAAtAAsAAAAIAAkAAAAtAAwAAAAHAAkAAAAtAA0AAAAFAAkAAAAtAA4AAAAIAAoAAAAtAA8AAAAIAAkAAAAtABAAAAAFAAoAAAAtABEAAAAFAAoAAAAtABIAAAAHAAoAAAAtABMAAAAFAAkAAAAtABQAAAAHAAkAAAAtABUAAAAIAAkAAAAtABYAAAAHAAoAAAAtABcAAAAHAAkAAAAtABgAAAAAAAAAAAAtABkAAAAAAAAAAAAtABoAAAAHAAkAAAAtABsAAAAHAAkAAAAtABwAAAAAAAAAAAAtAB0AAAAFAAoAAAAtAB4AAAAHAAkAAAAtAB8AAAABAAMAAAAtACAAAAABAAQAAAAtACEAAAABAAQAAAAtACIAAAABAAUAAAAtACMAAAAFAAkAAAAtACQAAAAIAAkAAAAtACUAAAAFAAoAAAAtACYAAAAHAAoAAAAtACcAAAAFAAoAAAAtACgAAAAIAAoAAAAtACkAAAAHAAoAAAAtACoAAAAHAAoAAAAtACsAAAAAAAAAAAAtACwAAAAFAAkAAAAtAC0AAAAHAAoAAAAtAC4AAAAHAAoAAAAtAC8AAAAHAAkAAAAtADAAAAAFAAkAAAAtADEAAAAIAAoAAAAtADIAAAAIAAoAAAAtADMAAAAIAAkAAAAuAPD/AAADAAcAAAAuAPH/AAADAAcAAAAuAPL/AAADAAcAAAAuAPP/AAADAAcAAAAuAPT/AAAAAAEAAAAuAPX/AAADAAcAAAAuAPb/AAAAAAEAAAAuAPf/AAADAAcAAAAuAPj/AAADAAcAAAAuAPn/AAAAAAEAAAAuAPr/AAADAAcAAAAuAPv/AAAAAAEAAAAuAPz/AAADAAcAAAAuAP3/AAADAAcAAAAuAP7/AAADAAcAAAAuAP//AAADAAcAAAAuAAAAAAADAAcAAAAuAAEAAAADAAgAAAAuAAIAAAAIAAoAAAAuAAMAAAACAAYAAAAuAAQAAAACAAcAAAAuAAUAAAAAAAEAAAAuAAYAAAADAAcAAAAuAAcAAAADAAcAAAAuAAgAAAACAAkAAAAuAAkAAAAEAAgAAAAuAAoAAAAIAAoAAAAuAAsAAAAIAAkAAAAuAAwAAAAFAAoAAAAuAA0AAAAHAAoAAAAuAA4AAAAHAAoAAAAuAA8AAAAIAAoAAAAuABAAAAAFAAkAAAAuABEAAAAIAAoAAAAuABIAAAAIAAoAAAAuABMAAAAFAAkAAAAuABQAAAAIAAkAAAAuABUAAAAIAAkAAAAuABYAAAAIAAoAAAAuABcAAAAHAAkAAAAuABgAAAAFAAoAAAAuABkAAAAIAAoAAAAuABoAAAAAAAAAAAAuABsAAAAFAAkAAAAuABwAAAAIAAoAAAAuAB0AAAAHAAoAAAAuAB4AAAAFAAkAAAAuAB8AAAABAAMAAAAuACAAAAABAAQAAAAuACEAAAABAAQAAAAuACIAAAABAAYAAAAuACMAAAAAAAQAAAAuACQAAAAAAAQAAAAuACUAAAAAAAQAAAAuACYAAAAAAAQAAAAuACcAAAAAAAQAAAAuACgAAAAAAAQAAAAuACkAAAAAAAQAAAAuACoAAAAAAAQAAAAuACsAAAAAAAQAAAAuACwAAAAAAAQAAAAuAC0AAAAAAAQAAAAuAC4AAAAAAAQAAAAuAC8AAAAAAAQAAAAuADAAAAAAAAQAAAAuADEAAAAAAAQAAAAuADIAAAAAAAQAAAAuADMAAAALAA4AAAAvAPD/AAADAAcAAAAvAPH/AAADAAcAAAAvAPL/AAAAAAEAAAAvAPP/AAAAAAEAAAAvAPT/AAADAAcAAAAvAPX/AAADAAcAAAAvAPb/AAADAAcAAAAvAPf/AAADAAcAAAAvAPj/AAADAAcAAAAvAPn/AAADAAcAAAAvAPr/AAADAAcAAAAvAPv/AAAAAAEAAAAvAPz/AAAAAAEAAAAvAP3/AAADAAcAAAAvAP7/AAADAAcAAAAvAP//AAADAAcAAAAvAAAAAAAAAAEAAAAvAAEAAAADAAkAAAAvAAIAAAACAAcAAAAvAAMAAAADAAoAAAAvAAQAAAADAAcAAAAvAAUAAAADAAcAAAAvAAYAAAACAAkAAAAvAAcAAAAEAAcAAAAvAAgAAAAEAAgAAAAvAAkAAAAFAAkAAAAvAAoAAAAHAAkAAAAvAAsAAAAIAAkAAAAvAAwAAAAIAAoAAAAvAA0AAAAAAAAAAAAvAA4AAAAFAAkAAAAvAA8AAAAFAAkAAAAvABAAAAAFAAkAAAAvABEAAAAFAAoAAAAvABIAAAAHAAoAAAAvABMAAAAHAAoAAAAvABQAAAAFAAkAAAAvABUAAAAIAAkAAAAvABYAAAAIAAkAAAAvABcAAAAFAAoAAAAvABgAAAAFAAoAAAAvABkAAAAHAAkAAAAvABoAAAAIAAoAAAAvABsAAAAIAAkAAAAvABwAAAAHAAkAAAAvAB0AAAAIAAkAAAAvAB4AAAAIAAoAAAAvAB8AAAABAAMAAAAvACAAAAABAAQAAAAvACEAAAABAAQAAAAvACIAAAABAAQAAAAvACMAAAABAAQAAAAvACQAAAABAAQAAAAvACUAAAABAAQAAAAvACYAAAABAAQAAAAvACcAAAABAAQAAAAvACgAAAABAAQAAAAvACkAAAABAAQAAAAvACoAAAABAAQAAAAvACsAAAABAAQAAAAvACwAAAABAAQAAAAvAC0AAAABAAQAAAAvAC4AAAABAAQAAAAvAC8AAAABAAQAAAAvADAAAAABAAQAAAAvADEAAAABAAQAAAAvADIAAAABAAQAAAAvADMAAAAQAAYAAAAwAPD/AAADAAcAAAAwAPH/AAADAAcAAAAwAPL/AAAAAAEAAAAwAPP/AAAAAAEAAAAwAPT/AAAAAAEAAAAwAPX/AAADAAcAAAAwAPb/AAADAAcAAAAwAPf/AAADAAcAAAAwAPj/AAADAAcAAAAwAPn/AAAAAAEAAAAwAPr/AAADAAcAAAAwAPv/AAAAAAEAAAAwAPz/AAAAAAEAAAAwAP3/AAADAAcAAAAwAP7/AAADAAcAAAAwAP//AAADAAcAAAAwAAAAAAADAAcAAAAwAAEAAAADAAcAAAAwAAIAAAAAAAEAAAAwAAMAAAADAAcAAAAwAAQAAAADAAcAAAAwAAUAAAACAAkAAAAwAAYAAAAEAAgAAAAwAAcAAAAIAAoAAAAwAAgAAAAFAAoAAAAwAAkAAAAAAAAAAAAwAAoAAAAIAAkAAAAwAAsAAAAIAAkAAAAwAAwAAAAIAAoAAAAwAA0AAAAHAAoAAAAwAA4AAAAFAAkAAAAwAA8AAAAIAAkAAAAwABAAAAAIAAkAAAAwABEAAAAFAAkAAAAwABIAAAAFAAkAAAAwABMAAAAHAAkAAAAwABQAAAAIAAkAAAAwABUAAAAFAAkAAAAwABYAAAAFAAoAAAAwABcAAAAHAAoAAAAwABgAAAAIAAoAAAAwABkAAAAAAAAAAAAwABoAAAAHAAkAAAAwABsAAAAFAAoAAAAwABwAAAAAAAAAAAAwAB0AAAAIAAoAAAAwAB4AAAAIAAkAAAAwAB8AAAABAAMAAAAwACAAAAABAAQAAAAwACEAAAABAAQAAAAwACIAAAABAAQAAAAwACMAAAABAAQAAAAwACQAAAABAAQAAAAwACUAAAABAAQAAAAwACYAAAABAAQAAAAwACcAAAABAAQAAAAwACgAAAABAAQAAAAwACkAAAABAAQAAAAwACoAAAABAAQAAAAwACsAAAABAAQAAAAwACwAAAABAAQAAAAwAC0AAAABAAQAAAAwAC4AAAABAAQAAAAwAC8AAAABAAQAAAAwADAAAAABAAQAAAAwADEAAAABAAQAAAAwADIAAAABAAQAAAAwADMAAAAQAAYAAAAxAPD/AAADAAcAAAAxAPH/AAADAAcAAAAxAPL/AAADAAcAAAAxAPP/AAADAAcAAAAxAPT/AAADAAcAAAAxAPX/AAADAAcAAAAxAPb/AAADAAcAAAAxAPf/AAADAAcAAAAxAPj/AAADAAcAAAAxAPn/AAADAAcAAAAxAPr/AAADAAcAAAAxAPv/AAADAAcAAAAxAPz/AAADAAcAAAAxAP3/AAADAAcAAAAxAP7/AAADAAcAAAAxAP//AAAAAAEAAAAxAAAAAAAAAAEAAAAxAAEAAAADAAcAAAAxAAIAAAAAAAEAAAAxAAMAAAADAAcAAAAxAAQAAAACAAkAAAAxAAUAAAAEAAgAAAAxAAYAAAAFAAoAAAAxAAcAAAAIAAoAAAAxAAgAAAAFAAoAAAAxAAkAAAAAAAAAAAAxAAoAAAAAAAAAAAAxAAsAAAAAAAAAAAAxAAwAAAAIAAoAAAAxAA0AAAAIAAkAAAAxAA4AAAAIAAkAAAAxAA8AAAAIAAkAAAAxABAAAAAFAAoAAAAxABEAAAAAAAAAAAAxABIAAAAFAAkAAAAxABMAAAAFAAoAAAAxABQAAAAFAAkAAAAxABUAAAAFAAoAAAAxABYAAAAHAAkAAAAxABcAAAAFAAoAAAAxABgAAAAFAAoAAAAxABkAAAAFAAoAAAAxABoAAAAHAAkAAAAxABsAAAAIAAoAAAAxABwAAAAIAAoAAAAxAB0AAAAIAAkAAAAxAB4AAAAFAAoAAAAxAB8AAAABAAMAAAAxACAAAAABAAQAAAAxACEAAAABAAQAAAAxACIAAAABAAQAAAAxACMAAAABAAQAAAAxACQAAAABAAQAAAAxACUAAAABAAQAAAAxACYAAAABAAQAAAAxACcAAAABAAQAAAAxACgAAAABAAQAAAAxACkAAAABAAQAAAAxACoAAAABAAQAAAAxACsAAAABAAQAAAAxACwAAAABAAQAAAAxAC0AAAABAAQAAAAxAC4AAAABAAQAAAAxAC8AAAABAAQAAAAxADAAAAABAAQAAAAxADEAAAABAAQAAAAxADIAAAABAAQAAAAxADMAAAAQAAYAAAAyAPD/AAADAAcAAAAyAPH/AAADAAcAAAAyAPL/AAAAAAEAAAAyAPP/AAAAAAEAAAAyAPT/AAADAAcAAAAyAPX/AAADAAcAAAAyAPb/AAADAAcAAAAyAPf/AAADAAcAAAAyAPj/AAAAAAEAAAAyAPn/AAAAAAEAAAAyAPr/AAAAAAEAAAAyAPv/AAAAAAEAAAAyAPz/AAADAAcAAAAyAP3/AAADAAcAAAAyAP7/AAADAAcAAAAyAP//AAADAAcAAAAyAAAAAAADAAcAAAAyAAEAAAADAAcAAAAyAAIAAAADAAcAAAAyAAMAAAACAAkAAAAyAAQAAAAEAAgAAAAyAAUAAAAAAAAAAAAyAAYAAAAFAAoAAAAyAAcAAAAIAAoAAAAyAAgAAAAIAAkAAAAyAAkAAAAIAAoAAAAyAAoAAAAIAAoAAAAyAAsAAAAIAAkAAAAyAAwAAAAFAAkAAAAyAA0AAAAAAAAAAAAyAA4AAAAHAAoAAAAyAA8AAAAIAAkAAAAyABAAAAAFAAkAAAAyABEAAAAHAAoAAAAyABIAAAAHAAoAAAAyABMAAAAFAAkAAAAyABQAAAAAAAAAAAAyABUAAAAIAAoAAAAyABYAAAAHAAoAAAAyABcAAAAAAAAAAAAyABgAAAAHAAoAAAAyABkAAAAAAAAAAAAyABoAAAAHAAoAAAAyABsAAAAHAAoAAAAyABwAAAAHAAkAAAAyAB0AAAAFAAkAAAAyAB4AAAAAAAMAAAAyAB8AAAABAAcAAAAyACAAAAABAAQAAAAyACEAAAABAAQAAAAyACIAAAABAAQAAAAyACMAAAAAAAYAAAAyACQAAAACAAQAAAAyACUAAAACAAQAAAAyACYAAAACAAQAAAAyACcAAAACAAQAAAAyACgAAAACAAQAAAAyACkAAAACAAQAAAAyACoAAAACAAQAAAAyACsAAAACAAQAAAAyACwAAAACAAQAAAAyAC0AAAACAAQAAAAyAC4AAAACAAQAAAAyAC8AAAACAAQAAAAyADAAAAACAAQAAAAyADEAAAACAAQAAAAyADIAAAACAAQAAAAyADMAAAAKAA4AAAAzAPD/AAADAAcAAAAzAPH/AAADAAcAAAAzAPL/AAAAAAEAAAAzAPP/AAADAAcAAAAzAPT/AAADAAcAAAAzAPX/AAAAAAEAAAAzAPb/AAAAAAEAAAAzAPf/AAADAAcAAAAzAPj/AAAAAAEAAAAzAPn/AAADAAcAAAAzAPr/AAADAAcAAAAzAPv/AAADAAcAAAAzAPz/AAADAAcAAAAzAP3/AAADAAcAAAAzAP7/AAADAAcAAAAzAP//AAADAAcAAAAzAAAAAAADAAcAAAAzAAEAAAAAAAEAAAAzAAIAAAACAAkAAAAzAAMAAAAEAAgAAAAzAAQAAAAIAAkAAAAzAAUAAAAFAAkAAAAzAAYAAAAHAAkAAAAzAAcAAAAHAAoAAAAzAAgAAAAFAAoAAAAzAAkAAAAHAAoAAAAzAAoAAAAHAAoAAAAzAAsAAAAFAAoAAAAzAAwAAAAFAAoAAAAzAA0AAAAIAAoAAAAzAA4AAAAHAAoAAAAzAA8AAAAHAAkAAAAzABAAAAAFAAkAAAAzABEAAAAHAAoAAAAzABIAAAAIAAoAAAAzABMAAAAFAAoAAAAzABQAAAAFAAkAAAAzABUAAAAHAAoAAAAzABYAAAAHAAkAAAAzABcAAAAIAAkAAAAzABgAAAAIAAkAAAAzABkAAAAIAAoAAAAzABoAAAAIAAoAAAAzABsAAAAFAAoAAAAzABwAAAAIAAoAAAAzAB0AAAAAAAMAAAAzAB4AAAABAAcAAAAzAB8AAAABAAQAAAAzACAAAAABAAQAAAAzACEAAAABAAQAAAAzACIAAAABAAQAAAAzACMAAAABAAUAAAAzACQAAAAIAAkAAAAzACUAAAAAAAAAAAAzACYAAAAIAAkAAAAzACcAAAAIAAoAAAAzACgAAAAHAAoAAAAzACkAAAAHAAoAAAAzACoAAAAAAAAAAAAzACsAAAAIAAoAAAAzACwAAAAHAAkAAAAzAC0AAAAIAAoAAAAzAC4AAAAIAAkAAAAzAC8AAAAFAAkAAAAzADAAAAAHAAoAAAAzADEAAAAIAAkAAAAzADIAAAAIAAkAAAAzADMAAAAAAAAAAAA0APD/AAADAAcAAAA0APH/AAADAAcAAAA0APL/AAADAAcAAAA0APP/AAADAAcAAAA0APT/AAADAAcAAAA0APX/AAAAAAEAAAA0APb/AAADAAcAAAA0APf/AAADAAcAAAA0APj/AAADAAcAAAA0APn/AAADAAcAAAA0APr/AAAAAAEAAAA0APv/AAADAAcAAAA0APz/AAADAAcAAAA0AP3/AAADAAcAAAA0AP7/AAADAAcAAAA0AP//AAADAAcAAAA0AAAAAAADAAcAAAA0AAEAAAADAAcAAAA0AAIAAAADAAgAAAA0AAMAAAAFAAoAAAA0AAQAAAAHAAoAAAA0AAUAAAAAAAAAAAA0AAYAAAAHAAkAAAA0AAcAAAAHAAoAAAA0AAgAAAAIAAkAAAA0AAkAAAAFAAoAAAA0AAoAAAAFAAkAAAA0AAsAAAAHAAoAAAA0AAwAAAAFAAoAAAA0AA0AAAAFAAkAAAA0AA4AAAAHAAkAAAA0AA8AAAAHAAkAAAA0ABAAAAAHAAoAAAA0ABEAAAAIAAoAAAA0ABIAAAAHAAoAAAA0ABMAAAAHAAoAAAA0ABQAAAAHAAoAAAA0ABUAAAAFAAoAAAA0ABYAAAAIAAkAAAA0ABcAAAAFAAkAAAA0ABgAAAAHAAoAAAA0ABkAAAAIAAoAAAA0ABoAAAAFAAoAAAA0ABsAAAAFAAkAAAA0ABwAAAAHAAoAAAA0AB0AAAABAAMAAAA0AB4AAAABAAQAAAA0AB8AAAABAAQAAAA0ACAAAAABAAQAAAA0ACEAAAABAAQAAAA0ACIAAAABAAQAAAA0ACMAAAABAAUAAAA0ACQAAAAFAAkAAAA0ACUAAAAIAAoAAAA0ACYAAAAAAAAAAAA0ACcAAAAIAAkAAAA0ACgAAAAHAAkAAAA0ACkAAAAHAAkAAAA0ACoAAAAHAAkAAAA0ACsAAAAIAAoAAAA0ACwAAAAIAAkAAAA0AC0AAAAFAAoAAAA0AC4AAAAFAAkAAAA0AC8AAAAHAAoAAAA0ADAAAAAHAAkAAAA0ADEAAAAIAAkAAAA0ADIAAAAIAAoAAAA0ADMAAAAAAAAAAAA1APD/AAADAAcAAAA1APH/AAADAAcAAAA1APL/AAADAAcAAAA1APP/AAADAAcAAAA1APT/AAAAAAEAAAA1APX/AAADAAcAAAA1APb/AAAAAAEAAAA1APf/AAAAAAEAAAA1APj/AAADAAcAAAA1APn/AAADAAcAAAA1APr/AAADAAcAAAA1APv/AAAAAAEAAAA1APz/AAADAAcAAAA1AP3/AAADAAcAAAA1AP7/AAADAAcAAAA1AP//AAAAAAEAAAA1AAAAAAAAAAEAAAA1AAEAAAADAAcAAAA1AAIAAAADAAgAAAA1AAMAAAAFAAoAAAA1AAQAAAAFAAkAAAA1AAUAAAAFAAoAAAA1AAYAAAAIAAoAAAA1AAcAAAAHAAoAAAA1AAgAAAAIAAoAAAA1AAkAAAAFAAkAAAA1AAoAAAAHAAkAAAA1AAsAAAAIAAkAAAA1AAwAAAAFAAkAAAA1AA0AAAAIAAkAAAA1AA4AAAAIAAkAAAA1AA8AAAAIAAoAAAA1ABAAAAAHAAoAAAA1ABEAAAAHAAkAAAA1ABIAAAAIAAkAAAA1ABMAAAAHAAoAAAA1ABQAAAAHAAoAAAA1ABUAAAAIAAkAAAA1ABYAAAAIAAkAAAA1ABcAAAAIAAoAAAA1ABgAAAAAAAAAAAA1ABkAAAAIAAkAAAA1ABoAAAAFAAkAAAA1ABsAAAAHAAoAAAA1ABwAAAAAAAMAAAA1AB0AAAABAAcAAAA1AB4AAAABAAQAAAA1AB8AAAABAAQAAAA1ACAAAAAAAAYAAAA1ACEAAAABAAQAAAA1ACIAAAABAAQAAAA1ACMAAAABAAUAAAA1ACQAAAAFAAkAAAA1ACUAAAAHAAkAAAA1ACYAAAAIAAkAAAA1ACcAAAAIAAoAAAA1ACgAAAAFAAkAAAA1ACkAAAAIAAkAAAA1ACoAAAAHAAkAAAA1ACsAAAAHAAkAAAA1ACwAAAAFAAkAAAA1AC0AAAAFAAkAAAA1AC4AAAAFAAoAAAA1AC8AAAAFAAkAAAA1ADAAAAAFAAkAAAA1ADEAAAAFAAkAAAA1ADIAAAAFAAkAAAA1ADMAAAAHAAkAAAA2APD/AAADAAcAAAA2APH/AAADAAcAAAA2APL/AAADAAcAAAA2APP/AAADAAcAAAA2APT/AAADAAcAAAA2APX/AAAAAAEAAAA2APb/AAADAAcAAAA2APf/AAAAAAEAAAA2APj/AAADAAcAAAA2APn/AAADAAcAAAA2APr/AAADAAcAAAA2APv/AAADAAcAAAA2APz/AAAAAAEAAAA2AP3/AAADAAcAAAA2AP7/AAADAAcAAAA2AP//AAADAAcAAAA2AAAAAAADAAcAAAA2AAEAAAADAAcAAAA2AAIAAAADAAgAAAA2AAMAAAAHAAoAAAA2AAQAAAAIAAkAAAA2AAUAAAAFAAoAAAA2AAYAAAAHAAoAAAA2AAcAAAAIAAoAAAA2AAgAAAAIAAoAAAA2AAkAAAAFAAkAAAA2AAoAAAAHAAoAAAA2AAsAAAAHAAoAAAA2AAwAAAAIAAoAAAA2AA0AAAAHAAoAAAA2AA4AAAAIAAoAAAA2AA8AAAAHAAoAAAA2ABAAAAAIAAkAAAA2ABEAAAAHAAkAAAA2ABIAAAAIAAkAAAA2ABMAAAAHAAkAAAA2ABQAAAAIAAkAAAA2ABUAAAAHAAkAAAA2ABYAAAAFAAoAAAA2ABcAAAAFAAoAAAA2ABgAAAAHAAkAAAA2ABkAAAAHAAoAAAA2ABoAAAAHAAkAAAA2ABsAAAAAAAMAAAA2ABwAAAABAAcAAAA2AB0AAAABAAQAAAA2AB4AAAABAAQAAAA2AB8AAAABAAQAAAA2ACAAAAABAAUAAAA2ACEAAAABAAQAAAA2ACIAAAABAAQAAAA2ACMAAAABAAUAAAA2ACQAAAAIAAoAAAA2ACUAAAAHAAkAAAA2ACYAAAAIAAkAAAA2ACcAAAAAAAAAAAA2ACgAAAAFAAoAAAA2ACkAAAAIAAoAAAA2ACoAAAAFAAkAAAA2ACsAAAAFAAkAAAA2ACwAAAAIAAoAAAA2AC0AAAAFAAoAAAA2AC4AAAAHAAkAAAA2AC8AAAAFAAkAAAA2ADAAAAAHAAoAAAA2ADEAAAAHAAoAAAA2ADIAAAAFAAoAAAA2ADMAAAAFAAoAAAA3APD/AAADAAcAAAA3APH/AAADAAcAAAA3APL/AAADAAcAAAA3APP/AAADAAcAAAA3APT/AAADAAcAAAA3APX/AAAAAAEAAAA3APb/AAADAAcAAAA3APf/AAADAAcAAAA3APj/AAADAAcAAAA3APn/AAADAAcAAAA3APr/AAADAAcAAAA3APv/AAAAAAEAAAA3APz/AAADAAcAAAA3AP3/AAADAAcAAAA3AP7/AAADAAcAAAA3AP//AAADAAcAAAA3AAAAAAADAAcAAAA3AAEAAAACAAkAAAA3AAIAAAAEAAgAAAA3AAMAAAAHAAoAAAA3AAQAAAAIAAkAAAA3AAUAAAAHAAkAAAA3AAYAAAAIAAkAAAA3AAcAAAAIAAkAAAA3AAgAAAAAAAAAAAA3AAkAAAAFAAoAAAA3AAoAAAAAAAAAAAA3AAsAAAAHAAkAAAA3AAwAAAAFAAkAAAA3AA0AAAAIAAkAAAA3AA4AAAAAAAAAAAA3AA8AAAAIAAoAAAA3ABAAAAAHAAkAAAA3ABEAAAAFAAoAAAA3ABIAAAAAAAAAAAA3ABMAAAAHAAoAAAA3ABQAAAAAAAAAAAA3ABUAAAAHAAoAAAA3ABYAAAAHAAkAAAA3ABcAAAAIAAkAAAA3ABgAAAAAAAAAAAA3ABkAAAAFAAkAAAA3ABoAAAAHAAkAAAA3ABsAAAABAAMAAAA3ABwAAAABAAQAAAA3AB0AAAABAAQAAAA3AB4AAAABAAQAAAA3AB8AAAAAAAYAAAA3ACAAAAACAAUAAAA3ACEAAAABAAQAAAA3ACIAAAABAAQAAAA3ACMAAAABAAUAAAA3ACQAAAAFAAoAAAA3ACUAAAAIAAkAAAA3ACYAAAAIAAkAAAA3ACcAAAAHAAkAAAA3ACgAAAAIAAoAAAA3ACkAAAAFAAkAAAA3ACoAAAAHAAkAAAA3ACsAAAAFAAoAAAA3ACwAAAAIAAkAAAA3AC0AAAAAAAAAAAA3AC4AAAAHAAkAAAA3AC8AAAAAAAAAAAA3ADAAAAAFAAkAAAA3ADEAAAAFAAkAAAA3ADIAAAAAAAAAAAA3ADMAAAAFAAkAAAA4APD/AAADAAcAAAA4APH/AAADAAcAAAA4APL/AAAAAAEAAAA4APP/AAAAAAEAAAA4APT/AAADAAcAAAA4APX/AAACAAkAAAA4APb/AAAEAAcAAAA4APf/AAAEAAcAAAA4APj/AAAEAAcAAAA4APn/AAAEAAcAAAA4APr/AAACAAoAAAA4APv/AAADAAcAAAA4APz/AAADAAcAAAA4AP3/AAADAAcAAAA4AP7/AAAAAAEAAAA4AP//AAACAAkAAAA4AAAAAAAEAAcAAAA4AAEAAAAEAAgAAAA4AAIAAAAFAAoAAAA4AAMAAAAIAAkAAAA4AAQAAAAFAAkAAAA4AAUAAAAFAAoAAAA4AAYAAAAIAAoAAAA4AAcAAAAHAAkAAAA4AAgAAAAHAAkAAAA4AAkAAAAFAAkAAAA4AAoAAAAFAAoAAAA4AAsAAAAFAAkAAAA4AAwAAAAIAAoAAAA4AA0AAAAIAAkAAAA4AA4AAAAFAAoAAAA4AA8AAAAFAAoAAAA4ABAAAAAHAAoAAAA4ABEAAAAIAAkAAAA4ABIAAAAIAAoAAAA4ABMAAAAIAAkAAAA4ABQAAAAAAAAAAAA4ABUAAAAHAAkAAAA4ABYAAAAAAAAAAAA4ABcAAAAHAAkAAAA4ABgAAAAIAAkAAAA4ABkAAAAIAAoAAAA4ABoAAAAAAAMAAAA4ABsAAAABAAcAAAA4ABwAAAABAAQAAAA4AB0AAAABAAQAAAA4AB4AAAAAAAYAAAA4AB8AAAACAAUAAAA4ACAAAAABAAMAAAA4ACEAAAABAAQAAAA4ACIAAAABAAQAAAA4ACMAAAABAAUAAAA4ACQAAAAHAAkAAAA4ACUAAAAIAAoAAAA4ACYAAAAFAAoAAAA4ACcAAAAHAAoAAAA4ACgAAAAHAAkAAAA4ACkAAAAFAAkAAAA4ACoAAAAFAAoAAAA4ACsAAAAAAAAAAAA4ACwAAAAIAAkAAAA4AC0AAAAIAAoAAAA4AC4AAAAIAAkAAAA4AC8AAAAFAAkAAAA4ADAAAAAFAAkAAAA4ADEAAAAHAAkAAAA4ADIAAAAHAAoAAAA4ADMAAAAFAAkAAAA5APD/AAADAAcAAAA5APH/AAADAAcAAAA5APL/AAADAAcAAAA5APP/AAADAAcAAAA5APT/AAACAAkAAAA5APX/AAAEAAgAAAA5APb/AAAFAAkAAAA5APf/AAAAAAAAAAA5APj/AAAIAAkAAAA5APn/AAAFAAkAAAA5APr/AAAEAAYAAAA5APv/AAAEAAcAAAA5APz/AAAEAAcAAAA5AP3/AAAEAAcAAAA5AP7/AAAEAAcAAAA5AP//AAAEAAgAAAA5AAAAAAAIAAkAAAA5AAEAAAAFAAkAAAA5AAIAAAAHAAkAAAA5AAMAAAAFAAkAAAA5AAQAAAAFAAkAAAA5AAUAAAAFAAoAAAA5AAYAAAAIAAoAAAA5AAcAAAAHAAoAAAA5AAgAAAAFAAoAAAA5AAkAAAAIAAoAAAA5AAoAAAAFAAkAAAA5AAsAAAAFAAoAAAA5AAwAAAAFAAkAAAA5AA0AAAAIAAoAAAA5AA4AAAAFAAkAAAA5AA8AAAAIAAoAAAA5ABAAAAAFAAoAAAA5ABEAAAAFAAkAAAA5ABIAAAAAAAAAAAA5ABMAAAAHAAoAAAA5ABQAAAAAAAAAAAA5ABUAAAAIAAoAAAA5ABYAAAAIAAoAAAA5ABcAAAAHAAkAAAA5ABgAAAAHAAkAAAA5ABkAAAAHAAkAAAA5ABoAAAABAAMAAAA5ABsAAAABAAQAAAA5ABwAAAABAAQAAAA5AB0AAAABAAQAAAA5AB4AAAABAAUAAAA5AB8AAAAIAAkAAAA5ACAAAAABAAMAAAA5ACEAAAABAAQAAAA5ACIAAAABAAQAAAA5ACMAAAABAAUAAAA5ACQAAAAAAAAAAAA5ACUAAAAFAAoAAAA5ACYAAAAFAAoAAAA5ACcAAAAIAAoAAAA5ACgAAAAIAAoAAAA5ACkAAAAHAAoAAAA5ACoAAAAFAAkAAAA5ACsAAAAHAAoAAAA5ACwAAAAFAAoAAAA5AC0AAAAHAAoAAAA5AC4AAAAIAAkAAAA5AC8AAAAFAAoAAAA5ADAAAAAFAAkAAAA5ADEAAAAFAAoAAAA5ADIAAAAHAAoAAAA5ADMAAAAIAAkAAAA6APD/AAAAAAEAAAA6APH/AAADAAcAAAA6APL/AAACAAkAAAA6APP/AAAEAAcAAAA6APT/AAAEAAgAAAA6APX/AAAHAAkAAAA6APb/AAAIAAoAAAA6APf/AAAIAAoAAAA6APj/AAAFAAkAAAA6APn/AAAAAAAAAAA6APr/AAAHAAkAAAA6APv/AAAHAAkAAAA6APz/AAAFAAoAAAA6AP3/AAAIAAoAAAA6AP7/AAAAAAAAAAA6AP//AAAIAAkAAAA6AAAAAAAHAAoAAAA6AAEAAAAFAAoAAAA6AAIAAAAHAAoAAAA6AAMAAAAAAAAAAAA6AAQAAAAHAAkAAAA6AAUAAAAIAAoAAAA6AAYAAAAFAAoAAAA6AAcAAAAHAAkAAAA6AAgAAAAFAAkAAAA6AAkAAAAHAAoAAAA6AAoAAAAHAAoAAAA6AAsAAAAIAAoAAAA6AAwAAAAAAAAAAAA6AA0AAAAIAAoAAAA6AA4AAAAFAAkAAAA6AA8AAAAIAAoAAAA6ABAAAAAAAAAAAAA6ABEAAAAIAAoAAAA6ABIAAAAHAAkAAAA6ABMAAAAFAAkAAAA6ABQAAAAFAAkAAAA6ABUAAAAIAAkAAAA6ABYAAAAIAAkAAAA6ABcAAAAIAAkAAAA6ABgAAAAHAAkAAAA6ABkAAAAAAAMAAAA6ABoAAAABAAcAAAA6ABsAAAABAAQAAAA6ABwAAAABAAQAAAA6AB0AAAAAAAYAAAA6AB4AAAACAAUAAAA6AB8AAAAIAAkAAAA6ACAAAAABAAMAAAA6ACEAAAABAAQAAAA6ACIAAAABAAQAAAA6ACMAAAABAAUAAAA6ACQAAAAIAAoAAAA6ACUAAAAIAAoAAAA6ACYAAAAIAAoAAAA6ACcAAAAAAAAAAAA6ACgAAAAIAAkAAAA6ACkAAAAFAAkAAAA6ACoAAAAAAAAAAAA6ACsAAAAHAAoAAAA6ACwAAAAIAAkAAAA6AC0AAAAIAAoAAAA6AC4AAAAHAAoAAAA6AC8AAAAFAAoAAAA6ADAAAAAIAAoAAAA6ADEAAAAAAAAAAAA6ADIAAAAAAAAAAAA6ADMAAAAFAAkAAAA7APD/AAAEAAcAAAA7APH/AAAEAAcAAAA7APL/AAAEAAgAAAA7APP/AAAHAAkAAAA7APT/AAAHAAoAAAA7APX/AAAIAAoAAAA7APb/AAAHAAoAAAA7APf/AAAHAAoAAAA7APj/AAAHAAoAAAA7APn/AAAAAAAAAAA7APr/AAAAAAAAAAA7APv/AAAFAAoAAAA7APz/AAAAAAAAAAA7AP3/AAAFAAoAAAA7AP7/AAAIAAkAAAA7AP//AAAFAAkAAAA7AAAAAAAIAAoAAAA7AAEAAAAIAAoAAAA7AAIAAAAIAAkAAAA7AAMAAAAFAAkAAAA7AAQAAAAAAAAAAAA7AAUAAAAHAAkAAAA7AAYAAAAFAAoAAAA7AAcAAAAFAAkAAAA7AAgAAAAIAAkAAAA7AAkAAAAFAAoAAAA7AAoAAAAHAAkAAAA7AAsAAAAHAAkAAAA7AAwAAAAHAAoAAAA7AA0AAAAHAAkAAAA7AA4AAAAHAAkAAAA7AA8AAAAHAAkAAAA7ABAAAAAHAAoAAAA7ABEAAAAFAAkAAAA7ABIAAAAIAAkAAAA7ABMAAAAFAAoAAAA7ABQAAAAIAAoAAAA7ABUAAAAAAAAAAAA7ABYAAAAFAAoAAAA7ABcAAAAIAAoAAAA7ABgAAAAAAAMAAAA7ABkAAAABAAcAAAA7ABoAAAABAAQAAAA7ABsAAAABAAQAAAA7ABwAAAAAAAYAAAA7AB0AAAACAAUAAAA7AB4AAAAIAAoAAAA7AB8AAAAIAAkAAAA7ACAAAAABAAMAAAA7ACEAAAABAAQAAAA7ACIAAAABAAQAAAA7ACMAAAABAAUAAAA7ACQAAAAFAAkAAAA7ACUAAAAIAAoAAAA7ACYAAAAFAAkAAAA7ACcAAAAHAAoAAAA7ACgAAAAHAAoAAAA7ACkAAAAHAAoAAAA7ACoAAAAAAAAAAAA7ACsAAAAAAAAAAAA7ACwAAAAFAAkAAAA7AC0AAAAIAAoAAAA7AC4AAAAHAAoAAAA7AC8AAAAAAAAAAAA7ADAAAAAFAAkAAAA7ADEAAAAHAAoAAAA7ADIAAAAHAAoAAAA7ADMAAAAAAAkAAAA8APD/AAABAAsAAAA8APH/AAAFAAoAAAA8APL/AAAHAAoAAAA8APP/AAAFAAkAAAA8APT/AAAFAAoAAAA8APX/AAAHAAoAAAA8APb/AAAAAAAAAAA8APf/AAAFAAkAAAA8APj/AAAHAAkAAAA8APn/AAAHAAoAAAA8APr/AAAFAAkAAAA8APv/AAAIAAoAAAA8APz/AAAIAAkAAAA8AP3/AAAFAAkAAAA8AP7/AAAIAAkAAAA8AP//AAAHAAoAAAA8AAAAAAAIAAoAAAA8AAEAAAAIAAkAAAA8AAIAAAAIAAoAAAA8AAMAAAAIAAkAAAA8AAQAAAAAAAAAAAA8AAUAAAAHAAkAAAA8AAYAAAAFAAoAAAA8AAcAAAAHAAoAAAA8AAgAAAAAAAAAAAA8AAkAAAAIAAkAAAA8AAoAAAAHAAoAAAA8AAsAAAAFAAoAAAA8AAwAAAAAAAAAAAA8AA0AAAAHAAoAAAA8AA4AAAAIAAkAAAA8AA8AAAAIAAoAAAA8ABAAAAAAAAAAAAA8ABEAAAAHAAkAAAA8ABIAAAAHAAoAAAA8ABMAAAAHAAoAAAA8ABQAAAAAAAAAAAA8ABUAAAAFAAkAAAA8ABYAAAAHAAoAAAA8ABcAAAAAAAMAAAA8ABgAAAABAAcAAAA8ABkAAAABAAQAAAA8ABoAAAABAAQAAAA8ABsAAAAAAAYAAAA8ABwAAAACAAUAAAA8AB0AAAAFAAkAAAA8AB4AAAAIAAkAAAA8AB8AAAAIAAkAAAA8ACAAAAABAAMAAAA8ACEAAAABAAQAAAA8ACIAAAABAAQAAAA8ACMAAAABAAUAAAA8ACQAAAAFAAoAAAA8ACUAAAAAAAAAAAA8ACYAAAAHAAoAAAA8ACcAAAAFAAoAAAA8ACgAAAAFAAoAAAA8ACkAAAAFAAkAAAA8ACoAAAAIAAoAAAA8ACsAAAAIAAkAAAA8ACwAAAAIAAoAAAA8AC0AAAAFAAoAAAA8AC4AAAAFAAoAAAA8AC8AAAAFAAkAAAA8ADAAAAAFAAoAAAA8ADEAAAAFAAoAAAA8ADIAAAAHAAoAAAA8ADMAAAABAAkAAAA9APD/AAABAAsAAAA9APH/AAAFAAkAAAA9APL/AAAIAAkAAAA9APP/AAAIAAkAAAA9APT/AAAHAAoAAAA9APX/AAAHAAkAAAA9APb/AAAFAAoAAAA9APf/AAAIAAkAAAA9APj/AAAHAAoAAAA9APn/AAAHAAkAAAA9APr/AAAFAAkAAAA9APv/AAAHAAoAAAA9APz/AAAAAAAAAAA9AP3/AAAHAAkAAAA9AP7/AAAFAAoAAAA9AP//AAAAAAAAAAA9AAAAAAAHAAkAAAA9AAEAAAAAAAAAAAA9AAIAAAAAAAAAAAA9AAMAAAAFAAkAAAA9AAQAAAAIAAkAAAA9AAUAAAAFAAkAAAA9AAYAAAAHAAkAAAA9AAcAAAAFAAoAAAA9AAgAAAAAAAAAAAA9AAkAAAAHAAkAAAA9AAoAAAAHAAkAAAA9AAsAAAAFAAoAAAA9AAwAAAAFAAoAAAA9AA0AAAAAAAAAAAA9AA4AAAAIAAoAAAA9AA8AAAAIAAkAAAA9ABAAAAAFAAkAAAA9ABEAAAAHAAoAAAA9ABIAAAAIAAoAAAA9ABMAAAAHAAkAAAA9ABQAAAAHAAoAAAA9ABUAAAAHAAkAAAA9ABYAAAAAAAMAAAA9ABcAAAABAAcAAAA9ABgAAAABAAQAAAA9ABkAAAABAAQAAAA9ABoAAAAAAAYAAAA9ABsAAAACAAUAAAA9ABwAAAAFAAoAAAA9AB0AAAAFAAkAAAA9AB4AAAAFAAoAAAA9AB8AAAAIAAoAAAA9ACAAAAABAAMAAAA9ACEAAAABAAQAAAA9ACIAAAABAAQAAAA9ACMAAAABAAUAAAA9ACQAAAAIAAkAAAA9ACUAAAAFAAkAAAA9ACYAAAAHAAkAAAA9ACcAAAAAAAAAAAA9ACgAAAAHAAkAAAA9ACkAAAAHAAoAAAA9ACoAAAAIAAkAAAA9ACsAAAAAAAAAAAA9ACwAAAAFAAoAAAA9AC0AAAAIAAkAAAA9AC4AAAAHAAkAAAA9AC8AAAAFAAoAAAA9ADAAAAAIAAoAAAA9ADEAAAAIAAoAAAA9ADIAAAAAAAAAAAA9ADMAAAAHAAoAAAA+APD/AAABAAsAAAA+APH/AAAAAAAAAAA+APL/AAAAAAAAAAA+APP/AAAFAAoAAAA+APT/AAAFAAkAAAA+APX/AAAAAAAAAAA+APb/AAAAAAAAAAA+APf/AAAFAAoAAAA+APj/AAAHAAoAAAA+APn/AAAIAAkAAAA+APr/AAAHAAkAAAA+APv/AAAFAAoAAAA+APz/AAAIAAoAAAA+AP3/AAAHAAkAAAA+AP7/AAAIAAoAAAA+AP//AAAAAAAAAAA+AAAAAAAHAAoAAAA+AAEAAAAFAAkAAAA+AAIAAAAIAAkAAAA+AAMAAAAHAAoAAAA+AAQAAAAFAAkAAAA+AAUAAAAIAAkAAAA+AAYAAAAHAAoAAAA+AAcAAAAFAAoAAAA+AAgAAAAIAAkAAAA+AAkAAAAAAAAAAAA+AAoAAAAIAAoAAAA+AAsAAAAAAAAAAAA+AAwAAAAAAAAAAAA+AA0AAAAHAAoAAAA+AA4AAAAHAAkAAAA+AA8AAAAFAAoAAAA+ABAAAAAAAAAAAAA+ABEAAAAFAAkAAAA+ABIAAAAAAAAAAAA+ABMAAAAHAAoAAAA+ABQAAAAAAAAAAAA+ABUAAAAAAAMAAAA+ABYAAAABAAcAAAA+ABcAAAABAAQAAAA+ABgAAAABAAQAAAA+ABkAAAAAAAYAAAA+ABoAAAACAAUAAAA+ABsAAAAHAAkAAAA+ABwAAAAHAAoAAAA+AB0AAAAHAAoAAAA+AB4AAAAIAAoAAAA+AB8AAAAFAAkAAAA+ACAAAAABAAMAAAA+ACEAAAABAAQAAAA+ACIAAAABAAQAAAA+ACMAAAABAAUAAAA+ACQAAAAHAAoAAAA+ACUAAAAFAAkAAAA+ACYAAAAHAAoAAAA+ACcAAAAHAAkAAAA+ACgAAAAIAAkAAAA+ACkAAAAIAAkAAAA+ACoAAAAIAAoAAAA+ACsAAAAFAAoAAAA+ACwAAAAFAAkAAAA+AC0AAAAFAAoAAAA+AC4AAAAFAAoAAAA+AC8AAAAHAAkAAAA+ADAAAAAFAAkAAAA+ADEAAAAHAAkAAAA+ADIAAAAIAAkAAAA+ADMAAAAAAAAAAAA/APD/AAABAAsAAAA/APH/AAAFAAkAAAA/APL/AAAIAAkAAAA/APP/AAAIAAkAAAA/APT/AAAHAAoAAAA/APX/AAAFAAoAAAA/APb/AAAHAAkAAAA/APf/AAAHAAoAAAA/APj/AAAFAAkAAAA/APn/AAAHAAkAAAA/APr/AAAFAAkAAAA/APv/AAAFAAoAAAA/APz/AAAIAAoAAAA/AP3/AAAFAAkAAAA/AP7/AAAAAAAAAAA/AP//AAAIAAkAAAA/AAAAAAAFAAoAAAA/AAEAAAAHAAkAAAA/AAIAAAAFAAkAAAA/AAMAAAAAAAAAAAA/AAQAAAAFAAoAAAA/AAUAAAAFAAkAAAA/AAYAAAAAAAAAAAA/AAcAAAAAAAAAAAA/AAgAAAAIAAoAAAA/AAkAAAAHAAoAAAA/AAoAAAAHAAoAAAA/AAsAAAAHAAkAAAA/AAwAAAAIAAoAAAA/AA0AAAAFAAkAAAA/AA4AAAAHAAkAAAA/AA8AAAAFAAkAAAA/ABAAAAAHAAoAAAA/ABEAAAAIAAkAAAA/ABIAAAAIAAoAAAA/ABMAAAAHAAkAAAA/ABQAAAAIAAkAAAA/ABUAAAABAAMAAAA/ABYAAAABAAQAAAA/ABcAAAABAAQAAAA/ABgAAAAAAAYAAAA/ABkAAAACAAUAAAA/ABoAAAAFAAoAAAA/ABsAAAAIAAoAAAA/ABwAAAAIAAoAAAA/AB0AAAAHAAkAAAA/AB4AAAAAAAAAAAA/AB8AAAAIAAkAAAA/ACAAAAABAAMAAAA/ACEAAAABAAQAAAA/ACIAAAABAAQAAAA/ACMAAAABAAUAAAA/ACQAAAAIAAkAAAA/ACUAAAAIAAoAAAA/ACYAAAAAAAAAAAA/ACcAAAAIAAkAAAA/ACgAAAAIAAoAAAA/ACkAAAAIAAoAAAA/ACoAAAAIAAoAAAA/ACsAAAAHAAkAAAA/ACwAAAAIAAoAAAA/AC0AAAAHAAoAAAA/AC4AAAAHAAkAAAA/AC8AAAAFAAkAAAA/ADAAAAAFAAoAAAA/ADEAAAAHAAoAAAA/ADIAAAAFAAkAAAA/ADMAAAAFAAkAAABAAPD/AAABAAsAAABAAPH/AAAIAAkAAABAAPL/AAAFAAkAAABAAPP/AAAHAAkAAABAAPT/AAAAAAAAAABAAPX/AAAFAAkAAABAAPb/AAAIAAoAAABAAPf/AAAIAAoAAABAAPj/AAAHAAkAAABAAPn/AAAAAAAAAABAAPr/AAAFAAkAAABAAPv/AAAIAAkAAABAAPz/AAAHAAkAAABAAP3/AAAHAAoAAABAAP7/AAAAAAAAAABAAP//AAAIAAkAAABAAAAAAAAFAAoAAABAAAEAAAAIAAoAAABAAAIAAAAAAAAAAABAAAMAAAAHAAkAAABAAAQAAAAIAAoAAABAAAUAAAAAAAAAAABAAAYAAAAFAAoAAABAAAcAAAAIAAkAAABAAAgAAAAHAAoAAABAAAkAAAAAAAAAAABAAAoAAAAHAAkAAABAAAsAAAAAAAAAAABAAAwAAAAHAAkAAABAAA0AAAAIAAkAAABAAA4AAAAIAAoAAABAAA8AAAAFAAkAAABAABAAAAAHAAkAAABAABEAAAAIAAoAAABAABIAAAAHAAkAAABAABMAAAAIAAkAAABAABQAAAAAAAMAAABAABUAAAABAAcAAABAABYAAAABAAQAAABAABcAAAABAAQAAABAABgAAAABAAUAAABAABkAAAAHAAoAAABAABoAAAAIAAoAAABAABsAAAAFAAkAAABAABwAAAAAAAAAAABAAB0AAAAIAAoAAABAAB4AAAAAAAAAAABAAB8AAAAHAAkAAABAACAAAAABAAMAAABAACEAAAABAAQAAABAACIAAAABAAQAAABAACMAAAABAAUAAABAACQAAAAHAAkAAABAACUAAAAIAAoAAABAACYAAAAHAAoAAABAACcAAAAHAAoAAABAACgAAAAIAAkAAABAACkAAAAFAAoAAABAACoAAAAIAAkAAABAACsAAAAIAAoAAABAACwAAAAIAAkAAABAAC0AAAAIAAoAAABAAC4AAAAAAAAAAABAAC8AAAAFAAkAAABAADAAAAAHAAoAAABAADEAAAAHAAoAAABAADIAAAAFAAkAAABAADMAAAAFAAoAAABBAPD/AAABAAsAAABBAPH/AAAFAAoAAABBAPL/AAAIAAoAAABBAPP/AAAHAAkAAABBAPT/AAAIAAkAAABBAPX/AAAAAAAAAABBAPb/AAAIAAkAAABBAPf/AAAAAAAAAABBAPj/AAAAAAAAAABBAPn/AAAFAAkAAABBAPr/AAAFAAkAAABBAPv/AAAFAAoAAABBAPz/AAAIAAoAAABBAP3/AAAIAAoAAABBAP7/AAAIAAoAAABBAP//AAAFAAoAAABBAAAAAAAFAAkAAABBAAEAAAAHAAkAAABBAAIAAAAFAAkAAABBAAMAAAAHAAkAAABBAAQAAAAIAAkAAABBAAUAAAAIAAoAAABBAAYAAAAHAAoAAABBAAcAAAAHAAkAAABBAAgAAAAFAAkAAABBAAkAAAAFAAoAAABBAAoAAAAIAAkAAABBAAsAAAAFAAoAAABBAAwAAAAHAAoAAABBAA0AAAAHAAoAAABBAA4AAAAFAAkAAABBAA8AAAAFAAoAAABBABAAAAAFAAkAAABBABEAAAAHAAoAAABBABIAAAAFAAkAAABBABMAAAAAAAMAAABBABQAAAABAAcAAABBABUAAAABAAQAAABBABYAAAABAAQAAABBABcAAAAAAAYAAABBABgAAAACAAUAAABBABkAAAAHAAoAAABBABoAAAAHAAkAAABBABsAAAAFAAoAAABBABwAAAAIAAkAAABBAB0AAAAIAAoAAABBAB4AAAAAAAAAAABBAB8AAAAHAAkAAABBACAAAAABAAMAAABBACEAAAABAAQAAABBACIAAAABAAQAAABBACMAAAABAAUAAABBACQAAAAFAAkAAABBACUAAAAFAAoAAABBACYAAAAAAAAAAABBACcAAAAIAAkAAABBACgAAAAAAAAAAABBACkAAAAHAAkAAABBACoAAAAFAAoAAABBACsAAAAAAAAAAABBACwAAAAFAAoAAABBAC0AAAAAAAAAAABBAC4AAAAIAAkAAABBAC8AAAAFAAkAAABBADAAAAAAAAAAAABBADEAAAAHAAoAAABBADIAAAAAAAAAAABBADMAAAAIAAkAAABCAPD/AAACAAsAAABCAPH/AAAAAAQAAABCAPL/AAAAAAUAAABCAPP/AAAIAAoAAABCAPT/AAAIAAkAAABCAPX/AAAHAAoAAABCAPb/AAAFAAoAAABCAPf/AAAIAAoAAABCAPj/AAAFAAoAAABCAPn/AAAAAAAAAABCAPr/AAAFAAoAAABCAPv/AAAHAAkAAABCAPz/AAAFAAoAAABCAP3/AAAHAAkAAABCAP7/AAAHAAkAAABCAP//AAAAAAAAAABCAAAAAAAFAAkAAABCAAEAAAAAAAAAAABCAAIAAAAAAAAAAABCAAMAAAAFAAkAAABCAAQAAAAIAAoAAABCAAUAAAAFAAkAAABCAAYAAAAFAAoAAABCAAcAAAAHAAkAAABCAAgAAAAFAAoAAABCAAkAAAAFAAkAAABCAAoAAAAHAAkAAABCAAsAAAAFAAoAAABCAAwAAAAIAAoAAABCAA0AAAAIAAoAAABCAA4AAAAIAAkAAABCAA8AAAAIAAkAAABCABAAAAAHAAkAAABCABEAAAAIAAoAAABCABIAAAAAAAMAAABCABMAAAABAAcAAABCABQAAAABAAQAAABCABUAAAABAAQAAABCABYAAAAAAAYAAABCABcAAAACAAUAAABCABgAAAAIAAoAAABCABkAAAAFAAkAAABCABoAAAAFAAkAAABCABsAAAAIAAoAAABCABwAAAAHAAkAAABCAB0AAAAHAAoAAABCAB4AAAAFAAkAAABCAB8AAAAAAAAAAABCACAAAAABAAMAAABCACEAAAABAAQAAABCACIAAAABAAQAAABCACMAAAABAAUAAABCACQAAAAHAAoAAABCACUAAAAFAAkAAABCACYAAAAHAAoAAABCACcAAAAAAAAAAABCACgAAAAIAAkAAABCACkAAAAIAAkAAABCACoAAAAHAAkAAABCACsAAAAFAAkAAABCACwAAAAIAAkAAABCAC0AAAAHAAkAAABCAC4AAAAFAAoAAABCAC8AAAAHAAoAAABCADAAAAAAAAAAAABCADEAAAAIAAoAAABCADIAAAAFAAkAAABCADMAAAAIAAkAAABDAPD/AAARAAcAAABDAPH/AAABAAQAAABDAPL/AAABAAYAAABDAPP/AAAAAAUAAABDAPT/AAAFAAkAAABDAPX/AAAIAAkAAABDAPb/AAAFAAkAAABDAPf/AAAIAAkAAABDAPj/AAAFAAkAAABDAPn/AAAAAAAAAABDAPr/AAAHAAkAAABDAPv/AAAHAAkAAABDAPz/AAAHAAkAAABDAP3/AAAFAAkAAABDAP7/AAAHAAkAAABDAP//AAAIAAkAAABDAAAAAAAIAAoAAABDAAEAAAAAAAAAAABDAAIAAAAIAAoAAABDAAMAAAAIAAkAAABDAAQAAAAHAAoAAABDAAUAAAAIAAkAAABDAAYAAAAHAAkAAABDAAcAAAAFAAkAAABDAAgAAAAHAAkAAABDAAkAAAAIAAoAAABDAAoAAAAHAAoAAABDAAsAAAAFAAkAAABDAAwAAAAFAAoAAABDAA0AAAAAAAAAAABDAA4AAAAFAAkAAABDAA8AAAAIAAoAAABDABAAAAAHAAoAAABDABEAAAAAAAMAAABDABIAAAABAAcAAABDABMAAAABAAQAAABDABQAAAABAAQAAABDABUAAAAAAAYAAABDABYAAAACAAUAAABDABcAAAAIAAkAAABDABgAAAAHAAoAAABDABkAAAAAAAAAAABDABoAAAAIAAkAAABDABsAAAAAAAAAAABDABwAAAAIAAoAAABDAB0AAAAHAAkAAABDAB4AAAAFAAoAAABDAB8AAAAAAAAAAABDACAAAAABAAMAAABDACEAAAABAAQAAABDACIAAAABAAQAAABDACMAAAABAAUAAABDACQAAAAFAAkAAABDACUAAAAHAAkAAABDACYAAAAFAAoAAABDACcAAAAFAAoAAABDACgAAAAIAAkAAABDACkAAAAHAAoAAABDACoAAAAIAAoAAABDACsAAAAHAAoAAABDACwAAAAIAAoAAABDAC0AAAAAAAAAAABDAC4AAAAFAAoAAABDAC8AAAAIAAkAAABDADAAAAAAAAAAAABDADEAAAAHAAkAAABDADIAAAAIAAkAAABDADMAAAAFAAoAAABEAPD/AAABAAQAAABEAPH/AAABAAQAAABEAPL/AAABAAQAAABEAPP/AAABAAYAAABEAPT/AAAAAAQAAABEAPX/AAAAAAUAAABEAPb/AAAFAAoAAABEAPf/AAAHAAkAAABEAPj/AAAIAAoAAABEAPn/AAAIAAoAAABEAPr/AAAAAAAAAABEAPv/AAAIAAkAAABEAPz/AAAFAAoAAABEAP3/AAAAAAAAAABEAP7/AAAIAAkAAABEAP//AAAFAAoAAABEAAAAAAAIAAoAAABEAAEAAAAIAAoAAABEAAIAAAAFAAkAAABEAAMAAAAIAAkAAABEAAQAAAAAAAAAAABEAAUAAAAHAAkAAABEAAYAAAAIAAkAAABEAAcAAAAHAAoAAABEAAgAAAAFAAoAAABEAAkAAAAIAAkAAABEAAoAAAAFAAoAAABEAAsAAAAAAAAAAABEAAwAAAAAAAAAAABEAA0AAAAFAAkAAABEAA4AAAAHAAoAAABEAA8AAAAAAAMAAABEABAAAAAAAAQAAABEABEAAAABAAcAAABEABIAAAABAAQAAABEABMAAAABAAQAAABEABQAAAAAAAYAAABEABUAAAACAAUAAABEABYAAAAFAAkAAABEABcAAAAAAAAAAABEABgAAAAAAAAAAABEABkAAAAFAAoAAABEABoAAAAHAAkAAABEABsAAAAFAAkAAABEABwAAAAHAAkAAABEAB0AAAAIAAoAAABEAB4AAAAHAAoAAABEAB8AAAAHAAkAAABEACAAAAABAAMAAABEACEAAAABAAQAAABEACIAAAABAAQAAABEACMAAAABAAUAAABEACQAAAAIAAkAAABEACUAAAAFAAoAAABEACYAAAAIAAkAAABEACcAAAAAAAAAAABEACgAAAAFAAoAAABEACkAAAAFAAkAAABEACoAAAAAAAAAAABEACsAAAAHAAoAAABEACwAAAAIAAkAAABEAC0AAAAIAAoAAABEAC4AAAAAAAAAAABEAC8AAAAIAAkAAABEADAAAAAIAAkAAABEADEAAAAFAAkAAABEADIAAAAFAAkAAABEADMAAAAHAAoAAABFAPD/AAABAAQAAABFAPH/AAABAAQAAABFAPL/AAABAAQAAABFAPP/AAABAAQAAABFAPT/AAABAAQAAABFAPX/AAABAAYAAABFAPb/AAAAAAUAAABFAPf/AAAIAAoAAABFAPj/AAAAAAAAAABFAPn/AAAHAAoAAABFAPr/AAAAAAAAAABFAPv/AAAHAAkAAABFAPz/AAAIAAkAAABFAP3/AAAIAAoAAABFAP7/AAAFAAkAAABFAP//AAAAAAAAAABFAAAAAAAHAAkAAABFAAEAAAAFAAkAAABFAAIAAAAIAAoAAABFAAMAAAAAAAAAAABFAAQAAAAFAAkAAABFAAUAAAAFAAoAAABFAAYAAAAFAAoAAABFAAcAAAAFAAoAAABFAAgAAAAIAAkAAABFAAkAAAAAAAAAAABFAAoAAAAHAAkAAABFAAsAAAAIAAoAAABFAAwAAAAIAAkAAABFAA0AAAAHAAoAAABFAA4AAAAAAAMAAABFAA8AAAABAAcAAABFABAAAAABAAQAAABFABEAAAABAAQAAABFABIAAAABAAQAAABFABMAAAABAAQAAABFABQAAAABAAUAAABFABUAAAAFAAkAAABFABYAAAAFAAoAAABFABcAAAAIAAkAAABFABgAAAAAAAAAAABFABkAAAAHAAkAAABFABoAAAAIAAkAAABFABsAAAAAAAAAAABFABwAAAAFAAkAAABFAB0AAAAAAAAAAABFAB4AAAAAAAAAAABFAB8AAAAAAAAAAABFACAAAAABAAMAAABFACEAAAABAAQAAABFACIAAAABAAQAAABFACMAAAABAAUAAABFACQAAAAIAAkAAABFACUAAAAHAAoAAABFACYAAAAHAAoAAABFACcAAAAIAAkAAABFACgAAAAHAAoAAABFACkAAAAHAAoAAABFACoAAAAAAAAAAABFACsAAAAFAAkAAABFACwAAAAFAAkAAABFAC0AAAAAAAAAAABFAC4AAAAFAAoAAABFAC8AAAAHAAoAAABFADAAAAAFAAoAAABFADEAAAAFAAkAAABFADIAAAAAAAAAAABFADMAAAAHAAkAAABGAPD/AAAAAAsAAABGAPH/AAACAAQAAABGAPL/AAAAAAcAAABGAPP/AAABAAQAAABGAPT/AAABAAQAAABGAPX/AAABAAQAAABGAPb/AAABAAYAAABGAPf/AAAAAAUAAABGAPj/AAAHAAoAAABGAPn/AAAFAAoAAABGAPr/AAAIAAoAAABGAPv/AAAHAAkAAABGAPz/AAAHAAoAAABGAP3/AAAFAAkAAABGAP7/AAAIAAoAAABGAP//AAAAAAAAAABGAAAAAAAHAAoAAABGAAEAAAAFAAkAAABGAAIAAAAAAAAAAABGAAMAAAAFAAoAAABGAAQAAAAIAAoAAABGAAUAAAAFAAoAAABGAAYAAAAAAAAAAABGAAcAAAAAAAAAAABGAAgAAAAIAAoAAABGAAkAAAAIAAkAAABGAAoAAAAIAAkAAABGAAsAAAAAAAAAAABGAAwAAAAAAAAAAABGAA0AAAAAAAMAAABGAA4AAAABAAcAAABGAA8AAAABAAQAAABGABAAAAABAAQAAABGABEAAAABAAQAAABGABIAAAABAAQAAABGABMAAAAAAAYAAABGABQAAAACAAUAAABGABUAAAAHAAkAAABGABYAAAAHAAoAAABGABcAAAAFAAoAAABGABgAAAAAAAAAAABGABkAAAAAAAAAAABGABoAAAAIAAkAAABGABsAAAAIAAkAAABGABwAAAAHAAoAAABGAB0AAAAHAAkAAABGAB4AAAAAAAAAAABGAB8AAAAFAAkAAABGACAAAAABAAMAAABGACEAAAABAAQAAABGACIAAAABAAQAAABGACMAAAABAAUAAABGACQAAAAIAAkAAABGACUAAAAAAAAAAABGACYAAAAAAAAAAABGACcAAAAFAAkAAABGACgAAAAFAAoAAABGACkAAAAIAAkAAABGACoAAAAFAAoAAABGACsAAAAIAAoAAABGACwAAAAFAAoAAABGAC0AAAAIAAoAAABGAC4AAAAFAAkAAABGAC8AAAAFAAkAAABGADAAAAAAAAAAAABGADEAAAAIAAoAAABGADIAAAAIAAkAAABGADMAAAAIAAkAAABHAPD/AAABAAsAAABHAPH/AAAAAAAAAABHAPL/AAACAAMAAABHAPP/AAACAAQAAABHAPT/AAAAAAcAAABHAPX/AAABAAQAAABHAPb/AAABAAQAAABHAPf/AAABAAYAAABHAPj/AAAAAAUAAABHAPn/AAAIAAoAAABHAPr/AAAFAAkAAABHAPv/AAAHAAoAAABHAPz/AAAIAAkAAABHAP3/AAAFAAkAAABHAP7/AAAIAAkAAABHAP//AAAFAAkAAABHAAAAAAAAAAAAAABHAAEAAAAIAAkAAABHAAIAAAAHAAoAAABHAAMAAAAFAAkAAABHAAQAAAAIAAkAAABHAAUAAAAAAAAAAABHAAYAAAAIAAkAAABHAAcAAAAHAAoAAABHAAgAAAAFAAkAAABHAAkAAAAFAAkAAABHAAoAAAAIAAoAAABHAAsAAAAIAAkAAABHAAwAAAAAAAMAAABHAA0AAAABAAcAAABHAA4AAAABAAQAAABHAA8AAAABAAQAAABHABAAAAABAAQAAABHABEAAAAAAAYAAABHABIAAAACAAQAAABHABMAAAACAAUAAABHABQAAAAIAAoAAABHABUAAAAHAAkAAABHABYAAAAFAAkAAABHABcAAAAIAAoAAABHABgAAAAIAAoAAABHABkAAAAHAAkAAABHABoAAAAHAAoAAABHABsAAAAFAAoAAABHABwAAAAHAAoAAABHAB0AAAAHAAoAAABHAB4AAAAHAAoAAABHAB8AAAAHAAkAAABHACAAAAABAAMAAABHACEAAAABAAQAAABHACIAAAABAAQAAABHACMAAAABAAUAAABHACQAAAAIAAkAAABHACUAAAAFAAkAAABHACYAAAAFAAoAAABHACcAAAAHAAoAAABHACgAAAAFAAoAAABHACkAAAAAAAAAAABHACoAAAAAAAAAAABHACsAAAAHAAoAAABHACwAAAAIAAkAAABHAC0AAAAFAAoAAABHAC4AAAAFAAkAAABHAC8AAAAHAAkAAABHADAAAAAIAAkAAABHADEAAAAHAAkAAABHADIAAAAFAAoAAABHADMAAAAHAAkAAABIAPD/AAABAAsAAABIAPH/AAAIAAkAAABIAPL/AAAIAAoAAABIAPP/AAAAAAAAAABIAPT/AAACAAMAAABIAPX/AAAAAAcAAABIAPb/AAABAAQAAABIAPf/AAABAAQAAABIAPj/AAABAAYAAABIAPn/AAAAAAQAAABIAPr/AAAAAAUAAABIAPv/AAAHAAkAAABIAPz/AAAHAAkAAABIAP3/AAAHAAoAAABIAP7/AAAFAAkAAABIAP//AAAFAAoAAABIAAAAAAAHAAkAAABIAAEAAAAHAAkAAABIAAIAAAAIAAkAAABIAAMAAAAIAAoAAABIAAQAAAAHAAkAAABIAAUAAAAFAAoAAABIAAYAAAAIAAkAAABIAAcAAAAIAAoAAABIAAgAAAAAAAAAAABIAAkAAAAHAAkAAABIAAoAAAAAAAMAAABIAAsAAAAAAAQAAABIAAwAAAABAAcAAABIAA0AAAABAAQAAABIAA4AAAABAAQAAABIAA8AAAABAAQAAABIABAAAAAAAAYAAABIABEAAAACAAUAAABIABIAAAAHAAoAAABIABMAAAAIAAkAAABIABQAAAAFAAkAAABIABUAAAAIAAkAAABIABYAAAAHAAkAAABIABcAAAAFAAkAAABIABgAAAAIAAkAAABIABkAAAAFAAkAAABIABoAAAAIAAoAAABIABsAAAAFAAoAAABIABwAAAAFAAoAAABIAB0AAAAAAAAAAABIAB4AAAAIAAoAAABIAB8AAAAIAAoAAABIACAAAAABAAMAAABIACEAAAABAAQAAABIACIAAAABAAQAAABIACMAAAABAAUAAABIACQAAAAHAAkAAABIACUAAAAHAAoAAABIACYAAAAIAAkAAABIACcAAAAHAAoAAABIACgAAAAHAAkAAABIACkAAAAHAAkAAABIACoAAAAFAAkAAABIACsAAAAIAAkAAABIACwAAAAIAAkAAABIAC0AAAAHAAkAAABIAC4AAAAIAAoAAABIAC8AAAAFAAkAAABIADAAAAAFAAoAAABIADEAAAAHAAkAAABIADIAAAAAAAAAAABIADMAAAAHAAoAAABJAPD/AAABAAsAAABJAPH/AAAFAAoAAABJAPL/AAAIAAkAAABJAPP/AAAFAAoAAABJAPT/AAAIAAkAAABJAPX/AAABAAMAAABJAPb/AAABAAQAAABJAPf/AAABAAQAAABJAPj/AAABAAQAAABJAPn/AAABAAQAAABJAPr/AAABAAUAAABJAPv/AAAAAAAAAABJAPz/AAAIAAkAAABJAP3/AAAIAAkAAABJAP7/AAAFAAoAAABJAP//AAAHAAoAAABJAAAAAAAHAAkAAABJAAEAAAAFAAkAAABJAAIAAAAHAAkAAABJAAMAAAAAAAAAAABJAAQAAAAAAAAAAABJAAUAAAAHAAkAAABJAAYAAAAIAAoAAABJAAcAAAAFAAkAAABJAAgAAAAIAAkAAABJAAkAAAAAAAMAAABJAAoAAAABAAcAAABJAAsAAAABAAQAAABJAAwAAAABAAQAAABJAA0AAAABAAQAAABJAA4AAAABAAQAAABJAA8AAAAAAAYAAABJABAAAAACAAUAAABJABEAAAAFAAkAAABJABIAAAAIAAkAAABJABMAAAAIAAkAAABJABQAAAAHAAkAAABJABUAAAAFAAoAAABJABYAAAAFAAkAAABJABcAAAAAAAAAAABJABgAAAAAAAAAAABJABkAAAAHAAkAAABJABoAAAAAAAAAAABJABsAAAAHAAkAAABJABwAAAAFAAoAAABJAB0AAAAHAAoAAABJAB4AAAAHAAkAAABJAB8AAAAHAAoAAABJACAAAAABAAMAAABJACEAAAABAAQAAABJACIAAAABAAQAAABJACMAAAABAAUAAABJACQAAAAIAAkAAABJACUAAAAAAAAAAABJACYAAAAIAAkAAABJACcAAAAIAAkAAABJACgAAAAFAAkAAABJACkAAAAHAAkAAABJACoAAAAIAAkAAABJACsAAAAFAAoAAABJACwAAAAFAAoAAABJAC0AAAAAAAAAAABJAC4AAAAIAAoAAABJAC8AAAAFAAkAAABJADAAAAAHAAkAAABJADEAAAAFAAoAAABJADIAAAAHAAoAAABJADMAAAAIAAoAAABKAPD/AAABAAsAAABKAPH/AAAFAAoAAABKAPL/AAAIAAkAAABKAPP/AAAIAAkAAABKAPT/AAAIAAkAAABKAPX/AAACAAMAAABKAPb/AAAAAAcAAABKAPf/AAABAAQAAABKAPj/AAABAAQAAABKAPn/AAABAAQAAABKAPr/AAABAAYAAABKAPv/AAAAAAUAAABKAPz/AAAHAAkAAABKAP3/AAAIAAoAAABKAP7/AAAFAAoAAABKAP//AAAFAAoAAABKAAAAAAAFAAkAAABKAAEAAAAAAAAAAABKAAIAAAAHAAkAAABKAAMAAAAIAAkAAABKAAQAAAAFAAkAAABKAAUAAAAHAAoAAABKAAYAAAAAAAAAAABKAAcAAAAIAAoAAABKAAgAAAAAAAMAAABKAAkAAAABAAcAAABKAAoAAAABAAQAAABKAAsAAAABAAQAAABKAAwAAAABAAQAAABKAA0AAAABAAQAAABKAA4AAAAAAAYAAABKAA8AAAACAAUAAABKABAAAAAAAAAAAABKABEAAAAHAAoAAABKABIAAAAAAAAAAABKABMAAAAIAAoAAABKABQAAAAHAAoAAABKABUAAAAHAAkAAABKABYAAAAAAAAAAABKABcAAAAFAAkAAABKABgAAAAFAAkAAABKABkAAAAHAAoAAABKABoAAAAAAAAAAABKABsAAAAFAAkAAABKABwAAAAIAAkAAABKAB0AAAAFAAoAAABKAB4AAAAHAAoAAABKAB8AAAAHAAoAAABKACAAAAABAAMAAABKACEAAAABAAQAAABKACIAAAABAAQAAABKACMAAAABAAUAAABKACQAAAAFAAkAAABKACUAAAAFAAkAAABKACYAAAAAAAAAAABKACcAAAAFAAoAAABKACgAAAAFAAoAAABKACkAAAAHAAoAAABKACoAAAAFAAkAAABKACsAAAAHAAoAAABKACwAAAAIAAoAAABKAC0AAAAFAAoAAABKAC4AAAAFAAkAAABKAC8AAAAFAAkAAABKADAAAAAHAAoAAABKADEAAAAHAAkAAABKADIAAAAFAAoAAABKADMAAAAHAAoAAABLAPD/AAABAAsAAABLAPH/AAAHAAkAAABLAPL/AAAHAAoAAABLAPP/AAAHAAkAAABLAPT/AAAFAAkAAABLAPX/AAAFAAoAAABLAPb/AAACAAMAAABLAPf/AAAAAAcAAABLAPj/AAABAAQAAABLAPn/AAABAAQAAABLAPr/AAABAAQAAABLAPv/AAABAAYAAABLAPz/AAAAAAUAAABLAP3/AAAIAAkAAABLAP7/AAAFAAkAAABLAP//AAAHAAkAAABLAAAAAAAFAAkAAABLAAEAAAAAAAAAAABLAAIAAAAIAAoAAABLAAMAAAAIAAkAAABLAAQAAAAIAAkAAABLAAUAAAAAAAAAAABLAAYAAAAAAAMAAABLAAcAAAAAAAQAAABLAAgAAAABAAcAAABLAAkAAAABAAQAAABLAAoAAAABAAQAAABLAAsAAAABAAQAAABLAAwAAAABAAQAAABLAA0AAAAAAAYAAABLAA4AAAACAAUAAABLAA8AAAAFAAoAAABLABAAAAAHAAkAAABLABEAAAAHAAoAAABLABIAAAAHAAkAAABLABMAAAAHAAkAAABLABQAAAAAAAAAAABLABUAAAAHAAoAAABLABYAAAAHAAkAAABLABcAAAAFAAkAAABLABgAAAAAAAAAAABLABkAAAAHAAoAAABLABoAAAAFAAkAAABLABsAAAAIAAoAAABLABwAAAAFAAkAAABLAB0AAAAAAAAAAABLAB4AAAAFAAoAAABLAB8AAAAIAAoAAABLACAAAAABAAMAAABLACEAAAABAAQAAABLACIAAAABAAQAAABLACMAAAABAAUAAABLACQAAAAFAAoAAABLACUAAAAHAAoAAABLACYAAAAFAAkAAABLACcAAAAHAAoAAABLACgAAAAHAAoAAABLACkAAAAIAAkAAABLACoAAAAFAAkAAABLACsAAAAHAAkAAABLACwAAAAAAAAAAABLAC0AAAAFAAoAAABLAC4AAAAAAAAAAABLAC8AAAAAAAAAAABLADAAAAAHAAkAAABLADEAAAAIAAoAAABLADIAAAAHAAoAAABLADMAAAAFAAoAAABMAPD/AAABAAsAAABMAPH/AAAIAAkAAABMAPL/AAAIAAkAAABMAPP/AAAFAAoAAABMAPT/AAAFAAoAAABMAPX/AAAHAAoAAABMAPb/AAAIAAoAAABMAPf/AAABAAMAAABMAPj/AAABAAQAAABMAPn/AAABAAQAAABMAPr/AAABAAQAAABMAPv/AAABAAQAAABMAPz/AAABAAYAAABMAP3/AAAAAAUAAABMAP7/AAAFAAoAAABMAP//AAAIAAkAAABMAAAAAAAHAAoAAABMAAEAAAAIAAkAAABMAAIAAAAFAAkAAABMAAMAAAAHAAkAAABMAAQAAAAAAAMAAABMAAUAAAAAAAQAAABMAAYAAAABAAcAAABMAAcAAAABAAQAAABMAAgAAAABAAQAAABMAAkAAAABAAQAAABMAAoAAAABAAQAAABMAAsAAAABAAQAAABMAAwAAAAAAAYAAABMAA0AAAACAAUAAABMAA4AAAAHAAoAAABMAA8AAAAHAAoAAABMABAAAAAIAAoAAABMABEAAAAHAAoAAABMABIAAAAIAAoAAABMABMAAAAIAAoAAABMABQAAAAFAAoAAABMABUAAAAFAAoAAABMABYAAAAFAAoAAABMABcAAAAHAAoAAABMABgAAAAFAAkAAABMABkAAAAHAAoAAABMABoAAAAIAAkAAABMABsAAAAIAAkAAABMABwAAAAIAAkAAABMAB0AAAAHAAoAAABMAB4AAAAIAAkAAABMAB8AAAAAAAAAAABMACAAAAABAAMAAABMACEAAAABAAQAAABMACIAAAABAAQAAABMACMAAAABAAUAAABMACQAAAAFAAoAAABMACUAAAAFAAkAAABMACYAAAAIAAkAAABMACcAAAAFAAoAAABMACgAAAAIAAoAAABMACkAAAAIAAoAAABMACoAAAAHAAoAAABMACsAAAAFAAkAAABMACwAAAAFAAoAAABMAC0AAAAHAAoAAABMAC4AAAAFAAoAAABMAC8AAAAIAAkAAABMADAAAAAFAAoAAABMADEAAAAHAAoAAABMADIAAAAIAAoAAABMADMAAAAHAAoAAABNAPD/AAABAAsAAABNAPH/AAAIAAoAAABNAPL/AAAFAAkAAABNAPP/AAAAAAAAAABNAPT/AAAFAAoAAABNAPX/AAAFAAkAAABNAPb/AAAHAAoAAABNAPf/AAACAAMAAABNAPj/AAAAAAcAAABNAPn/AAABAAQAAABNAPr/AAABAAQAAABNAPv/AAABAAQAAABNAPz/AAABAAQAAABNAP3/AAABAAUAAABNAP7/AAAFAAkAAABNAP//AAAHAAoAAABNAAAAAAAFAAkAAABNAAEAAAAFAAoAAABNAAIAAAAHAAkAAABNAAMAAAAAAAMAAABNAAQAAAABAAcAAABNAAUAAAABAAQAAABNAAYAAAABAAQAAABNAAcAAAABAAQAAABNAAgAAAABAAQAAABNAAkAAAABAAQAAABNAAoAAAAAAAYAAABNAAsAAAACAAQAAABNAAwAAAACAAUAAABNAA0AAAAAAAAAAABNAA4AAAAHAAkAAABNAA8AAAAIAAkAAABNABAAAAAHAAoAAABNABEAAAAFAAoAAABNABIAAAAFAAoAAABNABMAAAAFAAoAAABNABQAAAAHAAkAAABNABUAAAAFAAkAAABNABYAAAAFAAkAAABNABcAAAAFAAoAAABNABgAAAAHAAoAAABNABkAAAAHAAkAAABNABoAAAAIAAkAAABNABsAAAAIAAoAAABNABwAAAAFAAkAAABNAB0AAAAAAAAAAABNAB4AAAAFAAkAAABNAB8AAAAHAAoAAABNACAAAAABAAMAAABNACEAAAABAAQAAABNACIAAAABAAQAAABNACMAAAABAAUAAABNACQAAAAFAAoAAABNACUAAAAHAAkAAABNACYAAAAFAAoAAABNACcAAAAHAAkAAABNACgAAAAHAAkAAABNACkAAAAFAAoAAABNACoAAAAHAAkAAABNACsAAAAHAAkAAABNACwAAAAHAAoAAABNAC0AAAAFAAoAAABNAC4AAAAHAAoAAABNAC8AAAAIAAkAAABNADAAAAAFAAkAAABNADEAAAAFAAoAAABNADIAAAAHAAkAAABNADMAAAAFAAoAAABOAPD/AAABAAsAAABOAPH/AAAIAAoAAABOAPL/AAAIAAkAAABOAPP/AAAFAAkAAABOAPT/AAAFAAoAAABOAPX/AAAIAAoAAABOAPb/AAAFAAkAAABOAPf/AAAFAAoAAABOAPj/AAACAAMAAABOAPn/AAAAAAcAAABOAPr/AAABAAQAAABOAPv/AAABAAQAAABOAPz/AAABAAQAAABOAP3/AAABAAYAAABOAP7/AAAAAAQAAABOAP//AAAAAAQAAABOAAAAAAAAAAQAAABOAAEAAAAAAAQAAABOAAIAAAAAAAQAAABOAAMAAAABAAcAAABOAAQAAAABAAQAAABOAAUAAAABAAQAAABOAAYAAAABAAQAAABOAAcAAAABAAQAAABOAAgAAAAAAAYAAABOAAkAAAACAAQAAABOAAoAAAACAAUAAABOAAsAAAAIAAoAAABOAAwAAAAFAAkAAABOAA0AAAAAAAAAAABOAA4AAAAIAAoAAABOAA8AAAAFAAoAAABOABAAAAAHAAkAAABOABEAAAAHAAoAAABOABIAAAAHAAoAAABOABMAAAAFAAoAAABOABQAAAAIAAoAAABOABUAAAAFAAoAAABOABYAAAAAAAAAAABOABcAAAAAAAAAAABOABgAAAAHAAkAAABOABkAAAAIAAoAAABOABoAAAAFAAoAAABOABsAAAAIAAkAAABOABwAAAAAAAAAAABOAB0AAAAAAAAAAABOAB4AAAAHAAkAAABOAB8AAAAIAAoAAABOACAAAAABAAMAAABOACEAAAABAAQAAABOACMAAAABAAUAAABOACQAAAAIAAkAAABOACUAAAAFAAoAAABOACYAAAAFAAoAAABOACcAAAAHAAoAAABOACgAAAAIAAoAAABOACkAAAAIAAkAAABOACoAAAAIAAkAAABOACsAAAAIAAoAAABOACwAAAAAAAAAAABOAC0AAAAIAAoAAABOAC4AAAAAAAAAAABOAC8AAAAIAAkAAABOADAAAAAFAAoAAABOADEAAAAHAAoAAABOADIAAAAFAAoAAABOADMAAAAAAAAAAABPAPD/AAABAAsAAABPAPH/AAAHAAoAAABPAPL/AAAAAAAAAABPAPP/AAAFAAoAAABPAPT/AAAHAAkAAABPAPX/AAAHAAoAAABPAPb/AAAFAAkAAABPAPf/AAAIAAkAAABPAPj/AAAIAAkAAABPAPn/AAACAAMAAABPAPr/AAACAAQAAABPAPv/AAAAAAcAAABPAPz/AAABAAQAAABPAP3/AAABAAQAAABPAP7/AAABAAQAAABPAP//AAABAAQAAABPAAAAAAABAAQAAABPAAEAAAABAAQAAABPAAIAAAABAAQAAABPAAMAAAABAAQAAABPAAQAAAABAAQAAABPAAUAAAABAAQAAABPAAYAAAAAAAYAAABPAAcAAAACAAQAAABPAAgAAAACAAUAAABPAAkAAAAIAAoAAABPAAoAAAAHAAoAAABPAAsAAAAFAAkAAABPAAwAAAAIAAoAAABPAA0AAAAFAAoAAABPAA4AAAAIAAoAAABPAA8AAAAHAAkAAABPABAAAAAIAAkAAABPABEAAAAAAAAAAABPABIAAAAHAAkAAABPABMAAAAFAAkAAABPABQAAAAFAAkAAABPABUAAAAFAAkAAABPABYAAAAIAAoAAABPABcAAAAFAAkAAABPABgAAAAHAAoAAABPABkAAAAFAAoAAABPABoAAAAHAAoAAABPABsAAAAFAAoAAABPABwAAAAHAAoAAABPAB0AAAAHAAoAAABPAB4AAAAIAAoAAABPAB8AAAAFAAoAAABPACAAAAABAAMAAABPACEAAAABAAQAAABPACQAAAAAAAoAAABPACUAAAAFAAkAAABPACYAAAAHAAkAAABPACcAAAAFAAkAAABPACgAAAAAAAAAAABPACkAAAAHAAkAAABPACoAAAAFAAoAAABPACsAAAAFAAoAAABPACwAAAAHAAkAAABPAC0AAAAIAAoAAABPAC4AAAAHAAoAAABPAC8AAAAFAAoAAABPADAAAAAFAAkAAABPADEAAAAAAAAAAABPADIAAAAHAAkAAABPADMAAAAAAAkAAABQAPD/AAABAAsAAABQAPH/AAAAAAkAAABQAPL/AAAAAAoAAABQAPP/AAAIAAkAAABQAPT/AAAIAAkAAABQAPX/AAAFAAoAAABQAPb/AAAFAAkAAABQAPf/AAAIAAoAAABQAPj/AAAIAAkAAABQAPn/AAAFAAkAAABQAPr/AAAAAAAAAABQAPv/AAABAAMAAABQAPz/AAABAAQAAABQAP3/AAAPAAYAAABQAP7/AAAPAAgAAABQAP//AAAPAAcAAABQAAAAAAAPAAYAAABQAAEAAAAPAAcAAABQAAIAAAAPAAcAAABQAAMAAAAAAAYAAABQAAQAAAACAAQAAABQAAUAAAACAAQAAABQAAYAAAACAAUAAABQAAcAAAAIAAoAAABQAAgAAAAHAAkAAABQAAkAAAAFAAoAAABQAAoAAAAFAAoAAABQAAsAAAAIAAoAAABQAAwAAAAHAAoAAABQAA0AAAAIAAkAAABQAA4AAAAFAAoAAABQAA8AAAAIAAoAAABQABAAAAAIAAkAAABQABEAAAAHAAkAAABQABIAAAAHAAkAAABQABMAAAAHAAoAAABQABQAAAAIAAkAAABQABUAAAAAAAkAAABQABYAAAAAAAkAAABQABcAAAAAAAkAAABQABgAAAAAAAkAAABQABkAAAAAAAkAAABQABoAAAAAAAkAAABQABsAAAAAAAkAAABQABwAAAAAAAkAAABQAB0AAAAAAAkAAABQAB4AAAAAAAkAAABQAB8AAAAAAAkAAABQACAAAAABAAMAAABQACEAAAABAAQAAABQACQAAAACAAsAAABQACUAAAAAAAkAAABQACYAAAAAAAoAAABQACcAAAAAAAkAAABQACgAAAAAAAoAAABQACkAAAAAAAkAAABQACoAAAAAAAoAAABQACsAAAAAAAkAAABQACwAAAAAAAoAAABQAC0AAAAAAAkAAABQAC4AAAAAAAoAAABQAC8AAAAAAAoAAABQADAAAAAAAAoAAABQADEAAAAAAAoAAABQADIAAAAAAAoAAABQADMAAAAAAAkAAAAMAAYAAAAHAAoAAAAOAAYAAAAFAAoAAAAYAPj/AAADAAcAAAApAPj/AAADAAcAAAApAPn/AAADAAcAAAAqAPj/AAADAAcAAAAqAPn/AAADAAcAAAAPAAAAAAABAAMAAAAPAAEAAAABAAQAAAAPAAIAAAABAAUAAAAQAAAAAAABAAMAAAAQAAEAAAABAAQAAAAQAAIAAAABAAUAAAARAAAAAAABAAMAAAARAAEAAAABAAQAAAARAAIAAAABAAUAAAAlAAoAAAADAAcAAAAkAAoAAAADAAcAAAAkAAsAAAADAAcAAAAlAAwAAAADAAcAAAAlAAsAAAAAAAEAAAAmAAsAAAAAAAEAAAAmAAwAAAAAAAEAAAAnAAsAAAAAAAEAAAAoAAsAAAADAAcAAAAnAAoAAAAAAAEAAAAmAAoAAAAAAAEAAAAWAAwAAAADAAkAAAAEAP7/AAAAAAAAAAAIAPv/AAAIAAkAAAAKAP3/AAAIAAkAAAAHAP7/AAAAAAAAAAAHAP3/AAAGAAAAAAAIAPz/AAAOAAAAAAAGAPz/AAAAAAAAAAAKAP7/AAAIAAkAAAAHAP//AAABAAQAAAAGAAMAAAALAAAAAABOACIAAAABAAQAAABPACIAAAABAAQAAABQACIAAAAPAAcAAABPACMAAAABAAUAAABQACMAAAACAAsAAAD+/wcAAAAIAAkAAAD8////AAARACEAAAAIABQAAAAIAAkAAAA=")
+tile_set = SubResource("TileSet_snsnx")
+
+[node name="DoorSceneManager" parent="." node_paths=PackedStringArray("player") instance=ExtResource("1_qqjfh")]
+position = Vector2(120, -15)
+player = NodePath("../Player")
+_to_scene = 1
+push_direction = 1
+
+[node name="DoorSceneManager2" parent="." node_paths=PackedStringArray("player") instance=ExtResource("1_qqjfh")]
+position = Vector2(232, 305)
+player = NodePath("../Player")
+_to_scene = 1
+push_direction = 1
+
+[node name="Player" parent="." instance=ExtResource("1_6iuf6")]
+z_index = 1
+motion_mode = 1
+
+[node name="Camera2D" type="Camera2D" parent="Player"]
+z_index = 4096
+zoom = Vector2(2, 2)
diff --git a/scripts/constants.gd b/scripts/constants.gd
new file mode 100644 (file)
index 0000000..0dfc733
--- /dev/null
@@ -0,0 +1,12 @@
+extends Node
+
+
+enum LEVELS_NAMES {
+       main_level,
+       house_template,
+}
+
+const LEVELS_PATHS: Array[String] = [
+       "res://scenes/main_level.tscn",
+       "res://scenes/house_template.tscn",
+]
diff --git a/scripts/door_scene_manager.gd b/scripts/door_scene_manager.gd
new file mode 100644 (file)
index 0000000..74bab1e
--- /dev/null
@@ -0,0 +1,92 @@
+extends Node2D
+
+
+enum DIRECTIONS { None, Up, Down, Left, Right }
+
+const scene_manager_options := {
+       "speed": 2,
+       "pattern": "circle",
+       "invert_on_leave": true,
+       "wait_time": .1,
+}
+
+
+## the player to check [br][br]
+## if [b]player[/b] is null will check any [CharacterBody2D]
+@export var player: CharacterBody2D
+
+## Current scene
+@export var current_scene: Constants.LEVELS_NAMES
+
+## Scene to go on area entered
+@export var _to_scene: Constants.LEVELS_NAMES
+
+## Will check if player moving in the selected direction before changing scenes [br][br]
+## [b]None[/b] means it will go on area entered without checking
+@export var push_direction: DIRECTIONS = DIRECTIONS.None
+
+
+var to_scene: String
+var on_area: bool = false
+var changing_scene: bool = false
+
+
+@onready var editor_icon = $editor_icon
+
+
+func _ready():
+       to_scene = Globals.get_scene_path(_to_scene)
+       
+       # check vars
+       assert(to_scene is String, "ERROR: You must give to_scene a valid value.")
+       assert(player is CharacterBody2D, "ERROR: You must set the player to use a door!")
+       
+       # remove editor icon
+       editor_icon.visible = false
+       editor_icon.queue_free()
+
+
+func _process(_delta):
+       if on_area:
+               # check push direction
+               if push_direction != DIRECTIONS.None:
+                       var velocity := Vector2(Input.get_axis("ui_left", "ui_right"), Input.get_axis("ui_up", "ui_down"))
+                       var direction: int
+                       if velocity.y > 0:
+                               direction = DIRECTIONS.Down
+                       elif velocity.y < 0:
+                               direction = DIRECTIONS.Up
+                       elif velocity.x > 0:
+                               direction = DIRECTIONS.Right
+                       elif velocity.x < 0:
+                               direction = DIRECTIONS.Left
+                       
+                       if push_direction != direction:
+                               return
+               
+               change_scene()
+
+
+func _on_area_2d_body_entered(body):
+       if body != player:
+               return
+       
+       on_area = true
+
+
+func _on_area_2d_body_exited(body):
+       if body != player:
+               return
+       
+       on_area = false
+
+
+func change_scene():
+       # check if scene is changing already
+       if changing_scene:
+               return
+       
+       changing_scene = true
+       
+       Globals.update_player_position(current_scene, player.position)
+       SceneManager.change_scene(to_scene, scene_manager_options)
diff --git a/scripts/globals.gd b/scripts/globals.gd
new file mode 100644 (file)
index 0000000..815bef8
--- /dev/null
@@ -0,0 +1,67 @@
+extends Node
+
+
+#region player position per level
+
+
+class _PlayerPositionAt:
+       var scene: int
+       var position: Vector2
+       
+       func _init(new_scene: Constants.LEVELS_NAMES, new_position: Vector2):
+               scene = new_scene
+               position = new_position
+
+
+var player_positions: Array[_PlayerPositionAt]
+var last_scene_updated: Constants.LEVELS_NAMES
+
+func update_player_position(scene: Constants.LEVELS_NAMES, new_position: Vector2):
+       last_scene_updated = scene
+       
+       for p_pos in player_positions:
+               if p_pos.scene == scene:
+                       p_pos.position = new_position
+                       return
+       
+       player_positions.append(_PlayerPositionAt.new(scene, new_position))
+
+
+func get_last_player_position_in_scene(scene: Constants.LEVELS_NAMES) -> Vector2:
+       for p_pos in player_positions:
+               if p_pos.scene == scene:
+                       return p_pos.position
+       
+       return Vector2()
+
+
+func get_last_scene_updated() -> Constants.LEVELS_NAMES:
+       return last_scene_updated
+
+
+#endregion
+
+#region current scene
+
+
+var current_scene: Constants.LEVELS_NAMES
+
+
+func set_current_scene(scene: Constants.LEVELS_NAMES):
+       current_scene = scene
+
+
+func get_current_scene() -> Constants.LEVELS_NAMES:
+       return current_scene
+
+
+#endregion
+
+#region utils
+
+
+func get_scene_path(scene_name: Constants.LEVELS_NAMES) -> String:
+       return Constants.LEVELS_PATHS[scene_name]
+
+
+#endregion
diff --git a/scripts/main_level.gd b/scripts/main_level.gd
new file mode 100644 (file)
index 0000000..1dc76a9
--- /dev/null
@@ -0,0 +1,11 @@
+extends Node2D
+
+const LEVEL_NAME = "main_level"
+
+
+@onready var player = $Player
+
+
+func _ready():
+       # get player poss
+       player.position = Globals.get_last_player_position_in_scene(Constants.LEVELS_NAMES[LEVEL_NAME] as Constants.LEVELS_NAMES)
diff --git a/scripts/pause_menu.gd b/scripts/pause_menu.gd
new file mode 100644 (file)
index 0000000..0e8206f
--- /dev/null
@@ -0,0 +1,20 @@
+extends Control
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+       pass # Replace with function body.
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+       pass
+
+
+func save_data():
+       SaveSystem.set_var("save", SaveResource.new())
+       SaveSystem.set_var("save:scene", get_scene())
+
+
+func get_scene() -> Constants.LEVELS_NAMES:
+       pass
diff --git a/scripts/player.gd b/scripts/player.gd
new file mode 100644 (file)
index 0000000..e353759
--- /dev/null
@@ -0,0 +1,47 @@
+extends CharacterBody2D
+
+
+const SPEED = 200.0
+
+
+@onready var animated_sprite_2d = $AnimatedSprite2D
+
+
+func _ready():
+       pass
+
+
+func _physics_process(_delta):
+       # Get the input direction and handle the movement/deceleration.
+       # As good practice, you should replace UI actions with custom gameplay actions.
+       var direction := Vector2(Input.get_axis("ui_left", "ui_right"), Input.get_axis("ui_up", "ui_down"))
+       
+       if direction:
+               velocity = direction.normalized() * SPEED
+       else:
+               velocity = Vector2(move_toward(velocity.x, 0, SPEED), move_toward(velocity.y, 0, SPEED))
+       
+       set_walk_animation()
+       move_and_slide()
+
+
+func set_walk_animation():
+       animated_sprite_2d.play()
+       
+       if velocity.y > 0:
+               animated_sprite_2d.animation = "walk_front"
+       elif velocity.y < 0:
+               animated_sprite_2d.animation = "walk_back"
+       elif velocity.x > 0:
+               animated_sprite_2d.animation = "walk_side"
+               animated_sprite_2d.flip_h = false
+       elif velocity.x < 0:
+               animated_sprite_2d.animation = "walk_side"
+               animated_sprite_2d.flip_h = true
+       else:
+               animated_sprite_2d.frame = 0
+               animated_sprite_2d.pause()
+
+func pick_item_animation():
+       animated_sprite_2d.animation = "pick_item"
+       # TODO: wait till confirmation // message dismiss