first commit
authorEduardo <[email protected]>
Fri, 26 Jan 2024 16:27:16 +0000 (17:27 +0100)
committerEduardo <[email protected]>
Fri, 26 Jan 2024 16:27:16 +0000 (17:27 +0100)
there are already shaders, camera and player movement

978 files changed:
.gitattributes [new file with mode: 0644]
.gitignore [new file with mode: 0644]
Camera3D.gd [new file with mode: 0644]
CharacterBody3D.gd [new file with mode: 0644]
Farola.glb [new file with mode: 0644]
Farola.glb.import [new file with mode: 0644]
addons/ColorPreview/ColorHelper.gd [new file with mode: 0644]
addons/ColorPreview/ColorPreview.gd [new file with mode: 0644]
addons/ColorPreview/LICENSE [new file with mode: 0644]
addons/ColorPreview/Picker.tscn [new file with mode: 0644]
addons/ColorPreview/plugin.cfg [new file with mode: 0644]
addons/anthonyec.camera_preview/GuiResizerTopLeft.svg [new file with mode: 0644]
addons/anthonyec.camera_preview/GuiResizerTopLeft.svg.import [new file with mode: 0644]
addons/anthonyec.camera_preview/GuiResizerTopRight.svg [new file with mode: 0644]
addons/anthonyec.camera_preview/GuiResizerTopRight.svg.import [new file with mode: 0644]
addons/anthonyec.camera_preview/Pin.svg [new file with mode: 0644]
addons/anthonyec.camera_preview/Pin.svg.import [new file with mode: 0644]
addons/anthonyec.camera_preview/drag_handle.gd [new file with mode: 0644]
addons/anthonyec.camera_preview/plugin.cfg [new file with mode: 0644]
addons/anthonyec.camera_preview/plugin.gd [new file with mode: 0644]
addons/anthonyec.camera_preview/preview.gd [new file with mode: 0644]
addons/anthonyec.camera_preview/preview.tscn [new file with mode: 0644]
addons/data/scripts/player/player_controller.gd [new file with mode: 0644]
addons/data/scripts/rotate_cube.gd [new file with mode: 0644]
addons/data/scripts/sprite_rotation/sprite_rotation.gd [new file with mode: 0644]
addons/data/sprites/test/test_back.png [new file with mode: 0644]
addons/data/sprites/test/test_back.png.import [new file with mode: 0644]
addons/data/sprites/test/test_back_left.png [new file with mode: 0644]
addons/data/sprites/test/test_back_left.png.import [new file with mode: 0644]
addons/data/sprites/test/test_back_right.png [new file with mode: 0644]
addons/data/sprites/test/test_back_right.png.import [new file with mode: 0644]
addons/data/sprites/test/test_front.png [new file with mode: 0644]
addons/data/sprites/test/test_front.png.import [new file with mode: 0644]
addons/data/sprites/test/test_front_left.png [new file with mode: 0644]
addons/data/sprites/test/test_front_left.png.import [new file with mode: 0644]
addons/data/sprites/test/test_front_right.png [new file with mode: 0644]
addons/data/sprites/test/test_front_right.png.import [new file with mode: 0644]
addons/data/sprites/test/test_left.png [new file with mode: 0644]
addons/data/sprites/test/test_left.png.import [new file with mode: 0644]
addons/data/sprites/test/test_right.png [new file with mode: 0644]
addons/data/sprites/test/test_right.png.import [new file with mode: 0644]
addons/data/textures/grass.png [new file with mode: 0644]
addons/data/textures/grass.png.import [new file with mode: 0644]
addons/debug_menu/LICENSE.md [new file with mode: 0644]
addons/debug_menu/debug_menu.gd [new file with mode: 0644]
addons/debug_menu/debug_menu.tscn [new file with mode: 0644]
addons/debug_menu/plugin.cfg [new file with mode: 0644]
addons/debug_menu/plugin.gd [new file with mode: 0644]
addons/ez_transitions/fonts/mini_pixel-7.ttf [new file with mode: 0644]
addons/ez_transitions/fonts/mini_pixel-7.ttf.import [new file with mode: 0644]
addons/ez_transitions/images/black_texture.png [new file with mode: 0644]
addons/ez_transitions/images/black_texture.png.import [new file with mode: 0644]
addons/ez_transitions/images/checkbox_checked.png [new file with mode: 0644]
addons/ez_transitions/images/checkbox_checked.png.import [new file with mode: 0644]
addons/ez_transitions/images/checkbox_unchecked.png [new file with mode: 0644]
addons/ez_transitions/images/checkbox_unchecked.png.import [new file with mode: 0644]
addons/ez_transitions/images/checkerboard_texture.png [new file with mode: 0644]
addons/ez_transitions/images/checkerboard_texture.png.import [new file with mode: 0644]
addons/ez_transitions/images/option_button_arrow.png [new file with mode: 0644]
addons/ez_transitions/images/option_button_arrow.png.import [new file with mode: 0644]
addons/ez_transitions/images/plugin_icon.png [new file with mode: 0644]
addons/ez_transitions/images/plugin_icon.png.import [new file with mode: 0644]
addons/ez_transitions/images/plugin_icon.svg [new file with mode: 0644]
addons/ez_transitions/images/plugin_icon.svg.import [new file with mode: 0644]
addons/ez_transitions/images/plugin_icon.xcf [new file with mode: 0644]
addons/ez_transitions/images/spinbox_updown.png [new file with mode: 0644]
addons/ez_transitions/images/spinbox_updown.png.import [new file with mode: 0644]
addons/ez_transitions/images/transition_node_icon.png [new file with mode: 0644]
addons/ez_transitions/images/transition_node_icon.png.import [new file with mode: 0644]
addons/ez_transitions/images/transition_node_icon.svg [new file with mode: 0644]
addons/ez_transitions/images/transition_node_icon.svg.import [new file with mode: 0644]
addons/ez_transitions/images/transition_overlay_node_icon.png [new file with mode: 0644]
addons/ez_transitions/images/transition_overlay_node_icon.png.import [new file with mode: 0644]
addons/ez_transitions/images/transition_overlay_node_icon.svg [new file with mode: 0644]
addons/ez_transitions/images/transition_overlay_node_icon.svg.import [new file with mode: 0644]
addons/ez_transitions/materials/transition_material.tres [new file with mode: 0644]
addons/ez_transitions/objects/main_container/basic_settings_script.gd [new file with mode: 0644]
addons/ez_transitions/objects/main_container/editor_control_script.gd [new file with mode: 0644]
addons/ez_transitions/objects/main_container/main_container.tscn [new file with mode: 0644]
addons/ez_transitions/objects/plugin_singleton/plugin_singleton.tscn [new file with mode: 0644]
addons/ez_transitions/objects/plugin_singleton/plugin_singleton_script.gd [new file with mode: 0644]
addons/ez_transitions/objects/transition_overlay/transition_overlay.tscn [new file with mode: 0644]
addons/ez_transitions/objects/transition_overlay/transition_overlay_script.gd [new file with mode: 0644]
addons/ez_transitions/plugin.cfg [new file with mode: 0644]
addons/ez_transitions/plugin_handler.gd [new file with mode: 0644]
addons/ez_transitions/shaders/scroll_shader.gdshader [new file with mode: 0644]
addons/ez_transitions/shaders/transition_shader.gdshader [new file with mode: 0644]
addons/ez_transitions/themes/main_theme.tres [new file with mode: 0644]
addons/ez_transitions/tutorial.txt [new file with mode: 0644]
addons/ggs/assets/add.svg [new file with mode: 0644]
addons/ggs/assets/add.svg.import [new file with mode: 0644]
addons/ggs/assets/bug.svg [new file with mode: 0644]
addons/ggs/assets/bug.svg.import [new file with mode: 0644]
addons/ggs/assets/check_all.svg [new file with mode: 0644]
addons/ggs/assets/check_all.svg.import [new file with mode: 0644]
addons/ggs/assets/close.svg [new file with mode: 0644]
addons/ggs/assets/close.svg.import [new file with mode: 0644]
addons/ggs/assets/collapse_all.svg [new file with mode: 0644]
addons/ggs/assets/collapse_all.svg.import [new file with mode: 0644]
addons/ggs/assets/delete.svg [new file with mode: 0644]
addons/ggs/assets/delete.svg.import [new file with mode: 0644]
addons/ggs/assets/docs.svg [new file with mode: 0644]
addons/ggs/assets/docs.svg.import [new file with mode: 0644]
addons/ggs/assets/expand_all.svg [new file with mode: 0644]
addons/ggs/assets/expand_all.svg.import [new file with mode: 0644]
addons/ggs/assets/feedback.svg [new file with mode: 0644]
addons/ggs/assets/feedback.svg.import [new file with mode: 0644]
addons/ggs/assets/file_dialog.svg [new file with mode: 0644]
addons/ggs/assets/file_dialog.svg.import [new file with mode: 0644]
addons/ggs/assets/icon_mini.svg [new file with mode: 0644]
addons/ggs/assets/icon_mini.svg.import [new file with mode: 0644]
addons/ggs/assets/icon_mono.svg [new file with mode: 0644]
addons/ggs/assets/icon_mono.svg.import [new file with mode: 0644]
addons/ggs/assets/reload.svg [new file with mode: 0644]
addons/ggs/assets/reload.svg.import [new file with mode: 0644]
addons/ggs/assets/rename.svg [new file with mode: 0644]
addons/ggs/assets/rename.svg.import [new file with mode: 0644]
addons/ggs/assets/save_file.svg [new file with mode: 0644]
addons/ggs/assets/save_file.svg.import [new file with mode: 0644]
addons/ggs/assets/search.svg [new file with mode: 0644]
addons/ggs/assets/search.svg.import [new file with mode: 0644]
addons/ggs/assets/show_in_filesystem.svg [new file with mode: 0644]
addons/ggs/assets/show_in_filesystem.svg.import [new file with mode: 0644]
addons/ggs/assets/theme.svg [new file with mode: 0644]
addons/ggs/assets/theme.svg.import [new file with mode: 0644]
addons/ggs/assets/uncheck_all.svg [new file with mode: 0644]
addons/ggs/assets/uncheck_all.svg.import [new file with mode: 0644]
addons/ggs/classes/ggs_input_helper.gd [new file with mode: 0644]
addons/ggs/classes/ggs_inspector_plugin.gd [new file with mode: 0644]
addons/ggs/classes/ggs_save_file.gd [new file with mode: 0644]
addons/ggs/classes/ggs_ui_component.gd [new file with mode: 0644]
addons/ggs/classes/ggs_utils.gd [new file with mode: 0644]
addons/ggs/classes/global/ggs.gd [new file with mode: 0644]
addons/ggs/classes/global/ggs.tscn [new file with mode: 0644]
addons/ggs/classes/resources/ggs_icon_db.gd [new file with mode: 0644]
addons/ggs/classes/resources/ggs_plugin_data.gd [new file with mode: 0644]
addons/ggs/classes/resources/ggs_setting.gd [new file with mode: 0644]
addons/ggs/docs/changelog.md [new file with mode: 0644]
addons/ggs/docs/components/apply_button.md [new file with mode: 0644]
addons/ggs/docs/components/arrow_list.md [new file with mode: 0644]
addons/ggs/docs/components/binary_selection.md [new file with mode: 0644]
addons/ggs/docs/components/components.md [new file with mode: 0644]
addons/ggs/docs/components/input_button.md [new file with mode: 0644]
addons/ggs/docs/components/input_confirm_window.md [new file with mode: 0644]
addons/ggs/docs/components/option_list.md [new file with mode: 0644]
addons/ggs/docs/components/radio_list.md [new file with mode: 0644]
addons/ggs/docs/components/reset_button.md [new file with mode: 0644]
addons/ggs/docs/components/slider.md [new file with mode: 0644]
addons/ggs/docs/components/spinbox.md [new file with mode: 0644]
addons/ggs/docs/components/text_field.md [new file with mode: 0644]
addons/ggs/docs/custom_components.md [new file with mode: 0644]
addons/ggs/docs/custom_settings.md [new file with mode: 0644]
addons/ggs/docs/getting_started.md [new file with mode: 0644]
addons/ggs/docs/home.md [new file with mode: 0644]
addons/ggs/docs/settings/audio_mute.md [new file with mode: 0644]
addons/ggs/docs/settings/audio_volume.md [new file with mode: 0644]
addons/ggs/docs/settings/display_fullscreen.md [new file with mode: 0644]
addons/ggs/docs/settings/display_scale.md [new file with mode: 0644]
addons/ggs/docs/settings/display_size.md [new file with mode: 0644]
addons/ggs/docs/settings/input.md [new file with mode: 0644]
addons/ggs/docs/settings/settings.md [new file with mode: 0644]
addons/ggs/docs/troubleshoot.md [new file with mode: 0644]
addons/ggs/editor/_theme/ggs_theme.gd [new file with mode: 0644]
addons/ggs/editor/_theme/ggs_theme.tres [new file with mode: 0644]
addons/ggs/editor/add_setting_window/add_setting_window.gd [new file with mode: 0644]
addons/ggs/editor/add_setting_window/add_setting_window.tscn [new file with mode: 0644]
addons/ggs/editor/category_panel/category_list.gd [new file with mode: 0644]
addons/ggs/editor/category_panel/category_panel.gd [new file with mode: 0644]
addons/ggs/editor/category_panel/category_panel.tscn [new file with mode: 0644]
addons/ggs/editor/component_panel/component_panel.gd [new file with mode: 0644]
addons/ggs/editor/component_panel/component_panel.tscn [new file with mode: 0644]
addons/ggs/editor/input_selector/input_list.gd [new file with mode: 0644]
addons/ggs/editor/input_selector/input_selector.gd [new file with mode: 0644]
addons/ggs/editor/input_selector/input_selector.tscn [new file with mode: 0644]
addons/ggs/editor/main_panel/bug_btn.gd [new file with mode: 0644]
addons/ggs/editor/main_panel/docs_btn.gd [new file with mode: 0644]
addons/ggs/editor/main_panel/feedback_btn.gd [new file with mode: 0644]
addons/ggs/editor/main_panel/main_panel.tscn [new file with mode: 0644]
addons/ggs/editor/main_panel/notification.gd [new file with mode: 0644]
addons/ggs/editor/main_panel/pref_btn.gd [new file with mode: 0644]
addons/ggs/editor/main_panel/progress_overlay.gd [new file with mode: 0644]
addons/ggs/editor/main_panel/save_file_menu.gd [new file with mode: 0644]
addons/ggs/editor/main_panel/split_containers.gd [new file with mode: 0644]
addons/ggs/editor/main_panel/update_theme_btn.gd [new file with mode: 0644]
addons/ggs/editor/pref_window/pref_window.gd [new file with mode: 0644]
addons/ggs/editor/pref_window/pref_window.tscn [new file with mode: 0644]
addons/ggs/editor/setting_panel/groupless.gd [new file with mode: 0644]
addons/ggs/editor/setting_panel/setting_group/setting_group.gd [new file with mode: 0644]
addons/ggs/editor/setting_panel/setting_group/setting_group.tscn [new file with mode: 0644]
addons/ggs/editor/setting_panel/setting_item/setting_item.gd [new file with mode: 0644]
addons/ggs/editor/setting_panel/setting_item/setting_item.tscn [new file with mode: 0644]
addons/ggs/editor/setting_panel/setting_list.gd [new file with mode: 0644]
addons/ggs/editor/setting_panel/setting_panel.gd [new file with mode: 0644]
addons/ggs/editor/setting_panel/setting_panel.tscn [new file with mode: 0644]
addons/ggs/plugin.cfg [new file with mode: 0644]
addons/ggs/plugin.gd [new file with mode: 0644]
addons/ggs/plugin_data.tres [new file with mode: 0644]
addons/ggs/template.gd [new file with mode: 0644]
addons/godot-git-plugin/LICENSE [new file with mode: 0644]
addons/godot-git-plugin/THIRDPARTY.md [new file with mode: 0644]
addons/godot-git-plugin/git_plugin.gdextension [new file with mode: 0644]
addons/godot-git-plugin/linux/libgit_plugin.linux.editor.x86_64.so [new file with mode: 0644]
addons/godot-git-plugin/macos/libgit_plugin.macos.editor.universal.dylib [new file with mode: 0644]
addons/godot-git-plugin/plugin.cfg [new file with mode: 0644]
addons/godot-git-plugin/win64/libgit_plugin.windows.editor.x86_64.dll [new file with mode: 0644]
addons/godot-git-plugin/win64/libgit_plugin.windows.editor.x86_64.exp [new file with mode: 0644]
addons/godot-git-plugin/win64/libgit_plugin.windows.editor.x86_64.lib [new file with mode: 0644]
addons/health_bar_2d/LICENSE.md [new file with mode: 0644]
addons/health_bar_2d/README.md [new file with mode: 0644]
addons/health_bar_2d/addon.gd [new file with mode: 0644]
addons/health_bar_2d/examples/bullet.gd [new file with mode: 0644]
addons/health_bar_2d/examples/bullet.tscn [new file with mode: 0644]
addons/health_bar_2d/examples/example.tscn [new file with mode: 0644]
addons/health_bar_2d/examples/heal.gd [new file with mode: 0644]
addons/health_bar_2d/examples/heal.tscn [new file with mode: 0644]
addons/health_bar_2d/examples/player.gd [new file with mode: 0644]
addons/health_bar_2d/examples/player.tscn [new file with mode: 0644]
addons/health_bar_2d/examples/turrent.gd [new file with mode: 0644]
addons/health_bar_2d/examples/turrent.tscn [new file with mode: 0644]
addons/health_bar_2d/health_bar_2d.gd [new file with mode: 0644]
addons/health_bar_2d/health_bar_2d.tscn [new file with mode: 0644]
addons/health_bar_2d/icon.png [new file with mode: 0644]
addons/health_bar_2d/icon.png.import [new file with mode: 0644]
addons/health_bar_2d/plugin.cfg [new file with mode: 0644]
addons/health_bar_2d/resources/health_bar_texture.png [new file with mode: 0644]
addons/health_bar_2d/resources/health_bar_texture.png.import [new file with mode: 0644]
addons/input_prompts/LICENSE [new file with mode: 0644]
addons/input_prompts/action_prompt/action_prompt.gd [new file with mode: 0644]
addons/input_prompts/action_prompt/icon.svg [new file with mode: 0644]
addons/input_prompts/action_prompt/icon.svg.import [new file with mode: 0644]
addons/input_prompts/icon.svg [new file with mode: 0644]
addons/input_prompts/icon.svg.import [new file with mode: 0644]
addons/input_prompts/icons/generic/left_stick_down.png [new file with mode: 0644]
addons/input_prompts/icons/generic/left_stick_down.png.import [new file with mode: 0644]
addons/input_prompts/icons/generic/left_stick_left.png [new file with mode: 0644]
addons/input_prompts/icons/generic/left_stick_left.png.import [new file with mode: 0644]
addons/input_prompts/icons/generic/left_stick_right.png [new file with mode: 0644]
addons/input_prompts/icons/generic/left_stick_right.png.import [new file with mode: 0644]
addons/input_prompts/icons/generic/left_stick_up.png [new file with mode: 0644]
addons/input_prompts/icons/generic/left_stick_up.png.import [new file with mode: 0644]
addons/input_prompts/icons/generic/right_stick_down.png [new file with mode: 0644]
addons/input_prompts/icons/generic/right_stick_down.png.import [new file with mode: 0644]
addons/input_prompts/icons/generic/right_stick_left.png [new file with mode: 0644]
addons/input_prompts/icons/generic/right_stick_left.png.import [new file with mode: 0644]
addons/input_prompts/icons/generic/right_stick_right.png [new file with mode: 0644]
addons/input_prompts/icons/generic/right_stick_right.png.import [new file with mode: 0644]
addons/input_prompts/icons/generic/right_stick_up.png [new file with mode: 0644]
addons/input_prompts/icons/generic/right_stick_up.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/0.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/0.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/1.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/1.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/2.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/2.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/3.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/3.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/4.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/4.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/5.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/5.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/6.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/6.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/7.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/7.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/8.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/8.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/9.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/9.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/a.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/a.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/alt.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/alt.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/apostrophe.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/apostrophe.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/asterisk.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/asterisk.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/at.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/at.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/b.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/b.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/backslash.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/backslash.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/backspace.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/backspace.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/blank.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/blank.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/c.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/c.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/caps.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/caps.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/caret.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/caret.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/cent.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/cent.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/colon.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/colon.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/comma.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/comma.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/ctrl.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/ctrl.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/d.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/d.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/del.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/del.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/dollar.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/dollar.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/down.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/down.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/e.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/e.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/end.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/end.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/enter_large.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/enter_large.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/enter_small.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/enter_small.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/enter_wide.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/enter_wide.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/equals.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/equals.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/esc.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/esc.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/exclamation.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/exclamation.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f1.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f1.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f10.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f10.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f11.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f11.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f12.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f12.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f2.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f2.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f3.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f3.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f4.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f4.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f5.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f5.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f6.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f6.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f7.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f7.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f8.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f8.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f9.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/f9.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/forward_slash.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/forward_slash.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/g.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/g.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/greater.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/greater.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/h.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/h.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/hash.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/hash.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/home.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/home.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/i.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/i.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/insert.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/insert.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/j.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/j.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/k.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/k.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/l.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/l.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/left.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/left.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/left_brace.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/left_brace.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/left_bracket.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/left_bracket.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/left_paren.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/left_paren.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/less.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/less.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/m.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/m.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/media_back.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/media_back.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/media_forward.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/media_forward.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/media_next.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/media_next.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/media_pause.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/media_pause.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/media_play.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/media_play.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/media_previous.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/media_previous.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/media_record.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/media_record.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/media_stop.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/media_stop.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/meta.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/meta.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/minus.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/minus.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/n.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/n.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/nbsp.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/nbsp.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/num.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/num.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/o.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/o.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/p.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/p.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/page_down.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/page_down.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/page_up.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/page_up.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/pause.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/pause.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/percent.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/percent.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/period.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/period.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/pipe.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/pipe.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/plus.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/plus.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/print.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/print.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/q.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/q.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/question.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/question.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/quote.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/quote.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/r.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/r.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/right.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/right.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/right_brace.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/right_brace.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/right_bracket.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/right_bracket.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/right_paren.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/right_paren.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/s.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/s.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/scroll.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/scroll.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/semicolon.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/semicolon.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/shift.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/shift.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/space.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/space.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/t.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/t.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/tab.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/tab.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/tilde.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/tilde.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/tile_0504.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/tile_0504.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/u.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/u.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/underscore.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/underscore.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/up.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/up.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/v.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/v.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/w.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/w.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/x.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/x.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/y.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/y.png.import [new file with mode: 0644]
addons/input_prompts/icons/keyboard/z.png [new file with mode: 0644]
addons/input_prompts/icons/keyboard/z.png.import [new file with mode: 0644]
addons/input_prompts/icons/mouse/left.png [new file with mode: 0644]
addons/input_prompts/icons/mouse/left.png.import [new file with mode: 0644]
addons/input_prompts/icons/mouse/middle.png [new file with mode: 0644]
addons/input_prompts/icons/mouse/middle.png.import [new file with mode: 0644]
addons/input_prompts/icons/mouse/right.png [new file with mode: 0644]
addons/input_prompts/icons/mouse/right.png.import [new file with mode: 0644]
addons/input_prompts/icons/mouse/wheel_down.png [new file with mode: 0644]
addons/input_prompts/icons/mouse/wheel_down.png.import [new file with mode: 0644]
addons/input_prompts/icons/mouse/wheel_left.png [new file with mode: 0644]
addons/input_prompts/icons/mouse/wheel_left.png.import [new file with mode: 0644]
addons/input_prompts/icons/mouse/wheel_right.png [new file with mode: 0644]
addons/input_prompts/icons/mouse/wheel_right.png.import [new file with mode: 0644]
addons/input_prompts/icons/mouse/wheel_up.png [new file with mode: 0644]
addons/input_prompts/icons/mouse/wheel_up.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/a.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/a.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/b.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/b.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/capture.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/capture.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/down.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/down.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/home.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/home.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/l.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/l.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/left.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/left.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/left_stick.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/left_stick.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/minus.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/minus.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/plus.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/plus.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/r.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/r.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/right.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/right.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/right_stick.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/right_stick.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/up.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/up.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/x.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/x.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/y.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/y.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/zl.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/zl.png.import [new file with mode: 0644]
addons/input_prompts/icons/nintendo/zr.png [new file with mode: 0644]
addons/input_prompts/icons/nintendo/zr.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/circle.png [new file with mode: 0644]
addons/input_prompts/icons/sony/circle.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/cross.png [new file with mode: 0644]
addons/input_prompts/icons/sony/cross.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/down.png [new file with mode: 0644]
addons/input_prompts/icons/sony/down.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/l1.png [new file with mode: 0644]
addons/input_prompts/icons/sony/l1.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/l2.png [new file with mode: 0644]
addons/input_prompts/icons/sony/l2.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/left.png [new file with mode: 0644]
addons/input_prompts/icons/sony/left.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/left_stick.png [new file with mode: 0644]
addons/input_prompts/icons/sony/left_stick.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/microphone.png [new file with mode: 0644]
addons/input_prompts/icons/sony/microphone.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/ps.png [new file with mode: 0644]
addons/input_prompts/icons/sony/ps.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/r1.png [new file with mode: 0644]
addons/input_prompts/icons/sony/r1.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/r2.png [new file with mode: 0644]
addons/input_prompts/icons/sony/r2.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/right.png [new file with mode: 0644]
addons/input_prompts/icons/sony/right.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/right_stick.png [new file with mode: 0644]
addons/input_prompts/icons/sony/right_stick.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/select.png [new file with mode: 0644]
addons/input_prompts/icons/sony/select.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/square.png [new file with mode: 0644]
addons/input_prompts/icons/sony/square.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/start.png [new file with mode: 0644]
addons/input_prompts/icons/sony/start.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/touchpad.png [new file with mode: 0644]
addons/input_prompts/icons/sony/touchpad.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/triangle.png [new file with mode: 0644]
addons/input_prompts/icons/sony/triangle.png.import [new file with mode: 0644]
addons/input_prompts/icons/sony/up.png [new file with mode: 0644]
addons/input_prompts/icons/sony/up.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/a.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/a.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/b.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/b.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/down.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/down.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/left.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/left.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/left_bumper.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/left_bumper.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/left_stick.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/left_stick.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/left_trigger.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/left_trigger.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/menu.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/menu.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/right.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/right.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/right_bumper.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/right_bumper.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/right_stick.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/right_stick.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/right_trigger.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/right_trigger.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/share.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/share.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/up.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/up.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/view.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/view.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/x.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/x.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/xbox.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/xbox.png.import [new file with mode: 0644]
addons/input_prompts/icons/xbox/y.png [new file with mode: 0644]
addons/input_prompts/icons/xbox/y.png.import [new file with mode: 0644]
addons/input_prompts/input_prompt.gd [new file with mode: 0644]
addons/input_prompts/input_prompt_manager.gd [new file with mode: 0644]
addons/input_prompts/inspector_plugin.gd [new file with mode: 0644]
addons/input_prompts/joypad_button_prompt/icon.svg [new file with mode: 0644]
addons/input_prompts/joypad_button_prompt/icon.svg.import [new file with mode: 0644]
addons/input_prompts/joypad_button_prompt/joypad_button_prompt.gd [new file with mode: 0644]
addons/input_prompts/joypad_button_prompt/nintendo.tres [new file with mode: 0644]
addons/input_prompts/joypad_button_prompt/sony.tres [new file with mode: 0644]
addons/input_prompts/joypad_button_prompt/xbox.tres [new file with mode: 0644]
addons/input_prompts/joypad_motion_prompt/icon.svg [new file with mode: 0644]
addons/input_prompts/joypad_motion_prompt/icon.svg.import [new file with mode: 0644]
addons/input_prompts/joypad_motion_prompt/joypad_motion_prompt.gd [new file with mode: 0644]
addons/input_prompts/joypad_motion_prompt/nintendo.tres [new file with mode: 0644]
addons/input_prompts/joypad_motion_prompt/sony.tres [new file with mode: 0644]
addons/input_prompts/joypad_motion_prompt/xbox.tres [new file with mode: 0644]
addons/input_prompts/key_prompt/icon.svg [new file with mode: 0644]
addons/input_prompts/key_prompt/icon.svg.import [new file with mode: 0644]
addons/input_prompts/key_prompt/key_prompt.gd [new file with mode: 0644]
addons/input_prompts/key_prompt/keys.tres [new file with mode: 0644]
addons/input_prompts/mouse_button_prompt/buttons.tres [new file with mode: 0644]
addons/input_prompts/mouse_button_prompt/icon.svg [new file with mode: 0644]
addons/input_prompts/mouse_button_prompt/icon.svg.import [new file with mode: 0644]
addons/input_prompts/mouse_button_prompt/mouse_button_prompt.gd [new file with mode: 0644]
addons/input_prompts/plugin.cfg [new file with mode: 0644]
addons/input_prompts/plugin.gd [new file with mode: 0644]
addons/input_prompts/resources/joypad_button_textures.gd [new file with mode: 0644]
addons/input_prompts/resources/joypad_motion_textures.gd [new file with mode: 0644]
addons/input_prompts/resources/keyboard_textures.gd [new file with mode: 0644]
addons/input_prompts/resources/mouse_button_textures.gd [new file with mode: 0644]
addons/kenney rpg audio/belt_handle_1.ogg [new file with mode: 0644]
addons/kenney rpg audio/belt_handle_1.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/belt_handle_2.ogg [new file with mode: 0644]
addons/kenney rpg audio/belt_handle_2.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/book_close.ogg [new file with mode: 0644]
addons/kenney rpg audio/book_close.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/book_flip_1.ogg [new file with mode: 0644]
addons/kenney rpg audio/book_flip_1.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/book_flip_2.ogg [new file with mode: 0644]
addons/kenney rpg audio/book_flip_2.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/book_flip_3.ogg [new file with mode: 0644]
addons/kenney rpg audio/book_flip_3.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/book_open.ogg [new file with mode: 0644]
addons/kenney rpg audio/book_open.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/book_place_1.ogg [new file with mode: 0644]
addons/kenney rpg audio/book_place_1.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/book_place_2.ogg [new file with mode: 0644]
addons/kenney rpg audio/book_place_2.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/book_place_3.ogg [new file with mode: 0644]
addons/kenney rpg audio/book_place_3.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/chop.ogg [new file with mode: 0644]
addons/kenney rpg audio/chop.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/cloth_1.ogg [new file with mode: 0644]
addons/kenney rpg audio/cloth_1.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/cloth_2.ogg [new file with mode: 0644]
addons/kenney rpg audio/cloth_2.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/cloth_3.ogg [new file with mode: 0644]
addons/kenney rpg audio/cloth_3.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/cloth_4.ogg [new file with mode: 0644]
addons/kenney rpg audio/cloth_4.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/cloth_belt.ogg [new file with mode: 0644]
addons/kenney rpg audio/cloth_belt.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/cloth_belt_2.ogg [new file with mode: 0644]
addons/kenney rpg audio/cloth_belt_2.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/creak_1.ogg [new file with mode: 0644]
addons/kenney rpg audio/creak_1.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/creak_2.ogg [new file with mode: 0644]
addons/kenney rpg audio/creak_2.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/creak_3.ogg [new file with mode: 0644]
addons/kenney rpg audio/creak_3.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/door_close_1.ogg [new file with mode: 0644]
addons/kenney rpg audio/door_close_1.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/door_close_2.ogg [new file with mode: 0644]
addons/kenney rpg audio/door_close_2.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/door_close_3.ogg [new file with mode: 0644]
addons/kenney rpg audio/door_close_3.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/door_close_4.ogg [new file with mode: 0644]
addons/kenney rpg audio/door_close_4.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/door_open_1.ogg [new file with mode: 0644]
addons/kenney rpg audio/door_open_1.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/door_open_2.ogg [new file with mode: 0644]
addons/kenney rpg audio/door_open_2.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/draw_knife_1.ogg [new file with mode: 0644]
addons/kenney rpg audio/draw_knife_1.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/draw_knife_2.ogg [new file with mode: 0644]
addons/kenney rpg audio/draw_knife_2.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/draw_knife_3.ogg [new file with mode: 0644]
addons/kenney rpg audio/draw_knife_3.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/drop_leather.ogg [new file with mode: 0644]
addons/kenney rpg audio/drop_leather.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/footstep_0.ogg [new file with mode: 0644]
addons/kenney rpg audio/footstep_0.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/footstep_1.ogg [new file with mode: 0644]
addons/kenney rpg audio/footstep_1.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/footstep_2.ogg [new file with mode: 0644]
addons/kenney rpg audio/footstep_2.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/footstep_3.ogg [new file with mode: 0644]
addons/kenney rpg audio/footstep_3.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/footstep_4.ogg [new file with mode: 0644]
addons/kenney rpg audio/footstep_4.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/footstep_5.ogg [new file with mode: 0644]
addons/kenney rpg audio/footstep_5.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/footstep_6.ogg [new file with mode: 0644]
addons/kenney rpg audio/footstep_6.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/footstep_7.ogg [new file with mode: 0644]
addons/kenney rpg audio/footstep_7.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/footstep_8.ogg [new file with mode: 0644]
addons/kenney rpg audio/footstep_8.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/footstep_9.ogg [new file with mode: 0644]
addons/kenney rpg audio/footstep_9.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/handle_coins.ogg [new file with mode: 0644]
addons/kenney rpg audio/handle_coins.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/handle_coins_2.ogg [new file with mode: 0644]
addons/kenney rpg audio/handle_coins_2.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/handle_small_leather.ogg [new file with mode: 0644]
addons/kenney rpg audio/handle_small_leather.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/handle_small_leather_2.ogg [new file with mode: 0644]
addons/kenney rpg audio/handle_small_leather_2.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/knife_slice.ogg [new file with mode: 0644]
addons/kenney rpg audio/knife_slice.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/knife_slice_2.ogg [new file with mode: 0644]
addons/kenney rpg audio/knife_slice_2.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/metal_click.ogg [new file with mode: 0644]
addons/kenney rpg audio/metal_click.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/metal_latch.ogg [new file with mode: 0644]
addons/kenney rpg audio/metal_latch.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/metal_pot_1.ogg [new file with mode: 0644]
addons/kenney rpg audio/metal_pot_1.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/metal_pot_2.ogg [new file with mode: 0644]
addons/kenney rpg audio/metal_pot_2.ogg.import [new file with mode: 0644]
addons/kenney rpg audio/metal_pot_3.ogg [new file with mode: 0644]
addons/kenney rpg audio/metal_pot_3.ogg.import [new file with mode: 0644]
addons/kenney_prototype_textures/LICENSE.txt [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_01.png [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_01.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_02.png [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_02.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_03.png [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_03.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_04.png [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_04.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_05.png [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_05.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_06.png [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_06.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_07.png [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_07.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_08.png [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_08.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_09.png [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_09.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_10.png [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_10.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_11.png [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_11.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_12.png [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_12.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_13.png [new file with mode: 0644]
addons/kenney_prototype_textures/dark/texture_13.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_01.png [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_01.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_02.png [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_02.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_03.png [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_03.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_04.png [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_04.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_05.png [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_05.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_06.png [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_06.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_07.png [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_07.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_08.png [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_08.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_09.png [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_09.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_10.png [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_10.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_11.png [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_11.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_12.png [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_12.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_13.png [new file with mode: 0644]
addons/kenney_prototype_textures/green/texture_13.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_01.png [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_01.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_02.png [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_02.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_03.png [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_03.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_04.png [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_04.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_05.png [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_05.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_06.png [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_06.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_07.png [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_07.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_08.png [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_08.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_09.png [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_09.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_10.png [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_10.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_11.png [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_11.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_12.png [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_12.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_13.png [new file with mode: 0644]
addons/kenney_prototype_textures/light/texture_13.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_01.png [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_01.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_02.png [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_02.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_03.png [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_03.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_04.png [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_04.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_05.png [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_05.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_06.png [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_06.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_07.png [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_07.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_08.png [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_08.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_09.png [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_09.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_10.png [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_10.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_11.png [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_11.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_12.png [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_12.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_13.png [new file with mode: 0644]
addons/kenney_prototype_textures/orange/texture_13.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_01.png [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_01.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_02.png [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_02.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_03.png [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_03.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_04.png [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_04.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_05.png [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_05.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_06.png [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_06.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_07.png [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_07.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_08.png [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_08.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_09.png [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_09.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_10.png [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_10.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_11.png [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_11.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_12.png [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_12.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_13.png [new file with mode: 0644]
addons/kenney_prototype_textures/purple/texture_13.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_01.png [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_01.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_02.png [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_02.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_03.png [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_03.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_04.png [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_04.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_05.png [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_05.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_06.png [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_06.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_07.png [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_07.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_08.png [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_08.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_09.png [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_09.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_10.png [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_10.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_11.png [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_11.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_12.png [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_12.png.import [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_13.png [new file with mode: 0644]
addons/kenney_prototype_textures/red/texture_13.png.import [new file with mode: 0644]
addons/quest_system/active_pool.gd [new file with mode: 0644]
addons/quest_system/available_pool.gd [new file with mode: 0644]
addons/quest_system/base_quest_pool.gd [new file with mode: 0644]
addons/quest_system/completed_pool.gd [new file with mode: 0644]
addons/quest_system/plugin.cfg [new file with mode: 0644]
addons/quest_system/plugin.gd [new file with mode: 0644]
addons/quest_system/quest_manager.gd [new file with mode: 0644]
addons/quest_system/quest_resource.gd [new file with mode: 0644]
addons/scenes/demo_scene.tscn [new file with mode: 0644]
addons/script-ide/LICENSE [new file with mode: 0644]
addons/script-ide/Popup.gd [new file with mode: 0644]
addons/script-ide/README.md [new file with mode: 0644]
addons/script-ide/icon/class.svg [new file with mode: 0644]
addons/script-ide/icon/class.svg.import [new file with mode: 0644]
addons/script-ide/icon/constant.svg [new file with mode: 0644]
addons/script-ide/icon/constant.svg.import [new file with mode: 0644]
addons/script-ide/icon/export.svg [new file with mode: 0644]
addons/script-ide/icon/export.svg.import [new file with mode: 0644]
addons/script-ide/icon/func.svg [new file with mode: 0644]
addons/script-ide/icon/func.svg.import [new file with mode: 0644]
addons/script-ide/icon/func_get.svg [new file with mode: 0644]
addons/script-ide/icon/func_get.svg.import [new file with mode: 0644]
addons/script-ide/icon/func_set.svg [new file with mode: 0644]
addons/script-ide/icon/func_set.svg.import [new file with mode: 0644]
addons/script-ide/icon/keyword.svg [new file with mode: 0644]
addons/script-ide/icon/keyword.svg.import [new file with mode: 0644]
addons/script-ide/icon/property.svg [new file with mode: 0644]
addons/script-ide/icon/property.svg.import [new file with mode: 0644]
addons/script-ide/icon/signal.svg [new file with mode: 0644]
addons/script-ide/icon/signal.svg.import [new file with mode: 0644]
addons/script-ide/plugin.cfg [new file with mode: 0644]
addons/script-ide/plugin.gd [new file with mode: 0644]
addons/tracer/StackHandler.cs [new file with mode: 0644]
addons/tracer/plugin.cfg [new file with mode: 0644]
addons/tracer/subscriber.gd [new file with mode: 0644]
addons/tracer/tracer.gd [new file with mode: 0644]
addons/tracer/tracer_plugin.gd [new file with mode: 0644]
examples/colors_demo.gd [new file with mode: 0644]
examples/colors_demo.gdshader [new file with mode: 0644]
examples/test/logs.txt [new file with mode: 0644]
examples/test/test.gd [new file with mode: 0644]
examples/test/test.tscn [new file with mode: 0644]
game_settings/components/_misc_components/apply_btn/apply_btn.gd [new file with mode: 0644]
game_settings/components/_misc_components/apply_btn/apply_btn.tscn [new file with mode: 0644]
game_settings/components/_misc_components/input_confirm_window/input_confirm_window.gd [new file with mode: 0644]
game_settings/components/_misc_components/input_confirm_window/input_confirm_window.tscn [new file with mode: 0644]
game_settings/components/_misc_components/reset_btn/reset_btn.gd [new file with mode: 0644]
game_settings/components/_misc_components/reset_btn/reset_btn.tscn [new file with mode: 0644]
game_settings/components/_shared_scripts/binary_selection.gd [new file with mode: 0644]
game_settings/components/arrow_list/arrow_list.gd [new file with mode: 0644]
game_settings/components/arrow_list/arrow_list.tscn [new file with mode: 0644]
game_settings/components/checkbox/checkbox.tscn [new file with mode: 0644]
game_settings/components/input_btn/input_btn.gd [new file with mode: 0644]
game_settings/components/input_btn/input_btn.tscn [new file with mode: 0644]
game_settings/components/option_list/option_list.gd [new file with mode: 0644]
game_settings/components/option_list/option_list.tscn [new file with mode: 0644]
game_settings/components/radio_list/radio_list.gd [new file with mode: 0644]
game_settings/components/radio_list/radio_list.tscn [new file with mode: 0644]
game_settings/components/slider/slider.gd [new file with mode: 0644]
game_settings/components/slider/slider.tscn [new file with mode: 0644]
game_settings/components/spinbox/spinbox.gd [new file with mode: 0644]
game_settings/components/spinbox/spinbox.tscn [new file with mode: 0644]
game_settings/components/switch/switch.tscn [new file with mode: 0644]
game_settings/components/text_field/text_field.gd [new file with mode: 0644]
game_settings/components/text_field/text_field.tscn [new file with mode: 0644]
game_settings/components/toggle_btn/toggle_btn.tscn [new file with mode: 0644]
game_settings/settings/nonempty.txt [new file with mode: 0644]
game_settings/templates/audio/audio_mute.gd [new file with mode: 0644]
game_settings/templates/audio/audio_volume.gd [new file with mode: 0644]
game_settings/templates/display/display_fullscreen.gd [new file with mode: 0644]
game_settings/templates/display/display_scale.gd [new file with mode: 0644]
game_settings/templates/display/display_size.gd [new file with mode: 0644]
game_settings/templates/input.gd [new file with mode: 0644]
icon.svg [new file with mode: 0644]
icon.svg.import [new file with mode: 0644]
plain_tiles.tres [new file with mode: 0644]
player.gd [new file with mode: 0644]
project.godot [new file with mode: 0644]
shaders/Farola.glb [new file with mode: 0644]
shaders/Farola.glb.import [new file with mode: 0644]
shaders/perlin_noise.gdshader [new file with mode: 0644]
shaders/screen_shaders.gdshader [new file with mode: 0644]
shaders/test.tres [new file with mode: 0644]
shaders/vhs-crt.gdshader [new file with mode: 0644]
test.tscn [new file with mode: 0644]
tiles.tscn [new file with mode: 0644]

diff --git a/.gitattributes b/.gitattributes
new file mode 100644 (file)
index 0000000..8ad74f7
--- /dev/null
@@ -0,0 +1,2 @@
+# Normalize EOL for all files that Git considers text files.
+* text=auto eol=lf
diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..4709183
--- /dev/null
@@ -0,0 +1,2 @@
+# Godot 4+ specific ignores
+.godot/
diff --git a/Camera3D.gd b/Camera3D.gd
new file mode 100644 (file)
index 0000000..e5347aa
--- /dev/null
@@ -0,0 +1,52 @@
+extends Camera3D
+
+@export var movEnabled := true
+@export var mouseSensitivity := 0.5
+@export var flyspeed := 100.0
+@export var debug := false
+@export var player: Node3D
+
+var yaw : float = 0.0
+var pitch : float = 0.0
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+       yaw = 0.0
+       pitch = 0.0
+
+       Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
+
+func _input(event):
+       # release the mouse on esc
+       if event.is_action_pressed("ui_cancel"):
+               Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
+
+       # capture mouse again on click
+       if event.is_action_pressed("left_click"):
+               if Input.get_mouse_mode() == Input.MOUSE_MODE_VISIBLE:
+                       Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
+                       get_viewport().set_input_as_handled()
+
+       # if mouse is not captured dont move the camera
+       if not Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
+               return
+
+       # get mouse movement and move the camera
+       if event is InputEventMouseMotion and movEnabled:
+               var mouseVec: Vector2 = event.get_relative()
+
+               yaw = fmod(yaw - mouseVec.x * mouseSensitivity, 360)
+               pitch = max(min(pitch - mouseVec.y * mouseSensitivity, 90), -90)
+               player.rotation = Vector3(deg_to_rad(pitch), deg_to_rad(yaw), 0)
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+       if(Input.is_action_pressed("ui_up")):
+               translate(position - global_basis * Vector3(0, 0, 1) * delta * flyspeed * .01)
+       if(Input.is_action_pressed("ui_down")):
+               translate(position - global_basis * Vector3(0, 0, 1) * delta * flyspeed * -.01)
+       if(Input.is_action_pressed("ui_left")):
+               translate(position - global_basis * Vector3(1, 0, 0) * delta * flyspeed * .01)
+       if(Input.is_action_pressed("ui_right")):
+               translate(position - global_basis * Vector3(1, 0, 0) * delta * flyspeed * -.01)
+
diff --git a/CharacterBody3D.gd b/CharacterBody3D.gd
new file mode 100644 (file)
index 0000000..91c388e
--- /dev/null
@@ -0,0 +1,31 @@
+extends CharacterBody3D
+
+
+const SPEED = 5.0
+const JUMP_VELOCITY = 4.5
+
+# Get the gravity from the project settings to be synced with RigidBody nodes.
+var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
+
+
+func _physics_process(delta):
+       # Add the gravity.
+       if not is_on_floor():
+               velocity.y -= gravity * delta
+
+       # Handle jump.
+       if Input.is_action_just_pressed("ui_accept") and is_on_floor():
+               velocity.y = JUMP_VELOCITY
+
+       # Get the input direction and handle the movement/deceleration.
+       # As good practice, you should replace UI actions with custom gameplay actions.
+       var input_dir = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
+       var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
+       if direction:
+               velocity.x = direction.x * SPEED
+               velocity.z = direction.z * SPEED
+       else:
+               velocity.x = move_toward(velocity.x, 0, SPEED)
+               velocity.z = move_toward(velocity.z, 0, SPEED)
+
+       move_and_slide()
diff --git a/Farola.glb b/Farola.glb
new file mode 100644 (file)
index 0000000..48374bf
Binary files /dev/null and b/Farola.glb differ
diff --git a/Farola.glb.import b/Farola.glb.import
new file mode 100644 (file)
index 0000000..0599a7c
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bpuiyd81j8177"
+path="res://.godot/imported/Farola.glb-d3dc51144649e91c33d609662b0328e3.scn"
+
+[deps]
+
+source_file="res://Farola.glb"
+dest_files=["res://.godot/imported/Farola.glb-d3dc51144649e91c33d609662b0328e3.scn"]
+
+[params]
+
+nodes/root_type="Node3D"
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+meshes/ensure_tangents=true
+meshes/generate_lods=true
+meshes/create_shadow_meshes=true
+meshes/light_baking=1
+meshes/lightmap_texel_size=0.2
+meshes/force_disable_compression=false
+skins/use_named_skins=true
+animation/import=true
+animation/fps=30
+animation/trimming=false
+animation/remove_immutable_tracks=true
+import_script/path=""
+_subresources={}
+gltf/naming_version=1
+gltf/embedded_image_handling=0
diff --git a/addons/ColorPreview/ColorHelper.gd b/addons/ColorPreview/ColorHelper.gd
new file mode 100644 (file)
index 0000000..95982ae
--- /dev/null
@@ -0,0 +1,167 @@
+class_name ColorHelper
+extends RefCounted
+
+## This is a duplicate of core/math/color_names.inc named_colors (without _)
+## Since those colors are only accessible through the Color constants
+const named_colors := {
+       "ALICEBLUE": null,
+       "ANTIQUEWHITE": null,
+       "AQUA": null,
+       "AQUAMARINE": null,
+       "AZURE": null,
+       "BEIGE": null,
+       "BISQUE": null,
+       "BLACK": null,
+       "BLANCHEDALMOND": null,
+       "BLUE": null,
+       "BLUEVIOLET": null,
+       "BROWN": null,
+       "BURLYWOOD": null,
+       "CADETBLUE": null,
+       "CHARTREUSE": null,
+       "CHOCOLATE": null,
+       "CORAL": null,
+       "CORNFLOWERBLUE": null,
+       "CORNSILK": null,
+       "CRIMSON": null,
+       "CYAN": null,
+       "DARKBLUE": null,
+       "DARKCYAN": null,
+       "DARKGOLDENROD": null,
+       "DARKGRAY": null,
+       "DARKGREEN": null,
+       "DARKKHAKI": null,
+       "DARKMAGENTA": null,
+       "DARKOLIVEGREEN": null,
+       "DARKORANGE": null,
+       "DARKORCHID": null,
+       "DARKRED": null,
+       "DARKSALMON": null,
+       "DARKSEAGREEN": null,
+       "DARKSLATEBLUE": null,
+       "DARKSLATEGRAY": null,
+       "DARKTURQUOISE": null,
+       "DARKVIOLET": null,
+       "DEEPPINK": null,
+       "DEEPSKYBLUE": null,
+       "DIMGRAY": null,
+       "DODGERBLUE": null,
+       "FIREBRICK": null,
+       "FLORALWHITE": null,
+       "FORESTGREEN": null,
+       "FUCHSIA": null,
+       "GAINSBORO": null,
+       "GHOSTWHITE": null,
+       "GOLD": null,
+       "GOLDENROD": null,
+       "GRAY": null,
+       "GREEN": null,
+       "GREENYELLOW": null,
+       "HONEYDEW": null,
+       "HOTPINK": null,
+       "INDIANRED": null,
+       "INDIGO": null,
+       "IVORY": null,
+       "KHAKI": null,
+       "LAVENDER": null,
+       "LAVENDERBLUSH": null,
+       "LAWNGREEN": null,
+       "LEMONCHIFFON": null,
+       "LIGHTBLUE": null,
+       "LIGHTCORAL": null,
+       "LIGHTCYAN": null,
+       "LIGHTGOLDENROD": null,
+       "LIGHTGRAY": null,
+       "LIGHTGREEN": null,
+       "LIGHTPINK": null,
+       "LIGHTSALMON": null,
+       "LIGHTSEAGREEN": null,
+       "LIGHTSKYBLUE": null,
+       "LIGHTSLATEGRAY": null,
+       "LIGHTSTEELBLUE": null,
+       "LIGHTYELLOW": null,
+       "LIME": null,
+       "LIMEGREEN": null,
+       "LINEN": null,
+       "MAGENTA": null,
+       "MAROON": null,
+       "MEDIUMAQUAMARINE": null,
+       "MEDIUMBLUE": null,
+       "MEDIUMORCHID": null,
+       "MEDIUMPURPLE": null,
+       "MEDIUMSEAGREEN": null,
+       "MEDIUMSLATEBLUE": null,
+       "MEDIUMSPRINGGREEN": null,
+       "MEDIUMTURQUOISE": null,
+       "MEDIUMVIOLETRED": null,
+       "MIDNIGHTBLUE": null,
+       "MINTCREAM": null,
+       "MISTYROSE": null,
+       "MOCCASIN": null,
+       "NAVAJOWHITE": null,
+       "NAVYBLUE": null,
+       "OLDLACE": null,
+       "OLIVE": null,
+       "OLIVEDRAB": null,
+       "ORANGE": null,
+       "ORANGERED": null,
+       "ORCHID": null,
+       "PALEGOLDENROD": null,
+       "PALEGREEN": null,
+       "PALETURQUOISE": null,
+       "PALEVIOLETRED": null,
+       "PAPAYAWHIP": null,
+       "PEACHPUFF": null,
+       "PERU": null,
+       "PINK": null,
+       "PLUM": null,
+       "POWDERBLUE": null,
+       "PURPLE": null,
+       "REBECCAPURPLE": null,
+       "RED": null,
+       "ROSYBROWN": null,
+       "ROYALBLUE": null,
+       "SADDLEBROWN": null,
+       "SALMON": null,
+       "SANDYBROWN": null,
+       "SEAGREEN": null,
+       "SEASHELL": null,
+       "SIENNA": null,
+       "SILVER": null,
+       "SKYBLUE": null,
+       "SLATEBLUE": null,
+       "SLATEGRAY": null,
+       "SNOW": null,
+       "SPRINGGREEN": null,
+       "STEELBLUE": null,
+       "TAN": null,
+       "TEAL": null,
+       "THISTLE": null,
+       "TOMATO": null,
+       "TRANSPARENT": null,
+       "TURQUOISE": null,
+       "VIOLET": null,
+       "WEBGRAY": null,
+       "WEBGREEN": null,
+       "WEBMAROON": null,
+       "WEBPURPLE": null,
+       "WHEAT": null,
+       "WHITE": null,
+       "WHITESMOKE": null,
+       "YELLOW": null,
+       "YELLOWGREEN": null,
+}
+
+
+## Checks if a color is a named color.
+## Based on Godot /core/math/color.cpp Color::find_named_color
+static func is_named_color(name: String) -> bool:
+       # Normalize name
+       name = name.replace(" ", "")
+       name = name.replace("-", "")
+       name = name.replace("_", "")
+       name = name.replace("'", "")
+       name = name.replace(".", "")
+       name = name.to_upper()
+
+       return name in named_colors
diff --git a/addons/ColorPreview/ColorPreview.gd b/addons/ColorPreview/ColorPreview.gd
new file mode 100644 (file)
index 0000000..54e88fa
--- /dev/null
@@ -0,0 +1,353 @@
+@tool
+extends EditorPlugin
+
+var editor: Node = null
+var editors: Array = []
+var current_textedit: TextEdit
+var hovering_line = null
+var gutter_position: int = 0
+var preview_gutter_name: String = "color_preview"
+var picker_popup: Popup
+var regex: RegEx
+const regex_patterns: Array[String] = [
+       "Color\\((?<color_params>(?R)*.*?)\\)",
+       "Color\\.(?<color_const>[A-Z_]+)\\b",
+       "source_color.*?vec4\\((?<vec4_params>(?R)*.*?)\\)",
+]
+
+
+func _enter_tree() -> void:
+       initialize_gutter()
+       initialize_picker()
+       # the shader editor does not exist until opened for the first time
+       # so, to get it consistently, check if it's there whenever the focus changes
+       get_viewport().gui_focus_changed.connect(get_shader_editor_code_edit)
+
+       regex = RegEx.new()
+       regex.compile("|".join(regex_patterns))
+
+
+func _exit_tree() -> void:
+       exit_picker()
+       exit_gutter()
+
+
+func initialize_picker() -> void:
+       var editor_base := get_editor_interface().get_base_control()
+       if not picker_popup:
+               picker_popup = preload("res://addons/ColorPreview/Picker.tscn").instantiate()
+               picker_popup.get_node("%ColorPreviewPicker").theme = editor_base.theme
+               picker_popup.connect("popup_hide", on_picker_popup_close)
+       picker_popup.hide()
+
+       var picker := (picker_popup.get_node("%ColorPreviewPicker") as ColorPicker)
+       if not picker.is_connected("color_changed", picker_color_changed):
+               picker.connect("color_changed", picker_color_changed)
+
+       if not picker_popup.is_inside_tree() or not editor_base.has_node(picker_popup.get_path()):
+               editor_base.add_child(picker_popup)
+
+
+func exit_picker() -> void:
+       if picker_popup:
+               picker_popup.queue_free()
+
+
+func initialize_gutter() -> void:
+       var script_editor := get_editor_interface().get_script_editor()
+       if not script_editor.is_connected("editor_script_changed", editor_script_changed):
+               script_editor.connect("editor_script_changed", editor_script_changed)
+       get_all_text_editors(script_editor)
+       for child in editors:
+               if child and is_instance_valid(child) and child is TextEdit:
+                       add_color_gutter(child)
+
+
+func exit_gutter() -> void:
+       var script_editor := get_editor_interface().get_script_editor()
+       get_all_text_editors(script_editor)
+       for child in editors:
+               if child is TextEdit:
+                       remove_color_gutter(child)
+
+
+### ### ### GETTING AND KEEPING EDITORS ### ### ###
+
+func get_all_text_editors(parent : Node) -> void:
+       for child in parent.get_children():
+               if child.get_child_count():
+                       get_all_text_editors(child)
+
+               if child is CodeEdit:
+                       add_code_edit_to_editors_array(child)
+
+
+func get_shader_editor_code_edit(node: Node):
+       if not node is CodeEdit or not node.get_parent().get_class() == "ShaderTextEditor":
+               return
+
+       if not editors.has(node):
+               add_code_edit_to_editors_array(node)
+               initialize_gutter()
+               initialize_picker()
+
+
+func add_code_edit_to_editors_array(node: CodeEdit) -> void:
+       editors.append(node)
+
+       if node.is_connected("text_changed", handle_change):
+               node.disconnect("text_changed", handle_change)
+       node.text_changed.connect(handle_change.bind(node))
+
+       if node.is_connected("caret_changed", handle_change):
+               node.disconnect("caret_changed", handle_change)
+       node.caret_changed.connect(handle_change.bind(node))
+
+
+func handle_change(textedit : TextEdit) -> void:
+       current_textedit = textedit
+       if not current_textedit.is_connected("gui_input", textedit_clicked):
+               current_textedit.gui_input.connect(textedit_clicked.bind(textedit))
+
+       var editor := get_editor_interface()
+       if not editors.has(textedit):
+               editors.clear()
+               get_all_text_editors(editor.get_script_editor())
+       get_colors_from_textedit(textedit)
+
+
+func editor_script_changed(script: Script) -> void:
+       initialize_gutter()
+       initialize_picker()
+       if current_textedit:
+               if current_textedit.is_connected("gui_input", textedit_clicked):
+                       current_textedit.disconnect("gui_input", textedit_clicked)
+               current_textedit = null
+       var editor := get_editor_interface()
+       var script_editor = editor.get_script_editor()
+       editors.clear()
+       get_all_text_editors(script_editor)
+
+
+### ### ### HANDLING GUTTERS ### ### ###
+
+func has_color_preview_gutter(textedit: TextEdit) -> bool:
+       for gutter_index in textedit.get_gutter_count() - 1:
+               if gutter_index < 0:
+                       continue
+               if textedit.get_gutter_name(gutter_index) == preview_gutter_name:
+                       return true
+       return false
+
+
+func add_color_gutter(textedit: TextEdit) -> void:
+       if has_color_preview_gutter(textedit):
+               return
+       current_textedit = textedit
+       textedit.add_gutter(gutter_position)
+       textedit.set_gutter_width(gutter_position, 35)
+       textedit.set_gutter_name(gutter_position, preview_gutter_name)
+       textedit.set_gutter_type(gutter_position, TextEdit.GUTTER_TYPE_CUSTOM)
+       textedit.set_gutter_custom_draw(gutter_position, gutter_draw_color_preview)
+
+
+func remove_color_gutter(textedit: TextEdit) -> void:
+       for gutter_index in textedit.get_gutter_count() - 1:
+               if gutter_index < 0:
+                       continue
+               var name = textedit.get_gutter_name(gutter_index)
+               if name == preview_gutter_name:
+                       textedit.remove_gutter(gutter_position)
+
+
+func gutter_draw_color_preview(line: int, gutter: int, area: Rect2) -> void:
+       if not current_textedit or line > current_textedit.get_line_count() - 1:
+               return
+
+       var size: int
+       var offset := Vector2.ZERO
+       # centering the preview square in the line because perfectionism
+       if area.size.x < area.size.y:
+               size = area.size.x
+               offset = Vector2(0, (area.size.y - area.size.x) /2)
+       else:
+               size = area.size.y
+               offset = Vector2((area.size.x - area.size.y) /2, 0)
+       var icon_region := Rect2(area.position + offset, Vector2(size, size))
+
+       # spacing the squares so they don't merge
+       var padding = size / 6
+       icon_region = icon_region.grow(-padding)
+
+       var icon_corner_region := PackedVector2Array([
+               icon_region.end,
+               icon_region.end + Vector2(-icon_region.size.x / 2, 0.0),
+               icon_region.end + Vector2(0.0, -icon_region.size.y / 2)
+       ])
+
+       var mouse_pos := current_textedit.get_local_mouse_pos()
+       var hovering := area.has_point(mouse_pos)
+       var line_color = get_line_color(current_textedit, line)
+
+       # black is falsey, comparing to null allows us to preview it
+       if line_color is Color:
+               line_color = line_color as Color
+
+               if line_color.a < 1:    # transparent -> add checkered bg + no-alpha corner
+                       current_textedit.draw_rect(icon_region, Color.WHITE)
+                       current_textedit.draw_rect( Rect2(
+                               Vector2(icon_region.position.x + icon_region.size.x/2, icon_region.position.y),
+                               icon_region.size/2
+                       ), Color.DIM_GRAY)
+                       current_textedit.draw_rect( Rect2(
+                               Vector2(icon_region.position.x, icon_region.position.y + icon_region.size.y/2),
+                               icon_region.size/2
+                       ), Color.DIM_GRAY)
+
+                       current_textedit.draw_colored_polygon(icon_corner_region, Color(line_color, 1.0))
+
+               current_textedit.draw_rect(icon_region, line_color)
+               current_textedit.set_line_gutter_clickable(line, gutter_position, true)
+
+               if hovering:
+                       hovering_line = line
+       else:
+               if hovering:
+                       hovering_line = null
+
+       # not captured by the hovering check above
+       # if left or right of gutter, forget the line
+       if mouse_pos.x > area.end.x or mouse_pos.x < area.position.x:
+               # in case the picker is open, remember the line even when moving away
+               if not picker_popup or not picker_popup.visible:
+                       hovering_line = null
+
+
+func get_colors_from_textedit(textedit: TextEdit) -> void:
+       var all_lines := textedit.text.split("\n")
+       var has_color := false
+
+       for line_index in len(all_lines):
+               var color = color_from_string(all_lines[line_index])
+               if color != null:
+                       has_color = true
+                       set_line_color(textedit, line_index, color)
+                       textedit.set_gutter_draw(gutter_position, true)
+               else:
+                       set_line_color(textedit, line_index)
+
+       if not has_color:
+               textedit.set_gutter_draw(gutter_position, false)
+
+
+func set_line_color(textedit: TextEdit, line: int, color = null) -> void:
+       textedit.set_line_gutter_metadata(line, gutter_position, color)
+
+
+func get_line_color(textedit: TextEdit, line: int):
+       var meta = textedit.get_line_gutter_metadata(line, gutter_position)
+       return meta if meta is Color else null
+
+
+### ### ### COLOR PICKER ### ### ###
+
+func textedit_clicked(event: InputEvent, textedit: TextEdit) -> void:
+       if hovering_line != null:
+               if event is InputEventMouseButton:
+                       if event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
+                               var color: Color = get_line_color(textedit, hovering_line)
+                               if color != null:
+                                       picker_popup.get_node("%ColorPreviewPicker").color = color
+                                       picker_popup.position = event.global_position + Vector2(20, 0)
+                                       picker_popup.popup()
+
+
+func picker_color_changed(new_color: Color) -> void:
+       if hovering_line and current_textedit:
+               set_line_color(current_textedit, hovering_line, new_color)
+
+
+func on_picker_popup_close() -> void:
+       if not hovering_line:
+               return
+       var text := current_textedit.get_line(hovering_line)
+       var color_match := regex.search(text)
+       var new_color = get_line_color(current_textedit, hovering_line)
+
+       if color_from_regex_match(color_match) == new_color:
+               return # don't change if equal -> doesn't mess up constants, strings etc.
+
+       if color_match.get_string("color_const"): # replace the whole color string
+               text = text.replace(color_match.get_string(), "Color" + str(new_color))
+
+       else: # only replace inside parenthesis to cover Color(...) and vec4(...)
+               var color_string := str(new_color).replace("(", "").replace(")", "")
+               var params := color_match.get_string("color_params")
+               if params == "":
+                       params = color_match.get_string("vec4_params")
+               text = text.replace(params, color_string)
+
+       current_textedit.set_line(hovering_line, text)
+
+
+### ### ### COLOR INTERPRETATION ### ### ###
+
+func color_from_string(string: String): # Color or null
+       var color_match := regex.search(string)
+       if !color_match:
+               return null
+       return color_from_regex_match(color_match)
+
+
+func color_from_regex_match(regex_match: RegExMatch): # Color or null
+       var color_const := regex_match.get_string("color_const")
+       if ColorHelper.is_named_color(color_const):
+               return Color(color_const)
+
+       var params := regex_match.get_string("color_params")
+       if params == "":
+               params = regex_match.get_string("vec4_params")
+
+       if not "," in params:
+               var color = color_from_string(params)
+               if color != null:
+                       return color
+               color = named_or_hex_color(params)
+               if color != null:
+                       return color
+
+       var parameters := params.split(",")
+       var parameter_count := parameters.size()
+       if parameter_count == 2:
+                       var color = color_from_string(parameters[0])
+                       if color != null:
+                               return Color(color, parameters[1].to_float())
+                       color = named_or_hex_color(parameters[0])
+                       if color != null:
+                               return Color(color , parameters[1].to_float())
+       elif parameter_count == 3:
+                       return Color(
+                               parameters[0].to_float(),
+                               parameters[1].to_float(),
+                               parameters[2].to_float(),
+                       )
+       elif parameter_count == 4:
+                       return Color(
+                               parameters[0].to_float(),
+                               parameters[1].to_float(),
+                               parameters[2].to_float(),
+                               parameters[3].to_float(),
+                       )
+       return null
+
+
+func named_or_hex_color(string: String): # Color or null
+       string = string.trim_prefix("\"").trim_prefix("\'").trim_suffix("\"").trim_suffix("\'")
+       if string.is_valid_html_color() or ColorHelper.is_named_color(string):
+               return Color(string)
+       return null
+
+
+
+
+
diff --git a/addons/ColorPreview/LICENSE b/addons/ColorPreview/LICENSE
new file mode 100644 (file)
index 0000000..163258e
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 Steen RH/Qubus0
+
+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/ColorPreview/Picker.tscn b/addons/ColorPreview/Picker.tscn
new file mode 100644 (file)
index 0000000..7881771
--- /dev/null
@@ -0,0 +1,15 @@
+[gd_scene format=3 uid="uid://dlhe1fiimv8if"]
+
+[node name="Popup" type="PopupPanel"]
+size = Vector2i(465, 775)
+
+[node name="ColorPreviewPicker" type="ColorPicker" parent="."]
+unique_name_in_owner = true
+offset_left = 14.0
+offset_top = 14.0
+offset_right = 435.0
+offset_bottom = 761.0
+grow_horizontal = 2
+grow_vertical = 2
+color = Color(0.129412, 0.145098, 0.176471, 1)
+deferred_mode = true
diff --git a/addons/ColorPreview/plugin.cfg b/addons/ColorPreview/plugin.cfg
new file mode 100644 (file)
index 0000000..175431d
--- /dev/null
@@ -0,0 +1,7 @@
+[plugin]
+
+name="ColorPreview"
+description="An Editor Plugin which lets you preview and adjust colors from code directly next to them"
+author="Ste and Contributors"
+version="2.1.0"
+script="ColorPreview.gd"
diff --git a/addons/anthonyec.camera_preview/GuiResizerTopLeft.svg b/addons/anthonyec.camera_preview/GuiResizerTopLeft.svg
new file mode 100644 (file)
index 0000000..fe4dbf5
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M4 11V4h7" fill="none" stroke="#fff" stroke-width="2" stroke-linejoin="round" stroke-linecap="round" stroke-opacity=".6"/></svg>
diff --git a/addons/anthonyec.camera_preview/GuiResizerTopLeft.svg.import b/addons/anthonyec.camera_preview/GuiResizerTopLeft.svg.import
new file mode 100644 (file)
index 0000000..9584d3b
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://btc01wc11tiid"
+path="res://.godot/imported/GuiResizerTopLeft.svg-eb563f557424c74239e878a1213a5bf4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/anthonyec.camera_preview/GuiResizerTopLeft.svg"
+dest_files=["res://.godot/imported/GuiResizerTopLeft.svg-eb563f557424c74239e878a1213a5bf4.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=2.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/anthonyec.camera_preview/GuiResizerTopRight.svg b/addons/anthonyec.camera_preview/GuiResizerTopRight.svg
new file mode 100644 (file)
index 0000000..dd00953
--- /dev/null
@@ -0,0 +1 @@
+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M12 11V4h-7" fill="none" stroke="#fff" stroke-opacity=".6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
diff --git a/addons/anthonyec.camera_preview/GuiResizerTopRight.svg.import b/addons/anthonyec.camera_preview/GuiResizerTopRight.svg.import
new file mode 100644 (file)
index 0000000..4a1fa5d
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://04l05jxuyt7k"
+path="res://.godot/imported/GuiResizerTopRight.svg-cc1dc8556d51357c5eb0b01d09d8f049.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/anthonyec.camera_preview/GuiResizerTopRight.svg"
+dest_files=["res://.godot/imported/GuiResizerTopRight.svg-cc1dc8556d51357c5eb0b01d09d8f049.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=2.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/anthonyec.camera_preview/Pin.svg b/addons/anthonyec.camera_preview/Pin.svg
new file mode 100644 (file)
index 0000000..8e5935c
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4 1v1l1 1v3h6v-3l1-1v-1zm1 6-2 3h10l-2-3zm2 4v2l1 2 1-2v-2z" fill="#e0e0e0"/></svg>
diff --git a/addons/anthonyec.camera_preview/Pin.svg.import b/addons/anthonyec.camera_preview/Pin.svg.import
new file mode 100644 (file)
index 0000000..27d274f
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://do6d60od41vmg"
+path="res://.godot/imported/Pin.svg-83b09f5c00a829c5d8b136bf5bae65bc.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/anthonyec.camera_preview/Pin.svg"
+dest_files=["res://.godot/imported/Pin.svg-83b09f5c00a829c5d8b136bf5bae65bc.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=2.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/anthonyec.camera_preview/drag_handle.gd b/addons/anthonyec.camera_preview/drag_handle.gd
new file mode 100644 (file)
index 0000000..445cc50
--- /dev/null
@@ -0,0 +1,6 @@
+extends Button
+
+func _get_drag_data(at_position: Vector2) -> Variant:
+       var duplicate = get_parent().duplicate()
+       set_drag_preview(duplicate)
+       return {}
diff --git a/addons/anthonyec.camera_preview/plugin.cfg b/addons/anthonyec.camera_preview/plugin.cfg
new file mode 100644 (file)
index 0000000..42adb86
--- /dev/null
@@ -0,0 +1,7 @@
+[plugin]
+
+name="Little Camera Preview"
+description="Shows a picture-in-picture preview of the selected 2D or 3D camera"
+author="Anthony Cossins"
+version="0.9"
+script="plugin.gd"
diff --git a/addons/anthonyec.camera_preview/plugin.gd b/addons/anthonyec.camera_preview/plugin.gd
new file mode 100644 (file)
index 0000000..4e74dd8
--- /dev/null
@@ -0,0 +1,87 @@
+@tool
+extends EditorPlugin
+
+const preview_scene = preload("res://addons/anthonyec.camera_preview/preview.tscn")
+
+var preview: CameraPreview
+var current_main_screen_name: String
+
+func _enter_tree() -> void:
+       main_screen_changed.connect(_on_main_screen_changed)
+       EditorInterface.get_selection().selection_changed.connect(_on_editor_selection_changed)
+       
+       # Initialise preview panel and add to main screen.
+       preview = preview_scene.instantiate() as CameraPreview
+       preview.request_hide()
+       
+       var main_screen = EditorInterface.get_editor_main_screen()
+       main_screen.add_child(preview)
+       
+func _exit_tree() -> void:
+       if preview:
+               preview.queue_free()
+               
+func _ready() -> void:
+       # TODO: Currently there is no API to get the main screen name without 
+       # listening to the `EditorPlugin.main_screen_changed` signal:
+       # https://github.com/godotengine/godot-proposals/issues/2081
+       EditorInterface.set_main_screen_editor("Script")
+       EditorInterface.set_main_screen_editor("3D")
+       
+func _on_main_screen_changed(screen_name: String) -> void:
+       current_main_screen_name = screen_name
+       
+        # TODO: Bit of a hack to prevent pinned staying between view changes on the same scene.
+       preview.unlink_camera()
+       _on_editor_selection_changed()
+
+func _on_editor_selection_changed() -> void:
+       if not is_main_screen_viewport():
+               # This hides the preview "container" and not the preview itself, allowing
+               # any locked previews to remain visible once switching back to 3D tab.
+               preview.visible = false
+               return
+               
+       preview.visible = true
+       
+       var selected_nodes = EditorInterface.get_selection().get_selected_nodes()
+       
+       var selected_camera_3d: Camera3D = find_camera_3d_or_null(selected_nodes)
+       var selected_camera_2d: Camera2D = find_camera_2d_or_null(selected_nodes)
+       
+       if selected_camera_3d and current_main_screen_name == "3D":
+               preview.link_with_camera_3d(selected_camera_3d)
+               preview.request_show()
+       
+       elif selected_camera_2d and current_main_screen_name == "2D":
+               preview.link_with_camera_2d(selected_camera_2d)
+               preview.request_show()
+               
+       else:
+               preview.request_hide()
+       
+func is_main_screen_viewport() -> bool:
+       return current_main_screen_name == "3D" or current_main_screen_name == "2D"
+       
+func find_camera_3d_or_null(nodes: Array[Node]) -> Camera3D:
+       var camera: Camera3D
+       
+       for node in nodes:
+               if node is Camera3D:
+                       camera = node as Camera3D
+                       break
+                       
+       return camera
+       
+func find_camera_2d_or_null(nodes: Array[Node]) -> Camera2D:
+       var camera: Camera2D
+       
+       for node in nodes:
+               if node is Camera2D:
+                       camera = node as Camera2D
+                       break
+                       
+       return camera
+
+func _on_selected_camera_3d_tree_exiting() -> void:
+       preview.unlink_camera()
diff --git a/addons/anthonyec.camera_preview/preview.gd b/addons/anthonyec.camera_preview/preview.gd
new file mode 100644 (file)
index 0000000..2d1446a
--- /dev/null
@@ -0,0 +1,311 @@
+@tool
+
+class_name CameraPreview
+extends Control
+
+enum CameraType {
+       CAMERA_2D,
+       CAMERA_3D
+}
+
+enum PinnedPosition {
+       LEFT,
+       RIGHT,
+}
+
+enum InteractionState {
+       NONE,
+       RESIZE,
+       DRAG,
+
+       # Animation is split into 2 seperate states so that the tween is only 
+       # invoked once in the "start" state. 
+       START_ANIMATE_INTO_PLACE,
+       ANIMATE_INTO_PLACE,
+}
+
+const margin_3d: Vector2 = Vector2(20, 20)
+const margin_2d: Vector2 = Vector2(40, 30)
+const min_panel_width: float = 250
+const max_panel_width_ratio: float = 0.6
+
+@onready var panel: Panel = %Panel
+@onready var placeholder: Panel = %Placeholder
+@onready var preview_camera_3d: Camera3D = %Camera3D
+@onready var preview_camera_2d: Camera2D = %Camera2D
+@onready var sub_viewport: SubViewport = %SubViewport
+@onready var sub_viewport_text_rect: TextureRect = %TextureRect
+@onready var resize_left_handle: Button = %ResizeLeftHandle
+@onready var resize_right_handle: Button = %ResizeRightHandle
+@onready var lock_button: Button = %LockButton
+@onready var gradient: TextureRect = %Gradient
+
+var camera_type: CameraType = CameraType.CAMERA_3D
+var pinned_position: PinnedPosition = PinnedPosition.RIGHT
+var viewport_ratio: float = 1
+var screen_scale: float = 1
+var is_locked: bool
+var show_controls: bool
+var selected_camera_3d: Camera3D
+var selected_camera_2d: Camera2D
+var remote_transform_3d: RemoteTransform3D
+var remote_transform_2d: RemoteTransform2D
+
+var state: InteractionState = InteractionState.NONE
+var initial_mouse_position: Vector2
+var initial_panel_size: Vector2
+var initial_panel_position: Vector2
+
+func _ready() -> void:
+       screen_scale = DisplayServer.screen_get_scale()
+       
+       # Setting texture to viewport in code instead of directly in the editor 
+       # because otherwise an error "Path to node is invalid: Panel/SubViewport"
+       # on first load. This is harmless but doesn't look great.
+       #
+       # This is a known issue:
+       # https://github.com/godotengine/godot/issues/27790#issuecomment-499740220
+       sub_viewport_text_rect.texture = sub_viewport.get_texture()
+
+func _process(_delta: float) -> void:
+       if not visible: return
+       
+       var window_width = float(ProjectSettings.get_setting("display/window/size/viewport_width"))
+       var window_height = float(ProjectSettings.get_setting("display/window/size/viewport_height"))
+       viewport_ratio = window_height / window_width
+       
+       match state:
+               InteractionState.NONE:
+                       # Constrain panel size to aspect ratio.
+                       panel.size.y = panel.size.x * viewport_ratio
+                       
+                       # Clamp size.
+                       panel.size = panel.size.clamp(
+                               Vector2(min_panel_width * screen_scale, min_panel_width * screen_scale * viewport_ratio),
+                               Vector2(size.x * max_panel_width_ratio, size.x * max_panel_width_ratio * viewport_ratio)
+                       )
+                       
+                       panel.position = get_pinned_position(pinned_position)
+                       
+               InteractionState.RESIZE:
+                       var delta_mouse_position = initial_mouse_position - get_global_mouse_position()
+               
+                       if pinned_position == PinnedPosition.LEFT:
+                               panel.size = initial_panel_size - delta_mouse_position
+                               
+                       if pinned_position == PinnedPosition.RIGHT:
+                               panel.size = initial_panel_size + delta_mouse_position
+                               
+                       # Constrain panel size to aspect ratio.
+                       panel.size.y = panel.size.x * viewport_ratio
+                       
+                       # Clamp size.
+                       panel.size = panel.size.clamp(
+                               Vector2(min_panel_width * screen_scale, min_panel_width * screen_scale * viewport_ratio),
+                               Vector2(size.x * max_panel_width_ratio, size.x * max_panel_width_ratio * viewport_ratio)
+                       )
+                       
+                       panel.position = get_pinned_position(pinned_position)
+                       
+               InteractionState.DRAG:
+                       placeholder.size = panel.size
+                       
+                       var global_mouse_position = get_global_mouse_position()
+                       var offset = initial_mouse_position - initial_panel_position
+
+                       panel.global_position = global_mouse_position - offset
+
+                       if global_mouse_position.x < global_position.x + size.x / 2:
+                               pinned_position = PinnedPosition.LEFT
+                       else:
+                               pinned_position = PinnedPosition.RIGHT
+                               
+                       placeholder.position = get_pinned_position(pinned_position)
+                       
+               InteractionState.START_ANIMATE_INTO_PLACE:
+                       var final_position: Vector2 = get_pinned_position(pinned_position)
+                       var tween = get_tree().create_tween()
+                       
+                       tween.set_ease(Tween.EASE_OUT)
+                       tween.set_trans(Tween.TRANS_CUBIC)
+                       tween.tween_property(panel, "position", final_position, 0.3)
+                       
+                       tween.finished.connect(func():
+                               panel.position = final_position
+                               state = InteractionState.NONE
+                       )
+                       
+                       state = InteractionState.ANIMATE_INTO_PLACE
+                       
+       # I couldn't get `mouse_entered` and `mouse_exited` events to work 
+       # nicely, so I use rect method instead. Plus using this method it's easy to
+       # grow the hit area size.
+       var panel_hover_rect = Rect2(panel.global_position, panel.size)
+       panel_hover_rect = panel_hover_rect.grow(40)
+       
+       var mouse_position = get_global_mouse_position()
+       
+       show_controls = state != InteractionState.NONE or panel_hover_rect.has_point(mouse_position)
+       
+       # UI visibility.
+       resize_left_handle.visible = show_controls and pinned_position == PinnedPosition.RIGHT
+       resize_right_handle.visible = show_controls and pinned_position == PinnedPosition.LEFT
+       lock_button.visible = show_controls or is_locked
+       placeholder.visible = state == InteractionState.DRAG or state == InteractionState.ANIMATE_INTO_PLACE
+       gradient.visible = show_controls
+       
+       # Sync camera settings.
+       if camera_type == CameraType.CAMERA_3D and selected_camera_3d:
+               # TODO: Don't think this is needed and can just assign `panel.size` directly.
+               var viewport_size = Vector2(panel.size.x, panel.size.x * viewport_ratio)
+               sub_viewport.size = viewport_size
+               
+               preview_camera_3d.fov = selected_camera_3d.fov
+               preview_camera_3d.projection = selected_camera_3d.projection
+               preview_camera_3d.size = selected_camera_3d.size
+               preview_camera_3d.cull_mask = selected_camera_3d.cull_mask
+               preview_camera_3d.keep_aspect = selected_camera_3d.keep_aspect
+               preview_camera_3d.near = selected_camera_3d.near
+               preview_camera_3d.far = selected_camera_3d.far
+               preview_camera_3d.h_offset = selected_camera_3d.h_offset
+               preview_camera_3d.v_offset = selected_camera_3d.v_offset
+               preview_camera_3d.attributes = selected_camera_3d.attributes
+               preview_camera_3d.environment = selected_camera_3d.environment
+       
+       if camera_type == CameraType.CAMERA_2D and selected_camera_2d:
+               var ratio = window_width / panel.size.x
+               
+               # TODO: Is there a better way to fix this?
+               # The camera border is visible sometimes due to pixel rounding. 
+               # Subtract 1px from right and bottom to hide this.
+               var hide_camera_border_fix = Vector2(1, 1)
+               
+               sub_viewport.size = panel.size
+               sub_viewport.size_2d_override = (panel.size - hide_camera_border_fix) * ratio
+               sub_viewport.size_2d_override_stretch = true
+
+               preview_camera_2d.offset = selected_camera_2d.offset
+               preview_camera_2d.zoom = selected_camera_2d.zoom
+               preview_camera_2d.ignore_rotation = selected_camera_2d.ignore_rotation
+               preview_camera_2d.anchor_mode = selected_camera_2d.anchor_mode
+               preview_camera_2d.limit_left = selected_camera_2d.limit_left
+               preview_camera_2d.limit_right = selected_camera_2d.limit_right
+               preview_camera_2d.limit_top = selected_camera_2d.limit_top
+               preview_camera_2d.limit_bottom = selected_camera_2d.limit_bottom
+
+func link_with_camera_3d(camera_3d: Camera3D) -> void:
+       # TODO: Camera may not be ready since this method is called in `_enter_tree` 
+       # in the plugin because of a workaround for: 
+       # https://github.com/godotengine/godot-proposals/issues/2081
+       if not preview_camera_3d:
+               return request_hide()
+               
+       var is_different_camera = camera_3d != preview_camera_3d
+       
+       # TODO: A bit messy.
+       if is_different_camera:
+               if preview_camera_3d.tree_exiting.is_connected(unlink_camera):
+                       preview_camera_3d.tree_exiting.disconnect(unlink_camera)
+               
+               if not camera_3d.tree_exiting.is_connected(unlink_camera):
+                       camera_3d.tree_exiting.connect(unlink_camera)
+               
+       sub_viewport.disable_3d = false
+       sub_viewport.world_3d = camera_3d.get_world_3d()
+               
+       remote_transform_3d = RemoteTransform3D.new()
+       
+       remote_transform_3d.remote_path = preview_camera_3d.get_path()
+       remote_transform_3d.use_global_coordinates = true
+       
+       camera_3d.add_child(remote_transform_3d)
+       selected_camera_3d = camera_3d
+       
+       camera_type = CameraType.CAMERA_3D
+       
+func link_with_camera_2d(camera_2d: Camera2D) -> void:
+       if not preview_camera_2d:
+               return request_hide()
+       
+       var is_different_camera = camera_2d != preview_camera_2d
+       
+       # TODO: A bit messy.
+       if is_different_camera:
+               if preview_camera_2d.tree_exiting.is_connected(unlink_camera):
+                       preview_camera_2d.tree_exiting.disconnect(unlink_camera)
+               
+               if not camera_2d.tree_exiting.is_connected(unlink_camera):
+                       camera_2d.tree_exiting.connect(unlink_camera)
+               
+       sub_viewport.disable_3d = true
+       sub_viewport.world_2d = camera_2d.get_world_2d()
+               
+       remote_transform_2d = RemoteTransform2D.new()
+       
+       remote_transform_2d.remote_path = preview_camera_2d.get_path()
+       remote_transform_2d.use_global_coordinates = true
+       
+       camera_2d.add_child(remote_transform_2d)
+       selected_camera_2d = camera_2d
+       
+       camera_type = CameraType.CAMERA_2D
+
+func unlink_camera() -> void:
+       if selected_camera_3d:
+               selected_camera_3d.remove_child(remote_transform_3d)
+               selected_camera_3d = null
+       
+       if selected_camera_2d:
+               selected_camera_2d.remove_child(remote_transform_2d)
+               selected_camera_2d = null
+       
+       is_locked = false
+       lock_button.button_pressed = false
+       
+func request_hide() -> void:
+       if is_locked: return
+       visible = false
+       
+func request_show() -> void:
+       visible = true
+       
+func get_pinned_position(pinned_position: PinnedPosition) -> Vector2:
+       var margin: Vector2 = margin_3d
+       
+       if camera_type == CameraType.CAMERA_2D:
+               margin = margin_2d
+       
+       match pinned_position:
+               PinnedPosition.LEFT:
+                       return Vector2.ZERO - Vector2(0, panel.size.y) - Vector2(-margin.x, margin.y)
+               PinnedPosition.RIGHT:
+                       return size - panel.size - margin
+               _:
+                       assert(false, "Unknown pinned position %s" % str(pinned_position))
+                       
+       return Vector2.ZERO
+
+func _on_resize_handle_button_down() -> void:
+       if state != InteractionState.NONE: return
+       
+       state = InteractionState.RESIZE
+       initial_mouse_position = get_global_mouse_position()
+       initial_panel_size = panel.size
+
+func _on_resize_handle_button_up() -> void:
+       state = InteractionState.NONE
+
+func _on_drag_handle_button_down() -> void:
+       if state != InteractionState.NONE: return
+               
+       state = InteractionState.DRAG
+       initial_mouse_position = get_global_mouse_position()
+       initial_panel_position = panel.global_position
+
+func _on_drag_handle_button_up() -> void:
+       if state != InteractionState.DRAG: return
+       
+       state = InteractionState.START_ANIMATE_INTO_PLACE
+
+func _on_lock_button_pressed() -> void:
+       is_locked = !is_locked
diff --git a/addons/anthonyec.camera_preview/preview.tscn b/addons/anthonyec.camera_preview/preview.tscn
new file mode 100644 (file)
index 0000000..1979b33
--- /dev/null
@@ -0,0 +1,173 @@
+[gd_scene load_steps=7 format=3 uid="uid://xybmfvufjuv"]
+
+[ext_resource type="Script" path="res://addons/anthonyec.camera_preview/preview.gd" id="1_6b32r"]
+[ext_resource type="Texture2D" uid="uid://do6d60od41vmg" path="res://addons/anthonyec.camera_preview/Pin.svg" id="2_p0pa8"]
+[ext_resource type="Texture2D" uid="uid://btc01wc11tiid" path="res://addons/anthonyec.camera_preview/GuiResizerTopLeft.svg" id="2_t64ej"]
+[ext_resource type="Texture2D" uid="uid://04l05jxuyt7k" path="res://addons/anthonyec.camera_preview/GuiResizerTopRight.svg" id="3_6yuab"]
+
+[sub_resource type="Gradient" id="Gradient_11p6r"]
+offsets = PackedFloat32Array(0, 0.3, 0.6, 1)
+colors = PackedColorArray(0, 0, 0, 0.235294, 0, 0, 0, 0.0784314, 0, 0, 0, 0.0784314, 0, 0, 0, 0.235294)
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_4dkve"]
+gradient = SubResource("Gradient_11p6r")
+width = 256
+height = 256
+fill_to = Vector2(2.08165e-12, 1)
+
+[node name="Preview" type="Control"]
+z_index = 999
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_6b32r")
+
+[node name="Placeholder" type="Panel" parent="."]
+unique_name_in_owner = true
+visible = false
+modulate = Color(1, 1, 1, 0.705882)
+layout_mode = 1
+anchors_preset = 3
+anchor_left = 1.0
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -40.0
+offset_top = -40.0
+offset_right = 410.0
+offset_bottom = 410.0
+grow_horizontal = 0
+grow_vertical = 0
+
+[node name="Panel" type="Panel" parent="."]
+unique_name_in_owner = true
+clip_contents = true
+layout_mode = 1
+anchors_preset = 3
+anchor_left = 1.0
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -520.0
+offset_top = -301.25
+offset_right = -20.0
+offset_bottom = -20.0
+grow_horizontal = 0
+grow_vertical = 0
+pivot_offset = Vector2(450, 300)
+
+[node name="SubViewport" type="SubViewport" parent="Panel"]
+unique_name_in_owner = true
+handle_input_locally = false
+gui_disable_input = true
+size_2d_override_stretch = true
+
+[node name="Camera3D" type="Camera3D" parent="Panel/SubViewport"]
+unique_name_in_owner = true
+current = true
+
+[node name="Camera2D" type="Camera2D" parent="Panel/SubViewport"]
+unique_name_in_owner = true
+ignore_rotation = false
+
+[node name="ViewportMarginContainer" type="MarginContainer" parent="Panel"]
+clip_contents = true
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme_override_constants/margin_left = 4
+theme_override_constants/margin_top = 4
+theme_override_constants/margin_right = 4
+theme_override_constants/margin_bottom = 4
+
+[node name="TextureRect" type="TextureRect" parent="Panel/ViewportMarginContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+expand_mode = 2
+
+[node name="DragHandle" type="Button" parent="Panel"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+focus_mode = 0
+flat = true
+
+[node name="Gradient" type="TextureRect" parent="Panel"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+texture = SubResource("GradientTexture2D_4dkve")
+
+[node name="OverlayMarginContainer" type="MarginContainer" parent="Panel"]
+clip_contents = true
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme_override_constants/margin_left = 4
+theme_override_constants/margin_top = 4
+theme_override_constants/margin_right = 4
+theme_override_constants/margin_bottom = 4
+
+[node name="ResizeLeftHandle" type="Button" parent="Panel/OverlayMarginContainer"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 0
+mouse_default_cursor_shape = 12
+icon = ExtResource("2_t64ej")
+flat = true
+icon_alignment = 1
+
+[node name="ResizeRightHandle" type="Button" parent="Panel/OverlayMarginContainer"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+size_flags_horizontal = 8
+size_flags_vertical = 0
+mouse_default_cursor_shape = 11
+icon = ExtResource("3_6yuab")
+flat = true
+icon_alignment = 1
+
+[node name="LockButton" type="Button" parent="Panel/OverlayMarginContainer"]
+unique_name_in_owner = true
+visible = false
+custom_minimum_size = Vector2(40, 40)
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 8
+tooltip_text = "Always Show Preview"
+toggle_mode = true
+icon = ExtResource("2_p0pa8")
+flat = true
+icon_alignment = 1
+
+[connection signal="button_down" from="Panel/DragHandle" to="." method="_on_drag_handle_button_down"]
+[connection signal="button_up" from="Panel/DragHandle" to="." method="_on_drag_handle_button_up"]
+[connection signal="renamed" from="Panel/DragHandle" to="." method="_on_drag_handle_renamed"]
+[connection signal="button_down" from="Panel/OverlayMarginContainer/ResizeLeftHandle" to="." method="_on_resize_handle_button_down"]
+[connection signal="button_up" from="Panel/OverlayMarginContainer/ResizeLeftHandle" to="." method="_on_resize_handle_button_up"]
+[connection signal="button_down" from="Panel/OverlayMarginContainer/ResizeRightHandle" to="." method="_on_resize_handle_button_down"]
+[connection signal="button_up" from="Panel/OverlayMarginContainer/ResizeRightHandle" to="." method="_on_resize_handle_button_up"]
+[connection signal="pressed" from="Panel/OverlayMarginContainer/LockButton" to="." method="_on_lock_button_pressed"]
diff --git a/addons/data/scripts/player/player_controller.gd b/addons/data/scripts/player/player_controller.gd
new file mode 100644 (file)
index 0000000..4562d0a
--- /dev/null
@@ -0,0 +1,37 @@
+extends CharacterBody3D
+
+var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
+var speed = 5
+var jump_speed = 5
+var mouse_sensitivity = 0.002
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+       Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
+       OS.open_midi_inputs()
+       print(OS.get_connected_midi_inputs())
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+       pass
+
+func _physics_process(delta):
+       velocity.y += -gravity * delta
+       var input = Input.get_vector("left", "right", "forward", "back")
+       var movement_dir = transform.basis * Vector3(input.x, 0, input.y)
+       velocity.x = movement_dir.x * speed
+       velocity.z = movement_dir.z * speed
+
+       move_and_slide()
+       if is_on_floor() and Input.is_action_just_pressed("jump"):
+               velocity.y = jump_speed
+
+func _input(event):
+       
+       if event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
+               rotate_y(-event.relative.x * mouse_sensitivity)
+               $Camera3D.rotate_x(-event.relative.y * mouse_sensitivity)
+               $Camera3D.rotation.x = clampf($Camera3D.rotation.x, -deg_to_rad(70), deg_to_rad(70))
+
+
+
diff --git a/addons/data/scripts/rotate_cube.gd b/addons/data/scripts/rotate_cube.gd
new file mode 100644 (file)
index 0000000..688a02b
--- /dev/null
@@ -0,0 +1,11 @@
+extends Node3D
+var speed = 1
+
+# 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):
+       rotate_y(speed * delta)
diff --git a/addons/data/scripts/sprite_rotation/sprite_rotation.gd b/addons/data/scripts/sprite_rotation/sprite_rotation.gd
new file mode 100644 (file)
index 0000000..4105fbd
--- /dev/null
@@ -0,0 +1,68 @@
+extends AnimatedSprite3D
+
+var cam
+var cam_pos
+var look_point_pos
+var look_point_dir
+var cam_dir
+var angle_to_cam
+var angle_to_lookpoint
+var enemy_angle
+
+func _ready():
+       #Get the player's camera
+       cam = get_viewport().get_camera_3d();
+
+
+func _process(delta):
+       #Gets the position of the object the sprite is "looking" at
+       look_point_pos = get_parent().get_node("RotationRange/Lookpoint").global_position
+       look_point_dir = position - look_point_pos
+
+       #Billboards the sprite so it always looks at the player
+       cam_pos = cam.global_transform.origin
+       look_at(cam_pos, Vector3(0, 1, 0))
+       rotation.x = 0
+
+
+       # Calculate the angle of the sprite, taking into consideration both the object the sprite is looking at
+       # and the position of the camera, and convert the radians to degrees for more human friendly readability
+       cam_dir = position - cam_pos
+       angle_to_cam = rad_to_deg(atan2(cam_dir.x, cam_dir.z))
+       angle_to_lookpoint = rad_to_deg(atan2(look_point_dir.x, look_point_dir.z))
+       enemy_angle = angle_to_cam - angle_to_lookpoint
+       
+       #Fix negative degrees
+       if enemy_angle < 0:
+               enemy_angle += 360
+               
+       #Here I split up the angle in nice equal chunks so we get 8 even segments for an
+       # 8-directional sprite, like most classic FPS games!
+       # Feel free to multiply/divide the statements if
+       # you want something like only 4-directions or even 16 or more, the limit is your
+       # imagination/hardware!
+       
+       if enemy_angle >= 292.5 && enemy_angle < 337.5:
+               play("front_left")
+
+       elif enemy_angle >= 22.5 && enemy_angle < 67.5:
+               play("front_right")
+
+       elif enemy_angle >= 67.5 && enemy_angle < 112.5:
+               play("right")
+
+       elif enemy_angle >= 112.5 && enemy_angle < 157.5:
+               play("back_right")
+
+       elif enemy_angle >= 157.5 && enemy_angle < 202.5:
+               play("back")
+
+       elif enemy_angle >= 202.5 && enemy_angle < 247.5:
+               play("back_left")
+
+       elif enemy_angle >= 247.5 && enemy_angle < 292.5:
+               play("left")
+       
+       elif enemy_angle >= 337.5 || enemy_angle > 22.5:
+               play("front")
+
diff --git a/addons/data/sprites/test/test_back.png b/addons/data/sprites/test/test_back.png
new file mode 100644 (file)
index 0000000..3d27f6e
Binary files /dev/null and b/addons/data/sprites/test/test_back.png differ
diff --git a/addons/data/sprites/test/test_back.png.import b/addons/data/sprites/test/test_back.png.import
new file mode 100644 (file)
index 0000000..19486a0
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://crdueq1vpyv0j"
+path.s3tc="res://.godot/imported/test_back.png-3536068421ae4480d8467f7b96e54ba9.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/data/sprites/test/test_back.png"
+dest_files=["res://.godot/imported/test_back.png-3536068421ae4480d8467f7b96e54ba9.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/data/sprites/test/test_back_left.png b/addons/data/sprites/test/test_back_left.png
new file mode 100644 (file)
index 0000000..ab4fa53
Binary files /dev/null and b/addons/data/sprites/test/test_back_left.png differ
diff --git a/addons/data/sprites/test/test_back_left.png.import b/addons/data/sprites/test/test_back_left.png.import
new file mode 100644 (file)
index 0000000..05ad241
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b863t2dgq2tbe"
+path.s3tc="res://.godot/imported/test_back_left.png-6e8013f03dc7b97960eab8075148befe.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/data/sprites/test/test_back_left.png"
+dest_files=["res://.godot/imported/test_back_left.png-6e8013f03dc7b97960eab8075148befe.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/data/sprites/test/test_back_right.png b/addons/data/sprites/test/test_back_right.png
new file mode 100644 (file)
index 0000000..5130ffb
Binary files /dev/null and b/addons/data/sprites/test/test_back_right.png differ
diff --git a/addons/data/sprites/test/test_back_right.png.import b/addons/data/sprites/test/test_back_right.png.import
new file mode 100644 (file)
index 0000000..1e03990
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://m4fsj1y7wgmy"
+path.s3tc="res://.godot/imported/test_back_right.png-e3b436733eac700d3c2c60eb7848c81d.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/data/sprites/test/test_back_right.png"
+dest_files=["res://.godot/imported/test_back_right.png-e3b436733eac700d3c2c60eb7848c81d.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/data/sprites/test/test_front.png b/addons/data/sprites/test/test_front.png
new file mode 100644 (file)
index 0000000..b550fec
Binary files /dev/null and b/addons/data/sprites/test/test_front.png differ
diff --git a/addons/data/sprites/test/test_front.png.import b/addons/data/sprites/test/test_front.png.import
new file mode 100644 (file)
index 0000000..c6758a7
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://crublt6q32xrv"
+path.s3tc="res://.godot/imported/test_front.png-fed3040711ffcd3b53591c1c9b26e0dd.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/data/sprites/test/test_front.png"
+dest_files=["res://.godot/imported/test_front.png-fed3040711ffcd3b53591c1c9b26e0dd.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/data/sprites/test/test_front_left.png b/addons/data/sprites/test/test_front_left.png
new file mode 100644 (file)
index 0000000..c758578
Binary files /dev/null and b/addons/data/sprites/test/test_front_left.png differ
diff --git a/addons/data/sprites/test/test_front_left.png.import b/addons/data/sprites/test/test_front_left.png.import
new file mode 100644 (file)
index 0000000..9e7f034
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://m0dd2k3ux761"
+path.s3tc="res://.godot/imported/test_front_left.png-c4e48d4e9e3474140bec748e2802f74f.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/data/sprites/test/test_front_left.png"
+dest_files=["res://.godot/imported/test_front_left.png-c4e48d4e9e3474140bec748e2802f74f.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/data/sprites/test/test_front_right.png b/addons/data/sprites/test/test_front_right.png
new file mode 100644 (file)
index 0000000..b2422c5
Binary files /dev/null and b/addons/data/sprites/test/test_front_right.png differ
diff --git a/addons/data/sprites/test/test_front_right.png.import b/addons/data/sprites/test/test_front_right.png.import
new file mode 100644 (file)
index 0000000..f372310
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cwqj1k8755dh5"
+path.s3tc="res://.godot/imported/test_front_right.png-f768e6532cd301717a5c2fe390819561.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/data/sprites/test/test_front_right.png"
+dest_files=["res://.godot/imported/test_front_right.png-f768e6532cd301717a5c2fe390819561.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/data/sprites/test/test_left.png b/addons/data/sprites/test/test_left.png
new file mode 100644 (file)
index 0000000..baa2ba8
Binary files /dev/null and b/addons/data/sprites/test/test_left.png differ
diff --git a/addons/data/sprites/test/test_left.png.import b/addons/data/sprites/test/test_left.png.import
new file mode 100644 (file)
index 0000000..6e8096a
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://coges86bsxipe"
+path.s3tc="res://.godot/imported/test_left.png-87a60c4d902e9d862e66dee0e3bec361.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/data/sprites/test/test_left.png"
+dest_files=["res://.godot/imported/test_left.png-87a60c4d902e9d862e66dee0e3bec361.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/data/sprites/test/test_right.png b/addons/data/sprites/test/test_right.png
new file mode 100644 (file)
index 0000000..df46d74
Binary files /dev/null and b/addons/data/sprites/test/test_right.png differ
diff --git a/addons/data/sprites/test/test_right.png.import b/addons/data/sprites/test/test_right.png.import
new file mode 100644 (file)
index 0000000..5277987
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bictaivfrh2w7"
+path.s3tc="res://.godot/imported/test_right.png-07caae8d60b8e2bde6c92cd71fe9fbf6.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/data/sprites/test/test_right.png"
+dest_files=["res://.godot/imported/test_right.png-07caae8d60b8e2bde6c92cd71fe9fbf6.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/data/textures/grass.png b/addons/data/textures/grass.png
new file mode 100644 (file)
index 0000000..da85d68
Binary files /dev/null and b/addons/data/textures/grass.png differ
diff --git a/addons/data/textures/grass.png.import b/addons/data/textures/grass.png.import
new file mode 100644 (file)
index 0000000..8c62424
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bo7fd65wahjlk"
+path.s3tc="res://.godot/imported/grass.png-1c2c03bb870aed125d9926783d71f958.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/data/textures/grass.png"
+dest_files=["res://.godot/imported/grass.png-1c2c03bb870aed125d9926783d71f958.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/debug_menu/LICENSE.md b/addons/debug_menu/LICENSE.md
new file mode 100644 (file)
index 0000000..54fc020
--- /dev/null
@@ -0,0 +1,21 @@
+# MIT License
+
+Copyright © 2023-present Hugo Locurcio and contributors
+
+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/debug_menu/debug_menu.gd b/addons/debug_menu/debug_menu.gd
new file mode 100644 (file)
index 0000000..a1ab064
--- /dev/null
@@ -0,0 +1,479 @@
+extends CanvasLayer
+
+@export var fps: Label
+@export var frame_time: Label
+@export var frame_number: Label
+@export var frame_history_total_avg: Label
+@export var frame_history_total_min: Label
+@export var frame_history_total_max: Label
+@export var frame_history_total_last: Label
+@export var frame_history_cpu_avg: Label
+@export var frame_history_cpu_min: Label
+@export var frame_history_cpu_max: Label
+@export var frame_history_cpu_last: Label
+@export var frame_history_gpu_avg: Label
+@export var frame_history_gpu_min: Label
+@export var frame_history_gpu_max: Label
+@export var frame_history_gpu_last: Label
+@export var fps_graph: Panel
+@export var total_graph: Panel
+@export var cpu_graph: Panel
+@export var gpu_graph: Panel
+@export var information: Label
+@export var settings: Label
+
+## The number of frames to keep in history for graph drawing and best/worst calculations.
+## Currently, this also affects how FPS is measured.
+const HISTORY_NUM_FRAMES = 150
+
+const GRAPH_SIZE = Vector2(150, 25)
+const GRAPH_MIN_FPS = 10
+const GRAPH_MAX_FPS = 160
+const GRAPH_MIN_FRAMETIME = 1.0 / GRAPH_MIN_FPS
+const GRAPH_MAX_FRAMETIME = 1.0 / GRAPH_MAX_FPS
+
+## Debug menu display style.
+enum Style {
+       HIDDEN,  ## Debug menu is hidden.
+       VISIBLE_COMPACT,  ## Debug menu is visible, with only the FPS, FPS cap (if any) and time taken to render the last frame.
+       VISIBLE_DETAILED,  ## Debug menu is visible with full information, including graphs.
+       MAX,  ## Represents the size of the Style enum.
+}
+
+## The style to use when drawing the debug menu.
+var style := Style.HIDDEN:
+       set(value):
+               style = value
+               match style:
+                       Style.HIDDEN:
+                               visible = false
+                       Style.VISIBLE_COMPACT, Style.VISIBLE_DETAILED:
+                               visible = true
+                               frame_number.visible = style == Style.VISIBLE_DETAILED
+                               $DebugMenu/VBoxContainer/FrameTimeHistory.visible = style == Style.VISIBLE_DETAILED
+                               $DebugMenu/VBoxContainer/FPSGraph.visible = style == Style.VISIBLE_DETAILED
+                               $DebugMenu/VBoxContainer/TotalGraph.visible = style == Style.VISIBLE_DETAILED
+                               $DebugMenu/VBoxContainer/CPUGraph.visible = style == Style.VISIBLE_DETAILED
+                               $DebugMenu/VBoxContainer/GPUGraph.visible = style == Style.VISIBLE_DETAILED
+                               information.visible = style == Style.VISIBLE_DETAILED
+                               settings.visible = style == Style.VISIBLE_DETAILED
+
+# Value of `Time.get_ticks_usec()` on the previous frame.
+var last_tick := 0
+
+var thread := Thread.new()
+
+## Returns the sum of all values of an array (use as a parameter to `Array.reduce()`).
+var sum_func := func avg(accum: float, number: float) -> float: return accum + number
+
+# History of the last `HISTORY_NUM_FRAMES` rendered frames.
+var frame_history_total: Array[float] = []
+var frame_history_cpu: Array[float] = []
+var frame_history_gpu: Array[float] = []
+var fps_history: Array[float] = []  # Only used for graphs.
+
+var frametime_avg := GRAPH_MIN_FRAMETIME
+var frametime_cpu_avg := GRAPH_MAX_FRAMETIME
+var frametime_gpu_avg := GRAPH_MIN_FRAMETIME
+var frames_per_second := float(GRAPH_MIN_FPS)
+var frame_time_gradient := Gradient.new()
+
+func _init() -> void:
+       # This must be done here instead of `_ready()` to avoid having `visibility_changed` be emitted immediately.
+       visible = false
+
+       if not InputMap.has_action("cycle_debug_menu"):
+               # Create default input action if no user-defined override exists.
+               # We can't do it in the editor plugin's activation code as it doesn't seem to work there.
+               InputMap.add_action("cycle_debug_menu")
+               var event := InputEventKey.new()
+               event.keycode = KEY_F3
+               InputMap.action_add_event("cycle_debug_menu", event)
+
+
+func _ready() -> void:
+       fps_graph.draw.connect(_fps_graph_draw)
+       total_graph.draw.connect(_total_graph_draw)
+       cpu_graph.draw.connect(_cpu_graph_draw)
+       gpu_graph.draw.connect(_gpu_graph_draw)
+
+       fps_history.resize(HISTORY_NUM_FRAMES)
+       frame_history_total.resize(HISTORY_NUM_FRAMES)
+       frame_history_cpu.resize(HISTORY_NUM_FRAMES)
+       frame_history_gpu.resize(HISTORY_NUM_FRAMES)
+
+       # NOTE: Both FPS and frametimes are colored following FPS logic
+       # (red = 10 FPS, yellow = 60 FPS, green = 110 FPS, cyan = 160 FPS).
+       # This makes the color gradient non-linear.
+       # Colors are taken from <https://tailwindcolor.com/>.
+       frame_time_gradient.set_color(0, Color8(239, 68, 68))   # red-500
+       frame_time_gradient.set_color(1, Color8(56, 189, 248))  # light-blue-400
+       frame_time_gradient.add_point(0.3333, Color8(250, 204, 21))  # yellow-400
+       frame_time_gradient.add_point(0.6667, Color8(128, 226, 95))  # 50-50 mix of lime-400 and green-400
+
+       get_viewport().size_changed.connect(update_settings_label)
+
+       # Display loading text while information is being queried,
+       # in case the user toggles the full debug menu just after starting the project.
+       information.text = "Loading hardware information...\n\n "
+       settings.text = "Loading project information..."
+       thread.start(
+               func():
+                       # Disable thread safety checks as they interfere with this add-on.
+                       # This only affects this particular thread, not other thread instances in the project.
+                       # See <https://github.com/godotengine/godot/pull/78000> for details.
+                       # Use a Callable so that this can be ignored on Godot 4.0 without causing a script error
+                       # (thread safety checks were added in Godot 4.1).
+                       if Engine.get_version_info()["hex"] >= 0x040100:
+                               Callable(Thread, "set_thread_safety_checks_enabled").call(false)
+
+                       # Enable required time measurements to display CPU/GPU frame time information.
+                       # These lines are time-consuming operations, so run them in a separate thread.
+                       RenderingServer.viewport_set_measure_render_time(get_viewport().get_viewport_rid(), true)
+                       update_information_label()
+                       update_settings_label()
+       )
+
+
+func _input(event: InputEvent) -> void:
+       if event.is_action_pressed("cycle_debug_menu"):
+               style = wrapi(style + 1, 0, Style.MAX) as Style
+
+
+func _exit_tree() -> void:
+       thread.wait_to_finish()
+
+
+## Update hardware information label (this can change at runtime based on window
+## size and graphics settings). This is only called when the window is resized.
+## To update when graphics settings are changed, the function must be called manually
+## using `DebugMenu.update_settings_label()`.
+func update_settings_label() -> void:
+       settings.text = ""
+       if ProjectSettings.has_setting("application/config/version"):
+               settings.text += "Project Version: %s\n" % ProjectSettings.get_setting("application/config/version")
+
+       var rendering_method := str(ProjectSettings.get_setting_with_override("rendering/renderer/rendering_method"))
+       var rendering_method_string := rendering_method
+       match rendering_method:
+               "forward_plus":
+                       rendering_method_string = "Forward+"
+               "mobile":
+                       rendering_method_string = "Forward Mobile"
+               "gl_compatibility":
+                       rendering_method_string = "Compatibility"
+       settings.text += "Rendering Method: %s\n" % rendering_method_string
+
+       var viewport := get_viewport()
+
+       # The size of the viewport rendering, which determines which resolution 3D is rendered at.
+       var viewport_render_size := Vector2i()
+
+       if viewport.content_scale_mode == Window.CONTENT_SCALE_MODE_VIEWPORT:
+               viewport_render_size = viewport.get_visible_rect().size
+               settings.text += "Viewport: %d×%d, Window: %d×%d\n" % [viewport.get_visible_rect().size.x, viewport.get_visible_rect().size.y, viewport.size.x, viewport.size.y]
+       else:
+               # Window size matches viewport size.
+               viewport_render_size = viewport.size
+               settings.text += "Viewport: %d×%d\n" % [viewport.size.x, viewport.size.y]
+
+       # Display 3D settings only if relevant.
+       if viewport.get_camera_3d():
+               var scaling_3d_mode_string := "(unknown)"
+               match viewport.scaling_3d_mode:
+                       Viewport.SCALING_3D_MODE_BILINEAR:
+                               scaling_3d_mode_string = "Bilinear"
+                       Viewport.SCALING_3D_MODE_FSR:
+                               scaling_3d_mode_string = "FSR 1.0"
+                       Viewport.SCALING_3D_MODE_FSR2:
+                               scaling_3d_mode_string = "FSR 2.2"
+
+               var antialiasing_3d_string := ""
+               if viewport.scaling_3d_mode == Viewport.SCALING_3D_MODE_FSR2:
+                       # The FSR2 scaling mode includes its own temporal antialiasing implementation.
+                       antialiasing_3d_string += (" + " if not antialiasing_3d_string.is_empty() else "") + "FSR 2.2"
+               if viewport.scaling_3d_mode != Viewport.SCALING_3D_MODE_FSR2 and viewport.use_taa:
+                       # Godot's own TAA is ignored when using FSR2 scaling mode, as FSR2 provides its own TAA implementation.
+                       antialiasing_3d_string += (" + " if not antialiasing_3d_string.is_empty() else "") + "TAA"
+               if viewport.msaa_3d >= Viewport.MSAA_2X:
+                       antialiasing_3d_string += (" + " if not antialiasing_3d_string.is_empty() else "") + "%d× MSAA" % pow(2, viewport.msaa_3d)
+               if viewport.screen_space_aa == Viewport.SCREEN_SPACE_AA_FXAA:
+                       antialiasing_3d_string += (" + " if not antialiasing_3d_string.is_empty() else "") + "FXAA"
+
+               settings.text += "3D scale (%s): %d%% = %d×%d" % [
+                               scaling_3d_mode_string,
+                               viewport.scaling_3d_scale * 100,
+                               viewport_render_size.x * viewport.scaling_3d_scale,
+                               viewport_render_size.y * viewport.scaling_3d_scale,
+               ]
+
+               if not antialiasing_3d_string.is_empty():
+                       settings.text += "\n3D Antialiasing: %s" % antialiasing_3d_string
+
+               var environment := viewport.get_camera_3d().get_world_3d().environment
+               if environment:
+                       if environment.ssr_enabled:
+                               settings.text += "\nSSR: %d Steps" % environment.ssr_max_steps
+
+                       if environment.ssao_enabled:
+                               settings.text += "\nSSAO: On"
+                       if environment.ssil_enabled:
+                               settings.text += "\nSSIL: On"
+
+                       if environment.sdfgi_enabled:
+                               settings.text += "\nSDFGI: %d Cascades" % environment.sdfgi_cascades
+
+                       if environment.glow_enabled:
+                               settings.text += "\nGlow: On"
+
+                       if environment.volumetric_fog_enabled:
+                               settings.text += "\nVolumetric Fog: On"
+       var antialiasing_2d_string := ""
+       if viewport.msaa_2d >= Viewport.MSAA_2X:
+               antialiasing_2d_string = "%d× MSAA" % pow(2, viewport.msaa_2d)
+
+       if not antialiasing_2d_string.is_empty():
+               settings.text += "\n2D Antialiasing: %s" % antialiasing_2d_string
+
+
+## Update hardware/software information label (this never changes at runtime).
+func update_information_label() -> void:
+       var adapter_string := ""
+       # Make "NVIDIA Corporation" and "NVIDIA" be considered identical (required when using OpenGL to avoid redundancy).
+       if RenderingServer.get_video_adapter_vendor().trim_suffix(" Corporation") in RenderingServer.get_video_adapter_name():
+               # Avoid repeating vendor name before adapter name.
+               # Trim redundant suffix sometimes reported by NVIDIA graphics cards when using OpenGL.
+               adapter_string = RenderingServer.get_video_adapter_name().trim_suffix("/PCIe/SSE2")
+       else:
+               adapter_string = RenderingServer.get_video_adapter_vendor() + " - " + RenderingServer.get_video_adapter_name().trim_suffix("/PCIe/SSE2")
+
+       # Graphics driver version information isn't always availble.
+       var driver_info := OS.get_video_adapter_driver_info()
+       var driver_info_string := ""
+       if driver_info.size() >= 2:
+               driver_info_string = driver_info[1]
+       else:
+               driver_info_string = "(unknown)"
+
+       var release_string := ""
+       if OS.has_feature("editor"):
+               # Editor build (implies `debug`).
+               release_string = "editor"
+       elif OS.has_feature("debug"):
+               # Debug export template build.
+               release_string = "debug"
+       else:
+               # Release export template build.
+               release_string = "release"
+
+       var rendering_method := str(ProjectSettings.get_setting_with_override("rendering/renderer/rendering_method"))
+       var rendering_driver := str(ProjectSettings.get_setting_with_override("rendering/rendering_device/driver"))
+       var graphics_api_string := rendering_driver
+       if rendering_method != "gl_compatibility":
+               if rendering_driver == "d3d12":
+                       graphics_api_string = "Direct3D 12"
+               elif rendering_driver == "metal":
+                       graphics_api_string = "Metal"
+               elif rendering_driver == "vulkan":
+                       if OS.has_feature("macos") or OS.has_feature("ios"):
+                               graphics_api_string = "Vulkan via MoltenVK"
+                       else:
+                               graphics_api_string = "Vulkan"
+       else:
+               if rendering_driver == "opengl3_angle":
+                       graphics_api_string = "OpenGL via ANGLE"
+               elif OS.has_feature("mobile") or rendering_driver == "opengl3_es":
+                       graphics_api_string = "OpenGL ES"
+               elif OS.has_feature("web"):
+                       graphics_api_string = "WebGL"
+               elif rendering_driver == "opengl3":
+                       graphics_api_string = "OpenGL"
+
+       information.text = (
+                       "%s, %d threads\n" % [OS.get_processor_name().replace("(R)", "").replace("(TM)", ""), OS.get_processor_count()]
+                       + "%s %s (%s %s), %s %s\n" % [OS.get_name(), "64-bit" if OS.has_feature("64") else "32-bit", release_string, "double" if OS.has_feature("double") else "single", graphics_api_string, RenderingServer.get_video_adapter_api_version()]
+                       + "%s, %s" % [adapter_string, driver_info_string]
+       )
+
+
+func _fps_graph_draw() -> void:
+       var fps_polyline := PackedVector2Array()
+       fps_polyline.resize(HISTORY_NUM_FRAMES)
+       for fps_index in fps_history.size():
+               fps_polyline[fps_index] = Vector2(
+                               remap(fps_index, 0, fps_history.size(), 0, GRAPH_SIZE.x),
+                               remap(clampf(fps_history[fps_index], GRAPH_MIN_FPS, GRAPH_MAX_FPS), GRAPH_MIN_FPS, GRAPH_MAX_FPS, GRAPH_SIZE.y, 0.0)
+               )
+       # Don't use antialiasing to speed up line drawing, but use a width that scales with
+       # viewport scale to keep the line easily readable on hiDPI displays.
+       fps_graph.draw_polyline(fps_polyline, frame_time_gradient.sample(remap(frames_per_second, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)), 1.0)
+
+
+func _total_graph_draw() -> void:
+       var total_polyline := PackedVector2Array()
+       total_polyline.resize(HISTORY_NUM_FRAMES)
+       for total_index in frame_history_total.size():
+               total_polyline[total_index] = Vector2(
+                               remap(total_index, 0, frame_history_total.size(), 0, GRAPH_SIZE.x),
+                               remap(clampf(frame_history_total[total_index], GRAPH_MIN_FPS, GRAPH_MAX_FPS), GRAPH_MIN_FPS, GRAPH_MAX_FPS, GRAPH_SIZE.y, 0.0)
+               )
+       # Don't use antialiasing to speed up line drawing, but use a width that scales with
+       # viewport scale to keep the line easily readable on hiDPI displays.
+       total_graph.draw_polyline(total_polyline, frame_time_gradient.sample(remap(1000.0 / frametime_avg, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)), 1.0)
+
+
+func _cpu_graph_draw() -> void:
+       var cpu_polyline := PackedVector2Array()
+       cpu_polyline.resize(HISTORY_NUM_FRAMES)
+       for cpu_index in frame_history_cpu.size():
+               cpu_polyline[cpu_index] = Vector2(
+                               remap(cpu_index, 0, frame_history_cpu.size(), 0, GRAPH_SIZE.x),
+                               remap(clampf(frame_history_cpu[cpu_index], GRAPH_MIN_FPS, GRAPH_MAX_FPS), GRAPH_MIN_FPS, GRAPH_MAX_FPS, GRAPH_SIZE.y, 0.0)
+               )
+       # Don't use antialiasing to speed up line drawing, but use a width that scales with
+       # viewport scale to keep the line easily readable on hiDPI displays.
+       cpu_graph.draw_polyline(cpu_polyline, frame_time_gradient.sample(remap(1000.0 / frametime_cpu_avg, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)), 1.0)
+
+
+func _gpu_graph_draw() -> void:
+       var gpu_polyline := PackedVector2Array()
+       gpu_polyline.resize(HISTORY_NUM_FRAMES)
+       for gpu_index in frame_history_gpu.size():
+               gpu_polyline[gpu_index] = Vector2(
+                               remap(gpu_index, 0, frame_history_gpu.size(), 0, GRAPH_SIZE.x),
+                               remap(clampf(frame_history_gpu[gpu_index], GRAPH_MIN_FPS, GRAPH_MAX_FPS), GRAPH_MIN_FPS, GRAPH_MAX_FPS, GRAPH_SIZE.y, 0.0)
+               )
+       # Don't use antialiasing to speed up line drawing, but use a width that scales with
+       # viewport scale to keep the line easily readable on hiDPI displays.
+       gpu_graph.draw_polyline(gpu_polyline, frame_time_gradient.sample(remap(1000.0 / frametime_gpu_avg, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0)), 1.0)
+
+
+func _process(_delta: float) -> void:
+       if visible:
+               fps_graph.queue_redraw()
+               total_graph.queue_redraw()
+               cpu_graph.queue_redraw()
+               gpu_graph.queue_redraw()
+
+               # Difference between the last two rendered frames in milliseconds.
+               var frametime := (Time.get_ticks_usec() - last_tick) * 0.001
+
+               frame_history_total.push_back(frametime)
+               if frame_history_total.size() > HISTORY_NUM_FRAMES:
+                       frame_history_total.pop_front()
+
+               # Frametimes are colored following FPS logic (red = 10 FPS, yellow = 60 FPS, green = 110 FPS, cyan = 160 FPS).
+               # This makes the color gradient non-linear.
+               frametime_avg = frame_history_total.reduce(sum_func) / frame_history_total.size()
+               frame_history_total_avg.text = str(frametime_avg).pad_decimals(2)
+               frame_history_total_avg.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_avg, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0))
+
+               var frametime_min: float = frame_history_total.min()
+               frame_history_total_min.text = str(frametime_min).pad_decimals(2)
+               frame_history_total_min.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_min, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0))
+
+               var frametime_max: float = frame_history_total.max()
+               frame_history_total_max.text = str(frametime_max).pad_decimals(2)
+               frame_history_total_max.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_max, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0))
+
+               frame_history_total_last.text = str(frametime).pad_decimals(2)
+               frame_history_total_last.modulate = frame_time_gradient.sample(remap(1000.0 / frametime, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0))
+
+               var viewport_rid := get_viewport().get_viewport_rid()
+               var frametime_cpu := RenderingServer.viewport_get_measured_render_time_cpu(viewport_rid) + RenderingServer.get_frame_setup_time_cpu()
+               frame_history_cpu.push_back(frametime_cpu)
+               if frame_history_cpu.size() > HISTORY_NUM_FRAMES:
+                       frame_history_cpu.pop_front()
+
+               frametime_cpu_avg = frame_history_cpu.reduce(sum_func) / frame_history_cpu.size()
+               frame_history_cpu_avg.text = str(frametime_cpu_avg).pad_decimals(2)
+               frame_history_cpu_avg.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_cpu_avg, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0))
+
+               var frametime_cpu_min: float = frame_history_cpu.min()
+               frame_history_cpu_min.text = str(frametime_cpu_min).pad_decimals(2)
+               frame_history_cpu_min.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_cpu_min, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0))
+
+               var frametime_cpu_max: float = frame_history_cpu.max()
+               frame_history_cpu_max.text = str(frametime_cpu_max).pad_decimals(2)
+               frame_history_cpu_max.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_cpu_max, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0))
+
+               frame_history_cpu_last.text = str(frametime_cpu).pad_decimals(2)
+               frame_history_cpu_last.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_cpu, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0))
+
+               var frametime_gpu := RenderingServer.viewport_get_measured_render_time_gpu(viewport_rid)
+               frame_history_gpu.push_back(frametime_gpu)
+               if frame_history_gpu.size() > HISTORY_NUM_FRAMES:
+                       frame_history_gpu.pop_front()
+
+               frametime_gpu_avg = frame_history_gpu.reduce(sum_func) / frame_history_gpu.size()
+               frame_history_gpu_avg.text = str(frametime_gpu_avg).pad_decimals(2)
+               frame_history_gpu_avg.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_gpu_avg, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0))
+
+               var frametime_gpu_min: float = frame_history_gpu.min()
+               frame_history_gpu_min.text = str(frametime_gpu_min).pad_decimals(2)
+               frame_history_gpu_min.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_gpu_min, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0))
+
+               var frametime_gpu_max: float = frame_history_gpu.max()
+               frame_history_gpu_max.text = str(frametime_gpu_max).pad_decimals(2)
+               frame_history_gpu_max.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_gpu_max, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0))
+
+               frame_history_gpu_last.text = str(frametime_gpu).pad_decimals(2)
+               frame_history_gpu_last.modulate = frame_time_gradient.sample(remap(1000.0 / frametime_gpu, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0))
+
+               frames_per_second = 1000.0 / frametime_avg
+               fps_history.push_back(frames_per_second)
+               if fps_history.size() > HISTORY_NUM_FRAMES:
+                       fps_history.pop_front()
+
+               fps.text = str(floor(frames_per_second)) + " FPS"
+               var frame_time_color := frame_time_gradient.sample(remap(frames_per_second, GRAPH_MIN_FPS, GRAPH_MAX_FPS, 0.0, 1.0))
+               fps.modulate = frame_time_color
+
+               frame_time.text = str(frametime).pad_decimals(2) + " mspf"
+               frame_time.modulate = frame_time_color
+
+               var vsync_string := ""
+               match DisplayServer.window_get_vsync_mode():
+                       DisplayServer.VSYNC_ENABLED:
+                               vsync_string = "V-Sync"
+                       DisplayServer.VSYNC_ADAPTIVE:
+                               vsync_string = "Adaptive V-Sync"
+                       DisplayServer.VSYNC_MAILBOX:
+                               vsync_string = "Mailbox V-Sync"
+
+               if Engine.max_fps > 0 or OS.low_processor_usage_mode:
+                       # Display FPS cap determined by `Engine.max_fps` or low-processor usage mode sleep duration
+                       # (the lowest FPS cap is used).
+                       var low_processor_max_fps := roundi(1000000.0 / OS.low_processor_usage_mode_sleep_usec)
+                       var fps_cap := low_processor_max_fps
+                       if Engine.max_fps > 0:
+                               fps_cap = mini(Engine.max_fps, low_processor_max_fps)
+                       frame_time.text += " (cap: " + str(fps_cap) + " FPS"
+
+                       if not vsync_string.is_empty():
+                               frame_time.text += " + " + vsync_string
+
+                       frame_time.text += ")"
+               else:
+                       if not vsync_string.is_empty():
+                               frame_time.text += " (" + vsync_string + ")"
+
+               frame_number.text = "Frame: " + str(Engine.get_frames_drawn())
+
+       last_tick = Time.get_ticks_usec()
+
+
+func _on_visibility_changed() -> void:
+       if visible:
+               # Reset graphs to prevent them from looking strange before `HISTORY_NUM_FRAMES` frames
+               # have been drawn.
+               var frametime_last := (Time.get_ticks_usec() - last_tick) * 0.001
+               fps_history.resize(HISTORY_NUM_FRAMES)
+               fps_history.fill(1000.0 / frametime_last)
+               frame_history_total.resize(HISTORY_NUM_FRAMES)
+               frame_history_total.fill(frametime_last)
+               frame_history_cpu.resize(HISTORY_NUM_FRAMES)
+               var viewport_rid := get_viewport().get_viewport_rid()
+               frame_history_cpu.fill(RenderingServer.viewport_get_measured_render_time_cpu(viewport_rid) + RenderingServer.get_frame_setup_time_cpu())
+               frame_history_gpu.resize(HISTORY_NUM_FRAMES)
+               frame_history_gpu.fill(RenderingServer.viewport_get_measured_render_time_gpu(viewport_rid))
diff --git a/addons/debug_menu/debug_menu.tscn b/addons/debug_menu/debug_menu.tscn
new file mode 100644 (file)
index 0000000..9bfc9d6
--- /dev/null
@@ -0,0 +1,401 @@
+[gd_scene load_steps=3 format=3 uid="uid://cggqb75a8w8r"]
+
+[ext_resource type="Script" path="res://addons/debug_menu/debug_menu.gd" id="1_p440y"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ki0n8"]
+bg_color = Color(0, 0, 0, 0.25098)
+
+[node name="CanvasLayer" type="CanvasLayer" node_paths=PackedStringArray("fps", "frame_time", "frame_number", "frame_history_total_avg", "frame_history_total_min", "frame_history_total_max", "frame_history_total_last", "frame_history_cpu_avg", "frame_history_cpu_min", "frame_history_cpu_max", "frame_history_cpu_last", "frame_history_gpu_avg", "frame_history_gpu_min", "frame_history_gpu_max", "frame_history_gpu_last", "fps_graph", "total_graph", "cpu_graph", "gpu_graph", "information", "settings")]
+layer = 128
+script = ExtResource("1_p440y")
+fps = NodePath("DebugMenu/VBoxContainer/FPS")
+frame_time = NodePath("DebugMenu/VBoxContainer/FrameTime")
+frame_number = NodePath("DebugMenu/VBoxContainer/FrameNumber")
+frame_history_total_avg = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/TotalAvg")
+frame_history_total_min = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/TotalMin")
+frame_history_total_max = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/TotalMax")
+frame_history_total_last = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/TotalLast")
+frame_history_cpu_avg = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/CPUAvg")
+frame_history_cpu_min = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/CPUMin")
+frame_history_cpu_max = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/CPUMax")
+frame_history_cpu_last = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/CPULast")
+frame_history_gpu_avg = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/GPUAvg")
+frame_history_gpu_min = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/GPUMin")
+frame_history_gpu_max = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/GPUMax")
+frame_history_gpu_last = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/GPULast")
+fps_graph = NodePath("DebugMenu/VBoxContainer/FPSGraph/Graph")
+total_graph = NodePath("DebugMenu/VBoxContainer/TotalGraph/Graph")
+cpu_graph = NodePath("DebugMenu/VBoxContainer/CPUGraph/Graph")
+gpu_graph = NodePath("DebugMenu/VBoxContainer/GPUGraph/Graph")
+information = NodePath("DebugMenu/VBoxContainer/Information")
+settings = NodePath("DebugMenu/VBoxContainer/Settings")
+
+[node name="DebugMenu" type="Control" parent="."]
+custom_minimum_size = Vector2(400, 400)
+layout_mode = 3
+anchors_preset = 1
+anchor_left = 1.0
+anchor_right = 1.0
+offset_left = -416.0
+offset_top = 8.0
+offset_right = -16.0
+offset_bottom = 408.0
+grow_horizontal = 0
+size_flags_horizontal = 8
+size_flags_vertical = 4
+mouse_filter = 2
+
+[node name="VBoxContainer" type="VBoxContainer" parent="DebugMenu"]
+layout_mode = 1
+anchors_preset = 1
+anchor_left = 1.0
+anchor_right = 1.0
+offset_left = -300.0
+offset_bottom = 374.0
+grow_horizontal = 0
+mouse_filter = 2
+theme_override_constants/separation = 0
+
+[node name="FPS" type="Label" parent="DebugMenu/VBoxContainer"]
+modulate = Color(0, 1, 0, 1)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 5
+theme_override_constants/line_spacing = 0
+theme_override_font_sizes/font_size = 18
+text = "60 FPS"
+horizontal_alignment = 2
+
+[node name="FrameTime" type="Label" parent="DebugMenu/VBoxContainer"]
+modulate = Color(0, 1, 0, 1)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "16.67 mspf (cap: 123 FPS + Adaptive V-Sync)"
+horizontal_alignment = 2
+
+[node name="FrameNumber" type="Label" parent="DebugMenu/VBoxContainer"]
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "Frame: 1234"
+horizontal_alignment = 2
+
+[node name="FrameTimeHistory" type="GridContainer" parent="DebugMenu/VBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 8
+mouse_filter = 2
+theme_override_constants/h_separation = 0
+theme_override_constants/v_separation = 0
+columns = 5
+
+[node name="Spacer" type="Control" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+custom_minimum_size = Vector2(60, 0)
+layout_mode = 2
+mouse_filter = 2
+
+[node name="AvgHeader" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "Average"
+horizontal_alignment = 2
+
+[node name="MinHeader" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "Best"
+horizontal_alignment = 2
+
+[node name="MaxHeader" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "Worst"
+horizontal_alignment = 2
+
+[node name="LastHeader" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "Last"
+horizontal_alignment = 2
+
+[node name="TotalHeader" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "Total:"
+horizontal_alignment = 2
+
+[node name="TotalAvg" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+modulate = Color(0, 1, 0, 1)
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "123.45"
+horizontal_alignment = 2
+
+[node name="TotalMin" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+modulate = Color(0, 1, 0, 1)
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "123.45"
+horizontal_alignment = 2
+
+[node name="TotalMax" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+modulate = Color(0, 1, 0, 1)
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "123.45"
+horizontal_alignment = 2
+
+[node name="TotalLast" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+modulate = Color(0, 1, 0, 1)
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "123.45"
+horizontal_alignment = 2
+
+[node name="CPUHeader" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "CPU:"
+horizontal_alignment = 2
+
+[node name="CPUAvg" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+modulate = Color(0, 1, 0, 1)
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "123.45"
+horizontal_alignment = 2
+
+[node name="CPUMin" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+modulate = Color(0, 1, 0, 1)
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "12.34"
+horizontal_alignment = 2
+
+[node name="CPUMax" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+modulate = Color(0, 1, 0, 1)
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "123.45"
+horizontal_alignment = 2
+
+[node name="CPULast" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+modulate = Color(0, 1, 0, 1)
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "123.45"
+horizontal_alignment = 2
+
+[node name="GPUHeader" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "GPU:"
+horizontal_alignment = 2
+
+[node name="GPUAvg" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+modulate = Color(0, 1, 0, 1)
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "123.45"
+horizontal_alignment = 2
+
+[node name="GPUMin" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+modulate = Color(0, 1, 0, 1)
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "1.23"
+horizontal_alignment = 2
+
+[node name="GPUMax" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+modulate = Color(0, 1, 0, 1)
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "123.45"
+horizontal_alignment = 2
+
+[node name="GPULast" type="Label" parent="DebugMenu/VBoxContainer/FrameTimeHistory"]
+modulate = Color(0, 1, 0, 1)
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "123.45"
+horizontal_alignment = 2
+
+[node name="FPSGraph" type="HBoxContainer" parent="DebugMenu/VBoxContainer"]
+layout_mode = 2
+mouse_filter = 2
+alignment = 2
+
+[node name="Title" type="Label" parent="DebugMenu/VBoxContainer/FPSGraph"]
+custom_minimum_size = Vector2(0, 27)
+layout_mode = 2
+size_flags_horizontal = 8
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "FPS: ↑"
+vertical_alignment = 1
+
+[node name="Graph" type="Panel" parent="DebugMenu/VBoxContainer/FPSGraph"]
+custom_minimum_size = Vector2(150, 25)
+layout_mode = 2
+size_flags_vertical = 0
+mouse_filter = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_ki0n8")
+
+[node name="TotalGraph" type="HBoxContainer" parent="DebugMenu/VBoxContainer"]
+layout_mode = 2
+mouse_filter = 2
+alignment = 2
+
+[node name="Title" type="Label" parent="DebugMenu/VBoxContainer/TotalGraph"]
+custom_minimum_size = Vector2(0, 27)
+layout_mode = 2
+size_flags_horizontal = 8
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "Total: ↓"
+vertical_alignment = 1
+
+[node name="Graph" type="Panel" parent="DebugMenu/VBoxContainer/TotalGraph"]
+custom_minimum_size = Vector2(150, 25)
+layout_mode = 2
+size_flags_vertical = 0
+mouse_filter = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_ki0n8")
+
+[node name="CPUGraph" type="HBoxContainer" parent="DebugMenu/VBoxContainer"]
+layout_mode = 2
+mouse_filter = 2
+alignment = 2
+
+[node name="Title" type="Label" parent="DebugMenu/VBoxContainer/CPUGraph"]
+custom_minimum_size = Vector2(0, 27)
+layout_mode = 2
+size_flags_horizontal = 8
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "CPU: ↓"
+vertical_alignment = 1
+
+[node name="Graph" type="Panel" parent="DebugMenu/VBoxContainer/CPUGraph"]
+custom_minimum_size = Vector2(150, 25)
+layout_mode = 2
+size_flags_vertical = 0
+mouse_filter = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_ki0n8")
+
+[node name="GPUGraph" type="HBoxContainer" parent="DebugMenu/VBoxContainer"]
+layout_mode = 2
+mouse_filter = 2
+alignment = 2
+
+[node name="Title" type="Label" parent="DebugMenu/VBoxContainer/GPUGraph"]
+custom_minimum_size = Vector2(0, 27)
+layout_mode = 2
+size_flags_horizontal = 8
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "GPU: ↓"
+vertical_alignment = 1
+
+[node name="Graph" type="Panel" parent="DebugMenu/VBoxContainer/GPUGraph"]
+custom_minimum_size = Vector2(150, 25)
+layout_mode = 2
+size_flags_vertical = 0
+mouse_filter = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_ki0n8")
+
+[node name="Information" type="Label" parent="DebugMenu/VBoxContainer"]
+modulate = Color(1, 1, 1, 0.752941)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "12th Gen Intel(R) Core(TM) i0-1234K
+Windows 12 64-bit (double precision), Vulkan 1.2.34
+NVIDIA GeForce RTX 1234, 123.45.67"
+horizontal_alignment = 2
+
+[node name="Settings" type="Label" parent="DebugMenu/VBoxContainer"]
+modulate = Color(0.8, 0.84, 1, 0.752941)
+layout_mode = 2
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+theme_override_font_sizes/font_size = 12
+text = "Project Version: 1.2.3
+Rendering Method: Forward+
+Window: 1234×567, Viewport: 1234×567
+3D Scale (FSR 1.0): 100% = 1234×567
+3D Antialiasing: TAA + 2× MSAA + FXAA
+SSR: 123 Steps
+SSAO: On
+SSIL: On
+SDFGI: 1 Cascades
+Glow: On
+Volumetric Fog: On
+2D Antialiasing: 2× MSAA"
+horizontal_alignment = 2
+
+[connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"]
diff --git a/addons/debug_menu/plugin.cfg b/addons/debug_menu/plugin.cfg
new file mode 100644 (file)
index 0000000..54100f7
--- /dev/null
@@ -0,0 +1,7 @@
+[plugin]
+
+name="Debug Menu"
+description="In-game debug menu displaying performance metrics and hardware information"
+author="Calinou"
+version="1.2.0"
+script="plugin.gd"
diff --git a/addons/debug_menu/plugin.gd b/addons/debug_menu/plugin.gd
new file mode 100644 (file)
index 0000000..5ec132e
--- /dev/null
@@ -0,0 +1,29 @@
+@tool
+extends EditorPlugin
+
+func _enter_tree() -> void:
+       add_autoload_singleton("DebugMenu", "res://addons/debug_menu/debug_menu.tscn")
+
+       # FIXME: This appears to do nothing.
+#      if not ProjectSettings.has_setting("application/config/version"):
+#              ProjectSettings.set_setting("application/config/version", "1.0.0")
+#
+#      ProjectSettings.set_initial_value("application/config/version", "1.0.0")
+#      ProjectSettings.add_property_info({
+#              name = "application/config/version",
+#              type = TYPE_STRING,
+#      })
+#
+#      if not InputMap.has_action("cycle_debug_menu"):
+#              InputMap.add_action("cycle_debug_menu")
+#              var event := InputEventKey.new()
+#              event.keycode = KEY_F3
+#              InputMap.action_add_event("cycle_debug_menu", event)
+#
+#      ProjectSettings.save()
+
+
+func _exit_tree() -> void:
+       remove_autoload_singleton("DebugMenu")
+       # Don't remove the project setting's value and input map action,
+       # as the plugin may be re-enabled in the future.
diff --git a/addons/ez_transitions/fonts/mini_pixel-7.ttf b/addons/ez_transitions/fonts/mini_pixel-7.ttf
new file mode 100644 (file)
index 0000000..b3e52ba
Binary files /dev/null and b/addons/ez_transitions/fonts/mini_pixel-7.ttf differ
diff --git a/addons/ez_transitions/fonts/mini_pixel-7.ttf.import b/addons/ez_transitions/fonts/mini_pixel-7.ttf.import
new file mode 100644 (file)
index 0000000..b38306f
--- /dev/null
@@ -0,0 +1,33 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontFile"
+uid="uid://cjhjf5pqxtcqs"
+path="res://.godot/imported/mini_pixel-7.ttf-c2cea4a2b582758dc0603766fe110945.fontdata"
+
+[deps]
+
+source_file="res://addons/ez_transitions/fonts/mini_pixel-7.ttf"
+dest_files=["res://.godot/imported/mini_pixel-7.ttf-c2cea4a2b582758dc0603766fe110945.fontdata"]
+
+[params]
+
+Rendering=null
+antialiasing=1
+generate_mipmaps=false
+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/ez_transitions/images/black_texture.png b/addons/ez_transitions/images/black_texture.png
new file mode 100644 (file)
index 0000000..84fdb72
Binary files /dev/null and b/addons/ez_transitions/images/black_texture.png differ
diff --git a/addons/ez_transitions/images/black_texture.png.import b/addons/ez_transitions/images/black_texture.png.import
new file mode 100644 (file)
index 0000000..b86445a
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://vlbyiaku5onx"
+path="res://.godot/imported/black_texture.png-88d0c530b05305955c5a8db51f0a3f54.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ez_transitions/images/black_texture.png"
+dest_files=["res://.godot/imported/black_texture.png-88d0c530b05305955c5a8db51f0a3f54.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/ez_transitions/images/checkbox_checked.png b/addons/ez_transitions/images/checkbox_checked.png
new file mode 100644 (file)
index 0000000..f166540
Binary files /dev/null and b/addons/ez_transitions/images/checkbox_checked.png differ
diff --git a/addons/ez_transitions/images/checkbox_checked.png.import b/addons/ez_transitions/images/checkbox_checked.png.import
new file mode 100644 (file)
index 0000000..31b60bf
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bnpuobmbb5o0d"
+path="res://.godot/imported/checkbox_checked.png-999ed8ae4bbe4d97abbbc6ad2aa383fd.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ez_transitions/images/checkbox_checked.png"
+dest_files=["res://.godot/imported/checkbox_checked.png-999ed8ae4bbe4d97abbbc6ad2aa383fd.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/ez_transitions/images/checkbox_unchecked.png b/addons/ez_transitions/images/checkbox_unchecked.png
new file mode 100644 (file)
index 0000000..ea9503b
Binary files /dev/null and b/addons/ez_transitions/images/checkbox_unchecked.png differ
diff --git a/addons/ez_transitions/images/checkbox_unchecked.png.import b/addons/ez_transitions/images/checkbox_unchecked.png.import
new file mode 100644 (file)
index 0000000..05dde0d
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bmvxgu642vwre"
+path="res://.godot/imported/checkbox_unchecked.png-189531c919fe87c29f1aa16f1cc9a7d8.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ez_transitions/images/checkbox_unchecked.png"
+dest_files=["res://.godot/imported/checkbox_unchecked.png-189531c919fe87c29f1aa16f1cc9a7d8.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/ez_transitions/images/checkerboard_texture.png b/addons/ez_transitions/images/checkerboard_texture.png
new file mode 100644 (file)
index 0000000..dae678e
Binary files /dev/null and b/addons/ez_transitions/images/checkerboard_texture.png differ
diff --git a/addons/ez_transitions/images/checkerboard_texture.png.import b/addons/ez_transitions/images/checkerboard_texture.png.import
new file mode 100644 (file)
index 0000000..5d21a90
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ujutctmbt2ax"
+path="res://.godot/imported/checkerboard_texture.png-565ea519b0d5d3d15b9e7ac9af1f3f96.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ez_transitions/images/checkerboard_texture.png"
+dest_files=["res://.godot/imported/checkerboard_texture.png-565ea519b0d5d3d15b9e7ac9af1f3f96.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/ez_transitions/images/option_button_arrow.png b/addons/ez_transitions/images/option_button_arrow.png
new file mode 100644 (file)
index 0000000..9323a03
Binary files /dev/null and b/addons/ez_transitions/images/option_button_arrow.png differ
diff --git a/addons/ez_transitions/images/option_button_arrow.png.import b/addons/ez_transitions/images/option_button_arrow.png.import
new file mode 100644 (file)
index 0000000..b758cad
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ckcfwnfyp8nrc"
+path="res://.godot/imported/option_button_arrow.png-65ecf310029655e0438ddc3016863676.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ez_transitions/images/option_button_arrow.png"
+dest_files=["res://.godot/imported/option_button_arrow.png-65ecf310029655e0438ddc3016863676.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/ez_transitions/images/plugin_icon.png b/addons/ez_transitions/images/plugin_icon.png
new file mode 100644 (file)
index 0000000..ade78cb
Binary files /dev/null and b/addons/ez_transitions/images/plugin_icon.png differ
diff --git a/addons/ez_transitions/images/plugin_icon.png.import b/addons/ez_transitions/images/plugin_icon.png.import
new file mode 100644 (file)
index 0000000..3fc346d
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d1xnj20s1tyuu"
+path="res://.godot/imported/plugin_icon.png-28994b1000301e83bba9a40fcad618e3.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ez_transitions/images/plugin_icon.png"
+dest_files=["res://.godot/imported/plugin_icon.png-28994b1000301e83bba9a40fcad618e3.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/ez_transitions/images/plugin_icon.svg b/addons/ez_transitions/images/plugin_icon.svg
new file mode 100644 (file)
index 0000000..1420c55
--- /dev/null
@@ -0,0 +1,9 @@
+<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 560 560" width="560" height="560">
+       <title>transition</title>
+       <defs>
+               <image  width="560" height="560" id="img1" href="data:image/png;base64,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"/>
+       </defs>
+       <style>
+       </style>
+       <use id="Background" href="#img1" x="0" y="0"/>
+</svg>
\ No newline at end of file
diff --git a/addons/ez_transitions/images/plugin_icon.svg.import b/addons/ez_transitions/images/plugin_icon.svg.import
new file mode 100644 (file)
index 0000000..c804360
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dovx338ff7u7n"
+path="res://.godot/imported/plugin_icon.svg-774cae908dd4e4a4b0c2d42bc6e3a441.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ez_transitions/images/plugin_icon.svg"
+dest_files=["res://.godot/imported/plugin_icon.svg-774cae908dd4e4a4b0c2d42bc6e3a441.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/ez_transitions/images/plugin_icon.xcf b/addons/ez_transitions/images/plugin_icon.xcf
new file mode 100644 (file)
index 0000000..3e86a51
Binary files /dev/null and b/addons/ez_transitions/images/plugin_icon.xcf differ
diff --git a/addons/ez_transitions/images/spinbox_updown.png b/addons/ez_transitions/images/spinbox_updown.png
new file mode 100644 (file)
index 0000000..d0a58a4
Binary files /dev/null and b/addons/ez_transitions/images/spinbox_updown.png differ
diff --git a/addons/ez_transitions/images/spinbox_updown.png.import b/addons/ez_transitions/images/spinbox_updown.png.import
new file mode 100644 (file)
index 0000000..850d5a5
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c8lfsjcfynver"
+path="res://.godot/imported/spinbox_updown.png-bbc2ddabdc82e011187e1d7880c06c20.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ez_transitions/images/spinbox_updown.png"
+dest_files=["res://.godot/imported/spinbox_updown.png-bbc2ddabdc82e011187e1d7880c06c20.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/ez_transitions/images/transition_node_icon.png b/addons/ez_transitions/images/transition_node_icon.png
new file mode 100644 (file)
index 0000000..3dec3e0
Binary files /dev/null and b/addons/ez_transitions/images/transition_node_icon.png differ
diff --git a/addons/ez_transitions/images/transition_node_icon.png.import b/addons/ez_transitions/images/transition_node_icon.png.import
new file mode 100644 (file)
index 0000000..e30657c
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ywc05udk71wh"
+path="res://.godot/imported/transition_node_icon.png-7dd0dcfa7279e0c21c8a668b01d35ad0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ez_transitions/images/transition_node_icon.png"
+dest_files=["res://.godot/imported/transition_node_icon.png-7dd0dcfa7279e0c21c8a668b01d35ad0.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/ez_transitions/images/transition_node_icon.svg b/addons/ez_transitions/images/transition_node_icon.svg
new file mode 100644 (file)
index 0000000..db70f20
--- /dev/null
@@ -0,0 +1,9 @@
+<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+       <title>transition</title>
+       <defs>
+               <image width="512" height="512" id="img1" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAC8XpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHja7ZdLkiMpDIb3nGKOkJIQEsfhkUT0Deb480OSniqXe+GZVUcYnEAJpST0AS6H8+9fI/yFQtlTiGqeckoHSswxc8HAj6uU1dIRV3sX3tJv8vCYYIgEvVwTnq6ebvltaPdUMNIvhrztifp9Isft3p8MbUcyI5oh9G0ob0PC1wRtA+Va1pGy29cl1PPq+71Qv54wm3pLdSs//R0N2esKP8J8CsmBVoSvAGQ+EqRgkFeLGSjNMaEu+Y4ECXmVp0eBXhgz1PhS6ZkWvaJ1j8IzrchbRZ6SnB79S3kgfU1lpf6L5+h7xN/lJpepcDxlfz5jdB9rzVhFiQmpTntR91LWCHoVLqZrD7CXDsOjMGGrZlTHrm7YCv1oR0VtlImBa1CkToUGnatv1BBi5DOwYcDcWJbQxThzk8kvzkqDDSS7OCC3hT0KP2Kh5TYfLSxvDs+doMoEY4RX3q7h3RfGmEeB6PBHrhAX8zq0NNMos4UaiNDYSdWV4Ls+l8lVQFBnlucRyUhsvUxUpX9vAlmgBYqK/jqDZH0bQIrgWhEMzkEkUCNRSnQYsxEhkQ5ABaGzRK4gQKrcESRHkQQ2ztM1XjFaqqwMcYAclxlIqCQxsMFZA6wYFfvHomMPFRWNqprU1DVrSZJi0pSSpXkpFhOLwdSSmbllKy4eXT25uXv2kjkLLk3NKVv2nHMp8FlgueDtAoVSKlepsWqoqVr1mmtp2D4tNm2pWfOWW+ncpeP+6Klb9557OenEVjrjqWc67fQzn2Vgqw0JIw4dadjwkUd5UNtYf9Q3qNGmxovUVLQHNUjNbhM0rxOdzACMQyQQt4kAG5ons8MpRp7kJrMj4/oTZQSpk1mnSQwE40msg252gS+ik9z/4hYsfuPG/5VcmOjeJPeT2ytqfX4NtUXsOoUzqYfg9A2zwo4Pvqt+9uF3E+/2H0MfQx9DH0MfQx9DH0N/jiEZ+Odh/gr8B6aGp+57fUXSAAABhWlDQ1BJQ0MgcHJvZmlsZQAAeJx9kT1Iw0AcxV/Tih9UHSwi4pChOlkQFXGUKhbBQmkrtOpgcukXNGlIUlwcBdeCgx+LVQcXZ10dXAVB8APE1cVJ0UVK/F9SaBHjwXE/3t173L0DhHqZqWZgAlA1y0jGomImuyp2vqIbfgwigD6JmXo8tZiG5/i6h4+vdxGe5X3uz9Gr5EwG+ETiOaYbFvEG8cympXPeJw6xoqQQnxOPG3RB4keuyy6/cS44LPDMkJFOzhOHiMVCG8ttzIqGSjxNHFZUjfKFjMsK5y3OarnKmvfkLwzmtJUU12mOIIYlxJGACBlVlFCGhQitGikmkrQf9fAPO/4EuWRylcDIsYAKVEiOH/wPfndr5qcm3aRgFOh4se2PUaBzF2jUbPv72LYbJ4D/GbjSWv5KHZj9JL3W0sJHQP82cHHd0uQ94HIHGHrSJUNyJD9NIZ8H3s/om7LAwC3Qs+b21tzH6QOQpq6Wb4CDQ2CsQNnrHu/uau/t3zPN/n4AE+NygUcA9mIAAA12aVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOmIzODk4ODhlLTcwYzMtNGVmMC04MWExLTYyYmE3M2MxYmNjMSIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyZDQzNjU1ZS1hYzA5LTQwYmYtOTdhNS1kZDJkNTNkNmRlZTIiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3ZTRmNzU0MS00OGE5LTRhODAtYjkzYS1lYzI2ZTAzMWUzZmUiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJXaW5kb3dzIgogICBHSU1QOlRpbWVTdGFtcD0iMTY5Mzc3OTA3MDMxNjgxNSIKICAgR0lNUDpWZXJzaW9uPSIyLjEwLjMyIgogICB0aWZmOk9yaWVudGF0aW9uPSIxIgogICB4bXA6Q3JlYXRvclRvb2w9IkdJTVAgMi4xMCIKICAgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMzowOTowM1QxOToxMTowOS0wMzowMCIKICAgeG1wOk1vZGlmeURhdGU9IjIwMjM6MDk6MDNUMTk6MTE6MDktMDM6MDAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iLyIKICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Y2U5ZGFjYi05ZjBiLTRjODktOWVhOS0xODk1MTg2NjQyOGEiCiAgICAgIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkdpbXAgMi4xMCAoV2luZG93cykiCiAgICAgIHN0RXZ0OndoZW49IjIwMjMtMDktMDNUMTk6MTE6MTAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg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"/>
+       </defs>
+       <style>
+       </style>
+       <use id="transition" href="#img1" transform="matrix(.031,0,0,.031,0,0)"/>
+</svg>
\ No newline at end of file
diff --git a/addons/ez_transitions/images/transition_node_icon.svg.import b/addons/ez_transitions/images/transition_node_icon.svg.import
new file mode 100644 (file)
index 0000000..33e2fca
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bil22ye7w7267"
+path="res://.godot/imported/transition_node_icon.svg-234bac7cf4261bff944003111c478134.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ez_transitions/images/transition_node_icon.svg"
+dest_files=["res://.godot/imported/transition_node_icon.svg-234bac7cf4261bff944003111c478134.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/ez_transitions/images/transition_overlay_node_icon.png b/addons/ez_transitions/images/transition_overlay_node_icon.png
new file mode 100644 (file)
index 0000000..6100abf
Binary files /dev/null and b/addons/ez_transitions/images/transition_overlay_node_icon.png differ
diff --git a/addons/ez_transitions/images/transition_overlay_node_icon.png.import b/addons/ez_transitions/images/transition_overlay_node_icon.png.import
new file mode 100644 (file)
index 0000000..a8e3d5f
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://daf5opd5h4skn"
+path="res://.godot/imported/transition_overlay_node_icon.png-cfbbdf679e2526399864ceb27ef402f9.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ez_transitions/images/transition_overlay_node_icon.png"
+dest_files=["res://.godot/imported/transition_overlay_node_icon.png-cfbbdf679e2526399864ceb27ef402f9.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/ez_transitions/images/transition_overlay_node_icon.svg b/addons/ez_transitions/images/transition_overlay_node_icon.svg
new file mode 100644 (file)
index 0000000..4c4e621
--- /dev/null
@@ -0,0 +1,9 @@
+<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+       <title>transition_overlay_node_icon</title>
+       <defs>
+               <image  width="16" height="11" id="img1" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAMAAABBPP0LAAAAAXNSR0IB2cksfwAAAIpQTFRFAAAAju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+XjuOXju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+Xju+XedIwfwAAAC50Uk5TAAkfIQSR//wMYrroZ9oWqkv3Ev4eFQu72HF7nAnf9LN1c/gQAjUrBa9P3KH6LLG0Wf8AAAB1SURBVHicPY5ZEoJADAUbxaCiIorLsDiouMv9r8ekBuiPVF6nkgo4gonWaYhnJo5ovljGstK8Fs9G+wS2MqDTdMd+FNnhSHbCh7MxJi+kpOrFxVpbX91WxW1cuTfwSHgOOdKj8oJ3L9xbTWrUfjR++f1FWugA/t4G3t6V7vEAAAAASUVORK5CYII="/>
+       </defs>
+       <style>
+       </style>
+       <use id="Background" href="#img1" x="0" y="2"/>
+</svg>
\ No newline at end of file
diff --git a/addons/ez_transitions/images/transition_overlay_node_icon.svg.import b/addons/ez_transitions/images/transition_overlay_node_icon.svg.import
new file mode 100644 (file)
index 0000000..dc709f8
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dvhd4xegh5b15"
+path="res://.godot/imported/transition_overlay_node_icon.svg-05f1bc9c9a38bdd0fb64744e40aa527f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ez_transitions/images/transition_overlay_node_icon.svg"
+dest_files=["res://.godot/imported/transition_overlay_node_icon.svg-05f1bc9c9a38bdd0fb64744e40aa527f.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/ez_transitions/materials/transition_material.tres b/addons/ez_transitions/materials/transition_material.tres
new file mode 100644 (file)
index 0000000..764b63b
--- /dev/null
@@ -0,0 +1,14 @@
+[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://d0jcjsq64h2kp"]
+
+[ext_resource type="Shader" path="res://addons/ez_transitions/shaders/transition_shader.gdshader" id="1_0kb0q"]
+
+[resource]
+shader = ExtResource("1_0kb0q")
+shader_parameter/screen_width = 1920.0
+shader_parameter/screen_height = 1080.0
+shader_parameter/center = Vector2(0.5, 0.5)
+shader_parameter/progress = 0.0
+shader_parameter/pixel_size = 15.0
+shader_parameter/circle_size = 1.5
+shader_parameter/curtains = 1.0
+shader_parameter/type = 0
diff --git a/addons/ez_transitions/objects/main_container/basic_settings_script.gd b/addons/ez_transitions/objects/main_container/basic_settings_script.gd
new file mode 100644 (file)
index 0000000..41a8baa
--- /dev/null
@@ -0,0 +1,14 @@
+@tool
+extends MarginContainer
+
+func _on_transitions_checkbox_toggled(button_pressed: bool) -> void:
+       # Enabling or disabling all transitions.
+       EzTransitions.plugin_toggle_transitions(button_pressed)
+       
+func _on_debug_checkbox_toggled(button_pressed: bool) -> void:
+       # Enabling or disabling the plugin's debug mode.
+       EzTransitions.plugin_toggle_debug_mode(button_pressed)
+       
+func _on_speed_spinbox_value_changed(value: float) -> void:
+       # Updating the plugin's speed scale.
+       EzTransitions.plugin_set_speed_scale(value)
diff --git a/addons/ez_transitions/objects/main_container/editor_control_script.gd b/addons/ez_transitions/objects/main_container/editor_control_script.gd
new file mode 100644 (file)
index 0000000..eae836e
--- /dev/null
@@ -0,0 +1,125 @@
+@tool
+extends Control
+
+# Nodes:
+@onready var TRANSITION_OVERLAY: TransitionOverlay = $TransitionOverlay
+
+# Variables:
+var INTRO_EASE_ID: int = 0
+var INTRO_TRANS_ID: int = 2
+var INTRO_TYPE: int = 0
+var INTRO_DURATION: float = 1.0
+var DELAY_TO_PROCEED: float = 0.0
+var REVERSE_INTRO: bool = false
+var INTRO_TEXTURE_PATH: String = "res://addons/ez_transitions/images/black_texture.png"
+
+var OUTRO_EASE_ID: int = 1
+var OUTRO_TRANS_ID: int = 2
+var OUTRO_TYPE: int = 0
+var OUTRO_DURATION: float = 1.0
+var REVERSE_OUTRO: bool = true
+var OUTRO_TEXTURE_PATH: String = "res://addons/ez_transitions/images/black_texture.png"
+
+var TARGET_SCENE_PATH: String = ""
+
+func _ready() -> void:
+       # Connections.
+       for group in ["EasingCheckboxIntro", "EasingCheckboxOutro", "TransitionCheckboxIntro", "TransitionCheckboxOutro", "TypeCheckboxIntro", "TypeCheckboxOutro"]:
+               connect_checkboxes(group)
+               
+func _on_preview_button_pressed() -> void:
+       # Updating the TransitionOverlay variables.
+       TRANSITION_OVERLAY.INTRO_EASE = INTRO_EASE_ID
+       TRANSITION_OVERLAY.INTRO_TRANS = INTRO_TRANS_ID
+       TRANSITION_OVERLAY.INTRO_TYPE = INTRO_TYPE
+       TRANSITION_OVERLAY.INTRO_DURATION = INTRO_DURATION
+       TRANSITION_OVERLAY.DELAY_TO_PROCEED = DELAY_TO_PROCEED
+       TRANSITION_OVERLAY.REVERSE_INTRO = REVERSE_INTRO
+       TRANSITION_OVERLAY.INTRO_TEXTURE = load(INTRO_TEXTURE_PATH)
+       TRANSITION_OVERLAY.OUTRO_EASE = OUTRO_EASE_ID
+       TRANSITION_OVERLAY.OUTRO_TRANS = OUTRO_TRANS_ID
+       TRANSITION_OVERLAY.OUTRO_TYPE = OUTRO_TYPE
+       TRANSITION_OVERLAY.OUTRO_DURATION = OUTRO_DURATION
+       TRANSITION_OVERLAY.REVERSE_OUTRO = REVERSE_OUTRO
+       TRANSITION_OVERLAY.OUTRO_TEXTURE = load(OUTRO_TEXTURE_PATH)
+       
+       # Playing the transition animation.
+       TRANSITION_OVERLAY.play_intro() # Playing the intro.
+       
+       # Changing scene.
+       await TRANSITION_OVERLAY.intro_finished # Waiting until the intro has finished playing.
+       await get_tree().create_timer(DELAY_TO_PROCEED).timeout # Waiting the extra time.
+       
+       # Playing the outro.
+       TRANSITION_OVERLAY.play_outro()
+       
+func _on_copy_button_pressed() -> void: 
+       # Generating the transition code and putting in the user's clipboard.
+       DisplayServer.clipboard_set(generate_code())
+
+# Updating the intro variables.
+func _on_intro_duration_spinbox_value_changed(value: float) -> void: INTRO_DURATION = value # Updating the intro duration variable.
+func _on_intro_delay_spinbox_value_changed(value: float) -> void: DELAY_TO_PROCEED = value # Updating the intro delay to proceed variable.
+func _on_intro_reverse_checkbox_toggled(button_pressed: bool) -> void: REVERSE_INTRO = button_pressed # Updating the intro reverse variable.
+func _on_intro_texture_edit_text_changed(new_text: String) -> void: INTRO_TEXTURE_PATH = new_text # Updating the intro texture path variable.
+
+# Updating the outro variables.
+func _on_outro_reverse_checkbox_toggled(button_pressed: bool) -> void: REVERSE_OUTRO = button_pressed # Updating the outro reverse variable.
+func _on_outro_duration_spinbox_value_changed(value: float) -> void: OUTRO_DURATION = value # Updating the intro duration variable.
+func _on_outro_texture_edit_text_changed(new_text: String) -> void: OUTRO_TEXTURE_PATH = new_text # Updating the outro texture path variable.
+
+# Updating other variables.
+func _on_scene_edit_text_changed(new_text: String) -> void: TARGET_SCENE_PATH = new_text # Updating the next scene path variable.
+       
+func connect_checkboxes(group: String) -> void:
+       # This function cnnects all checkboxes in a certain group.
+       for check_box in get_tree().get_nodes_in_group(group): # Looping trough every node in a group.
+               check_box.connect("pressed", func(): # Connecting a signal.
+                       # Updating the nodes.
+                       for i in get_tree().get_nodes_in_group(group): # Looping trough every node in a group.
+                               i.button_pressed = false # Unchecking that node.
+                       check_box.button_pressed = true # Chceking that node.
+                       
+                       # Updating variables.
+                       if (check_box.is_in_group("EasingCheckboxIntro")): # Checking if the node is in the "EasingCheckboxIntro" group.
+                               INTRO_EASE_ID = check_box.z_index # Updating the intro easing ID.
+                               
+                       elif (check_box.is_in_group("EasingCheckboxOutro")): # Checking if the node is in the "EasingCheckboxOutro" group.
+                               OUTRO_EASE_ID = check_box.z_index # Updating the intro easing ID.
+                               
+                       elif (check_box.is_in_group("TransitionCheckboxIntro")): # Checking if the node is in the "TransitionCheckboxIntro" group.
+                               INTRO_TRANS_ID = check_box.z_index # Updating the intro easing ID.
+                               
+                       elif (check_box.is_in_group("TransitionCheckboxOutro")): # Checking if the node is in the "TransitionCheckboxOutro" group.
+                               OUTRO_TRANS_ID = check_box.z_index # Updating the intro easing ID.
+                               
+                       elif (check_box.is_in_group("TypeCheckboxIntro")): # Checking if the node is in the "TransitionCheckboxIntro" group.
+                               INTRO_TYPE = check_box.z_index # Updating the intro easing ID.
+                               
+                       elif (check_box.is_in_group("TypeCheckboxOutro")): # Checking if the node is in the "TransitionCheckboxOutro" group.
+                               OUTRO_TYPE = check_box.z_index # Updating the intro easing ID.
+               )
+               
+func generate_code() -> String:
+       # This function generates a GD Script code that can be used to start a new transition.
+       var code: String = "" # This variable stores the code that is going to be generated.
+       
+       # Generating the code itself.
+       code += "EzTransitions.set_easing(%s, %s)" % [str(INTRO_EASE_ID), str(OUTRO_EASE_ID)] + "\n"
+       code += "EzTransitions.set_trans(%s, %s)" % [str(INTRO_TRANS_ID), str(OUTRO_TRANS_ID)] + "\n"
+       code += "EzTransitions.set_timers(%s, %s, %s)" % [str(INTRO_DURATION), str(DELAY_TO_PROCEED), str(OUTRO_DURATION)] + "\n"
+       code += "EzTransitions.set_reverse(%s, %s)" % [str(REVERSE_INTRO), str(REVERSE_OUTRO)] + "\n"
+       code += "EzTransitions.set_textures(\"%s\", \"%s\")" % [str(INTRO_TEXTURE_PATH), str(OUTRO_TEXTURE_PATH)] + "\n"
+       code += "EzTransitions.set_types(%s, %s)" % [str(INTRO_TYPE), str(OUTRO_TYPE)] + "\n"
+       code += "EzTransitions.change_scene(\"%s\")" % TARGET_SCENE_PATH
+       
+       # Returnning the generated code.
+       return code
+               
+# EzTransitions.set_easing(intro_easing, outro_easing)
+# EzTransitions.set_trans(intro_trans, outro_trans)
+# EzTransitions.set_timers(intro_duration, delay_to_proceed, outro_duration)
+# EzTransitions.set_reverse(reverse_intro, reverse_outro)
+# EzTransitions.set_textures(intro_texture, outro_texture)
+# EzTransitions.set_types(intro_type, outro_type)
+# EzTransitions.change_scene(next_scene)
diff --git a/addons/ez_transitions/objects/main_container/main_container.tscn b/addons/ez_transitions/objects/main_container/main_container.tscn
new file mode 100644 (file)
index 0000000..56a3a83
--- /dev/null
@@ -0,0 +1,1263 @@
+[gd_scene load_steps=26 format=3 uid="uid://dk1x64ujkuto4"]
+
+[ext_resource type="Shader" path="res://addons/ez_transitions/shaders/scroll_shader.gdshader" id="1_4v1lf"]
+[ext_resource type="Texture2D" uid="uid://ujutctmbt2ax" path="res://addons/ez_transitions/images/checkerboard_texture.png" id="2_fymo8"]
+[ext_resource type="Texture2D" uid="uid://dovx338ff7u7n" path="res://addons/ez_transitions/images/plugin_icon.svg" id="3_3etxp"]
+[ext_resource type="FontFile" uid="uid://cjhjf5pqxtcqs" path="res://addons/ez_transitions/fonts/mini_pixel-7.ttf" id="4_q67u8"]
+[ext_resource type="Script" path="res://addons/ez_transitions/objects/main_container/basic_settings_script.gd" id="5_2hvyf"]
+[ext_resource type="Theme" uid="uid://djuojj8aridg" path="res://addons/ez_transitions/themes/main_theme.tres" id="5_l8ou1"]
+[ext_resource type="Script" path="res://addons/ez_transitions/objects/transition_overlay/transition_overlay_script.gd" id="6_d4a4f"]
+[ext_resource type="Script" path="res://addons/ez_transitions/objects/main_container/editor_control_script.gd" id="6_jbowr"]
+[ext_resource type="Shader" path="res://addons/ez_transitions/shaders/transition_shader.gdshader" id="7_go6qa"]
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_hbqyv"]
+shader = ExtResource("1_4v1lf")
+shader_parameter/scroll_speed = Vector2(0.5, 0.5)
+shader_parameter/alpha = 0.35
+
+[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_atdpp"]
+blend_mode = 1
+
+[sub_resource type="Gradient" id="Gradient_8h3jn"]
+colors = PackedColorArray(1, 0.478431, 0.478431, 1, 1, 0.478431, 0.478431, 0)
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_xvtr7"]
+gradient = SubResource("Gradient_8h3jn")
+fill_to = Vector2(0, 1)
+
+[sub_resource type="Gradient" id="Gradient_32ene"]
+colors = PackedColorArray(0, 0, 0, 1, 0, 0, 0, 0)
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_ldcd0"]
+gradient = SubResource("Gradient_32ene")
+fill_from = Vector2(0, 1)
+fill_to = Vector2(0, 0)
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_hrhhx"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_52qk3"]
+
+[sub_resource type="Gradient" id="Gradient_lym5o"]
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_n5vih"]
+gradient = SubResource("Gradient_lym5o")
+
+[sub_resource type="LabelSettings" id="LabelSettings_hcadf"]
+font = ExtResource("4_q67u8")
+font_size = 40
+outline_size = 8
+outline_color = Color(0, 0, 0, 1)
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_lqftc"]
+shader = ExtResource("7_go6qa")
+shader_parameter/screen_size = Vector2(506, 282)
+shader_parameter/progress = 0.0
+shader_parameter/pixel_size = 15.0
+shader_parameter/type = 0
+shader_parameter/reversed = false
+
+[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_mfnej"]
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_n4fqv"]
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_wtj6u"]
+
+[sub_resource type="LabelSettings" id="LabelSettings_keric"]
+font = ExtResource("4_q67u8")
+font_size = 20
+outline_size = 4
+outline_color = Color(0, 0, 0, 1)
+
+[node name="MainContainer" type="VBoxContainer"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/separation = -2
+
+[node name="BackgroundControl" type="Control" parent="."]
+layout_mode = 2
+
+[node name="BackgroundTexture" type="TextureRect" parent="BackgroundControl"]
+texture_filter = 1
+texture_repeat = 2
+material = SubResource("ShaderMaterial_hbqyv")
+clip_contents = true
+layout_mode = 2
+offset_left = 8.0
+offset_right = 673.0
+offset_bottom = 440.0
+scale = Vector2(2, 2)
+texture = ExtResource("2_fymo8")
+stretch_mode = 1
+
+[node name="GlowTexture" type="TextureRect" parent="BackgroundControl"]
+modulate = Color(1, 1, 1, 0.321569)
+texture_filter = 1
+texture_repeat = 2
+material = SubResource("CanvasItemMaterial_atdpp")
+clip_contents = true
+layout_mode = 2
+offset_left = 8.0
+offset_right = 673.0
+offset_bottom = 440.0
+scale = Vector2(2, 2)
+texture = SubResource("GradientTexture2D_xvtr7")
+
+[node name="ShadowTexture" type="TextureRect" parent="BackgroundControl"]
+modulate = Color(1, 1, 1, 0.321569)
+texture_filter = 1
+texture_repeat = 2
+clip_contents = true
+layout_mode = 2
+offset_left = 8.0
+offset_right = 673.0
+offset_bottom = 440.0
+scale = Vector2(2, 2)
+texture = SubResource("GradientTexture2D_ldcd0")
+
+[node name="IconTexture" type="TextureRect" parent="BackgroundControl"]
+layout_mode = 0
+offset_left = 1264.0
+offset_top = 16.0
+offset_right = 1824.0
+offset_bottom = 576.0
+scale = Vector2(0.1, 0.1)
+texture = ExtResource("3_3etxp")
+
+[node name="CreditsLabel" type="RichTextLabel" parent="BackgroundControl"]
+texture_filter = 1
+layout_mode = 0
+offset_left = 664.0
+offset_top = -16.0
+offset_right = 1248.0
+offset_bottom = 64.0
+theme_override_colors/default_color = Color(1, 1, 1, 1)
+theme_override_colors/font_shadow_color = Color(0, 0, 0, 0.392157)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/shadow_offset_x = 0
+theme_override_constants/shadow_offset_y = 5
+theme_override_constants/outline_size = 8
+theme_override_fonts/normal_font = ExtResource("4_q67u8")
+theme_override_font_sizes/normal_font_size = 40
+theme_override_styles/focus = SubResource("StyleBoxEmpty_hrhhx")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_52qk3")
+bbcode_enabled = true
+text = " [right][wave amp=20.0 freq=5.0]EzTransitions by IsItLucas?"
+fit_content = true
+scroll_active = false
+
+[node name="DivisionTextureA" type="TextureRect" parent="."]
+modulate = Color(1, 1, 1, 0)
+layout_mode = 2
+texture = SubResource("GradientTexture2D_n5vih")
+
+[node name="BasicTitleLabel" type="RichTextLabel" parent="."]
+texture_filter = 1
+layout_mode = 2
+theme_override_colors/default_color = Color(1, 1, 1, 1)
+theme_override_colors/font_shadow_color = Color(0, 0, 0, 0.392157)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/shadow_offset_x = 2
+theme_override_constants/shadow_offset_y = 2
+theme_override_constants/shadow_outline_size = 8
+theme_override_constants/outline_size = 8
+theme_override_fonts/normal_font = ExtResource("4_q67u8")
+theme_override_font_sizes/normal_font_size = 40
+theme_override_styles/focus = SubResource("StyleBoxEmpty_hrhhx")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_52qk3")
+bbcode_enabled = true
+text = "  [wave amp=20.0 freq=5.0]Basic Settings:"
+fit_content = true
+scroll_active = false
+
+[node name="BasicSettingsContainer" type="MarginContainer" parent="."]
+layout_mode = 2
+theme_override_constants/margin_left = 23
+script = ExtResource("5_2hvyf")
+
+[node name="HContainer" type="HBoxContainer" parent="BasicSettingsContainer"]
+layout_mode = 2
+theme_override_constants/separation = 40
+
+[node name="TransitionsCheckbox" type="CheckBox" parent="BasicSettingsContainer/HContainer"]
+texture_filter = 1
+layout_mode = 2
+focus_mode = 1
+theme = ExtResource("5_l8ou1")
+button_pressed = true
+text = "Transitions Enabled?"
+
+[node name="DebugCheckbox" type="CheckBox" parent="BasicSettingsContainer/HContainer"]
+texture_filter = 1
+layout_mode = 2
+focus_mode = 1
+theme = ExtResource("5_l8ou1")
+button_pressed = true
+text = "Debug Mode?"
+
+[node name="SpeedSpinbox" type="SpinBox" parent="BasicSettingsContainer/HContainer"]
+texture_filter = 1
+custom_minimum_size = Vector2(85, 0)
+layout_mode = 2
+focus_mode = 1
+theme = ExtResource("5_l8ou1")
+min_value = 0.1
+max_value = 10.0
+step = 0.05
+value = 1.0
+suffix = "x"
+
+[node name="SpeedLabel" type="Label" parent="BasicSettingsContainer/HContainer/SpeedSpinbox"]
+texture_filter = 1
+layout_mode = 2
+offset_left = 92.0
+offset_right = 236.0
+offset_bottom = 43.0
+text = "Speed Scale"
+label_settings = SubResource("LabelSettings_hcadf")
+
+[node name="EditorTitleLabel" type="RichTextLabel" parent="."]
+texture_filter = 1
+layout_mode = 2
+theme_override_colors/default_color = Color(1, 1, 1, 1)
+theme_override_colors/font_shadow_color = Color(0, 0, 0, 0.392157)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/shadow_offset_x = 2
+theme_override_constants/shadow_offset_y = 2
+theme_override_constants/shadow_outline_size = 8
+theme_override_constants/outline_size = 8
+theme_override_fonts/normal_font = ExtResource("4_q67u8")
+theme_override_font_sizes/normal_font_size = 40
+theme_override_styles/focus = SubResource("StyleBoxEmpty_hrhhx")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_52qk3")
+bbcode_enabled = true
+text = "
+  [wave amp=20.0 freq=5.0]Transition Editor:"
+fit_content = true
+scroll_active = false
+
+[node name="EditorControl" type="Control" parent="."]
+layout_mode = 2
+script = ExtResource("6_jbowr")
+
+[node name="OutlineRect" type="ColorRect" parent="EditorControl"]
+modulate = Color(0, 0, 0, 1)
+clip_contents = true
+layout_mode = 2
+offset_left = 24.0
+offset_top = 2.0
+offset_right = 536.0
+offset_bottom = 290.0
+
+[node name="BackgroundRect" type="ColorRect" parent="EditorControl"]
+clip_contents = true
+layout_mode = 2
+offset_left = 27.0
+offset_top = 5.0
+offset_right = 533.0
+offset_bottom = 287.0
+
+[node name="TransitionOverlay" type="TextureRect" parent="EditorControl"]
+material = SubResource("ShaderMaterial_lqftc")
+layout_mode = 0
+offset_left = 27.0
+offset_top = 5.0
+offset_right = 533.0
+offset_bottom = 287.0
+texture = SubResource("PlaceholderTexture2D_mfnej")
+script = ExtResource("6_d4a4f")
+INTRO_TEXTURE = SubResource("GradientTexture2D_n4fqv")
+OUTRO_TEXTURE = SubResource("GradientTexture2D_wtj6u")
+
+[node name="Intro" type="Control" parent="EditorControl"]
+anchors_preset = 0
+offset_left = 34.0
+offset_right = 74.0
+offset_bottom = 40.0
+
+[node name="TitleLabel" type="RichTextLabel" parent="EditorControl/Intro"]
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = -4.0
+offset_right = 799.0
+offset_bottom = 36.0
+theme_override_colors/default_color = Color(1, 1, 1, 1)
+theme_override_colors/font_shadow_color = Color(0, 0, 0, 0.392157)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/shadow_offset_x = 2
+theme_override_constants/shadow_offset_y = 2
+theme_override_constants/shadow_outline_size = 8
+theme_override_constants/outline_size = 8
+theme_override_fonts/normal_font = ExtResource("4_q67u8")
+theme_override_font_sizes/normal_font_size = 40
+theme_override_styles/focus = SubResource("StyleBoxEmpty_hrhhx")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_52qk3")
+bbcode_enabled = true
+text = " [wave amp=20.0 freq=5.0]Intro:"
+fit_content = true
+scroll_active = false
+
+[node name="EaseLabel" type="RichTextLabel" parent="EditorControl/Intro"]
+texture_filter = 1
+layout_mode = 2
+offset_left = 561.0
+offset_top = 44.0
+offset_right = 795.0
+offset_bottom = 64.0
+theme_override_colors/default_color = Color(1, 1, 1, 1)
+theme_override_colors/font_shadow_color = Color(0, 0, 0, 0.392157)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/shadow_offset_x = 2
+theme_override_constants/shadow_offset_y = 2
+theme_override_constants/shadow_outline_size = 8
+theme_override_constants/outline_size = 8
+theme_override_fonts/normal_font = ExtResource("4_q67u8")
+theme_override_font_sizes/normal_font_size = 20
+theme_override_styles/focus = SubResource("StyleBoxEmpty_hrhhx")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_52qk3")
+bbcode_enabled = true
+text = "[wave amp=20.0 freq=5.0] Tween Easing:
+"
+fit_content = true
+scroll_active = false
+
+[node name="FadeInCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["EasingCheckboxIntro"]]
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 68.0
+offset_right = 799.0
+offset_bottom = 108.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+button_pressed = true
+text = "Fade In"
+
+[node name="FadeOutCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["EasingCheckboxIntro"]]
+z_index = 1
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 89.0
+offset_right = 799.0
+offset_bottom = 129.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Fade Out"
+
+[node name="FadeInOutCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["EasingCheckboxIntro"]]
+z_index = 2
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 110.0
+offset_right = 799.0
+offset_bottom = 150.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Fade In Out"
+
+[node name="FadeOutInCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["EasingCheckboxIntro"]]
+z_index = 3
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 131.0
+offset_right = 799.0
+offset_bottom = 171.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Fade Out In"
+
+[node name="TransitionLabel" type="RichTextLabel" parent="EditorControl/Intro"]
+texture_filter = 1
+layout_mode = 2
+offset_left = 561.0
+offset_top = 162.0
+offset_right = 795.0
+offset_bottom = 182.0
+theme_override_colors/default_color = Color(1, 1, 1, 1)
+theme_override_colors/font_shadow_color = Color(0, 0, 0, 0.392157)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/shadow_offset_x = 2
+theme_override_constants/shadow_offset_y = 2
+theme_override_constants/shadow_outline_size = 8
+theme_override_constants/outline_size = 8
+theme_override_fonts/normal_font = ExtResource("4_q67u8")
+theme_override_font_sizes/normal_font_size = 20
+theme_override_styles/focus = SubResource("StyleBoxEmpty_hrhhx")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_52qk3")
+bbcode_enabled = true
+text = "[wave amp=20.0 freq=5.0] Tween Transition:
+"
+fit_content = true
+scroll_active = false
+
+[node name="LinearCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TransitionCheckboxIntro"]]
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 186.0
+offset_right = 799.0
+offset_bottom = 226.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Linear"
+
+[node name="SineCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TransitionCheckboxIntro"]]
+z_index = 1
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 207.0
+offset_right = 799.0
+offset_bottom = 247.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Sine"
+
+[node name="QuintCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TransitionCheckboxIntro"]]
+z_index = 2
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 228.0
+offset_right = 799.0
+offset_bottom = 268.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+button_pressed = true
+text = "Quint"
+
+[node name="QuartCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TransitionCheckboxIntro"]]
+z_index = 3
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 249.0
+offset_right = 799.0
+offset_bottom = 289.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Quart"
+
+[node name="QuadCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TransitionCheckboxIntro"]]
+z_index = 4
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 270.0
+offset_right = 799.0
+offset_bottom = 310.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Quad"
+
+[node name="ExpoCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TransitionCheckboxIntro"]]
+z_index = 5
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 291.0
+offset_right = 799.0
+offset_bottom = 331.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Expo"
+
+[node name="ElasticCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TransitionCheckboxIntro"]]
+z_index = 6
+texture_filter = 1
+layout_mode = 2
+offset_left = 663.0
+offset_top = 186.0
+offset_right = 897.0
+offset_bottom = 226.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Elastic"
+
+[node name="CubicCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TransitionCheckboxIntro"]]
+z_index = 7
+texture_filter = 1
+layout_mode = 2
+offset_left = 663.0
+offset_top = 207.0
+offset_right = 897.0
+offset_bottom = 247.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Cubic"
+
+[node name="CircCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TransitionCheckboxIntro"]]
+z_index = 8
+texture_filter = 1
+layout_mode = 2
+offset_left = 663.0
+offset_top = 228.0
+offset_right = 897.0
+offset_bottom = 268.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Circ"
+
+[node name="BounceCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TransitionCheckboxIntro"]]
+z_index = 9
+texture_filter = 1
+layout_mode = 2
+offset_left = 663.0
+offset_top = 249.0
+offset_right = 897.0
+offset_bottom = 289.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Bounce"
+
+[node name="BackCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TransitionCheckboxIntro"]]
+z_index = 10
+texture_filter = 1
+layout_mode = 2
+offset_left = 663.0
+offset_top = 270.0
+offset_right = 897.0
+offset_bottom = 310.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Back"
+
+[node name="SpringCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TransitionCheckboxIntro"]]
+z_index = 11
+texture_filter = 1
+layout_mode = 2
+offset_left = 663.0
+offset_top = 291.0
+offset_right = 897.0
+offset_bottom = 331.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Spring"
+
+[node name="ExtraLabel" type="RichTextLabel" parent="EditorControl/Intro"]
+texture_filter = 1
+layout_mode = 2
+offset_left = 561.0
+offset_top = 322.0
+offset_right = 795.0
+offset_bottom = 342.0
+theme_override_colors/default_color = Color(1, 1, 1, 1)
+theme_override_colors/font_shadow_color = Color(0, 0, 0, 0.392157)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/shadow_offset_x = 2
+theme_override_constants/shadow_offset_y = 2
+theme_override_constants/shadow_outline_size = 8
+theme_override_constants/outline_size = 8
+theme_override_fonts/normal_font = ExtResource("4_q67u8")
+theme_override_font_sizes/normal_font_size = 20
+theme_override_styles/focus = SubResource("StyleBoxEmpty_hrhhx")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_52qk3")
+bbcode_enabled = true
+text = "[wave amp=20.0 freq=5.0] Extra Settings:
+"
+fit_content = true
+scroll_active = false
+
+[node name="ReverseCheckbox" type="CheckBox" parent="EditorControl/Intro"]
+texture_filter = 1
+layout_mode = 0
+offset_left = 565.0
+offset_top = 345.0
+offset_right = 849.0
+offset_bottom = 385.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Reverse Animation?"
+
+[node name="DurationSpinbox" type="SpinBox" parent="EditorControl/Intro"]
+texture_filter = 1
+layout_mode = 0
+offset_left = 570.0
+offset_top = 375.0
+offset_right = 654.0
+offset_bottom = 399.0
+focus_mode = 1
+theme = ExtResource("5_l8ou1")
+max_value = 99.0
+step = 0.05
+value = 1.0
+suffix = "s"
+
+[node name="Label" type="Label" parent="EditorControl/Intro/DurationSpinbox"]
+texture_filter = 1
+layout_mode = 2
+offset_left = 92.0
+offset_top = 3.0
+offset_right = 236.0
+offset_bottom = 26.0
+text = "Duration"
+label_settings = SubResource("LabelSettings_keric")
+
+[node name="DelaySpinbox" type="SpinBox" parent="EditorControl/Intro"]
+texture_filter = 1
+layout_mode = 0
+offset_left = 570.0
+offset_top = 405.0
+offset_right = 654.0
+offset_bottom = 429.0
+focus_mode = 1
+theme = ExtResource("5_l8ou1")
+max_value = 99.0
+step = 0.05
+suffix = "s"
+
+[node name="Label" type="Label" parent="EditorControl/Intro/DelaySpinbox"]
+texture_filter = 1
+layout_mode = 2
+offset_left = 92.0
+offset_top = 3.0
+offset_right = 236.0
+offset_bottom = 26.0
+text = "Delay to Proceed"
+label_settings = SubResource("LabelSettings_keric")
+
+[node name="TextureEdit" type="LineEdit" parent="EditorControl/Intro"]
+texture_filter = 1
+layout_mode = 0
+offset_left = 570.0
+offset_top = 460.0
+offset_right = 886.0
+offset_bottom = 484.0
+theme = ExtResource("5_l8ou1")
+text = "res://addons/ez_transitions/images/black_texture.png"
+
+[node name="Label" type="Label" parent="EditorControl/Intro/TextureEdit"]
+texture_filter = 1
+layout_mode = 0
+offset_left = -4.0
+offset_top = -20.0
+offset_right = 140.0
+offset_bottom = 3.0
+text = "Texture Path:"
+label_settings = SubResource("LabelSettings_keric")
+
+[node name="TypeLabel" type="RichTextLabel" parent="EditorControl/Intro"]
+texture_filter = 1
+layout_mode = 0
+offset_left = 561.0
+offset_top = 497.0
+offset_right = 795.0
+offset_bottom = 517.0
+theme_override_colors/default_color = Color(1, 1, 1, 1)
+theme_override_colors/font_shadow_color = Color(0, 0, 0, 0.392157)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/shadow_offset_x = 2
+theme_override_constants/shadow_offset_y = 2
+theme_override_constants/shadow_outline_size = 8
+theme_override_constants/outline_size = 8
+theme_override_fonts/normal_font = ExtResource("4_q67u8")
+theme_override_font_sizes/normal_font_size = 20
+theme_override_styles/focus = SubResource("StyleBoxEmpty_hrhhx")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_52qk3")
+bbcode_enabled = true
+text = "[wave amp=20.0 freq=5.0] Transition Type:
+"
+fit_content = true
+scroll_active = false
+
+[node name="DiamondsCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TypeCheckboxIntro"]]
+texture_filter = 1
+layout_mode = 0
+offset_left = 565.0
+offset_top = 521.0
+offset_right = 799.0
+offset_bottom = 561.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Diamonds"
+
+[node name="CircleCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TypeCheckboxIntro"]]
+z_index = 1
+texture_filter = 1
+layout_mode = 0
+offset_left = 565.0
+offset_top = 542.0
+offset_right = 799.0
+offset_bottom = 582.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Circle"
+
+[node name="VerticalCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TypeCheckboxIntro"]]
+z_index = 2
+texture_filter = 1
+layout_mode = 0
+offset_left = 565.0
+offset_top = 563.0
+offset_right = 799.0
+offset_bottom = 603.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Vertical Cut"
+
+[node name="HorizontalCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TypeCheckboxIntro"]]
+z_index = 3
+texture_filter = 1
+layout_mode = 0
+offset_left = 565.0
+offset_top = 584.0
+offset_right = 799.0
+offset_bottom = 624.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Horizontal Cut"
+
+[node name="FadeCheckbox" type="CheckBox" parent="EditorControl/Intro" groups=["TypeCheckboxIntro"]]
+z_index = 4
+texture_filter = 1
+layout_mode = 0
+offset_left = 565.0
+offset_top = 605.0
+offset_right = 799.0
+offset_bottom = 645.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Fade"
+
+[node name="Outro" type="Control" parent="EditorControl"]
+anchors_preset = 0
+offset_left = 376.0
+offset_right = 416.0
+offset_bottom = 40.0
+
+[node name="TitleLabel" type="RichTextLabel" parent="EditorControl/Outro"]
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = -4.0
+offset_right = 799.0
+offset_bottom = 36.0
+theme_override_colors/default_color = Color(1, 1, 1, 1)
+theme_override_colors/font_shadow_color = Color(0, 0, 0, 0.392157)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/shadow_offset_x = 2
+theme_override_constants/shadow_offset_y = 2
+theme_override_constants/shadow_outline_size = 8
+theme_override_constants/outline_size = 8
+theme_override_fonts/normal_font = ExtResource("4_q67u8")
+theme_override_font_sizes/normal_font_size = 40
+theme_override_styles/focus = SubResource("StyleBoxEmpty_hrhhx")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_52qk3")
+bbcode_enabled = true
+text = " [wave amp=20.0 freq=5.0]Outro:"
+fit_content = true
+scroll_active = false
+
+[node name="EaseLabel" type="RichTextLabel" parent="EditorControl/Outro"]
+texture_filter = 1
+layout_mode = 2
+offset_left = 561.0
+offset_top = 44.0
+offset_right = 795.0
+offset_bottom = 64.0
+theme_override_colors/default_color = Color(1, 1, 1, 1)
+theme_override_colors/font_shadow_color = Color(0, 0, 0, 0.392157)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/shadow_offset_x = 2
+theme_override_constants/shadow_offset_y = 2
+theme_override_constants/shadow_outline_size = 8
+theme_override_constants/outline_size = 8
+theme_override_fonts/normal_font = ExtResource("4_q67u8")
+theme_override_font_sizes/normal_font_size = 20
+theme_override_styles/focus = SubResource("StyleBoxEmpty_hrhhx")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_52qk3")
+bbcode_enabled = true
+text = "[wave amp=20.0 freq=5.0] Tween Easing:
+"
+fit_content = true
+scroll_active = false
+
+[node name="FadeInCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["EasingCheckboxOutro"]]
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 68.0
+offset_right = 799.0
+offset_bottom = 108.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Fade In"
+
+[node name="FadeOutCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["EasingCheckboxOutro"]]
+z_index = 1
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 89.0
+offset_right = 799.0
+offset_bottom = 129.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+button_pressed = true
+text = "Fade Out"
+
+[node name="FadeInOutCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["EasingCheckboxOutro"]]
+z_index = 2
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 110.0
+offset_right = 799.0
+offset_bottom = 150.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Fade In Out"
+
+[node name="FadeOutInCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["EasingCheckboxOutro"]]
+z_index = 3
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 131.0
+offset_right = 799.0
+offset_bottom = 171.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Fade Out In"
+
+[node name="TransitionLabel" type="RichTextLabel" parent="EditorControl/Outro"]
+texture_filter = 1
+layout_mode = 2
+offset_left = 561.0
+offset_top = 162.0
+offset_right = 795.0
+offset_bottom = 182.0
+theme_override_colors/default_color = Color(1, 1, 1, 1)
+theme_override_colors/font_shadow_color = Color(0, 0, 0, 0.392157)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/shadow_offset_x = 2
+theme_override_constants/shadow_offset_y = 2
+theme_override_constants/shadow_outline_size = 8
+theme_override_constants/outline_size = 8
+theme_override_fonts/normal_font = ExtResource("4_q67u8")
+theme_override_font_sizes/normal_font_size = 20
+theme_override_styles/focus = SubResource("StyleBoxEmpty_hrhhx")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_52qk3")
+bbcode_enabled = true
+text = "[wave amp=20.0 freq=5.0] Tween Transition:
+"
+fit_content = true
+scroll_active = false
+
+[node name="LinearCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TransitionCheckboxOutro"]]
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 186.0
+offset_right = 799.0
+offset_bottom = 226.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Linear"
+
+[node name="SineCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TransitionCheckboxOutro"]]
+z_index = 1
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 207.0
+offset_right = 799.0
+offset_bottom = 247.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Sine"
+
+[node name="QuintCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TransitionCheckboxOutro"]]
+z_index = 2
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 228.0
+offset_right = 799.0
+offset_bottom = 268.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+button_pressed = true
+text = "Quint"
+
+[node name="QuartCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TransitionCheckboxOutro"]]
+z_index = 3
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 249.0
+offset_right = 799.0
+offset_bottom = 289.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Quart"
+
+[node name="QuadCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TransitionCheckboxOutro"]]
+z_index = 4
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 270.0
+offset_right = 799.0
+offset_bottom = 310.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Quad"
+
+[node name="ExpoCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TransitionCheckboxOutro"]]
+z_index = 5
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 291.0
+offset_right = 799.0
+offset_bottom = 331.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Expo"
+
+[node name="ElasticCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TransitionCheckboxOutro"]]
+z_index = 6
+texture_filter = 1
+layout_mode = 2
+offset_left = 663.0
+offset_top = 186.0
+offset_right = 897.0
+offset_bottom = 226.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Elastic"
+
+[node name="CubicCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TransitionCheckboxOutro"]]
+z_index = 7
+texture_filter = 1
+layout_mode = 2
+offset_left = 663.0
+offset_top = 207.0
+offset_right = 897.0
+offset_bottom = 247.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Cubic"
+
+[node name="CircCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TransitionCheckboxOutro"]]
+z_index = 8
+texture_filter = 1
+layout_mode = 2
+offset_left = 663.0
+offset_top = 228.0
+offset_right = 897.0
+offset_bottom = 268.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Circ"
+
+[node name="BounceCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TransitionCheckboxOutro"]]
+z_index = 9
+texture_filter = 1
+layout_mode = 2
+offset_left = 663.0
+offset_top = 249.0
+offset_right = 897.0
+offset_bottom = 289.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Bounce"
+
+[node name="BackCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TransitionCheckboxOutro"]]
+z_index = 10
+texture_filter = 1
+layout_mode = 2
+offset_left = 663.0
+offset_top = 270.0
+offset_right = 897.0
+offset_bottom = 310.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Back"
+
+[node name="SpringCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TransitionCheckboxOutro"]]
+z_index = 11
+texture_filter = 1
+layout_mode = 2
+offset_left = 663.0
+offset_top = 291.0
+offset_right = 897.0
+offset_bottom = 331.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Spring"
+
+[node name="ExtraLabel" type="RichTextLabel" parent="EditorControl/Outro"]
+texture_filter = 1
+layout_mode = 2
+offset_left = 561.0
+offset_top = 322.0
+offset_right = 795.0
+offset_bottom = 342.0
+theme_override_colors/default_color = Color(1, 1, 1, 1)
+theme_override_colors/font_shadow_color = Color(0, 0, 0, 0.392157)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/shadow_offset_x = 2
+theme_override_constants/shadow_offset_y = 2
+theme_override_constants/shadow_outline_size = 8
+theme_override_constants/outline_size = 8
+theme_override_fonts/normal_font = ExtResource("4_q67u8")
+theme_override_font_sizes/normal_font_size = 20
+theme_override_styles/focus = SubResource("StyleBoxEmpty_hrhhx")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_52qk3")
+bbcode_enabled = true
+text = "[wave amp=20.0 freq=5.0] Extra Settings:
+"
+fit_content = true
+scroll_active = false
+
+[node name="ReverseCheckbox" type="CheckBox" parent="EditorControl/Outro"]
+texture_filter = 1
+layout_mode = 0
+offset_left = 565.0
+offset_top = 345.0
+offset_right = 849.0
+offset_bottom = 385.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+button_pressed = true
+text = "Reverse Animation?"
+
+[node name="DurationSpinbox" type="SpinBox" parent="EditorControl/Outro"]
+texture_filter = 1
+layout_mode = 0
+offset_left = 570.0
+offset_top = 375.0
+offset_right = 656.0
+offset_bottom = 399.0
+focus_mode = 1
+theme = ExtResource("5_l8ou1")
+max_value = 99.0
+step = 0.05
+value = 1.0
+suffix = "s"
+
+[node name="Label" type="Label" parent="EditorControl/Outro/DurationSpinbox"]
+texture_filter = 1
+layout_mode = 2
+offset_left = 92.0
+offset_top = 3.0
+offset_right = 236.0
+offset_bottom = 26.0
+text = "Duration"
+label_settings = SubResource("LabelSettings_keric")
+
+[node name="TextureEdit" type="LineEdit" parent="EditorControl/Outro"]
+texture_filter = 1
+layout_mode = 0
+offset_left = 570.0
+offset_top = 460.0
+offset_right = 880.0
+offset_bottom = 484.0
+theme = ExtResource("5_l8ou1")
+text = "res://addons/ez_transitions/images/black_texture.png"
+
+[node name="Label" type="Label" parent="EditorControl/Outro/TextureEdit"]
+texture_filter = 1
+layout_mode = 0
+offset_left = -4.0
+offset_top = -20.0
+offset_right = 140.0
+offset_bottom = 3.0
+text = "Texture Path:"
+label_settings = SubResource("LabelSettings_keric")
+
+[node name="TypeLabel" type="RichTextLabel" parent="EditorControl/Outro"]
+texture_filter = 1
+layout_mode = 2
+offset_left = 561.0
+offset_top = 497.0
+offset_right = 795.0
+offset_bottom = 517.0
+theme_override_colors/default_color = Color(1, 1, 1, 1)
+theme_override_colors/font_shadow_color = Color(0, 0, 0, 0.392157)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/shadow_offset_x = 2
+theme_override_constants/shadow_offset_y = 2
+theme_override_constants/shadow_outline_size = 8
+theme_override_constants/outline_size = 8
+theme_override_fonts/normal_font = ExtResource("4_q67u8")
+theme_override_font_sizes/normal_font_size = 20
+theme_override_styles/focus = SubResource("StyleBoxEmpty_hrhhx")
+theme_override_styles/normal = SubResource("StyleBoxEmpty_52qk3")
+bbcode_enabled = true
+text = "[wave amp=20.0 freq=5.0] Transition Type:
+"
+fit_content = true
+scroll_active = false
+
+[node name="DiamondsCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TypeCheckboxOutro"]]
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 521.0
+offset_right = 799.0
+offset_bottom = 561.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Diamonds"
+
+[node name="CircleCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TypeCheckboxOutro"]]
+z_index = 1
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 542.0
+offset_right = 799.0
+offset_bottom = 582.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Circle"
+
+[node name="VerticalCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TypeCheckboxOutro"]]
+z_index = 2
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 563.0
+offset_right = 799.0
+offset_bottom = 603.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Vertical Cut"
+
+[node name="HorizontalCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TypeCheckboxOutro"]]
+z_index = 3
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 584.0
+offset_right = 799.0
+offset_bottom = 624.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Horizontal Cut"
+
+[node name="FadeCheckbox" type="CheckBox" parent="EditorControl/Outro" groups=["TypeCheckboxOutro"]]
+z_index = 4
+texture_filter = 1
+layout_mode = 2
+offset_left = 565.0
+offset_top = 605.0
+offset_right = 799.0
+offset_bottom = 645.0
+scale = Vector2(0.5, 0.5)
+theme = ExtResource("5_l8ou1")
+theme_override_constants/outline_size = 8
+text = "Fade"
+
+[node name="Panel" type="Control" parent="EditorControl"]
+anchors_preset = 0
+offset_right = 40.0
+offset_bottom = 40.0
+
+[node name="SceneEdit" type="LineEdit" parent="EditorControl/Panel"]
+layout_mode = 0
+offset_left = 29.0
+offset_top = 327.0
+offset_right = 496.0
+offset_bottom = 351.0
+theme = ExtResource("5_l8ou1")
+
+[node name="Label" type="Label" parent="EditorControl/Panel/SceneEdit"]
+texture_filter = 1
+layout_mode = 0
+offset_left = -4.0
+offset_top = -20.0
+offset_right = 140.0
+offset_bottom = 3.0
+text = "Next Scene File Path:"
+label_settings = SubResource("LabelSettings_keric")
+
+[node name="CopyButton" type="Button" parent="EditorControl/Panel"]
+texture_filter = 1
+layout_mode = 0
+offset_left = 22.0
+offset_top = 353.0
+offset_right = 536.0
+offset_bottom = 401.0
+focus_mode = 0
+theme = ExtResource("5_l8ou1")
+text = "[Copy Code]"
+flat = true
+
+[node name="PreviewButton" type="Button" parent="EditorControl/Panel"]
+texture_filter = 1
+layout_mode = 0
+offset_left = 22.0
+offset_top = 391.0
+offset_right = 536.0
+offset_bottom = 439.0
+focus_mode = 0
+theme = ExtResource("5_l8ou1")
+text = "[Preview Transition]"
+flat = true
+
+[connection signal="toggled" from="BasicSettingsContainer/HContainer/TransitionsCheckbox" to="BasicSettingsContainer" method="_on_transitions_checkbox_toggled"]
+[connection signal="toggled" from="BasicSettingsContainer/HContainer/DebugCheckbox" to="BasicSettingsContainer" method="_on_debug_checkbox_toggled"]
+[connection signal="value_changed" from="BasicSettingsContainer/HContainer/SpeedSpinbox" to="BasicSettingsContainer" method="_on_speed_spinbox_value_changed"]
+[connection signal="toggled" from="EditorControl/Intro/ReverseCheckbox" to="EditorControl" method="_on_intro_reverse_checkbox_toggled"]
+[connection signal="value_changed" from="EditorControl/Intro/DurationSpinbox" to="EditorControl" method="_on_intro_duration_spinbox_value_changed"]
+[connection signal="value_changed" from="EditorControl/Intro/DelaySpinbox" to="EditorControl" method="_on_intro_delay_spinbox_value_changed"]
+[connection signal="text_changed" from="EditorControl/Intro/TextureEdit" to="EditorControl" method="_on_intro_texture_edit_text_changed"]
+[connection signal="toggled" from="EditorControl/Outro/ReverseCheckbox" to="EditorControl" method="_on_outro_reverse_checkbox_toggled"]
+[connection signal="value_changed" from="EditorControl/Outro/DurationSpinbox" to="EditorControl" method="_on_outro_duration_spinbox_value_changed"]
+[connection signal="text_changed" from="EditorControl/Outro/TextureEdit" to="EditorControl" method="_on_outro_texture_edit_text_changed"]
+[connection signal="text_changed" from="EditorControl/Panel/SceneEdit" to="EditorControl" method="_on_scene_edit_text_changed"]
+[connection signal="pressed" from="EditorControl/Panel/CopyButton" to="EditorControl" method="_on_copy_button_pressed"]
+[connection signal="pressed" from="EditorControl/Panel/PreviewButton" to="EditorControl" method="_on_preview_button_pressed"]
diff --git a/addons/ez_transitions/objects/plugin_singleton/plugin_singleton.tscn b/addons/ez_transitions/objects/plugin_singleton/plugin_singleton.tscn
new file mode 100644 (file)
index 0000000..38bb4cc
--- /dev/null
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://g0r0vrmlkjgu"]
+
+[ext_resource type="Script" path="res://addons/ez_transitions/objects/plugin_singleton/plugin_singleton_script.gd" id="1_e8frc"]
+
+[node name="Transition" type="CanvasLayer"]
+layer = 2
+script = ExtResource("1_e8frc")
diff --git a/addons/ez_transitions/objects/plugin_singleton/plugin_singleton_script.gd b/addons/ez_transitions/objects/plugin_singleton/plugin_singleton_script.gd
new file mode 100644 (file)
index 0000000..3016db1
--- /dev/null
@@ -0,0 +1,99 @@
+@tool
+@icon("res://addons/ez_transitions/images/transition_node_icon.svg")
+extends CanvasLayer
+
+# Plugin Variables:
+var plugin_transitions_enabled: bool = true
+var plugin_debug_mode: bool = true
+var plugin_speed_scale: float = 1.0
+
+# Variables:
+var TRANSITION_OVERLAY: TransitionOverlay
+
+func _ready() -> void:
+       # Creating a new TransitionOverlay node.
+       TRANSITION_OVERLAY = TransitionOverlay.new() # Creating a new TransitionOverlay instance.
+       TRANSITION_OVERLAY.size = get_viewport().get_visible_rect().size # Updating the TransitionOverlay size.
+       TRANSITION_OVERLAY.material = load("res://addons/ez_transitions/materials/transition_material.tres").duplicate() # Updating the material.
+       TRANSITION_OVERLAY.material.set_shader_parameter("screen_size", TRANSITION_OVERLAY.size) # Updating the TextureRect size.
+       TRANSITION_OVERLAY.material.set_shader_parameter("progress", 0.0) # Updating the Transition progress.
+       TRANSITION_OVERLAY.mouse_filter = Control.MOUSE_FILTER_IGNORE # Ignoring mouse inputs.
+       
+       # Adding the new TransitionOverlay to the scene.
+       add_child(TRANSITION_OVERLAY)
+       
+       if (plugin_debug_mode): # Checking if the plugin's debug mode is enabled.
+               print_rich("[color=red]Successfully added global TransitionOverlay.") # Debug print.
+       
+func plugin_toggle_debug_mode(enabled: bool) -> void:
+       # Enables or disables the plugin's debug mode.
+       plugin_debug_mode = enabled
+       print_rich("[color=red]Successfully updated EzTransitions debug mode. New value: %s" % str(enabled)) # Debug print.
+       
+func plugin_toggle_transitions(enabled: bool) -> void:
+       # Enables or disables the plugin's transitions.
+       plugin_transitions_enabled = enabled
+       if (plugin_debug_mode): # Checking if the plugin's debug mode is enabled.
+               print_rich("[color=red]Successfully updated EzTransitions transitions mode. New value: %s" % str(enabled)) # Debug print.
+       
+func plugin_set_speed_scale(new_speed_scale: float) -> void:
+       # Sets the plugin's speed scale to the given value.
+       plugin_speed_scale = new_speed_scale
+       if (plugin_debug_mode): # Checking if the plugin's debug mode is enabled.
+               print_rich("[color=red]Successfully updated EzTransitions speed scale. New value: %s" % str(new_speed_scale)) # Debug print.
+       
+func set_easing(intro_ease: Tween.EaseType, outro_ease: Tween.EaseType) -> void:
+       # Updates the TransitionOverlay's intro and outro easing.
+       TRANSITION_OVERLAY.INTRO_EASE = intro_ease
+       TRANSITION_OVERLAY.OUTRO_EASE = outro_ease
+       
+func set_trans(intro_trans: Tween.TransitionType, outro_trans: Tween.TransitionType) -> void:
+       # Updates the TransitionOverlay's intro and outro transition type.
+       TRANSITION_OVERLAY.INTRO_TRANS = intro_trans
+       TRANSITION_OVERLAY.OUTRO_TRANS = outro_trans
+       
+func set_timers(intro_duration: float, delay_to_proceed: float, outro_duration: float) -> void:
+       # Updates all the TransitionOverlay's values that are related to times and durations.
+       TRANSITION_OVERLAY.INTRO_DURATION = intro_duration
+       TRANSITION_OVERLAY.DELAY_TO_PROCEED = delay_to_proceed
+       TRANSITION_OVERLAY.OUTRO_DURATION = outro_duration
+       
+func set_reverse(reverse_intro: bool, reverse_outro: bool) -> void:
+       # Updates the TransitionOverlay's intro and outro playback.
+       TRANSITION_OVERLAY.REVERSE_INTRO = reverse_intro
+       TRANSITION_OVERLAY.REVERSE_OUTRO = reverse_outro
+       
+func set_textures(intro_texture: String, outro_texture: String) -> void:
+       # Updates all the TransitionOverlay's textures.
+       TRANSITION_OVERLAY.INTRO_TEXTURE = load(intro_texture)
+       TRANSITION_OVERLAY.OUTRO_TEXTURE = load(outro_texture)
+       
+func set_types(intro_type: int, outro_type: int) -> void:
+       # Updates the TransitionOverlay's intro and outro animation type.
+       TRANSITION_OVERLAY.INTRO_TYPE = intro_type
+       TRANSITION_OVERLAY.OUTRO_TYPE = outro_type
+       
+func change_scene(target_scene_path: String) -> void:
+       # Skipping the transition if the transitions aren't enabled.
+       if (!plugin_transitions_enabled): # Checking if the transitions are enabled or not.
+               get_tree().change_scene_to_file(target_scene_path) # Changing scene.
+               
+               if (plugin_debug_mode): # Checking if the plugin's debug mode is enabled.
+                       print_rich("[color=red]Transitions disabled! Skipping the transition and changing scene to: %s" % target_scene_path) # Debug print.
+                       
+               return # Stopping the code right here.
+               
+       if (plugin_debug_mode): # Checking if the plugin's debug mode is enabled.
+               print_rich("[color=red]Transition started. About to change scene to: %s" % target_scene_path) # Debug print.
+               
+       # Changes scene using the TransitionOverlay.
+       TRANSITION_OVERLAY.play_intro() # Playing the intro.
+       
+       # Changing scene.
+       await TRANSITION_OVERLAY.intro_finished # Waiting until the intro has finished playing.
+       await get_tree().create_timer(TRANSITION_OVERLAY.DELAY_TO_PROCEED).timeout # Waiting the extra time.
+       
+       get_tree().change_scene_to_file(target_scene_path) # Actually changing scene.
+       
+       # Playing the outro.
+       TRANSITION_OVERLAY.play_outro()
diff --git a/addons/ez_transitions/objects/transition_overlay/transition_overlay.tscn b/addons/ez_transitions/objects/transition_overlay/transition_overlay.tscn
new file mode 100644 (file)
index 0000000..57706ee
--- /dev/null
@@ -0,0 +1,21 @@
+[gd_scene load_steps=4 format=3 uid="uid://o32hefggjtst"]
+
+[ext_resource type="Script" path="res://addons/ez_transitions/objects/transition_overlay/transition_overlay_script.gd" id="1_mysyy"]
+[ext_resource type="Shader" path="res://addons/ez_transitions/shaders/transition_shader.gdshader" id="1_pao7u"]
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_ja5j3"]
+shader = ExtResource("1_pao7u")
+shader_parameter/screen_size = Vector2(1152, 648)
+shader_parameter/progress = 0.0
+shader_parameter/pixel_size = 15.0
+shader_parameter/type = 0
+shader_parameter/reversed = false
+
+[node name="TransitionOverlay" type="TextureRect"]
+material = SubResource("ShaderMaterial_ja5j3")
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_mysyy")
diff --git a/addons/ez_transitions/objects/transition_overlay/transition_overlay_script.gd b/addons/ez_transitions/objects/transition_overlay/transition_overlay_script.gd
new file mode 100644 (file)
index 0000000..2246d7a
--- /dev/null
@@ -0,0 +1,109 @@
+@tool
+@icon("res://addons/ez_transitions/images/transition_overlay_node_icon.svg")
+extends TextureRect
+class_name TransitionOverlay
+
+## A node responsable for the front-end of a transition. It can display a transition's visuals separately, but can't actually change scenes.
+## If you want to change scenes, use Transition instead.
+
+# Signals:
+signal intro_finished # Emitted when the intro animation is over.
+signal outro_finished # Emitted when the outro animation is over.
+
+@export_group("Intro")
+@export var INTRO_EASE: Tween.EaseType = Tween.EASE_IN_OUT ## The intro easing type. Determines how the intro animation will occur.
+@export var INTRO_TRANS: Tween.TransitionType = Tween.TRANS_SINE # The intro transition type. Determines how the intro animation will occur. Changes based on the INTRO_EASE.
+@export var INTRO_TYPE: int = 0 ## The transition type. Determines what animation is going to be displayed in the intro.
+@export var INTRO_DURATION: float = 1.0 ## The intro duration. Determines how long it will take the intro animation to finish.
+@export var DELAY_TO_PROCEED: float = 1.0 ## How long it will take to the outro animation starts playing after the intro animation is over.
+@export var REVERSE_INTRO: bool = false ## Determines if the intr animation will be played normally or backwards.
+@export var INTRO_TEXTURE: Texture2D = null ## The texture of the intro animation. Determines how the intro will look.
+
+@export_group("Outro")
+@export var OUTRO_EASE: Tween.EaseType = Tween.EASE_IN_OUT ## The outro easing type. Determines how the outro animation will occur.
+@export var OUTRO_TRANS: Tween.TransitionType = Tween.TRANS_SINE # The outro transition type. Determines how the outro animation will occur. Changes based on the INTRO_EASE.
+@export var OUTRO_TYPE: int = 0 ## The transition type. Determines what animation is going to be displayed in the outro.
+@export var OUTRO_DURATION: float = 1.0 ## The outro duration. Determines how long it will take the outro animation to finish.
+@export var REVERSE_OUTRO: bool = true ## Determines if the intr animation will be played normally or backwards.
+@export var OUTRO_TEXTURE: Texture2D = null ## The texture of the intro animation. Determines how the intro will look.
+
+func _get_configuration_warnings() -> PackedStringArray:
+       # Creating a new array of warnings.
+       var warnings: PackedStringArray = []
+       
+       # Checking if this TransitionOverlay's material isn't null.
+       if (material != null):
+               warnings.push_back("This TransitionOverlay's material is going to be replaced at run time so the TransitionOverlay can properly work.") # Adding a new warning.
+               
+       # Checking if this TransitionOverlay has a texture.
+       if (INTRO_TEXTURE == null):
+               warnings.push_back("This TransitionOverlay has no Intro Texture. The Transition's intro will not be visible. A Texture should be added either manually or by code.") # Adding a new warning.
+       if (OUTRO_TEXTURE == null):
+               warnings.push_back("This TransitionOverlay has no Outro Texture. The Transition's outro will not be visible. A Texture should be added either manually or by code.") # Adding a new warning.
+       
+       # Returning all warnings.
+       return warnings
+
+func _ready() -> void:
+       # Setting up the TextureRect.
+       material = load("res://addons/ez_transitions/materials/transition_material.tres").duplicate() # Updating the material.
+       material.set_shader_parameter("screen_size", size) # Updating the TextureRect size.
+       material.set_shader_parameter("progress", 0.0) # Updating the Transition progress.
+       
+## Plays the intro animation, that makes this TransitionOverlay go from invisible to fully visible.
+func play_intro() -> void:
+       # Updating the shader parameters.
+       material.set_shader_parameter("reversed", REVERSE_INTRO) # Making the Transition happen normally / reversed.
+       material.set_shader_parameter("progress", 0.0 if (!REVERSE_INTRO) else 1.0) # Updating the Transition progress.
+       material.set_shader_parameter("type", INTRO_TYPE) # Updating the Transition type.
+       
+       # Updating the texture.
+       texture = INTRO_TEXTURE
+       
+       # Checking if the scene tree exists to prevent an error.
+       if (!get_tree()):
+               print_rich("[color=yellow]Warning: Could not create the TransitionOverlay's tween because the scene tree is returning null.") # Printing an warning.
+               return # Stopping the code right here.
+       
+       # Creating a new Tween.
+       var tween: Tween = get_tree().create_tween()
+       
+       # Setting up the new Tween.
+       tween.set_ease(INTRO_EASE) # Updating the Tween's easing.
+       tween.set_trans(INTRO_TRANS) # Updating the Tween's transition.
+       
+       # Tweening the "progress" property.
+       tween.tween_property(material, "shader_parameter/progress", 1.0 if (!REVERSE_INTRO) else 0.0, INTRO_DURATION / EzTransitions.plugin_speed_scale)
+       
+       # Emitting the "intro_finished" signal, indicating that the intro has been finished.
+       await tween.finished # Waiting until the tween is over.
+       emit_signal("intro_finished") # Emitting the signal.
+       
+## Plays the intro animation, that makes this TransitionOverlay go from fully visible to invisible.
+func play_outro() -> void:
+       # Updating the shader parameters.
+       material.set_shader_parameter("reversed", REVERSE_OUTRO) # Making the Transition happen normally / reversed.
+       material.set_shader_parameter("progress", 0.0 if (REVERSE_OUTRO) else 1.0) # Updating the Transition progress.
+       material.set_shader_parameter("type", OUTRO_TYPE) # Updating the Transition type.
+       
+       # Updating the texture.
+       texture = OUTRO_TEXTURE
+       
+       # Checking if the scene tree exists to prevent an error.
+       if (!get_tree()):
+               return # Stopping the code right here.
+               print_rich("[color=yellow]Warning: Could not create the TransitionOverlay's tween because the scene tree is returning null.") # Printing an error.
+       
+       # Creating a new Tween.
+       var tween: Tween = get_tree().create_tween()
+       
+       # Setting up the new Tween.
+       tween.set_ease(OUTRO_EASE) # Updating the Tween's easing.
+       tween.set_trans(OUTRO_TRANS) # Updating the Tween's transition.
+       
+       # Tweening the "progress" property.
+       tween.tween_property(material, "shader_parameter/progress", 1.0 if (REVERSE_OUTRO) else 0.0, OUTRO_DURATION / EzTransitions.plugin_speed_scale)
+       
+       # Emitting the "outro_finished" signal, indicating that the outro has been finished.
+       await tween.finished # Waiting until the tween is over.
+       emit_signal("outro_finished") # Emitting the signal.
diff --git a/addons/ez_transitions/plugin.cfg b/addons/ez_transitions/plugin.cfg
new file mode 100644 (file)
index 0000000..9244d72
--- /dev/null
@@ -0,0 +1,9 @@
+[plugin]
+
+name="EzTransitions"
+description="\"EzTransitions\" is a versatile Godot engine plugin designed to streamline and manage all game transitions seamlessly. With its user-friendly features, it simplifies the process of creating smooth and immersive transitions in both 3D and 2D games. This plugin is ideal for implementing straightforward transitions, such as fades, slides, and dissolves, enhancing the overall player experience with minimal effort.
+
+Please note that while \"EzTransitions\" excels at simplifying transition effects, it is not recommended for highly complex transitions. Its ease of use and flexibility make it a valuable tool for developers looking to create polished and engaging transitions without the need for extensive coding."
+author="IsItLucas?"
+version=""
+script="plugin_handler.gd"
diff --git a/addons/ez_transitions/plugin_handler.gd b/addons/ez_transitions/plugin_handler.gd
new file mode 100644 (file)
index 0000000..29fb8ce
--- /dev/null
@@ -0,0 +1,44 @@
+@tool
+extends EditorPlugin
+
+# Constants:
+const main_panel_packed = preload("res://addons/ez_transitions/objects/main_container/main_container.tscn")
+
+# Instances:
+var MAIN_CONTROL
+
+func _enter_tree() -> void:
+       # Initialization of the plugin.
+       MAIN_CONTROL = main_panel_packed.instantiate() # Getting the instance of the MAIN_CONTROL.
+       
+       # Adding the plugin to the editor.
+       get_editor_interface().get_editor_main_screen().add_child(MAIN_CONTROL) # Adding the MAIN_CONTROL to the scene.
+       _make_visible(false) # Hidding the MAIN_CONTROL.
+       
+       # Adding the plugin's singleton.
+       add_autoload_singleton("EzTransitions", "res://addons/ez_transitions/objects/plugin_singleton/plugin_singleton_script.gd")
+       
+func _exit_tree() -> void:
+       # Clean-up of the plugin.
+       if (MAIN_CONTROL): # Checking if the MAIN_CONTROL exists.
+               MAIN_CONTROL.queue_free() # Removing the MAIN_CONTROL.
+               
+       # Removing the plugin's singleton.
+       remove_autoload_singleton("EzTransitions")
+       
+func _make_visible(visible: bool) -> void:
+       # Updating the visibility of the plugin stuff.
+       if (MAIN_CONTROL): # Checking if the MAIN_CONTROL exists.
+               MAIN_CONTROL.visible = visible # Updating the visibility of the MAIN_CONTROL.
+               
+func _has_main_screen() -> bool:
+       # Making the plugin visible on the main screen.
+       return true
+       
+func _get_plugin_name() -> String:
+       # Returning the plugin name.
+       return "EzTransitions"
+       
+func _get_plugin_icon() -> Texture2D:
+       # Returning the plugin icon.
+       return preload("res://addons/ez_transitions/images/transition_node_icon.svg")
diff --git a/addons/ez_transitions/shaders/scroll_shader.gdshader b/addons/ez_transitions/shaders/scroll_shader.gdshader
new file mode 100644 (file)
index 0000000..d47e037
--- /dev/null
@@ -0,0 +1,9 @@
+shader_type canvas_item;
+
+uniform vec2 scroll_speed = vec2(0.5, 0.5);
+uniform float alpha = 0.5;
+
+void fragment() {
+       COLOR = texture(TEXTURE, UV + scroll_speed * TIME);
+       COLOR.a = alpha;
+}
diff --git a/addons/ez_transitions/shaders/transition_shader.gdshader b/addons/ez_transitions/shaders/transition_shader.gdshader
new file mode 100644 (file)
index 0000000..c69cfb6
--- /dev/null
@@ -0,0 +1,78 @@
+shader_type canvas_item;
+
+uniform vec2 screen_size = vec2(1920, 1080);
+
+uniform float progress : hint_range(0,1) = 0;
+uniform float pixel_size = 15.0;
+
+uniform int type : hint_range(0,3) = 0;
+uniform bool reversed = false;
+
+void fragment() {
+       //Tipo Diamante Pixel
+       if (type == 0) {
+               float xFraction = fract(FRAGCOORD.x / pixel_size);
+               float yFraction = fract(FRAGCOORD.y / pixel_size);
+               
+               float xDistance = abs(xFraction - 0.5);
+               float yDistance = abs(yFraction - 0.5);
+               
+               if (reversed) {
+                       if (xDistance + yDistance + UV.x + UV.y <= progress * 4.0) {
+                               discard;
+                       }
+               } else {
+                       if (xDistance + yDistance + UV.x + UV.y > progress * 4.0) {
+                               discard;
+                       }
+               }
+       }
+       //Tipo Circulo no Centro
+       else if (type == 1) {
+               float ratio = screen_size.x / screen_size.y;
+               
+               if (!reversed) {
+                       if (distance(vec2(0.5), vec2(mix(vec2(0.5).x, UV.x, ratio), UV.y)) <= 1.5 * (1.0 - progress)) {
+                               COLOR.a = 0.0;
+                       }
+               } else {
+                       if (distance(vec2(0.5), vec2(mix(vec2(0.5).x, UV.x, ratio), UV.y)) > 1.5 * (1.0 - progress)) {
+                               COLOR.a = 0.0;
+                       }
+               }
+       }
+       //Tipo Corte Vertical
+       else if (type == 2) {
+               if (reversed) {
+                       if (distance(vec2(0.5, 0.5), vec2(UV.x, UV.x)) >= 1.0 * (1.0 - progress)) {
+                               COLOR.a = 0.0;
+                       }
+               } else {
+                       if (distance(vec2(0.5, 0.5), vec2(UV.x, UV.x)) < 1.0 * (1.0 - progress)) {
+                               COLOR.a = 0.0;
+                       }
+               }
+       }
+       
+       //Tipo Corte Horizontal
+       else if (type == 3) {
+               if (reversed) {
+                       if (distance(vec2(0.5, 0.5), vec2(UV.y, UV.y)) >= 1.0 * (1.0 - progress)) {
+                               COLOR.a = 0.0;
+                       }
+               } else {
+                       if (distance(vec2(0.5, 0.5), vec2(UV.y, UV.y)) < 1.0 * (1.0 - progress)) {
+                               COLOR.a = 0.0;
+                       }
+               }
+       }
+       
+       //Tipo Fade
+       else if (type == 4) {
+               if (reversed) {
+                       COLOR.a = 1.0 - progress;
+               } else {
+                       COLOR.a = progress;
+               }
+       }
+}
diff --git a/addons/ez_transitions/themes/main_theme.tres b/addons/ez_transitions/themes/main_theme.tres
new file mode 100644 (file)
index 0000000..10c5e80
--- /dev/null
@@ -0,0 +1,148 @@
+[gd_resource type="Theme" load_steps=14 format=3 uid="uid://djuojj8aridg"]
+
+[ext_resource type="FontFile" uid="uid://cjhjf5pqxtcqs" path="res://addons/ez_transitions/fonts/mini_pixel-7.ttf" id="1_2hugm"]
+[ext_resource type="Texture2D" uid="uid://bnpuobmbb5o0d" path="res://addons/ez_transitions/images/checkbox_checked.png" id="2_hkxde"]
+[ext_resource type="Texture2D" uid="uid://bmvxgu642vwre" path="res://addons/ez_transitions/images/checkbox_unchecked.png" id="3_3xng7"]
+[ext_resource type="Texture2D" uid="uid://ckcfwnfyp8nrc" path="res://addons/ez_transitions/images/option_button_arrow.png" id="4_72eqm"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_81j1b"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_jt2tt"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_rs2qy"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_d3wmq"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_p3r7f"]
+bg_color = Color(1, 1, 1, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0, 0, 0, 1)
+corner_radius_top_left = 2
+corner_radius_top_right = 2
+corner_radius_bottom_right = 2
+corner_radius_bottom_left = 2
+corner_detail = 20
+expand_margin_left = 5.0
+shadow_color = Color(0, 0, 0, 0.392157)
+shadow_size = 1
+shadow_offset = Vector2(0, 2)
+anti_aliasing = false
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ns15u"]
+content_margin_left = 5.0
+content_margin_bottom = 15.0
+bg_color = Color(1, 1, 1, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0, 0, 0, 1)
+corner_radius_top_left = 2
+corner_radius_top_right = 2
+corner_radius_bottom_right = 2
+corner_radius_bottom_left = 2
+expand_margin_right = 10.0
+shadow_size = 1
+shadow_offset = Vector2(0, 2)
+anti_aliasing = false
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0apr6"]
+content_margin_bottom = 15.0
+bg_color = Color(1, 1, 1, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0, 0, 0, 1)
+corner_radius_top_left = 2
+corner_radius_top_right = 2
+corner_radius_bottom_right = 2
+corner_radius_bottom_left = 2
+shadow_size = 1
+shadow_offset = Vector2(0, 2)
+anti_aliasing = false
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_owdjt"]
+content_margin_bottom = 15.0
+bg_color = Color(1, 1, 1, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0, 0, 0, 1)
+corner_radius_top_left = 2
+corner_radius_top_right = 2
+corner_radius_bottom_right = 2
+corner_radius_bottom_left = 2
+shadow_size = 1
+shadow_offset = Vector2(0, 2)
+anti_aliasing = false
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_4kaxt"]
+content_margin_bottom = 15.0
+bg_color = Color(1, 1, 1, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0, 0, 0, 1)
+corner_radius_top_left = 2
+corner_radius_top_right = 2
+corner_radius_bottom_right = 2
+corner_radius_bottom_left = 2
+shadow_size = 1
+shadow_offset = Vector2(0, 2)
+anti_aliasing = false
+
+[resource]
+Button/colors/font_color = Color(1, 1, 1, 1)
+Button/colors/font_focus_color = Color(1, 1, 1, 1)
+Button/colors/font_hover_color = Color(0.862745, 0.862745, 0.862745, 1)
+Button/colors/font_outline_color = Color(0, 0, 0, 1)
+Button/colors/font_pressed_color = Color(0.6, 0.6, 0.6, 1)
+Button/constants/outline_size = 8
+Button/font_sizes/font_size = 40
+Button/fonts/font = ExtResource("1_2hugm")
+CheckBox/colors/font_color = Color(1, 1, 1, 1)
+CheckBox/colors/font_outline_color = Color(0, 0, 0, 1)
+CheckBox/constants/h_separation = 16
+CheckBox/constants/outline_size = 8
+CheckBox/font_sizes/font_size = 40
+CheckBox/fonts/font = ExtResource("1_2hugm")
+CheckBox/icons/checked = ExtResource("2_hkxde")
+CheckBox/icons/unchecked = ExtResource("3_3xng7")
+CheckBox/styles/focus = SubResource("StyleBoxEmpty_81j1b")
+CheckBox/styles/normal = SubResource("StyleBoxEmpty_jt2tt")
+CheckBox/styles/pressed = SubResource("StyleBoxEmpty_rs2qy")
+Label/colors/font_color = Color(1, 1, 1, 1)
+Label/colors/font_outline_color = Color(0, 0, 0, 1)
+Label/colors/font_shadow_color = Color(0, 0, 0, 0.392157)
+Label/constants/outline_size = 16
+Label/constants/shadow_offset_x = 4
+Label/constants/shadow_offset_y = 4
+Label/font_sizes/font_size = 40
+Label/fonts/font = ExtResource("1_2hugm")
+LineEdit/colors/font_color = Color(0, 0, 0, 1)
+LineEdit/font_sizes/font_size = 20
+LineEdit/fonts/font = ExtResource("1_2hugm")
+LineEdit/styles/focus = SubResource("StyleBoxEmpty_d3wmq")
+LineEdit/styles/normal = SubResource("StyleBoxFlat_p3r7f")
+OptionButton/colors/font_color = Color(0.875, 0.875, 0.875, 1)
+OptionButton/font_sizes/font_size = 20
+OptionButton/fonts/font = ExtResource("1_2hugm")
+OptionButton/icons/arrow = ExtResource("4_72eqm")
+OptionButton/styles/normal = SubResource("StyleBoxFlat_ns15u")
+OptionButton/styles/normal_mirrored = SubResource("StyleBoxFlat_0apr6")
+OptionButton/styles/pressed = SubResource("StyleBoxFlat_owdjt")
+OptionButton/styles/pressed_mirrored = SubResource("StyleBoxFlat_4kaxt")
+SpinBox/icons/updown = null
+Tree/icons/arrow = ExtResource("4_72eqm")
+Tree/icons/arrow_collapsed_mirrored = null
+Tree/icons/checked = null
+Tree/icons/indeterminate = null
+Tree/icons/select_arrow = null
+Tree/icons/unchecked = null
+Tree/icons/updown = null
diff --git a/addons/ez_transitions/tutorial.txt b/addons/ez_transitions/tutorial.txt
new file mode 100644 (file)
index 0000000..384a49e
--- /dev/null
@@ -0,0 +1,24 @@
+How to use the "EzTransitions" Plugin.
+
+1. Accessing the Plugin:
+After installing the "EzTransitions" plugin in your Godot project, you'll notice a new tab at the top of the Godot interface labeled "EzTransitions."
+
+2. Opening the Transition Editor:
+Click on the "EzTransitions" tab to access the plugin's features. Within this tab, you'll find the "Transition Editor."
+Editing a Transition:
+
+To create or modify a transition, start by opening the "Transition Editor."
+Inside the editor, you'll find various checkboxes, sliders, and options that allow you to customize your transition effect.
+Experiment with different settings, such as fade, slide, or dissolve effects, by toggling checkboxes and adjusting sliders to achieve your desired visual transition.
+
+3. Previewing the Transition:
+To see how your transition will look in real-time, simply click the "Preview Transition" button within the editor.
+This feature allows you to fine-tune your transition effect until you are satisfied with the result.
+Copying the Transition Code:
+
+Once you have perfected your transition effect, you can easily generate the necessary code by clicking the "Copy Code" button.
+The copied code snippet will encapsulate your chosen transition settings.
+
+4. Using the Copied Code:
+Paste the copied code snippet directly into a GD Script within your game project where you want the transition to occur.
+When the code is executed in your game, the transition effect you designed in the "EzTransitions" editor will take place seamlessly.
diff --git a/addons/ggs/assets/add.svg b/addons/ggs/assets/add.svg
new file mode 100644 (file)
index 0000000..afad08a
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m7 1v6h-6v2h6v6h2v-6h6v-2h-6v-6z" fill="#e0e0e0"/></svg>
diff --git a/addons/ggs/assets/add.svg.import b/addons/ggs/assets/add.svg.import
new file mode 100644 (file)
index 0000000..7bfee0c
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://by345a10evjm8"
+path="res://.godot/imported/add.svg-cc4a8e36f6ce6a04a3c9cc98b73e4df8.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/add.svg"
+dest_files=["res://.godot/imported/add.svg-cc4a8e36f6ce6a04a3c9cc98b73e4df8.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/ggs/assets/bug.svg b/addons/ggs/assets/bug.svg
new file mode 100644 (file)
index 0000000..769fada
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-1.3257 0-2.5977.52744-3.5352 1.4648a1 1 0 0 0 0 1.4141 1 1 0 0 0 .69141.29297 1 1 0 0 0 .72266-.29297c.56288-.5628 1.3251-.87891 2.1211-.87891s1.5582.31611 2.1211.87891a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141c-.93741-.9374-2.2095-1.4648-3.5352-1.4648zm-5 3.9961a1 1 0 0 0 -1 1c0 .8334.32654 1.6973.96875 2.5.33016.41272.7705.79575 1.3008 1.0723a4 4 0 0 0 -.13672.43164h-2.1328a1 1 0 0 0 -1 1 1 1 0 0 0 1 1h2.1309a4 4 0 0 0 .17969.53711c-.14177.089422-.27868.1846-.41016.2832-.58533.439-1.1074.96875-1.6074 1.4688a1 1 0 0 0 0 1.4141 1 1 0 0 0 1.4141 0c.5-.5.97791-.9722 1.3926-1.2832.1693-.12693.3098-.20282.44336-.26953a4 4 0 0 0 2.457.84961 4 4 0 0 0 2.459-.84766c.13307.066645.27298.14126.44141.26758.41467.311.89258.7832 1.3926 1.2832a1 1 0 0 0 1.4141 0 1 1 0 0 0 0-1.4141c-.5-.5-1.0221-1.0297-1.6074-1.4688-.13076-.098068-.26727-.19224-.4082-.28125a4 4 0 0 0 .17578-.53906h2.1328a1 1 0 0 0 1-1 1 1 0 0 0 -1-1h-2.1309a4 4 0 0 0 -.13477-.43359c.52857-.27637.96751-.65858 1.2969-1.0703.64221-.8027.96875-1.6666.96875-2.5a1 1 0 0 0 -1-1 1 1 0 0 0 -1 1c0 .1667-.17346.8028-.53125 1.25-.25089.31365-.54884.54907-.93164.66602a4 4 0 0 0 -.60352-.41211 2 2 0 0 0 .066406-.5 2 2 0 0 0 -2-2 2 2 0 0 0 -2 2 2 2 0 0 0 .066406.50391 4 4 0 0 0 -.60352.4082c-.3828-.11694-.68075-.35236-.93164-.66602-.35779-.4472-.53125-1.0833-.53125-1.25a1 1 0 0 0 -1-1z" fill="#e0e0e0"/></svg>
diff --git a/addons/ggs/assets/bug.svg.import b/addons/ggs/assets/bug.svg.import
new file mode 100644 (file)
index 0000000..f85c4d8
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bt7gdorkvo4an"
+path="res://.godot/imported/bug.svg-f98ad47dc3f3571a377a4a231005fffe.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/bug.svg"
+dest_files=["res://.godot/imported/bug.svg-f98ad47dc3f3571a377a4a231005fffe.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/ggs/assets/check_all.svg b/addons/ggs/assets/check_all.svg
new file mode 100644 (file)
index 0000000..b022f93
--- /dev/null
@@ -0,0 +1 @@
+<svg id="a18a26ae-64ca-419b-b48a-aa31370df270" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="16.3" height="16" viewBox="0 0 16.3 16"><path d="M13.86,2.67V13.33H2.44V2.67H13.86M14.71,0H1.59A1.55,1.55,0,0,0,.15,1.65V14.32A1.57,1.57,0,0,0,1.57,16H14.71a1.55,1.55,0,0,0,1.44-1.65V1.68A1.57,1.57,0,0,0,14.73,0Z" style="fill:#e0e0e0"/><path d="M12.4,6.17l-4,4L7.12,11.45a.47.47,0,0,1-.58.07L5.43,10.41,3.9,8.88a.49.49,0,0,1,0-.69l.93-.93a.48.48,0,0,1,.68,0L6.79,8.54l4-4a.49.49,0,0,1,.69,0l.93.93A.49.49,0,0,1,12.4,6.17Z" style="fill:#e0e0e0"/></svg>
\ No newline at end of file
diff --git a/addons/ggs/assets/check_all.svg.import b/addons/ggs/assets/check_all.svg.import
new file mode 100644 (file)
index 0000000..a780f86
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bttv2hpecd38m"
+path="res://.godot/imported/check_all.svg-9b872310d9fb707e5903a11e61ac9a87.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/check_all.svg"
+dest_files=["res://.godot/imported/check_all.svg-9b872310d9fb707e5903a11e61ac9a87.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/ggs/assets/close.svg b/addons/ggs/assets/close.svg
new file mode 100644 (file)
index 0000000..be1c1dc
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 3 10 10M3 13 13 3" fill="none" stroke="#e0e0e0" stroke-width="2"/></svg>
diff --git a/addons/ggs/assets/close.svg.import b/addons/ggs/assets/close.svg.import
new file mode 100644 (file)
index 0000000..6f59e8c
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cflcng660hsp0"
+path="res://.godot/imported/close.svg-6b4a6b89f4446e3757436ab1e2e33be6.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/close.svg"
+dest_files=["res://.godot/imported/close.svg-6b4a6b89f4446e3757436ab1e2e33be6.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/ggs/assets/collapse_all.svg b/addons/ggs/assets/collapse_all.svg
new file mode 100644 (file)
index 0000000..bff3eca
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" width="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 9.669-3.536 2.583H7v2.537h2v-2.537h2.536zm0-3.314L4.464 3.772H7V1.235h2v2.537h2.536zm-7.296.73h14.591v1.831H.704z" fill="#e0e0e0"/></svg>
diff --git a/addons/ggs/assets/collapse_all.svg.import b/addons/ggs/assets/collapse_all.svg.import
new file mode 100644 (file)
index 0000000..2a5329c
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://l0mve5lc0okm"
+path="res://.godot/imported/collapse_all.svg-84b31d2383c45ad2c7425908d0a5bd5b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/collapse_all.svg"
+dest_files=["res://.godot/imported/collapse_all.svg-84b31d2383c45ad2c7425908d0a5bd5b.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/ggs/assets/delete.svg b/addons/ggs/assets/delete.svg
new file mode 100644 (file)
index 0000000..5bcdf8e
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5 1v1h-4v2h14v-2h-4v-1zm-3 4v8a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2v-8zm1 2h2v6h-2zm4 0h2v6h-2zm4 0h2v6h-2z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/addons/ggs/assets/delete.svg.import b/addons/ggs/assets/delete.svg.import
new file mode 100644 (file)
index 0000000..b703175
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bn0d5k8dd06qr"
+path="res://.godot/imported/delete.svg-6f3953bc0542e18a1d77b52528ff86cf.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/delete.svg"
+dest_files=["res://.godot/imported/delete.svg-6f3953bc0542e18a1d77b52528ff86cf.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/ggs/assets/docs.svg b/addons/ggs/assets/docs.svg
new file mode 100644 (file)
index 0000000..2025603
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15"><g id="b991fec5-f9b0-4c88-b529-62c26a16a05f" data-name="Layer 2"><g id="e6e9e42c-42f8-4fc6-8d50-794850aacc63" data-name="Layer 1"><path d="M5,0A5.26,5.26,0,0,0,2,1V8A5,5,0,0,1,8,8a5,5,0,0,1,6,0V1a5.26,5.26,0,0,0-3-1A5,5,0,0,0,9,.46V5H8V1A5.53,5.53,0,0,0,5,0ZM0,9v6H2A3,3,0,0,0,2,9Zm5,3A3,3,0,1,0,8,9,3,3,0,0,0,5,12Zm6,0a3,3,0,0,0,3,3h1V13H14a1,1,0,0,1,0-2h1V9H14A3,3,0,0,0,11,12ZM2,11a1,1,0,0,1,0,2Zm6,0a1,1,0,1,1-1,1A1,1,0,0,1,8,11Z" style="fill:#e0e0e0"/></g></g></svg>
\ No newline at end of file
diff --git a/addons/ggs/assets/docs.svg.import b/addons/ggs/assets/docs.svg.import
new file mode 100644 (file)
index 0000000..00ea2d6
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cdxv6r8uy2me5"
+path="res://.godot/imported/docs.svg-0b7d65f3eeee9d1934d1922c3c815f4e.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/docs.svg"
+dest_files=["res://.godot/imported/docs.svg-0b7d65f3eeee9d1934d1922c3c815f4e.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/ggs/assets/expand_all.svg b/addons/ggs/assets/expand_all.svg
new file mode 100644 (file)
index 0000000..1b0a951
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" width="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 16-3.5-2.5H7V11h2v2.5h2.5zM8 0 4.5 2.5H7V5h2V2.5h2.5zM1 7h14v2H1z" fill="#e0e0e0"/></svg>
diff --git a/addons/ggs/assets/expand_all.svg.import b/addons/ggs/assets/expand_all.svg.import
new file mode 100644 (file)
index 0000000..575b82e
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://caajrkkuvle0e"
+path="res://.godot/imported/expand_all.svg-04baf0245d861ddcbc4e38a80edbda26.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/expand_all.svg"
+dest_files=["res://.godot/imported/expand_all.svg-04baf0245d861ddcbc4e38a80edbda26.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/ggs/assets/feedback.svg b/addons/ggs/assets/feedback.svg
new file mode 100644 (file)
index 0000000..3e8598a
--- /dev/null
@@ -0,0 +1 @@
+<svg id="bc870507-cbc2-49b2-bbb0-001f5173543c" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M8.23,16,8,13.56a6.6,6.6,0,0,1-4.82-2,6.5,6.5,0,0,1-2-4.8A6.5,6.5,0,0,1,3.19,2,6.57,6.57,0,0,1,8,0a6.65,6.65,0,0,1,2.64.52A7,7,0,0,1,12.8,2a6.77,6.77,0,0,1,1.46,2.15,6.51,6.51,0,0,1,.54,2.65,8.56,8.56,0,0,1-.5,2.91,10.32,10.32,0,0,1-1.37,2.58,11.37,11.37,0,0,1-2.08,2.14A13,13,0,0,1,8.23,16ZM10,12.91a10.33,10.33,0,0,0,2.25-2.76,6.79,6.79,0,0,0,.88-3.38A4.86,4.86,0,0,0,11.6,3.18,5,5,0,0,0,8,1.72,4.9,4.9,0,0,0,4.4,3.2,4.86,4.86,0,0,0,2.92,6.79,4.85,4.85,0,0,0,4.4,10.37,4.93,4.93,0,0,0,8,11.84H10ZM8,11.15a.85.85,0,0,0,.62-.26.84.84,0,0,0,.26-.62.88.88,0,1,0-.88.88ZM7.35,8.59H8.61a1.83,1.83,0,0,1,.15-.81,4.54,4.54,0,0,1,.73-.87,2.87,2.87,0,0,0,.6-.81,2,2,0,0,0,.2-.87A1.77,1.77,0,0,0,9.6,3.7,2.64,2.64,0,0,0,8,3.21a2.23,2.23,0,0,0-1.49.51,2.67,2.67,0,0,0-.84,1.21l1.18.45a1.89,1.89,0,0,1,.37-.65A.93.93,0,0,1,8,4.39a1,1,0,0,1,.74.27A.85.85,0,0,1,9,5.27a1,1,0,0,1-.14.55,2.67,2.67,0,0,1-.51.56,3.8,3.8,0,0,0-.84,1A3.53,3.53,0,0,0,7.35,8.59Z" style="fill:#e0e0e0"/></svg>
\ No newline at end of file
diff --git a/addons/ggs/assets/feedback.svg.import b/addons/ggs/assets/feedback.svg.import
new file mode 100644 (file)
index 0000000..a9c3446
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c5a5taq8d2n0v"
+path="res://.godot/imported/feedback.svg-ef17e3f0b77f89dfe039a2ae2bdb59db.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/feedback.svg"
+dest_files=["res://.godot/imported/feedback.svg-ef17e3f0b77f89dfe039a2ae2bdb59db.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/ggs/assets/file_dialog.svg b/addons/ggs/assets/file_dialog.svg
new file mode 100644 (file)
index 0000000..c1e5479
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1046 0-2 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm3 2h3c1 0 1 2 2 2h3v4h-8z" fill="#e0e0e0"/></svg>
diff --git a/addons/ggs/assets/file_dialog.svg.import b/addons/ggs/assets/file_dialog.svg.import
new file mode 100644 (file)
index 0000000..fa3282b
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://badl61ealw70o"
+path="res://.godot/imported/file_dialog.svg-9fb726e239e3a68babea68c94f0fb435.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/file_dialog.svg"
+dest_files=["res://.godot/imported/file_dialog.svg-9fb726e239e3a68babea68c94f0fb435.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/ggs/assets/icon_mini.svg b/addons/ggs/assets/icon_mini.svg
new file mode 100644 (file)
index 0000000..2f41deb
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><g id="a0baddc9-6785-4b43-8df7-7f50d5cadd4e" data-name="Layer 3"><path d="M15.33,5.58H13.56c-.1-.22-.2-.44-.32-.65a7.15,7.15,0,0,0-.4-.61l.88-1.56a.68.68,0,0,0-.24-.93l-3-1.74A.67.67,0,0,0,9.6.34L8.72,1.9a5.78,5.78,0,0,0-1.44,0L6.4.34A.67.67,0,0,0,5.48.09l-3,1.74a.68.68,0,0,0-.24.93l.88,1.56a6.31,6.31,0,0,0-.72,1.26H.67A.68.68,0,0,0,0,6.26V9.74a.68.68,0,0,0,.67.68H2.44c.1.22.2.44.32.65a7.15,7.15,0,0,0,.4.61l-.88,1.56a.68.68,0,0,0,.24.93l3,1.74a.67.67,0,0,0,.92-.25l.88-1.56a5.78,5.78,0,0,0,1.44,0l.88,1.56a.67.67,0,0,0,.92.25l3-1.74a.68.68,0,0,0,.24-.93l-.88-1.56a6.31,6.31,0,0,0,.72-1.26h1.77A.68.68,0,0,0,16,9.74V6.26A.68.68,0,0,0,15.33,5.58Z" style="fill:#ff9166"/><path d="M0,8.05V6.31a.68.68,0,0,1,.67-.68H2.44a6,6,0,0,1,.72-1.26L2.28,2.81a.68.68,0,0,1,.24-.93l3-1.74A.67.67,0,0,1,6.4.39L7.28,2A5.78,5.78,0,0,1,8.72,2L9.6.39a.67.67,0,0,1,.92-.25l3,1.74a.68.68,0,0,1,.24.93l-.88,1.56a7.15,7.15,0,0,1,.4.61c.12.21.22.43.32.65h1.77a.68.68,0,0,1,.67.68V8.05Z" style="fill:#ffb570"/><ellipse cx="7.96" cy="8" rx="3.86" ry="3.92" style="fill:#fff"/><rect x="1.68" y="6.88" width="12.58" height="2.23" rx="1.11" style="fill:#fff"/><path d="M8,8,6.29,6.3a2.46,2.46,0,0,0,0,3.4,2.36,2.36,0,0,0,3.35,0,2.46,2.46,0,0,0,0-3.38Z" style="fill:#ff9166"/></g></svg>
\ No newline at end of file
diff --git a/addons/ggs/assets/icon_mini.svg.import b/addons/ggs/assets/icon_mini.svg.import
new file mode 100644 (file)
index 0000000..635fad1
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bk0u7p6a1apta"
+path="res://.godot/imported/icon_mini.svg-5e00867268e00b8e3e5eaa22b6fe9735.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/icon_mini.svg"
+dest_files=["res://.godot/imported/icon_mini.svg-5e00867268e00b8e3e5eaa22b6fe9735.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/ggs/assets/icon_mono.svg b/addons/ggs/assets/icon_mono.svg
new file mode 100644 (file)
index 0000000..5abf9a7
--- /dev/null
@@ -0,0 +1 @@
+<svg id="a07613d8-a96f-4fff-9a55-e858b51cec5a" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M16,6.14a.69.69,0,0,0-.66-.54H13.56a6.12,6.12,0,0,0-.72-1.27h0l.88-1.56a.8.8,0,0,0,.09-.3h0a.71.71,0,0,0-.33-.53l-3-1.75A.67.67,0,0,0,9.6.34L8.72,2A5.78,5.78,0,0,0,7.28,2L6.4.34A.66.66,0,0,0,5.49.09h0l-3,1.75a.71.71,0,0,0-.33.53h0a.8.8,0,0,0,.09.3l.88,1.56h0A6.12,6.12,0,0,0,2.4,5.5H.67A.69.69,0,0,0,0,6.14V9.72a.68.68,0,0,0,.67.68H2.44c.1.22.21.44.33.65a6.49,6.49,0,0,0,.39.62l-.88,1.56a.68.68,0,0,0,.24.93l3,1.75a.67.67,0,0,0,.92-.24h0l.88-1.57a5.78,5.78,0,0,0,1.44,0l.88,1.57a.66.66,0,0,0,.91.25h0l3-1.75a.68.68,0,0,0,.24-.93l-.88-1.56a6.12,6.12,0,0,0,.72-1.27h1.77A.68.68,0,0,0,16,9.72V6.14Zm-2.84,3h-1.5a3.84,3.84,0,0,1-7.4,0H2.78A1.12,1.12,0,0,1,1.68,8V8a1.12,1.12,0,0,1,1.1-1.12H4.26a3.84,3.84,0,0,1,7.4,0h1.5A1.12,1.12,0,0,1,14.26,8h0V8A1.12,1.12,0,0,1,13.16,9.1Z" style="fill:#e0e0e0"/><path d="M10.33,8a2.53,2.53,0,0,1-.27,1.07,2.39,2.39,0,0,1-.42.58,2.36,2.36,0,0,1-3.34,0h0a2.39,2.39,0,0,1-.42-.58A2.49,2.49,0,0,1,5.6,8a2.42,2.42,0,0,1,.69-1.76l.57.58L8,8,9.1,6.85l.56-.56A2.48,2.48,0,0,1,10.33,8Z" style="fill:#e0e0e0"/></svg>
\ No newline at end of file
diff --git a/addons/ggs/assets/icon_mono.svg.import b/addons/ggs/assets/icon_mono.svg.import
new file mode 100644 (file)
index 0000000..106b645
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b8o243gwa707v"
+path="res://.godot/imported/icon_mono.svg-44d29ea722636fe5e654f2982a3e46a7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/icon_mono.svg"
+dest_files=["res://.godot/imported/icon_mono.svg-44d29ea722636fe5e654f2982a3e46a7.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/ggs/assets/reload.svg b/addons/ggs/assets/reload.svg
new file mode 100644 (file)
index 0000000..1200df1
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"><path d="m9 2a6 6 0 0 0 -6 6h2a4 4 0 0 1 4-4 4 4 0 0 1 4 4 4 4 0 0 1 -4 4v2a6 6 0 0 0 6-6 6 6 0 0 0 -6-6z" transform="translate(0 1036.4)"/><path d="m4.118 1048.3-1.6771-.9683-1.6771-.9682 1.6771-.9683 1.6771-.9682-.0000001 1.9365z" transform="matrix(0 -1.1926 1.5492 0 -1617 1049.3)"/></g></svg>
diff --git a/addons/ggs/assets/reload.svg.import b/addons/ggs/assets/reload.svg.import
new file mode 100644 (file)
index 0000000..a9e84e5
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ve54bl3r7ljc"
+path="res://.godot/imported/reload.svg-e5d4e094fabdbb8dce0284d7c068bbf7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/reload.svg"
+dest_files=["res://.godot/imported/reload.svg-e5d4e094fabdbb8dce0284d7c068bbf7.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/ggs/assets/rename.svg b/addons/ggs/assets/rename.svg
new file mode 100644 (file)
index 0000000..bd6dad2
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M5 2v2h2v8H5v2h2a1 1 0 0 0 1-1 1 1 0 0 0 1 1h2v-2H9V4h2V2H9a1 1 0 0 0-1 1 1 1 0 0 0-1-1z" fill="#e0e0e0"/></svg>
diff --git a/addons/ggs/assets/rename.svg.import b/addons/ggs/assets/rename.svg.import
new file mode 100644 (file)
index 0000000..8bc50d7
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c2t5bnnw5wntg"
+path="res://.godot/imported/rename.svg-6a8295895275642ac274032accd0e496.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/rename.svg"
+dest_files=["res://.godot/imported/rename.svg-6a8295895275642ac274032accd0e496.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/ggs/assets/save_file.svg b/addons/ggs/assets/save_file.svg
new file mode 100644 (file)
index 0000000..d3c01ca
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 1v14h12v-9h-5v-5zm8 0v4h4z" fill="#e0e0e0" transform="translate(0 -.000017)"/></svg>
diff --git a/addons/ggs/assets/save_file.svg.import b/addons/ggs/assets/save_file.svg.import
new file mode 100644 (file)
index 0000000..d25db38
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bx8yoim3ur6h"
+path="res://.godot/imported/save_file.svg-c3285e886b3ea7d7c8d043d4932fe121.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/save_file.svg"
+dest_files=["res://.godot/imported/save_file.svg-c3285e886b3ea7d7c8d043d4932fe121.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/ggs/assets/search.svg b/addons/ggs/assets/search.svg
new file mode 100644 (file)
index 0000000..fff4a3c
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m6 1a5 5 0 0 0 -5 5 5 5 0 0 0 5 5 5 5 0 0 0 2.7539-.83203l4.3164 4.3164 1.4141-1.4141-4.3164-4.3164a5 5 0 0 0 .83203-2.7539 5 5 0 0 0 -5-5zm0 2a3 3 0 0 1 3 3 3 3 0 0 1 -3 3 3 3 0 0 1 -3-3 3 3 0 0 1 3-3z" fill="#e0e0e0" fill-opacity=".99608"/></svg>
diff --git a/addons/ggs/assets/search.svg.import b/addons/ggs/assets/search.svg.import
new file mode 100644 (file)
index 0000000..2605b1a
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dbervsl0o0ifw"
+path="res://.godot/imported/search.svg-49c012ff581540a89f79d42c8fa61d3e.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/search.svg"
+dest_files=["res://.godot/imported/search.svg-49c012ff581540a89f79d42c8fa61d3e.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/ggs/assets/show_in_filesystem.svg b/addons/ggs/assets/show_in_filesystem.svg
new file mode 100644 (file)
index 0000000..a5e1c2f
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v5h2v8h1 5v1h6v-3h-6v1h-5v-4h5v1h6v-3h-6v1h-5v-2h3v-4h-2l-1-1z" fill="#e0e0e0"/></svg>
diff --git a/addons/ggs/assets/show_in_filesystem.svg.import b/addons/ggs/assets/show_in_filesystem.svg.import
new file mode 100644 (file)
index 0000000..661085c
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://buvhmwckm6s2e"
+path="res://.godot/imported/show_in_filesystem.svg-d8323cbcf62adb9529b12d5317dfd9e0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/show_in_filesystem.svg"
+dest_files=["res://.godot/imported/show_in_filesystem.svg-d8323cbcf62adb9529b12d5317dfd9e0.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/ggs/assets/theme.svg b/addons/ggs/assets/theme.svg
new file mode 100644 (file)
index 0000000..c684aed
--- /dev/null
@@ -0,0 +1 @@
+<svg id="b9f14ada-6f72-47cb-b926-be5120fe53a0" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16"><defs><linearGradient id="a317b568-114b-452b-9828-f8e7ab53e5fa" x1="8" x2="8" y2="16" gradientUnits="userSpaceOnUse"><stop offset="0.19" stop-color="#ff4545"/><stop offset="0.19" stop-color="#ffe345"/><stop offset="0.31" stop-color="#ffe345"/><stop offset="0.31" stop-color="#80ff45"/><stop offset="0.44" stop-color="#80ff45"/><stop offset="0.44" stop-color="#45ffa2"/><stop offset="0.56" stop-color="#45ffa2"/><stop offset="0.56" stop-color="#45d7ff"/><stop offset="0.69" stop-color="#45d7ff"/><stop offset="0.69" stop-color="#8045ff"/><stop offset="0.81" stop-color="#8045ff"/><stop offset="0.81" stop-color="#ff4596"/></linearGradient></defs><path d="M12.84,8A14.83,14.83,0,0,0,10.5,4.5,28.7,28.7,0,0,1,8,1,29.82,29.82,0,0,1,5.5,4.5,14.9,14.9,0,0,0,3.15,8a4.51,4.51,0,0,0-.4,1.75,5.17,5.17,0,0,0,.32,1.75,5.22,5.22,0,0,0,9.85,0,5.18,5.18,0,0,0,.33-1.75A4.52,4.52,0,0,0,12.84,8ZM8.26,13.31V12A2.66,2.66,0,1,0,5.6,9.33H6.93L4.93,12l-2-2.66H4.27a4,4,0,1,1,4,4Z" style="fill:url(#a317b568-114b-452b-9828-f8e7ab53e5fa)"/></svg>
\ No newline at end of file
diff --git a/addons/ggs/assets/theme.svg.import b/addons/ggs/assets/theme.svg.import
new file mode 100644 (file)
index 0000000..8b580bf
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cltge6ak5rw2e"
+path="res://.godot/imported/theme.svg-e66649e0a1572635d9bbe372771a00be.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/theme.svg"
+dest_files=["res://.godot/imported/theme.svg-e66649e0a1572635d9bbe372771a00be.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/ggs/assets/uncheck_all.svg b/addons/ggs/assets/uncheck_all.svg
new file mode 100644 (file)
index 0000000..9809dad
--- /dev/null
@@ -0,0 +1 @@
+<svg id="b7c75bcc-3a8b-4650-9ac3-a733ac21467a" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M11.45,9.84a.49.49,0,0,1,0,.69l-.93.92a.49.49,0,0,1-.69,0L8,9.62,6.16,11.45a.49.49,0,0,1-.69,0l-.92-.92a.49.49,0,0,1,0-.69L6.38,8,4.55,6.17a.49.49,0,0,1,0-.69l.92-.93a.49.49,0,0,1,.69,0L8,6.39,9.83,4.55a.49.49,0,0,1,.69,0l.93.93a.49.49,0,0,1,0,.69L9.61,8Z" style="fill:#e0e0e0"/><path d="M13.71,2.67V13.33H2.29V2.67H13.71M14.56,0H1.44A1.55,1.55,0,0,0,0,1.65V14.32A1.58,1.58,0,0,0,1.42,16H14.56A1.55,1.55,0,0,0,16,14.35V1.68A1.58,1.58,0,0,0,14.58,0Z" style="fill:#e0e0e0"/></svg>
\ No newline at end of file
diff --git a/addons/ggs/assets/uncheck_all.svg.import b/addons/ggs/assets/uncheck_all.svg.import
new file mode 100644 (file)
index 0000000..5de9cb8
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://romr61n4g5y5"
+path="res://.godot/imported/uncheck_all.svg-abca75613ca5bd818fad7ad47e045d69.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ggs/assets/uncheck_all.svg"
+dest_files=["res://.godot/imported/uncheck_all.svg-abca75613ca5bd818fad7ad47e045d69.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/ggs/classes/ggs_input_helper.gd b/addons/ggs/classes/ggs_input_helper.gd
new file mode 100644 (file)
index 0000000..1240ead
--- /dev/null
@@ -0,0 +1,241 @@
+@tool
+extends RefCounted
+class_name ggsInputHelper
+
+enum InputType {INVALID, KEYBOARD, MOUSE, GP_BTN, GP_MOTION}
+
+var joy_name_abbr: Dictionary = {
+       "XInput Gamepad": "xbox",
+       "Xbox Series Controller": "xbox",
+       "Sony DualSense": "ps",
+       "PS5 Controller": "ps",
+       "PS4 Controller": "ps",
+       "Switch": "switch",
+} 
+
+var labels: Dictionary = {
+       "mouse": [
+               "LMB", "RMB", "MMB", "MW Up", "MW Down", "MW Left", "MW Right", "MB1", "MB2"
+       ],
+       
+       "xbox": [
+               "A", "B", "X", "Y", "Back", "Home", "Start", "L", "R", "LB", "RB",
+               "DPad Up", "DPad Down", "DPad Left", "DPad Right", "Share"
+       ],
+       
+       "ps": [
+               "Cross", "Circle", "Square", "Triangle", "Select", "PS", "Start",
+               "L3", "R3", "L1", "R1", "DPad Up", "DPad Down", "DPad Left",
+               "DPad Right", "Microphone"
+       ],
+       
+       "switch": [
+               "B", "A", "Y", "X", "Minus", "", "Plus", "", "", "", "",
+               "DPad Up", "DPad Down", "DPad Left", "DPad Right", "Capture"
+       ],
+       
+       "other": [
+               "A", "B", "X", "Y", "Back", "Home", "Start", "L", "R", "LB", "RB",
+               "DPad Up", "DPad Down", "DPad Left", "DPad Right", "Share",
+               "Paddle 1", "Paddle 2", "Paddle 3", "Paddle 4", "Touch"
+       ],
+       
+       "motion": [
+               {"-": "LStick Left", "+": "LStick Right"},
+               {"-": "LStick Up", "+": "LStick Down"},
+               {"-": "RStick Left", "+": "RStick Right"},
+               {"-": "RStick Up", "+": "RStick Down"},
+               {"+": "Left Trigger"},
+               {"+": "Right Trigger"}
+       ],
+}
+
+
+func get_event_id(event: InputEvent) -> int:
+       if event is InputEventKey:
+               if event.physical_keycode == 0:
+                       return -1
+               
+               return event.physical_keycode | event.get_modifiers_mask()
+       
+       if event is InputEventMouseButton:
+               return event.button_index | event.get_modifiers_mask()
+       
+       if event is InputEventJoypadButton:
+               return event.button_index
+       
+       if event is InputEventJoypadMotion:
+               return event.axis
+       
+       return -1
+
+
+func set_event_id(event: InputEvent, id: int) -> void:
+       if event is InputEventKey:
+               event.physical_keycode = id & ~(KEY_MASK_SHIFT | KEY_MASK_CTRL | KEY_MASK_ALT)
+               _set_event_modifiers(event, id)
+       
+       if event is InputEventMouseButton:
+               event.button_index = id & ~(KEY_MASK_SHIFT | KEY_MASK_CTRL | KEY_MASK_ALT)
+               _set_event_modifiers(event, id)
+       
+       if event is InputEventJoypadButton:
+               event.button_index = id
+       
+       if event is InputEventJoypadMotion:
+               event.axis = id
+
+
+func get_event_type(event: InputEvent) -> InputType:
+       if event is InputEventKey:
+               return InputType.KEYBOARD
+       
+       if event is InputEventMouseButton:
+               return InputType.MOUSE
+       
+       if event is InputEventJoypadButton:
+               return InputType.GP_BTN
+       
+       if event is InputEventJoypadMotion:
+               return InputType.GP_MOTION
+       
+       return InputType.INVALID
+
+
+func create_event_from_type(type: InputType) -> InputEvent:
+       match type:
+               InputType.KEYBOARD:
+                       return InputEventKey.new()
+               InputType.MOUSE:
+                       return InputEventMouseButton.new()
+               InputType.GP_BTN:
+                       return InputEventJoypadButton.new()
+               InputType.GP_MOTION:
+                       return InputEventJoypadMotion.new()
+               _:
+                       return null
+
+
+func input_already_exists(event: InputEvent, self_action: String) -> Array:
+       for action in InputMap.get_actions():
+               if action.begins_with("ui_"):
+                       continue
+               
+               if action == self_action:
+                       continue
+               
+               if InputMap.action_has_event(action, event):
+                       return [true, action]
+       
+       return [false, ""]
+
+func _set_event_modifiers(event: InputEventWithModifiers, modifier_mask: int) -> void:
+       event.shift_pressed = bool(modifier_mask & KEY_MASK_SHIFT)
+       event.ctrl_pressed = bool(modifier_mask & KEY_MASK_CTRL)
+       event.alt_pressed = bool(modifier_mask & KEY_MASK_ALT)
+
+
+### Events as Text
+
+func get_event_as_text(event: InputEvent) -> String:
+       if get_event_id(event) == -1:
+               return "INVALID"
+       
+       if event is InputEventKey:
+               return OS.get_keycode_string(event.get_physical_keycode_with_modifiers())
+       
+       if event is InputEventMouseButton:
+               return _get_mouse_event_as_text(event)
+       
+       if event is InputEventJoypadButton:
+               return _get_gp_btn_event_as_text(event)
+       
+       if event is InputEventJoypadMotion:
+               return _get_gp_motion_event_as_text(event)
+       
+       return ""
+
+
+func _get_modifiers_as_string(event: InputEventWithModifiers) -> String:
+       var modifiers: PackedStringArray
+       if event.shift_pressed:
+               modifiers.append("Shift")
+       
+       if event.ctrl_pressed:
+               modifiers.append("Ctrl")
+       
+       if event.alt_pressed:
+               modifiers.append("Alt")
+       
+       var modifiers_string: String = "+".join(modifiers) 
+       return modifiers_string
+
+
+func _get_joy_name_abbr(name: String) -> String:
+       if joy_name_abbr.has(name):
+               return joy_name_abbr[name]
+       else:
+               return "other"
+
+
+func _get_mouse_event_as_text(event: InputEventMouseButton) -> String:
+       var modifiers: String = _get_modifiers_as_string(event)
+       var btn: String = labels["mouse"][event.button_index - 1]
+       var result: String = "%s"%btn if modifiers.is_empty() else "%s+%s"%[modifiers, btn]
+       return result
+
+
+func _get_gp_btn_event_as_text(event: InputEventJoypadButton) -> String:
+       var device_name: String = Input.get_joy_name(event.device)
+       device_name = _get_joy_name_abbr(device_name)
+       return labels[device_name][event.button_index]
+
+
+func _get_gp_motion_event_as_text(event: InputEventJoypadMotion) -> String:
+       var axis_value: String = "-" if event.axis_value < 0 else "+"
+       return labels["motion"][event.axis][axis_value]
+
+
+### Events as Icons
+
+func get_event_as_icon(event: InputEvent, icon_db: ggsIconDB) -> Texture2D:
+       if event is InputEventMouseButton:
+               return _get_mouse_event_as_icon(event, icon_db)
+       
+       if event is InputEventJoypadButton:
+               return _get_gp_btn_event_as_icon(event, icon_db)
+       
+       if event is InputEventJoypadMotion:
+               return _get_gp_motion_event_as_icon(event, icon_db)
+       
+       return null
+
+
+func _get_mouse_event_as_icon(event: InputEventMouse, icon_db: ggsIconDB) -> Texture2D:
+       var button_index: int = event.button_index
+       var icon: Texture2D = icon_db.get_mouse_button_texture(button_index)
+       
+       return icon
+
+
+func _get_gp_btn_event_as_icon(event: InputEventJoypadButton, icon_db: ggsIconDB) -> Texture2D:
+       var device_name: String = Input.get_joy_name(event.device)
+       device_name = _get_joy_name_abbr(device_name)
+       
+       var button_index: int = event.button_index
+       var icon: Texture2D = icon_db.get_gp_button_texture(device_name, button_index)
+       
+       return icon
+
+
+func _get_gp_motion_event_as_icon(event: InputEventJoypadMotion, icon_db: ggsIconDB) -> Texture2D:
+       var device_name: String = Input.get_joy_name(event.device)
+       device_name = _get_joy_name_abbr(device_name)
+       
+       var axis: int = event.axis
+       var axis_dir: String = "-" if event.axis_value < 1 else "+"
+       var icon: Texture2D = icon_db.get_gp_motion_texture(device_name, axis, axis_dir)
+       
+       return icon
+
diff --git a/addons/ggs/classes/ggs_inspector_plugin.gd b/addons/ggs/classes/ggs_inspector_plugin.gd
new file mode 100644 (file)
index 0000000..312b591
--- /dev/null
@@ -0,0 +1,18 @@
+@tool
+extends EditorInspectorPlugin
+class_name ggsInspectorPlugin
+
+var input_selector_scn: PackedScene = preload("res://addons/ggs/editor/input_selector/input_selector.tscn")
+
+
+func _can_handle(object: Object) -> bool:
+       return object is ggsInputSetting
+
+
+func _parse_category(object: Object, category: String) -> void:
+       if category != "input.gd":
+               return
+       
+       var InputSelector: Control = input_selector_scn.instantiate()
+       InputSelector.inspected_obj = object as ggsInputSetting
+       add_custom_control(InputSelector)
diff --git a/addons/ggs/classes/ggs_save_file.gd b/addons/ggs/classes/ggs_save_file.gd
new file mode 100644 (file)
index 0000000..4db6430
--- /dev/null
@@ -0,0 +1,17 @@
+@tool
+extends ConfigFile
+class_name ggsSaveFile
+
+var path: String = ggsUtils.get_plugin_data().dir_save_file
+
+
+func _init() -> void:
+       if not FileAccess.file_exists(path):
+               save(path)
+       
+       self.load(path)
+
+
+func set_key(section: String, key: String, value: Variant) -> void:
+       set_value(section, key, value)
+       save(path)
diff --git a/addons/ggs/classes/ggs_ui_component.gd b/addons/ggs/classes/ggs_ui_component.gd
new file mode 100644 (file)
index 0000000..7c84d05
--- /dev/null
@@ -0,0 +1,66 @@
+@tool
+extends MarginContainer
+class_name ggsUIComponent
+
+const WARNING_NO_SETTING: String = "No setting is assigned."
+const WARNING_DELETED_SETTING: String = "The assigned setting was deleted or is invalid."
+const WARNING_SETTING_NOT_IN_DIR: String = "The assigned setting is not in the settings directory."
+const WARNING_INCOMPATIBLE_SETTING: String = "The value type of the assigned setting is not compatible with this component."
+
+@export_category("GGS UI Component")
+@export var setting: ggsSetting: set = set_setting
+@export var apply_on_change: bool
+@export var grab_focus_on_mouse_over: bool
+
+var setting_value: Variant
+var compatible_types: Array[Variant.Type] = []
+
+
+func _ready() -> void:
+       init_value()
+
+
+func _get_configuration_warnings() -> PackedStringArray:
+       if setting == null:
+               return PackedStringArray([WARNING_NO_SETTING])
+       
+       if setting.resource_path.is_empty():
+               return PackedStringArray([WARNING_DELETED_SETTING])
+       
+       if not setting.resource_path.begins_with(ggsUtils.get_plugin_data().dir_settings):
+               return PackedStringArray([WARNING_SETTING_NOT_IN_DIR])
+       
+       if (
+               not compatible_types.is_empty() and
+               not compatible_types.has(setting.value_type)
+       ):
+               return PackedStringArray([WARNING_INCOMPATIBLE_SETTING])
+       
+       
+       return PackedStringArray()
+
+
+func set_setting(value: ggsSetting) -> void:
+       setting = value
+       update_configuration_warnings()
+
+
+func init_value() -> void:
+       if setting != null:
+               setting_value = setting.current
+
+
+func apply_setting() -> void:
+       setting.current = setting_value #!1
+       setting.apply(setting_value)
+
+
+func reset_setting() -> void:
+       setting_value = setting.default
+       apply_setting()
+
+
+#1 Note that during runtime, the setting resource itself is not actually changed
+ # since all resources are read-only during runtime. However, the setter
+ # function (set_setting) of the resource is still executed.
+ # View ggs_setting.gd/set_setting() for more info.
diff --git a/addons/ggs/classes/ggs_utils.gd b/addons/ggs/classes/ggs_utils.gd
new file mode 100644 (file)
index 0000000..7e24a07
--- /dev/null
@@ -0,0 +1,83 @@
+@tool
+extends RefCounted
+class_name ggsUtils
+
+#!1
+static func get_editor_interface():
+       return Engine.get_singleton("ggsEI")
+
+
+static func get_resource_file_system():
+       return get_editor_interface().get_resource_filesystem()
+
+
+static func get_file_system_dock():
+       return get_editor_interface().get_file_system_dock()
+
+
+static func get_plugin_data() -> ggsPluginData:
+       return load("res://addons/ggs/plugin_data.tres")
+
+
+static func get_enum_string(target_enum: String) -> String:
+       var types: PackedStringArray = [
+               "Nil","Bool","Int","Float","String","Vector2","Vector2i","Rect2",
+               "Rect2i","Vector3","Vector3i","Transform2D","Vector4","Vector4i","Plane",
+               "Quaternion","AABB","Basis","Transform3D","Projection","Color",
+               "StringName","NodePath","RID","Object","Callable","Signal","Dictionary",
+               "Array","PackedByteArray","PackedInt32Array","PackedInt64Array",
+               "PackedFloat32Array","PackedFloat64Array","PackedStringArray",
+               "PackedVector2Array","PackedVector3Array","PackedColorArray"
+       ]
+       
+       var property_hints: PackedStringArray = [
+               "None","Range","Enum","Enum Suggestion","Exp Easing","Link","Flags",
+               "Layers 2D Render","Layers 2D Physics","Layers 2D Navigation",
+               "Layers 3D Render","Layers 3D Physics","Layers 3D Navigation",
+               "File","Dir","Global File","Global Dir","Resource Type","Multiline Text",
+               "Expression","Placeholder Text","Color No Alpha","Object ID","Type String",
+               "Node Path To Edited Node","Object Too Big","Node Path Valid Types",
+               "Save File","Global Save File","Int is Object ID","Int is Pointer",
+               "Array Type","Locale ID","Localizable String","Node Type",
+               "Hide Quaternion Edit","Password"
+       ]
+       
+       var enum_string: String
+       match target_enum:
+               "Variant.Type":
+                       enum_string = ",".join(types)
+               "PropertyHint":
+                       enum_string = ",".join(property_hints)
+       
+       return enum_string
+
+
+### Dir Paths
+
+static func path_is_in_dir_settings(path: String) -> bool:
+       var dir_settings: String = ggsUtils.get_plugin_data().dir_settings
+       return path.begins_with(dir_settings)
+
+
+### Window
+
+static func window_clamp_to_screen(size: Vector2) -> Vector2:
+       var screen_size: Rect2i = DisplayServer.screen_get_usable_rect()
+       size.x = min(size.x, screen_size.size.x)
+       size.y = min(size.y, screen_size.size.y)
+       
+       return size
+
+
+static func center_window() -> void:
+       var screen_id: int = DisplayServer.window_get_current_screen()
+       var display_size: Vector2i = DisplayServer.screen_get_size(screen_id)
+       var window_size: Vector2i = DisplayServer.window_get_size()
+       var origin: Vector2i = DisplayServer.screen_get_position(screen_id)
+       var target_pos: Vector2 = origin + (display_size / 2) - (window_size / 2)
+       DisplayServer.window_set_position(target_pos)
+
+
+### Comments
+# !1: Specifying return types for the editor interface methods causes
+# issues when the game is exported.
diff --git a/addons/ggs/classes/global/ggs.gd b/addons/ggs/classes/global/ggs.gd
new file mode 100644 (file)
index 0000000..8e047e0
--- /dev/null
@@ -0,0 +1,229 @@
+@tool
+extends Node
+
+enum Progress {SAVE_FILE_CURRENT, SAVE_FILE_DEFAULT, ADD_SETTINGS}
+enum SFX {MOUSE_OVER, FOCUS, INTERACT}
+
+signal active_category_changed()
+signal active_setting_changed()
+signal dir_settings_change_occured()
+signal progress_started(type: Progress)
+signal progress_advanced(progress: float)
+signal progress_ended()
+
+var active_category: String: set = set_active_category
+var active_setting: ggsSetting: set = set_active_setting
+
+var thread_current: Thread = Thread.new()
+var thread_default: Thread = Thread.new()
+var semaphore_current: Semaphore = Semaphore.new()
+var semaphore_default: Semaphore = Semaphore.new()
+var terminate_current: bool = false
+var terminate_default: bool = false
+var settings_cache: Array[ggsSetting] #?1
+
+var FSD #!1
+@onready var MouseOverSFX: AudioStreamPlayer = $MouseOverSFX
+@onready var FocusSFX: AudioStreamPlayer = $FocusSFX
+@onready var InteractSFX: AudioStreamPlayer = $InteractSFX
+
+
+func _ready() -> void:
+       thread_current.start(_update_save_file)
+       
+       if Engine.is_editor_hint():
+               FSD = ggsUtils.get_file_system_dock()
+               FSD.files_moved.connect(_on_FSD_item_moved)
+               FSD.file_removed.connect(_on_FSD_item_removed)
+               FSD.folder_moved.connect(_on_FSD_item_moved)
+               FSD.folder_removed.connect(_on_FSD_item_removed)
+               
+               request_update_save_file()
+               thread_default.start(_update_save_file_default)
+       
+       if not Engine.is_editor_hint():
+               terminate_current = true
+               semaphore_current.post()
+               thread_current.wait_to_finish()
+               _apply_settings()
+
+
+func _exit_tree() -> void:
+       terminate_current = true
+       semaphore_current.post()
+       thread_current.wait_to_finish()
+       
+       if Engine.is_editor_hint() and thread_default.is_started():
+               terminate_default = true
+               semaphore_default.post()
+               thread_default.wait_to_finish()
+
+
+func set_active_category(value: String) -> void:
+       active_category = value
+       active_category_changed.emit()
+       active_setting = null
+
+
+func set_active_setting(value: ggsSetting) -> void:
+       active_setting = value
+       active_setting_changed.emit()
+
+
+func request_update_save_file() -> void:
+       semaphore_current.post()
+
+
+func request_update_save_file_default() -> void:
+       semaphore_default.post()
+
+
+func _update_save_file() -> void:
+       while (true):
+               semaphore_current.wait()
+               
+               call_thread_safe("emit_signal", "progress_started", Progress.SAVE_FILE_CURRENT)
+               
+               var save_file: ggsSaveFile = ggsSaveFile.new()
+               var fresh_save: ConfigFile = ConfigFile.new()
+               
+               var all_settings: PackedStringArray = get_all_settings()
+               var step: float = float(0)
+               var total: float = float(all_settings.size())
+               var progress: float
+               for setting_path in all_settings:
+                       var setting: ggsSetting = load(setting_path)
+                       
+                       if save_file.has_section_key(setting.category, setting.name):
+                               var value: Variant = save_file.get_value(setting.category, setting.name)
+                               fresh_save.set_value(setting.category, setting.name, value)
+                       else:
+                               fresh_save.set_value(setting.category, setting.name, setting.default)
+                       
+                       step += 1
+                       progress = (step / total) * 100
+                       call_thread_safe("emit_signal", "progress_advanced", progress)
+                       
+                       if not settings_cache.has(setting):
+                               settings_cache.append(setting)
+               
+               fresh_save.save(ggsUtils.get_plugin_data().dir_save_file)
+               call_thread_safe("emit_signal", "progress_ended")
+               
+               if terminate_current:
+                       break
+
+
+func _update_save_file_default() -> void:
+       while (true):
+               semaphore_default.wait()
+               
+               call_thread_safe("emit_signal", "progress_started", Progress.SAVE_FILE_DEFAULT)
+       
+               var save_file: ggsSaveFile = ggsSaveFile.new()
+               save_file.clear()
+               
+               var all_settings: PackedStringArray = get_all_settings()
+               var step: float = float(0)
+               var total: float = float(all_settings.size())
+               var progress: float
+               for setting_path in all_settings:
+                       var setting: ggsSetting = load(setting_path)
+                       save_file.set_value(setting.category, setting.name, setting.default)
+                       
+                       step += 1
+                       progress = (step / total) * 100
+                       call_thread_safe("emit_signal", "progress_advanced", progress)
+               
+               save_file.save(save_file.path)
+               call_thread_safe("emit_signal", "progress_ended")
+               
+               if terminate_default:
+                       break
+
+
+func _on_FSD_item_moved(old: String, new: String) -> void:
+       if ggsUtils.path_is_in_dir_settings(old) or ggsUtils.path_is_in_dir_settings(new):
+               dir_settings_change_occured.emit()
+
+
+func _on_FSD_item_removed(item: String) -> void:
+       if ggsUtils.path_is_in_dir_settings(item):
+               dir_settings_change_occured.emit()
+
+
+### Game Init
+
+func get_all_settings() -> PackedStringArray:
+       var all_settings: PackedStringArray
+       
+       var path: String = ggsUtils.get_plugin_data().dir_settings
+       var dir: DirAccess = DirAccess.open(path)
+       var categories: PackedStringArray = dir.get_directories()
+       for category in categories:
+               if category.begins_with("_"):
+                       continue
+               
+               dir.change_dir(path.path_join(category))
+               var settings: PackedStringArray = _get_settings_in_dir(dir)
+               all_settings.append_array(settings)
+               
+               var groups: PackedStringArray = dir.get_directories()
+               for group in groups:
+                       dir.change_dir(path.path_join(category).path_join(group))
+                       var subsettings: PackedStringArray = _get_settings_in_dir(dir)
+                       all_settings.append_array(subsettings)
+       
+       return all_settings
+
+
+func _get_settings_in_dir(dir: DirAccess) -> PackedStringArray:
+       var result: PackedStringArray
+       
+       var settings: PackedStringArray = dir.get_files()
+       for setting in settings:
+               if setting.ends_with(".gd"):
+                       continue
+               
+               result.append(dir.get_current_dir().path_join(setting))
+       
+       return result
+
+
+func _apply_settings() -> void:
+       var all_settings: PackedStringArray = get_all_settings()
+       for setting_path in all_settings:
+               var setting: ggsSetting = load(setting_path)
+               var value: Variant = ggsSaveFile.new().get_value(setting.category, setting.name)
+               setting.apply(value)
+
+
+### SFX
+
+func play_sfx(sfx: SFX) -> void:
+       var target_player: AudioStreamPlayer
+       match sfx:
+               SFX.MOUSE_OVER:
+                       target_player = MouseOverSFX
+               SFX.FOCUS:
+                       target_player = FocusSFX
+               SFX.INTERACT:
+                       target_player = InteractSFX
+               _:
+                       printerr("GGS - Play SFX: The target SFX does not exist.")
+                       return
+       
+       if target_player.stream != null:
+               target_player.play()
+
+
+### Comments
+# ?1: The variable `settings_cache` itself is not actually being used in
+# the code. It's there to keep the references to the loaded settings
+# alive.
+# Godot caches loaded resources of the tree under the hood.
+# View `youtube.com/watch?v=3r7IohvVnw8` for more info.
+
+# !1: Specifying return types for the editor interface methods causes
+# issues when the game is exported.
diff --git a/addons/ggs/classes/global/ggs.tscn b/addons/ggs/classes/global/ggs.tscn
new file mode 100644 (file)
index 0000000..88b3bb8
--- /dev/null
@@ -0,0 +1,12 @@
+[gd_scene load_steps=2 format=3 uid="uid://esw7j7or7gpd"]
+
+[ext_resource type="Script" path="res://addons/ggs/classes/global/ggs.gd" id="1_6v3cu"]
+
+[node name="GGS" type="Node"]
+script = ExtResource("1_6v3cu")
+
+[node name="MouseOverSFX" type="AudioStreamPlayer" parent="."]
+
+[node name="FocusSFX" type="AudioStreamPlayer" parent="."]
+
+[node name="InteractSFX" type="AudioStreamPlayer" parent="."]
diff --git a/addons/ggs/classes/resources/ggs_icon_db.gd b/addons/ggs/classes/resources/ggs_icon_db.gd
new file mode 100644 (file)
index 0000000..0d6b306
--- /dev/null
@@ -0,0 +1,193 @@
+@tool
+extends Resource
+class_name ggsIconDB
+
+var property_map: Dictionary = {
+       "mouse_button": [
+               "lmb", "rmb", "mmb", "mw_up", "mw_down", "mw_left", "mw_right", "mb1", "mb2"
+       ],
+       
+       "gp_button": [
+               "bot", "right", "left", "top",
+               "back", "guide", "start",
+               "left_stick", "right_stick",
+               "left_shoulder", "right_shoulder",
+               "dup", "ddown", "dleft", "dright",
+               "misc", "pad1", "pad2", "pad3", "pad4",
+               "touch"
+       ],
+       
+       "gp_motion": [
+               {"-": "ls_left", "+": "ls_right"},
+               {"-": "ls_down", "+": "ls_up"},
+               {"-": "rs_left", "+": "rs_right"},
+               {"-": "rs_down", "+": "rs_up"},
+               {"+": "left_trigger"},
+               {"+": "right_trigger"},
+       ],
+}
+
+
+@export_category("Icon Database")
+@export_group("Mouse", "mouse_")
+@export var mouse_lmb: Texture2D
+@export var mouse_rmb: Texture2D
+@export var mouse_mmb: Texture2D
+@export var mouse_mw_up: Texture2D
+@export var mouse_mw_down: Texture2D
+@export var mouse_mw_left: Texture2D
+@export var mouse_mw_right: Texture2D
+@export var mouse_mb1: Texture2D
+@export var mouse_mb2: Texture2D
+
+@export_group("XBox", "xbox_")
+@export_subgroup("XBox Motions", "xbox_")
+@export var xbox_ls_left: Texture2D
+@export var xbox_ls_right: Texture2D
+@export var xbox_ls_up: Texture2D
+@export var xbox_ls_down: Texture2D
+@export var xbox_rs_left: Texture2D
+@export var xbox_rs_right: Texture2D
+@export var xbox_rs_up: Texture2D
+@export var xbox_rs_down: Texture2D
+@export var xbox_left_trigger: Texture2D
+@export var xbox_right_trigger: Texture2D
+@export_subgroup("XBox Buttons", "xbox_")
+@export var xbox_bot: Texture2D
+@export var xbox_right: Texture2D
+@export var xbox_left: Texture2D
+@export var xbox_top: Texture2D
+@export var xbox_back: Texture2D
+@export var xbox_guide: Texture2D
+@export var xbox_start: Texture2D
+@export var xbox_left_stick: Texture2D
+@export var xbox_right_stick: Texture2D
+@export var xbox_left_shoulder: Texture2D
+@export var xbox_right_shoulder: Texture2D
+@export var xbox_dup: Texture2D
+@export var xbox_ddown: Texture2D
+@export var xbox_dleft: Texture2D
+@export var xbox_dright: Texture2D
+@export var xbox_misc: Texture2D
+@export var xbox_pad1: Texture2D
+@export var xbox_pad2: Texture2D
+@export var xbox_pad3: Texture2D
+@export var xbox_pad4: Texture2D
+@export var xbox_touch: Texture2D
+
+@export_group("Playstation", "ps_")
+@export_subgroup("PS Motions", "ps_")
+@export var ps_ls_left: Texture2D
+@export var ps_ls_right: Texture2D
+@export var ps_ls_up: Texture2D
+@export var ps_ls_down: Texture2D
+@export var ps_rs_left: Texture2D
+@export var ps_rs_right: Texture2D
+@export var ps_rs_up: Texture2D
+@export var ps_rs_down: Texture2D
+@export var ps_left_trigger: Texture2D
+@export var ps_right_trigger: Texture2D
+@export_subgroup("PS Buttons", "ps_")
+@export var ps_bot: Texture2D
+@export var ps_right: Texture2D
+@export var ps_left: Texture2D
+@export var ps_top: Texture2D
+@export var ps_back: Texture2D
+@export var ps_guide: Texture2D
+@export var ps_start: Texture2D
+@export var ps_left_stick: Texture2D
+@export var ps_right_stick: Texture2D
+@export var ps_left_shoulder: Texture2D
+@export var ps_right_shoulder: Texture2D
+@export var ps_dup: Texture2D
+@export var ps_ddown: Texture2D
+@export var ps_dleft: Texture2D
+@export var ps_dright: Texture2D
+@export var ps_misc: Texture2D
+@export var ps_pad1: Texture2D
+@export var ps_pad2: Texture2D
+@export var ps_pad3: Texture2D
+@export var ps_pad4: Texture2D
+@export var ps_touch: Texture2D
+
+@export_group("Switch", "switch_")
+@export_subgroup("Switch Motions", "switch_")
+@export var switch_ls_left: Texture2D
+@export var switch_ls_right: Texture2D
+@export var switch_ls_up: Texture2D
+@export var switch_ls_down: Texture2D
+@export var switch_rs_left: Texture2D
+@export var switch_rs_right: Texture2D
+@export var switch_rs_up: Texture2D
+@export var switch_rs_down: Texture2D
+@export var switch_left_trigger: Texture2D
+@export var switch_right_trigger: Texture2D
+@export_subgroup("Switch Buttons", "switch_")
+@export var switch_bot: Texture2D
+@export var switch_right: Texture2D
+@export var switch_left: Texture2D
+@export var switch_top: Texture2D
+@export var switch_back: Texture2D
+@export var switch_guide: Texture2D
+@export var switch_start: Texture2D
+@export var switch_left_stick: Texture2D
+@export var switch_right_stick: Texture2D
+@export var switch_left_shoulder: Texture2D
+@export var switch_right_shoulder: Texture2D
+@export var switch_dup: Texture2D
+@export var switch_ddown: Texture2D
+@export var switch_dleft: Texture2D
+@export var switch_dright: Texture2D
+@export var switch_misc: Texture2D
+@export var switch_pad1: Texture2D
+@export var switch_pad2: Texture2D
+@export var switch_pad3: Texture2D
+@export var switch_pad4: Texture2D
+@export var switch_touch: Texture2D
+
+@export_group("Other", "other_")
+@export_subgroup("Other Motions", "other_")
+@export var other_ls_left: Texture2D
+@export var other_ls_right: Texture2D
+@export var other_ls_up: Texture2D
+@export var other_ls_down: Texture2D
+@export var other_rs_left: Texture2D
+@export var other_rs_right: Texture2D
+@export var other_rs_up: Texture2D
+@export var other_rs_down: Texture2D
+@export var other_left_trigger: Texture2D
+@export var other_right_trigger: Texture2D
+@export_subgroup("Other Buttons", "other_")
+@export var other_bot: Texture2D
+@export var other_right: Texture2D
+@export var other_left: Texture2D
+@export var other_top: Texture2D
+@export var other_back: Texture2D
+@export var other_guide: Texture2D
+@export var other_start: Texture2D
+@export var other_left_stick: Texture2D
+@export var other_right_stick: Texture2D
+@export var other_left_shoulder: Texture2D
+@export var other_right_shoulder: Texture2D
+@export var other_dup: Texture2D
+@export var other_ddown: Texture2D
+@export var other_dleft: Texture2D
+@export var other_dright: Texture2D
+@export var other_misc: Texture2D
+@export var other_pad1: Texture2D
+@export var other_pad2: Texture2D
+@export var other_pad3: Texture2D
+@export var other_pad4: Texture2D
+@export var other_touch: Texture2D
+
+
+func get_mouse_button_texture(button_index: int) -> Texture2D:
+       return get("mouse_%s"%property_map["mouse_button"][button_index - 1])
+
+
+func get_gp_button_texture(category: String, button_index: int) -> Texture2D:
+       return get("%s_%s"%[category, property_map["gp_button"][button_index]])
+
+
+func get_gp_motion_texture(category: String, axis: int, axis_dir: String) -> Texture2D:
+       return get("%s_%s"%[category, property_map["gp_motion"][axis][axis_dir]])
diff --git a/addons/ggs/classes/resources/ggs_plugin_data.gd b/addons/ggs/classes/resources/ggs_plugin_data.gd
new file mode 100644 (file)
index 0000000..692e485
--- /dev/null
@@ -0,0 +1,75 @@
+@tool
+extends Resource
+class_name ggsPluginData
+
+const APPLY_ON_CHANGED_ALL_DEFAULT: bool = true
+const GRAB_FOCUS_ON_MOUSE_OVER_ALL: bool = true
+const DIR_SETTINGS_DEFAULT: String = "res://game_settings/settings"
+const DIR_TEMPLATES_DEFAULT: String = "res://game_settings/templates"
+const DIR_COMPONENTS_DEFAULT: String = "res://game_settings/components"
+const DIR_SAVE_FILE_DEFAULT: String = "user://settings.cfg"
+const SPLIT_OFFSET_0_DEFAULT: int = -315
+const SPLIT_OFFSET_1_DEFAULT: int = 615
+
+@export_category("GGS Plugin Data")
+@export var recent_settings: Array[String]
+@export var apply_on_changed_all: bool = APPLY_ON_CHANGED_ALL_DEFAULT
+@export var grab_focus_on_mouse_over_all: bool = GRAB_FOCUS_ON_MOUSE_OVER_ALL
+@export_group("Directories", "dir_")
+@export_dir var dir_settings: String = DIR_SETTINGS_DEFAULT
+@export_dir var dir_templates: String = DIR_TEMPLATES_DEFAULT
+@export_dir var dir_components: String = DIR_COMPONENTS_DEFAULT
+@export var dir_save_file: String = DIR_SAVE_FILE_DEFAULT
+@export_group("Split Offset", "split_offset_")
+@export var split_offset_0: int = SPLIT_OFFSET_0_DEFAULT
+@export var split_offset_1: int = SPLIT_OFFSET_1_DEFAULT
+
+
+func set_property(property: String, value: Variant) -> void:
+       set(property, value)
+       save()
+
+
+func save() -> void:
+       ResourceSaver.save(self)
+
+
+func reset() -> void:
+       recent_settings.clear()
+       apply_on_changed_all = APPLY_ON_CHANGED_ALL_DEFAULT
+       grab_focus_on_mouse_over_all = GRAB_FOCUS_ON_MOUSE_OVER_ALL
+       dir_settings = DIR_SETTINGS_DEFAULT
+       dir_templates = DIR_TEMPLATES_DEFAULT
+       dir_components = DIR_COMPONENTS_DEFAULT
+       dir_save_file = DIR_SAVE_FILE_DEFAULT
+       split_offset_0 = SPLIT_OFFSET_0_DEFAULT
+       split_offset_1 = SPLIT_OFFSET_1_DEFAULT
+       
+       save()
+
+
+### Recent Settings
+
+func add_recent_setting(setting: String) -> void:
+       if recent_settings.has(setting):
+               _bring_to_front(setting)
+       else:
+               recent_settings.push_front(setting)
+       
+       _limit_size()
+       save()
+
+
+func _bring_to_front(element: String) -> void:
+       recent_settings.erase(element)
+       recent_settings.push_front(element)
+
+
+func _limit_size() -> void:
+       if recent_settings.size() > 10:
+               recent_settings.pop_back()
+
+
+func clear_recent_settings() -> void:
+       recent_settings.clear()
+       save()
diff --git a/addons/ggs/classes/resources/ggs_setting.gd b/addons/ggs/classes/resources/ggs_setting.gd
new file mode 100644 (file)
index 0000000..23db642
--- /dev/null
@@ -0,0 +1,98 @@
+@tool
+extends Resource
+class_name ggsSetting
+
+var current: Variant: set = set_current, get = get_current
+var default: Variant
+var value_type: Variant.Type
+var value_hint: PropertyHint
+var value_hint_string: String
+var name: String: get = get_name
+var category: String: get = get_category
+var read_only_values: bool = false
+
+
+func _get_property_list() -> Array:
+       var read_only: PropertyUsageFlags =  PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_READ_ONLY
+       var current_default_usage: PropertyUsageFlags = read_only if read_only_values else PROPERTY_USAGE_DEFAULT
+       var enum_string_types: String = ggsUtils.get_enum_string("Variant.Type")
+       var enum_string_property_hints: String = ggsUtils.get_enum_string("PropertyHint")
+       
+       var properties: Array
+       properties.append_array([
+               {"name": "Game Setting", "type": TYPE_NIL, "usage": PROPERTY_USAGE_CATEGORY},
+               {"name": "current", "type": value_type, "usage": current_default_usage, "hint": value_hint, "hint_string": value_hint_string},
+               {"name": "default", "type": value_type, "usage": current_default_usage, "hint": value_hint, "hint_string": value_hint_string},
+               {"name": "Internal", "type": TYPE_NIL, "usage": PROPERTY_USAGE_GROUP},
+               {"name": "name", "type": TYPE_STRING, "usage": read_only},
+               {"name": "category", "type": TYPE_STRING, "usage": read_only},
+               {"name": "value_type", "type": TYPE_INT, "usage": PROPERTY_USAGE_DEFAULT, "hint": PROPERTY_HINT_ENUM, "hint_string": enum_string_types},
+               {"name": "value_hint", "type": TYPE_INT, "usage": PROPERTY_USAGE_DEFAULT, "hint": PROPERTY_HINT_ENUM, "hint_string": enum_string_property_hints},
+               {"name": "value_hint_string", "type": TYPE_STRING, "usage": PROPERTY_USAGE_DEFAULT},
+       ])
+       
+       return properties
+
+
+func _get(property: StringName) -> Variant:
+       if property == "resource_name":
+               resource_name = name
+               return resource_name
+       
+       return null
+
+
+func set_current(value: Variant) -> void:
+       current = value
+       
+       if not category.is_empty() or not name.is_empty():
+               ggsSaveFile.new().set_key(category, name, value)
+
+
+func get_current() -> Variant:
+       var save_file: ggsSaveFile = ggsSaveFile.new()
+       if save_file.has_section_key(category, name):
+               return save_file.get_value(category, name)
+       else:
+               return default
+
+
+func get_name() -> String:
+       var path_dict: Dictionary = _get_path_dict()
+       var group: String = ""
+       
+       if path_dict["group"].is_empty():
+               return path_dict["name"]
+       else:
+               return "%s_%s"%[path_dict["group"], path_dict["name"]]
+
+
+func get_category() -> String:
+       return _get_path_dict()["category"]
+
+
+func _get_path_dict() -> Dictionary:
+       var result: Dictionary = {
+               "category": "",
+               "group": "",
+               "name": "",
+       }
+       
+       if not ggsUtils.path_is_in_dir_settings(resource_path):
+               return result
+       
+       var dir_settings: String = ggsUtils.get_plugin_data().dir_settings
+       var base_path: String = resource_path.trim_prefix(dir_settings)
+       var path_components: PackedStringArray = base_path.split("/", false)
+       
+       if path_components.size() < 2 or path_components.size() > 3:
+               return result
+       
+       result["category"] = path_components[0]
+       if path_components.size() == 3:
+               result["group"] = path_components[1]
+               result["name"] = path_components[2].get_basename()
+       else:
+               result["name"] = path_components[1].get_basename()
+       
+       return result
diff --git a/addons/ggs/docs/changelog.md b/addons/ggs/docs/changelog.md
new file mode 100644 (file)
index 0000000..9972949
--- /dev/null
@@ -0,0 +1,65 @@
+## 3.1.0
+This version completely reworks how the categories and settings are stored, and adds several QoL features to the plugin.
+
+### General
+* Categories and Settings are now saved on the disc instead of being subresources of the plugin data. This allows more flexibility when handling them such as moving, renaming, and deleting.
+* Icon and description support for settings and components have been removed. While this was a "cool" feature, it didn't add anything significant and just added to the code bloat since I don't think people would actually spend time designing icons and writing descriptions for their own custom settings.
+* The plugin now applies settings (executes their logic) using a separate thread instead of doing it on the main thread.
+* The preferences window now includes a button for updating the plugin theme to reflect the theme of your own Godot editor.
+* The preferences window has been slightly redesigned for clarity.
+* A "Send Feedback" button has been added which takes you to a Google survey where you can provide feedback regarding the plugin. You can still request features and QoL changes using issues on GitHub.
+* Options were added to the Save File menu that allow you to remake the save file from either `current` or `default` values.
+
+### Settings
+* The settings panel UI has been reworked.
+* You can now group settings in a category for organization. Additionally, you can add settings to multiple groups at the same time, speeding up the process of adding settings to a category.
+* The way custom settings are created and added has been slightly changed and streamlined.
+* The predefined settings (previously in the settings directory) are now considered to be templates.
+* The templates directory (previously the settings directory) now supports tree walking. You can now organize your templates in folders.
+---
+* The input setting has been reworked to use `InputEvent` resources instead of clunky strings.
+* The input setting now supports multiple inputs of the same type for each action (i. e. you can have more than one keyboard or gamepad event for an action).
+
+### Components
+* All list components now support using item IDs instead of indices.
+* The input button now supports icons for mouse events.
+* UI components now warn the user when they don't have a setting or their setting is invalid.
+* You can now set up sound effects for UI components.
+
+
+# Previous Versions
+
+<details>
+<summary>3.0 Changelog</summary>
+
+## 3.0.3
+* Fixed category selection bug in Godot 4.1
+
+## 3.0.2
+* Fixed an issue where the game would crash if the user attempted to rebind input using mice with more than five keys.
+* Fixed an issue where rebinding left and right arrow keys would rebind to the gamepad left button and right button instead.
+
+## 3.0.1
+* Centering the window (part of the fullscreen toggle process) now works properly on setups with multiple displays.
+
+## 3.0.0
+GGS has been completely reworked so it can provide a much better experience for the users. The new version is compatible with Godot 4 only.
+
+### General
+* GGS is now a bottom panel plugin instead of a main screen one.
+* The entire UI has been redesigned to make it easier and more intuitive to work with.
+* Save data is handled via config files instead of JSON files.
+* The way settings are created and handled has been completely reworked.
+* The way UI components are added and handled has been completely reworked.
+
+### Settings
+* Users should now have more freedom and flexibility when creating custom settings.
+* Keyboard Input and Gamepad Input settings have been merged into a single setting. The setting functionality has been improved.
+
+### UI Components
+* Users can now create their own custom UI components.
+* Keyboard Input and Gamepad Input components have been merged into a single component. The component functionality has been improved.
+* New UI components have been added: Apply Button, Radio List, Toggle Button, CheckBox
+
+  
+</details>
diff --git a/addons/ggs/docs/components/apply_button.md b/addons/ggs/docs/components/apply_button.md
new file mode 100644 (file)
index 0000000..c9b1b2d
--- /dev/null
@@ -0,0 +1,6 @@
+Calls `apply_setting()` on all UI components in a specific node group. Must be instantiated directly from the scene tree.
+
+# Properties
+| Property | Description | Type |
+| :---: | --- | :---: |
+| group | The name of the target node group. | `String` |
diff --git a/addons/ggs/docs/components/arrow_list.md b/addons/ggs/docs/components/arrow_list.md
new file mode 100644 (file)
index 0000000..1d4a653
--- /dev/null
@@ -0,0 +1,23 @@
+A list that allows cycling through options using two arrows on the left and right.
+
+Handles integer and boolean values.
+
+# Properties
+| Property | Description | Type |
+| :---: | --- | :---: |
+| options | The list of options. | `PackedStringArray` |
+| option_ids | The list of option IDs. | `PackedInt32Array` |
+
+## option_ids
+This is the list of IDs associated with each option. Each item in this array corresponds to the item with the same index in the `options` array. If this property is set, the component returns the item ID instead of its index. If you don't want to use IDs, simply leave this as empty.
+
+Example:
+
+Let's say your setting sets the number of power-ups the player character starts with.
+```gdscript
+option = ["low", "medium", "high"]
+option_ids = [5, 10, 20]
+```
+
+> [!NOTE]
+> If you want to use item IDs, both `options` and `option_ids` must be the same size.
diff --git a/addons/ggs/docs/components/binary_selection.md b/addons/ggs/docs/components/binary_selection.md
new file mode 100644 (file)
index 0000000..a4d12b1
--- /dev/null
@@ -0,0 +1,3 @@
+Multiple components that all do the same thing. Checkbox, Switch, and Toggle Button are all binary selection components that allow the user to choose between a On/Off state.
+
+Handles boolean values.
diff --git a/addons/ggs/docs/components/components.md b/addons/ggs/docs/components/components.md
new file mode 100644 (file)
index 0000000..621cfd3
--- /dev/null
@@ -0,0 +1,33 @@
+UI components are nodes that can be added to your settings menu and allow players to change a setting.
+
+# Properties
+All components have several properties that are shared among them.
+| Property | Description | Type |
+| :---: | --- | :---: |
+| setting | The setting that's assigned to the component. The setting's value type must be compatible with the types the component handles. | `ggsSetting` |
+| apply_on_changed | Whether the component should apply the setting when the player interacts with it. If false, you should apply the settings with an [Apply Button](apply_button.md) component. | `Bool`|
+| grab_focus_on_mouse_over | Whether the component should grab focus on mouseover. Useful if your game supports both keyboard and mouse. | `Bool` |
+
+# Setting Sound Effects
+You can set sound effects to be played when the player mouses over the components, interacts with them, or the components grab focus.
+
+First, you should open the `ggs.tscn` scene. To do so:
+* Open the scene via the Preferences in the GGS editor.
+* Open the scene using the *Quick Open Scene...* option in Godot editor.
+* Manually open the scene. The scene is located at `res://addons/ggs/classes/global/ggs.tscn`
+
+This scene is the same scene that's added to the autoload list. Once the scene is open, assign an audio stream to each of the available audio stream players under the root `GGS` node.
+
+# Predefined Components
+GGS comes with the following predefined components:
+* [Binary Selection](binary_selection.md)
+* [Arrow List](arrow_list.md)
+* [Option List](option_list.md)
+* [Radio List](radio_list.md)
+* [Slider](slider.md)
+* [SpinBox](spinbox.md)
+* [Text Field](text_field.md)
+* [Input Button](input_button.md)
+* [Input Confirm Window](input_confirm_window.md)
+* [Apply Button](apply_button.md)
+* [Reset Button](reset_button.md)
diff --git a/addons/ggs/docs/components/input_button.md b/addons/ggs/docs/components/input_button.md
new file mode 100644 (file)
index 0000000..007bb95
--- /dev/null
@@ -0,0 +1,18 @@
+Displays the assigned [Input Confirm Window](input_confirm_window.md) when pressed and rebinds the input if the window is confirmed.
+
+Handles array values.
+
+# Properties
+| Property | Description | Type |
+| :---: | --- | :---: |
+| ICW | The path to the **Input Confirm Window**. Required. | `ConfirmationDialog` |
+| accept_modifiers | Whether the Input Confirm Window should accept events with modifiers (e.g. Shift+D, Alt+M, etc.) | `bool` |
+| accept_mouse | Whether the Input Confirm Window should accept mouse events. | `bool` |
+| accept_axis | Whether the Input Confirm Window should accept gamepad axis inputs (e.g. left stick left, right stick up, etc.) | `bool` |
+| use_icons | Whether the button should display icons instead of text for mouse and gamepad inputs. | `bool` |
+| icon_db | The database for the mouse and gamepad icons. | `ggsIconDB` |
+
+## Working with ggsIconDB
+This is a custom resource that can be used to assign textures to each gamepad and mouse input. It is highly recommended to create and save this on disk and use `AtlasTexture`s when setting the individual textures. If no texture is available for an input, the button will show it as text instead.
+
+The button shows text or icon that corresponds to the currently connected gamepad device. If no gamepad is connected (or the connected gamepad is not recognized), it uses the "other" text or icons.
diff --git a/addons/ggs/docs/components/input_confirm_window.md b/addons/ggs/docs/components/input_confirm_window.md
new file mode 100644 (file)
index 0000000..3d48f1c
--- /dev/null
@@ -0,0 +1,14 @@
+A confirmation dialog that allows the user to choose an input. Required component for [Input Button](input_button.md) to function. Must be instantiated in the scene tree directly and one instance is enough. You don't have to instantiate it for every Input Button component you have.
+
+
+# Properties
+| Property | Description | Type |
+| :---: | --- | :---: |
+| listening_wait_time | The time it takes for the input to be accepted when an input is received. | `float` |
+| listening_max_time | The maximum time the window will listen for an input before it stops. | `float` |
+| show_progress_bar |  Whether to show the bar under the listen button when an input is received. | `bool` |
+| btn_listening | Text displayed on the listen button when the window is currently listening for input. | `String` |
+| title_listening | Window title when it's currently listening for input. | `String` |
+| title_confirm | Window title when it's not listening for input and is awaiting confirmation or cancellation. | `String` |
+| timeout_text | Text displayed on the listen button when listening times out. | `String` |
+| already_exists_msg | Text displayed below the listen button when the received input already exists. You can use `{action}` as a placeholder for the action that has the conflicting input event | `String` |
diff --git a/addons/ggs/docs/components/option_list.md b/addons/ggs/docs/components/option_list.md
new file mode 100644 (file)
index 0000000..564c57e
--- /dev/null
@@ -0,0 +1,8 @@
+A drop-down menu that allows the selection of one option. Define options by editing the **Items** of the child OptionButton via the Inspector.
+
+Handles integer and boolean values.
+
+# Properties
+| Property | Description | Type |
+| :---: | --- | :---: |
+| use_ids | Whether the component should use the item ID instead of its index when selected. | `bool` |
diff --git a/addons/ggs/docs/components/radio_list.md b/addons/ggs/docs/components/radio_list.md
new file mode 100644 (file)
index 0000000..636f919
--- /dev/null
@@ -0,0 +1,18 @@
+A group of buttons. Only one button can be selected at any time.
+
+Handles integer and boolean values.
+
+# Properties
+| Property | Description | Type |
+| :---: | --- | :---: |
+| option_ids | The list of option IDs. | `PackedInt32Array` |
+| active_list | The `BoxContainer` that will be used. | `PackedInt32Array` |
+
+## Adding Options
+You can add `Button`s or `CheckButton`s to the active list. All buttons must have `toggle_mode` enabled. The index of the button node in the active list is the index of the option (e.g. the first button returns `0`, the second one returns `1`, and so on) unless `option_ids` is not empty.
+
+## option_ids
+This is the list of IDs associated with each option. Each item in this array corresponds to the button node with the same index in the active list. If this property is set, the component returns the item ID instead of its index. If you don't want to use IDs, simply leave this as empty.
+
+> [!NOTE]
+> If you want to use item IDs, both `option_ids` and the number of button nodes in the active list must be the same size.
diff --git a/addons/ggs/docs/components/reset_button.md b/addons/ggs/docs/components/reset_button.md
new file mode 100644 (file)
index 0000000..62fe26c
--- /dev/null
@@ -0,0 +1,6 @@
+Calls `reset_setting()` on all UI components in a specific node group. Must be instantiated directly from the scene tree.
+
+# Properties
+| Property | Description | Type |
+| :---: | --- | :---: |
+| group | The name of the target node group. | `String` |
diff --git a/addons/ggs/docs/components/slider.md b/addons/ggs/docs/components/slider.md
new file mode 100644 (file)
index 0000000..40a6886
--- /dev/null
@@ -0,0 +1,3 @@
+A slider for choosing a number between a certain range. Edit the child `HSlider` to set range, step, etc.
+
+Handles integer and float values.
diff --git a/addons/ggs/docs/components/spinbox.md b/addons/ggs/docs/components/spinbox.md
new file mode 100644 (file)
index 0000000..e1cffe4
--- /dev/null
@@ -0,0 +1,3 @@
+A text field that only accepts numbers. Edit the child `SpinBox` to set range, step, etc.
+
+Handles integer and float values.
diff --git a/addons/ggs/docs/components/text_field.md b/addons/ggs/docs/components/text_field.md
new file mode 100644 (file)
index 0000000..86bbcb1
--- /dev/null
@@ -0,0 +1,3 @@
+A simple text field.
+
+Handles string values.
diff --git a/addons/ggs/docs/custom_components.md b/addons/ggs/docs/custom_components.md
new file mode 100644 (file)
index 0000000..2403695
--- /dev/null
@@ -0,0 +1,86 @@
+You can create your own custom UI components and use them just like the predefined components. UI Components use a property named `setting_value` to keep track of their current value. For example, for a simple Toggle Button, this `setting_value` can either be `true` or `false` and it corresponds to the button pressed state.
+
+When the user interacts with the component (in our example, toggles the button), the `setting_value` is updated with the new value (in our example, the new button pressed state). Then, if `apply_on_changed` is enabled, the setting is applied.
+
+# Creating the Component Files
+All components are located in your components directory (default: `game_settings/components`). 
+1. Create a new folder in this directory and give it an appropriate name. You can tell GGS to ignore the folder if you start the name with an underscore (e.g. `_ignore_this`).
+2. Create a scene in the folder. This scene *cannot* be in a subfolder and *must* be named the same thing as the folder. For example, if the folder is named `my_component`, the scene must be named `my_component.tscn`. The scripts or other secondary scenes can be in any directory (even outside of this folder) but the main scene must be a direct file of the folder.
+3. The scene root *must* be a `MarginContainer`. You can add any other nodes you want to this root.
+4. After creating your component, restart the plugin so you can see it in the components list.
+
+# Adding a Script
+Now, you can add a script to your root `MarginContainer` node. This script:
+* Must be a `@tool` script.
+* Must extend `ggsUIComponent`.
+* When overriding the following methods, you must first call the parent method using `super()`:
+  * `_ready()`
+  * `init_value()`
+  * `reset_setting()`
+* When the user interacts with the component (such as toggling a button, changing a slider value, etc.), the following piece should be used:
+```gdscript
+setting_value = new_value
+if apply_on_change:
+       apply_setting()
+```
+* When overriding the `_ready()` method, you should add the following piece to the beginning before anything else:
+```gdscript
+compatible_types = []
+if Engine.is_editor_hint():
+  return
+```
+You should set `compatible_types` to contain the types that this component can handle. For example, if your component can handle integer and boolean values, it should be:
+```gdscript
+compatible_types = [TYPE_BOOL, TYPE_INT]
+```
+
+The `Engine.is_editor_hint()` check is used to prevent the nodes from running their setting-related code (getting its value, applying its logic, etc.) in the Godot editor. The components are `@tool` scripts so they can send configuration warnings to the user (usually when something is wrong with the assigned setting).
+
+
+# Class Methods
+## init_value()
+Loads `setting_value` from the assigned `setting`. Additionally, all code related to initializing the component state should go here. Example:
+```gdscript
+func init_value() -> void:
+       super()
+       Btn.set_pressed_no_signal(setting_value)
+```
+Remember, using `super()` when overriding this method is required because the `init_value()` of the base `ggsUIComponent` class must also be executed for the component to work properly.
+
+## apply_setting()
+Saves the setting value to the save file and executes the setting logic. You don't generally need to override this, simply call it when you want the component to apply the setting. Always use the `if apply_on_changed` check before using it otherwise the `apply_on_changed` property won't have any effect.
+
+This method is also called when a relevant **Apply Button** is pressed.
+
+## reset_setting()
+Resets the setting value back to its default and executes the setting logic. You should override this and update your component state in it. Remember to use `super()`. This method is called when a relevant **Reset Button* is pressed.
+
+-----
+
+Here's a simple example of a toggle button component:
+```gdscript
+extends ggsUIComponent
+
+@onready var Btn: Button = $Btn
+
+
+func _ready() -> void:
+       super()
+       Btn.toggled.connect(_on_Btn_toggled)
+
+
+func init_value() -> void:
+       super()
+       Btn.set_pressed_no_signal(setting_value)
+
+
+func _on_Btn_toggled(btn_state: bool) -> void:
+       setting_value = btn_state
+       if apply_on_change:
+               apply_setting()
+
+
+func reset_setting() -> void:
+       super()
+       Btn.set_pressed_no_signal(setting_value)
+```
diff --git a/addons/ggs/docs/custom_settings.md b/addons/ggs/docs/custom_settings.md
new file mode 100644 (file)
index 0000000..40ebf9a
--- /dev/null
@@ -0,0 +1,51 @@
+You can create your own custom settings and templates in GGS.
+
+# Setting up a Custom Setting
+When you add a setting via the *New Setting...* field, you create a blank setting with no logic or properties. In order to use it, you need to set up it properly.
+
+## The `value_type`
+To start, select your newly created blank setting. You may notice that the `current` and `default` values are `null`. This is because the `value_type` property has not been set. Open the `Internals` group and choose an appropriate value type for your setting from the drop-down menu. You can optionally choose `value_hint` and `value_hint_string`. These are used to customize the export behavior of the `current` and `default` values.
+
+For example, if your `value_type` is `float`, you can set `value_hint` to be `Range`. And set `value_hint_string` to be `0,100`. This will export `default` and `current` properties as a range between `0` and `100`. For more information, view `_get_property_list()` and `Property.Hint` constants in the Godot docs.
+
+Once you've set the `value_type` select the setting again to reinspect it. Now you can see the `default` and `current` value are exported correctly.
+
+## The Logic
+To write the logic for your setting, you need to edit its script. You can do so by:
+* Either open the `script` property in the Inspector. Under the `RefCounted` category.
+* Directly open the script in the file system.
+
+As you can see, there are a few prerequisites for the script. The script *must*:
+* Be a `@tool` script.
+* Extend `ggsSetting`.
+* Have a method called `apply()`.
+
+The `apply()` method is where your logic should go. It must take a value (the same type defined in `value_type`).
+
+Here's a simple example of a VSync setting:
+
+```gdscript
+@tool
+extends ggsSetting
+
+
+func apply(value: bool) -> void:
+       var vsync_mode: DisplayServer.VSyncMode
+       match value:
+               true:
+                       vsync_mode = DisplayServer.VSYNC_ENABLED
+               false:
+                       vsync_mode = DisplayServer.VSYNC_DISABLED
+       
+       DisplayServer.window_set_vsync_mode(vsync_mode)
+```
+
+That's the core of what you need to do. You can define variables, other methods, etc. in the script.
+
+# Templates
+Creating a template is essentially the same as setting up the script of a blank setting. To start, create a script in your templates directory. The script must fulfill all three conditions explained previously but it has one additional condition:
+* The script must override the `_init()` method and set `value_type` and `default` in there. You can also set `value_hint` and `value_hint_string` if applicable.
+
+That's the only additional criterion you have to keep in mind. Everything else is the same as mentioned previously.
+
+Check out some of the predefined templates to see a few examples of what you can do.
diff --git a/addons/ggs/docs/getting_started.md b/addons/ggs/docs/getting_started.md
new file mode 100644 (file)
index 0000000..ada71f7
--- /dev/null
@@ -0,0 +1,116 @@
+This guide will show you how to create a basic settings menu with the predefined settings and components that come with GGS.
+
+# Installation
+You can install the plugin through various ways, including:
+* Install the plugin through the Asset Library inside the Godot editor.
+* Clone the repository with Git.
+* Download the latest release.
+* Download the `main` branch directly with [DownGit](https://minhaskamal.github.io/DownGit/#/home) or similar tools.
+* Add the `main` branch as a Git Submodule. [Learn more about Git Submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules).
+
+> [!IMPORTANT]
+> No matter how you download the `main` branch (via releases, DownGit, or as a Git submodule), you should copy the contents of the *_premade* folder and paste them into your own game settings directory. You can change these directories in Preferences.
+> Example:
+> ```
+> res://
+>   └ game_settings
+>       └ components
+>       └ settings
+>       └ templates
+> ```
+
+> [!NOTE]
+> The plugin may not work as expected when added to a project at first. Enable the plugin through the Project Settings then restart the Godot editor. [More information](troubleshoot.md#can't-use-the-plugin-after-installation).
+
+# GGS Editor
+When enabled, GGS adds a bottom panel editor to Godot named "Game Settings". The editor is divided into 3 panels:
+* The categories panel on the left.
+* The settings panel in the center.
+* The components panel on the right.
+
+# Categories
+To add settings, you should first add categories. To do so, simply enter a valid name in the *New Category...* field at the top of the categories panel and press ENTER.
+A valid category name is:
+1. A valid file name (does not have unsupported special characters such as `@`, `?`, `!`, etc., and does not start or end with trailing space).
+2. Does not start with an underscore (`_`) or a dot (`.`). Underscores are used to tell GGS to ignore a directory. Dots do the same but for Godot's file system.
+3. While not necessary, I recommend using snake_case to follow Godot's recommended styling guidelines.
+
+After doing that, you may notice a folder is added to the settings directory (`res://game_settings/settings` by default) in the file system. All folders that are *direct* children of the settings directory will be considered categories. If you want GGS to ignore a folder, add an underline to the beginning of its name (e.g. `_ignore_this`).
+
+## Renaming Categories
+
+To rename a category, simply rename its folder from the Godot file system.
+
+## Deleting Categories
+
+To delete a category, simply delete its folder from the Godot file system. Depending on your system settings, this will either permanently delete the folder or move it to the recycle bin.
+
+> [!WARNING]
+> Do not rename or delete files and folders from your OS file system in general. This can cause issues with references in Godot. Use Godot's own file system to do so.
+
+# Settings
+Settings are resources that contain the logic and properties of a game setting. For example, the audio volume setting contains the name of an audio bus, the current and default values for it, and how Godot is supposed to change the volume of said bus.
+
+There are two methods of adding settings: Adding blank settings and adding settings from a template.
+
+## Adding Blank Settings
+This method is useful when you want to create a single unique setting. For example, if you want to add a difficulty option, you can use this method as a game usually has only one difficulty option.
+
+To add a blank setting with no properties and logic, use the *New Setting...* field at the top of the settings panel. Enter a valid name (the validation is the same as category names) and press ENTER to add a new setting to the currently selected category. If one or more groups are selected, a setting is added to each selected group.
+
+When you create a setting via this method, GGS creates a new `ggsSetting` resource and saves it on your disc inside the category folder. It then duplicates the blank template script and assigns it to said resource.
+
+> [!NOTE]
+> You can edit this blank template script from preferences.
+
+## Adding Settings from Templates
+There are times when a type of setting must be used multiple times. The easiest example is an input setting. A game usually has multiple inputs and you need a setting resource for each individual input. The logic behind *how* an input should be changed is the same among all of them. The only thing that changes is the input action they should change (in other words, a property).
+
+This is where templates come into play. You can add settings from templates to create multiple settings with the same logic and properties that can be changed via the inspector.
+
+To add a setting from a template, use the `+` button. This will open a window that shows all the available templates located in the templates directory (`res://game_settings/templates` by default). Simply double-click a template, give the setting a valid name, and press ENTER or press the *Add* button.
+
+This method is essentially the same as the first one when it comes to the actual creation process, except that instead of assigning a blank script to the resource, it assigns the specific template script that you selected.
+
+## Inspecting Settings
+To inspect a setting, click on it in the settings panel. This will show its `current` and `default` values along with any additional properties it might have in the Godot Inspector. You can also view its script all the way down via the `script` property under `RefCounted`.
+
+The properties inside the `Internal` group are internal properties used by GGS to handle the setting. These are explained further in [Creating Custom Settings](custom_settings.md).
+
+You can also right-click on a setting to highlight in the Godot file system.
+
+## Groups
+As implied previously, you can add settings to groups. Groups can help you add settings faster and tidy up your category.
+
+To add a group, enter a valid name in the *New Group...* field and press ENTER.
+
+To add settings to a group, click on it to select it. When adding settings via any of the aforementioned methods, GGS will add a setting to every selected group. Do note that adding settings to a high number of groups can take a few moments. Godot will be unresponsive during this time.
+
+## Deleting and Renaming
+You can rename, delete, or move settings and groups in the file system similar to categories. 
+
+## Custom Settings
+To learn how you can set up your own custom settings and templates, view [Creating Custom Settings](custom_settings.md).
+
+For more info on the predefined settings, visit [Settings](settings/settings.md).
+
+
+# UI Components
+The UI components are what the user can interact with to change a setting. They're located at `game_settings/components`. You can assign a setting to each component. When the component is interacted with, it'll update the save file with the new value and execute the logic of its assigned setting.
+
+Each component has an `apply_on_changed` property. If set to `true`, the component will apply the setting (update save file + execute setting logic) when the user interacts with it. If false, you need to use an **Apply Button** to apply the setting and save changes.
+
+To add a new component, select a setting and a *single* node in the scene tree of your target scene. Then, simply double-click a component in the component list to instantiate a component of that type.
+
+Each component can only handle a specific type of data. An **Arrow List** for example, can only handle integers while a **Slider** can only handle floats.
+
+It is possible to use certain components with multiple types. For instance, you can use an **Arrow List** for a setting that accepts boolean values if you configure the arrow list to have only 2 items: The first one being the "false" or "disabled" option and the second one being the "true" or "enabled" option.
+
+## Custom Components
+To learn how you can create your own custom components, view [Creating Custom Components](custom_components.md).
+
+For more info on the predefined components, visit [Components](components/components.md).
+
+---
+
+Feel free to open an issue to ask for help, report a bug, or suggest additional features or QoL enhancements.
diff --git a/addons/ggs/docs/home.md b/addons/ggs/docs/home.md
new file mode 100644 (file)
index 0000000..9aaf8a7
--- /dev/null
@@ -0,0 +1,6 @@
+# Welcome to GGS Documentation
+You can find all the information you need to use GGS in here. If this is your first time using GGS, consider starting with [Getting Started](getting_started.md).
+
+View [Settings](settings/settings.md) or [Components](components/components.md) if you have questions regarding a specific predefined setting or component.
+
+Visit [Troubleshoot](troubleshoot.md) if there's a general issue with the plugin (such as error messages).
diff --git a/addons/ggs/docs/settings/audio_mute.md b/addons/ggs/docs/settings/audio_mute.md
new file mode 100644 (file)
index 0000000..c83ad18
--- /dev/null
@@ -0,0 +1,7 @@
+Sets the mute state of a specific audio bus.
+
+# Properties
+| Property | Description | Type |
+| :---: | --- | :---: |
+| default/current | The default and current values of the setting. | `bool` |
+| audio_bus | The audio bus that this setting will affect. | `String` |
diff --git a/addons/ggs/docs/settings/audio_volume.md b/addons/ggs/docs/settings/audio_volume.md
new file mode 100644 (file)
index 0000000..1b39872
--- /dev/null
@@ -0,0 +1,7 @@
+Sets the volume of a specific audio bus.
+
+# Properties
+| Property | Description | Type |
+| :---: | --- | :---: |
+| default/current | The default and current values of the setting. | `float`: 0 to 100 |
+| audio_bus | The audio bus that this setting will affect. | `String` |
diff --git a/addons/ggs/docs/settings/display_fullscreen.md b/addons/ggs/docs/settings/display_fullscreen.md
new file mode 100644 (file)
index 0000000..9652a9f
--- /dev/null
@@ -0,0 +1,7 @@
+Toggles the fullscreen state of the game window.
+
+# Properties
+| Property | Description | Type |
+| :---: | --- | :---: |
+| default/current | The default and current values of the setting. | `bool` |
+| size_setting | Name of the setting responsible for resizing the window (e.g. window size, window scale, etc.). If nothing is selected, the window size will not be updated when the fullscreen state is turned off. This is particularly important when the user changes the window size *while* the game is in fullscreen. | `ggsSetting` |
diff --git a/addons/ggs/docs/settings/display_scale.md b/addons/ggs/docs/settings/display_scale.md
new file mode 100644 (file)
index 0000000..9e3761d
--- /dev/null
@@ -0,0 +1,7 @@
+Sets the window size by multiplying its width and height by a certain value.
+
+# Properties
+| Property | Description | Type |
+| :---: | --- | :---: |
+| default/current | Index or ID of a list item. Invalid until the `scales` property is set. | `int` |
+| scales | The list of available sizes. When setting up a UI component, the order of list items must match the order of items in this property unless you're using item IDs. If using item IDs, each item ID must point to a valid index in this array. | `Array[float]` |
diff --git a/addons/ggs/docs/settings/display_size.md b/addons/ggs/docs/settings/display_size.md
new file mode 100644 (file)
index 0000000..190c2db
--- /dev/null
@@ -0,0 +1,7 @@
+Sets the window size by setting its width and height to certain values.
+
+# Properties
+| Property | Description | Type |
+| :---: | --- | :---: |
+| default/current | Index or ID of a list item. Invalid until the `sizes` property is set. | `int` |
+| sizes | The list of available sizes. When setting up a UI component, the order of list items must match the order of items in this property unless you're using item IDs. If using item IDs, each item ID must point to a valid index in this array. | `Array[Vector2]` |
diff --git a/addons/ggs/docs/settings/input.md b/addons/ggs/docs/settings/input.md
new file mode 100644 (file)
index 0000000..115da24
--- /dev/null
@@ -0,0 +1,37 @@
+Sets an input event of a specific input action (i.e. rebinds an input).
+
+# Properties
+| Property | Description | Type |
+| :---: | --- | :---: |
+| default/current | An array that stores the input type and id. The array structure is `[type, id]`. | `Array[int]`: Read-Only |
+| action | The input action that holds the target input event. | `String`: Read-Only |
+| event_index | The index of the target input event inside the input action. | `int`: Read-Only |
+| default_as_event | The default value (an Array) as an `InputEvent`. | `InputEvent`: Read-Only |
+| current_as_event | The current value (an Array) as an `InputEvent`. | `InputEvent` |
+
+## Type and ID
+Type is the type of input event such as `InputEventKey` or `InputEventJoypadMotion`. GGS uses this to create the correct type of input event when loading the setting.
+
+ID refers to the property that stores what the actual input is. For each event type, it's as followed:
+* **InputEventKey**: `physical_keycode`
+* **InputEventMouseButton** & **InputEventJoypadButton**: `button_index`
+* **InputEventJoypadMotion**: `axis`
+
+## default_as_event
+As mentioned, it shows the default value as an appropriate `InputEvent`. This is always the same as the input event defined in the Input Map.
+
+> [!WARNING]
+> The `default_as_event` property is read-only. However, you can still technically change it by using the "Configure" button when expanding the resource. Do not do this. If you want to change the default value, use the "Select Input" button at the top instead.
+
+## current_as_event
+It shows the current value as an appropriate `InputEvent`. You can easily change this by expanding the resource and using the "Configure" button. You can also clear it and add another type of `InputEvent` (e.g. if it's an `InputEventKey`, you can clear that and create an `InputEventMouseButton` instead).
+
+Unlike other current/default values of other settings, the `current_as_event` property is not updated from the save file every tick as this would prevent the user from changing the resource. Instead, it's updated every time the setting is inspected. So if the `current_as_event` does not reflect what the actual `current` value is, simply re-inspect the setting.
+
+> [!NOTE]
+> The type of `InputEvent` you can create when setting `current_as_event` depends on the type of `default_as_event`. If the default is keyboard or mouse, then you can only create `InputEventKey` and `InputEventMouseButton`. If it's one of the gamepad events, you can only create a gamepad event.
+
+> [!WARNING]
+> When configuring an `InputEventKey`, use "physical keycode". GGS does not accept "keycode" and "key label".
+
+
diff --git a/addons/ggs/docs/settings/settings.md b/addons/ggs/docs/settings/settings.md
new file mode 100644 (file)
index 0000000..b3b6c45
--- /dev/null
@@ -0,0 +1,7 @@
+GGS comes with the following predefined settings:
+* [Audio Mute](audio_mute.md)
+* [Audio Volume](audio_volume.md)
+* [Display Fullscreen](display_fullscreen.md)
+* [Display Scale](display_scale.md)
+* [Display Size](display_size.md)
+* [Input](input_setting.md)
diff --git a/addons/ggs/docs/troubleshoot.md b/addons/ggs/docs/troubleshoot.md
new file mode 100644 (file)
index 0000000..a2d58dd
--- /dev/null
@@ -0,0 +1,21 @@
+## Can't use the plugin after installation
+When you first install the plugin, Godot might output the following error:
+```
+Parse Error: Identifier "GGS" not declared in the current scope.
+```
+This means that the GGS singleton doesn't exist. When the plugin is first added, Godot tries to parse its scripts and since the singleton doesn't exist at that point (since the plugin is not enabled yet), it'll throw that error. The plugin will not function properly even after you add the singleton to the project. To fix it:
+1. Make sure the singleton is added to the autoload list (Project Settings → Autoload) and it's enabled.
+2. Reload the project.
+
+Note that the plugin adds the singleton automatically when enabled. If for some reason it doesn't, you can find the script at the following path:
+```
+res://addons/ggs/classes/ggs_globals.gd
+```
+Simply add that script to the autoload list, **name it GGS**, and reload the project.
+
+
+## Setting type error
+```
+Invalid type in function 'apply' in base 'Resource ()'. Cannot convert argument 1 from <somet_type> to <some_other_type>.
+```
+When launching the game, you may encounter the above error, which leads to `ggs_globals.gd`. If so, check your setting scripts. Make sure the type the `apply()` method receives is correct. For example, your `apply()` method might expect a `bool` value but it's receiving a `String`.
diff --git a/addons/ggs/editor/_theme/ggs_theme.gd b/addons/ggs/editor/_theme/ggs_theme.gd
new file mode 100644 (file)
index 0000000..05151ad
--- /dev/null
@@ -0,0 +1,38 @@
+@tool
+extends Theme
+
+const SETTING_LIST_MARGIN: int = 10
+
+var editor_theme: Theme
+
+
+func update() -> void:
+       editor_theme = ggsUtils.get_editor_interface().get_base_control().theme
+       _set_window_bg()
+       _set_setting_list_bg()
+       _set_setting_item_bg()
+       ResourceSaver.save(self, resource_path)
+
+
+func _set_setting_list_bg() -> void:
+       var default: StyleBoxFlat = editor_theme.get_stylebox("panel", "ItemList")
+       
+       var new_stylebox: StyleBoxFlat = default.duplicate()
+       new_stylebox.set_content_margin_all(SETTING_LIST_MARGIN)
+       set_stylebox("panel", "SettingListBG", new_stylebox)
+
+
+func _set_setting_item_bg() -> void:
+       var default: StyleBoxFlat = editor_theme.get_stylebox("panel", "AcceptDialog")
+       
+       var new_stylebox: StyleBoxFlat = default.duplicate()
+       new_stylebox.set_content_margin_all(SETTING_LIST_MARGIN)
+       new_stylebox.set_corner_radius_all(3)
+       set_stylebox("panel", "SettingItemBG", new_stylebox)
+
+
+func _set_window_bg() -> void:
+       var default: StyleBoxFlat = editor_theme.get_stylebox("panel", "AcceptDialog")
+       
+       var new_stylebox: StyleBoxFlat = default.duplicate()
+       set_stylebox("panel", "PrefWindowBG", new_stylebox)
diff --git a/addons/ggs/editor/_theme/ggs_theme.tres b/addons/ggs/editor/_theme/ggs_theme.tres
new file mode 100644 (file)
index 0000000..0b159d6
--- /dev/null
@@ -0,0 +1,55 @@
+[gd_resource type="Theme" load_steps=5 format=3 uid="uid://c4pwg7lhukqb8"]
+
+[ext_resource type="Script" path="res://addons/ggs/editor/_theme/ggs_theme.gd" id="1_3cm4d"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_wolqy"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(0.211765, 0.211765, 0.211765, 1)
+border_color = Color(0.211765, 0.211765, 0.211765, 1)
+corner_radius_bottom_right = 3
+corner_radius_bottom_left = 3
+corner_detail = 3
+expand_margin_bottom = 2.0
+anti_aliasing = false
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_l5a6g"]
+content_margin_left = 10.0
+content_margin_top = 10.0
+content_margin_right = 10.0
+content_margin_bottom = 10.0
+bg_color = Color(0.211765, 0.211765, 0.211765, 1)
+border_color = Color(0.211765, 0.211765, 0.211765, 1)
+corner_radius_top_left = 3
+corner_radius_top_right = 3
+corner_radius_bottom_right = 3
+corner_radius_bottom_left = 3
+corner_detail = 3
+expand_margin_bottom = 2.0
+anti_aliasing = false
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_g1mf3"]
+content_margin_left = 10.0
+content_margin_top = 10.0
+content_margin_right = 10.0
+content_margin_bottom = 10.0
+bg_color = Color(0.148235, 0.148235, 0.148235, 1)
+border_color = Color(0.084706, 0.084706, 0.084706, 1)
+corner_radius_top_left = 3
+corner_radius_top_right = 3
+corner_radius_bottom_right = 3
+corner_radius_bottom_left = 3
+corner_detail = 3
+anti_aliasing = false
+
+[resource]
+ItemList/colors/guide_color = Color(0.701961, 0.701961, 0.701961, 0)
+ItemList/constants/v_separation = 6
+PrefWindowBG/styles/panel = SubResource("StyleBoxFlat_wolqy")
+SettingItemBG/base_type = &"PanelContainer"
+SettingItemBG/styles/panel = SubResource("StyleBoxFlat_l5a6g")
+SettingListBG/base_type = &"PanelContainer"
+SettingListBG/styles/panel = SubResource("StyleBoxFlat_g1mf3")
+script = ExtResource("1_3cm4d")
diff --git a/addons/ggs/editor/add_setting_window/add_setting_window.gd b/addons/ggs/editor/add_setting_window/add_setting_window.gd
new file mode 100644 (file)
index 0000000..01e9aac
--- /dev/null
@@ -0,0 +1,166 @@
+@tool
+extends ConfirmationDialog
+signal template_selected(template_path: String, setting_name: String)
+
+@onready var SettingList: ItemList = %SettingList
+@onready var FilterField: LineEdit = %FilterField
+@onready var RecentList: ItemList = %RecentList
+@onready var ClearRecentBtn: Button = %ClearRecentBtn
+@onready var NameField: LineEdit = %NameField
+@onready var OkBtn: Button = get_ok_button()
+
+
+func _ready() -> void:
+       about_to_popup.connect(_on_about_to_popup)
+       visibility_changed.connect(_on_visibility_changed)
+       confirmed.connect(_on_confirmed)
+       
+       SettingList.item_selected.connect(_on_AnyList_item_selected.bind(SettingList))
+       SettingList.item_activated.connect(_on_AnyList_item_activated.bind(SettingList))
+       RecentList.item_selected.connect(_on_AnyList_item_selected.bind(RecentList))
+       RecentList.item_activated.connect(_on_AnyList_item_activated.bind(RecentList))
+       
+       FilterField.text_changed.connect(_on_FilterField_text_changed)
+       ClearRecentBtn.pressed.connect(_on_ClearRecentBtn_pressed)
+       NameField.text_submitted.connect(_on_NameField_text_submitted)
+
+
+func _confirm() -> void:
+       var selected_item_index: int
+       var selected_item_meta: String
+       
+       if SettingList.is_anything_selected():
+               selected_item_index = SettingList.get_selected_items()[0]
+               selected_item_meta = SettingList.get_item_metadata(selected_item_index)
+       
+       if RecentList.is_anything_selected():
+               selected_item_index = RecentList.get_selected_items()[0]
+               selected_item_meta = RecentList.get_item_metadata(selected_item_index)
+       
+       template_selected.emit(selected_item_meta, NameField.text)
+       ggsUtils.get_plugin_data().add_recent_setting(selected_item_meta)
+
+
+func _on_about_to_popup() -> void:
+       OkBtn.disabled = true
+       NameField.editable = true
+       NameField.clear()
+       FilterField.clear()
+       _load_settings()
+       _load_recent()
+
+
+func _on_visibility_changed() -> void:
+       if visible == true:
+               FilterField.grab_focus()
+
+
+func _on_confirmed() -> void:
+       _confirm()
+
+
+func _on_NameField_text_submitted(_submitted_text: String) -> void:
+       _confirm()
+       hide()
+
+
+### Lists (General)
+
+func _deselect_other_list(list: ItemList) -> void:
+       if list == SettingList:
+               RecentList.deselect_all()
+       else:
+               SettingList.deselect_all()
+
+
+func _on_AnyList_item_selected(index: int, list: ItemList) -> void:
+       OkBtn.disabled = true
+       NameField.editable = false
+       _deselect_other_list(list)
+
+
+func _on_AnyList_item_activated(index: int, list: ItemList) -> void:
+       OkBtn.disabled = false
+       NameField.editable = true
+       NameField.grab_focus()
+
+
+### Setting List
+
+func _load_settings() -> void:
+       SettingList.clear()
+       
+       var template_list: PackedStringArray = _get_all_settings()
+       for template in template_list:
+               var item_index: int = SettingList.add_item(template.get_file().get_basename())
+               SettingList.set_item_metadata(item_index, template)
+               SettingList.set_item_tooltip(item_index, template)
+
+
+func _get_all_settings() -> PackedStringArray:
+       var all_settings: PackedStringArray
+       var path: String = ggsUtils.get_plugin_data().dir_templates
+       
+       var dir: DirAccess = DirAccess.open(path)
+       var templates: PackedStringArray = dir.get_files()
+       for template in templates:
+               template = dir.get_current_dir().path_join(template)
+               all_settings.append(template)
+       
+       _get_settings_in_dir(dir, all_settings)
+       
+       return all_settings
+
+
+func _get_settings_in_dir(dir: DirAccess, all_settings: PackedStringArray) -> void:
+       var base_dir: String = dir.get_current_dir()
+       var subdirs: PackedStringArray = dir.get_directories()
+       for subdir in subdirs:
+               if subdir.begins_with("_"):
+                       continue
+               
+               dir.change_dir(base_dir.path_join(subdir))
+               var templates: PackedStringArray = dir.get_files()
+               for template in templates:
+                       template = dir.get_current_dir().path_join(template)
+                       all_settings.append(template)
+               
+               _get_settings_in_dir(dir, all_settings)
+
+
+func _filter_setting_list(filter: String) -> void:
+       var to_remove: Array[int]
+       _load_settings()
+       
+       for item_index in range(SettingList.item_count):
+               var item_text: String = SettingList.get_item_text(item_index).to_lower()
+               
+               if not item_text.begins_with(filter.to_lower()):
+                       to_remove.push_front(item_index)
+       
+       for item_index in to_remove:
+               SettingList.remove_item(item_index)
+       
+       SettingList.sort_items_by_text()
+
+
+func _on_FilterField_text_changed(new_text: String) -> void:
+       _filter_setting_list(new_text)
+       NameField.editable = false
+
+
+### Recent List
+
+func _load_recent() -> void:
+       RecentList.clear()
+       
+       var list: Array[String] = ggsUtils.get_plugin_data().recent_settings
+       for item in list:
+               var item_index: int = RecentList.add_item(item.get_file().get_basename())
+               RecentList.set_item_metadata(item_index, item)
+               RecentList.set_item_tooltip(item_index, item)
+
+
+func _on_ClearRecentBtn_pressed() -> void:
+       ggsUtils.get_plugin_data().clear_recent_settings()
+       RecentList.clear()
diff --git a/addons/ggs/editor/add_setting_window/add_setting_window.tscn b/addons/ggs/editor/add_setting_window/add_setting_window.tscn
new file mode 100644 (file)
index 0000000..fc89378
--- /dev/null
@@ -0,0 +1,91 @@
+[gd_scene load_steps=4 format=3 uid="uid://111vt7wxn7lx"]
+
+[ext_resource type="Script" path="res://addons/ggs/editor/add_setting_window/add_setting_window.gd" id="1_338sp"]
+[ext_resource type="Texture2D" uid="uid://dbervsl0o0ifw" path="res://addons/ggs/assets/search.svg" id="1_th7u7"]
+[ext_resource type="Texture2D" uid="uid://bn0d5k8dd06qr" path="res://addons/ggs/assets/delete.svg" id="2_7ec7g"]
+
+[node name="AddSettingWindow" type="ConfirmationDialog"]
+title = "Add Setting from Template"
+size = Vector2i(550, 460)
+min_size = Vector2i(500, 450)
+ok_button_text = "Add"
+script = ExtResource("1_338sp")
+
+[node name="MainCtnr" type="VBoxContainer" parent="."]
+offset_left = 8.0
+offset_top = 8.0
+offset_right = 542.0
+offset_bottom = 411.0
+
+[node name="HBox" type="HBoxContainer" parent="MainCtnr"]
+layout_mode = 2
+size_flags_vertical = 3
+
+[node name="LeftCtnr" type="VBoxContainer" parent="MainCtnr/HBox"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_stretch_ratio = 0.66
+
+[node name="TopBar" type="HBoxContainer" parent="MainCtnr/HBox/LeftCtnr"]
+layout_mode = 2
+
+[node name="RecentLabel" type="Label" parent="MainCtnr/HBox/LeftCtnr/TopBar"]
+layout_mode = 2
+size_flags_vertical = 0
+text = "Recent:"
+
+[node name="ClearRecentBtn" type="Button" parent="MainCtnr/HBox/LeftCtnr/TopBar"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 10
+tooltip_text = "Clear Recent"
+icon = ExtResource("2_7ec7g")
+flat = true
+
+[node name="RecentList" type="ItemList" parent="MainCtnr/HBox/LeftCtnr"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_vertical = 3
+size_flags_stretch_ratio = 0.66
+
+[node name="RightCtnr" type="VBoxContainer" parent="MainCtnr/HBox"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="TopBar" type="HBoxContainer" parent="MainCtnr/HBox/RightCtnr"]
+layout_mode = 2
+size_flags_vertical = 0
+
+[node name="AllLabel" type="Label" parent="MainCtnr/HBox/RightCtnr/TopBar"]
+layout_mode = 2
+text = "All Items:"
+
+[node name="FilterField" type="LineEdit" parent="MainCtnr/HBox/RightCtnr/TopBar"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(200, 0)
+layout_mode = 2
+size_flags_horizontal = 10
+placeholder_text = "Filter Items..."
+clear_button_enabled = true
+right_icon = ExtResource("1_th7u7")
+
+[node name="SettingList" type="ItemList" parent="MainCtnr/HBox/RightCtnr"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(0, 200)
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="NameCtnr" type="HBoxContainer" parent="MainCtnr"]
+layout_mode = 2
+theme_override_constants/separation = 5
+
+[node name="NameLabel" type="Label" parent="MainCtnr/NameCtnr"]
+layout_mode = 2
+text = "Name:"
+
+[node name="NameField" type="LineEdit" parent="MainCtnr/NameCtnr"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 8
diff --git a/addons/ggs/editor/category_panel/category_list.gd b/addons/ggs/editor/category_panel/category_list.gd
new file mode 100644 (file)
index 0000000..2a411c3
--- /dev/null
@@ -0,0 +1,54 @@
+@tool
+extends ItemList
+
+@onready var FSD: FileSystemDock = ggsUtils.get_file_system_dock()
+
+
+func _ready() -> void:
+       item_activated.connect(_on_item_activated)
+       item_selected.connect(_on_item_selected)
+       
+       GGS.dir_settings_change_occured.connect(_on_Global_dir_settings_change_occured)
+       
+       load_list()
+
+
+func load_list() -> void:
+       clear()
+       
+       var categories: PackedStringArray = _load_categories_from_filesystem()
+       for category in categories:
+               add_item(category)
+       
+       GGS.active_category = ""
+
+
+func _update_from_file_system() -> void:
+       load_list()
+
+
+func _on_item_selected(item_index: int) -> void:
+       var item_text: String = get_item_text(item_index)
+       GGS.active_category = item_text
+
+
+func _on_item_activated(item_index: int) -> void:
+       var item_text: String = get_item_text(item_index)
+       var path: String = ggsUtils.get_plugin_data().dir_settings.path_join(item_text)
+       ggsUtils.get_editor_interface().select_file(path)
+
+
+func _on_Global_dir_settings_change_occured() -> void:
+       _update_from_file_system()
+
+
+### Load Categories
+
+func _load_categories_from_filesystem() -> PackedStringArray:
+       var dir: DirAccess = DirAccess.open(ggsUtils.get_plugin_data().dir_settings)
+       var list: Array = Array(dir.get_directories()).filter(_remove_underscored)
+       return PackedStringArray(list)
+
+
+func _remove_underscored(element: String) -> bool:
+       return not element.begins_with("_")
diff --git a/addons/ggs/editor/category_panel/category_panel.gd b/addons/ggs/editor/category_panel/category_panel.gd
new file mode 100644 (file)
index 0000000..b45cddf
--- /dev/null
@@ -0,0 +1,49 @@
+@tool
+extends Control
+
+@export var Notification: AcceptDialog
+
+@onready var NCF: LineEdit = %NewCatField
+@onready var ReloadBtn: Button = %ReloadBtn
+@onready var List: ItemList = %CategoryList
+
+
+func _ready() -> void:
+       NCF.text_submitted.connect(_on_NCF_text_submitted)
+       ReloadBtn.pressed.connect(_on_ReloadBtn_pressed)
+
+
+### Category Creation
+
+func _create_category(cat_name: String) -> void:
+       var dir: DirAccess = DirAccess.open(ggsUtils.get_plugin_data().dir_settings)
+       dir.make_dir(cat_name)
+       
+       NCF.clear()
+
+
+func _on_NCF_text_submitted(submitted_text: String) -> void:
+       if (
+               not submitted_text.is_valid_filename() or
+               submitted_text.begins_with("_") or
+               submitted_text.begins_with(".")
+       ):
+               Notification.purpose = Notification.Purpose.INVALID
+               Notification.popup_centered()
+               return
+       
+       var dir: DirAccess = DirAccess.open(ggsUtils.get_plugin_data().dir_settings)
+       if dir.dir_exists(submitted_text):
+               Notification.purpose = Notification.Purpose.ALREADY_EXISTS
+               Notification.popup_centered()
+               return
+       
+       _create_category(submitted_text)
+       ggsUtils.get_resource_file_system().scan()
+       List.load_list()
+
+
+### Reload Btn
+
+func _on_ReloadBtn_pressed() -> void:
+       List.load_list()
diff --git a/addons/ggs/editor/category_panel/category_panel.tscn b/addons/ggs/editor/category_panel/category_panel.tscn
new file mode 100644 (file)
index 0000000..bb569bf
--- /dev/null
@@ -0,0 +1,51 @@
+[gd_scene load_steps=4 format=3 uid="uid://bkp77x1seytg7"]
+
+[ext_resource type="Script" path="res://addons/ggs/editor/category_panel/category_panel.gd" id="1_yu7o4"]
+[ext_resource type="Texture2D" uid="uid://ve54bl3r7ljc" path="res://addons/ggs/assets/reload.svg" id="2_so3ov"]
+[ext_resource type="Script" path="res://addons/ggs/editor/category_panel/category_list.gd" id="4_xqs08"]
+
+[node name="CategoryPanel" type="Control"]
+custom_minimum_size = Vector2(160, 0)
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_yu7o4")
+
+[node name="MainCtnr" type="VBoxContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="TopBar" type="HBoxContainer" parent="MainCtnr"]
+layout_mode = 2
+
+[node name="NewCatField" type="LineEdit" parent="MainCtnr/TopBar"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+placeholder_text = "New Category..."
+clear_button_enabled = true
+
+[node name="VSep" type="VSeparator" parent="MainCtnr/TopBar"]
+layout_mode = 2
+
+[node name="ReloadBtn" type="Button" parent="MainCtnr/TopBar"]
+unique_name_in_owner = true
+layout_mode = 2
+tooltip_text = "Reload List"
+icon = ExtResource("2_so3ov")
+flat = true
+icon_alignment = 1
+
+[node name="CategoryList" type="ItemList" parent="MainCtnr"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_vertical = 3
+allow_reselect = true
+script = ExtResource("4_xqs08")
diff --git a/addons/ggs/editor/component_panel/component_panel.gd b/addons/ggs/editor/component_panel/component_panel.gd
new file mode 100644 (file)
index 0000000..94779c3
--- /dev/null
@@ -0,0 +1,91 @@
+@tool
+extends Control
+
+@onready var GroupField: LineEdit = %GroupField
+@onready var ASI: LineEdit = %ActiveSettingIndicator
+@onready var CASBtn: Button = %ClearActiveSettingBtn
+@onready var List: ItemList = %ComponentList
+
+
+func _ready() -> void:
+       List.item_activated.connect(_on_List_item_activated)
+       
+       CASBtn.pressed.connect(_on_CASBtn_pressed)
+       GGS.active_setting_changed.connect(_on_Global_active_setting_changed)
+       
+       _load_list()
+
+
+func _on_CASBtn_pressed() -> void:
+       GGS.active_setting = null
+
+
+func _on_Global_active_setting_changed() -> void:
+       ASI.text = GGS.active_setting.name if GGS.active_setting else ""
+
+
+### List Init
+
+func _load_list() -> void:
+       List.clear()
+       
+       var comp_list: Array[Dictionary] = _get_comp_list()
+       for component in comp_list:
+               var text: String = component["name"]
+               var meta: String = component["scene"]
+               
+               var item_index: int = List.add_item(text)
+               List.set_item_metadata(item_index, meta)
+       
+       List.sort_items_by_text()
+
+
+func _get_comp_list() -> Array[Dictionary]:
+       var comp_list: Array[Dictionary]
+       
+       var data: ggsPluginData = ggsUtils.get_plugin_data()
+       var components: PackedStringArray = DirAccess.get_directories_at(data.dir_components)
+       for component in components:
+               if component.begins_with("_"):
+                       continue
+               
+               var info: Dictionary
+               var path: String = data.dir_components.path_join(component)
+               
+               info["name"] = component.capitalize()
+               info["scene"] = path.path_join("%s.tscn"%component)
+               
+               comp_list.append(info)
+       
+       return comp_list
+
+
+### Component Instantiation
+
+func _on_List_item_activated(item_index: int) -> void:
+       var EI: EditorInterface = ggsUtils.get_editor_interface()
+       var ES: EditorSelection = EI.get_selection()
+       var selected_nodes: Array[Node] = ES.get_selected_nodes()
+       
+       if selected_nodes.size() != 1:
+               printerr("GGS - Instantiate Component: Exactly one item in the scene tree must be selected to instantiate a component.")
+               return
+       
+       var item_meta: String = List.get_item_metadata(item_index)
+       var SelectedNode: Node = selected_nodes[0]
+       var ESR: Node = EI.get_edited_scene_root()
+       
+       var comp_scene: PackedScene = load(item_meta)
+       var Component: Control = comp_scene.instantiate()
+       Component.setting = GGS.active_setting
+       Component.apply_on_change = ggsUtils.get_plugin_data().apply_on_changed_all
+       Component.grab_focus_on_mouse_over = ggsUtils.get_plugin_data().grab_focus_on_mouse_over_all
+       
+       SelectedNode.add_child(Component, true)
+       SelectedNode.set_editable_instance(Component, true)
+       Component.owner = ESR
+       
+       if not GroupField.text.strip_edges().is_empty():
+               Component.add_to_group(GroupField.text.strip_edges(), true)
+       
+       EI.save_scene()
diff --git a/addons/ggs/editor/component_panel/component_panel.tscn b/addons/ggs/editor/component_panel/component_panel.tscn
new file mode 100644 (file)
index 0000000..5ec9cca
--- /dev/null
@@ -0,0 +1,73 @@
+[gd_scene load_steps=3 format=3 uid="uid://cfr2j0ekmm5bm"]
+
+[ext_resource type="Script" path="res://addons/ggs/editor/component_panel/component_panel.gd" id="1_3cgut"]
+[ext_resource type="Texture2D" uid="uid://cflcng660hsp0" path="res://addons/ggs/assets/close.svg" id="3_wh32e"]
+
+[node name="ComponentPanel" type="Control"]
+custom_minimum_size = Vector2(170, 0)
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_3cgut")
+
+[node name="MainCtnr" type="VBoxContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="TopBar" type="HBoxContainer" parent="MainCtnr"]
+layout_mode = 2
+
+[node name="GroupField" type="LineEdit" parent="MainCtnr/TopBar"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+tooltip_text = "Node Group
+If not empty, newly created components are added to this node group."
+placeholder_text = "Node Group"
+clear_button_enabled = true
+
+[node name="ActiveSettingCtnr" type="HBoxContainer" parent="MainCtnr"]
+layout_mode = 2
+
+[node name="ActiveSettingIndicator" type="LineEdit" parent="MainCtnr/ActiveSettingCtnr"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+tooltip_text = "Active Setting
+If not empty, the setting displayed here will be assigned to the components you add."
+focus_mode = 0
+placeholder_text = "No Active Setting"
+editable = false
+
+[node name="ClearActiveSettingBtn" type="Button" parent="MainCtnr/ActiveSettingCtnr"]
+unique_name_in_owner = true
+layout_mode = 2
+tooltip_text = "Clear Active Setting"
+icon = ExtResource("3_wh32e")
+flat = true
+
+[node name="ComponentList" type="ItemList" parent="MainCtnr"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_vertical = 3
+allow_reselect = true
+item_count = 10
+max_columns = 2
+same_column_width = true
+item_0/text = "Arrow List"
+item_1/text = "Checkbox"
+item_2/text = "Input Btn"
+item_3/text = "Option List"
+item_4/text = "Radio List"
+item_5/text = "Slider"
+item_6/text = "Spinbox"
+item_7/text = "Switch"
+item_8/text = "Text Field"
+item_9/text = "Toggle Btn"
diff --git a/addons/ggs/editor/input_selector/input_list.gd b/addons/ggs/editor/input_selector/input_list.gd
new file mode 100644 (file)
index 0000000..f65e2c0
--- /dev/null
@@ -0,0 +1,52 @@
+@tool
+extends Tree
+
+var root: TreeItem
+
+
+func load_list() -> void:
+       clear()
+       root = create_item()
+       
+       var input_map: Dictionary = _get_input_map()
+       for action in input_map.keys():
+               var action_item: TreeItem = _create_item(root, action)
+               
+               var index: int = 0
+               for event in input_map[action]:
+                       _create_item(action_item, event.as_text(), {"event": event, "index": index})
+                       index += 1
+
+
+func set_collapsed_all(collapsed: bool) -> void:
+       var items: Array[TreeItem] = root.get_children()
+       for item in items:
+               item.set_collapsed_recursive(collapsed)
+
+
+func _get_input_map() -> Dictionary:
+       var input_map: Dictionary
+       
+       var project_file: ConfigFile = ConfigFile.new()
+       project_file.load("res://project.godot")
+       
+       var actions: PackedStringArray = project_file.get_section_keys("input")
+       for action in actions:
+               var action_properties: Dictionary = project_file.get_value("input", action)
+               var action_events: Array = action_properties["events"]
+               
+               input_map[action] = action_events
+       
+       return input_map
+
+
+func _create_item(parent: TreeItem, text: String, meta: Dictionary = {}) -> TreeItem:
+       var created_item: TreeItem = create_item(parent)
+       created_item.set_text(0, text)
+       
+       if meta.is_empty():
+               created_item.set_selectable(0, false)
+       else:
+               created_item.set_metadata(0, meta)
+       
+       return created_item
diff --git a/addons/ggs/editor/input_selector/input_selector.gd b/addons/ggs/editor/input_selector/input_selector.gd
new file mode 100644 (file)
index 0000000..943c6a3
--- /dev/null
@@ -0,0 +1,93 @@
+@tool
+extends MarginContainer
+
+var inspected_obj: ggsInputSetting
+
+@onready var SelectBtn: Button = %SelectBtn
+
+@onready var SIW: ConfirmationDialog = %SelectInputWindow
+@onready var SearchField: LineEdit = %SearchField
+@onready var CollapseAllBtn: Button = %CollapseAllBtn
+@onready var ExpandAllBtn: Button = %ExpandAllBtn
+@onready var List: Tree = %InputList
+
+@onready var OkBtn: Button = SIW.get_ok_button()
+
+
+func _ready() -> void:
+       SelectBtn.pressed.connect(_on_SelectBtn_pressed)
+       
+       SIW.about_to_popup.connect(_on_SIW_about_to_popup)
+       SIW.confirmed.connect(_on_SIW_confirmed)
+       SearchField.text_changed.connect(_on_SearchField_text_changed)
+       CollapseAllBtn.pressed.connect(_on_CollapseAllBtn_pressed)
+       ExpandAllBtn.pressed.connect(_on_ExpandAllBtn_pressed)
+       
+       List.item_selected.connect(_on_List_item_selected)
+       List.item_activated.connect(_on_List_item_activated)
+
+
+func _on_SelectBtn_pressed() -> void:
+       SIW.popup_centered()
+
+
+func _on_SIW_about_to_popup() -> void:
+       List.load_list()
+       OkBtn.disabled = true
+       SearchField.clear()
+       List.set_collapsed_all(true)
+
+
+func _on_List_item_selected() -> void:
+       var selected_item: TreeItem = List.get_selected()
+       OkBtn.disabled = false
+
+
+### Item Selection
+
+func _confirm(item: TreeItem) -> void:
+       inspected_obj.action = item.get_parent().get_text(0)
+       inspected_obj.event_index = item.get_metadata(0)["index"]
+       inspected_obj.default_as_event = item.get_metadata(0)["event"]
+       inspected_obj.current_as_event = item.get_metadata(0)["event"].duplicate()
+
+
+func _on_SIW_confirmed() -> void:
+       var selected_item: TreeItem = List.get_selected()
+       _confirm(selected_item)
+
+
+func _on_List_item_activated() -> void:
+       var selected_item: TreeItem = List.get_selected()
+       _confirm(selected_item)
+       SIW.visible = false
+
+
+### List Filtering
+
+func _filter_list(filter: String) -> void:
+       List.load_list()
+       OkBtn.disabled = true
+       
+       filter = filter.to_lower()
+       var items: Array[TreeItem] = List.root.get_children()
+       for item in items:
+               var item_name: String = item.get_text(0).to_lower()
+               if item_name.begins_with(filter):
+                       continue
+               
+               item.free()
+
+
+func _on_SearchField_text_changed(new_text: String) -> void:
+       _filter_list(new_text)
+
+
+### Collapse/Expand Buttons
+
+func _on_CollapseAllBtn_pressed() -> void:
+       List.set_collapsed_all(true)
+
+
+func _on_ExpandAllBtn_pressed() -> void:
+       List.set_collapsed_all(false)
diff --git a/addons/ggs/editor/input_selector/input_selector.tscn b/addons/ggs/editor/input_selector/input_selector.tscn
new file mode 100644 (file)
index 0000000..0827040
--- /dev/null
@@ -0,0 +1,72 @@
+[gd_scene load_steps=6 format=3 uid="uid://bqymtf8fuyj54"]
+
+[ext_resource type="Script" path="res://addons/ggs/editor/input_selector/input_selector.gd" id="1_qjksw"]
+[ext_resource type="Texture2D" uid="uid://dbervsl0o0ifw" path="res://addons/ggs/assets/search.svg" id="2_cgd6a"]
+[ext_resource type="Script" path="res://addons/ggs/editor/input_selector/input_list.gd" id="3_jsbwa"]
+[ext_resource type="Texture2D" uid="uid://l0mve5lc0okm" path="res://addons/ggs/assets/collapse_all.svg" id="3_mxhgu"]
+[ext_resource type="Texture2D" uid="uid://caajrkkuvle0e" path="res://addons/ggs/assets/expand_all.svg" id="4_3d11l"]
+
+[node name="Margin" type="MarginContainer"]
+offset_right = 100.0
+theme_override_constants/margin_top = 5
+theme_override_constants/margin_bottom = 5
+script = ExtResource("1_qjksw")
+
+[node name="InputSelector" type="VBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="SelectBtn" type="Button" parent="InputSelector"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Select Input"
+
+[node name="VSeparator" type="HSeparator" parent="InputSelector"]
+layout_mode = 2
+theme_override_constants/separation = 0
+
+[node name="SelectInputWindow" type="ConfirmationDialog" parent="."]
+unique_name_in_owner = true
+title = "Select Input"
+size = Vector2i(700, 500)
+min_size = Vector2i(700, 500)
+ok_button_text = "Select"
+
+[node name="MainCtnr" type="VBoxContainer" parent="SelectInputWindow"]
+offset_left = 8.0
+offset_top = 8.0
+offset_right = 692.0
+offset_bottom = 451.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="TopBar" type="HBoxContainer" parent="SelectInputWindow/MainCtnr"]
+layout_mode = 2
+
+[node name="SearchField" type="LineEdit" parent="SelectInputWindow/MainCtnr/TopBar"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+placeholder_text = "Filter Actions"
+clear_button_enabled = true
+right_icon = ExtResource("2_cgd6a")
+
+[node name="CollapseAllBtn" type="Button" parent="SelectInputWindow/MainCtnr/TopBar"]
+unique_name_in_owner = true
+layout_mode = 2
+tooltip_text = "Collapse All"
+icon = ExtResource("3_mxhgu")
+flat = true
+
+[node name="ExpandAllBtn" type="Button" parent="SelectInputWindow/MainCtnr/TopBar"]
+unique_name_in_owner = true
+layout_mode = 2
+tooltip_text = "Expand All"
+icon = ExtResource("4_3d11l")
+flat = true
+
+[node name="InputList" type="Tree" parent="SelectInputWindow/MainCtnr"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_vertical = 3
+hide_root = true
+script = ExtResource("3_jsbwa")
diff --git a/addons/ggs/editor/main_panel/bug_btn.gd b/addons/ggs/editor/main_panel/bug_btn.gd
new file mode 100644 (file)
index 0000000..9bb6ec7
--- /dev/null
@@ -0,0 +1,12 @@
+@tool
+extends Button
+
+const URI: String = "https://github.com/PunchablePlushie/godot-game-settings/issues"
+
+
+func _ready() -> void:
+       pressed.connect(_on_pressed)
+
+
+func _on_pressed() -> void:
+       OS.shell_open(URI)
diff --git a/addons/ggs/editor/main_panel/docs_btn.gd b/addons/ggs/editor/main_panel/docs_btn.gd
new file mode 100644 (file)
index 0000000..41aabc0
--- /dev/null
@@ -0,0 +1,12 @@
+@tool
+extends Button
+
+const URI: String = "https://github.com/PunchablePlushie/godot-game-settings/tree/main/docs/home.md"
+
+
+func _ready() -> void:
+       pressed.connect(_on_pressed)
+
+
+func _on_pressed() -> void:
+       OS.shell_open(URI)
diff --git a/addons/ggs/editor/main_panel/feedback_btn.gd b/addons/ggs/editor/main_panel/feedback_btn.gd
new file mode 100644 (file)
index 0000000..f9ab016
--- /dev/null
@@ -0,0 +1,12 @@
+@tool
+extends Button
+
+const URI: String = "https://forms.gle/c8XQzKHEqeMqxJ3Z9"
+
+
+func _ready() -> void:
+       pressed.connect(_on_pressed)
+
+
+func _on_pressed() -> void:
+       OS.shell_open(URI)
diff --git a/addons/ggs/editor/main_panel/main_panel.tscn b/addons/ggs/editor/main_panel/main_panel.tscn
new file mode 100644 (file)
index 0000000..94d9ad6
--- /dev/null
@@ -0,0 +1,178 @@
+[gd_scene load_steps=20 format=3 uid="uid://buovvisskoqxh"]
+
+[ext_resource type="Theme" uid="uid://c4pwg7lhukqb8" path="res://addons/ggs/editor/_theme/ggs_theme.tres" id="1_w3bfk"]
+[ext_resource type="PackedScene" uid="uid://bkp77x1seytg7" path="res://addons/ggs/editor/category_panel/category_panel.tscn" id="4_4p007"]
+[ext_resource type="Script" path="res://addons/ggs/editor/main_panel/split_containers.gd" id="4_mplwh"]
+[ext_resource type="PackedScene" uid="uid://cfr2j0ekmm5bm" path="res://addons/ggs/editor/component_panel/component_panel.tscn" id="5_7xo6y"]
+[ext_resource type="PackedScene" uid="uid://vt5mwwxhtu3x" path="res://addons/ggs/editor/setting_panel/setting_panel.tscn" id="6_rabjj"]
+[ext_resource type="Texture2D" uid="uid://b8o243gwa707v" path="res://addons/ggs/assets/icon_mono.svg" id="6_t7de8"]
+[ext_resource type="Script" path="res://addons/ggs/editor/main_panel/save_file_menu.gd" id="7_guojl"]
+[ext_resource type="Texture2D" uid="uid://bx8yoim3ur6h" path="res://addons/ggs/assets/save_file.svg" id="8_3r2nn"]
+[ext_resource type="Texture2D" uid="uid://cdxv6r8uy2me5" path="res://addons/ggs/assets/docs.svg" id="8_mdi0r"]
+[ext_resource type="Script" path="res://addons/ggs/editor/main_panel/pref_btn.gd" id="9_oodag"]
+[ext_resource type="Script" path="res://addons/ggs/editor/main_panel/docs_btn.gd" id="9_qwavr"]
+[ext_resource type="PackedScene" uid="uid://c42mh74d7l2rt" path="res://addons/ggs/editor/pref_window/pref_window.tscn" id="10_ir36c"]
+[ext_resource type="Texture2D" uid="uid://bt7gdorkvo4an" path="res://addons/ggs/assets/bug.svg" id="10_rly1w"]
+[ext_resource type="Script" path="res://addons/ggs/editor/main_panel/bug_btn.gd" id="11_2ygfj"]
+[ext_resource type="Script" path="res://addons/ggs/editor/main_panel/feedback_btn.gd" id="15_0jgkh"]
+[ext_resource type="Texture2D" uid="uid://c5a5taq8d2n0v" path="res://addons/ggs/assets/feedback.svg" id="16_abywd"]
+[ext_resource type="Script" path="res://addons/ggs/editor/main_panel/progress_overlay.gd" id="16_hfs01"]
+[ext_resource type="Script" path="res://addons/ggs/editor/main_panel/notification.gd" id="18_ky7ax"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_jbg8d"]
+
+[node name="MainPanel" type="Control"]
+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
+theme = ExtResource("1_w3bfk")
+
+[node name="MainCtnr" type="HBoxContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="HSplit_0" type="HSplitContainer" parent="MainCtnr"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+split_offset = -315
+script = ExtResource("4_mplwh")
+
+[node name="CategoryPanel" parent="MainCtnr/HSplit_0" node_paths=PackedStringArray("Notification") instance=ExtResource("4_4p007")]
+layout_mode = 2
+size_flags_horizontal = 3
+Notification = NodePath("../../../Notification")
+
+[node name="HSplit_1" type="HSplitContainer" parent="MainCtnr/HSplit_0"]
+layout_mode = 2
+size_flags_horizontal = 3
+split_offset = 615
+script = ExtResource("4_mplwh")
+
+[node name="SettingPanel" parent="MainCtnr/HSplit_0/HSplit_1" node_paths=PackedStringArray("Notification") instance=ExtResource("6_rabjj")]
+layout_mode = 2
+Notification = NodePath("../../../../Notification")
+
+[node name="ComponentPanel" parent="MainCtnr/HSplit_0/HSplit_1" instance=ExtResource("5_7xo6y")]
+layout_mode = 2
+
+[node name="VSeparator" type="VSeparator" parent="MainCtnr"]
+layout_mode = 2
+
+[node name="BtnCtnr" type="VBoxContainer" parent="MainCtnr"]
+layout_mode = 2
+size_flags_horizontal = 8
+
+[node name="TopCtnr" type="VBoxContainer" parent="MainCtnr/BtnCtnr"]
+layout_mode = 2
+
+[node name="SaveFileMenu" type="MenuButton" parent="MainCtnr/BtnCtnr/TopCtnr"]
+layout_mode = 2
+tooltip_text = "Save File"
+icon = ExtResource("8_3r2nn")
+item_count = 4
+popup/item_0/text = "Open Save File"
+popup/item_0/id = 0
+popup/item_1/text = ""
+popup/item_1/id = 999
+popup/item_1/separator = true
+popup/item_2/text = "Remake from Current"
+popup/item_2/id = 1
+popup/item_3/text = "Remake from Default"
+popup/item_3/id = 2
+script = ExtResource("7_guojl")
+
+[node name="PrefBtn" type="Button" parent="MainCtnr/BtnCtnr/TopCtnr"]
+layout_mode = 2
+size_flags_vertical = 10
+tooltip_text = "Preferences"
+icon = ExtResource("6_t7de8")
+flat = true
+script = ExtResource("9_oodag")
+
+[node name="BotCtnr" type="VBoxContainer" parent="MainCtnr/BtnCtnr"]
+layout_mode = 2
+size_flags_vertical = 10
+
+[node name="DocsBtn" type="Button" parent="MainCtnr/BtnCtnr/BotCtnr"]
+layout_mode = 2
+size_flags_vertical = 10
+tooltip_text = "View Documentation"
+icon = ExtResource("8_mdi0r")
+flat = true
+script = ExtResource("9_qwavr")
+
+[node name="BugBtn" type="Button" parent="MainCtnr/BtnCtnr/BotCtnr"]
+layout_mode = 2
+size_flags_vertical = 10
+tooltip_text = "Report an Issue"
+icon = ExtResource("10_rly1w")
+flat = true
+script = ExtResource("11_2ygfj")
+
+[node name="FeedbackBtn" type="Button" parent="MainCtnr/BtnCtnr/BotCtnr"]
+layout_mode = 2
+tooltip_text = "Send Feedback"
+icon = ExtResource("16_abywd")
+flat = true
+script = ExtResource("15_0jgkh")
+
+[node name="ProgressOverlay" type="PanelContainer" parent="."]
+visible = false
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_default_cursor_shape = 4
+theme_override_styles/panel = SubResource("StyleBoxEmpty_jbg8d")
+script = ExtResource("16_hfs01")
+label_save_file_current = "Remaking Save File from Current Values"
+label_save_file_default = "Remaking Save File from Default Values"
+label_add_multiple_settings = "Adding Setting(s)"
+
+[node name="ProgBG" type="ColorRect" parent="ProgressOverlay"]
+layout_mode = 2
+color = Color(0, 0, 0, 0.784314)
+
+[node name="Center" type="CenterContainer" parent="ProgressOverlay"]
+layout_mode = 2
+
+[node name="VBox" type="VBoxContainer" parent="ProgressOverlay/Center"]
+layout_mode = 2
+
+[node name="ProgLabel" type="Label" parent="ProgressOverlay/Center/VBox"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Remaking Save File from Default Values"
+
+[node name="ProgBar" type="ProgressBar" parent="ProgressOverlay/Center/VBox"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(250, 0)
+layout_mode = 2
+mouse_default_cursor_shape = 4
+
+[node name="PrefWindow" parent="." instance=ExtResource("10_ir36c")]
+unique_name_in_owner = true
+
+[node name="Notification" type="AcceptDialog" parent="."]
+size = Vector2i(687, 100)
+unresizable = true
+max_size = Vector2i(700, 16384)
+dialog_autowrap = true
+script = ExtResource("18_ky7ax")
+title_invalid = "Invalid Item Name"
+title_already_exists = "Item Already Exists"
+msg_invalid = "The item name must be a valid file name and cannot start with an underscore (\"_\")  or dot (\".\")."
+msg_already_exists = "An item with this name already exists."
diff --git a/addons/ggs/editor/main_panel/notification.gd b/addons/ggs/editor/main_panel/notification.gd
new file mode 100644 (file)
index 0000000..9267429
--- /dev/null
@@ -0,0 +1,26 @@
+@tool
+extends AcceptDialog
+
+enum Purpose {INVALID, ALREADY_EXISTS}
+
+@export_group("Title", "title_")
+@export var title_invalid: String
+@export var title_already_exists: String
+@export_group("Message", "msg_")
+@export_multiline var msg_invalid: String
+@export_multiline var msg_already_exists: String
+
+
+var purpose: int : set = set_purpose
+
+
+func set_purpose(value: int) -> void:
+       purpose = value
+       
+       match value:
+               Purpose.INVALID:
+                       title = title_invalid
+                       dialog_text = msg_invalid
+               Purpose.ALREADY_EXISTS:
+                       title = title_already_exists
+                       dialog_text = msg_already_exists
diff --git a/addons/ggs/editor/main_panel/pref_btn.gd b/addons/ggs/editor/main_panel/pref_btn.gd
new file mode 100644 (file)
index 0000000..336a0da
--- /dev/null
@@ -0,0 +1,12 @@
+@tool
+extends Button
+
+@onready var PrefWindow: Window = %PrefWindow
+
+
+func _ready() -> void:
+       pressed.connect(_on_pressed)
+
+
+func _on_pressed() -> void:
+       PrefWindow.popup_centered(PrefWindow.min_size)
diff --git a/addons/ggs/editor/main_panel/progress_overlay.gd b/addons/ggs/editor/main_panel/progress_overlay.gd
new file mode 100644 (file)
index 0000000..1c6a38d
--- /dev/null
@@ -0,0 +1,48 @@
+@tool
+extends PanelContainer
+
+@export_multiline var label_save_file_current: String
+@export_multiline var label_save_file_default: String
+@export_multiline var label_add_multiple_settings: String
+
+var type: int
+
+@onready var ProgLabel: Label = %ProgLabel
+@onready var ProgBar: ProgressBar = %ProgBar
+
+
+func _ready() -> void:
+       GGS.progress_started.connect(_on_Global_progress_started)
+       GGS.progress_advanced.connect(_on_Global_progress_advanced)
+       GGS.progress_ended.connect(_on_Global_progress_ended)
+       
+       visible = false
+       ProgBar.value = 0
+
+
+func _on_Global_progress_started(progress_type: int) -> void:
+       visible = true
+       ProgBar.visible = true
+       type = progress_type
+       
+       match type:
+               GGS.Progress.SAVE_FILE_CURRENT:
+                       ProgLabel.text = label_save_file_current
+               GGS.Progress.SAVE_FILE_DEFAULT:
+                       ProgLabel.text = label_save_file_default
+               GGS.Progress.ADD_SETTINGS:
+                       ProgLabel.text = label_add_multiple_settings
+                       ProgBar.visible = false
+       
+
+
+func _on_Global_progress_ended() -> void:
+       # A small delay to make sure progress_ended happens after progress_started
+       await get_tree().create_timer(0.01).timeout
+       
+       visible = false
+       ProgBar.value = 0
+
+
+func _on_Global_progress_advanced(progress: float) -> void:
+       ProgBar.value = progress
diff --git a/addons/ggs/editor/main_panel/save_file_menu.gd b/addons/ggs/editor/main_panel/save_file_menu.gd
new file mode 100644 (file)
index 0000000..2a10139
--- /dev/null
@@ -0,0 +1,28 @@
+@tool
+extends MenuButton
+
+enum MenuItems {OPEN, REMAKE_CURRENT, REMAKE_DEFAULT}
+
+var Menu: PopupMenu = get_popup()
+
+
+func _ready() -> void:
+       Menu.id_pressed.connect(_on_Menu_id_pressed)
+
+
+func _open_save_file() -> void:
+       var data: ggsPluginData = ggsUtils.get_plugin_data()
+       var path: String = ProjectSettings.globalize_path(data.dir_save_file)
+       var err: Error = OS.shell_open(path)
+       if err != OK:
+               printerr("GGS - Open Save File: An error has occured while opening the file. Code: %s"%[error_string(err)])
+
+
+func _on_Menu_id_pressed(id: int) -> void:
+       match id:
+               MenuItems.OPEN:
+                       _open_save_file()
+               MenuItems.REMAKE_CURRENT:
+                       GGS.request_update_save_file()
+               MenuItems.REMAKE_DEFAULT:
+                       GGS.request_update_save_file_default()
diff --git a/addons/ggs/editor/main_panel/split_containers.gd b/addons/ggs/editor/main_panel/split_containers.gd
new file mode 100644 (file)
index 0000000..d87e421
--- /dev/null
@@ -0,0 +1,24 @@
+@tool
+extends HSplitContainer
+
+@onready var property: String = _get_property()
+
+
+func _ready() -> void:
+       dragged.connect(_on_dragged)
+       
+       var data: ggsPluginData = ggsUtils.get_plugin_data()
+       split_offset = data.get(property)
+
+
+### Private
+func _get_property() -> StringName:
+       return "split_offset_%s"%name.split("_")[1]
+
+
+### Signals
+func _on_dragged(offset: int) -> void:
+       clamp_split_offset()
+       
+       var data: ggsPluginData = ggsUtils.get_plugin_data()
+       data.set_property(property, offset)
diff --git a/addons/ggs/editor/main_panel/update_theme_btn.gd b/addons/ggs/editor/main_panel/update_theme_btn.gd
new file mode 100644 (file)
index 0000000..32e736d
--- /dev/null
@@ -0,0 +1,12 @@
+@tool
+extends Button
+
+@onready var ggs_theme: Theme = preload("res://addons/ggs/editor/_theme/ggs_theme.tres")
+
+
+func _ready() -> void:
+       pressed.connect(_on_pressed)
+
+
+func _on_pressed() -> void:
+       ggs_theme.update()
diff --git a/addons/ggs/editor/pref_window/pref_window.gd b/addons/ggs/editor/pref_window/pref_window.gd
new file mode 100644 (file)
index 0000000..92a4183
--- /dev/null
@@ -0,0 +1,177 @@
+@tool
+extends Window
+
+enum DirTarget {SETTINGS, COMPONENTS, TEMPLATES}
+enum ConfirmPurpose {RESET, OK}
+
+const THEME: Theme = preload("res://addons/ggs/editor/_theme/ggs_theme.tres")
+const TEMPLATE: Script = preload("res://addons/ggs/template.gd")
+const GGS_SCENE: String = "res://addons/ggs/classes/global/ggs.tscn"
+
+@export_multiline var reset_text: String
+@export_multiline var ok_text: String
+
+@onready var OkBtn: Button = %OkBtn
+@onready var CancelBtn: Button = %CancelBtn
+
+@onready var SDF: LineEdit = %SettingDirField
+@onready var CDF: LineEdit = %CompDirField
+@onready var TDF: LineEdit = %TemplatesDirField
+@onready var SFNF: LineEdit = %SaveFileNameField
+@onready var SFEF: LineEdit = %SaveFileExtensionField
+
+@onready var SDB: Button = %SettingDirBtn
+@onready var CDB: Button = %CompDirBtn
+@onready var TDB: Button = %TemplatesDirBtn
+@onready var DSW: FileDialog = $DirSelectionWindow
+
+@onready var ApplyOnChanged: CheckBox = %ApplyOnChanged
+@onready var GrabFocusOnMouseOver: CheckBox = %GrabFocusOnMouseOver
+@onready var SetSFXBtn: Button = %SetSFXBtn
+
+@onready var UpdateThemeBtn: Button = %UpdateThemeBtn
+@onready var BaseTemplateBtn: Button = %BaseTemplateBtn
+@onready var ResetBtn: Button = %ResetBtn
+@onready var CRW: ConfirmationDialog = $ConfirmWindow
+
+@onready var VersionBtn: Button = %VersionBtn
+@onready var ChangelogBtn: Button = %ChangelogBtn
+
+
+func _ready() -> void:
+       about_to_popup.connect(_on_about_to_popup)
+       close_requested.connect(_on_close_requested)
+       CancelBtn.pressed.connect(_on_close_requested)
+       OkBtn.pressed.connect(_on_OkBtn_pressed)
+       
+       SDB.pressed.connect(_on_AnyDirectoryBtn_pressed.bind(SDB))
+       CDB.pressed.connect(_on_AnyDirectoryBtn_pressed.bind(CDB))
+       TDB.pressed.connect(_on_AnyDirectoryBtn_pressed.bind(TDB))
+       DSW.dir_selected.connect(_on_DSW_dir_selected)
+       
+       UpdateThemeBtn.pressed.connect(_on_UpdateThemeBtn_pressed)
+       BaseTemplateBtn.pressed.connect(_on_BaseTemplateBtn_pressed)
+       ResetBtn.pressed.connect(_on_ResetBtn_pressed)
+       CRW.confirmed.connect(_on_CRW_confirmed)
+       
+       SetSFXBtn.pressed.connect(_on_SetSFXBtn_pressed)
+       
+       VersionBtn.pressed.connect(_on_VersionBtn_pressed)
+       ChangelogBtn.pressed.connect(_on_ChangelogBtn_pressed)
+       
+       hide()
+
+
+### Info Buttons
+
+func _on_VersionBtn_pressed() -> void:
+       var URI: String = "https://github.com/PunchablePlushie/godot-game-settings/releases"
+       OS.shell_open(URI)
+
+
+func _on_ChangelogBtn_pressed() -> void:
+       var URI: String = "https://github.com/PunchablePlushie/godot-game-settings/tree/main/docs/changelog.md"
+       OS.shell_open(URI)
+
+
+### Fields
+
+func _init_values() -> void:
+       var data: ggsPluginData = ggsUtils.get_plugin_data()
+       SDF.text = data.dir_settings
+       CDF.text = data.dir_components
+       TDF.text = data.dir_templates
+       ApplyOnChanged.button_pressed = data.apply_on_changed_all
+       GrabFocusOnMouseOver.button_pressed = data.grab_focus_on_mouse_over_all
+       
+       var value: String = data.dir_save_file
+       SFNF.text = value.get_file().get_basename()
+       SFEF.text = value.get_extension()
+
+
+func _on_AnyDirectoryBtn_pressed(src: Button) -> void:
+       var target: String
+       
+       match src:
+               SDB:
+                       DSW.set_meta("target", DirTarget.SETTINGS)
+               CDB:
+                       DSW.set_meta("target", DirTarget.COMPONENTS)
+               TDB:
+                       DSW.set_meta("target", DirTarget.TEMPLATES)
+       
+       DSW.invalidate()
+       DSW.popup_centered()
+
+
+func _on_DSW_dir_selected(dir: String) -> void:
+       var target_field: LineEdit
+       match DSW.get_meta("target"):
+               DirTarget.SETTINGS:
+                       target_field = SDF
+               DirTarget.COMPONENTS:
+                       target_field = CDF
+               DirTarget.TEMPLATES:
+                       target_field = TDF
+       
+       target_field.text = dir
+
+
+### Buttons
+
+func _on_SetSFXBtn_pressed() -> void:
+       ggsUtils.get_editor_interface().open_scene_from_path(GGS_SCENE)
+       hide()
+
+
+func _on_UpdateThemeBtn_pressed() -> void:
+       THEME.update()
+
+
+func _on_BaseTemplateBtn_pressed() -> void:
+       ggsUtils.get_editor_interface().inspect_object(TEMPLATE)
+       hide()
+
+
+func _on_ResetBtn_pressed() -> void:
+       CRW.dialog_text = reset_text
+       CRW.set_meta("purpose", ConfirmPurpose.RESET)
+       CRW.popup_centered()
+
+
+func _on_OkBtn_pressed() -> void:
+       CRW.dialog_text = ok_text
+       CRW.set_meta("purpose", ConfirmPurpose.OK)
+       CRW.popup_centered()
+
+
+func _on_CRW_confirmed() -> void:
+       match CRW.get_meta("purpose"):
+               ConfirmPurpose.RESET:
+                       ggsUtils.get_plugin_data().reset()
+                       
+                       hide()
+                       ggsUtils.get_editor_interface().set_plugin_enabled("ggs", false)
+               ConfirmPurpose.OK:
+                       var data: ggsPluginData = ggsUtils.get_plugin_data()
+                       data.set_property("dir_settings", SDF.text)
+                       data.set_property("dir_components", CDF.text)
+                       data.set_property("dir_templates", TDF.text)
+                       data.set_property("apply_on_changed_all", ApplyOnChanged.button_pressed)
+                       data.set_property("grab_focus_on_mouse_over_all", GrabFocusOnMouseOver.button_pressed)
+                       
+                       var value: String = "user://%s.%s"%[SFNF.text, SFEF.text]
+                       data.set_property("dir_save_file", value)
+                       
+                       hide()
+                       ggsUtils.get_editor_interface().set_plugin_enabled("ggs", false)
+
+
+### Window Functionalities
+
+func _on_about_to_popup() -> void:
+       _init_values()
+
+
+func _on_close_requested() -> void:
+       hide()
diff --git a/addons/ggs/editor/pref_window/pref_window.tscn b/addons/ggs/editor/pref_window/pref_window.tscn
new file mode 100644 (file)
index 0000000..7387667
--- /dev/null
@@ -0,0 +1,300 @@
+[gd_scene load_steps=5 format=3 uid="uid://c42mh74d7l2rt"]
+
+[ext_resource type="Script" path="res://addons/ggs/editor/pref_window/pref_window.gd" id="1_ihv6i"]
+[ext_resource type="Texture2D" uid="uid://badl61ealw70o" path="res://addons/ggs/assets/file_dialog.svg" id="2_qx4su"]
+[ext_resource type="Texture2D" uid="uid://bk0u7p6a1apta" path="res://addons/ggs/assets/icon_mini.svg" id="3_ggsp5"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ki5am"]
+
+[node name="PrefWindow" type="Window"]
+title = "GGS Preferences"
+position = Vector2i(0, 36)
+size = Vector2i(650, 500)
+visible = false
+wrap_controls = true
+exclusive = true
+min_size = Vector2i(650, 500)
+script = ExtResource("1_ihv6i")
+reset_text = "Are you sure you want to reset settings?
+A plugin restart is required and the plugin will be disabled automatically if confirmed."
+ok_text = "Confirm changes?
+A plugin restart is required and the plugin will be disabled automatically if confirmed."
+
+[node name="BgPanel" type="PanelContainer" parent="."]
+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
+theme_type_variation = &"PrefWindowBG"
+
+[node name="Margin" type="MarginContainer" parent="BgPanel"]
+layout_mode = 2
+theme_override_constants/margin_left = 5
+theme_override_constants/margin_top = 5
+theme_override_constants/margin_right = 5
+theme_override_constants/margin_bottom = 5
+
+[node name="MainCtnr" type="VBoxContainer" parent="BgPanel/Margin"]
+layout_mode = 2
+
+[node name="ScrollCtnr" type="ScrollContainer" parent="BgPanel/Margin/MainCtnr"]
+layout_mode = 2
+size_flags_vertical = 3
+follow_focus = true
+horizontal_scroll_mode = 0
+
+[node name="SettingsCtnr" type="VBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="DirectoriesSection" type="VBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr"]
+custom_minimum_size = Vector2(0, 150)
+layout_mode = 2
+
+[node name="SectionLabel" type="Label" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection"]
+layout_mode = 2
+text = "Directories"
+horizontal_alignment = 1
+
+[node name="HSep" type="HSeparator" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection"]
+layout_mode = 2
+
+[node name="SettingsDir" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection"]
+layout_mode = 2
+
+[node name="SettingDirLabel" type="Label" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SettingsDir"]
+custom_minimum_size = Vector2(180, 0)
+layout_mode = 2
+text = "Settings:"
+
+[node name="SettingDirField" type="LineEdit" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SettingsDir"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+caret_blink = true
+caret_blink_interval = 0.5
+
+[node name="SettingDirBtn" type="Button" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SettingsDir"]
+unique_name_in_owner = true
+layout_mode = 2
+icon = ExtResource("2_qx4su")
+
+[node name="ComponentDir" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection"]
+layout_mode = 2
+
+[node name="CompDirLabel" type="Label" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/ComponentDir"]
+custom_minimum_size = Vector2(180, 0)
+layout_mode = 2
+text = "Components:"
+
+[node name="CompDirField" type="LineEdit" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/ComponentDir"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+caret_blink = true
+caret_blink_interval = 0.5
+
+[node name="CompDirBtn" type="Button" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/ComponentDir"]
+unique_name_in_owner = true
+layout_mode = 2
+icon = ExtResource("2_qx4su")
+
+[node name="TemplatesDir" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection"]
+layout_mode = 2
+
+[node name="TemplatesDirLabel" type="Label" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/TemplatesDir"]
+custom_minimum_size = Vector2(180, 0)
+layout_mode = 2
+text = "Templates:"
+
+[node name="TemplatesDirField" type="LineEdit" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/TemplatesDir"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+caret_blink = true
+caret_blink_interval = 0.5
+
+[node name="TemplatesDirBtn" type="Button" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/TemplatesDir"]
+unique_name_in_owner = true
+layout_mode = 2
+icon = ExtResource("2_qx4su")
+
+[node name="SaveFileDir" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection"]
+layout_mode = 2
+size_flags_vertical = 8
+
+[node name="SaveFileDirLabel" type="Label" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SaveFileDir"]
+custom_minimum_size = Vector2(180, 0)
+layout_mode = 2
+text = "Save File:"
+
+[node name="HBox" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SaveFileDir"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="SaveFileBaseDirLabel" type="Label" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SaveFileDir/HBox"]
+layout_mode = 2
+size_flags_horizontal = 0
+text = "user://"
+
+[node name="SaveFileNameField" type="LineEdit" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SaveFileDir/HBox"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+placeholder_text = "file_name"
+
+[node name="SaveFileDotLabel" type="Label" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SaveFileDir/HBox"]
+layout_mode = 2
+size_flags_horizontal = 0
+text = "."
+
+[node name="SaveFileExtensionField" type="LineEdit" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SaveFileDir/HBox"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(100, 0)
+layout_mode = 2
+placeholder_text = "extension"
+
+[node name="ComponentsSection" type="VBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr"]
+layout_mode = 2
+
+[node name="HSep0" type="HSeparator" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/ComponentsSection"]
+layout_mode = 2
+
+[node name="SectionLabel" type="Label" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/ComponentsSection"]
+layout_mode = 2
+text = "Components"
+horizontal_alignment = 1
+
+[node name="HSep1" type="HSeparator" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/ComponentsSection"]
+layout_mode = 2
+
+[node name="ApplyOnChanged" type="CheckBox" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/ComponentsSection"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Set apply_on_changed to true by default."
+
+[node name="GrabFocusOnMouseOver" type="CheckBox" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/ComponentsSection"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Set grab_focus_on_mouse_over to true by default."
+
+[node name="SetSFXBtn" type="Button" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/ComponentsSection"]
+unique_name_in_owner = true
+layout_mode = 2
+text = "Set Component Sound Effects"
+
+[node name="MiscSection" type="VBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr"]
+layout_mode = 2
+size_flags_vertical = 0
+
+[node name="HSep" type="HSeparator" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/MiscSection"]
+layout_mode = 2
+
+[node name="HBox" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/MiscSection"]
+layout_mode = 2
+
+[node name="UpdateThemeBtn" type="Button" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/MiscSection/HBox"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+tooltip_text = "Update the GGS editor theme to match your current Godot editor theme."
+text = "Update Theme"
+
+[node name="BaseTemplateBtn" type="Button" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/MiscSection/HBox"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Edit Base Template"
+
+[node name="ResetBtn" type="Button" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/MiscSection/HBox"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 10
+text = "Reset"
+
+[node name="HSep" type="HSeparator" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr"]
+layout_mode = 2
+
+[node name="FooterCtnr" type="VBoxContainer" parent="BgPanel/Margin/MainCtnr"]
+layout_mode = 2
+size_flags_vertical = 8
+
+[node name="HSep0" type="HSeparator" parent="BgPanel/Margin/MainCtnr/FooterCtnr"]
+layout_mode = 2
+
+[node name="DisclaimerLabel" type="Label" parent="BgPanel/Margin/MainCtnr/FooterCtnr"]
+custom_minimum_size = Vector2(0, 21)
+layout_mode = 2
+size_flags_vertical = 8
+theme_override_styles/normal = SubResource("StyleBoxEmpty_ki5am")
+text = "※ All changes take effect after a plugin restart."
+
+[node name="HSep1" type="HSeparator" parent="BgPanel/Margin/MainCtnr/FooterCtnr"]
+layout_mode = 2
+
+[node name="HBox" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/FooterCtnr"]
+layout_mode = 2
+
+[node name="InfoCtnr" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/FooterCtnr/HBox"]
+layout_mode = 2
+size_flags_horizontal = 0
+theme_override_constants/separation = 2
+
+[node name="PluginInfo" type="Button" parent="BgPanel/Margin/MainCtnr/FooterCtnr/HBox/InfoCtnr"]
+layout_mode = 2
+size_flags_horizontal = 3
+focus_mode = 0
+mouse_filter = 2
+theme_override_constants/h_separation = 5
+text = "Godot Game Settings"
+icon = ExtResource("3_ggsp5")
+flat = true
+alignment = 0
+
+[node name="VersionBtn" type="Button" parent="BgPanel/Margin/MainCtnr/FooterCtnr/HBox/InfoCtnr"]
+unique_name_in_owner = true
+layout_mode = 2
+tooltip_text = "View Release"
+text = "3.1.0"
+
+[node name="ChangelogBtn" type="Button" parent="BgPanel/Margin/MainCtnr/FooterCtnr/HBox/InfoCtnr"]
+unique_name_in_owner = true
+layout_mode = 2
+tooltip_text = "View Changelog"
+text = "Changelog"
+
+[node name="BtnCtnr" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/FooterCtnr/HBox"]
+layout_mode = 2
+size_flags_horizontal = 10
+
+[node name="OkBtn" type="Button" parent="BgPanel/Margin/MainCtnr/FooterCtnr/HBox/BtnCtnr"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+size_flags_horizontal = 10
+text = "OK"
+
+[node name="CancelBtn" type="Button" parent="BgPanel/Margin/MainCtnr/FooterCtnr/HBox/BtnCtnr"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+size_flags_horizontal = 10
+text = "Cancel
+"
+
+[node name="DirSelectionWindow" type="FileDialog" parent="."]
+title = "Open a Directory"
+size = Vector2i(600, 500)
+min_size = Vector2i(600, 500)
+ok_button_text = "Select Current Folder"
+file_mode = 2
+metadata/target = 0
+
+[node name="ConfirmWindow" type="ConfirmationDialog" parent="."]
+size = Vector2i(497, 135)
+metadata/purpose = 0
diff --git a/addons/ggs/editor/setting_panel/groupless.gd b/addons/ggs/editor/setting_panel/groupless.gd
new file mode 100644 (file)
index 0000000..0ebf3a3
--- /dev/null
@@ -0,0 +1,14 @@
+@tool
+extends PanelContainer
+
+@onready var MainCtnr: HFlowContainer = $MainCtnr
+
+
+func clear() -> void:
+       var children: Array[Node] = MainCtnr.get_children()
+       for child in children:
+               child.queue_free()
+
+
+func add_item(item: Button) -> void:
+       MainCtnr.add_child(item)
diff --git a/addons/ggs/editor/setting_panel/setting_group/setting_group.gd b/addons/ggs/editor/setting_panel/setting_group/setting_group.gd
new file mode 100644 (file)
index 0000000..ea2b583
--- /dev/null
@@ -0,0 +1,24 @@
+@tool
+extends PanelContainer
+class_name ggsSettingGroup
+
+var path: String
+
+@onready var GroupName: CheckBox = $MainCtnr/GroupName
+@onready var ItemCtnr: HFlowContainer = $MainCtnr/ItemCtnr
+
+
+func add_item(item: Button) -> void:
+       ItemCtnr.add_child(item)
+
+
+func set_group_name(group_name: String) -> void:
+       GroupName.text = group_name
+
+
+func set_checked(checked: bool) -> void:
+       GroupName.button_pressed = checked
+
+
+func get_checked() -> bool:
+       return GroupName.button_pressed
diff --git a/addons/ggs/editor/setting_panel/setting_group/setting_group.tscn b/addons/ggs/editor/setting_panel/setting_group/setting_group.tscn
new file mode 100644 (file)
index 0000000..bbce967
--- /dev/null
@@ -0,0 +1,22 @@
+[gd_scene load_steps=2 format=3 uid="uid://d2qf13e27gjdi"]
+
+[ext_resource type="Script" path="res://addons/ggs/editor/setting_panel/setting_group/setting_group.gd" id="1_yot62"]
+
+[node name="SettingGroup" type="PanelContainer"]
+custom_minimum_size = Vector2(150, 0)
+size_flags_horizontal = 3
+theme_type_variation = &"SettingItemBG"
+script = ExtResource("1_yot62")
+
+[node name="MainCtnr" type="VBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="GroupName" type="CheckBox" parent="MainCtnr"]
+layout_mode = 2
+text_overrun_behavior = 3
+
+[node name="HSep" type="HSeparator" parent="MainCtnr"]
+layout_mode = 2
+
+[node name="ItemCtnr" type="HFlowContainer" parent="MainCtnr"]
+layout_mode = 2
diff --git a/addons/ggs/editor/setting_panel/setting_item/setting_item.gd b/addons/ggs/editor/setting_panel/setting_item/setting_item.gd
new file mode 100644 (file)
index 0000000..9bf7134
--- /dev/null
@@ -0,0 +1,39 @@
+@tool
+extends Button
+class_name ggsSettingItem
+
+var path: String
+var btn_group: ButtonGroup
+
+
+func _ready() -> void:
+       toggled.connect(_on_toggled)
+       gui_input.connect(_on_gui_input)
+       
+       button_group = btn_group
+
+
+func _on_toggled(button_state: bool) -> void:
+       if button_state == false:
+               return
+       
+       if not FileAccess.file_exists(path):
+               printerr("GGS - Inspect Setting: The setting resource (%s.tres) could not be found."%text)
+               ggsUtils.get_editor_interface().inspect_object(null)
+               return
+       
+       var setting_res: ggsSetting = load(path)
+       
+       if setting_res is ggsInputSetting:
+               setting_res.update_current_as_event()
+       
+       GGS.active_setting = setting_res
+       ggsUtils.get_editor_interface().inspect_object(setting_res)
+
+
+func _on_gui_input(event: InputEvent) -> void:
+       if (
+               event is InputEventMouseButton and
+               event.button_index == MOUSE_BUTTON_RIGHT
+       ):
+               ggsUtils.get_editor_interface().select_file(path)
diff --git a/addons/ggs/editor/setting_panel/setting_item/setting_item.tscn b/addons/ggs/editor/setting_panel/setting_item/setting_item.tscn
new file mode 100644 (file)
index 0000000..43cbf91
--- /dev/null
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://urg2uin42f3w"]
+
+[ext_resource type="Script" path="res://addons/ggs/editor/setting_panel/setting_item/setting_item.gd" id="1_pwscl"]
+
+[node name="SettingItem" type="Button"]
+toggle_mode = true
+script = ExtResource("1_pwscl")
diff --git a/addons/ggs/editor/setting_panel/setting_list.gd b/addons/ggs/editor/setting_panel/setting_list.gd
new file mode 100644 (file)
index 0000000..04d918a
--- /dev/null
@@ -0,0 +1,123 @@
+@tool
+extends ScrollContainer
+
+const setting_item_scn: PackedScene = preload("./setting_item/setting_item.tscn")
+const setting_group_scn: PackedScene = preload("./setting_group/setting_group.tscn")
+
+var cur_path: String
+var btn_group: ButtonGroup = ButtonGroup.new()
+
+@onready var MainCtnr: HFlowContainer = $PanelCtnr/MainCtnr
+@onready var GrouplessCtnr: PanelContainer = $PanelCtnr/MainCtnr/GroupLess
+
+
+func _ready() -> void:
+       GGS.active_category_changed.connect(_on_Global_active_category_changed)
+
+
+func load_list() -> void:
+       _clear()
+       
+       var item_list: Dictionary = _get_item_list()
+       var base_dir: String = ggsUtils.get_plugin_data().dir_settings.path_join(GGS.active_category)
+       
+       GrouplessCtnr.visible = !item_list["settings"].is_empty()
+       for setting in item_list["settings"]:
+               if setting.ends_with(".gd"):
+                       continue
+               
+               var setting_name: String = setting.get_basename()
+               cur_path = base_dir.path_join(setting)
+               _add_item(setting_name, GrouplessCtnr, cur_path)
+       
+       for group in item_list["groups"]:
+               cur_path = base_dir.path_join(group)
+               var parent: ggsSettingGroup = _add_group(group, cur_path)
+               
+               var dir: DirAccess = DirAccess.open(cur_path)
+               var settings: PackedStringArray = dir.get_files()
+               for setting in settings:
+                       if setting.ends_with(".gd"):
+                               continue
+                       
+                       var setting_name: String = setting.get_basename()
+                       cur_path = dir.get_current_dir().path_join(setting)
+                       _add_item(setting_name, parent, cur_path)
+
+
+func get_selected_groups() -> Array[Node]:
+       var result: Array[Node]
+       
+       var child_count: int = MainCtnr.get_child_count()
+       for child_index in range(child_count):
+               if child_index == 0:
+                       continue
+               
+               var child: ggsSettingGroup = MainCtnr.get_child(child_index)
+               var group_is_checked: bool = child.get_checked()
+               if group_is_checked:
+                       result.append(child)
+       
+       return result
+
+
+func set_checked_all(checked: bool) -> void:
+       var child_count: int = MainCtnr.get_child_count()
+       for child_index in range(child_count):
+               if child_index == 0:
+                       continue
+               
+               MainCtnr.get_child(child_index).set_checked(checked)
+
+
+func _clear() -> void:
+       btn_group = ButtonGroup.new()
+       GrouplessCtnr.visible = false
+       GGS.active_setting = null
+       
+       var child_count: int = MainCtnr.get_child_count()
+       for child_index in range(child_count):
+               if child_index == 0:
+                       MainCtnr.get_child(child_index).clear()
+                       continue
+               
+               MainCtnr.get_child(child_index).queue_free()
+
+
+func _add_item(setting: String, parent: PanelContainer, path: String) -> void:
+       var NewItem: ggsSettingItem = setting_item_scn.instantiate()
+       NewItem.text = setting
+       NewItem.path = path
+       NewItem.btn_group = btn_group
+       
+       parent.add_item(NewItem)
+
+
+func _add_group(group: String, path: String) -> ggsSettingGroup:
+       var NewGroup: ggsSettingGroup = setting_group_scn.instantiate()
+       NewGroup.path = path
+       
+       MainCtnr.add_child(NewGroup)
+       NewGroup.set_group_name(group)
+       return NewGroup
+
+
+func _on_Global_active_category_changed() -> void:
+       if GGS.active_category.is_empty():
+               _clear()
+       else:
+               load_list()
+
+
+### Get Item List
+
+func _get_item_list() -> Dictionary:
+       cur_path = ggsUtils.get_plugin_data().dir_settings.path_join(GGS.active_category)
+       var dir: DirAccess = DirAccess.open(cur_path)
+       var settings: PackedStringArray = dir.get_files()
+       var groups: Array = Array(dir.get_directories()).filter(_remove_underscored)
+       return {"settings": settings, "groups": groups}
+
+
+func _remove_underscored(element: String) -> bool:
+       return not element.begins_with("_")
diff --git a/addons/ggs/editor/setting_panel/setting_panel.gd b/addons/ggs/editor/setting_panel/setting_panel.gd
new file mode 100644 (file)
index 0000000..57a2e3b
--- /dev/null
@@ -0,0 +1,179 @@
+@tool
+extends Control
+
+const TEMPLATE_SCRIPT: GDScript = preload("res://addons/ggs/template.gd")
+
+@export var Notification: AcceptDialog
+
+@onready var AddBtn: Button = %AddBtn
+@onready var NSF: LineEdit = %NewSettingField
+@onready var NGF: LineEdit = %NewGroupField
+@onready var CheckAllBtn: Button = %CheckAllBtn
+@onready var UncheckAllBtn: Button = %UncheckAllBtn
+@onready var ReloadBtn: Button = %ReloadBtn
+@onready var List: ScrollContainer = %SettingList
+@onready var ASW: ConfirmationDialog = $AddSettingWindow
+
+
+func _ready() -> void:
+       AddBtn.pressed.connect(_on_AddBtn_pressed)
+       ASW.template_selected.connect(_on_ASW_template_selected)
+       
+       NSF.text_submitted.connect(_on_NSF_text_submitted)
+       NGF.text_submitted.connect(_on_NGF_text_submitted)
+       CheckAllBtn.pressed.connect(_on_CheckAllBtn_pressed)
+       UncheckAllBtn.pressed.connect(_on_UncheckAllBtn_pressed)
+       ReloadBtn.pressed.connect(_on_ReloadBtn_pressed)
+       
+       GGS.active_category_changed.connect(_on_Global_active_category_changed)
+       GGS.active_setting_changed.connect(_on_Global_active_setting_changed)
+       
+       AddBtn.disabled = true
+       NSF.editable = false
+       NGF.editable = false
+       CheckAllBtn.disabled = true
+       UncheckAllBtn.disabled = true
+       ReloadBtn.disabled = true
+
+
+func _set_topbar_disabled(disabled: bool) -> void:
+       AddBtn.disabled = disabled
+       NSF.editable = !disabled
+       NGF.editable = !disabled
+       CheckAllBtn.disabled = disabled
+       UncheckAllBtn.disabled = disabled
+       ReloadBtn.disabled = disabled
+
+
+func _on_Global_active_category_changed() -> void:
+       _set_topbar_disabled(GGS.active_category.is_empty())
+
+
+func _on_Global_active_setting_changed() -> void:
+       var active_list_item: Button = List.btn_group.get_pressed_button()
+       if GGS.active_setting == null and active_list_item != null:
+               active_list_item.button_pressed = false
+
+
+### Setting Creation
+
+func _create_setting(item_name: String, template_path: String = "") -> void:
+       GGS.progress_started.emit(GGS.Progress.ADD_SETTINGS)
+       
+       # A tiny delay so the progress_started signal can travel properly
+       await get_tree().create_timer(0.05).timeout 
+       
+       if (
+               not item_name.is_valid_filename() or
+               item_name.begins_with("_") or
+               item_name.begins_with(".")
+       ):
+               Notification.purpose = Notification.Purpose.INVALID
+               Notification.popup_centered()
+               GGS.progress_ended.emit()
+               return
+       
+       var paths: PackedStringArray
+       var selected_groups: Array[Node] = List.get_selected_groups()
+       if selected_groups.is_empty():
+               var category_path: String = ggsUtils.get_plugin_data().dir_settings.path_join(GGS.active_category)
+               paths.append(category_path)
+       else:
+               for group in selected_groups:
+                       paths.append(group.path)
+       
+       var dir: DirAccess = DirAccess.open("res://")
+       for path in paths:
+               dir.change_dir(path)
+               
+               if paths.size() == 1:
+                       if dir.file_exists("%s.tres"%item_name):
+                               Notification.purpose = Notification.Purpose.ALREADY_EXISTS
+                               Notification.popup_centered()
+                               GGS.progress_ended.emit()
+                               return
+               else:
+                       if dir.file_exists("%s.tres"%item_name):
+                               printerr("GGS - Add Setting to Multiple Groups: An item with this name already exists. Ignoring <%s>."%path.get_file())
+                               continue
+               
+               var script: Script
+               var script_path: String
+               if template_path.is_empty():
+                       script = TEMPLATE_SCRIPT.duplicate()
+                       script_path = "%s/%s.gd"%[dir.get_current_dir(), item_name]
+                       ResourceSaver.save(script, script_path)
+                       script = load(script_path)
+               else:
+                       script = load(template_path)
+               
+               var resource: ggsSetting = ggsSetting.new()
+               var res_path: String = "%s/%s.tres"%[dir.get_current_dir(), item_name]
+               resource.set_script(script)
+               ResourceSaver.save(resource, res_path)
+       
+       NSF.clear()
+       ggsUtils.get_resource_file_system().scan()
+       List.load_list()
+       GGS.progress_ended.emit()
+
+
+func _on_NSF_text_submitted(submitted_text: String) -> void:
+       _create_setting(submitted_text)
+
+
+### Group Creation
+
+func _create_group(group_name: String) -> void:
+       if (
+               not group_name.is_valid_filename() or
+               group_name.begins_with("_") or
+               group_name.begins_with(".")
+       ):
+               Notification.purpose = Notification.Purpose.INVALID
+               Notification.popup_centered()
+               return
+       
+       var path: String = ggsUtils.get_plugin_data().dir_settings.path_join(GGS.active_category)
+       var dir: DirAccess = DirAccess.open(path)
+       if dir.dir_exists(group_name):
+               Notification.purpose = Notification.Purpose.ALREADY_EXISTS
+               Notification.popup_centered()
+               return
+       
+       dir.make_dir(group_name)
+       
+       NGF.clear()
+       ggsUtils.get_resource_file_system().scan()
+       List.load_list()
+
+
+func _on_NGF_text_submitted(submitted_text: String) -> void:
+       _create_group(submitted_text)
+
+
+### Setting from Template
+
+func _on_AddBtn_pressed() -> void:
+       ASW.popup_centered()
+
+
+func _on_ASW_template_selected(template: String, setting_name: String) -> void:
+       _create_setting(setting_name, template)
+
+
+### Check/Uncheck Btns
+
+func _on_CheckAllBtn_pressed() -> void:
+       List.set_checked_all(true)
+
+
+func _on_UncheckAllBtn_pressed() -> void:
+       List.set_checked_all(false)
+
+
+### Reload Btn
+
+func _on_ReloadBtn_pressed() -> void:
+       List.load_list()
+
diff --git a/addons/ggs/editor/setting_panel/setting_panel.tscn b/addons/ggs/editor/setting_panel/setting_panel.tscn
new file mode 100644 (file)
index 0000000..9d49ce7
--- /dev/null
@@ -0,0 +1,114 @@
+[gd_scene load_steps=9 format=3 uid="uid://vt5mwwxhtu3x"]
+
+[ext_resource type="Script" path="res://addons/ggs/editor/setting_panel/setting_panel.gd" id="1_2wlv0"]
+[ext_resource type="Texture2D" uid="uid://bttv2hpecd38m" path="res://addons/ggs/assets/check_all.svg" id="3_bh7l7"]
+[ext_resource type="Texture2D" uid="uid://by345a10evjm8" path="res://addons/ggs/assets/add.svg" id="3_tdauq"]
+[ext_resource type="Script" path="res://addons/ggs/editor/setting_panel/setting_list.gd" id="4_htr8u"]
+[ext_resource type="Texture2D" uid="uid://ve54bl3r7ljc" path="res://addons/ggs/assets/reload.svg" id="4_j6whk"]
+[ext_resource type="Texture2D" uid="uid://romr61n4g5y5" path="res://addons/ggs/assets/uncheck_all.svg" id="4_q4gh6"]
+[ext_resource type="Script" path="res://addons/ggs/editor/setting_panel/groupless.gd" id="7_l1jd4"]
+[ext_resource type="PackedScene" uid="uid://111vt7wxn7lx" path="res://addons/ggs/editor/add_setting_window/add_setting_window.tscn" id="7_o4e63"]
+
+[node name="SettingPanel" type="Control"]
+custom_minimum_size = Vector2(342, 0)
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_2wlv0")
+
+[node name="MainCtnr" type="VBoxContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="TopBar" type="HBoxContainer" parent="MainCtnr"]
+layout_mode = 2
+
+[node name="AddBtn" type="Button" parent="MainCtnr/TopBar"]
+unique_name_in_owner = true
+layout_mode = 2
+tooltip_text = "Add Setting from Template"
+disabled = true
+icon = ExtResource("3_tdauq")
+flat = true
+
+[node name="NewSettingField" type="LineEdit" parent="MainCtnr/TopBar"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+placeholder_text = "New Setting..."
+editable = false
+clear_button_enabled = true
+
+[node name="NewGroupField" type="LineEdit" parent="MainCtnr/TopBar"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+placeholder_text = "New Group..."
+editable = false
+clear_button_enabled = true
+
+[node name="VSep" type="VSeparator" parent="MainCtnr/TopBar"]
+layout_mode = 2
+
+[node name="CheckAllBtn" type="Button" parent="MainCtnr/TopBar"]
+unique_name_in_owner = true
+layout_mode = 2
+tooltip_text = "Check All"
+disabled = true
+icon = ExtResource("3_bh7l7")
+flat = true
+
+[node name="UncheckAllBtn" type="Button" parent="MainCtnr/TopBar"]
+unique_name_in_owner = true
+layout_mode = 2
+tooltip_text = "Uncheck All"
+disabled = true
+icon = ExtResource("4_q4gh6")
+flat = true
+
+[node name="ReloadBtn" type="Button" parent="MainCtnr/TopBar"]
+unique_name_in_owner = true
+layout_mode = 2
+tooltip_text = "Reload List"
+disabled = true
+icon = ExtResource("4_j6whk")
+flat = true
+
+[node name="SettingList" type="ScrollContainer" parent="MainCtnr"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_vertical = 3
+horizontal_scroll_mode = 0
+script = ExtResource("4_htr8u")
+
+[node name="PanelCtnr" type="PanelContainer" parent="MainCtnr/SettingList"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+theme_type_variation = &"SettingListBG"
+
+[node name="MainCtnr" type="HFlowContainer" parent="MainCtnr/SettingList/PanelCtnr"]
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_constants/h_separation = 10
+theme_override_constants/v_separation = 10
+
+[node name="GroupLess" type="PanelContainer" parent="MainCtnr/SettingList/PanelCtnr/MainCtnr"]
+visible = false
+custom_minimum_size = Vector2(150, 0)
+layout_mode = 2
+size_flags_horizontal = 3
+theme_type_variation = &"SettingItemBG"
+script = ExtResource("7_l1jd4")
+
+[node name="MainCtnr" type="HFlowContainer" parent="MainCtnr/SettingList/PanelCtnr/MainCtnr/GroupLess"]
+layout_mode = 2
+
+[node name="AddSettingWindow" parent="." instance=ExtResource("7_o4e63")]
diff --git a/addons/ggs/plugin.cfg b/addons/ggs/plugin.cfg
new file mode 100644 (file)
index 0000000..a866694
--- /dev/null
@@ -0,0 +1,7 @@
+[plugin]
+
+name="Godot Game Settings"
+description="Create and manage game settings."
+author="PunchablePlushie"
+version="3.1.0"
+script="plugin.gd"
diff --git a/addons/ggs/plugin.gd b/addons/ggs/plugin.gd
new file mode 100644 (file)
index 0000000..64a78bb
--- /dev/null
@@ -0,0 +1,49 @@
+@tool
+extends EditorPlugin
+
+var main_panel_scn: PackedScene = preload("./editor/main_panel/main_panel.tscn")
+var inspector_plugin: EditorInspectorPlugin = ggsInspectorPlugin.new()
+var MainPanel: Control
+
+
+func _enter_tree() -> void:
+       _add_editor_interface_singleton()
+       _add_plugin_singleton()
+       _add_editor()
+       add_inspector_plugin(inspector_plugin)
+
+
+func _exit_tree() -> void:
+       _remove_editor_interface_singleton()
+       _remove_editor()
+       remove_inspector_plugin(inspector_plugin)
+
+
+### Singletons
+
+func _add_editor_interface_singleton() -> void:
+       if not Engine.has_singleton("ggsEI"):
+               Engine.register_singleton("ggsEI", get_editor_interface())
+
+
+func _remove_editor_interface_singleton() -> void:
+       if Engine.has_singleton("ggsEI"):
+               Engine.unregister_singleton("ggsEI")
+
+
+func _add_plugin_singleton() -> void:
+       if not ProjectSettings.has_setting("autoload/GGS"):
+               add_autoload_singleton("GGS", "res://addons/ggs/classes/global/ggs.tscn")
+
+
+### Main Editor
+
+func _add_editor() -> void:
+       MainPanel = main_panel_scn.instantiate()
+       add_control_to_bottom_panel(MainPanel, "Game Settings")
+
+
+func _remove_editor() -> void:
+       if MainPanel:
+               remove_control_from_bottom_panel(MainPanel)
+               MainPanel.queue_free()
diff --git a/addons/ggs/plugin_data.tres b/addons/ggs/plugin_data.tres
new file mode 100644 (file)
index 0000000..7450f7e
--- /dev/null
@@ -0,0 +1,15 @@
+[gd_resource type="Resource" script_class="ggsPluginData" load_steps=2 format=3 uid="uid://dpk53al471l8m"]
+
+[ext_resource type="Script" path="res://addons/ggs/classes/resources/ggs_plugin_data.gd" id="1_wabe0"]
+
+[resource]
+script = ExtResource("1_wabe0")
+recent_settings = Array[String]([])
+apply_on_changed_all = true
+grab_focus_on_mouse_over_all = true
+dir_settings = "res://game_settings/settings"
+dir_templates = "res://game_settings/templates"
+dir_components = "res://game_settings/components"
+dir_save_file = "user://settings.cfg"
+split_offset_0 = -315
+split_offset_1 = 615
diff --git a/addons/ggs/template.gd b/addons/ggs/template.gd
new file mode 100644 (file)
index 0000000..fcc0b99
--- /dev/null
@@ -0,0 +1,6 @@
+@tool
+extends ggsSetting
+
+
+func apply(value: Variant) -> void:
+       pass
diff --git a/addons/godot-git-plugin/LICENSE b/addons/godot-git-plugin/LICENSE
new file mode 100644 (file)
index 0000000..f153fb8
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016-2023 The Godot Engine community
+
+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/godot-git-plugin/THIRDPARTY.md b/addons/godot-git-plugin/THIRDPARTY.md
new file mode 100644 (file)
index 0000000..837488f
--- /dev/null
@@ -0,0 +1,1349 @@
+# Third-Party Notices
+
+The Godot Git Plugin source code uses the following third-party source code:
+
+1. godotengine/godot-cpp - MIT License - https://github.com/godotengine/godot-cpp/tree/02336831735fd6affbe0a6fa252ec98d3e78120c
+2. libgit2/libgit2 - GPLv2 with a special Linking Exception - https://github.com/libgit2/libgit2/tree/b7bad55e4bb0a285b073ba5e02b01d3f522fc95d
+3. libssh2/libssh2 - BSD-3-Clause License - https://github.com/libssh2/libssh2/tree/635caa90787220ac3773c1d5ba11f1236c22eae8
+
+We also link to these third-party libraries (only in the compiled binary form):
+
+1. OpenSSL - Only on Linux and MacOS - OpenSSL License - http://www.openssl.org/source/openssl-1.1.1s.tar.gz
+
+## License Texts
+
+### godotengine/godot-cpp
+
+```
+# MIT License
+
+Copyright (c) 2017-2022 Godot Engine contributors.
+
+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.
+```
+
+### libgit2/libgit2
+
+```
+ libgit2 is Copyright (C) the libgit2 contributors,
+ unless otherwise stated. See the AUTHORS file for details.
+
+ Note that the only valid version of the GPL as far as this project
+ is concerned is _this_ particular version of the license (ie v2, not
+ v2.2 or v3.x or whatever), unless explicitly otherwise stated.
+
+----------------------------------------------------------------------
+
+                       LINKING EXCEPTION
+
+ In addition to the permissions in the GNU General Public License,
+ the authors give you unlimited permission to link the compiled
+ version of this library into combinations with other programs,
+ and to distribute those combinations without any restriction
+ coming from the use of this file.  (The General Public License
+ restrictions do apply in other respects; for example, they cover
+ modification of the file, and distribution when not linked into
+ a combined executable.)
+
+----------------------------------------------------------------------
+
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+----------------------------------------------------------------------
+
+The bundled ZLib code is licensed under the ZLib license:
+
+Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jean-loup Gailly        Mark Adler
+  [email protected]          [email protected]
+
+----------------------------------------------------------------------
+
+The Clar framework is licensed under the ISC license:
+
+Copyright (c) 2011-2015 Vicent Marti
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+----------------------------------------------------------------------
+
+The regex library (deps/regex/) is licensed under the GNU LGPL
+(available at the end of this file).
+
+Definitions for data structures and routines for the regular
+expression library.
+
+Copyright (C) 1985,1989-93,1995-98,2000,2001,2002,2003,2005,2006,2008
+Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with the GNU C Library; if not, write to the Free
+Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+----------------------------------------------------------------------
+
+The bundled winhttp definition files (deps/winhttp/) are licensed under
+the GNU LGPL (available at the end of this file).
+
+Copyright (C) 2007 Francois Gouget
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+----------------------------------------------------------------------
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+\f
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+\f
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+\f
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+\f
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+\f
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+\f
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+\f
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+\f
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+----------------------------------------------------------------------
+
+The bundled SHA1 collision detection code is licensed under the MIT license:
+
+MIT License
+
+Copyright (c) 2017:
+    Marc Stevens
+    Cryptology Group
+    Centrum Wiskunde & Informatica
+    P.O. Box 94079, 1090 GB Amsterdam, Netherlands
+
+    Dan Shumow
+    Microsoft Research
+
+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.
+
+----------------------------------------------------------------------
+
+The bundled wildmatch code is licensed under the BSD license:
+
+Copyright Rich Salz.
+All rights reserved.
+
+Redistribution and use in any form are permitted provided that the
+following restrictions are are met:
+
+1.  Source distributions must retain this entire copyright notice
+    and comment.
+2.  Binary distributions must include the acknowledgement ``This
+    product includes software developed by Rich Salz'' in the
+    documentation or other materials provided with the
+    distribution.  This must not be represented as an endorsement
+   or promotion without specific prior written permission.
+3.  The origin of this software must not be misrepresented, either
+    by explicit claim or by omission.  Credits must appear in the
+    source and documentation.
+4.  Altered versions must be plainly marked as such in the source
+    and documentation and must not be misrepresented as being the
+    original software.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+----------------------------------------------------------------------
+
+Portions of the OpenSSL headers are included under the OpenSSL license:
+
+Copyright (C) 1995-1998 Eric Young ([email protected])
+All rights reserved.
+
+This package is an SSL implementation written
+by Eric Young ([email protected]).
+The implementation was written so as to conform with Netscapes SSL.
+
+This library is free for commercial and non-commercial use as long as
+the following conditions are aheared to.  The following conditions
+apply to all code found in this distribution, be it the RC4, RSA,
+lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+included with this distribution is covered by the same copyright terms
+except that the holder is Tim Hudson ([email protected]).
+
+Copyright remains Eric Young's, and as such any Copyright notices in
+the code are not to be removed.
+If this package is used in a product, Eric Young should be given attribution
+as the author of the parts of the library used.
+This can be in the form of a textual message at program startup or
+in documentation (online or textual) provided with the package.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. All advertising materials mentioning features or use of this software
+   must display the following acknowledgement:
+   "This product includes cryptographic software written by
+    Eric Young ([email protected])"
+   The word 'cryptographic' can be left out if the rouines from the library
+   being used are not cryptographic related :-).
+4. If you include any Windows specific code (or a derivative thereof) from
+   the apps directory (application code) you must include an acknowledgement:
+   "This product includes software written by Tim Hudson ([email protected])"
+
+THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+The licence and distribution terms for any publically available version or
+derivative of this code cannot be changed.  i.e. this code cannot simply be
+copied and put under another distribution licence
+[including the GNU Public Licence.]
+
+====================================================================
+Copyright (c) 1998-2007 The OpenSSL Project.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the
+   distribution.
+
+3. All advertising materials mentioning features or use of this
+   software must display the following acknowledgment:
+   "This product includes software developed by the OpenSSL Project
+   for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+
+4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+   endorse or promote products derived from this software without
+   prior written permission. For written permission, please contact
+
+5. Products derived from this software may not be called "OpenSSL"
+   nor may "OpenSSL" appear in their names without prior written
+   permission of the OpenSSL Project.
+
+6. Redistributions of any form whatsoever must retain the following
+   acknowledgment:
+   "This product includes software developed by the OpenSSL Project
+   for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+
+THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+OF THE POSSIBILITY OF SUCH DAMAGE.
+```
+
+### libssh2/libssh2
+
+```
+/* Copyright (c) 2004-2007 Sara Golemon <[email protected]>
+ * Copyright (c) 2005,2006 Mikhail Gusarov <[email protected]>
+ * Copyright (c) 2006-2007 The Written Word, Inc.
+ * Copyright (c) 2007 Eli Fant <[email protected]>
+ * Copyright (c) 2009-2021 Daniel Stenberg
+ * Copyright (C) 2008, 2009 Simon Josefsson
+ * Copyright (c) 2000 Markus Friedl
+ * Copyright (c) 2015 Microsoft Corp.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ *   Redistributions of source code must retain the above
+ *   copyright notice, this list of conditions and the
+ *   following disclaimer.
+ *
+ *   Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials
+ *   provided with the distribution.
+ *
+ *   Neither the name of the copyright holder nor the names
+ *   of any other contributors may be used to endorse or
+ *   promote products derived from this software without
+ *   specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ */
+```
+
+### OpenSSL
+
+```
+
+  LICENSE ISSUES
+  ==============
+
+  The OpenSSL toolkit stays under a double license, i.e. both the conditions of
+  the OpenSSL License and the original SSLeay license apply to the toolkit.
+  See below for the actual license texts.
+
+  OpenSSL License
+  ---------------
+
+/* ====================================================================
+ * Copyright (c) 1998-2019 The OpenSSL Project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ *    software must display the following acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For written permission, please contact
+ *    [email protected].
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ *    nor may "OpenSSL" appear in their names without prior written
+ *    permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * ([email protected]).  This product includes software written by Tim
+ * Hudson ([email protected]).
+ *
+ */
+
+ Original SSLeay License
+ -----------------------
+
+/* Copyright (C) 1995-1998 Eric Young ([email protected])
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young ([email protected]).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson ([email protected]).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young ([email protected])"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson ([email protected])"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+```
diff --git a/addons/godot-git-plugin/git_plugin.gdextension b/addons/godot-git-plugin/git_plugin.gdextension
new file mode 100644 (file)
index 0000000..49fffbf
--- /dev/null
@@ -0,0 +1,12 @@
+[configuration]
+
+entry_symbol = "git_plugin_init"
+compatibility_minimum = "4.1.0"
+
+[libraries]
+
+macos.editor = "macos/libgit_plugin.macos.editor.universal.dylib"
+windows.editor.x86_64 = "win64/libgit_plugin.windows.editor.x86_64.dll"
+linux.editor.x86_64 = "linux/libgit_plugin.linux.editor.x86_64.so"
+linux.editor.arm64 = "linux/libgit_plugin.linux.editor.arm64.so"
+linux.editor.rv64 = ""
diff --git a/addons/godot-git-plugin/linux/libgit_plugin.linux.editor.x86_64.so b/addons/godot-git-plugin/linux/libgit_plugin.linux.editor.x86_64.so
new file mode 100644 (file)
index 0000000..3e4694e
Binary files /dev/null and b/addons/godot-git-plugin/linux/libgit_plugin.linux.editor.x86_64.so differ
diff --git a/addons/godot-git-plugin/macos/libgit_plugin.macos.editor.universal.dylib b/addons/godot-git-plugin/macos/libgit_plugin.macos.editor.universal.dylib
new file mode 100644 (file)
index 0000000..dc22ff3
Binary files /dev/null and b/addons/godot-git-plugin/macos/libgit_plugin.macos.editor.universal.dylib differ
diff --git a/addons/godot-git-plugin/plugin.cfg b/addons/godot-git-plugin/plugin.cfg
new file mode 100644 (file)
index 0000000..209e13f
--- /dev/null
@@ -0,0 +1,7 @@
+[plugin]
+
+name="Godot Git Plugin"
+description="This plugin lets you interact with Git without leaving the Godot editor. More information can be found at https://github.com/godotengine/godot-git-plugin/wiki"
+author="twaritwaikar"
+version="v3.1.0"
+script="godot-git-plugin.gd"
diff --git a/addons/godot-git-plugin/win64/libgit_plugin.windows.editor.x86_64.dll b/addons/godot-git-plugin/win64/libgit_plugin.windows.editor.x86_64.dll
new file mode 100644 (file)
index 0000000..60e5fe6
Binary files /dev/null and b/addons/godot-git-plugin/win64/libgit_plugin.windows.editor.x86_64.dll differ
diff --git a/addons/godot-git-plugin/win64/libgit_plugin.windows.editor.x86_64.exp b/addons/godot-git-plugin/win64/libgit_plugin.windows.editor.x86_64.exp
new file mode 100644 (file)
index 0000000..d5c91fe
Binary files /dev/null and b/addons/godot-git-plugin/win64/libgit_plugin.windows.editor.x86_64.exp differ
diff --git a/addons/godot-git-plugin/win64/libgit_plugin.windows.editor.x86_64.lib b/addons/godot-git-plugin/win64/libgit_plugin.windows.editor.x86_64.lib
new file mode 100644 (file)
index 0000000..98c9b4b
Binary files /dev/null and b/addons/godot-git-plugin/win64/libgit_plugin.windows.editor.x86_64.lib differ
diff --git a/addons/health_bar_2d/LICENSE.md b/addons/health_bar_2d/LICENSE.md
new file mode 100644 (file)
index 0000000..5cb1c0c
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Ashutosh Vishu Yadav
+
+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/health_bar_2d/README.md b/addons/health_bar_2d/README.md
new file mode 100644 (file)
index 0000000..2817b87
--- /dev/null
@@ -0,0 +1,48 @@
+# HealthBar2D
+
+<p align="center">
+  <img height="150px" src="https://user-images.githubusercontent.com/66784253/211215415-80537f1b-c3b8-42ea-90ea-bf20cdafd01e.png" alt="addon-icon"/>
+</p>
+
+
+> Note: this addon is under development/testing right now
+
+A 2d Health bar implementation for the Godot Engine, written in GDScript.
+
+This project is a Godot Engine addon that adds a HealthBar2D node to the editor. It extends the TextureProgress node and can be used to make various Progress bars that can represent Health, Stamina, Hunger, etc. It is released under the terms of the MIT License.
+
+## Installation
+- Clone this repository and move the content of the addons directory into the `res://addons` of your project
+- In your project settings, enable the plugin
+
+## Usage
+After enabling, it will add a HealthBar2D node.
+- Add this node as a child of the character you like
+- As it extends from TextureProgress it will require texture. You can use the given `health_bar_texture.png` in the resources directory of the addon.
+- resize the `Rect` control property by clicking the circular arrow in the Inspector
+- Now you need two things in the parent character script. the `health` variable and the `health_changed` signal
+
+```gdscript
+extends KinematicBody2D  # example
+
+signal health_changed
+
+var health := 10
+```
+- Before running the project. you also need to call the `initialize` method from the parent
+
+> One can add multiple bars using `HealthBar2D` and handle value change logic inside character script, just remember to `emit` the related `signal`.
+```gdscript
+func _ready() -> void:
+    $HealthBar2D.initialize("health_changed", health)
+```
+- Now whenever the character takes damage, emit our `health_changed` signal with the current health.
+
+
+```gdscript
+emit_signal("health_changed", health)
+```
+
+Thats it!
+
+You can take a look at `example.tscn` scene in the `example` directory for a working example.
diff --git a/addons/health_bar_2d/addon.gd b/addons/health_bar_2d/addon.gd
new file mode 100644 (file)
index 0000000..6a1a7db
--- /dev/null
@@ -0,0 +1,13 @@
+@tool
+extends EditorPlugin
+
+var icon = preload("res://addons/health_bar_2d/icon.png")
+var health_bar_2d = preload("res://addons/health_bar_2d/health_bar_2d.gd")
+
+
+func _enter_tree():
+       add_custom_type("HealthBar2D", "TextureProgressBar", health_bar_2d, icon)
+
+
+func _exit_tree():
+       remove_custom_type("HealthBar2D")
diff --git a/addons/health_bar_2d/examples/bullet.gd b/addons/health_bar_2d/examples/bullet.gd
new file mode 100644 (file)
index 0000000..25d1699
--- /dev/null
@@ -0,0 +1,22 @@
+extends Area2D
+
+@onready var vn = $VN
+
+var direction := Vector2.ZERO
+var _speed := 200
+
+
+func _ready() -> void:
+       connect("body_entered", _detected)
+       vn.connect("screen_exited", queue_free)
+       rotation = direction.angle()
+
+
+func _process(delta) -> void:
+       position += direction * delta * _speed
+
+
+func _detected(body: Node2D) -> void:
+       if body.name == "Player":
+               body.hurt()
+               queue_free()
diff --git a/addons/health_bar_2d/examples/bullet.tscn b/addons/health_bar_2d/examples/bullet.tscn
new file mode 100644 (file)
index 0000000..ea110db
--- /dev/null
@@ -0,0 +1,18 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/health_bar_2d/examples/bullet.gd" type="Script" id=1]
+
+[node name="Bullet" type="Area2D"]
+collision_layer = 2
+collision_mask = 17
+script = ExtResource( 1 )
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."]
+polygon = PackedVector2Array( 0, 0, -2, -2, -2, 2 )
+
+[node name="Polygon2D" type="Polygon2D" parent="."]
+position = Vector2( 0, -0.5 )
+scale = Vector2( 2, 1.5 )
+polygon = PackedVector2Array( -1, -1, -1, 1.66667, 0, 0.333333 )
+
+[node name="VN" type="VisibleOnScreenNotifier2D" parent="."]
diff --git a/addons/health_bar_2d/examples/example.tscn b/addons/health_bar_2d/examples/example.tscn
new file mode 100644 (file)
index 0000000..a17dd25
--- /dev/null
@@ -0,0 +1,57 @@
+[gd_scene load_steps=6 format=3 uid="uid://1lstnl4xitt7"]
+
+[ext_resource type="PackedScene" path="res://addons/health_bar_2d/examples/player.tscn" id="1"]
+[ext_resource type="Script" path="res://addons/health_bar_2d/health_bar_2d.gd" id="2"]
+[ext_resource type="PackedScene" uid="uid://b7w7epnvdwsos" path="res://addons/health_bar_2d/examples/turrent.tscn" id="3"]
+[ext_resource type="PackedScene" path="res://addons/health_bar_2d/examples/heal.tscn" id="4"]
+[ext_resource type="Texture2D" uid="uid://cnjw8wn77f05i" path="res://addons/health_bar_2d/resources/health_bar_texture.png" id="5"]
+
+[node name="World" type="Node2D"]
+
+[node name="Label" type="Label" parent="."]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+text = "Use Arrow keys to move, SHIFT to sprint"
+
+[node name="Player" parent="." instance=ExtResource("1")]
+position = Vector2(237, 152)
+
+[node name="HealthBar2D" type="TextureProgressBar" parent="Player"]
+value = 5.0
+texture_under = ExtResource("5")
+texture_progress = ExtResource("5")
+tint_under = Color(0.105882, 0.105882, 0.105882, 0.858824)
+tint_progress = Color(1, 0, 0, 1)
+script = ExtResource("2")
+_animation_timeout = 0.5
+_offset = Vector2(0, -16)
+
+[node name="HealthBar2D2" type="TextureProgressBar" parent="Player"]
+value = 50.0
+texture_under = ExtResource("5")
+texture_progress = ExtResource("5")
+tint_under = Color(0.117647, 0.117647, 0.117647, 0.698039)
+tint_progress = Color(0.988235, 1, 0.592157, 1)
+script = ExtResource("2")
+_animation_timeout = 0.5
+_offset = Vector2(0, -22)
+
+[node name="Camera2D" type="Camera2D" parent="."]
+position = Vector2(256, 148)
+
+[node name="Turrent" parent="." instance=ExtResource("3")]
+position = Vector2(121, 202)
+
+[node name="Turrent2" parent="." instance=ExtResource("3")]
+position = Vector2(97, 59)
+
+[node name="Turrent3" parent="." instance=ExtResource("3")]
+position = Vector2(405, 77)
+
+[node name="Turrent4" parent="." instance=ExtResource("3")]
+position = Vector2(358, 221)
+
+[node name="Heal" parent="." instance=ExtResource("4")]
+position = Vector2(246, 134)
+collision_mask = 16
diff --git a/addons/health_bar_2d/examples/heal.gd b/addons/health_bar_2d/examples/heal.gd
new file mode 100644 (file)
index 0000000..8903bf1
--- /dev/null
@@ -0,0 +1,13 @@
+extends Area2D
+
+@export var _heal_power := 10
+
+
+func _ready() -> void:
+       connect("body_entered", _heal)
+
+
+func _heal(body: Node) -> void:
+       if body.name == "Player":
+               body.health = _heal_power
+               body.emit_signal("health_changed", body.health)
diff --git a/addons/health_bar_2d/examples/heal.tscn b/addons/health_bar_2d/examples/heal.tscn
new file mode 100644 (file)
index 0000000..4a4b5af
--- /dev/null
@@ -0,0 +1,28 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/health_bar_2d/examples/heal.gd" type="Script" id=1]
+
+[sub_resource type="CircleShape2D" id=1]
+radius = 29.0172
+
+[node name="Heal" type="Area2D"]
+script = ExtResource( 1 )
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+visible = false
+shape = SubResource( 1 )
+
+[node name="Polygon2D" type="Polygon2D" parent="."]
+z_index = -1
+color = Color( 0.207843, 0.278431, 0.34902, 0.439216 )
+polygon = PackedVector2Array( 0, -29, -7, -28, -16, -24, -22, -19, -25, -13, -29, -6, -28, 4, -24, 16, -15, 25, -6, 29, 6, 29, 15, 25, 21, 21, 25, 15, 29, 7, 29, -4, 26, -12, 20, -21, 15, -25, 7, -28 )
+
+[node name="Label" type="Label" parent="."]
+modulate = Color( 1, 1, 1, 0.345098 )
+offset_left = -20.0
+offset_top = -6.0
+offset_right = 20.0
+offset_bottom = 8.0
+text = "heal"
+align = 1
+valign = 1
diff --git a/addons/health_bar_2d/examples/player.gd b/addons/health_bar_2d/examples/player.gd
new file mode 100644 (file)
index 0000000..194918e
--- /dev/null
@@ -0,0 +1,41 @@
+extends CharacterBody2D
+
+# Need to be added to use the HealthBar2D
+signal health_changed
+signal stamina_changed
+
+var direction = Vector2.ZERO
+var speed := 100
+var sprint_speed := 150
+# Need to be added to use the HealthBar2D
+var health := 10
+var max_stamina := 50.0
+var stamina := max_stamina
+
+
+func _ready() -> void:
+       # Need to be called to use the HealthBar2D
+       $HealthBar2D.initialize("health_changed", health)
+       $HealthBar2D2.initialize("stamina_changed", max_stamina)
+
+
+func _process(delta) -> void:
+       direction.x = int(Input.is_action_pressed("ui_right")) - int(Input.is_action_pressed("ui_left"))
+       direction.y = int(Input.is_action_pressed("ui_down")) - int(Input.is_action_pressed("ui_up"))
+       velocity = direction.normalized() * speed
+               
+       if Input.is_action_pressed("sprint") and stamina > 0:
+               velocity = direction.normalized() * sprint_speed
+               stamina -= 0.5
+               emit_signal("stamina_changed", stamina)
+       elif stamina < max_stamina:
+               stamina += 0.2
+               emit_signal("stamina_changed", stamina)
+       
+       move_and_slide()
+
+
+func hurt() -> void:
+       if health > 0:
+               health -= 1
+               emit_signal("health_changed", health)
diff --git a/addons/health_bar_2d/examples/player.tscn b/addons/health_bar_2d/examples/player.tscn
new file mode 100644 (file)
index 0000000..b8c7799
--- /dev/null
@@ -0,0 +1,27 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/health_bar_2d/examples/player.gd" type="Script" id=1]
+
+[sub_resource type="CircleShape2D" id=1]
+radius = 12.1655
+
+[node name="Player" type="CharacterBody2D"]
+collision_layer = 16
+collision_mask = 3
+script = ExtResource( 1 )
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+shape = SubResource( 1 )
+
+[node name="Polygon2D" type="Polygon2D" parent="."]
+position = Vector2( 9.53674e-07, 9.53674e-07 )
+scale = Vector2( 3.26804, 2.8943 )
+color = Color( 0.0705882, 0.290196, 0.34902, 1 )
+polygon = PackedVector2Array( 0, -4.83709, -2.14196, -3.62782, -3.21294, -2.41855, -3.21294, 1.20927, -2.14196, 3.62782, 0, 4.83709, 2.14196, 3.62782, 3.21294, 1.20927, 3.21294, -2.41855, 2.14196, -3.62782 )
+
+[node name="Polygon2D2" type="Polygon2D" parent="."]
+position = Vector2( 0, 2 )
+rotation = 3.14159
+scale = Vector2( 0.675475, 0.598226 )
+color = Color( 0.478431, 0.478431, 0.478431, 1 )
+polygon = PackedVector2Array( -2.87234, -0.216216, -1.91489, 0.648649, -0.957447, 0.864865, 0.765957, 0.864865, 2.29787, 0.432432, 3.06383, -0.216216, 3.06383, 0.432432, 2.29787, 1.08108, 0.765957, 1.51351, -0.957447, 1.51351, -1.91489, 1.2973, -3.06383, 0.216216 )
diff --git a/addons/health_bar_2d/examples/turrent.gd b/addons/health_bar_2d/examples/turrent.gd
new file mode 100644 (file)
index 0000000..92cbdc2
--- /dev/null
@@ -0,0 +1,43 @@
+extends Area2D
+
+@onready var nozzle = $Nozzle
+
+@export var bullet: PackedScene
+
+var _target: Node2D
+var _timer: Timer
+
+
+func _ready():
+       _config_timer()
+       connect("body_entered", _detected)
+       connect("body_exited", _lost)
+
+
+func _config_timer() -> void:
+       _timer = Timer.new()
+       _timer.autostart = true
+       _timer.wait_time = 0.5
+       add_child(_timer)
+       _timer.connect("timeout", _shoot)
+
+
+func _shoot() -> void:
+       if _target:
+               var dir = (_target.global_position - global_position).normalized()
+               nozzle.rotation = dir.angle()
+               var b = bullet.instantiate()
+               b.global_position = nozzle.get_child(0).global_position
+               b.direction = dir
+               get_tree().get_root().add_child(b)
+       _timer.start()
+
+
+func _detected(body: Node2D) -> void:
+       if body.name == "Player":
+               _target = body
+
+
+func _lost(body: Node2D) -> void:
+       if body.name == "Player":
+               _target = null
diff --git a/addons/health_bar_2d/examples/turrent.tscn b/addons/health_bar_2d/examples/turrent.tscn
new file mode 100644 (file)
index 0000000..fc1f315
--- /dev/null
@@ -0,0 +1,24 @@
+[gd_scene load_steps=4 format=3 uid="uid://b7w7epnvdwsos"]
+
+[ext_resource type="Script" path="res://addons/health_bar_2d/examples/turrent.gd" id="1"]
+[ext_resource type="PackedScene" path="res://addons/health_bar_2d/examples/bullet.tscn" id="2"]
+
+[sub_resource type="CircleShape2D" id="1"]
+radius = 89.0056
+
+[node name="Turrent" type="Area2D"]
+collision_mask = 16
+script = ExtResource("1")
+bullet = ExtResource("2")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+shape = SubResource("1")
+
+[node name="Nozzle" type="Polygon2D" parent="."]
+scale = Vector2(1.11111, 1)
+color = Color(0.47451, 0.333333, 0.333333, 1)
+polygon = PackedVector2Array(9, -3, 0, 0, 9, 3)
+
+[node name="Marker2D" type="Marker2D" parent="Nozzle"]
+position = Vector2(9.9, 0)
+scale = Vector2(0.9, 1)
diff --git a/addons/health_bar_2d/health_bar_2d.gd b/addons/health_bar_2d/health_bar_2d.gd
new file mode 100644 (file)
index 0000000..8c62537
--- /dev/null
@@ -0,0 +1,115 @@
+extends TextureProgressBar
+
+# if false, health bar will only show itself when value is changed
+@export var _static:bool = false
+# if set true, health bar color will change as value decreases
+@export var _gradient:bool = false
+# time out for show/hide health bar animation
+@export var _animation_timeout:float = 1.0
+# offset of health bar from player
+@export var _offset:Vector2 = Vector2(0, -6)
+
+# Colors #
+const _colors = {
+       "neutral": "#00489d",
+       "danger": "#9d0000",
+       "success": "#009d36",
+       "caution": "#d1ce00"
+}
+
+var _parent: Node
+var _center_offset: Vector2 = size/2
+#var _tween: Tween
+var _timer: Timer
+
+
+func _ready() -> void:
+       _setup()
+
+
+func _setup() -> void:
+       """Connects value_changed signal to _tween_fade or _color
+       method according to exported _static and _gradient variables.
+       """
+       if not _static:
+#              _tween = Tween.new()
+#              add_child(_tween)
+               connect("value_changed", _show)
+               modulate.a = 0
+               
+               _timer = Timer.new()
+               add_child(_timer)
+               _timer.connect("timeout", _fade)
+               _timer.wait_time = _animation_timeout
+
+       if _gradient:
+               connect("value_changed", _color)
+
+
+func _process(delta) -> void:
+       """Initialize the health bar for use in game.
+       It must be called for HealthBar2D to work.
+       """
+       if _parent:
+               set_rotation(-_parent.rotation)
+               set_global_position(_parent.position + _offset - _center_offset)
+
+
+func initialize(signal_string: String, conneted_bar_max_value) -> void:
+       """Initialize the health bar for use in game.
+       It must be called for HealthBar2D to work.
+       """
+       print("Info: Initialized %s %s signal" % [name, signal_string])
+       _parent = get_parent()
+       _parent.connect(signal_string, _handle_value)
+       max_value = conneted_bar_max_value
+       value = max_value
+
+
+func _handle_value(val: int) -> void:
+       """Sets the parent health to texture progress value.
+       """
+       if max_value >= val:
+               value = val
+
+
+func _show(val: float) -> void:
+       """Method handles the health bar visibility.
+       """
+       _timer.start()
+       _tween(1)
+
+
+func _fade() -> void:
+       """Method handles the health bar visibility.
+       """
+       _tween(0)
+
+
+func _color(val: float) -> void:
+       """Method handles the color of health bar.
+       """
+       if _prc(val, 30):
+               tint_progress = _colors.danger
+       elif _prc(val, 55):
+               tint_progress = _colors.caution
+       else:
+               tint_progress = _colors.success
+
+
+func _prc(val: float, percentage: int) -> bool:
+       """Method returns true if health bar is in certain percentage."""
+       return val <= max_value*(percentage/100.0)
+
+
+func _tween(value: float) -> void:
+       """Method handles the tween animations.
+       """
+       var tween := create_tween()
+#      _tween.stop(self, "modulate:a")
+       tween.set_ease(Tween.EASE_OUT)
+       tween.set_trans(Tween.TRANS_LINEAR)
+       
+       tween.tween_property(
+               self, "modulate:a", value, _animation_timeout
+       )
diff --git a/addons/health_bar_2d/health_bar_2d.tscn b/addons/health_bar_2d/health_bar_2d.tscn
new file mode 100644 (file)
index 0000000..819fe2e
--- /dev/null
@@ -0,0 +1,12 @@
+[gd_scene load_steps=3 format=3 uid="uid://bpsrn4wc8548e"]
+
+[ext_resource type="Script" path="res://addons/health_bar_2d/health_bar_2d.gd" id="1"]
+[ext_resource type="Texture2D" uid="uid://cnjw8wn77f05i" path="res://addons/health_bar_2d/resources/health_bar_texture.png" id="2"]
+
+[node name="HealthBar2D" type="TextureProgressBar"]
+value = 50.0
+texture_under = ExtResource("2")
+texture_progress = ExtResource("2")
+tint_under = Color(0.356863, 0.356863, 0.356863, 0.603922)
+tint_progress = Color(0.141176, 0.329412, 0.513726, 1)
+script = ExtResource("1")
diff --git a/addons/health_bar_2d/icon.png b/addons/health_bar_2d/icon.png
new file mode 100644 (file)
index 0000000..a6c5963
Binary files /dev/null and b/addons/health_bar_2d/icon.png differ
diff --git a/addons/health_bar_2d/icon.png.import b/addons/health_bar_2d/icon.png.import
new file mode 100644 (file)
index 0000000..c8b1b6a
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://j5smia0mu4jh"
+path="res://.godot/imported/icon.png-1a04300e498d83b21b1db2658a8a7ad1.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/health_bar_2d/icon.png"
+dest_files=["res://.godot/imported/icon.png-1a04300e498d83b21b1db2658a8a7ad1.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/health_bar_2d/plugin.cfg b/addons/health_bar_2d/plugin.cfg
new file mode 100644 (file)
index 0000000..460c3b6
--- /dev/null
@@ -0,0 +1,7 @@
+[plugin]
+
+name="HealthBar2D"
+description="A simple 2d health/stamina bar for attaching with player, enemies etc."
+author="vishu"
+version="0.2.0"
+script="addon.gd"
diff --git a/addons/health_bar_2d/resources/health_bar_texture.png b/addons/health_bar_2d/resources/health_bar_texture.png
new file mode 100644 (file)
index 0000000..bfdb5b1
Binary files /dev/null and b/addons/health_bar_2d/resources/health_bar_texture.png differ
diff --git a/addons/health_bar_2d/resources/health_bar_texture.png.import b/addons/health_bar_2d/resources/health_bar_texture.png.import
new file mode 100644 (file)
index 0000000..f03199e
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cnjw8wn77f05i"
+path="res://.godot/imported/health_bar_texture.png-b2571afb0d9e83bce90afa57c997503e.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/health_bar_2d/resources/health_bar_texture.png"
+dest_files=["res://.godot/imported/health_bar_texture.png-b2571afb0d9e83bce90afa57c997503e.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/input_prompts/LICENSE b/addons/input_prompts/LICENSE
new file mode 100644 (file)
index 0000000..88be6a4
--- /dev/null
@@ -0,0 +1,23 @@
+MIT License
+
+Copyright (c) 2022-2023 John Pennycook
+Copyright (c) 2014-present Godot Engine contributors.
+Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur.
+
+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/input_prompts/action_prompt/action_prompt.gd b/addons/input_prompts/action_prompt/action_prompt.gd
new file mode 100644 (file)
index 0000000..53af0fc
--- /dev/null
@@ -0,0 +1,129 @@
+# Copyright (C) 2022-2023 John Pennycook
+# SPDX-License-Identifier: MIT
+@tool
+@icon("res://addons/input_prompts/action_prompt/icon.svg")
+class_name ActionPrompt
+extends "res://addons/input_prompts/input_prompt.gd"
+## Displays a prompt based on an action registered in the [InputMap].
+##
+## Displays a prompt based on an action registered in the [InputMap].
+## The texture used for the prompt is determined automatically, based on the
+## contents of the [InputMap] and an icon preference. When the icon preference
+## is set to "Automatic", the prompt automatically adjusts to match the most
+## recent input device.
+
+## The name of an action registered in the [InputMap].
+var action := "ui_accept":
+       set = _set_action
+
+## The icon preference for this prompt:
+## Automatic (0), Xbox (1), Sony (2), Nintendo (3), Keyboard (4).
+## When set to "Automatic", the prompt automatically adjusts to match the most
+## recent input device.
+var icon: int = Icons.AUTOMATIC:
+       set = _set_icon
+
+
+func _ready():
+       _update_icon()
+
+
+func _set_action(new_action: String):
+       action = new_action
+
+       # In the Editor, InputMap reflects Editor settings
+       # Read the list of actions from ProjectSettings instead
+       # TODO: Find a cleaner way to cast these values
+       var tmp: Array = []
+       if Engine.is_editor_hint():
+               tmp = ProjectSettings.get_setting("input/" + action)["events"]
+       else:
+               tmp = InputMap.action_get_events(action)
+       events = []
+       for ev in tmp:
+               events.append(ev)
+       _update_icon()
+
+
+func _set_icon(new_icon):
+       icon = new_icon
+       _update_icon()
+
+
+func _find_event(list: Array, types: Array):
+       for candidate in list:
+               for type in types:
+                       if is_instance_of(candidate, type):
+                               return candidate
+       return null
+
+
+func _update_icon():
+       # If icon is set to AUTOMATIC, first determine which icon to display
+       var display_icon: int = icon
+       if icon == Icons.AUTOMATIC:
+               display_icon = PromptManager.icons
+
+       # Choose the atlas and region associated with the InputEvent
+       # If the InputMap contains multiple events, choose the first
+       if display_icon == Icons.KEYBOARD:
+               var types = [InputEventKey, InputEventMouseButton]
+               var ev = _find_event(events, types)
+               if not (ev is InputEventKey or ev is InputEventMouseButton):
+                       push_error("No Key/Mouse input for " + action + " in InputMap")
+               if ev is InputEventKey:
+                       var textures := PromptManager.get_keyboard_textures()
+                       texture = textures.get_texture(ev)
+               elif ev is InputEventMouseButton:
+                       var textures := PromptManager.get_mouse_textures()
+                       texture = textures.get_texture(ev)
+       else:
+               var types = [InputEventJoypadButton, InputEventJoypadMotion]
+               var ev = _find_event(events, types)
+               if not (ev is InputEventJoypadButton or ev is InputEventJoypadMotion):
+                       push_error("No Joypad input for " + action + " in InputMap")
+               if ev is InputEventJoypadButton:
+                       var textures := PromptManager.get_joypad_button_textures(display_icon)
+                       texture = textures.get_texture(ev)
+               elif ev is InputEventJoypadMotion:
+                       var textures := PromptManager.get_joypad_motion_textures(display_icon)
+                       texture = textures.get_texture(ev)
+       queue_redraw()
+
+
+func _input(event: InputEvent):
+       if not event.is_action_pressed(action):
+               return
+       emit_signal("pressed")
+
+
+func _get_property_list():
+       var properties = []
+       properties.append(
+               {
+                       name = "ActionPrompt",
+                       type = TYPE_NIL,
+                       usage = PROPERTY_USAGE_CATEGORY | PROPERTY_USAGE_SCRIPT_VARIABLE
+               }
+       )
+       # In the Editor, InputMap reflects Editor settings
+       # Read the list of actions from ProjectSettings instead
+       var actions: String = ""
+       for property in ProjectSettings.get_property_list():
+               var name = property["name"]
+               if name.begins_with("input/"):
+                       if actions != "":
+                               actions += ","
+                       actions += name.trim_prefix("input/")
+       properties.append(
+               {name = "action", type = TYPE_STRING, hint = PROPERTY_HINT_ENUM, hint_string = actions}
+       )
+       properties.append(
+               {
+                       name = "icon",
+                       type = TYPE_INT,
+                       hint = PROPERTY_HINT_ENUM,
+                       hint_string = "Automatic,Xbox,Sony,Nintendo,Keyboard"
+               }
+       )
+       return properties
diff --git a/addons/input_prompts/action_prompt/icon.svg b/addons/input_prompts/action_prompt/icon.svg
new file mode 100644 (file)
index 0000000..5bf8d0a
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#8fef99"><path d="m4.55 5a.85.85 0 0 0 -.85.85v7.65a.85.85 0 0 0 .85.85h6.8a.85.85 0 0 0 .85-.85v-7.65a.85.85 0 0 0 -.85-.85zm3.95 1.2.282 1.129.345.14.994-.597.707.707-.598.997.143.342 1.127.282v1l-1.129.282-.14.344.597.995-.707.707-.997-.598-.343.143-.28 1.127h-1l-.283-1.13-.344-.139-.995.597-.707-.707.598-.997-.143-.343-1.127-.281v-1l1.13-.282.139-.344-.597-.995.707-.707.997.598.343-.143.281-1.127z"/><circle cx="8" cy="9.675" r="1"/><path d="m2 6.36v7.65a1.7 1.7 0 0 0 1.7 1.7h8.5a1.7 1.7 0 0 0 1.7-1.7v-7.65h-.85v7.65a.85.85 0 0 1 -.85.85h-8.5a.85.85 0 0 1 -.85-.85v-7.65z"/><path d="m10.5 3.6.75-1.5m-5.75 1.5-.75-1.5m3.25 1.1v-1.7" stroke="#8fef99" stroke-linecap="round" stroke-width="1.25"/></g></svg>
\ No newline at end of file
diff --git a/addons/input_prompts/action_prompt/icon.svg.import b/addons/input_prompts/action_prompt/icon.svg.import
new file mode 100644 (file)
index 0000000..9752aca
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bvwnibp2o4o88"
+path="res://.godot/imported/icon.svg-0e13056d55240f60de41c1352e6f3b0f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/action_prompt/icon.svg"
+dest_files=["res://.godot/imported/icon.svg-0e13056d55240f60de41c1352e6f3b0f.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/input_prompts/icon.svg b/addons/input_prompts/icon.svg
new file mode 100644 (file)
index 0000000..18752b4
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m2 6.36v7.65a1.7 1.7 0 0 0 1.7 1.7h8.5a1.7 1.7 0 0 0 1.7-1.7v-7.65h-.85v7.65a.85.85 0 0 1 -.85.85h-8.5a.85.85 0 0 1 -.85-.85v-7.65z" fill="#90ef99"/><path d="m10.5 3.6.75-1.5m-5.75 1.5-.75-1.5m3.25 1.1v-1.7" fill="none" stroke="#8fef99" stroke-linecap="round" stroke-width="1.25"/><rect fill="#8fef99" height="9.35" ry=".778055" stroke-width="2.13069" width="8.5" x="3.7" y="5"/></svg>
\ No newline at end of file
diff --git a/addons/input_prompts/icon.svg.import b/addons/input_prompts/icon.svg.import
new file mode 100644 (file)
index 0000000..827e981
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bmlutwedh7f4n"
+path="res://.godot/imported/icon.svg-8eff67e3fe68308bc0434756e9e03976.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icon.svg"
+dest_files=["res://.godot/imported/icon.svg-8eff67e3fe68308bc0434756e9e03976.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/input_prompts/icons/generic/left_stick_down.png b/addons/input_prompts/icons/generic/left_stick_down.png
new file mode 100644 (file)
index 0000000..68f84e9
Binary files /dev/null and b/addons/input_prompts/icons/generic/left_stick_down.png differ
diff --git a/addons/input_prompts/icons/generic/left_stick_down.png.import b/addons/input_prompts/icons/generic/left_stick_down.png.import
new file mode 100644 (file)
index 0000000..5ff2aa2
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dreirjfpqj40a"
+path="res://.godot/imported/left_stick_down.png-a7ccef65244370624f984cd55722650c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/generic/left_stick_down.png"
+dest_files=["res://.godot/imported/left_stick_down.png-a7ccef65244370624f984cd55722650c.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/input_prompts/icons/generic/left_stick_left.png b/addons/input_prompts/icons/generic/left_stick_left.png
new file mode 100644 (file)
index 0000000..426e5ee
Binary files /dev/null and b/addons/input_prompts/icons/generic/left_stick_left.png differ
diff --git a/addons/input_prompts/icons/generic/left_stick_left.png.import b/addons/input_prompts/icons/generic/left_stick_left.png.import
new file mode 100644 (file)
index 0000000..5eff0b0
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cah6r1q5x2lte"
+path="res://.godot/imported/left_stick_left.png-b5048a0107577ae8558d6c7ac7499594.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/generic/left_stick_left.png"
+dest_files=["res://.godot/imported/left_stick_left.png-b5048a0107577ae8558d6c7ac7499594.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/input_prompts/icons/generic/left_stick_right.png b/addons/input_prompts/icons/generic/left_stick_right.png
new file mode 100644 (file)
index 0000000..ac80461
Binary files /dev/null and b/addons/input_prompts/icons/generic/left_stick_right.png differ
diff --git a/addons/input_prompts/icons/generic/left_stick_right.png.import b/addons/input_prompts/icons/generic/left_stick_right.png.import
new file mode 100644 (file)
index 0000000..d8d96bb
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c03r3n0nfrjck"
+path="res://.godot/imported/left_stick_right.png-fda055cf9d64f0e92c614b96be4eeabd.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/generic/left_stick_right.png"
+dest_files=["res://.godot/imported/left_stick_right.png-fda055cf9d64f0e92c614b96be4eeabd.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/input_prompts/icons/generic/left_stick_up.png b/addons/input_prompts/icons/generic/left_stick_up.png
new file mode 100644 (file)
index 0000000..f29fead
Binary files /dev/null and b/addons/input_prompts/icons/generic/left_stick_up.png differ
diff --git a/addons/input_prompts/icons/generic/left_stick_up.png.import b/addons/input_prompts/icons/generic/left_stick_up.png.import
new file mode 100644 (file)
index 0000000..00bae03
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bntsrcd3hjcex"
+path="res://.godot/imported/left_stick_up.png-817449d8b7e63f76e88f683690cf5578.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/generic/left_stick_up.png"
+dest_files=["res://.godot/imported/left_stick_up.png-817449d8b7e63f76e88f683690cf5578.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/input_prompts/icons/generic/right_stick_down.png b/addons/input_prompts/icons/generic/right_stick_down.png
new file mode 100644 (file)
index 0000000..d9ce17f
Binary files /dev/null and b/addons/input_prompts/icons/generic/right_stick_down.png differ
diff --git a/addons/input_prompts/icons/generic/right_stick_down.png.import b/addons/input_prompts/icons/generic/right_stick_down.png.import
new file mode 100644 (file)
index 0000000..3743c8b
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c6tm6gslt2cau"
+path="res://.godot/imported/right_stick_down.png-b2681ff4595b9878997d32c090de409c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/generic/right_stick_down.png"
+dest_files=["res://.godot/imported/right_stick_down.png-b2681ff4595b9878997d32c090de409c.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/input_prompts/icons/generic/right_stick_left.png b/addons/input_prompts/icons/generic/right_stick_left.png
new file mode 100644 (file)
index 0000000..f552167
Binary files /dev/null and b/addons/input_prompts/icons/generic/right_stick_left.png differ
diff --git a/addons/input_prompts/icons/generic/right_stick_left.png.import b/addons/input_prompts/icons/generic/right_stick_left.png.import
new file mode 100644 (file)
index 0000000..7241469
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dkd01upu3qdb7"
+path="res://.godot/imported/right_stick_left.png-22e5e174bd0d447e24f8bb0b7e97132a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/generic/right_stick_left.png"
+dest_files=["res://.godot/imported/right_stick_left.png-22e5e174bd0d447e24f8bb0b7e97132a.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/input_prompts/icons/generic/right_stick_right.png b/addons/input_prompts/icons/generic/right_stick_right.png
new file mode 100644 (file)
index 0000000..a1c9933
Binary files /dev/null and b/addons/input_prompts/icons/generic/right_stick_right.png differ
diff --git a/addons/input_prompts/icons/generic/right_stick_right.png.import b/addons/input_prompts/icons/generic/right_stick_right.png.import
new file mode 100644 (file)
index 0000000..f34f9bd
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://7wlwep2pflxf"
+path="res://.godot/imported/right_stick_right.png-f83b635a37a9ca1ca011560da136ffa0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/generic/right_stick_right.png"
+dest_files=["res://.godot/imported/right_stick_right.png-f83b635a37a9ca1ca011560da136ffa0.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/input_prompts/icons/generic/right_stick_up.png b/addons/input_prompts/icons/generic/right_stick_up.png
new file mode 100644 (file)
index 0000000..3b7b5ac
Binary files /dev/null and b/addons/input_prompts/icons/generic/right_stick_up.png differ
diff --git a/addons/input_prompts/icons/generic/right_stick_up.png.import b/addons/input_prompts/icons/generic/right_stick_up.png.import
new file mode 100644 (file)
index 0000000..b34fd58
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://tdsh1d8hbha3"
+path="res://.godot/imported/right_stick_up.png-41b66528d63b3c48fcdd349314d49a92.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/generic/right_stick_up.png"
+dest_files=["res://.godot/imported/right_stick_up.png-41b66528d63b3c48fcdd349314d49a92.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/input_prompts/icons/keyboard/0.png b/addons/input_prompts/icons/keyboard/0.png
new file mode 100644 (file)
index 0000000..80eabca
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/0.png differ
diff --git a/addons/input_prompts/icons/keyboard/0.png.import b/addons/input_prompts/icons/keyboard/0.png.import
new file mode 100644 (file)
index 0000000..c9de69c
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bvodyh3h4lf23"
+path="res://.godot/imported/0.png-2b34316efec65d6cb41347abb24577df.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/0.png"
+dest_files=["res://.godot/imported/0.png-2b34316efec65d6cb41347abb24577df.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/input_prompts/icons/keyboard/1.png b/addons/input_prompts/icons/keyboard/1.png
new file mode 100644 (file)
index 0000000..ed0110a
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/1.png differ
diff --git a/addons/input_prompts/icons/keyboard/1.png.import b/addons/input_prompts/icons/keyboard/1.png.import
new file mode 100644 (file)
index 0000000..dcd7515
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dshgdv8b1s4yx"
+path="res://.godot/imported/1.png-1b3e0e7b18de10342e7e6c0ed8fb90d4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/1.png"
+dest_files=["res://.godot/imported/1.png-1b3e0e7b18de10342e7e6c0ed8fb90d4.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/input_prompts/icons/keyboard/2.png b/addons/input_prompts/icons/keyboard/2.png
new file mode 100644 (file)
index 0000000..8ae97e3
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/2.png differ
diff --git a/addons/input_prompts/icons/keyboard/2.png.import b/addons/input_prompts/icons/keyboard/2.png.import
new file mode 100644 (file)
index 0000000..e7b7a9e
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dmlsiso1q4lfb"
+path="res://.godot/imported/2.png-1d45a3312cb852724ae82c348a82682b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/2.png"
+dest_files=["res://.godot/imported/2.png-1d45a3312cb852724ae82c348a82682b.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/input_prompts/icons/keyboard/3.png b/addons/input_prompts/icons/keyboard/3.png
new file mode 100644 (file)
index 0000000..77b4f93
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/3.png differ
diff --git a/addons/input_prompts/icons/keyboard/3.png.import b/addons/input_prompts/icons/keyboard/3.png.import
new file mode 100644 (file)
index 0000000..d50e0ba
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bf4eom0tm7cg0"
+path="res://.godot/imported/3.png-0c2bbf57ace780c2ef5c6eeac9dac81c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/3.png"
+dest_files=["res://.godot/imported/3.png-0c2bbf57ace780c2ef5c6eeac9dac81c.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/input_prompts/icons/keyboard/4.png b/addons/input_prompts/icons/keyboard/4.png
new file mode 100644 (file)
index 0000000..dbf8c4d
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/4.png differ
diff --git a/addons/input_prompts/icons/keyboard/4.png.import b/addons/input_prompts/icons/keyboard/4.png.import
new file mode 100644 (file)
index 0000000..c69ffd5
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://va3aynlfmriq"
+path="res://.godot/imported/4.png-7160f881759d8cd7b9c57df6256daa4f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/4.png"
+dest_files=["res://.godot/imported/4.png-7160f881759d8cd7b9c57df6256daa4f.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/input_prompts/icons/keyboard/5.png b/addons/input_prompts/icons/keyboard/5.png
new file mode 100644 (file)
index 0000000..64ba5e3
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/5.png differ
diff --git a/addons/input_prompts/icons/keyboard/5.png.import b/addons/input_prompts/icons/keyboard/5.png.import
new file mode 100644 (file)
index 0000000..6665af8
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://drpc3hg1h7ra3"
+path="res://.godot/imported/5.png-51e57a054cf55b5e4c37e98b6a5d4e1d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/5.png"
+dest_files=["res://.godot/imported/5.png-51e57a054cf55b5e4c37e98b6a5d4e1d.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/input_prompts/icons/keyboard/6.png b/addons/input_prompts/icons/keyboard/6.png
new file mode 100644 (file)
index 0000000..5dc2485
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/6.png differ
diff --git a/addons/input_prompts/icons/keyboard/6.png.import b/addons/input_prompts/icons/keyboard/6.png.import
new file mode 100644 (file)
index 0000000..440d4ce
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c20j4d1asagf2"
+path="res://.godot/imported/6.png-b89f15b2175f8a3035a2d957afa9989d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/6.png"
+dest_files=["res://.godot/imported/6.png-b89f15b2175f8a3035a2d957afa9989d.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/input_prompts/icons/keyboard/7.png b/addons/input_prompts/icons/keyboard/7.png
new file mode 100644 (file)
index 0000000..dd52f4f
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/7.png differ
diff --git a/addons/input_prompts/icons/keyboard/7.png.import b/addons/input_prompts/icons/keyboard/7.png.import
new file mode 100644 (file)
index 0000000..8d34bc6
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c1j7ybdojbsdy"
+path="res://.godot/imported/7.png-b8fffd7f42b8a96990fda6aba37c3db7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/7.png"
+dest_files=["res://.godot/imported/7.png-b8fffd7f42b8a96990fda6aba37c3db7.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/input_prompts/icons/keyboard/8.png b/addons/input_prompts/icons/keyboard/8.png
new file mode 100644 (file)
index 0000000..68850b7
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/8.png differ
diff --git a/addons/input_prompts/icons/keyboard/8.png.import b/addons/input_prompts/icons/keyboard/8.png.import
new file mode 100644 (file)
index 0000000..b181465
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bqws21dovdpjf"
+path="res://.godot/imported/8.png-e38ab2782aabb656e6e3f4d29a87f500.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/8.png"
+dest_files=["res://.godot/imported/8.png-e38ab2782aabb656e6e3f4d29a87f500.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/input_prompts/icons/keyboard/9.png b/addons/input_prompts/icons/keyboard/9.png
new file mode 100644 (file)
index 0000000..a3f0714
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/9.png differ
diff --git a/addons/input_prompts/icons/keyboard/9.png.import b/addons/input_prompts/icons/keyboard/9.png.import
new file mode 100644 (file)
index 0000000..ce780bb
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d05npg77uxdp1"
+path="res://.godot/imported/9.png-1a5c940c311975537e338c220caeee93.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/9.png"
+dest_files=["res://.godot/imported/9.png-1a5c940c311975537e338c220caeee93.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/input_prompts/icons/keyboard/a.png b/addons/input_prompts/icons/keyboard/a.png
new file mode 100644 (file)
index 0000000..3ae68ca
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/a.png differ
diff --git a/addons/input_prompts/icons/keyboard/a.png.import b/addons/input_prompts/icons/keyboard/a.png.import
new file mode 100644 (file)
index 0000000..60b1daf
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://yakqusko3p3h"
+path="res://.godot/imported/a.png-0a4b1b2556382e925bddb87c41e69b5a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/a.png"
+dest_files=["res://.godot/imported/a.png-0a4b1b2556382e925bddb87c41e69b5a.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/input_prompts/icons/keyboard/alt.png b/addons/input_prompts/icons/keyboard/alt.png
new file mode 100644 (file)
index 0000000..aa94dfa
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/alt.png differ
diff --git a/addons/input_prompts/icons/keyboard/alt.png.import b/addons/input_prompts/icons/keyboard/alt.png.import
new file mode 100644 (file)
index 0000000..721850a
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://blxkuaujlcbmj"
+path="res://.godot/imported/alt.png-ab7b3a9822105f3fc6a3ef4f9dcaa636.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/alt.png"
+dest_files=["res://.godot/imported/alt.png-ab7b3a9822105f3fc6a3ef4f9dcaa636.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/input_prompts/icons/keyboard/apostrophe.png b/addons/input_prompts/icons/keyboard/apostrophe.png
new file mode 100644 (file)
index 0000000..21eff84
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/apostrophe.png differ
diff --git a/addons/input_prompts/icons/keyboard/apostrophe.png.import b/addons/input_prompts/icons/keyboard/apostrophe.png.import
new file mode 100644 (file)
index 0000000..a885981
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://6eqbtpaitj6"
+path="res://.godot/imported/apostrophe.png-ae36c8e28198d6cc07f1d1c390610f79.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/apostrophe.png"
+dest_files=["res://.godot/imported/apostrophe.png-ae36c8e28198d6cc07f1d1c390610f79.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/input_prompts/icons/keyboard/asterisk.png b/addons/input_prompts/icons/keyboard/asterisk.png
new file mode 100644 (file)
index 0000000..9456ce6
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/asterisk.png differ
diff --git a/addons/input_prompts/icons/keyboard/asterisk.png.import b/addons/input_prompts/icons/keyboard/asterisk.png.import
new file mode 100644 (file)
index 0000000..a075d4a
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dmrupkmptjy3i"
+path="res://.godot/imported/asterisk.png-64ac106e76ff14b0cd40167cb9a5d69f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/asterisk.png"
+dest_files=["res://.godot/imported/asterisk.png-64ac106e76ff14b0cd40167cb9a5d69f.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/input_prompts/icons/keyboard/at.png b/addons/input_prompts/icons/keyboard/at.png
new file mode 100644 (file)
index 0000000..f58d901
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/at.png differ
diff --git a/addons/input_prompts/icons/keyboard/at.png.import b/addons/input_prompts/icons/keyboard/at.png.import
new file mode 100644 (file)
index 0000000..e0986c7
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ctlmc2ba1nnwg"
+path="res://.godot/imported/at.png-78ee9076da1440a33d639fe1efa02f4c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/at.png"
+dest_files=["res://.godot/imported/at.png-78ee9076da1440a33d639fe1efa02f4c.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/input_prompts/icons/keyboard/b.png b/addons/input_prompts/icons/keyboard/b.png
new file mode 100644 (file)
index 0000000..d591621
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/b.png differ
diff --git a/addons/input_prompts/icons/keyboard/b.png.import b/addons/input_prompts/icons/keyboard/b.png.import
new file mode 100644 (file)
index 0000000..87d4c93
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ccv43ygy8fg0n"
+path="res://.godot/imported/b.png-f54ad7ea0efa2a48c3a87a361b1a2f21.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/b.png"
+dest_files=["res://.godot/imported/b.png-f54ad7ea0efa2a48c3a87a361b1a2f21.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/input_prompts/icons/keyboard/backslash.png b/addons/input_prompts/icons/keyboard/backslash.png
new file mode 100644 (file)
index 0000000..77eb94d
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/backslash.png differ
diff --git a/addons/input_prompts/icons/keyboard/backslash.png.import b/addons/input_prompts/icons/keyboard/backslash.png.import
new file mode 100644 (file)
index 0000000..0451989
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://buo267imq81wk"
+path="res://.godot/imported/backslash.png-2fd42ee765ae6e5504099530f58ebbc2.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/backslash.png"
+dest_files=["res://.godot/imported/backslash.png-2fd42ee765ae6e5504099530f58ebbc2.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/input_prompts/icons/keyboard/backspace.png b/addons/input_prompts/icons/keyboard/backspace.png
new file mode 100644 (file)
index 0000000..03589c2
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/backspace.png differ
diff --git a/addons/input_prompts/icons/keyboard/backspace.png.import b/addons/input_prompts/icons/keyboard/backspace.png.import
new file mode 100644 (file)
index 0000000..c983441
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c3lq40m0un2vi"
+path="res://.godot/imported/backspace.png-c16cd70732af517ec89c83be54b3bc7e.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/backspace.png"
+dest_files=["res://.godot/imported/backspace.png-c16cd70732af517ec89c83be54b3bc7e.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/input_prompts/icons/keyboard/blank.png b/addons/input_prompts/icons/keyboard/blank.png
new file mode 100644 (file)
index 0000000..6f142da
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/blank.png differ
diff --git a/addons/input_prompts/icons/keyboard/blank.png.import b/addons/input_prompts/icons/keyboard/blank.png.import
new file mode 100644 (file)
index 0000000..b81c926
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cqii6dlr8stxs"
+path="res://.godot/imported/blank.png-3e568a503bfe7edf47152679806f5dd8.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/blank.png"
+dest_files=["res://.godot/imported/blank.png-3e568a503bfe7edf47152679806f5dd8.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/input_prompts/icons/keyboard/c.png b/addons/input_prompts/icons/keyboard/c.png
new file mode 100644 (file)
index 0000000..1462d6f
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/c.png differ
diff --git a/addons/input_prompts/icons/keyboard/c.png.import b/addons/input_prompts/icons/keyboard/c.png.import
new file mode 100644 (file)
index 0000000..7fa675c
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dw4bnrd874e24"
+path="res://.godot/imported/c.png-02a9f272299dd50de4f69dd8e39f6699.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/c.png"
+dest_files=["res://.godot/imported/c.png-02a9f272299dd50de4f69dd8e39f6699.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/input_prompts/icons/keyboard/caps.png b/addons/input_prompts/icons/keyboard/caps.png
new file mode 100644 (file)
index 0000000..a436057
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/caps.png differ
diff --git a/addons/input_prompts/icons/keyboard/caps.png.import b/addons/input_prompts/icons/keyboard/caps.png.import
new file mode 100644 (file)
index 0000000..fc3fd12
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dn8boox0dp1yt"
+path="res://.godot/imported/caps.png-a874d2c9f88f5dc67a978de23d553051.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/caps.png"
+dest_files=["res://.godot/imported/caps.png-a874d2c9f88f5dc67a978de23d553051.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/input_prompts/icons/keyboard/caret.png b/addons/input_prompts/icons/keyboard/caret.png
new file mode 100644 (file)
index 0000000..ac2b803
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/caret.png differ
diff --git a/addons/input_prompts/icons/keyboard/caret.png.import b/addons/input_prompts/icons/keyboard/caret.png.import
new file mode 100644 (file)
index 0000000..48ca57a
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://detsp08crf2po"
+path="res://.godot/imported/caret.png-6aa88fdfe49932f763ff152365ab4ef4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/caret.png"
+dest_files=["res://.godot/imported/caret.png-6aa88fdfe49932f763ff152365ab4ef4.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/input_prompts/icons/keyboard/cent.png b/addons/input_prompts/icons/keyboard/cent.png
new file mode 100644 (file)
index 0000000..0050232
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/cent.png differ
diff --git a/addons/input_prompts/icons/keyboard/cent.png.import b/addons/input_prompts/icons/keyboard/cent.png.import
new file mode 100644 (file)
index 0000000..69dd0e7
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b61b7fo35agvb"
+path="res://.godot/imported/cent.png-60e7f1c737e523272e347ca4644d4154.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/cent.png"
+dest_files=["res://.godot/imported/cent.png-60e7f1c737e523272e347ca4644d4154.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/input_prompts/icons/keyboard/colon.png b/addons/input_prompts/icons/keyboard/colon.png
new file mode 100644 (file)
index 0000000..9ef3326
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/colon.png differ
diff --git a/addons/input_prompts/icons/keyboard/colon.png.import b/addons/input_prompts/icons/keyboard/colon.png.import
new file mode 100644 (file)
index 0000000..ac7179e
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dxvryuhofjieh"
+path="res://.godot/imported/colon.png-9bd41f18f2fa494d5005339cb2ca64d2.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/colon.png"
+dest_files=["res://.godot/imported/colon.png-9bd41f18f2fa494d5005339cb2ca64d2.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/input_prompts/icons/keyboard/comma.png b/addons/input_prompts/icons/keyboard/comma.png
new file mode 100644 (file)
index 0000000..f7c8ce5
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/comma.png differ
diff --git a/addons/input_prompts/icons/keyboard/comma.png.import b/addons/input_prompts/icons/keyboard/comma.png.import
new file mode 100644 (file)
index 0000000..6488b90
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dl4rc530g2l60"
+path="res://.godot/imported/comma.png-7983dbc336af6147de64d81486ddfa81.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/comma.png"
+dest_files=["res://.godot/imported/comma.png-7983dbc336af6147de64d81486ddfa81.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/input_prompts/icons/keyboard/ctrl.png b/addons/input_prompts/icons/keyboard/ctrl.png
new file mode 100644 (file)
index 0000000..33628d6
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/ctrl.png differ
diff --git a/addons/input_prompts/icons/keyboard/ctrl.png.import b/addons/input_prompts/icons/keyboard/ctrl.png.import
new file mode 100644 (file)
index 0000000..a174467
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bp2btmbc2q2io"
+path="res://.godot/imported/ctrl.png-6d946358145b9bd00780719ab55caeb2.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/ctrl.png"
+dest_files=["res://.godot/imported/ctrl.png-6d946358145b9bd00780719ab55caeb2.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/input_prompts/icons/keyboard/d.png b/addons/input_prompts/icons/keyboard/d.png
new file mode 100644 (file)
index 0000000..c238b13
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/d.png differ
diff --git a/addons/input_prompts/icons/keyboard/d.png.import b/addons/input_prompts/icons/keyboard/d.png.import
new file mode 100644 (file)
index 0000000..c345151
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b0kuadlp4jw6j"
+path="res://.godot/imported/d.png-d45e548ef3015b7e2ae5a7ce562acce4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/d.png"
+dest_files=["res://.godot/imported/d.png-d45e548ef3015b7e2ae5a7ce562acce4.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/input_prompts/icons/keyboard/del.png b/addons/input_prompts/icons/keyboard/del.png
new file mode 100644 (file)
index 0000000..b9c1047
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/del.png differ
diff --git a/addons/input_prompts/icons/keyboard/del.png.import b/addons/input_prompts/icons/keyboard/del.png.import
new file mode 100644 (file)
index 0000000..30eba78
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d21qtckj4teb1"
+path="res://.godot/imported/del.png-f12093cd8db69866a42a6ba66d723d48.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/del.png"
+dest_files=["res://.godot/imported/del.png-f12093cd8db69866a42a6ba66d723d48.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/input_prompts/icons/keyboard/dollar.png b/addons/input_prompts/icons/keyboard/dollar.png
new file mode 100644 (file)
index 0000000..c8c483f
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/dollar.png differ
diff --git a/addons/input_prompts/icons/keyboard/dollar.png.import b/addons/input_prompts/icons/keyboard/dollar.png.import
new file mode 100644 (file)
index 0000000..cd937ee
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bsd3apwcjg2p8"
+path="res://.godot/imported/dollar.png-90def560cd8bed0f21e0efc261474b42.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/dollar.png"
+dest_files=["res://.godot/imported/dollar.png-90def560cd8bed0f21e0efc261474b42.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/input_prompts/icons/keyboard/down.png b/addons/input_prompts/icons/keyboard/down.png
new file mode 100644 (file)
index 0000000..8cc1f51
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/down.png differ
diff --git a/addons/input_prompts/icons/keyboard/down.png.import b/addons/input_prompts/icons/keyboard/down.png.import
new file mode 100644 (file)
index 0000000..074323b
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://o0jnn82k7f8d"
+path="res://.godot/imported/down.png-38894ea8242cba80e24dd7c66e6c1fc2.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/down.png"
+dest_files=["res://.godot/imported/down.png-38894ea8242cba80e24dd7c66e6c1fc2.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/input_prompts/icons/keyboard/e.png b/addons/input_prompts/icons/keyboard/e.png
new file mode 100644 (file)
index 0000000..81d76db
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/e.png differ
diff --git a/addons/input_prompts/icons/keyboard/e.png.import b/addons/input_prompts/icons/keyboard/e.png.import
new file mode 100644 (file)
index 0000000..beb8f4e
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d2as5erfr7tji"
+path="res://.godot/imported/e.png-add30a59f1142cd3cbd1568948c0a954.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/e.png"
+dest_files=["res://.godot/imported/e.png-add30a59f1142cd3cbd1568948c0a954.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/input_prompts/icons/keyboard/end.png b/addons/input_prompts/icons/keyboard/end.png
new file mode 100644 (file)
index 0000000..141e6e7
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/end.png differ
diff --git a/addons/input_prompts/icons/keyboard/end.png.import b/addons/input_prompts/icons/keyboard/end.png.import
new file mode 100644 (file)
index 0000000..c68de01
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://gybid8440i5b"
+path="res://.godot/imported/end.png-870b5871e9f2d6afc00dbf64c9175a83.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/end.png"
+dest_files=["res://.godot/imported/end.png-870b5871e9f2d6afc00dbf64c9175a83.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/input_prompts/icons/keyboard/enter_large.png b/addons/input_prompts/icons/keyboard/enter_large.png
new file mode 100644 (file)
index 0000000..a0952c9
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/enter_large.png differ
diff --git a/addons/input_prompts/icons/keyboard/enter_large.png.import b/addons/input_prompts/icons/keyboard/enter_large.png.import
new file mode 100644 (file)
index 0000000..317c7a8
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://eadqqakjyf5m"
+path="res://.godot/imported/enter_large.png-30e2806b4b602da5521e44969c496373.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/enter_large.png"
+dest_files=["res://.godot/imported/enter_large.png-30e2806b4b602da5521e44969c496373.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/input_prompts/icons/keyboard/enter_small.png b/addons/input_prompts/icons/keyboard/enter_small.png
new file mode 100644 (file)
index 0000000..00060fa
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/enter_small.png differ
diff --git a/addons/input_prompts/icons/keyboard/enter_small.png.import b/addons/input_prompts/icons/keyboard/enter_small.png.import
new file mode 100644 (file)
index 0000000..11ef2ea
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bd3kwm8awfqbv"
+path="res://.godot/imported/enter_small.png-f37351702f92d75a289f387ae35544c5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/enter_small.png"
+dest_files=["res://.godot/imported/enter_small.png-f37351702f92d75a289f387ae35544c5.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/input_prompts/icons/keyboard/enter_wide.png b/addons/input_prompts/icons/keyboard/enter_wide.png
new file mode 100644 (file)
index 0000000..e62cb00
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/enter_wide.png differ
diff --git a/addons/input_prompts/icons/keyboard/enter_wide.png.import b/addons/input_prompts/icons/keyboard/enter_wide.png.import
new file mode 100644 (file)
index 0000000..9fccb05
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://phpq5qt2ct30"
+path="res://.godot/imported/enter_wide.png-7c4c206641a5a3674c3e316019d6f977.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/enter_wide.png"
+dest_files=["res://.godot/imported/enter_wide.png-7c4c206641a5a3674c3e316019d6f977.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/input_prompts/icons/keyboard/equals.png b/addons/input_prompts/icons/keyboard/equals.png
new file mode 100644 (file)
index 0000000..3991717
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/equals.png differ
diff --git a/addons/input_prompts/icons/keyboard/equals.png.import b/addons/input_prompts/icons/keyboard/equals.png.import
new file mode 100644 (file)
index 0000000..aec76e6
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d1fenf4b142vk"
+path="res://.godot/imported/equals.png-3926a7c29712ac27827d69f5b3178ba7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/equals.png"
+dest_files=["res://.godot/imported/equals.png-3926a7c29712ac27827d69f5b3178ba7.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/input_prompts/icons/keyboard/esc.png b/addons/input_prompts/icons/keyboard/esc.png
new file mode 100644 (file)
index 0000000..437e045
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/esc.png differ
diff --git a/addons/input_prompts/icons/keyboard/esc.png.import b/addons/input_prompts/icons/keyboard/esc.png.import
new file mode 100644 (file)
index 0000000..b55f11e
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ei5tpuh570dp"
+path="res://.godot/imported/esc.png-678d7b6dc246a325d8d89dfcef8e6850.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/esc.png"
+dest_files=["res://.godot/imported/esc.png-678d7b6dc246a325d8d89dfcef8e6850.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/input_prompts/icons/keyboard/exclamation.png b/addons/input_prompts/icons/keyboard/exclamation.png
new file mode 100644 (file)
index 0000000..12fcaaa
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/exclamation.png differ
diff --git a/addons/input_prompts/icons/keyboard/exclamation.png.import b/addons/input_prompts/icons/keyboard/exclamation.png.import
new file mode 100644 (file)
index 0000000..7ff3c2b
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cksdxqlbkrjc5"
+path="res://.godot/imported/exclamation.png-45091ed0873ebece8c490ad3ecf2ddfb.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/exclamation.png"
+dest_files=["res://.godot/imported/exclamation.png-45091ed0873ebece8c490ad3ecf2ddfb.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/input_prompts/icons/keyboard/f.png b/addons/input_prompts/icons/keyboard/f.png
new file mode 100644 (file)
index 0000000..e38a06f
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/f.png differ
diff --git a/addons/input_prompts/icons/keyboard/f.png.import b/addons/input_prompts/icons/keyboard/f.png.import
new file mode 100644 (file)
index 0000000..bba3835
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dxydr83ulipn7"
+path="res://.godot/imported/f.png-580750459de988a870f6e71812ea0fc0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/f.png"
+dest_files=["res://.godot/imported/f.png-580750459de988a870f6e71812ea0fc0.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/input_prompts/icons/keyboard/f1.png b/addons/input_prompts/icons/keyboard/f1.png
new file mode 100644 (file)
index 0000000..e5db8dc
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/f1.png differ
diff --git a/addons/input_prompts/icons/keyboard/f1.png.import b/addons/input_prompts/icons/keyboard/f1.png.import
new file mode 100644 (file)
index 0000000..6e9eccc
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://riaj57l1jlqv"
+path="res://.godot/imported/f1.png-8784640613fe37954375943c84718875.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/f1.png"
+dest_files=["res://.godot/imported/f1.png-8784640613fe37954375943c84718875.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/input_prompts/icons/keyboard/f10.png b/addons/input_prompts/icons/keyboard/f10.png
new file mode 100644 (file)
index 0000000..34a13b1
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/f10.png differ
diff --git a/addons/input_prompts/icons/keyboard/f10.png.import b/addons/input_prompts/icons/keyboard/f10.png.import
new file mode 100644 (file)
index 0000000..2b31484
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bjdih12b3d5ug"
+path="res://.godot/imported/f10.png-6c884951b6b19e131af80c8d4ffc43a6.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/f10.png"
+dest_files=["res://.godot/imported/f10.png-6c884951b6b19e131af80c8d4ffc43a6.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/input_prompts/icons/keyboard/f11.png b/addons/input_prompts/icons/keyboard/f11.png
new file mode 100644 (file)
index 0000000..e60dbb3
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/f11.png differ
diff --git a/addons/input_prompts/icons/keyboard/f11.png.import b/addons/input_prompts/icons/keyboard/f11.png.import
new file mode 100644 (file)
index 0000000..21fcf3e
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cshp782a8pjmk"
+path="res://.godot/imported/f11.png-c97f5701e4f191dd0fb1ae3f89c67efd.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/f11.png"
+dest_files=["res://.godot/imported/f11.png-c97f5701e4f191dd0fb1ae3f89c67efd.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/input_prompts/icons/keyboard/f12.png b/addons/input_prompts/icons/keyboard/f12.png
new file mode 100644 (file)
index 0000000..99002d8
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/f12.png differ
diff --git a/addons/input_prompts/icons/keyboard/f12.png.import b/addons/input_prompts/icons/keyboard/f12.png.import
new file mode 100644 (file)
index 0000000..0a5271d
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://o6o5wyo8ce3j"
+path="res://.godot/imported/f12.png-f59c7dbdd50f3b04fc1bf6c02625f239.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/f12.png"
+dest_files=["res://.godot/imported/f12.png-f59c7dbdd50f3b04fc1bf6c02625f239.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/input_prompts/icons/keyboard/f2.png b/addons/input_prompts/icons/keyboard/f2.png
new file mode 100644 (file)
index 0000000..5dfa965
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/f2.png differ
diff --git a/addons/input_prompts/icons/keyboard/f2.png.import b/addons/input_prompts/icons/keyboard/f2.png.import
new file mode 100644 (file)
index 0000000..733d37c
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://boer02ea1703"
+path="res://.godot/imported/f2.png-c82f0017a19d213791947e6662280211.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/f2.png"
+dest_files=["res://.godot/imported/f2.png-c82f0017a19d213791947e6662280211.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/input_prompts/icons/keyboard/f3.png b/addons/input_prompts/icons/keyboard/f3.png
new file mode 100644 (file)
index 0000000..76d139a
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/f3.png differ
diff --git a/addons/input_prompts/icons/keyboard/f3.png.import b/addons/input_prompts/icons/keyboard/f3.png.import
new file mode 100644 (file)
index 0000000..31a9eaf
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://4nm4436qnhtg"
+path="res://.godot/imported/f3.png-f0226f7b3c4184293e0708091975b67a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/f3.png"
+dest_files=["res://.godot/imported/f3.png-f0226f7b3c4184293e0708091975b67a.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/input_prompts/icons/keyboard/f4.png b/addons/input_prompts/icons/keyboard/f4.png
new file mode 100644 (file)
index 0000000..2b40121
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/f4.png differ
diff --git a/addons/input_prompts/icons/keyboard/f4.png.import b/addons/input_prompts/icons/keyboard/f4.png.import
new file mode 100644 (file)
index 0000000..0d96d2a
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bv67io1l864a1"
+path="res://.godot/imported/f4.png-09b8e9d454cba063477570e7b1699199.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/f4.png"
+dest_files=["res://.godot/imported/f4.png-09b8e9d454cba063477570e7b1699199.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/input_prompts/icons/keyboard/f5.png b/addons/input_prompts/icons/keyboard/f5.png
new file mode 100644 (file)
index 0000000..6ea8487
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/f5.png differ
diff --git a/addons/input_prompts/icons/keyboard/f5.png.import b/addons/input_prompts/icons/keyboard/f5.png.import
new file mode 100644 (file)
index 0000000..41527f4
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://uihje5m764bx"
+path="res://.godot/imported/f5.png-3c2ff899a202d7dd23ce49b8ee385122.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/f5.png"
+dest_files=["res://.godot/imported/f5.png-3c2ff899a202d7dd23ce49b8ee385122.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/input_prompts/icons/keyboard/f6.png b/addons/input_prompts/icons/keyboard/f6.png
new file mode 100644 (file)
index 0000000..ddea86f
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/f6.png differ
diff --git a/addons/input_prompts/icons/keyboard/f6.png.import b/addons/input_prompts/icons/keyboard/f6.png.import
new file mode 100644 (file)
index 0000000..d74c995
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bc5qukglexu4m"
+path="res://.godot/imported/f6.png-43d677e9690a659ea01f3f10349f817c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/f6.png"
+dest_files=["res://.godot/imported/f6.png-43d677e9690a659ea01f3f10349f817c.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/input_prompts/icons/keyboard/f7.png b/addons/input_prompts/icons/keyboard/f7.png
new file mode 100644 (file)
index 0000000..a596aa7
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/f7.png differ
diff --git a/addons/input_prompts/icons/keyboard/f7.png.import b/addons/input_prompts/icons/keyboard/f7.png.import
new file mode 100644 (file)
index 0000000..f88c3fa
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cdgup5y6rik0q"
+path="res://.godot/imported/f7.png-2f110918147e78f333e21478dc44d73a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/f7.png"
+dest_files=["res://.godot/imported/f7.png-2f110918147e78f333e21478dc44d73a.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/input_prompts/icons/keyboard/f8.png b/addons/input_prompts/icons/keyboard/f8.png
new file mode 100644 (file)
index 0000000..fe086ed
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/f8.png differ
diff --git a/addons/input_prompts/icons/keyboard/f8.png.import b/addons/input_prompts/icons/keyboard/f8.png.import
new file mode 100644 (file)
index 0000000..6587c5e
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bg1t161py4o3b"
+path="res://.godot/imported/f8.png-c22adbefc881c951afdc1910bec4b909.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/f8.png"
+dest_files=["res://.godot/imported/f8.png-c22adbefc881c951afdc1910bec4b909.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/input_prompts/icons/keyboard/f9.png b/addons/input_prompts/icons/keyboard/f9.png
new file mode 100644 (file)
index 0000000..0901565
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/f9.png differ
diff --git a/addons/input_prompts/icons/keyboard/f9.png.import b/addons/input_prompts/icons/keyboard/f9.png.import
new file mode 100644 (file)
index 0000000..35443ff
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://nnrfrc3ommb7"
+path="res://.godot/imported/f9.png-692565dadd5b0c59ead617be9796b927.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/f9.png"
+dest_files=["res://.godot/imported/f9.png-692565dadd5b0c59ead617be9796b927.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/input_prompts/icons/keyboard/forward_slash.png b/addons/input_prompts/icons/keyboard/forward_slash.png
new file mode 100644 (file)
index 0000000..006731e
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/forward_slash.png differ
diff --git a/addons/input_prompts/icons/keyboard/forward_slash.png.import b/addons/input_prompts/icons/keyboard/forward_slash.png.import
new file mode 100644 (file)
index 0000000..b93b62a
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cqt5gqqy8j5wy"
+path="res://.godot/imported/forward_slash.png-5a665474c272b5d8d0548ebbea0b93a9.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/forward_slash.png"
+dest_files=["res://.godot/imported/forward_slash.png-5a665474c272b5d8d0548ebbea0b93a9.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/input_prompts/icons/keyboard/g.png b/addons/input_prompts/icons/keyboard/g.png
new file mode 100644 (file)
index 0000000..1042d40
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/g.png differ
diff --git a/addons/input_prompts/icons/keyboard/g.png.import b/addons/input_prompts/icons/keyboard/g.png.import
new file mode 100644 (file)
index 0000000..1142b56
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://jw36dq3n1wg5"
+path="res://.godot/imported/g.png-4b970035bd3bd7d597579c5dc3c4a060.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/g.png"
+dest_files=["res://.godot/imported/g.png-4b970035bd3bd7d597579c5dc3c4a060.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/input_prompts/icons/keyboard/greater.png b/addons/input_prompts/icons/keyboard/greater.png
new file mode 100644 (file)
index 0000000..009d6d2
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/greater.png differ
diff --git a/addons/input_prompts/icons/keyboard/greater.png.import b/addons/input_prompts/icons/keyboard/greater.png.import
new file mode 100644 (file)
index 0000000..21aeae4
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cypb66qn0k6pe"
+path="res://.godot/imported/greater.png-cf9fe50b421aee0656bd9b1b88b4784b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/greater.png"
+dest_files=["res://.godot/imported/greater.png-cf9fe50b421aee0656bd9b1b88b4784b.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/input_prompts/icons/keyboard/h.png b/addons/input_prompts/icons/keyboard/h.png
new file mode 100644 (file)
index 0000000..cf1c9b4
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/h.png differ
diff --git a/addons/input_prompts/icons/keyboard/h.png.import b/addons/input_prompts/icons/keyboard/h.png.import
new file mode 100644 (file)
index 0000000..4a2bf96
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cnhd0necaevyy"
+path="res://.godot/imported/h.png-ef1b45f8dc757bc5b73d4c1f155db4ad.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/h.png"
+dest_files=["res://.godot/imported/h.png-ef1b45f8dc757bc5b73d4c1f155db4ad.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/input_prompts/icons/keyboard/hash.png b/addons/input_prompts/icons/keyboard/hash.png
new file mode 100644 (file)
index 0000000..dc20f57
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/hash.png differ
diff --git a/addons/input_prompts/icons/keyboard/hash.png.import b/addons/input_prompts/icons/keyboard/hash.png.import
new file mode 100644 (file)
index 0000000..c6910d8
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bfaw7orxjvpff"
+path="res://.godot/imported/hash.png-ef0d1e016a6976c2eb38b72a23f03bfa.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/hash.png"
+dest_files=["res://.godot/imported/hash.png-ef0d1e016a6976c2eb38b72a23f03bfa.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/input_prompts/icons/keyboard/home.png b/addons/input_prompts/icons/keyboard/home.png
new file mode 100644 (file)
index 0000000..2c0199f
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/home.png differ
diff --git a/addons/input_prompts/icons/keyboard/home.png.import b/addons/input_prompts/icons/keyboard/home.png.import
new file mode 100644 (file)
index 0000000..ffcd7a4
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dthwurl1jbgr2"
+path="res://.godot/imported/home.png-b53352b82ed36d2eaf2fdb62ae62d185.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/home.png"
+dest_files=["res://.godot/imported/home.png-b53352b82ed36d2eaf2fdb62ae62d185.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/input_prompts/icons/keyboard/i.png b/addons/input_prompts/icons/keyboard/i.png
new file mode 100644 (file)
index 0000000..912b0b6
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/i.png differ
diff --git a/addons/input_prompts/icons/keyboard/i.png.import b/addons/input_prompts/icons/keyboard/i.png.import
new file mode 100644 (file)
index 0000000..171d180
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cma0hx3a47704"
+path="res://.godot/imported/i.png-0205d7d7b294510dc171031c73e07ec0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/i.png"
+dest_files=["res://.godot/imported/i.png-0205d7d7b294510dc171031c73e07ec0.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/input_prompts/icons/keyboard/insert.png b/addons/input_prompts/icons/keyboard/insert.png
new file mode 100644 (file)
index 0000000..1af2a23
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/insert.png differ
diff --git a/addons/input_prompts/icons/keyboard/insert.png.import b/addons/input_prompts/icons/keyboard/insert.png.import
new file mode 100644 (file)
index 0000000..81fd6a3
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://brkti5bpv56nw"
+path="res://.godot/imported/insert.png-fe2aadfdbd24a70992dcc62c06922ce1.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/insert.png"
+dest_files=["res://.godot/imported/insert.png-fe2aadfdbd24a70992dcc62c06922ce1.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/input_prompts/icons/keyboard/j.png b/addons/input_prompts/icons/keyboard/j.png
new file mode 100644 (file)
index 0000000..fd0b569
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/j.png differ
diff --git a/addons/input_prompts/icons/keyboard/j.png.import b/addons/input_prompts/icons/keyboard/j.png.import
new file mode 100644 (file)
index 0000000..973ce5f
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dt7amdf8kea3e"
+path="res://.godot/imported/j.png-e54cf3d56b0af953943efa507e696900.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/j.png"
+dest_files=["res://.godot/imported/j.png-e54cf3d56b0af953943efa507e696900.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/input_prompts/icons/keyboard/k.png b/addons/input_prompts/icons/keyboard/k.png
new file mode 100644 (file)
index 0000000..738d336
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/k.png differ
diff --git a/addons/input_prompts/icons/keyboard/k.png.import b/addons/input_prompts/icons/keyboard/k.png.import
new file mode 100644 (file)
index 0000000..628d07d
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b5y36flrr7wk2"
+path="res://.godot/imported/k.png-6ae2f8d77bbc3ff4a62be824a10d2337.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/k.png"
+dest_files=["res://.godot/imported/k.png-6ae2f8d77bbc3ff4a62be824a10d2337.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/input_prompts/icons/keyboard/l.png b/addons/input_prompts/icons/keyboard/l.png
new file mode 100644 (file)
index 0000000..e9e92c8
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/l.png differ
diff --git a/addons/input_prompts/icons/keyboard/l.png.import b/addons/input_prompts/icons/keyboard/l.png.import
new file mode 100644 (file)
index 0000000..ade780b
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ii0rcifxy2s3"
+path="res://.godot/imported/l.png-ac9467524fb14d86c7c99d5dc5069d30.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/l.png"
+dest_files=["res://.godot/imported/l.png-ac9467524fb14d86c7c99d5dc5069d30.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/input_prompts/icons/keyboard/left.png b/addons/input_prompts/icons/keyboard/left.png
new file mode 100644 (file)
index 0000000..3783f7e
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/left.png differ
diff --git a/addons/input_prompts/icons/keyboard/left.png.import b/addons/input_prompts/icons/keyboard/left.png.import
new file mode 100644 (file)
index 0000000..2ba3756
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://btyg60vnh1m3p"
+path="res://.godot/imported/left.png-d24c11f761c1079a95164cefba1f6ebd.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/left.png"
+dest_files=["res://.godot/imported/left.png-d24c11f761c1079a95164cefba1f6ebd.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/input_prompts/icons/keyboard/left_brace.png b/addons/input_prompts/icons/keyboard/left_brace.png
new file mode 100644 (file)
index 0000000..599cd9f
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/left_brace.png differ
diff --git a/addons/input_prompts/icons/keyboard/left_brace.png.import b/addons/input_prompts/icons/keyboard/left_brace.png.import
new file mode 100644 (file)
index 0000000..bf4015b
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cr6vi6ebdr82a"
+path="res://.godot/imported/left_brace.png-251e22765121d1a504f83c04cda8e928.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/left_brace.png"
+dest_files=["res://.godot/imported/left_brace.png-251e22765121d1a504f83c04cda8e928.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/input_prompts/icons/keyboard/left_bracket.png b/addons/input_prompts/icons/keyboard/left_bracket.png
new file mode 100644 (file)
index 0000000..fa6d307
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/left_bracket.png differ
diff --git a/addons/input_prompts/icons/keyboard/left_bracket.png.import b/addons/input_prompts/icons/keyboard/left_bracket.png.import
new file mode 100644 (file)
index 0000000..2247229
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ccwwgsn2sp0tl"
+path="res://.godot/imported/left_bracket.png-33ff5153c5d6ace8c065c95464c8b30c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/left_bracket.png"
+dest_files=["res://.godot/imported/left_bracket.png-33ff5153c5d6ace8c065c95464c8b30c.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/input_prompts/icons/keyboard/left_paren.png b/addons/input_prompts/icons/keyboard/left_paren.png
new file mode 100644 (file)
index 0000000..9a75aa1
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/left_paren.png differ
diff --git a/addons/input_prompts/icons/keyboard/left_paren.png.import b/addons/input_prompts/icons/keyboard/left_paren.png.import
new file mode 100644 (file)
index 0000000..69bcc11
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cx6cpv3kpv14p"
+path="res://.godot/imported/left_paren.png-1fd70cdb32f5bdb03ed7c9ff345a709a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/left_paren.png"
+dest_files=["res://.godot/imported/left_paren.png-1fd70cdb32f5bdb03ed7c9ff345a709a.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/input_prompts/icons/keyboard/less.png b/addons/input_prompts/icons/keyboard/less.png
new file mode 100644 (file)
index 0000000..6f29f3e
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/less.png differ
diff --git a/addons/input_prompts/icons/keyboard/less.png.import b/addons/input_prompts/icons/keyboard/less.png.import
new file mode 100644 (file)
index 0000000..20c7be3
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ctjxnectq0at7"
+path="res://.godot/imported/less.png-ee9ede83fa15e0a83f25a576effe801a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/less.png"
+dest_files=["res://.godot/imported/less.png-ee9ede83fa15e0a83f25a576effe801a.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/input_prompts/icons/keyboard/m.png b/addons/input_prompts/icons/keyboard/m.png
new file mode 100644 (file)
index 0000000..e705a09
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/m.png differ
diff --git a/addons/input_prompts/icons/keyboard/m.png.import b/addons/input_prompts/icons/keyboard/m.png.import
new file mode 100644 (file)
index 0000000..88caa87
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bwdgt2l8japvf"
+path="res://.godot/imported/m.png-2dbbb62070f76916ab1f8ee01cb92203.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/m.png"
+dest_files=["res://.godot/imported/m.png-2dbbb62070f76916ab1f8ee01cb92203.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/input_prompts/icons/keyboard/media_back.png b/addons/input_prompts/icons/keyboard/media_back.png
new file mode 100644 (file)
index 0000000..b14dff2
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/media_back.png differ
diff --git a/addons/input_prompts/icons/keyboard/media_back.png.import b/addons/input_prompts/icons/keyboard/media_back.png.import
new file mode 100644 (file)
index 0000000..b3d981d
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ostblmf53v77"
+path="res://.godot/imported/media_back.png-e108d290bdb09b4acf02e5b6227c2fd3.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/media_back.png"
+dest_files=["res://.godot/imported/media_back.png-e108d290bdb09b4acf02e5b6227c2fd3.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/input_prompts/icons/keyboard/media_forward.png b/addons/input_prompts/icons/keyboard/media_forward.png
new file mode 100644 (file)
index 0000000..29ea8ff
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/media_forward.png differ
diff --git a/addons/input_prompts/icons/keyboard/media_forward.png.import b/addons/input_prompts/icons/keyboard/media_forward.png.import
new file mode 100644 (file)
index 0000000..c66fa64
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://thkia4a3h07o"
+path="res://.godot/imported/media_forward.png-6b7349cb45f3ab7593db8eef36b0d231.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/media_forward.png"
+dest_files=["res://.godot/imported/media_forward.png-6b7349cb45f3ab7593db8eef36b0d231.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/input_prompts/icons/keyboard/media_next.png b/addons/input_prompts/icons/keyboard/media_next.png
new file mode 100644 (file)
index 0000000..85d214c
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/media_next.png differ
diff --git a/addons/input_prompts/icons/keyboard/media_next.png.import b/addons/input_prompts/icons/keyboard/media_next.png.import
new file mode 100644 (file)
index 0000000..7b86d2b
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dju12hoog736a"
+path="res://.godot/imported/media_next.png-789ff24c70651d7eab10d00e2c9bdef1.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/media_next.png"
+dest_files=["res://.godot/imported/media_next.png-789ff24c70651d7eab10d00e2c9bdef1.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/input_prompts/icons/keyboard/media_pause.png b/addons/input_prompts/icons/keyboard/media_pause.png
new file mode 100644 (file)
index 0000000..6301cff
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/media_pause.png differ
diff --git a/addons/input_prompts/icons/keyboard/media_pause.png.import b/addons/input_prompts/icons/keyboard/media_pause.png.import
new file mode 100644 (file)
index 0000000..5991ba6
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d3rrcsgme7iwg"
+path="res://.godot/imported/media_pause.png-a9fc0bbb6a23f20e2fc618a7026506e6.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/media_pause.png"
+dest_files=["res://.godot/imported/media_pause.png-a9fc0bbb6a23f20e2fc618a7026506e6.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/input_prompts/icons/keyboard/media_play.png b/addons/input_prompts/icons/keyboard/media_play.png
new file mode 100644 (file)
index 0000000..cc9a811
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/media_play.png differ
diff --git a/addons/input_prompts/icons/keyboard/media_play.png.import b/addons/input_prompts/icons/keyboard/media_play.png.import
new file mode 100644 (file)
index 0000000..8959f49
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dbbleujvfc1c6"
+path="res://.godot/imported/media_play.png-1656090894772cfe6c63035681746fb0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/media_play.png"
+dest_files=["res://.godot/imported/media_play.png-1656090894772cfe6c63035681746fb0.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/input_prompts/icons/keyboard/media_previous.png b/addons/input_prompts/icons/keyboard/media_previous.png
new file mode 100644 (file)
index 0000000..611cd47
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/media_previous.png differ
diff --git a/addons/input_prompts/icons/keyboard/media_previous.png.import b/addons/input_prompts/icons/keyboard/media_previous.png.import
new file mode 100644 (file)
index 0000000..3b78afc
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://uhpi1g6sp81i"
+path="res://.godot/imported/media_previous.png-83b06d46f235fd91b46734cf2dba214a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/media_previous.png"
+dest_files=["res://.godot/imported/media_previous.png-83b06d46f235fd91b46734cf2dba214a.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/input_prompts/icons/keyboard/media_record.png b/addons/input_prompts/icons/keyboard/media_record.png
new file mode 100644 (file)
index 0000000..1ac8f68
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/media_record.png differ
diff --git a/addons/input_prompts/icons/keyboard/media_record.png.import b/addons/input_prompts/icons/keyboard/media_record.png.import
new file mode 100644 (file)
index 0000000..640b315
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://8664lp8ns1g3"
+path="res://.godot/imported/media_record.png-61c357752c896a4bcc3ee8ffb398c0eb.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/media_record.png"
+dest_files=["res://.godot/imported/media_record.png-61c357752c896a4bcc3ee8ffb398c0eb.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/input_prompts/icons/keyboard/media_stop.png b/addons/input_prompts/icons/keyboard/media_stop.png
new file mode 100644 (file)
index 0000000..a5fc108
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/media_stop.png differ
diff --git a/addons/input_prompts/icons/keyboard/media_stop.png.import b/addons/input_prompts/icons/keyboard/media_stop.png.import
new file mode 100644 (file)
index 0000000..b06d8aa
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://qvpqnw4ro2rv"
+path="res://.godot/imported/media_stop.png-241f6e408cdb22f0bc4e39e775593070.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/media_stop.png"
+dest_files=["res://.godot/imported/media_stop.png-241f6e408cdb22f0bc4e39e775593070.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/input_prompts/icons/keyboard/meta.png b/addons/input_prompts/icons/keyboard/meta.png
new file mode 100644 (file)
index 0000000..7c4b844
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/meta.png differ
diff --git a/addons/input_prompts/icons/keyboard/meta.png.import b/addons/input_prompts/icons/keyboard/meta.png.import
new file mode 100644 (file)
index 0000000..19f5be1
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cgmpe7f8a51vk"
+path="res://.godot/imported/meta.png-e67bec0f51d704d4342e17e06c6a4e00.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/meta.png"
+dest_files=["res://.godot/imported/meta.png-e67bec0f51d704d4342e17e06c6a4e00.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/input_prompts/icons/keyboard/minus.png b/addons/input_prompts/icons/keyboard/minus.png
new file mode 100644 (file)
index 0000000..660a303
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/minus.png differ
diff --git a/addons/input_prompts/icons/keyboard/minus.png.import b/addons/input_prompts/icons/keyboard/minus.png.import
new file mode 100644 (file)
index 0000000..7327a62
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b3vdyopl2ih21"
+path="res://.godot/imported/minus.png-3fb477d8f9a0c01d498cc35e61a99e98.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/minus.png"
+dest_files=["res://.godot/imported/minus.png-3fb477d8f9a0c01d498cc35e61a99e98.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/input_prompts/icons/keyboard/n.png b/addons/input_prompts/icons/keyboard/n.png
new file mode 100644 (file)
index 0000000..2657f81
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/n.png differ
diff --git a/addons/input_prompts/icons/keyboard/n.png.import b/addons/input_prompts/icons/keyboard/n.png.import
new file mode 100644 (file)
index 0000000..88d2d28
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cjsbhtfwtx7f5"
+path="res://.godot/imported/n.png-8ef8a9f43678be6484249ab9652453c4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/n.png"
+dest_files=["res://.godot/imported/n.png-8ef8a9f43678be6484249ab9652453c4.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/input_prompts/icons/keyboard/nbsp.png b/addons/input_prompts/icons/keyboard/nbsp.png
new file mode 100644 (file)
index 0000000..fee5060
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/nbsp.png differ
diff --git a/addons/input_prompts/icons/keyboard/nbsp.png.import b/addons/input_prompts/icons/keyboard/nbsp.png.import
new file mode 100644 (file)
index 0000000..2062618
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://byv3heuhqnbcl"
+path="res://.godot/imported/nbsp.png-8c45a2960cac8098d1db3e11924b7749.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/nbsp.png"
+dest_files=["res://.godot/imported/nbsp.png-8c45a2960cac8098d1db3e11924b7749.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/input_prompts/icons/keyboard/num.png b/addons/input_prompts/icons/keyboard/num.png
new file mode 100644 (file)
index 0000000..5b2c60d
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/num.png differ
diff --git a/addons/input_prompts/icons/keyboard/num.png.import b/addons/input_prompts/icons/keyboard/num.png.import
new file mode 100644 (file)
index 0000000..4cfdc87
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cx2cp4ju3epmd"
+path="res://.godot/imported/num.png-db1bdcd4a0b7ff11fcba5e4ac06f1867.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/num.png"
+dest_files=["res://.godot/imported/num.png-db1bdcd4a0b7ff11fcba5e4ac06f1867.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/input_prompts/icons/keyboard/o.png b/addons/input_prompts/icons/keyboard/o.png
new file mode 100644 (file)
index 0000000..80eabca
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/o.png differ
diff --git a/addons/input_prompts/icons/keyboard/o.png.import b/addons/input_prompts/icons/keyboard/o.png.import
new file mode 100644 (file)
index 0000000..da61529
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://7xbq5dekny17"
+path="res://.godot/imported/o.png-319f3fe32e3d2ecbab14934f4d3d21a7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/o.png"
+dest_files=["res://.godot/imported/o.png-319f3fe32e3d2ecbab14934f4d3d21a7.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/input_prompts/icons/keyboard/p.png b/addons/input_prompts/icons/keyboard/p.png
new file mode 100644 (file)
index 0000000..7b79bc6
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/p.png differ
diff --git a/addons/input_prompts/icons/keyboard/p.png.import b/addons/input_prompts/icons/keyboard/p.png.import
new file mode 100644 (file)
index 0000000..336a1cd
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b2l1ftvddvnl0"
+path="res://.godot/imported/p.png-8edd9eed6087219edc68e9045638a969.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/p.png"
+dest_files=["res://.godot/imported/p.png-8edd9eed6087219edc68e9045638a969.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/input_prompts/icons/keyboard/page_down.png b/addons/input_prompts/icons/keyboard/page_down.png
new file mode 100644 (file)
index 0000000..9b3d8d2
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/page_down.png differ
diff --git a/addons/input_prompts/icons/keyboard/page_down.png.import b/addons/input_prompts/icons/keyboard/page_down.png.import
new file mode 100644 (file)
index 0000000..a96ef30
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cl245ggdr7plr"
+path="res://.godot/imported/page_down.png-0d7386648e6939e63cd5ba73595182f0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/page_down.png"
+dest_files=["res://.godot/imported/page_down.png-0d7386648e6939e63cd5ba73595182f0.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/input_prompts/icons/keyboard/page_up.png b/addons/input_prompts/icons/keyboard/page_up.png
new file mode 100644 (file)
index 0000000..d3b4e08
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/page_up.png differ
diff --git a/addons/input_prompts/icons/keyboard/page_up.png.import b/addons/input_prompts/icons/keyboard/page_up.png.import
new file mode 100644 (file)
index 0000000..b6b0840
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://gtj6cb8hu55h"
+path="res://.godot/imported/page_up.png-1b0bc1d09c5cd426dc571b62689efde1.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/page_up.png"
+dest_files=["res://.godot/imported/page_up.png-1b0bc1d09c5cd426dc571b62689efde1.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/input_prompts/icons/keyboard/pause.png b/addons/input_prompts/icons/keyboard/pause.png
new file mode 100644 (file)
index 0000000..38bf2f5
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/pause.png differ
diff --git a/addons/input_prompts/icons/keyboard/pause.png.import b/addons/input_prompts/icons/keyboard/pause.png.import
new file mode 100644 (file)
index 0000000..083c71e
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://36860dqbw5ob"
+path="res://.godot/imported/pause.png-65b64f294ac8cdc678637650541a587a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/pause.png"
+dest_files=["res://.godot/imported/pause.png-65b64f294ac8cdc678637650541a587a.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/input_prompts/icons/keyboard/percent.png b/addons/input_prompts/icons/keyboard/percent.png
new file mode 100644 (file)
index 0000000..321f3b4
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/percent.png differ
diff --git a/addons/input_prompts/icons/keyboard/percent.png.import b/addons/input_prompts/icons/keyboard/percent.png.import
new file mode 100644 (file)
index 0000000..16468d7
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dlbg4k1tcijbq"
+path="res://.godot/imported/percent.png-624bb7825fe0336783ce029422834019.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/percent.png"
+dest_files=["res://.godot/imported/percent.png-624bb7825fe0336783ce029422834019.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/input_prompts/icons/keyboard/period.png b/addons/input_prompts/icons/keyboard/period.png
new file mode 100644 (file)
index 0000000..20a68fc
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/period.png differ
diff --git a/addons/input_prompts/icons/keyboard/period.png.import b/addons/input_prompts/icons/keyboard/period.png.import
new file mode 100644 (file)
index 0000000..f0602e6
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bx75sy6bae8p3"
+path="res://.godot/imported/period.png-2f698070a83b91a6202d9e4656d20197.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/period.png"
+dest_files=["res://.godot/imported/period.png-2f698070a83b91a6202d9e4656d20197.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/input_prompts/icons/keyboard/pipe.png b/addons/input_prompts/icons/keyboard/pipe.png
new file mode 100644 (file)
index 0000000..d46ef1a
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/pipe.png differ
diff --git a/addons/input_prompts/icons/keyboard/pipe.png.import b/addons/input_prompts/icons/keyboard/pipe.png.import
new file mode 100644 (file)
index 0000000..3661cef
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bt4ldbkius5c3"
+path="res://.godot/imported/pipe.png-668a9e770aa39b39b1ace43809760878.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/pipe.png"
+dest_files=["res://.godot/imported/pipe.png-668a9e770aa39b39b1ace43809760878.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/input_prompts/icons/keyboard/plus.png b/addons/input_prompts/icons/keyboard/plus.png
new file mode 100644 (file)
index 0000000..5bf5478
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/plus.png differ
diff --git a/addons/input_prompts/icons/keyboard/plus.png.import b/addons/input_prompts/icons/keyboard/plus.png.import
new file mode 100644 (file)
index 0000000..859f024
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c0htdc3d44lbb"
+path="res://.godot/imported/plus.png-ceb7ecf096932cc8038b3bed56a16ea9.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/plus.png"
+dest_files=["res://.godot/imported/plus.png-ceb7ecf096932cc8038b3bed56a16ea9.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/input_prompts/icons/keyboard/print.png b/addons/input_prompts/icons/keyboard/print.png
new file mode 100644 (file)
index 0000000..dcca881
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/print.png differ
diff --git a/addons/input_prompts/icons/keyboard/print.png.import b/addons/input_prompts/icons/keyboard/print.png.import
new file mode 100644 (file)
index 0000000..81d8812
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d0l0h0ihsyxk2"
+path="res://.godot/imported/print.png-8d799e0ee9ec056935b006dff5bb02cc.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/print.png"
+dest_files=["res://.godot/imported/print.png-8d799e0ee9ec056935b006dff5bb02cc.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/input_prompts/icons/keyboard/q.png b/addons/input_prompts/icons/keyboard/q.png
new file mode 100644 (file)
index 0000000..e202f88
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/q.png differ
diff --git a/addons/input_prompts/icons/keyboard/q.png.import b/addons/input_prompts/icons/keyboard/q.png.import
new file mode 100644 (file)
index 0000000..247d92a
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c65r2dyaf7vmq"
+path="res://.godot/imported/q.png-1fcbfecd352ff1e87f19987756fcd5fb.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/q.png"
+dest_files=["res://.godot/imported/q.png-1fcbfecd352ff1e87f19987756fcd5fb.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/input_prompts/icons/keyboard/question.png b/addons/input_prompts/icons/keyboard/question.png
new file mode 100644 (file)
index 0000000..672d401
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/question.png differ
diff --git a/addons/input_prompts/icons/keyboard/question.png.import b/addons/input_prompts/icons/keyboard/question.png.import
new file mode 100644 (file)
index 0000000..0488d73
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://oqliqplljlqb"
+path="res://.godot/imported/question.png-4d606b23e50567346cde438a6689fa3d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/question.png"
+dest_files=["res://.godot/imported/question.png-4d606b23e50567346cde438a6689fa3d.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/input_prompts/icons/keyboard/quote.png b/addons/input_prompts/icons/keyboard/quote.png
new file mode 100644 (file)
index 0000000..4498d2c
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/quote.png differ
diff --git a/addons/input_prompts/icons/keyboard/quote.png.import b/addons/input_prompts/icons/keyboard/quote.png.import
new file mode 100644 (file)
index 0000000..a20fd94
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c7ul2t73hkrh2"
+path="res://.godot/imported/quote.png-fceb69efb2f4f5661b8465abc9a70146.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/quote.png"
+dest_files=["res://.godot/imported/quote.png-fceb69efb2f4f5661b8465abc9a70146.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/input_prompts/icons/keyboard/r.png b/addons/input_prompts/icons/keyboard/r.png
new file mode 100644 (file)
index 0000000..88ad1b1
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/r.png differ
diff --git a/addons/input_prompts/icons/keyboard/r.png.import b/addons/input_prompts/icons/keyboard/r.png.import
new file mode 100644 (file)
index 0000000..8d190b6
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bl0h0oouf2koo"
+path="res://.godot/imported/r.png-2d3c35aea4e2f88aceecc443f3affd6f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/r.png"
+dest_files=["res://.godot/imported/r.png-2d3c35aea4e2f88aceecc443f3affd6f.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/input_prompts/icons/keyboard/right.png b/addons/input_prompts/icons/keyboard/right.png
new file mode 100644 (file)
index 0000000..96336f1
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/right.png differ
diff --git a/addons/input_prompts/icons/keyboard/right.png.import b/addons/input_prompts/icons/keyboard/right.png.import
new file mode 100644 (file)
index 0000000..940a29b
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ci7hl8jhywnrm"
+path="res://.godot/imported/right.png-358bb90ee09a0e36f8ddd0f428bff2e4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/right.png"
+dest_files=["res://.godot/imported/right.png-358bb90ee09a0e36f8ddd0f428bff2e4.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/input_prompts/icons/keyboard/right_brace.png b/addons/input_prompts/icons/keyboard/right_brace.png
new file mode 100644 (file)
index 0000000..9e7c525
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/right_brace.png differ
diff --git a/addons/input_prompts/icons/keyboard/right_brace.png.import b/addons/input_prompts/icons/keyboard/right_brace.png.import
new file mode 100644 (file)
index 0000000..582972d
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ccag2aejxluu2"
+path="res://.godot/imported/right_brace.png-c7c9b79f4187e2a4ad3bf8294172d2e0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/right_brace.png"
+dest_files=["res://.godot/imported/right_brace.png-c7c9b79f4187e2a4ad3bf8294172d2e0.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/input_prompts/icons/keyboard/right_bracket.png b/addons/input_prompts/icons/keyboard/right_bracket.png
new file mode 100644 (file)
index 0000000..e1881e8
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/right_bracket.png differ
diff --git a/addons/input_prompts/icons/keyboard/right_bracket.png.import b/addons/input_prompts/icons/keyboard/right_bracket.png.import
new file mode 100644 (file)
index 0000000..024be79
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://04hpun881id1"
+path="res://.godot/imported/right_bracket.png-74f3286f4b67e0ebc806b7068799952f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/right_bracket.png"
+dest_files=["res://.godot/imported/right_bracket.png-74f3286f4b67e0ebc806b7068799952f.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/input_prompts/icons/keyboard/right_paren.png b/addons/input_prompts/icons/keyboard/right_paren.png
new file mode 100644 (file)
index 0000000..12aa8db
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/right_paren.png differ
diff --git a/addons/input_prompts/icons/keyboard/right_paren.png.import b/addons/input_prompts/icons/keyboard/right_paren.png.import
new file mode 100644 (file)
index 0000000..73a4e20
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bqihft4hpiyww"
+path="res://.godot/imported/right_paren.png-7321aa9db29b8429571b5a0990ef89e5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/right_paren.png"
+dest_files=["res://.godot/imported/right_paren.png-7321aa9db29b8429571b5a0990ef89e5.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/input_prompts/icons/keyboard/s.png b/addons/input_prompts/icons/keyboard/s.png
new file mode 100644 (file)
index 0000000..500206c
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/s.png differ
diff --git a/addons/input_prompts/icons/keyboard/s.png.import b/addons/input_prompts/icons/keyboard/s.png.import
new file mode 100644 (file)
index 0000000..c871f36
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bwhf0tx67yj7a"
+path="res://.godot/imported/s.png-824b3366d9079b6136d538e69f1ce25b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/s.png"
+dest_files=["res://.godot/imported/s.png-824b3366d9079b6136d538e69f1ce25b.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/input_prompts/icons/keyboard/scroll.png b/addons/input_prompts/icons/keyboard/scroll.png
new file mode 100644 (file)
index 0000000..5b62350
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/scroll.png differ
diff --git a/addons/input_prompts/icons/keyboard/scroll.png.import b/addons/input_prompts/icons/keyboard/scroll.png.import
new file mode 100644 (file)
index 0000000..f83ed00
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d1xxjb2dmoube"
+path="res://.godot/imported/scroll.png-62a5d1e229341e47c40a8b3fa6b76b53.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/scroll.png"
+dest_files=["res://.godot/imported/scroll.png-62a5d1e229341e47c40a8b3fa6b76b53.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/input_prompts/icons/keyboard/semicolon.png b/addons/input_prompts/icons/keyboard/semicolon.png
new file mode 100644 (file)
index 0000000..de73fa4
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/semicolon.png differ
diff --git a/addons/input_prompts/icons/keyboard/semicolon.png.import b/addons/input_prompts/icons/keyboard/semicolon.png.import
new file mode 100644 (file)
index 0000000..2a0c5a3
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://brap3jmkcighr"
+path="res://.godot/imported/semicolon.png-3fd68a06ef21843e3ba6c12462c48365.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/semicolon.png"
+dest_files=["res://.godot/imported/semicolon.png-3fd68a06ef21843e3ba6c12462c48365.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/input_prompts/icons/keyboard/shift.png b/addons/input_prompts/icons/keyboard/shift.png
new file mode 100644 (file)
index 0000000..da88551
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/shift.png differ
diff --git a/addons/input_prompts/icons/keyboard/shift.png.import b/addons/input_prompts/icons/keyboard/shift.png.import
new file mode 100644 (file)
index 0000000..7a56fcd
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bexwbmh0e7s1"
+path="res://.godot/imported/shift.png-7a684287d1a40156a4c6c8e16f1021c6.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/shift.png"
+dest_files=["res://.godot/imported/shift.png-7a684287d1a40156a4c6c8e16f1021c6.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/input_prompts/icons/keyboard/space.png b/addons/input_prompts/icons/keyboard/space.png
new file mode 100644 (file)
index 0000000..c5e35ab
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/space.png differ
diff --git a/addons/input_prompts/icons/keyboard/space.png.import b/addons/input_prompts/icons/keyboard/space.png.import
new file mode 100644 (file)
index 0000000..7e40255
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bkdxv2b3bqdu8"
+path="res://.godot/imported/space.png-9c97410491849569de3a8db5935527f4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/space.png"
+dest_files=["res://.godot/imported/space.png-9c97410491849569de3a8db5935527f4.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/input_prompts/icons/keyboard/t.png b/addons/input_prompts/icons/keyboard/t.png
new file mode 100644 (file)
index 0000000..1409447
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/t.png differ
diff --git a/addons/input_prompts/icons/keyboard/t.png.import b/addons/input_prompts/icons/keyboard/t.png.import
new file mode 100644 (file)
index 0000000..6f72c6d
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://6guh8jedcfc8"
+path="res://.godot/imported/t.png-bad755efdb532f2b3ae2a76d6905ad34.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/t.png"
+dest_files=["res://.godot/imported/t.png-bad755efdb532f2b3ae2a76d6905ad34.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/input_prompts/icons/keyboard/tab.png b/addons/input_prompts/icons/keyboard/tab.png
new file mode 100644 (file)
index 0000000..b262a32
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/tab.png differ
diff --git a/addons/input_prompts/icons/keyboard/tab.png.import b/addons/input_prompts/icons/keyboard/tab.png.import
new file mode 100644 (file)
index 0000000..69ee91d
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dv4m8ks5g6uj1"
+path="res://.godot/imported/tab.png-2d2a91ea5f54a14d4ef997db3911d024.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/tab.png"
+dest_files=["res://.godot/imported/tab.png-2d2a91ea5f54a14d4ef997db3911d024.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/input_prompts/icons/keyboard/tilde.png b/addons/input_prompts/icons/keyboard/tilde.png
new file mode 100644 (file)
index 0000000..358bb52
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/tilde.png differ
diff --git a/addons/input_prompts/icons/keyboard/tilde.png.import b/addons/input_prompts/icons/keyboard/tilde.png.import
new file mode 100644 (file)
index 0000000..466bc72
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bj3eywfqt3xfl"
+path="res://.godot/imported/tilde.png-f76152cb15fbd80e1a062abad6c7e961.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/tilde.png"
+dest_files=["res://.godot/imported/tilde.png-f76152cb15fbd80e1a062abad6c7e961.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/input_prompts/icons/keyboard/tile_0504.png b/addons/input_prompts/icons/keyboard/tile_0504.png
new file mode 100644 (file)
index 0000000..315ff41
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/tile_0504.png differ
diff --git a/addons/input_prompts/icons/keyboard/tile_0504.png.import b/addons/input_prompts/icons/keyboard/tile_0504.png.import
new file mode 100644 (file)
index 0000000..fddf89e
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://s8ju3gpe4ba8"
+path="res://.godot/imported/tile_0504.png-a69b61f87fd9385aa3c4b9dd668eb153.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/tile_0504.png"
+dest_files=["res://.godot/imported/tile_0504.png-a69b61f87fd9385aa3c4b9dd668eb153.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/input_prompts/icons/keyboard/u.png b/addons/input_prompts/icons/keyboard/u.png
new file mode 100644 (file)
index 0000000..4c4b26e
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/u.png differ
diff --git a/addons/input_prompts/icons/keyboard/u.png.import b/addons/input_prompts/icons/keyboard/u.png.import
new file mode 100644 (file)
index 0000000..eb661a0
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://brr13r75g8u2d"
+path="res://.godot/imported/u.png-e692ee843befb5756d97c4553c8bb1df.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/u.png"
+dest_files=["res://.godot/imported/u.png-e692ee843befb5756d97c4553c8bb1df.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/input_prompts/icons/keyboard/underscore.png b/addons/input_prompts/icons/keyboard/underscore.png
new file mode 100644 (file)
index 0000000..38dc15a
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/underscore.png differ
diff --git a/addons/input_prompts/icons/keyboard/underscore.png.import b/addons/input_prompts/icons/keyboard/underscore.png.import
new file mode 100644 (file)
index 0000000..dfc1414
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://38vinib8ctm"
+path="res://.godot/imported/underscore.png-4a92d3bd16ecff585811997531bd1dbc.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/underscore.png"
+dest_files=["res://.godot/imported/underscore.png-4a92d3bd16ecff585811997531bd1dbc.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/input_prompts/icons/keyboard/up.png b/addons/input_prompts/icons/keyboard/up.png
new file mode 100644 (file)
index 0000000..76a1580
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/up.png differ
diff --git a/addons/input_prompts/icons/keyboard/up.png.import b/addons/input_prompts/icons/keyboard/up.png.import
new file mode 100644 (file)
index 0000000..1678966
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://3bvyef0f0p5w"
+path="res://.godot/imported/up.png-de4151031266fdb7ffd90a0cbc005cc1.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/up.png"
+dest_files=["res://.godot/imported/up.png-de4151031266fdb7ffd90a0cbc005cc1.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/input_prompts/icons/keyboard/v.png b/addons/input_prompts/icons/keyboard/v.png
new file mode 100644 (file)
index 0000000..14bc0ee
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/v.png differ
diff --git a/addons/input_prompts/icons/keyboard/v.png.import b/addons/input_prompts/icons/keyboard/v.png.import
new file mode 100644 (file)
index 0000000..258c0b2
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://5tfe20xqsam3"
+path="res://.godot/imported/v.png-848ff98b289c292f9581443dd1ab2376.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/v.png"
+dest_files=["res://.godot/imported/v.png-848ff98b289c292f9581443dd1ab2376.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/input_prompts/icons/keyboard/w.png b/addons/input_prompts/icons/keyboard/w.png
new file mode 100644 (file)
index 0000000..46ee011
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/w.png differ
diff --git a/addons/input_prompts/icons/keyboard/w.png.import b/addons/input_prompts/icons/keyboard/w.png.import
new file mode 100644 (file)
index 0000000..60c7b6a
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://buo4ntxw1vofu"
+path="res://.godot/imported/w.png-0c6d370724c7ffe169e69c1181793c1b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/w.png"
+dest_files=["res://.godot/imported/w.png-0c6d370724c7ffe169e69c1181793c1b.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/input_prompts/icons/keyboard/x.png b/addons/input_prompts/icons/keyboard/x.png
new file mode 100644 (file)
index 0000000..0dd5065
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/x.png differ
diff --git a/addons/input_prompts/icons/keyboard/x.png.import b/addons/input_prompts/icons/keyboard/x.png.import
new file mode 100644 (file)
index 0000000..3110ded
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dgp4d8a0ihmye"
+path="res://.godot/imported/x.png-005384c6763d1767de1757a76e366207.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/x.png"
+dest_files=["res://.godot/imported/x.png-005384c6763d1767de1757a76e366207.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/input_prompts/icons/keyboard/y.png b/addons/input_prompts/icons/keyboard/y.png
new file mode 100644 (file)
index 0000000..b88a385
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/y.png differ
diff --git a/addons/input_prompts/icons/keyboard/y.png.import b/addons/input_prompts/icons/keyboard/y.png.import
new file mode 100644 (file)
index 0000000..c01d3ed
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d2w845et14y24"
+path="res://.godot/imported/y.png-b842bb0e3a4c2e99bd1f326d7b4d7d64.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/y.png"
+dest_files=["res://.godot/imported/y.png-b842bb0e3a4c2e99bd1f326d7b4d7d64.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/input_prompts/icons/keyboard/z.png b/addons/input_prompts/icons/keyboard/z.png
new file mode 100644 (file)
index 0000000..bfb3768
Binary files /dev/null and b/addons/input_prompts/icons/keyboard/z.png differ
diff --git a/addons/input_prompts/icons/keyboard/z.png.import b/addons/input_prompts/icons/keyboard/z.png.import
new file mode 100644 (file)
index 0000000..e1cfb77
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d045ew7wsb7tf"
+path="res://.godot/imported/z.png-5cd328525d73dfe97229fd8077a990e3.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/keyboard/z.png"
+dest_files=["res://.godot/imported/z.png-5cd328525d73dfe97229fd8077a990e3.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/input_prompts/icons/mouse/left.png b/addons/input_prompts/icons/mouse/left.png
new file mode 100644 (file)
index 0000000..b291252
Binary files /dev/null and b/addons/input_prompts/icons/mouse/left.png differ
diff --git a/addons/input_prompts/icons/mouse/left.png.import b/addons/input_prompts/icons/mouse/left.png.import
new file mode 100644 (file)
index 0000000..5eda768
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d0bfvcxip20dc"
+path="res://.godot/imported/left.png-423f505fecc7d98cd9a261097790dc9c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/mouse/left.png"
+dest_files=["res://.godot/imported/left.png-423f505fecc7d98cd9a261097790dc9c.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/input_prompts/icons/mouse/middle.png b/addons/input_prompts/icons/mouse/middle.png
new file mode 100644 (file)
index 0000000..6c376b0
Binary files /dev/null and b/addons/input_prompts/icons/mouse/middle.png differ
diff --git a/addons/input_prompts/icons/mouse/middle.png.import b/addons/input_prompts/icons/mouse/middle.png.import
new file mode 100644 (file)
index 0000000..aadfa3a
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b4ih2kvt8mit0"
+path="res://.godot/imported/middle.png-32acd8b5d89de355862f93cb258eacb4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/mouse/middle.png"
+dest_files=["res://.godot/imported/middle.png-32acd8b5d89de355862f93cb258eacb4.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/input_prompts/icons/mouse/right.png b/addons/input_prompts/icons/mouse/right.png
new file mode 100644 (file)
index 0000000..96943d1
Binary files /dev/null and b/addons/input_prompts/icons/mouse/right.png differ
diff --git a/addons/input_prompts/icons/mouse/right.png.import b/addons/input_prompts/icons/mouse/right.png.import
new file mode 100644 (file)
index 0000000..979ef81
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dtq7m7h8im036"
+path="res://.godot/imported/right.png-55669ecf7061af957ea2a73df150ffc0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/mouse/right.png"
+dest_files=["res://.godot/imported/right.png-55669ecf7061af957ea2a73df150ffc0.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/input_prompts/icons/mouse/wheel_down.png b/addons/input_prompts/icons/mouse/wheel_down.png
new file mode 100644 (file)
index 0000000..e3874c2
Binary files /dev/null and b/addons/input_prompts/icons/mouse/wheel_down.png differ
diff --git a/addons/input_prompts/icons/mouse/wheel_down.png.import b/addons/input_prompts/icons/mouse/wheel_down.png.import
new file mode 100644 (file)
index 0000000..9d5d039
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bkgtieikd4hrg"
+path="res://.godot/imported/wheel_down.png-12a452a0e4f17f79496c626a7960b0b9.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/mouse/wheel_down.png"
+dest_files=["res://.godot/imported/wheel_down.png-12a452a0e4f17f79496c626a7960b0b9.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/input_prompts/icons/mouse/wheel_left.png b/addons/input_prompts/icons/mouse/wheel_left.png
new file mode 100644 (file)
index 0000000..9e07bcf
Binary files /dev/null and b/addons/input_prompts/icons/mouse/wheel_left.png differ
diff --git a/addons/input_prompts/icons/mouse/wheel_left.png.import b/addons/input_prompts/icons/mouse/wheel_left.png.import
new file mode 100644 (file)
index 0000000..61fc158
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://1gb8h0fmwu6h"
+path="res://.godot/imported/wheel_left.png-c891077ea90bbe167a1b755bd57e5309.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/mouse/wheel_left.png"
+dest_files=["res://.godot/imported/wheel_left.png-c891077ea90bbe167a1b755bd57e5309.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/input_prompts/icons/mouse/wheel_right.png b/addons/input_prompts/icons/mouse/wheel_right.png
new file mode 100644 (file)
index 0000000..c4de5d2
Binary files /dev/null and b/addons/input_prompts/icons/mouse/wheel_right.png differ
diff --git a/addons/input_prompts/icons/mouse/wheel_right.png.import b/addons/input_prompts/icons/mouse/wheel_right.png.import
new file mode 100644 (file)
index 0000000..d2f4c8f
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dmblfllnnkgou"
+path="res://.godot/imported/wheel_right.png-dfd2df91220c6cee2f3ae19c6af9c3a0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/mouse/wheel_right.png"
+dest_files=["res://.godot/imported/wheel_right.png-dfd2df91220c6cee2f3ae19c6af9c3a0.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/input_prompts/icons/mouse/wheel_up.png b/addons/input_prompts/icons/mouse/wheel_up.png
new file mode 100644 (file)
index 0000000..4842cb7
Binary files /dev/null and b/addons/input_prompts/icons/mouse/wheel_up.png differ
diff --git a/addons/input_prompts/icons/mouse/wheel_up.png.import b/addons/input_prompts/icons/mouse/wheel_up.png.import
new file mode 100644 (file)
index 0000000..00831d5
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cybx1ogrrc1si"
+path="res://.godot/imported/wheel_up.png-82d882ab92be30aefe04706285255ee4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/mouse/wheel_up.png"
+dest_files=["res://.godot/imported/wheel_up.png-82d882ab92be30aefe04706285255ee4.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/input_prompts/icons/nintendo/a.png b/addons/input_prompts/icons/nintendo/a.png
new file mode 100644 (file)
index 0000000..3e1e0ff
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/a.png differ
diff --git a/addons/input_prompts/icons/nintendo/a.png.import b/addons/input_prompts/icons/nintendo/a.png.import
new file mode 100644 (file)
index 0000000..615e889
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://kqpiteswedha"
+path="res://.godot/imported/a.png-d3625944f0fae938547758d1f91b340b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/a.png"
+dest_files=["res://.godot/imported/a.png-d3625944f0fae938547758d1f91b340b.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/input_prompts/icons/nintendo/b.png b/addons/input_prompts/icons/nintendo/b.png
new file mode 100644 (file)
index 0000000..c84c051
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/b.png differ
diff --git a/addons/input_prompts/icons/nintendo/b.png.import b/addons/input_prompts/icons/nintendo/b.png.import
new file mode 100644 (file)
index 0000000..5faaa68
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bdhuy2yjfgaqo"
+path="res://.godot/imported/b.png-0623c1bea181a452656513091077ef10.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/b.png"
+dest_files=["res://.godot/imported/b.png-0623c1bea181a452656513091077ef10.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/input_prompts/icons/nintendo/capture.png b/addons/input_prompts/icons/nintendo/capture.png
new file mode 100644 (file)
index 0000000..c04e248
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/capture.png differ
diff --git a/addons/input_prompts/icons/nintendo/capture.png.import b/addons/input_prompts/icons/nintendo/capture.png.import
new file mode 100644 (file)
index 0000000..8302430
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://4pysljtin4uu"
+path="res://.godot/imported/capture.png-7227b994c736ffb366d446d9541262b9.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/capture.png"
+dest_files=["res://.godot/imported/capture.png-7227b994c736ffb366d446d9541262b9.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/input_prompts/icons/nintendo/down.png b/addons/input_prompts/icons/nintendo/down.png
new file mode 100644 (file)
index 0000000..e41c0ce
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/down.png differ
diff --git a/addons/input_prompts/icons/nintendo/down.png.import b/addons/input_prompts/icons/nintendo/down.png.import
new file mode 100644 (file)
index 0000000..213c309
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cfriumkgbsb6w"
+path="res://.godot/imported/down.png-7c858e24164785aeeac96f8a8d612906.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/down.png"
+dest_files=["res://.godot/imported/down.png-7c858e24164785aeeac96f8a8d612906.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/input_prompts/icons/nintendo/home.png b/addons/input_prompts/icons/nintendo/home.png
new file mode 100644 (file)
index 0000000..a7ff2cc
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/home.png differ
diff --git a/addons/input_prompts/icons/nintendo/home.png.import b/addons/input_prompts/icons/nintendo/home.png.import
new file mode 100644 (file)
index 0000000..72453b3
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cckemm2jwovpj"
+path="res://.godot/imported/home.png-903b1af3d0e0d866637ad9488bba4c84.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/home.png"
+dest_files=["res://.godot/imported/home.png-903b1af3d0e0d866637ad9488bba4c84.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/input_prompts/icons/nintendo/l.png b/addons/input_prompts/icons/nintendo/l.png
new file mode 100644 (file)
index 0000000..03ad758
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/l.png differ
diff --git a/addons/input_prompts/icons/nintendo/l.png.import b/addons/input_prompts/icons/nintendo/l.png.import
new file mode 100644 (file)
index 0000000..8ab1b99
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bm2ocs8hcdwaw"
+path="res://.godot/imported/l.png-90d0b67c4354d51a24f9fa3e563e25e6.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/l.png"
+dest_files=["res://.godot/imported/l.png-90d0b67c4354d51a24f9fa3e563e25e6.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/input_prompts/icons/nintendo/left.png b/addons/input_prompts/icons/nintendo/left.png
new file mode 100644 (file)
index 0000000..e965d3c
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/left.png differ
diff --git a/addons/input_prompts/icons/nintendo/left.png.import b/addons/input_prompts/icons/nintendo/left.png.import
new file mode 100644 (file)
index 0000000..335d41c
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bfx1oiuxfvdoa"
+path="res://.godot/imported/left.png-4152742b2d6080dffe0eb761bf02f614.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/left.png"
+dest_files=["res://.godot/imported/left.png-4152742b2d6080dffe0eb761bf02f614.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/input_prompts/icons/nintendo/left_stick.png b/addons/input_prompts/icons/nintendo/left_stick.png
new file mode 100644 (file)
index 0000000..6498737
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/left_stick.png differ
diff --git a/addons/input_prompts/icons/nintendo/left_stick.png.import b/addons/input_prompts/icons/nintendo/left_stick.png.import
new file mode 100644 (file)
index 0000000..f63de78
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://8ixovmgh4p5c"
+path="res://.godot/imported/left_stick.png-1cc98d8025a82757c07cef6561a5a890.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/left_stick.png"
+dest_files=["res://.godot/imported/left_stick.png-1cc98d8025a82757c07cef6561a5a890.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/input_prompts/icons/nintendo/minus.png b/addons/input_prompts/icons/nintendo/minus.png
new file mode 100644 (file)
index 0000000..8d98afd
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/minus.png differ
diff --git a/addons/input_prompts/icons/nintendo/minus.png.import b/addons/input_prompts/icons/nintendo/minus.png.import
new file mode 100644 (file)
index 0000000..1654b4c
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dm8ct1c16ybog"
+path="res://.godot/imported/minus.png-ac762d4a303383f61032cae7e02ed5f8.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/minus.png"
+dest_files=["res://.godot/imported/minus.png-ac762d4a303383f61032cae7e02ed5f8.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/input_prompts/icons/nintendo/plus.png b/addons/input_prompts/icons/nintendo/plus.png
new file mode 100644 (file)
index 0000000..5f951c6
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/plus.png differ
diff --git a/addons/input_prompts/icons/nintendo/plus.png.import b/addons/input_prompts/icons/nintendo/plus.png.import
new file mode 100644 (file)
index 0000000..1c911e2
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bg1nql3gmvi8f"
+path="res://.godot/imported/plus.png-6d22f46f8ace2eeba8952278ee47eb58.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/plus.png"
+dest_files=["res://.godot/imported/plus.png-6d22f46f8ace2eeba8952278ee47eb58.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/input_prompts/icons/nintendo/r.png b/addons/input_prompts/icons/nintendo/r.png
new file mode 100644 (file)
index 0000000..301482a
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/r.png differ
diff --git a/addons/input_prompts/icons/nintendo/r.png.import b/addons/input_prompts/icons/nintendo/r.png.import
new file mode 100644 (file)
index 0000000..482642b
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://t6b3hdkex5sn"
+path="res://.godot/imported/r.png-c196209937050f8badba2f1a8d526635.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/r.png"
+dest_files=["res://.godot/imported/r.png-c196209937050f8badba2f1a8d526635.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/input_prompts/icons/nintendo/right.png b/addons/input_prompts/icons/nintendo/right.png
new file mode 100644 (file)
index 0000000..8b2443f
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/right.png differ
diff --git a/addons/input_prompts/icons/nintendo/right.png.import b/addons/input_prompts/icons/nintendo/right.png.import
new file mode 100644 (file)
index 0000000..5c56ad6
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://8udwa7p18dmn"
+path="res://.godot/imported/right.png-99b283d0105554be6274322310090dd6.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/right.png"
+dest_files=["res://.godot/imported/right.png-99b283d0105554be6274322310090dd6.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/input_prompts/icons/nintendo/right_stick.png b/addons/input_prompts/icons/nintendo/right_stick.png
new file mode 100644 (file)
index 0000000..d071144
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/right_stick.png differ
diff --git a/addons/input_prompts/icons/nintendo/right_stick.png.import b/addons/input_prompts/icons/nintendo/right_stick.png.import
new file mode 100644 (file)
index 0000000..8fcfcd9
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ycamq7yys184"
+path="res://.godot/imported/right_stick.png-2ed9872d09f6b158bddbe51ea3d4091a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/right_stick.png"
+dest_files=["res://.godot/imported/right_stick.png-2ed9872d09f6b158bddbe51ea3d4091a.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/input_prompts/icons/nintendo/up.png b/addons/input_prompts/icons/nintendo/up.png
new file mode 100644 (file)
index 0000000..6670a25
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/up.png differ
diff --git a/addons/input_prompts/icons/nintendo/up.png.import b/addons/input_prompts/icons/nintendo/up.png.import
new file mode 100644 (file)
index 0000000..3915432
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dg3np7m1d5cgr"
+path="res://.godot/imported/up.png-e12e2bdf65bbaefccb29b348d7bf542b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/up.png"
+dest_files=["res://.godot/imported/up.png-e12e2bdf65bbaefccb29b348d7bf542b.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/input_prompts/icons/nintendo/x.png b/addons/input_prompts/icons/nintendo/x.png
new file mode 100644 (file)
index 0000000..138aa94
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/x.png differ
diff --git a/addons/input_prompts/icons/nintendo/x.png.import b/addons/input_prompts/icons/nintendo/x.png.import
new file mode 100644 (file)
index 0000000..5624610
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://4sj35y12txc1"
+path="res://.godot/imported/x.png-1d4673530b1ae8f5a94928e4bd94066e.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/x.png"
+dest_files=["res://.godot/imported/x.png-1d4673530b1ae8f5a94928e4bd94066e.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/input_prompts/icons/nintendo/y.png b/addons/input_prompts/icons/nintendo/y.png
new file mode 100644 (file)
index 0000000..8f59ae3
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/y.png differ
diff --git a/addons/input_prompts/icons/nintendo/y.png.import b/addons/input_prompts/icons/nintendo/y.png.import
new file mode 100644 (file)
index 0000000..07bc251
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dck64dw2dsjej"
+path="res://.godot/imported/y.png-e9f5db1a0ad7bd7e9e6347d5cb917cbd.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/y.png"
+dest_files=["res://.godot/imported/y.png-e9f5db1a0ad7bd7e9e6347d5cb917cbd.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/input_prompts/icons/nintendo/zl.png b/addons/input_prompts/icons/nintendo/zl.png
new file mode 100644 (file)
index 0000000..1ba594a
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/zl.png differ
diff --git a/addons/input_prompts/icons/nintendo/zl.png.import b/addons/input_prompts/icons/nintendo/zl.png.import
new file mode 100644 (file)
index 0000000..f5cb9af
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dvixi1dxdoig2"
+path="res://.godot/imported/zl.png-6be130f8605419228a5513c32e1559fc.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/zl.png"
+dest_files=["res://.godot/imported/zl.png-6be130f8605419228a5513c32e1559fc.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/input_prompts/icons/nintendo/zr.png b/addons/input_prompts/icons/nintendo/zr.png
new file mode 100644 (file)
index 0000000..c6260f3
Binary files /dev/null and b/addons/input_prompts/icons/nintendo/zr.png differ
diff --git a/addons/input_prompts/icons/nintendo/zr.png.import b/addons/input_prompts/icons/nintendo/zr.png.import
new file mode 100644 (file)
index 0000000..0c47ebe
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dbykk7rrgahs3"
+path="res://.godot/imported/zr.png-65257b702454a15ff00c5835d827665b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/nintendo/zr.png"
+dest_files=["res://.godot/imported/zr.png-65257b702454a15ff00c5835d827665b.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/input_prompts/icons/sony/circle.png b/addons/input_prompts/icons/sony/circle.png
new file mode 100644 (file)
index 0000000..2da15fc
Binary files /dev/null and b/addons/input_prompts/icons/sony/circle.png differ
diff --git a/addons/input_prompts/icons/sony/circle.png.import b/addons/input_prompts/icons/sony/circle.png.import
new file mode 100644 (file)
index 0000000..c56fbea
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dasc6vtpcj1h3"
+path="res://.godot/imported/circle.png-c9e2fcc801f48df78d7d2e4011124c1e.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/circle.png"
+dest_files=["res://.godot/imported/circle.png-c9e2fcc801f48df78d7d2e4011124c1e.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/input_prompts/icons/sony/cross.png b/addons/input_prompts/icons/sony/cross.png
new file mode 100644 (file)
index 0000000..566aceb
Binary files /dev/null and b/addons/input_prompts/icons/sony/cross.png differ
diff --git a/addons/input_prompts/icons/sony/cross.png.import b/addons/input_prompts/icons/sony/cross.png.import
new file mode 100644 (file)
index 0000000..5a6521a
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://co1n2qbbmy6tb"
+path="res://.godot/imported/cross.png-411849e1d4e25fa878fcce68e9d76f30.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/cross.png"
+dest_files=["res://.godot/imported/cross.png-411849e1d4e25fa878fcce68e9d76f30.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/input_prompts/icons/sony/down.png b/addons/input_prompts/icons/sony/down.png
new file mode 100644 (file)
index 0000000..1516ba5
Binary files /dev/null and b/addons/input_prompts/icons/sony/down.png differ
diff --git a/addons/input_prompts/icons/sony/down.png.import b/addons/input_prompts/icons/sony/down.png.import
new file mode 100644 (file)
index 0000000..4d274a3
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cy12embvf1k8b"
+path="res://.godot/imported/down.png-135f597e2bc438c6d0c4187f125dd3b0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/down.png"
+dest_files=["res://.godot/imported/down.png-135f597e2bc438c6d0c4187f125dd3b0.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/input_prompts/icons/sony/l1.png b/addons/input_prompts/icons/sony/l1.png
new file mode 100644 (file)
index 0000000..7595783
Binary files /dev/null and b/addons/input_prompts/icons/sony/l1.png differ
diff --git a/addons/input_prompts/icons/sony/l1.png.import b/addons/input_prompts/icons/sony/l1.png.import
new file mode 100644 (file)
index 0000000..efb1ac8
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dpeom2gf0rkj0"
+path="res://.godot/imported/l1.png-4e8645c631b1053bd2bc481ba7ba7c0b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/l1.png"
+dest_files=["res://.godot/imported/l1.png-4e8645c631b1053bd2bc481ba7ba7c0b.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/input_prompts/icons/sony/l2.png b/addons/input_prompts/icons/sony/l2.png
new file mode 100644 (file)
index 0000000..d2aa61d
Binary files /dev/null and b/addons/input_prompts/icons/sony/l2.png differ
diff --git a/addons/input_prompts/icons/sony/l2.png.import b/addons/input_prompts/icons/sony/l2.png.import
new file mode 100644 (file)
index 0000000..07cefea
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bxb6v2nl5ada5"
+path="res://.godot/imported/l2.png-17742c3d021332ab176f74949f3931db.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/l2.png"
+dest_files=["res://.godot/imported/l2.png-17742c3d021332ab176f74949f3931db.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/input_prompts/icons/sony/left.png b/addons/input_prompts/icons/sony/left.png
new file mode 100644 (file)
index 0000000..92af084
Binary files /dev/null and b/addons/input_prompts/icons/sony/left.png differ
diff --git a/addons/input_prompts/icons/sony/left.png.import b/addons/input_prompts/icons/sony/left.png.import
new file mode 100644 (file)
index 0000000..55f68d5
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bqoe6krf8gqxh"
+path="res://.godot/imported/left.png-e8ca70a7c329cf995460f1f568751761.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/left.png"
+dest_files=["res://.godot/imported/left.png-e8ca70a7c329cf995460f1f568751761.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/input_prompts/icons/sony/left_stick.png b/addons/input_prompts/icons/sony/left_stick.png
new file mode 100644 (file)
index 0000000..6498737
Binary files /dev/null and b/addons/input_prompts/icons/sony/left_stick.png differ
diff --git a/addons/input_prompts/icons/sony/left_stick.png.import b/addons/input_prompts/icons/sony/left_stick.png.import
new file mode 100644 (file)
index 0000000..81ddd45
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c0thk0b63h5ps"
+path="res://.godot/imported/left_stick.png-b48b7fffdebc42a00cbf28cd23fc8317.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/left_stick.png"
+dest_files=["res://.godot/imported/left_stick.png-b48b7fffdebc42a00cbf28cd23fc8317.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/input_prompts/icons/sony/microphone.png b/addons/input_prompts/icons/sony/microphone.png
new file mode 100644 (file)
index 0000000..db93ac8
Binary files /dev/null and b/addons/input_prompts/icons/sony/microphone.png differ
diff --git a/addons/input_prompts/icons/sony/microphone.png.import b/addons/input_prompts/icons/sony/microphone.png.import
new file mode 100644 (file)
index 0000000..0b43342
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dwgxelys3xfjg"
+path="res://.godot/imported/microphone.png-6e99d8ddfbd9280bd4cfcb36e94e3fbe.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/microphone.png"
+dest_files=["res://.godot/imported/microphone.png-6e99d8ddfbd9280bd4cfcb36e94e3fbe.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/input_prompts/icons/sony/ps.png b/addons/input_prompts/icons/sony/ps.png
new file mode 100644 (file)
index 0000000..84106ac
Binary files /dev/null and b/addons/input_prompts/icons/sony/ps.png differ
diff --git a/addons/input_prompts/icons/sony/ps.png.import b/addons/input_prompts/icons/sony/ps.png.import
new file mode 100644 (file)
index 0000000..31f5c1c
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bgioa1hd3mgv4"
+path="res://.godot/imported/ps.png-a03ece56445f6b1c6419628cbebc8c3f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/ps.png"
+dest_files=["res://.godot/imported/ps.png-a03ece56445f6b1c6419628cbebc8c3f.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/input_prompts/icons/sony/r1.png b/addons/input_prompts/icons/sony/r1.png
new file mode 100644 (file)
index 0000000..0473845
Binary files /dev/null and b/addons/input_prompts/icons/sony/r1.png differ
diff --git a/addons/input_prompts/icons/sony/r1.png.import b/addons/input_prompts/icons/sony/r1.png.import
new file mode 100644 (file)
index 0000000..d4b7ec5
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bvslasapy0tdf"
+path="res://.godot/imported/r1.png-cfaa8fc8a46d5335965bc62491c25e0f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/r1.png"
+dest_files=["res://.godot/imported/r1.png-cfaa8fc8a46d5335965bc62491c25e0f.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/input_prompts/icons/sony/r2.png b/addons/input_prompts/icons/sony/r2.png
new file mode 100644 (file)
index 0000000..7b991ef
Binary files /dev/null and b/addons/input_prompts/icons/sony/r2.png differ
diff --git a/addons/input_prompts/icons/sony/r2.png.import b/addons/input_prompts/icons/sony/r2.png.import
new file mode 100644 (file)
index 0000000..3361363
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cotgbqlyecm6"
+path="res://.godot/imported/r2.png-966dc532db7c94e7098ca69f7e8ff9ca.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/r2.png"
+dest_files=["res://.godot/imported/r2.png-966dc532db7c94e7098ca69f7e8ff9ca.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/input_prompts/icons/sony/right.png b/addons/input_prompts/icons/sony/right.png
new file mode 100644 (file)
index 0000000..857fc46
Binary files /dev/null and b/addons/input_prompts/icons/sony/right.png differ
diff --git a/addons/input_prompts/icons/sony/right.png.import b/addons/input_prompts/icons/sony/right.png.import
new file mode 100644 (file)
index 0000000..c5199c6
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b7yso2qc7h8y4"
+path="res://.godot/imported/right.png-5114be2df4ed5af05ebc3247bfdb6aeb.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/right.png"
+dest_files=["res://.godot/imported/right.png-5114be2df4ed5af05ebc3247bfdb6aeb.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/input_prompts/icons/sony/right_stick.png b/addons/input_prompts/icons/sony/right_stick.png
new file mode 100644 (file)
index 0000000..d071144
Binary files /dev/null and b/addons/input_prompts/icons/sony/right_stick.png differ
diff --git a/addons/input_prompts/icons/sony/right_stick.png.import b/addons/input_prompts/icons/sony/right_stick.png.import
new file mode 100644 (file)
index 0000000..391574c
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dtfknqhyfdpdx"
+path="res://.godot/imported/right_stick.png-1b4aa342b4181ef2ee29b9409b4e7c6e.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/right_stick.png"
+dest_files=["res://.godot/imported/right_stick.png-1b4aa342b4181ef2ee29b9409b4e7c6e.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/input_prompts/icons/sony/select.png b/addons/input_prompts/icons/sony/select.png
new file mode 100644 (file)
index 0000000..2db789f
Binary files /dev/null and b/addons/input_prompts/icons/sony/select.png differ
diff --git a/addons/input_prompts/icons/sony/select.png.import b/addons/input_prompts/icons/sony/select.png.import
new file mode 100644 (file)
index 0000000..66525a5
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cfnp87aknxrnh"
+path="res://.godot/imported/select.png-c0e8dce660f72dec64722ff5347bfc72.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/select.png"
+dest_files=["res://.godot/imported/select.png-c0e8dce660f72dec64722ff5347bfc72.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/input_prompts/icons/sony/square.png b/addons/input_prompts/icons/sony/square.png
new file mode 100644 (file)
index 0000000..a51753c
Binary files /dev/null and b/addons/input_prompts/icons/sony/square.png differ
diff --git a/addons/input_prompts/icons/sony/square.png.import b/addons/input_prompts/icons/sony/square.png.import
new file mode 100644 (file)
index 0000000..6d560f2
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://v3ptjyobbo7r"
+path="res://.godot/imported/square.png-dae37dfb1433182af1b94810fcd65a4b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/square.png"
+dest_files=["res://.godot/imported/square.png-dae37dfb1433182af1b94810fcd65a4b.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/input_prompts/icons/sony/start.png b/addons/input_prompts/icons/sony/start.png
new file mode 100644 (file)
index 0000000..339e2ba
Binary files /dev/null and b/addons/input_prompts/icons/sony/start.png differ
diff --git a/addons/input_prompts/icons/sony/start.png.import b/addons/input_prompts/icons/sony/start.png.import
new file mode 100644 (file)
index 0000000..322ca2d
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c4hu2lex6ujpc"
+path="res://.godot/imported/start.png-8569f405d73f33e3febaf81611dfe978.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/start.png"
+dest_files=["res://.godot/imported/start.png-8569f405d73f33e3febaf81611dfe978.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/input_prompts/icons/sony/touchpad.png b/addons/input_prompts/icons/sony/touchpad.png
new file mode 100644 (file)
index 0000000..699f849
Binary files /dev/null and b/addons/input_prompts/icons/sony/touchpad.png differ
diff --git a/addons/input_prompts/icons/sony/touchpad.png.import b/addons/input_prompts/icons/sony/touchpad.png.import
new file mode 100644 (file)
index 0000000..10c9441
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://m2iadfvck7py"
+path="res://.godot/imported/touchpad.png-e0a3f96b5ac3ac0cdc48d2e9970db4f6.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/touchpad.png"
+dest_files=["res://.godot/imported/touchpad.png-e0a3f96b5ac3ac0cdc48d2e9970db4f6.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/input_prompts/icons/sony/triangle.png b/addons/input_prompts/icons/sony/triangle.png
new file mode 100644 (file)
index 0000000..cddac93
Binary files /dev/null and b/addons/input_prompts/icons/sony/triangle.png differ
diff --git a/addons/input_prompts/icons/sony/triangle.png.import b/addons/input_prompts/icons/sony/triangle.png.import
new file mode 100644 (file)
index 0000000..9184b46
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://t62x34vqp7y6"
+path="res://.godot/imported/triangle.png-5047c135ab26bd328ab17218e56c5996.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/triangle.png"
+dest_files=["res://.godot/imported/triangle.png-5047c135ab26bd328ab17218e56c5996.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/input_prompts/icons/sony/up.png b/addons/input_prompts/icons/sony/up.png
new file mode 100644 (file)
index 0000000..674bab0
Binary files /dev/null and b/addons/input_prompts/icons/sony/up.png differ
diff --git a/addons/input_prompts/icons/sony/up.png.import b/addons/input_prompts/icons/sony/up.png.import
new file mode 100644 (file)
index 0000000..9c7ed64
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bdrtjf2168hna"
+path="res://.godot/imported/up.png-9835e381f39ca2867eda0e236afa656d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/sony/up.png"
+dest_files=["res://.godot/imported/up.png-9835e381f39ca2867eda0e236afa656d.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/input_prompts/icons/xbox/a.png b/addons/input_prompts/icons/xbox/a.png
new file mode 100644 (file)
index 0000000..dea39c2
Binary files /dev/null and b/addons/input_prompts/icons/xbox/a.png differ
diff --git a/addons/input_prompts/icons/xbox/a.png.import b/addons/input_prompts/icons/xbox/a.png.import
new file mode 100644 (file)
index 0000000..98f95e0
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b1e23gj3k1klg"
+path="res://.godot/imported/a.png-f5e185eab39451ea36452c212a92e694.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/a.png"
+dest_files=["res://.godot/imported/a.png-f5e185eab39451ea36452c212a92e694.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/input_prompts/icons/xbox/b.png b/addons/input_prompts/icons/xbox/b.png
new file mode 100644 (file)
index 0000000..80053a0
Binary files /dev/null and b/addons/input_prompts/icons/xbox/b.png differ
diff --git a/addons/input_prompts/icons/xbox/b.png.import b/addons/input_prompts/icons/xbox/b.png.import
new file mode 100644 (file)
index 0000000..3b87371
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dv0r0pf7dwijj"
+path="res://.godot/imported/b.png-cd56db4e16e943a49ad14b754f30a719.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/b.png"
+dest_files=["res://.godot/imported/b.png-cd56db4e16e943a49ad14b754f30a719.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/input_prompts/icons/xbox/down.png b/addons/input_prompts/icons/xbox/down.png
new file mode 100644 (file)
index 0000000..452d3c6
Binary files /dev/null and b/addons/input_prompts/icons/xbox/down.png differ
diff --git a/addons/input_prompts/icons/xbox/down.png.import b/addons/input_prompts/icons/xbox/down.png.import
new file mode 100644 (file)
index 0000000..5f302e2
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cq20ry6lvvj3"
+path="res://.godot/imported/down.png-9486a4a321b51e80c1d3f75df9b9cb48.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/down.png"
+dest_files=["res://.godot/imported/down.png-9486a4a321b51e80c1d3f75df9b9cb48.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/input_prompts/icons/xbox/left.png b/addons/input_prompts/icons/xbox/left.png
new file mode 100644 (file)
index 0000000..4aac318
Binary files /dev/null and b/addons/input_prompts/icons/xbox/left.png differ
diff --git a/addons/input_prompts/icons/xbox/left.png.import b/addons/input_prompts/icons/xbox/left.png.import
new file mode 100644 (file)
index 0000000..2eeca31
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b381hogwff71v"
+path="res://.godot/imported/left.png-dff4acf461555d7a7e778e7055fea9c7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/left.png"
+dest_files=["res://.godot/imported/left.png-dff4acf461555d7a7e778e7055fea9c7.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/input_prompts/icons/xbox/left_bumper.png b/addons/input_prompts/icons/xbox/left_bumper.png
new file mode 100644 (file)
index 0000000..10f7b8f
Binary files /dev/null and b/addons/input_prompts/icons/xbox/left_bumper.png differ
diff --git a/addons/input_prompts/icons/xbox/left_bumper.png.import b/addons/input_prompts/icons/xbox/left_bumper.png.import
new file mode 100644 (file)
index 0000000..d27f230
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c6c4xr0w6wcmo"
+path="res://.godot/imported/left_bumper.png-5b5273803036ee6f2bb342a54e5bf9b5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/left_bumper.png"
+dest_files=["res://.godot/imported/left_bumper.png-5b5273803036ee6f2bb342a54e5bf9b5.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/input_prompts/icons/xbox/left_stick.png b/addons/input_prompts/icons/xbox/left_stick.png
new file mode 100644 (file)
index 0000000..6498737
Binary files /dev/null and b/addons/input_prompts/icons/xbox/left_stick.png differ
diff --git a/addons/input_prompts/icons/xbox/left_stick.png.import b/addons/input_prompts/icons/xbox/left_stick.png.import
new file mode 100644 (file)
index 0000000..1b74c05
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cf6whmgqq1wmk"
+path="res://.godot/imported/left_stick.png-5f9826ec9f742dd5132939b0218d2b98.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/left_stick.png"
+dest_files=["res://.godot/imported/left_stick.png-5f9826ec9f742dd5132939b0218d2b98.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/input_prompts/icons/xbox/left_trigger.png b/addons/input_prompts/icons/xbox/left_trigger.png
new file mode 100644 (file)
index 0000000..649d6cf
Binary files /dev/null and b/addons/input_prompts/icons/xbox/left_trigger.png differ
diff --git a/addons/input_prompts/icons/xbox/left_trigger.png.import b/addons/input_prompts/icons/xbox/left_trigger.png.import
new file mode 100644 (file)
index 0000000..d3db5bd
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dx1u47qkx4in8"
+path="res://.godot/imported/left_trigger.png-10043bb7e438b42cdf1fff3da09160ee.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/left_trigger.png"
+dest_files=["res://.godot/imported/left_trigger.png-10043bb7e438b42cdf1fff3da09160ee.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/input_prompts/icons/xbox/menu.png b/addons/input_prompts/icons/xbox/menu.png
new file mode 100644 (file)
index 0000000..9a25561
Binary files /dev/null and b/addons/input_prompts/icons/xbox/menu.png differ
diff --git a/addons/input_prompts/icons/xbox/menu.png.import b/addons/input_prompts/icons/xbox/menu.png.import
new file mode 100644 (file)
index 0000000..7e0f627
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b6d4bxaob4k6j"
+path="res://.godot/imported/menu.png-58837e89032c6aec71c03a773d6aaae6.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/menu.png"
+dest_files=["res://.godot/imported/menu.png-58837e89032c6aec71c03a773d6aaae6.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/input_prompts/icons/xbox/right.png b/addons/input_prompts/icons/xbox/right.png
new file mode 100644 (file)
index 0000000..981f16b
Binary files /dev/null and b/addons/input_prompts/icons/xbox/right.png differ
diff --git a/addons/input_prompts/icons/xbox/right.png.import b/addons/input_prompts/icons/xbox/right.png.import
new file mode 100644 (file)
index 0000000..bebf5fd
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bsi68uuv6g8gg"
+path="res://.godot/imported/right.png-f54e9508f938f89ade7f6395e63c26b7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/right.png"
+dest_files=["res://.godot/imported/right.png-f54e9508f938f89ade7f6395e63c26b7.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/input_prompts/icons/xbox/right_bumper.png b/addons/input_prompts/icons/xbox/right_bumper.png
new file mode 100644 (file)
index 0000000..4763397
Binary files /dev/null and b/addons/input_prompts/icons/xbox/right_bumper.png differ
diff --git a/addons/input_prompts/icons/xbox/right_bumper.png.import b/addons/input_prompts/icons/xbox/right_bumper.png.import
new file mode 100644 (file)
index 0000000..f6b02a2
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dndwl60yt3u8o"
+path="res://.godot/imported/right_bumper.png-99edc63463974ea9ec6cc770c6291c3c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/right_bumper.png"
+dest_files=["res://.godot/imported/right_bumper.png-99edc63463974ea9ec6cc770c6291c3c.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/input_prompts/icons/xbox/right_stick.png b/addons/input_prompts/icons/xbox/right_stick.png
new file mode 100644 (file)
index 0000000..d071144
Binary files /dev/null and b/addons/input_prompts/icons/xbox/right_stick.png differ
diff --git a/addons/input_prompts/icons/xbox/right_stick.png.import b/addons/input_prompts/icons/xbox/right_stick.png.import
new file mode 100644 (file)
index 0000000..5f21ee0
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://3fggagye1j4n"
+path="res://.godot/imported/right_stick.png-f768157b17580c39d1949f26784b61d1.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/right_stick.png"
+dest_files=["res://.godot/imported/right_stick.png-f768157b17580c39d1949f26784b61d1.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/input_prompts/icons/xbox/right_trigger.png b/addons/input_prompts/icons/xbox/right_trigger.png
new file mode 100644 (file)
index 0000000..d5d9ff2
Binary files /dev/null and b/addons/input_prompts/icons/xbox/right_trigger.png differ
diff --git a/addons/input_prompts/icons/xbox/right_trigger.png.import b/addons/input_prompts/icons/xbox/right_trigger.png.import
new file mode 100644 (file)
index 0000000..b0586c7
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c6cv5phl3gvvn"
+path="res://.godot/imported/right_trigger.png-e14bb36ce84ac3d7e99dbc6647d033f5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/right_trigger.png"
+dest_files=["res://.godot/imported/right_trigger.png-e14bb36ce84ac3d7e99dbc6647d033f5.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/input_prompts/icons/xbox/share.png b/addons/input_prompts/icons/xbox/share.png
new file mode 100644 (file)
index 0000000..75c89e7
Binary files /dev/null and b/addons/input_prompts/icons/xbox/share.png differ
diff --git a/addons/input_prompts/icons/xbox/share.png.import b/addons/input_prompts/icons/xbox/share.png.import
new file mode 100644 (file)
index 0000000..677c408
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://6ymdd3wdej84"
+path="res://.godot/imported/share.png-d750572e366a5125fe2f7a292b52092c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/share.png"
+dest_files=["res://.godot/imported/share.png-d750572e366a5125fe2f7a292b52092c.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/input_prompts/icons/xbox/up.png b/addons/input_prompts/icons/xbox/up.png
new file mode 100644 (file)
index 0000000..b6a69e8
Binary files /dev/null and b/addons/input_prompts/icons/xbox/up.png differ
diff --git a/addons/input_prompts/icons/xbox/up.png.import b/addons/input_prompts/icons/xbox/up.png.import
new file mode 100644 (file)
index 0000000..108972a
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c6b88da2bl26p"
+path="res://.godot/imported/up.png-da8fa8212e6e648cba07a6d26f87ea96.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/up.png"
+dest_files=["res://.godot/imported/up.png-da8fa8212e6e648cba07a6d26f87ea96.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/input_prompts/icons/xbox/view.png b/addons/input_prompts/icons/xbox/view.png
new file mode 100644 (file)
index 0000000..d9598c4
Binary files /dev/null and b/addons/input_prompts/icons/xbox/view.png differ
diff --git a/addons/input_prompts/icons/xbox/view.png.import b/addons/input_prompts/icons/xbox/view.png.import
new file mode 100644 (file)
index 0000000..e24c204
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://lx67x2lremab"
+path="res://.godot/imported/view.png-00a99b12187162536d94d52fd0d45704.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/view.png"
+dest_files=["res://.godot/imported/view.png-00a99b12187162536d94d52fd0d45704.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/input_prompts/icons/xbox/x.png b/addons/input_prompts/icons/xbox/x.png
new file mode 100644 (file)
index 0000000..2d2fea2
Binary files /dev/null and b/addons/input_prompts/icons/xbox/x.png differ
diff --git a/addons/input_prompts/icons/xbox/x.png.import b/addons/input_prompts/icons/xbox/x.png.import
new file mode 100644 (file)
index 0000000..fee498d
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://deib2tqcg5df0"
+path="res://.godot/imported/x.png-91f768c9b6a8e45535b712b5f21be231.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/x.png"
+dest_files=["res://.godot/imported/x.png-91f768c9b6a8e45535b712b5f21be231.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/input_prompts/icons/xbox/xbox.png b/addons/input_prompts/icons/xbox/xbox.png
new file mode 100644 (file)
index 0000000..84106ac
Binary files /dev/null and b/addons/input_prompts/icons/xbox/xbox.png differ
diff --git a/addons/input_prompts/icons/xbox/xbox.png.import b/addons/input_prompts/icons/xbox/xbox.png.import
new file mode 100644 (file)
index 0000000..342890e
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://72wnplctqqdm"
+path="res://.godot/imported/xbox.png-9143e46ec19b7757d565161e8ec9cdfa.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/xbox.png"
+dest_files=["res://.godot/imported/xbox.png-9143e46ec19b7757d565161e8ec9cdfa.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/input_prompts/icons/xbox/y.png b/addons/input_prompts/icons/xbox/y.png
new file mode 100644 (file)
index 0000000..1980d3a
Binary files /dev/null and b/addons/input_prompts/icons/xbox/y.png differ
diff --git a/addons/input_prompts/icons/xbox/y.png.import b/addons/input_prompts/icons/xbox/y.png.import
new file mode 100644 (file)
index 0000000..5e984e2
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://clcwaemf3uawa"
+path="res://.godot/imported/y.png-ac985c907d30555be9fa5bfdff297f9e.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/icons/xbox/y.png"
+dest_files=["res://.godot/imported/y.png-ac985c907d30555be9fa5bfdff297f9e.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/input_prompts/input_prompt.gd b/addons/input_prompts/input_prompt.gd
new file mode 100644 (file)
index 0000000..c826e1c
--- /dev/null
@@ -0,0 +1,50 @@
+# Copyright (C) 2022-2023 John Pennycook
+# SPDX-License-Identifier: MIT
+@tool
+@icon("res://addons/input_prompts/icon.svg")
+class_name InputPrompt
+extends TextureRect
+## Base class for input prompts.
+##
+## Base class for input prompts.
+
+## Emitted when one of the [InputEvent]s associated with this prompt is pressed.
+signal pressed
+
+enum Icons {
+       AUTOMATIC,
+       XBOX,
+       SONY,
+       NINTENDO,
+       KEYBOARD,
+}
+
+## The set of [InputEvent]s that should satisfy this input prompt.
+@export var events: Array[InputEvent] = []
+
+
+func _init():
+       texture = null
+       stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
+
+
+func _update_icon():
+       pass
+
+
+func _input(event: InputEvent):
+       if not events.any(func(e): return event.is_match(e)):
+               return
+       if not event.is_pressed():
+               return
+       if event.is_echo():
+               return
+       emit_signal("pressed")
+
+
+func _enter_tree():
+       PromptManager.icons_changed.connect(_update_icon)
+
+
+func _exit_tree():
+       PromptManager.icons_changed.disconnect(_update_icon)
diff --git a/addons/input_prompts/input_prompt_manager.gd b/addons/input_prompts/input_prompt_manager.gd
new file mode 100644 (file)
index 0000000..f672f7f
--- /dev/null
@@ -0,0 +1,113 @@
+# Copyright (C) 2022-2023 John Pennycook
+# SPDX-License-Identifier: MIT
+@tool
+class_name InputPromptManager
+extends Node
+## Singleton class for managing [InputPrompt]s.
+##
+## Singleton class for managing [InputPrompt]s.
+## [br][br]
+## [b]Note[/b]: An instance of [InputPromptManager] is autoloaded under the name
+## PromptManager.
+
+## Emitted when the preferred icons change. If the preferred icons are set to
+## "Automatic", emitted whenever the input device changes.
+signal icons_changed
+
+## The icons currently used by [ActionPrompt] nodes.
+var icons := InputPrompt.Icons.XBOX:
+       get:
+               # In the Editor, InputMap reflects Editor settings
+               # Pick a default so there's something to render
+               if Engine.is_editor_hint():
+                       return InputPrompt.Icons.XBOX
+               return icons
+
+## The icons currently used by [JoypadButtonPrompt] and [JoypadMotionPrompt] nodes.
+var joy_icons = InputPrompt.Icons.XBOX:
+       get:
+               # In the Editor, InputMap reflects Editor settings
+               # Pick a default so there's something to render
+               if Engine.is_editor_hint():
+                       return InputPrompt.Icons.XBOX
+               return joy_icons
+
+## The preferred icons to be used by [ActionPrompt], [JoypadButtonPrompt] and [JoypadMotionPrompt]
+## nodes. When set to a specific value, all nodes with "Automatic" icons will be overridden to use
+## the specified value.
+var preferred_icons := InputPrompt.Icons.AUTOMATIC:
+       set(value):
+               preferred_icons = value
+               if preferred_icons == null or preferred_icons == InputPrompt.Icons.AUTOMATIC:
+                       icons = InputPrompt.Icons.XBOX
+               else:
+                       icons = value
+               emit_signal("icons_changed")
+
+
+## Return the [KeyboardTextures] used by [KeyPrompt] nodes.
+func get_keyboard_textures() -> KeyboardTextures:
+       return preload("res://addons/input_prompts/key_prompt/keys.tres")
+
+
+## Return the [MouseButtonTextures] used by [MouseButtonPrompt] nodes.
+func get_mouse_textures() -> MouseButtonTextures:
+       return preload("res://addons/input_prompts/mouse_button_prompt/buttons.tres")
+
+
+## Return the [JoypadButtonTextures] used by [JoypadButtonPrompt] nodes.
+func get_joypad_button_textures(icons: int) -> JoypadButtonTextures:
+       match icons:
+               InputPrompt.Icons.AUTOMATIC:
+                       return get_joypad_button_textures(joy_icons)
+               InputPrompt.Icons.XBOX:
+                       return preload("res://addons/input_prompts/joypad_button_prompt/xbox.tres")
+               InputPrompt.Icons.SONY:
+                       return preload("res://addons/input_prompts/joypad_button_prompt/sony.tres")
+               InputPrompt.Icons.NINTENDO:
+                       return preload("res://addons/input_prompts/joypad_button_prompt/nintendo.tres")
+               InputPrompt.Icons.KEYBOARD:
+                       push_error("No JoypadButtonTextures for InputPrompt.Icons.KEYBOARD.")
+       return null
+
+
+## Return the [JoypadMotionTextures] used by [JoypadMotionPrompt] nodes.
+func get_joypad_motion_textures(icons: int) -> JoypadMotionTextures:
+       match icons:
+               InputPrompt.Icons.AUTOMATIC:
+                       return get_joypad_motion_textures(joy_icons)
+               InputPrompt.Icons.XBOX:
+                       return preload("res://addons/input_prompts/joypad_motion_prompt/xbox.tres")
+               InputPrompt.Icons.SONY:
+                       return preload("res://addons/input_prompts/joypad_motion_prompt/sony.tres")
+               InputPrompt.Icons.NINTENDO:
+                       return preload("res://addons/input_prompts/joypad_motion_prompt/nintendo.tres")
+               InputPrompt.Icons.KEYBOARD:
+                       push_error("No JoypadMotionTextures for InputPrompt.Icons.KEYBOARD.")
+       return null
+
+
+# Monitor InputEvents and emit icons_changed if:
+# 1) The user has not expressed an icon preference
+# 2) The type of InputEvent is different to last time
+func _input(event: InputEvent):
+       if not (preferred_icons == null or preferred_icons == InputPrompt.Icons.AUTOMATIC):
+               return
+       if event is InputEventKey or event is InputEventMouse:
+               if icons != InputPrompt.Icons.KEYBOARD:
+                       icons = InputPrompt.Icons.KEYBOARD
+                       emit_signal("icons_changed")
+       if event is InputEventJoypadButton or event is InputEventJoypadMotion:
+               var device = event.device
+               var joy_name = Input.get_joy_name(device)
+               if joy_name.find("Xbox"):
+                       joy_icons = InputPrompt.Icons.XBOX
+               elif joy_name.find("DualShock") or joy_name.find("PS"):
+                       joy_icons = InputPrompt.Icons.SONY
+               elif joy_name.find("Nintendo"):
+                       joy_icons = InputPrompt.Icons.NINTENDO
+               else:
+                       joy_icons = InputPrompt.Icons.XBOX
+               if icons != joy_icons:
+                       icons = joy_icons
+                       emit_signal("icons_changed")
diff --git a/addons/input_prompts/inspector_plugin.gd b/addons/input_prompts/inspector_plugin.gd
new file mode 100644 (file)
index 0000000..e3ba9c7
--- /dev/null
@@ -0,0 +1,17 @@
+# Copyright (C) 2022-2023 John Pennycook
+# SPDX-License-Identifier: MIT
+@tool
+extends EditorInspectorPlugin
+
+
+func _can_handle(object):
+       var types := [
+               ActionPrompt, JoypadButtonPrompt, JoypadMotionPrompt, KeyPrompt, MouseButtonPrompt
+       ]
+       return types.any(func(t): return is_instance_of(object, t))
+
+
+func _parse_property(_object, _type, name, _hint_type, _hint_string, _usage_flags, _wide):
+       # Hide the texture property of TextureRect to ensure that user can only
+       # modify it indirectly (e.g. via setting key, button, action or icon)
+       return name == "texture"
diff --git a/addons/input_prompts/joypad_button_prompt/icon.svg b/addons/input_prompts/joypad_button_prompt/icon.svg
new file mode 100644 (file)
index 0000000..48750ec
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m5.25 3h2.3a1.15 1.15 0 0 1 1.15 1.15v9.2a1.15 1.15 0 0 1 -1.15 1.15h-2.3a1.15 1.15 0 0 1 -1.15-1.15v-2.3h-2.3a1.15 1.15 0 0 1 -1.15-1.15v-2.3a1.15 1.15 0 0 1 1.15-1.15h2.3v-2.3a1.15 1.15 0 0 1 1.15-1.15zm1.15 4.025a1.15 1.15 0 0 0 0 3.45 1.15 1.15 0 0 0 0-3.45z" fill="#90ef99"/><path d="m8.7 6.3h2.3a1.15 1.15 0 0 1 1.15 1.15v2.3a1.15 1.15 0 0 1 -1.15 1.15h-2.3" fill="#90ef99"/><path d="m13.25 7.25 1.7-.4m-2.2-1.35 1.3-1.3m-3.05.8.4-1.7" stroke="#8fef99" stroke-linecap="round" stroke-width="1.25"/></svg>
\ No newline at end of file
diff --git a/addons/input_prompts/joypad_button_prompt/icon.svg.import b/addons/input_prompts/joypad_button_prompt/icon.svg.import
new file mode 100644 (file)
index 0000000..f9e670b
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://80vt60sk4d27"
+path="res://.godot/imported/icon.svg-d29bb815b9b73aaff083ba632602290d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/joypad_button_prompt/icon.svg"
+dest_files=["res://.godot/imported/icon.svg-d29bb815b9b73aaff083ba632602290d.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/input_prompts/joypad_button_prompt/joypad_button_prompt.gd b/addons/input_prompts/joypad_button_prompt/joypad_button_prompt.gd
new file mode 100644 (file)
index 0000000..ddf3fbc
--- /dev/null
@@ -0,0 +1,73 @@
+# Copyright (C) 2022-2023 John Pennycook
+# SPDX-License-Identifier: MIT
+@tool
+@icon("res://addons/input_prompts/joypad_button_prompt/icon.svg")
+class_name JoypadButtonPrompt
+extends "res://addons/input_prompts/input_prompt.gd"
+## Displays a prompt based on a joypad button index.
+##
+## Displays a prompt based on a joypad button index.
+## The texture used for the prompt is determined by an icon preference. When
+## the icon preference is set to "Automatic", the prompt automatically adjusts
+## to match the most recent joypad device.
+## [br][br]
+## [b]Note[/b]: A [JoypadButtonPrompt] will never show keyboard or mouse
+## prompts. To automatically reflect the most recent input device, use
+## [ActionPrompt] instead.
+
+## A joypad button index, such as [constant @GlobalScope.JOY_BUTTON_A].
+var button := 0:
+       set = _set_button
+
+## The icon preference for this prompt:
+## Automatic (0), Xbox (1), Sony (2), Nintendo (3).
+## When set to "Automatic", the prompt automatically adjusts to match the most
+## recent joypad device.
+var icon: int = Icons.AUTOMATIC:
+       set = _set_icon
+
+
+func _ready():
+       _update_icon()
+
+
+func _set_button(index: int):
+       button = index
+       var event := InputEventJoypadButton.new()
+       event.button_index = button
+       events = [event]
+       _update_icon()
+
+
+func _set_icon(new_icon):
+       icon = new_icon
+       _update_icon()
+
+
+func _update_icon():
+       var textures := PromptManager.get_joypad_button_textures(icon)
+       texture = textures.get_texture(events[0])
+       queue_redraw()
+
+
+func _get_property_list():
+       var properties = []
+       properties.append(
+               {
+                       name = "JoypadButtonPrompt",
+                       type = TYPE_NIL,
+                       usage = PROPERTY_USAGE_CATEGORY | PROPERTY_USAGE_SCRIPT_VARIABLE
+               }
+       )
+       properties.append(
+               {name = "button", type = TYPE_INT, hint = PROPERTY_HINT_RANGE, hint_string = "0,22"}
+       )
+       properties.append(
+               {
+                       name = "icon",
+                       type = TYPE_INT,
+                       hint = PROPERTY_HINT_ENUM,
+                       hint_string = "Automatic,Xbox,Sony,Nintendo"
+               }
+       )
+       return properties
diff --git a/addons/input_prompts/joypad_button_prompt/nintendo.tres b/addons/input_prompts/joypad_button_prompt/nintendo.tres
new file mode 100644 (file)
index 0000000..8514a6f
--- /dev/null
@@ -0,0 +1,38 @@
+[gd_resource type="Resource" script_class="JoypadButtonTextures" load_steps=18 format=3 uid="uid://kabm3n1g8bqg"]
+
+[ext_resource type="Script" path="res://addons/input_prompts/resources/joypad_button_textures.gd" id="1_25grt"]
+[ext_resource type="Texture2D" uid="uid://bdhuy2yjfgaqo" path="res://addons/input_prompts/icons/nintendo/b.png" id="1_xaja3"]
+[ext_resource type="Texture2D" uid="uid://kqpiteswedha" path="res://addons/input_prompts/icons/nintendo/a.png" id="2_fukqt"]
+[ext_resource type="Texture2D" uid="uid://t6b3hdkex5sn" path="res://addons/input_prompts/icons/nintendo/r.png" id="3_dpsw2"]
+[ext_resource type="Texture2D" uid="uid://dg3np7m1d5cgr" path="res://addons/input_prompts/icons/nintendo/up.png" id="4_nsj6d"]
+[ext_resource type="Texture2D" uid="uid://cfriumkgbsb6w" path="res://addons/input_prompts/icons/nintendo/down.png" id="5_cnjuo"]
+[ext_resource type="Texture2D" uid="uid://bfx1oiuxfvdoa" path="res://addons/input_prompts/icons/nintendo/left.png" id="6_cdqtk"]
+[ext_resource type="Texture2D" uid="uid://8udwa7p18dmn" path="res://addons/input_prompts/icons/nintendo/right.png" id="7_42sxu"]
+[ext_resource type="Texture2D" uid="uid://4pysljtin4uu" path="res://addons/input_prompts/icons/nintendo/capture.png" id="8_4ucvn"]
+[ext_resource type="Texture2D" uid="uid://dck64dw2dsjej" path="res://addons/input_prompts/icons/nintendo/y.png" id="9_skdvi"]
+[ext_resource type="Texture2D" uid="uid://4sj35y12txc1" path="res://addons/input_prompts/icons/nintendo/x.png" id="10_grh1u"]
+[ext_resource type="Texture2D" uid="uid://dm8ct1c16ybog" path="res://addons/input_prompts/icons/nintendo/minus.png" id="11_nk0we"]
+[ext_resource type="Texture2D" uid="uid://cckemm2jwovpj" path="res://addons/input_prompts/icons/nintendo/home.png" id="12_xbij3"]
+[ext_resource type="Texture2D" uid="uid://bg1nql3gmvi8f" path="res://addons/input_prompts/icons/nintendo/plus.png" id="13_10x82"]
+[ext_resource type="Texture2D" uid="uid://8ixovmgh4p5c" path="res://addons/input_prompts/icons/nintendo/left_stick.png" id="14_8wpf4"]
+[ext_resource type="Texture2D" uid="uid://ycamq7yys184" path="res://addons/input_prompts/icons/nintendo/right_stick.png" id="15_qx56o"]
+[ext_resource type="Texture2D" uid="uid://bm2ocs8hcdwaw" path="res://addons/input_prompts/icons/nintendo/l.png" id="16_ypnna"]
+
+[resource]
+script = ExtResource("1_25grt")
+button_0 = ExtResource("1_xaja3")
+button_1 = ExtResource("2_fukqt")
+button_2 = ExtResource("9_skdvi")
+button_3 = ExtResource("10_grh1u")
+button_4 = ExtResource("11_nk0we")
+button_5 = ExtResource("12_xbij3")
+button_6 = ExtResource("13_10x82")
+button_7 = ExtResource("14_8wpf4")
+button_8 = ExtResource("15_qx56o")
+button_9 = ExtResource("16_ypnna")
+button_10 = ExtResource("3_dpsw2")
+button_11 = ExtResource("4_nsj6d")
+button_12 = ExtResource("5_cnjuo")
+button_13 = ExtResource("6_cdqtk")
+button_14 = ExtResource("7_42sxu")
+button_15 = ExtResource("8_4ucvn")
diff --git a/addons/input_prompts/joypad_button_prompt/sony.tres b/addons/input_prompts/joypad_button_prompt/sony.tres
new file mode 100644 (file)
index 0000000..cb4623c
--- /dev/null
@@ -0,0 +1,40 @@
+[gd_resource type="Resource" script_class="JoypadButtonTextures" load_steps=19 format=3 uid="uid://byb0wuj53gqaf"]
+
+[ext_resource type="Texture2D" uid="uid://co1n2qbbmy6tb" path="res://addons/input_prompts/icons/sony/cross.png" id="1_gbvy5"]
+[ext_resource type="Script" path="res://addons/input_prompts/resources/joypad_button_textures.gd" id="1_rutnh"]
+[ext_resource type="Texture2D" uid="uid://dasc6vtpcj1h3" path="res://addons/input_prompts/icons/sony/circle.png" id="2_rq6hf"]
+[ext_resource type="Texture2D" uid="uid://bvslasapy0tdf" path="res://addons/input_prompts/icons/sony/r1.png" id="3_qolof"]
+[ext_resource type="Texture2D" uid="uid://bdrtjf2168hna" path="res://addons/input_prompts/icons/sony/up.png" id="4_6d752"]
+[ext_resource type="Texture2D" uid="uid://cy12embvf1k8b" path="res://addons/input_prompts/icons/sony/down.png" id="5_3rwn1"]
+[ext_resource type="Texture2D" uid="uid://bqoe6krf8gqxh" path="res://addons/input_prompts/icons/sony/left.png" id="6_3pm2c"]
+[ext_resource type="Texture2D" uid="uid://b7yso2qc7h8y4" path="res://addons/input_prompts/icons/sony/right.png" id="7_mvfe8"]
+[ext_resource type="Texture2D" uid="uid://dwgxelys3xfjg" path="res://addons/input_prompts/icons/sony/microphone.png" id="8_kpokw"]
+[ext_resource type="Texture2D" uid="uid://v3ptjyobbo7r" path="res://addons/input_prompts/icons/sony/square.png" id="9_in60i"]
+[ext_resource type="Texture2D" uid="uid://m2iadfvck7py" path="res://addons/input_prompts/icons/sony/touchpad.png" id="10_a8ddc"]
+[ext_resource type="Texture2D" uid="uid://t62x34vqp7y6" path="res://addons/input_prompts/icons/sony/triangle.png" id="11_cw5lf"]
+[ext_resource type="Texture2D" uid="uid://cfnp87aknxrnh" path="res://addons/input_prompts/icons/sony/select.png" id="12_r4vvr"]
+[ext_resource type="Texture2D" uid="uid://bgioa1hd3mgv4" path="res://addons/input_prompts/icons/sony/ps.png" id="13_pbgkp"]
+[ext_resource type="Texture2D" uid="uid://c4hu2lex6ujpc" path="res://addons/input_prompts/icons/sony/start.png" id="14_1ioht"]
+[ext_resource type="Texture2D" uid="uid://c0thk0b63h5ps" path="res://addons/input_prompts/icons/sony/left_stick.png" id="15_fu6xj"]
+[ext_resource type="Texture2D" uid="uid://dtfknqhyfdpdx" path="res://addons/input_prompts/icons/sony/right_stick.png" id="16_xda7s"]
+[ext_resource type="Texture2D" uid="uid://dpeom2gf0rkj0" path="res://addons/input_prompts/icons/sony/l1.png" id="17_yifdt"]
+
+[resource]
+script = ExtResource("1_rutnh")
+button_0 = ExtResource("1_gbvy5")
+button_1 = ExtResource("2_rq6hf")
+button_2 = ExtResource("9_in60i")
+button_3 = ExtResource("11_cw5lf")
+button_4 = ExtResource("12_r4vvr")
+button_5 = ExtResource("13_pbgkp")
+button_6 = ExtResource("14_1ioht")
+button_7 = ExtResource("15_fu6xj")
+button_8 = ExtResource("16_xda7s")
+button_9 = ExtResource("17_yifdt")
+button_10 = ExtResource("3_qolof")
+button_11 = ExtResource("4_6d752")
+button_12 = ExtResource("5_3rwn1")
+button_13 = ExtResource("6_3pm2c")
+button_14 = ExtResource("7_mvfe8")
+button_15 = ExtResource("8_kpokw")
+button_20 = ExtResource("10_a8ddc")
diff --git a/addons/input_prompts/joypad_button_prompt/xbox.tres b/addons/input_prompts/joypad_button_prompt/xbox.tres
new file mode 100644 (file)
index 0000000..167d93b
--- /dev/null
@@ -0,0 +1,38 @@
+[gd_resource type="Resource" script_class="JoypadButtonTextures" load_steps=18 format=3 uid="uid://bna13e4khhqlk"]
+
+[ext_resource type="Texture2D" uid="uid://b1e23gj3k1klg" path="res://addons/input_prompts/icons/xbox/a.png" id="1_7vxu0"]
+[ext_resource type="Script" path="res://addons/input_prompts/resources/joypad_button_textures.gd" id="1_m8ac2"]
+[ext_resource type="Texture2D" uid="uid://dv0r0pf7dwijj" path="res://addons/input_prompts/icons/xbox/b.png" id="2_jxa0r"]
+[ext_resource type="Texture2D" uid="uid://dndwl60yt3u8o" path="res://addons/input_prompts/icons/xbox/right_bumper.png" id="3_gsdox"]
+[ext_resource type="Texture2D" uid="uid://c6b88da2bl26p" path="res://addons/input_prompts/icons/xbox/up.png" id="4_rrm24"]
+[ext_resource type="Texture2D" uid="uid://cq20ry6lvvj3" path="res://addons/input_prompts/icons/xbox/down.png" id="5_oc3yx"]
+[ext_resource type="Texture2D" uid="uid://b381hogwff71v" path="res://addons/input_prompts/icons/xbox/left.png" id="6_g2b0t"]
+[ext_resource type="Texture2D" uid="uid://bsi68uuv6g8gg" path="res://addons/input_prompts/icons/xbox/right.png" id="7_klbkg"]
+[ext_resource type="Texture2D" uid="uid://6ymdd3wdej84" path="res://addons/input_prompts/icons/xbox/share.png" id="8_vxxq7"]
+[ext_resource type="Texture2D" uid="uid://deib2tqcg5df0" path="res://addons/input_prompts/icons/xbox/x.png" id="9_05wbi"]
+[ext_resource type="Texture2D" uid="uid://clcwaemf3uawa" path="res://addons/input_prompts/icons/xbox/y.png" id="10_0x8ks"]
+[ext_resource type="Texture2D" uid="uid://lx67x2lremab" path="res://addons/input_prompts/icons/xbox/view.png" id="11_22uvm"]
+[ext_resource type="Texture2D" uid="uid://72wnplctqqdm" path="res://addons/input_prompts/icons/xbox/xbox.png" id="12_rkyvd"]
+[ext_resource type="Texture2D" uid="uid://b6d4bxaob4k6j" path="res://addons/input_prompts/icons/xbox/menu.png" id="13_v35oa"]
+[ext_resource type="Texture2D" uid="uid://cf6whmgqq1wmk" path="res://addons/input_prompts/icons/xbox/left_stick.png" id="14_xy30p"]
+[ext_resource type="Texture2D" uid="uid://3fggagye1j4n" path="res://addons/input_prompts/icons/xbox/right_stick.png" id="15_7v5ew"]
+[ext_resource type="Texture2D" uid="uid://c6c4xr0w6wcmo" path="res://addons/input_prompts/icons/xbox/left_bumper.png" id="16_m0s83"]
+
+[resource]
+script = ExtResource("1_m8ac2")
+button_0 = ExtResource("1_7vxu0")
+button_1 = ExtResource("2_jxa0r")
+button_2 = ExtResource("9_05wbi")
+button_3 = ExtResource("10_0x8ks")
+button_4 = ExtResource("11_22uvm")
+button_5 = ExtResource("12_rkyvd")
+button_6 = ExtResource("13_v35oa")
+button_7 = ExtResource("14_xy30p")
+button_8 = ExtResource("15_7v5ew")
+button_9 = ExtResource("16_m0s83")
+button_10 = ExtResource("3_gsdox")
+button_11 = ExtResource("4_rrm24")
+button_12 = ExtResource("5_oc3yx")
+button_13 = ExtResource("6_g2b0t")
+button_14 = ExtResource("7_klbkg")
+button_15 = ExtResource("8_vxxq7")
diff --git a/addons/input_prompts/joypad_motion_prompt/icon.svg b/addons/input_prompts/joypad_motion_prompt/icon.svg
new file mode 100644 (file)
index 0000000..1f229b4
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="2" x2="9"><stop offset="0" stop-color="#8fef99" stop-opacity="0"/><stop offset=".60000002" stop-color="#8fef99"/></linearGradient><path d="m11.5 16v-1.5a1 1 0 0 0 -1-1h-.5l1.6-4a4 4 0 1 0 -3.5-1.4l-2.2 5.4h-.7a1 1 0 0 0 -1 1v1.5z" fill="#90ef98"/><path d="m5.25 12.2-3.25-8.2a8 8 0 0 1 7-3 5 5 0 0 0 -2.1 7.2z" fill="url(#a)"/></svg>
\ No newline at end of file
diff --git a/addons/input_prompts/joypad_motion_prompt/icon.svg.import b/addons/input_prompts/joypad_motion_prompt/icon.svg.import
new file mode 100644 (file)
index 0000000..4599dec
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ctmjowncjxjvf"
+path="res://.godot/imported/icon.svg-7c9166cdd531409b29351a7975181d41.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/joypad_motion_prompt/icon.svg"
+dest_files=["res://.godot/imported/icon.svg-7c9166cdd531409b29351a7975181d41.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/input_prompts/joypad_motion_prompt/joypad_motion_prompt.gd b/addons/input_prompts/joypad_motion_prompt/joypad_motion_prompt.gd
new file mode 100644 (file)
index 0000000..bc49740
--- /dev/null
@@ -0,0 +1,103 @@
+# Copyright (C) 2022-2023 John Pennycook
+# SPDX-License-Identifier: MIT
+@tool
+@icon("res://addons/input_prompts/joypad_motion_prompt/icon.svg")
+class_name JoypadMotionPrompt
+extends "res://addons/input_prompts/input_prompt.gd"
+## Displays a prompt based on a joypad axis and value.
+##
+## Displays a prompt based on a joypad axis and value.
+## The texture used for the prompt is determined by an icon preference. When
+## the icon preference is set to "Automatic", the prompt automatically adjusts
+## to match the most recent joypad device.
+## [br][br]
+## [b]Note[/b]: A [JoypadMotionPrompt] will never show keyboard or mouse
+## prompts. To automatically reflect the most recent input device, use
+## [ActionPrompt] instead.
+
+## A joypad axis index, such as [constant @GlobalScope.JOY_AXIS_LEFT_X].
+var axis := 0:
+       set = _set_axis
+
+## A joypad axis value (positive or negative).
+var axis_value := -1:
+       set = _set_axis_value
+
+## The icon preference for this prompt:
+## Automatic (0), Xbox (1), Sony (2), Nintendo (3).
+## When set to "Automatic", the prompt automatically adjusts to match the most
+## recent joypad device.
+var icon: int = Icons.AUTOMATIC:
+       set = _set_icon
+
+
+func _ready():
+       _update_icon()
+
+
+func _set_axis(new_axis: int):
+       axis = new_axis
+       var event := InputEventJoypadMotion.new()
+       event.axis = axis
+       event.axis_value = axis_value
+       events = [event]
+       _update_icon()
+
+
+func _set_axis_value(new_value: int):
+       axis_value = new_value
+       var event := InputEventJoypadMotion.new()
+       event.axis = axis
+       event.axis_value = axis_value
+       events = [event]
+       _update_icon()
+
+
+func _set_icon(new_icon):
+       icon = new_icon
+       _update_icon()
+
+
+func _update_icon():
+       var textures := PromptManager.get_joypad_motion_textures(icon)
+       texture = textures.get_texture(events[0])
+       queue_redraw()
+
+
+func _get_property_list():
+       var properties = []
+       properties.append(
+               {
+                       name = "JoypadMotionPrompt",
+                       type = TYPE_NIL,
+                       usage = PROPERTY_USAGE_CATEGORY | PROPERTY_USAGE_SCRIPT_VARIABLE
+               }
+       )
+       const AXIS_HINT := (
+               "Left Horizontal:0,"
+               + "Left Vertical:1,"
+               + "Right Horizontal:2,"
+               + "Right Vertical:3,"
+               + "Left Trigger:4,"
+               + "Right Trigger:5"
+       )
+       properties.append(
+               {name = "axis", type = TYPE_INT, hint = PROPERTY_HINT_ENUM, hint_string = AXIS_HINT}
+       )
+       properties.append(
+               {
+                       name = "axis_value",
+                       type = TYPE_INT,
+                       hint = PROPERTY_HINT_ENUM,
+                       hint_string = "Negative:-1,Positive:1"
+               }
+       )
+       properties.append(
+               {
+                       name = "icon",
+                       type = TYPE_INT,
+                       hint = PROPERTY_HINT_ENUM,
+                       hint_string = "Automatic,Xbox,Sony,Nintendo"
+               }
+       )
+       return properties
diff --git a/addons/input_prompts/joypad_motion_prompt/nintendo.tres b/addons/input_prompts/joypad_motion_prompt/nintendo.tres
new file mode 100644 (file)
index 0000000..1fff6cd
--- /dev/null
@@ -0,0 +1,26 @@
+[gd_resource type="Resource" script_class="JoypadMotionTextures" load_steps=12 format=3 uid="uid://dtjhtsx5tiane"]
+
+[ext_resource type="Texture2D" uid="uid://cah6r1q5x2lte" path="res://addons/input_prompts/icons/generic/left_stick_left.png" id="1_hu4ly"]
+[ext_resource type="Texture2D" uid="uid://c03r3n0nfrjck" path="res://addons/input_prompts/icons/generic/left_stick_right.png" id="2_rpjo7"]
+[ext_resource type="Texture2D" uid="uid://bntsrcd3hjcex" path="res://addons/input_prompts/icons/generic/left_stick_up.png" id="3_32uay"]
+[ext_resource type="Texture2D" uid="uid://dreirjfpqj40a" path="res://addons/input_prompts/icons/generic/left_stick_down.png" id="4_jimr7"]
+[ext_resource type="Texture2D" uid="uid://dkd01upu3qdb7" path="res://addons/input_prompts/icons/generic/right_stick_left.png" id="5_y1g31"]
+[ext_resource type="Texture2D" uid="uid://7wlwep2pflxf" path="res://addons/input_prompts/icons/generic/right_stick_right.png" id="6_ny0h0"]
+[ext_resource type="Texture2D" uid="uid://tdsh1d8hbha3" path="res://addons/input_prompts/icons/generic/right_stick_up.png" id="7_tjas0"]
+[ext_resource type="Texture2D" uid="uid://c6tm6gslt2cau" path="res://addons/input_prompts/icons/generic/right_stick_down.png" id="8_8b1wu"]
+[ext_resource type="Texture2D" uid="uid://dvixi1dxdoig2" path="res://addons/input_prompts/icons/nintendo/zl.png" id="9_scud4"]
+[ext_resource type="Texture2D" uid="uid://dbykk7rrgahs3" path="res://addons/input_prompts/icons/nintendo/zr.png" id="10_f0gfq"]
+[ext_resource type="Script" path="res://addons/input_prompts/resources/joypad_motion_textures.gd" id="11_nouuu"]
+
+[resource]
+script = ExtResource("11_nouuu")
+axis_0_minus = ExtResource("1_hu4ly")
+axis_0_plus = ExtResource("2_rpjo7")
+axis_1_minus = ExtResource("3_32uay")
+axis_1_plus = ExtResource("4_jimr7")
+axis_2_minus = ExtResource("5_y1g31")
+axis_2_plus = ExtResource("6_ny0h0")
+axis_3_minus = ExtResource("7_tjas0")
+axis_3_plus = ExtResource("8_8b1wu")
+axis_4_plus = ExtResource("9_scud4")
+axis_5_plus = ExtResource("10_f0gfq")
diff --git a/addons/input_prompts/joypad_motion_prompt/sony.tres b/addons/input_prompts/joypad_motion_prompt/sony.tres
new file mode 100644 (file)
index 0000000..8379f9d
--- /dev/null
@@ -0,0 +1,26 @@
+[gd_resource type="Resource" script_class="JoypadMotionTextures" load_steps=12 format=3 uid="uid://c3fwo2x7fe2u3"]
+
+[ext_resource type="Texture2D" uid="uid://cah6r1q5x2lte" path="res://addons/input_prompts/icons/generic/left_stick_left.png" id="1_u332s"]
+[ext_resource type="Texture2D" uid="uid://c03r3n0nfrjck" path="res://addons/input_prompts/icons/generic/left_stick_right.png" id="2_otk2y"]
+[ext_resource type="Texture2D" uid="uid://bntsrcd3hjcex" path="res://addons/input_prompts/icons/generic/left_stick_up.png" id="3_jhj8v"]
+[ext_resource type="Texture2D" uid="uid://dreirjfpqj40a" path="res://addons/input_prompts/icons/generic/left_stick_down.png" id="4_sywns"]
+[ext_resource type="Texture2D" uid="uid://dkd01upu3qdb7" path="res://addons/input_prompts/icons/generic/right_stick_left.png" id="5_msuu3"]
+[ext_resource type="Texture2D" uid="uid://7wlwep2pflxf" path="res://addons/input_prompts/icons/generic/right_stick_right.png" id="6_mifia"]
+[ext_resource type="Texture2D" uid="uid://tdsh1d8hbha3" path="res://addons/input_prompts/icons/generic/right_stick_up.png" id="7_7gygi"]
+[ext_resource type="Texture2D" uid="uid://c6tm6gslt2cau" path="res://addons/input_prompts/icons/generic/right_stick_down.png" id="8_n8vd6"]
+[ext_resource type="Texture2D" uid="uid://bxb6v2nl5ada5" path="res://addons/input_prompts/icons/sony/l2.png" id="9_tsnqk"]
+[ext_resource type="Texture2D" uid="uid://cotgbqlyecm6" path="res://addons/input_prompts/icons/sony/r2.png" id="10_ddeh3"]
+[ext_resource type="Script" path="res://addons/input_prompts/resources/joypad_motion_textures.gd" id="11_vc1yl"]
+
+[resource]
+script = ExtResource("11_vc1yl")
+axis_0_minus = ExtResource("1_u332s")
+axis_0_plus = ExtResource("2_otk2y")
+axis_1_minus = ExtResource("3_jhj8v")
+axis_1_plus = ExtResource("4_sywns")
+axis_2_minus = ExtResource("5_msuu3")
+axis_2_plus = ExtResource("6_mifia")
+axis_3_minus = ExtResource("7_7gygi")
+axis_3_plus = ExtResource("8_n8vd6")
+axis_4_plus = ExtResource("9_tsnqk")
+axis_5_plus = ExtResource("10_ddeh3")
diff --git a/addons/input_prompts/joypad_motion_prompt/xbox.tres b/addons/input_prompts/joypad_motion_prompt/xbox.tres
new file mode 100644 (file)
index 0000000..c465fe0
--- /dev/null
@@ -0,0 +1,26 @@
+[gd_resource type="Resource" script_class="JoypadMotionTextures" load_steps=12 format=3 uid="uid://dhnof34diuflj"]
+
+[ext_resource type="Script" path="res://addons/input_prompts/resources/joypad_motion_textures.gd" id="1_1t4om"]
+[ext_resource type="Texture2D" uid="uid://cah6r1q5x2lte" path="res://addons/input_prompts/icons/generic/left_stick_left.png" id="1_8xgrw"]
+[ext_resource type="Texture2D" uid="uid://c03r3n0nfrjck" path="res://addons/input_prompts/icons/generic/left_stick_right.png" id="2_h4tso"]
+[ext_resource type="Texture2D" uid="uid://bntsrcd3hjcex" path="res://addons/input_prompts/icons/generic/left_stick_up.png" id="3_1dcjl"]
+[ext_resource type="Texture2D" uid="uid://dreirjfpqj40a" path="res://addons/input_prompts/icons/generic/left_stick_down.png" id="4_fq862"]
+[ext_resource type="Texture2D" uid="uid://dkd01upu3qdb7" path="res://addons/input_prompts/icons/generic/right_stick_left.png" id="5_t2403"]
+[ext_resource type="Texture2D" uid="uid://7wlwep2pflxf" path="res://addons/input_prompts/icons/generic/right_stick_right.png" id="6_b5skw"]
+[ext_resource type="Texture2D" uid="uid://tdsh1d8hbha3" path="res://addons/input_prompts/icons/generic/right_stick_up.png" id="7_iwi3m"]
+[ext_resource type="Texture2D" uid="uid://c6tm6gslt2cau" path="res://addons/input_prompts/icons/generic/right_stick_down.png" id="8_qong4"]
+[ext_resource type="Texture2D" uid="uid://dx1u47qkx4in8" path="res://addons/input_prompts/icons/xbox/left_trigger.png" id="9_0mpc0"]
+[ext_resource type="Texture2D" uid="uid://c6cv5phl3gvvn" path="res://addons/input_prompts/icons/xbox/right_trigger.png" id="10_uujqu"]
+
+[resource]
+script = ExtResource("1_1t4om")
+axis_0_minus = ExtResource("1_8xgrw")
+axis_0_plus = ExtResource("2_h4tso")
+axis_1_minus = ExtResource("3_1dcjl")
+axis_1_plus = ExtResource("4_fq862")
+axis_2_minus = ExtResource("5_t2403")
+axis_2_plus = ExtResource("6_b5skw")
+axis_3_minus = ExtResource("7_iwi3m")
+axis_3_plus = ExtResource("8_qong4")
+axis_4_plus = ExtResource("9_0mpc0")
+axis_5_plus = ExtResource("10_uujqu")
diff --git a/addons/input_prompts/key_prompt/icon.svg b/addons/input_prompts/key_prompt/icon.svg
new file mode 100644 (file)
index 0000000..6f2c30c
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m4.55 5a.85.85 0 0 0 -.85.85v7.65a.85.85 0 0 0 .85.85h6.8a.85.85 0 0 0 .85-.85v-7.65a.85.85 0 0 0 -.85-.85zm.65 1.503h1.75v2.2l2-2.2h2.1l-2.884 3.172 2.884 3.172h-2.1l-2-2.2v2.2h-1.75z" fill="#90ef99"/><path d="m2 6.36v7.65a1.7 1.7 0 0 0 1.7 1.7h8.5a1.7 1.7 0 0 0 1.7-1.7v-7.65h-.85v7.65a.85.85 0 0 1 -.85.85h-8.5a.85.85 0 0 1 -.85-.85v-7.65z" fill="#90ef99"/><path d="m10.5 3.6.75-1.5m-5.75 1.5-.75-1.5m3.25 1.1v-1.7" fill="none" stroke="#8fef99" stroke-linecap="round" stroke-width="1.25"/></svg>
\ No newline at end of file
diff --git a/addons/input_prompts/key_prompt/icon.svg.import b/addons/input_prompts/key_prompt/icon.svg.import
new file mode 100644 (file)
index 0000000..ebb7e7a
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c4f7qmdehroms"
+path="res://.godot/imported/icon.svg-6a60ff4ffb6900f91f4986f02358fe20.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/key_prompt/icon.svg"
+dest_files=["res://.godot/imported/icon.svg-6a60ff4ffb6900f91f4986f02358fe20.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/input_prompts/key_prompt/key_prompt.gd b/addons/input_prompts/key_prompt/key_prompt.gd
new file mode 100644 (file)
index 0000000..7402ce6
--- /dev/null
@@ -0,0 +1,170 @@
+# Copyright (C) 2022-2023 John Pennycook
+# SPDX-License-Identifier: MIT
+@tool
+@icon("res://addons/input_prompts/key_prompt/icon.svg")
+class_name KeyPrompt
+extends "res://addons/input_prompts/input_prompt.gd"
+## Displays a prompt based on a keyboard scancode.
+##
+## Displays a prompt based on a keyboard scancode.
+## The texture used for the prompt is determined automatically.
+## [br][br]
+## [b]Note[/b]: A [KeyPrompt] will never show joypad or mouse
+## prompts. To automatically reflect the most recent input device, use
+## [ActionPrompt] instead.
+
+# TODO: Find a way to replace this with standard functionality.
+#       The Key enum is not accessible directly and can't be iterated over.
+const _KEYS = [
+       KEY_ESCAPE,
+       KEY_F1,
+       KEY_F2,
+       KEY_F3,
+       KEY_F4,
+       KEY_F5,
+       KEY_F6,
+       KEY_F7,
+       KEY_F8,
+       KEY_F9,
+       KEY_F10,
+       KEY_F11,
+       KEY_F12,
+       KEY_ASCIITILDE,
+       KEY_EXCLAM,
+       KEY_AT,
+       KEY_NUMBERSIGN,
+       KEY_1,
+       KEY_2,
+       KEY_3,
+       KEY_4,
+       KEY_5,
+       KEY_6,
+       KEY_7,
+       KEY_8,
+       KEY_9,
+       KEY_0,
+       KEY_MINUS,
+       KEY_PLUS,
+       KEY_EQUAL,
+       KEY_UNDERSCORE,
+       KEY_BAR,
+       KEY_BACKSPACE,
+       KEY_Q,
+       KEY_W,
+       KEY_E,
+       KEY_R,
+       KEY_T,
+       KEY_Y,
+       KEY_U,
+       KEY_I,
+       KEY_O,
+       KEY_P,
+       KEY_BRACKETLEFT,
+       KEY_BRACKETRIGHT,
+       KEY_BRACELEFT,
+       KEY_BRACERIGHT,
+       KEY_BACKSLASH,
+       KEY_ENTER,
+       KEY_A,
+       KEY_S,
+       KEY_D,
+       KEY_F,
+       KEY_G,
+       KEY_H,
+       KEY_J,
+       KEY_K,
+       KEY_L,
+       KEY_APOSTROPHE,
+       KEY_QUOTEDBL,
+       KEY_COLON,
+       KEY_SEMICOLON,
+       KEY_ASTERISK,
+       KEY_META,
+       KEY_Z,
+       KEY_X,
+       KEY_C,
+       KEY_V,
+       KEY_B,
+       KEY_N,
+       KEY_M,
+       KEY_LESS,
+       KEY_GREATER,
+       KEY_QUESTION,
+       KEY_SLASH,
+       KEY_UP,
+       KEY_RIGHT,
+       KEY_DOWN,
+       KEY_LEFT,
+       KEY_ALT,
+       KEY_TAB,
+       KEY_DELETE,
+       KEY_END,
+       KEY_NUMLOCK,
+       KEY_PERIOD,
+       KEY_DOLLAR,
+       KEY_PERCENT,
+       KEY_ASCIICIRCUM,
+       KEY_PARENLEFT,
+       KEY_PARENRIGHT,
+       KEY_CTRL,
+       KEY_CAPSLOCK,
+       KEY_HOME,
+       KEY_PAGEUP,
+       KEY_PAGEDOWN,
+       KEY_COMMA,
+       KEY_MEDIARECORD,
+       KEY_SPACE,
+       KEY_SHIFT,
+       KEY_INSERT,
+       KEY_PRINT,
+       KEY_SCROLLLOCK,
+       KEY_PAUSE,
+       KEY_MEDIAPLAY,
+       KEY_MEDIASTOP,
+       KEY_BACK,
+       KEY_FORWARD,
+       KEY_MEDIAPREVIOUS,
+       KEY_MEDIANEXT,
+]
+
+## A keyboard scancode, such as [constant @GlobalScope.KEY_ESCAPE].
+var key := KEY_EXCLAM:
+       set = _set_key
+
+
+func _ready():
+       _update_icon()
+
+
+func _set_key(scancode: int):
+       key = scancode
+       var event := InputEventKey.new()
+       event.keycode = scancode
+       events = [event]
+       _update_icon()
+
+
+func _update_icon():
+       var textures := PromptManager.get_keyboard_textures()
+       texture = textures.get_texture(events[0])
+       queue_redraw()
+
+
+func _get_property_list():
+       var properties = []
+       properties.append(
+               {
+                       name = "KeyPrompt",
+                       type = TYPE_NIL,
+                       usage = PROPERTY_USAGE_CATEGORY | PROPERTY_USAGE_SCRIPT_VARIABLE
+               }
+       )
+       var keys: String = ""
+       for k in _KEYS:
+               if keys != "":
+                       keys += ","
+               keys += "{0}:{1}".format([OS.get_keycode_string(k), k])
+       properties.append(
+               {name = "key", type = TYPE_INT, hint = PROPERTY_HINT_ENUM, hint_string = keys}
+       )
+       return properties
diff --git a/addons/input_prompts/key_prompt/keys.tres b/addons/input_prompts/key_prompt/keys.tres
new file mode 100644 (file)
index 0000000..7692440
--- /dev/null
@@ -0,0 +1,224 @@
+[gd_resource type="Resource" script_class="KeyboardTextures" load_steps=111 format=3 uid="uid://domrawueas2s"]
+
+[ext_resource type="Texture2D" uid="uid://ei5tpuh570dp" path="res://addons/input_prompts/icons/keyboard/esc.png" id="1_rf0mg"]
+[ext_resource type="Texture2D" uid="uid://bvodyh3h4lf23" path="res://addons/input_prompts/icons/keyboard/0.png" id="1_s15vc"]
+[ext_resource type="Texture2D" uid="uid://riaj57l1jlqv" path="res://addons/input_prompts/icons/keyboard/f1.png" id="1_tqv76"]
+[ext_resource type="Script" path="res://addons/input_prompts/resources/keyboard_textures.gd" id="1_uojqg"]
+[ext_resource type="Texture2D" uid="uid://dshgdv8b1s4yx" path="res://addons/input_prompts/icons/keyboard/1.png" id="2_xp6pc"]
+[ext_resource type="Texture2D" uid="uid://boer02ea1703" path="res://addons/input_prompts/icons/keyboard/f2.png" id="3_8nrvw"]
+[ext_resource type="Texture2D" uid="uid://dmlsiso1q4lfb" path="res://addons/input_prompts/icons/keyboard/2.png" id="3_jltf0"]
+[ext_resource type="Texture2D" uid="uid://4nm4436qnhtg" path="res://addons/input_prompts/icons/keyboard/f3.png" id="4_8i2do"]
+[ext_resource type="Texture2D" uid="uid://bf4eom0tm7cg0" path="res://addons/input_prompts/icons/keyboard/3.png" id="4_p2txu"]
+[ext_resource type="Texture2D" uid="uid://va3aynlfmriq" path="res://addons/input_prompts/icons/keyboard/4.png" id="5_3npif"]
+[ext_resource type="Texture2D" uid="uid://bv67io1l864a1" path="res://addons/input_prompts/icons/keyboard/f4.png" id="5_3r8ek"]
+[ext_resource type="Texture2D" uid="uid://uihje5m764bx" path="res://addons/input_prompts/icons/keyboard/f5.png" id="6_qqoi5"]
+[ext_resource type="Texture2D" uid="uid://drpc3hg1h7ra3" path="res://addons/input_prompts/icons/keyboard/5.png" id="6_yedrj"]
+[ext_resource type="Texture2D" uid="uid://bc5qukglexu4m" path="res://addons/input_prompts/icons/keyboard/f6.png" id="7_3dqv7"]
+[ext_resource type="Texture2D" uid="uid://c20j4d1asagf2" path="res://addons/input_prompts/icons/keyboard/6.png" id="7_5nssk"]
+[ext_resource type="Texture2D" uid="uid://c1j7ybdojbsdy" path="res://addons/input_prompts/icons/keyboard/7.png" id="8_c08wf"]
+[ext_resource type="Texture2D" uid="uid://bqws21dovdpjf" path="res://addons/input_prompts/icons/keyboard/8.png" id="9_2yhtr"]
+[ext_resource type="Texture2D" uid="uid://d05npg77uxdp1" path="res://addons/input_prompts/icons/keyboard/9.png" id="10_aiybh"]
+[ext_resource type="Texture2D" uid="uid://bj3eywfqt3xfl" path="res://addons/input_prompts/icons/keyboard/tilde.png" id="11_lx3nm"]
+[ext_resource type="Texture2D" uid="uid://yakqusko3p3h" path="res://addons/input_prompts/icons/keyboard/a.png" id="11_vehnw"]
+[ext_resource type="Texture2D" uid="uid://blxkuaujlcbmj" path="res://addons/input_prompts/icons/keyboard/alt.png" id="12_brmwd"]
+[ext_resource type="Texture2D" uid="uid://ctlmc2ba1nnwg" path="res://addons/input_prompts/icons/keyboard/at.png" id="12_ksfma"]
+[ext_resource type="Texture2D" uid="uid://6eqbtpaitj6" path="res://addons/input_prompts/icons/keyboard/apostrophe.png" id="12_nf05a"]
+[ext_resource type="Texture2D" uid="uid://c3lq40m0un2vi" path="res://addons/input_prompts/icons/keyboard/backspace.png" id="13_2l5r2"]
+[ext_resource type="Texture2D" uid="uid://buo267imq81wk" path="res://addons/input_prompts/icons/keyboard/backslash.png" id="14_03w57"]
+[ext_resource type="Texture2D" uid="uid://dmrupkmptjy3i" path="res://addons/input_prompts/icons/keyboard/asterisk.png" id="14_7im6p"]
+[ext_resource type="Texture2D" uid="uid://detsp08crf2po" path="res://addons/input_prompts/icons/keyboard/caret.png" id="14_aqle1"]
+[ext_resource type="Texture2D" uid="uid://bt4ldbkius5c3" path="res://addons/input_prompts/icons/keyboard/pipe.png" id="14_qtpfb"]
+[ext_resource type="Texture2D" uid="uid://d2as5erfr7tji" path="res://addons/input_prompts/icons/keyboard/e.png" id="15_2px7e"]
+[ext_resource type="Texture2D" uid="uid://d1fenf4b142vk" path="res://addons/input_prompts/icons/keyboard/equals.png" id="16_tf5cy"]
+[ext_resource type="Texture2D" uid="uid://cr6vi6ebdr82a" path="res://addons/input_prompts/icons/keyboard/left_brace.png" id="17_0o1ar"]
+[ext_resource type="Texture2D" uid="uid://cksdxqlbkrjc5" path="res://addons/input_prompts/icons/keyboard/exclamation.png" id="18_4r68e"]
+[ext_resource type="Texture2D" uid="uid://ccag2aejxluu2" path="res://addons/input_prompts/icons/keyboard/right_brace.png" id="18_e3vnc"]
+[ext_resource type="Texture2D" uid="uid://ccv43ygy8fg0n" path="res://addons/input_prompts/icons/keyboard/b.png" id="18_gyhab"]
+[ext_resource type="Texture2D" uid="uid://ccwwgsn2sp0tl" path="res://addons/input_prompts/icons/keyboard/left_bracket.png" id="19_pyktm"]
+[ext_resource type="Texture2D" uid="uid://ostblmf53v77" path="res://addons/input_prompts/icons/keyboard/media_back.png" id="19_yeqkd"]
+[ext_resource type="Texture2D" uid="uid://04hpun881id1" path="res://addons/input_prompts/icons/keyboard/right_bracket.png" id="20_8hbe5"]
+[ext_resource type="Texture2D" uid="uid://bjdih12b3d5ug" path="res://addons/input_prompts/icons/keyboard/f10.png" id="20_m3877"]
+[ext_resource type="Texture2D" uid="uid://cshp782a8pjmk" path="res://addons/input_prompts/icons/keyboard/f11.png" id="21_a5hwg"]
+[ext_resource type="Texture2D" uid="uid://b0kuadlp4jw6j" path="res://addons/input_prompts/icons/keyboard/d.png" id="21_ch2od"]
+[ext_resource type="Texture2D" uid="uid://o6o5wyo8ce3j" path="res://addons/input_prompts/icons/keyboard/f12.png" id="22_tv5ol"]
+[ext_resource type="Texture2D" uid="uid://dxvryuhofjieh" path="res://addons/input_prompts/icons/keyboard/colon.png" id="23_edw0u"]
+[ext_resource type="Texture2D" uid="uid://dxydr83ulipn7" path="res://addons/input_prompts/icons/keyboard/f.png" id="27_3k1sw"]
+[ext_resource type="Texture2D" uid="uid://dw4bnrd874e24" path="res://addons/input_prompts/icons/keyboard/c.png" id="27_qxebp"]
+[ext_resource type="Texture2D" uid="uid://cdgup5y6rik0q" path="res://addons/input_prompts/icons/keyboard/f7.png" id="28_35jg6"]
+[ext_resource type="Texture2D" uid="uid://dn8boox0dp1yt" path="res://addons/input_prompts/icons/keyboard/caps.png" id="28_o07ol"]
+[ext_resource type="Texture2D" uid="uid://bg1t161py4o3b" path="res://addons/input_prompts/icons/keyboard/f8.png" id="29_8kb5k"]
+[ext_resource type="Texture2D" uid="uid://nnrfrc3ommb7" path="res://addons/input_prompts/icons/keyboard/f9.png" id="30_f661n"]
+[ext_resource type="Texture2D" uid="uid://dl4rc530g2l60" path="res://addons/input_prompts/icons/keyboard/comma.png" id="30_uqwoq"]
+[ext_resource type="Texture2D" uid="uid://cma0hx3a47704" path="res://addons/input_prompts/icons/keyboard/i.png" id="31_ciejs"]
+[ext_resource type="Texture2D" uid="uid://bp2btmbc2q2io" path="res://addons/input_prompts/icons/keyboard/ctrl.png" id="31_gm15r"]
+[ext_resource type="Texture2D" uid="uid://b3vdyopl2ih21" path="res://addons/input_prompts/icons/keyboard/minus.png" id="32_u0ykb"]
+[ext_resource type="Texture2D" uid="uid://d21qtckj4teb1" path="res://addons/input_prompts/icons/keyboard/del.png" id="33_v28ux"]
+[ext_resource type="Texture2D" uid="uid://bfaw7orxjvpff" path="res://addons/input_prompts/icons/keyboard/hash.png" id="33_w02tc"]
+[ext_resource type="Texture2D" uid="uid://bsd3apwcjg2p8" path="res://addons/input_prompts/icons/keyboard/dollar.png" id="34_ihfab"]
+[ext_resource type="Texture2D" uid="uid://7xbq5dekny17" path="res://addons/input_prompts/icons/keyboard/o.png" id="34_wppxf"]
+[ext_resource type="Texture2D" uid="uid://b2l1ftvddvnl0" path="res://addons/input_prompts/icons/keyboard/p.png" id="35_bfxms"]
+[ext_resource type="Texture2D" uid="uid://o0jnn82k7f8d" path="res://addons/input_prompts/icons/keyboard/down.png" id="35_d1css"]
+[ext_resource type="Texture2D" uid="uid://c0htdc3d44lbb" path="res://addons/input_prompts/icons/keyboard/plus.png" id="36_53uji"]
+[ext_resource type="Texture2D" uid="uid://gybid8440i5b" path="res://addons/input_prompts/icons/keyboard/end.png" id="37_ma2j1"]
+[ext_resource type="Texture2D" uid="uid://c65r2dyaf7vmq" path="res://addons/input_prompts/icons/keyboard/q.png" id="37_y12tf"]
+[ext_resource type="Texture2D" uid="uid://bl0h0oouf2koo" path="res://addons/input_prompts/icons/keyboard/r.png" id="38_1ibmi"]
+[ext_resource type="Texture2D" uid="uid://phpq5qt2ct30" path="res://addons/input_prompts/icons/keyboard/enter_wide.png" id="38_qpkvw"]
+[ext_resource type="Texture2D" uid="uid://6guh8jedcfc8" path="res://addons/input_prompts/icons/keyboard/t.png" id="39_26e6c"]
+[ext_resource type="Texture2D" uid="uid://brr13r75g8u2d" path="res://addons/input_prompts/icons/keyboard/u.png" id="40_kdb66"]
+[ext_resource type="Texture2D" uid="uid://jw36dq3n1wg5" path="res://addons/input_prompts/icons/keyboard/g.png" id="40_l0xvd"]
+[ext_resource type="Texture2D" uid="uid://cnhd0necaevyy" path="res://addons/input_prompts/icons/keyboard/h.png" id="41_0yutf"]
+[ext_resource type="Texture2D" uid="uid://38vinib8ctm" path="res://addons/input_prompts/icons/keyboard/underscore.png" id="41_r6xbw"]
+[ext_resource type="Texture2D" uid="uid://buo4ntxw1vofu" path="res://addons/input_prompts/icons/keyboard/w.png" id="42_ldn60"]
+[ext_resource type="Texture2D" uid="uid://dt7amdf8kea3e" path="res://addons/input_prompts/icons/keyboard/j.png" id="43_1xcih"]
+[ext_resource type="Texture2D" uid="uid://d2w845et14y24" path="res://addons/input_prompts/icons/keyboard/y.png" id="43_mp1ou"]
+[ext_resource type="Texture2D" uid="uid://b5y36flrr7wk2" path="res://addons/input_prompts/icons/keyboard/k.png" id="44_2qjjc"]
+[ext_resource type="Texture2D" uid="uid://ii0rcifxy2s3" path="res://addons/input_prompts/icons/keyboard/l.png" id="45_0jsy4"]
+[ext_resource type="Texture2D" uid="uid://cgmpe7f8a51vk" path="res://addons/input_prompts/icons/keyboard/meta.png" id="49_f5qpc"]
+[ext_resource type="Texture2D" uid="uid://bwhf0tx67yj7a" path="res://addons/input_prompts/icons/keyboard/s.png" id="53_4ai2n"]
+[ext_resource type="Texture2D" uid="uid://thkia4a3h07o" path="res://addons/input_prompts/icons/keyboard/media_forward.png" id="55_w3ydn"]
+[ext_resource type="Texture2D" uid="uid://c7ul2t73hkrh2" path="res://addons/input_prompts/icons/keyboard/quote.png" id="56_v7kvb"]
+[ext_resource type="Texture2D" uid="uid://cypb66qn0k6pe" path="res://addons/input_prompts/icons/keyboard/greater.png" id="57_at3aw"]
+[ext_resource type="Texture2D" uid="uid://dthwurl1jbgr2" path="res://addons/input_prompts/icons/keyboard/home.png" id="59_4db8o"]
+[ext_resource type="Texture2D" uid="uid://brap3jmkcighr" path="res://addons/input_prompts/icons/keyboard/semicolon.png" id="59_x313l"]
+[ext_resource type="Texture2D" uid="uid://brkti5bpv56nw" path="res://addons/input_prompts/icons/keyboard/insert.png" id="61_o6oer"]
+[ext_resource type="Texture2D" uid="uid://d045ew7wsb7tf" path="res://addons/input_prompts/icons/keyboard/z.png" id="65_26pnj"]
+[ext_resource type="Texture2D" uid="uid://btyg60vnh1m3p" path="res://addons/input_prompts/icons/keyboard/left.png" id="65_lm70x"]
+[ext_resource type="Texture2D" uid="uid://ctjxnectq0at7" path="res://addons/input_prompts/icons/keyboard/less.png" id="66_bdvqf"]
+[ext_resource type="Texture2D" uid="uid://bwdgt2l8japvf" path="res://addons/input_prompts/icons/keyboard/m.png" id="67_shy2i"]
+[ext_resource type="Texture2D" uid="uid://dju12hoog736a" path="res://addons/input_prompts/icons/keyboard/media_next.png" id="68_atm3k"]
+[ext_resource type="Texture2D" uid="uid://dbbleujvfc1c6" path="res://addons/input_prompts/icons/keyboard/media_play.png" id="69_eecm8"]
+[ext_resource type="Texture2D" uid="uid://uhpi1g6sp81i" path="res://addons/input_prompts/icons/keyboard/media_previous.png" id="70_is1bc"]
+[ext_resource type="Texture2D" uid="uid://8664lp8ns1g3" path="res://addons/input_prompts/icons/keyboard/media_record.png" id="71_7wwf1"]
+[ext_resource type="Texture2D" uid="uid://qvpqnw4ro2rv" path="res://addons/input_prompts/icons/keyboard/media_stop.png" id="72_by5fh"]
+[ext_resource type="Texture2D" uid="uid://cjsbhtfwtx7f5" path="res://addons/input_prompts/icons/keyboard/n.png" id="75_o2h2h"]
+[ext_resource type="Texture2D" uid="uid://cx2cp4ju3epmd" path="res://addons/input_prompts/icons/keyboard/num.png" id="76_4a8s6"]
+[ext_resource type="Texture2D" uid="uid://cl245ggdr7plr" path="res://addons/input_prompts/icons/keyboard/page_down.png" id="80_awmyp"]
+[ext_resource type="Texture2D" uid="uid://gtj6cb8hu55h" path="res://addons/input_prompts/icons/keyboard/page_up.png" id="81_3x5g2"]
+[ext_resource type="Texture2D" uid="uid://cx6cpv3kpv14p" path="res://addons/input_prompts/icons/keyboard/left_paren.png" id="82_xomq5"]
+[ext_resource type="Texture2D" uid="uid://bqihft4hpiyww" path="res://addons/input_prompts/icons/keyboard/right_paren.png" id="83_ul01k"]
+[ext_resource type="Texture2D" uid="uid://36860dqbw5ob" path="res://addons/input_prompts/icons/keyboard/pause.png" id="84_uafmh"]
+[ext_resource type="Texture2D" uid="uid://dlbg4k1tcijbq" path="res://addons/input_prompts/icons/keyboard/percent.png" id="85_ehueq"]
+[ext_resource type="Texture2D" uid="uid://bx75sy6bae8p3" path="res://addons/input_prompts/icons/keyboard/period.png" id="86_sywp4"]
+[ext_resource type="Texture2D" uid="uid://d0l0h0ihsyxk2" path="res://addons/input_prompts/icons/keyboard/print.png" id="88_u6omw"]
+[ext_resource type="Texture2D" uid="uid://oqliqplljlqb" path="res://addons/input_prompts/icons/keyboard/question.png" id="90_n43er"]
+[ext_resource type="Texture2D" uid="uid://ci7hl8jhywnrm" path="res://addons/input_prompts/icons/keyboard/right.png" id="93_cwk2l"]
+[ext_resource type="Texture2D" uid="uid://d1xxjb2dmoube" path="res://addons/input_prompts/icons/keyboard/scroll.png" id="95_w212a"]
+[ext_resource type="Texture2D" uid="uid://bexwbmh0e7s1" path="res://addons/input_prompts/icons/keyboard/shift.png" id="97_g6eyy"]
+[ext_resource type="Texture2D" uid="uid://cqt5gqqy8j5wy" path="res://addons/input_prompts/icons/keyboard/forward_slash.png" id="98_0r3ad"]
+[ext_resource type="Texture2D" uid="uid://bkdxv2b3bqdu8" path="res://addons/input_prompts/icons/keyboard/space.png" id="99_1dexc"]
+[ext_resource type="Texture2D" uid="uid://dv4m8ks5g6uj1" path="res://addons/input_prompts/icons/keyboard/tab.png" id="101_c6cyl"]
+[ext_resource type="Texture2D" uid="uid://3bvyef0f0p5w" path="res://addons/input_prompts/icons/keyboard/up.png" id="104_ulbr0"]
+[ext_resource type="Texture2D" uid="uid://5tfe20xqsam3" path="res://addons/input_prompts/icons/keyboard/v.png" id="105_xfbvq"]
+[ext_resource type="Texture2D" uid="uid://dgp4d8a0ihmye" path="res://addons/input_prompts/icons/keyboard/x.png" id="107_mjl55"]
+
+[resource]
+script = ExtResource("1_uojqg")
+Escape = ExtResource("1_rf0mg")
+F1 = ExtResource("1_tqv76")
+F2 = ExtResource("3_8nrvw")
+F3 = ExtResource("4_8i2do")
+F4 = ExtResource("5_3r8ek")
+F5 = ExtResource("6_qqoi5")
+F6 = ExtResource("7_3dqv7")
+F7 = ExtResource("28_35jg6")
+F8 = ExtResource("29_8kb5k")
+F9 = ExtResource("30_f661n")
+F10 = ExtResource("20_m3877")
+F11 = ExtResource("21_a5hwg")
+F12 = ExtResource("22_tv5ol")
+AsciiTilde = ExtResource("11_lx3nm")
+Exclam = ExtResource("18_4r68e")
+At = ExtResource("12_ksfma")
+NumberSign = ExtResource("33_w02tc")
+1 = ExtResource("2_xp6pc")
+2 = ExtResource("3_jltf0")
+3 = ExtResource("4_p2txu")
+4 = ExtResource("5_3npif")
+5 = ExtResource("6_yedrj")
+6 = ExtResource("7_5nssk")
+7 = ExtResource("8_c08wf")
+8 = ExtResource("9_2yhtr")
+9 = ExtResource("10_aiybh")
+0 = ExtResource("1_s15vc")
+Minus = ExtResource("32_u0ykb")
+Plus = ExtResource("36_53uji")
+Equal = ExtResource("16_tf5cy")
+UnderScore = ExtResource("41_r6xbw")
+Bar = ExtResource("14_qtpfb")
+Backspace = ExtResource("13_2l5r2")
+Q = ExtResource("37_y12tf")
+W = ExtResource("42_ldn60")
+E = ExtResource("15_2px7e")
+R = ExtResource("38_1ibmi")
+T = ExtResource("39_26e6c")
+Y = ExtResource("43_mp1ou")
+U = ExtResource("40_kdb66")
+I = ExtResource("31_ciejs")
+O = ExtResource("34_wppxf")
+P = ExtResource("35_bfxms")
+BracketLeft = ExtResource("19_pyktm")
+BracketRight = ExtResource("20_8hbe5")
+BraceLeft = ExtResource("17_0o1ar")
+BraceRight = ExtResource("18_e3vnc")
+BackSlash = ExtResource("14_03w57")
+Enter = ExtResource("38_qpkvw")
+A = ExtResource("11_vehnw")
+S = ExtResource("53_4ai2n")
+D = ExtResource("21_ch2od")
+F = ExtResource("27_3k1sw")
+G = ExtResource("40_l0xvd")
+H = ExtResource("41_0yutf")
+J = ExtResource("43_1xcih")
+K = ExtResource("44_2qjjc")
+L = ExtResource("45_0jsy4")
+Apostrophe = ExtResource("12_nf05a")
+QuoteDbl = ExtResource("56_v7kvb")
+Colon = ExtResource("23_edw0u")
+Semicolon = ExtResource("59_x313l")
+Asterisk = ExtResource("14_7im6p")
+Meta = ExtResource("49_f5qpc")
+Z = ExtResource("65_26pnj")
+X = ExtResource("107_mjl55")
+C = ExtResource("27_qxebp")
+V = ExtResource("105_xfbvq")
+B = ExtResource("18_gyhab")
+N = ExtResource("75_o2h2h")
+M = ExtResource("67_shy2i")
+Less = ExtResource("66_bdvqf")
+Greater = ExtResource("57_at3aw")
+Question = ExtResource("90_n43er")
+Slash = ExtResource("98_0r3ad")
+Up = ExtResource("104_ulbr0")
+Right = ExtResource("93_cwk2l")
+Down = ExtResource("35_d1css")
+Left = ExtResource("65_lm70x")
+Alt = ExtResource("12_brmwd")
+Tab = ExtResource("101_c6cyl")
+Delete = ExtResource("33_v28ux")
+End = ExtResource("37_ma2j1")
+NumLock = ExtResource("76_4a8s6")
+Period = ExtResource("86_sywp4")
+Dollar = ExtResource("34_ihfab")
+Percent = ExtResource("85_ehueq")
+AsciiCircum = ExtResource("14_aqle1")
+ParenLeft = ExtResource("82_xomq5")
+ParenRight = ExtResource("83_ul01k")
+Ctrl = ExtResource("31_gm15r")
+CapsLock = ExtResource("28_o07ol")
+Home = ExtResource("59_4db8o")
+PageUp = ExtResource("81_3x5g2")
+PageDown = ExtResource("80_awmyp")
+Comma = ExtResource("30_uqwoq")
+MediaRecord = ExtResource("71_7wwf1")
+Space = ExtResource("99_1dexc")
+Shift = ExtResource("97_g6eyy")
+Insert = ExtResource("61_o6oer")
+Print = ExtResource("88_u6omw")
+ScrollLock = ExtResource("95_w212a")
+Pause = ExtResource("84_uafmh")
+MediaPlay = ExtResource("69_eecm8")
+MediaStop = ExtResource("72_by5fh")
+Back = ExtResource("19_yeqkd")
+Forward = ExtResource("55_w3ydn")
+MediaPrevious = ExtResource("70_is1bc")
+MediaNext = ExtResource("68_atm3k")
diff --git a/addons/input_prompts/mouse_button_prompt/buttons.tres b/addons/input_prompts/mouse_button_prompt/buttons.tres
new file mode 100644 (file)
index 0000000..cc17d8a
--- /dev/null
@@ -0,0 +1,20 @@
+[gd_resource type="Resource" script_class="MouseButtonTextures" load_steps=9 format=3 uid="uid://bt25mebuyicjf"]
+
+[ext_resource type="Texture2D" uid="uid://d0bfvcxip20dc" path="res://addons/input_prompts/icons/mouse/left.png" id="1_wtkjw"]
+[ext_resource type="Script" path="res://addons/input_prompts/resources/mouse_button_textures.gd" id="1_yejn7"]
+[ext_resource type="Texture2D" uid="uid://dtq7m7h8im036" path="res://addons/input_prompts/icons/mouse/right.png" id="2_wwb4y"]
+[ext_resource type="Texture2D" uid="uid://b4ih2kvt8mit0" path="res://addons/input_prompts/icons/mouse/middle.png" id="3_b4kwc"]
+[ext_resource type="Texture2D" uid="uid://cybx1ogrrc1si" path="res://addons/input_prompts/icons/mouse/wheel_up.png" id="4_kp7cl"]
+[ext_resource type="Texture2D" uid="uid://bkgtieikd4hrg" path="res://addons/input_prompts/icons/mouse/wheel_down.png" id="5_f36mi"]
+[ext_resource type="Texture2D" uid="uid://1gb8h0fmwu6h" path="res://addons/input_prompts/icons/mouse/wheel_left.png" id="6_rrc1l"]
+[ext_resource type="Texture2D" uid="uid://dmblfllnnkgou" path="res://addons/input_prompts/icons/mouse/wheel_right.png" id="7_wyiou"]
+
+[resource]
+script = ExtResource("1_yejn7")
+button_1 = ExtResource("1_wtkjw")
+button_2 = ExtResource("2_wwb4y")
+button_3 = ExtResource("3_b4kwc")
+button_4 = ExtResource("4_kp7cl")
+button_5 = ExtResource("5_f36mi")
+button_6 = ExtResource("6_rrc1l")
+button_7 = ExtResource("7_wyiou")
diff --git a/addons/input_prompts/mouse_button_prompt/icon.svg b/addons/input_prompts/mouse_button_prompt/icon.svg
new file mode 100644 (file)
index 0000000..ce8cdf0
--- /dev/null
@@ -0,0 +1 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3.5 8.5v2.75a4 4 0 0 0 8 0v-2.75zm3-1v-3.5a4 4 0 0 0 -3 3.5z" fill="#90ef99"/><path d="m7.5 4.127a2 2 0 0 0 -2-2h-1.5a2 2 0 0 1 -2-2" fill="none" stroke="#90ef98" stroke-linecap="round"/><path d="m11.5 7.5a4 4 0 0 0 -3-3.5v3.5z" fill="#8fef99"/><path d="m12.2 5.5 1.6-.8m-2.5-.75 1.3-1.3m-2.85.4.8-1.6" stroke="#8fef99" stroke-linecap="round" stroke-width="1.25"/></svg>
\ No newline at end of file
diff --git a/addons/input_prompts/mouse_button_prompt/icon.svg.import b/addons/input_prompts/mouse_button_prompt/icon.svg.import
new file mode 100644 (file)
index 0000000..6302c03
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cym1cfq2op3s6"
+path="res://.godot/imported/icon.svg-dad90772baffd0437f4b05e3773e76ab.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/input_prompts/mouse_button_prompt/icon.svg"
+dest_files=["res://.godot/imported/icon.svg-dad90772baffd0437f4b05e3773e76ab.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/input_prompts/mouse_button_prompt/mouse_button_prompt.gd b/addons/input_prompts/mouse_button_prompt/mouse_button_prompt.gd
new file mode 100644 (file)
index 0000000..f931d9a
--- /dev/null
@@ -0,0 +1,57 @@
+# Copyright (C) 2022-2023 John Pennycook
+# SPDX-License-Identifier: MIT
+@tool
+@icon("res://addons/input_prompts/mouse_button_prompt/icon.svg")
+class_name MouseButtonPrompt
+extends "res://addons/input_prompts/input_prompt.gd"
+## Displays a prompt based on a mouse button index.
+##
+## Displays a prompt based on a mouse button index.
+## The texture used for the prompt is determined automatically.
+## [br][br]
+## [b]Note[/b]: A [MouseButtonPrompt] will never show joypad or keyboard
+## prompts. To automatically reflect the most recent input device, use
+## [ActionPrompt] instead.
+
+## A mouse button index, such as [constant @GlobalScope.MOUSE_BUTTON_LEFT].
+var button := 1:
+       set = _set_button
+
+
+func _ready():
+       _update_icon()
+
+
+func _set_button(index: int):
+       button = index
+       var event := InputEventMouseButton.new()
+       event.button_index = button
+       events = [event]
+       _update_icon()
+
+
+func _update_icon():
+       var textures := PromptManager.get_mouse_textures()
+       texture = textures.get_texture(events[0])
+       queue_redraw()
+
+
+func _get_property_list():
+       var properties = []
+       properties.append(
+               {
+                       name = "MouseButtonPrompt",
+                       type = TYPE_NIL,
+                       usage = PROPERTY_USAGE_CATEGORY | PROPERTY_USAGE_SCRIPT_VARIABLE
+               }
+       )
+       properties.append(
+               {
+                       name = "button",
+                       type = TYPE_INT,
+                       hint = PROPERTY_HINT_ENUM,
+                       hint_string =
+                       "Left:1,Right:2,Middle:3,Wheel Up:4,Wheel Down:5,Wheel Left:6,Wheel Right:7"
+               }
+       )
+       return properties
diff --git a/addons/input_prompts/plugin.cfg b/addons/input_prompts/plugin.cfg
new file mode 100644 (file)
index 0000000..ea38ebe
--- /dev/null
@@ -0,0 +1,7 @@
+[plugin]
+
+name="Input Prompts"
+description="Adds input prompts with support for keyboard/mouse and controllers."
+author="John Pennycook"
+version="2.0"
+script="plugin.gd"
diff --git a/addons/input_prompts/plugin.gd b/addons/input_prompts/plugin.gd
new file mode 100644 (file)
index 0000000..136dd19
--- /dev/null
@@ -0,0 +1,16 @@
+# Copyright (C) 2022-2023 John Pennycook
+# SPDX-License-Identifier: MIT
+@tool
+extends EditorPlugin
+
+var inspector_plugin = preload("res://addons/input_prompts/inspector_plugin.gd").new()
+
+
+func _enter_tree():
+       add_autoload_singleton("PromptManager", "res://addons/input_prompts/input_prompt_manager.gd")
+       add_inspector_plugin(inspector_plugin)
+
+
+func _exit_tree():
+       remove_inspector_plugin(inspector_plugin)
+       remove_autoload_singleton("PromptManager")
diff --git a/addons/input_prompts/resources/joypad_button_textures.gd b/addons/input_prompts/resources/joypad_button_textures.gd
new file mode 100644 (file)
index 0000000..d709091
--- /dev/null
@@ -0,0 +1,81 @@
+# Copyright (C) 2022-2023 John Pennycook
+# SPDX-License-Identifier: MIT
+@tool
+class_name JoypadButtonTextures
+extends Resource
+## Textures used by a [JoypadButtonPrompt] or [ActionPrompt].
+##
+## Textures used by a [JoypadButtonPrompt] or [ActionPrompt]. Stores a texture
+## for each joypad button index.
+
+## Texture for Joypad Button 0 (Bottom Action, Sony Cross, Xbox A, Nintendo B)
+@export var button_0: Texture2D = null
+
+## Texture for Joypad Button 1 (Right Action, Sony Circle, Xbox B, Nintendo A)
+@export var button_1: Texture2D = null
+
+## Texture for Joypad Button 2 (Left Action, Sony Square, Xbox X, Nintendo Y)
+@export var button_2: Texture2D = null
+
+## Texture for Joypad Button 3 (Top Action, Sony Triangle, Xbox Y, Nintendo X)
+@export var button_3: Texture2D = null
+
+## Texture for Joypad Button 4 (Back, Sony Select, Xbox Back, Nintendo -)
+@export var button_4: Texture2D = null
+
+## Texture for Joypad Button 5 (Guide, Sony PS, Xbox Home)
+@export var button_5: Texture2D = null
+
+## Texture for Joypad Button 6 (Start, Nintendo +)
+@export var button_6: Texture2D = null
+
+## Texture for Joypad Button 7 (Left Stick, Sony L3, Xbox L/LS)
+@export var button_7: Texture2D = null
+
+## Texture for Joypad Button 8 (Right Stick, Sony R3, Xbox R/RS)
+@export var button_8: Texture2D = null
+
+## Texture for Joypad Button 8 (Left Shoulder, Sony L1, Xbox LB)
+@export var button_9: Texture2D = null
+
+## Texture for Joypad Button 9 (Right Shoulder, Sony R1, Xbox RB)
+@export var button_10: Texture2D = null
+
+## Texture for Joypad Button 11 (D-pad Up)
+@export var button_11: Texture2D = null
+
+## Texture for Joypad Button 12 (D-pad Down)
+@export var button_12: Texture2D = null
+
+## Texture for Joypad Button 13 (D-pad Left)
+@export var button_13: Texture2D = null
+
+## Texture for Joypad Button 14 (D-pad Right)
+@export var button_14: Texture2D = null
+
+## Texture for Joypad Button 15 (Xbox Share, PS5 Microphone, Nintendo Capture)
+@export var button_15: Texture2D = null
+
+## Texture for Joypad Button 16 (Xbox Paddle 1)
+@export var button_16: Texture2D = null
+
+## Texture for Joypad Button 17 (Xbox Paddle 2)
+@export var button_17: Texture2D = null
+
+## Texture for Joypad Button 18 (Xbox Paddle 3)
+@export var button_18: Texture2D = null
+
+## Texture for Joypad Button 10 (Xbox Paddle 4)
+@export var button_19: Texture2D = null
+
+## Texture for Joypad Button 20 (Xbox Paddle 2)
+@export var button_20: Texture2D = null
+
+
+## Return the [Texture2D] associated with the specified [InputEvent], or null.
+func get_texture(event: InputEvent) -> Texture2D:
+       if not event is InputEventJoypadButton:
+               return null
+       var joypad_event := event as InputEventJoypadButton
+       var button := joypad_event.button_index
+       return get("button_" + str(button))
diff --git a/addons/input_prompts/resources/joypad_motion_textures.gd b/addons/input_prompts/resources/joypad_motion_textures.gd
new file mode 100644 (file)
index 0000000..8e33cba
--- /dev/null
@@ -0,0 +1,56 @@
+# Copyright (C) 2022-2023 John Pennycook
+# SPDX-License-Identifier: MIT
+@tool
+class_name JoypadMotionTextures
+extends Resource
+## Textures used by a [JoypadMotionPrompt] or [ActionPrompt].
+##
+## Textures used by a [JoypadMotionPrompt] or [ActionPrompt]. Stores a texture
+## for each joypad axis and value.
+
+## Texture for Axis 0 - (Left Stick Left, Joystick 0 Left)
+@export var axis_0_minus: Texture2D = null
+
+## Texture for Axis 0 + (Left Stick Right, Joystick 0 Right)
+@export var axis_0_plus: Texture2D = null
+
+## Texture for Axis 1 - (Left Stick Up, Joystick 0 Up)
+@export var axis_1_minus: Texture2D = null
+
+## Texture for Axis 1 + (Left Stick Down, Joystick 0 Down)
+@export var axis_1_plus: Texture2D = null
+
+## Texture for Axis 2 - (Right Stick Left, Joystick 1 Left)
+@export var axis_2_minus: Texture2D = null
+
+## Texture for Axis 2 + (Right Stick Right, Joystick 1 Right)
+@export var axis_2_plus: Texture2D = null
+
+## Texture for Axis 3 - (Right Stick Up, Joystick 1 Up)
+@export var axis_3_minus: Texture2D = null
+
+## Texture for Axis 3 + (Left Stick Down, Joystick 1 Down)
+@export var axis_3_plus: Texture2D = null
+
+## Texture for Axis 4 - (Joystick 2 Left)
+@export var axis_4_minus: Texture2D = null
+
+## Texture for Axis 4 + (Left Trigger, Sony L2, Xbox LT, Joystick 2 Right)
+@export var axis_4_plus: Texture2D = null
+
+## Texture for Axis 5 - (Joystick 2 Up)
+@export var axis_5_minus: Texture2D = null
+
+## Texture for Axis 5 + (Right Trigger, Sony R2, Xbox RT, Joystick 2 Down)
+@export var axis_5_plus: Texture2D = null
+
+
+## Return the [Texture2D] associated with the specified [InputEvent], or null.
+func get_texture(event: InputEvent) -> Texture2D:
+       if not event is InputEventJoypadMotion:
+               return null
+       var motion_event := event as InputEventJoypadMotion
+       var axis = motion_event.axis
+       var axis_value = motion_event.axis_value
+       var suffix := "_minus" if axis_value == -1 else "_plus"
+       return get("axis_" + str(axis) + suffix)
diff --git a/addons/input_prompts/resources/keyboard_textures.gd b/addons/input_prompts/resources/keyboard_textures.gd
new file mode 100644 (file)
index 0000000..cb189e0
--- /dev/null
@@ -0,0 +1,54 @@
+# Copyright (C) 2022-2023 John Pennycook
+# SPDX-License-Identifier: MIT
+@tool
+class_name KeyboardTextures
+extends Resource
+## Textures used by a [KeyPrompt] or [ActionPrompt].
+##
+## Textures used by a [KeyPrompt] or [ActionPrompt]. Stores a texture for each
+## keyboard scancode.
+
+## A mapping from keyboard strings (as returned by
+## [method OS.get_keycode_string]) to textures.
+var textures: Dictionary = {}
+
+
+func _init():
+       for k in KeyPrompt._KEYS:
+               textures[OS.get_keycode_string(k)] = null
+
+
+## Return the [Texture2D] associated with the specified [InputEvent], or null.
+func get_texture(event: InputEvent) -> Texture2D:
+       if not event is InputEventKey:
+               return null
+       var key_event := event as InputEventKey
+       var scancode := key_event.keycode
+       return textures[OS.get_keycode_string(scancode)]
+
+
+func _get(property):
+       if property in textures.keys():
+               return textures[property]
+       return null
+
+
+func _set(property, value):
+       if property in textures.keys():
+               textures[property] = value
+               return true
+       return false
+
+
+func _get_property_list():
+       var properties = []
+       for k in KeyPrompt._KEYS:
+               properties.append(
+                       {
+                               name = OS.get_keycode_string(k),
+                               type = TYPE_OBJECT,
+                               hint = PROPERTY_HINT_RESOURCE_TYPE,
+                               hint_string = "Texture2D"
+                       }
+               )
+       return properties
diff --git a/addons/input_prompts/resources/mouse_button_textures.gd b/addons/input_prompts/resources/mouse_button_textures.gd
new file mode 100644 (file)
index 0000000..90b584c
--- /dev/null
@@ -0,0 +1,45 @@
+# Copyright (C) 2022-2023 John Pennycook
+# SPDX-License-Identifier: MIT
+@tool
+class_name MouseButtonTextures
+extends Resource
+## Textures used by a [MouseButtonPrompt] or [ActionPrompt].
+##
+## Textures used by a [MouseButtonPrompt] or [ActionPrompt]. Stores a texture
+## for each mouse button index.
+
+## Texture for Left Mouse Button.
+@export var button_1: Texture2D = null
+
+## Texture for Right Mouse Button.
+@export var button_2: Texture2D = null
+
+## Texture for Middle Mouse Button.
+@export var button_3: Texture2D = null
+
+## Texture for Mouse Wheel Up.
+@export var button_4: Texture2D = null
+
+## Texture for Mouse Wheel Down.
+@export var button_5: Texture2D = null
+
+## Texture for Mouse Wheel Left.
+@export var button_6: Texture2D = null
+
+## Texture for Mouse Wheel Right.
+@export var button_7: Texture2D = null
+
+## Texture for Mouse Thumb Button 1.
+@export var button_8: Texture2D = null
+
+## Texture for Mouse Thumb Button 2.
+@export var button_9: Texture2D = null
+
+
+## Return the [Texture2D] associated with the specified [InputEvent], or null.
+func get_texture(event: InputEvent) -> Texture2D:
+       if not event is InputEventMouseButton:
+               return null
+       var mouse_event := event as InputEventMouseButton
+       var button := mouse_event.button_index
+       return get("button_" + str(button))
diff --git a/addons/kenney rpg audio/belt_handle_1.ogg b/addons/kenney rpg audio/belt_handle_1.ogg
new file mode 100644 (file)
index 0000000..041a19b
Binary files /dev/null and b/addons/kenney rpg audio/belt_handle_1.ogg differ
diff --git a/addons/kenney rpg audio/belt_handle_1.ogg.import b/addons/kenney rpg audio/belt_handle_1.ogg.import
new file mode 100644 (file)
index 0000000..106b920
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://qp6ft4es5fyh"
+path="res://.godot/imported/belt_handle_1.ogg-e78c5fa7a4189cd2faf5e7cf343f85fb.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/belt_handle_1.ogg"
+dest_files=["res://.godot/imported/belt_handle_1.ogg-e78c5fa7a4189cd2faf5e7cf343f85fb.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/belt_handle_2.ogg b/addons/kenney rpg audio/belt_handle_2.ogg
new file mode 100644 (file)
index 0000000..d0af0a5
Binary files /dev/null and b/addons/kenney rpg audio/belt_handle_2.ogg differ
diff --git a/addons/kenney rpg audio/belt_handle_2.ogg.import b/addons/kenney rpg audio/belt_handle_2.ogg.import
new file mode 100644 (file)
index 0000000..ef42f45
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://6msahxhqlh0q"
+path="res://.godot/imported/belt_handle_2.ogg-551c6be15a495c4a818e6117eed72984.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/belt_handle_2.ogg"
+dest_files=["res://.godot/imported/belt_handle_2.ogg-551c6be15a495c4a818e6117eed72984.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/book_close.ogg b/addons/kenney rpg audio/book_close.ogg
new file mode 100644 (file)
index 0000000..c520928
Binary files /dev/null and b/addons/kenney rpg audio/book_close.ogg differ
diff --git a/addons/kenney rpg audio/book_close.ogg.import b/addons/kenney rpg audio/book_close.ogg.import
new file mode 100644 (file)
index 0000000..708f0e6
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://m227v08s2lnt"
+path="res://.godot/imported/book_close.ogg-4f13b0859d2b172b014602745daffe13.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/book_close.ogg"
+dest_files=["res://.godot/imported/book_close.ogg-4f13b0859d2b172b014602745daffe13.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/book_flip_1.ogg b/addons/kenney rpg audio/book_flip_1.ogg
new file mode 100644 (file)
index 0000000..7c0e80b
Binary files /dev/null and b/addons/kenney rpg audio/book_flip_1.ogg differ
diff --git a/addons/kenney rpg audio/book_flip_1.ogg.import b/addons/kenney rpg audio/book_flip_1.ogg.import
new file mode 100644 (file)
index 0000000..6196a85
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://cymajnokflykl"
+path="res://.godot/imported/book_flip_1.ogg-9540d1f3b3adab826dbd8c1c185b94dd.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/book_flip_1.ogg"
+dest_files=["res://.godot/imported/book_flip_1.ogg-9540d1f3b3adab826dbd8c1c185b94dd.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/book_flip_2.ogg b/addons/kenney rpg audio/book_flip_2.ogg
new file mode 100644 (file)
index 0000000..f02b053
Binary files /dev/null and b/addons/kenney rpg audio/book_flip_2.ogg differ
diff --git a/addons/kenney rpg audio/book_flip_2.ogg.import b/addons/kenney rpg audio/book_flip_2.ogg.import
new file mode 100644 (file)
index 0000000..cd0aa7d
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://ccfk071s1clx8"
+path="res://.godot/imported/book_flip_2.ogg-75b368ae83816c52d64c511682203f85.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/book_flip_2.ogg"
+dest_files=["res://.godot/imported/book_flip_2.ogg-75b368ae83816c52d64c511682203f85.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/book_flip_3.ogg b/addons/kenney rpg audio/book_flip_3.ogg
new file mode 100644 (file)
index 0000000..f229a27
Binary files /dev/null and b/addons/kenney rpg audio/book_flip_3.ogg differ
diff --git a/addons/kenney rpg audio/book_flip_3.ogg.import b/addons/kenney rpg audio/book_flip_3.ogg.import
new file mode 100644 (file)
index 0000000..3633da5
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://cpq5s7w37j4ut"
+path="res://.godot/imported/book_flip_3.ogg-532fd938424079f962dab23837fa64e7.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/book_flip_3.ogg"
+dest_files=["res://.godot/imported/book_flip_3.ogg-532fd938424079f962dab23837fa64e7.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/book_open.ogg b/addons/kenney rpg audio/book_open.ogg
new file mode 100644 (file)
index 0000000..acdd272
Binary files /dev/null and b/addons/kenney rpg audio/book_open.ogg differ
diff --git a/addons/kenney rpg audio/book_open.ogg.import b/addons/kenney rpg audio/book_open.ogg.import
new file mode 100644 (file)
index 0000000..799b43c
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://dmqauukepqnc8"
+path="res://.godot/imported/book_open.ogg-0fe171a0dd6523476ead95a8b8798e0d.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/book_open.ogg"
+dest_files=["res://.godot/imported/book_open.ogg-0fe171a0dd6523476ead95a8b8798e0d.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/book_place_1.ogg b/addons/kenney rpg audio/book_place_1.ogg
new file mode 100644 (file)
index 0000000..49f10a3
Binary files /dev/null and b/addons/kenney rpg audio/book_place_1.ogg differ
diff --git a/addons/kenney rpg audio/book_place_1.ogg.import b/addons/kenney rpg audio/book_place_1.ogg.import
new file mode 100644 (file)
index 0000000..54ce4ac
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://ba75mp2hh583o"
+path="res://.godot/imported/book_place_1.ogg-70c6afe1248ea79031c215d8b85894fb.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/book_place_1.ogg"
+dest_files=["res://.godot/imported/book_place_1.ogg-70c6afe1248ea79031c215d8b85894fb.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/book_place_2.ogg b/addons/kenney rpg audio/book_place_2.ogg
new file mode 100644 (file)
index 0000000..6636f8a
Binary files /dev/null and b/addons/kenney rpg audio/book_place_2.ogg differ
diff --git a/addons/kenney rpg audio/book_place_2.ogg.import b/addons/kenney rpg audio/book_place_2.ogg.import
new file mode 100644 (file)
index 0000000..f925e96
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://cw0wi2vl2ye38"
+path="res://.godot/imported/book_place_2.ogg-47e4b83ab93d0e5f35574596fe7e8d02.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/book_place_2.ogg"
+dest_files=["res://.godot/imported/book_place_2.ogg-47e4b83ab93d0e5f35574596fe7e8d02.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/book_place_3.ogg b/addons/kenney rpg audio/book_place_3.ogg
new file mode 100644 (file)
index 0000000..6d569d5
Binary files /dev/null and b/addons/kenney rpg audio/book_place_3.ogg differ
diff --git a/addons/kenney rpg audio/book_place_3.ogg.import b/addons/kenney rpg audio/book_place_3.ogg.import
new file mode 100644 (file)
index 0000000..af65d14
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://dor8jlv2nipih"
+path="res://.godot/imported/book_place_3.ogg-bc058c13dfdd58c279a779769de51998.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/book_place_3.ogg"
+dest_files=["res://.godot/imported/book_place_3.ogg-bc058c13dfdd58c279a779769de51998.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/chop.ogg b/addons/kenney rpg audio/chop.ogg
new file mode 100644 (file)
index 0000000..a9d991f
Binary files /dev/null and b/addons/kenney rpg audio/chop.ogg differ
diff --git a/addons/kenney rpg audio/chop.ogg.import b/addons/kenney rpg audio/chop.ogg.import
new file mode 100644 (file)
index 0000000..8a4a661
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://dc3bvsbs6l2w"
+path="res://.godot/imported/chop.ogg-9ce454349a0ed78b82fa6390acd77949.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/chop.ogg"
+dest_files=["res://.godot/imported/chop.ogg-9ce454349a0ed78b82fa6390acd77949.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/cloth_1.ogg b/addons/kenney rpg audio/cloth_1.ogg
new file mode 100644 (file)
index 0000000..b76853a
Binary files /dev/null and b/addons/kenney rpg audio/cloth_1.ogg differ
diff --git a/addons/kenney rpg audio/cloth_1.ogg.import b/addons/kenney rpg audio/cloth_1.ogg.import
new file mode 100644 (file)
index 0000000..8023c0a
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://clxdk7lepns0k"
+path="res://.godot/imported/cloth_1.ogg-958670a481515b70e93cf4d2b1144fe0.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/cloth_1.ogg"
+dest_files=["res://.godot/imported/cloth_1.ogg-958670a481515b70e93cf4d2b1144fe0.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/cloth_2.ogg b/addons/kenney rpg audio/cloth_2.ogg
new file mode 100644 (file)
index 0000000..45e7839
Binary files /dev/null and b/addons/kenney rpg audio/cloth_2.ogg differ
diff --git a/addons/kenney rpg audio/cloth_2.ogg.import b/addons/kenney rpg audio/cloth_2.ogg.import
new file mode 100644 (file)
index 0000000..13e7408
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://bke7kwq415f7p"
+path="res://.godot/imported/cloth_2.ogg-d6ed8535c446419c6a911e891c9fe27b.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/cloth_2.ogg"
+dest_files=["res://.godot/imported/cloth_2.ogg-d6ed8535c446419c6a911e891c9fe27b.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/cloth_3.ogg b/addons/kenney rpg audio/cloth_3.ogg
new file mode 100644 (file)
index 0000000..f995ff2
Binary files /dev/null and b/addons/kenney rpg audio/cloth_3.ogg differ
diff --git a/addons/kenney rpg audio/cloth_3.ogg.import b/addons/kenney rpg audio/cloth_3.ogg.import
new file mode 100644 (file)
index 0000000..83d55cc
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://bpn2hxlnf1dh8"
+path="res://.godot/imported/cloth_3.ogg-088a920b35f6f055cf74cb56b1547f36.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/cloth_3.ogg"
+dest_files=["res://.godot/imported/cloth_3.ogg-088a920b35f6f055cf74cb56b1547f36.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/cloth_4.ogg b/addons/kenney rpg audio/cloth_4.ogg
new file mode 100644 (file)
index 0000000..a7ad4aa
Binary files /dev/null and b/addons/kenney rpg audio/cloth_4.ogg differ
diff --git a/addons/kenney rpg audio/cloth_4.ogg.import b/addons/kenney rpg audio/cloth_4.ogg.import
new file mode 100644 (file)
index 0000000..440a563
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://bffwk4cr71raj"
+path="res://.godot/imported/cloth_4.ogg-b425bb2139bdd2b0e640dc163984a9fa.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/cloth_4.ogg"
+dest_files=["res://.godot/imported/cloth_4.ogg-b425bb2139bdd2b0e640dc163984a9fa.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/cloth_belt.ogg b/addons/kenney rpg audio/cloth_belt.ogg
new file mode 100644 (file)
index 0000000..ea7d877
Binary files /dev/null and b/addons/kenney rpg audio/cloth_belt.ogg differ
diff --git a/addons/kenney rpg audio/cloth_belt.ogg.import b/addons/kenney rpg audio/cloth_belt.ogg.import
new file mode 100644 (file)
index 0000000..5598ec1
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://c0ibm6fvobnbx"
+path="res://.godot/imported/cloth_belt.ogg-1ab92bf471312d72eff4f0b13b2cffc3.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/cloth_belt.ogg"
+dest_files=["res://.godot/imported/cloth_belt.ogg-1ab92bf471312d72eff4f0b13b2cffc3.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/cloth_belt_2.ogg b/addons/kenney rpg audio/cloth_belt_2.ogg
new file mode 100644 (file)
index 0000000..9068fbd
Binary files /dev/null and b/addons/kenney rpg audio/cloth_belt_2.ogg differ
diff --git a/addons/kenney rpg audio/cloth_belt_2.ogg.import b/addons/kenney rpg audio/cloth_belt_2.ogg.import
new file mode 100644 (file)
index 0000000..6dcb6c6
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://435mf0fyy72v"
+path="res://.godot/imported/cloth_belt_2.ogg-891b82c0649517ff4b8be9bcdea32f56.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/cloth_belt_2.ogg"
+dest_files=["res://.godot/imported/cloth_belt_2.ogg-891b82c0649517ff4b8be9bcdea32f56.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/creak_1.ogg b/addons/kenney rpg audio/creak_1.ogg
new file mode 100644 (file)
index 0000000..4f6de6f
Binary files /dev/null and b/addons/kenney rpg audio/creak_1.ogg differ
diff --git a/addons/kenney rpg audio/creak_1.ogg.import b/addons/kenney rpg audio/creak_1.ogg.import
new file mode 100644 (file)
index 0000000..3cce348
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://b53g41ci6rgb7"
+path="res://.godot/imported/creak_1.ogg-2b50cfc4a0f5b25589cf2558c36ce787.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/creak_1.ogg"
+dest_files=["res://.godot/imported/creak_1.ogg-2b50cfc4a0f5b25589cf2558c36ce787.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/creak_2.ogg b/addons/kenney rpg audio/creak_2.ogg
new file mode 100644 (file)
index 0000000..bfa3045
Binary files /dev/null and b/addons/kenney rpg audio/creak_2.ogg differ
diff --git a/addons/kenney rpg audio/creak_2.ogg.import b/addons/kenney rpg audio/creak_2.ogg.import
new file mode 100644 (file)
index 0000000..319ad97
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://bf1mvuew0pphf"
+path="res://.godot/imported/creak_2.ogg-0f7f10523e7c03847788f12334be6c66.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/creak_2.ogg"
+dest_files=["res://.godot/imported/creak_2.ogg-0f7f10523e7c03847788f12334be6c66.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/creak_3.ogg b/addons/kenney rpg audio/creak_3.ogg
new file mode 100644 (file)
index 0000000..0673845
Binary files /dev/null and b/addons/kenney rpg audio/creak_3.ogg differ
diff --git a/addons/kenney rpg audio/creak_3.ogg.import b/addons/kenney rpg audio/creak_3.ogg.import
new file mode 100644 (file)
index 0000000..4b1109e
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://bwh1qnyoyqww2"
+path="res://.godot/imported/creak_3.ogg-61b9399984aae2273feb3ca2f8f7f7eb.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/creak_3.ogg"
+dest_files=["res://.godot/imported/creak_3.ogg-61b9399984aae2273feb3ca2f8f7f7eb.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/door_close_1.ogg b/addons/kenney rpg audio/door_close_1.ogg
new file mode 100644 (file)
index 0000000..21021c5
Binary files /dev/null and b/addons/kenney rpg audio/door_close_1.ogg differ
diff --git a/addons/kenney rpg audio/door_close_1.ogg.import b/addons/kenney rpg audio/door_close_1.ogg.import
new file mode 100644 (file)
index 0000000..6e86872
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://cgkq0gju0ba2v"
+path="res://.godot/imported/door_close_1.ogg-0ea730924410fec55ca9dd4bd10dac1a.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/door_close_1.ogg"
+dest_files=["res://.godot/imported/door_close_1.ogg-0ea730924410fec55ca9dd4bd10dac1a.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/door_close_2.ogg b/addons/kenney rpg audio/door_close_2.ogg
new file mode 100644 (file)
index 0000000..f64212b
Binary files /dev/null and b/addons/kenney rpg audio/door_close_2.ogg differ
diff --git a/addons/kenney rpg audio/door_close_2.ogg.import b/addons/kenney rpg audio/door_close_2.ogg.import
new file mode 100644 (file)
index 0000000..e2a37e9
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://dqocu2j7do643"
+path="res://.godot/imported/door_close_2.ogg-aa92c24cfb8df69a2d1ba7736aefa21d.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/door_close_2.ogg"
+dest_files=["res://.godot/imported/door_close_2.ogg-aa92c24cfb8df69a2d1ba7736aefa21d.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/door_close_3.ogg b/addons/kenney rpg audio/door_close_3.ogg
new file mode 100644 (file)
index 0000000..c08399c
Binary files /dev/null and b/addons/kenney rpg audio/door_close_3.ogg differ
diff --git a/addons/kenney rpg audio/door_close_3.ogg.import b/addons/kenney rpg audio/door_close_3.ogg.import
new file mode 100644 (file)
index 0000000..15bfed6
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://dptqavy06lvdf"
+path="res://.godot/imported/door_close_3.ogg-006728833ac1fd897ab36cc528ff1d94.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/door_close_3.ogg"
+dest_files=["res://.godot/imported/door_close_3.ogg-006728833ac1fd897ab36cc528ff1d94.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/door_close_4.ogg b/addons/kenney rpg audio/door_close_4.ogg
new file mode 100644 (file)
index 0000000..ef44236
Binary files /dev/null and b/addons/kenney rpg audio/door_close_4.ogg differ
diff --git a/addons/kenney rpg audio/door_close_4.ogg.import b/addons/kenney rpg audio/door_close_4.ogg.import
new file mode 100644 (file)
index 0000000..b178871
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://low8d4q606hn"
+path="res://.godot/imported/door_close_4.ogg-75f54334e7ea1b6195eef7411e93791d.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/door_close_4.ogg"
+dest_files=["res://.godot/imported/door_close_4.ogg-75f54334e7ea1b6195eef7411e93791d.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/door_open_1.ogg b/addons/kenney rpg audio/door_open_1.ogg
new file mode 100644 (file)
index 0000000..7df2826
Binary files /dev/null and b/addons/kenney rpg audio/door_open_1.ogg differ
diff --git a/addons/kenney rpg audio/door_open_1.ogg.import b/addons/kenney rpg audio/door_open_1.ogg.import
new file mode 100644 (file)
index 0000000..a6b4b46
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://di1jsy3sjv6nb"
+path="res://.godot/imported/door_open_1.ogg-a91fec61d9d9100464f55ea88df392dc.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/door_open_1.ogg"
+dest_files=["res://.godot/imported/door_open_1.ogg-a91fec61d9d9100464f55ea88df392dc.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/door_open_2.ogg b/addons/kenney rpg audio/door_open_2.ogg
new file mode 100644 (file)
index 0000000..d57087c
Binary files /dev/null and b/addons/kenney rpg audio/door_open_2.ogg differ
diff --git a/addons/kenney rpg audio/door_open_2.ogg.import b/addons/kenney rpg audio/door_open_2.ogg.import
new file mode 100644 (file)
index 0000000..dd90335
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://drj3a0ax5x1ne"
+path="res://.godot/imported/door_open_2.ogg-0fd043228d6435a9418ed6ea9de8475c.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/door_open_2.ogg"
+dest_files=["res://.godot/imported/door_open_2.ogg-0fd043228d6435a9418ed6ea9de8475c.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/draw_knife_1.ogg b/addons/kenney rpg audio/draw_knife_1.ogg
new file mode 100644 (file)
index 0000000..4141dbf
Binary files /dev/null and b/addons/kenney rpg audio/draw_knife_1.ogg differ
diff --git a/addons/kenney rpg audio/draw_knife_1.ogg.import b/addons/kenney rpg audio/draw_knife_1.ogg.import
new file mode 100644 (file)
index 0000000..ef84d32
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://dfsf35pn7j3g7"
+path="res://.godot/imported/draw_knife_1.ogg-6c85872096edbb4619c0622e070e2bd7.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/draw_knife_1.ogg"
+dest_files=["res://.godot/imported/draw_knife_1.ogg-6c85872096edbb4619c0622e070e2bd7.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/draw_knife_2.ogg b/addons/kenney rpg audio/draw_knife_2.ogg
new file mode 100644 (file)
index 0000000..012be85
Binary files /dev/null and b/addons/kenney rpg audio/draw_knife_2.ogg differ
diff --git a/addons/kenney rpg audio/draw_knife_2.ogg.import b/addons/kenney rpg audio/draw_knife_2.ogg.import
new file mode 100644 (file)
index 0000000..a4a4b46
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://puigtnecmp08"
+path="res://.godot/imported/draw_knife_2.ogg-e447d646b4055dcd7501afb47c1ec316.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/draw_knife_2.ogg"
+dest_files=["res://.godot/imported/draw_knife_2.ogg-e447d646b4055dcd7501afb47c1ec316.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/draw_knife_3.ogg b/addons/kenney rpg audio/draw_knife_3.ogg
new file mode 100644 (file)
index 0000000..49edc99
Binary files /dev/null and b/addons/kenney rpg audio/draw_knife_3.ogg differ
diff --git a/addons/kenney rpg audio/draw_knife_3.ogg.import b/addons/kenney rpg audio/draw_knife_3.ogg.import
new file mode 100644 (file)
index 0000000..d9a2bb5
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://dldrvet0ymla6"
+path="res://.godot/imported/draw_knife_3.ogg-8b64d4185910e24925bd567d264cbab0.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/draw_knife_3.ogg"
+dest_files=["res://.godot/imported/draw_knife_3.ogg-8b64d4185910e24925bd567d264cbab0.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/drop_leather.ogg b/addons/kenney rpg audio/drop_leather.ogg
new file mode 100644 (file)
index 0000000..83e3cf6
Binary files /dev/null and b/addons/kenney rpg audio/drop_leather.ogg differ
diff --git a/addons/kenney rpg audio/drop_leather.ogg.import b/addons/kenney rpg audio/drop_leather.ogg.import
new file mode 100644 (file)
index 0000000..217713d
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://bx71vn6n15nuf"
+path="res://.godot/imported/drop_leather.ogg-2623f04cc4e82074df32218875caccb9.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/drop_leather.ogg"
+dest_files=["res://.godot/imported/drop_leather.ogg-2623f04cc4e82074df32218875caccb9.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/footstep_0.ogg b/addons/kenney rpg audio/footstep_0.ogg
new file mode 100644 (file)
index 0000000..ca5dd2b
Binary files /dev/null and b/addons/kenney rpg audio/footstep_0.ogg differ
diff --git a/addons/kenney rpg audio/footstep_0.ogg.import b/addons/kenney rpg audio/footstep_0.ogg.import
new file mode 100644 (file)
index 0000000..a8ae053
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://dtex32y1g7ka2"
+path="res://.godot/imported/footstep_0.ogg-94f449e421e81164344968594e53bea0.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/footstep_0.ogg"
+dest_files=["res://.godot/imported/footstep_0.ogg-94f449e421e81164344968594e53bea0.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/footstep_1.ogg b/addons/kenney rpg audio/footstep_1.ogg
new file mode 100644 (file)
index 0000000..e784dbf
Binary files /dev/null and b/addons/kenney rpg audio/footstep_1.ogg differ
diff --git a/addons/kenney rpg audio/footstep_1.ogg.import b/addons/kenney rpg audio/footstep_1.ogg.import
new file mode 100644 (file)
index 0000000..ed98b54
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://bpro2oip82p2j"
+path="res://.godot/imported/footstep_1.ogg-69058393983cc1e15ad60affeeb0fd79.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/footstep_1.ogg"
+dest_files=["res://.godot/imported/footstep_1.ogg-69058393983cc1e15ad60affeeb0fd79.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/footstep_2.ogg b/addons/kenney rpg audio/footstep_2.ogg
new file mode 100644 (file)
index 0000000..fffa607
Binary files /dev/null and b/addons/kenney rpg audio/footstep_2.ogg differ
diff --git a/addons/kenney rpg audio/footstep_2.ogg.import b/addons/kenney rpg audio/footstep_2.ogg.import
new file mode 100644 (file)
index 0000000..c0f5509
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://wrw0gmn8heo2"
+path="res://.godot/imported/footstep_2.ogg-3d82fd219075658db653585f98da153a.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/footstep_2.ogg"
+dest_files=["res://.godot/imported/footstep_2.ogg-3d82fd219075658db653585f98da153a.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/footstep_3.ogg b/addons/kenney rpg audio/footstep_3.ogg
new file mode 100644 (file)
index 0000000..32ec626
Binary files /dev/null and b/addons/kenney rpg audio/footstep_3.ogg differ
diff --git a/addons/kenney rpg audio/footstep_3.ogg.import b/addons/kenney rpg audio/footstep_3.ogg.import
new file mode 100644 (file)
index 0000000..467700e
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://c1e6t37584evc"
+path="res://.godot/imported/footstep_3.ogg-ef0d7940687dde9c80034f6544d536fc.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/footstep_3.ogg"
+dest_files=["res://.godot/imported/footstep_3.ogg-ef0d7940687dde9c80034f6544d536fc.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/footstep_4.ogg b/addons/kenney rpg audio/footstep_4.ogg
new file mode 100644 (file)
index 0000000..da3d8ea
Binary files /dev/null and b/addons/kenney rpg audio/footstep_4.ogg differ
diff --git a/addons/kenney rpg audio/footstep_4.ogg.import b/addons/kenney rpg audio/footstep_4.ogg.import
new file mode 100644 (file)
index 0000000..9d779ad
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://qe1ef77opewd"
+path="res://.godot/imported/footstep_4.ogg-bdbf4ffe530c0dda55fb01595d069e1d.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/footstep_4.ogg"
+dest_files=["res://.godot/imported/footstep_4.ogg-bdbf4ffe530c0dda55fb01595d069e1d.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/footstep_5.ogg b/addons/kenney rpg audio/footstep_5.ogg
new file mode 100644 (file)
index 0000000..ddf5ac6
Binary files /dev/null and b/addons/kenney rpg audio/footstep_5.ogg differ
diff --git a/addons/kenney rpg audio/footstep_5.ogg.import b/addons/kenney rpg audio/footstep_5.ogg.import
new file mode 100644 (file)
index 0000000..0152bcb
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://c0jtq21iqgvu7"
+path="res://.godot/imported/footstep_5.ogg-89cd8ea09753ebdbb77c2b1e6f3b8da7.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/footstep_5.ogg"
+dest_files=["res://.godot/imported/footstep_5.ogg-89cd8ea09753ebdbb77c2b1e6f3b8da7.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/footstep_6.ogg b/addons/kenney rpg audio/footstep_6.ogg
new file mode 100644 (file)
index 0000000..d4419f4
Binary files /dev/null and b/addons/kenney rpg audio/footstep_6.ogg differ
diff --git a/addons/kenney rpg audio/footstep_6.ogg.import b/addons/kenney rpg audio/footstep_6.ogg.import
new file mode 100644 (file)
index 0000000..adee87f
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://xqtp2k8xclbi"
+path="res://.godot/imported/footstep_6.ogg-a0f3835a337358fcf7be7ad3868133cb.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/footstep_6.ogg"
+dest_files=["res://.godot/imported/footstep_6.ogg-a0f3835a337358fcf7be7ad3868133cb.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/footstep_7.ogg b/addons/kenney rpg audio/footstep_7.ogg
new file mode 100644 (file)
index 0000000..2b2175e
Binary files /dev/null and b/addons/kenney rpg audio/footstep_7.ogg differ
diff --git a/addons/kenney rpg audio/footstep_7.ogg.import b/addons/kenney rpg audio/footstep_7.ogg.import
new file mode 100644 (file)
index 0000000..5890ef4
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://d21r4w2buqrul"
+path="res://.godot/imported/footstep_7.ogg-2b006a2e83776565258a054d34045efa.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/footstep_7.ogg"
+dest_files=["res://.godot/imported/footstep_7.ogg-2b006a2e83776565258a054d34045efa.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/footstep_8.ogg b/addons/kenney rpg audio/footstep_8.ogg
new file mode 100644 (file)
index 0000000..2b71f97
Binary files /dev/null and b/addons/kenney rpg audio/footstep_8.ogg differ
diff --git a/addons/kenney rpg audio/footstep_8.ogg.import b/addons/kenney rpg audio/footstep_8.ogg.import
new file mode 100644 (file)
index 0000000..ec4d1c5
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://bj6qxojvmikjr"
+path="res://.godot/imported/footstep_8.ogg-1b63fc8bdc83da66930489cbf4148be2.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/footstep_8.ogg"
+dest_files=["res://.godot/imported/footstep_8.ogg-1b63fc8bdc83da66930489cbf4148be2.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/footstep_9.ogg b/addons/kenney rpg audio/footstep_9.ogg
new file mode 100644 (file)
index 0000000..52c39f5
Binary files /dev/null and b/addons/kenney rpg audio/footstep_9.ogg differ
diff --git a/addons/kenney rpg audio/footstep_9.ogg.import b/addons/kenney rpg audio/footstep_9.ogg.import
new file mode 100644 (file)
index 0000000..d94f2cc
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://cawy6vxf05qb6"
+path="res://.godot/imported/footstep_9.ogg-996209c5845fb550a7fd139c951da4ee.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/footstep_9.ogg"
+dest_files=["res://.godot/imported/footstep_9.ogg-996209c5845fb550a7fd139c951da4ee.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/handle_coins.ogg b/addons/kenney rpg audio/handle_coins.ogg
new file mode 100644 (file)
index 0000000..c84e27d
Binary files /dev/null and b/addons/kenney rpg audio/handle_coins.ogg differ
diff --git a/addons/kenney rpg audio/handle_coins.ogg.import b/addons/kenney rpg audio/handle_coins.ogg.import
new file mode 100644 (file)
index 0000000..431a1ee
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://4ap7xko3yb4v"
+path="res://.godot/imported/handle_coins.ogg-56f9d11ce99667243791da4af447f166.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/handle_coins.ogg"
+dest_files=["res://.godot/imported/handle_coins.ogg-56f9d11ce99667243791da4af447f166.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/handle_coins_2.ogg b/addons/kenney rpg audio/handle_coins_2.ogg
new file mode 100644 (file)
index 0000000..73d92c5
Binary files /dev/null and b/addons/kenney rpg audio/handle_coins_2.ogg differ
diff --git a/addons/kenney rpg audio/handle_coins_2.ogg.import b/addons/kenney rpg audio/handle_coins_2.ogg.import
new file mode 100644 (file)
index 0000000..3dbc001
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://dt13jsyxhyrd2"
+path="res://.godot/imported/handle_coins_2.ogg-1d4cfa3b683ea56d0c6ac89bf762a02b.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/handle_coins_2.ogg"
+dest_files=["res://.godot/imported/handle_coins_2.ogg-1d4cfa3b683ea56d0c6ac89bf762a02b.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/handle_small_leather.ogg b/addons/kenney rpg audio/handle_small_leather.ogg
new file mode 100644 (file)
index 0000000..d98f77b
Binary files /dev/null and b/addons/kenney rpg audio/handle_small_leather.ogg differ
diff --git a/addons/kenney rpg audio/handle_small_leather.ogg.import b/addons/kenney rpg audio/handle_small_leather.ogg.import
new file mode 100644 (file)
index 0000000..3ee4aea
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://bq3tx8bqhfw4t"
+path="res://.godot/imported/handle_small_leather.ogg-03f5b67a600fea0ec515e0363cb18b67.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/handle_small_leather.ogg"
+dest_files=["res://.godot/imported/handle_small_leather.ogg-03f5b67a600fea0ec515e0363cb18b67.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/handle_small_leather_2.ogg b/addons/kenney rpg audio/handle_small_leather_2.ogg
new file mode 100644 (file)
index 0000000..80aa470
Binary files /dev/null and b/addons/kenney rpg audio/handle_small_leather_2.ogg differ
diff --git a/addons/kenney rpg audio/handle_small_leather_2.ogg.import b/addons/kenney rpg audio/handle_small_leather_2.ogg.import
new file mode 100644 (file)
index 0000000..efb6517
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://cojfx6l434lgy"
+path="res://.godot/imported/handle_small_leather_2.ogg-db78916d9fe6f4504b2779a08e29fb1a.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/handle_small_leather_2.ogg"
+dest_files=["res://.godot/imported/handle_small_leather_2.ogg-db78916d9fe6f4504b2779a08e29fb1a.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/knife_slice.ogg b/addons/kenney rpg audio/knife_slice.ogg
new file mode 100644 (file)
index 0000000..8633843
Binary files /dev/null and b/addons/kenney rpg audio/knife_slice.ogg differ
diff --git a/addons/kenney rpg audio/knife_slice.ogg.import b/addons/kenney rpg audio/knife_slice.ogg.import
new file mode 100644 (file)
index 0000000..6ee6ca3
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://o5leffg76h5q"
+path="res://.godot/imported/knife_slice.ogg-7b847c82ed8672d61285b42d2f1cde4d.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/knife_slice.ogg"
+dest_files=["res://.godot/imported/knife_slice.ogg-7b847c82ed8672d61285b42d2f1cde4d.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/knife_slice_2.ogg b/addons/kenney rpg audio/knife_slice_2.ogg
new file mode 100644 (file)
index 0000000..cf6098e
Binary files /dev/null and b/addons/kenney rpg audio/knife_slice_2.ogg differ
diff --git a/addons/kenney rpg audio/knife_slice_2.ogg.import b/addons/kenney rpg audio/knife_slice_2.ogg.import
new file mode 100644 (file)
index 0000000..d2f39a4
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://chu8iqpohl5j6"
+path="res://.godot/imported/knife_slice_2.ogg-9edeae671dd68f624c1449c94dc8ba27.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/knife_slice_2.ogg"
+dest_files=["res://.godot/imported/knife_slice_2.ogg-9edeae671dd68f624c1449c94dc8ba27.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/metal_click.ogg b/addons/kenney rpg audio/metal_click.ogg
new file mode 100644 (file)
index 0000000..1a9ee4b
Binary files /dev/null and b/addons/kenney rpg audio/metal_click.ogg differ
diff --git a/addons/kenney rpg audio/metal_click.ogg.import b/addons/kenney rpg audio/metal_click.ogg.import
new file mode 100644 (file)
index 0000000..46472e7
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://bmngs1l1bfusb"
+path="res://.godot/imported/metal_click.ogg-9a7957f7d52a287644abc41a7eba8d50.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/metal_click.ogg"
+dest_files=["res://.godot/imported/metal_click.ogg-9a7957f7d52a287644abc41a7eba8d50.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/metal_latch.ogg b/addons/kenney rpg audio/metal_latch.ogg
new file mode 100644 (file)
index 0000000..509c68f
Binary files /dev/null and b/addons/kenney rpg audio/metal_latch.ogg differ
diff --git a/addons/kenney rpg audio/metal_latch.ogg.import b/addons/kenney rpg audio/metal_latch.ogg.import
new file mode 100644 (file)
index 0000000..444a3bb
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://btcow627y2udg"
+path="res://.godot/imported/metal_latch.ogg-a20391ffadacb63245bc95bab2497b39.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/metal_latch.ogg"
+dest_files=["res://.godot/imported/metal_latch.ogg-a20391ffadacb63245bc95bab2497b39.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/metal_pot_1.ogg b/addons/kenney rpg audio/metal_pot_1.ogg
new file mode 100644 (file)
index 0000000..1c5143d
Binary files /dev/null and b/addons/kenney rpg audio/metal_pot_1.ogg differ
diff --git a/addons/kenney rpg audio/metal_pot_1.ogg.import b/addons/kenney rpg audio/metal_pot_1.ogg.import
new file mode 100644 (file)
index 0000000..88149aa
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://by46ob6mjres1"
+path="res://.godot/imported/metal_pot_1.ogg-ff657284eeedcefc136822ed8dcb68bf.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/metal_pot_1.ogg"
+dest_files=["res://.godot/imported/metal_pot_1.ogg-ff657284eeedcefc136822ed8dcb68bf.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/metal_pot_2.ogg b/addons/kenney rpg audio/metal_pot_2.ogg
new file mode 100644 (file)
index 0000000..1be5078
Binary files /dev/null and b/addons/kenney rpg audio/metal_pot_2.ogg differ
diff --git a/addons/kenney rpg audio/metal_pot_2.ogg.import b/addons/kenney rpg audio/metal_pot_2.ogg.import
new file mode 100644 (file)
index 0000000..203afa4
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://bsi6y17gfqqdn"
+path="res://.godot/imported/metal_pot_2.ogg-ee290cbe5fc3d04f85c55629d1cebd71.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/metal_pot_2.ogg"
+dest_files=["res://.godot/imported/metal_pot_2.ogg-ee290cbe5fc3d04f85c55629d1cebd71.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney rpg audio/metal_pot_3.ogg b/addons/kenney rpg audio/metal_pot_3.ogg
new file mode 100644 (file)
index 0000000..e97002e
Binary files /dev/null and b/addons/kenney rpg audio/metal_pot_3.ogg differ
diff --git a/addons/kenney rpg audio/metal_pot_3.ogg.import b/addons/kenney rpg audio/metal_pot_3.ogg.import
new file mode 100644 (file)
index 0000000..2f28624
--- /dev/null
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://bj2d25j8e5skv"
+path="res://.godot/imported/metal_pot_3.ogg-622abc42e11d6bbec113b8a44380cc07.oggvorbisstr"
+
+[deps]
+
+source_file="res://addons/kenney rpg audio/metal_pot_3.ogg"
+dest_files=["res://.godot/imported/metal_pot_3.ogg-622abc42e11d6bbec113b8a44380cc07.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/addons/kenney_prototype_textures/LICENSE.txt b/addons/kenney_prototype_textures/LICENSE.txt
new file mode 100644 (file)
index 0000000..839f104
--- /dev/null
@@ -0,0 +1,23 @@
+
+
+       Prototype Textures 1.0
+
+       Created/distributed by Kenney (www.kenney.nl)
+       Creation date: 08-04-2020
+
+                       ------------------------------
+
+       License: (Creative Commons Zero, CC0)
+       http://creativecommons.org/publicdomain/zero/1.0/
+
+       This content is free to use in personal, educational and commercial projects.
+       Support us by crediting Kenney or www.kenney.nl (this is not mandatory)
+
+                       ------------------------------
+
+       Donate:   http://support.kenney.nl
+       Request:  http://request.kenney.nl
+       Patreon:  http://patreon.com/kenney/
+
+       Follow on Twitter for updates:
+       http://twitter.com/KenneyNL
diff --git a/addons/kenney_prototype_textures/dark/texture_01.png b/addons/kenney_prototype_textures/dark/texture_01.png
new file mode 100644 (file)
index 0000000..14a9811
Binary files /dev/null and b/addons/kenney_prototype_textures/dark/texture_01.png differ
diff --git a/addons/kenney_prototype_textures/dark/texture_01.png.import b/addons/kenney_prototype_textures/dark/texture_01.png.import
new file mode 100644 (file)
index 0000000..31ee7b8
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dggrurnpvwkr8"
+path.s3tc="res://.godot/imported/texture_01.png-60e3b3d3143b179c069dbcbff77ff160.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/dark/texture_01.png"
+dest_files=["res://.godot/imported/texture_01.png-60e3b3d3143b179c069dbcbff77ff160.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/kenney_prototype_textures/dark/texture_02.png b/addons/kenney_prototype_textures/dark/texture_02.png
new file mode 100644 (file)
index 0000000..d6a2a21
Binary files /dev/null and b/addons/kenney_prototype_textures/dark/texture_02.png differ
diff --git a/addons/kenney_prototype_textures/dark/texture_02.png.import b/addons/kenney_prototype_textures/dark/texture_02.png.import
new file mode 100644 (file)
index 0000000..9c6202a
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dmnb1gp44mvmk"
+path="res://.godot/imported/texture_02.png-814d4f515892bb8274d285748f4a73a0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/dark/texture_02.png"
+dest_files=["res://.godot/imported/texture_02.png-814d4f515892bb8274d285748f4a73a0.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/kenney_prototype_textures/dark/texture_03.png b/addons/kenney_prototype_textures/dark/texture_03.png
new file mode 100644 (file)
index 0000000..4aa482d
Binary files /dev/null and b/addons/kenney_prototype_textures/dark/texture_03.png differ
diff --git a/addons/kenney_prototype_textures/dark/texture_03.png.import b/addons/kenney_prototype_textures/dark/texture_03.png.import
new file mode 100644 (file)
index 0000000..60f37e4
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cu41dadoilgbm"
+path="res://.godot/imported/texture_03.png-eef45c22e5a84c5df22e7f80e41112c6.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/dark/texture_03.png"
+dest_files=["res://.godot/imported/texture_03.png-eef45c22e5a84c5df22e7f80e41112c6.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/kenney_prototype_textures/dark/texture_04.png b/addons/kenney_prototype_textures/dark/texture_04.png
new file mode 100644 (file)
index 0000000..1e0a8f9
Binary files /dev/null and b/addons/kenney_prototype_textures/dark/texture_04.png differ
diff --git a/addons/kenney_prototype_textures/dark/texture_04.png.import b/addons/kenney_prototype_textures/dark/texture_04.png.import
new file mode 100644 (file)
index 0000000..cd39bad
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cajwhllvslqit"
+path="res://.godot/imported/texture_04.png-af505c12b2a7903458bb29299e718506.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/dark/texture_04.png"
+dest_files=["res://.godot/imported/texture_04.png-af505c12b2a7903458bb29299e718506.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/kenney_prototype_textures/dark/texture_05.png b/addons/kenney_prototype_textures/dark/texture_05.png
new file mode 100644 (file)
index 0000000..cd01f8c
Binary files /dev/null and b/addons/kenney_prototype_textures/dark/texture_05.png differ
diff --git a/addons/kenney_prototype_textures/dark/texture_05.png.import b/addons/kenney_prototype_textures/dark/texture_05.png.import
new file mode 100644 (file)
index 0000000..d629df1
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cioy1m0dky1tc"
+path="res://.godot/imported/texture_05.png-ed8122ecdc41ff5aeccab84e8db1e4f0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/dark/texture_05.png"
+dest_files=["res://.godot/imported/texture_05.png-ed8122ecdc41ff5aeccab84e8db1e4f0.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/kenney_prototype_textures/dark/texture_06.png b/addons/kenney_prototype_textures/dark/texture_06.png
new file mode 100644 (file)
index 0000000..4e8f53c
Binary files /dev/null and b/addons/kenney_prototype_textures/dark/texture_06.png differ
diff --git a/addons/kenney_prototype_textures/dark/texture_06.png.import b/addons/kenney_prototype_textures/dark/texture_06.png.import
new file mode 100644 (file)
index 0000000..d283b91
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://baovbkt0j23nq"
+path="res://.godot/imported/texture_06.png-004ed3d5b88361cdfb83a20714e917e7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/dark/texture_06.png"
+dest_files=["res://.godot/imported/texture_06.png-004ed3d5b88361cdfb83a20714e917e7.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/kenney_prototype_textures/dark/texture_07.png b/addons/kenney_prototype_textures/dark/texture_07.png
new file mode 100644 (file)
index 0000000..d00973e
Binary files /dev/null and b/addons/kenney_prototype_textures/dark/texture_07.png differ
diff --git a/addons/kenney_prototype_textures/dark/texture_07.png.import b/addons/kenney_prototype_textures/dark/texture_07.png.import
new file mode 100644 (file)
index 0000000..fb37e53
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ygmjx27n82cc"
+path="res://.godot/imported/texture_07.png-7c77ff22e41b4a54319073cb71530d81.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/dark/texture_07.png"
+dest_files=["res://.godot/imported/texture_07.png-7c77ff22e41b4a54319073cb71530d81.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/kenney_prototype_textures/dark/texture_08.png b/addons/kenney_prototype_textures/dark/texture_08.png
new file mode 100644 (file)
index 0000000..72dd6c0
Binary files /dev/null and b/addons/kenney_prototype_textures/dark/texture_08.png differ
diff --git a/addons/kenney_prototype_textures/dark/texture_08.png.import b/addons/kenney_prototype_textures/dark/texture_08.png.import
new file mode 100644 (file)
index 0000000..5cf4d46
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d2jnd25nh7uvh"
+path="res://.godot/imported/texture_08.png-5883ddd047173c8b118ead887054e6fc.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/dark/texture_08.png"
+dest_files=["res://.godot/imported/texture_08.png-5883ddd047173c8b118ead887054e6fc.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/kenney_prototype_textures/dark/texture_09.png b/addons/kenney_prototype_textures/dark/texture_09.png
new file mode 100644 (file)
index 0000000..e81fa1a
Binary files /dev/null and b/addons/kenney_prototype_textures/dark/texture_09.png differ
diff --git a/addons/kenney_prototype_textures/dark/texture_09.png.import b/addons/kenney_prototype_textures/dark/texture_09.png.import
new file mode 100644 (file)
index 0000000..a0bb06d
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dr3juq6fnp87d"
+path="res://.godot/imported/texture_09.png-8e25cd5657e2d326068eb27bfa1aacec.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/dark/texture_09.png"
+dest_files=["res://.godot/imported/texture_09.png-8e25cd5657e2d326068eb27bfa1aacec.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/kenney_prototype_textures/dark/texture_10.png b/addons/kenney_prototype_textures/dark/texture_10.png
new file mode 100644 (file)
index 0000000..682088c
Binary files /dev/null and b/addons/kenney_prototype_textures/dark/texture_10.png differ
diff --git a/addons/kenney_prototype_textures/dark/texture_10.png.import b/addons/kenney_prototype_textures/dark/texture_10.png.import
new file mode 100644 (file)
index 0000000..118080b
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bpahw3g7rbtn6"
+path="res://.godot/imported/texture_10.png-1e788999a192eabd201c3b3435475799.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/dark/texture_10.png"
+dest_files=["res://.godot/imported/texture_10.png-1e788999a192eabd201c3b3435475799.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/kenney_prototype_textures/dark/texture_11.png b/addons/kenney_prototype_textures/dark/texture_11.png
new file mode 100644 (file)
index 0000000..f0571a1
Binary files /dev/null and b/addons/kenney_prototype_textures/dark/texture_11.png differ
diff --git a/addons/kenney_prototype_textures/dark/texture_11.png.import b/addons/kenney_prototype_textures/dark/texture_11.png.import
new file mode 100644 (file)
index 0000000..a980275
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://crx6c531xeap5"
+path="res://.godot/imported/texture_11.png-f61ad46caf1a41d85454e490ec43c8ec.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/dark/texture_11.png"
+dest_files=["res://.godot/imported/texture_11.png-f61ad46caf1a41d85454e490ec43c8ec.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/kenney_prototype_textures/dark/texture_12.png b/addons/kenney_prototype_textures/dark/texture_12.png
new file mode 100644 (file)
index 0000000..b797dbe
Binary files /dev/null and b/addons/kenney_prototype_textures/dark/texture_12.png differ
diff --git a/addons/kenney_prototype_textures/dark/texture_12.png.import b/addons/kenney_prototype_textures/dark/texture_12.png.import
new file mode 100644 (file)
index 0000000..d01082f
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d3npmu343ohvh"
+path="res://.godot/imported/texture_12.png-aa893b2c5354267551e55ec14bb1999b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/dark/texture_12.png"
+dest_files=["res://.godot/imported/texture_12.png-aa893b2c5354267551e55ec14bb1999b.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/kenney_prototype_textures/dark/texture_13.png b/addons/kenney_prototype_textures/dark/texture_13.png
new file mode 100644 (file)
index 0000000..6e8aff4
Binary files /dev/null and b/addons/kenney_prototype_textures/dark/texture_13.png differ
diff --git a/addons/kenney_prototype_textures/dark/texture_13.png.import b/addons/kenney_prototype_textures/dark/texture_13.png.import
new file mode 100644 (file)
index 0000000..6153e98
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cwwywhyiul1dh"
+path="res://.godot/imported/texture_13.png-51cb3f38ea774c85cb3ad561d20c5b53.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/dark/texture_13.png"
+dest_files=["res://.godot/imported/texture_13.png-51cb3f38ea774c85cb3ad561d20c5b53.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/kenney_prototype_textures/green/texture_01.png b/addons/kenney_prototype_textures/green/texture_01.png
new file mode 100644 (file)
index 0000000..7d53fe7
Binary files /dev/null and b/addons/kenney_prototype_textures/green/texture_01.png differ
diff --git a/addons/kenney_prototype_textures/green/texture_01.png.import b/addons/kenney_prototype_textures/green/texture_01.png.import
new file mode 100644 (file)
index 0000000..505d39b
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d2lh2trm3byf3"
+path.s3tc="res://.godot/imported/texture_01.png-94ebd82494c839e91a05b9e1cc2750ca.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/green/texture_01.png"
+dest_files=["res://.godot/imported/texture_01.png-94ebd82494c839e91a05b9e1cc2750ca.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/kenney_prototype_textures/green/texture_02.png b/addons/kenney_prototype_textures/green/texture_02.png
new file mode 100644 (file)
index 0000000..15ceaa8
Binary files /dev/null and b/addons/kenney_prototype_textures/green/texture_02.png differ
diff --git a/addons/kenney_prototype_textures/green/texture_02.png.import b/addons/kenney_prototype_textures/green/texture_02.png.import
new file mode 100644 (file)
index 0000000..18a3369
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dayjwqn3du2t2"
+path="res://.godot/imported/texture_02.png-aa1bb055b55bdc7c20e196b7286eebdf.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/green/texture_02.png"
+dest_files=["res://.godot/imported/texture_02.png-aa1bb055b55bdc7c20e196b7286eebdf.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/kenney_prototype_textures/green/texture_03.png b/addons/kenney_prototype_textures/green/texture_03.png
new file mode 100644 (file)
index 0000000..90eedc6
Binary files /dev/null and b/addons/kenney_prototype_textures/green/texture_03.png differ
diff --git a/addons/kenney_prototype_textures/green/texture_03.png.import b/addons/kenney_prototype_textures/green/texture_03.png.import
new file mode 100644 (file)
index 0000000..277e146
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bly4w04afly1w"
+path="res://.godot/imported/texture_03.png-3fec31a20982e9bd2e5e1aa731ea99cf.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/green/texture_03.png"
+dest_files=["res://.godot/imported/texture_03.png-3fec31a20982e9bd2e5e1aa731ea99cf.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/kenney_prototype_textures/green/texture_04.png b/addons/kenney_prototype_textures/green/texture_04.png
new file mode 100644 (file)
index 0000000..aed20f4
Binary files /dev/null and b/addons/kenney_prototype_textures/green/texture_04.png differ
diff --git a/addons/kenney_prototype_textures/green/texture_04.png.import b/addons/kenney_prototype_textures/green/texture_04.png.import
new file mode 100644 (file)
index 0000000..e086922
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c45ifbcicq0ei"
+path="res://.godot/imported/texture_04.png-4678cc1dfb831f775bdc30cfd7f78769.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/green/texture_04.png"
+dest_files=["res://.godot/imported/texture_04.png-4678cc1dfb831f775bdc30cfd7f78769.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/kenney_prototype_textures/green/texture_05.png b/addons/kenney_prototype_textures/green/texture_05.png
new file mode 100644 (file)
index 0000000..c89df69
Binary files /dev/null and b/addons/kenney_prototype_textures/green/texture_05.png differ
diff --git a/addons/kenney_prototype_textures/green/texture_05.png.import b/addons/kenney_prototype_textures/green/texture_05.png.import
new file mode 100644 (file)
index 0000000..76fb753
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cahb5lbraeqbh"
+path="res://.godot/imported/texture_05.png-8448519b39c1d98d64cf807b48969765.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/green/texture_05.png"
+dest_files=["res://.godot/imported/texture_05.png-8448519b39c1d98d64cf807b48969765.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/kenney_prototype_textures/green/texture_06.png b/addons/kenney_prototype_textures/green/texture_06.png
new file mode 100644 (file)
index 0000000..59e0df0
Binary files /dev/null and b/addons/kenney_prototype_textures/green/texture_06.png differ
diff --git a/addons/kenney_prototype_textures/green/texture_06.png.import b/addons/kenney_prototype_textures/green/texture_06.png.import
new file mode 100644 (file)
index 0000000..8c26764
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://sk7qwh1nu0mv"
+path="res://.godot/imported/texture_06.png-01c48f82ab8bc613ec4efc2c2c669b12.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/green/texture_06.png"
+dest_files=["res://.godot/imported/texture_06.png-01c48f82ab8bc613ec4efc2c2c669b12.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/kenney_prototype_textures/green/texture_07.png b/addons/kenney_prototype_textures/green/texture_07.png
new file mode 100644 (file)
index 0000000..7a4bdaf
Binary files /dev/null and b/addons/kenney_prototype_textures/green/texture_07.png differ
diff --git a/addons/kenney_prototype_textures/green/texture_07.png.import b/addons/kenney_prototype_textures/green/texture_07.png.import
new file mode 100644 (file)
index 0000000..453bf13
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bt70jivffa3t4"
+path="res://.godot/imported/texture_07.png-eec10b758cacbb71a02166a7f8cee6c0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/green/texture_07.png"
+dest_files=["res://.godot/imported/texture_07.png-eec10b758cacbb71a02166a7f8cee6c0.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/kenney_prototype_textures/green/texture_08.png b/addons/kenney_prototype_textures/green/texture_08.png
new file mode 100644 (file)
index 0000000..8e4f320
Binary files /dev/null and b/addons/kenney_prototype_textures/green/texture_08.png differ
diff --git a/addons/kenney_prototype_textures/green/texture_08.png.import b/addons/kenney_prototype_textures/green/texture_08.png.import
new file mode 100644 (file)
index 0000000..123b36b
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://s62fsa8khfex"
+path="res://.godot/imported/texture_08.png-d1888869b0d1d3a0ab2d517cbac7820a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/green/texture_08.png"
+dest_files=["res://.godot/imported/texture_08.png-d1888869b0d1d3a0ab2d517cbac7820a.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/kenney_prototype_textures/green/texture_09.png b/addons/kenney_prototype_textures/green/texture_09.png
new file mode 100644 (file)
index 0000000..0a7eddb
Binary files /dev/null and b/addons/kenney_prototype_textures/green/texture_09.png differ
diff --git a/addons/kenney_prototype_textures/green/texture_09.png.import b/addons/kenney_prototype_textures/green/texture_09.png.import
new file mode 100644 (file)
index 0000000..bf09a91
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ddidngubohg6p"
+path="res://.godot/imported/texture_09.png-a21adfe1a090b0dd8f0d376d9ee5f68e.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/green/texture_09.png"
+dest_files=["res://.godot/imported/texture_09.png-a21adfe1a090b0dd8f0d376d9ee5f68e.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/kenney_prototype_textures/green/texture_10.png b/addons/kenney_prototype_textures/green/texture_10.png
new file mode 100644 (file)
index 0000000..559a7c1
Binary files /dev/null and b/addons/kenney_prototype_textures/green/texture_10.png differ
diff --git a/addons/kenney_prototype_textures/green/texture_10.png.import b/addons/kenney_prototype_textures/green/texture_10.png.import
new file mode 100644 (file)
index 0000000..7bf5b1d
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://5p3typl5urmp"
+path="res://.godot/imported/texture_10.png-3f72abba172432380bd86a508e997833.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/green/texture_10.png"
+dest_files=["res://.godot/imported/texture_10.png-3f72abba172432380bd86a508e997833.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/kenney_prototype_textures/green/texture_11.png b/addons/kenney_prototype_textures/green/texture_11.png
new file mode 100644 (file)
index 0000000..119294d
Binary files /dev/null and b/addons/kenney_prototype_textures/green/texture_11.png differ
diff --git a/addons/kenney_prototype_textures/green/texture_11.png.import b/addons/kenney_prototype_textures/green/texture_11.png.import
new file mode 100644 (file)
index 0000000..caff3c2
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c88yt7bdrvi30"
+path="res://.godot/imported/texture_11.png-ad76ef70f9eb459fb1e8d9ba9cc092c4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/green/texture_11.png"
+dest_files=["res://.godot/imported/texture_11.png-ad76ef70f9eb459fb1e8d9ba9cc092c4.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/kenney_prototype_textures/green/texture_12.png b/addons/kenney_prototype_textures/green/texture_12.png
new file mode 100644 (file)
index 0000000..5991228
Binary files /dev/null and b/addons/kenney_prototype_textures/green/texture_12.png differ
diff --git a/addons/kenney_prototype_textures/green/texture_12.png.import b/addons/kenney_prototype_textures/green/texture_12.png.import
new file mode 100644 (file)
index 0000000..95a2df7
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cfh8fwbdp7euv"
+path="res://.godot/imported/texture_12.png-d4577347200436d9060aa21fce76cd93.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/green/texture_12.png"
+dest_files=["res://.godot/imported/texture_12.png-d4577347200436d9060aa21fce76cd93.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/kenney_prototype_textures/green/texture_13.png b/addons/kenney_prototype_textures/green/texture_13.png
new file mode 100644 (file)
index 0000000..9c57c6e
Binary files /dev/null and b/addons/kenney_prototype_textures/green/texture_13.png differ
diff --git a/addons/kenney_prototype_textures/green/texture_13.png.import b/addons/kenney_prototype_textures/green/texture_13.png.import
new file mode 100644 (file)
index 0000000..40b2fd8
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c3t6k4t5qsi4k"
+path="res://.godot/imported/texture_13.png-f5b9867fd39cd83793f3a92217d9eac6.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/green/texture_13.png"
+dest_files=["res://.godot/imported/texture_13.png-f5b9867fd39cd83793f3a92217d9eac6.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/kenney_prototype_textures/light/texture_01.png b/addons/kenney_prototype_textures/light/texture_01.png
new file mode 100644 (file)
index 0000000..9e93d3e
Binary files /dev/null and b/addons/kenney_prototype_textures/light/texture_01.png differ
diff --git a/addons/kenney_prototype_textures/light/texture_01.png.import b/addons/kenney_prototype_textures/light/texture_01.png.import
new file mode 100644 (file)
index 0000000..46571a7
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://co8yg2utkkebc"
+path.s3tc="res://.godot/imported/texture_01.png-e10423e44834e1b4a90c3134e446b32d.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/light/texture_01.png"
+dest_files=["res://.godot/imported/texture_01.png-e10423e44834e1b4a90c3134e446b32d.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/kenney_prototype_textures/light/texture_02.png b/addons/kenney_prototype_textures/light/texture_02.png
new file mode 100644 (file)
index 0000000..c52d0d2
Binary files /dev/null and b/addons/kenney_prototype_textures/light/texture_02.png differ
diff --git a/addons/kenney_prototype_textures/light/texture_02.png.import b/addons/kenney_prototype_textures/light/texture_02.png.import
new file mode 100644 (file)
index 0000000..6ca807b
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://eql5gw0oltd8"
+path="res://.godot/imported/texture_02.png-ffde4d38b35463525c3815b255790206.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/light/texture_02.png"
+dest_files=["res://.godot/imported/texture_02.png-ffde4d38b35463525c3815b255790206.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/kenney_prototype_textures/light/texture_03.png b/addons/kenney_prototype_textures/light/texture_03.png
new file mode 100644 (file)
index 0000000..5960eca
Binary files /dev/null and b/addons/kenney_prototype_textures/light/texture_03.png differ
diff --git a/addons/kenney_prototype_textures/light/texture_03.png.import b/addons/kenney_prototype_textures/light/texture_03.png.import
new file mode 100644 (file)
index 0000000..d9646ae
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://vk0sdbgdektc"
+path="res://.godot/imported/texture_03.png-6e55012c4e1c3f4d809747f3852d75ad.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/light/texture_03.png"
+dest_files=["res://.godot/imported/texture_03.png-6e55012c4e1c3f4d809747f3852d75ad.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/kenney_prototype_textures/light/texture_04.png b/addons/kenney_prototype_textures/light/texture_04.png
new file mode 100644 (file)
index 0000000..0b9a1d5
Binary files /dev/null and b/addons/kenney_prototype_textures/light/texture_04.png differ
diff --git a/addons/kenney_prototype_textures/light/texture_04.png.import b/addons/kenney_prototype_textures/light/texture_04.png.import
new file mode 100644 (file)
index 0000000..8606597
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://brnw57w5qf2c1"
+path="res://.godot/imported/texture_04.png-201edfe05d5c4f7f54049864048cfaf1.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/light/texture_04.png"
+dest_files=["res://.godot/imported/texture_04.png-201edfe05d5c4f7f54049864048cfaf1.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/kenney_prototype_textures/light/texture_05.png b/addons/kenney_prototype_textures/light/texture_05.png
new file mode 100644 (file)
index 0000000..88f2e5c
Binary files /dev/null and b/addons/kenney_prototype_textures/light/texture_05.png differ
diff --git a/addons/kenney_prototype_textures/light/texture_05.png.import b/addons/kenney_prototype_textures/light/texture_05.png.import
new file mode 100644 (file)
index 0000000..30fbd53
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://toijupeiwk77"
+path="res://.godot/imported/texture_05.png-07ce2eafef84a176bcf77bc59cb1f6ec.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/light/texture_05.png"
+dest_files=["res://.godot/imported/texture_05.png-07ce2eafef84a176bcf77bc59cb1f6ec.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/kenney_prototype_textures/light/texture_06.png b/addons/kenney_prototype_textures/light/texture_06.png
new file mode 100644 (file)
index 0000000..374a5d0
Binary files /dev/null and b/addons/kenney_prototype_textures/light/texture_06.png differ
diff --git a/addons/kenney_prototype_textures/light/texture_06.png.import b/addons/kenney_prototype_textures/light/texture_06.png.import
new file mode 100644 (file)
index 0000000..f29c527
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b7msw6cq6p7el"
+path="res://.godot/imported/texture_06.png-88331a9f246e47943dc01d0128a4ca4e.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/light/texture_06.png"
+dest_files=["res://.godot/imported/texture_06.png-88331a9f246e47943dc01d0128a4ca4e.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/kenney_prototype_textures/light/texture_07.png b/addons/kenney_prototype_textures/light/texture_07.png
new file mode 100644 (file)
index 0000000..34400e3
Binary files /dev/null and b/addons/kenney_prototype_textures/light/texture_07.png differ
diff --git a/addons/kenney_prototype_textures/light/texture_07.png.import b/addons/kenney_prototype_textures/light/texture_07.png.import
new file mode 100644 (file)
index 0000000..ee3d13d
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dcmojmvy5wdwg"
+path="res://.godot/imported/texture_07.png-ab5f4a6ad655d06104ea7939a06ec496.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/light/texture_07.png"
+dest_files=["res://.godot/imported/texture_07.png-ab5f4a6ad655d06104ea7939a06ec496.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/kenney_prototype_textures/light/texture_08.png b/addons/kenney_prototype_textures/light/texture_08.png
new file mode 100644 (file)
index 0000000..c5bbc74
Binary files /dev/null and b/addons/kenney_prototype_textures/light/texture_08.png differ
diff --git a/addons/kenney_prototype_textures/light/texture_08.png.import b/addons/kenney_prototype_textures/light/texture_08.png.import
new file mode 100644 (file)
index 0000000..1847ad1
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cf7r6b7okwmhc"
+path="res://.godot/imported/texture_08.png-7b5c5c16cd076d2bbc9eeb33a454861b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/light/texture_08.png"
+dest_files=["res://.godot/imported/texture_08.png-7b5c5c16cd076d2bbc9eeb33a454861b.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/kenney_prototype_textures/light/texture_09.png b/addons/kenney_prototype_textures/light/texture_09.png
new file mode 100644 (file)
index 0000000..435e19e
Binary files /dev/null and b/addons/kenney_prototype_textures/light/texture_09.png differ
diff --git a/addons/kenney_prototype_textures/light/texture_09.png.import b/addons/kenney_prototype_textures/light/texture_09.png.import
new file mode 100644 (file)
index 0000000..beabf01
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cx818r60m7wxb"
+path="res://.godot/imported/texture_09.png-53f655f3d7e1722128f99e8aff9071f9.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/light/texture_09.png"
+dest_files=["res://.godot/imported/texture_09.png-53f655f3d7e1722128f99e8aff9071f9.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/kenney_prototype_textures/light/texture_10.png b/addons/kenney_prototype_textures/light/texture_10.png
new file mode 100644 (file)
index 0000000..25ac8ae
Binary files /dev/null and b/addons/kenney_prototype_textures/light/texture_10.png differ
diff --git a/addons/kenney_prototype_textures/light/texture_10.png.import b/addons/kenney_prototype_textures/light/texture_10.png.import
new file mode 100644 (file)
index 0000000..2fd7881
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://crf5d2wu4rh3a"
+path="res://.godot/imported/texture_10.png-499479b9aaf089d55adf67874bc0ff66.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/light/texture_10.png"
+dest_files=["res://.godot/imported/texture_10.png-499479b9aaf089d55adf67874bc0ff66.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/kenney_prototype_textures/light/texture_11.png b/addons/kenney_prototype_textures/light/texture_11.png
new file mode 100644 (file)
index 0000000..7d4aebb
Binary files /dev/null and b/addons/kenney_prototype_textures/light/texture_11.png differ
diff --git a/addons/kenney_prototype_textures/light/texture_11.png.import b/addons/kenney_prototype_textures/light/texture_11.png.import
new file mode 100644 (file)
index 0000000..e9d566f
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://demfxeahygx02"
+path="res://.godot/imported/texture_11.png-4e4ade9ab136614b6cf0b0e879f1d510.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/light/texture_11.png"
+dest_files=["res://.godot/imported/texture_11.png-4e4ade9ab136614b6cf0b0e879f1d510.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/kenney_prototype_textures/light/texture_12.png b/addons/kenney_prototype_textures/light/texture_12.png
new file mode 100644 (file)
index 0000000..6bd3926
Binary files /dev/null and b/addons/kenney_prototype_textures/light/texture_12.png differ
diff --git a/addons/kenney_prototype_textures/light/texture_12.png.import b/addons/kenney_prototype_textures/light/texture_12.png.import
new file mode 100644 (file)
index 0000000..9747b05
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dcr3iio2u8kcj"
+path="res://.godot/imported/texture_12.png-8fe800bbb69d01cae0c0d84c062244bf.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/light/texture_12.png"
+dest_files=["res://.godot/imported/texture_12.png-8fe800bbb69d01cae0c0d84c062244bf.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/kenney_prototype_textures/light/texture_13.png b/addons/kenney_prototype_textures/light/texture_13.png
new file mode 100644 (file)
index 0000000..74515a7
Binary files /dev/null and b/addons/kenney_prototype_textures/light/texture_13.png differ
diff --git a/addons/kenney_prototype_textures/light/texture_13.png.import b/addons/kenney_prototype_textures/light/texture_13.png.import
new file mode 100644 (file)
index 0000000..0841024
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c53mesq00nks3"
+path="res://.godot/imported/texture_13.png-a43b6ac63b0fe1c4a3f66335474e59b6.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/light/texture_13.png"
+dest_files=["res://.godot/imported/texture_13.png-a43b6ac63b0fe1c4a3f66335474e59b6.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/kenney_prototype_textures/orange/texture_01.png b/addons/kenney_prototype_textures/orange/texture_01.png
new file mode 100644 (file)
index 0000000..3eda5cd
Binary files /dev/null and b/addons/kenney_prototype_textures/orange/texture_01.png differ
diff --git a/addons/kenney_prototype_textures/orange/texture_01.png.import b/addons/kenney_prototype_textures/orange/texture_01.png.import
new file mode 100644 (file)
index 0000000..08e0fee
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cf5bbls5mxns4"
+path.s3tc="res://.godot/imported/texture_01.png-2bf7db98e09b5b5073e8e8ca66419718.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/orange/texture_01.png"
+dest_files=["res://.godot/imported/texture_01.png-2bf7db98e09b5b5073e8e8ca66419718.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/kenney_prototype_textures/orange/texture_02.png b/addons/kenney_prototype_textures/orange/texture_02.png
new file mode 100644 (file)
index 0000000..1460f2b
Binary files /dev/null and b/addons/kenney_prototype_textures/orange/texture_02.png differ
diff --git a/addons/kenney_prototype_textures/orange/texture_02.png.import b/addons/kenney_prototype_textures/orange/texture_02.png.import
new file mode 100644 (file)
index 0000000..3bdf985
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ddbo75y4w3nrk"
+path="res://.godot/imported/texture_02.png-4eab4e19c2171e5b0668b65373b74c6d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/orange/texture_02.png"
+dest_files=["res://.godot/imported/texture_02.png-4eab4e19c2171e5b0668b65373b74c6d.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/kenney_prototype_textures/orange/texture_03.png b/addons/kenney_prototype_textures/orange/texture_03.png
new file mode 100644 (file)
index 0000000..09975cc
Binary files /dev/null and b/addons/kenney_prototype_textures/orange/texture_03.png differ
diff --git a/addons/kenney_prototype_textures/orange/texture_03.png.import b/addons/kenney_prototype_textures/orange/texture_03.png.import
new file mode 100644 (file)
index 0000000..b8731af
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://co64422qdmhir"
+path="res://.godot/imported/texture_03.png-129b8387293b325752961580c78873e2.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/orange/texture_03.png"
+dest_files=["res://.godot/imported/texture_03.png-129b8387293b325752961580c78873e2.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/kenney_prototype_textures/orange/texture_04.png b/addons/kenney_prototype_textures/orange/texture_04.png
new file mode 100644 (file)
index 0000000..8ac9527
Binary files /dev/null and b/addons/kenney_prototype_textures/orange/texture_04.png differ
diff --git a/addons/kenney_prototype_textures/orange/texture_04.png.import b/addons/kenney_prototype_textures/orange/texture_04.png.import
new file mode 100644 (file)
index 0000000..53ecc3b
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://yfch5t2c5rcp"
+path="res://.godot/imported/texture_04.png-e978f0e00463b6cfc60da06ec0abdb7a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/orange/texture_04.png"
+dest_files=["res://.godot/imported/texture_04.png-e978f0e00463b6cfc60da06ec0abdb7a.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/kenney_prototype_textures/orange/texture_05.png b/addons/kenney_prototype_textures/orange/texture_05.png
new file mode 100644 (file)
index 0000000..e7bb6d9
Binary files /dev/null and b/addons/kenney_prototype_textures/orange/texture_05.png differ
diff --git a/addons/kenney_prototype_textures/orange/texture_05.png.import b/addons/kenney_prototype_textures/orange/texture_05.png.import
new file mode 100644 (file)
index 0000000..14237f5
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dgfitxoqlprhk"
+path="res://.godot/imported/texture_05.png-57f4196ea276097368d03084372aa101.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/orange/texture_05.png"
+dest_files=["res://.godot/imported/texture_05.png-57f4196ea276097368d03084372aa101.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/kenney_prototype_textures/orange/texture_06.png b/addons/kenney_prototype_textures/orange/texture_06.png
new file mode 100644 (file)
index 0000000..2a18cf7
Binary files /dev/null and b/addons/kenney_prototype_textures/orange/texture_06.png differ
diff --git a/addons/kenney_prototype_textures/orange/texture_06.png.import b/addons/kenney_prototype_textures/orange/texture_06.png.import
new file mode 100644 (file)
index 0000000..9e5f4ce
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bd6b2mxuyvjmp"
+path="res://.godot/imported/texture_06.png-96fbf63c84855b5763ca7a9239b4162f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/orange/texture_06.png"
+dest_files=["res://.godot/imported/texture_06.png-96fbf63c84855b5763ca7a9239b4162f.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/kenney_prototype_textures/orange/texture_07.png b/addons/kenney_prototype_textures/orange/texture_07.png
new file mode 100644 (file)
index 0000000..0d1f229
Binary files /dev/null and b/addons/kenney_prototype_textures/orange/texture_07.png differ
diff --git a/addons/kenney_prototype_textures/orange/texture_07.png.import b/addons/kenney_prototype_textures/orange/texture_07.png.import
new file mode 100644 (file)
index 0000000..9bb9246
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cipgleaj75xtq"
+path="res://.godot/imported/texture_07.png-3fa938673385861e205adbc05b5cb69f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/orange/texture_07.png"
+dest_files=["res://.godot/imported/texture_07.png-3fa938673385861e205adbc05b5cb69f.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/kenney_prototype_textures/orange/texture_08.png b/addons/kenney_prototype_textures/orange/texture_08.png
new file mode 100644 (file)
index 0000000..b53b56d
Binary files /dev/null and b/addons/kenney_prototype_textures/orange/texture_08.png differ
diff --git a/addons/kenney_prototype_textures/orange/texture_08.png.import b/addons/kenney_prototype_textures/orange/texture_08.png.import
new file mode 100644 (file)
index 0000000..eb15781
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b1ho6yl2rs7ri"
+path="res://.godot/imported/texture_08.png-9f039f47cba295ef5881d7b94c369b5d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/orange/texture_08.png"
+dest_files=["res://.godot/imported/texture_08.png-9f039f47cba295ef5881d7b94c369b5d.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/kenney_prototype_textures/orange/texture_09.png b/addons/kenney_prototype_textures/orange/texture_09.png
new file mode 100644 (file)
index 0000000..a7f8b0b
Binary files /dev/null and b/addons/kenney_prototype_textures/orange/texture_09.png differ
diff --git a/addons/kenney_prototype_textures/orange/texture_09.png.import b/addons/kenney_prototype_textures/orange/texture_09.png.import
new file mode 100644 (file)
index 0000000..d61cf37
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bj7wjmb6heyst"
+path="res://.godot/imported/texture_09.png-d3e0d0da868b68102c983480f9cde71d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/orange/texture_09.png"
+dest_files=["res://.godot/imported/texture_09.png-d3e0d0da868b68102c983480f9cde71d.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/kenney_prototype_textures/orange/texture_10.png b/addons/kenney_prototype_textures/orange/texture_10.png
new file mode 100644 (file)
index 0000000..979733a
Binary files /dev/null and b/addons/kenney_prototype_textures/orange/texture_10.png differ
diff --git a/addons/kenney_prototype_textures/orange/texture_10.png.import b/addons/kenney_prototype_textures/orange/texture_10.png.import
new file mode 100644 (file)
index 0000000..896ca52
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cqxowvq5k3y7d"
+path="res://.godot/imported/texture_10.png-6f0f09db66c0562f01b2d2954722e3af.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/orange/texture_10.png"
+dest_files=["res://.godot/imported/texture_10.png-6f0f09db66c0562f01b2d2954722e3af.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/kenney_prototype_textures/orange/texture_11.png b/addons/kenney_prototype_textures/orange/texture_11.png
new file mode 100644 (file)
index 0000000..d52081b
Binary files /dev/null and b/addons/kenney_prototype_textures/orange/texture_11.png differ
diff --git a/addons/kenney_prototype_textures/orange/texture_11.png.import b/addons/kenney_prototype_textures/orange/texture_11.png.import
new file mode 100644 (file)
index 0000000..012fa71
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://f6tyutj1s8ln"
+path="res://.godot/imported/texture_11.png-ebf2797e5f22648b239ddd9dce347372.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/orange/texture_11.png"
+dest_files=["res://.godot/imported/texture_11.png-ebf2797e5f22648b239ddd9dce347372.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/kenney_prototype_textures/orange/texture_12.png b/addons/kenney_prototype_textures/orange/texture_12.png
new file mode 100644 (file)
index 0000000..b7e5781
Binary files /dev/null and b/addons/kenney_prototype_textures/orange/texture_12.png differ
diff --git a/addons/kenney_prototype_textures/orange/texture_12.png.import b/addons/kenney_prototype_textures/orange/texture_12.png.import
new file mode 100644 (file)
index 0000000..e3d81b3
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dpyqdr0jo8v0n"
+path="res://.godot/imported/texture_12.png-079a27ce3f0ee0e1854090577bd0ba2a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/orange/texture_12.png"
+dest_files=["res://.godot/imported/texture_12.png-079a27ce3f0ee0e1854090577bd0ba2a.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/kenney_prototype_textures/orange/texture_13.png b/addons/kenney_prototype_textures/orange/texture_13.png
new file mode 100644 (file)
index 0000000..57dba8c
Binary files /dev/null and b/addons/kenney_prototype_textures/orange/texture_13.png differ
diff --git a/addons/kenney_prototype_textures/orange/texture_13.png.import b/addons/kenney_prototype_textures/orange/texture_13.png.import
new file mode 100644 (file)
index 0000000..e19380f
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dyjn4y6in7agu"
+path="res://.godot/imported/texture_13.png-a11a0cfe132bc07bf4c480fd4334a284.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/orange/texture_13.png"
+dest_files=["res://.godot/imported/texture_13.png-a11a0cfe132bc07bf4c480fd4334a284.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/kenney_prototype_textures/purple/texture_01.png b/addons/kenney_prototype_textures/purple/texture_01.png
new file mode 100644 (file)
index 0000000..7c56da6
Binary files /dev/null and b/addons/kenney_prototype_textures/purple/texture_01.png differ
diff --git a/addons/kenney_prototype_textures/purple/texture_01.png.import b/addons/kenney_prototype_textures/purple/texture_01.png.import
new file mode 100644 (file)
index 0000000..cc231ea
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bosq5s8lcucvl"
+path.s3tc="res://.godot/imported/texture_01.png-38f28acdb9a95ea2efd835531b47e519.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/purple/texture_01.png"
+dest_files=["res://.godot/imported/texture_01.png-38f28acdb9a95ea2efd835531b47e519.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/kenney_prototype_textures/purple/texture_02.png b/addons/kenney_prototype_textures/purple/texture_02.png
new file mode 100644 (file)
index 0000000..e6e092e
Binary files /dev/null and b/addons/kenney_prototype_textures/purple/texture_02.png differ
diff --git a/addons/kenney_prototype_textures/purple/texture_02.png.import b/addons/kenney_prototype_textures/purple/texture_02.png.import
new file mode 100644 (file)
index 0000000..f0e9a71
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dxkrir3q3h6h3"
+path="res://.godot/imported/texture_02.png-fcb52d424cd62d43221e4153fa3176f8.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/purple/texture_02.png"
+dest_files=["res://.godot/imported/texture_02.png-fcb52d424cd62d43221e4153fa3176f8.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/kenney_prototype_textures/purple/texture_03.png b/addons/kenney_prototype_textures/purple/texture_03.png
new file mode 100644 (file)
index 0000000..3874868
Binary files /dev/null and b/addons/kenney_prototype_textures/purple/texture_03.png differ
diff --git a/addons/kenney_prototype_textures/purple/texture_03.png.import b/addons/kenney_prototype_textures/purple/texture_03.png.import
new file mode 100644 (file)
index 0000000..d1b3219
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://duhv6kh5glvll"
+path="res://.godot/imported/texture_03.png-10a2d13d96fe9dba00c822080243f048.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/purple/texture_03.png"
+dest_files=["res://.godot/imported/texture_03.png-10a2d13d96fe9dba00c822080243f048.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/kenney_prototype_textures/purple/texture_04.png b/addons/kenney_prototype_textures/purple/texture_04.png
new file mode 100644 (file)
index 0000000..6177824
Binary files /dev/null and b/addons/kenney_prototype_textures/purple/texture_04.png differ
diff --git a/addons/kenney_prototype_textures/purple/texture_04.png.import b/addons/kenney_prototype_textures/purple/texture_04.png.import
new file mode 100644 (file)
index 0000000..79d41c9
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cyqjks88g3cm7"
+path="res://.godot/imported/texture_04.png-6783bd4aa338a51e03fa71a2a0ba6c73.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/purple/texture_04.png"
+dest_files=["res://.godot/imported/texture_04.png-6783bd4aa338a51e03fa71a2a0ba6c73.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/kenney_prototype_textures/purple/texture_05.png b/addons/kenney_prototype_textures/purple/texture_05.png
new file mode 100644 (file)
index 0000000..5b82830
Binary files /dev/null and b/addons/kenney_prototype_textures/purple/texture_05.png differ
diff --git a/addons/kenney_prototype_textures/purple/texture_05.png.import b/addons/kenney_prototype_textures/purple/texture_05.png.import
new file mode 100644 (file)
index 0000000..e268963
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dgwrlpdrqpyi6"
+path="res://.godot/imported/texture_05.png-888b467a21712cbc594106138f9173b8.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/purple/texture_05.png"
+dest_files=["res://.godot/imported/texture_05.png-888b467a21712cbc594106138f9173b8.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/kenney_prototype_textures/purple/texture_06.png b/addons/kenney_prototype_textures/purple/texture_06.png
new file mode 100644 (file)
index 0000000..befbe88
Binary files /dev/null and b/addons/kenney_prototype_textures/purple/texture_06.png differ
diff --git a/addons/kenney_prototype_textures/purple/texture_06.png.import b/addons/kenney_prototype_textures/purple/texture_06.png.import
new file mode 100644 (file)
index 0000000..b87ac1e
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bfy87ajqfb4go"
+path="res://.godot/imported/texture_06.png-352782bc60b4b3fe4a632b0a6af5553d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/purple/texture_06.png"
+dest_files=["res://.godot/imported/texture_06.png-352782bc60b4b3fe4a632b0a6af5553d.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/kenney_prototype_textures/purple/texture_07.png b/addons/kenney_prototype_textures/purple/texture_07.png
new file mode 100644 (file)
index 0000000..a0c9df1
Binary files /dev/null and b/addons/kenney_prototype_textures/purple/texture_07.png differ
diff --git a/addons/kenney_prototype_textures/purple/texture_07.png.import b/addons/kenney_prototype_textures/purple/texture_07.png.import
new file mode 100644 (file)
index 0000000..a82e057
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://rfmpt6ss5woo"
+path="res://.godot/imported/texture_07.png-042b529a59b56931d5b854290aa24a7f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/purple/texture_07.png"
+dest_files=["res://.godot/imported/texture_07.png-042b529a59b56931d5b854290aa24a7f.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/kenney_prototype_textures/purple/texture_08.png b/addons/kenney_prototype_textures/purple/texture_08.png
new file mode 100644 (file)
index 0000000..eb556d6
Binary files /dev/null and b/addons/kenney_prototype_textures/purple/texture_08.png differ
diff --git a/addons/kenney_prototype_textures/purple/texture_08.png.import b/addons/kenney_prototype_textures/purple/texture_08.png.import
new file mode 100644 (file)
index 0000000..728ea47
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dko1gi7mbtk7q"
+path="res://.godot/imported/texture_08.png-ae3e54cc23ad438ea83a8932fe526f9f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/purple/texture_08.png"
+dest_files=["res://.godot/imported/texture_08.png-ae3e54cc23ad438ea83a8932fe526f9f.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/kenney_prototype_textures/purple/texture_09.png b/addons/kenney_prototype_textures/purple/texture_09.png
new file mode 100644 (file)
index 0000000..c831a43
Binary files /dev/null and b/addons/kenney_prototype_textures/purple/texture_09.png differ
diff --git a/addons/kenney_prototype_textures/purple/texture_09.png.import b/addons/kenney_prototype_textures/purple/texture_09.png.import
new file mode 100644 (file)
index 0000000..076d5e4
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cx4eljfi1xbok"
+path="res://.godot/imported/texture_09.png-bfc57ad7b0bd0aecb6d4584eb0197660.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/purple/texture_09.png"
+dest_files=["res://.godot/imported/texture_09.png-bfc57ad7b0bd0aecb6d4584eb0197660.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/kenney_prototype_textures/purple/texture_10.png b/addons/kenney_prototype_textures/purple/texture_10.png
new file mode 100644 (file)
index 0000000..95be188
Binary files /dev/null and b/addons/kenney_prototype_textures/purple/texture_10.png differ
diff --git a/addons/kenney_prototype_textures/purple/texture_10.png.import b/addons/kenney_prototype_textures/purple/texture_10.png.import
new file mode 100644 (file)
index 0000000..c4ad6a4
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bdpetvmgbsta"
+path="res://.godot/imported/texture_10.png-6ebba9cac53386550299b9fc7ba436fd.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/purple/texture_10.png"
+dest_files=["res://.godot/imported/texture_10.png-6ebba9cac53386550299b9fc7ba436fd.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/kenney_prototype_textures/purple/texture_11.png b/addons/kenney_prototype_textures/purple/texture_11.png
new file mode 100644 (file)
index 0000000..b1c3704
Binary files /dev/null and b/addons/kenney_prototype_textures/purple/texture_11.png differ
diff --git a/addons/kenney_prototype_textures/purple/texture_11.png.import b/addons/kenney_prototype_textures/purple/texture_11.png.import
new file mode 100644 (file)
index 0000000..9e0025b
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bnidl0tnnfso8"
+path="res://.godot/imported/texture_11.png-0fd2ee750e7568773caf6d873885f437.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/purple/texture_11.png"
+dest_files=["res://.godot/imported/texture_11.png-0fd2ee750e7568773caf6d873885f437.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/kenney_prototype_textures/purple/texture_12.png b/addons/kenney_prototype_textures/purple/texture_12.png
new file mode 100644 (file)
index 0000000..0269e59
Binary files /dev/null and b/addons/kenney_prototype_textures/purple/texture_12.png differ
diff --git a/addons/kenney_prototype_textures/purple/texture_12.png.import b/addons/kenney_prototype_textures/purple/texture_12.png.import
new file mode 100644 (file)
index 0000000..c600ed9
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dlvf4epx8cv8b"
+path="res://.godot/imported/texture_12.png-8a7cfbfe5b83f5813249f6314841357c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/purple/texture_12.png"
+dest_files=["res://.godot/imported/texture_12.png-8a7cfbfe5b83f5813249f6314841357c.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/kenney_prototype_textures/purple/texture_13.png b/addons/kenney_prototype_textures/purple/texture_13.png
new file mode 100644 (file)
index 0000000..3b944cb
Binary files /dev/null and b/addons/kenney_prototype_textures/purple/texture_13.png differ
diff --git a/addons/kenney_prototype_textures/purple/texture_13.png.import b/addons/kenney_prototype_textures/purple/texture_13.png.import
new file mode 100644 (file)
index 0000000..063fbce
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ddrdey7gg5vfv"
+path="res://.godot/imported/texture_13.png-ae54826bbb20288cf5ae03de2f2de21d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/purple/texture_13.png"
+dest_files=["res://.godot/imported/texture_13.png-ae54826bbb20288cf5ae03de2f2de21d.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/kenney_prototype_textures/red/texture_01.png b/addons/kenney_prototype_textures/red/texture_01.png
new file mode 100644 (file)
index 0000000..1f9c506
Binary files /dev/null and b/addons/kenney_prototype_textures/red/texture_01.png differ
diff --git a/addons/kenney_prototype_textures/red/texture_01.png.import b/addons/kenney_prototype_textures/red/texture_01.png.import
new file mode 100644 (file)
index 0000000..a034107
--- /dev/null
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d0d3ij542x0sn"
+path.s3tc="res://.godot/imported/texture_01.png-44f9331a67ce6f062549bc436289d3c9.s3tc.ctex"
+metadata={
+"imported_formats": ["s3tc_bptc"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/red/texture_01.png"
+dest_files=["res://.godot/imported/texture_01.png-44f9331a67ce6f062549bc436289d3c9.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/kenney_prototype_textures/red/texture_02.png b/addons/kenney_prototype_textures/red/texture_02.png
new file mode 100644 (file)
index 0000000..12e67bc
Binary files /dev/null and b/addons/kenney_prototype_textures/red/texture_02.png differ
diff --git a/addons/kenney_prototype_textures/red/texture_02.png.import b/addons/kenney_prototype_textures/red/texture_02.png.import
new file mode 100644 (file)
index 0000000..ab2aabc
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bqxnctcedh7en"
+path="res://.godot/imported/texture_02.png-bb6eefc15212ba5b8098e9e672c21f12.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/red/texture_02.png"
+dest_files=["res://.godot/imported/texture_02.png-bb6eefc15212ba5b8098e9e672c21f12.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/kenney_prototype_textures/red/texture_03.png b/addons/kenney_prototype_textures/red/texture_03.png
new file mode 100644 (file)
index 0000000..11a9f85
Binary files /dev/null and b/addons/kenney_prototype_textures/red/texture_03.png differ
diff --git a/addons/kenney_prototype_textures/red/texture_03.png.import b/addons/kenney_prototype_textures/red/texture_03.png.import
new file mode 100644 (file)
index 0000000..b631fb0
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://chwhr816ab6au"
+path="res://.godot/imported/texture_03.png-dcaf463e914c7896b38a95f49416e75a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/red/texture_03.png"
+dest_files=["res://.godot/imported/texture_03.png-dcaf463e914c7896b38a95f49416e75a.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/kenney_prototype_textures/red/texture_04.png b/addons/kenney_prototype_textures/red/texture_04.png
new file mode 100644 (file)
index 0000000..0ebe2fb
Binary files /dev/null and b/addons/kenney_prototype_textures/red/texture_04.png differ
diff --git a/addons/kenney_prototype_textures/red/texture_04.png.import b/addons/kenney_prototype_textures/red/texture_04.png.import
new file mode 100644 (file)
index 0000000..4635ca0
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://clhqlulhc5q1t"
+path="res://.godot/imported/texture_04.png-1d63b32ccdbf1561b92a917dfb5f84ea.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/red/texture_04.png"
+dest_files=["res://.godot/imported/texture_04.png-1d63b32ccdbf1561b92a917dfb5f84ea.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/kenney_prototype_textures/red/texture_05.png b/addons/kenney_prototype_textures/red/texture_05.png
new file mode 100644 (file)
index 0000000..038af13
Binary files /dev/null and b/addons/kenney_prototype_textures/red/texture_05.png differ
diff --git a/addons/kenney_prototype_textures/red/texture_05.png.import b/addons/kenney_prototype_textures/red/texture_05.png.import
new file mode 100644 (file)
index 0000000..6448551
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://o4rvr2xmy8g3"
+path="res://.godot/imported/texture_05.png-a44b3d75bc02c9b33606b6fe46e8c886.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/red/texture_05.png"
+dest_files=["res://.godot/imported/texture_05.png-a44b3d75bc02c9b33606b6fe46e8c886.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/kenney_prototype_textures/red/texture_06.png b/addons/kenney_prototype_textures/red/texture_06.png
new file mode 100644 (file)
index 0000000..4239985
Binary files /dev/null and b/addons/kenney_prototype_textures/red/texture_06.png differ
diff --git a/addons/kenney_prototype_textures/red/texture_06.png.import b/addons/kenney_prototype_textures/red/texture_06.png.import
new file mode 100644 (file)
index 0000000..4a0a3db
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c3cflnulomytq"
+path="res://.godot/imported/texture_06.png-566b521660a0c01cabf8778c12eb1f51.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/red/texture_06.png"
+dest_files=["res://.godot/imported/texture_06.png-566b521660a0c01cabf8778c12eb1f51.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/kenney_prototype_textures/red/texture_07.png b/addons/kenney_prototype_textures/red/texture_07.png
new file mode 100644 (file)
index 0000000..99dcffd
Binary files /dev/null and b/addons/kenney_prototype_textures/red/texture_07.png differ
diff --git a/addons/kenney_prototype_textures/red/texture_07.png.import b/addons/kenney_prototype_textures/red/texture_07.png.import
new file mode 100644 (file)
index 0000000..3b8ecae
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ivnhvj2aiqs2"
+path="res://.godot/imported/texture_07.png-ba1d32ad61ab49ac0edaf4930e4d081f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/red/texture_07.png"
+dest_files=["res://.godot/imported/texture_07.png-ba1d32ad61ab49ac0edaf4930e4d081f.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/kenney_prototype_textures/red/texture_08.png b/addons/kenney_prototype_textures/red/texture_08.png
new file mode 100644 (file)
index 0000000..45ebb31
Binary files /dev/null and b/addons/kenney_prototype_textures/red/texture_08.png differ
diff --git a/addons/kenney_prototype_textures/red/texture_08.png.import b/addons/kenney_prototype_textures/red/texture_08.png.import
new file mode 100644 (file)
index 0000000..67c85db
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bfcvha6b8qv5w"
+path="res://.godot/imported/texture_08.png-add0c08e78cde6ad4eaac64e7b9a9204.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/red/texture_08.png"
+dest_files=["res://.godot/imported/texture_08.png-add0c08e78cde6ad4eaac64e7b9a9204.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/kenney_prototype_textures/red/texture_09.png b/addons/kenney_prototype_textures/red/texture_09.png
new file mode 100644 (file)
index 0000000..347aad7
Binary files /dev/null and b/addons/kenney_prototype_textures/red/texture_09.png differ
diff --git a/addons/kenney_prototype_textures/red/texture_09.png.import b/addons/kenney_prototype_textures/red/texture_09.png.import
new file mode 100644 (file)
index 0000000..a95d36c
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dwu188ha0br16"
+path="res://.godot/imported/texture_09.png-4fe3f0e3bd94fb29789b41c9100c3ac9.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/red/texture_09.png"
+dest_files=["res://.godot/imported/texture_09.png-4fe3f0e3bd94fb29789b41c9100c3ac9.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/kenney_prototype_textures/red/texture_10.png b/addons/kenney_prototype_textures/red/texture_10.png
new file mode 100644 (file)
index 0000000..3448667
Binary files /dev/null and b/addons/kenney_prototype_textures/red/texture_10.png differ
diff --git a/addons/kenney_prototype_textures/red/texture_10.png.import b/addons/kenney_prototype_textures/red/texture_10.png.import
new file mode 100644 (file)
index 0000000..ed64c14
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dcvhuuvr0dumc"
+path="res://.godot/imported/texture_10.png-6fd251723c4fc19b26785b571c62b6ac.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/red/texture_10.png"
+dest_files=["res://.godot/imported/texture_10.png-6fd251723c4fc19b26785b571c62b6ac.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/kenney_prototype_textures/red/texture_11.png b/addons/kenney_prototype_textures/red/texture_11.png
new file mode 100644 (file)
index 0000000..3cfb7f6
Binary files /dev/null and b/addons/kenney_prototype_textures/red/texture_11.png differ
diff --git a/addons/kenney_prototype_textures/red/texture_11.png.import b/addons/kenney_prototype_textures/red/texture_11.png.import
new file mode 100644 (file)
index 0000000..1340b59
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b0t7froyl0nsr"
+path="res://.godot/imported/texture_11.png-44ab559d4c1ab996ce064426a9e01b38.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/red/texture_11.png"
+dest_files=["res://.godot/imported/texture_11.png-44ab559d4c1ab996ce064426a9e01b38.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/kenney_prototype_textures/red/texture_12.png b/addons/kenney_prototype_textures/red/texture_12.png
new file mode 100644 (file)
index 0000000..d247946
Binary files /dev/null and b/addons/kenney_prototype_textures/red/texture_12.png differ
diff --git a/addons/kenney_prototype_textures/red/texture_12.png.import b/addons/kenney_prototype_textures/red/texture_12.png.import
new file mode 100644 (file)
index 0000000..d8532d0
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b1nqofca3tifd"
+path="res://.godot/imported/texture_12.png-6af19821abb02cb29bb6ed24ee4670e0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/red/texture_12.png"
+dest_files=["res://.godot/imported/texture_12.png-6af19821abb02cb29bb6ed24ee4670e0.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/kenney_prototype_textures/red/texture_13.png b/addons/kenney_prototype_textures/red/texture_13.png
new file mode 100644 (file)
index 0000000..9154c3b
Binary files /dev/null and b/addons/kenney_prototype_textures/red/texture_13.png differ
diff --git a/addons/kenney_prototype_textures/red/texture_13.png.import b/addons/kenney_prototype_textures/red/texture_13.png.import
new file mode 100644 (file)
index 0000000..d125062
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bn3pqoux17bmm"
+path="res://.godot/imported/texture_13.png-891332ffbf32d9b94212aaf3a11a15a9.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/kenney_prototype_textures/red/texture_13.png"
+dest_files=["res://.godot/imported/texture_13.png-891332ffbf32d9b94212aaf3a11a15a9.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/quest_system/active_pool.gd b/addons/quest_system/active_pool.gd
new file mode 100644 (file)
index 0000000..22f7ece
--- /dev/null
@@ -0,0 +1,7 @@
+extends BaseQuestPool
+class_name ActiveQuestPool
+
+func update_objective(quest_id: int) -> void:
+       var quest: Quest = get_quest_from_id(quest_id)
+
+       quest.update()
diff --git a/addons/quest_system/available_pool.gd b/addons/quest_system/available_pool.gd
new file mode 100644 (file)
index 0000000..7313815
--- /dev/null
@@ -0,0 +1,2 @@
+extends BaseQuestPool
+class_name AvailableQuestPool
diff --git a/addons/quest_system/base_quest_pool.gd b/addons/quest_system/base_quest_pool.gd
new file mode 100644 (file)
index 0000000..d1d1b98
--- /dev/null
@@ -0,0 +1,32 @@
+extends Node
+class_name BaseQuestPool
+
+var quests: Array[Quest] = []
+
+
+func _init(pool_name: String) -> void:
+       self.set_name(pool_name)
+
+
+func add_quest(quest: Quest) -> Quest:
+       assert(quest != null)
+
+       quests.append(quest)
+
+       return quest
+
+func remove_quest(quest: Quest) -> Quest:
+       assert(quest != null)
+
+       quests.erase(quest)
+
+       return quest
+
+func get_quest_from_id(id: int) -> Quest:
+       for quest in quests:
+               if quest.id == id:
+                       return quest
+       return null
+
+func is_quest_inside(quest: Quest) -> bool:
+       return quest in quests
diff --git a/addons/quest_system/completed_pool.gd b/addons/quest_system/completed_pool.gd
new file mode 100644 (file)
index 0000000..3b05a6c
--- /dev/null
@@ -0,0 +1,2 @@
+extends BaseQuestPool
+class_name CompletedQuestPool
diff --git a/addons/quest_system/plugin.cfg b/addons/quest_system/plugin.cfg
new file mode 100644 (file)
index 0000000..cfc2569
--- /dev/null
@@ -0,0 +1,7 @@
+[plugin]
+
+name="Quest System"
+description="A simple and extendible quest system"
+author="ShomyKohai"
+version="1.0.0"
+script="plugin.gd"
diff --git a/addons/quest_system/plugin.gd b/addons/quest_system/plugin.gd
new file mode 100644 (file)
index 0000000..87f5624
--- /dev/null
@@ -0,0 +1,10 @@
+@tool
+extends EditorPlugin
+
+
+func _enter_tree() -> void:
+       add_autoload_singleton("QuestSystem", "quest_manager.gd")
+
+
+func _exit_tree() -> void:
+       remove_autoload_singleton("QuestSystem")
diff --git a/addons/quest_system/quest_manager.gd b/addons/quest_system/quest_manager.gd
new file mode 100644 (file)
index 0000000..172cc1e
--- /dev/null
@@ -0,0 +1,235 @@
+extends Node
+
+signal quest_accepted(quest: Quest) # Emitted when a quest gets moved to the ActivePool
+signal quest_completed(quest: Quest) # Emitted when a quest gets moved to the CompletedPool
+signal new_available_quest(quest: Quest) # Emitted when a quest gets added to the AvailablePool
+
+const AvailableQuestPool = preload("./available_pool.gd")
+const ActiveQuestPool = preload("./active_pool.gd")
+const CompletedQuestPool = preload("./completed_pool.gd")
+
+
+var available: AvailableQuestPool = AvailableQuestPool.new("Available")
+var active: ActiveQuestPool = ActiveQuestPool.new("Active")
+var completed: CompletedQuestPool = CompletedQuestPool.new("Completed")
+
+
+func _init() -> void:
+       add_child(available)
+       add_child(active)
+       add_child(completed)
+
+
+# Quest API
+
+
+func start_quest(quest: Quest) -> Quest:
+       assert(quest != null)
+
+       if quest in active.quests:
+               return quest
+       if quest in completed.quests: #Throw an error?
+               return quest
+
+       #Add the quest to the actives quests
+       available.remove_quest(quest)
+       active.add_quest(quest)
+       quest_accepted.emit(quest)
+
+       quest.start()
+
+       return quest
+
+
+func complete_quest(quest: Quest) -> Quest:
+       if not quest in active.quests:
+               return quest
+
+       if quest.objective_completed == false:
+               return quest
+
+       quest.complete()
+
+       active.remove_quest(quest)
+       completed.add_quest(quest)
+
+       quest_completed.emit(quest)
+
+       return quest
+
+
+func mark_quest_as_available(quest: Quest) -> void:
+       if quest in available.quests or quest in completed.quests or quest in active.quests: return
+
+       available.add_quest(quest)
+       new_available_quest.emit(quest)
+
+
+func get_available_quests() -> Array[Quest]:
+       return available.quests
+
+func get_active_quests() -> Array[Quest]:
+       return active.quests
+
+
+func is_quest_available(quest: Quest) -> bool:
+       if not (quest in active.quests or quest in completed.quests):
+               return true
+       return false
+
+func is_quest_active(quest: Quest) -> bool:
+       if quest in active.quests:
+               return true
+       return false
+
+func is_quest_completed(quest: Quest) -> bool:
+       if quest in completed.quests:
+               return true
+       return false
+
+
+func call_quest_method(quest_id: int, method: String, args: Array) -> void:
+       var quest: Quest = null
+
+       # Find the quest if present
+       for pools in get_children():
+               if pools.get_quest_from_id(quest_id) != null:
+                       quest = pools.get_quest_from_id(quest_id)
+                       break
+
+       # Make sure we've got the quest
+       if quest == null: return
+
+       if quest.has_method(method):
+               quest.callv(method, args)
+
+
+func set_quest_property(quest_id: int, property: String, value: Variant) -> void:
+       var quest: Quest = null
+
+       # Find the quest
+       for pools in get_children():
+               if pools.get_quest_from_id(quest_id) != null:
+                       quest = pools.get_quest_from_id(quest_id)
+
+       if quest == null: return
+
+       # Now check if the quest has the property
+
+       # First if the property is null -> we return
+       if property == null: return
+
+       var was_property_found: bool = false
+       # Then we check if the property is present
+       for p in quest.get_property_list():
+               if p.name == property:
+                       was_property_found = true
+                       break
+
+       # Return if the property was not found
+       if not was_property_found: return
+
+       # Finally we set the value
+       quest.set(property, value)
+
+# Manager API
+
+func add_new_pool(pool_path: String, pool_name: String) -> void:
+       var pool = load(pool_path)
+       if pool == null: return
+
+       var pool_instance = pool.new(pool_name)
+
+       # Make sure the pool does not exist yet
+       for pools in get_children():
+               if pool_instance.get_script() == pools.get_script():
+                       return
+
+       add_child(pool_instance)
+
+
+func move_quest_to_pool(quest: Quest, old_pool: String, new_pool: String) -> Quest:
+       if old_pool == new_pool: return
+
+       var old_pool_instance: BaseQuestPool = get_node_or_null(old_pool)
+       var new_pool_instance: BaseQuestPool = get_node_or_null(new_pool)
+
+       assert(old_pool_instance != null or new_pool_instance != null)
+
+       old_pool_instance.quests.erase(quest)
+       new_pool_instance.quests.append(quest)
+
+       return quest
+
+
+func reset_pool(pool_name: String) -> void:
+       if pool_name.is_empty():
+               for pool in get_children():
+                       pool.quests.clear()
+               return
+
+       var pool := get_node(pool_name)
+       pool.quests.clear()
+       return
+
+
+func quests_as_dict() -> Dictionary:
+       var quest_dict: Dictionary = {}
+
+       for pool in get_children():
+               var quest_ids: Array[int] = []
+               for quest in pool.quests:
+                       quest_ids.append(quest.id)
+               quest_dict[pool.name.to_lower()] = quest_ids
+
+       return quest_dict
+
+func dict_to_quests(dict: Dictionary, quests: Array[Quest]) -> void:
+       for pool in get_children():
+
+               # Make sure to iterate only for available pools
+               if !dict.has(pool.name.to_lower()): continue
+
+               # Match quest with their ids and insert them into the quest pool
+               var quest_with_id: Dictionary = {}
+               var pool_ids: Array[int]
+               pool_ids.append_array(dict[pool.name.to_lower()])
+               for quest in quests:
+                       if quest.id in pool_ids:
+                               pool.quests.append(quest)
+                               quests.erase(quest)
+
+
+func serialize_quests(pool: String) -> Dictionary:
+       var pool_node: BaseQuestPool = get_node_or_null(pool)
+
+       if pool_node == null: return {}
+
+       var quest_dictionary: Dictionary = {}
+       for quests in pool_node.quests:
+               var quest_data: Dictionary
+               for name in quests.get_script().get_script_property_list():
+
+                       # Filter only defined properties
+                       if name.usage & PROPERTY_USAGE_STORAGE or name.usage & PROPERTY_USAGE_SCRIPT_VARIABLE:
+                               quest_data[name["name"]] = quests.get(name["name"])
+
+               quest_data.erase("id")
+               quest_dictionary[quests.id] = quest_data
+
+       return quest_dictionary
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/quest_system/quest_resource.gd b/addons/quest_system/quest_resource.gd
new file mode 100644 (file)
index 0000000..8bd94b5
--- /dev/null
@@ -0,0 +1,22 @@
+extends Resource
+class_name Quest
+
+@export var id: int
+@export var quest_name: String
+@export_multiline var quest_description: String
+@export_multiline var quest_objective: String
+
+var objective_completed: bool = false:
+       set(value):
+               objective_completed = value
+       get:
+               return objective_completed
+
+func update() -> void:
+       objective_completed = true
+
+func start() -> void:
+       pass
+
+func complete() -> void:
+       pass
diff --git a/addons/scenes/demo_scene.tscn b/addons/scenes/demo_scene.tscn
new file mode 100644 (file)
index 0000000..c672ecd
--- /dev/null
@@ -0,0 +1,137 @@
+[gd_scene load_steps=19 format=3 uid="uid://caonije6a5trx"]
+
+[ext_resource type="Texture2D" uid="uid://bo7fd65wahjlk" path="res://addons/data/textures/grass.png" id="1_0qiut"]
+[ext_resource type="Script" path="res://addons/data/scripts/player/player_controller.gd" id="2_qbma8"]
+[ext_resource type="Texture2D" uid="uid://crdueq1vpyv0j" path="res://addons/data/sprites/test/test_back.png" id="3_284hu"]
+[ext_resource type="Texture2D" uid="uid://b863t2dgq2tbe" path="res://addons/data/sprites/test/test_back_left.png" id="4_ln8g2"]
+[ext_resource type="Texture2D" uid="uid://m4fsj1y7wgmy" path="res://addons/data/sprites/test/test_back_right.png" id="5_6w5lw"]
+[ext_resource type="Texture2D" uid="uid://crublt6q32xrv" path="res://addons/data/sprites/test/test_front.png" id="6_btcgi"]
+[ext_resource type="Texture2D" uid="uid://m0dd2k3ux761" path="res://addons/data/sprites/test/test_front_left.png" id="7_j2x7c"]
+[ext_resource type="Texture2D" uid="uid://cwqj1k8755dh5" path="res://addons/data/sprites/test/test_front_right.png" id="8_w2411"]
+[ext_resource type="Texture2D" uid="uid://coges86bsxipe" path="res://addons/data/sprites/test/test_left.png" id="9_cu72v"]
+[ext_resource type="Texture2D" uid="uid://bictaivfrh2w7" path="res://addons/data/sprites/test/test_right.png" id="10_7e8s2"]
+[ext_resource type="Script" path="res://addons/data/scripts/sprite_rotation/sprite_rotation.gd" id="11_5f6jj"]
+[ext_resource type="Script" path="res://addons/data/scripts/rotate_cube.gd" id="12_wen4l"]
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_7tiaw"]
+size = Vector3(60, 2, 60)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_y17yx"]
+albedo_texture = ExtResource("1_0qiut")
+uv1_scale = Vector3(25, 25, 1)
+
+[sub_resource type="BoxMesh" id="BoxMesh_vrjgm"]
+material = SubResource("StandardMaterial3D_y17yx")
+size = Vector3(60, 2, 60)
+
+[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_bnjwb"]
+
+[sub_resource type="SpriteFrames" id="SpriteFrames_82gk6"]
+animations = [{
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("3_284hu")
+}],
+"loop": true,
+"name": &"back",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("4_ln8g2")
+}],
+"loop": true,
+"name": &"back_left",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("5_6w5lw")
+}],
+"loop": true,
+"name": &"back_right",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("6_btcgi")
+}],
+"loop": true,
+"name": &"front",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("7_j2x7c")
+}],
+"loop": true,
+"name": &"front_left",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("8_w2411")
+}],
+"loop": true,
+"name": &"front_right",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("9_cu72v")
+}],
+"loop": true,
+"name": &"left",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("10_7e8s2")
+}],
+"loop": true,
+"name": &"right",
+"speed": 5.0
+}]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_t8syq"]
+albedo_color = Color(0, 0, 1, 1)
+
+[node name="Main" type="Node3D"]
+
+[node name="Ground" type="StaticBody3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0)
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Ground"]
+shape = SubResource("BoxShape3D_7tiaw")
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="Ground"]
+mesh = SubResource("BoxMesh_vrjgm")
+
+[node name="Player" type="CharacterBody3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 5)
+script = ExtResource("2_qbma8")
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Player"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
+shape = SubResource("CapsuleShape3D_bnjwb")
+
+[node name="Camera3D" type="Camera3D" parent="Player"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.6, 0)
+
+[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 7, 0)
+light_color = Color(0.294118, 0.294118, 0.294118, 1)
+shadow_enabled = true
+
+[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="."]
+transform = Transform3D(0.15, 0, 0, 0, 0.15, 0, 0, 0, 0.15, 0, 1, 0)
+sprite_frames = SubResource("SpriteFrames_82gk6")
+animation = &"back"
+script = ExtResource("11_5f6jj")
+
+[node name="RotationRange" type="Node3D" parent="."]
+script = ExtResource("12_wen4l")
+
+[node name="Lookpoint" type="CSGBox3D" parent="RotationRange"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 1, 10)
+material = SubResource("StandardMaterial3D_t8syq")
diff --git a/addons/script-ide/LICENSE b/addons/script-ide/LICENSE
new file mode 100644 (file)
index 0000000..ffc9cf2
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Marius Hanl
+
+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-ide/Popup.gd b/addons/script-ide/Popup.gd
new file mode 100644 (file)
index 0000000..400a3f3
--- /dev/null
@@ -0,0 +1,6 @@
+extends PopupPanel
+
+var input_listener: Callable
+
+func _input(event: InputEvent) -> void:
+       input_listener.call(event)
diff --git a/addons/script-ide/README.md b/addons/script-ide/README.md
new file mode 100644 (file)
index 0000000..f2f9707
--- /dev/null
@@ -0,0 +1,33 @@
+# Script IDE
+
+Transforms the Script UI into an IDE like UI. Tabs are used for navigating between scripts. The default Outline got an overhaul and now shows all members of the script (not just methods) with unique icons for faster navigation.
+
+Features:
+- Scripts are now shown as Tabs inside a TabContainer (No Script List)
+- The Outline is on the right side (can be changed to be on the left side again)
+- The Outline got an overhaul and shows more than just the methods of the script. It includes the following members with a unique icon:
+       - Classes (Red Square)
+       - Constants (Red Circle)
+       - Signals (Yellow)
+       - Export variables (Orange)
+       - (Static) Variables (Red)
+       - Engine callback functions (Blue)
+       - (Static) Functions (Green)
+- All the different members of the script can be hidden or made visible again. This allows fine control what should be visible (e.g. only signals, functions, ...)
+- There is also the possibility to hide private members, this is all members starting with a '_'
+- The Outline can be opened as Popup with a defined shortcut (more below). This allows to quickly search for a specific member and scroll to it
+- You can navigate through the Outline with the arrow keys and scroll to the selected item by pressing `ENTER`
+- The Outline can be toggled via `File -> Toggle Scripts Panel`. This will hide or show it
+- The plugin is written with performance in mind, everything is very fast and works without any lags or stuttering.
+
+All settings can be changed in the `Editor Settings` under `Plugin` -> `Script Ide`:
+- `Open Outline Popup` = Shortcut to control how the Outline Popup should be triggered (default=CTRL+O or META+O)
+- `Outline position right` = Flag to control whether the outline should be on the right or on the left side of the script editor (default=true)
+- `Hide private members` = Flag to control whether private members (methods/variables/constants starting with '_') should be hidden in the Outline or not (default=false)
+- All outline visibility settings
+
+![Example of the outline](https://github.com/godotengine/godot/assets/66004280/30d04924-ba53-415d-b796-92b2fc086ff9)
+
+![Example of the outline popup](https://github.com/godotengine/godot/assets/66004280/cad0e00e-dbb6-4d3d-980b-c36da6af2cb8)
+
+![Example of the editor settings](https://github.com/godotengine/godot/assets/66004280/103ba1bc-a6c7-4b48-8691-fa59ba2b833d)
diff --git a/addons/script-ide/icon/class.svg b/addons/script-ide/icon/class.svg
new file mode 100644 (file)
index 0000000..51cd478
--- /dev/null
@@ -0,0 +1 @@
+<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1" width="14" height="14" fill="#ff4949" stroke-width="2.6941"/></svg>
diff --git a/addons/script-ide/icon/class.svg.import b/addons/script-ide/icon/class.svg.import
new file mode 100644 (file)
index 0000000..811536d
--- /dev/null
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://csik7oxvt7tq3"
+path="res://.godot/imported/class.svg-e6f2816a1f06041fb421c2af52817a4a.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/script-ide/icon/class.svg"
+dest_files=["res://.godot/imported/class.svg-e6f2816a1f06041fb421c2af52817a4a.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=0.8
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/script-ide/icon/constant.svg b/addons/script-ide/icon/constant.svg
new file mode 100644 (file)
index 0000000..b81f2c0
--- /dev/null
@@ -0,0 +1 @@
+<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.866 0-7 3.134-7 7 0 3.866 3.134 7 7 7s7-3.134 7-7c0-3.866-3.134-7-7-7zm0 2c2.7614 0 5 2.2386 5 5 0 2.7614-2.2386 5-5 5-2.7614 0-5-2.2386-5-5 0-2.7614 2.2386-5 5-5z" fill="#ff4949"/></svg>
diff --git a/addons/script-ide/icon/constant.svg.import b/addons/script-ide/icon/constant.svg.import
new file mode 100644 (file)
index 0000000..60a64e5
--- /dev/null
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cawc456ja8vf5"
+path="res://.godot/imported/constant.svg-f6e857276565573c7540f3c32801842a.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/script-ide/icon/constant.svg"
+dest_files=["res://.godot/imported/constant.svg-f6e857276565573c7540f3c32801842a.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=0.8
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/script-ide/icon/export.svg b/addons/script-ide/icon/export.svg
new file mode 100644 (file)
index 0000000..866bd5d
--- /dev/null
@@ -0,0 +1 @@
+<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.866 0-7 3.134-7 7 0 3.866 3.134 7 7 7 3.866 0 7-3.134 7-7 0-3.866-3.134-7-7-7z" fill="#c67e43"/></svg>
diff --git a/addons/script-ide/icon/export.svg.import b/addons/script-ide/icon/export.svg.import
new file mode 100644 (file)
index 0000000..b0036dc
--- /dev/null
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bvu2gnj8fv2kw"
+path="res://.godot/imported/export.svg-d2d18132258a7a219ec1af1f0316c91c.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/script-ide/icon/export.svg"
+dest_files=["res://.godot/imported/export.svg-d2d18132258a7a219ec1af1f0316c91c.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=0.8
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/script-ide/icon/func.svg b/addons/script-ide/icon/func.svg
new file mode 100644 (file)
index 0000000..85161ba
--- /dev/null
@@ -0,0 +1 @@
+<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.866 0-7 3.134-7 7 0 3.866 3.134 7 7 7 3.866 0 7-3.134 7-7 0-3.866-3.134-7-7-7z" fill="#8fcc77"/></svg>
diff --git a/addons/script-ide/icon/func.svg.import b/addons/script-ide/icon/func.svg.import
new file mode 100644 (file)
index 0000000..233870a
--- /dev/null
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://rni04cl446ov"
+path="res://.godot/imported/func.svg-139842caa5b4b7e4839711b6c756d0f7.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/script-ide/icon/func.svg"
+dest_files=["res://.godot/imported/func.svg-139842caa5b4b7e4839711b6c756d0f7.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=0.8
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/script-ide/icon/func_get.svg b/addons/script-ide/icon/func_get.svg
new file mode 100644 (file)
index 0000000..e5ac92a
--- /dev/null
@@ -0,0 +1 @@
+<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 15c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm0.5-2a1 1 0 0 1-0.70703-0.29297l-4-4a1 1 0 0 1-0.25977-0.62695 1.0001 1.0001 0 0 1 0-0.16016 1 1 0 0 1 0.25977-0.62695l4-4a1 1 0 0 1 1.4141 0 1 1 0 0 1 0 1.4141l-2.293 2.293h4.5859a1 1 0 0 1 1 1 1 1 0 0 1-1 1h-4.5859l2.293 2.293a1 1 0 0 1 0 1.4141 1 1 0 0 1-0.70703 0.29297z" fill="#8fc77a"/></svg>
diff --git a/addons/script-ide/icon/func_get.svg.import b/addons/script-ide/icon/func_get.svg.import
new file mode 100644 (file)
index 0000000..59de1a0
--- /dev/null
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c2a3aowyhxj5x"
+path="res://.godot/imported/func_get.svg-093f0ce02889d1f102ff9cc3e7f72654.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/script-ide/icon/func_get.svg"
+dest_files=["res://.godot/imported/func_get.svg-093f0ce02889d1f102ff9cc3e7f72654.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=0.8
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/script-ide/icon/func_set.svg b/addons/script-ide/icon/func_set.svg
new file mode 100644 (file)
index 0000000..9ed3107
--- /dev/null
@@ -0,0 +1 @@
+<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.866 0-7 3.134-7 7 0 3.866 3.134 7 7 7s7-3.134 7-7c0-3.866-3.134-7-7-7zm-0.5 2a1 1 0 0 1 0.70703 0.29297l4 4a1 1 0 0 1 0.25977 0.62695 1.0001 1.0001 0 0 1 0 0.16016 1 1 0 0 1-0.25977 0.62695l-4 4a1 1 0 0 1-1.4141 0 1 1 0 0 1 0-1.4141l2.293-2.293h-4.5859a1 1 0 0 1-1-1 1 1 0 0 1 1-1h4.5859l-2.293-2.293a1 1 0 0 1 0-1.4141 1 1 0 0 1 0.70703-0.29297z" fill="#8fc77a"/></svg>
diff --git a/addons/script-ide/icon/func_set.svg.import b/addons/script-ide/icon/func_set.svg.import
new file mode 100644 (file)
index 0000000..cedc130
--- /dev/null
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bvjkrti6kj6o2"
+path="res://.godot/imported/func_set.svg-c31168d90866ff1707ad9834754bd2c9.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/script-ide/icon/func_set.svg"
+dest_files=["res://.godot/imported/func_set.svg-c31168d90866ff1707ad9834754bd2c9.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=0.8
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/script-ide/icon/keyword.svg b/addons/script-ide/icon/keyword.svg
new file mode 100644 (file)
index 0000000..2082823
--- /dev/null
@@ -0,0 +1 @@
+<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.866 0-7 3.134-7 7 0 3.866 3.134 7 7 7 3.866 0 7-3.134 7-7 0-3.866-3.134-7-7-7z" fill="#0094ff"/></svg>
diff --git a/addons/script-ide/icon/keyword.svg.import b/addons/script-ide/icon/keyword.svg.import
new file mode 100644 (file)
index 0000000..673e34a
--- /dev/null
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cupb0polhqrwj"
+path="res://.godot/imported/keyword.svg-15ea12cc9eda85ed385533fe57e3bba8.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/script-ide/icon/keyword.svg"
+dest_files=["res://.godot/imported/keyword.svg-15ea12cc9eda85ed385533fe57e3bba8.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=0.8
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/script-ide/icon/property.svg b/addons/script-ide/icon/property.svg
new file mode 100644 (file)
index 0000000..dc32112
--- /dev/null
@@ -0,0 +1 @@
+<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.866 0-7 3.134-7 7 0 3.866 3.134 7 7 7 3.866 0 7-3.134 7-7 0-3.866-3.134-7-7-7z" fill="#ff4949"/></svg>
diff --git a/addons/script-ide/icon/property.svg.import b/addons/script-ide/icon/property.svg.import
new file mode 100644 (file)
index 0000000..cdf7a95
--- /dev/null
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dbwlgnwv5e8kl"
+path="res://.godot/imported/property.svg-9e228499f30651faad74aa99e4499d7e.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/script-ide/icon/property.svg"
+dest_files=["res://.godot/imported/property.svg-9e228499f30651faad74aa99e4499d7e.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=0.8
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/script-ide/icon/signal.svg b/addons/script-ide/icon/signal.svg
new file mode 100644 (file)
index 0000000..1eb6d9f
--- /dev/null
@@ -0,0 +1 @@
+<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-3.866 0-7 3.134-7 7 0 3.866 3.134 7 7 7 3.866 0 7-3.134 7-7 0-3.866-3.134-7-7-7z" fill="#ffdb3a"/></svg>
diff --git a/addons/script-ide/icon/signal.svg.import b/addons/script-ide/icon/signal.svg.import
new file mode 100644 (file)
index 0000000..16dc07d
--- /dev/null
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bnccvnaloqnte"
+path="res://.godot/imported/signal.svg-97182e1498b520a1ff5b8b9017c3b480.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/script-ide/icon/signal.svg"
+dest_files=["res://.godot/imported/signal.svg-97182e1498b520a1ff5b8b9017c3b480.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=0.8
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/script-ide/plugin.cfg b/addons/script-ide/plugin.cfg
new file mode 100644 (file)
index 0000000..d1e0fc3
--- /dev/null
@@ -0,0 +1,7 @@
+[plugin]
+
+name="Script-IDE"
+description="Transforms the Script UI into an IDE like UI. Tabs are used for navigating between scripts. The default Outline got an overhaul and now shows all members of the script (not just methods) with unique icons for faster navigation."
+author="Marius Hanl"
+version="1.2.1"
+script="plugin.gd"
diff --git a/addons/script-ide/plugin.gd b/addons/script-ide/plugin.gd
new file mode 100644 (file)
index 0000000..5b9f9f2
--- /dev/null
@@ -0,0 +1,860 @@
+@tool
+extends EditorPlugin
+
+## Editor setting path
+const SCRIPT_IDE: StringName = &"plugin/script_ide/"
+## Editor setting for the outline position
+const OUTLINE_POSITION_RIGHT: StringName = SCRIPT_IDE + &"outline_position_right"
+## Editor setting to control whether private members (annotated with '_' should be hidden or not)
+const HIDE_PRIVATE_MEMBERS: StringName = SCRIPT_IDE + &"hide_private_members"
+## Editor setting for the 'Open Outline Popup' shortcut
+const OPEN_OUTLINE_POPUP: StringName = SCRIPT_IDE + &"open_outline_popup"
+
+#region Outline icons
+const keyword_icon: Texture2D = preload("res://addons/script-ide/icon/keyword.svg")
+const func_icon: Texture2D = preload("res://addons/script-ide/icon/func.svg")
+const func_get_icon: Texture2D = preload("res://addons/script-ide/icon/func_get.svg")
+const func_set_icon: Texture2D = preload("res://addons/script-ide/icon/func_set.svg")
+const property_icon: Texture2D = preload("res://addons/script-ide/icon/property.svg")
+const export_icon: Texture2D = preload("res://addons/script-ide/icon/export.svg")
+const signal_icon: Texture2D = preload("res://addons/script-ide/icon/signal.svg")
+const constant_icon: Texture2D = preload("res://addons/script-ide/icon/constant.svg")
+const class_icon: Texture2D = preload("res://addons/script-ide/icon/class.svg")
+#endregion
+
+const POPUP_SCRIPT: GDScript = preload("res://addons/script-ide/Popup.gd")
+
+#region Editor settings
+var is_outline_right: bool = true
+var hide_private_members: bool = false
+var open_outline_popup: Shortcut
+#endregion
+
+var suppress_settings_sync: bool = false
+
+#region Existing controls we modify
+var outline_container: Node
+var outline_parent: Node
+var scripts_tab_container: TabContainer
+var scripts_tab_bar: TabBar
+var scripts_item_list: ItemList
+var split_container: HSplitContainer
+var old_outline: ItemList
+var filter_txt: LineEdit
+var sort_btn: Button
+#endregion
+
+#region Own controls we add
+var outline: ItemList
+var outline_popup: PopupPanel
+var filter_box: HBoxContainer
+
+var class_btn: Button
+var constant_btn: Button
+var signal_btn: Button
+var property_btn: Button
+var export_btn: Button
+var func_btn: Button
+var engine_func_btn: Button
+#endregion
+
+var keywords: Dictionary = {} # Basically used as Set, since Godot has none. [String, int = 0]
+var outline_cache: OutlineCache
+var tab_state: TabStateCache
+
+var old_script_editor_base: ScriptEditorBase
+var old_script_type: StringName
+
+var selected_tab: int = -1
+var last_tab_hovered: int = -1
+var sync_script_list: bool
+
+#region Enter / Exit -> Plugin setup
+## Change the Godot script UI and transform into an IDE like UI
+func _enter_tree() -> void:
+       is_outline_right = get_setting(OUTLINE_POSITION_RIGHT, is_outline_right)
+       hide_private_members = get_setting(HIDE_PRIVATE_MEMBERS, hide_private_members)
+       
+       var editor_settings: EditorSettings = get_editor_settings()
+       if (!editor_settings.has_setting(OPEN_OUTLINE_POPUP)):
+               var shortcut: Shortcut = Shortcut.new()
+               var event: InputEventKey = InputEventKey.new()
+               event.device = -1
+               event.ctrl_pressed = true
+               event.keycode = KEY_O
+               
+               var event2: InputEventKey = InputEventKey.new()
+               event2.device = -1
+               event2.meta_pressed = true
+               event2.keycode = KEY_O
+               
+               shortcut.events = [ event, event2 ]
+               editor_settings.set_setting(OPEN_OUTLINE_POPUP, shortcut)
+               editor_settings.set_initial_value(OPEN_OUTLINE_POPUP, shortcut, false)
+       
+       open_outline_popup = editor_settings.get_setting(OPEN_OUTLINE_POPUP)
+       
+       # Update on filesystem changed (e.g. save operation).
+       var file_system: EditorFileSystem = get_editor_interface().get_resource_filesystem()
+       file_system.filesystem_changed.connect(schedule_update)
+       
+       # Make tab container visible
+       var script_editor: ScriptEditor = get_editor_interface().get_script_editor()
+       scripts_tab_container = find_or_null(script_editor.find_children("*", "TabContainer", true, false))
+       if (scripts_tab_container != null):
+               scripts_tab_bar = get_tab_bar_of(scripts_tab_container)
+               
+               tab_state = TabStateCache.new()
+               tab_state.save(scripts_tab_container, scripts_tab_bar)
+               
+               scripts_tab_container.tabs_visible = true
+               scripts_tab_container.drag_to_rearrange_enabled = true
+
+               if (scripts_tab_bar != null):
+                       scripts_tab_bar.tab_close_display_policy = TabBar.CLOSE_BUTTON_SHOW_ACTIVE_ONLY
+                       scripts_tab_bar.drag_to_rearrange_enabled = true
+                       scripts_tab_bar.select_with_rmb = 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_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_tab_bar_gui_input)
+                       
+                       scripts_tab_bar.tab_changed.connect(on_tab_changed)
+                       
+       # Make script item list invisible
+       scripts_item_list = find_or_null(script_editor.find_children("*", "ItemList", true, false))
+       if (scripts_item_list != null):
+               scripts_item_list.get_parent().visible = false
+       
+       # Remove existing outline and add own outline
+       split_container = find_or_null(script_editor.find_children("*", "HSplitContainer", true, false))
+       if (split_container != null):
+               outline_container = split_container.get_child(0)
+               
+               if (is_outline_right):
+                       update_outline_position()
+               
+               old_outline = find_or_null(outline_container.find_children("*", "ItemList", true, false), 1)
+               outline_parent = old_outline.get_parent()
+               outline_parent.remove_child(old_outline)
+               
+               outline = ItemList.new()
+               outline.allow_reselect = true
+               outline.size_flags_vertical = Control.SIZE_EXPAND_FILL
+               outline_parent.add_child(outline)
+               
+               outline.item_selected.connect(scroll_to_index)
+               
+               # Add a filter box for all kind of members
+               filter_box = HBoxContainer.new()
+               
+               engine_func_btn = create_filter_btn(keyword_icon, "Engine callbacks")
+               filter_box.add_child(engine_func_btn)
+               
+               func_btn = create_filter_btn(func_icon, "Functions")
+               filter_box.add_child(func_btn)
+               
+               signal_btn = create_filter_btn(signal_icon, "Signals")
+               filter_box.add_child(signal_btn)
+               
+               export_btn = create_filter_btn(export_icon, "Exported properties")
+               filter_box.add_child(export_btn)
+       
+               property_btn = create_filter_btn(property_icon, "Properties")
+               filter_box.add_child(property_btn)
+               
+               class_btn = create_filter_btn(class_icon, "Classes")
+               filter_box.add_child(class_btn)
+               
+               constant_btn = create_filter_btn(constant_icon, "Constants")
+               filter_box.add_child(constant_btn)
+               
+               outline.get_parent().add_child(filter_box)
+               outline.get_parent().move_child(filter_box, outline.get_index())
+               
+               # Callback when the filter changed
+               filter_txt = find_or_null(outline_container.find_children("*", "LineEdit", true, false), 1)
+               filter_txt.text_changed.connect(update_outline.unbind(1))
+               
+               # Callback when the sorting changed
+               sort_btn = find_or_null(outline_container.find_children("*", "Button", true, false))
+               sort_btn.pressed.connect(update_outline)
+                       
+       get_editor_settings().settings_changed.connect(sync_settings)
+       on_tab_changed(scripts_tab_bar.current_tab)
+
+## Restore the old Godot script UI and free everything we created
+func _exit_tree() -> void:
+       var file_system: EditorFileSystem = get_editor_interface().get_resource_filesystem()
+       file_system.filesystem_changed.disconnect(schedule_update)
+       
+       if (old_script_editor_base != null):
+               old_script_editor_base.edited_script_changed.disconnect(update_selected_tab)
+       
+       if (split_container != null):
+               if (split_container != outline_container.get_parent()):
+                       split_container.add_child(outline_container)
+                       
+               # Try to restore the previous split offset.
+               if (is_outline_right):
+                       var split_offset: float = split_container.get_child(1).size.x
+                       split_container.split_offset = split_offset
+                       
+               split_container.move_child(outline_container, 0)
+               
+               filter_txt.text_changed.disconnect(update_outline)
+               sort_btn.pressed.disconnect(update_outline)
+               
+               outline.item_selected.disconnect(scroll_to_index)
+               
+               outline_parent.remove_child(filter_box)
+               outline_parent.remove_child(outline)
+               outline_parent.add_child(old_outline)
+               outline_parent.move_child(old_outline, 1)
+
+               filter_box.free()
+               outline.free()
+       
+       if (scripts_tab_container != null):
+               tab_state.restore(scripts_tab_container, scripts_tab_bar)
+               
+               if (scripts_tab_bar != null):
+                       scripts_tab_bar.mouse_exited.disconnect(on_tab_bar_mouse_exited)
+                       scripts_tab_bar.gui_input.disconnect(on_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_hovered.disconnect(on_tab_hovered)
+                       scripts_tab_bar.active_tab_rearranged.disconnect(on_active_tab_rearranged)
+                       
+                       scripts_tab_bar.tab_changed.disconnect(on_tab_changed)
+
+       if (scripts_item_list != null):
+               scripts_item_list.get_parent().visible = true
+               
+       if (outline_popup != null):
+               outline_popup.hide()
+               
+       get_editor_settings().settings_changed.disconnect(sync_settings)
+#endregion
+               
+## Lazy pattern to update the editor only once per frame
+func _process(delta: float) -> void:
+       update_editor()
+       set_process(false)
+       
+#region Input handling -> Popup
+## Add navigation to the Outline
+func _input(event: InputEvent) -> void:
+       if (!filter_txt.has_focus()):
+               return
+       
+       if (event.is_action_pressed("ui_text_submit")):
+               var items: PackedInt32Array = outline.get_selected_items()
+               
+               if (items.is_empty()):
+                       return
+                       
+               var index: int = items[0]
+               scroll_to_index(index)
+       
+       if (event.is_action_pressed("ui_down", true)):
+               var items: PackedInt32Array = outline.get_selected_items()
+               
+               var index: int
+               if (items.is_empty()):
+                       index = -1
+               else:
+                       index = items[0]
+               
+               if (index == outline.item_count - 1):
+                       return
+                       
+               index += 1
+               
+               outline.select(index)
+               outline.ensure_current_is_visible()
+               get_viewport().set_input_as_handled()
+       elif (event.is_action_pressed("ui_up", true)):
+               var items: PackedInt32Array = outline.get_selected_items()
+               
+               var index: int
+               if (items.is_empty()):
+                       index = outline.item_count
+               else:
+                       index = items[0]
+               
+               if (index == 0):
+                       return
+                       
+               index -= 1
+               outline.select(index)
+               outline.ensure_current_is_visible()
+               get_viewport().set_input_as_handled()
+       
+## Triggers the Outline popup
+func _unhandled_key_input(event: InputEvent) -> void:
+       if !(event is InputEventKey):
+               return
+       
+       if (open_outline_popup.matches_event(event)):
+               get_viewport().set_input_as_handled()
+               
+               var button_flags: Array[bool] = []
+               for child in filter_box.get_children():
+                       var btn: Button = child
+                       button_flags.append(btn.button_pressed)
+                       
+                       btn.button_pressed = true
+       
+               var old_text: String = filter_txt.text
+               filter_txt.text = ""
+
+               outline_popup = POPUP_SCRIPT.new()
+               outline_popup.input_listener = _input
+               
+               outline_container.reparent(outline_popup)
+
+               var script_editor: ScriptEditor = get_editor_interface().get_script_editor()
+               outline_popup.popup_hide.connect(func():
+                       outline_container.reparent(split_container)
+                       if (!is_outline_right):
+                               split_container.move_child(outline_container, 0)
+                       
+                       filter_txt.text = old_text
+                       
+                       var index: int = 0
+                       for flag in button_flags:
+                               var btn: Button = filter_box.get_child(index)
+                               btn.button_pressed = flag
+                               index += 1
+                       
+                       outline_popup.queue_free()
+                       outline_popup = null
+                       
+                       update_outline()
+               )
+               
+               var window_rect: Rect2
+               if (script_editor.get_parent().get_parent() is Window):
+                       # Popup mode
+                       var window: Window = script_editor.get_parent().get_parent()
+                       window_rect = window.get_visible_rect()
+               else:
+                       window_rect = get_editor_interface().get_base_control().get_rect()
+               
+               var size: Vector2i = Vector2i(400, 550)
+               var x: int = window_rect.size.x / 2 - size.x / 2
+               var y: int = window_rect.size.y / 2 - size.y / 2
+               var position: Vector2i = Vector2i(x, y)
+               
+               outline_popup.popup_exclusive_on_parent(script_editor, Rect2i(position, size))
+               
+               filter_txt.grab_focus()
+               
+               update_outline()
+#endregion
+               
+## Schedules an update on the frame
+func schedule_update():
+       set_process(true)
+       
+## Updates all parts of the editor needed to be synchronized with the file system.
+func update_editor():
+       if (sync_script_list):
+               sync_tab_with_script_list()
+               sync_script_list = false
+       
+       update_tabs()
+       update_outline_cache()
+       update_outline()
+       
+func get_current_script() -> Script:
+       var script_editor: ScriptEditor = get_editor_interface().get_script_editor()
+       return script_editor.get_current_script()
+       
+func scroll_to_index(selected_idx: int):
+       if (outline_popup != null):
+               outline_popup.hide.call_deferred()
+       
+       var script: Script = get_current_script()
+       if (!script):
+               return
+       
+       var text: String = outline.get_item_text(selected_idx)
+       var metadata: Dictionary = outline.get_item_metadata(selected_idx)
+       var modifier: String = metadata["modifier"]
+       var type: String = metadata["type"]
+       
+       var type_with_text: String = type + " " + text
+       if (type == "func"):
+               type_with_text = type_with_text + "("
+
+       var source_code: String = script.get_source_code()
+       var lines: PackedStringArray = source_code.split("\n")
+       
+       var index: int = 0
+       for line in lines:
+               # Easy case, like 'var abc'
+               if (line.begins_with(type_with_text)):
+                       goto_line(index)
+                       return
+               
+               # We have an modifier, e.g. 'static'
+               if (modifier != "" && line.begins_with(modifier)):
+                       if (line.begins_with(modifier + " " + type_with_text)):
+                               goto_line(index)
+                               return
+                       # Special case: An 'enum' is treated different.
+                       elif (modifier == "enum" && line.contains("enum " + text)):
+                               goto_line(index)
+                               return
+               
+               # Hard case, probably something like '@onready var abc'
+               if (type == "var" && line.contains(type_with_text)):
+                       goto_line(index)
+                       return
+               
+               index += 1
+               
+       push_error(type_with_text + " or " + modifier + " not found in source code")
+
+func goto_line(index: int):
+       var script_editor: ScriptEditor = get_editor_interface().get_script_editor()
+       script_editor.goto_line(index)
+       
+       var code_edit: CodeEdit = script_editor.get_current_editor().get_base_editor()
+       code_edit.set_caret_line(index)
+       code_edit.set_caret_column(0)
+       code_edit.set_v_scroll(index)
+       code_edit.set_h_scroll(0)
+
+func create_filter_btn(icon: Texture2D, title: String) -> Button:
+       var btn: Button = Button.new()
+       btn.toggle_mode = true
+       btn.icon = icon
+       btn.icon_alignment = HORIZONTAL_ALIGNMENT_CENTER
+       btn.tooltip_text = title
+       
+       var property: StringName = as_setting(title)
+       btn.set_meta("property", property)
+       btn.button_pressed = get_setting(property, true)
+       
+       btn.toggled.connect(on_filter_button_pressed.bind(btn))
+       
+       btn.add_theme_color_override("icon_pressed_color", Color.WHITE)
+       btn.add_theme_color_override("icon_hover_color", Color.WHITE)
+       btn.add_theme_color_override("icon_focus_color", Color.WHITE)
+       
+       var style_box_empty: StyleBoxEmpty = StyleBoxEmpty.new()
+       style_box_empty.set_content_margin_all(4 * get_editor_scale())
+       btn.add_theme_stylebox_override("normal", style_box_empty)
+       
+       var style_box: StyleBoxFlat = StyleBoxFlat.new()
+       style_box.draw_center = false
+       style_box.border_color = Color(0.41, 0.61, 0.91)
+       style_box.set_border_width_all(1 * get_editor_scale())
+       style_box.set_corner_radius_all(3 * get_editor_scale())
+       btn.add_theme_stylebox_override("focus", style_box)
+       
+       return btn
+       
+func on_filter_button_pressed(pressed: bool, btn: Button):
+       set_setting(btn.get_meta("property"), pressed)
+       
+       update_outline()
+       
+func update_outline_position():
+       if (is_outline_right):
+               # Try to restore the previous split offset.
+               var split_offset: float = split_container.get_child(1).size.x
+               split_container.split_offset = split_offset
+               split_container.move_child(outline_container, 1)
+       else:
+               split_container.move_child(outline_container, 0)
+       
+func sync_settings():
+       if (suppress_settings_sync):
+               return
+               
+       var changed_settings: PackedStringArray = get_editor_settings().get_changed_settings()
+       for setting in changed_settings:
+               if (!setting.begins_with(SCRIPT_IDE)):
+                       continue
+                       
+               if (setting == OUTLINE_POSITION_RIGHT):
+                       # Update outline position.
+                       var new_outline_right: bool = get_setting(OUTLINE_POSITION_RIGHT, is_outline_right)
+                       if (new_outline_right != is_outline_right):
+                               is_outline_right = new_outline_right
+                               
+                               update_outline_position()
+               elif (setting == HIDE_PRIVATE_MEMBERS):
+                       # Update cache and outline to reflect the private members setting.
+                       var new_hide_private_members: bool = get_setting(HIDE_PRIVATE_MEMBERS, hide_private_members)
+                       if (new_hide_private_members != hide_private_members):
+                               hide_private_members = new_hide_private_members
+                               
+                               update_outline_cache()
+                               update_outline()
+               elif (setting == OPEN_OUTLINE_POPUP):
+                       # Update show outline popup shortcut.
+                       open_outline_popup = get_editor_settings().get_setting(OPEN_OUTLINE_POPUP)
+               else:
+                       # Update filter buttons.
+                       for btn_node in filter_box.get_children():
+                               var btn: Button = btn_node
+                               var property: StringName = btn.get_meta("property")
+                               
+                               btn.button_pressed = get_setting(property, btn.button_pressed)
+               
+func as_setting(property: String) -> StringName:
+       return SCRIPT_IDE + property.to_lower().replace(" ", "_")
+       
+func get_setting(property: StringName, alt: bool) -> bool:
+       var editor_settings: EditorSettings = get_editor_settings()
+       if (editor_settings.has_setting(property)):
+               return editor_settings.get_setting(property)
+       else:
+               editor_settings.set_setting(property, alt)
+               editor_settings.set_initial_value(property, alt, false)
+               return alt
+       
+func set_setting(property: StringName, value: bool):
+       var editor_settings: EditorSettings = get_editor_settings()
+       
+       suppress_settings_sync = true
+       editor_settings.set_setting(property, value)
+       suppress_settings_sync = false
+
+func on_tab_changed(idx: int):
+       selected_tab = idx;
+       
+       if (old_script_editor_base != null):
+               old_script_editor_base.edited_script_changed.disconnect(update_selected_tab)
+               old_script_editor_base = null
+       
+       var script_editor: ScriptEditor = get_editor_interface().get_script_editor()
+       var script_editor_base: ScriptEditorBase = script_editor.get_current_editor()
+       
+       if (script_editor_base != null):
+               script_editor_base.edited_script_changed.connect(update_selected_tab)
+               
+               old_script_editor_base = script_editor_base
+       
+       sync_script_list = true
+       schedule_update()
+       
+func update_selected_tab():
+       if (selected_tab == -1):
+               return
+               
+       if (scripts_item_list.item_count == 0):
+               return
+       
+       scripts_tab_container.set_tab_title(selected_tab, scripts_item_list.get_item_text(selected_tab))
+       scripts_tab_container.set_tab_icon(selected_tab, scripts_item_list.get_item_icon(selected_tab))
+       
+func update_tabs():
+       for index in scripts_tab_container.get_tab_count():
+               scripts_tab_container.set_tab_title(index, scripts_item_list.get_item_text(index))
+               scripts_tab_container.set_tab_icon(index, scripts_item_list.get_item_icon(index))
+
+#region Outline (cache) update
+func update_keywords(script: Script):
+       if (script == null):
+               return
+       
+       var new_script_type: StringName = script.get_instance_base_type()
+       if (old_script_type != new_script_type):
+               old_script_type = new_script_type
+               
+               keywords.clear()
+               keywords["_static_init"] = 0
+               register_virtual_methods(new_script_type)
+               
+func register_virtual_methods(clazz: String):
+       for method in ClassDB.class_get_method_list(clazz):
+               if method.flags & METHOD_FLAG_VIRTUAL > 0:
+                       keywords[method.name] = 0
+
+func update_outline_cache():
+       outline_cache = null
+       
+       var script: Script = get_current_script()
+       if (!script):
+               return
+               
+       update_keywords(script)
+       
+       # Check if built-in script. In this case we need to duplicate it.
+       if (script.get_path().contains(".tscn::GDScript")):
+               script = script.duplicate()
+       
+       outline_cache = OutlineCache.new()
+       
+       # Collect all script members.
+       for_each_script_member(script, func(array: Array[String], item: String): array.append(item))
+       
+       # Remove script members that only exist in the base script (which includes the base of the base etc.).
+       # Note: The method that only collects script members without including the base script(s)
+       # is not exposed to GDScript.
+       var base_script: Script = script.get_base_script()
+       if (base_script != null):
+               for_each_script_member(base_script, func(array: Array[String], item: String): array.erase(item))
+       
+func for_each_script_member(script: Script, consumer: Callable):
+       # Functions / Methods
+       for dict in script.get_script_method_list():
+               var func_name: String = dict["name"]
+               
+               if (keywords.has(func_name)):
+                       consumer.call(outline_cache.engine_funcs, func_name)
+               else:
+                       if hide_private_members && func_name.begins_with("_"):
+                               continue
+                               
+                       # Inline getter/setter will normally be shown as '@...getter', '@...setter'.
+                       # Since we already show the variable itself, we will skip those.
+                       if (func_name.begins_with("@")):
+                               continue
+                       
+                       consumer.call(outline_cache.funcs, func_name)
+       
+       # Properties / Exported variables
+       for dict in script.get_script_property_list():
+               var property: String = dict["name"]
+               if hide_private_members && property.begins_with("_"):
+                       continue
+               
+               var usage: int = dict["usage"]
+
+               if (usage == PROPERTY_USAGE_SCRIPT_VARIABLE | PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR):
+                       consumer.call(outline_cache.exports, property)
+               elif (usage == PROPERTY_USAGE_SCRIPT_VARIABLE):
+                       consumer.call(outline_cache.properties, property)
+       
+       # Static variables (are separated for whatever reason)
+       for dict in script.get_property_list():
+               var property: String = dict["name"]
+               if hide_private_members && property.begins_with("_"):
+                       continue
+                       
+               var usage: int = dict["usage"]
+                       
+               if (usage == PROPERTY_USAGE_SCRIPT_VARIABLE):
+                       consumer.call(outline_cache.properties, property)
+               
+       # Signals
+       for dict in script.get_script_signal_list():
+               var signal_name: String = dict["name"]
+               
+               consumer.call(outline_cache.signals, signal_name)
+       
+       # Constants / Classes
+       for name_key in script.get_script_constant_map():
+               if hide_private_members && name_key.begins_with("_"):
+                       continue
+               
+               var object: Variant = script.get_script_constant_map().get(name_key)
+               if (object is GDScript && object.get_instance_base_type() == "RefCounted"):
+                       consumer.call(outline_cache.classes, name_key)
+               else:
+                       consumer.call(outline_cache.constants, name_key)
+       
+func update_outline():
+       outline.clear()
+       
+       if (outline_cache == null):
+               return
+       
+       # Classes
+       if (class_btn.button_pressed):
+               add_to_outline(outline_cache.classes, class_icon, "class")
+       
+       # Constants
+       if (constant_btn.button_pressed):
+               add_to_outline(outline_cache.constants, constant_icon, "const", "enum")
+       
+       # Properties
+       if (property_btn.button_pressed):
+               add_to_outline(outline_cache.properties, property_icon, "var")
+               
+       # Exports
+       if (export_btn.button_pressed):
+               add_to_outline(outline_cache.exports, export_icon, "var", "@export")
+               
+       # Signals
+       if (signal_btn.button_pressed):
+               add_to_outline(outline_cache.signals, signal_icon, "signal")
+               
+       # Functions
+       if (func_btn.button_pressed):
+               add_to_outline_ext(outline_cache.funcs, get_icon, "func", "static")
+               
+       # Engine functions
+       if (engine_func_btn.button_pressed):
+               add_to_outline(outline_cache.engine_funcs, keyword_icon, "func")
+
+func add_to_outline(items: Array[String], icon: Texture2D, type: String, modifier: String = ""):
+       add_to_outline_ext(items, func(str: String): return icon, type, modifier)
+                       
+func add_to_outline_ext(items: Array[String], icon_callable: Callable, type: String, modifier: String = ""):
+       var text: String = filter_txt.get_text()
+       var move_index: int = 0
+       
+       if (is_sorted()):
+               items = items.duplicate()
+               items.sort_custom(func(a, b): return a.naturalnocasecmp_to(b) < 0)
+       
+       for item in items:
+               if (text.is_empty() || text.is_subsequence_ofn(item)):
+                       var icon: Texture2D = icon_callable.call(item)
+                       outline.add_item(item, icon, true)
+                       
+                       var dict: Dictionary = {
+                               "type": type,
+                               "modifier": modifier
+                       }
+                       outline.set_item_metadata(outline.item_count - 1, dict)
+                       # Only activate the tooltip when we do not show the outline in the popup.
+                       outline.set_item_tooltip_enabled(outline.item_count - 1, outline_popup == null)
+                       outline.move_item(outline.item_count - 1, move_index)
+                       
+                       move_index += 1
+                       
+func get_icon(func_name: String) -> Texture2D:
+       var icon: Texture2D = func_icon
+       if (func_name.begins_with("get")):
+               icon = func_get_icon
+       elif (func_name.begins_with("set")):
+               icon = func_set_icon
+                       
+       return icon
+#endregion
+       
+func sync_tab_with_script_list():
+       # For some reason the selected tab is wrong. Looks like a Godot bug.
+       if (selected_tab >= scripts_item_list.item_count):
+               selected_tab = scripts_tab_bar.current_tab
+       
+       # Hide filter and outline for non .gd scripts.
+       var is_script: bool = get_current_script() != null
+       filter_box.visible = is_script
+       outline.visible = is_script
+       
+       # Sync with script item list.
+       if (selected_tab != -1 && scripts_item_list.item_count > 0 && !scripts_item_list.is_selected(selected_tab)):
+               scripts_item_list.select(selected_tab)
+               scripts_item_list.item_selected.emit(selected_tab)
+
+func trigger_script_editor_update_script_names():
+       var script_editor: ScriptEditor = get_editor_interface().get_script_editor()
+       # for now it is the only way to trigger script_editor._update_script_names
+       script_editor.notification(Control.NOTIFICATION_THEME_CHANGED)
+
+#region Tab Handling
+func on_tab_bar_mouse_exited():
+       last_tab_hovered = -1
+
+func on_tab_hovered(idx: int):
+       last_tab_hovered = idx
+
+func on_tab_bar_gui_input(event: InputEvent):
+       if last_tab_hovered == -1:
+               return
+               
+       if event is InputEventMouseMotion:
+               scripts_tab_bar.tooltip_text = get_res_path(last_tab_hovered)
+       
+       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: int):
+       var control: Control = scripts_tab_container.get_tab_control(selected_tab)
+       if (!control):
+               return
+               
+       scripts_tab_container.move_child(control, idx_to)
+       scripts_tab_container.current_tab = scripts_tab_container.current_tab
+       selected_tab = scripts_tab_container.current_tab
+       trigger_script_editor_update_script_names()
+       
+func get_res_path(idx: int) -> String:
+       var tab_control: Control = scripts_tab_container.get_tab_control(idx)
+       if (tab_control == null):
+               return ''
+       
+       var path_var: Variant = tab_control.get("metadata/_edit_res_path")
+       if (path_var == null):
+               return ''
+       
+       return path_var
+
+func on_tab_rmb(tab_idx: int):
+       simulate_item_clicked(tab_idx, MOUSE_BUTTON_RIGHT)
+
+func on_tab_close(tab_idx: int):
+       simulate_item_clicked(tab_idx, MOUSE_BUTTON_MIDDLE)
+
+func simulate_item_clicked(tab_idx: int, mouse_idx: int):
+       scripts_item_list.item_clicked.emit(tab_idx, scripts_item_list.get_local_mouse_position(), mouse_idx)
+#endregion
+
+func get_editor_scale() -> float:
+       return get_editor_interface().get_editor_scale()
+       
+func is_sorted() -> bool:
+       return get_editor_settings().get_setting("text_editor/script_list/sort_members_outline_alphabetically")
+       
+func get_editor_settings() -> EditorSettings:
+       return get_editor_interface().get_editor_settings()
+       
+static func find_or_null(arr: Array[Node], index: int = 0) -> Node:
+       if arr.is_empty():
+               return null
+       
+       return arr[index]
+
+static func get_tab_bar_of(src: Node) -> TabBar:
+       for child in src.get_children(true):
+               if child is TabBar:
+                       return child
+       
+       return null
+       
+class OutlineCache:
+       var classes: Array[String] = []
+       var constants: Array[String] = []
+       var signals: Array[String] = []
+       var exports: Array[String] = []
+       var properties: Array[String] = []
+       var funcs: Array[String] = []
+       var engine_funcs: Array[String] = []
+
+class TabStateCache:
+       var tabs_visible: bool
+       var drag_to_rearrange_enabled: bool
+       var tab_bar_drag_to_rearrange_enabled: bool
+       var tab_close_display_policy: TabBar.CloseButtonDisplayPolicy
+       var select_with_rmb: bool
+       
+       func save(tab_container: TabContainer, tab_bar: TabBar):
+               if (tab_container != null):
+                       tabs_visible = tab_container.tabs_visible
+                       drag_to_rearrange_enabled = tab_container.drag_to_rearrange_enabled
+               if (tab_bar != null):
+                       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(tab_container: TabContainer, tab_bar: TabBar):
+               if (tab_container != null):
+                       tab_container.tabs_visible = tabs_visible
+                       tab_container.drag_to_rearrange_enabled = drag_to_rearrange_enabled
+               if (tab_bar != null):
+                       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/addons/tracer/StackHandler.cs b/addons/tracer/StackHandler.cs
new file mode 100644 (file)
index 0000000..872cb28
--- /dev/null
@@ -0,0 +1,40 @@
+using Godot;
+using System.Diagnostics;
+
+public partial class StackHandler : GodotObject
+{
+       public string GetModulePath()
+       {
+               string modulePath = "unknown";
+               StackTrace st = new StackTrace(true);
+               if (st.FrameCount > 6)
+               {
+                       StackFrame sf = st.GetFrame(6);
+                       modulePath = sf.GetFileName();
+                       string rootDir = ProjectSettings.GlobalizePath("res://");
+                       // This substring is necessary in order to remove the OS path from the module's
+                       // filepath.
+                       // i.e. remove "C:/GodotProjects/Game" from "C:/GodotProjects/Game/Scenes/Main/Main.cs"
+                       // ProjectSettings.LocalizePath(...) doesn't seem to work.
+                       modulePath = modulePath.Substring(rootDir.Length);
+                       // Also convert Windows-style backslashes to Godot standard forward slashes if present.
+                       if (modulePath.Contains("\\"))
+                       {
+                               modulePath = modulePath.Replace("\\", "/");
+                       }
+               }
+               return modulePath;
+       }
+
+       public string GetFunctionName()
+       {
+               string functionName = "unknown";
+               StackTrace st = new StackTrace(true);
+               if (st.FrameCount > 6)
+               {
+                       StackFrame sf = st.GetFrame(6);
+                       functionName = sf.GetMethod().Name;
+               }
+               return functionName;
+       }
+}
diff --git a/addons/tracer/plugin.cfg b/addons/tracer/plugin.cfg
new file mode 100644 (file)
index 0000000..6ecb615
--- /dev/null
@@ -0,0 +1,7 @@
+[plugin]
+
+name="Tracer"
+description="Structured tracing for godot"
+author="wyvernbw"
+version=""
+script="tracer_plugin.gd"
diff --git a/addons/tracer/subscriber.gd b/addons/tracer/subscriber.gd
new file mode 100644 (file)
index 0000000..9eedff1
--- /dev/null
@@ -0,0 +1,123 @@
+class_name TraceSubscriber
+extends Node
+
+var print_level := true
+var use_colored_output := true
+var use_nicer_colors := false
+var print_module := true
+var print_function := true
+var print_timestamp := true
+var print_thread_id := false
+var writer: Callable = print_stump
+var filter: int = ~0
+
+func init() -> void:
+       Tracer.add_child(self)
+       Tracer.entered_span.connect(on_entered_span)
+
+
+func print_stump(text: String) -> void:
+       print_rich(text)
+
+
+func on_entered_span() -> void:
+       var span: Tracer.Trace = Tracer.current_span
+       if span.level & filter == 0:
+               return
+       var text = span.msg
+       var level_str = (
+               Tracer.level_colored
+               if use_colored_output
+               else Tracer.level_string
+       )
+       if use_nicer_colors and use_colored_output:
+               level_str = Tracer.level_colored_nice
+       var gray = (
+               "[color=dimgray]%s[/color]"
+               if use_nicer_colors
+               else "[color=gray]%s[/color]"
+       )
+       if not use_colored_output:
+               gray = "%s"
+       if print_function:
+               var function_name = span.function_name
+               if use_colored_output:
+                       function_name = (gray % function_name)
+               text = function_name + ": " + text
+       if print_module:
+               var module_name = span.module
+               if use_colored_output:
+                       module_name = (gray % module_name)
+               var separator = (gray % "::") if print_function else ": "
+               text = module_name + separator + text
+       if print_level:
+               var separator = ": " if not (print_module or print_function) else " "
+               text = level_str.call(span.level) + separator + text
+       if print_timestamp:
+               text = "[%s] " % span.timestamp + text
+       if print_thread_id:
+               text = "ThreadId(%s) " % span.thread_id + text
+       writer.call(text)
+
+
+func with_level(displayed: bool) -> TraceSubscriber:
+       print_level = displayed
+       return self
+
+
+func with_colored_output(displayed: bool) -> TraceSubscriber:
+       use_colored_output = displayed
+       return self
+
+
+func with_module(displayed: bool) -> TraceSubscriber:
+       print_module = displayed
+       return self
+
+
+func with_function(displayed: bool) -> TraceSubscriber:
+       print_function = displayed
+       return self
+
+
+func with_timestamp(displayed: bool) -> TraceSubscriber:
+       print_timestamp = displayed
+       return self
+
+
+func with_thread_id(displayed: bool) -> TraceSubscriber:
+       print_thread_id = displayed
+       return self
+
+
+func with_nicer_colors(displayed: bool) -> TraceSubscriber:
+       use_nicer_colors = displayed
+       return self
+
+
+func barebones() -> TraceSubscriber:
+       return (
+               self
+               . with_level(true)
+               . with_colored_output(false)
+               . with_module(true)
+               . with_function(true)
+               . with_timestamp(true)
+               . with_thread_id(false)
+       )
+
+
+func with_filter(new_filter: int) -> TraceSubscriber:
+       filter = new_filter
+       return self
+
+
+func with_writer(writer: Callable) -> TraceSubscriber:
+       self.writer = writer
+       return self
+
+
+static func writer_from_file(file: FileAccess) -> Callable:
+       return func(text: String) -> void:
+               file.store_string(text + "\n")
+
diff --git a/addons/tracer/tracer.gd b/addons/tracer/tracer.gd
new file mode 100644 (file)
index 0000000..eb38d8b
--- /dev/null
@@ -0,0 +1,131 @@
+extends Node
+
+signal entered_span
+
+enum Level {
+       Error = 1,
+       Warn = 2,
+       Info = 4,
+       Debug = 8,
+       Trace = 16,
+}
+
+
+class Trace:
+       var level: Level
+       var msg: String
+       var module: String = "unknown"
+       var function_name: String = "unknown"
+       var timestamp: String = (
+               Time.get_datetime_string_from_system()
+       )
+       var thread_id := 1
+       var _has_mono: bool = Engine.has_singleton("GodotSharp")
+
+       func _init(
+               msg: String, level: Level, new_thread_id := 0
+       ) -> void:
+               self.msg = msg
+               self.level = level
+               var st = get_stack()
+               if st.size() > 2:
+                       module = st[2].source.trim_prefix("res://")
+                       function_name = st[2].function
+               elif _has_mono:
+                       # C#-specific stack handling
+                       var mono_sh_script = load("res://addons/tracer/StackHandler.cs")
+                       var mono_stack_handler = mono_sh_script.new()
+                       module = mono_stack_handler.GetModulePath()
+                       function_name = mono_stack_handler.GetFunctionName()
+               else:
+                       function_name = "unknown"
+               thread_id = new_thread_id
+
+
+var current_span: Trace = null:
+       set = set_current_span
+
+
+func set_current_span(span: Trace) -> void:
+       current_span = span
+       entered_span.emit()
+
+
+func info(msg: String) -> void:
+       current_span = Trace.new(
+               msg, Level.Info, OS.get_thread_caller_id()
+       )
+
+
+func debug(msg: String) -> void:
+       current_span = Trace.new(
+               msg, Level.Debug, OS.get_thread_caller_id()
+       )
+
+
+func warn(msg: String) -> void:
+       current_span = Trace.new(
+               msg, Level.Warn, OS.get_thread_caller_id()
+       )
+
+
+func error(msg: String) -> void:
+       current_span = Trace.new(
+               msg, Level.Error, OS.get_thread_caller_id()
+       )
+
+
+func trace(msg: String) -> void:
+       current_span = Trace.new(msg, Level.Trace)
+
+
+static func level_string(level: Level) -> String:
+       match level:
+               Level.Info:
+                       return "INFO"
+               Level.Debug:
+                       return "DEBUG"
+               Level.Warn:
+                       return "WARN"
+               Level.Error:
+                       return "ERROR"
+               Level.Trace:
+                       return "TRACE"
+               _:
+                       return "UNKNOWN"
+
+
+static func level_colored(level: Level) -> String:
+       var color = ""
+       match level:
+               Level.Info:
+                       color = "[color=green]%s[/color]"
+               Level.Debug:
+                       color = "[color=blue]%s[/color]"
+               Level.Warn:
+                       color = "[color=yellow]%s[/color]"
+               Level.Error:
+                       color = "[color=red]%s[/color]"
+               Level.Trace:
+                       color = "[color=magenta]%s[/color]"
+               _:
+                       color = "[color=white]%s[/color]"
+       return color % level_string(level)
+
+
+static func level_colored_nice(level: Level) -> String:
+       var color = ""
+       match level:
+               Level.Info:
+                       color = "[color=greenyellow]%s[/color]"
+               Level.Debug:
+                       color = "[color=dodgerblue]%s[/color]"
+               Level.Warn:
+                       color = "[color=gold]%s[/color]"
+               Level.Error:
+                       color = "[color=orangered]%s[/color]"
+               Level.Trace:
+                       color = "[color=maroon]%s[/color]"
+               _:
+                       color = "[color=white]%s[/color]"
+       return color % level_string(level)
diff --git a/addons/tracer/tracer_plugin.gd b/addons/tracer/tracer_plugin.gd
new file mode 100644 (file)
index 0000000..8574064
--- /dev/null
@@ -0,0 +1,14 @@
+@tool
+extends EditorPlugin
+
+const AUTOLOAD_NAME = "Tracer"
+
+
+func _enter_tree():
+       add_autoload_singleton(AUTOLOAD_NAME, "./tracer.gd")
+       pass
+
+
+func _exit_tree():
+       remove_autoload_singleton(AUTOLOAD_NAME)
+       pass
diff --git a/examples/colors_demo.gd b/examples/colors_demo.gd
new file mode 100644 (file)
index 0000000..b6e10de
--- /dev/null
@@ -0,0 +1,25 @@
+extends Node
+
+
+
+func show_off_all_the_pretty_colors():
+       Color("#ffbb00")                                                        # hex colors
+       Color("#9f4", 0.8)                                                      # short hex, with alpha
+       Color("gold")                                                           # named colors
+       Color('aqua')                                                           # different quotes
+       Color.DEEP_SKY_BLUE                                                     # named with constants
+       Color(Color.DEEP_SKY_BLUE, 0.6)                         # and alpha
+       Color(1, 0.2, 0.5)                                                      # rgb
+       Color(1, 0.2, 0.5, 0.6)                                         # rgba
+       Color(Color("medium spring green"))                     # nesting
+       Color(Color("#ff0000"), 0.5)                            # with alpha
+       Color(Color(Color(Color.DARK_ORANGE, 0.8))) # even this here
+       Color(1, 1, 1, 1)
+       Color.WHITE
+       Color.BLACK
+
+
+       Color.DARK_TURQUOISE                                            # click the preview
+       Color(0.9727, 0.019, 0.4229, 0.9255)            # to get a color picker
+       Color(0.9297, 0.852, 0.0254, 1)                         # and change colors directly
+
diff --git a/examples/colors_demo.gdshader b/examples/colors_demo.gdshader
new file mode 100644 (file)
index 0000000..015b475
--- /dev/null
@@ -0,0 +1,14 @@
+shader_type canvas_item;
+
+// supports shader uniforms with type hint source_color
+uniform vec4 input_color : source_color = vec4(0.0952, 0.8355, 0.9494, 1);
+uniform vec4 transparent_color : source_color = vec4(0.95, 0.24, 0.52, 0.6);
+
+// and any vec4 as color with this comment in front
+/* source_color */ uniform vec4 not_type_hinted = vec4(1, 0.8549, 0.102, 1);
+
+// Color.BLACK <- technically you can also view these
+
+
+//                                             picking and selecting also works the same
+uniform vec4 picker_color : source_color = vec4(0.9049, 0.5072, 0.0389, 1);
\ No newline at end of file
diff --git a/examples/test/logs.txt b/examples/test/logs.txt
new file mode 100644 (file)
index 0000000..9cbb2a3
--- /dev/null
@@ -0,0 +1,5 @@
+[2023-11-02T13:26:06] INFO examples/test/test.gd::_ready: Game Started!
+[2023-11-02T13:26:06] DEBUG examples/test/test.gd::_ready: Initializing systems... 🧙‍♂️
+[2023-11-02T13:26:06] WARN examples/test/test.gd::_ready: Cannot find file 'data.json' 🤔
+[2023-11-02T13:26:06] ERROR examples/test/test.gd::_ready: Cannot communicate with server 😱
+[2023-11-02T13:26:06] TRACE examples/test/test.gd::_ready: This is a trace message 🕵️‍♂️
diff --git a/examples/test/test.gd b/examples/test/test.gd
new file mode 100644 (file)
index 0000000..29ba495
--- /dev/null
@@ -0,0 +1,39 @@
+extends Node2D
+
+# Shorthand
+const Level = Tracer.Level
+
+func _ready():
+       # Build a subscriber with all the bells and whistles
+       var subscriber = (
+               TraceSubscriber
+               . new()
+               . with_colored_output(true)
+               . with_level(true)
+               . with_nicer_colors(true)
+               . with_timestamp(true)
+               . with_filter(Level.Info | Level.Warn | Level.Error | Level.Debug)
+       )
+       # Initialize the subscriber
+       subscriber.init()
+
+       # Open a file for writing
+       var logs = FileAccess.open("res://examples/test/logs.txt", FileAccess.WRITE)
+       # Build a subscriber that writes to a file
+       var file_logger = (
+               TraceSubscriber
+               . new()
+               . barebones()
+               . with_writer(
+                       TraceSubscriber.writer_from_file(logs)
+               )
+       )
+       # Initialize the subscriber
+       file_logger.init()
+
+       Tracer.info("Game Started!")
+       Tracer.debug("Initializing systems... 🧙‍♂️")
+       Tracer.warn("Cannot find file 'data.json' 🤔")
+       Tracer.error("Cannot communicate with server 😱")
+       # This will not be printed
+       Tracer.trace("This is a trace message 🕵️‍♂️")
diff --git a/examples/test/test.tscn b/examples/test/test.tscn
new file mode 100644 (file)
index 0000000..71aedec
--- /dev/null
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://d3njkl304ln6q"]
+
+[ext_resource type="Script" path="res://examples/test/test.gd" id="1_l25wv"]
+
+[node name="test" type="Node2D"]
+script = ExtResource("1_l25wv")
diff --git a/game_settings/components/_misc_components/apply_btn/apply_btn.gd b/game_settings/components/_misc_components/apply_btn/apply_btn.gd
new file mode 100644 (file)
index 0000000..d3cf764
--- /dev/null
@@ -0,0 +1,26 @@
+extends Button
+
+@export var group: String
+@export var grab_focus_on_mouse_over: bool
+
+
+func _ready() -> void:
+       pressed.connect(_on_pressed)
+       mouse_entered.connect(_on_mouse_entered)
+       focus_entered.connect(_on_focus_entered)
+
+
+func _on_pressed() -> void:
+       get_tree().call_group(group, "apply_setting")
+       GGS.play_sfx(GGS.SFX.INTERACT)
+
+
+func _on_mouse_entered() -> void:
+       GGS.play_sfx(GGS.SFX.MOUSE_OVER)
+       
+       if grab_focus_on_mouse_over:
+               grab_focus()
+
+
+func _on_focus_entered() -> void:
+       GGS.play_sfx(GGS.SFX.FOCUS)
diff --git a/game_settings/components/_misc_components/apply_btn/apply_btn.tscn b/game_settings/components/_misc_components/apply_btn/apply_btn.tscn
new file mode 100644 (file)
index 0000000..a1867be
--- /dev/null
@@ -0,0 +1,11 @@
+[gd_scene load_steps=2 format=3]
+
+[ext_resource type="Script" path="res://game_settings/components/_misc_components/apply_btn/apply_btn.gd" id="1_dk1tm"]
+
+[node name="ApplyBtn" type="Button"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_dk1tm")
diff --git a/game_settings/components/_misc_components/input_confirm_window/input_confirm_window.gd b/game_settings/components/_misc_components/input_confirm_window/input_confirm_window.gd
new file mode 100644 (file)
index 0000000..bece485
--- /dev/null
@@ -0,0 +1,285 @@
+extends ConfirmationDialog
+signal input_selected(chosen_input: InputEvent)
+
+@export var listening_wait_time: float = 0.35
+@export var listening_max_time: float = 5
+@export var show_progress_bar: bool = true
+@export_group("Text")
+@export var btn_listening: String = ". . ."
+@export var title_listening: String = "Listening for Input"
+@export var title_confirm: String = "Confirm Input"
+@export var timeout_text: String = "Timed Out"
+@export var already_exists_msg: String = "Input already exists ({action})"
+
+var chosen_input: InputEvent
+var src: ggsUIComponent
+var type: ggsInputHelper.InputType
+var accept_mouse: bool
+var accept_modifiers: bool
+var accept_axis: bool
+var use_icons: bool
+
+var input_helper: ggsInputHelper = ggsInputHelper.new()
+
+@onready var AlreadyExistsLabel: Label = $MainCtnr/AlreadyExistsLabel
+@onready var OkBtn: Button = get_ok_button()
+@onready var CancelBtn: Button = get_cancel_button()
+@onready var ListenBtn: Button = $MainCtnr/ListenBtn
+@onready var ListenTimer: Timer = $ListenTimer
+@onready var MaxListenTimer: Timer = $MaxListenTimer
+@onready var ListenProgress: ProgressBar = $MainCtnr/ListenProgress
+
+
+func _ready() -> void:
+       visibility_changed.connect(_on_visibility_changed)
+       confirmed.connect(_on_confirmed)
+       
+       ListenBtn.pressed.connect(_on_ListenBtn_pressed)
+       ListenTimer.timeout.connect(_on_ListenTimer_timeout)
+       MaxListenTimer.timeout.connect(_on_MaxListenTimer_timeout)
+       
+       ListenBtn.mouse_entered.connect(_on_AnyBtn_mouse_entered.bind(ListenBtn))
+       OkBtn.mouse_entered.connect(_on_AnyBtn_mouse_entered.bind(OkBtn))
+       CancelBtn.mouse_entered.connect(_on_AnyBtn_mouse_entered.bind(CancelBtn))
+       ListenBtn.focus_entered.connect(_on_AnyBtn_focus_entered)
+       OkBtn.focus_entered.connect(_on_AnyBtn_focus_entered)
+       CancelBtn.focus_entered.connect(_on_AnyBtn_focus_entered)
+       CancelBtn.pressed.connect(_on_CancelBtn_pressed)
+       
+       ListenBtn.focus_neighbor_bottom = CancelBtn.get_path()
+       OkBtn.focus_neighbor_top = ListenBtn.get_path()
+       CancelBtn.focus_neighbor_top = ListenBtn.get_path()
+       
+       ListenTimer.wait_time = listening_wait_time
+       MaxListenTimer.wait_time = listening_max_time
+
+
+func _process(_delta: float) -> void:
+       ListenProgress.value = ListenTimer.time_left / ListenTimer.wait_time
+
+
+func _input(event: InputEvent) -> void:
+       if not _event_is_valid(event):
+               return
+       
+       _set_btn_text_or_icon(event)
+       
+       var input_already_exists: Array = input_helper.input_already_exists(event, src.setting.action)
+       if input_already_exists[0]:
+               AlreadyExistsLabel.text = already_exists_msg.format({"action": input_already_exists[1].capitalize()})
+               
+               ListenProgress.hide()
+               AlreadyExistsLabel.show()
+               ListenTimer.stop()
+               MaxListenTimer.start()
+               return
+       
+       ListenProgress.show()
+       AlreadyExistsLabel.hide()
+       ListenTimer.start()
+       MaxListenTimer.start()
+       
+       chosen_input = event
+
+
+### Input Validation
+
+func _event_is_valid(event: InputEvent) -> bool:
+       var type_is_acceptable: bool = _event_type_is_acceptable(event)
+       var has_modifier: bool = _event_has_modifier(event)
+       var is_double_click: bool = _event_is_double_click(event)
+       var mouse_btn_is_valid: bool = _event_mouse_btn_is_valid(event)
+       var event_is_single_press: bool = (event.is_pressed() and not event.is_echo())
+       
+       var is_valid: bool
+       if accept_modifiers:
+               is_valid = (
+                       type_is_acceptable and
+                       event_is_single_press and
+                       not is_double_click and
+                       mouse_btn_is_valid
+               )
+       else:
+               is_valid = (
+                       type_is_acceptable and
+                       event_is_single_press and
+                       not is_double_click and
+                       mouse_btn_is_valid and 
+                       not has_modifier
+               )
+       
+       return is_valid
+
+
+func _event_type_is_acceptable(event: InputEvent) -> bool:
+       var is_acceptable: bool = false
+       
+       if (
+               type == ggsInputHelper.InputType.KEYBOARD or
+               type == ggsInputHelper.InputType.MOUSE
+       ):
+               if accept_mouse:
+                       is_acceptable = (
+                               event is InputEventKey or
+                               event is InputEventMouseButton
+                       )
+               else:
+                       is_acceptable = (event is InputEventKey)
+       
+       elif (
+               type == ggsInputHelper.InputType.GP_BTN or
+               type == ggsInputHelper.InputType.GP_MOTION
+       ):
+               if accept_axis:
+                       is_acceptable = (
+                               event is InputEventJoypadButton or
+                               event is InputEventJoypadMotion
+                       )
+               else:
+                       is_acceptable = (event is InputEventJoypadButton)
+       
+       return is_acceptable
+
+
+func _event_has_modifier(event: InputEvent) -> bool:
+       var has_modifier: bool
+       
+       if event is InputEventWithModifiers:
+               has_modifier = (
+                       event.shift_pressed or
+                       event.alt_pressed or
+                       event.ctrl_pressed
+               )
+       
+       return has_modifier
+
+
+func _event_is_double_click(event: InputEvent) -> bool:
+       var is_double_click: bool
+       
+       if event is InputEventMouseButton:
+               is_double_click = event.double_click
+       
+       return is_double_click
+
+
+func _event_mouse_btn_is_valid(event: InputEvent) -> bool:
+       var mouse_btn_is_valid: bool = true
+       
+       if event is InputEventMouseButton:
+               mouse_btn_is_valid = (event.button_index >= 0 and event.button_index <= 9)
+       
+       return mouse_btn_is_valid
+
+
+### Input Listening
+
+func _set_btn_text_or_icon(event: InputEvent) -> void:
+       if (
+               use_icons and
+               (type == ggsInputHelper.InputType.MOUSE or
+               type == ggsInputHelper.InputType.GP_BTN or
+               type == ggsInputHelper.InputType.GP_MOTION)
+       ):
+               ListenBtn.icon = input_helper.get_event_as_icon(event, src.icon_db)
+               
+               if ListenBtn.icon == null:
+                       ListenBtn.text = input_helper.get_event_as_text(event)
+               else:
+                       ListenBtn.text = ""
+               
+               return
+       
+       ListenBtn.icon = null
+       ListenBtn.text = input_helper.get_event_as_text(event)
+
+
+func _start_listening() -> void:
+       ListenBtn.text = btn_listening
+       ListenBtn.icon = null
+       title = title_listening
+       
+       OkBtn.release_focus()
+       OkBtn.disabled = true
+       OkBtn.focus_mode = Control.FOCUS_NONE
+       
+       ListenBtn.release_focus()
+       ListenBtn.disabled = true
+       ListenBtn.focus_mode = Control.FOCUS_NONE
+       
+       CancelBtn.release_focus()
+       
+       if show_progress_bar:
+               ListenProgress.show()
+       
+       set_process_input(true)
+       set_process(true)
+       MaxListenTimer.start()
+
+
+func _stop_listening(timed_out: bool = false) -> void:
+       title = title_confirm
+       
+       ListenBtn.focus_mode = Control.FOCUS_ALL
+       ListenBtn.disabled = false
+       ListenBtn.grab_focus()
+       
+       if timed_out:
+               ListenBtn.text = timeout_text
+               ListenBtn.icon = null
+       
+       if not timed_out:
+               OkBtn.focus_mode = Control.FOCUS_ALL
+               OkBtn.disabled = false
+               OkBtn.grab_focus()
+       
+       ListenProgress.hide()
+       AlreadyExistsLabel.hide()
+       
+       set_process_input(false)
+       set_process(false)
+       MaxListenTimer.stop()
+
+
+func _on_ListenBtn_pressed() -> void:
+       _start_listening()
+       GGS.play_sfx(GGS.SFX.INTERACT)
+
+
+func _on_ListenTimer_timeout() -> void:
+       _stop_listening()
+
+
+func _on_MaxListenTimer_timeout() -> void:
+       _stop_listening(true)
+
+
+### Window
+
+func _on_visibility_changed() -> void:
+       if visible:
+               OkBtn.release_focus()
+               chosen_input = null
+               _start_listening()
+
+
+func _on_confirmed() -> void:
+       input_selected.emit(chosen_input)
+       GGS.play_sfx(GGS.SFX.INTERACT)
+
+
+### SFX
+
+func _on_AnyBtn_mouse_entered(Btn: Button) -> void:
+       GGS.play_sfx(GGS.SFX.MOUSE_OVER)
+       
+       if src.grab_focus_on_mouse_over:
+               Btn.grab_focus()
+
+
+func _on_AnyBtn_focus_entered() -> void:
+       GGS.play_sfx(GGS.SFX.FOCUS)
+
+
+func _on_CancelBtn_pressed() -> void:
+       GGS.play_sfx(GGS.SFX.INTERACT)
diff --git a/game_settings/components/_misc_components/input_confirm_window/input_confirm_window.tscn b/game_settings/components/_misc_components/input_confirm_window/input_confirm_window.tscn
new file mode 100644 (file)
index 0000000..e295140
--- /dev/null
@@ -0,0 +1,43 @@
+[gd_scene load_steps=2 format=3 uid="uid://b1btmq8y3gexs"]
+
+[ext_resource type="Script" path="res://game_settings/components/_misc_components/input_confirm_window/input_confirm_window.gd" id="1_uql0i"]
+
+[node name="InputConfirmWindow" type="ConfirmationDialog"]
+size = Vector2i(300, 118)
+min_size = Vector2i(300, 115)
+ok_button_text = "Confirm"
+dialog_close_on_escape = false
+script = ExtResource("1_uql0i")
+listening_wait_time = 0.2
+
+[node name="MainCtnr" type="VBoxContainer" parent="."]
+offset_left = 8.0
+offset_top = 8.0
+offset_right = 292.0
+offset_bottom = 69.0
+size_flags_horizontal = 3
+theme_override_constants/separation = 0
+
+[node name="ListenBtn" type="Button" parent="MainCtnr"]
+layout_mode = 2
+size_flags_vertical = 3
+text = "ddd"
+icon_alignment = 1
+expand_icon = true
+
+[node name="ListenProgress" type="ProgressBar" parent="MainCtnr"]
+visible = false
+layout_mode = 2
+max_value = 1.0
+show_percentage = false
+
+[node name="AlreadyExistsLabel" type="Label" parent="MainCtnr"]
+visible = false
+layout_mode = 2
+horizontal_alignment = 1
+
+[node name="ListenTimer" type="Timer" parent="."]
+one_shot = true
+
+[node name="MaxListenTimer" type="Timer" parent="."]
+one_shot = true
diff --git a/game_settings/components/_misc_components/reset_btn/reset_btn.gd b/game_settings/components/_misc_components/reset_btn/reset_btn.gd
new file mode 100644 (file)
index 0000000..563c6d4
--- /dev/null
@@ -0,0 +1,26 @@
+extends Button
+
+@export var group: String
+@export var grab_focus_on_mouse_over: bool
+
+
+func _ready() -> void:
+       pressed.connect(_on_pressed)
+       mouse_entered.connect(_on_mouse_entered)
+       focus_entered.connect(_on_focus_entered)
+
+
+func _on_pressed() -> void:
+       get_tree().call_group(group, "reset_setting")
+       GGS.play_sfx(GGS.SFX.INTERACT)
+
+
+func _on_mouse_entered() -> void:
+       GGS.play_sfx(GGS.SFX.MOUSE_OVER)
+       
+       if grab_focus_on_mouse_over:
+               grab_focus()
+
+
+func _on_focus_entered() -> void:
+       GGS.play_sfx(GGS.SFX.FOCUS)
diff --git a/game_settings/components/_misc_components/reset_btn/reset_btn.tscn b/game_settings/components/_misc_components/reset_btn/reset_btn.tscn
new file mode 100644 (file)
index 0000000..77db991
--- /dev/null
@@ -0,0 +1,11 @@
+[gd_scene load_steps=2 format=3]
+
+[ext_resource type="Script" path="res://game_settings/components/_misc_components/reset_btn/reset_btn.gd" id="1_pchyd"]
+
+[node name="ResetBtn" type="Button"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_pchyd")
diff --git a/game_settings/components/_shared_scripts/binary_selection.gd b/game_settings/components/_shared_scripts/binary_selection.gd
new file mode 100644 (file)
index 0000000..025be13
--- /dev/null
@@ -0,0 +1,48 @@
+@tool
+extends ggsUIComponent
+
+@onready var Btn: Button = $Btn
+
+
+func _ready() -> void:
+       compatible_types = [TYPE_BOOL]
+       if Engine.is_editor_hint():
+               return
+       
+       super()
+       Btn.toggled.connect(_on_Btn_toggled)
+       Btn.mouse_entered.connect(_on_Btn_mouse_entered)
+       Btn.focus_entered.connect(_on_Btn_focus_entered)
+
+
+func init_value() -> void:
+       super()
+       Btn.set_pressed_no_signal(setting_value)
+
+
+func _on_Btn_toggled(btn_state: bool) -> void:
+       setting_value = btn_state
+       GGS.play_sfx(GGS.SFX.INTERACT)
+       
+       if apply_on_change:
+               apply_setting()
+
+
+### Setting
+
+func reset_setting() -> void:
+       super()
+       Btn.set_pressed_no_signal(setting_value)
+
+
+### SFX
+
+func _on_Btn_mouse_entered() -> void:
+       GGS.play_sfx(GGS.SFX.MOUSE_OVER)
+       
+       if grab_focus_on_mouse_over:
+               Btn.grab_focus()
+
+
+func _on_Btn_focus_entered() -> void:
+       GGS.play_sfx(GGS.SFX.FOCUS)
diff --git a/game_settings/components/arrow_list/arrow_list.gd b/game_settings/components/arrow_list/arrow_list.gd
new file mode 100644 (file)
index 0000000..8764d26
--- /dev/null
@@ -0,0 +1,96 @@
+@tool
+extends ggsUIComponent
+signal option_selected(option_index: int)
+
+@export_category("ArrowList")
+@export var options: PackedStringArray
+@export var option_ids: PackedInt32Array
+
+@onready var LeftBtn: Button = $HBox/LeftBtn
+@onready var OptionLabel: Label = $HBox/OptionLabel
+@onready var RightBtn: Button = $HBox/RightBtn
+
+
+func _ready() -> void:
+       compatible_types = [TYPE_BOOL, TYPE_INT]
+       if Engine.is_editor_hint():
+               return
+       
+       super()
+       option_selected.connect(_on_option_selected)
+       LeftBtn.pressed.connect(_on_LeftBtn_pressed)
+       RightBtn.pressed.connect(_on_RightBtn_pressed)
+       
+       LeftBtn.mouse_entered.connect(_on_AnyBtn_mouse_entered.bind(LeftBtn))
+       RightBtn.mouse_entered.connect(_on_AnyBtn_mouse_entered.bind(RightBtn))
+       LeftBtn.focus_entered.connect(_on_AnyBtn_focus_entered)
+       RightBtn.focus_entered.connect(_on_AnyBtn_focus_entered)
+
+
+func init_value() -> void:
+       super()
+       
+       if not option_ids.is_empty():
+               var option_index: int = option_ids.find(setting_value)
+               select(option_index, false)
+       else:
+               select(setting_value, false)
+
+
+func _on_option_selected(_option_index: int) -> void:
+       if apply_on_change:
+               apply_setting()
+
+
+### Interaction
+
+func select(index: int, emit_selected: bool = true) -> void:
+       index = index % options.size()
+       
+       OptionLabel.text = options[index]
+       
+       if not option_ids.is_empty():
+               setting_value = option_ids[index]
+       else:
+               setting_value = index
+       
+       if emit_selected:
+               option_selected.emit(index)
+
+
+func _on_LeftBtn_pressed() -> void:
+       if option_ids.is_empty():
+               select(setting_value - 1)
+       else:
+               select(option_ids.find(setting_value) - 1)
+       
+       GGS.play_sfx(GGS.SFX.INTERACT)
+
+
+func _on_RightBtn_pressed() -> void:
+       if option_ids.is_empty():
+               select(setting_value + 1)
+       else:
+               select(option_ids.find(setting_value) + 1)
+       
+       GGS.play_sfx(GGS.SFX.INTERACT)
+
+
+### Setting
+
+func reset_setting() -> void:
+       select(setting.default)
+       apply_setting()
+
+
+### SFX
+
+func _on_AnyBtn_mouse_entered(Btn: Button) -> void:
+       GGS.play_sfx(GGS.SFX.MOUSE_OVER)
+       
+       if grab_focus_on_mouse_over:
+               Btn.grab_focus()
+
+
+func _on_AnyBtn_focus_entered() -> void:
+       GGS.play_sfx(GGS.SFX.FOCUS)
diff --git a/game_settings/components/arrow_list/arrow_list.tscn b/game_settings/components/arrow_list/arrow_list.tscn
new file mode 100644 (file)
index 0000000..7039168
--- /dev/null
@@ -0,0 +1,24 @@
+[gd_scene load_steps=2 format=3 uid="uid://1qpe22ky2s6y"]
+
+[ext_resource type="Script" path="res://game_settings/components/arrow_list/arrow_list.gd" id="1_cifu3"]
+
+[node name="ArrowList" type="MarginContainer"]
+offset_left = 143.0
+offset_right = 143.0
+offset_bottom = 40.0
+script = ExtResource("1_cifu3")
+
+[node name="HBox" type="HBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="LeftBtn" type="Button" parent="HBox"]
+layout_mode = 2
+text = "<"
+
+[node name="OptionLabel" type="Label" parent="HBox"]
+layout_mode = 2
+text = "OptionLabel"
+
+[node name="RightBtn" type="Button" parent="HBox"]
+layout_mode = 2
+text = ">"
diff --git a/game_settings/components/checkbox/checkbox.tscn b/game_settings/components/checkbox/checkbox.tscn
new file mode 100644 (file)
index 0000000..fb2ba93
--- /dev/null
@@ -0,0 +1,11 @@
+[gd_scene load_steps=2 format=3 uid="uid://bhkyf3l4ee800"]
+
+[ext_resource type="Script" path="res://game_settings/components/_shared_scripts/binary_selection.gd" id="1_8vlbr"]
+
+[node name="Checkbox" type="MarginContainer"]
+offset_right = 40.0
+offset_bottom = 40.0
+script = ExtResource("1_8vlbr")
+
+[node name="Btn" type="CheckBox" parent="."]
+layout_mode = 2
diff --git a/game_settings/components/input_btn/input_btn.gd b/game_settings/components/input_btn/input_btn.gd
new file mode 100644 (file)
index 0000000..959f30f
--- /dev/null
@@ -0,0 +1,113 @@
+@tool
+extends ggsUIComponent
+
+@export var ICW: ConfirmationDialog
+@export var accept_modifiers: bool
+@export var accept_mouse: bool
+@export var accept_axis: bool
+
+@export_group("Icon")
+@export var use_icons: bool
+@export var icon_db: ggsIconDB
+
+var type: ggsInputHelper.InputType = ggsInputHelper.InputType.INVALID
+var input_helper: ggsInputHelper = ggsInputHelper.new()
+
+@onready var Btn: Button = $Btn
+
+
+func _ready() -> void:
+       compatible_types = [TYPE_ARRAY]
+       if Engine.is_editor_hint():
+               return
+       
+       super()
+       Btn.pressed.connect(_on_Btn_pressed)
+       ICW.input_selected.connect(_on_ICW_input_selected)
+       Input.joy_connection_changed.connect(_on_Input_joy_connection_changed)
+       
+       Btn.mouse_entered.connect(_on_Btn_mouse_entered)
+       Btn.focus_entered.connect(_on_Btn_focus_entered)
+
+
+func init_value() -> void:
+       super()
+       var event: InputEvent = input_helper.create_event_from_type(setting_value[0])
+       
+       type = input_helper.get_event_type(event)
+       
+       input_helper.set_event_id(event, setting_value[1])
+       _set_btn_text_or_icon(event)
+
+
+func _on_Btn_pressed() -> void:
+       ICW.src = self
+       ICW.type = type
+       ICW.accept_mouse = accept_mouse
+       ICW.accept_modifiers = accept_modifiers
+       ICW.accept_axis = accept_axis
+       ICW.use_icons = use_icons
+       ICW.popup_centered()
+       
+       GGS.play_sfx(GGS.SFX.FOCUS)
+
+
+func _on_ICW_input_selected(event: InputEvent) -> void:
+       if ICW.src != self:
+               return
+       
+       setting_value = [input_helper.get_event_type(event), input_helper.get_event_id(event)]
+       _set_btn_text_or_icon(event)
+       
+       if apply_on_change:
+               apply_setting()
+
+
+### Button Text or Icon
+
+func _set_btn_text_or_icon(event: InputEvent) -> void:
+       if (
+               use_icons and
+               (type == ggsInputHelper.InputType.MOUSE or
+               type == ggsInputHelper.InputType.GP_BTN or
+               type == ggsInputHelper.InputType.GP_MOTION)
+       ):
+               Btn.icon = input_helper.get_event_as_icon(event, icon_db)
+               
+               if Btn.icon == null:
+                       Btn.text = input_helper.get_event_as_text(event)
+               else:
+                       Btn.text = ""
+               
+               return
+       
+       Btn.icon = null
+       Btn.text = input_helper.get_event_as_text(event)
+
+
+func _on_Input_joy_connection_changed(_device: int, _connected: bool) -> void:
+       var event: InputEvent = input_helper.create_event_from_type(setting_value[0])
+       input_helper.set_event_id(event, setting_value[1])
+       _set_btn_text_or_icon(event)
+
+
+### Setting
+
+func reset_setting() -> void:
+       super()
+       var event: InputEvent = input_helper.create_event_from_type(setting_value[0])
+       input_helper.set_event_id(event, setting_value[1])
+       _set_btn_text_or_icon(event)
+
+
+### SFX
+
+func _on_Btn_mouse_entered() -> void:
+       GGS.play_sfx(GGS.SFX.MOUSE_OVER)
+       
+       if grab_focus_on_mouse_over:
+               Btn.grab_focus()
+
+
+func _on_Btn_focus_entered() -> void:
+       GGS.play_sfx(GGS.SFX.FOCUS)
diff --git a/game_settings/components/input_btn/input_btn.tscn b/game_settings/components/input_btn/input_btn.tscn
new file mode 100644 (file)
index 0000000..1f52cf8
--- /dev/null
@@ -0,0 +1,18 @@
+[gd_scene load_steps=2 format=3 uid="uid://dm1av7skxvp1j"]
+
+[ext_resource type="Script" path="res://game_settings/components/input_btn/input_btn.gd" id="1_roqsf"]
+
+[node name="InputBtn" type="MarginContainer"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_roqsf")
+
+[node name="Btn" type="Button" parent="."]
+custom_minimum_size = Vector2(100, 0)
+layout_mode = 2
+text_overrun_behavior = 3
+clip_text = true
+icon_alignment = 1
diff --git a/game_settings/components/option_list/option_list.gd b/game_settings/components/option_list/option_list.gd
new file mode 100644 (file)
index 0000000..13c0999
--- /dev/null
@@ -0,0 +1,68 @@
+@tool
+extends ggsUIComponent
+
+@export var use_ids: bool = false
+
+@onready var Btn: OptionButton = $Btn
+
+
+func _ready() -> void:
+       compatible_types = [TYPE_BOOL, TYPE_INT]
+       if Engine.is_editor_hint():
+               return
+       
+       super()
+       Btn.item_selected.connect(_on_Btn_item_selected)
+       
+       Btn.pressed.connect(_on_Btn_pressed)
+       Btn.mouse_entered.connect(_on_Btn_mouse_entered)
+       Btn.focus_entered.connect(_on_Btn_focus_entered)
+       Btn.item_focused.connect(_on_Btn_item_focused)
+
+
+func init_value() -> void:
+       super()
+       
+       if use_ids:
+               Btn.select(Btn.get_item_index(setting_value))
+       else:
+               Btn.select(setting_value)
+
+
+func _on_Btn_item_selected(item_index: int) -> void:
+       GGS.play_sfx(GGS.SFX.INTERACT)
+       
+       if use_ids:
+               setting_value = Btn.get_item_id(item_index)
+       else:
+               setting_value = item_index
+       if apply_on_change:
+               apply_setting()
+
+
+### Setting
+
+func reset_setting() -> void:
+       super()
+       Btn.select(setting_value)
+
+
+### SFX
+
+func _on_Btn_pressed() -> void:
+       GGS.play_sfx(GGS.SFX.FOCUS)
+
+
+func _on_Btn_mouse_entered() -> void:
+       GGS.play_sfx(GGS.SFX.MOUSE_OVER)
+       
+       if grab_focus_on_mouse_over:
+               Btn.grab_focus()
+
+
+func _on_Btn_focus_entered() -> void:
+       GGS.play_sfx(GGS.SFX.FOCUS)
+
+
+func _on_Btn_item_focused(_index: int) -> void:
+       GGS.play_sfx(GGS.SFX.FOCUS)
diff --git a/game_settings/components/option_list/option_list.tscn b/game_settings/components/option_list/option_list.tscn
new file mode 100644 (file)
index 0000000..7bf0c1a
--- /dev/null
@@ -0,0 +1,11 @@
+[gd_scene load_steps=2 format=3 uid="uid://b7m6l0lvojrsj"]
+
+[ext_resource type="Script" path="res://game_settings/components/option_list/option_list.gd" id="1_5yk06"]
+
+[node name="OptionList" type="MarginContainer"]
+offset_right = 40.0
+offset_bottom = 40.0
+script = ExtResource("1_5yk06")
+
+[node name="Btn" type="OptionButton" parent="."]
+layout_mode = 2
diff --git a/game_settings/components/radio_list/radio_list.gd b/game_settings/components/radio_list/radio_list.gd
new file mode 100644 (file)
index 0000000..9550d7f
--- /dev/null
@@ -0,0 +1,88 @@
+@tool
+extends ggsUIComponent
+
+enum Lists {HLIST, VLIST}
+
+@export var option_ids: PackedInt32Array
+@export var active_list: Lists = Lists.HLIST
+
+var ActiveList: BoxContainer
+
+@onready var HList: HBoxContainer = $HList
+@onready var VList: VBoxContainer = $VList
+@onready var btngrp: ButtonGroup = ButtonGroup.new()
+
+
+func _ready() -> void:
+       compatible_types = [TYPE_BOOL, TYPE_INT]
+       if Engine.is_editor_hint():
+               return
+       
+       @warning_ignore("incompatible_ternary")
+       ActiveList = HList if active_list == Lists.HLIST else VList
+       
+       super()
+       btngrp.pressed.connect(_on_pressed)
+       
+       for child in ActiveList.get_children():
+               child.button_group = btngrp
+               
+               child.mouse_entered.connect(_on_AnyBtn_mouse_entered.bind(child))
+               child.focus_entered.connect(_on_AnyBtn_focus_entered)
+
+
+func init_value() -> void:
+       super()
+       
+       if not option_ids.is_empty():
+               _set_button_pressed(option_ids.find(setting_value), true)
+       else:
+               _set_button_pressed(setting_value, true)
+
+
+func _set_button_pressed(btn_index: int, pressed: bool) -> void:
+       ActiveList.get_child(btn_index).button_pressed = pressed
+
+
+func _get_child_index(target_child: BaseButton) -> int:
+       var i: int = 0
+       for child in ActiveList.get_children():
+               if child == target_child:
+                       return i
+               
+               i += 1
+       
+       return -1
+
+
+func _on_pressed(button: BaseButton) -> void:
+       GGS.play_sfx(GGS.SFX.INTERACT)
+       
+       var child_index: int = _get_child_index(button)
+       if not option_ids.is_empty():
+               setting_value = option_ids[child_index]
+       else:
+               setting_value = child_index
+       
+       if apply_on_change:
+               apply_setting()
+
+
+### Setting
+
+func reset_setting() -> void:
+       super()
+       _set_button_pressed(setting_value, true)
+
+
+### SFX
+
+func _on_AnyBtn_mouse_entered(Btn: Button) -> void:
+       GGS.play_sfx(GGS.SFX.MOUSE_OVER)
+       
+       if grab_focus_on_mouse_over:
+               Btn.grab_focus()
+
+
+func _on_AnyBtn_focus_entered() -> void:
+       GGS.play_sfx(GGS.SFX.FOCUS)
diff --git a/game_settings/components/radio_list/radio_list.tscn b/game_settings/components/radio_list/radio_list.tscn
new file mode 100644 (file)
index 0000000..2e446b6
--- /dev/null
@@ -0,0 +1,15 @@
+[gd_scene load_steps=2 format=3 uid="uid://c11tbsolk6dnu"]
+
+[ext_resource type="Script" path="res://game_settings/components/radio_list/radio_list.gd" id="1_47eay"]
+
+[node name="RadioList" type="MarginContainer"]
+offset_bottom = 648.0
+script = ExtResource("1_47eay")
+
+[node name="HList" type="HBoxContainer" parent="."]
+layout_mode = 2
+mouse_filter = 2
+
+[node name="VList" type="VBoxContainer" parent="."]
+layout_mode = 2
+mouse_filter = 2
diff --git a/game_settings/components/slider/slider.gd b/game_settings/components/slider/slider.gd
new file mode 100644 (file)
index 0000000..49f38f3
--- /dev/null
@@ -0,0 +1,47 @@
+@tool
+extends ggsUIComponent
+
+@onready var slider: HSlider = $Slider
+
+
+func _ready() -> void:
+       compatible_types = [TYPE_INT, TYPE_FLOAT]
+       if Engine.is_editor_hint():
+               return
+       
+       super()
+       slider.value_changed.connect(_on_Slider_value_changed)
+       slider.mouse_entered.connect(_on_Slider_mouse_entered)
+       slider.focus_entered.connect(_on_Slider_focus_entered)
+
+
+func init_value() -> void:
+       super()
+       slider.set_value_no_signal(setting_value)
+
+
+func _on_Slider_value_changed(new_value: float) -> void:
+       setting_value = new_value
+       
+       if apply_on_change:
+               apply_setting()
+
+
+### Setting
+
+func reset_setting() -> void:
+       super()
+       slider.value = setting_value
+
+
+### SFX
+
+func _on_Slider_mouse_entered() -> void:
+       GGS.play_sfx(GGS.SFX.MOUSE_OVER)
+       
+       if grab_focus_on_mouse_over:
+               slider.grab_focus()
+
+
+func _on_Slider_focus_entered() -> void:
+       GGS.play_sfx(GGS.SFX.FOCUS)
diff --git a/game_settings/components/slider/slider.tscn b/game_settings/components/slider/slider.tscn
new file mode 100644 (file)
index 0000000..205870f
--- /dev/null
@@ -0,0 +1,14 @@
+[gd_scene load_steps=2 format=3 uid="uid://ds06mwhee8ygm"]
+
+[ext_resource type="Script" path="res://game_settings/components/slider/slider.gd" id="1_4rmgf"]
+
+[node name="Slider" type="MarginContainer"]
+offset_right = 40.0
+offset_bottom = 40.0
+script = ExtResource("1_4rmgf")
+
+[node name="Slider" type="HSlider" parent="."]
+custom_minimum_size = Vector2(100, 0)
+layout_mode = 2
+size_flags_horizontal = 0
+size_flags_vertical = 4
diff --git a/game_settings/components/spinbox/spinbox.gd b/game_settings/components/spinbox/spinbox.gd
new file mode 100644 (file)
index 0000000..fa013a6
--- /dev/null
@@ -0,0 +1,36 @@
+@tool
+extends ggsUIComponent
+
+@onready var spin_box: SpinBox = $SpinBox
+@onready var Field: LineEdit = spin_box.get_line_edit()
+
+
+func _ready() -> void:
+       compatible_types = [TYPE_INT, TYPE_FLOAT]
+       if Engine.is_editor_hint():
+               return
+       
+       super()
+       spin_box.value_changed.connect(_on_SpinBox_value_changed)
+       Field.context_menu_enabled = false
+
+
+func init_value() -> void:
+       super()
+       spin_box.set_value_no_signal(setting_value)
+       Field.text = str(setting_value)
+
+
+func _on_SpinBox_value_changed(new_value: float) -> void:
+       setting_value = new_value
+       GGS.play_sfx(GGS.SFX.INTERACT)
+       if apply_on_change:
+               apply_setting()
+
+
+### Setting
+
+func reset_setting() -> void:
+       super()
+       spin_box.value = setting_value
+       Field.text = str(setting_value)
diff --git a/game_settings/components/spinbox/spinbox.tscn b/game_settings/components/spinbox/spinbox.tscn
new file mode 100644 (file)
index 0000000..92d12b1
--- /dev/null
@@ -0,0 +1,11 @@
+[gd_scene load_steps=2 format=3 uid="uid://bqi00h7i7sg3u"]
+
+[ext_resource type="Script" path="res://game_settings/components/spinbox/spinbox.gd" id="1_ovbvt"]
+
+[node name="SpinBox" type="MarginContainer"]
+offset_right = 40.0
+offset_bottom = 40.0
+script = ExtResource("1_ovbvt")
+
+[node name="SpinBox" type="SpinBox" parent="."]
+layout_mode = 2
diff --git a/game_settings/components/switch/switch.tscn b/game_settings/components/switch/switch.tscn
new file mode 100644 (file)
index 0000000..e79faa1
--- /dev/null
@@ -0,0 +1,14 @@
+[gd_scene load_steps=2 format=3 uid="uid://cha8xesfthpfk"]
+
+[ext_resource type="Script" path="res://game_settings/components/_shared_scripts/binary_selection.gd" id="1_tff36"]
+
+[node name="Switch" type="MarginContainer"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_tff36")
+
+[node name="Btn" type="CheckButton" parent="."]
+layout_mode = 2
diff --git a/game_settings/components/text_field/text_field.gd b/game_settings/components/text_field/text_field.gd
new file mode 100644 (file)
index 0000000..e6657f1
--- /dev/null
@@ -0,0 +1,32 @@
+@tool
+extends ggsUIComponent
+
+@onready var TextField: LineEdit = $TextField
+
+
+func _ready() -> void:
+       compatible_types = [TYPE_STRING]
+       if Engine.is_editor_hint():
+               return
+       
+       super()
+       TextField.text_submitted.connect(_on_TextField_text_submitted)
+
+
+func init_value() -> void:
+       super()
+       TextField.text = setting_value
+
+
+func _on_TextField_text_submitted(submitted_text: String) -> void:
+       setting_value = submitted_text
+       GGS.play_sfx(GGS.SFX.INTERACT)
+       if apply_on_change:
+               apply_setting()
+
+
+### Setting
+
+func reset_setting() -> void:
+       super()
+       TextField.text = setting_value
diff --git a/game_settings/components/text_field/text_field.tscn b/game_settings/components/text_field/text_field.tscn
new file mode 100644 (file)
index 0000000..38f49c7
--- /dev/null
@@ -0,0 +1,15 @@
+[gd_scene load_steps=2 format=3 uid="uid://di8r6amxunq7q"]
+
+[ext_resource type="Script" path="res://game_settings/components/text_field/text_field.gd" id="1_u6s1s"]
+
+[node name="TextField" type="MarginContainer"]
+offset_right = 40.0
+offset_bottom = 40.0
+script = ExtResource("1_u6s1s")
+
+[node name="TextField" type="LineEdit" parent="."]
+custom_minimum_size = Vector2(100, 0)
+layout_mode = 2
+context_menu_enabled = false
+caret_blink = true
+caret_blink_interval = 0.5
diff --git a/game_settings/components/toggle_btn/toggle_btn.tscn b/game_settings/components/toggle_btn/toggle_btn.tscn
new file mode 100644 (file)
index 0000000..738b396
--- /dev/null
@@ -0,0 +1,12 @@
+[gd_scene load_steps=2 format=3 uid="uid://d10row618jwcs"]
+
+[ext_resource type="Script" path="res://game_settings/components/_shared_scripts/binary_selection.gd" id="1_j77ap"]
+
+[node name="ToggleBtn" type="MarginContainer"]
+offset_right = 40.0
+offset_bottom = 40.0
+script = ExtResource("1_j77ap")
+
+[node name="Btn" type="Button" parent="."]
+layout_mode = 2
+toggle_mode = true
diff --git a/game_settings/settings/nonempty.txt b/game_settings/settings/nonempty.txt
new file mode 100644 (file)
index 0000000..baf6c62
--- /dev/null
@@ -0,0 +1,2 @@
+Prevents this directory from getting auto-deleted.
+Feel free to delete this file after adding at least one setting.
diff --git a/game_settings/templates/audio/audio_mute.gd b/game_settings/templates/audio/audio_mute.gd
new file mode 100644 (file)
index 0000000..f37b25f
--- /dev/null
@@ -0,0 +1,41 @@
+@tool
+extends ggsSetting
+
+var audio_bus: String = "None"
+
+
+func _init() -> void:
+       value_type = TYPE_BOOL
+       default = false
+
+
+func apply(value: bool) -> void:
+       if audio_bus == "None":
+               printerr("GGS - Apply Setting (audio_mute.gd): No audio bus is selected.")
+               return
+       
+       var bus_index: int = AudioServer.get_bus_index(audio_bus)
+       AudioServer.set_bus_mute(bus_index, value)
+
+
+### Bus Name
+
+func _get_property_list() -> Array:
+       var hint_string: String = ",".join(_get_audio_buses())
+       return [{
+               "name": "audio_bus",
+               "type": TYPE_STRING,
+               "usage": PROPERTY_USAGE_DEFAULT,
+               "hint": PROPERTY_HINT_ENUM,
+               "hint_string": hint_string,
+       }]
+
+
+func _get_audio_buses() -> PackedStringArray:
+       var buses: PackedStringArray = ["None"]
+       for bus_index in range(AudioServer.bus_count):
+               var bus: String = AudioServer.get_bus_name(bus_index)
+               buses.append(bus)
+       
+       return buses
+
diff --git a/game_settings/templates/audio/audio_volume.gd b/game_settings/templates/audio/audio_volume.gd
new file mode 100644 (file)
index 0000000..5049bcb
--- /dev/null
@@ -0,0 +1,44 @@
+@tool
+extends ggsSetting
+
+var audio_bus: String = "None"
+
+
+func _init() -> void:
+       value_type = TYPE_FLOAT
+       value_hint = PROPERTY_HINT_RANGE
+       value_hint_string = "0,100"
+       default = 80.0
+
+
+func apply(value: float) -> void:
+       if audio_bus == "None":
+               printerr("GGS - Apply Setting (audio_volume.gd): No audio bus is selected.")
+               return
+       
+       var bus_index: int = AudioServer.get_bus_index(audio_bus)
+       var volume_db: float = linear_to_db(value/100)
+       AudioServer.set_bus_volume_db(bus_index, volume_db)
+
+
+### Bus Name
+
+func _get_property_list() -> Array:
+       var hint_string: String = ",".join(_get_audio_buses())
+       return [{
+               "name": "audio_bus",
+               "type": TYPE_STRING,
+               "usage": PROPERTY_USAGE_DEFAULT,
+               "hint": PROPERTY_HINT_ENUM,
+               "hint_string": hint_string,
+       }]
+
+
+func _get_audio_buses() -> PackedStringArray:
+       var buses: PackedStringArray = ["None"]
+       for bus_index in range(AudioServer.bus_count):
+               var bus: String = AudioServer.get_bus_name(bus_index)
+               buses.append(bus)
+       
+       return buses
+
diff --git a/game_settings/templates/display/display_fullscreen.gd b/game_settings/templates/display/display_fullscreen.gd
new file mode 100644 (file)
index 0000000..d6e1af1
--- /dev/null
@@ -0,0 +1,23 @@
+@tool
+extends ggsSetting
+
+@export var size_setting: ggsSetting
+
+
+func _init() -> void:
+       value_type = TYPE_BOOL
+       default = false
+
+
+func apply(value: bool) -> void:
+       var window_mode: DisplayServer.WindowMode
+       match value:
+               true:
+                       window_mode = DisplayServer.WINDOW_MODE_FULLSCREEN
+               false:
+                       window_mode = DisplayServer.WINDOW_MODE_WINDOWED
+       
+       DisplayServer.window_set_mode(window_mode)
+       
+       if size_setting != null:
+               size_setting.apply(size_setting.current)
diff --git a/game_settings/templates/display/display_scale.gd b/game_settings/templates/display/display_scale.gd
new file mode 100644 (file)
index 0000000..786fa6d
--- /dev/null
@@ -0,0 +1,39 @@
+@tool
+extends ggsSetting
+
+@export var scales: Array[float]: set = set_scales
+
+
+func _init() -> void:
+       value_type = TYPE_INT
+       value_hint = PROPERTY_HINT_ENUM
+       value_hint_string = ",".join(_get_scales_strings())
+
+
+func apply(value: int) -> void:
+       var scale: float = scales[value]
+       var base_w: int = ProjectSettings.get_setting("display/window/size/viewport_width")
+       var base_h: int = ProjectSettings.get_setting("display/window/size/viewport_height")
+       var size: Vector2 = Vector2(base_w, base_h) * scale
+       size = ggsUtils.window_clamp_to_screen(size)
+
+       DisplayServer.window_set_size(size)
+       ggsUtils.center_window()
+
+
+### Scales
+
+func set_scales(value: Array[float]) -> void:
+       scales = value
+       
+       if Engine.is_editor_hint():
+               value_hint_string = ",".join(_get_scales_strings())
+               ggsUtils.get_editor_interface().call_deferred("inspect_object", self)
+
+
+func _get_scales_strings() -> PackedStringArray:
+       var scales_strings: PackedStringArray = []
+       for scale in scales:
+               scales_strings.append("x%s"%[str(scale)])
+       
+       return scales_strings
diff --git a/game_settings/templates/display/display_size.gd b/game_settings/templates/display/display_size.gd
new file mode 100644 (file)
index 0000000..65f5be1
--- /dev/null
@@ -0,0 +1,37 @@
+@tool
+extends ggsSetting
+
+@export var sizes: Array[Vector2]: set = set_sizes
+
+
+func _init() -> void:
+       value_type = TYPE_INT
+       value_hint = PROPERTY_HINT_ENUM
+       value_hint_string = ",".join(_get_sizes_strings())
+
+
+func apply(value: int) -> void:
+       var size: Vector2 = sizes[value]
+       size = ggsUtils.window_clamp_to_screen(size)
+       
+       DisplayServer.window_set_size(size)
+       ggsUtils.center_window()
+
+
+### Sizes
+
+func set_sizes(value: Array[Vector2]) -> void:
+       sizes = value
+       
+       if Engine.is_editor_hint():
+               value_hint_string = ",".join(_get_sizes_strings())
+               ggsUtils.get_editor_interface().call_deferred("inspect_object", self)
+
+
+func _get_sizes_strings() -> PackedStringArray:
+       var sizes_strings: PackedStringArray
+       for size in sizes:
+               var formatted_size: String = str(size).trim_prefix("(").trim_suffix(")").replace(",", " x")
+               sizes_strings.append(formatted_size)
+       
+       return sizes_strings
diff --git a/game_settings/templates/input.gd b/game_settings/templates/input.gd
new file mode 100644 (file)
index 0000000..3f45285
--- /dev/null
@@ -0,0 +1,96 @@
+@tool
+extends ggsSetting
+class_name ggsInputSetting
+
+var action: String
+var event_index: int
+var type: ggsInputHelper.InputType = ggsInputHelper.InputType.INVALID
+var default_as_event: InputEvent: set = set_default_as_event
+var current_as_event: InputEvent: set = set_current_as_event
+var input_helper: ggsInputHelper = ggsInputHelper.new()
+
+
+func _init() -> void:
+       read_only_values = true
+       value_type = TYPE_ARRAY
+       default = [-1, -1]
+
+
+func _get_property_list() -> Array:
+       var read_only: int =  PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_READ_ONLY
+       var allowed_event: String = _get_allowed_event_types()
+       
+       var properties: Array
+       properties.append_array([
+               {"name": "action", "type": TYPE_STRING, "usage": read_only},
+               {"name": "event_index", "type": TYPE_INT, "usage": read_only},
+               {"name": "type", "type": TYPE_INT, "usage": PROPERTY_USAGE_STORAGE, "hint": PROPERTY_HINT_ENUM, "hint_string": "None,Keyboard,Mouse,Gamepad Button,Gamepad Motion"},
+               {"name": "default_as_event", "type": TYPE_OBJECT, "usage": read_only, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": allowed_event},
+               {"name": "current_as_event", "type": TYPE_OBJECT, "usage": read_only if type == input_helper.InputType.INVALID else PROPERTY_USAGE_DEFAULT, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": allowed_event},
+       ])
+       
+       return properties
+
+
+func update_current_as_event() -> void:
+       var event: InputEvent = input_helper.create_event_from_type(current[0])
+       input_helper.set_event_id(event, current[1])
+       current_as_event = event
+
+
+func _get_allowed_event_types() -> String:
+       if type == input_helper.InputType.KEYBOARD or type == input_helper.InputType.MOUSE:
+               return "InputEventKey,InputEventMouseButton"
+       
+       if type == input_helper.InputType.GP_BTN or type == input_helper.InputType.GP_MOTION:
+               return "InputEventJoypadButton,InputEventJoypadMotion"
+       
+       return ""
+
+
+### Updating Current and Default
+
+func set_default_as_event(value: InputEvent) -> void:
+       default_as_event = value
+       
+       if not Engine.is_editor_hint():
+               return
+       
+       type = input_helper.get_event_type(value)
+       default = [type, input_helper.get_event_id(value)]
+       ggsUtils.get_editor_interface().inspect_object.call_deferred(self)
+
+
+func set_current_as_event(value: InputEvent) -> void:
+       current_as_event = value
+       
+       if not Engine.is_editor_hint():
+               return
+       
+       type = input_helper.get_event_type(current_as_event)
+       current = [type, input_helper.get_event_id(value)]
+       if value != null:
+               value.changed.connect(_on_current_event_changed)
+
+
+func _on_current_event_changed() -> void:
+       current = [type, input_helper.get_event_id(current_as_event)]
+
+
+### Applying
+
+func apply(value: Array) -> void:
+       if value.is_empty() or value[0] == -1 or value[1] == -1:
+               return
+       
+       var event: InputEvent = input_helper.create_event_from_type(value[0])
+       input_helper.set_event_id(event, value[1])
+       
+       var action_events: Array[InputEvent] = InputMap.action_get_events(action)
+       action_events.remove_at(event_index)
+       action_events.insert(event_index, event)
+       
+       InputMap.action_erase_events(action)
+       for _event_ in action_events:
+               InputMap.action_add_event(action, _event_)
+
diff --git a/icon.svg b/icon.svg
new file mode 100644 (file)
index 0000000..b370ceb
--- /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 fill="#478cbf" 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 813 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H447l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z"/><path d="M483 600c3 34 55 34 58 0v-86c-3-34-55-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..b8a3a99
--- /dev/null
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bd3eu3sx6f4oj"
+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/plain_tiles.tres b/plain_tiles.tres
new file mode 100644 (file)
index 0000000..0d6d582
--- /dev/null
@@ -0,0 +1,166 @@
+[gd_resource type="MeshLibrary" load_steps=31 format=3 uid="uid://didmc6xrsyrne"]
+
+[ext_resource type="Texture2D" uid="uid://d2lh2trm3byf3" path="res://addons/kenney_prototype_textures/green/texture_01.png" id="1_is887"]
+[ext_resource type="Texture2D" uid="uid://dggrurnpvwkr8" path="res://addons/kenney_prototype_textures/dark/texture_01.png" id="2_p8ynw"]
+[ext_resource type="Texture2D" uid="uid://cf5bbls5mxns4" path="res://addons/kenney_prototype_textures/orange/texture_01.png" id="3_p3l7b"]
+[ext_resource type="Texture2D" uid="uid://bosq5s8lcucvl" path="res://addons/kenney_prototype_textures/purple/texture_01.png" id="4_q0u54"]
+[ext_resource type="Texture2D" uid="uid://d0d3ij542x0sn" path="res://addons/kenney_prototype_textures/red/texture_01.png" id="5_p61g1"]
+[ext_resource type="Texture2D" uid="uid://co8yg2utkkebc" path="res://addons/kenney_prototype_textures/light/texture_01.png" id="6_0d6fq"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ujftc"]
+albedo_texture = ExtResource("1_is887")
+
+[sub_resource type="QuadMesh" id="QuadMesh_41vdq"]
+material = SubResource("StandardMaterial3D_ujftc")
+orientation = 1
+
+[sub_resource type="Image" id="Image_pq31p"]
+data = {
+"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 219, 129, 255, 54, 219, 131, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 219, 129, 255, 78, 223, 145, 255, 96, 227, 157, 255, 85, 225, 150, 255, 68, 221, 139, 255, 56, 219, 131, 255, 51, 218, 128, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 218, 129, 255, 71, 222, 141, 255, 70, 222, 141, 255, 60, 220, 134, 255, 67, 221, 138, 255, 64, 221, 137, 255, 58, 220, 133, 255, 48, 217, 125, 255, 44, 216, 122, 255, 44, 217, 123, 255, 45, 217, 124, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 219, 126, 255, 51, 217, 126, 255, 59, 219, 133, 255, 67, 223, 141, 255, 66, 222, 140, 255, 71, 223, 142, 255, 81, 224, 149, 255, 77, 223, 146, 255, 66, 221, 139, 255, 54, 218, 130, 255, 49, 217, 126, 255, 45, 217, 123, 255, 44, 216, 122, 255, 44, 216, 121, 255, 44, 216, 120, 255, 46, 218, 122, 255, 48, 219, 124, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 217, 124, 255, 48, 216, 123, 255, 48, 216, 122, 255, 47, 215, 121, 255, 47, 215, 121, 255, 50, 216, 125, 255, 54, 218, 129, 255, 59, 220, 134, 255, 69, 222, 142, 255, 71, 223, 143, 255, 60, 220, 134, 255, 47, 217, 124, 255, 44, 216, 122, 255, 44, 216, 121, 255, 44, 216, 119, 255, 44, 216, 120, 255, 43, 215, 119, 255, 45, 217, 121, 255, 47, 218, 122, 255, 48, 219, 123, 255, 48, 218, 124, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 217, 122, 255, 47, 216, 123, 255, 46, 215, 121, 255, 46, 215, 120, 255, 45, 214, 119, 255, 44, 214, 118, 255, 45, 215, 119, 255, 46, 215, 120, 255, 46, 215, 120, 255, 47, 215, 121, 255, 49, 216, 123, 255, 47, 215, 121, 255, 45, 215, 119, 255, 44, 216, 120, 255, 46, 218, 121, 255, 46, 218, 121, 255, 45, 217, 121, 255, 44, 215, 119, 255, 43, 215, 119, 255, 44, 216, 120, 255, 46, 216, 121, 255, 46, 216, 121, 255, 46, 216, 121, 255, 48, 217, 123, 255, 48, 217, 124, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 218, 125, 255, 46, 217, 124, 255, 44, 215, 119, 255, 45, 215, 121, 255, 45, 215, 121, 255, 45, 215, 121, 255, 44, 215, 119, 255, 44, 214, 118, 255, 44, 214, 117, 255, 44, 214, 117, 255, 44, 214, 118, 255, 44, 214, 118, 255, 44, 214, 118, 255, 46, 216, 120, 255, 46, 217, 121, 255, 44, 216, 119, 255, 45, 216, 120, 255, 44, 216, 119, 255, 44, 216, 120, 255, 43, 215, 119, 255, 47, 216, 122, 255, 47, 216, 122, 255, 47, 216, 122, 255, 46, 216, 121, 255, 47, 216, 122, 255, 49, 217, 125, 255, 50, 218, 127, 255, 48, 218, 127, 255, 47, 217, 126, 255, 48, 217, 126, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 219, 128, 255, 47, 218, 127, 255, 46, 216, 123, 255, 45, 215, 120, 255, 45, 215, 120, 255, 45, 215, 120, 255, 45, 215, 120, 255, 44, 216, 120, 255, 44, 215, 119, 255, 44, 216, 120, 255, 43, 214, 119, 255, 44, 214, 119, 255, 45, 214, 119, 255, 46, 217, 121, 255, 46, 218, 122, 255, 46, 217, 122, 255, 45, 216, 121, 255, 47, 218, 122, 255, 46, 218, 122, 255, 45, 217, 120, 255, 44, 215, 119, 255, 44, 215, 119, 255, 45, 215, 120, 255, 46, 216, 121, 255, 47, 216, 122, 255, 47, 216, 122, 255, 48, 217, 124, 255, 47, 217, 124, 255, 47, 217, 123, 255, 45, 215, 120, 255, 46, 216, 123, 255, 47, 217, 123, 255, 47, 217, 124, 255, 46, 217, 123, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 216, 123, 255, 46, 215, 121, 255, 46, 215, 121, 255, 45, 215, 121, 255, 45, 215, 120, 255, 44, 214, 119, 255, 45, 216, 122, 255, 44, 216, 122, 255, 45, 216, 122, 255, 44, 216, 121, 255, 46, 217, 122, 255, 45, 217, 122, 255, 45, 216, 121, 255, 44, 215, 120, 255, 44, 216, 120, 255, 45, 217, 121, 255, 45, 216, 121, 255, 45, 216, 121, 255, 44, 215, 120, 255, 44, 216, 120, 255, 44, 215, 119, 255, 44, 216, 119, 255, 43, 215, 118, 255, 44, 216, 120, 255, 45, 217, 121, 255, 47, 218, 122, 255, 47, 218, 123, 255, 47, 218, 126, 255, 47, 218, 125, 255, 46, 216, 122, 255, 45, 215, 120, 255, 45, 215, 119, 255, 45, 215, 120, 255, 45, 216, 120, 255, 45, 216, 120, 255, 44, 216, 119, 255, 46, 217, 121, 255, 46, 217, 122, 255, 47, 218, 124, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 218, 128, 255, 48, 217, 126, 255, 47, 216, 125, 255, 46, 215, 122, 255, 46, 215, 122, 255, 45, 215, 121, 255, 45, 215, 121, 255, 45, 215, 120, 255, 45, 215, 121, 255, 45, 216, 122, 255, 45, 216, 121, 255, 44, 216, 120, 255, 43, 215, 118, 255, 44, 216, 120, 255, 45, 216, 121, 255, 45, 217, 120, 255, 42, 214, 118, 255, 45, 216, 120, 255, 44, 216, 120, 255, 45, 216, 120, 255, 44, 216, 120, 255, 46, 217, 121, 255, 46, 217, 121, 255, 45, 216, 121, 255, 44, 216, 120, 255, 44, 216, 120, 255, 48, 218, 123, 255, 48, 218, 125, 255, 47, 218, 126, 255, 46, 216, 122, 255, 45, 215, 121, 255, 45, 215, 119, 255, 45, 215, 120, 255, 45, 215, 119, 255, 46, 217, 121, 255, 46, 217, 122, 255, 46, 217, 122, 255, 45, 216, 120, 255, 44, 216, 120, 255, 45, 216, 120, 255, 45, 216, 120, 255, 45, 216, 120, 255, 45, 216, 120, 255, 47, 218, 123, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 218, 127, 255, 48, 218, 127, 255, 49, 218, 128, 255, 49, 217, 127, 255, 47, 216, 124, 255, 45, 215, 121, 255, 45, 214, 120, 255, 45, 215, 121, 255, 45, 215, 121, 255, 44, 214, 119, 255, 45, 215, 121, 255, 45, 215, 121, 255, 45, 215, 121, 255, 44, 215, 120, 255, 46, 217, 121, 255, 46, 217, 121, 255, 45, 216, 120, 255, 44, 215, 119, 255, 43, 215, 119, 255, 44, 215, 119, 255, 44, 216, 120, 255, 44, 216, 120, 255, 43, 215, 118, 255, 43, 215, 119, 255, 43, 215, 119, 255, 45, 217, 121, 255, 46, 217, 121, 255, 47, 218, 125, 255, 47, 217, 125, 255, 47, 216, 123, 255, 46, 215, 121, 255, 46, 216, 122, 255, 46, 216, 121, 255, 45, 215, 119, 255, 44, 215, 119, 255, 43, 215, 119, 255, 45, 216, 120, 255, 44, 216, 120, 255, 45, 216, 120, 255, 43, 214, 118, 255, 44, 215, 119, 255, 43, 214, 118, 255, 44, 215, 119, 255, 43, 215, 119, 255, 45, 216, 120, 255, 46, 217, 121, 255, 47, 218, 122, 255, 47, 217, 122, 255, 47, 217, 124, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 217, 125, 255, 47, 217, 125, 255, 45, 215, 121, 255, 46, 216, 122, 255, 46, 216, 123, 255, 47, 217, 124, 255, 46, 217, 124, 255, 47, 218, 127, 255, 47, 218, 127, 255, 46, 217, 125, 255, 45, 215, 122, 255, 45, 215, 121, 255, 45, 215, 121, 255, 45, 215, 121, 255, 45, 216, 122, 255, 44, 215, 119, 255, 45, 215, 120, 255, 45, 215, 119, 255, 44, 215, 119, 255, 42, 214, 118, 255, 45, 216, 120, 255, 45, 216, 120, 255, 44, 215, 120, 255, 44, 215, 119, 255, 45, 216, 120, 255, 47, 218, 122, 255, 48, 218, 123, 255, 46, 217, 123, 255, 45, 215, 121, 255, 46, 216, 122, 255, 46, 215, 122, 255, 45, 215, 122, 255, 45, 215, 120, 255, 45, 215, 120, 255, 43, 215, 119, 255, 44, 215, 119, 255, 43, 214, 118, 255, 45, 216, 120, 255, 45, 216, 120, 255, 45, 216, 120, 255, 44, 215, 119, 255, 45, 216, 120, 255, 45, 217, 121, 255, 44, 216, 120, 255, 44, 215, 119, 255, 43, 214, 118, 255, 44, 215, 119, 255, 45, 215, 120, 255, 46, 215, 121, 255, 45, 215, 120, 255, 47, 215, 122, 255, 47, 216, 123, 255, 49, 218, 126, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 218, 127, 255, 48, 218, 126, 255, 46, 216, 123, 255, 45, 215, 120, 255, 45, 215, 120, 255, 45, 215, 120, 255, 45, 215, 119, 255, 45, 216, 120, 255, 44, 216, 120, 255, 47, 218, 123, 255, 46, 218, 124, 255, 47, 218, 126, 255, 47, 217, 125, 255, 47, 217, 125, 255, 46, 216, 122, 255, 46, 216, 121, 255, 46, 215, 121, 255, 46, 216, 123, 255, 46, 216, 122, 255, 45, 215, 120, 255, 45, 215, 119, 255, 45, 215, 119, 255, 45, 216, 120, 255, 45, 216, 120, 255, 45, 216, 120, 255, 45, 216, 121, 255, 47, 218, 123, 255, 46, 217, 124, 255, 46, 216, 124, 255, 44, 214, 119, 255, 45, 215, 121, 255, 45, 215, 121, 255, 45, 215, 121, 255, 44, 215, 120, 255, 45, 216, 120, 255, 46, 217, 121, 255, 44, 216, 120, 255, 44, 215, 119, 255, 42, 214, 118, 255, 44, 215, 119, 255, 45, 216, 120, 255, 47, 218, 122, 255, 44, 215, 119, 255, 44, 215, 119, 255, 43, 215, 119, 255, 44, 215, 119, 255, 44, 215, 119, 255, 46, 216, 122, 255, 48, 216, 123, 255, 47, 216, 122, 255, 46, 215, 121, 255, 46, 215, 120, 255, 48, 216, 124, 255, 52, 218, 127, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 217, 125, 255, 46, 216, 122, 255, 46, 216, 122, 255, 45, 215, 121, 255, 45, 215, 120, 255, 44, 214, 119, 255, 45, 216, 120, 255, 44, 215, 120, 255, 45, 216, 121, 255, 44, 215, 120, 255, 45, 216, 120, 255, 45, 217, 121, 255, 46, 217, 121, 255, 45, 217, 121, 255, 45, 216, 122, 255, 47, 218, 124, 255, 47, 218, 126, 255, 47, 218, 126, 255, 46, 216, 123, 255, 46, 216, 122, 255, 45, 215, 120, 255, 45, 215, 120, 255, 45, 214, 119, 255, 45, 215, 121, 255, 46, 215, 121, 255, 46, 216, 123, 255, 46, 216, 123, 255, 47, 217, 126, 255, 47, 217, 126, 255, 45, 215, 123, 255, 45, 215, 121, 255, 44, 214, 119, 255, 45, 214, 120, 255, 44, 215, 120, 255, 45, 216, 120, 255, 43, 214, 118, 255, 44, 215, 119, 255, 43, 214, 119, 255, 43, 215, 119, 255, 43, 214, 119, 255, 45, 216, 121, 255, 47, 217, 122, 255, 46, 217, 122, 255, 45, 216, 120, 255, 45, 216, 120, 255, 45, 216, 121, 255, 44, 216, 120, 255, 44, 215, 119, 255, 43, 214, 118, 255, 44, 215, 119, 255, 45, 215, 120, 255, 46, 215, 121, 255, 47, 215, 122, 255, 50, 216, 126, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 216, 123, 255, 46, 216, 123, 255, 45, 215, 121, 255, 46, 216, 123, 255, 46, 216, 122, 255, 45, 215, 120, 255, 44, 215, 120, 255, 44, 215, 120, 255, 45, 216, 121, 255, 45, 216, 120, 255, 44, 215, 120, 255, 43, 214, 118, 255, 43, 215, 119, 255, 43, 215, 119, 255, 44, 215, 119, 255, 43, 214, 118, 255, 45, 216, 120, 255, 46, 217, 121, 255, 47, 218, 122, 255, 47, 218, 123, 255, 47, 218, 126, 255, 48, 218, 126, 255, 47, 217, 124, 255, 46, 216, 122, 255, 46, 215, 120, 255, 47, 217, 124, 255, 47, 217, 125, 255, 48, 216, 124, 255, 45, 214, 120, 255, 45, 214, 120, 255, 45, 214, 120, 255, 45, 214, 120, 255, 44, 214, 119, 255, 45, 216, 121, 255, 45, 216, 123, 255, 45, 216, 122, 255, 44, 215, 121, 255, 45, 216, 120, 255, 45, 216, 121, 255, 44, 215, 120, 255, 44, 215, 120, 255, 43, 214, 118, 255, 45, 216, 120, 255, 44, 215, 120, 255, 45, 216, 121, 255, 43, 214, 119, 255, 44, 215, 119, 255, 43, 214, 119, 255, 44, 215, 119, 255, 43, 215, 119, 255, 44, 215, 119, 255, 45, 216, 120, 255, 47, 218, 122, 255, 48, 217, 123, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 216, 124, 255, 46, 216, 123, 255, 46, 216, 122, 255, 45, 215, 121, 255, 45, 214, 120, 255, 45, 215, 121, 255, 44, 215, 119, 255, 44, 215, 119, 255, 43, 214, 118, 255, 44, 215, 119, 255, 43, 214, 119, 255, 44, 215, 119, 255, 44, 215, 119, 255, 45, 216, 120, 255, 46, 217, 121, 255, 45, 216, 120, 255, 44, 215, 119, 255, 43, 214, 118, 255, 44, 215, 119, 255, 44, 215, 120, 255, 46, 215, 121, 255, 45, 214, 120, 255, 48, 216, 123, 255, 47, 216, 124, 255, 48, 218, 126, 255, 48, 219, 128, 255, 49, 218, 128, 255, 49, 217, 128, 255, 47, 216, 125, 255, 46, 215, 122, 255, 45, 214, 121, 255, 45, 214, 121, 255, 45, 214, 120, 255, 44, 214, 119, 255, 44, 214, 119, 255, 45, 215, 121, 255, 44, 215, 121, 255, 45, 216, 120, 255, 43, 214, 118, 255, 43, 215, 119, 255, 44, 215, 120, 255, 45, 216, 120, 255, 43, 214, 118, 255, 44, 215, 119, 255, 45, 216, 120, 255, 44, 215, 120, 255, 44, 215, 119, 255, 44, 215, 120, 255, 45, 216, 120, 255, 44, 215, 120, 255, 44, 215, 120, 255, 44, 215, 119, 255, 47, 217, 122, 255, 49, 217, 123, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 217, 124, 255, 46, 217, 125, 255, 44, 214, 120, 255, 44, 214, 120, 255, 44, 214, 119, 255, 45, 214, 120, 255, 45, 214, 120, 255, 46, 217, 121, 255, 46, 217, 121, 255, 45, 216, 120, 255, 44, 215, 119, 255, 43, 215, 119, 255, 44, 215, 119, 255, 44, 216, 120, 255, 45, 216, 120, 255, 43, 215, 118, 255, 45, 216, 120, 255, 44, 215, 119, 255, 44, 215, 119, 255, 43, 214, 118, 255, 45, 215, 120, 255, 46, 215, 121, 255, 46, 215, 121, 255, 46, 215, 120, 255, 46, 215, 121, 255, 48, 216, 123, 255, 50, 218, 126, 255, 49, 217, 126, 255, 47, 216, 126, 255, 48, 217, 126, 255, 48, 216, 126, 255, 48, 216, 125, 255, 46, 214, 122, 255, 45, 214, 120, 255, 44, 214, 120, 255, 45, 214, 121, 255, 44, 214, 119, 255, 45, 214, 121, 255, 45, 214, 121, 255, 45, 214, 121, 255, 44, 214, 120, 255, 45, 215, 120, 255, 46, 216, 121, 255, 44, 215, 120, 255, 44, 215, 119, 255, 42, 213, 118, 255, 43, 214, 119, 255, 43, 215, 119, 255, 44, 215, 120, 255, 43, 214, 118, 255, 43, 214, 118, 255, 43, 214, 118, 255, 45, 215, 120, 255, 46, 217, 121, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 218, 126, 255, 47, 217, 127, 255, 46, 216, 124, 255, 45, 214, 121, 255, 44, 214, 120, 255, 44, 214, 120, 255, 44, 214, 119, 255, 44, 215, 119, 255, 43, 214, 118, 255, 45, 216, 120, 255, 44, 215, 119, 255, 44, 215, 119, 255, 42, 214, 118, 255, 44, 215, 120, 255, 45, 216, 121, 255, 45, 216, 121, 255, 44, 215, 120, 255, 45, 216, 121, 255, 46, 217, 121, 255, 45, 216, 120, 255, 44, 215, 119, 255, 43, 214, 119, 255, 45, 215, 120, 255, 45, 214, 120, 255, 46, 215, 121, 255, 46, 215, 121, 255, 48, 216, 124, 255, 47, 216, 124, 255, 46, 216, 124, 255, 45, 215, 120, 255, 45, 215, 121, 255, 46, 216, 123, 255, 46, 216, 123, 255, 46, 216, 123, 255, 46, 216, 125, 255, 47, 217, 127, 255, 46, 216, 125, 255, 46, 215, 124, 255, 44, 214, 120, 255, 45, 214, 121, 255, 45, 214, 121, 255, 46, 215, 123, 255, 44, 214, 119, 255, 44, 214, 119, 255, 44, 214, 119, 255, 44, 214, 119, 255, 43, 214, 118, 255, 44, 215, 119, 255, 45, 216, 121, 255, 44, 215, 120, 255, 43, 215, 119, 255, 44, 215, 119, 255, 46, 217, 121, 255, 47, 218, 122, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 216, 122, 255, 46, 215, 121, 255, 46, 215, 121, 255, 45, 214, 121, 255, 44, 214, 120, 255, 44, 214, 119, 255, 44, 215, 120, 255, 43, 214, 120, 255, 44, 215, 121, 255, 43, 215, 120, 255, 45, 216, 121, 255, 45, 216, 121, 255, 44, 215, 121, 255, 44, 215, 120, 255, 43, 215, 119, 255, 45, 216, 121, 255, 44, 215, 120, 255, 45, 215, 120, 255, 43, 214, 119, 255, 44, 215, 120, 255, 43, 215, 119, 255, 44, 215, 119, 255, 42, 214, 118, 255, 43, 214, 118, 255, 43, 215, 119, 255, 45, 216, 121, 255, 47, 217, 122, 255, 47, 217, 125, 255, 47, 217, 126, 255, 46, 216, 122, 255, 45, 215, 120, 255, 44, 213, 118, 255, 45, 214, 120, 255, 44, 214, 119, 255, 45, 215, 120, 255, 44, 215, 119, 255, 46, 216, 121, 255, 46, 217, 122, 255, 46, 217, 124, 255, 47, 216, 124, 255, 47, 217, 125, 255, 47, 216, 124, 255, 46, 215, 122, 255, 46, 215, 121, 255, 46, 215, 121, 255, 46, 215, 122, 255, 45, 214, 119, 255, 44, 214, 119, 255, 44, 213, 118, 255, 45, 214, 120, 255, 44, 215, 120, 255, 45, 216, 120, 255, 45, 216, 120, 255, 46, 217, 122, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 216, 125, 255, 47, 215, 124, 255, 45, 214, 121, 255, 45, 214, 121, 255, 45, 214, 121, 255, 45, 214, 120, 255, 45, 214, 120, 255, 45, 215, 120, 255, 45, 216, 122, 255, 44, 215, 121, 255, 44, 215, 120, 255, 42, 214, 118, 255, 43, 214, 119, 255, 44, 215, 120, 255, 45, 216, 121, 255, 43, 214, 118, 255, 43, 214, 119, 255, 43, 214, 119, 255, 43, 214, 119, 255, 44, 215, 119, 255, 45, 216, 120, 255, 46, 217, 121, 255, 45, 216, 120, 255, 44, 215, 120, 255, 43, 214, 119, 255, 46, 217, 121, 255, 47, 218, 123, 255, 47, 217, 125, 255, 45, 215, 122, 255, 45, 215, 121, 255, 45, 214, 120, 255, 45, 214, 119, 255, 44, 214, 118, 255, 45, 215, 120, 255, 45, 216, 121, 255, 45, 216, 121, 255, 44, 215, 120, 255, 44, 215, 119, 255, 45, 215, 120, 255, 45, 216, 120, 255, 45, 216, 120, 255, 44, 215, 119, 255, 46, 217, 122, 255, 47, 217, 124, 255, 47, 218, 127, 255, 47, 216, 124, 255, 46, 216, 123, 255, 45, 214, 120, 255, 45, 214, 120, 255, 45, 214, 119, 255, 45, 214, 120, 255, 46, 215, 122, 255, 46, 216, 122, 255, 46, 216, 123, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 218, 131, 255, 50, 217, 129, 255, 47, 215, 125, 255, 45, 214, 121, 255, 44, 213, 119, 255, 44, 214, 120, 255, 44, 214, 121, 255, 44, 213, 119, 255, 44, 214, 119, 255, 44, 214, 119, 255, 44, 214, 120, 255, 43, 214, 119, 255, 45, 216, 120, 255, 46, 217, 121, 255, 45, 216, 120, 255, 44, 215, 119, 255, 43, 214, 118, 255, 44, 215, 119, 255, 43, 215, 119, 255, 44, 215, 119, 255, 42, 214, 118, 255, 43, 214, 119, 255, 43, 214, 119, 255, 44, 215, 120, 255, 45, 216, 120, 255, 46, 217, 123, 255, 47, 216, 124, 255, 46, 215, 122, 255, 45, 215, 121, 255, 45, 215, 121, 255, 46, 215, 122, 255, 45, 214, 119, 255, 44, 214, 119, 255, 42, 213, 118, 255, 44, 215, 120, 255, 44, 215, 120, 255, 44, 215, 120, 255, 43, 214, 118, 255, 43, 214, 118, 255, 43, 214, 118, 255, 43, 214, 119, 255, 43, 214, 118, 255, 43, 214, 119, 255, 45, 216, 120, 255, 46, 217, 121, 255, 47, 217, 122, 255, 47, 216, 124, 255, 47, 217, 126, 255, 47, 216, 124, 255, 47, 216, 123, 255, 45, 215, 121, 255, 46, 216, 123, 255, 47, 216, 124, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 216, 127, 255, 49, 217, 127, 255, 47, 217, 127, 255, 46, 216, 124, 255, 45, 214, 122, 255, 45, 214, 121, 255, 45, 214, 121, 255, 44, 213, 119, 255, 45, 214, 121, 255, 44, 214, 119, 255, 44, 214, 120, 255, 44, 214, 119, 255, 44, 215, 119, 255, 42, 214, 118, 255, 43, 214, 118, 255, 43, 214, 119, 255, 43, 214, 119, 255, 43, 214, 119, 255, 44, 215, 119, 255, 45, 216, 121, 255, 47, 217, 122, 255, 46, 217, 122, 255, 45, 215, 121, 255, 45, 215, 122, 255, 45, 215, 121, 255, 45, 215, 121, 255, 44, 214, 119, 255, 45, 214, 120, 255, 44, 214, 119, 255, 43, 214, 119, 255, 43, 214, 118, 255, 43, 214, 118, 255, 44, 215, 119, 255, 43, 214, 119, 255, 44, 215, 119, 255, 44, 215, 119, 255, 46, 216, 121, 255, 44, 215, 120, 255, 44, 215, 119, 255, 42, 213, 117, 255, 43, 214, 118, 255, 44, 214, 119, 255, 45, 214, 120, 255, 45, 214, 119, 255, 46, 214, 121, 255, 47, 215, 122, 255, 48, 216, 124, 255, 49, 218, 127, 255, 49, 218, 129, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 217, 126, 255, 46, 216, 125, 255, 46, 215, 124, 255, 45, 215, 121, 255, 45, 214, 120, 255, 45, 214, 120, 255, 45, 215, 121, 255, 46, 215, 122, 255, 45, 214, 120, 255, 44, 214, 119, 255, 44, 214, 118, 255, 45, 215, 120, 255, 44, 215, 120, 255, 44, 215, 120, 255, 44, 215, 119, 255, 46, 217, 122, 255, 46, 216, 123, 255, 46, 216, 124, 255, 44, 214, 121, 255, 44, 213, 119, 255, 44, 214, 120, 255, 44, 213, 120, 255, 44, 214, 120, 255, 45, 215, 120, 255, 46, 217, 121, 255, 44, 215, 120, 255, 44, 215, 119, 255, 41, 213, 117, 255, 43, 214, 118, 255, 44, 214, 119, 255, 46, 216, 121, 255, 44, 214, 119, 255, 44, 214, 119, 255, 43, 214, 118, 255, 43, 214, 118, 255, 43, 214, 118, 255, 44, 214, 119, 255, 47, 215, 122, 255, 46, 215, 121, 255, 46, 215, 121, 255, 45, 214, 120, 255, 47, 215, 122, 255, 49, 216, 125, 255, 48, 217, 126, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 217, 124, 255, 47, 216, 124, 255, 47, 216, 124, 255, 46, 215, 122, 255, 45, 215, 121, 255, 45, 214, 120, 255, 45, 214, 120, 255, 44, 213, 118, 255, 44, 214, 119, 255, 45, 214, 119, 255, 45, 214, 120, 255, 46, 216, 122, 255, 46, 216, 124, 255, 47, 217, 127, 255, 45, 215, 124, 255, 44, 214, 121, 255, 44, 213, 118, 255, 44, 213, 120, 255, 44, 213, 119, 255, 44, 214, 119, 255, 43, 214, 118, 255, 43, 214, 119, 255, 43, 214, 119, 255, 43, 214, 119, 255, 42, 213, 118, 255, 43, 214, 119, 255, 45, 216, 121, 255, 45, 216, 121, 255, 45, 215, 120, 255, 44, 215, 120, 255, 46, 216, 121, 255, 44, 215, 120, 255, 44, 215, 119, 255, 42, 213, 117, 255, 43, 214, 119, 255, 44, 214, 119, 255, 45, 214, 120, 255, 46, 214, 120, 255, 47, 215, 123, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 217, 125, 255, 47, 217, 126, 255, 47, 216, 124, 255, 46, 215, 122, 255, 45, 214, 119, 255, 46, 215, 123, 255, 46, 216, 124, 255, 47, 215, 123, 255, 45, 214, 120, 255, 45, 214, 120, 255, 44, 213, 120, 255, 44, 213, 119, 255, 44, 213, 118, 255, 44, 214, 119, 255, 44, 215, 121, 255, 43, 214, 121, 255, 44, 215, 120, 255, 44, 214, 120, 255, 46, 216, 121, 255, 44, 214, 120, 255, 44, 214, 119, 255, 42, 213, 117, 255, 44, 215, 119, 255, 44, 215, 120, 255, 45, 215, 120, 255, 43, 214, 119, 255, 43, 214, 119, 255, 43, 214, 118, 255, 43, 214, 118, 255, 43, 214, 118, 255, 43, 213, 118, 255, 44, 214, 119, 255, 45, 216, 120, 255, 47, 217, 122, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 217, 125, 255, 47, 218, 127, 255, 48, 217, 127, 255, 48, 216, 126, 255, 46, 215, 124, 255, 45, 214, 122, 255, 45, 213, 120, 255, 45, 214, 121, 255, 44, 213, 120, 255, 44, 213, 119, 255, 44, 213, 118, 255, 44, 214, 120, 255, 43, 214, 120, 255, 44, 215, 120, 255, 42, 213, 118, 255, 42, 213, 118, 255, 43, 214, 119, 255, 45, 215, 120, 255, 43, 214, 118, 255, 43, 213, 118, 255, 44, 214, 119, 255, 43, 214, 119, 255, 44, 215, 119, 255, 44, 214, 119, 255, 45, 216, 120, 255, 44, 215, 120, 255, 44, 215, 119, 255, 42, 213, 118, 255, 45, 215, 120, 255, 47, 217, 122, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 216, 126, 255, 47, 215, 125, 255, 45, 214, 122, 255, 44, 213, 119, 255, 44, 213, 119, 255, 44, 213, 120, 255, 44, 213, 119, 255, 44, 213, 119, 255, 44, 213, 120, 255, 44, 213, 119, 255, 43, 213, 120, 255, 44, 214, 119, 255, 46, 216, 121, 255, 44, 215, 120, 255, 44, 214, 119, 255, 42, 213, 117, 255, 43, 213, 118, 255, 43, 214, 118, 255, 44, 214, 119, 255, 43, 213, 118, 255, 42, 213, 118, 255, 42, 213, 118, 255, 43, 214, 119, 255, 45, 215, 120, 255, 46, 216, 122, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 215, 124, 255, 47, 217, 127, 255, 46, 215, 125, 255, 45, 214, 123, 255, 44, 213, 119, 255, 44, 213, 121, 255, 44, 213, 119, 255, 45, 214, 121, 255, 44, 213, 119, 255, 44, 213, 119, 255, 44, 213, 119, 255, 44, 214, 118, 255, 43, 213, 118, 255, 42, 213, 118, 255, 44, 215, 119, 255, 43, 214, 119, 255, 43, 214, 119, 255, 43, 214, 118, 255, 45, 215, 120, 255, 46, 217, 121, 255, 46, 216, 122, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 216, 124, 255, 46, 216, 125, 255, 46, 215, 124, 255, 46, 215, 123, 255, 45, 214, 120, 255, 45, 214, 120, 255, 45, 214, 120, 255, 46, 215, 122, 255, 45, 214, 120, 255, 44, 213, 119, 255, 43, 212, 117, 255, 44, 213, 119, 255, 44, 214, 119, 255, 44, 215, 119, 255, 44, 214, 119, 255, 45, 215, 121, 255, 46, 216, 122, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 216, 123, 255, 47, 216, 125, 255, 46, 216, 123, 255, 45, 215, 121, 255, 45, 214, 120, 255, 44, 213, 119, 255, 44, 213, 119, 255, 44, 213, 118, 255, 45, 214, 120, 255, 45, 214, 120, 255, 45, 215, 123, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 216, 123, 255, 47, 217, 126, 255, 46, 216, 124, 255, 46, 215, 123, 255, 45, 214, 119, 255, 45, 214, 121, 255, 46, 215, 124, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 217, 126, 255, 48, 217, 128, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+"format": "RGBA8",
+"height": 64,
+"mipmaps": false,
+"width": 64
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_ue3m6"]
+image = SubResource("Image_pq31p")
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_feaqb"]
+albedo_texture = ExtResource("2_p8ynw")
+
+[sub_resource type="QuadMesh" id="QuadMesh_w2xko"]
+material = SubResource("StandardMaterial3D_feaqb")
+orientation = 1
+
+[sub_resource type="Image" id="Image_omm5m"]
+data = {
+"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 71, 255, 66, 67, 70, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 69, 255, 63, 64, 66, 255, 60, 62, 63, 255, 61, 63, 65, 255, 62, 64, 65, 255, 63, 65, 67, 255, 64, 65, 67, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 69, 255, 62, 64, 66, 255, 60, 62, 64, 255, 59, 61, 62, 255, 58, 61, 62, 255, 59, 61, 62, 255, 61, 62, 63, 255, 62, 63, 64, 255, 63, 63, 64, 255, 64, 64, 65, 255, 64, 64, 66, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 68, 255, 63, 64, 67, 255, 60, 62, 64, 255, 60, 62, 63, 255, 59, 61, 62, 255, 59, 61, 62, 255, 58, 60, 61, 255, 60, 62, 62, 255, 60, 62, 63, 255, 60, 62, 63, 255, 60, 62, 62, 255, 62, 62, 63, 255, 61, 62, 63, 255, 62, 62, 63, 255, 63, 63, 63, 255, 64, 64, 65, 255, 65, 64, 66, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 68, 255, 64, 65, 67, 255, 61, 63, 65, 255, 60, 62, 63, 255, 60, 62, 63, 255, 59, 61, 62, 255, 59, 61, 62, 255, 59, 61, 62, 255, 60, 61, 62, 255, 61, 62, 63, 255, 60, 62, 62, 255, 59, 61, 62, 255, 59, 60, 61, 255, 60, 61, 62, 255, 60, 62, 62, 255, 60, 61, 62, 255, 59, 60, 61, 255, 62, 62, 63, 255, 63, 63, 64, 255, 65, 64, 65, 255, 65, 65, 66, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 66, 255, 62, 64, 66, 255, 60, 62, 63, 255, 59, 62, 63, 255, 59, 61, 62, 255, 58, 60, 61, 255, 58, 60, 61, 255, 60, 61, 62, 255, 60, 61, 62, 255, 58, 60, 61, 255, 61, 61, 63, 255, 60, 61, 62, 255, 61, 61, 63, 255, 60, 61, 62, 255, 63, 63, 63, 255, 62, 62, 63, 255, 60, 61, 62, 255, 58, 60, 61, 255, 59, 61, 61, 255, 59, 61, 62, 255, 62, 62, 63, 255, 64, 63, 64, 255, 64, 63, 64, 255, 66, 65, 66, 255, 65, 65, 66, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 68, 255, 62, 64, 66, 255, 58, 60, 62, 255, 59, 61, 63, 255, 59, 61, 63, 255, 59, 62, 63, 255, 60, 61, 63, 255, 64, 62, 64, 255, 62, 62, 64, 255, 61, 61, 63, 255, 59, 61, 62, 255, 59, 60, 62, 255, 60, 61, 62, 255, 62, 61, 63, 255, 62, 61, 63, 255, 59, 60, 61, 255, 59, 60, 62, 255, 58, 60, 61, 255, 59, 61, 62, 255, 58, 60, 61, 255, 62, 62, 63, 255, 63, 62, 63, 255, 64, 63, 64, 255, 63, 63, 63, 255, 64, 63, 64, 255, 67, 66, 67, 255, 68, 67, 69, 255, 66, 67, 70, 255, 65, 66, 69, 255, 65, 66, 68, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 70, 255, 62, 65, 68, 255, 59, 62, 64, 255, 58, 61, 63, 255, 58, 60, 62, 255, 58, 60, 62, 255, 60, 61, 63, 255, 60, 61, 62, 255, 60, 60, 62, 255, 61, 61, 63, 255, 60, 61, 62, 255, 60, 61, 62, 255, 58, 60, 61, 255, 61, 61, 63, 255, 62, 62, 63, 255, 62, 62, 63, 255, 60, 61, 62, 255, 61, 61, 62, 255, 61, 61, 63, 255, 61, 61, 62, 255, 59, 61, 62, 255, 59, 61, 61, 255, 61, 61, 62, 255, 62, 62, 63, 255, 64, 63, 64, 255, 65, 64, 65, 255, 66, 66, 67, 255, 64, 65, 68, 255, 63, 64, 66, 255, 60, 62, 63, 255, 60, 62, 64, 255, 61, 63, 64, 255, 62, 64, 66, 255, 63, 64, 66, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 65, 66, 255, 63, 62, 64, 255, 61, 61, 62, 255, 60, 61, 63, 255, 59, 61, 62, 255, 58, 60, 61, 255, 60, 61, 63, 255, 60, 62, 64, 255, 61, 62, 64, 255, 60, 61, 63, 255, 63, 62, 64, 255, 62, 61, 64, 255, 61, 61, 63, 255, 61, 61, 63, 255, 61, 61, 63, 255, 61, 61, 63, 255, 61, 61, 63, 255, 61, 61, 62, 255, 59, 60, 61, 255, 59, 60, 62, 255, 59, 61, 62, 255, 60, 61, 62, 255, 58, 60, 61, 255, 60, 62, 62, 255, 61, 62, 63, 255, 64, 64, 65, 255, 64, 64, 65, 255, 64, 65, 68, 255, 62, 64, 66, 255, 60, 62, 63, 255, 59, 61, 62, 255, 58, 60, 61, 255, 58, 60, 61, 255, 60, 61, 62, 255, 62, 62, 63, 255, 61, 62, 63, 255, 63, 63, 64, 255, 63, 63, 64, 255, 64, 64, 66, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 67, 70, 255, 65, 66, 68, 255, 63, 63, 66, 255, 62, 62, 64, 255, 63, 63, 65, 255, 62, 62, 63, 255, 61, 60, 62, 255, 59, 60, 61, 255, 60, 61, 63, 255, 60, 62, 64, 255, 61, 61, 64, 255, 61, 61, 63, 255, 59, 60, 61, 255, 59, 60, 62, 255, 61, 61, 63, 255, 61, 61, 63, 255, 58, 60, 61, 255, 60, 61, 62, 255, 60, 61, 62, 255, 61, 61, 62, 255, 60, 61, 62, 255, 61, 62, 62, 255, 61, 62, 63, 255, 60, 62, 63, 255, 59, 61, 62, 255, 61, 62, 63, 255, 65, 64, 65, 255, 65, 65, 67, 255, 64, 65, 68, 255, 60, 62, 64, 255, 59, 62, 63, 255, 58, 61, 62, 255, 59, 61, 62, 255, 58, 60, 61, 255, 60, 61, 62, 255, 61, 62, 63, 255, 60, 62, 63, 255, 59, 61, 62, 255, 60, 61, 62, 255, 60, 61, 62, 255, 60, 61, 62, 255, 62, 62, 63, 255, 63, 62, 63, 255, 64, 64, 65, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 70, 255, 67, 68, 71, 255, 66, 67, 69, 255, 67, 67, 68, 255, 65, 64, 66, 255, 62, 62, 63, 255, 61, 61, 62, 255, 59, 61, 63, 255, 59, 61, 63, 255, 58, 60, 62, 255, 59, 61, 62, 255, 58, 61, 62, 255, 59, 61, 63, 255, 60, 61, 62, 255, 63, 61, 63, 255, 62, 61, 63, 255, 61, 61, 62, 255, 59, 60, 61, 255, 58, 60, 61, 255, 59, 60, 62, 255, 59, 61, 62, 255, 59, 61, 61, 255, 58, 60, 61, 255, 59, 61, 62, 255, 59, 61, 62, 255, 62, 62, 63, 255, 65, 64, 65, 255, 65, 65, 67, 255, 64, 65, 68, 255, 62, 63, 65, 255, 60, 62, 63, 255, 59, 61, 62, 255, 59, 61, 62, 255, 59, 60, 62, 255, 59, 60, 61, 255, 59, 60, 61, 255, 61, 61, 62, 255, 60, 61, 62, 255, 59, 61, 62, 255, 58, 60, 61, 255, 59, 61, 62, 255, 60, 61, 62, 255, 60, 61, 62, 255, 58, 60, 61, 255, 61, 62, 62, 255, 62, 63, 63, 255, 63, 63, 64, 255, 65, 64, 65, 255, 65, 65, 66, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 68, 255, 64, 65, 67, 255, 60, 62, 63, 255, 61, 63, 64, 255, 61, 63, 64, 255, 63, 64, 66, 255, 63, 64, 66, 255, 64, 66, 69, 255, 63, 65, 69, 255, 61, 64, 67, 255, 59, 62, 64, 255, 58, 61, 63, 255, 58, 61, 62, 255, 60, 61, 62, 255, 61, 61, 63, 255, 61, 60, 61, 255, 61, 61, 62, 255, 61, 60, 62, 255, 60, 60, 62, 255, 58, 60, 61, 255, 60, 61, 62, 255, 60, 61, 62, 255, 60, 61, 62, 255, 60, 61, 62, 255, 61, 62, 63, 255, 64, 64, 64, 255, 65, 64, 65, 255, 63, 64, 66, 255, 62, 63, 65, 255, 60, 62, 63, 255, 59, 61, 63, 255, 59, 61, 63, 255, 57, 60, 61, 255, 58, 60, 61, 255, 58, 60, 61, 255, 60, 61, 62, 255, 59, 60, 61, 255, 61, 61, 63, 255, 61, 61, 63, 255, 61, 61, 62, 255, 60, 61, 62, 255, 61, 61, 62, 255, 61, 62, 63, 255, 59, 61, 62, 255, 59, 60, 61, 255, 58, 60, 61, 255, 59, 61, 62, 255, 61, 61, 62, 255, 63, 62, 63, 255, 63, 62, 63, 255, 64, 64, 64, 255, 65, 64, 65, 255, 67, 67, 68, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 68, 255, 63, 65, 67, 255, 60, 62, 64, 255, 59, 61, 63, 255, 58, 61, 62, 255, 58, 61, 61, 255, 60, 61, 62, 255, 62, 62, 63, 255, 62, 63, 64, 255, 64, 64, 65, 255, 64, 64, 66, 255, 64, 65, 67, 255, 63, 64, 67, 255, 63, 64, 66, 255, 63, 63, 64, 255, 63, 62, 64, 255, 62, 62, 63, 255, 62, 62, 63, 255, 62, 61, 62, 255, 61, 61, 62, 255, 59, 60, 62, 255, 58, 60, 61, 255, 60, 62, 63, 255, 60, 62, 63, 255, 60, 62, 63, 255, 62, 63, 64, 255, 64, 64, 66, 255, 63, 65, 67, 255, 62, 64, 66, 255, 58, 61, 62, 255, 58, 61, 62, 255, 59, 61, 63, 255, 59, 61, 63, 255, 59, 61, 63, 255, 61, 61, 63, 255, 62, 61, 63, 255, 61, 61, 63, 255, 60, 61, 62, 255, 58, 60, 61, 255, 59, 60, 62, 255, 61, 61, 63, 255, 63, 61, 64, 255, 59, 60, 61, 255, 59, 60, 61, 255, 58, 60, 61, 255, 59, 60, 61, 255, 59, 60, 61, 255, 61, 62, 62, 255, 63, 62, 63, 255, 63, 62, 63, 255, 63, 63, 63, 255, 63, 62, 63, 255, 66, 65, 66, 255, 67, 66, 68, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 66, 255, 60, 62, 64, 255, 60, 62, 63, 255, 59, 61, 62, 255, 59, 61, 62, 255, 57, 60, 61, 255, 59, 60, 61, 255, 59, 61, 62, 255, 60, 61, 62, 255, 59, 61, 62, 255, 61, 62, 63, 255, 61, 62, 63, 255, 62, 62, 63, 255, 63, 63, 63, 255, 63, 63, 64, 255, 64, 64, 66, 255, 64, 65, 67, 255, 64, 65, 68, 255, 63, 63, 64, 255, 62, 61, 62, 255, 60, 61, 62, 255, 59, 61, 63, 255, 58, 60, 61, 255, 59, 61, 62, 255, 59, 61, 63, 255, 62, 63, 65, 255, 63, 64, 66, 255, 64, 65, 68, 255, 62, 64, 67, 255, 59, 62, 64, 255, 58, 61, 63, 255, 57, 60, 61, 255, 57, 60, 61, 255, 59, 60, 62, 255, 61, 61, 63, 255, 59, 60, 61, 255, 60, 60, 62, 255, 59, 60, 62, 255, 60, 60, 62, 255, 59, 60, 61, 255, 61, 61, 63, 255, 63, 62, 64, 255, 62, 61, 63, 255, 60, 61, 62, 255, 59, 60, 61, 255, 60, 61, 62, 255, 60, 60, 62, 255, 60, 61, 62, 255, 58, 60, 61, 255, 60, 61, 62, 255, 61, 61, 62, 255, 63, 63, 64, 255, 64, 64, 64, 255, 65, 65, 66, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 67, 255, 62, 64, 65, 255, 59, 61, 62, 255, 59, 61, 63, 255, 59, 61, 62, 255, 59, 61, 62, 255, 58, 60, 62, 255, 59, 60, 61, 255, 61, 61, 62, 255, 60, 61, 62, 255, 59, 61, 61, 255, 58, 60, 61, 255, 59, 61, 62, 255, 60, 61, 62, 255, 60, 61, 62, 255, 58, 60, 61, 255, 61, 62, 62, 255, 63, 63, 63, 255, 64, 64, 65, 255, 64, 64, 66, 255, 65, 65, 68, 255, 64, 66, 68, 255, 63, 64, 66, 255, 61, 63, 65, 255, 60, 62, 63, 255, 63, 64, 66, 255, 64, 65, 67, 255, 66, 65, 67, 255, 63, 62, 64, 255, 61, 61, 62, 255, 60, 61, 62, 255, 60, 60, 62, 255, 58, 60, 61, 255, 60, 61, 63, 255, 61, 62, 65, 255, 61, 62, 64, 255, 61, 61, 63, 255, 61, 61, 63, 255, 61, 61, 63, 255, 60, 61, 63, 255, 61, 61, 63, 255, 60, 60, 62, 255, 61, 61, 62, 255, 60, 61, 62, 255, 61, 61, 62, 255, 59, 60, 61, 255, 59, 60, 61, 255, 58, 60, 61, 255, 59, 61, 62, 255, 58, 60, 61, 255, 60, 61, 62, 255, 62, 62, 63, 255, 64, 63, 64, 255, 63, 64, 65, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 67, 255, 61, 63, 64, 255, 59, 61, 62, 255, 59, 61, 62, 255, 57, 59, 60, 255, 57, 60, 60, 255, 59, 60, 61, 255, 60, 61, 62, 255, 58, 60, 61, 255, 60, 60, 62, 255, 59, 60, 61, 255, 60, 60, 62, 255, 60, 60, 62, 255, 62, 62, 63, 255, 62, 62, 63, 255, 60, 61, 62, 255, 58, 60, 61, 255, 58, 60, 61, 255, 59, 61, 61, 255, 60, 61, 62, 255, 63, 63, 63, 255, 63, 63, 63, 255, 66, 65, 66, 255, 65, 65, 66, 255, 66, 66, 68, 255, 66, 67, 70, 255, 67, 68, 70, 255, 67, 67, 69, 255, 63, 64, 66, 255, 62, 62, 64, 255, 62, 62, 64, 255, 62, 62, 63, 255, 61, 60, 61, 255, 59, 60, 61, 255, 58, 60, 61, 255, 59, 61, 63, 255, 60, 61, 63, 255, 61, 61, 63, 255, 58, 60, 61, 255, 59, 60, 61, 255, 59, 60, 62, 255, 61, 60, 62, 255, 59, 60, 61, 255, 59, 60, 61, 255, 60, 61, 62, 255, 61, 61, 62, 255, 60, 61, 62, 255, 59, 61, 61, 255, 60, 62, 62, 255, 60, 62, 62, 255, 59, 61, 62, 255, 60, 61, 62, 255, 64, 63, 64, 255, 64, 64, 66, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 67, 255, 63, 64, 67, 255, 59, 61, 63, 255, 58, 60, 62, 255, 58, 60, 62, 255, 58, 61, 62, 255, 59, 60, 62, 255, 62, 61, 63, 255, 62, 61, 63, 255, 61, 61, 63, 255, 60, 60, 62, 255, 59, 60, 61, 255, 60, 60, 62, 255, 60, 60, 62, 255, 61, 61, 62, 255, 59, 60, 61, 255, 59, 60, 61, 255, 58, 60, 61, 255, 58, 60, 61, 255, 57, 60, 60, 255, 60, 61, 61, 255, 62, 61, 62, 255, 63, 62, 63, 255, 63, 62, 63, 255, 63, 63, 63, 255, 66, 65, 66, 255, 68, 67, 68, 255, 67, 67, 69, 255, 65, 67, 70, 255, 65, 66, 69, 255, 65, 66, 68, 255, 66, 65, 67, 255, 63, 62, 64, 255, 61, 61, 63, 255, 59, 61, 62, 255, 58, 61, 63, 255, 58, 60, 62, 255, 58, 61, 62, 255, 58, 61, 63, 255, 59, 61, 63, 255, 59, 61, 62, 255, 61, 60, 62, 255, 62, 61, 63, 255, 60, 60, 62, 255, 60, 60, 61, 255, 58, 59, 60, 255, 59, 60, 61, 255, 59, 60, 61, 255, 59, 61, 61, 255, 58, 60, 61, 255, 58, 60, 61, 255, 59, 61, 61, 255, 61, 62, 63, 255, 64, 64, 64, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 68, 255, 63, 65, 68, 255, 60, 63, 65, 255, 59, 61, 63, 255, 58, 60, 62, 255, 58, 60, 62, 255, 58, 60, 62, 255, 59, 60, 62, 255, 59, 60, 61, 255, 61, 61, 62, 255, 60, 60, 62, 255, 60, 60, 62, 255, 58, 60, 61, 255, 60, 60, 62, 255, 61, 61, 63, 255, 61, 61, 63, 255, 60, 60, 62, 255, 60, 60, 62, 255, 61, 61, 62, 255, 60, 61, 62, 255, 60, 60, 61, 255, 58, 60, 61, 255, 60, 61, 61, 255, 61, 61, 62, 255, 63, 62, 63, 255, 64, 63, 64, 255, 66, 65, 66, 255, 65, 65, 67, 255, 63, 65, 67, 255, 60, 62, 63, 255, 60, 62, 63, 255, 60, 62, 64, 255, 61, 63, 65, 255, 63, 64, 66, 255, 63, 64, 67, 255, 64, 65, 69, 255, 62, 64, 67, 255, 61, 63, 66, 255, 58, 61, 62, 255, 58, 60, 62, 255, 59, 61, 62, 255, 61, 61, 63, 255, 61, 60, 61, 255, 61, 60, 62, 255, 61, 60, 61, 255, 61, 60, 61, 255, 59, 60, 61, 255, 59, 61, 61, 255, 61, 61, 62, 255, 60, 61, 62, 255, 59, 61, 62, 255, 60, 61, 62, 255, 63, 63, 64, 255, 64, 64, 65, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 66, 255, 63, 62, 64, 255, 61, 61, 62, 255, 60, 61, 62, 255, 59, 61, 63, 255, 57, 60, 61, 255, 58, 60, 62, 255, 59, 61, 63, 255, 60, 61, 63, 255, 60, 61, 62, 255, 61, 61, 63, 255, 62, 61, 64, 255, 61, 61, 63, 255, 60, 61, 62, 255, 60, 60, 62, 255, 61, 61, 63, 255, 60, 60, 62, 255, 60, 60, 62, 255, 58, 59, 61, 255, 59, 60, 61, 255, 59, 60, 61, 255, 60, 61, 62, 255, 58, 60, 61, 255, 59, 60, 61, 255, 59, 61, 62, 255, 62, 62, 63, 255, 64, 64, 65, 255, 64, 64, 67, 255, 63, 65, 67, 255, 60, 62, 63, 255, 59, 61, 62, 255, 58, 60, 61, 255, 58, 60, 61, 255, 59, 60, 61, 255, 62, 62, 63, 255, 61, 62, 62, 255, 63, 63, 64, 255, 63, 63, 64, 255, 63, 64, 66, 255, 63, 64, 66, 255, 63, 64, 67, 255, 64, 64, 66, 255, 63, 63, 64, 255, 62, 62, 63, 255, 62, 61, 62, 255, 62, 61, 62, 255, 61, 60, 61, 255, 59, 60, 61, 255, 57, 60, 61, 255, 59, 61, 62, 255, 59, 61, 62, 255, 60, 62, 62, 255, 62, 62, 63, 255, 64, 64, 65, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 65, 67, 255, 64, 64, 66, 255, 61, 61, 63, 255, 62, 62, 64, 255, 62, 62, 63, 255, 61, 60, 61, 255, 59, 60, 61, 255, 60, 61, 62, 255, 61, 61, 64, 255, 60, 61, 63, 255, 60, 61, 62, 255, 58, 59, 61, 255, 59, 60, 61, 255, 60, 60, 62, 255, 62, 61, 63, 255, 59, 60, 61, 255, 59, 60, 61, 255, 59, 60, 61, 255, 59, 60, 61, 255, 60, 60, 61, 255, 60, 61, 62, 255, 61, 62, 63, 255, 60, 62, 62, 255, 59, 61, 62, 255, 59, 60, 61, 255, 63, 63, 64, 255, 64, 64, 65, 255, 64, 65, 67, 255, 60, 62, 64, 255, 59, 61, 63, 255, 58, 61, 62, 255, 58, 60, 62, 255, 57, 60, 61, 255, 59, 60, 61, 255, 60, 61, 62, 255, 59, 61, 62, 255, 59, 61, 62, 255, 60, 61, 62, 255, 60, 61, 62, 255, 60, 61, 62, 255, 62, 62, 63, 255, 62, 62, 63, 255, 63, 63, 64, 255, 64, 64, 66, 255, 65, 65, 68, 255, 63, 64, 66, 255, 62, 62, 63, 255, 60, 61, 62, 255, 59, 61, 62, 255, 59, 61, 62, 255, 59, 61, 62, 255, 59, 61, 63, 255, 61, 63, 64, 255, 63, 64, 66, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 70, 255, 66, 66, 68, 255, 64, 64, 66, 255, 62, 61, 63, 255, 61, 60, 62, 255, 59, 61, 62, 255, 59, 61, 63, 255, 58, 60, 61, 255, 58, 60, 62, 255, 58, 60, 62, 255, 58, 60, 62, 255, 58, 60, 62, 255, 61, 60, 62, 255, 62, 61, 63, 255, 61, 61, 62, 255, 60, 60, 61, 255, 58, 59, 60, 255, 59, 60, 61, 255, 59, 60, 61, 255, 59, 60, 61, 255, 57, 59, 60, 255, 59, 61, 61, 255, 59, 61, 61, 255, 60, 61, 62, 255, 63, 63, 64, 255, 64, 64, 66, 255, 64, 65, 67, 255, 62, 64, 65, 255, 59, 61, 63, 255, 59, 61, 62, 255, 59, 61, 62, 255, 58, 60, 61, 255, 58, 60, 61, 255, 57, 59, 60, 255, 60, 61, 62, 255, 60, 61, 62, 255, 59, 61, 61, 255, 57, 59, 60, 255, 58, 60, 61, 255, 59, 61, 61, 255, 60, 61, 62, 255, 58, 60, 61, 255, 59, 60, 61, 255, 62, 62, 63, 255, 63, 63, 64, 255, 64, 64, 65, 255, 64, 64, 66, 255, 64, 65, 68, 255, 63, 64, 67, 255, 63, 64, 66, 255, 61, 63, 64, 255, 62, 64, 66, 255, 64, 65, 67, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 63, 65, 255, 64, 65, 67, 255, 63, 65, 68, 255, 61, 63, 66, 255, 59, 62, 64, 255, 58, 61, 63, 255, 58, 61, 62, 255, 58, 60, 61, 255, 60, 60, 62, 255, 60, 60, 61, 255, 61, 61, 62, 255, 60, 60, 61, 255, 61, 60, 61, 255, 58, 59, 60, 255, 58, 60, 61, 255, 59, 60, 61, 255, 59, 61, 61, 255, 59, 61, 61, 255, 60, 61, 62, 255, 62, 62, 63, 255, 64, 63, 64, 255, 63, 63, 65, 255, 62, 63, 66, 255, 61, 62, 64, 255, 58, 61, 62, 255, 59, 61, 62, 255, 57, 59, 60, 255, 57, 59, 60, 255, 58, 60, 60, 255, 59, 60, 61, 255, 58, 60, 61, 255, 59, 60, 61, 255, 60, 60, 62, 255, 60, 60, 62, 255, 60, 60, 62, 255, 60, 61, 62, 255, 62, 62, 63, 255, 59, 61, 62, 255, 58, 60, 61, 255, 57, 59, 60, 255, 58, 60, 61, 255, 59, 61, 61, 255, 62, 62, 63, 255, 63, 62, 63, 255, 64, 63, 64, 255, 65, 64, 65, 255, 66, 65, 67, 255, 67, 67, 70, 255, 67, 68, 71, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 68, 255, 62, 64, 66, 255, 61, 63, 65, 255, 62, 62, 63, 255, 62, 61, 62, 255, 62, 61, 62, 255, 61, 61, 62, 255, 61, 61, 62, 255, 61, 60, 62, 255, 60, 60, 62, 255, 58, 60, 61, 255, 59, 61, 62, 255, 60, 61, 62, 255, 60, 61, 62, 255, 60, 62, 62, 255, 64, 63, 64, 255, 63, 64, 66, 255, 63, 64, 67, 255, 59, 61, 63, 255, 58, 60, 61, 255, 58, 60, 62, 255, 58, 60, 62, 255, 58, 61, 62, 255, 60, 60, 62, 255, 63, 61, 63, 255, 61, 61, 62, 255, 60, 60, 62, 255, 57, 59, 60, 255, 59, 60, 61, 255, 59, 60, 62, 255, 62, 61, 63, 255, 59, 59, 61, 255, 58, 59, 61, 255, 58, 59, 61, 255, 58, 60, 61, 255, 58, 60, 61, 255, 59, 60, 61, 255, 62, 61, 62, 255, 62, 62, 62, 255, 63, 62, 63, 255, 63, 62, 63, 255, 64, 64, 64, 255, 67, 66, 67, 255, 66, 66, 68, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 66, 255, 64, 64, 66, 255, 64, 64, 66, 255, 62, 62, 64, 255, 61, 60, 61, 255, 60, 60, 61, 255, 59, 61, 62, 255, 58, 60, 61, 255, 58, 60, 61, 255, 58, 60, 61, 255, 60, 62, 63, 255, 62, 63, 65, 255, 63, 64, 67, 255, 63, 65, 69, 255, 60, 63, 65, 255, 58, 61, 63, 255, 57, 60, 61, 255, 57, 60, 61, 255, 57, 60, 61, 255, 60, 60, 62, 255, 59, 59, 61, 255, 60, 60, 61, 255, 59, 60, 61, 255, 59, 60, 61, 255, 58, 60, 61, 255, 59, 60, 61, 255, 61, 61, 63, 255, 61, 61, 63, 255, 61, 60, 62, 255, 59, 60, 61, 255, 60, 60, 62, 255, 60, 60, 62, 255, 60, 60, 61, 255, 57, 59, 60, 255, 59, 60, 61, 255, 60, 61, 61, 255, 63, 62, 63, 255, 63, 63, 63, 255, 65, 64, 65, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 67, 255, 64, 65, 68, 255, 62, 64, 66, 255, 61, 63, 64, 255, 59, 61, 62, 255, 61, 63, 65, 255, 63, 64, 66, 255, 64, 64, 66, 255, 63, 63, 64, 255, 61, 60, 62, 255, 60, 60, 62, 255, 59, 60, 62, 255, 57, 60, 61, 255, 58, 60, 61, 255, 60, 61, 63, 255, 60, 61, 63, 255, 60, 61, 63, 255, 60, 60, 62, 255, 62, 61, 64, 255, 60, 60, 63, 255, 60, 60, 62, 255, 59, 60, 61, 255, 60, 60, 62, 255, 60, 60, 62, 255, 61, 60, 62, 255, 59, 59, 61, 255, 58, 59, 61, 255, 58, 60, 61, 255, 59, 60, 61, 255, 58, 60, 61, 255, 58, 60, 61, 255, 60, 61, 62, 255, 62, 62, 63, 255, 64, 63, 64, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 65, 68, 255, 65, 66, 70, 255, 65, 66, 69, 255, 66, 66, 68, 255, 63, 64, 66, 255, 61, 61, 63, 255, 62, 61, 63, 255, 62, 62, 64, 255, 61, 60, 62, 255, 59, 59, 61, 255, 57, 59, 61, 255, 59, 61, 63, 255, 59, 61, 63, 255, 60, 60, 63, 255, 58, 59, 61, 255, 58, 59, 61, 255, 59, 60, 61, 255, 61, 60, 62, 255, 59, 60, 61, 255, 58, 59, 60, 255, 59, 60, 61, 255, 59, 60, 61, 255, 60, 60, 62, 255, 59, 60, 61, 255, 61, 61, 62, 255, 60, 61, 62, 255, 59, 61, 62, 255, 58, 60, 61, 255, 62, 62, 63, 255, 64, 64, 65, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 68, 255, 65, 65, 67, 255, 63, 62, 64, 255, 61, 60, 62, 255, 59, 60, 62, 255, 58, 61, 63, 255, 57, 60, 62, 255, 57, 60, 61, 255, 58, 60, 62, 255, 58, 60, 62, 255, 58, 60, 62, 255, 60, 60, 62, 255, 62, 61, 63, 255, 60, 60, 62, 255, 60, 60, 61, 255, 57, 59, 60, 255, 58, 59, 61, 255, 59, 60, 61, 255, 59, 60, 61, 255, 57, 59, 60, 255, 58, 60, 60, 255, 58, 60, 61, 255, 58, 60, 61, 255, 62, 62, 63, 255, 64, 64, 65, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 66, 255, 64, 65, 69, 255, 61, 64, 67, 255, 60, 62, 65, 255, 57, 60, 62, 255, 58, 60, 62, 255, 57, 60, 61, 255, 60, 60, 62, 255, 60, 60, 61, 255, 60, 60, 61, 255, 60, 60, 61, 255, 60, 59, 61, 255, 59, 59, 61, 255, 58, 59, 60, 255, 59, 60, 61, 255, 59, 61, 61, 255, 59, 61, 61, 255, 59, 61, 61, 255, 62, 62, 63, 255, 63, 63, 64, 255, 63, 63, 64, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 66, 255, 63, 64, 67, 255, 61, 63, 65, 255, 62, 63, 65, 255, 62, 62, 63, 255, 62, 61, 63, 255, 61, 60, 62, 255, 61, 61, 62, 255, 61, 60, 61, 255, 60, 60, 61, 255, 57, 59, 60, 255, 58, 60, 61, 255, 59, 61, 62, 255, 59, 61, 62, 255, 60, 61, 62, 255, 63, 63, 64, 255, 63, 64, 65, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 63, 65, 255, 64, 64, 67, 255, 63, 63, 65, 255, 61, 61, 62, 255, 60, 60, 61, 255, 58, 60, 62, 255, 58, 60, 61, 255, 57, 60, 61, 255, 58, 60, 61, 255, 59, 61, 63, 255, 62, 63, 65, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 65, 255, 64, 65, 68, 255, 63, 64, 66, 255, 62, 63, 65, 255, 59, 61, 63, 255, 61, 62, 64, 255, 62, 64, 66, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 66, 69, 255, 65, 66, 70, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+"format": "RGBA8",
+"height": 64,
+"mipmaps": false,
+"width": 64
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_m6jib"]
+image = SubResource("Image_omm5m")
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_t85in"]
+albedo_texture = ExtResource("3_p3l7b")
+
+[sub_resource type="QuadMesh" id="QuadMesh_5cqhl"]
+material = SubResource("StandardMaterial3D_t85in")
+orientation = 1
+
+[sub_resource type="Image" id="Image_x38t6"]
+data = {
+"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 149, 40, 255, 252, 149, 40, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 149, 41, 255, 252, 161, 64, 255, 252, 171, 81, 255, 252, 165, 70, 255, 252, 157, 55, 255, 252, 150, 42, 255, 252, 146, 39, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 149, 42, 255, 252, 159, 56, 255, 252, 159, 54, 255, 252, 153, 45, 255, 252, 157, 54, 255, 252, 160, 58, 255, 252, 154, 51, 255, 252, 145, 37, 255, 251, 143, 35, 255, 251, 143, 35, 255, 251, 143, 35, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 146, 38, 255, 251, 146, 38, 255, 251, 151, 44, 255, 251, 157, 49, 255, 251, 157, 49, 255, 251, 159, 55, 255, 251, 165, 65, 255, 251, 162, 62, 255, 251, 155, 52, 255, 251, 148, 41, 255, 251, 145, 38, 255, 251, 143, 36, 255, 251, 142, 35, 255, 251, 142, 35, 255, 251, 142, 35, 255, 251, 143, 36, 255, 251, 144, 37, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 143, 36, 255, 251, 141, 35, 255, 251, 142, 35, 255, 251, 142, 36, 255, 251, 143, 36, 255, 251, 145, 38, 255, 251, 148, 41, 255, 251, 152, 45, 255, 251, 158, 54, 255, 251, 160, 56, 255, 251, 152, 47, 255, 251, 144, 36, 255, 251, 142, 35, 255, 251, 142, 35, 255, 251, 141, 35, 255, 251, 141, 35, 255, 251, 140, 35, 255, 251, 142, 36, 255, 251, 143, 36, 255, 251, 145, 37, 255, 251, 143, 36, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 142, 36, 255, 251, 141, 36, 255, 251, 141, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 141, 35, 255, 251, 141, 35, 255, 251, 142, 35, 255, 251, 142, 36, 255, 251, 143, 37, 255, 251, 144, 39, 255, 251, 143, 37, 255, 251, 141, 35, 255, 251, 141, 35, 255, 251, 143, 36, 255, 251, 143, 36, 255, 251, 142, 36, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 141, 36, 255, 251, 141, 36, 255, 251, 141, 36, 255, 251, 141, 36, 255, 251, 143, 37, 255, 251, 144, 37, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 143, 36, 255, 251, 142, 36, 255, 251, 139, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 141, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 141, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 141, 35, 255, 251, 141, 35, 255, 251, 140, 35, 255, 251, 141, 35, 255, 251, 141, 35, 255, 251, 141, 35, 255, 251, 140, 35, 255, 251, 141, 36, 255, 251, 141, 36, 255, 251, 142, 36, 255, 251, 141, 36, 255, 251, 142, 36, 255, 251, 145, 37, 255, 251, 146, 38, 255, 251, 144, 37, 255, 251, 143, 36, 255, 251, 143, 36, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 144, 36, 255, 251, 143, 36, 255, 251, 142, 36, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 141, 35, 255, 251, 141, 35, 255, 251, 141, 35, 255, 251, 141, 35, 255, 251, 142, 35, 255, 251, 142, 35, 255, 251, 141, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 141, 35, 255, 251, 141, 35, 255, 251, 142, 36, 255, 251, 142, 36, 255, 251, 144, 37, 255, 251, 143, 36, 255, 251, 143, 36, 255, 251, 141, 35, 255, 251, 141, 36, 255, 251, 142, 36, 255, 251, 144, 36, 255, 251, 143, 36, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 142, 36, 255, 251, 139, 35, 255, 251, 139, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 139, 35, 255, 251, 141, 35, 255, 251, 141, 35, 255, 251, 141, 35, 255, 251, 140, 35, 255, 251, 141, 35, 255, 251, 141, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 141, 35, 255, 251, 141, 35, 255, 251, 141, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 141, 35, 255, 251, 141, 35, 255, 251, 140, 35, 255, 251, 141, 35, 255, 251, 142, 36, 255, 251, 144, 36, 255, 251, 143, 36, 255, 251, 144, 36, 255, 251, 144, 36, 255, 251, 142, 36, 255, 251, 141, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 141, 35, 255, 251, 142, 36, 255, 251, 141, 35, 255, 251, 142, 36, 255, 251, 142, 36, 255, 250, 143, 36, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 145, 37, 255, 251, 144, 37, 255, 251, 142, 36, 255, 251, 141, 35, 255, 251, 141, 36, 255, 251, 141, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 141, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 139, 34, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 139, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 141, 35, 255, 250, 140, 35, 255, 250, 142, 35, 255, 250, 142, 36, 255, 250, 142, 36, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 144, 36, 255, 250, 144, 36, 255, 250, 144, 36, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 142, 36, 255, 250, 141, 36, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 142, 36, 255, 250, 142, 36, 255, 250, 141, 36, 255, 250, 141, 36, 255, 250, 144, 36, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 145, 37, 255, 251, 144, 37, 255, 251, 144, 36, 255, 251, 143, 36, 255, 251, 143, 36, 255, 251, 141, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 251, 140, 35, 255, 250, 139, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 139, 34, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 139, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 142, 36, 255, 250, 143, 36, 255, 250, 144, 36, 255, 250, 144, 36, 255, 250, 143, 36, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 139, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 142, 36, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 142, 36, 255, 250, 143, 36, 255, 250, 142, 36, 255, 250, 142, 36, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 144, 36, 255, 250, 143, 36, 255, 250, 141, 35, 255, 250, 142, 35, 255, 250, 142, 36, 255, 250, 143, 36, 255, 250, 143, 36, 255, 250, 143, 36, 255, 250, 143, 36, 255, 250, 142, 36, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 139, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 139, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 142, 35, 255, 250, 143, 36, 255, 250, 143, 36, 255, 250, 142, 36, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 142, 36, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 139, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 142, 36, 255, 250, 143, 36, 255, 250, 145, 37, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 144, 36, 255, 250, 144, 36, 255, 250, 142, 36, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 143, 36, 255, 250, 143, 36, 255, 250, 143, 36, 255, 250, 143, 36, 255, 250, 143, 36, 255, 250, 142, 36, 255, 250, 142, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 142, 36, 255, 250, 143, 36, 255, 250, 142, 36, 255, 250, 141, 35, 255, 250, 139, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 140, 35, 255, 250, 141, 34, 255, 250, 139, 34, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 141, 36, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 144, 37, 255, 250, 147, 39, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 143, 36, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 139, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 142, 35, 255, 250, 142, 36, 255, 250, 143, 36, 255, 250, 142, 36, 255, 250, 142, 35, 255, 250, 143, 36, 255, 250, 144, 36, 255, 250, 144, 36, 255, 250, 142, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 142, 35, 255, 250, 142, 35, 255, 250, 142, 36, 255, 250, 143, 36, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 139, 34, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 141, 34, 255, 250, 139, 34, 255, 250, 140, 34, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 139, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 141, 36, 255, 250, 142, 36, 255, 250, 145, 38, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 143, 36, 255, 250, 142, 36, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 139, 34, 255, 250, 141, 35, 255, 250, 142, 35, 255, 250, 143, 36, 255, 250, 143, 36, 255, 250, 143, 36, 255, 250, 144, 36, 255, 250, 143, 36, 255, 250, 142, 35, 255, 250, 141, 35, 255, 250, 142, 36, 255, 250, 143, 36, 255, 250, 143, 36, 255, 250, 139, 35, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 139, 35, 255, 250, 139, 34, 255, 250, 140, 34, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 140, 34, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 142, 36, 255, 250, 144, 36, 255, 250, 144, 37, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 142, 36, 255, 250, 142, 36, 255, 250, 142, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 34, 255, 250, 139, 34, 255, 250, 140, 34, 255, 250, 139, 34, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 142, 35, 255, 250, 143, 36, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 139, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 143, 36, 255, 250, 143, 36, 255, 250, 144, 36, 255, 250, 145, 37, 255, 250, 145, 37, 255, 250, 145, 37, 255, 250, 143, 36, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 139, 35, 255, 250, 139, 35, 255, 250, 139, 34, 255, 250, 140, 35, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 140, 34, 255, 250, 139, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 143, 36, 255, 250, 144, 36, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 143, 36, 255, 250, 142, 35, 255, 250, 140, 35, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 141, 34, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 34, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 139, 34, 255, 250, 140, 34, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 139, 34, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 143, 36, 255, 250, 146, 37, 255, 250, 144, 37, 255, 250, 143, 36, 255, 250, 143, 36, 255, 250, 143, 36, 255, 250, 143, 36, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 139, 35, 255, 250, 140, 35, 255, 250, 139, 34, 255, 250, 139, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 34, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 140, 34, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 140, 35, 255, 250, 139, 34, 255, 250, 139, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 142, 36, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 143, 36, 255, 250, 143, 36, 255, 250, 141, 35, 255, 250, 140, 35, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 139, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 141, 34, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 140, 34, 255, 250, 139, 34, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 144, 36, 255, 250, 143, 36, 255, 250, 143, 36, 255, 250, 140, 35, 255, 250, 141, 35, 255, 250, 141, 35, 255, 250, 143, 36, 255, 250, 143, 36, 255, 249, 142, 36, 255, 249, 143, 36, 255, 249, 142, 35, 255, 249, 141, 35, 255, 249, 139, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 139, 34, 255, 249, 139, 35, 255, 249, 139, 35, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 140, 35, 255, 249, 141, 35, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 142, 35, 255, 249, 142, 36, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 141, 35, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 140, 35, 255, 250, 139, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 139, 34, 255, 250, 139, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 140, 35, 255, 249, 140, 35, 255, 249, 139, 34, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 142, 35, 255, 249, 143, 36, 255, 249, 143, 36, 255, 249, 144, 36, 255, 249, 142, 35, 255, 249, 140, 35, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 140, 35, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 142, 35, 255, 249, 142, 35, 255, 249, 142, 35, 255, 249, 142, 36, 255, 249, 143, 36, 255, 249, 143, 36, 255, 249, 142, 35, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 139, 35, 255, 249, 139, 34, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 141, 35, 255, 249, 141, 35, 255, 249, 143, 36, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 143, 36, 255, 250, 142, 36, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 140, 35, 255, 250, 139, 34, 255, 250, 140, 34, 255, 250, 140, 34, 255, 250, 139, 34, 255, 250, 138, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 140, 34, 255, 249, 141, 35, 255, 249, 142, 35, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 143, 36, 255, 249, 144, 36, 255, 249, 143, 36, 255, 249, 141, 35, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 142, 35, 255, 249, 142, 35, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 142, 35, 255, 249, 143, 36, 255, 249, 144, 36, 255, 249, 142, 35, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 141, 35, 255, 249, 141, 35, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 147, 38, 255, 250, 144, 37, 255, 250, 142, 36, 255, 250, 140, 35, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 141, 34, 255, 249, 141, 34, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 142, 35, 255, 249, 143, 36, 255, 249, 143, 36, 255, 249, 142, 35, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 140, 35, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 139, 34, 255, 249, 140, 35, 255, 249, 141, 35, 255, 249, 142, 35, 255, 249, 143, 36, 255, 249, 142, 35, 255, 249, 143, 36, 255, 249, 143, 36, 255, 249, 142, 36, 255, 249, 141, 35, 255, 249, 142, 35, 255, 249, 142, 36, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 145, 39, 255, 249, 144, 37, 255, 249, 143, 36, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 140, 34, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 140, 34, 255, 249, 140, 34, 255, 249, 140, 35, 255, 249, 142, 35, 255, 249, 142, 35, 255, 249, 142, 35, 255, 249, 141, 35, 255, 249, 141, 35, 255, 249, 141, 35, 255, 249, 141, 35, 255, 249, 140, 34, 255, 249, 140, 35, 255, 249, 140, 34, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 140, 35, 255, 249, 142, 35, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 139, 34, 255, 249, 141, 35, 255, 249, 142, 36, 255, 249, 143, 36, 255, 249, 145, 37, 255, 249, 145, 37, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 143, 35, 255, 249, 142, 35, 255, 249, 142, 35, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 140, 35, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 143, 35, 255, 249, 142, 35, 255, 249, 141, 35, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 140, 34, 255, 249, 141, 34, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 138, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 35, 255, 249, 140, 35, 255, 249, 141, 35, 255, 249, 140, 35, 255, 249, 142, 36, 255, 249, 144, 37, 255, 249, 144, 36, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 143, 35, 255, 249, 143, 35, 255, 249, 143, 35, 255, 249, 141, 35, 255, 249, 140, 34, 255, 249, 140, 34, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 35, 255, 249, 142, 35, 255, 249, 142, 35, 255, 249, 143, 35, 255, 249, 141, 35, 255, 249, 140, 34, 255, 249, 138, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 140, 34, 255, 249, 140, 34, 255, 249, 140, 34, 255, 249, 141, 34, 255, 249, 140, 34, 255, 249, 140, 34, 255, 249, 138, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 35, 255, 249, 141, 35, 255, 249, 142, 36, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 142, 35, 255, 249, 143, 36, 255, 249, 143, 35, 255, 249, 141, 35, 255, 249, 140, 34, 255, 249, 141, 35, 255, 249, 142, 35, 255, 249, 142, 35, 255, 249, 139, 34, 255, 249, 138, 34, 255, 249, 138, 34, 255, 249, 139, 34, 255, 249, 138, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 140, 34, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 138, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 35, 255, 249, 142, 35, 255, 249, 143, 36, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 143, 36, 255, 249, 144, 36, 255, 249, 144, 36, 255, 249, 143, 36, 255, 249, 142, 35, 255, 249, 140, 35, 255, 249, 140, 34, 255, 249, 140, 35, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 138, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 138, 33, 255, 249, 138, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 138, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 141, 35, 255, 249, 141, 35, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 141, 35, 255, 249, 143, 36, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 142, 35, 255, 249, 142, 36, 255, 249, 140, 35, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 138, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 140, 34, 255, 249, 140, 34, 255, 249, 139, 34, 255, 249, 138, 34, 255, 249, 138, 33, 255, 249, 138, 34, 255, 249, 139, 34, 255, 249, 138, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 139, 34, 255, 249, 141, 35, 255, 248, 142, 35, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 142, 35, 255, 249, 143, 35, 255, 249, 141, 35, 255, 249, 141, 34, 255, 248, 139, 34, 255, 248, 139, 34, 255, 248, 139, 34, 255, 248, 139, 34, 255, 248, 138, 34, 255, 248, 139, 34, 255, 248, 139, 34, 255, 248, 139, 34, 255, 248, 139, 34, 255, 248, 139, 34, 255, 248, 140, 34, 255, 248, 140, 34, 255, 248, 140, 34, 255, 248, 140, 34, 255, 248, 141, 35, 255, 248, 142, 35, 255, 248, 142, 35, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 141, 35, 255, 248, 142, 35, 255, 248, 141, 35, 255, 248, 142, 35, 255, 248, 141, 34, 255, 248, 140, 34, 255, 248, 140, 34, 255, 248, 140, 34, 255, 248, 140, 34, 255, 248, 139, 34, 255, 248, 138, 34, 255, 248, 139, 34, 255, 248, 140, 34, 255, 248, 140, 34, 255, 248, 140, 34, 255, 248, 142, 35, 255, 248, 142, 35, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 142, 35, 255, 248, 143, 35, 255, 248, 142, 35, 255, 248, 140, 34, 255, 248, 139, 34, 255, 248, 139, 34, 255, 248, 139, 34, 255, 248, 138, 34, 255, 248, 139, 34, 255, 248, 140, 34, 255, 248, 141, 35, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 141, 35, 255, 248, 143, 35, 255, 248, 142, 35, 255, 248, 142, 35, 255, 248, 140, 34, 255, 248, 140, 34, 255, 248, 142, 35, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 144, 36, 255, 248, 144, 36, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+"format": "RGBA8",
+"height": 64,
+"mipmaps": false,
+"width": 64
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_igtlk"]
+image = SubResource("Image_x38t6")
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_4bskr"]
+albedo_texture = ExtResource("4_q0u54")
+
+[sub_resource type="QuadMesh" id="QuadMesh_6j5y0"]
+material = SubResource("StandardMaterial3D_4bskr")
+orientation = 1
+
+[sub_resource type="Image" id="Image_0oc4e"]
+data = {
+"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 56, 247, 255, 162, 57, 247, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 59, 246, 255, 173, 80, 248, 255, 183, 97, 250, 255, 178, 88, 249, 255, 170, 73, 248, 255, 163, 62, 246, 255, 162, 57, 247, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 61, 246, 255, 172, 76, 247, 255, 172, 76, 248, 255, 166, 66, 246, 255, 169, 72, 247, 255, 169, 70, 247, 255, 165, 64, 246, 255, 159, 54, 244, 255, 156, 50, 244, 255, 157, 50, 244, 255, 158, 51, 246, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 55, 247, 255, 161, 56, 246, 255, 165, 64, 247, 255, 170, 72, 249, 255, 170, 72, 249, 255, 172, 76, 248, 255, 178, 86, 249, 255, 178, 83, 249, 255, 173, 74, 248, 255, 168, 67, 247, 255, 161, 58, 245, 255, 157, 51, 244, 255, 156, 50, 244, 255, 157, 50, 244, 255, 158, 50, 245, 255, 160, 52, 248, 255, 162, 53, 249, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 54, 247, 255, 160, 53, 245, 255, 159, 52, 245, 255, 159, 53, 245, 255, 161, 56, 246, 255, 161, 57, 246, 255, 163, 59, 246, 255, 168, 65, 247, 255, 175, 76, 249, 255, 176, 78, 249, 255, 167, 66, 246, 255, 158, 53, 244, 255, 156, 50, 244, 255, 157, 50, 244, 255, 158, 50, 245, 255, 159, 50, 246, 255, 157, 49, 245, 255, 160, 51, 247, 255, 161, 52, 248, 255, 162, 53, 249, 255, 161, 52, 248, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 51, 247, 255, 159, 52, 246, 255, 158, 51, 245, 255, 157, 50, 244, 255, 157, 49, 244, 255, 156, 49, 243, 255, 157, 50, 244, 255, 157, 50, 244, 255, 158, 51, 244, 255, 159, 52, 244, 255, 162, 57, 245, 255, 159, 54, 245, 255, 157, 50, 244, 255, 157, 50, 244, 255, 161, 51, 247, 255, 160, 51, 247, 255, 160, 51, 247, 255, 158, 50, 245, 255, 158, 50, 245, 255, 159, 50, 246, 255, 159, 51, 246, 255, 158, 50, 245, 255, 158, 50, 245, 255, 160, 52, 247, 255, 161, 52, 248, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 51, 248, 255, 159, 51, 246, 255, 157, 49, 244, 255, 158, 50, 245, 255, 158, 50, 245, 255, 158, 50, 245, 255, 158, 50, 244, 255, 159, 53, 245, 255, 157, 51, 244, 255, 156, 49, 243, 255, 156, 49, 243, 255, 156, 49, 243, 255, 156, 49, 244, 255, 159, 50, 246, 255, 159, 50, 246, 255, 157, 49, 245, 255, 158, 49, 245, 255, 158, 50, 245, 255, 158, 50, 245, 255, 158, 50, 245, 255, 159, 51, 246, 255, 160, 52, 247, 255, 160, 51, 247, 255, 159, 51, 246, 255, 160, 52, 247, 255, 162, 53, 249, 255, 162, 54, 249, 255, 161, 53, 248, 255, 161, 53, 248, 255, 162, 53, 248, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 52, 249, 255, 161, 52, 248, 255, 159, 50, 246, 255, 157, 49, 245, 255, 157, 49, 245, 255, 157, 49, 245, 255, 158, 49, 245, 255, 158, 49, 245, 255, 158, 49, 245, 255, 158, 49, 245, 255, 157, 49, 244, 255, 157, 49, 244, 255, 157, 49, 244, 255, 160, 50, 247, 255, 161, 51, 248, 255, 161, 51, 248, 255, 160, 50, 247, 255, 161, 51, 248, 255, 161, 51, 248, 255, 159, 50, 246, 255, 158, 50, 245, 255, 158, 50, 245, 255, 159, 51, 246, 255, 159, 51, 246, 255, 159, 51, 246, 255, 159, 51, 246, 255, 161, 52, 248, 255, 160, 52, 247, 255, 160, 52, 247, 255, 158, 50, 245, 255, 160, 52, 247, 255, 160, 52, 247, 255, 160, 52, 247, 255, 160, 52, 247, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 53, 247, 255, 160, 51, 246, 255, 159, 51, 246, 255, 158, 50, 245, 255, 158, 50, 245, 255, 157, 49, 244, 255, 159, 50, 246, 255, 159, 50, 246, 255, 159, 50, 246, 255, 159, 50, 245, 255, 160, 50, 247, 255, 160, 50, 247, 255, 159, 50, 246, 255, 158, 49, 245, 255, 158, 50, 245, 255, 160, 50, 247, 255, 160, 50, 247, 255, 160, 50, 247, 255, 158, 50, 245, 255, 159, 50, 246, 255, 158, 50, 245, 255, 158, 50, 245, 255, 157, 49, 244, 255, 159, 50, 246, 255, 160, 51, 246, 255, 162, 52, 248, 255, 161, 52, 248, 255, 162, 53, 248, 255, 161, 53, 248, 255, 160, 51, 247, 255, 158, 50, 245, 255, 157, 49, 244, 255, 158, 50, 245, 255, 158, 50, 245, 255, 159, 51, 246, 255, 158, 50, 245, 255, 159, 51, 246, 255, 159, 51, 246, 255, 161, 52, 248, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 54, 249, 255, 163, 53, 248, 255, 161, 52, 247, 255, 159, 51, 246, 255, 160, 51, 246, 255, 159, 50, 245, 255, 158, 50, 245, 255, 157, 50, 244, 255, 158, 49, 245, 255, 159, 50, 246, 255, 159, 50, 246, 255, 158, 49, 245, 255, 157, 49, 244, 255, 158, 49, 245, 255, 159, 50, 246, 255, 159, 50, 246, 255, 156, 49, 244, 255, 159, 50, 246, 255, 158, 50, 245, 255, 159, 50, 246, 255, 159, 50, 246, 255, 160, 51, 247, 255, 160, 51, 247, 255, 160, 51, 247, 255, 159, 50, 246, 255, 159, 50, 246, 255, 161, 52, 248, 255, 161, 52, 248, 255, 161, 52, 248, 255, 159, 50, 246, 255, 159, 50, 246, 255, 158, 50, 245, 255, 158, 50, 245, 255, 157, 49, 244, 255, 160, 51, 247, 255, 161, 52, 248, 255, 161, 52, 247, 255, 159, 50, 246, 255, 158, 50, 245, 255, 159, 51, 246, 255, 159, 51, 246, 255, 159, 50, 246, 255, 159, 51, 246, 255, 161, 52, 248, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 53, 249, 255, 163, 54, 248, 255, 164, 54, 248, 255, 164, 54, 248, 255, 161, 52, 246, 255, 158, 50, 245, 255, 157, 49, 244, 255, 158, 50, 245, 255, 158, 50, 245, 255, 156, 49, 244, 255, 158, 50, 245, 255, 157, 50, 244, 255, 158, 50, 245, 255, 158, 50, 245, 255, 160, 50, 247, 255, 161, 50, 247, 255, 159, 50, 246, 255, 158, 49, 245, 255, 157, 49, 244, 255, 158, 49, 245, 255, 158, 50, 245, 255, 158, 50, 245, 255, 157, 49, 244, 255, 158, 50, 245, 255, 158, 50, 245, 255, 160, 51, 247, 255, 161, 51, 247, 255, 162, 52, 248, 255, 162, 52, 248, 255, 160, 51, 247, 255, 159, 50, 246, 255, 159, 51, 246, 255, 159, 50, 246, 255, 158, 50, 245, 255, 158, 49, 244, 255, 157, 49, 244, 255, 159, 50, 246, 255, 159, 50, 246, 255, 159, 50, 246, 255, 157, 49, 244, 255, 158, 50, 245, 255, 157, 49, 244, 255, 158, 50, 245, 255, 158, 50, 244, 255, 159, 50, 245, 255, 160, 51, 247, 255, 161, 52, 248, 255, 161, 52, 247, 255, 160, 52, 247, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 52, 247, 255, 160, 52, 247, 255, 158, 50, 245, 255, 159, 51, 246, 255, 160, 51, 247, 255, 160, 52, 247, 255, 160, 52, 247, 255, 161, 53, 248, 255, 161, 53, 247, 255, 160, 52, 247, 255, 158, 50, 245, 255, 158, 50, 245, 255, 159, 51, 246, 255, 159, 51, 246, 255, 158, 51, 245, 255, 157, 49, 244, 255, 158, 50, 245, 255, 158, 49, 245, 255, 158, 49, 245, 255, 156, 49, 244, 255, 159, 50, 245, 255, 159, 50, 246, 255, 159, 51, 246, 255, 159, 50, 245, 255, 159, 50, 246, 255, 161, 51, 247, 255, 161, 51, 247, 255, 160, 51, 246, 255, 158, 50, 245, 255, 159, 50, 246, 255, 159, 51, 246, 255, 160, 51, 246, 255, 158, 50, 245, 255, 158, 50, 245, 255, 158, 50, 244, 255, 158, 50, 245, 255, 157, 49, 244, 255, 159, 50, 246, 255, 159, 50, 246, 255, 159, 50, 246, 255, 158, 49, 245, 255, 159, 50, 245, 255, 160, 51, 246, 255, 159, 50, 246, 255, 158, 50, 245, 255, 157, 49, 244, 255, 158, 50, 245, 255, 158, 50, 245, 255, 158, 50, 245, 255, 157, 50, 244, 255, 159, 51, 245, 255, 160, 52, 247, 255, 162, 53, 248, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 54, 249, 255, 162, 53, 249, 255, 160, 51, 247, 255, 158, 50, 245, 255, 158, 50, 245, 255, 158, 50, 245, 255, 158, 50, 245, 255, 159, 50, 245, 255, 158, 50, 245, 255, 161, 52, 247, 255, 160, 52, 247, 255, 161, 53, 248, 255, 160, 52, 247, 255, 160, 52, 247, 255, 160, 51, 246, 255, 159, 51, 246, 255, 159, 50, 245, 255, 159, 51, 246, 255, 159, 51, 246, 255, 158, 50, 245, 255, 157, 49, 244, 255, 157, 49, 244, 255, 158, 50, 245, 255, 159, 50, 246, 255, 159, 51, 246, 255, 160, 51, 246, 255, 161, 52, 248, 255, 160, 51, 246, 255, 159, 50, 246, 255, 156, 49, 243, 255, 158, 50, 244, 255, 158, 50, 245, 255, 158, 50, 245, 255, 158, 50, 245, 255, 159, 50, 246, 255, 160, 50, 247, 255, 159, 50, 246, 255, 158, 49, 245, 255, 156, 49, 243, 255, 158, 49, 245, 255, 159, 50, 246, 255, 161, 50, 247, 255, 157, 49, 244, 255, 157, 49, 244, 255, 157, 49, 244, 255, 158, 50, 245, 255, 158, 49, 244, 255, 159, 51, 246, 255, 160, 52, 247, 255, 160, 52, 247, 255, 159, 51, 246, 255, 159, 51, 245, 255, 161, 53, 247, 255, 161, 55, 247, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 51, 247, 255, 159, 50, 246, 255, 159, 50, 246, 255, 158, 50, 245, 255, 158, 50, 245, 255, 157, 49, 244, 255, 159, 50, 246, 255, 159, 50, 246, 255, 160, 51, 246, 255, 159, 50, 245, 255, 159, 50, 246, 255, 160, 51, 246, 255, 160, 51, 247, 255, 160, 51, 246, 255, 159, 51, 246, 255, 161, 52, 248, 255, 161, 53, 248, 255, 161, 53, 248, 255, 160, 51, 246, 255, 159, 51, 246, 255, 158, 50, 245, 255, 158, 50, 245, 255, 157, 49, 244, 255, 158, 50, 245, 255, 159, 51, 245, 255, 159, 51, 246, 255, 160, 52, 247, 255, 161, 52, 247, 255, 161, 51, 247, 255, 159, 50, 245, 255, 157, 49, 244, 255, 156, 49, 243, 255, 157, 49, 244, 255, 157, 49, 244, 255, 159, 50, 245, 255, 157, 49, 244, 255, 158, 49, 244, 255, 157, 49, 244, 255, 157, 49, 244, 255, 157, 49, 244, 255, 159, 50, 246, 255, 161, 51, 248, 255, 161, 51, 247, 255, 159, 50, 246, 255, 159, 50, 246, 255, 160, 50, 247, 255, 159, 50, 245, 255, 158, 50, 245, 255, 157, 49, 244, 255, 158, 50, 245, 255, 158, 50, 245, 255, 159, 51, 245, 255, 159, 51, 245, 255, 160, 55, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 51, 247, 255, 160, 51, 247, 255, 158, 50, 245, 255, 160, 51, 246, 255, 159, 50, 246, 255, 158, 50, 245, 255, 157, 49, 244, 255, 158, 50, 245, 255, 160, 51, 246, 255, 159, 51, 246, 255, 158, 50, 245, 255, 156, 49, 243, 255, 158, 50, 245, 255, 158, 50, 244, 255, 158, 50, 245, 255, 157, 49, 243, 255, 158, 50, 245, 255, 159, 51, 246, 255, 161, 52, 248, 255, 161, 52, 247, 255, 161, 53, 248, 255, 162, 54, 248, 255, 161, 52, 247, 255, 159, 51, 246, 255, 159, 50, 245, 255, 160, 52, 247, 255, 161, 53, 247, 255, 162, 53, 247, 255, 159, 51, 245, 255, 159, 50, 245, 255, 157, 49, 244, 255, 157, 49, 244, 255, 156, 49, 243, 255, 158, 49, 245, 255, 159, 50, 246, 255, 159, 50, 246, 255, 158, 49, 245, 255, 158, 49, 245, 255, 159, 49, 246, 255, 158, 49, 245, 255, 158, 49, 245, 255, 157, 49, 244, 255, 159, 50, 246, 255, 159, 50, 246, 255, 160, 50, 246, 255, 158, 49, 244, 255, 158, 50, 245, 255, 157, 49, 244, 255, 158, 50, 244, 255, 158, 50, 244, 255, 158, 50, 245, 255, 159, 51, 246, 255, 161, 52, 247, 255, 161, 53, 247, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 51, 247, 255, 160, 51, 247, 255, 159, 51, 246, 255, 159, 50, 246, 255, 158, 50, 245, 255, 158, 50, 245, 255, 158, 49, 245, 255, 158, 49, 245, 255, 157, 49, 243, 255, 158, 49, 244, 255, 157, 49, 244, 255, 158, 49, 245, 255, 158, 49, 244, 255, 159, 51, 246, 255, 160, 51, 247, 255, 159, 51, 246, 255, 158, 50, 244, 255, 157, 49, 244, 255, 158, 50, 245, 255, 158, 50, 245, 255, 158, 50, 245, 255, 157, 50, 244, 255, 159, 52, 246, 255, 160, 52, 247, 255, 162, 53, 248, 255, 161, 53, 248, 255, 163, 54, 248, 255, 164, 54, 248, 255, 161, 52, 247, 255, 159, 51, 245, 255, 159, 50, 245, 255, 158, 50, 244, 255, 157, 49, 244, 255, 157, 50, 244, 255, 156, 49, 243, 255, 158, 50, 244, 255, 158, 49, 245, 255, 159, 49, 245, 255, 156, 48, 243, 255, 157, 49, 244, 255, 158, 49, 245, 255, 159, 50, 245, 255, 157, 49, 244, 255, 158, 49, 245, 255, 159, 50, 245, 255, 158, 50, 245, 255, 158, 49, 245, 255, 158, 50, 245, 255, 159, 51, 246, 255, 159, 50, 245, 255, 159, 50, 245, 255, 158, 50, 245, 255, 161, 52, 247, 255, 160, 53, 246, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 51, 247, 255, 160, 51, 246, 255, 157, 49, 244, 255, 157, 49, 244, 255, 157, 49, 244, 255, 157, 49, 244, 255, 157, 49, 244, 255, 160, 50, 246, 255, 160, 50, 247, 255, 159, 50, 246, 255, 158, 49, 244, 255, 157, 49, 244, 255, 158, 49, 245, 255, 158, 49, 245, 255, 159, 49, 246, 255, 157, 48, 244, 255, 158, 49, 244, 255, 158, 49, 244, 255, 158, 50, 244, 255, 157, 49, 243, 255, 158, 50, 245, 255, 159, 51, 245, 255, 159, 51, 245, 255, 158, 50, 245, 255, 159, 51, 246, 255, 161, 53, 247, 255, 162, 53, 248, 255, 161, 53, 248, 255, 161, 53, 247, 255, 162, 53, 247, 255, 162, 53, 247, 255, 162, 53, 246, 255, 159, 50, 244, 255, 157, 49, 244, 255, 157, 49, 244, 255, 158, 50, 244, 255, 156, 49, 243, 255, 157, 50, 244, 255, 158, 50, 244, 255, 157, 50, 244, 255, 157, 49, 244, 255, 158, 49, 245, 255, 160, 50, 246, 255, 159, 49, 245, 255, 158, 49, 244, 255, 156, 48, 243, 255, 157, 49, 244, 255, 158, 49, 244, 255, 158, 50, 245, 255, 156, 49, 243, 255, 157, 49, 244, 255, 157, 49, 244, 255, 159, 50, 245, 255, 160, 51, 246, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 52, 248, 255, 160, 51, 247, 255, 159, 50, 246, 255, 157, 49, 244, 255, 157, 49, 244, 255, 157, 49, 244, 255, 157, 49, 243, 255, 157, 49, 244, 255, 157, 49, 244, 255, 159, 49, 245, 255, 158, 49, 244, 255, 158, 49, 244, 255, 156, 49, 243, 255, 158, 49, 245, 255, 160, 50, 246, 255, 160, 50, 247, 255, 159, 50, 245, 255, 160, 50, 246, 255, 160, 50, 247, 255, 159, 50, 246, 255, 158, 49, 244, 255, 157, 49, 244, 255, 159, 50, 245, 255, 159, 51, 246, 255, 158, 50, 245, 255, 158, 50, 245, 255, 160, 52, 246, 255, 160, 52, 246, 255, 159, 51, 246, 255, 158, 50, 244, 255, 158, 51, 245, 255, 159, 51, 246, 255, 159, 51, 246, 255, 159, 51, 246, 255, 160, 52, 246, 255, 161, 53, 247, 255, 160, 52, 246, 255, 159, 51, 245, 255, 157, 49, 244, 255, 158, 50, 245, 255, 158, 50, 245, 255, 159, 51, 245, 255, 156, 49, 243, 255, 157, 49, 244, 255, 157, 49, 243, 255, 157, 49, 244, 255, 157, 49, 243, 255, 158, 50, 245, 255, 160, 51, 246, 255, 159, 50, 245, 255, 159, 50, 245, 255, 158, 50, 244, 255, 160, 51, 246, 255, 160, 51, 246, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 52, 246, 255, 160, 51, 245, 255, 159, 51, 245, 255, 158, 50, 245, 255, 158, 50, 245, 255, 156, 49, 243, 255, 157, 49, 244, 255, 157, 49, 244, 255, 158, 49, 245, 255, 158, 49, 244, 255, 159, 49, 245, 255, 159, 49, 246, 255, 158, 49, 245, 255, 158, 49, 244, 255, 157, 49, 244, 255, 159, 50, 246, 255, 159, 50, 246, 255, 159, 50, 246, 255, 158, 49, 244, 255, 158, 49, 245, 255, 158, 49, 244, 255, 158, 50, 244, 255, 156, 49, 243, 255, 157, 49, 244, 255, 158, 50, 244, 255, 160, 51, 246, 255, 160, 52, 247, 255, 161, 52, 247, 255, 162, 53, 248, 255, 160, 51, 246, 255, 158, 50, 244, 255, 156, 49, 243, 255, 157, 50, 244, 255, 157, 49, 244, 255, 159, 50, 245, 255, 157, 49, 244, 255, 159, 51, 246, 255, 159, 51, 246, 255, 160, 52, 246, 255, 160, 52, 246, 255, 160, 52, 247, 255, 160, 52, 247, 255, 159, 51, 246, 255, 159, 50, 245, 255, 158, 51, 245, 255, 159, 51, 245, 255, 157, 49, 244, 255, 157, 49, 243, 255, 156, 49, 243, 255, 157, 50, 244, 255, 158, 50, 245, 255, 159, 50, 245, 255, 159, 51, 246, 255, 160, 51, 247, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 52, 247, 255, 161, 52, 246, 255, 158, 50, 245, 255, 158, 50, 244, 255, 158, 50, 244, 255, 158, 50, 244, 255, 158, 49, 244, 255, 157, 49, 244, 255, 159, 49, 245, 255, 158, 49, 245, 255, 158, 49, 244, 255, 156, 48, 243, 255, 157, 49, 244, 255, 158, 49, 245, 255, 159, 49, 246, 255, 157, 49, 243, 255, 157, 49, 244, 255, 157, 49, 244, 255, 158, 49, 244, 255, 158, 49, 244, 255, 159, 50, 245, 255, 160, 51, 247, 255, 159, 51, 246, 255, 158, 50, 245, 255, 157, 49, 244, 255, 160, 51, 246, 255, 160, 51, 247, 255, 161, 51, 247, 255, 158, 50, 245, 255, 158, 50, 245, 255, 158, 50, 244, 255, 157, 49, 244, 255, 156, 49, 243, 255, 158, 50, 244, 255, 159, 51, 246, 255, 160, 51, 246, 255, 159, 50, 245, 255, 158, 50, 244, 255, 159, 50, 245, 255, 159, 50, 245, 255, 159, 50, 245, 255, 158, 50, 244, 255, 160, 51, 246, 255, 161, 52, 247, 255, 162, 54, 248, 255, 160, 52, 246, 255, 159, 51, 246, 255, 158, 50, 244, 255, 158, 50, 244, 255, 157, 49, 244, 255, 158, 50, 244, 255, 159, 51, 245, 255, 159, 51, 245, 255, 160, 52, 246, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 56, 247, 255, 164, 55, 247, 255, 161, 52, 246, 255, 157, 50, 244, 255, 156, 49, 243, 255, 157, 49, 244, 255, 158, 51, 245, 255, 156, 49, 243, 255, 156, 49, 243, 255, 156, 49, 243, 255, 157, 49, 243, 255, 156, 49, 243, 255, 159, 49, 245, 255, 160, 50, 247, 255, 159, 50, 246, 255, 158, 49, 244, 255, 157, 49, 243, 255, 158, 49, 244, 255, 157, 49, 244, 255, 158, 49, 244, 255, 156, 49, 243, 255, 157, 49, 244, 255, 157, 49, 244, 255, 159, 50, 245, 255, 159, 51, 246, 255, 161, 51, 247, 255, 161, 51, 247, 255, 160, 51, 246, 255, 158, 50, 245, 255, 158, 50, 245, 255, 159, 50, 245, 255, 157, 49, 244, 255, 157, 49, 244, 255, 156, 49, 243, 255, 159, 50, 245, 255, 158, 50, 245, 255, 159, 50, 245, 255, 156, 49, 243, 255, 157, 49, 243, 255, 157, 49, 243, 255, 157, 49, 244, 255, 157, 49, 243, 255, 157, 49, 244, 255, 159, 50, 245, 255, 160, 51, 246, 255, 161, 52, 247, 255, 160, 52, 246, 255, 161, 53, 247, 255, 161, 52, 247, 255, 160, 52, 246, 255, 158, 50, 245, 255, 159, 51, 246, 255, 161, 52, 246, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 57, 245, 255, 161, 54, 246, 255, 160, 52, 246, 255, 159, 51, 245, 255, 158, 50, 244, 255, 157, 50, 244, 255, 158, 50, 245, 255, 158, 50, 245, 255, 157, 50, 244, 255, 156, 49, 243, 255, 157, 49, 244, 255, 157, 49, 244, 255, 158, 49, 244, 255, 156, 48, 243, 255, 157, 49, 244, 255, 158, 49, 244, 255, 158, 50, 244, 255, 158, 50, 244, 255, 158, 50, 244, 255, 159, 51, 246, 255, 160, 51, 246, 255, 160, 51, 246, 255, 158, 50, 245, 255, 159, 50, 245, 255, 159, 50, 245, 255, 159, 50, 245, 255, 157, 49, 244, 255, 158, 50, 244, 255, 157, 49, 244, 255, 158, 49, 244, 255, 156, 49, 243, 255, 157, 49, 243, 255, 158, 49, 244, 255, 157, 49, 244, 255, 158, 49, 244, 255, 158, 50, 244, 255, 160, 51, 246, 255, 159, 50, 245, 255, 158, 50, 244, 255, 156, 48, 242, 255, 157, 49, 244, 255, 158, 50, 244, 255, 157, 50, 244, 255, 156, 49, 243, 255, 158, 50, 244, 255, 159, 51, 245, 255, 160, 52, 247, 255, 161, 53, 247, 255, 163, 54, 247, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 52, 246, 255, 159, 52, 246, 255, 159, 51, 246, 255, 158, 50, 245, 255, 158, 50, 245, 255, 158, 50, 244, 255, 158, 50, 244, 255, 159, 51, 245, 255, 158, 50, 244, 255, 157, 49, 244, 255, 157, 49, 243, 255, 158, 50, 244, 255, 158, 50, 245, 255, 159, 50, 245, 255, 158, 50, 245, 255, 160, 51, 247, 255, 159, 51, 246, 255, 159, 50, 245, 255, 157, 49, 243, 255, 156, 49, 243, 255, 157, 49, 243, 255, 157, 49, 243, 255, 157, 49, 244, 255, 158, 49, 244, 255, 160, 50, 246, 255, 159, 49, 245, 255, 158, 49, 244, 255, 155, 48, 242, 255, 157, 48, 243, 255, 158, 49, 244, 255, 159, 49, 246, 255, 157, 48, 243, 255, 156, 48, 243, 255, 157, 49, 243, 255, 157, 49, 243, 255, 157, 49, 243, 255, 157, 50, 244, 255, 159, 51, 245, 255, 159, 51, 245, 255, 158, 50, 245, 255, 158, 50, 244, 255, 160, 52, 246, 255, 161, 53, 247, 255, 160, 53, 247, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 52, 247, 255, 160, 52, 247, 255, 160, 52, 247, 255, 159, 51, 245, 255, 159, 50, 245, 255, 158, 50, 244, 255, 157, 50, 244, 255, 156, 49, 243, 255, 156, 49, 243, 255, 157, 49, 244, 255, 158, 50, 244, 255, 159, 51, 246, 255, 160, 51, 246, 255, 161, 51, 247, 255, 159, 50, 245, 255, 157, 49, 244, 255, 155, 48, 242, 255, 156, 49, 243, 255, 156, 48, 243, 255, 157, 49, 244, 255, 156, 48, 243, 255, 157, 49, 244, 255, 157, 49, 243, 255, 157, 49, 243, 255, 156, 48, 243, 255, 157, 49, 244, 255, 160, 50, 246, 255, 160, 50, 246, 255, 159, 50, 245, 255, 158, 49, 245, 255, 160, 50, 246, 255, 159, 49, 245, 255, 158, 49, 244, 255, 156, 48, 242, 255, 157, 49, 244, 255, 158, 50, 244, 255, 158, 50, 245, 255, 158, 50, 244, 255, 159, 51, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 52, 246, 255, 161, 53, 247, 255, 160, 52, 247, 255, 159, 51, 245, 255, 158, 50, 244, 255, 159, 51, 245, 255, 160, 52, 246, 255, 161, 52, 245, 255, 159, 51, 244, 255, 159, 50, 244, 255, 158, 49, 244, 255, 157, 49, 243, 255, 156, 48, 243, 255, 156, 48, 243, 255, 158, 49, 244, 255, 158, 49, 244, 255, 158, 49, 244, 255, 158, 49, 244, 255, 159, 49, 246, 255, 158, 49, 244, 255, 157, 49, 244, 255, 155, 48, 242, 255, 158, 49, 244, 255, 158, 49, 245, 255, 159, 50, 245, 255, 157, 49, 244, 255, 157, 49, 244, 255, 157, 49, 243, 255, 157, 49, 243, 255, 157, 49, 243, 255, 156, 49, 243, 255, 158, 50, 244, 255, 159, 50, 245, 255, 161, 51, 247, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 53, 247, 255, 161, 53, 247, 255, 161, 52, 246, 255, 162, 53, 246, 255, 161, 51, 246, 255, 159, 50, 244, 255, 158, 50, 244, 255, 158, 50, 244, 255, 157, 49, 243, 255, 157, 49, 243, 255, 156, 48, 242, 255, 157, 49, 244, 255, 157, 49, 244, 255, 158, 49, 244, 255, 156, 48, 242, 255, 156, 48, 243, 255, 157, 48, 244, 255, 158, 49, 245, 255, 157, 49, 243, 255, 156, 48, 243, 255, 157, 49, 244, 255, 157, 49, 244, 255, 158, 49, 244, 255, 158, 49, 244, 255, 159, 51, 246, 255, 159, 50, 245, 255, 158, 50, 244, 255, 156, 49, 243, 255, 159, 50, 245, 255, 160, 51, 246, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 53, 246, 255, 161, 52, 245, 255, 158, 50, 244, 255, 156, 49, 243, 255, 156, 49, 242, 255, 157, 50, 243, 255, 156, 49, 243, 255, 156, 49, 242, 255, 156, 49, 243, 255, 156, 49, 243, 255, 156, 49, 243, 255, 157, 49, 243, 255, 160, 49, 246, 255, 159, 49, 245, 255, 158, 49, 244, 255, 155, 48, 242, 255, 156, 48, 243, 255, 157, 48, 243, 255, 158, 49, 244, 255, 156, 49, 243, 255, 156, 48, 242, 255, 156, 49, 243, 255, 157, 49, 244, 255, 159, 50, 245, 255, 160, 51, 246, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 51, 245, 255, 160, 53, 246, 255, 159, 51, 245, 255, 158, 50, 244, 255, 156, 49, 243, 255, 157, 49, 243, 255, 157, 50, 244, 255, 158, 50, 244, 255, 156, 49, 242, 255, 156, 49, 242, 255, 156, 49, 243, 255, 157, 49, 243, 255, 156, 48, 243, 255, 156, 48, 242, 255, 158, 50, 244, 255, 158, 50, 244, 255, 158, 50, 244, 255, 157, 49, 243, 255, 159, 50, 245, 255, 159, 50, 245, 255, 159, 50, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 51, 245, 255, 159, 52, 246, 255, 159, 51, 245, 255, 159, 51, 245, 255, 158, 50, 244, 255, 158, 50, 244, 255, 158, 50, 244, 255, 159, 51, 245, 255, 157, 50, 243, 255, 156, 49, 243, 255, 155, 48, 242, 255, 156, 49, 243, 255, 157, 49, 244, 255, 158, 50, 244, 255, 158, 50, 244, 255, 159, 50, 245, 255, 159, 50, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 52, 246, 255, 161, 53, 246, 255, 159, 51, 245, 255, 158, 50, 244, 255, 158, 50, 244, 255, 157, 49, 243, 255, 156, 49, 243, 255, 156, 49, 242, 255, 157, 50, 243, 255, 158, 50, 244, 255, 159, 51, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 51, 245, 255, 161, 53, 247, 255, 160, 52, 246, 255, 159, 51, 245, 255, 157, 49, 243, 255, 158, 50, 244, 255, 159, 52, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 52, 246, 255, 161, 52, 246, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+"format": "RGBA8",
+"height": 64,
+"mipmaps": false,
+"width": 64
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_jjcoq"]
+image = SubResource("Image_0oc4e")
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_yhpp5"]
+albedo_texture = ExtResource("5_p61g1")
+
+[sub_resource type="QuadMesh" id="QuadMesh_8liis"]
+material = SubResource("StandardMaterial3D_yhpp5")
+orientation = 1
+
+[sub_resource type="Image" id="Image_smb1e"]
+data = {
+"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 40, 74, 255, 252, 41, 75, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 41, 74, 255, 252, 64, 96, 255, 252, 80, 113, 255, 252, 70, 102, 255, 252, 54, 87, 255, 252, 43, 75, 255, 252, 39, 72, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 42, 75, 255, 252, 56, 90, 255, 252, 54, 90, 255, 252, 45, 79, 255, 252, 52, 85, 255, 252, 49, 84, 255, 252, 45, 79, 255, 252, 38, 70, 255, 251, 36, 67, 255, 251, 36, 67, 255, 251, 36, 68, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 38, 72, 255, 251, 39, 71, 255, 251, 45, 79, 255, 251, 51, 88, 255, 251, 50, 87, 255, 251, 55, 91, 255, 251, 65, 100, 255, 251, 62, 97, 255, 251, 53, 87, 255, 251, 42, 75, 255, 251, 39, 71, 255, 251, 36, 68, 255, 251, 35, 66, 255, 251, 36, 66, 255, 251, 36, 67, 255, 251, 36, 69, 255, 251, 37, 70, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 36, 67, 255, 251, 35, 65, 255, 251, 35, 65, 255, 251, 36, 66, 255, 251, 36, 66, 255, 251, 39, 70, 255, 251, 41, 75, 255, 251, 45, 80, 255, 251, 54, 90, 255, 251, 56, 93, 255, 251, 48, 82, 255, 251, 37, 69, 255, 251, 36, 67, 255, 251, 35, 66, 255, 251, 35, 64, 255, 251, 35, 64, 255, 251, 35, 63, 255, 251, 36, 67, 255, 251, 36, 69, 255, 251, 37, 71, 255, 251, 37, 70, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 36, 66, 255, 251, 36, 65, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 64, 255, 251, 35, 64, 255, 251, 36, 65, 255, 251, 36, 66, 255, 251, 37, 67, 255, 251, 39, 69, 255, 251, 37, 67, 255, 251, 35, 64, 255, 251, 35, 64, 255, 251, 36, 66, 255, 251, 36, 66, 255, 251, 36, 65, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 36, 65, 255, 251, 36, 65, 255, 251, 36, 65, 255, 251, 36, 65, 255, 251, 36, 68, 255, 251, 36, 69, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 36, 69, 255, 251, 36, 66, 255, 251, 35, 62, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 64, 255, 251, 35, 63, 255, 251, 35, 62, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 64, 255, 251, 35, 64, 255, 251, 35, 62, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 62, 255, 251, 35, 64, 255, 251, 36, 65, 255, 251, 36, 66, 255, 251, 36, 66, 255, 251, 36, 67, 255, 251, 37, 70, 255, 251, 37, 71, 255, 251, 37, 70, 255, 251, 37, 68, 255, 251, 37, 70, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 37, 71, 255, 251, 36, 68, 255, 251, 36, 65, 255, 251, 35, 63, 255, 251, 35, 62, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 62, 255, 251, 35, 63, 255, 251, 35, 62, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 65, 255, 251, 35, 66, 255, 251, 36, 65, 255, 251, 35, 64, 255, 251, 35, 64, 255, 251, 36, 65, 255, 251, 35, 65, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 64, 255, 251, 36, 65, 255, 251, 36, 66, 255, 251, 36, 67, 255, 251, 36, 69, 255, 251, 36, 68, 255, 251, 36, 68, 255, 251, 35, 64, 255, 251, 35, 65, 255, 251, 36, 66, 255, 251, 36, 68, 255, 251, 36, 67, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 37, 69, 255, 251, 35, 64, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 62, 255, 251, 35, 64, 255, 251, 35, 64, 255, 251, 35, 64, 255, 251, 35, 63, 255, 251, 35, 64, 255, 251, 35, 64, 255, 251, 35, 64, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 64, 255, 251, 35, 64, 255, 251, 35, 64, 255, 251, 35, 63, 255, 251, 35, 64, 255, 251, 35, 64, 255, 251, 35, 64, 255, 251, 35, 62, 255, 251, 35, 65, 255, 251, 36, 67, 255, 251, 36, 70, 255, 251, 36, 69, 255, 251, 37, 70, 255, 251, 36, 70, 255, 251, 36, 67, 255, 251, 35, 64, 255, 251, 35, 62, 255, 251, 35, 64, 255, 251, 35, 65, 255, 251, 36, 67, 255, 251, 35, 66, 255, 251, 36, 68, 255, 251, 36, 68, 255, 250, 36, 69, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 37, 72, 255, 251, 37, 70, 255, 251, 36, 68, 255, 251, 36, 65, 255, 251, 36, 66, 255, 251, 35, 64, 255, 251, 35, 64, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 64, 255, 251, 35, 64, 255, 251, 35, 63, 255, 251, 34, 62, 255, 251, 35, 63, 255, 251, 35, 64, 255, 251, 35, 64, 255, 251, 34, 61, 255, 251, 35, 62, 255, 251, 35, 63, 255, 251, 35, 64, 255, 250, 35, 64, 255, 250, 35, 66, 255, 250, 36, 67, 255, 250, 36, 66, 255, 250, 35, 64, 255, 250, 35, 65, 255, 250, 36, 70, 255, 250, 36, 71, 255, 250, 36, 70, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 65, 255, 250, 35, 66, 255, 250, 35, 66, 255, 250, 35, 65, 255, 250, 35, 66, 255, 250, 35, 66, 255, 250, 36, 66, 255, 250, 36, 66, 255, 250, 36, 67, 255, 250, 36, 70, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 37, 70, 255, 251, 37, 71, 255, 251, 37, 72, 255, 251, 37, 72, 255, 251, 36, 69, 255, 251, 35, 65, 255, 251, 35, 63, 255, 251, 35, 63, 255, 251, 35, 63, 255, 250, 35, 62, 255, 250, 35, 62, 255, 250, 35, 62, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 34, 62, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 62, 255, 250, 35, 64, 255, 250, 35, 64, 255, 250, 35, 66, 255, 250, 36, 68, 255, 250, 36, 70, 255, 250, 36, 71, 255, 250, 35, 68, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 34, 62, 255, 250, 35, 64, 255, 250, 35, 64, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 65, 255, 250, 36, 68, 255, 250, 36, 70, 255, 250, 36, 69, 255, 250, 36, 68, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 36, 69, 255, 250, 36, 69, 255, 250, 35, 64, 255, 250, 35, 65, 255, 250, 36, 66, 255, 250, 36, 68, 255, 250, 36, 68, 255, 250, 36, 70, 255, 250, 36, 70, 255, 250, 36, 68, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 62, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 34, 62, 255, 250, 35, 64, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 66, 255, 250, 36, 70, 255, 250, 36, 70, 255, 250, 36, 67, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 34, 63, 255, 250, 34, 64, 255, 250, 34, 64, 255, 250, 34, 63, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 35, 66, 255, 250, 35, 65, 255, 250, 35, 63, 255, 250, 35, 62, 255, 250, 35, 64, 255, 250, 35, 64, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 36, 66, 255, 250, 36, 68, 255, 250, 37, 71, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 37, 71, 255, 250, 36, 70, 255, 250, 35, 67, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 35, 66, 255, 250, 35, 67, 255, 250, 36, 70, 255, 250, 36, 69, 255, 250, 36, 69, 255, 250, 36, 68, 255, 250, 36, 68, 255, 250, 35, 67, 255, 250, 35, 66, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 62, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 66, 255, 250, 36, 68, 255, 250, 36, 70, 255, 250, 36, 69, 255, 250, 35, 66, 255, 250, 35, 62, 255, 250, 35, 62, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 34, 64, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 34, 63, 255, 250, 34, 61, 255, 250, 34, 62, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 35, 62, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 36, 65, 255, 250, 35, 65, 255, 250, 37, 69, 255, 250, 39, 72, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 36, 68, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 34, 62, 255, 250, 35, 64, 255, 250, 35, 64, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 35, 66, 255, 250, 35, 68, 255, 250, 36, 68, 255, 250, 36, 68, 255, 250, 36, 68, 255, 250, 36, 69, 255, 250, 36, 70, 255, 250, 36, 70, 255, 250, 36, 67, 255, 250, 35, 67, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 34, 63, 255, 250, 35, 64, 255, 250, 35, 64, 255, 250, 36, 67, 255, 250, 36, 68, 255, 250, 36, 69, 255, 250, 36, 68, 255, 250, 35, 65, 255, 250, 35, 63, 255, 250, 34, 61, 255, 250, 35, 62, 255, 250, 35, 63, 255, 250, 34, 64, 255, 250, 34, 62, 255, 250, 34, 63, 255, 250, 34, 62, 255, 250, 34, 63, 255, 250, 34, 63, 255, 250, 35, 64, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 35, 64, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 35, 64, 255, 250, 35, 62, 255, 250, 35, 64, 255, 250, 35, 64, 255, 250, 36, 66, 255, 250, 36, 67, 255, 250, 38, 70, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 36, 69, 255, 250, 35, 68, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 35, 64, 255, 250, 34, 62, 255, 250, 35, 65, 255, 250, 36, 68, 255, 250, 36, 70, 255, 250, 36, 70, 255, 250, 36, 70, 255, 250, 36, 71, 255, 250, 36, 69, 255, 250, 35, 67, 255, 250, 35, 65, 255, 250, 36, 68, 255, 250, 36, 69, 255, 250, 37, 70, 255, 250, 35, 65, 255, 250, 35, 62, 255, 250, 35, 62, 255, 250, 35, 62, 255, 250, 34, 62, 255, 250, 34, 63, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 34, 63, 255, 250, 34, 63, 255, 250, 34, 63, 255, 250, 34, 63, 255, 250, 35, 63, 255, 250, 34, 61, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 65, 255, 250, 36, 67, 255, 250, 36, 70, 255, 250, 37, 71, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 35, 67, 255, 250, 35, 67, 255, 250, 35, 66, 255, 250, 35, 65, 255, 250, 34, 63, 255, 250, 35, 65, 255, 250, 34, 64, 255, 250, 34, 64, 255, 250, 34, 62, 255, 250, 34, 63, 255, 250, 34, 62, 255, 250, 34, 63, 255, 250, 34, 63, 255, 250, 35, 65, 255, 250, 35, 66, 255, 250, 35, 65, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 36, 68, 255, 250, 36, 68, 255, 250, 37, 71, 255, 250, 37, 72, 255, 250, 37, 72, 255, 250, 37, 72, 255, 250, 36, 69, 255, 250, 35, 66, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 62, 255, 250, 34, 61, 255, 250, 35, 63, 255, 250, 34, 63, 255, 250, 34, 63, 255, 250, 34, 61, 255, 250, 34, 62, 255, 250, 34, 63, 255, 250, 35, 64, 255, 250, 34, 62, 255, 250, 34, 62, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 35, 64, 255, 250, 36, 69, 255, 250, 36, 69, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 36, 69, 255, 250, 35, 68, 255, 250, 35, 63, 255, 250, 34, 62, 255, 250, 34, 62, 255, 250, 35, 63, 255, 250, 34, 63, 255, 250, 34, 65, 255, 250, 34, 65, 255, 250, 34, 64, 255, 250, 34, 63, 255, 250, 34, 62, 255, 250, 34, 63, 255, 250, 34, 63, 255, 250, 34, 63, 255, 250, 34, 61, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 34, 62, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 66, 255, 250, 36, 69, 255, 250, 37, 71, 255, 250, 37, 70, 255, 250, 36, 69, 255, 250, 36, 70, 255, 250, 37, 71, 255, 250, 37, 71, 255, 250, 36, 67, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 34, 62, 255, 250, 35, 62, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 34, 61, 255, 250, 34, 62, 255, 250, 34, 63, 255, 250, 35, 63, 255, 250, 34, 62, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 66, 255, 250, 35, 68, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 36, 70, 255, 250, 36, 69, 255, 250, 35, 66, 255, 250, 35, 63, 255, 250, 34, 62, 255, 250, 34, 62, 255, 250, 34, 62, 255, 250, 34, 62, 255, 250, 34, 62, 255, 250, 34, 63, 255, 250, 34, 62, 255, 250, 34, 62, 255, 250, 34, 62, 255, 250, 34, 63, 255, 250, 35, 64, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 34, 62, 255, 250, 35, 63, 255, 250, 35, 64, 255, 250, 35, 65, 255, 250, 35, 66, 255, 250, 36, 69, 255, 250, 36, 68, 255, 250, 36, 68, 255, 250, 35, 64, 255, 250, 35, 64, 255, 250, 35, 66, 255, 250, 36, 67, 255, 250, 36, 67, 255, 249, 36, 68, 255, 249, 36, 70, 255, 249, 36, 69, 255, 249, 35, 66, 255, 249, 35, 63, 255, 249, 35, 63, 255, 249, 35, 63, 255, 249, 35, 64, 255, 249, 34, 61, 255, 249, 35, 63, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 62, 255, 249, 35, 64, 255, 249, 35, 66, 255, 249, 35, 65, 255, 249, 35, 65, 255, 249, 35, 65, 255, 249, 35, 69, 255, 249, 36, 70, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 36, 68, 255, 250, 35, 65, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 34, 61, 255, 250, 34, 63, 255, 250, 34, 63, 255, 250, 34, 64, 255, 250, 34, 63, 255, 250, 34, 64, 255, 250, 34, 64, 255, 250, 34, 64, 255, 250, 34, 63, 255, 250, 34, 62, 255, 250, 35, 64, 255, 250, 35, 64, 255, 250, 35, 64, 255, 250, 34, 63, 255, 250, 35, 63, 255, 250, 35, 64, 255, 249, 35, 64, 255, 249, 34, 62, 255, 249, 35, 63, 255, 249, 35, 64, 255, 249, 35, 68, 255, 249, 36, 69, 255, 249, 36, 69, 255, 249, 36, 70, 255, 249, 35, 67, 255, 249, 35, 64, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 64, 255, 249, 35, 66, 255, 249, 35, 65, 255, 249, 35, 68, 255, 249, 35, 68, 255, 249, 36, 69, 255, 249, 35, 68, 255, 249, 36, 69, 255, 249, 36, 69, 255, 249, 35, 67, 255, 249, 35, 66, 255, 249, 35, 65, 255, 249, 35, 65, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 61, 255, 249, 35, 63, 255, 249, 35, 65, 255, 249, 35, 65, 255, 249, 35, 67, 255, 249, 36, 70, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 36, 68, 255, 250, 36, 68, 255, 250, 35, 65, 255, 250, 35, 65, 255, 250, 35, 64, 255, 250, 35, 63, 255, 250, 35, 63, 255, 250, 34, 62, 255, 250, 34, 64, 255, 250, 34, 63, 255, 250, 34, 62, 255, 250, 34, 61, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 35, 64, 255, 249, 34, 62, 255, 249, 34, 61, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 35, 65, 255, 249, 35, 66, 255, 249, 35, 66, 255, 249, 35, 64, 255, 249, 35, 63, 255, 249, 35, 68, 255, 249, 36, 70, 255, 249, 36, 69, 255, 249, 35, 65, 255, 249, 35, 65, 255, 249, 34, 64, 255, 249, 34, 63, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 35, 65, 255, 249, 35, 65, 255, 249, 34, 64, 255, 249, 35, 65, 255, 249, 35, 67, 255, 249, 35, 66, 255, 249, 35, 67, 255, 249, 35, 66, 255, 249, 36, 69, 255, 249, 36, 69, 255, 249, 36, 71, 255, 249, 36, 68, 255, 249, 35, 67, 255, 249, 35, 65, 255, 249, 34, 64, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 35, 64, 255, 249, 35, 67, 255, 249, 36, 67, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 39, 76, 255, 250, 38, 74, 255, 250, 36, 69, 255, 250, 35, 65, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 61, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 64, 255, 249, 35, 65, 255, 249, 34, 65, 255, 249, 34, 63, 255, 249, 34, 61, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 34, 61, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 35, 64, 255, 249, 35, 66, 255, 249, 35, 69, 255, 249, 35, 70, 255, 249, 35, 68, 255, 249, 34, 65, 255, 249, 34, 64, 255, 249, 34, 65, 255, 249, 34, 64, 255, 249, 34, 63, 255, 249, 34, 61, 255, 249, 34, 63, 255, 249, 34, 64, 255, 249, 34, 64, 255, 249, 34, 63, 255, 249, 34, 64, 255, 249, 34, 63, 255, 249, 34, 64, 255, 249, 34, 62, 255, 249, 35, 64, 255, 249, 35, 67, 255, 249, 36, 69, 255, 249, 36, 70, 255, 249, 36, 69, 255, 249, 36, 70, 255, 249, 36, 69, 255, 249, 35, 68, 255, 249, 35, 65, 255, 249, 35, 67, 255, 249, 36, 68, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 39, 71, 255, 249, 37, 71, 255, 249, 36, 69, 255, 249, 35, 67, 255, 249, 35, 64, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 34, 61, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 61, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 64, 255, 249, 34, 65, 255, 249, 35, 68, 255, 249, 35, 69, 255, 249, 35, 68, 255, 249, 35, 65, 255, 249, 35, 66, 255, 249, 35, 65, 255, 249, 34, 65, 255, 249, 34, 63, 255, 249, 34, 64, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 64, 255, 249, 35, 66, 255, 249, 35, 65, 255, 249, 34, 63, 255, 249, 34, 61, 255, 249, 34, 63, 255, 249, 35, 64, 255, 249, 35, 64, 255, 249, 35, 64, 255, 249, 35, 66, 255, 249, 36, 67, 255, 249, 36, 69, 255, 249, 37, 71, 255, 249, 37, 73, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 35, 69, 255, 249, 35, 67, 255, 249, 35, 67, 255, 249, 35, 65, 255, 249, 34, 65, 255, 249, 34, 64, 255, 249, 34, 64, 255, 249, 35, 65, 255, 249, 34, 64, 255, 249, 34, 63, 255, 249, 34, 62, 255, 249, 34, 64, 255, 249, 35, 65, 255, 249, 34, 65, 255, 249, 35, 66, 255, 249, 35, 70, 255, 249, 35, 69, 255, 249, 35, 68, 255, 249, 34, 63, 255, 249, 34, 61, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 65, 255, 249, 34, 64, 255, 249, 34, 63, 255, 249, 34, 61, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 61, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 35, 64, 255, 249, 35, 64, 255, 249, 35, 65, 255, 249, 35, 65, 255, 249, 35, 67, 255, 249, 36, 69, 255, 249, 36, 70, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 36, 69, 255, 249, 36, 69, 255, 249, 36, 69, 255, 249, 35, 66, 255, 249, 35, 66, 255, 249, 34, 64, 255, 249, 34, 64, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 35, 65, 255, 249, 35, 68, 255, 249, 35, 69, 255, 249, 35, 69, 255, 249, 35, 66, 255, 249, 34, 63, 255, 249, 34, 61, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 61, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 64, 255, 249, 35, 64, 255, 249, 34, 64, 255, 249, 34, 63, 255, 249, 35, 64, 255, 249, 34, 64, 255, 249, 34, 63, 255, 249, 34, 61, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 35, 65, 255, 249, 35, 65, 255, 249, 35, 68, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 36, 70, 255, 249, 36, 71, 255, 249, 35, 69, 255, 249, 35, 66, 255, 249, 34, 64, 255, 249, 35, 66, 255, 249, 36, 68, 255, 249, 36, 68, 255, 249, 35, 65, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 34, 61, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 64, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 61, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 64, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 35, 65, 255, 249, 35, 67, 255, 249, 36, 70, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 36, 70, 255, 249, 36, 71, 255, 249, 36, 71, 255, 249, 36, 70, 255, 249, 35, 68, 255, 249, 35, 66, 255, 249, 35, 64, 255, 249, 35, 65, 255, 249, 34, 63, 255, 249, 34, 62, 255, 249, 34, 61, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 33, 61, 255, 249, 33, 61, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 62, 255, 249, 34, 61, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 35, 65, 255, 249, 35, 65, 255, 249, 34, 64, 255, 249, 34, 62, 255, 249, 35, 67, 255, 249, 35, 70, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 36, 71, 255, 249, 36, 70, 255, 249, 35, 67, 255, 249, 34, 63, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 62, 255, 249, 34, 61, 255, 249, 34, 62, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 34, 64, 255, 249, 34, 64, 255, 249, 34, 63, 255, 249, 33, 61, 255, 249, 34, 61, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 61, 255, 249, 34, 62, 255, 249, 34, 63, 255, 249, 34, 63, 255, 249, 35, 66, 255, 248, 35, 68, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 35, 67, 255, 249, 35, 70, 255, 249, 35, 68, 255, 249, 35, 66, 255, 248, 34, 62, 255, 248, 34, 62, 255, 248, 34, 62, 255, 248, 34, 62, 255, 248, 34, 61, 255, 248, 34, 62, 255, 248, 34, 63, 255, 248, 34, 62, 255, 248, 34, 62, 255, 248, 34, 62, 255, 248, 34, 64, 255, 248, 34, 64, 255, 248, 34, 64, 255, 248, 34, 64, 255, 248, 35, 67, 255, 248, 35, 69, 255, 248, 35, 68, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 35, 68, 255, 248, 35, 68, 255, 248, 35, 67, 255, 248, 35, 67, 255, 248, 34, 66, 255, 248, 34, 65, 255, 248, 34, 64, 255, 248, 34, 65, 255, 248, 34, 64, 255, 248, 34, 63, 255, 248, 33, 61, 255, 248, 34, 63, 255, 248, 34, 64, 255, 248, 34, 65, 255, 248, 34, 66, 255, 248, 35, 68, 255, 248, 35, 69, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 35, 68, 255, 248, 36, 69, 255, 248, 35, 68, 255, 248, 34, 66, 255, 248, 34, 65, 255, 248, 34, 64, 255, 248, 34, 63, 255, 248, 34, 62, 255, 248, 34, 63, 255, 248, 34, 65, 255, 248, 35, 67, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 35, 69, 255, 248, 36, 70, 255, 248, 35, 69, 255, 248, 35, 68, 255, 248, 34, 64, 255, 248, 34, 65, 255, 248, 35, 68, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 36, 70, 255, 248, 36, 72, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+"format": "RGBA8",
+"height": 64,
+"mipmaps": false,
+"width": 64
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_08vqn"]
+image = SubResource("Image_smb1e")
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3cxwk"]
+albedo_texture = ExtResource("6_0d6fq")
+
+[sub_resource type="QuadMesh" id="QuadMesh_e4dc3"]
+material = SubResource("StandardMaterial3D_3cxwk")
+orientation = 1
+
+[sub_resource type="Image" id="Image_kmrgf"]
+data = {
+"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 214, 213, 255, 209, 215, 215, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 214, 214, 255, 208, 214, 215, 255, 208, 214, 215, 255, 208, 214, 215, 255, 208, 214, 215, 255, 209, 215, 215, 255, 210, 214, 215, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 215, 217, 255, 211, 215, 217, 255, 210, 215, 216, 255, 208, 214, 214, 255, 208, 214, 215, 255, 209, 214, 215, 255, 210, 214, 215, 255, 209, 214, 214, 255, 207, 213, 213, 255, 208, 214, 214, 255, 209, 214, 214, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 215, 216, 255, 209, 214, 215, 255, 209, 214, 215, 255, 210, 215, 216, 255, 210, 215, 216, 255, 211, 215, 216, 255, 210, 214, 216, 255, 213, 215, 217, 255, 213, 215, 216, 255, 213, 215, 216, 255, 211, 214, 215, 255, 214, 215, 217, 255, 212, 215, 216, 255, 210, 214, 215, 255, 207, 213, 213, 255, 208, 214, 214, 255, 210, 214, 215, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 214, 215, 255, 211, 215, 216, 255, 211, 215, 216, 255, 210, 215, 216, 255, 213, 215, 218, 255, 212, 215, 217, 255, 211, 215, 216, 255, 208, 214, 214, 255, 210, 214, 214, 255, 212, 214, 215, 255, 212, 214, 216, 255, 211, 214, 215, 255, 208, 213, 214, 255, 209, 214, 214, 255, 209, 214, 214, 255, 209, 214, 214, 255, 206, 213, 213, 255, 210, 214, 215, 255, 209, 214, 214, 255, 208, 213, 214, 255, 209, 214, 214, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 213, 213, 255, 208, 214, 215, 255, 210, 214, 216, 255, 211, 215, 217, 255, 210, 214, 216, 255, 208, 214, 214, 255, 209, 214, 215, 255, 210, 214, 215, 255, 210, 214, 214, 255, 207, 213, 213, 255, 211, 214, 215, 255, 211, 214, 215, 255, 212, 214, 215, 255, 210, 214, 214, 255, 213, 215, 216, 255, 212, 214, 216, 255, 211, 214, 215, 255, 207, 213, 213, 255, 206, 213, 213, 255, 208, 213, 214, 255, 210, 214, 214, 255, 209, 214, 214, 255, 206, 213, 212, 255, 207, 213, 213, 255, 206, 213, 213, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 214, 214, 255, 207, 214, 214, 255, 206, 213, 212, 255, 208, 214, 214, 255, 209, 214, 214, 255, 209, 214, 215, 255, 210, 214, 215, 255, 215, 215, 217, 255, 214, 215, 217, 255, 213, 215, 216, 255, 209, 214, 214, 255, 209, 214, 214, 255, 210, 214, 215, 255, 211, 214, 215, 255, 209, 214, 214, 255, 207, 213, 213, 255, 210, 214, 214, 255, 208, 213, 213, 255, 209, 214, 213, 255, 207, 213, 213, 255, 212, 214, 215, 255, 213, 214, 216, 255, 213, 215, 216, 255, 210, 214, 215, 255, 211, 214, 215, 255, 210, 214, 215, 255, 208, 213, 214, 255, 207, 213, 213, 255, 206, 213, 213, 255, 209, 213, 214, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 211, 215, 216, 255, 210, 214, 216, 255, 209, 214, 215, 255, 207, 213, 213, 255, 207, 213, 213, 255, 208, 214, 214, 255, 210, 214, 215, 255, 209, 214, 214, 255, 208, 213, 213, 255, 211, 214, 214, 255, 210, 214, 214, 255, 210, 214, 214, 255, 207, 213, 213, 255, 212, 214, 216, 255, 212, 214, 216, 255, 213, 214, 216, 255, 211, 214, 215, 255, 213, 214, 216, 255, 213, 214, 216, 255, 211, 214, 215, 255, 208, 213, 213, 255, 208, 213, 213, 255, 211, 214, 215, 255, 211, 214, 215, 255, 211, 214, 215, 255, 208, 213, 214, 255, 208, 213, 214, 255, 207, 213, 213, 255, 209, 213, 213, 255, 207, 213, 213, 255, 210, 214, 214, 255, 209, 213, 214, 255, 208, 213, 214, 255, 208, 213, 213, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 213, 213, 255, 206, 213, 213, 255, 208, 214, 214, 255, 208, 214, 214, 255, 208, 214, 214, 255, 206, 213, 212, 255, 210, 214, 215, 255, 211, 214, 215, 255, 212, 214, 215, 255, 211, 214, 214, 255, 214, 215, 216, 255, 213, 214, 216, 255, 211, 214, 215, 255, 208, 213, 213, 255, 209, 213, 214, 255, 211, 214, 215, 255, 211, 214, 215, 255, 211, 214, 215, 255, 208, 213, 214, 255, 209, 213, 214, 255, 209, 213, 214, 255, 210, 214, 214, 255, 207, 213, 212, 255, 211, 214, 215, 255, 211, 214, 215, 255, 212, 214, 215, 255, 210, 214, 214, 255, 212, 214, 215, 255, 212, 214, 215, 255, 210, 214, 214, 255, 208, 213, 213, 255, 205, 212, 212, 255, 208, 213, 214, 255, 209, 213, 214, 255, 210, 214, 214, 255, 206, 212, 212, 255, 207, 213, 213, 255, 205, 212, 212, 255, 206, 213, 213, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 209, 214, 214, 255, 209, 214, 214, 255, 210, 214, 215, 255, 208, 214, 214, 255, 210, 215, 216, 255, 210, 214, 216, 255, 209, 214, 215, 255, 207, 213, 213, 255, 209, 213, 214, 255, 211, 214, 215, 255, 212, 214, 215, 255, 211, 214, 215, 255, 208, 213, 213, 255, 209, 213, 214, 255, 208, 213, 213, 255, 209, 213, 213, 255, 205, 212, 212, 255, 210, 214, 214, 255, 210, 214, 214, 255, 212, 214, 215, 255, 210, 214, 214, 255, 213, 214, 216, 255, 214, 214, 216, 255, 212, 214, 215, 255, 209, 213, 213, 255, 206, 213, 212, 255, 209, 213, 214, 255, 210, 213, 214, 255, 210, 214, 214, 255, 207, 213, 212, 255, 209, 213, 213, 255, 207, 213, 213, 255, 209, 213, 213, 255, 207, 213, 213, 255, 212, 214, 215, 255, 214, 214, 216, 255, 213, 214, 216, 255, 210, 213, 214, 255, 210, 213, 214, 255, 210, 213, 215, 255, 208, 213, 214, 255, 207, 213, 213, 255, 206, 212, 212, 255, 208, 213, 214, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 213, 213, 255, 208, 213, 214, 255, 209, 214, 215, 255, 210, 214, 216, 255, 209, 214, 216, 255, 207, 213, 214, 255, 208, 213, 214, 255, 209, 213, 214, 255, 209, 213, 214, 255, 206, 213, 212, 255, 210, 213, 214, 255, 210, 213, 214, 255, 211, 214, 214, 255, 210, 213, 214, 255, 213, 214, 215, 255, 212, 214, 215, 255, 211, 214, 214, 255, 208, 213, 213, 255, 207, 213, 212, 255, 209, 213, 214, 255, 210, 213, 214, 255, 210, 213, 214, 255, 207, 213, 212, 255, 210, 213, 214, 255, 208, 213, 213, 255, 209, 213, 213, 255, 206, 212, 212, 255, 211, 214, 215, 255, 213, 214, 216, 255, 213, 214, 215, 255, 211, 214, 214, 255, 212, 214, 215, 255, 212, 214, 215, 255, 210, 213, 214, 255, 208, 213, 213, 255, 207, 213, 212, 255, 211, 214, 214, 255, 211, 213, 214, 255, 212, 214, 215, 255, 208, 213, 213, 255, 208, 213, 214, 255, 207, 213, 212, 255, 209, 213, 213, 255, 207, 213, 212, 255, 210, 213, 214, 255, 210, 213, 214, 255, 208, 213, 214, 255, 207, 212, 213, 255, 209, 213, 214, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 213, 214, 255, 207, 213, 213, 255, 205, 213, 212, 255, 207, 213, 214, 255, 208, 213, 213, 255, 209, 214, 214, 255, 209, 213, 214, 255, 214, 214, 216, 255, 214, 214, 216, 255, 213, 214, 215, 255, 209, 213, 213, 255, 208, 213, 213, 255, 209, 213, 214, 255, 210, 213, 214, 255, 209, 213, 213, 255, 207, 213, 212, 255, 210, 213, 214, 255, 208, 213, 213, 255, 208, 213, 213, 255, 206, 212, 212, 255, 210, 213, 214, 255, 212, 214, 215, 255, 212, 214, 215, 255, 210, 213, 214, 255, 212, 214, 215, 255, 213, 214, 216, 255, 210, 213, 214, 255, 208, 213, 213, 255, 207, 213, 212, 255, 211, 213, 214, 255, 211, 213, 215, 255, 212, 214, 215, 255, 208, 213, 213, 255, 209, 213, 214, 255, 208, 213, 213, 255, 210, 213, 214, 255, 207, 213, 212, 255, 211, 213, 214, 255, 212, 214, 215, 255, 211, 214, 214, 255, 210, 213, 214, 255, 210, 213, 214, 255, 211, 214, 215, 255, 209, 213, 214, 255, 208, 213, 213, 255, 205, 212, 212, 255, 207, 212, 213, 255, 208, 213, 213, 255, 210, 213, 214, 255, 206, 212, 212, 255, 206, 212, 212, 255, 206, 212, 212, 255, 206, 212, 212, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 214, 216, 255, 210, 214, 215, 255, 209, 214, 215, 255, 207, 213, 213, 255, 207, 213, 213, 255, 208, 213, 214, 255, 209, 213, 214, 255, 209, 213, 213, 255, 207, 213, 212, 255, 211, 214, 214, 255, 209, 213, 213, 255, 209, 213, 213, 255, 206, 212, 212, 255, 210, 213, 214, 255, 211, 213, 214, 255, 212, 214, 215, 255, 210, 213, 214, 255, 212, 214, 215, 255, 213, 214, 215, 255, 211, 213, 214, 255, 208, 213, 213, 255, 207, 213, 213, 255, 211, 213, 214, 255, 211, 213, 215, 255, 211, 214, 215, 255, 207, 213, 213, 255, 208, 213, 213, 255, 208, 213, 213, 255, 208, 213, 213, 255, 206, 212, 212, 255, 210, 213, 214, 255, 211, 213, 214, 255, 211, 214, 214, 255, 210, 213, 214, 255, 211, 213, 215, 255, 213, 214, 216, 255, 211, 213, 215, 255, 209, 213, 213, 255, 205, 212, 212, 255, 208, 213, 213, 255, 209, 213, 213, 255, 211, 213, 214, 255, 207, 212, 212, 255, 208, 213, 213, 255, 207, 212, 212, 255, 209, 213, 213, 255, 207, 213, 212, 255, 211, 214, 215, 255, 214, 214, 216, 255, 213, 214, 215, 255, 210, 213, 214, 255, 209, 213, 214, 255, 209, 213, 214, 255, 207, 213, 213, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 213, 213, 255, 205, 213, 212, 255, 208, 213, 214, 255, 208, 213, 214, 255, 208, 213, 214, 255, 205, 212, 212, 255, 209, 213, 214, 255, 209, 213, 214, 255, 211, 214, 214, 255, 210, 213, 214, 255, 212, 214, 215, 255, 213, 214, 215, 255, 211, 214, 214, 255, 208, 213, 213, 255, 208, 213, 213, 255, 211, 213, 215, 255, 211, 213, 215, 255, 211, 213, 214, 255, 207, 212, 213, 255, 209, 213, 214, 255, 209, 213, 213, 255, 209, 213, 213, 255, 206, 212, 212, 255, 209, 213, 213, 255, 210, 213, 214, 255, 211, 213, 214, 255, 210, 213, 214, 255, 211, 213, 214, 255, 212, 214, 215, 255, 210, 213, 214, 255, 208, 213, 213, 255, 205, 212, 212, 255, 208, 213, 213, 255, 209, 213, 213, 255, 211, 213, 214, 255, 206, 212, 212, 255, 209, 213, 213, 255, 207, 212, 212, 255, 208, 213, 213, 255, 207, 212, 212, 255, 211, 213, 214, 255, 213, 214, 216, 255, 213, 214, 215, 255, 211, 213, 214, 255, 210, 213, 214, 255, 211, 213, 215, 255, 210, 213, 214, 255, 208, 213, 213, 255, 206, 212, 212, 255, 210, 213, 214, 255, 210, 213, 214, 255, 211, 213, 214, 255, 208, 212, 213, 255, 207, 213, 213, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 213, 213, 255, 209, 213, 214, 255, 208, 213, 214, 255, 209, 214, 215, 255, 210, 214, 215, 255, 209, 214, 214, 255, 207, 213, 213, 255, 209, 213, 213, 255, 211, 213, 215, 255, 211, 213, 215, 255, 211, 213, 214, 255, 207, 212, 213, 255, 208, 213, 214, 255, 208, 213, 213, 255, 209, 213, 213, 255, 205, 212, 212, 255, 209, 213, 213, 255, 209, 213, 213, 255, 210, 213, 214, 255, 210, 213, 214, 255, 212, 214, 215, 255, 214, 214, 216, 255, 212, 214, 215, 255, 209, 213, 213, 255, 206, 212, 212, 255, 208, 213, 213, 255, 209, 213, 213, 255, 210, 213, 214, 255, 206, 212, 212, 255, 209, 213, 213, 255, 208, 212, 212, 255, 208, 213, 213, 255, 206, 212, 212, 255, 210, 213, 214, 255, 212, 214, 215, 255, 212, 214, 215, 255, 211, 213, 214, 255, 211, 213, 214, 255, 212, 213, 215, 255, 210, 213, 214, 255, 208, 213, 213, 255, 206, 212, 212, 255, 210, 213, 214, 255, 210, 213, 214, 255, 212, 213, 214, 255, 208, 212, 213, 255, 209, 213, 214, 255, 208, 212, 213, 255, 210, 213, 214, 255, 208, 212, 213, 255, 210, 213, 214, 255, 212, 213, 215, 255, 211, 213, 214, 255, 210, 213, 214, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 213, 214, 255, 209, 214, 215, 255, 210, 214, 215, 255, 209, 213, 215, 255, 207, 213, 213, 255, 208, 213, 214, 255, 209, 213, 214, 255, 209, 213, 213, 255, 206, 212, 212, 255, 209, 213, 213, 255, 208, 213, 213, 255, 210, 213, 214, 255, 209, 213, 213, 255, 212, 213, 215, 255, 212, 214, 215, 255, 211, 213, 214, 255, 208, 213, 213, 255, 206, 212, 212, 255, 209, 213, 213, 255, 209, 213, 213, 255, 209, 213, 213, 255, 206, 212, 212, 255, 210, 213, 213, 255, 208, 213, 213, 255, 208, 213, 213, 255, 206, 212, 212, 255, 209, 213, 214, 255, 211, 213, 215, 255, 212, 213, 215, 255, 210, 213, 214, 255, 211, 213, 214, 255, 213, 214, 215, 255, 210, 213, 214, 255, 208, 213, 213, 255, 206, 212, 212, 255, 210, 213, 214, 255, 210, 213, 214, 255, 212, 213, 215, 255, 207, 212, 213, 255, 208, 212, 213, 255, 207, 212, 212, 255, 208, 213, 213, 255, 207, 212, 212, 255, 209, 213, 213, 255, 211, 213, 214, 255, 211, 213, 214, 255, 210, 213, 214, 255, 210, 213, 214, 255, 212, 213, 215, 255, 210, 213, 214, 255, 209, 213, 213, 255, 205, 212, 212, 255, 207, 212, 213, 255, 208, 213, 213, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 213, 213, 255, 207, 213, 213, 255, 205, 212, 212, 255, 207, 213, 213, 255, 207, 213, 213, 255, 208, 213, 214, 255, 208, 213, 213, 255, 213, 214, 215, 255, 214, 214, 216, 255, 213, 214, 215, 255, 209, 213, 213, 255, 208, 212, 213, 255, 209, 213, 214, 255, 209, 213, 213, 255, 209, 213, 213, 255, 206, 212, 212, 255, 210, 213, 213, 255, 208, 213, 213, 255, 208, 213, 213, 255, 206, 212, 212, 255, 209, 213, 213, 255, 210, 213, 214, 255, 211, 213, 214, 255, 210, 213, 214, 255, 211, 213, 214, 255, 213, 214, 215, 255, 210, 213, 214, 255, 208, 213, 213, 255, 206, 212, 212, 255, 210, 213, 214, 255, 210, 213, 214, 255, 211, 213, 214, 255, 207, 212, 213, 255, 208, 212, 213, 255, 208, 212, 213, 255, 209, 213, 213, 255, 207, 212, 212, 255, 209, 213, 213, 255, 211, 213, 214, 255, 211, 213, 214, 255, 210, 213, 213, 255, 210, 213, 213, 255, 211, 213, 214, 255, 209, 213, 213, 255, 208, 212, 213, 255, 205, 212, 211, 255, 207, 212, 213, 255, 208, 212, 213, 255, 210, 213, 214, 255, 206, 212, 212, 255, 208, 212, 212, 255, 207, 212, 212, 255, 208, 212, 212, 255, 207, 212, 212, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 209, 213, 215, 255, 209, 214, 215, 255, 209, 213, 214, 255, 207, 213, 213, 255, 206, 213, 213, 255, 208, 213, 214, 255, 208, 213, 213, 255, 208, 213, 213, 255, 206, 212, 212, 255, 211, 213, 214, 255, 209, 213, 213, 255, 209, 213, 213, 255, 206, 212, 212, 255, 208, 212, 213, 255, 209, 213, 213, 255, 211, 213, 214, 255, 209, 213, 213, 255, 211, 213, 214, 255, 213, 214, 215, 255, 211, 213, 214, 255, 208, 213, 213, 255, 207, 212, 212, 255, 210, 213, 214, 255, 210, 213, 214, 255, 211, 213, 214, 255, 207, 212, 213, 255, 208, 212, 213, 255, 207, 212, 212, 255, 208, 212, 212, 255, 206, 212, 211, 255, 208, 212, 213, 255, 210, 213, 213, 255, 210, 213, 214, 255, 210, 213, 213, 255, 211, 213, 214, 255, 213, 214, 216, 255, 211, 213, 215, 255, 209, 213, 213, 255, 205, 212, 211, 255, 207, 212, 213, 255, 208, 212, 213, 255, 210, 213, 214, 255, 206, 212, 212, 255, 208, 212, 212, 255, 207, 212, 212, 255, 208, 212, 212, 255, 207, 212, 212, 255, 210, 213, 213, 255, 213, 213, 215, 255, 212, 213, 215, 255, 211, 213, 214, 255, 209, 213, 213, 255, 211, 213, 214, 255, 209, 212, 213, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 213, 213, 255, 205, 212, 212, 255, 207, 213, 213, 255, 207, 213, 213, 255, 208, 213, 214, 255, 205, 212, 212, 255, 207, 212, 213, 255, 208, 212, 213, 255, 210, 213, 214, 255, 209, 213, 213, 255, 211, 213, 214, 255, 212, 213, 215, 255, 211, 213, 214, 255, 209, 213, 213, 255, 208, 212, 212, 255, 211, 213, 214, 255, 210, 213, 214, 255, 210, 213, 214, 255, 207, 212, 213, 255, 208, 212, 214, 255, 208, 212, 213, 255, 209, 213, 213, 255, 206, 212, 212, 255, 208, 212, 213, 255, 209, 213, 213, 255, 210, 213, 213, 255, 209, 213, 213, 255, 210, 213, 214, 255, 212, 213, 215, 255, 210, 213, 214, 255, 208, 212, 212, 255, 205, 212, 211, 255, 208, 212, 213, 255, 208, 212, 213, 255, 210, 213, 213, 255, 206, 212, 211, 255, 209, 212, 213, 255, 208, 212, 212, 255, 208, 212, 212, 255, 206, 212, 212, 255, 209, 212, 213, 255, 212, 213, 215, 255, 212, 213, 215, 255, 211, 213, 214, 255, 210, 213, 214, 255, 212, 213, 215, 255, 209, 213, 213, 255, 208, 212, 212, 255, 205, 212, 211, 255, 209, 213, 213, 255, 210, 213, 214, 255, 211, 213, 214, 255, 207, 212, 212, 255, 207, 212, 213, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 212, 213, 255, 208, 213, 213, 255, 207, 212, 213, 255, 208, 213, 214, 255, 209, 213, 215, 255, 209, 213, 214, 255, 207, 213, 213, 255, 208, 212, 213, 255, 211, 213, 215, 255, 210, 213, 214, 255, 210, 213, 214, 255, 207, 212, 213, 255, 208, 212, 213, 255, 208, 212, 213, 255, 209, 212, 213, 255, 206, 212, 211, 255, 208, 212, 212, 255, 208, 212, 213, 255, 209, 213, 213, 255, 209, 213, 213, 255, 211, 213, 214, 255, 214, 214, 216, 255, 212, 213, 215, 255, 209, 213, 213, 255, 206, 212, 212, 255, 208, 212, 213, 255, 208, 212, 213, 255, 209, 213, 213, 255, 205, 212, 211, 255, 209, 212, 213, 255, 208, 212, 212, 255, 208, 212, 212, 255, 206, 212, 212, 255, 208, 212, 213, 255, 211, 213, 214, 255, 211, 213, 214, 255, 210, 213, 214, 255, 210, 213, 214, 255, 212, 213, 215, 255, 210, 213, 213, 255, 208, 212, 212, 255, 205, 212, 211, 255, 209, 212, 213, 255, 210, 213, 214, 255, 211, 213, 214, 255, 207, 212, 212, 255, 208, 212, 213, 255, 207, 212, 213, 255, 209, 212, 213, 255, 207, 212, 212, 255, 208, 212, 213, 255, 211, 213, 214, 255, 211, 213, 214, 255, 210, 213, 213, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 209, 213, 215, 255, 209, 213, 214, 255, 209, 213, 215, 255, 206, 212, 213, 255, 207, 212, 213, 255, 208, 212, 213, 255, 210, 213, 213, 255, 206, 212, 212, 255, 208, 212, 212, 255, 208, 212, 212, 255, 209, 213, 213, 255, 208, 212, 213, 255, 210, 213, 214, 255, 212, 213, 215, 255, 211, 213, 214, 255, 208, 212, 213, 255, 206, 212, 212, 255, 208, 212, 213, 255, 208, 212, 213, 255, 209, 212, 213, 255, 206, 212, 211, 255, 210, 213, 213, 255, 208, 212, 213, 255, 208, 212, 212, 255, 206, 212, 211, 255, 208, 212, 212, 255, 210, 213, 214, 255, 211, 213, 214, 255, 210, 213, 213, 255, 210, 213, 214, 255, 213, 213, 215, 255, 210, 213, 214, 255, 208, 212, 212, 255, 205, 211, 211, 255, 209, 212, 213, 255, 210, 213, 214, 255, 211, 213, 214, 255, 207, 212, 212, 255, 207, 212, 213, 255, 207, 212, 212, 255, 208, 212, 212, 255, 206, 212, 211, 255, 208, 212, 212, 255, 210, 213, 214, 255, 210, 213, 213, 255, 210, 213, 213, 255, 209, 212, 213, 255, 212, 213, 215, 255, 210, 213, 214, 255, 209, 212, 213, 255, 205, 211, 211, 255, 206, 212, 212, 255, 207, 212, 213, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 212, 212, 255, 211, 213, 214, 255, 214, 214, 216, 255, 212, 213, 215, 255, 210, 213, 213, 255, 208, 212, 212, 255, 209, 212, 213, 255, 208, 212, 213, 255, 208, 212, 213, 255, 206, 212, 211, 255, 209, 213, 213, 255, 208, 212, 212, 255, 208, 212, 212, 255, 206, 212, 211, 255, 207, 212, 212, 255, 209, 212, 213, 255, 210, 213, 213, 255, 209, 212, 213, 255, 210, 213, 214, 255, 213, 213, 215, 255, 210, 213, 214, 255, 208, 212, 213, 255, 206, 212, 211, 255, 210, 212, 213, 255, 210, 212, 214, 255, 211, 213, 214, 255, 207, 212, 212, 255, 208, 212, 213, 255, 208, 212, 213, 255, 209, 212, 213, 255, 207, 212, 212, 255, 207, 212, 212, 255, 209, 212, 213, 255, 210, 212, 213, 255, 210, 212, 213, 255, 209, 212, 213, 255, 212, 213, 214, 255, 209, 212, 213, 255, 208, 212, 212, 255, 204, 211, 211, 255, 207, 212, 212, 255, 208, 212, 213, 255, 210, 212, 213, 255, 206, 212, 211, 255, 207, 212, 212, 255, 207, 212, 212, 255, 207, 212, 212, 255, 207, 212, 212, 255, 207, 212, 213, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 209, 212, 213, 255, 206, 212, 211, 255, 207, 212, 212, 255, 208, 212, 213, 255, 209, 212, 213, 255, 209, 212, 213, 255, 210, 213, 214, 255, 212, 213, 215, 255, 211, 213, 214, 255, 209, 212, 213, 255, 207, 212, 212, 255, 210, 213, 214, 255, 210, 212, 214, 255, 210, 213, 214, 255, 207, 212, 212, 255, 207, 212, 213, 255, 207, 212, 212, 255, 208, 212, 212, 255, 206, 212, 211, 255, 207, 212, 212, 255, 209, 212, 213, 255, 209, 212, 213, 255, 210, 212, 213, 255, 210, 212, 214, 255, 214, 213, 216, 255, 211, 213, 214, 255, 209, 212, 213, 255, 204, 211, 211, 255, 207, 212, 212, 255, 208, 212, 213, 255, 209, 212, 213, 255, 206, 212, 211, 255, 208, 212, 212, 255, 207, 212, 212, 255, 207, 212, 212, 255, 206, 212, 211, 255, 208, 212, 212, 255, 211, 213, 214, 255, 212, 213, 214, 255, 211, 213, 214, 255, 209, 212, 213, 255, 211, 213, 214, 255, 209, 212, 213, 255, 207, 212, 212, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 212, 214, 255, 209, 212, 214, 255, 210, 212, 214, 255, 207, 212, 212, 255, 208, 212, 213, 255, 208, 212, 213, 255, 209, 212, 213, 255, 206, 212, 211, 255, 207, 212, 212, 255, 208, 212, 212, 255, 209, 212, 212, 255, 209, 212, 213, 255, 209, 212, 213, 255, 213, 213, 215, 255, 210, 212, 213, 255, 208, 212, 212, 255, 205, 211, 211, 255, 207, 212, 212, 255, 208, 212, 213, 255, 209, 212, 213, 255, 205, 211, 211, 255, 208, 212, 212, 255, 208, 212, 212, 255, 207, 212, 212, 255, 206, 212, 211, 255, 207, 212, 212, 255, 211, 212, 214, 255, 211, 213, 214, 255, 211, 213, 214, 255, 209, 212, 213, 255, 212, 213, 214, 255, 210, 212, 213, 255, 208, 212, 212, 255, 205, 211, 211, 255, 208, 212, 213, 255, 209, 212, 213, 255, 210, 212, 214, 255, 208, 212, 212, 255, 206, 211, 212, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 209, 212, 213, 255, 214, 213, 215, 255, 212, 213, 215, 255, 210, 212, 213, 255, 206, 212, 212, 255, 208, 212, 212, 255, 208, 212, 213, 255, 208, 212, 212, 255, 205, 211, 211, 255, 208, 212, 212, 255, 208, 212, 212, 255, 208, 212, 212, 255, 206, 211, 211, 255, 207, 212, 212, 255, 210, 212, 213, 255, 210, 212, 213, 255, 210, 212, 213, 255, 209, 212, 213, 255, 213, 213, 215, 255, 210, 212, 213, 255, 208, 212, 212, 255, 204, 211, 211, 255, 209, 212, 213, 255, 209, 212, 213, 255, 211, 212, 214, 255, 207, 212, 212, 255, 207, 212, 212, 255, 207, 212, 212, 255, 208, 212, 212, 255, 207, 212, 212, 255, 207, 212, 212, 255, 210, 212, 213, 255, 210, 212, 213, 255, 210, 212, 213, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 212, 212, 255, 205, 211, 211, 255, 206, 211, 212, 255, 209, 212, 213, 255, 209, 212, 213, 255, 209, 212, 213, 255, 209, 212, 213, 255, 213, 213, 215, 255, 210, 212, 213, 255, 209, 212, 212, 255, 205, 211, 211, 255, 209, 212, 213, 255, 209, 212, 213, 255, 210, 212, 214, 255, 207, 212, 212, 255, 207, 211, 212, 255, 207, 211, 212, 255, 207, 212, 212, 255, 206, 211, 211, 255, 206, 211, 211, 255, 209, 212, 213, 255, 209, 212, 213, 255, 210, 212, 213, 255, 209, 212, 213, 255, 212, 213, 215, 255, 211, 212, 214, 255, 209, 212, 213, 255, 205, 211, 211, 255, 206, 211, 211, 255, 207, 212, 212, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 212, 213, 255, 210, 212, 213, 255, 207, 212, 212, 255, 207, 211, 212, 255, 208, 212, 212, 255, 208, 212, 212, 255, 206, 211, 211, 255, 206, 211, 211, 255, 208, 212, 212, 255, 208, 212, 212, 255, 209, 212, 213, 255, 209, 212, 212, 255, 212, 213, 214, 255, 210, 212, 213, 255, 208, 212, 212, 255, 204, 211, 210, 255, 206, 211, 212, 255, 207, 212, 212, 255, 209, 212, 213, 255, 206, 211, 211, 255, 207, 211, 211, 255, 207, 212, 212, 255, 207, 211, 211, 255, 206, 211, 211, 255, 205, 211, 212, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 212, 213, 255, 214, 213, 215, 255, 212, 213, 214, 255, 210, 212, 213, 255, 205, 211, 211, 255, 207, 211, 212, 255, 207, 211, 212, 255, 209, 212, 212, 255, 206, 211, 211, 255, 207, 211, 211, 255, 207, 212, 212, 255, 207, 211, 211, 255, 206, 211, 211, 255, 206, 211, 211, 255, 210, 212, 213, 255, 210, 212, 213, 255, 211, 212, 213, 255, 209, 212, 213, 255, 212, 212, 214, 255, 210, 212, 213, 255, 208, 212, 212, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 211, 211, 255, 205, 211, 211, 255, 205, 211, 211, 255, 209, 212, 213, 255, 209, 212, 213, 255, 210, 212, 213, 255, 209, 212, 212, 255, 212, 213, 214, 255, 210, 212, 213, 255, 208, 212, 212, 255, 205, 211, 210, 255, 208, 212, 212, 255, 209, 212, 213, 255, 210, 212, 213, 255, 208, 211, 212, 255, 206, 211, 212, 255, 206, 211, 212, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 211, 213, 255, 210, 212, 213, 255, 207, 211, 212, 255, 206, 211, 212, 255, 207, 211, 212, 255, 208, 211, 212, 255, 207, 211, 211, 255, 205, 211, 211, 255, 209, 212, 212, 255, 209, 212, 212, 255, 210, 212, 213, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 211, 212, 255, 213, 213, 215, 255, 211, 212, 214, 255, 210, 212, 213, 255, 205, 211, 211, 255, 206, 211, 211, 255, 207, 211, 212, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 211, 210, 255, 204, 210, 210, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+"format": "RGBA8",
+"height": 64,
+"mipmaps": false,
+"width": 64
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_yjid8"]
+image = SubResource("Image_kmrgf")
+
+[resource]
+item/0/name = "MeshInstance3D"
+item/0/mesh = SubResource("QuadMesh_41vdq")
+item/0/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+item/0/shapes = []
+item/0/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+item/0/navigation_layers = 1
+item/0/preview = SubResource("ImageTexture_ue3m6")
+item/1/name = "MeshInstance3D2"
+item/1/mesh = SubResource("QuadMesh_w2xko")
+item/1/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+item/1/shapes = []
+item/1/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+item/1/navigation_layers = 1
+item/1/preview = SubResource("ImageTexture_m6jib")
+item/2/name = "MeshInstance3D3"
+item/2/mesh = SubResource("QuadMesh_5cqhl")
+item/2/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+item/2/shapes = []
+item/2/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+item/2/navigation_layers = 1
+item/2/preview = SubResource("ImageTexture_igtlk")
+item/3/name = "MeshInstance3D4"
+item/3/mesh = SubResource("QuadMesh_6j5y0")
+item/3/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+item/3/shapes = []
+item/3/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+item/3/navigation_layers = 1
+item/3/preview = SubResource("ImageTexture_jjcoq")
+item/4/name = "MeshInstance3D5"
+item/4/mesh = SubResource("QuadMesh_8liis")
+item/4/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+item/4/shapes = []
+item/4/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+item/4/navigation_layers = 1
+item/4/preview = SubResource("ImageTexture_08vqn")
+item/5/name = "MeshInstance3D6"
+item/5/mesh = SubResource("QuadMesh_e4dc3")
+item/5/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+item/5/shapes = []
+item/5/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+item/5/navigation_layers = 1
+item/5/preview = SubResource("ImageTexture_yjid8")
diff --git a/player.gd b/player.gd
new file mode 100644 (file)
index 0000000..47c5b64
--- /dev/null
+++ b/player.gd
@@ -0,0 +1,35 @@
+extends CharacterBody3D
+
+# How fast the player moves in meters per second.
+@export var speed = 5
+# The downward acceleration when in the air, in meters per second squared.
+@export var fall_acceleration = 10
+@export var pivot: Node3D
+
+var target_velocity = Vector3.ZERO
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _physics_process(_delta):
+       var direction = Vector3.ZERO
+
+       if Input.is_action_pressed("move_right"):
+               direction += transform.basis.x
+       if Input.is_action_pressed("move_left"):
+               direction -= transform.basis.x
+       if Input.is_action_pressed("move_back"):
+               direction += transform.basis.z
+       if Input.is_action_pressed("move_forward"):
+               direction -= transform.basis.z
+
+       if direction != Vector3.ZERO:
+               direction = direction.normalized()
+               pivot.look_at(position + direction, Vector3.UP)
+
+       target_velocity.x = direction.x * speed
+       target_velocity.z = direction.z * speed
+
+       # if not is_on_floor():
+       #       target_velocity.y = target_velocity.y - (fall_acceleration * delta)
+
+       velocity = target_velocity
+       move_and_slide()
diff --git a/project.godot b/project.godot
new file mode 100644 (file)
index 0000000..a9a4285
--- /dev/null
@@ -0,0 +1,69 @@
+; 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="our RPG"
+config/features=PackedStringArray("4.3", "Forward Plus")
+config/icon="res://icon.svg"
+
+[autoload]
+
+EzTransitions="*res://addons/ez_transitions/objects/plugin_singleton/plugin_singleton_script.gd"
+PromptManager="*res://addons/input_prompts/input_prompt_manager.gd"
+Tracer="*res://addons/tracer/./tracer.gd"
+GGS="*res://addons/ggs/classes/global/ggs.tscn"
+DebugMenu="*res://addons/debug_menu/debug_menu.tscn"
+
+[display]
+
+window/vsync/vsync_mode=2
+
+[editor]
+
+version_control/plugin_name="GitPlugin"
+version_control/autoload_on_startup=true
+
+[editor_plugins]
+
+enabled=PackedStringArray("res://addons/ColorPreview/plugin.cfg", "res://addons/anthonyec.camera_preview/plugin.cfg", "res://addons/debug_menu/plugin.cfg", "res://addons/ez_transitions/plugin.cfg", "res://addons/ggs/plugin.cfg", "res://addons/input_prompts/plugin.cfg", "res://addons/script-ide/plugin.cfg", "res://addons/tracer/plugin.cfg")
+
+[input]
+
+cycle_debug_menu={
+"deadzone": 0.5,
+"events": [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":4194332,"key_label":0,"unicode":0,"echo":false,"script":null)
+]
+}
+move_right={
+"deadzone": 0.5,
+"events": [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,"echo":false,"script":null)
+]
+}
+move_left={
+"deadzone": 0.5,
+"events": [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,"echo":false,"script":null)
+]
+}
+move_back={
+"deadzone": 0.5,
+"events": [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,"echo":false,"script":null)
+]
+}
+move_forward={
+"deadzone": 0.5,
+"events": [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,"echo":false,"script":null)
+]
+}
+left_click={
+"deadzone": 0.5,
+"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(143, 25),"global_position":Vector2(147, 66),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null)
+]
+}
diff --git a/shaders/Farola.glb b/shaders/Farola.glb
new file mode 100644 (file)
index 0000000..9f169e3
Binary files /dev/null and b/shaders/Farola.glb differ
diff --git a/shaders/Farola.glb.import b/shaders/Farola.glb.import
new file mode 100644 (file)
index 0000000..25d62ea
--- /dev/null
@@ -0,0 +1,34 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://bgjdq2pw85naa"
+path="res://.godot/imported/Farola.glb-7a47e1f05c6108134b516e59815d0988.scn"
+
+[deps]
+
+source_file="res://shaders/Farola.glb"
+dest_files=["res://.godot/imported/Farola.glb-7a47e1f05c6108134b516e59815d0988.scn"]
+
+[params]
+
+nodes/root_type=""
+nodes/root_name=""
+nodes/apply_root_scale=true
+nodes/root_scale=1.0
+meshes/ensure_tangents=true
+meshes/generate_lods=true
+meshes/create_shadow_meshes=true
+meshes/light_baking=1
+meshes/lightmap_texel_size=0.2
+meshes/force_disable_compression=false
+skins/use_named_skins=true
+animation/import=true
+animation/fps=30
+animation/trimming=false
+animation/remove_immutable_tracks=true
+import_script/path=""
+_subresources={}
+gltf/naming_version=1
+gltf/embedded_image_handling=1
diff --git a/shaders/perlin_noise.gdshader b/shaders/perlin_noise.gdshader
new file mode 100644 (file)
index 0000000..e420f77
--- /dev/null
@@ -0,0 +1,46 @@
+shader_type canvas_item;
+
+uniform vec2 u_mouse;
+uniform float u_time;
+
+// 2D Random
+float random (in vec2 st) {
+    return fract(sin(dot(st.xy, vec2(12.9898, 78.233))) * 43758.5453123);
+}
+
+// 2D Noise based on Morgan McGuire @morgan3d
+// https://www.shadertoy.com/view/4dS3Wd
+float noise (in vec2 st) {
+    vec2 i = floor(st);
+    vec2 f = fract(st);
+
+    // Four corners in 2D of a tile
+    float a = random(i);
+    float b = random(i + vec2(1.0, 0.0));
+    float c = random(i + vec2(0.0, 1.0));
+    float d = random(i + vec2(1.0, 1.0));
+
+    // Smooth Interpolation
+
+    // Cubic Hermine Curve.  Same as SmoothStep()
+    vec2 u = f * f * (3.0 - 2.0 * f);
+    // u = smoothstep(0.,1.,f);
+
+    // Mix 4 coorners percentages
+    return mix(a, b, u.x) +
+            (c - a) * u.y * (1.0 - u.x) +
+            (d - b) * u.x * u.y;
+}
+
+void fragment() {
+    vec2 st = FRAGCOORD.xy / (1.0 / SCREEN_PIXEL_SIZE).xy;
+
+    // Scale the coordinate system to see
+    // some noise in action
+    vec2 pos = vec2(st * 5.0);
+
+    // Use the noise function
+    float n = noise(pos);
+
+    COLOR = vec4(vec3(n), 1.0);
+}
\ No newline at end of file
diff --git a/shaders/screen_shaders.gdshader b/shaders/screen_shaders.gdshader
new file mode 100644 (file)
index 0000000..3d68d86
--- /dev/null
@@ -0,0 +1,62 @@
+shader_type canvas_item;
+
+// Uniforms screen grain
+uniform sampler2D screen_texture : hint_screen_texture;
+uniform float grain_amount : hint_range(0.0, 1.0) = 0.05; // Adjust the amount of grain
+uniform float grain_size : hint_range(0.1, 10.0) = 1.0; // Adjust the size of the grain
+
+// Uniforms Perlin noise
+uniform int cell_amount = 20;
+uniform vec2 period = vec2(5., 10.);
+
+// Uniforms chromatic aberration
+uniform vec2 r_displacement = vec2(3.0, 0.0);
+uniform vec2 g_displacement = vec2(0.0, 0.0);
+uniform vec2 b_displacement = vec2(-3.0, 0.0);
+
+vec2 modulo(vec2 divident, vec2 divisor){
+       vec2 positiveDivident = mod(divident, divisor) + divisor;
+       return mod(positiveDivident, divisor);
+}
+
+vec2 random(vec2 value){
+       value = vec2( dot(value, vec2(127.1,311.7) ),
+                                 dot(value, vec2(269.5,183.3) ) );
+       return -1.0 + 2.0 * fract(sin(value) * 43758.5453123);
+}
+
+float seamless_noise(vec2 uv, vec2 _period) {
+       uv = uv * float(cell_amount);
+       vec2 cellsMinimum = floor(uv);
+       vec2 cellsMaximum = ceil(uv);
+       vec2 uv_fract = fract(uv);
+
+       cellsMinimum = modulo(cellsMinimum, _period);
+       cellsMaximum = modulo(cellsMaximum, _period);
+
+       vec2 blur = smoothstep(0.0, 1.0, uv_fract);
+
+       vec2 lowerLeftDirection = random(vec2(cellsMinimum.x, cellsMinimum.y));
+       vec2 lowerRightDirection = random(vec2(cellsMaximum.x, cellsMinimum.y));
+       vec2 upperLeftDirection = random(vec2(cellsMinimum.x, cellsMaximum.y));
+       vec2 upperRightDirection = random(vec2(cellsMaximum.x, cellsMaximum.y));
+
+       vec2 fraction = fract(uv);
+
+       return mix( mix( dot( lowerLeftDirection, fraction - vec2(0, 0) ),
+                     dot( lowerRightDirection, fraction - vec2(1, 0) ), blur.x),
+                mix( dot( upperLeftDirection, fraction - vec2(0, 1) ),
+                     dot( upperRightDirection, fraction - vec2(1, 1) ), blur.x), blur.y) * 0.8 + 0.5;
+}
+
+void fragment() {
+    // Generate random noise
+    // float noise = (fract(sin(dot(UV, vec2(12.9898, 78.233))) * 43758.5453) - 0.5) * 2.0;
+       float noise = seamless_noise(UV, period);
+
+       float r = clamp(texture(screen_texture, SCREEN_UV + vec2(SCREEN_PIXEL_SIZE*r_displacement), 0.0).r + noise * grain_amount * grain_size, 0.0, 1.0);
+       float g = clamp(texture(screen_texture, SCREEN_UV + vec2(SCREEN_PIXEL_SIZE*g_displacement), 0.0).g + noise * grain_amount * grain_size, 0.0, 1.0);
+       float b = clamp(texture(screen_texture, SCREEN_UV + vec2(SCREEN_PIXEL_SIZE*b_displacement), 0.0).b + noise * grain_amount * grain_size, 0.0, 1.0);
+
+       COLOR = vec4(r, g, b, 1.0);
+}
\ No newline at end of file
diff --git a/shaders/test.tres b/shaders/test.tres
new file mode 100644 (file)
index 0000000..9e27b9b
--- /dev/null
@@ -0,0 +1,22 @@
+[gd_resource type="VisualShader" load_steps=3 format=3 uid="uid://bn47efd5xlgnv"]
+
+[sub_resource type="VisualShaderNodeInput" id="VisualShaderNodeInput_lyfoh"]
+input_name = "vertex"
+
+[sub_resource type="VisualShaderNodeVectorCompose" id="VisualShaderNodeVectorCompose_d4owe"]
+default_input_values = [0, 0.0, 1, 1.0, 2, 0.0, 3, 0.0]
+op_type = 2
+
+[resource]
+code = "shader_type spatial;
+render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_lambert, specular_schlick_ggx;
+
+
+
+"
+nodes/fragment/0/position = Vector2(1120, 20)
+nodes/fragment/2/node = SubResource("VisualShaderNodeInput_lyfoh")
+nodes/fragment/2/position = Vector2(360, 120)
+nodes/fragment/3/node = SubResource("VisualShaderNodeVectorCompose_d4owe")
+nodes/fragment/3/position = Vector2(760, 100)
+nodes/fragment/connections = PackedInt32Array(2, 0, 3, 0)
diff --git a/shaders/vhs-crt.gdshader b/shaders/vhs-crt.gdshader
new file mode 100644 (file)
index 0000000..048a388
--- /dev/null
@@ -0,0 +1,222 @@
+shader_type canvas_item;
+
+//*** IMPORTANT! ***/
+// - If you are using this shader to affect the node it is applied to set 'overlay' to false (unchecked in the instepctor).
+// - If you are using this shader as an overlay, and want the shader to affect the nodes below in the Scene hierarchy,
+//   set 'overlay' to true (checked in the inspector).
+// On Mac there is potentially a bug causing this to not work properly. If that is the case and you want to use the shader as an overlay
+// change all "overlay ? SCREEN_TEXTURE : TEXTURE" to only "SCREEN_TEXTURE" on lines 129-140, and "vec2 uv = overlay ? warp(SCREEN_UV) : warp(UV);"
+// to "vec2 uv = warp(SCREEN_UV);" on line 98.
+uniform bool overlay = false;
+
+uniform sampler2D SCREEN_TEXTURE : hint_screen_texture, filter_linear_mipmap;
+
+uniform float scanlines_opacity : hint_range(0.0, 1.0) = 0.4;
+uniform float scanlines_width : hint_range(0.0, 0.5) = 0.25;
+uniform float grille_opacity : hint_range(0.0, 1.0) = 0.3;
+uniform vec2 resolution = vec2(640.0, 480.0); // Set the number of rows and columns the texture will be divided in. Scanlines and grille will make a square based on these values
+
+uniform bool pixelate = true; // Fill each square ("pixel") with a sampled color, creating a pixel look and a more accurate representation of how a CRT monitor would work.
+
+uniform bool roll = true;
+uniform float roll_speed = 8.0; // Positive values are down, negative are up
+uniform float roll_size : hint_range(0.0, 100.0) = 15.0;
+uniform float roll_variation : hint_range(0.1, 5.0) = 1.8; // This valie is not an exact science. You have to play around with the value to find a look you like. How this works is explained in the code below.
+uniform float distort_intensity : hint_range(0.0, 0.2) = 0.05; // The distortion created by the rolling effect.
+
+uniform float noise_opacity : hint_range(0.0, 1.0) = 0.4;
+uniform float noise_speed = 5.0; // There is a movement in the noise pattern that can be hard to see first. This sets the speed of that movement.
+
+uniform float static_noise_intensity : hint_range(0.0, 1.0) = 0.06;
+
+uniform float aberration : hint_range(-1.0, 1.0) = 0.03; // Chromatic aberration, a distortion on each color channel.
+uniform float brightness = 1.4; // When adding scanline gaps and grille the image can get very dark. Brightness tries to compensate for that.
+uniform bool discolor = true; // Add a discolor effect simulating a VHS
+
+uniform float warp_amount :hint_range(0.0, 5.0) = 1.0; // Warp the texture edges simulating the curved glass of a CRT monitor or old TV.
+uniform bool clip_warp = false;
+
+uniform float vignette_intensity = 0.4; // Size of the vignette, how far towards the middle it should go.
+uniform float vignette_opacity : hint_range(0.0, 1.0) = 0.5;
+
+// Used by the noise functin to generate a pseudo random value between 0.0 and 1.0
+vec2 random(vec2 uv){
+    uv = vec2( dot(uv, vec2(127.1,311.7) ),
+               dot(uv, vec2(269.5,183.3) ) );
+    return -1.0 + 2.0 * fract(sin(uv) * 43758.5453123);
+}
+
+// Generate a Perlin noise used by the distortion effects
+float noise(vec2 uv) {
+    vec2 uv_index = floor(uv);
+    vec2 uv_fract = fract(uv);
+
+    vec2 blur = smoothstep(0.0, 1.0, uv_fract);
+
+    return mix( mix( dot( random(uv_index + vec2(0.0,0.0) ), uv_fract - vec2(0.0,0.0) ),
+                     dot( random(uv_index + vec2(1.0,0.0) ), uv_fract - vec2(1.0,0.0) ), blur.x),
+                mix( dot( random(uv_index + vec2(0.0,1.0) ), uv_fract - vec2(0.0,1.0) ),
+                     dot( random(uv_index + vec2(1.0,1.0) ), uv_fract - vec2(1.0,1.0) ), blur.x), blur.y) * 0.5 + 0.5;
+}
+
+// Takes in the UV and warps the edges, creating the spherized effect
+vec2 warp(vec2 uv){
+       vec2 delta = uv - 0.5;
+       float delta2 = dot(delta.xy, delta.xy);
+       float delta4 = delta2 * delta2;
+       float delta_offset = delta4 * warp_amount;
+
+       return uv + delta * delta_offset;
+}
+
+// Adds a black border to hide stretched pixel created by the warp effect
+float border (vec2 uv){
+       float radius = min(warp_amount, 0.08);
+       radius = max(min(min(abs(radius * 2.0), abs(1.0)), abs(1.0)), 1e-5);
+       vec2 abs_uv = abs(uv * 2.0 - 1.0) - vec2(1.0, 1.0) + radius;
+       float dist = length(max(vec2(0.0), abs_uv)) / radius;
+       float square = smoothstep(0.96, 1.0, dist);
+       return clamp(1.0 - square, 0.0, 1.0);
+}
+
+// Adds a vignette shadow to the edges of the image
+float vignette(vec2 uv){
+       uv *= 1.0 - uv.xy;
+       float vignette = uv.x * uv.y * 15.0;
+       return pow(vignette, vignette_intensity * vignette_opacity);
+}
+
+void fragment()
+{
+       vec2 uv = overlay ? warp(SCREEN_UV) : warp(UV); // Warp the uv. uv will be used in most cases instead of UV to keep the warping
+       vec2 text_uv = uv;
+       vec2 roll_uv = vec2(0.0);
+       float time = roll ? TIME : 0.0;
+
+
+       // Pixelate the texture based on the given resolution.
+       if (pixelate)
+       {
+               text_uv = ceil(uv * resolution) / resolution;
+       }
+
+       // Create the rolling effect. We need roll_line a bit later to make the noise effect.
+       // That is why this runs if roll is true OR noise_opacity is over 0.
+       float roll_line = 0.0;
+       if (roll || noise_opacity > 0.0)
+       {
+               // Create the areas/lines where the texture will be distorted.
+               roll_line = smoothstep(0.3, 0.9, sin(uv.y * roll_size - (time * roll_speed) ) );
+               // Create more lines of a different size and apply to the first set of lines. This creates a bit of variation.
+               roll_line *= roll_line * smoothstep(0.3, 0.9, sin(uv.y * roll_size * roll_variation - (time * roll_speed * roll_variation) ) );
+               // Distort the UV where where the lines are
+               roll_uv = vec2(( roll_line * distort_intensity * (1.-UV.x)), 0.0);
+       }
+
+       vec4 text;
+       if (roll)
+       {
+               // If roll is true distort the texture with roll_uv. The texture is split up into RGB to
+               // make some chromatic aberration. We apply the aberration to the red and green channels accorging to the aberration parameter
+               // and intensify it a bit in the roll distortion.
+               text.r = texture(SCREEN_TEXTURE, text_uv + roll_uv * 0.8 + vec2(aberration, 0.0) * .1).r;
+               text.g = texture(SCREEN_TEXTURE, text_uv + roll_uv * 1.2 - vec2(aberration, 0.0) * .1 ).g;
+               text.b = texture(SCREEN_TEXTURE, text_uv + roll_uv).b;
+               text.a = 1.0;
+       }
+       else
+       {
+               // If roll is false only apply the aberration without any distorion. The aberration values are very small so the .1 is only
+               // to make the slider in the Inspector less sensitive.
+               text.r = texture(SCREEN_TEXTURE, text_uv + vec2(aberration, 0.0) * .1).r;
+               text.g = texture(SCREEN_TEXTURE, text_uv - vec2(aberration, 0.0) * .1).g;
+               text.b = texture(SCREEN_TEXTURE, text_uv).b;
+               text.a = 1.0;
+       }
+
+       float r = text.r;
+       float g = text.g;
+       float b = text.b;
+
+       uv = warp(UV);
+
+       // CRT monitors don't have pixels but groups of red, green and blue dots or lines, called grille. We isolate the texture's color channels
+       // and divide it up in 3 offsetted lines to show the red, green and blue colors next to each other, with a small black gap between.
+       if (grille_opacity > 0.0){
+
+               float g_r = smoothstep(0.85, 0.95, abs(sin(uv.x * (resolution.x * 3.14159265))));
+               r = mix(r, r * g_r, grille_opacity);
+
+               float g_g = smoothstep(0.85, 0.95, abs(sin(1.05 + uv.x * (resolution.x * 3.14159265))));
+               g = mix(g, g * g_g, grille_opacity);
+
+               float b_b = smoothstep(0.85, 0.95, abs(sin(2.1 + uv.x * (resolution.x * 3.14159265))));
+               b = mix(b, b * b_b, grille_opacity);
+
+       }
+
+       // Apply the grille to the texture's color channels and apply Brightness. Since the grille and the scanlines (below) make the image very dark you
+       // can compensate by increasing the brightness.
+       text.r = clamp(r * brightness, 0.0, 1.0);
+       text.g = clamp(g * brightness, 0.0, 1.0);
+       text.b = clamp(b * brightness, 0.0, 1.0);
+
+       // Scanlines are the horizontal lines that make up the image on a CRT monitor.
+       // Here we are actual setting the black gap between each line, which I guess is not the right definition of the word, but you get the idea
+       float scanlines = 0.5;
+       if (scanlines_opacity > 0.0)
+       {
+               // Same technique as above, create lines with sine and applying it to the texture. Smoothstep to allow setting the line size.
+               scanlines = smoothstep(scanlines_width, scanlines_width + 0.5, abs(sin(uv.y * (resolution.y * 3.14159265))));
+               text.rgb = mix(text.rgb, text.rgb * vec3(scanlines), scanlines_opacity);
+       }
+
+       // Apply the banded noise.
+       if (noise_opacity > 0.0)
+       {
+               // Generate a noise pattern that is very stretched horizontally, and animate it with noise_speed
+               float noise = smoothstep(0.4, 0.5, noise(uv * vec2(2.0, 200.0) + vec2(10.0, (TIME * (noise_speed))) ) );
+
+               // We use roll_line (set above) to define how big the noise should be vertically (multiplying cuts off all black parts).
+               // We also add in some basic noise with random() to break up the noise pattern above. The noise is sized according to
+               // the resolution value set in the inspector. If you don't like this look you can
+               // change "ceil(uv * resolution) / resolution" to only "uv" to make it less pixelated. Or multiply resolution with som value
+               // greater than 1.0 to make them smaller.
+               roll_line *= noise * scanlines * clamp(random((ceil(uv * resolution) / resolution) + vec2(TIME * 0.8, 0.0)).x + 0.8, 0.0, 1.0);
+               // Add it to the texture based on noise_opacity
+               text.rgb = clamp(mix(text.rgb, text.rgb + roll_line, noise_opacity), vec3(0.0), vec3(1.0));
+       }
+
+       // Apply static noise by generating it over the whole screen in the same way as above
+       if (static_noise_intensity > 0.0)
+       {
+               text.rgb += clamp(random((ceil(uv * resolution) / resolution) + fract(TIME)).x, 0.0, 1.0) * static_noise_intensity;
+       }
+
+       // Apply a black border to hide imperfections caused by the warping.
+       // Also apply the vignette
+       text.rgb *= border(uv);
+       text.rgb *= vignette(uv);
+       // Hides the black border and make that area transparent. Good if you want to add the the texture on top an image of a TV or monitor.
+       if (clip_warp)
+       {
+               text.a = border(uv);
+       }
+
+       // Apply discoloration to get a VHS look (lower saturation and higher contrast)
+       // You can play with the values below or expose them in the Inspector.
+       float saturation = 0.5;
+       float contrast = 1.2;
+       if (discolor)
+       {
+               // Saturation
+               vec3 greyscale = vec3(text.r + text.g + text.b) / 3.;
+               text.rgb = mix(text.rgb, greyscale, saturation);
+
+               // Contrast
+               float midpoint = pow(0.5, 2.2);
+               text.rgb = (text.rgb - vec3(midpoint)) * contrast + midpoint;
+       }
+
+       COLOR = text;
+}
\ No newline at end of file
diff --git a/test.tscn b/test.tscn
new file mode 100644 (file)
index 0000000..cd60821
--- /dev/null
+++ b/test.tscn
@@ -0,0 +1,192 @@
+[gd_scene load_steps=12 format=3 uid="uid://t5uneae6abmn"]
+
+[ext_resource type="Script" path="res://Camera3D.gd" id="1_4d2h8"]
+[ext_resource type="PackedScene" uid="uid://bpuiyd81j8177" path="res://Farola.glb" id="1_naw6w"]
+[ext_resource type="Script" path="res://player.gd" id="1_vapxt"]
+[ext_resource type="Shader" path="res://shaders/screen_shaders.gdshader" id="2_nguig"]
+[ext_resource type="MeshLibrary" uid="uid://didmc6xrsyrne" path="res://plain_tiles.tres" id="3_g2il3"]
+[ext_resource type="PackedScene" uid="uid://cggqb75a8w8r" path="res://addons/debug_menu/debug_menu.tscn" id="3_s7w0p"]
+
+[sub_resource type="Environment" id="Environment_bd0rd"]
+sdfgi_enabled = true
+volumetric_fog_enabled = true
+volumetric_fog_density = 0.1977
+volumetric_fog_albedo = Color(0.144063, 0.144063, 0.144063, 1)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_s6l2r"]
+size = Vector3(100, 6, 100)
+
+[sub_resource type="SystemFont" id="SystemFont_ofrpt"]
+font_names = PackedStringArray("FreeMono")
+
+[sub_resource type="LabelSettings" id="LabelSettings_hbd1r"]
+font = SubResource("SystemFont_ofrpt")
+font_size = 32
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_s2ner"]
+shader = ExtResource("2_nguig")
+shader_parameter/grain_amount = 0.05
+shader_parameter/grain_size = 1.5
+shader_parameter/cell_amount = 300
+shader_parameter/period = Vector2(100, 100)
+shader_parameter/r_displacement = Vector2(3, -1)
+shader_parameter/g_displacement = Vector2(0, 0)
+shader_parameter/b_displacement = Vector2(-3, 1)
+
+[node name="Node3D" type="Node3D"]
+
+[node name="CameraPivot" type="Marker3D" parent="."]
+transform = Transform3D(1, 0, 3.72529e-09, 0, 1, 0, 7.45058e-09, 0, 1, 0, 2.17843, 0)
+
+[node name="CharacterBody3D" type="CharacterBody3D" parent="." node_paths=PackedStringArray("pivot")]
+top_level = true
+script = ExtResource("1_vapxt")
+pivot = NodePath("Pivot")
+
+[node name="Pivot" type="Node3D" parent="CharacterBody3D"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.68645, 0)
+
+[node name="Farola" parent="CharacterBody3D" instance=ExtResource("1_naw6w")]
+transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0)
+
+[node name="Camera3D" type="Camera3D" parent="CharacterBody3D" node_paths=PackedStringArray("player")]
+transform = Transform3D(1, 0, -7.45058e-09, 0, 1, 0, 7.45058e-09, 0, 1, 0, 1.7, -0.106033)
+environment = SubResource("Environment_bd0rd")
+current = true
+script = ExtResource("1_4d2h8")
+mouseSensitivity = 0.2
+player = NodePath("..")
+
+[node name="Farola" parent="." instance=ExtResource("1_naw6w")]
+transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 1.14497, 0, -5.87298)
+
+[node name="OmniLight3D" type="OmniLight3D" parent="Farola"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 6.5, 0)
+light_color = Color(0.992571, 0.637651, 0.45994, 1)
+light_bake_mode = 1
+
+[node name="Ground" type="StaticBody3D" parent="."]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="Ground"]
+shape = SubResource("BoxShape3D_s6l2r")
+
+[node name="GridMap" type="GridMap" parent="Ground"]
+mesh_library = ExtResource("3_g2il3")
+cell_size = Vector3(2, 0.01, 2)
+cell_scale = 2.0
+data = {
+"cells": PackedInt32Array(0, 1, 4, 0, 0, 4, 65535, 0, 5, 65535, 1, 5, 1, 2, 0, 0, 2, 0, 65535, 2, 5, 65534, 2, 5, 65533, 2, 1, 65533, 3, 1, 65532, 3, 1, 1, 1, 2, 2, 1, 3, 3, 1, 3, 65534, 1, 1, 65533, 1, 1, 65532, 1, 1, 3, 0, 3, 65532, 2, 1, 65531, 2, 1, 1, 0, 2, 2, 0, 3, 2, 65535, 1, 1, 65535, 2, 0, 65535, 4, 65534, 0, 1, 65533, 0, 0, 65532, 0, 0, 65531, 0, 1, 65530, 0, 1, 65531, 1, 1, 0, 65534, 1, 65535, 65534, 5, 65535, 65533, 1, 65534, 65533, 1, 65534, 65534, 1, 65533, 65534, 1, 65533, 65535, 0, 1, 65534, 2, 65535, 65535, 5, 65534, 65535, 1, 65532, 65535, 1, 65534, 3, 1, 65535, 3, 1, 0, 3, 1, 1, 3, 3, 2, 2, 3, 65533, 65533, 1, 65532, 65533, 0, 65532, 65534, 1, 65531, 65534, 1, 65531, 65535, 0, 0, 65533, 1, 3, 2, 3, 4, 0, 1, 3, 65535, 3, 3, 65534, 3, 2, 65534, 3, 1, 65533, 2, 0, 65532, 1, 65535, 65532, 1, 65534, 65532, 1, 65533, 65532, 1, 65531, 65533, 1, 65530, 65534, 0, 65530, 65535, 0, 65530, 1, 0, 65530, 2, 1, 65531, 3, 0, 65532, 4, 0, 65533, 4, 0, 65534, 4, 1, 65535, 4, 1, 65529, 65535, 0, 65529, 0, 0, 65529, 1, 0, 65529, 2, 0, 65530, 3, 0, 0, 4, 1, 1, 4, 1, 2, 3, 3, 2, 65533, 1, 65532, 65532, 0, 65531, 4, 0, 4, 2, 1, 4, 1, 1, 5, 65535, 1, 4, 65534, 1, 4, 65533, 0, 3, 65533, 1, 3, 65532, 0, 2, 65532, 0, 1, 65532, 0, 65529, 3, 0, 65530, 4, 0, 4, 65535, 1, 3, 3, 1, 65533, 5, 0, 65534, 5, 0, 65535, 5, 0, 0, 5, 0, 1, 5, 1, 2, 4, 1, 5, 1, 1, 5, 0, 1, 3, 4, 1, 4, 3, 1, 5, 2, 0, 65530, 5, 0, 65531, 6, 0, 65531, 7, 0, 65532, 7, 0, 65533, 8, 0, 65534, 8, 0, 65535, 8, 0, 0, 8, 0, 1, 7, 0, 2, 7, 0, 3, 6, 0, 4, 5, 0, 5, 4, 0, 6, 3, 0, 7, 2, 0, 7, 0, 0, 7, 65535, 0, 7, 65534, 0, 7, 65533, 0, 7, 65532, 0, 6, 65531, 0, 5, 65530, 0, 4, 65530, 0, 3, 65529, 0, 2, 65529, 0, 1, 65529, 0, 0, 65529, 0, 65535, 65529, 0, 65534, 65530, 0, 65533, 65530, 0, 65532, 65531, 0, 65531, 65532, 0, 65529, 4, 0, 65530, 6, 0, 65533, 7, 0, 65534, 7, 0, 65535, 7, 0, 0, 6, 0, 1, 6, 1, 2, 5, 1, 5, 65534, 1, 0, 65531, 0, 65535, 65531, 0, 65530, 65533, 0, 65529, 65534, 0, 65528, 65535, 0, 65527, 0, 0, 65527, 1, 0, 65526, 2, 0, 65526, 4, 0, 65526, 5, 0, 65527, 6, 0, 65528, 7, 0, 65529, 8, 0, 65530, 8, 0, 65531, 8, 0, 65532, 8, 0, 0, 7, 0, 5, 65533, 0, 3, 65531, 0, 2, 65531, 0, 1, 65530, 0, 0, 65530, 0, 65534, 65529, 0, 65532, 65530, 0, 65531, 65530, 0, 65530, 65531, 0, 65529, 65532, 0, 65528, 65533, 0, 65528, 65534, 0, 65527, 2, 0, 65528, 3, 0, 65528, 4, 0, 65529, 5, 0, 65529, 6, 0, 65530, 7, 0, 0, 9, 0, 1, 9, 0, 3, 8, 0, 5, 8, 0, 6, 7, 0, 7, 7, 0, 8, 6, 0, 9, 5, 0, 10, 3, 0, 11, 2, 0, 11, 1, 0, 10, 0, 0, 10, 65535, 0, 9, 65534, 0, 8, 65533, 0, 6, 65532, 0, 5, 65532, 0, 4, 65531, 0, 65528, 1, 0, 65527, 4, 0, 65527, 5, 0, 65528, 5, 0, 65534, 6, 0, 65535, 6, 0, 1, 65531, 0, 65535, 65530, 0, 65531, 65531, 0, 65530, 65532, 0, 65528, 0, 0, 65528, 2, 0, 65532, 6, 0, 65533, 6, 0, 3, 5, 1, 4, 4, 1, 5, 3, 0, 6, 2, 0, 6, 1, 0, 6, 0, 0, 6, 65535, 0, 6, 65534, 0, 4, 65532, 0, 65534, 65531, 0, 65531, 5, 0, 65532, 5, 0, 65534, 65528, 0, 65533, 65528, 0, 65532, 65528, 0, 65531, 65529, 0, 65530, 65529, 0, 65529, 65530, 0, 65529, 65531, 0, 65528, 65532, 0, 3, 65530, 0, 65526, 0, 0, 65525, 2, 0, 65524, 3, 0, 65523, 5, 0, 65522, 6, 0, 65522, 7, 0, 65522, 8, 0, 65523, 8, 0, 65524, 8, 0, 65525, 7, 0, 65526, 7, 0, 65527, 65535, 0, 65526, 3, 0, 65525, 4, 0, 65524, 6, 0, 65524, 9, 0, 65523, 10, 0, 65523, 11, 0, 65523, 12, 0, 65524, 12, 0, 65525, 11, 0, 65525, 10, 0, 65526, 9, 0, 65527, 8, 0, 65533, 65531, 0, 1, 8, 0, 2, 8, 0, 4, 8, 0, 8, 7, 0, 9, 6, 0, 10, 5, 0, 11, 4, 0, 11, 3, 0, 12, 2, 0, 11, 0, 0, 9, 0, 0, 8, 0, 0, 7, 1, 0, 4, 6, 0, 3, 7, 0, 5, 7, 0, 6, 6, 0, 7, 5, 0, 7, 4, 0, 7, 3, 0, 5, 5, 0, 5, 6, 0, 8, 3, 0, 9, 3, 0, 10, 2, 0, 10, 1, 0, 9, 2, 0, 8, 4, 0, 7, 6, 0, 12, 0, 0, 13, 65535, 0, 13, 0, 0, 12, 1, 0, 9, 4, 0, 8, 5, 0, 10, 4, 0, 11, 65535, 0, 11, 65534, 0, 11, 65533, 0, 11, 65532, 0, 10, 65534, 0, 10, 65533, 0, 10, 65532, 0, 10, 65530, 0, 10, 65529, 0, 10, 65531, 0, 9, 65535, 0, 8, 2, 0, 8, 1, 0, 8, 65535, 0, 8, 65534, 0, 8, 65532, 0, 9, 65533, 0, 8, 65531, 0, 8, 65530, 0, 8, 65529, 0, 9, 65532, 0, 9, 1, 0, 9, 65531, 0, 9, 65530, 0, 9, 65529, 0, 9, 65528, 0, 10, 65528, 0, 7, 65531, 0, 7, 65530, 0, 7, 65529, 0, 7, 65528, 0, 4, 9, 0, 4, 10, 0, 5, 65529, 0, 5, 65528, 0, 5, 65531, 0, 6, 65533, 0, 6, 4, 0, 6, 5, 0, 6, 8, 0, 2, 6, 1, 4, 7, 0, 65534, 9, 0, 65533, 9, 0, 65532, 10, 0, 65531, 10, 0, 65530, 10, 0, 65529, 10, 0, 65533, 10, 0, 3, 9, 0, 5, 9, 0, 6, 9, 0, 2, 9, 0, 65535, 9, 0, 65532, 9, 0, 65531, 9, 0, 65530, 9, 0, 65529, 9, 0, 65535, 10, 0, 0, 10, 0, 1, 10, 0, 65525, 5, 0, 65524, 4, 0, 65525, 3, 0, 65526, 6, 0, 65527, 7, 0, 65527, 9, 0, 65527, 10, 0, 65527, 11, 0, 65528, 11, 0, 65528, 10, 0, 65528, 9, 0, 65528, 8, 0, 65528, 6, 0, 65529, 7, 0, 6, 65528, 0, 7, 65527, 0, 8, 65527, 0, 6, 65527, 0, 4, 65528, 0, 3, 65528, 0, 2, 65528, 0, 1, 65528, 0, 4, 65529, 0, 65532, 65527, 0, 65531, 65526, 0, 65532, 65526, 0, 65533, 65527, 0, 65534, 65527, 0, 65535, 65528, 0, 0, 65528, 0, 6, 65529, 0, 2, 65530, 0, 6, 65530, 0, 8, 65528, 0, 65533, 65529, 0, 65532, 65529, 0, 65530, 65530, 0, 65529, 65533, 0, 65527, 3, 0, 65534, 10, 0, 2, 10, 0, 3, 10, 0, 7, 8, 0, 8, 8, 0, 9, 8, 0, 9, 7, 0, 10, 6, 0, 11, 5, 0, 12, 3, 0, 12, 65535, 0, 12, 65534, 0, 12, 65533, 0, 12, 65532, 0, 12, 65531, 0, 11, 65531, 0, 11, 65530, 0, 11, 65529, 0, 6, 65526, 0, 5, 65526, 0, 5, 65527, 0, 4, 65527, 0, 3, 65527, 0, 2, 65527, 0, 1, 65527, 0, 0, 65527, 0, 65535, 65527, 0, 4, 65526, 0, 3, 65526, 0, 2, 65526, 0, 1, 65526, 0, 0, 65526, 0, 65535, 65526, 0, 65534, 65526, 0, 65531, 65527, 0, 65535, 65525, 0, 65534, 65525, 0, 65533, 65525, 0, 65532, 65525, 0, 65531, 65525, 0, 65530, 65526, 0, 65533, 65526, 0, 4, 65525, 0, 5, 65525, 0, 3, 65525, 0, 2, 65525, 0, 1, 65525, 0, 0, 65525, 0, 2, 65524, 0, 3, 65524, 0, 4, 65524, 0, 1, 65524, 0, 0, 65524, 0, 65535, 65524, 0, 65533, 65524, 0, 65532, 65524, 0, 65531, 65524, 0, 65534, 65524, 0, 65531, 65528, 0, 65530, 65528, 0, 65529, 65529, 0, 65528, 65530, 0, 65528, 65531, 0, 65529, 65528, 0, 65530, 65527, 0, 65530, 65525, 0, 65529, 65527, 0, 65527, 65532, 0, 65527, 65533, 0, 65530, 65524, 0, 65529, 65526, 0, 65528, 65528, 0, 65528, 65529, 0, 65527, 65530, 0, 65527, 65531, 0, 65526, 65532, 0, 65527, 65529, 0, 65526, 65534, 0, 65526, 65535, 0, 65525, 0, 0, 65525, 1, 0, 65526, 1, 0, 65527, 65534, 0, 65526, 65533, 0, 65525, 65535, 0, 65524, 1, 0, 65524, 0, 0, 65525, 65534, 0, 65525, 65533, 0, 65526, 65531, 0, 65526, 65530, 0, 65527, 65528, 0, 65528, 65527, 0, 65524, 65534, 0, 65525, 65532, 0, 65526, 65529, 0, 65528, 65526, 0, 65529, 65525, 0, 65527, 65527, 0, 65528, 65525, 0, 65527, 65526, 0, 65526, 65528, 0, 65525, 65529, 0, 65525, 65530, 0, 65524, 65530, 0, 65524, 65531, 0, 65523, 65532, 0, 65523, 65533, 0, 65523, 65534, 0, 65523, 65535, 0, 65523, 0, 0, 65523, 1, 0, 65523, 2, 0, 65523, 3, 0, 65523, 4, 0, 65523, 6, 0, 65523, 7, 0, 65524, 7, 0, 65524, 5, 0, 65525, 6, 0, 65525, 8, 0, 65525, 9, 0, 65526, 8, 0, 65524, 10, 0, 65524, 11, 0, 65526, 10, 0, 65526, 11, 0, 65524, 2, 0, 65524, 65535, 0, 65524, 65533, 0, 65524, 65532, 0, 65522, 65534, 0, 65526, 65527, 0, 65529, 65524, 0, 65528, 65524, 0, 65526, 65526, 0, 65525, 65527, 0, 65525, 65528, 0, 65524, 65528, 0, 65524, 65529, 0, 65523, 65530, 0, 65523, 65531, 0, 65522, 65531, 0, 65522, 65532, 0, 65522, 65533, 0, 65522, 65535, 0, 65522, 0, 0, 65522, 1, 0, 65522, 2, 0, 65521, 3, 0, 65521, 4, 0, 65522, 4, 0, 65522, 5, 0, 65523, 9, 0, 65522, 3, 0, 65525, 65531, 0)
+}
+
+[node name="Control" type="Control" parent="."]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="Date" type="Label" parent="Control"]
+layout_mode = 1
+offset_left = 50.0
+offset_top = 50.0
+offset_right = 278.0
+offset_bottom = 83.0
+size_flags_vertical = 1
+text = "SEP. 17 1998"
+label_settings = SubResource("LabelSettings_hbd1r")
+uppercase = true
+
+[node name="Time" type="Label" parent="Control"]
+layout_mode = 1
+anchors_preset = 2
+anchor_top = 1.0
+anchor_bottom = 1.0
+offset_left = 50.0
+offset_top = -83.0
+offset_right = 278.0
+offset_bottom = -50.0
+grow_vertical = 0
+size_flags_vertical = 1
+text = "??:?? PM"
+label_settings = SubResource("LabelSettings_hbd1r")
+uppercase = true
+
+[node name="NightmareText" type="Label" parent="Control"]
+layout_mode = 1
+anchors_preset = 2
+anchor_top = 1.0
+anchor_bottom = 1.0
+offset_left = 50.0
+offset_top = -113.0
+offset_right = 544.0
+offset_bottom = -80.0
+grow_vertical = 0
+size_flags_vertical = 1
+text = "Nightmare detected, beware"
+label_settings = SubResource("LabelSettings_hbd1r")
+
+[node name="RightTopText" type="Label" parent="Control"]
+layout_mode = 1
+anchors_preset = 1
+anchor_left = 1.0
+anchor_right = 1.0
+offset_left = -107.0
+offset_top = 50.0
+offset_right = -50.0
+offset_bottom = 83.0
+grow_horizontal = 0
+size_flags_vertical = 1
+text = "Map"
+label_settings = SubResource("LabelSettings_hbd1r")
+uppercase = true
+
+[node name="RightBottomText" type="Label" parent="Control"]
+layout_mode = 1
+anchors_preset = 3
+anchor_left = 1.0
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -126.0
+offset_top = -83.0
+offset_right = -50.0
+offset_bottom = -50.0
+grow_horizontal = 0
+grow_vertical = 0
+size_flags_vertical = 1
+text = "item"
+label_settings = SubResource("LabelSettings_hbd1r")
+uppercase = true
+
+[node name="Shaders" type="ColorRect" parent="."]
+material = SubResource("ShaderMaterial_s2ner")
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="DebugMenu" parent="." node_paths=PackedStringArray("fps", "frame_time", "frame_number", "frame_history_total_avg", "frame_history_total_min", "frame_history_total_max", "frame_history_total_last", "frame_history_cpu_avg", "frame_history_cpu_min", "frame_history_cpu_max", "frame_history_cpu_last", "frame_history_gpu_avg", "frame_history_gpu_min", "frame_history_gpu_max", "frame_history_gpu_last", "fps_graph", "total_graph", "cpu_graph", "gpu_graph", "information", "settings") instance=ExtResource("3_s7w0p")]
+visible = false
+fps = NodePath("DebugMenu/VBoxContainer/FPS")
+frame_time = NodePath("DebugMenu/VBoxContainer/FrameTime")
+frame_number = NodePath("DebugMenu/VBoxContainer/FrameNumber")
+frame_history_total_avg = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/TotalAvg")
+frame_history_total_min = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/TotalMin")
+frame_history_total_max = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/TotalMax")
+frame_history_total_last = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/TotalLast")
+frame_history_cpu_avg = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/CPUAvg")
+frame_history_cpu_min = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/CPUMin")
+frame_history_cpu_max = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/CPUMax")
+frame_history_cpu_last = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/CPULast")
+frame_history_gpu_avg = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/GPUAvg")
+frame_history_gpu_min = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/GPUMin")
+frame_history_gpu_max = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/GPUMax")
+frame_history_gpu_last = NodePath("DebugMenu/VBoxContainer/FrameTimeHistory/GPULast")
+fps_graph = NodePath("DebugMenu/VBoxContainer/FPSGraph/Graph")
+total_graph = NodePath("DebugMenu/VBoxContainer/TotalGraph/Graph")
+cpu_graph = NodePath("DebugMenu/VBoxContainer/CPUGraph/Graph")
+gpu_graph = NodePath("DebugMenu/VBoxContainer/GPUGraph/Graph")
+information = NodePath("DebugMenu/VBoxContainer/Information")
+settings = NodePath("DebugMenu/VBoxContainer/Settings")
diff --git a/tiles.tscn b/tiles.tscn
new file mode 100644 (file)
index 0000000..e08c86e
--- /dev/null
@@ -0,0 +1,75 @@
+[gd_scene load_steps=19 format=3 uid="uid://c3xng6m8wjxl"]
+
+[ext_resource type="Texture2D" uid="uid://d2lh2trm3byf3" path="res://addons/kenney_prototype_textures/green/texture_01.png" id="1_pcdop"]
+[ext_resource type="Texture2D" uid="uid://dggrurnpvwkr8" path="res://addons/kenney_prototype_textures/dark/texture_01.png" id="2_lef1k"]
+[ext_resource type="Texture2D" uid="uid://cf5bbls5mxns4" path="res://addons/kenney_prototype_textures/orange/texture_01.png" id="3_aplr7"]
+[ext_resource type="Texture2D" uid="uid://bosq5s8lcucvl" path="res://addons/kenney_prototype_textures/purple/texture_01.png" id="4_1bhfn"]
+[ext_resource type="Texture2D" uid="uid://d0d3ij542x0sn" path="res://addons/kenney_prototype_textures/red/texture_01.png" id="5_cssts"]
+[ext_resource type="Texture2D" uid="uid://co8yg2utkkebc" path="res://addons/kenney_prototype_textures/light/texture_01.png" id="6_23h70"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ujftc"]
+albedo_texture = ExtResource("1_pcdop")
+
+[sub_resource type="QuadMesh" id="QuadMesh_emh7b"]
+material = SubResource("StandardMaterial3D_ujftc")
+orientation = 1
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_feaqb"]
+albedo_texture = ExtResource("2_lef1k")
+
+[sub_resource type="QuadMesh" id="QuadMesh_qesuh"]
+material = SubResource("StandardMaterial3D_feaqb")
+orientation = 1
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_t85in"]
+albedo_texture = ExtResource("3_aplr7")
+
+[sub_resource type="QuadMesh" id="QuadMesh_6jurq"]
+material = SubResource("StandardMaterial3D_t85in")
+orientation = 1
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_4bskr"]
+albedo_texture = ExtResource("4_1bhfn")
+
+[sub_resource type="QuadMesh" id="QuadMesh_oti7b"]
+material = SubResource("StandardMaterial3D_4bskr")
+orientation = 1
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_yhpp5"]
+albedo_texture = ExtResource("5_cssts")
+
+[sub_resource type="QuadMesh" id="QuadMesh_epole"]
+material = SubResource("StandardMaterial3D_yhpp5")
+orientation = 1
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3cxwk"]
+albedo_texture = ExtResource("6_23h70")
+
+[sub_resource type="QuadMesh" id="QuadMesh_fo3od"]
+material = SubResource("StandardMaterial3D_3cxwk")
+orientation = 1
+
+[node name="Node3D" type="Node3D"]
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
+mesh = SubResource("QuadMesh_emh7b")
+
+[node name="MeshInstance3D2" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0)
+mesh = SubResource("QuadMesh_qesuh")
+
+[node name="MeshInstance3D3" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0)
+mesh = SubResource("QuadMesh_6jurq")
+
+[node name="MeshInstance3D4" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0, 0)
+mesh = SubResource("QuadMesh_oti7b")
+
+[node name="MeshInstance3D5" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0, 0)
+mesh = SubResource("QuadMesh_epole")
+
+[node name="MeshInstance3D6" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0, 0)
+mesh = SubResource("QuadMesh_fo3od")