From b9d16360b962599bae66b15bb339849d3e9329b2 Mon Sep 17 00:00:00 2001 From: KawaiiZenbo Date: Sat, 25 Oct 2025 16:07:28 -0700 Subject: [PATCH] add spawn menu for props --- Scenes/GUI/InGameMenu.tscn | 195 +++++++++++++++++++------- Scripts/Configs/Props.gd | 9 ++ Scripts/Configs/Props.gd.uid | 1 + Scripts/InGameMenu.gd | 17 +++ Scripts/Player/Player.gd | 10 +- Scripts/Player/Player.tscn | 15 +- UI/PropIcons/ShowroomChair.png | Bin 0 -> 2084 bytes UI/PropIcons/ShowroomChair.png.import | 40 ++++++ project.godot | 6 + 9 files changed, 231 insertions(+), 62 deletions(-) create mode 100644 Scripts/Configs/Props.gd create mode 100644 Scripts/Configs/Props.gd.uid create mode 100644 UI/PropIcons/ShowroomChair.png create mode 100644 UI/PropIcons/ShowroomChair.png.import diff --git a/Scenes/GUI/InGameMenu.tscn b/Scenes/GUI/InGameMenu.tscn index be61c74..bf00998 100644 --- a/Scenes/GUI/InGameMenu.tscn +++ b/Scenes/GUI/InGameMenu.tscn @@ -5,27 +5,27 @@ [ext_resource type="Texture2D" uid="uid://bwhgy4u37jmo1" path="res://UI/TransportControls/Pause.png" id="4_j5gkc"] [ext_resource type="Texture2D" uid="uid://xllpr3qc064c" path="res://UI/TransportControls/Play.png" id="5_4hvdi"] -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_cp535"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_fxnf3"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_esrnp"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_okjcw"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_5t5ap"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_j5gkc"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4hvdi"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_76ga2"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ausu3"] +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_x8byx"] [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_b5eqy"] -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_x8byx"] +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ausu3"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_76ga2"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4hvdi"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_j5gkc"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_5t5ap"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_okjcw"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_esrnp"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_fxnf3"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_cp535"] [node name="InGameMenu" type="Control"] layout_mode = 3 @@ -51,7 +51,7 @@ anchors_preset = 2 anchor_top = 1.0 anchor_bottom = 1.0 offset_left = 60.0 -offset_top = -380.0 +offset_top = -432.0 offset_right = 324.0 offset_bottom = -64.0 grow_vertical = 0 @@ -88,20 +88,29 @@ offset_right = 260.0 offset_bottom = 208.0 text = "Flow Controls" -[node name="ExitMenuButton" type="Button" parent="Buttons"] +[node name="SpawnMenuButton" type="Button" parent="Buttons"] layout_mode = 0 offset_left = 4.0 offset_top = 212.0 offset_right = 260.0 offset_bottom = 260.0 -text = "Exit to Menu" +text = "Spawn Menu +" -[node name="ExitButton" type="Button" parent="Buttons"] +[node name="ExitMenuButton" type="Button" parent="Buttons"] layout_mode = 0 offset_left = 4.0 offset_top = 264.0 offset_right = 260.0 offset_bottom = 312.0 +text = "Exit to Menu" + +[node name="ExitButton" type="Button" parent="Buttons"] +layout_mode = 0 +offset_left = 4.0 +offset_top = 316.0 +offset_right = 260.0 +offset_bottom = 364.0 text = "Exit to Desktop" [node name="TransportControls" type="Panel" parent="."] @@ -110,9 +119,9 @@ anchors_preset = 2 anchor_top = 1.0 anchor_bottom = 1.0 offset_left = 60.0 -offset_top = -476.0 +offset_top = -524.0 offset_right = 324.0 -offset_bottom = -388.0 +offset_bottom = -436.0 grow_vertical = 0 [node name="ShowLabel" type="Label" parent="TransportControls"] @@ -189,17 +198,17 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -theme_override_styles/focus = SubResource("StyleBoxEmpty_cp535") -theme_override_styles/disabled_mirrored = SubResource("StyleBoxEmpty_fxnf3") -theme_override_styles/disabled = SubResource("StyleBoxEmpty_esrnp") -theme_override_styles/hover_pressed_mirrored = SubResource("StyleBoxEmpty_okjcw") -theme_override_styles/hover_pressed = SubResource("StyleBoxEmpty_5t5ap") -theme_override_styles/hover_mirrored = SubResource("StyleBoxEmpty_j5gkc") -theme_override_styles/hover = SubResource("StyleBoxEmpty_4hvdi") -theme_override_styles/pressed_mirrored = SubResource("StyleBoxEmpty_76ga2") -theme_override_styles/pressed = SubResource("StyleBoxEmpty_ausu3") -theme_override_styles/normal_mirrored = SubResource("StyleBoxEmpty_b5eqy") theme_override_styles/normal = SubResource("StyleBoxEmpty_x8byx") +theme_override_styles/normal_mirrored = SubResource("StyleBoxEmpty_b5eqy") +theme_override_styles/pressed = SubResource("StyleBoxEmpty_ausu3") +theme_override_styles/pressed_mirrored = SubResource("StyleBoxEmpty_76ga2") +theme_override_styles/hover = SubResource("StyleBoxEmpty_4hvdi") +theme_override_styles/hover_mirrored = SubResource("StyleBoxEmpty_j5gkc") +theme_override_styles/hover_pressed = SubResource("StyleBoxEmpty_5t5ap") +theme_override_styles/hover_pressed_mirrored = SubResource("StyleBoxEmpty_okjcw") +theme_override_styles/disabled = SubResource("StyleBoxEmpty_esrnp") +theme_override_styles/disabled_mirrored = SubResource("StyleBoxEmpty_fxnf3") +theme_override_styles/focus = SubResource("StyleBoxEmpty_cp535") [node name="DialogPanel" type="Panel" parent="FlowControlsScreen"] layout_mode = 1 @@ -270,17 +279,17 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -theme_override_styles/focus = SubResource("StyleBoxEmpty_cp535") -theme_override_styles/disabled_mirrored = SubResource("StyleBoxEmpty_fxnf3") -theme_override_styles/disabled = SubResource("StyleBoxEmpty_esrnp") -theme_override_styles/hover_pressed_mirrored = SubResource("StyleBoxEmpty_okjcw") -theme_override_styles/hover_pressed = SubResource("StyleBoxEmpty_5t5ap") -theme_override_styles/hover_mirrored = SubResource("StyleBoxEmpty_j5gkc") -theme_override_styles/hover = SubResource("StyleBoxEmpty_4hvdi") -theme_override_styles/pressed_mirrored = SubResource("StyleBoxEmpty_76ga2") -theme_override_styles/pressed = SubResource("StyleBoxEmpty_ausu3") -theme_override_styles/normal_mirrored = SubResource("StyleBoxEmpty_b5eqy") theme_override_styles/normal = SubResource("StyleBoxEmpty_x8byx") +theme_override_styles/normal_mirrored = SubResource("StyleBoxEmpty_b5eqy") +theme_override_styles/pressed = SubResource("StyleBoxEmpty_ausu3") +theme_override_styles/pressed_mirrored = SubResource("StyleBoxEmpty_76ga2") +theme_override_styles/hover = SubResource("StyleBoxEmpty_4hvdi") +theme_override_styles/hover_mirrored = SubResource("StyleBoxEmpty_j5gkc") +theme_override_styles/hover_pressed = SubResource("StyleBoxEmpty_5t5ap") +theme_override_styles/hover_pressed_mirrored = SubResource("StyleBoxEmpty_okjcw") +theme_override_styles/disabled = SubResource("StyleBoxEmpty_esrnp") +theme_override_styles/disabled_mirrored = SubResource("StyleBoxEmpty_fxnf3") +theme_override_styles/focus = SubResource("StyleBoxEmpty_cp535") [node name="DialogPanel" type="Panel" parent="CosmeticsScreen"] layout_mode = 1 @@ -326,6 +335,81 @@ offset_bottom = -4.0 max_value = 0.0 step = 1.0 +[node name="SpawnMenu" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="ColorRect" type="ColorRect" parent="SpawnMenu"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.121569, 0.121569, 0.121569, 0.501961) + +[node name="InputEater" type="Button" parent="SpawnMenu"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/normal = SubResource("StyleBoxEmpty_x8byx") +theme_override_styles/normal_mirrored = SubResource("StyleBoxEmpty_b5eqy") +theme_override_styles/pressed = SubResource("StyleBoxEmpty_ausu3") +theme_override_styles/pressed_mirrored = SubResource("StyleBoxEmpty_76ga2") +theme_override_styles/hover = SubResource("StyleBoxEmpty_4hvdi") +theme_override_styles/hover_mirrored = SubResource("StyleBoxEmpty_j5gkc") +theme_override_styles/hover_pressed = SubResource("StyleBoxEmpty_5t5ap") +theme_override_styles/hover_pressed_mirrored = SubResource("StyleBoxEmpty_okjcw") +theme_override_styles/disabled = SubResource("StyleBoxEmpty_esrnp") +theme_override_styles/disabled_mirrored = SubResource("StyleBoxEmpty_fxnf3") +theme_override_styles/focus = SubResource("StyleBoxEmpty_cp535") + +[node name="DialogPanel" type="Panel" parent="SpawnMenu"] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.5 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = 64.0 +offset_right = -64.0 +offset_bottom = -64.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="SpawnButton" type="Button" parent="SpawnMenu/DialogPanel"] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -154.0 +offset_top = -52.0 +offset_right = -4.0 +offset_bottom = -4.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "Spawn" + +[node name="ItemList" type="ItemList" parent="SpawnMenu/DialogPanel"] +layout_mode = 1 +anchors_preset = -1 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 4.0 +offset_top = 4.0 +offset_right = -4.0 +offset_bottom = -56.0 +same_column_width = true +fixed_icon_size = Vector2i(64, 64) + [node name="LoadShowScreen" type="Control" parent="."] visible = false layout_mode = 1 @@ -351,17 +435,17 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -theme_override_styles/focus = SubResource("StyleBoxEmpty_cp535") -theme_override_styles/disabled_mirrored = SubResource("StyleBoxEmpty_fxnf3") -theme_override_styles/disabled = SubResource("StyleBoxEmpty_esrnp") -theme_override_styles/hover_pressed_mirrored = SubResource("StyleBoxEmpty_okjcw") -theme_override_styles/hover_pressed = SubResource("StyleBoxEmpty_5t5ap") -theme_override_styles/hover_mirrored = SubResource("StyleBoxEmpty_j5gkc") -theme_override_styles/hover = SubResource("StyleBoxEmpty_4hvdi") -theme_override_styles/pressed_mirrored = SubResource("StyleBoxEmpty_76ga2") -theme_override_styles/pressed = SubResource("StyleBoxEmpty_ausu3") -theme_override_styles/normal_mirrored = SubResource("StyleBoxEmpty_b5eqy") theme_override_styles/normal = SubResource("StyleBoxEmpty_x8byx") +theme_override_styles/normal_mirrored = SubResource("StyleBoxEmpty_b5eqy") +theme_override_styles/pressed = SubResource("StyleBoxEmpty_ausu3") +theme_override_styles/pressed_mirrored = SubResource("StyleBoxEmpty_76ga2") +theme_override_styles/hover = SubResource("StyleBoxEmpty_4hvdi") +theme_override_styles/hover_mirrored = SubResource("StyleBoxEmpty_j5gkc") +theme_override_styles/hover_pressed = SubResource("StyleBoxEmpty_5t5ap") +theme_override_styles/hover_pressed_mirrored = SubResource("StyleBoxEmpty_okjcw") +theme_override_styles/disabled = SubResource("StyleBoxEmpty_esrnp") +theme_override_styles/disabled_mirrored = SubResource("StyleBoxEmpty_fxnf3") +theme_override_styles/focus = SubResource("StyleBoxEmpty_cp535") [node name="DialogPanel" type="Panel" parent="LoadShowScreen"] layout_mode = 1 @@ -498,6 +582,7 @@ filters = PackedStringArray("*.ust") [connection signal="pressed" from="Buttons/LoadShowButton" to="." method="_on_load_show_button_pressed"] [connection signal="pressed" from="Buttons/CosmeticsButton" to="." method="_on_cosmetics_button_pressed"] [connection signal="pressed" from="Buttons/FlowControlsButton" to="." method="_on_flow_controls_button_pressed"] +[connection signal="pressed" from="Buttons/SpawnMenuButton" to="." method="_on_spawn_menu_button_pressed"] [connection signal="pressed" from="Buttons/ExitMenuButton" to="." method="_on_exit_menu_button_pressed"] [connection signal="pressed" from="Buttons/ExitButton" to="." method="_on_exit_button_pressed"] [connection signal="pressed" from="TransportControls/StopButton" to="." method="_on_stop_button_pressed"] @@ -507,6 +592,8 @@ filters = PackedStringArray("*.ust") [connection signal="value_changed" from="FlowControlsScreen/DialogPanel/VScrollBar" to="." method="_on_flow_v_scroll_bar_value_changed"] [connection signal="pressed" from="CosmeticsScreen/InputEater" to="." method="_on_input_eater_pressed"] [connection signal="value_changed" from="CosmeticsScreen/DialogPanel/VScrollBar" to="." method="_on_cosmetics_v_scroll_bar_value_changed"] +[connection signal="pressed" from="SpawnMenu/InputEater" to="." method="_on_input_eater_pressed"] +[connection signal="pressed" from="SpawnMenu/DialogPanel/SpawnButton" to="." method="_on_spawn_button_pressed"] [connection signal="pressed" from="LoadShowScreen/InputEater" to="." method="_on_input_eater_pressed"] [connection signal="pressed" from="LoadShowScreen/DialogPanel/InBrowseButton" to="." method="_on_in_browse_button_pressed"] [connection signal="pressed" from="LoadShowScreen/DialogPanel/CancelButton" to="." method="_on_cancel_button_pressed"] diff --git a/Scripts/Configs/Props.gd b/Scripts/Configs/Props.gd new file mode 100644 index 0000000..f20ba07 --- /dev/null +++ b/Scripts/Configs/Props.gd @@ -0,0 +1,9 @@ +extends Node + +var SpawnableProps = [ + { + "name": "90s Showroom Chair", + "path": "res://Scenes/Props/Physics/ShowroomChair.tscn", + "icon": "res://UI/PropIcons/ShowroomChair.png" + }, +] diff --git a/Scripts/Configs/Props.gd.uid b/Scripts/Configs/Props.gd.uid new file mode 100644 index 0000000..d354955 --- /dev/null +++ b/Scripts/Configs/Props.gd.uid @@ -0,0 +1 @@ +uid://bdc1kjji1r31a diff --git a/Scripts/InGameMenu.gd b/Scripts/InGameMenu.gd index 75953fb..b01c0aa 100644 --- a/Scripts/InGameMenu.gd +++ b/Scripts/InGameMenu.gd @@ -18,6 +18,9 @@ var stage func _ready() -> void: stage = FreeRoamMaps.MapIndex[get_node("../").current_map]["stage"] + for prop in Props.SpawnableProps: + $SpawnMenu/DialogPanel/ItemList.add_item(prop["name"], load(prop["icon"])) + if (GlobalVariables.shadows == 0): get_tree().set_group("lights", "shadow_enabled", false) @@ -106,6 +109,7 @@ func _on_input_eater_pressed() -> void: $CosmeticsScreen.visible = false $FlowControlsScreen.visible = false $LoadShowScreen.visible = false + $SpawnMenu.visible = false func _on_cosmetics_v_scroll_bar_value_changed(value: float) -> void: $CosmeticsScreen/DialogPanel/InvisibleMask/CosmeticsHandle.position.y = value * -44 @@ -244,3 +248,16 @@ func _input(event: InputEvent) -> void: elif event.is_action_pressed("freeroam_transport_stop"): _on_stop_button_pressed() + +func _on_spawn_button_pressed() -> void: + if (!$SpawnMenu/DialogPanel/ItemList.is_anything_selected()): return + var selectedIndex = $SpawnMenu/DialogPanel/ItemList.get_selected_items()[0] + var spawningProp = load(Props.SpawnableProps[selectedIndex]["path"]).instantiate() + var vector = get_node("../Camera/SpawnPosition").global_position + spawningProp.position = vector + get_tree().root.add_child(spawningProp) + + +func _on_spawn_menu_button_pressed() -> void: + $BG.visible = false + $SpawnMenu.visible = true diff --git a/Scripts/Player/Player.gd b/Scripts/Player/Player.gd index fa6decb..d4e9e32 100644 --- a/Scripts/Player/Player.gd +++ b/Scripts/Player/Player.gd @@ -46,7 +46,7 @@ var hrx: float = 0 var hry: float = 0 var hrz: float = 0 -@onready var interactRay = $Camera/Interact +@onready var interactRay = $Camera/InteractRay @onready var camera: Camera3D = $Camera func _ready() -> void: @@ -75,40 +75,46 @@ func _unhandled_input(event: InputEvent) -> void: release_mouse() $InGameMenu.visible = true $InGameMenu/Buttons/ReturnButton.grab_focus() - pass elif event.is_action_pressed(&"freeroam_debug_menu"): $DebugMenu.visible = !$DebugMenu.visible elif event.is_action_pressed(&"freeroam_respawn"): + if (!interact): return self.position = startPosition walk_vel = Vector3(0, 0, 0) jump_vel = Vector3(0, 0, 0) grav_vel = Vector3(0, 0, 0) elif event.is_action_pressed(&"freeroam_flashlight_zoom_in"): + if (!interact): return if ($Camera/Flashlight.visible): if ($Camera/Flashlight.spot_angle > 2): $Camera/Flashlight.spot_angle -= 2 $FlashlightSizeSFX.pitch_scale = sqrt($Camera/Flashlight.spot_angle)-0.5 $FlashlightSizeSFX.play() elif event.is_action_pressed(&"freeroam_flashlight_zoom_out"): + if (!interact): return if ($Camera/Flashlight.visible): if ($Camera/Flashlight.spot_angle < 88): $Camera/Flashlight.spot_angle += 2 $FlashlightSizeSFX.pitch_scale = sqrt($Camera/Flashlight.spot_angle)-0.5 $FlashlightSizeSFX.play() elif event.is_action_pressed(&"freeroam_flashlight_zoom_reset"): + if (!interact): return if ($Camera/Flashlight.visible): $Camera/Flashlight.spot_angle = 30 $FlashlightSizeSFX.pitch_scale = sqrt($Camera/Flashlight.spot_angle)-0.5 $FlashlightSizeSFX.play() elif event.is_action_pressed(&"freeroam_camera_zoom_in"): + if (!interact): return if ($Camera.fov > 2): $Camera.fov -= 2 camera_sens = maxf(camera_sens - 0.1, 0.1) elif event.is_action_pressed(&"freeroam_camera_zoom_out"): + if (!interact): return if ($Camera.fov < 178): $Camera.fov += 2 camera_sens = minf(camera_sens + 0.1, 3) elif event.is_action_pressed(&"freeroam_camera_zoom_reset"): + if (!interact): return $Camera.fov = GlobalVariables.FOV camera_sens = 3 diff --git a/Scripts/Player/Player.tscn b/Scripts/Player/Player.tscn index 41fe705..b018dee 100644 --- a/Scripts/Player/Player.tscn +++ b/Scripts/Player/Player.tscn @@ -35,10 +35,18 @@ spot_range = 1000.0 spot_angle = 30.0 spot_angle_attenuation = 0.25 -[node name="Interact" type="RayCast3D" parent="Camera"] +[node name="InteractRay" type="RayCast3D" parent="Camera"] target_position = Vector3(0, 0, -2.5) hit_back_faces = false +[node name="SpawnPosition" type="Node3D" parent="Camera"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1.5) + +[node name="PropPusher" type="Node" parent="." node_paths=PackedStringArray("controller")] +script = ExtResource("8_7v0xc") +controller = NodePath("..") +enabled = true + [node name="DebugMenu" parent="." instance=ExtResource("3_ejydr")] visible = false mouse_filter = 2 @@ -60,8 +68,3 @@ volume_db = -5.0 [node name="FlashlightOffSFX" type="AudioStreamPlayer" parent="."] stream = ExtResource("7_7v0xc") volume_db = -5.0 - -[node name="PropPusher" type="Node" parent="." node_paths=PackedStringArray("controller")] -script = ExtResource("8_7v0xc") -controller = NodePath("..") -enabled = true diff --git a/UI/PropIcons/ShowroomChair.png b/UI/PropIcons/ShowroomChair.png new file mode 100644 index 0000000000000000000000000000000000000000..0635af3dfeee156bc6110849d81f3a3fb59d2a47 GIT binary patch literal 2084 zcmV+<2;29GP)DX=7n*SO79LIXAiLm2dz601R|RSafV}XK7<$Y*_#@ zGBx2UK~#90?VC$;8rc=c ze|`G_G!g=YWg%ODEjfwe8du8Ya@C~DyDYNs2goPM2TNr=lSL|}RJ@s)ic3)}jVwUu zfnEqu)32LF(=B9s93*<&#PNUAs73cZ_kYjpo^w%NzI-Y9KZZzJfTZz-fTRUT8dFJt z@B8?^|4GKuKFKI!!t*@#_V#%5<_(VHu&}Ve($W(1^Yf^x`m>BV6$E&mN4;KWYik?Z z9$=a#`Fx&syG^6fz%UFJ7Z^RbSdI04;mm-Y2^0IJn0%gf6gA0JaF6v$*U zoSvStx3|ac?k)!h2fTRkf^<3^+xUqS&}cLeLh#j-C)_EOV5kwguA?Xl#bOcP_mNW4 zZntSR8?3CX#x{PUPEblotJUK9^XKd}o6&vG^H3B80N?Z3-ripI!2$?ooMY%(N9faiIfoSaY^+P$vp7={5uwO15{e!ow- zT)y^PrBdba@Q|~!vsmOvi~!elaU6$6qY>Q;?LJh0+qNT8LhSGF<9QyvUN06o5+lI2 zZHmPrmzS4xyImL|K+3=bJkN^=kW%vc^=tb5K0s`tFi{iGb)D7KRa&hUQp)!Tux%Sn z3nKOA<|d|T^6=q9q?DvmsaWJl)C4q5L#P77Fz|iCxpQBJTy(aW(uQ32oZ>CSr&$2 zMBkYdiEBWZ=DMyMX+n4vsz6bcYtg{6tXTH~i4!2DyteYAzQA)m82Src*8vy|2A>B3 zzVD+76~}SVG%a$9p65jx5Zd`*Fo>Mq=;t_)tOgi5p64Niz;)cnBu1kEL&q0R`m-_t zRaJ3aHwc3=aCD(Y1SS!P7kYjvCAMvU9t8NlkFM(x5uxgb_AaGFh@meSCQZKY<2cUe zL4f1fBNM#}gP}=;SB3Np?ePE~^ac6=2oCLUvhhNfBD_PVBGtAZU=-KP4t7Q$$N*)D;;vasA zb8f-bBI==w_q~O22EM!si*YAG#7TfFJ)A6vk1DyVV?$!yVe+n-4T`sKNbP;fQdCAVs4wssPsF;*imY7@4A#wu8vO$2F z(h<5E*s-{pFpQ9(CAZ5lU6h?`aRA% z9lGrf?bl7}-)wOB>MhR2;7Z__w!zW+CV4oWPGcAbxm=EJw~MuZL2Lhl!@uv4|HT4} zUq9r|SNAbXIWh&4^h}0~p25&{G*u(3rjV}B`S}IAXQ!ODPH6n~-!%U6FFIRCAOo_> zIH<=?Jw=hycz z=d#Ss&63g$4$t@Lo_A?)>{0(_gM)wU;Pz|)48x#OsZgm@G0hABTU%REb{H2XB0vbi zt5>fm6bcxIL9JG!R;$tJbg0+sG@DKA(>~2_H)(#miMce#-Dg$GU$2nLW!PWeruDaN z&VM{Y`avBqm&;MB)mU0udT+IZn!yxl07D06S=P0Cxm=FNj~}zPw#LE10rh&FqoX7G zd*}T4r|;SM^AF6<<>;KA!;r|u@*=fbjbgF*lW{&wm*d35Z}WYh!C>&g{|O-|m&=sP zWh~30(P+|W)aiD+WYZ>tlr>cI3Ykpizm7FpD~Jmd6QJw*dm8W|q|<3uS65hBdC11b z2K|1YCr_S4ZLe_OI1T;-URn?yig&#r~$`%$D#(pL&oWvalCni9Mpt*UINN^j3 z9i+Gsi$R5sa9o6C@0%d(4^EvEWatQQq5Lp+59 zgvrpj2-Vni$0s10&GP8cqg%=MF~ky6N~O|`YITaDpeV|X5+O~~SYBSfrGy`OZyYbl z=kw(A`LVwr*z$Co)K5f;un798eiQI9B(@A;TP$fLMnKpAO&W=rK-dyb8i{E@ctR{` zd@+Hf2F_$MvG@6IgT#I^^YrP{*f%z}L84)B8ZaH{Sc3RMK+*yvjsE~&4}rb0H+T2| O0000