From 5e15c05a9de28e1ba132227351deebdbb281d13a Mon Sep 17 00:00:00 2001 From: curiouslad <31123517+curiouslad@users.noreply.github.com> Date: Tue, 8 Jul 2025 15:14:22 +0200 Subject: [PATCH 01/34] editor: Fix diagnostic popovers not being scrollable (#33581) Closes #32673 Release Notes: - Fixed diagnostic popovers not being scrollable --- crates/editor/src/hover_popover.rs | 86 +++++++++++++++++++++++------- 1 file changed, 67 insertions(+), 19 deletions(-) diff --git a/crates/editor/src/hover_popover.rs b/crates/editor/src/hover_popover.rs index cae4789535..bda229e346 100644 --- a/crates/editor/src/hover_popover.rs +++ b/crates/editor/src/hover_popover.rs @@ -381,10 +381,14 @@ fn show_hover( .anchor_after(local_diagnostic.range.end), }; + let scroll_handle = ScrollHandle::new(); + Some(DiagnosticPopover { local_diagnostic, markdown, border_color, + scrollbar_state: ScrollbarState::new(scroll_handle.clone()), + scroll_handle, background_color, keyboard_grace: Rc::new(RefCell::new(ignore_timeout)), anchor, @@ -955,6 +959,8 @@ pub struct DiagnosticPopover { pub keyboard_grace: Rc>, pub anchor: Anchor, _subscription: Subscription, + pub scroll_handle: ScrollHandle, + pub scrollbar_state: ScrollbarState, } impl DiagnosticPopover { @@ -968,10 +974,7 @@ impl DiagnosticPopover { let this = cx.entity().downgrade(); div() .id("diagnostic") - .block() - .max_h(max_size.height) - .overflow_y_scroll() - .max_w(max_size.width) + .occlude() .elevation_2_borderless(cx) // Don't draw the background color if the theme // allows transparent surfaces. @@ -992,27 +995,72 @@ impl DiagnosticPopover { div() .py_1() .px_2() - .child( - MarkdownElement::new( - self.markdown.clone(), - diagnostics_markdown_style(window, cx), - ) - .on_url_click(move |link, window, cx| { - if let Some(renderer) = GlobalDiagnosticRenderer::global(cx) { - this.update(cx, |this, cx| { - renderer.as_ref().open_link(this, link, window, cx); - }) - .ok(); - } - }), - ) .bg(self.background_color) .border_1() .border_color(self.border_color) - .rounded_lg(), + .rounded_lg() + .child( + div() + .id("diagnostic-content-container") + .overflow_y_scroll() + .max_w(max_size.width) + .max_h(max_size.height) + .track_scroll(&self.scroll_handle) + .child( + MarkdownElement::new( + self.markdown.clone(), + diagnostics_markdown_style(window, cx), + ) + .on_url_click( + move |link, window, cx| { + if let Some(renderer) = GlobalDiagnosticRenderer::global(cx) + { + this.update(cx, |this, cx| { + renderer.as_ref().open_link(this, link, window, cx); + }) + .ok(); + } + }, + ), + ), + ) + .child(self.render_vertical_scrollbar(cx)), ) .into_any_element() } + + fn render_vertical_scrollbar(&self, cx: &mut Context) -> Stateful
{ + div() + .occlude() + .id("diagnostic-popover-vertical-scroll") + .on_mouse_move(cx.listener(|_, _, _, cx| { + cx.notify(); + cx.stop_propagation() + })) + .on_hover(|_, _, cx| { + cx.stop_propagation(); + }) + .on_any_mouse_down(|_, _, cx| { + cx.stop_propagation(); + }) + .on_mouse_up( + MouseButton::Left, + cx.listener(|_, _, _, cx| { + cx.stop_propagation(); + }), + ) + .on_scroll_wheel(cx.listener(|_, _, _, cx| { + cx.notify(); + })) + .h_full() + .absolute() + .right_1() + .top_1() + .bottom_0() + .w(px(12.)) + .cursor_default() + .children(Scrollbar::vertical(self.scrollbar_state.clone())) + } } #[cfg(test)] From 3327f90e0f1ffa431e6598a968b6d88d8e5675dc Mon Sep 17 00:00:00 2001 From: Danilo Leal <67129314+danilo-leal@users.noreply.github.com> Date: Tue, 8 Jul 2025 10:43:35 -0300 Subject: [PATCH 02/34] agent: Add setting to control terminal card expanded state (#34061) Similar to https://github.com/zed-industries/zed/pull/34040, this PR allows to control via settings whether the terminal card in the agent panel should be expanded. It is set to true by default. Release Notes: - agent: Added a setting to control whether terminal cards are expanded in the agent panel, thus showing or hiding the full command output. --- assets/settings/default.json | 6 +- crates/agent_settings/src/agent_settings.rs | 9 +++ crates/assistant_tools/src/terminal_tool.rs | 80 +++++++++++++-------- docs/src/ai/configuration.md | 16 +++++ 4 files changed, 79 insertions(+), 32 deletions(-) diff --git a/assets/settings/default.json b/assets/settings/default.json index 203c90f8ff..9693a474e7 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -861,7 +861,11 @@ /// Whether to have edit cards in the agent panel expanded, showing a preview of the full diff. /// /// Default: true - "expand_edit_card": true + "expand_edit_card": true, + /// Whether to have terminal cards in the agent panel expanded, showing the whole command output. + /// + /// Default: true + "expand_terminal_card": true }, // The settings for slash commands. "slash_commands": { diff --git a/crates/agent_settings/src/agent_settings.rs b/crates/agent_settings/src/agent_settings.rs index 30cd2552ef..131cd2dc3f 100644 --- a/crates/agent_settings/src/agent_settings.rs +++ b/crates/agent_settings/src/agent_settings.rs @@ -68,6 +68,7 @@ pub struct AgentSettings { pub preferred_completion_mode: CompletionMode, pub enable_feedback: bool, pub expand_edit_card: bool, + pub expand_terminal_card: bool, } impl AgentSettings { @@ -296,6 +297,10 @@ pub struct AgentSettingsContent { /// /// Default: true expand_edit_card: Option, + /// Whether to have terminal cards in the agent panel expanded, showing the whole command output. + /// + /// Default: true + expand_terminal_card: Option, } #[derive(Clone, Copy, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Default)] @@ -447,6 +452,10 @@ impl Settings for AgentSettings { ); merge(&mut settings.enable_feedback, value.enable_feedback); merge(&mut settings.expand_edit_card, value.expand_edit_card); + merge( + &mut settings.expand_terminal_card, + value.expand_terminal_card, + ); settings .model_parameters diff --git a/crates/assistant_tools/src/terminal_tool.rs b/crates/assistant_tools/src/terminal_tool.rs index 9a3eac907c..6641873182 100644 --- a/crates/assistant_tools/src/terminal_tool.rs +++ b/crates/assistant_tools/src/terminal_tool.rs @@ -2,12 +2,13 @@ use crate::{ schema::json_schema_for, ui::{COLLAPSED_LINES, ToolOutputPreview}, }; +use agent_settings; use anyhow::{Context as _, Result, anyhow}; use assistant_tool::{ActionLog, Tool, ToolCard, ToolResult, ToolUseStatus}; use futures::{FutureExt as _, future::Shared}; use gpui::{ - AnyWindowHandle, App, AppContext, Empty, Entity, EntityId, Task, TextStyleRefinement, - WeakEntity, Window, + Animation, AnimationExt, AnyWindowHandle, App, AppContext, Empty, Entity, EntityId, Task, + TextStyleRefinement, Transformation, WeakEntity, Window, percentage, }; use language::LineEnding; use language_model::{LanguageModel, LanguageModelRequest, LanguageModelToolSchemaFormat}; @@ -247,6 +248,7 @@ impl Tool for TerminalTool { command_markdown.clone(), working_dir.clone(), cx.entity_id(), + cx, ) }); @@ -441,7 +443,10 @@ impl TerminalToolCard { input_command: Entity, working_dir: Option, entity_id: EntityId, + cx: &mut Context, ) -> Self { + let expand_terminal_card = + agent_settings::AgentSettings::get_global(cx).expand_terminal_card; Self { input_command, working_dir, @@ -453,7 +458,7 @@ impl TerminalToolCard { finished_with_empty_output: false, original_content_len: 0, content_line_count: 0, - preview_expanded: true, + preview_expanded: expand_terminal_card, start_instant: Instant::now(), elapsed_time: None, } @@ -518,6 +523,46 @@ impl ToolCard for TerminalToolCard { .color(Color::Muted), ), ) + .when(!self.command_finished, |header| { + header.child( + Icon::new(IconName::ArrowCircle) + .size(IconSize::XSmall) + .color(Color::Info) + .with_animation( + "arrow-circle", + Animation::new(Duration::from_secs(2)).repeat(), + |icon, delta| icon.transform(Transformation::rotate(percentage(delta))), + ), + ) + }) + .when(tool_failed || command_failed, |header| { + header.child( + div() + .id(("terminal-tool-error-code-indicator", self.entity_id)) + .child( + Icon::new(IconName::Close) + .size(IconSize::Small) + .color(Color::Error), + ) + .when(command_failed && self.exit_status.is_some(), |this| { + this.tooltip(Tooltip::text(format!( + "Exited with code {}", + self.exit_status + .and_then(|status| status.code()) + .unwrap_or(-1), + ))) + }) + .when( + !command_failed && tool_failed && status.error().is_some(), + |this| { + this.tooltip(Tooltip::text(format!( + "Error: {}", + status.error().unwrap(), + ))) + }, + ), + ) + }) .when(self.was_content_truncated, |header| { let tooltip = if self.content_line_count + 10 > terminal::MAX_SCROLL_HISTORY_LINES { "Output exceeded terminal max lines and was \ @@ -555,34 +600,6 @@ impl ToolCard for TerminalToolCard { .size(LabelSize::Small), ) }) - .when(tool_failed || command_failed, |header| { - header.child( - div() - .id(("terminal-tool-error-code-indicator", self.entity_id)) - .child( - Icon::new(IconName::Close) - .size(IconSize::Small) - .color(Color::Error), - ) - .when(command_failed && self.exit_status.is_some(), |this| { - this.tooltip(Tooltip::text(format!( - "Exited with code {}", - self.exit_status - .and_then(|status| status.code()) - .unwrap_or(-1), - ))) - }) - .when( - !command_failed && tool_failed && status.error().is_some(), - |this| { - this.tooltip(Tooltip::text(format!( - "Error: {}", - status.error().unwrap(), - ))) - }, - ), - ) - }) .when(!self.finished_with_empty_output, |header| { header.child( Disclosure::new( @@ -634,6 +651,7 @@ impl ToolCard for TerminalToolCard { div() .pt_2() .border_t_1() + .when(tool_failed || command_failed, |card| card.border_dashed()) .border_color(border_color) .bg(cx.theme().colors().editor_background) .rounded_b_md() diff --git a/docs/src/ai/configuration.md b/docs/src/ai/configuration.md index e65433afe5..907e318d05 100644 --- a/docs/src/ai/configuration.md +++ b/docs/src/ai/configuration.md @@ -662,3 +662,19 @@ It is set to `true` by default, but if set to false, the card's height is capped This setting is currently only available in Preview. It should be up in Stable by the next release. + +### Terminal Card + +Use the `expand_terminal_card` setting to control whether terminal cards show the command output in the Agent Panel. +It is set to `true` by default, but if set to false, the card will be fully collapsed even while the command is running, requiring a click to be expanded. + +```json +{ + "agent": { + "expand_terminal_card": "false" + } +} +``` + +This setting is currently only available in Preview. +It should be up in Stable by the next release. From 60e9ab8f9381b7c2bc1f82b2f84ba346c537b386 Mon Sep 17 00:00:00 2001 From: "Joseph T. Lyons" Date: Tue, 8 Jul 2025 10:08:17 -0400 Subject: [PATCH 03/34] Delete access tokens on user delete (#34036) Trying to delete a user record from our admin panel throws the following error: `update or delete on table "users" violates foreign key constraint "access_tokens_user_id_fkey" on table "access_tokens" Detail: Key (id)=(....) is still referenced from table "access_tokens".` We need to add a cascade delete to the `access_tokens` table. Release Notes: - N/A --- .../20221109000000_test_schema.sql | 2 +- ...d_access_tokens_cascade_delete_on_user.sql | 3 ++ crates/collab/src/db/tests/user_tests.rs | 50 +++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 crates/collab/migrations/20250707182700_add_access_tokens_cascade_delete_on_user.sql diff --git a/crates/collab/migrations.sqlite/20221109000000_test_schema.sql b/crates/collab/migrations.sqlite/20221109000000_test_schema.sql index 91cf4d7af0..ca840493ad 100644 --- a/crates/collab/migrations.sqlite/20221109000000_test_schema.sql +++ b/crates/collab/migrations.sqlite/20221109000000_test_schema.sql @@ -26,7 +26,7 @@ CREATE UNIQUE INDEX "index_users_on_github_user_id" ON "users" ("github_user_id" CREATE TABLE "access_tokens" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT, - "user_id" INTEGER REFERENCES users (id), + "user_id" INTEGER REFERENCES users (id) ON DELETE CASCADE, "impersonated_user_id" INTEGER REFERENCES users (id), "hash" VARCHAR(128) ); diff --git a/crates/collab/migrations/20250707182700_add_access_tokens_cascade_delete_on_user.sql b/crates/collab/migrations/20250707182700_add_access_tokens_cascade_delete_on_user.sql new file mode 100644 index 0000000000..ae0ffe24f6 --- /dev/null +++ b/crates/collab/migrations/20250707182700_add_access_tokens_cascade_delete_on_user.sql @@ -0,0 +1,3 @@ +ALTER TABLE access_tokens DROP CONSTRAINT access_tokens_user_id_fkey; +ALTER TABLE access_tokens ADD CONSTRAINT access_tokens_user_id_fkey + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; diff --git a/crates/collab/src/db/tests/user_tests.rs b/crates/collab/src/db/tests/user_tests.rs index bb2dac1f77..dd61da55ca 100644 --- a/crates/collab/src/db/tests/user_tests.rs +++ b/crates/collab/src/db/tests/user_tests.rs @@ -44,3 +44,53 @@ async fn test_accepted_tos(db: &Arc) { let user = db.get_user_by_id(user_id).await.unwrap().unwrap(); assert!(user.accepted_tos_at.is_none()); } + +test_both_dbs!( + test_destroy_user_cascade_deletes_access_tokens, + test_destroy_user_cascade_deletes_access_tokens_postgres, + test_destroy_user_cascade_deletes_access_tokens_sqlite +); + +async fn test_destroy_user_cascade_deletes_access_tokens(db: &Arc) { + let user_id = db + .create_user( + "user1@example.com", + Some("user1"), + false, + NewUserParams { + github_login: "user1".to_string(), + github_user_id: 12345, + }, + ) + .await + .unwrap() + .user_id; + + let user = db.get_user_by_id(user_id).await.unwrap(); + assert!(user.is_some()); + + let token_1_id = db + .create_access_token(user_id, None, "token-1", 10) + .await + .unwrap(); + + let token_2_id = db + .create_access_token(user_id, None, "token-2", 10) + .await + .unwrap(); + + let token_1 = db.get_access_token(token_1_id).await; + let token_2 = db.get_access_token(token_2_id).await; + assert!(token_1.is_ok()); + assert!(token_2.is_ok()); + + db.destroy_user(user_id).await.unwrap(); + + let user = db.get_user_by_id(user_id).await.unwrap(); + assert!(user.is_none()); + + let token_1 = db.get_access_token(token_1_id).await; + let token_2 = db.get_access_token(token_2_id).await; + assert!(token_1.is_err()); + assert!(token_2.is_err()); +} From 8bd739d86956f629e6d28284e9321126b7efb144 Mon Sep 17 00:00:00 2001 From: Danilo Leal <67129314+danilo-leal@users.noreply.github.com> Date: Tue, 8 Jul 2025 11:23:36 -0300 Subject: [PATCH 04/34] git panel: Add some design refinements (#34064) Things like borders, border colors, which icons are being used, button sizes, and spacing. There is more to do here: polish that we're using a bunch of divs for spacing, arbitrary pixel values for tokens we have in the system, etc. This is just a quick pass! Release Notes: - git panel: Polished the panel spacing, border colors, and icons. --- crates/git_ui/src/git_panel.rs | 139 +++++++++++++++++---------------- crates/panel/src/panel.rs | 4 +- 2 files changed, 73 insertions(+), 70 deletions(-) diff --git a/crates/git_ui/src/git_panel.rs b/crates/git_ui/src/git_panel.rs index e26a47ff8f..84ce97a982 100644 --- a/crates/git_ui/src/git_panel.rs +++ b/crates/git_ui/src/git_panel.rs @@ -2844,7 +2844,7 @@ impl GitPanel { PopoverMenu::new(id.into()) .trigger( - IconButton::new("overflow-menu-trigger", IconName::EllipsisVertical) + IconButton::new("overflow-menu-trigger", IconName::Ellipsis) .icon_size(IconSize::Small) .icon_color(Color::Muted), ) @@ -2965,15 +2965,20 @@ impl GitPanel { &self, id: impl Into, keybinding_target: Option, + cx: &mut Context, ) -> impl IntoElement { PopoverMenu::new(id.into()) .trigger( ui::ButtonLike::new_rounded_right("commit-split-button-right") .layer(ui::ElevationIndex::ModalSurface) - .size(ui::ButtonSize::None) + .size(ButtonSize::None) .child( - div() + h_flex() .px_1() + .h_full() + .justify_center() + .border_l_1() + .border_color(cx.theme().colors().border) .child(Icon::new(IconName::ChevronDownSmall).size(IconSize::XSmall)), ), ) @@ -3066,6 +3071,7 @@ impl GitPanel { Some( self.panel_header_container(window, cx) .px_2() + .justify_between() .child( panel_button(change_string) .color(Color::Muted) @@ -3080,23 +3086,25 @@ impl GitPanel { }) }), ) - .child(div().flex_grow()) // spacer - .child(self.render_overflow_menu("overflow_menu")) - .child(div().w_2()) // another spacer .child( - panel_filled_button(text) - .tooltip(Tooltip::for_action_title_in( - tooltip, - action.as_ref(), - &self.focus_handle, - )) - .disabled(self.entry_count == 0) - .on_click(move |_, _, cx| { - let action = action.boxed_clone(); - cx.defer(move |cx| { - cx.dispatch_action(action.as_ref()); - }) - }), + h_flex() + .gap_1() + .child(self.render_overflow_menu("overflow_menu")) + .child( + panel_filled_button(text) + .tooltip(Tooltip::for_action_title_in( + tooltip, + action.as_ref(), + &self.focus_handle, + )) + .disabled(self.entry_count == 0) + .on_click(move |_, _, cx| { + let action = action.boxed_clone(); + cx.defer(move |cx| { + cx.dispatch_action(action.as_ref()); + }) + }), + ), ), ) } @@ -3174,7 +3182,7 @@ impl GitPanel { .w_full() .h(max_height + footer_size) .border_t_1() - .border_color(cx.theme().colors().border_variant) + .border_color(cx.theme().colors().border) .cursor_text() .on_click(cx.listener(move |this, _: &ClickEvent, window, cx| { window.focus(&this.commit_editor.focus_handle(cx)); @@ -3259,6 +3267,7 @@ impl GitPanel { let (can_commit, tooltip) = self.configure_commit_button(cx); let title = self.commit_button_title(); let commit_tooltip_focus_handle = self.commit_editor.focus_handle(cx); + div() .id("commit-wrapper") .on_hover(cx.listener(move |this, hovered, _, cx| { @@ -3371,6 +3380,7 @@ impl GitPanel { self.render_git_commit_menu( ElementId::Name(format!("split-button-right-{}", title).into()), Some(commit_tooltip_focus_handle.clone()), + cx, ) .into_any_element(), )) @@ -3415,8 +3425,8 @@ impl GitPanel { fn render_pending_amend(&self, cx: &mut Context) -> impl IntoElement { div() - .py_2() - .px(px(8.)) + .p_2() + .border_t_1() .border_color(cx.theme().colors().border) .child( Label::new( @@ -3431,22 +3441,21 @@ impl GitPanel { let branch = active_repository.read(cx).branch.as_ref()?; let commit = branch.most_recent_commit.as_ref()?.clone(); let workspace = self.workspace.clone(); - let this = cx.entity(); + Some( h_flex() - .items_center() - .py_2() - .px(px(8.)) - .border_color(cx.theme().colors().border) + .py_1p5() + .px_2() .gap_1p5() + .justify_between() + .border_t_1() + .border_color(cx.theme().colors().border.opacity(0.8)) .child( div() .flex_grow() .overflow_hidden() - .items_center() .max_w(relative(0.85)) - .h_full() .child( Label::new(commit.subject.clone()) .size(LabelSize::Small) @@ -3480,12 +3489,11 @@ impl GitPanel { } }), ) - .child(div().flex_1()) .when(commit.has_parent, |this| { let has_unstaged = self.has_unstaged_changes(); this.child( panel_icon_button("undo", IconName::Undo) - .icon_size(IconSize::Small) + .icon_size(IconSize::XSmall) .icon_color(Color::Muted) .tooltip(move |window, cx| { Tooltip::with_meta( @@ -3507,43 +3515,38 @@ impl GitPanel { } fn render_empty_state(&self, cx: &mut Context) -> impl IntoElement { - h_flex() - .h_full() - .flex_grow() - .justify_center() - .items_center() - .child( - v_flex() - .gap_2() - .child(h_flex().w_full().justify_around().child( - if self.active_repository.is_some() { - "No changes to commit" - } else { - "No Git repositories" - }, - )) - .children({ - let worktree_count = self.project.read(cx).visible_worktrees(cx).count(); - (worktree_count > 0 && self.active_repository.is_none()).then(|| { - h_flex().w_full().justify_around().child( - panel_filled_button("Initialize Repository") - .tooltip(Tooltip::for_action_title_in( - "git init", - &git::Init, - &self.focus_handle, - )) - .on_click(move |_, _, cx| { - cx.defer(move |cx| { - cx.dispatch_action(&git::Init); - }) - }), - ) - }) + h_flex().h_full().flex_grow().justify_center().child( + v_flex() + .gap_2() + .child(h_flex().w_full().justify_around().child( + if self.active_repository.is_some() { + "No changes to commit" + } else { + "No Git repositories" + }, + )) + .children({ + let worktree_count = self.project.read(cx).visible_worktrees(cx).count(); + (worktree_count > 0 && self.active_repository.is_none()).then(|| { + h_flex().w_full().justify_around().child( + panel_filled_button("Initialize Repository") + .tooltip(Tooltip::for_action_title_in( + "git init", + &git::Init, + &self.focus_handle, + )) + .on_click(move |_, _, cx| { + cx.defer(move |cx| { + cx.dispatch_action(&git::Init); + }) + }), + ) }) - .text_ui_sm(cx) - .mx_auto() - .text_color(Color::Placeholder.color(cx)), - ) + }) + .text_ui_sm(cx) + .mx_auto() + .text_color(Color::Placeholder.color(cx)), + ) } fn render_vertical_scrollbar( @@ -4621,7 +4624,7 @@ impl RenderOnce for PanelRepoFooter { }) .trigger_with_tooltip( repo_selector_trigger.disabled(single_repo).truncate(true), - Tooltip::text("Switch active repository"), + Tooltip::text("Switch Active Repository"), ) .anchor(Corner::BottomLeft) .into_any_element(); diff --git a/crates/panel/src/panel.rs b/crates/panel/src/panel.rs index a09034cc17..658a51167b 100644 --- a/crates/panel/src/panel.rs +++ b/crates/panel/src/panel.rs @@ -67,10 +67,10 @@ pub fn panel_filled_button(label: impl Into) -> ui::Button { pub fn panel_icon_button(id: impl Into, icon: IconName) -> ui::IconButton { let id = ElementId::Name(id.into()); - ui::IconButton::new(id, icon) + + IconButton::new(id, icon) // TODO: Change this once we use on_surface_bg in button_like .layer(ui::ElevationIndex::ModalSurface) - .size(ui::ButtonSize::Compact) } pub fn panel_filled_icon_button(id: impl Into, icon: IconName) -> ui::IconButton { From 0ca0914ccae465e951591f2958d7d5eea67410fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=B0=8F=E7=99=BD?= <364772080@qq.com> Date: Tue, 8 Jul 2025 22:34:57 +0800 Subject: [PATCH 05/34] windows: Add support for SSH (#29145) Closes #19892 This PR builds on top of #20587 and improves upon it. Release Notes: - N/A --------- Co-authored-by: Kirill Bulatov --- Cargo.lock | 21 + Cargo.toml | 3 + crates/askpass/Cargo.toml | 2 + crates/askpass/src/askpass.rs | 156 ++++--- crates/extension_host/src/extension_host.rs | 10 +- crates/extension_host/src/headless_host.rs | 7 +- crates/file_finder/src/open_path_prompt.rs | 194 ++++++-- .../file_finder/src/open_path_prompt_tests.rs | 56 ++- crates/net/Cargo.toml | 25 ++ crates/net/LICENSE-GPL | 1 + crates/net/src/async_net.rs | 69 +++ crates/net/src/listener.rs | 45 ++ crates/net/src/net.rs | 107 +++++ crates/net/src/socket.rs | 59 +++ crates/net/src/stream.rs | 60 +++ crates/net/src/util.rs | 76 ++++ crates/project/src/debugger/dap_store.rs | 20 +- crates/project/src/project.rs | 22 +- crates/project/src/terminals.rs | 96 ++-- crates/project/src/worktree_store.rs | 29 +- crates/proto/Cargo.toml | 1 + crates/proto/src/typed_envelope.rs | 147 ++++-- crates/recent_projects/src/remote_servers.rs | 49 +- crates/remote/src/ssh_session.rs | 422 ++++++++++++------ crates/util/src/paths.rs | 92 ++++ crates/zed/src/main.rs | 20 +- 26 files changed, 1435 insertions(+), 354 deletions(-) create mode 100644 crates/net/Cargo.toml create mode 120000 crates/net/LICENSE-GPL create mode 100644 crates/net/src/async_net.rs create mode 100644 crates/net/src/listener.rs create mode 100644 crates/net/src/net.rs create mode 100644 crates/net/src/socket.rs create mode 100644 crates/net/src/stream.rs create mode 100644 crates/net/src/util.rs diff --git a/Cargo.lock b/Cargo.lock index 58e482ee39..302c1cc6ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -538,6 +538,8 @@ dependencies = [ "anyhow", "futures 0.3.31", "gpui", + "net", + "parking_lot", "smol", "tempfile", "util", @@ -10231,6 +10233,18 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "net" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-io", + "smol", + "tempfile", + "windows 0.61.1", + "workspace-hack", +] + [[package]] name = "new_debug_unreachable" version = "1.0.6" @@ -12535,6 +12549,7 @@ dependencies = [ "prost 0.9.0", "prost-build 0.9.0", "serde", + "typed-path", "workspace-hack", ] @@ -17036,6 +17051,12 @@ dependencies = [ "utf-8", ] +[[package]] +name = "typed-path" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c462d18470a2857aa657d338af5fa67170bb48bcc80a296710ce3b0802a32566" + [[package]] name = "typeid" version = "1.0.3" diff --git a/Cargo.toml b/Cargo.toml index 8dd7892329..32f520c602 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -99,6 +99,7 @@ members = [ "crates/migrator", "crates/mistral", "crates/multi_buffer", + "crates/net", "crates/node_runtime", "crates/notifications", "crates/ollama", @@ -311,6 +312,7 @@ menu = { path = "crates/menu" } migrator = { path = "crates/migrator" } mistral = { path = "crates/mistral" } multi_buffer = { path = "crates/multi_buffer" } +net = { path = "crates/net" } node_runtime = { path = "crates/node_runtime" } notifications = { path = "crates/notifications" } ollama = { path = "crates/ollama" } @@ -660,6 +662,7 @@ features = [ "Win32_Graphics_Gdi", "Win32_Graphics_Imaging", "Win32_Graphics_Imaging_D2D", + "Win32_Networking_WinSock", "Win32_Security", "Win32_Security_Credentials", "Win32_Storage_FileSystem", diff --git a/crates/askpass/Cargo.toml b/crates/askpass/Cargo.toml index d64ee9f7c3..0527399af8 100644 --- a/crates/askpass/Cargo.toml +++ b/crates/askpass/Cargo.toml @@ -15,6 +15,8 @@ path = "src/askpass.rs" anyhow.workspace = true futures.workspace = true gpui.workspace = true +net.workspace = true +parking_lot.workspace = true smol.workspace = true tempfile.workspace = true util.workspace = true diff --git a/crates/askpass/src/askpass.rs b/crates/askpass/src/askpass.rs index 519c08aa26..f085a2be72 100644 --- a/crates/askpass/src/askpass.rs +++ b/crates/askpass/src/askpass.rs @@ -1,21 +1,14 @@ -use std::path::{Path, PathBuf}; -use std::time::Duration; +use std::{ffi::OsStr, time::Duration}; -#[cfg(unix)] -use anyhow::Context as _; +use anyhow::{Context as _, Result}; use futures::channel::{mpsc, oneshot}; -#[cfg(unix)] -use futures::{AsyncBufReadExt as _, io::BufReader}; -#[cfg(unix)] -use futures::{AsyncWriteExt as _, FutureExt as _, select_biased}; -use futures::{SinkExt, StreamExt}; +use futures::{ + AsyncBufReadExt as _, AsyncWriteExt as _, FutureExt as _, SinkExt, StreamExt, io::BufReader, + select_biased, +}; use gpui::{AsyncApp, BackgroundExecutor, Task}; -#[cfg(unix)] use smol::fs; -#[cfg(unix)] -use smol::net::unix::UnixListener; -#[cfg(unix)] -use util::{ResultExt as _, fs::make_file_executable, get_shell_safe_zed_path}; +use util::ResultExt as _; #[derive(PartialEq, Eq)] pub enum AskPassResult { @@ -42,41 +35,56 @@ impl AskPassDelegate { Self { tx, _task: task } } - pub async fn ask_password(&mut self, prompt: String) -> anyhow::Result { + pub async fn ask_password(&mut self, prompt: String) -> Result { let (tx, rx) = oneshot::channel(); self.tx.send((prompt, tx)).await?; Ok(rx.await?) } } -#[cfg(unix)] pub struct AskPassSession { - script_path: PathBuf, + #[cfg(not(target_os = "windows"))] + script_path: std::path::PathBuf, + #[cfg(target_os = "windows")] + askpass_helper: String, + #[cfg(target_os = "windows")] + secret: std::sync::Arc>, _askpass_task: Task<()>, askpass_opened_rx: Option>, askpass_kill_master_rx: Option>, } -#[cfg(unix)] +#[cfg(not(target_os = "windows"))] +const ASKPASS_SCRIPT_NAME: &str = "askpass.sh"; +#[cfg(target_os = "windows")] +const ASKPASS_SCRIPT_NAME: &str = "askpass.ps1"; + impl AskPassSession { /// This will create a new AskPassSession. /// You must retain this session until the master process exits. #[must_use] - pub async fn new( - executor: &BackgroundExecutor, - mut delegate: AskPassDelegate, - ) -> anyhow::Result { + pub async fn new(executor: &BackgroundExecutor, mut delegate: AskPassDelegate) -> Result { + use net::async_net::UnixListener; + use util::fs::make_file_executable; + + #[cfg(target_os = "windows")] + let secret = std::sync::Arc::new(parking_lot::Mutex::new(String::new())); let temp_dir = tempfile::Builder::new().prefix("zed-askpass").tempdir()?; let askpass_socket = temp_dir.path().join("askpass.sock"); - let askpass_script_path = temp_dir.path().join("askpass.sh"); + let askpass_script_path = temp_dir.path().join(ASKPASS_SCRIPT_NAME); let (askpass_opened_tx, askpass_opened_rx) = oneshot::channel::<()>(); - let listener = - UnixListener::bind(&askpass_socket).context("failed to create askpass socket")?; - let zed_path = get_shell_safe_zed_path()?; + let listener = UnixListener::bind(&askpass_socket).context("creating askpass socket")?; + #[cfg(not(target_os = "windows"))] + let zed_path = util::get_shell_safe_zed_path()?; + #[cfg(target_os = "windows")] + let zed_path = std::env::current_exe() + .context("finding current executable path for use in askpass")?; let (askpass_kill_master_tx, askpass_kill_master_rx) = oneshot::channel::<()>(); let mut kill_tx = Some(askpass_kill_master_tx); + #[cfg(target_os = "windows")] + let askpass_secret = secret.clone(); let askpass_task = executor.spawn(async move { let mut askpass_opened_tx = Some(askpass_opened_tx); @@ -93,10 +101,14 @@ impl AskPassSession { if let Some(password) = delegate .ask_password(prompt.to_string()) .await - .context("failed to get askpass password") + .context("getting askpass password") .log_err() { stream.write_all(password.as_bytes()).await.log_err(); + #[cfg(target_os = "windows")] + { + *askpass_secret.lock() = password; + } } else { if let Some(kill_tx) = kill_tx.take() { kill_tx.send(()).log_err(); @@ -112,34 +124,49 @@ impl AskPassSession { }); // Create an askpass script that communicates back to this process. - let askpass_script = format!( - "{shebang}\n{print_args} | {zed_exe} --askpass={askpass_socket} 2> /dev/null \n", - zed_exe = zed_path, - askpass_socket = askpass_socket.display(), - print_args = "printf '%s\\0' \"$@\"", - shebang = "#!/bin/sh", - ); - fs::write(&askpass_script_path, askpass_script).await?; + let askpass_script = generate_askpass_script(&zed_path, &askpass_socket); + fs::write(&askpass_script_path, askpass_script) + .await + .with_context(|| format!("creating askpass script at {askpass_script_path:?}"))?; make_file_executable(&askpass_script_path).await?; + #[cfg(target_os = "windows")] + let askpass_helper = format!( + "powershell.exe -ExecutionPolicy Bypass -File {}", + askpass_script_path.display() + ); Ok(Self { + #[cfg(not(target_os = "windows"))] script_path: askpass_script_path, + + #[cfg(target_os = "windows")] + secret, + #[cfg(target_os = "windows")] + askpass_helper, + _askpass_task: askpass_task, askpass_kill_master_rx: Some(askpass_kill_master_rx), askpass_opened_rx: Some(askpass_opened_rx), }) } - pub fn script_path(&self) -> &Path { + #[cfg(not(target_os = "windows"))] + pub fn script_path(&self) -> impl AsRef { &self.script_path } + #[cfg(target_os = "windows")] + pub fn script_path(&self) -> impl AsRef { + &self.askpass_helper + } + // This will run the askpass task forever, resolving as many authentication requests as needed. // The caller is responsible for examining the result of their own commands and cancelling this // future when this is no longer needed. Note that this can only be called once, but due to the // drop order this takes an &mut, so you can `drop()` it after you're done with the master process. pub async fn run(&mut self) -> AskPassResult { - let connection_timeout = Duration::from_secs(10); + // This is the default timeout setting used by VSCode. + let connection_timeout = Duration::from_secs(17); let askpass_opened_rx = self.askpass_opened_rx.take().expect("Only call run once"); let askpass_kill_master_rx = self .askpass_kill_master_rx @@ -158,14 +185,19 @@ impl AskPassSession { } } } + + /// This will return the password that was last set by the askpass script. + #[cfg(target_os = "windows")] + pub fn get_password(&self) -> String { + self.secret.lock().clone() + } } /// The main function for when Zed is running in netcat mode for use in askpass. /// Called from both the remote server binary and the zed binary in their respective main functions. -#[cfg(unix)] pub fn main(socket: &str) { + use net::UnixStream; use std::io::{self, Read, Write}; - use std::os::unix::net::UnixStream; use std::process::exit; let mut stream = match UnixStream::connect(socket) { @@ -182,6 +214,10 @@ pub fn main(socket: &str) { exit(1); } + #[cfg(target_os = "windows")] + while buffer.last().map_or(false, |&b| b == b'\n' || b == b'\r') { + buffer.pop(); + } if buffer.last() != Some(&b'\0') { buffer.push(b'\0'); } @@ -202,28 +238,28 @@ pub fn main(socket: &str) { exit(1); } } -#[cfg(not(unix))] -pub fn main(_socket: &str) {} -#[cfg(not(unix))] -pub struct AskPassSession { - path: PathBuf, +#[inline] +#[cfg(not(target_os = "windows"))] +fn generate_askpass_script(zed_path: &str, askpass_socket: &std::path::Path) -> String { + format!( + "{shebang}\n{print_args} | {zed_exe} --askpass={askpass_socket} 2> /dev/null \n", + zed_exe = zed_path, + askpass_socket = askpass_socket.display(), + print_args = "printf '%s\\0' \"$@\"", + shebang = "#!/bin/sh", + ) } -#[cfg(not(unix))] -impl AskPassSession { - pub async fn new(_: &BackgroundExecutor, _: AskPassDelegate) -> anyhow::Result { - Ok(Self { - path: PathBuf::new(), - }) - } - - pub fn script_path(&self) -> &Path { - &self.path - } - - pub async fn run(&mut self) -> AskPassResult { - futures::FutureExt::fuse(smol::Timer::after(Duration::from_secs(20))).await; - AskPassResult::Timedout - } +#[inline] +#[cfg(target_os = "windows")] +fn generate_askpass_script(zed_path: &std::path::Path, askpass_socket: &std::path::Path) -> String { + format!( + r#" + $ErrorActionPreference = 'Stop'; + ($args -join [char]0) | & "{zed_exe}" --askpass={askpass_socket} 2> $null + "#, + zed_exe = zed_path.display(), + askpass_socket = askpass_socket.display(), + ) } diff --git a/crates/extension_host/src/extension_host.rs b/crates/extension_host/src/extension_host.rs index 7c58fac1e0..dd753199a8 100644 --- a/crates/extension_host/src/extension_host.rs +++ b/crates/extension_host/src/extension_host.rs @@ -54,7 +54,7 @@ use std::{ time::{Duration, Instant}, }; use url::Url; -use util::ResultExt; +use util::{ResultExt, paths::RemotePathBuf}; use wasm_host::{ WasmExtension, WasmHost, wit::{is_supported_wasm_api_version, wasm_api_version_range}, @@ -1689,6 +1689,7 @@ impl ExtensionStore { .request(proto::SyncExtensions { extensions }) })? .await?; + let path_style = client.read_with(cx, |client, _| client.path_style())?; for missing_extension in response.missing_extensions.into_iter() { let tmp_dir = tempfile::tempdir()?; @@ -1701,7 +1702,10 @@ impl ExtensionStore { ) })? .await?; - let dest_dir = PathBuf::from(&response.tmp_dir).join(missing_extension.clone().id); + let dest_dir = RemotePathBuf::new( + PathBuf::from(&response.tmp_dir).join(missing_extension.clone().id), + path_style, + ); log::info!("Uploading extension {}", missing_extension.clone().id); client @@ -1718,7 +1722,7 @@ impl ExtensionStore { client .update(cx, |client, _cx| { client.proto_client().request(proto::InstallExtension { - tmp_dir: dest_dir.to_string_lossy().to_string(), + tmp_dir: dest_dir.to_proto(), extension: Some(missing_extension), }) })? diff --git a/crates/extension_host/src/headless_host.rs b/crates/extension_host/src/headless_host.rs index 8feaec89de..1dfcf56e5d 100644 --- a/crates/extension_host/src/headless_host.rs +++ b/crates/extension_host/src/headless_host.rs @@ -1,7 +1,10 @@ use std::{path::PathBuf, sync::Arc}; use anyhow::{Context as _, Result}; -use client::{TypedEnvelope, proto}; +use client::{ + TypedEnvelope, + proto::{self, FromProto}, +}; use collections::{HashMap, HashSet}; use extension::{ Extension, ExtensionDebugAdapterProviderProxy, ExtensionHostProxy, ExtensionLanguageProxy, @@ -328,7 +331,7 @@ impl HeadlessExtensionStore { version: extension.version, dev: extension.dev, }, - PathBuf::from(envelope.payload.tmp_dir), + PathBuf::from_proto(envelope.payload.tmp_dir), cx, ) })? diff --git a/crates/file_finder/src/open_path_prompt.rs b/crates/file_finder/src/open_path_prompt.rs index d7428f0068..68ba7a78b5 100644 --- a/crates/file_finder/src/open_path_prompt.rs +++ b/crates/file_finder/src/open_path_prompt.rs @@ -15,16 +15,14 @@ use std::{ }; use ui::{Context, LabelLike, ListItem, Window}; use ui::{HighlightedLabel, ListItemSpacing, prelude::*}; -use util::{maybe, paths::compare_paths}; +use util::{ + maybe, + paths::{PathStyle, compare_paths}, +}; use workspace::Workspace; pub(crate) struct OpenPathPrompt; -#[cfg(target_os = "windows")] -const PROMPT_ROOT: &str = "C:\\"; -#[cfg(not(target_os = "windows"))] -const PROMPT_ROOT: &str = "/"; - #[derive(Debug)] pub struct OpenPathDelegate { tx: Option>>>, @@ -34,6 +32,8 @@ pub struct OpenPathDelegate { string_matches: Vec, cancel_flag: Arc, should_dismiss: bool, + prompt_root: String, + path_style: PathStyle, replace_prompt: Task<()>, } @@ -42,6 +42,7 @@ impl OpenPathDelegate { tx: oneshot::Sender>>, lister: DirectoryLister, creating_path: bool, + path_style: PathStyle, ) -> Self { Self { tx: Some(tx), @@ -53,6 +54,11 @@ impl OpenPathDelegate { string_matches: Vec::new(), cancel_flag: Arc::new(AtomicBool::new(false)), should_dismiss: true, + prompt_root: match path_style { + PathStyle::Posix => "/".to_string(), + PathStyle::Windows => "C:\\".to_string(), + }, + path_style, replace_prompt: Task::ready(()), } } @@ -185,7 +191,8 @@ impl OpenPathPrompt { cx: &mut Context, ) { workspace.toggle_modal(window, cx, |window, cx| { - let delegate = OpenPathDelegate::new(tx, lister.clone(), creating_path); + let delegate = + OpenPathDelegate::new(tx, lister.clone(), creating_path, PathStyle::current()); let picker = Picker::uniform_list(delegate, window, cx).width(rems(34.)); let query = lister.default_query(cx); picker.set_query(query, window, cx); @@ -226,18 +233,7 @@ impl PickerDelegate for OpenPathDelegate { cx: &mut Context>, ) -> Task<()> { let lister = &self.lister; - let last_item = Path::new(&query) - .file_name() - .unwrap_or_default() - .to_string_lossy(); - let (mut dir, suffix) = if let Some(dir) = query.strip_suffix(last_item.as_ref()) { - (dir.to_string(), last_item.into_owned()) - } else { - (query, String::new()) - }; - if dir == "" { - dir = PROMPT_ROOT.to_string(); - } + let (dir, suffix) = get_dir_and_suffix(query, self.path_style); let query = match &self.directory_state { DirectoryState::List { parent_path, .. } => { @@ -266,6 +262,7 @@ impl PickerDelegate for OpenPathDelegate { self.cancel_flag = Arc::new(AtomicBool::new(false)); let cancel_flag = self.cancel_flag.clone(); + let parent_path_is_root = self.prompt_root == dir; cx.spawn_in(window, async move |this, cx| { if let Some(query) = query { let paths = query.await; @@ -279,7 +276,7 @@ impl PickerDelegate for OpenPathDelegate { DirectoryState::None { create: false } | DirectoryState::List { .. } => match paths { Ok(paths) => DirectoryState::List { - entries: path_candidates(&dir, paths), + entries: path_candidates(parent_path_is_root, paths), parent_path: dir.clone(), error: None, }, @@ -292,7 +289,7 @@ impl PickerDelegate for OpenPathDelegate { DirectoryState::None { create: true } | DirectoryState::Create { .. } => match paths { Ok(paths) => { - let mut entries = path_candidates(&dir, paths); + let mut entries = path_candidates(parent_path_is_root, paths); let mut exists = false; let mut is_dir = false; let mut new_id = None; @@ -488,6 +485,7 @@ impl PickerDelegate for OpenPathDelegate { _: &mut Context>, ) -> Option { let candidate = self.get_entry(self.selected_index)?; + let path_style = self.path_style; Some( maybe!({ match &self.directory_state { @@ -496,7 +494,7 @@ impl PickerDelegate for OpenPathDelegate { parent_path, candidate.path.string, if candidate.is_dir { - MAIN_SEPARATOR_STR + path_style.separator() } else { "" } @@ -506,7 +504,7 @@ impl PickerDelegate for OpenPathDelegate { parent_path, candidate.path.string, if candidate.is_dir { - MAIN_SEPARATOR_STR + path_style.separator() } else { "" } @@ -527,8 +525,8 @@ impl PickerDelegate for OpenPathDelegate { DirectoryState::None { .. } => return, DirectoryState::List { parent_path, .. } => { let confirmed_path = - if parent_path == PROMPT_ROOT && candidate.path.string.is_empty() { - PathBuf::from(PROMPT_ROOT) + if parent_path == &self.prompt_root && candidate.path.string.is_empty() { + PathBuf::from(&self.prompt_root) } else { Path::new(self.lister.resolve_tilde(parent_path, cx).as_ref()) .join(&candidate.path.string) @@ -548,8 +546,8 @@ impl PickerDelegate for OpenPathDelegate { return; } let prompted_path = - if parent_path == PROMPT_ROOT && user_input.file.string.is_empty() { - PathBuf::from(PROMPT_ROOT) + if parent_path == &self.prompt_root && user_input.file.string.is_empty() { + PathBuf::from(&self.prompt_root) } else { Path::new(self.lister.resolve_tilde(parent_path, cx).as_ref()) .join(&user_input.file.string) @@ -652,8 +650,8 @@ impl PickerDelegate for OpenPathDelegate { .inset(true) .toggle_state(selected) .child(HighlightedLabel::new( - if parent_path == PROMPT_ROOT { - format!("{}{}", PROMPT_ROOT, candidate.path.string) + if parent_path == &self.prompt_root { + format!("{}{}", self.prompt_root, candidate.path.string) } else { candidate.path.string.clone() }, @@ -665,10 +663,10 @@ impl PickerDelegate for OpenPathDelegate { user_input, .. } => { - let (label, delta) = if parent_path == PROMPT_ROOT { + let (label, delta) = if parent_path == &self.prompt_root { ( - format!("{}{}", PROMPT_ROOT, candidate.path.string), - PROMPT_ROOT.len(), + format!("{}{}", self.prompt_root, candidate.path.string), + self.prompt_root.len(), ) } else { (candidate.path.string.clone(), 0) @@ -751,8 +749,11 @@ impl PickerDelegate for OpenPathDelegate { } } -fn path_candidates(parent_path: &String, mut children: Vec) -> Vec { - if *parent_path == PROMPT_ROOT { +fn path_candidates( + parent_path_is_root: bool, + mut children: Vec, +) -> Vec { + if parent_path_is_root { children.push(DirectoryItem { is_dir: true, path: PathBuf::default(), @@ -769,3 +770,128 @@ fn path_candidates(parent_path: &String, mut children: Vec) -> Ve }) .collect() } + +#[cfg(target_os = "windows")] +fn get_dir_and_suffix(query: String, path_style: PathStyle) -> (String, String) { + let last_item = Path::new(&query) + .file_name() + .unwrap_or_default() + .to_string_lossy(); + let (mut dir, suffix) = if let Some(dir) = query.strip_suffix(last_item.as_ref()) { + (dir.to_string(), last_item.into_owned()) + } else { + (query.to_string(), String::new()) + }; + match path_style { + PathStyle::Posix => { + if dir.is_empty() { + dir = "/".to_string(); + } + } + PathStyle::Windows => { + if dir.len() < 3 { + dir = "C:\\".to_string(); + } + } + } + (dir, suffix) +} + +#[cfg(not(target_os = "windows"))] +fn get_dir_and_suffix(query: String, path_style: PathStyle) -> (String, String) { + match path_style { + PathStyle::Posix => { + let (mut dir, suffix) = if let Some(index) = query.rfind('/') { + (query[..index].to_string(), query[index + 1..].to_string()) + } else { + (query, String::new()) + }; + if !dir.ends_with('/') { + dir.push('/'); + } + (dir, suffix) + } + PathStyle::Windows => { + let (mut dir, suffix) = if let Some(index) = query.rfind('\\') { + (query[..index].to_string(), query[index + 1..].to_string()) + } else { + (query, String::new()) + }; + if dir.len() < 3 { + dir = "C:\\".to_string(); + } + if !dir.ends_with('\\') { + dir.push('\\'); + } + (dir, suffix) + } + } +} + +#[cfg(test)] +mod tests { + use util::paths::PathStyle; + + use crate::open_path_prompt::get_dir_and_suffix; + + #[test] + fn test_get_dir_and_suffix_with_windows_style() { + let (dir, suffix) = get_dir_and_suffix("".into(), PathStyle::Windows); + assert_eq!(dir, "C:\\"); + assert_eq!(suffix, ""); + + let (dir, suffix) = get_dir_and_suffix("C:".into(), PathStyle::Windows); + assert_eq!(dir, "C:\\"); + assert_eq!(suffix, ""); + + let (dir, suffix) = get_dir_and_suffix("C:\\".into(), PathStyle::Windows); + assert_eq!(dir, "C:\\"); + assert_eq!(suffix, ""); + + let (dir, suffix) = get_dir_and_suffix("C:\\Use".into(), PathStyle::Windows); + assert_eq!(dir, "C:\\"); + assert_eq!(suffix, "Use"); + + let (dir, suffix) = + get_dir_and_suffix("C:\\Users\\Junkui\\Docum".into(), PathStyle::Windows); + assert_eq!(dir, "C:\\Users\\Junkui\\"); + assert_eq!(suffix, "Docum"); + + let (dir, suffix) = + get_dir_and_suffix("C:\\Users\\Junkui\\Documents".into(), PathStyle::Windows); + assert_eq!(dir, "C:\\Users\\Junkui\\"); + assert_eq!(suffix, "Documents"); + + let (dir, suffix) = + get_dir_and_suffix("C:\\Users\\Junkui\\Documents\\".into(), PathStyle::Windows); + assert_eq!(dir, "C:\\Users\\Junkui\\Documents\\"); + assert_eq!(suffix, ""); + } + + #[test] + fn test_get_dir_and_suffix_with_posix_style() { + let (dir, suffix) = get_dir_and_suffix("".into(), PathStyle::Posix); + assert_eq!(dir, "/"); + assert_eq!(suffix, ""); + + let (dir, suffix) = get_dir_and_suffix("/".into(), PathStyle::Posix); + assert_eq!(dir, "/"); + assert_eq!(suffix, ""); + + let (dir, suffix) = get_dir_and_suffix("/Use".into(), PathStyle::Posix); + assert_eq!(dir, "/"); + assert_eq!(suffix, "Use"); + + let (dir, suffix) = get_dir_and_suffix("/Users/Junkui/Docum".into(), PathStyle::Posix); + assert_eq!(dir, "/Users/Junkui/"); + assert_eq!(suffix, "Docum"); + + let (dir, suffix) = get_dir_and_suffix("/Users/Junkui/Documents".into(), PathStyle::Posix); + assert_eq!(dir, "/Users/Junkui/"); + assert_eq!(suffix, "Documents"); + + let (dir, suffix) = get_dir_and_suffix("/Users/Junkui/Documents/".into(), PathStyle::Posix); + assert_eq!(dir, "/Users/Junkui/Documents/"); + assert_eq!(suffix, ""); + } +} diff --git a/crates/file_finder/src/open_path_prompt_tests.rs b/crates/file_finder/src/open_path_prompt_tests.rs index 0acf2a517d..a69ac6992d 100644 --- a/crates/file_finder/src/open_path_prompt_tests.rs +++ b/crates/file_finder/src/open_path_prompt_tests.rs @@ -5,7 +5,7 @@ use picker::{Picker, PickerDelegate}; use project::Project; use serde_json::json; use ui::rems; -use util::path; +use util::{path, paths::PathStyle}; use workspace::{AppState, Workspace}; use crate::OpenPathDelegate; @@ -37,7 +37,7 @@ async fn test_open_path_prompt(cx: &mut TestAppContext) { let project = Project::test(app_state.fs.clone(), [path!("/root").as_ref()], cx).await; - let (picker, cx) = build_open_path_prompt(project, false, cx); + let (picker, cx) = build_open_path_prompt(project, false, PathStyle::current(), cx); let query = path!("/root"); insert_query(query, &picker, cx).await; @@ -111,7 +111,7 @@ async fn test_open_path_prompt_completion(cx: &mut TestAppContext) { let project = Project::test(app_state.fs.clone(), [path!("/root").as_ref()], cx).await; - let (picker, cx) = build_open_path_prompt(project, false, cx); + let (picker, cx) = build_open_path_prompt(project, false, PathStyle::current(), cx); // Confirm completion for the query "/root", since it's a directory, it should add a trailing slash. let query = path!("/root"); @@ -186,7 +186,7 @@ async fn test_open_path_prompt_completion(cx: &mut TestAppContext) { } #[gpui::test] -#[cfg(target_os = "windows")] +#[cfg_attr(not(target_os = "windows"), ignore)] async fn test_open_path_prompt_on_windows(cx: &mut TestAppContext) { let app_state = init_test(cx); app_state @@ -204,7 +204,7 @@ async fn test_open_path_prompt_on_windows(cx: &mut TestAppContext) { let project = Project::test(app_state.fs.clone(), [path!("/root").as_ref()], cx).await; - let (picker, cx) = build_open_path_prompt(project, false, cx); + let (picker, cx) = build_open_path_prompt(project, false, PathStyle::current(), cx); // Support both forward and backward slashes. let query = "C:/root/"; @@ -251,6 +251,47 @@ async fn test_open_path_prompt_on_windows(cx: &mut TestAppContext) { ); } +#[gpui::test] +#[cfg_attr(not(target_os = "windows"), ignore)] +async fn test_open_path_prompt_on_windows_with_remote(cx: &mut TestAppContext) { + let app_state = init_test(cx); + app_state + .fs + .as_fake() + .insert_tree( + "/root", + json!({ + "a": "A", + "dir1": {}, + "dir2": {} + }), + ) + .await; + + let project = Project::test(app_state.fs.clone(), ["/root".as_ref()], cx).await; + + let (picker, cx) = build_open_path_prompt(project, false, PathStyle::Posix, cx); + + let query = "/root/"; + insert_query(query, &picker, cx).await; + assert_eq!( + collect_match_candidates(&picker, cx), + vec!["a", "dir1", "dir2"] + ); + assert_eq!(confirm_completion(query, 0, &picker, cx), "/root/a"); + + // Confirm completion for the query "/root/d", selecting the second candidate "dir2", since it's a directory, it should add a trailing slash. + let query = "/root/d"; + insert_query(query, &picker, cx).await; + assert_eq!(collect_match_candidates(&picker, cx), vec!["dir1", "dir2"]); + assert_eq!(confirm_completion(query, 1, &picker, cx), "/root/dir2/"); + + let query = "/root/d"; + insert_query(query, &picker, cx).await; + assert_eq!(collect_match_candidates(&picker, cx), vec!["dir1", "dir2"]); + assert_eq!(confirm_completion(query, 0, &picker, cx), "/root/dir1/"); +} + #[gpui::test] async fn test_new_path_prompt(cx: &mut TestAppContext) { let app_state = init_test(cx); @@ -278,7 +319,7 @@ async fn test_new_path_prompt(cx: &mut TestAppContext) { let project = Project::test(app_state.fs.clone(), [path!("/root").as_ref()], cx).await; - let (picker, cx) = build_open_path_prompt(project, true, cx); + let (picker, cx) = build_open_path_prompt(project, true, PathStyle::current(), cx); insert_query(path!("/root"), &picker, cx).await; assert_eq!(collect_match_candidates(&picker, cx), vec!["root"]); @@ -315,11 +356,12 @@ fn init_test(cx: &mut TestAppContext) -> Arc { fn build_open_path_prompt( project: Entity, creating_path: bool, + path_style: PathStyle, cx: &mut TestAppContext, ) -> (Entity>, &mut VisualTestContext) { let (tx, _) = futures::channel::oneshot::channel(); let lister = project::DirectoryLister::Project(project.clone()); - let delegate = OpenPathDelegate::new(tx, lister.clone(), creating_path); + let delegate = OpenPathDelegate::new(tx, lister.clone(), creating_path, path_style); let (workspace, cx) = cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx)); ( diff --git a/crates/net/Cargo.toml b/crates/net/Cargo.toml new file mode 100644 index 0000000000..fc08bc89f5 --- /dev/null +++ b/crates/net/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "net" +version = "0.1.0" +edition.workspace = true +publish.workspace = true +license = "GPL-3.0-or-later" + +[lints] +workspace = true + +[lib] +path = "src/net.rs" +doctest = false + +[dependencies] +smol.workspace = true +workspace-hack.workspace = true + +[target.'cfg(target_os = "windows")'.dependencies] +anyhow.workspace = true +async-io = "2.4" +windows.workspace = true + +[dev-dependencies] +tempfile.workspace = true diff --git a/crates/net/LICENSE-GPL b/crates/net/LICENSE-GPL new file mode 120000 index 0000000000..89e542f750 --- /dev/null +++ b/crates/net/LICENSE-GPL @@ -0,0 +1 @@ +../../LICENSE-GPL \ No newline at end of file diff --git a/crates/net/src/async_net.rs b/crates/net/src/async_net.rs new file mode 100644 index 0000000000..6a47902bd8 --- /dev/null +++ b/crates/net/src/async_net.rs @@ -0,0 +1,69 @@ +#[cfg(not(target_os = "windows"))] +pub use smol::net::unix::{UnixListener, UnixStream}; + +#[cfg(target_os = "windows")] +pub use windows::{UnixListener, UnixStream}; + +#[cfg(target_os = "windows")] +pub mod windows { + use std::{ + io::Result, + path::Path, + pin::Pin, + task::{Context, Poll}, + }; + + use smol::{ + Async, + io::{AsyncRead, AsyncWrite}, + }; + + pub struct UnixListener(Async); + + impl UnixListener { + pub fn bind>(path: P) -> Result { + Ok(UnixListener(Async::new(crate::UnixListener::bind(path)?)?)) + } + + pub async fn accept(&self) -> Result<(UnixStream, ())> { + let (sock, _) = self.0.read_with(|listener| listener.accept()).await?; + Ok((UnixStream(Async::new(sock)?), ())) + } + } + + pub struct UnixStream(Async); + + impl UnixStream { + pub async fn connect>(path: P) -> Result { + Ok(UnixStream(Async::new(crate::UnixStream::connect(path)?)?)) + } + } + + impl AsyncRead for UnixStream { + fn poll_read( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &mut [u8], + ) -> Poll> { + Pin::new(&mut self.0).poll_read(cx, buf) + } + } + + impl AsyncWrite for UnixStream { + fn poll_write( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &[u8], + ) -> Poll> { + Pin::new(&mut self.0).poll_write(cx, buf) + } + + fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Pin::new(&mut self.0).poll_flush(cx) + } + + fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Pin::new(&mut self.0).poll_close(cx) + } + } +} diff --git a/crates/net/src/listener.rs b/crates/net/src/listener.rs new file mode 100644 index 0000000000..4774bb850b --- /dev/null +++ b/crates/net/src/listener.rs @@ -0,0 +1,45 @@ +use std::{ + io::Result, + os::windows::io::{AsSocket, BorrowedSocket}, + path::Path, +}; + +use windows::Win32::Networking::WinSock::{SOCKADDR_UN, SOMAXCONN, bind, listen}; + +use crate::{ + socket::UnixSocket, + stream::UnixStream, + util::{init, map_ret, sockaddr_un}, +}; + +pub struct UnixListener(UnixSocket); + +impl UnixListener { + pub fn bind>(path: P) -> Result { + init(); + let socket = UnixSocket::new()?; + let (addr, len) = sockaddr_un(path)?; + unsafe { + map_ret(bind( + socket.as_raw(), + &addr as *const _ as *const _, + len as i32, + ))?; + map_ret(listen(socket.as_raw(), SOMAXCONN as _))?; + } + Ok(Self(socket)) + } + + pub fn accept(&self) -> Result<(UnixStream, ())> { + let mut storage = SOCKADDR_UN::default(); + let mut len = std::mem::size_of_val(&storage) as i32; + let raw = self.0.accept(&mut storage as *mut _ as *mut _, &mut len)?; + Ok((UnixStream::new(raw), ())) + } +} + +impl AsSocket for UnixListener { + fn as_socket(&self) -> BorrowedSocket<'_> { + unsafe { BorrowedSocket::borrow_raw(self.0.as_raw().0 as _) } + } +} diff --git a/crates/net/src/net.rs b/crates/net/src/net.rs new file mode 100644 index 0000000000..4fa76ffcb8 --- /dev/null +++ b/crates/net/src/net.rs @@ -0,0 +1,107 @@ +pub mod async_net; +#[cfg(target_os = "windows")] +pub mod listener; +#[cfg(target_os = "windows")] +pub mod socket; +#[cfg(target_os = "windows")] +pub mod stream; +#[cfg(target_os = "windows")] +mod util; + +#[cfg(target_os = "windows")] +pub use listener::*; +#[cfg(target_os = "windows")] +pub use socket::*; +#[cfg(not(target_os = "windows"))] +pub use std::os::unix::net::{UnixListener, UnixStream}; +#[cfg(target_os = "windows")] +pub use stream::*; + +#[cfg(test)] +mod tests { + use std::io::{Read, Write}; + + use smol::io::{AsyncReadExt, AsyncWriteExt}; + + const SERVER_MESSAGE: &str = "Connection closed"; + const CLIENT_MESSAGE: &str = "Hello, server!"; + const BUFFER_SIZE: usize = 32; + + #[test] + fn test_windows_listener() -> std::io::Result<()> { + use crate::{UnixListener, UnixStream}; + + let temp = tempfile::tempdir()?; + let socket = temp.path().join("socket.sock"); + let listener = UnixListener::bind(&socket)?; + + // Server + let server = std::thread::spawn(move || { + let (mut stream, _) = listener.accept().unwrap(); + + // Read data from the client + let mut buffer = [0; BUFFER_SIZE]; + let bytes_read = stream.read(&mut buffer).unwrap(); + let string = String::from_utf8_lossy(&buffer[..bytes_read]); + assert_eq!(string, CLIENT_MESSAGE); + + // Send a message back to the client + stream.write_all(SERVER_MESSAGE.as_bytes()).unwrap(); + }); + + // Client + let mut client = UnixStream::connect(&socket)?; + + // Send data to the server + client.write_all(CLIENT_MESSAGE.as_bytes())?; + let mut buffer = [0; BUFFER_SIZE]; + + // Read the response from the server + let bytes_read = client.read(&mut buffer)?; + let string = String::from_utf8_lossy(&buffer[..bytes_read]); + assert_eq!(string, SERVER_MESSAGE); + client.flush()?; + + server.join().unwrap(); + Ok(()) + } + + #[test] + fn test_unix_listener() -> std::io::Result<()> { + use crate::async_net::{UnixListener, UnixStream}; + + smol::block_on(async { + let temp = tempfile::tempdir()?; + let socket = temp.path().join("socket.sock"); + let listener = UnixListener::bind(&socket)?; + + // Server + let server = smol::spawn(async move { + let (mut stream, _) = listener.accept().await.unwrap(); + + // Read data from the client + let mut buffer = [0; BUFFER_SIZE]; + let bytes_read = stream.read(&mut buffer).await.unwrap(); + let string = String::from_utf8_lossy(&buffer[..bytes_read]); + assert_eq!(string, CLIENT_MESSAGE); + + // Send a message back to the client + stream.write_all(SERVER_MESSAGE.as_bytes()).await.unwrap(); + }); + + // Client + let mut client = UnixStream::connect(&socket).await?; + client.write_all(CLIENT_MESSAGE.as_bytes()).await?; + + // Read the response from the server + let mut buffer = [0; BUFFER_SIZE]; + let bytes_read = client.read(&mut buffer).await?; + let string = String::from_utf8_lossy(&buffer[..bytes_read]); + assert_eq!(string, "Connection closed"); + client.flush().await?; + + server.await; + Ok(()) + }) + } +} diff --git a/crates/net/src/socket.rs b/crates/net/src/socket.rs new file mode 100644 index 0000000000..6a1fa3d4c4 --- /dev/null +++ b/crates/net/src/socket.rs @@ -0,0 +1,59 @@ +use std::io::{Error, ErrorKind, Result}; + +use windows::Win32::{ + Foundation::{HANDLE, HANDLE_FLAG_INHERIT, HANDLE_FLAGS, SetHandleInformation}, + Networking::WinSock::{ + AF_UNIX, SEND_RECV_FLAGS, SOCK_STREAM, SOCKADDR, SOCKET, WSA_FLAG_OVERLAPPED, + WSAEWOULDBLOCK, WSASocketW, accept, closesocket, recv, send, + }, +}; + +use crate::util::map_ret; + +pub struct UnixSocket(SOCKET); + +impl UnixSocket { + pub fn new() -> Result { + unsafe { + let raw = WSASocketW(AF_UNIX as _, SOCK_STREAM.0, 0, None, 0, WSA_FLAG_OVERLAPPED)?; + SetHandleInformation( + HANDLE(raw.0 as _), + HANDLE_FLAG_INHERIT.0, + HANDLE_FLAGS::default(), + )?; + Ok(Self(raw)) + } + } + + pub(crate) fn as_raw(&self) -> SOCKET { + self.0 + } + + pub fn accept(&self, storage: *mut SOCKADDR, len: &mut i32) -> Result { + match unsafe { accept(self.0, Some(storage), Some(len)) } { + Ok(sock) => Ok(Self(sock)), + Err(err) => { + let wsa_err = unsafe { windows::Win32::Networking::WinSock::WSAGetLastError().0 }; + if wsa_err == WSAEWOULDBLOCK.0 { + Err(Error::new(ErrorKind::WouldBlock, "accept would block")) + } else { + Err(err.into()) + } + } + } + } + + pub(crate) fn recv(&self, buf: &mut [u8]) -> Result { + map_ret(unsafe { recv(self.0, buf, SEND_RECV_FLAGS::default()) }) + } + + pub(crate) fn send(&self, buf: &[u8]) -> Result { + map_ret(unsafe { send(self.0, buf, SEND_RECV_FLAGS::default()) }) + } +} + +impl Drop for UnixSocket { + fn drop(&mut self) { + unsafe { closesocket(self.0) }; + } +} diff --git a/crates/net/src/stream.rs b/crates/net/src/stream.rs new file mode 100644 index 0000000000..d8b6852fcf --- /dev/null +++ b/crates/net/src/stream.rs @@ -0,0 +1,60 @@ +use std::{ + io::{Read, Result, Write}, + os::windows::io::{AsSocket, BorrowedSocket}, + path::Path, +}; + +use async_io::IoSafe; +use windows::Win32::Networking::WinSock::connect; + +use crate::{ + socket::UnixSocket, + util::{init, map_ret, sockaddr_un}, +}; + +pub struct UnixStream(UnixSocket); + +unsafe impl IoSafe for UnixStream {} + +impl UnixStream { + pub fn new(socket: UnixSocket) -> Self { + Self(socket) + } + + pub fn connect>(path: P) -> Result { + init(); + unsafe { + let inner = UnixSocket::new()?; + let (addr, len) = sockaddr_un(path)?; + + map_ret(connect( + inner.as_raw(), + &addr as *const _ as *const _, + len as i32, + ))?; + Ok(Self(inner)) + } + } +} + +impl Read for UnixStream { + fn read(&mut self, buf: &mut [u8]) -> Result { + self.0.recv(buf) + } +} + +impl Write for UnixStream { + fn write(&mut self, buf: &[u8]) -> Result { + self.0.send(buf) + } + + fn flush(&mut self) -> Result<()> { + Ok(()) + } +} + +impl AsSocket for UnixStream { + fn as_socket(&self) -> BorrowedSocket<'_> { + unsafe { BorrowedSocket::borrow_raw(self.0.as_raw().0 as _) } + } +} diff --git a/crates/net/src/util.rs b/crates/net/src/util.rs new file mode 100644 index 0000000000..f454c099c7 --- /dev/null +++ b/crates/net/src/util.rs @@ -0,0 +1,76 @@ +use std::{ + io::{Error, ErrorKind, Result}, + path::Path, + sync::Once, +}; + +use windows::Win32::Networking::WinSock::{ + ADDRESS_FAMILY, AF_UNIX, SOCKADDR_UN, SOCKET_ERROR, WSAGetLastError, WSAStartup, +}; + +pub(crate) fn init() { + static ONCE: Once = Once::new(); + + ONCE.call_once(|| unsafe { + let mut wsa_data = std::mem::zeroed(); + let result = WSAStartup(0x202, &mut wsa_data); + if result != 0 { + panic!("WSAStartup failed: {}", result); + } + }); +} + +// https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/ +pub(crate) fn sockaddr_un>(path: P) -> Result<(SOCKADDR_UN, usize)> { + let mut addr = SOCKADDR_UN::default(); + addr.sun_family = ADDRESS_FAMILY(AF_UNIX); + + let bytes = path + .as_ref() + .to_str() + .map(|s| s.as_bytes()) + .ok_or(ErrorKind::InvalidInput)?; + + if bytes.contains(&0) { + return Err(Error::new( + ErrorKind::InvalidInput, + "paths may not contain interior null bytes", + )); + } + if bytes.len() >= addr.sun_path.len() { + return Err(Error::new( + ErrorKind::InvalidInput, + "path must be shorter than SUN_LEN", + )); + } + + unsafe { + std::ptr::copy_nonoverlapping( + bytes.as_ptr(), + addr.sun_path.as_mut_ptr().cast(), + bytes.len(), + ); + } + + let mut len = sun_path_offset(&addr) + bytes.len(); + match bytes.first() { + Some(&0) | None => {} + Some(_) => len += 1, + } + Ok((addr, len)) +} + +pub(crate) fn map_ret(ret: i32) -> Result { + if ret == SOCKET_ERROR { + Err(Error::from_raw_os_error(unsafe { WSAGetLastError().0 })) + } else { + Ok(ret as usize) + } +} + +fn sun_path_offset(addr: &SOCKADDR_UN) -> usize { + // Work with an actual instance of the type since using a null pointer is UB + let base = addr as *const _ as usize; + let path = &addr.sun_path as *const _ as usize; + path - base +} diff --git a/crates/project/src/debugger/dap_store.rs b/crates/project/src/debugger/dap_store.rs index 29555d0179..19e64adb2d 100644 --- a/crates/project/src/debugger/dap_store.rs +++ b/crates/project/src/debugger/dap_store.rs @@ -33,7 +33,7 @@ use http_client::HttpClient; use language::{Buffer, LanguageToolchainStore, language_settings::InlayHintKind}; use node_runtime::NodeRuntime; -use remote::SshRemoteClient; +use remote::{SshRemoteClient, ssh_session::SshArgs}; use rpc::{ AnyProtoClient, TypedEnvelope, proto::{self}, @@ -253,11 +253,16 @@ impl DapStore { cx.spawn(async move |_, cx| { let response = request.await?; let binary = DebugAdapterBinary::from_proto(response)?; - let mut ssh_command = ssh_client.read_with(cx, |ssh, _| { - anyhow::Ok(SshCommand { - arguments: ssh.ssh_args().context("SSH arguments not found")?, - }) - })??; + let (mut ssh_command, envs, path_style) = + ssh_client.read_with(cx, |ssh, _| { + let (SshArgs { arguments, envs }, path_style) = + ssh.ssh_info().context("SSH arguments not found")?; + anyhow::Ok(( + SshCommand { arguments }, + envs.unwrap_or_default(), + path_style, + )) + })??; let mut connection = None; if let Some(c) = binary.connection { @@ -282,12 +287,13 @@ impl DapStore { binary.cwd.as_deref(), binary.envs, None, + path_style, ); Ok(DebugAdapterBinary { command: Some(program), arguments: args, - envs: HashMap::default(), + envs, cwd: None, connection, request_args: binary.request_args, diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index c7a1f05761..8e1026421e 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -117,7 +117,7 @@ use text::{Anchor, BufferId, Point}; use toolchain_store::EmptyToolchainStore; use util::{ ResultExt as _, - paths::{SanitizedPath, compare_paths}, + paths::{PathStyle, RemotePathBuf, SanitizedPath, compare_paths}, }; use worktree::{CreatedEntry, Snapshot, Traversal}; pub use worktree::{ @@ -1159,9 +1159,11 @@ impl Project { let snippets = SnippetProvider::new(fs.clone(), BTreeSet::from_iter([global_snippets_dir]), cx); - let ssh_proto = ssh.read(cx).proto_client(); - let worktree_store = - cx.new(|_| WorktreeStore::remote(false, ssh_proto.clone(), SSH_PROJECT_ID)); + let (ssh_proto, path_style) = + ssh.read_with(cx, |ssh, _| (ssh.proto_client(), ssh.path_style())); + let worktree_store = cx.new(|_| { + WorktreeStore::remote(false, ssh_proto.clone(), SSH_PROJECT_ID, path_style) + }); cx.subscribe(&worktree_store, Self::on_worktree_store_event) .detach(); @@ -1410,8 +1412,15 @@ impl Project { let remote_id = response.payload.project_id; let role = response.payload.role(); + // todo(zjk) + // Set the proper path style based on the remote let worktree_store = cx.new(|_| { - WorktreeStore::remote(true, client.clone().into(), response.payload.project_id) + WorktreeStore::remote( + true, + client.clone().into(), + response.payload.project_id, + PathStyle::Posix, + ) })?; let buffer_store = cx.new(|cx| { BufferStore::remote(worktree_store.clone(), client.clone().into(), remote_id, cx) @@ -4039,7 +4048,8 @@ impl Project { }) }) } else if let Some(ssh_client) = self.ssh_client.as_ref() { - let request_path = Path::new(path); + let path_style = ssh_client.read(cx).path_style(); + let request_path = RemotePathBuf::from_str(path, path_style); let request = ssh_client .read(cx) .proto_client() diff --git a/crates/project/src/terminals.rs b/crates/project/src/terminals.rs index b067396881..385fdf9082 100644 --- a/crates/project/src/terminals.rs +++ b/crates/project/src/terminals.rs @@ -4,6 +4,7 @@ use collections::HashMap; use gpui::{AnyWindowHandle, App, AppContext as _, Context, Entity, Task, WeakEntity}; use itertools::Itertools; use language::LanguageName; +use remote::ssh_session::SshArgs; use settings::{Settings, SettingsLocation}; use smol::channel::bounded; use std::{ @@ -17,7 +18,10 @@ use terminal::{ TaskState, TaskStatus, Terminal, TerminalBuilder, terminal_settings::{self, TerminalSettings, VenvSettings}, }; -use util::ResultExt; +use util::{ + ResultExt, + paths::{PathStyle, RemotePathBuf}, +}; pub struct Terminals { pub(crate) local_handles: Vec>, @@ -47,6 +51,13 @@ impl SshCommand { } } +pub struct SshDetails { + pub host: String, + pub ssh_command: SshCommand, + pub envs: Option>, + pub path_style: PathStyle, +} + impl Project { pub fn active_project_directory(&self, cx: &App) -> Option> { let worktree = self @@ -68,14 +79,16 @@ impl Project { } } - pub fn ssh_details(&self, cx: &App) -> Option<(String, SshCommand)> { + pub fn ssh_details(&self, cx: &App) -> Option { if let Some(ssh_client) = &self.ssh_client { let ssh_client = ssh_client.read(cx); - if let Some(args) = ssh_client.ssh_args() { - return Some(( - ssh_client.connection_options().host.clone(), - SshCommand { arguments: args }, - )); + if let Some((SshArgs { arguments, envs }, path_style)) = ssh_client.ssh_info() { + return Some(SshDetails { + host: ssh_client.connection_options().host.clone(), + ssh_command: SshCommand { arguments }, + envs, + path_style, + }); } } @@ -158,17 +171,26 @@ impl Project { .unwrap_or_default(); env.extend(settings.env.clone()); - match &self.ssh_details(cx) { - Some((_, ssh_command)) => { + match self.ssh_details(cx) { + Some(SshDetails { + ssh_command, + envs, + path_style, + .. + }) => { let (command, args) = wrap_for_ssh( - ssh_command, + &ssh_command, Some((&command, &args)), path.as_deref(), env, None, + path_style, ); let mut command = std::process::Command::new(command); command.args(args); + if let Some(envs) = envs { + command.envs(envs); + } command } None => { @@ -202,6 +224,7 @@ impl Project { } }; let ssh_details = this.ssh_details(cx); + let is_ssh_terminal = ssh_details.is_some(); let mut settings_location = None; if let Some(path) = path.as_ref() { @@ -226,11 +249,7 @@ impl Project { // precedence. env.extend(settings.env.clone()); - let local_path = if ssh_details.is_none() { - path.clone() - } else { - None - }; + let local_path = if is_ssh_terminal { None } else { path.clone() }; let mut python_venv_activate_command = None; @@ -241,8 +260,13 @@ impl Project { this.python_activate_command(python_venv_directory, &settings.detect_venv); } - match &ssh_details { - Some((host, ssh_command)) => { + match ssh_details { + Some(SshDetails { + host, + ssh_command, + envs, + path_style, + }) => { log::debug!("Connecting to a remote server: {ssh_command:?}"); // Alacritty sets its terminfo to `alacritty`, this requiring hosts to have it installed @@ -252,9 +276,18 @@ impl Project { env.entry("TERM".to_string()) .or_insert_with(|| "xterm-256color".to_string()); - let (program, args) = - wrap_for_ssh(&ssh_command, None, path.as_deref(), env, None); + let (program, args) = wrap_for_ssh( + &ssh_command, + None, + path.as_deref(), + env, + None, + path_style, + ); env = HashMap::default(); + if let Some(envs) = envs { + env.extend(envs); + } ( Option::::None, Shell::WithArguments { @@ -290,8 +323,13 @@ impl Project { ); } - match &ssh_details { - Some((host, ssh_command)) => { + match ssh_details { + Some(SshDetails { + host, + ssh_command, + envs, + path_style, + }) => { log::debug!("Connecting to a remote server: {ssh_command:?}"); env.entry("TERM".to_string()) .or_insert_with(|| "xterm-256color".to_string()); @@ -304,8 +342,12 @@ impl Project { path.as_deref(), env, python_venv_directory.as_deref(), + path_style, ); env = HashMap::default(); + if let Some(envs) = envs { + env.extend(envs); + } ( task_state, Shell::WithArguments { @@ -343,7 +385,7 @@ impl Project { settings.cursor_shape.unwrap_or_default(), settings.alternate_scroll, settings.max_scroll_history_lines, - ssh_details.is_some(), + is_ssh_terminal, window, completion_tx, cx, @@ -533,6 +575,7 @@ pub fn wrap_for_ssh( path: Option<&Path>, env: HashMap, venv_directory: Option<&Path>, + path_style: PathStyle, ) -> (String, Vec) { let to_run = if let Some((command, args)) = command { // DEFAULT_REMOTE_SHELL is '"${SHELL:-sh}"' so must not be escaped @@ -555,24 +598,25 @@ pub fn wrap_for_ssh( } if let Some(venv_directory) = venv_directory { if let Ok(str) = shlex::try_quote(venv_directory.to_string_lossy().as_ref()) { - env_changes.push_str(&format!("PATH={}:$PATH ", str)); + let path = RemotePathBuf::new(PathBuf::from(str.to_string()), path_style).to_string(); + env_changes.push_str(&format!("PATH={}:$PATH ", path)); } } let commands = if let Some(path) = path { - let path_string = path.to_string_lossy().to_string(); + let path = RemotePathBuf::new(path.to_path_buf(), path_style).to_string(); // shlex will wrap the command in single quotes (''), disabling ~ expansion, // replace ith with something that works let tilde_prefix = "~/"; if path.starts_with(tilde_prefix) { - let trimmed_path = path_string + let trimmed_path = path .trim_start_matches("/") .trim_start_matches("~") .trim_start_matches("/"); format!("cd \"$HOME/{trimmed_path}\"; {env_changes} {to_run}") } else { - format!("cd {path:?}; {env_changes} {to_run}") + format!("cd {path}; {env_changes} {to_run}") } } else { format!("cd; {env_changes} {to_run}") diff --git a/crates/project/src/worktree_store.rs b/crates/project/src/worktree_store.rs index 48ef3bda6f..16e42e90cb 100644 --- a/crates/project/src/worktree_store.rs +++ b/crates/project/src/worktree_store.rs @@ -25,7 +25,10 @@ use smol::{ stream::StreamExt, }; use text::ReplicaId; -use util::{ResultExt, paths::SanitizedPath}; +use util::{ + ResultExt, + paths::{PathStyle, RemotePathBuf, SanitizedPath}, +}; use worktree::{ Entry, ProjectEntryId, UpdatedEntriesSet, UpdatedGitRepositoriesSet, Worktree, WorktreeId, WorktreeSettings, @@ -46,6 +49,7 @@ enum WorktreeStoreState { Remote { upstream_client: AnyProtoClient, upstream_project_id: u64, + path_style: PathStyle, }, } @@ -100,6 +104,7 @@ impl WorktreeStore { retain_worktrees: bool, upstream_client: AnyProtoClient, upstream_project_id: u64, + path_style: PathStyle, ) -> Self { Self { next_entry_id: Default::default(), @@ -111,6 +116,7 @@ impl WorktreeStore { state: WorktreeStoreState::Remote { upstream_client, upstream_project_id, + path_style, }, } } @@ -214,17 +220,16 @@ impl WorktreeStore { if !self.loading_worktrees.contains_key(&abs_path) { let task = match &self.state { WorktreeStoreState::Remote { - upstream_client, .. + upstream_client, + path_style, + .. } => { if upstream_client.is_via_collab() { Task::ready(Err(Arc::new(anyhow!("cannot create worktrees via collab")))) } else { - self.create_ssh_worktree( - upstream_client.clone(), - abs_path.clone(), - visible, - cx, - ) + let abs_path = + RemotePathBuf::new(abs_path.as_path().to_path_buf(), *path_style); + self.create_ssh_worktree(upstream_client.clone(), abs_path, visible, cx) } } WorktreeStoreState::Local { fs } => { @@ -250,11 +255,12 @@ impl WorktreeStore { fn create_ssh_worktree( &mut self, client: AnyProtoClient, - abs_path: impl Into, + abs_path: RemotePathBuf, visible: bool, cx: &mut Context, ) -> Task, Arc>> { - let mut abs_path = Into::::into(abs_path).to_string(); + let path_style = abs_path.path_style(); + let mut abs_path = abs_path.to_string(); // If we start with `/~` that means the ssh path was something like `ssh://user@host/~/home-dir-folder/` // in which case want to strip the leading the `/`. // On the host-side, the `~` will get expanded. @@ -265,10 +271,11 @@ impl WorktreeStore { if abs_path.is_empty() { abs_path = "~/".to_string(); } + cx.spawn(async move |this, cx| { let this = this.upgrade().context("Dropped worktree store")?; - let path = Path::new(abs_path.as_str()); + let path = RemotePathBuf::new(abs_path.into(), path_style); let response = client .request(proto::AddWorktree { project_id: SSH_PROJECT_ID, diff --git a/crates/proto/Cargo.toml b/crates/proto/Cargo.toml index 5255463600..6cae4394bd 100644 --- a/crates/proto/Cargo.toml +++ b/crates/proto/Cargo.toml @@ -27,3 +27,4 @@ prost-build.workspace = true [dev-dependencies] collections = { workspace = true, features = ["test-support"] } +typed-path = "0.11" diff --git a/crates/proto/src/typed_envelope.rs b/crates/proto/src/typed_envelope.rs index a4d0a9bf85..381a6379dc 100644 --- a/crates/proto/src/typed_envelope.rs +++ b/crates/proto/src/typed_envelope.rs @@ -127,51 +127,46 @@ pub trait ToProto { fn to_proto(self) -> String; } -impl FromProto for PathBuf { +#[inline] +fn from_proto_path(proto: String) -> PathBuf { #[cfg(target_os = "windows")] - fn from_proto(proto: String) -> Self { - proto.split("/").collect() - } + let proto = proto.replace('/', "\\"); + + PathBuf::from(proto) +} + +#[inline] +fn to_proto_path(path: &Path) -> String { + #[cfg(target_os = "windows")] + let proto = path.to_string_lossy().replace('\\', "/"); #[cfg(not(target_os = "windows"))] + let proto = path.to_string_lossy().to_string(); + + proto +} + +impl FromProto for PathBuf { fn from_proto(proto: String) -> Self { - PathBuf::from(proto) + from_proto_path(proto) } } impl FromProto for Arc { fn from_proto(proto: String) -> Self { - PathBuf::from_proto(proto).into() + from_proto_path(proto).into() } } impl ToProto for PathBuf { - #[cfg(target_os = "windows")] fn to_proto(self) -> String { - self.components() - .map(|comp| comp.as_os_str().to_string_lossy().to_string()) - .collect::>() - .join("/") - } - - #[cfg(not(target_os = "windows"))] - fn to_proto(self) -> String { - self.to_string_lossy().to_string() + to_proto_path(&self) } } impl ToProto for &Path { - #[cfg(target_os = "windows")] fn to_proto(self) -> String { - self.components() - .map(|comp| comp.as_os_str().to_string_lossy().to_string()) - .collect::>() - .join("/") - } - - #[cfg(not(target_os = "windows"))] - fn to_proto(self) -> String { - self.to_string_lossy().to_string() + to_proto_path(self) } } @@ -214,3 +209,103 @@ impl TypedEnvelope { } } } + +#[cfg(test)] +mod tests { + use typed_path::{UnixPath, UnixPathBuf, WindowsPath, WindowsPathBuf}; + + fn windows_path_from_proto(proto: String) -> WindowsPathBuf { + let proto = proto.replace('/', "\\"); + WindowsPathBuf::from(proto) + } + + fn unix_path_from_proto(proto: String) -> UnixPathBuf { + UnixPathBuf::from(proto) + } + + fn windows_path_to_proto(path: &WindowsPath) -> String { + path.to_string_lossy().replace('\\', "/") + } + + fn unix_path_to_proto(path: &UnixPath) -> String { + path.to_string_lossy().to_string() + } + + #[test] + fn test_path_proto_interop() { + const WINDOWS_PATHS: &[&str] = &[ + "C:\\Users\\User\\Documents\\file.txt", + "C:/Program Files/App/app.exe", + "projects\\zed\\crates\\proto\\src\\typed_envelope.rs", + "projects/my project/src/main.rs", + ]; + const UNIX_PATHS: &[&str] = &[ + "/home/user/documents/file.txt", + "/usr/local/bin/my app/app", + "projects/zed/crates/proto/src/typed_envelope.rs", + "projects/my project/src/main.rs", + ]; + + // Windows path to proto and back + for &windows_path_str in WINDOWS_PATHS { + let windows_path = WindowsPathBuf::from(windows_path_str); + let proto = windows_path_to_proto(&windows_path); + let recovered_path = windows_path_from_proto(proto); + assert_eq!(windows_path, recovered_path); + assert_eq!( + recovered_path.to_string_lossy(), + windows_path_str.replace('/', "\\") + ); + } + // Unix path to proto and back + for &unix_path_str in UNIX_PATHS { + let unix_path = UnixPathBuf::from(unix_path_str); + let proto = unix_path_to_proto(&unix_path); + let recovered_path = unix_path_from_proto(proto); + assert_eq!(unix_path, recovered_path); + assert_eq!(recovered_path.to_string_lossy(), unix_path_str); + } + // Windows host, Unix client, host sends Windows path to client + for &windows_path_str in WINDOWS_PATHS { + let windows_host_path = WindowsPathBuf::from(windows_path_str); + let proto = windows_path_to_proto(&windows_host_path); + let unix_client_received_path = unix_path_from_proto(proto); + let proto = unix_path_to_proto(&unix_client_received_path); + let windows_host_recovered_path = windows_path_from_proto(proto); + assert_eq!(windows_host_path, windows_host_recovered_path); + assert_eq!( + windows_host_recovered_path.to_string_lossy(), + windows_path_str.replace('/', "\\") + ); + } + // Unix host, Windows client, host sends Unix path to client + for &unix_path_str in UNIX_PATHS { + let unix_host_path = UnixPathBuf::from(unix_path_str); + let proto = unix_path_to_proto(&unix_host_path); + let windows_client_received_path = windows_path_from_proto(proto); + let proto = windows_path_to_proto(&windows_client_received_path); + let unix_host_recovered_path = unix_path_from_proto(proto); + assert_eq!(unix_host_path, unix_host_recovered_path); + assert_eq!(unix_host_recovered_path.to_string_lossy(), unix_path_str); + } + } + + // todo(zjk) + #[test] + fn test_unsolved_case() { + // Unix host, Windows client + // The Windows client receives a Unix path with backslashes in it, then + // sends it back to the host. + // This currently fails. + let unix_path = UnixPathBuf::from("/home/user/projects/my\\project/src/main.rs"); + let proto = unix_path_to_proto(&unix_path); + let windows_client_received_path = windows_path_from_proto(proto); + let proto = windows_path_to_proto(&windows_client_received_path); + let unix_host_recovered_path = unix_path_from_proto(proto); + assert_ne!(unix_path, unix_host_recovered_path); + assert_eq!( + unix_host_recovered_path.to_string_lossy(), + "/home/user/projects/my/project/src/main.rs" + ); + } +} diff --git a/crates/recent_projects/src/remote_servers.rs b/crates/recent_projects/src/remote_servers.rs index 134f728680..aa5103e62b 100644 --- a/crates/recent_projects/src/remote_servers.rs +++ b/crates/recent_projects/src/remote_servers.rs @@ -28,9 +28,8 @@ use paths::user_ssh_config_file; use picker::Picker; use project::Fs; use project::Project; -use remote::SshConnectionOptions; -use remote::SshRemoteClient; use remote::ssh_session::ConnectionIdentifier; +use remote::{SshConnectionOptions, SshRemoteClient}; use settings::Settings; use settings::SettingsStore; use settings::update_settings_file; @@ -42,7 +41,10 @@ use ui::{ IconButtonShape, List, ListItem, ListSeparator, Modal, ModalHeader, Scrollbar, ScrollbarState, Section, Tooltip, prelude::*, }; -use util::ResultExt; +use util::{ + ResultExt, + paths::{PathStyle, RemotePathBuf}, +}; use workspace::OpenOptions; use workspace::Toast; use workspace::notifications::NotificationId; @@ -142,20 +144,21 @@ impl ProjectPicker { ix: usize, connection: SshConnectionOptions, project: Entity, - home_dir: PathBuf, + home_dir: RemotePathBuf, + path_style: PathStyle, workspace: WeakEntity, window: &mut Window, cx: &mut Context, ) -> Entity { let (tx, rx) = oneshot::channel(); let lister = project::DirectoryLister::Project(project.clone()); - let delegate = file_finder::OpenPathDelegate::new(tx, lister, false); + let delegate = file_finder::OpenPathDelegate::new(tx, lister, false, path_style); let picker = cx.new(|cx| { let picker = Picker::uniform_list(delegate, window, cx) .width(rems(34.)) .modal(false); - picker.set_query(home_dir.to_string_lossy().to_string(), window, cx); + picker.set_query(home_dir.to_string(), window, cx); picker }); let connection_string = connection.connection_string().into(); @@ -422,7 +425,8 @@ impl RemoteServerProjects { ix: usize, connection_options: remote::SshConnectionOptions, project: Entity, - home_dir: PathBuf, + home_dir: RemotePathBuf, + path_style: PathStyle, window: &mut Window, cx: &mut Context, workspace: WeakEntity, @@ -435,6 +439,7 @@ impl RemoteServerProjects { connection_options, project, home_dir, + path_style, workspace, window, cx, @@ -589,15 +594,18 @@ impl RemoteServerProjects { }); }; - let project = cx.update(|_, cx| { - project::Project::ssh( - session, - app_state.client.clone(), - app_state.node_runtime.clone(), - app_state.user_store.clone(), - app_state.languages.clone(), - app_state.fs.clone(), - cx, + let (path_style, project) = cx.update(|_, cx| { + ( + session.read(cx).path_style(), + project::Project::ssh( + session, + app_state.client.clone(), + app_state.node_runtime.clone(), + app_state.user_store.clone(), + app_state.languages.clone(), + app_state.fs.clone(), + cx, + ), ) })?; @@ -605,7 +613,13 @@ impl RemoteServerProjects { .read_with(cx, |project, cx| project.resolve_abs_path("~", cx))? .await .and_then(|path| path.into_abs_path()) - .unwrap_or(PathBuf::from("/")); + .map(|path| RemotePathBuf::new(path, path_style)) + .unwrap_or_else(|| match path_style { + PathStyle::Posix => RemotePathBuf::from_str("/", PathStyle::Posix), + PathStyle::Windows => { + RemotePathBuf::from_str("C:\\", PathStyle::Windows) + } + }); workspace .update_in(cx, |workspace, window, cx| { @@ -617,6 +631,7 @@ impl RemoteServerProjects { connection_options, project, home_dir, + path_style, window, cx, weak, diff --git a/crates/remote/src/ssh_session.rs b/crates/remote/src/ssh_session.rs index e01f4cfb04..2653a19bd9 100644 --- a/crates/remote/src/ssh_session.rs +++ b/crates/remote/src/ssh_session.rs @@ -49,7 +49,10 @@ use std::{ time::{Duration, Instant}, }; use tempfile::TempDir; -use util::ResultExt; +use util::{ + ResultExt, + paths::{PathStyle, RemotePathBuf}, +}; #[derive( Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, serde::Serialize, serde::Deserialize, @@ -59,7 +62,10 @@ pub struct SshProjectId(pub u64); #[derive(Clone)] pub struct SshSocket { connection_options: SshConnectionOptions, + #[cfg(not(target_os = "windows"))] socket_path: PathBuf, + #[cfg(target_os = "windows")] + envs: HashMap, } #[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize, JsonSchema)] @@ -85,6 +91,11 @@ pub struct SshConnectionOptions { pub upload_binary_over_ssh: bool, } +pub struct SshArgs { + pub arguments: Vec, + pub envs: Option>, +} + #[macro_export] macro_rules! shell_script { ($fmt:expr, $($name:ident = $arg:expr),+ $(,)?) => {{ @@ -338,6 +349,28 @@ pub trait SshClientDelegate: Send + Sync { } impl SshSocket { + #[cfg(not(target_os = "windows"))] + fn new(options: SshConnectionOptions, socket_path: PathBuf) -> Result { + Ok(Self { + connection_options: options, + socket_path, + }) + } + + #[cfg(target_os = "windows")] + fn new(options: SshConnectionOptions, temp_dir: &TempDir, secret: String) -> Result { + let askpass_script = temp_dir.path().join("askpass.bat"); + std::fs::write(&askpass_script, "@ECHO OFF\necho %ZED_SSH_ASKPASS%")?; + let mut envs = HashMap::default(); + envs.insert("SSH_ASKPASS_REQUIRE".into(), "force".into()); + envs.insert("SSH_ASKPASS".into(), askpass_script.display().to_string()); + envs.insert("ZED_SSH_ASKPASS".into(), secret); + Ok(Self { + connection_options: options, + envs, + }) + } + // :WARNING: ssh unquotes arguments when executing on the remote :WARNING: // e.g. $ ssh host sh -c 'ls -l' is equivalent to $ ssh host sh -c ls -l // and passes -l as an argument to sh, not to ls. @@ -375,6 +408,7 @@ impl SshSocket { Ok(String::from_utf8_lossy(&output.stdout).to_string()) } + #[cfg(not(target_os = "windows"))] fn ssh_options<'a>(&self, command: &'a mut process::Command) -> &'a mut process::Command { command .stdin(Stdio::piped()) @@ -384,14 +418,68 @@ impl SshSocket { .arg(format!("ControlPath={}", self.socket_path.display())) } - fn ssh_args(&self) -> Vec { - vec![ - "-o".to_string(), - "ControlMaster=no".to_string(), - "-o".to_string(), - format!("ControlPath={}", self.socket_path.display()), - self.connection_options.ssh_url(), - ] + #[cfg(target_os = "windows")] + fn ssh_options<'a>(&self, command: &'a mut process::Command) -> &'a mut process::Command { + command + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .envs(self.envs.clone()) + } + + // On Windows, we need to use `SSH_ASKPASS` to provide the password to ssh. + // On Linux, we use the `ControlPath` option to create a socket file that ssh can use to + #[cfg(not(target_os = "windows"))] + fn ssh_args(&self) -> SshArgs { + SshArgs { + arguments: vec![ + "-o".to_string(), + "ControlMaster=no".to_string(), + "-o".to_string(), + format!("ControlPath={}", self.socket_path.display()), + self.connection_options.ssh_url(), + ], + envs: None, + } + } + + #[cfg(target_os = "windows")] + fn ssh_args(&self) -> SshArgs { + SshArgs { + arguments: vec![self.connection_options.ssh_url()], + envs: Some(self.envs.clone()), + } + } + + async fn platform(&self) -> Result { + let uname = self.run_command("sh", &["-c", "uname -sm"]).await?; + let Some((os, arch)) = uname.split_once(" ") else { + anyhow::bail!("unknown uname: {uname:?}") + }; + + let os = match os.trim() { + "Darwin" => "macos", + "Linux" => "linux", + _ => anyhow::bail!( + "Prebuilt remote servers are not yet available for {os:?}. See https://zed.dev/docs/remote-development" + ), + }; + // exclude armv5,6,7 as they are 32-bit. + let arch = if arch.starts_with("armv8") + || arch.starts_with("armv9") + || arch.starts_with("arm64") + || arch.starts_with("aarch64") + { + "aarch64" + } else if arch.starts_with("x86") { + "x86_64" + } else { + anyhow::bail!( + "Prebuilt remote servers are not yet available for {arch:?}. See https://zed.dev/docs/remote-development" + ) + }; + + Ok(SshPlatform { os, arch }) } } @@ -560,6 +648,7 @@ pub struct SshRemoteClient { client: Arc, unique_identifier: String, connection_options: SshConnectionOptions, + path_style: PathStyle, state: Arc>>, } @@ -620,22 +709,25 @@ impl SshRemoteClient { let client = cx.update(|cx| ChannelClient::new(incoming_rx, outgoing_tx, cx, "client"))?; - let this = cx.new(|_| Self { - client: client.clone(), - unique_identifier: unique_identifier.clone(), - connection_options: connection_options.clone(), - state: Arc::new(Mutex::new(Some(State::Connecting))), - })?; let ssh_connection = cx .update(|cx| { cx.update_default_global(|pool: &mut ConnectionPool, cx| { - pool.connect(connection_options, &delegate, cx) + pool.connect(connection_options.clone(), &delegate, cx) }) })? .await .map_err(|e| e.cloned())?; + let path_style = ssh_connection.path_style(); + let this = cx.new(|_| Self { + client: client.clone(), + unique_identifier: unique_identifier.clone(), + connection_options, + path_style, + state: Arc::new(Mutex::new(Some(State::Connecting))), + })?; + let io_task = ssh_connection.start_proxy( unique_identifier, false, @@ -1065,18 +1157,18 @@ impl SshRemoteClient { self.client.subscribe_to_entity(remote_id, entity); } - pub fn ssh_args(&self) -> Option> { + pub fn ssh_info(&self) -> Option<(SshArgs, PathStyle)> { self.state .lock() .as_ref() .and_then(|state| state.ssh_connection()) - .map(|ssh_connection| ssh_connection.ssh_args()) + .map(|ssh_connection| (ssh_connection.ssh_args(), ssh_connection.path_style())) } pub fn upload_directory( &self, src_path: PathBuf, - dest_path: PathBuf, + dest_path: RemotePathBuf, cx: &App, ) -> Task> { let state = self.state.lock(); @@ -1110,6 +1202,10 @@ impl SshRemoteClient { self.connection_state() == ConnectionState::Disconnected } + pub fn path_style(&self) -> PathStyle { + self.path_style + } + #[cfg(any(test, feature = "test-support"))] pub fn simulate_disconnect(&self, client_cx: &mut App) -> Task<()> { let opts = self.connection_options(); @@ -1288,12 +1384,19 @@ trait RemoteConnection: Send + Sync { delegate: Arc, cx: &mut AsyncApp, ) -> Task>; - fn upload_directory(&self, src_path: PathBuf, dest_path: PathBuf, cx: &App) - -> Task>; + fn upload_directory( + &self, + src_path: PathBuf, + dest_path: RemotePathBuf, + cx: &App, + ) -> Task>; async fn kill(&self) -> Result<()>; fn has_been_killed(&self) -> bool; - fn ssh_args(&self) -> Vec; + /// On Windows, we need to use `SSH_ASKPASS` to provide the password to ssh. + /// On Linux, we use the `ControlPath` option to create a socket file that ssh can use to + fn ssh_args(&self) -> SshArgs; fn connection_options(&self) -> SshConnectionOptions; + fn path_style(&self) -> PathStyle; #[cfg(any(test, feature = "test-support"))] fn simulate_disconnect(&self, _: &AsyncApp) {} @@ -1302,7 +1405,9 @@ trait RemoteConnection: Send + Sync { struct SshRemoteConnection { socket: SshSocket, master_process: Mutex>, - remote_binary_path: Option, + remote_binary_path: Option, + ssh_platform: SshPlatform, + ssh_path_style: PathStyle, _temp_dir: TempDir, } @@ -1321,7 +1426,7 @@ impl RemoteConnection for SshRemoteConnection { self.master_process.lock().is_none() } - fn ssh_args(&self) -> Vec { + fn ssh_args(&self) -> SshArgs { self.socket.ssh_args() } @@ -1332,7 +1437,7 @@ impl RemoteConnection for SshRemoteConnection { fn upload_directory( &self, src_path: PathBuf, - dest_path: PathBuf, + dest_path: RemotePathBuf, cx: &App, ) -> Task> { let mut command = util::command::new_smol_command("scp"); @@ -1352,7 +1457,7 @@ impl RemoteConnection for SshRemoteConnection { .arg(format!( "{}:{}", self.socket.connection_options.scp_url(), - dest_path.display() + dest_path.to_string() )) .output(); @@ -1363,7 +1468,7 @@ impl RemoteConnection for SshRemoteConnection { output.status.success(), "failed to upload directory {} -> {}: {}", src_path.display(), - dest_path.display(), + dest_path.to_string(), String::from_utf8_lossy(&output.stderr) ); @@ -1389,7 +1494,7 @@ impl RemoteConnection for SshRemoteConnection { let mut start_proxy_command = shell_script!( "exec {binary_path} proxy --identifier {identifier}", - binary_path = &remote_binary_path.to_string_lossy(), + binary_path = &remote_binary_path.to_string(), identifier = &unique_identifier, ); @@ -1432,19 +1537,13 @@ impl RemoteConnection for SshRemoteConnection { &cx, ) } + + fn path_style(&self) -> PathStyle { + self.ssh_path_style + } } impl SshRemoteConnection { - #[cfg(not(unix))] - async fn new( - _connection_options: SshConnectionOptions, - _delegate: Arc, - _cx: &mut AsyncApp, - ) -> Result { - anyhow::bail!("ssh is not supported on this platform"); - } - - #[cfg(unix)] async fn new( connection_options: SshConnectionOptions, delegate: Arc, @@ -1470,27 +1569,38 @@ impl SshRemoteConnection { // Start the master SSH process, which does not do anything except for establish // the connection and keep it open, allowing other ssh commands to reuse it // via a control socket. + #[cfg(not(target_os = "windows"))] let socket_path = temp_dir.path().join("ssh.sock"); - let mut master_process = process::Command::new("ssh") - .stdin(Stdio::null()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .env("SSH_ASKPASS_REQUIRE", "force") - .env("SSH_ASKPASS", &askpass.script_path()) - .args(connection_options.additional_args()) - .args([ + let mut master_process = { + #[cfg(not(target_os = "windows"))] + let args = [ "-N", "-o", "ControlPersist=no", "-o", "ControlMaster=yes", "-o", - ]) - .arg(format!("ControlPath={}", socket_path.display())) - .arg(&url) - .kill_on_drop(true) - .spawn()?; + ]; + // On Windows, `ControlMaster` and `ControlPath` are not supported: + // https://github.com/PowerShell/Win32-OpenSSH/issues/405 + // https://github.com/PowerShell/Win32-OpenSSH/wiki/Project-Scope + #[cfg(target_os = "windows")] + let args = ["-N"]; + let mut master_process = process::Command::new("ssh"); + master_process + .kill_on_drop(true) + .stdin(Stdio::null()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .env("SSH_ASKPASS_REQUIRE", "force") + .env("SSH_ASKPASS", askpass.script_path()) + .args(connection_options.additional_args()) + .args(args); + #[cfg(not(target_os = "windows"))] + master_process.arg(format!("ControlPath={}", socket_path.display())); + master_process.arg(&url).spawn()? + }; // Wait for this ssh process to close its stdout, indicating that authentication // has completed. let mut stdout = master_process.stdout.take().unwrap(); @@ -1529,11 +1639,16 @@ impl SshRemoteConnection { anyhow::bail!(error_message); } + #[cfg(not(target_os = "windows"))] + let socket = SshSocket::new(connection_options, socket_path)?; + #[cfg(target_os = "windows")] + let socket = SshSocket::new(connection_options, &temp_dir, askpass.get_password())?; drop(askpass); - let socket = SshSocket { - connection_options, - socket_path, + let ssh_platform = socket.platform().await?; + let ssh_path_style = match ssh_platform.os { + "windows" => PathStyle::Windows, + _ => PathStyle::Posix, }; let mut this = Self { @@ -1541,6 +1656,8 @@ impl SshRemoteConnection { master_process: Mutex::new(Some(master_process)), _temp_dir: temp_dir, remote_binary_path: None, + ssh_path_style, + ssh_platform, }; let (release_channel, version, commit) = cx.update(|cx| { @@ -1558,37 +1675,6 @@ impl SshRemoteConnection { Ok(this) } - async fn platform(&self) -> Result { - let uname = self.socket.run_command("sh", &["-c", "uname -sm"]).await?; - let Some((os, arch)) = uname.split_once(" ") else { - anyhow::bail!("unknown uname: {uname:?}") - }; - - let os = match os.trim() { - "Darwin" => "macos", - "Linux" => "linux", - _ => anyhow::bail!( - "Prebuilt remote servers are not yet available for {os:?}. See https://zed.dev/docs/remote-development" - ), - }; - // exclude armv5,6,7 as they are 32-bit. - let arch = if arch.starts_with("armv8") - || arch.starts_with("armv9") - || arch.starts_with("arm64") - || arch.starts_with("aarch64") - { - "aarch64" - } else if arch.starts_with("x86") { - "x86_64" - } else { - anyhow::bail!( - "Prebuilt remote servers are not yet available for {arch:?}. See https://zed.dev/docs/remote-development" - ) - }; - - Ok(SshPlatform { os, arch }) - } - fn multiplex( mut ssh_proxy_process: Child, incoming_tx: UnboundedSender, @@ -1699,11 +1785,10 @@ impl SshRemoteConnection { version: SemanticVersion, commit: Option, cx: &mut AsyncApp, - ) -> Result { + ) -> Result { let version_str = match release_channel { ReleaseChannel::Nightly => { let commit = commit.map(|s| s.full()).unwrap_or_default(); - format!("{}-{}", version, commit) } ReleaseChannel::Dev => "build".to_string(), @@ -1714,19 +1799,23 @@ impl SshRemoteConnection { release_channel.dev_name(), version_str ); - let dst_path = paths::remote_server_dir_relative().join(binary_name); + let dst_path = RemotePathBuf::new( + paths::remote_server_dir_relative().join(binary_name), + self.ssh_path_style, + ); let build_remote_server = std::env::var("ZED_BUILD_REMOTE_SERVER").ok(); #[cfg(debug_assertions)] if let Some(build_remote_server) = build_remote_server { - let src_path = self - .build_local(build_remote_server, self.platform().await?, delegate, cx) - .await?; - let tmp_path = paths::remote_server_dir_relative().join(format!( - "download-{}-{}", - std::process::id(), - src_path.file_name().unwrap().to_string_lossy() - )); + let src_path = self.build_local(build_remote_server, delegate, cx).await?; + let tmp_path = RemotePathBuf::new( + paths::remote_server_dir_relative().join(format!( + "download-{}-{}", + std::process::id(), + src_path.file_name().unwrap().to_string_lossy() + )), + self.ssh_path_style, + ); self.upload_local_server_binary(&src_path, &tmp_path, delegate, cx) .await?; self.extract_server_binary(&dst_path, &tmp_path, delegate, cx) @@ -1736,7 +1825,7 @@ impl SshRemoteConnection { if self .socket - .run_command(&dst_path.to_string_lossy(), &["version"]) + .run_command(&dst_path.to_string(), &["version"]) .await .is_ok() { @@ -1754,16 +1843,17 @@ impl SshRemoteConnection { _ => Ok(Some(AppVersion::global(cx))), })??; - let platform = self.platform().await?; - - let tmp_path_gz = PathBuf::from(format!( - "{}-download-{}.gz", - dst_path.to_string_lossy(), - std::process::id() - )); + let tmp_path_gz = RemotePathBuf::new( + PathBuf::from(format!( + "{}-download-{}.gz", + dst_path.to_string(), + std::process::id() + )), + self.ssh_path_style, + ); if !self.socket.connection_options.upload_binary_over_ssh { if let Some((url, body)) = delegate - .get_download_params(platform, release_channel, wanted_version, cx) + .get_download_params(self.ssh_platform, release_channel, wanted_version, cx) .await? { match self @@ -1786,7 +1876,7 @@ impl SshRemoteConnection { } let src_path = delegate - .download_server_binary_locally(platform, release_channel, wanted_version, cx) + .download_server_binary_locally(self.ssh_platform, release_channel, wanted_version, cx) .await?; self.upload_local_server_binary(&src_path, &tmp_path_gz, delegate, cx) .await?; @@ -1799,7 +1889,7 @@ impl SshRemoteConnection { &self, url: &str, body: &str, - tmp_path_gz: &Path, + tmp_path_gz: &RemotePathBuf, delegate: &Arc, cx: &mut AsyncApp, ) -> Result<()> { @@ -1809,10 +1899,7 @@ impl SshRemoteConnection { "sh", &[ "-c", - &shell_script!( - "mkdir -p {parent}", - parent = parent.to_string_lossy().as_ref() - ), + &shell_script!("mkdir -p {parent}", parent = parent.to_string().as_ref()), ], ) .await?; @@ -1835,7 +1922,7 @@ impl SshRemoteConnection { &body, &url, "-o", - &tmp_path_gz.to_string_lossy(), + &tmp_path_gz.to_string(), ], ) .await @@ -1857,7 +1944,7 @@ impl SshRemoteConnection { &body, &url, "-O", - &tmp_path_gz.to_string_lossy(), + &tmp_path_gz.to_string(), ], ) .await @@ -1880,7 +1967,7 @@ impl SshRemoteConnection { async fn upload_local_server_binary( &self, src_path: &Path, - tmp_path_gz: &Path, + tmp_path_gz: &RemotePathBuf, delegate: &Arc, cx: &mut AsyncApp, ) -> Result<()> { @@ -1890,10 +1977,7 @@ impl SshRemoteConnection { "sh", &[ "-c", - &shell_script!( - "mkdir -p {parent}", - parent = parent.to_string_lossy().as_ref() - ), + &shell_script!("mkdir -p {parent}", parent = parent.to_string().as_ref()), ], ) .await?; @@ -1918,33 +2002,33 @@ impl SshRemoteConnection { async fn extract_server_binary( &self, - dst_path: &Path, - tmp_path: &Path, + dst_path: &RemotePathBuf, + tmp_path: &RemotePathBuf, delegate: &Arc, cx: &mut AsyncApp, ) -> Result<()> { delegate.set_status(Some("Extracting remote development server"), cx); let server_mode = 0o755; - let orig_tmp_path = tmp_path.to_string_lossy(); + let orig_tmp_path = tmp_path.to_string(); let script = if let Some(tmp_path) = orig_tmp_path.strip_suffix(".gz") { shell_script!( "gunzip -f {orig_tmp_path} && chmod {server_mode} {tmp_path} && mv {tmp_path} {dst_path}", server_mode = &format!("{:o}", server_mode), - dst_path = &dst_path.to_string_lossy() + dst_path = &dst_path.to_string(), ) } else { shell_script!( "chmod {server_mode} {orig_tmp_path} && mv {orig_tmp_path} {dst_path}", server_mode = &format!("{:o}", server_mode), - dst_path = &dst_path.to_string_lossy() + dst_path = &dst_path.to_string() ) }; self.socket.run_command("sh", &["-c", &script]).await?; Ok(()) } - async fn upload_file(&self, src_path: &Path, dest_path: &Path) -> Result<()> { + async fn upload_file(&self, src_path: &Path, dest_path: &RemotePathBuf) -> Result<()> { log::debug!("uploading file {:?} to {:?}", src_path, dest_path); let mut command = util::command::new_smol_command("scp"); let output = self @@ -1961,7 +2045,7 @@ impl SshRemoteConnection { .arg(format!( "{}:{}", self.socket.connection_options.scp_url(), - dest_path.display() + dest_path.to_string() )) .output() .await?; @@ -1970,7 +2054,7 @@ impl SshRemoteConnection { output.status.success(), "failed to upload file {} -> {}: {}", src_path.display(), - dest_path.display(), + dest_path.to_string(), String::from_utf8_lossy(&output.stderr) ); Ok(()) @@ -1980,7 +2064,6 @@ impl SshRemoteConnection { async fn build_local( &self, build_remote_server: String, - platform: SshPlatform, delegate: &Arc, cx: &mut AsyncApp, ) -> Result { @@ -1999,7 +2082,9 @@ impl SshRemoteConnection { Ok(()) } - if platform.arch == std::env::consts::ARCH && platform.os == std::env::consts::OS { + if self.ssh_platform.arch == std::env::consts::ARCH + && self.ssh_platform.os == std::env::consts::OS + { delegate.set_status(Some("Building remote server binary from source"), cx); log::info!("building remote server binary from source"); run_cmd(Command::new("cargo").args([ @@ -2025,12 +2110,15 @@ impl SshRemoteConnection { let path = std::env::current_dir()?.join("target/remote_server/debug/remote_server.gz"); return Ok(path); } - let Some(triple) = platform.triple() else { - anyhow::bail!("can't cross compile for: {:?}", platform); + let Some(triple) = self.ssh_platform.triple() else { + anyhow::bail!("can't cross compile for: {:?}", self.ssh_platform); }; smol::fs::create_dir_all("target/remote_server").await?; if build_remote_server.contains("cross") { + #[cfg(target_os = "windows")] + use util::paths::SanitizedPath; + delegate.set_status(Some("Installing cross.rs for cross-compilation"), cx); log::info!("installing cross"); run_cmd(Command::new("cargo").args([ @@ -2049,6 +2137,13 @@ impl SshRemoteConnection { cx, ); log::info!("building remote server binary from source for {}", &triple); + + // On Windows, the binding needs to be set to the canonical path + #[cfg(target_os = "windows")] + let src = + SanitizedPath::from(smol::fs::canonicalize("./target").await?).to_glob_string(); + #[cfg(not(target_os = "windows"))] + let src = "./target"; run_cmd( Command::new("cross") .args([ @@ -2064,7 +2159,7 @@ impl SshRemoteConnection { ]) .env( "CROSS_CONTAINER_OPTS", - "--mount type=bind,src=./target,dst=/app/target", + format!("--mount type=bind,src={src},dst=/app/target"), ), ) .await?; @@ -2074,9 +2169,18 @@ impl SshRemoteConnection { .await; if which.is_err() { - anyhow::bail!( - "zig not found on $PATH, install zig (see https://ziglang.org/learn/getting-started or use zigup) or pass ZED_BUILD_REMOTE_SERVER=cross to use cross" - ) + #[cfg(not(target_os = "windows"))] + { + anyhow::bail!( + "zig not found on $PATH, install zig (see https://ziglang.org/learn/getting-started or use zigup) or pass ZED_BUILD_REMOTE_SERVER=cross to use cross" + ) + } + #[cfg(target_os = "windows")] + { + anyhow::bail!( + "zig not found on $PATH, install zig (use `winget install -e --id zig.zig` or see https://ziglang.org/learn/getting-started or use zigup) or pass ZED_BUILD_REMOTE_SERVER=cross to use cross" + ) + } } delegate.set_status(Some("Adding rustup target for cross-compilation"), cx); @@ -2112,12 +2216,31 @@ impl SshRemoteConnection { if !build_remote_server.contains("nocompress") { delegate.set_status(Some("Compressing binary"), cx); - run_cmd(Command::new("gzip").args([ - "-9", - "-f", - &format!("target/remote_server/{}/debug/remote_server", triple), - ])) - .await?; + #[cfg(not(target_os = "windows"))] + { + run_cmd(Command::new("gzip").args([ + "-9", + "-f", + &format!("target/remote_server/{}/debug/remote_server", triple), + ])) + .await?; + } + #[cfg(target_os = "windows")] + { + // On Windows, we use 7z to compress the binary + let seven_zip = which::which("7z.exe").context("7z.exe not found on $PATH, install it (e.g. with `winget install -e --id 7zip.7zip`) or, if you don't want this behaviour, set $env:ZED_BUILD_REMOTE_SERVER=\"nocompress\"")?; + let gz_path = format!("target/remote_server/{}/debug/remote_server.gz", triple); + if smol::fs::metadata(&gz_path).await.is_ok() { + smol::fs::remove_file(&gz_path).await?; + } + run_cmd(Command::new(seven_zip).args([ + "a", + "-tgzip", + &gz_path, + &format!("target/remote_server/{}/debug/remote_server", triple), + ])) + .await?; + } path = std::env::current_dir()?.join(format!( "target/remote_server/{triple}/debug/remote_server.gz" @@ -2450,9 +2573,11 @@ mod fake { use gpui::{App, AppContext as _, AsyncApp, SemanticVersion, Task, TestAppContext}; use release_channel::ReleaseChannel; use rpc::proto::Envelope; + use util::paths::{PathStyle, RemotePathBuf}; use super::{ - ChannelClient, RemoteConnection, SshClientDelegate, SshConnectionOptions, SshPlatform, + ChannelClient, RemoteConnection, SshArgs, SshClientDelegate, SshConnectionOptions, + SshPlatform, }; pub(super) struct FakeRemoteConnection { @@ -2488,13 +2613,17 @@ mod fake { false } - fn ssh_args(&self) -> Vec { - Vec::new() + fn ssh_args(&self) -> SshArgs { + SshArgs { + arguments: Vec::new(), + envs: None, + } } + fn upload_directory( &self, _src_path: PathBuf, - _dest_path: PathBuf, + _dest_path: RemotePathBuf, _cx: &App, ) -> Task> { unreachable!() @@ -2513,7 +2642,6 @@ mod fake { fn start_proxy( &self, - _unique_identifier: String, _reconnect: bool, mut client_incoming_tx: mpsc::UnboundedSender, @@ -2551,6 +2679,10 @@ mod fake { } }) } + + fn path_style(&self) -> PathStyle { + PathStyle::current() + } } pub(super) struct Delegate; diff --git a/crates/util/src/paths.rs b/crates/util/src/paths.rs index 2e02f051d1..585f2b08aa 100644 --- a/crates/util/src/paths.rs +++ b/crates/util/src/paths.rs @@ -166,6 +166,98 @@ impl> From for SanitizedPath { } } +#[derive(Debug, Clone, Copy)] +pub enum PathStyle { + Posix, + Windows, +} + +impl PathStyle { + #[cfg(target_os = "windows")] + pub const fn current() -> Self { + PathStyle::Windows + } + + #[cfg(not(target_os = "windows"))] + pub const fn current() -> Self { + PathStyle::Posix + } + + #[inline] + pub fn separator(&self) -> &str { + match self { + PathStyle::Posix => "/", + PathStyle::Windows => "\\", + } + } +} + +#[derive(Debug, Clone)] +pub struct RemotePathBuf { + inner: PathBuf, + style: PathStyle, + string: String, // Cached string representation +} + +impl RemotePathBuf { + pub fn new(path: PathBuf, style: PathStyle) -> Self { + #[cfg(target_os = "windows")] + let string = match style { + PathStyle::Posix => path.to_string_lossy().replace('\\', "/"), + PathStyle::Windows => path.to_string_lossy().into(), + }; + #[cfg(not(target_os = "windows"))] + let string = match style { + PathStyle::Posix => path.to_string_lossy().to_string(), + PathStyle::Windows => path.to_string_lossy().replace('/', "\\"), + }; + Self { + inner: path, + style, + string, + } + } + + pub fn from_str(path: &str, style: PathStyle) -> Self { + let path_buf = PathBuf::from(path); + Self::new(path_buf, style) + } + + pub fn to_string(&self) -> String { + self.string.clone() + } + + #[cfg(target_os = "windows")] + pub fn to_proto(self) -> String { + match self.path_style() { + PathStyle::Posix => self.to_string(), + PathStyle::Windows => self.inner.to_string_lossy().replace('\\', "/"), + } + } + + #[cfg(not(target_os = "windows"))] + pub fn to_proto(self) -> String { + match self.path_style() { + PathStyle::Posix => self.inner.to_string_lossy().to_string(), + PathStyle::Windows => self.to_string(), + } + } + + pub fn as_path(&self) -> &Path { + &self.inner + } + + pub fn path_style(&self) -> PathStyle { + self.style + } + + pub fn parent(&self) -> Option { + self.inner + .parent() + .map(|p| RemotePathBuf::new(p.to_path_buf(), self.style)) + } +} + /// A delimiter to use in `path_query:row_number:column_number` strings parsing. pub const FILE_ROW_COLUMN_DELIMITER: char = ':'; diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index 3c46c486a8..b5efea10e2 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -167,16 +167,6 @@ pub fn main() { #[cfg(unix)] util::prevent_root_execution(); - // Check if there is a pending installer - // If there is, run the installer and exit - // And we don't want to run the installer if we are not the first instance - #[cfg(target_os = "windows")] - let is_first_instance = crate::zed::windows_only_instance::is_first_instance(); - #[cfg(target_os = "windows")] - if is_first_instance && auto_update::check_pending_installation() { - return; - } - let args = Args::parse(); // `zed --askpass` Makes zed operate in nc/netcat mode for use with askpass @@ -191,6 +181,16 @@ pub fn main() { return; } + // Check if there is a pending installer + // If there is, run the installer and exit + // And we don't want to run the installer if we are not the first instance + #[cfg(target_os = "windows")] + let is_first_instance = crate::zed::windows_only_instance::is_first_instance(); + #[cfg(target_os = "windows")] + if is_first_instance && auto_update::check_pending_installation() { + return; + } + if args.dump_all_actions { dump_all_gpui_actions(); return; From bcac748c2bc4aaa25bda987ce1c42e17f2c9a18d Mon Sep 17 00:00:00 2001 From: Anthony Eid <56899983+Anthony-Eid@users.noreply.github.com> Date: Tue, 8 Jul 2025 10:57:37 -0400 Subject: [PATCH 06/34] Add support for Nushell in shell builder (#33806) We also swap out env variables before sending them to shells now in the task system. This fixed issues Fish and Nushell had where an empty argument could be sent into a command when no argument should be sent. This only happened from task's generated by Zed. Closes #31297 #31240 Release Notes: - Fix bug where spawning a Zed generated task or debug session with Fish or Nushell failed --- crates/task/src/shell_builder.rs | 121 ++++++++++++++++++++++++++++++- crates/task/src/task_template.rs | 10 +-- 2 files changed, 123 insertions(+), 8 deletions(-) diff --git a/crates/task/src/shell_builder.rs b/crates/task/src/shell_builder.rs index 5446637139..b8c49d4230 100644 --- a/crates/task/src/shell_builder.rs +++ b/crates/task/src/shell_builder.rs @@ -5,6 +5,7 @@ enum ShellKind { #[default] Posix, Powershell, + Nushell, Cmd, } @@ -18,6 +19,8 @@ impl ShellKind { ShellKind::Powershell } else if program == "cmd" || program.ends_with("cmd.exe") { ShellKind::Cmd + } else if program == "nu" { + ShellKind::Nushell } else { // Someother shell detected, the user might install and use a // unix-like shell. @@ -30,6 +33,7 @@ impl ShellKind { Self::Powershell => Self::to_powershell_variable(input), Self::Cmd => Self::to_cmd_variable(input), Self::Posix => input.to_owned(), + Self::Nushell => Self::to_nushell_variable(input), } } @@ -70,11 +74,86 @@ impl ShellKind { } } + fn to_nushell_variable(input: &str) -> String { + let mut result = String::new(); + let mut source = input; + let mut is_start = true; + + loop { + match source.chars().next() { + None => return result, + Some('$') => { + source = Self::parse_nushell_var(&source[1..], &mut result, is_start); + is_start = false; + } + Some(_) => { + is_start = false; + let chunk_end = source.find('$').unwrap_or(source.len()); + let (chunk, rest) = source.split_at(chunk_end); + result.push_str(chunk); + source = rest; + } + } + } + } + + fn parse_nushell_var<'a>(source: &'a str, text: &mut String, is_start: bool) -> &'a str { + if source.starts_with("env.") { + text.push('$'); + return source; + } + + match source.chars().next() { + Some('{') => { + let source = &source[1..]; + if let Some(end) = source.find('}') { + let var_name = &source[..end]; + if !var_name.is_empty() { + if !is_start { + text.push_str("("); + } + text.push_str("$env."); + text.push_str(var_name); + if !is_start { + text.push_str(")"); + } + &source[end + 1..] + } else { + text.push_str("${}"); + &source[end + 1..] + } + } else { + text.push_str("${"); + source + } + } + Some(c) if c.is_alphabetic() || c == '_' => { + let end = source + .find(|c: char| !c.is_alphanumeric() && c != '_') + .unwrap_or(source.len()); + let var_name = &source[..end]; + if !is_start { + text.push_str("("); + } + text.push_str("$env."); + text.push_str(var_name); + if !is_start { + text.push_str(")"); + } + &source[end..] + } + _ => { + text.push('$'); + source + } + } + } + fn args_for_shell(&self, interactive: bool, combined_command: String) -> Vec { match self { ShellKind::Powershell => vec!["-C".to_owned(), combined_command], ShellKind::Cmd => vec!["/C".to_owned(), combined_command], - ShellKind::Posix => interactive + ShellKind::Posix | ShellKind::Nushell => interactive .then(|| "-i".to_owned()) .into_iter() .chain(["-c".to_owned(), combined_command]) @@ -142,9 +221,12 @@ impl ShellBuilder { ShellKind::Cmd => { format!("{} /C '{}'", self.program, command_label) } - ShellKind::Posix => { + ShellKind::Posix | ShellKind::Nushell => { let interactivity = self.interactive.then_some("-i ").unwrap_or_default(); - format!("{} {interactivity}-c '{}'", self.program, command_label) + format!( + "{} {interactivity}-c '$\"{}\"'", + self.program, command_label + ) } } } @@ -170,3 +252,36 @@ impl ShellBuilder { (self.program, self.args) } } + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_nu_shell_variable_substitution() { + let shell = Shell::Program("nu".to_owned()); + let shell_builder = ShellBuilder::new(true, &shell); + + let (program, args) = shell_builder.build( + Some("echo".into()), + &vec![ + "${hello}".to_string(), + "$world".to_string(), + "nothing".to_string(), + "--$something".to_string(), + "$".to_string(), + "${test".to_string(), + ], + ); + + assert_eq!(program, "nu"); + assert_eq!( + args, + vec![ + "-i", + "-c", + "echo $env.hello $env.world nothing --($env.something) $ ${test" + ] + ); + } +} diff --git a/crates/task/src/task_template.rs b/crates/task/src/task_template.rs index ae5054ac55..24e11d7715 100644 --- a/crates/task/src/task_template.rs +++ b/crates/task/src/task_template.rs @@ -256,7 +256,7 @@ impl TaskTemplate { }, ), command: Some(command), - args: self.args.clone(), + args: args_with_substitutions, env, use_new_terminal: self.use_new_terminal, allow_concurrent_runs: self.allow_concurrent_runs, @@ -642,11 +642,11 @@ mod tests { assert_eq!( spawn_in_terminal.args, &[ - "arg1 $ZED_SELECTED_TEXT", - "arg2 $ZED_COLUMN", - "arg3 $ZED_SYMBOL", + "arg1 test_selected_text", + "arg2 5678", + "arg3 010101010101010101010101010101010101010101010101010101010101", ], - "Args should not be substituted with variables" + "Args should be substituted with variables" ); assert_eq!( spawn_in_terminal.command_label, From 925464cfc6cb26f2576816f8f02bbf7044e9f41b Mon Sep 17 00:00:00 2001 From: Alisina Bahadori Date: Tue, 8 Jul 2025 11:05:01 -0400 Subject: [PATCH 07/34] Improve terminal rendering performance (#33345) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #18263 Improvements: • **Batch text rendering** - Combine adjacent cells with identical styling into single text runs to reduce draw calls • **Throttle hyperlink searches** - Limit hyperlink detection to every 100ms or when mouse moves >5px to reduce CPU usage • **Pre-allocate collections** - Use `Vec::with_capacity()` for cells, runs, and regions to minimize reallocations • **Optimize background regions** - Merge adjacent background rectangles to reduce number of draw operations • **Cache selection text** - Only compute terminal selection string when selection exists Release Notes: - Improved terminal rendering performance. --------- Co-authored-by: Conrad Irwin --- crates/editor/src/display_map.rs | 2 +- crates/editor/src/element.rs | 29 +- crates/gpui/examples/input.rs | 2 +- crates/gpui/src/text_system.rs | 10 +- crates/gpui/src/text_system/line_layout.rs | 42 +- crates/repl/src/outputs/plain.rs | 24 +- crates/repl/src/outputs/table.rs | 6 +- crates/terminal/src/terminal.rs | 63 +- crates/terminal_view/src/terminal_element.rs | 608 +++++++++++++++---- 9 files changed, 609 insertions(+), 177 deletions(-) diff --git a/crates/editor/src/display_map.rs b/crates/editor/src/display_map.rs index 3352d21ef8..aa2408d6d9 100644 --- a/crates/editor/src/display_map.rs +++ b/crates/editor/src/display_map.rs @@ -1066,7 +1066,7 @@ impl DisplaySnapshot { } let font_size = editor_style.text.font_size.to_pixels(*rem_size); - text_system.layout_line(&line, font_size, &runs) + text_system.layout_line(&line, font_size, &runs, None) } pub fn x_for_display_point( diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index d5c8eae99c..4c53d7f28a 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1611,6 +1611,7 @@ impl EditorElement { strikethrough: None, underline: None, }], + None, ) }) } else { @@ -3263,10 +3264,12 @@ impl EditorElement { underline: None, strikethrough: None, }; - let line = - window - .text_system() - .shape_line(line.to_string().into(), font_size, &[run]); + let line = window.text_system().shape_line( + line.to_string().into(), + font_size, + &[run], + None, + ); LineWithInvisibles { width: line.width, len: line.len, @@ -6888,6 +6891,7 @@ impl EditorElement { underline: None, strikethrough: None, }], + None, ); layout.width @@ -6916,6 +6920,7 @@ impl EditorElement { text, self.style.text.font_size.to_pixels(window.rem_size()), &[run], + None, ) } @@ -7184,10 +7189,12 @@ impl LineWithInvisibles { }]) { if let Some(replacement) = highlighted_chunk.replacement { if !line.is_empty() { - let shaped_line = - window - .text_system() - .shape_line(line.clone().into(), font_size, &styles); + let shaped_line = window.text_system().shape_line( + line.clone().into(), + font_size, + &styles, + None, + ); width += shaped_line.width; len += shaped_line.len; fragments.push(LineFragment::Text(shaped_line)); @@ -7207,6 +7214,7 @@ impl LineWithInvisibles { chunk, font_size, &[text_style.to_run(highlighted_chunk.text.len())], + None, ); AvailableSpace::Definite(shaped_line.width) } else { @@ -7251,7 +7259,7 @@ impl LineWithInvisibles { }; let line_layout = window .text_system() - .shape_line(x, font_size, &[run]) + .shape_line(x, font_size, &[run], None) .with_len(highlighted_chunk.text.len()); width += line_layout.width; @@ -7266,6 +7274,7 @@ impl LineWithInvisibles { line.clone().into(), font_size, &styles, + None, ); width += shaped_line.width; len += shaped_line.len; @@ -8831,6 +8840,7 @@ impl Element for EditorElement { underline: None, strikethrough: None, }], + None ); let space_invisible = window.text_system().shape_line( "•".into(), @@ -8843,6 +8853,7 @@ impl Element for EditorElement { underline: None, strikethrough: None, }], + None ); let mode = snapshot.mode.clone(); diff --git a/crates/gpui/examples/input.rs b/crates/gpui/examples/input.rs index 430d59acb8..52a5b08b96 100644 --- a/crates/gpui/examples/input.rs +++ b/crates/gpui/examples/input.rs @@ -487,7 +487,7 @@ impl Element for TextElement { let font_size = style.font_size.to_pixels(window.rem_size()); let line = window .text_system() - .shape_line(display_text, font_size, &runs); + .shape_line(display_text, font_size, &runs, None); let cursor_pos = line.x_for_index(cursor); let (selection, cursor) = if selected_range.is_empty() { diff --git a/crates/gpui/src/text_system.rs b/crates/gpui/src/text_system.rs index b2af9140c6..ed1307c6cd 100644 --- a/crates/gpui/src/text_system.rs +++ b/crates/gpui/src/text_system.rs @@ -357,6 +357,7 @@ impl WindowTextSystem { text: SharedString, font_size: Pixels, runs: &[TextRun], + force_width: Option, ) -> ShapedLine { debug_assert!( text.find('\n').is_none(), @@ -384,7 +385,7 @@ impl WindowTextSystem { }); } - let layout = self.layout_line(&text, font_size, runs); + let layout = self.layout_line(&text, font_size, runs, force_width); ShapedLine { layout, @@ -524,6 +525,7 @@ impl WindowTextSystem { text: Text, font_size: Pixels, runs: &[TextRun], + force_width: Option, ) -> Arc where Text: AsRef, @@ -544,9 +546,9 @@ impl WindowTextSystem { }); } - let layout = self - .line_layout_cache - .layout_line(text, font_size, &font_runs); + let layout = + self.line_layout_cache + .layout_line_internal(text, font_size, &font_runs, force_width); font_runs.clear(); self.font_runs_pool.lock().push(font_runs); diff --git a/crates/gpui/src/text_system/line_layout.rs b/crates/gpui/src/text_system/line_layout.rs index 5a72080e48..9c2dd7f087 100644 --- a/crates/gpui/src/text_system/line_layout.rs +++ b/crates/gpui/src/text_system/line_layout.rs @@ -482,6 +482,7 @@ impl LineLayoutCache { font_size, runs, wrap_width, + force_width: None, } as &dyn AsCacheKeyRef; let current_frame = self.current_frame.upgradable_read(); @@ -516,6 +517,7 @@ impl LineLayoutCache { font_size, runs: SmallVec::from(runs), wrap_width, + force_width: None, }); let mut current_frame = self.current_frame.write(); @@ -534,6 +536,20 @@ impl LineLayoutCache { font_size: Pixels, runs: &[FontRun], ) -> Arc + where + Text: AsRef, + SharedString: From, + { + self.layout_line_internal(text, font_size, runs, None) + } + + pub fn layout_line_internal( + &self, + text: Text, + font_size: Pixels, + runs: &[FontRun], + force_width: Option, + ) -> Arc where Text: AsRef, SharedString: From, @@ -543,6 +559,7 @@ impl LineLayoutCache { font_size, runs, wrap_width: None, + force_width, } as &dyn AsCacheKeyRef; let current_frame = self.current_frame.upgradable_read(); @@ -557,16 +574,30 @@ impl LineLayoutCache { layout } else { let text = SharedString::from(text); - let layout = Arc::new( - self.platform_text_system - .layout_line(&text, font_size, runs), - ); + let mut layout = self + .platform_text_system + .layout_line(&text, font_size, runs); + + if let Some(force_width) = force_width { + let mut glyph_pos = 0; + for run in layout.runs.iter_mut() { + for glyph in run.glyphs.iter_mut() { + if (glyph.position.x - glyph_pos * force_width).abs() > px(1.) { + glyph.position.x = glyph_pos * force_width; + } + glyph_pos += 1; + } + } + } + let key = Arc::new(CacheKey { text, font_size, runs: SmallVec::from(runs), wrap_width: None, + force_width, }); + let layout = Arc::new(layout); current_frame.lines.insert(key.clone(), layout.clone()); current_frame.used_lines.push(key); layout @@ -591,6 +622,7 @@ struct CacheKey { font_size: Pixels, runs: SmallVec<[FontRun; 1]>, wrap_width: Option, + force_width: Option, } #[derive(Copy, Clone, PartialEq, Eq, Hash)] @@ -599,6 +631,7 @@ struct CacheKeyRef<'a> { font_size: Pixels, runs: &'a [FontRun], wrap_width: Option, + force_width: Option, } impl PartialEq for (dyn AsCacheKeyRef + '_) { @@ -622,6 +655,7 @@ impl AsCacheKeyRef for CacheKey { font_size: self.font_size, runs: self.runs.as_slice(), wrap_width: self.wrap_width, + force_width: self.force_width, } } } diff --git a/crates/repl/src/outputs/plain.rs b/crates/repl/src/outputs/plain.rs index 515bc654f0..74c7bfa3c3 100644 --- a/crates/repl/src/outputs/plain.rs +++ b/crates/repl/src/outputs/plain.rs @@ -259,20 +259,17 @@ impl Render for TerminalOutput { cell: ic.cell.clone(), }); let minimum_contrast = TerminalSettings::get_global(cx).minimum_contrast; - let (cells, rects) = TerminalElement::layout_grid( - grid, - 0, - &text_style, - text_system, - None, - minimum_contrast, - window, - cx, - ); + let (rects, batched_text_runs) = + TerminalElement::layout_grid(grid, 0, &text_style, None, minimum_contrast, cx); // lines are 0-indexed, so we must add 1 to get the number of lines let text_line_height = text_style.line_height_in_pixels(window.rem_size()); - let num_lines = cells.iter().map(|c| c.point.line).max().unwrap_or(0) + 1; + let num_lines = batched_text_runs + .iter() + .map(|b| b.start_point.line) + .max() + .unwrap_or(0) + + 1; let height = num_lines as f32 * text_line_height; let font_pixels = text_style.font_size.to_pixels(window.rem_size()); @@ -300,15 +297,14 @@ impl Render for TerminalOutput { ); } - for cell in cells { - cell.paint( + for batch in batched_text_runs { + batch.paint( bounds.origin, &terminal::TerminalBounds { cell_width, line_height: text_line_height, bounds, }, - bounds, window, cx, ); diff --git a/crates/repl/src/outputs/table.rs b/crates/repl/src/outputs/table.rs index 0606b421aa..c94e8c26a9 100644 --- a/crates/repl/src/outputs/table.rs +++ b/crates/repl/src/outputs/table.rs @@ -106,7 +106,9 @@ impl TableView { for field in table.schema.fields.iter() { runs[0].len = field.name.len(); - let mut width = text_system.layout_line(&field.name, font_size, &runs).width; + let mut width = text_system + .layout_line(&field.name, font_size, &runs, None) + .width; let Some(data) = table.data.as_ref() else { widths.push(width); @@ -118,7 +120,7 @@ impl TableView { runs[0].len = content.len(); let cell_width = window .text_system() - .layout_line(&content, font_size, &runs) + .layout_line(&content, font_size, &runs, None) .width; width = width.max(cell_width) diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index a096ef8901..8172b56485 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -58,7 +58,7 @@ use std::{ path::PathBuf, process::ExitStatus, sync::Arc, - time::Duration, + time::{Duration, Instant}, }; use thiserror::Error; @@ -501,6 +501,8 @@ impl TerminalBuilder { vi_mode_enabled: false, is_ssh_terminal, python_venv_directory, + last_mouse_move_time: Instant::now(), + last_hyperlink_search_position: None, }; Ok(TerminalBuilder { @@ -659,6 +661,8 @@ pub struct Terminal { task: Option, vi_mode_enabled: bool, is_ssh_terminal: bool, + last_mouse_move_time: Instant, + last_hyperlink_search_position: Option>, } pub struct TaskState { @@ -1307,24 +1311,27 @@ impl Terminal { fn make_content(term: &Term, last_content: &TerminalContent) -> TerminalContent { let content = term.renderable_content(); + + // Pre-allocate with estimated size to reduce reallocations + let estimated_size = content.display_iter.size_hint().0; + let mut cells = Vec::with_capacity(estimated_size); + + cells.extend(content.display_iter.map(|ic| IndexedCell { + point: ic.point, + cell: ic.cell.clone(), + })); + + let selection_text = if content.selection.is_some() { + term.selection_to_string() + } else { + None + }; + TerminalContent { - cells: content - .display_iter - //TODO: Add this once there's a way to retain empty lines - // .filter(|ic| { - // !ic.flags.contains(Flags::HIDDEN) - // && !(ic.bg == Named(NamedColor::Background) - // && ic.c == ' ' - // && !ic.flags.contains(Flags::INVERSE)) - // }) - .map(|ic| IndexedCell { - point: ic.point, - cell: ic.cell.clone(), - }) - .collect::>(), + cells, mode: content.mode, display_offset: content.display_offset, - selection_text: term.selection_to_string(), + selection_text, selection: content.selection, cursor: content.cursor, cursor_char: term.grid()[content.cursor.point].c, @@ -1457,10 +1464,26 @@ impl Terminal { if self.selection_phase == SelectionPhase::Selecting { self.last_content.last_hovered_word = None; } else if self.last_content.terminal_bounds.bounds.contains(&position) { - self.events.push_back(InternalEvent::FindHyperlink( - position - self.last_content.terminal_bounds.bounds.origin, - false, - )); + // Throttle hyperlink searches to avoid excessive processing + let now = Instant::now(); + let should_search = if let Some(last_pos) = self.last_hyperlink_search_position { + // Only search if mouse moved significantly or enough time passed + let distance_moved = + ((position.x - last_pos.x).abs() + (position.y - last_pos.y).abs()) > px(5.0); + let time_elapsed = now.duration_since(self.last_mouse_move_time).as_millis() > 100; + distance_moved || time_elapsed + } else { + true + }; + + if should_search { + self.last_mouse_move_time = now; + self.last_hyperlink_search_position = Some(position); + self.events.push_back(InternalEvent::FindHyperlink( + position - self.last_content.terminal_bounds.bounds.origin, + false, + )); + } } else { self.last_content.last_hovered_word = None; } diff --git a/crates/terminal_view/src/terminal_element.rs b/crates/terminal_view/src/terminal_element.rs index f34dc8f009..c34d892644 100644 --- a/crates/terminal_view/src/terminal_element.rs +++ b/crates/terminal_view/src/terminal_element.rs @@ -1,17 +1,18 @@ use crate::color_contrast; use editor::{CursorLayout, HighlightedRange, HighlightedRangeLine}; use gpui::{ - AnyElement, App, AvailableSpace, Bounds, ContentMask, Context, DispatchPhase, Element, - ElementId, Entity, FocusHandle, Font, FontStyle, FontWeight, GlobalElementId, HighlightStyle, - Hitbox, Hsla, InputHandler, InteractiveElement, Interactivity, IntoElement, LayoutId, Length, - ModifiersChangedEvent, MouseButton, MouseMoveEvent, Pixels, Point, ShapedLine, - StatefulInteractiveElement, StrikethroughStyle, Styled, TextRun, TextStyle, UTF16Selection, - UnderlineStyle, WeakEntity, WhiteSpace, Window, WindowTextSystem, div, fill, point, px, - relative, size, + AbsoluteLength, AnyElement, App, AvailableSpace, Bounds, ContentMask, Context, DispatchPhase, + Element, ElementId, Entity, FocusHandle, Font, FontFeatures, FontStyle, FontWeight, + GlobalElementId, HighlightStyle, Hitbox, Hsla, InputHandler, InteractiveElement, Interactivity, + IntoElement, LayoutId, Length, ModifiersChangedEvent, MouseButton, MouseMoveEvent, Pixels, + Point, ShapedLine, StatefulInteractiveElement, StrikethroughStyle, Styled, TextRun, TextStyle, + UTF16Selection, UnderlineStyle, WeakEntity, WhiteSpace, Window, div, fill, point, px, relative, + size, }; use itertools::Itertools; use language::CursorShape; use settings::Settings; +use std::time::Instant; use terminal::{ IndexedCell, Terminal, TerminalBounds, TerminalContent, alacritty_terminal::{ @@ -38,7 +39,7 @@ use crate::{BlockContext, BlockProperties, ContentMode, TerminalMode, TerminalVi /// The information generated during layout that is necessary for painting. pub struct LayoutState { hitbox: Hitbox, - cells: Vec, + batched_text_runs: Vec, rects: Vec, relative_highlighted_ranges: Vec<(RangeInclusive, Hsla)>, cursor: Option, @@ -76,37 +77,69 @@ impl DisplayCursor { } } -#[derive(Debug, Default)] -pub struct LayoutCell { - pub point: AlacPoint, - text: gpui::ShapedLine, +/// A batched text run that combines multiple adjacent cells with the same style +#[derive(Debug)] +pub struct BatchedTextRun { + pub start_point: AlacPoint, + pub text: String, + pub cell_count: usize, + pub style: TextRun, + pub font_size: AbsoluteLength, } -impl LayoutCell { - fn new(point: AlacPoint, text: gpui::ShapedLine) -> LayoutCell { - LayoutCell { point, text } +impl BatchedTextRun { + fn new_from_char( + start_point: AlacPoint, + c: char, + style: TextRun, + font_size: AbsoluteLength, + ) -> Self { + let mut text = String::with_capacity(100); // Pre-allocate for typical line length + text.push(c); + BatchedTextRun { + start_point, + text, + cell_count: 1, + style, + font_size, + } + } + + fn can_append(&self, other_style: &TextRun) -> bool { + self.style.font == other_style.font + && self.style.color == other_style.color + && self.style.background_color == other_style.background_color + && self.style.underline == other_style.underline + && self.style.strikethrough == other_style.strikethrough + } + + fn append_char(&mut self, c: char) { + self.text.push(c); + self.cell_count += 1; + self.style.len += c.len_utf8(); } pub fn paint( &self, origin: Point, dimensions: &TerminalBounds, - _visible_bounds: Bounds, window: &mut Window, cx: &mut App, ) { - let pos = { - let point = self.point; + let pos = Point::new( + (origin.x + self.start_point.column as f32 * dimensions.cell_width).floor(), + origin.y + self.start_point.line as f32 * dimensions.line_height, + ); - Point::new( - (origin.x + point.column as f32 * dimensions.cell_width).floor(), - origin.y + point.line as f32 * dimensions.line_height, + let _ = window + .text_system() + .shape_line( + self.text.clone().into(), + self.font_size.to_pixels(window.rem_size()), + &[self.style.clone()], + Some(dimensions.cell_width), ) - }; - - self.text - .paint(pos, dimensions.line_height, window, cx) - .ok(); + .paint(pos, dimensions.line_height, window, cx); } } @@ -126,14 +159,6 @@ impl LayoutRect { } } - fn extend(&self) -> Self { - LayoutRect { - point: self.point, - num_of_cells: self.num_of_cells + 1, - color: self.color, - } - } - pub fn paint(&self, origin: Point, dimensions: &TerminalBounds, window: &mut Window) { let position = { let alac_point = self.point; @@ -152,6 +177,87 @@ impl LayoutRect { } } +/// Represents a rectangular region with a specific background color +#[derive(Debug, Clone)] +struct BackgroundRegion { + start_line: i32, + start_col: i32, + end_line: i32, + end_col: i32, + color: Hsla, +} + +impl BackgroundRegion { + fn new(line: i32, col: i32, color: Hsla) -> Self { + BackgroundRegion { + start_line: line, + start_col: col, + end_line: line, + end_col: col, + color, + } + } + + /// Check if this region can be merged with another region + fn can_merge_with(&self, other: &BackgroundRegion) -> bool { + if self.color != other.color { + return false; + } + + // Check if regions are adjacent horizontally + if self.start_line == other.start_line && self.end_line == other.end_line { + return self.end_col + 1 == other.start_col || other.end_col + 1 == self.start_col; + } + + // Check if regions are adjacent vertically with same column span + if self.start_col == other.start_col && self.end_col == other.end_col { + return self.end_line + 1 == other.start_line || other.end_line + 1 == self.start_line; + } + + false + } + + /// Merge this region with another region + fn merge_with(&mut self, other: &BackgroundRegion) { + self.start_line = self.start_line.min(other.start_line); + self.start_col = self.start_col.min(other.start_col); + self.end_line = self.end_line.max(other.end_line); + self.end_col = self.end_col.max(other.end_col); + } +} + +/// Merge background regions to minimize the number of rectangles +fn merge_background_regions(regions: Vec) -> Vec { + if regions.is_empty() { + return regions; + } + + let mut merged = regions; + let mut changed = true; + + // Keep merging until no more merges are possible + while changed { + changed = false; + let mut i = 0; + + while i < merged.len() { + let mut j = i + 1; + while j < merged.len() { + if merged[i].can_merge_with(&merged[j]) { + let other = merged.remove(j); + merged[i].merge_with(&other); + changed = true; + } else { + j += 1; + } + } + i += 1; + } + } + + merged +} + /// The GPUI element that paints the terminal. /// We need to keep a reference to the model for mouse events, do we need it for any other terminal stuff, or can we move that to connection? pub struct TerminalElement { @@ -205,23 +311,37 @@ impl TerminalElement { grid: impl Iterator, start_line_offset: i32, text_style: &TextStyle, - text_system: &WindowTextSystem, hyperlink: Option<(HighlightStyle, &RangeInclusive)>, minimum_contrast: f32, - window: &Window, cx: &App, - ) -> (Vec, Vec) { + ) -> (Vec, Vec) { + let start_time = Instant::now(); let theme = cx.theme(); - let mut cells = vec![]; - let mut rects = vec![]; - let mut cur_rect: Option = None; - let mut cur_alac_color = None; + // Pre-allocate with estimated capacity to reduce reallocations + let estimated_cells = grid.size_hint().0; + let estimated_runs = estimated_cells / 10; // Estimate ~10 cells per run + let estimated_regions = estimated_cells / 20; // Estimate ~20 cells per background region + let mut batched_runs = Vec::with_capacity(estimated_runs); + let mut cell_count = 0; + + // Collect background regions for efficient merging + let mut background_regions: Vec = Vec::with_capacity(estimated_regions); + let mut current_batch: Option = None; + + // First pass: collect all cells and their backgrounds let linegroups = grid.into_iter().chunk_by(|i| i.point.line); for (line_index, (_, line)) in linegroups.into_iter().enumerate() { let alac_line = start_line_offset + line_index as i32; + // Flush any existing batch at line boundaries + if let Some(batch) = current_batch.take() { + batched_runs.push(batch); + } + + let mut previous_cell_had_extras = false; + for cell in line { let mut fg = cell.fg; let mut bg = cell.bg; @@ -229,63 +349,43 @@ impl TerminalElement { mem::swap(&mut fg, &mut bg); } - //Expand background rect range - { - if matches!(bg, Named(NamedColor::Background)) { - //Continue to next cell, resetting variables if necessary - cur_alac_color = None; - if let Some(rect) = cur_rect { - rects.push(rect); - cur_rect = None + // Collect background regions (skip default background) + if !matches!(bg, Named(NamedColor::Background)) { + let color = convert_color(&bg, theme); + let col = cell.point.column.0 as i32; + + // Try to extend the last region if it's on the same line with the same color + if let Some(last_region) = background_regions.last_mut() { + if last_region.color == color + && last_region.start_line == alac_line + && last_region.end_line == alac_line + && last_region.end_col + 1 == col + { + last_region.end_col = col; + } else { + background_regions.push(BackgroundRegion::new(alac_line, col, color)); } } else { - match cur_alac_color { - Some(cur_color) => { - if bg == cur_color { - // `cur_rect` can be None if it was moved to the `rects` vec after wrapping around - // from one line to the next. The variables are all set correctly but there is no current - // rect, so we create one if necessary. - cur_rect = cur_rect.map_or_else( - || { - Some(LayoutRect::new( - AlacPoint::new( - alac_line, - cell.point.column.0 as i32, - ), - 1, - convert_color(&bg, theme), - )) - }, - |rect| Some(rect.extend()), - ); - } else { - cur_alac_color = Some(bg); - if cur_rect.is_some() { - rects.push(cur_rect.take().unwrap()); - } - cur_rect = Some(LayoutRect::new( - AlacPoint::new(alac_line, cell.point.column.0 as i32), - 1, - convert_color(&bg, theme), - )); - } - } - None => { - cur_alac_color = Some(bg); - cur_rect = Some(LayoutRect::new( - AlacPoint::new(alac_line, cell.point.column.0 as i32), - 1, - convert_color(&bg, theme), - )); - } - } + background_regions.push(BackgroundRegion::new(alac_line, col, color)); } } + // Skip wide character spacers - they're just placeholders for the second cell of wide characters + if cell.flags.contains(Flags::WIDE_CHAR_SPACER) { + continue; + } + + // Skip spaces that follow cells with extras (emoji variation sequences) + if cell.c == ' ' && previous_cell_had_extras { + previous_cell_had_extras = false; + continue; + } + // Update tracking for next iteration + previous_cell_had_extras = cell.extra.is_some(); //Layout current cell text { if !is_blank(&cell) { - let cell_text = cell.c.to_string(); + cell_count += 1; let cell_style = TerminalElement::cell_style( &cell, fg, @@ -296,25 +396,74 @@ impl TerminalElement { minimum_contrast, ); - let layout_cell = text_system.shape_line( - cell_text.into(), - text_style.font_size.to_pixels(window.rem_size()), - &[cell_style], - ); + let cell_point = AlacPoint::new(alac_line, cell.point.column.0 as i32); - cells.push(LayoutCell::new( - AlacPoint::new(alac_line, cell.point.column.0 as i32), - layout_cell, - )) + // Try to batch with existing run + if let Some(ref mut batch) = current_batch { + if batch.can_append(&cell_style) + && batch.start_point.line == cell_point.line + && batch.start_point.column + batch.cell_count as i32 + == cell_point.column + { + batch.append_char(cell.c); + } else { + // Flush current batch and start new one + let old_batch = current_batch.take().unwrap(); + batched_runs.push(old_batch); + current_batch = Some(BatchedTextRun::new_from_char( + cell_point, + cell.c, + cell_style, + text_style.font_size, + )); + } + } else { + // Start new batch + current_batch = Some(BatchedTextRun::new_from_char( + cell_point, + cell.c, + cell_style, + text_style.font_size, + )); + } }; } } + } - if cur_rect.is_some() { - rects.push(cur_rect.take().unwrap()); + // Flush any remaining batch + if let Some(batch) = current_batch { + batched_runs.push(batch); + } + + // Second pass: merge background regions and convert to layout rects + let region_count = background_regions.len(); + let merged_regions = merge_background_regions(background_regions); + let mut rects = Vec::with_capacity(merged_regions.len() * 2); // Estimate 2 rects per merged region + + // Convert merged regions to layout rects + // Since LayoutRect only supports single-line rectangles, we need to split multi-line regions + for region in merged_regions { + for line in region.start_line..=region.end_line { + rects.push(LayoutRect::new( + AlacPoint::new(line, region.start_col), + (region.end_col - region.start_col + 1) as usize, + region.color, + )); } } - (cells, rects) + + let layout_time = start_time.elapsed(); + log::debug!( + "Terminal layout_grid: {} cells processed, {} batched runs created, {} rects (from {} merged regions), layout took {:?}", + cell_count, + batched_runs.len(), + rects.len(), + region_count, + layout_time + ); + + (rects, batched_runs) } /// Computes the cursor position and expected block width, may return a zero width if x_for_index returns @@ -708,7 +857,7 @@ impl Element for TerminalElement { let font_features = terminal_settings .font_features .as_ref() - .unwrap_or(&settings.buffer_font.features) + .unwrap_or(&FontFeatures::disable_ligatures()) .clone(); let font_weight = terminal_settings.font_weight.unwrap_or_default(); @@ -857,19 +1006,22 @@ impl Element for TerminalElement { // then have that representation be converted to the appropriate highlight data structure let content_mode = self.terminal_view.read(cx).content_mode(window, cx); - let (cells, rects) = match content_mode { - ContentMode::Scrollable => TerminalElement::layout_grid( - cells.iter().cloned(), - 0, - &text_style, - window.text_system(), - last_hovered_word - .as_ref() - .map(|last_hovered_word| (link_style, &last_hovered_word.word_match)), - minimum_contrast, - window, - cx, - ), + let (rects, batched_text_runs) = match content_mode { + ContentMode::Scrollable => { + // In scrollable mode, the terminal already provides cells + // that are correctly positioned for the current viewport + // based on its display_offset. We don't need additional filtering. + TerminalElement::layout_grid( + cells.iter().cloned(), + 0, + &text_style, + last_hovered_word.as_ref().map(|last_hovered_word| { + (link_style, &last_hovered_word.word_match) + }), + minimum_contrast, + cx, + ) + } ContentMode::Inline { .. } => { let intersection = window.content_mask().bounds.intersect(&bounds); let start_row = (intersection.top() - bounds.top()) / line_height_px; @@ -884,12 +1036,10 @@ impl Element for TerminalElement { .cloned(), *line_range.start(), &text_style, - window.text_system(), last_hovered_word.as_ref().map(|last_hovered_word| { (link_style, &last_hovered_word.word_match) }), minimum_contrast, - window, cx, ) } @@ -915,6 +1065,7 @@ impl Element for TerminalElement { underline: Default::default(), strikethrough: None, }], + None, ) }; @@ -977,7 +1128,7 @@ impl Element for TerminalElement { LayoutState { hitbox, - cells, + batched_text_runs, cursor, background_color, dimensions, @@ -1005,6 +1156,7 @@ impl Element for TerminalElement { window: &mut Window, cx: &mut App, ) { + let paint_start = Instant::now(); window.with_content_mask(Some(ContentMask { bounds }), |window| { let scroll_top = self.terminal_view.read(cx).scroll_top; @@ -1089,9 +1241,12 @@ impl Element for TerminalElement { } } - for cell in &layout.cells { - cell.paint(origin, &layout.dimensions, bounds, window, cx); + // Paint batched text runs instead of individual cells + let text_paint_start = Instant::now(); + for batch in &layout.batched_text_runs { + batch.paint(origin, &layout.dimensions, window, cx); } + let text_paint_time = text_paint_start.elapsed(); if let Some(text_to_mark) = &marked_text_cloned { if !text_to_mark.is_empty() { @@ -1115,6 +1270,7 @@ impl Element for TerminalElement { underline: ime_style.underline, strikethrough: None, }], + None ); shaped_line .paint(ime_position, layout.dimensions.line_height, window, cx) @@ -1136,6 +1292,14 @@ impl Element for TerminalElement { if let Some(mut element) = hyperlink_tooltip { element.paint(window, cx); } + let total_paint_time = paint_start.elapsed(); + log::debug!( + "Terminal paint: {} text runs, {} rects, text paint took {:?}, total paint took {:?}", + layout.batched_text_runs.len(), + layout.rects.len(), + text_paint_time, + total_paint_time + ); }, ); }); @@ -1290,7 +1454,7 @@ pub fn is_blank(cell: &IndexedCell) -> bool { return false; } - true + return true; } fn to_highlighted_range_lines( @@ -1409,6 +1573,7 @@ pub fn convert_color(fg: &terminal::alacritty_terminal::vte::ansi::Color, theme: #[cfg(test)] mod tests { use super::*; + use gpui::{AbsoluteLength, Hsla, font}; #[test] fn test_contrast_adjustment_logic() { @@ -1523,4 +1688,203 @@ mod tests { new_contrast ); } + + #[test] + fn test_batched_text_run_can_append() { + let style1 = TextRun { + len: 1, + font: font("Helvetica"), + color: Hsla::red(), + background_color: None, + underline: None, + strikethrough: None, + }; + + let style2 = TextRun { + len: 1, + font: font("Helvetica"), + color: Hsla::red(), + background_color: None, + underline: None, + strikethrough: None, + }; + + let style3 = TextRun { + len: 1, + font: font("Helvetica"), + color: Hsla::blue(), // Different color + background_color: None, + underline: None, + strikethrough: None, + }; + + let font_size = AbsoluteLength::Pixels(px(12.0)); + let batch = + BatchedTextRun::new_from_char(AlacPoint::new(0, 0), 'a', style1.clone(), font_size); + + // Should be able to append same style + assert!(batch.can_append(&style2)); + + // Should not be able to append different style + assert!(!batch.can_append(&style3)); + } + + #[test] + fn test_batched_text_run_append() { + let style = TextRun { + len: 1, + font: font("Helvetica"), + color: Hsla::red(), + background_color: None, + underline: None, + strikethrough: None, + }; + + let font_size = AbsoluteLength::Pixels(px(12.0)); + let mut batch = BatchedTextRun::new_from_char(AlacPoint::new(0, 0), 'a', style, font_size); + + assert_eq!(batch.text, "a"); + assert_eq!(batch.cell_count, 1); + assert_eq!(batch.style.len, 1); + + batch.append_char('b'); + + assert_eq!(batch.text, "ab"); + assert_eq!(batch.cell_count, 2); + assert_eq!(batch.style.len, 2); + + batch.append_char('c'); + + assert_eq!(batch.text, "abc"); + assert_eq!(batch.cell_count, 3); + assert_eq!(batch.style.len, 3); + } + + #[test] + fn test_batched_text_run_append_char() { + let style = TextRun { + len: 1, + font: font("Helvetica"), + color: Hsla::red(), + background_color: None, + underline: None, + strikethrough: None, + }; + + let font_size = AbsoluteLength::Pixels(px(12.0)); + let mut batch = BatchedTextRun::new_from_char(AlacPoint::new(0, 0), 'x', style, font_size); + + assert_eq!(batch.text, "x"); + assert_eq!(batch.cell_count, 1); + assert_eq!(batch.style.len, 1); + + batch.append_char('y'); + + assert_eq!(batch.text, "xy"); + assert_eq!(batch.cell_count, 2); + assert_eq!(batch.style.len, 2); + + // Test with multi-byte character + batch.append_char('😀'); + + assert_eq!(batch.text, "xy😀"); + assert_eq!(batch.cell_count, 3); + assert_eq!(batch.style.len, 6); // 1 + 1 + 4 bytes for emoji + } + + #[test] + fn test_background_region_can_merge() { + let color1 = Hsla::red(); + let color2 = Hsla::blue(); + + // Test horizontal merging + let mut region1 = BackgroundRegion::new(0, 0, color1); + region1.end_col = 5; + let region2 = BackgroundRegion::new(0, 6, color1); + assert!(region1.can_merge_with(®ion2)); + + // Test vertical merging with same column span + let mut region3 = BackgroundRegion::new(0, 0, color1); + region3.end_col = 5; + let mut region4 = BackgroundRegion::new(1, 0, color1); + region4.end_col = 5; + assert!(region3.can_merge_with(®ion4)); + + // Test cannot merge different colors + let region5 = BackgroundRegion::new(0, 0, color1); + let region6 = BackgroundRegion::new(0, 1, color2); + assert!(!region5.can_merge_with(®ion6)); + + // Test cannot merge non-adjacent regions + let region7 = BackgroundRegion::new(0, 0, color1); + let region8 = BackgroundRegion::new(0, 2, color1); + assert!(!region7.can_merge_with(®ion8)); + + // Test cannot merge vertical regions with different column spans + let mut region9 = BackgroundRegion::new(0, 0, color1); + region9.end_col = 5; + let mut region10 = BackgroundRegion::new(1, 0, color1); + region10.end_col = 6; + assert!(!region9.can_merge_with(®ion10)); + } + + #[test] + fn test_background_region_merge() { + let color = Hsla::red(); + + // Test horizontal merge + let mut region1 = BackgroundRegion::new(0, 0, color); + region1.end_col = 5; + let mut region2 = BackgroundRegion::new(0, 6, color); + region2.end_col = 10; + region1.merge_with(®ion2); + assert_eq!(region1.start_col, 0); + assert_eq!(region1.end_col, 10); + assert_eq!(region1.start_line, 0); + assert_eq!(region1.end_line, 0); + + // Test vertical merge + let mut region3 = BackgroundRegion::new(0, 0, color); + region3.end_col = 5; + let mut region4 = BackgroundRegion::new(1, 0, color); + region4.end_col = 5; + region3.merge_with(®ion4); + assert_eq!(region3.start_col, 0); + assert_eq!(region3.end_col, 5); + assert_eq!(region3.start_line, 0); + assert_eq!(region3.end_line, 1); + } + + #[test] + fn test_merge_background_regions() { + let color = Hsla::red(); + + // Test merging multiple adjacent regions + let regions = vec![ + BackgroundRegion::new(0, 0, color), + BackgroundRegion::new(0, 1, color), + BackgroundRegion::new(0, 2, color), + BackgroundRegion::new(1, 0, color), + BackgroundRegion::new(1, 1, color), + BackgroundRegion::new(1, 2, color), + ]; + + let merged = merge_background_regions(regions); + assert_eq!(merged.len(), 1); + assert_eq!(merged[0].start_line, 0); + assert_eq!(merged[0].end_line, 1); + assert_eq!(merged[0].start_col, 0); + assert_eq!(merged[0].end_col, 2); + + // Test with non-mergeable regions + let color2 = Hsla::blue(); + let regions2 = vec![ + BackgroundRegion::new(0, 0, color), + BackgroundRegion::new(0, 2, color), // Gap at column 1 + BackgroundRegion::new(1, 0, color2), // Different color + ]; + + let merged2 = merge_background_regions(regions2); + assert_eq!(merged2.len(), 3); + } } From 263080c4c4b8de4ea902b0180cc21c8968d61713 Mon Sep 17 00:00:00 2001 From: Gwen Lg <105106246+gwen-lg@users.noreply.github.com> Date: Tue, 8 Jul 2025 18:31:20 +0200 Subject: [PATCH 08/34] Allow local build of remote_server dev to be deployed to different linux than local (#33395) setup local build of `remote_server` to not depend of the local linux libraries by : - enable `vendored-libgit2` feature of git2 - setup target triple to `unknown-linux-musl` (mirror bundle-linux script) - add flag ` -C target-feature=+crt-static` in `RUSTFLAGS` env var (mirror bundle-linux script) Bonus: Add an option to setup mold as linker of local build. Closes #33341 Release Notes: - N/A --- Cargo.lock | 1 + crates/remote/src/ssh_session.rs | 275 ++++++++++++++++--------------- crates/remote_server/Cargo.toml | 5 +- 3 files changed, 146 insertions(+), 135 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 302c1cc6ea..ce6bdffefb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13213,6 +13213,7 @@ dependencies = [ "fs", "futures 0.3.31", "git", + "git2", "git_hosting_providers", "gpui", "gpui_tokio", diff --git a/crates/remote/src/ssh_session.rs b/crates/remote/src/ssh_session.rs index 2653a19bd9..ff51cfda71 100644 --- a/crates/remote/src/ssh_session.rs +++ b/crates/remote/src/ssh_session.rs @@ -314,20 +314,6 @@ pub struct SshPlatform { pub arch: &'static str, } -impl SshPlatform { - pub fn triple(&self) -> Option { - Some(format!( - "{}-{}", - self.arch, - match self.os { - "linux" => "unknown-linux-gnu", - "macos" => "apple-darwin", - _ => return None, - } - )) - } -} - pub trait SshClientDelegate: Send + Sync { fn ask_password(&self, prompt: String, tx: oneshot::Sender, cx: &mut AsyncApp); fn get_download_params( @@ -2068,6 +2054,7 @@ impl SshRemoteConnection { cx: &mut AsyncApp, ) -> Result { use smol::process::{Command, Stdio}; + use std::env::VarError; async fn run_cmd(command: &mut Command) -> Result<()> { let output = command @@ -2082,70 +2069,37 @@ impl SshRemoteConnection { Ok(()) } + let triple = format!( + "{}-{}", + self.ssh_platform.arch, + match self.ssh_platform.os { + "linux" => "unknown-linux-musl", + "macos" => "apple-darwin", + _ => anyhow::bail!("can't cross compile for: {:?}", self.ssh_platform), + } + ); + let mut rust_flags = match std::env::var("RUSTFLAGS") { + Ok(val) => val, + Err(VarError::NotPresent) => String::new(), + Err(e) => { + log::error!("Failed to get env var `RUSTFLAGS` value: {e}"); + String::new() + } + }; + if self.ssh_platform.os == "linux" { + rust_flags.push_str(" -C target-feature=+crt-static"); + } + if build_remote_server.contains("mold") { + rust_flags.push_str(" -C link-arg=-fuse-ld=mold"); + } + if self.ssh_platform.arch == std::env::consts::ARCH && self.ssh_platform.os == std::env::consts::OS { delegate.set_status(Some("Building remote server binary from source"), cx); log::info!("building remote server binary from source"); - run_cmd(Command::new("cargo").args([ - "build", - "--package", - "remote_server", - "--features", - "debug-embed", - "--target-dir", - "target/remote_server", - ])) - .await?; - - delegate.set_status(Some("Compressing binary"), cx); - - run_cmd(Command::new("gzip").args([ - "-9", - "-f", - "target/remote_server/debug/remote_server", - ])) - .await?; - - let path = std::env::current_dir()?.join("target/remote_server/debug/remote_server.gz"); - return Ok(path); - } - let Some(triple) = self.ssh_platform.triple() else { - anyhow::bail!("can't cross compile for: {:?}", self.ssh_platform); - }; - smol::fs::create_dir_all("target/remote_server").await?; - - if build_remote_server.contains("cross") { - #[cfg(target_os = "windows")] - use util::paths::SanitizedPath; - - delegate.set_status(Some("Installing cross.rs for cross-compilation"), cx); - log::info!("installing cross"); - run_cmd(Command::new("cargo").args([ - "install", - "cross", - "--git", - "https://github.com/cross-rs/cross", - ])) - .await?; - - delegate.set_status( - Some(&format!( - "Building remote server binary from source for {} with Docker", - &triple - )), - cx, - ); - log::info!("building remote server binary from source for {}", &triple); - - // On Windows, the binding needs to be set to the canonical path - #[cfg(target_os = "windows")] - let src = - SanitizedPath::from(smol::fs::canonicalize("./target").await?).to_glob_string(); - #[cfg(not(target_os = "windows"))] - let src = "./target"; run_cmd( - Command::new("cross") + Command::new("cargo") .args([ "build", "--package", @@ -2157,73 +2111,126 @@ impl SshRemoteConnection { "--target", &triple, ]) - .env( - "CROSS_CONTAINER_OPTS", - format!("--mount type=bind,src={src},dst=/app/target"), - ), + .env("RUSTFLAGS", &rust_flags), ) .await?; } else { - let which = cx - .background_spawn(async move { which::which("zig") }) - .await; - - if which.is_err() { - #[cfg(not(target_os = "windows"))] - { - anyhow::bail!( - "zig not found on $PATH, install zig (see https://ziglang.org/learn/getting-started or use zigup) or pass ZED_BUILD_REMOTE_SERVER=cross to use cross" - ) - } + if build_remote_server.contains("cross") { #[cfg(target_os = "windows")] - { - anyhow::bail!( - "zig not found on $PATH, install zig (use `winget install -e --id zig.zig` or see https://ziglang.org/learn/getting-started or use zigup) or pass ZED_BUILD_REMOTE_SERVER=cross to use cross" - ) + use util::paths::SanitizedPath; + + delegate.set_status(Some("Installing cross.rs for cross-compilation"), cx); + log::info!("installing cross"); + run_cmd(Command::new("cargo").args([ + "install", + "cross", + "--git", + "https://github.com/cross-rs/cross", + ])) + .await?; + + delegate.set_status( + Some(&format!( + "Building remote server binary from source for {} with Docker", + &triple + )), + cx, + ); + log::info!("building remote server binary from source for {}", &triple); + + // On Windows, the binding needs to be set to the canonical path + #[cfg(target_os = "windows")] + let src = + SanitizedPath::from(smol::fs::canonicalize("./target").await?).to_glob_string(); + #[cfg(not(target_os = "windows"))] + let src = "./target"; + run_cmd( + Command::new("cross") + .args([ + "build", + "--package", + "remote_server", + "--features", + "debug-embed", + "--target-dir", + "target/remote_server", + "--target", + &triple, + ]) + .env( + "CROSS_CONTAINER_OPTS", + format!("--mount type=bind,src={src},dst=/app/target"), + ) + .env("RUSTFLAGS", &rust_flags), + ) + .await?; + } else { + let which = cx + .background_spawn(async move { which::which("zig") }) + .await; + + if which.is_err() { + #[cfg(not(target_os = "windows"))] + { + anyhow::bail!( + "zig not found on $PATH, install zig (see https://ziglang.org/learn/getting-started or use zigup) or pass ZED_BUILD_REMOTE_SERVER=cross to use cross" + ) + } + #[cfg(target_os = "windows")] + { + anyhow::bail!( + "zig not found on $PATH, install zig (use `winget install -e --id zig.zig` or see https://ziglang.org/learn/getting-started or use zigup) or pass ZED_BUILD_REMOTE_SERVER=cross to use cross" + ) + } } + + delegate.set_status(Some("Adding rustup target for cross-compilation"), cx); + log::info!("adding rustup target"); + run_cmd(Command::new("rustup").args(["target", "add"]).arg(&triple)).await?; + + delegate.set_status(Some("Installing cargo-zigbuild for cross-compilation"), cx); + log::info!("installing cargo-zigbuild"); + run_cmd(Command::new("cargo").args(["install", "--locked", "cargo-zigbuild"])) + .await?; + + delegate.set_status( + Some(&format!( + "Building remote binary from source for {triple} with Zig" + )), + cx, + ); + log::info!("building remote binary from source for {triple} with Zig"); + run_cmd( + Command::new("cargo") + .args([ + "zigbuild", + "--package", + "remote_server", + "--features", + "debug-embed", + "--target-dir", + "target/remote_server", + "--target", + &triple, + ]) + .env("RUSTFLAGS", &rust_flags), + ) + .await?; } - - delegate.set_status(Some("Adding rustup target for cross-compilation"), cx); - log::info!("adding rustup target"); - run_cmd(Command::new("rustup").args(["target", "add"]).arg(&triple)).await?; - - delegate.set_status(Some("Installing cargo-zigbuild for cross-compilation"), cx); - log::info!("installing cargo-zigbuild"); - run_cmd(Command::new("cargo").args(["install", "--locked", "cargo-zigbuild"])).await?; - - delegate.set_status( - Some(&format!( - "Building remote binary from source for {triple} with Zig" - )), - cx, - ); - log::info!("building remote binary from source for {triple} with Zig"); - run_cmd(Command::new("cargo").args([ - "zigbuild", - "--package", - "remote_server", - "--features", - "debug-embed", - "--target-dir", - "target/remote_server", - "--target", - &triple, - ])) - .await?; }; + let bin_path = Path::new("target") + .join("remote_server") + .join(&triple) + .join("debug") + .join("remote_server"); - let mut path = format!("target/remote_server/{triple}/debug/remote_server").into(); - if !build_remote_server.contains("nocompress") { + let path = if !build_remote_server.contains("nocompress") { delegate.set_status(Some("Compressing binary"), cx); #[cfg(not(target_os = "windows"))] { - run_cmd(Command::new("gzip").args([ - "-9", - "-f", - &format!("target/remote_server/{}/debug/remote_server", triple), - ])) - .await?; + run_cmd(Command::new("gzip").args(["-9", "-f", &bin_path.to_string_lossy()])) + .await?; } #[cfg(target_os = "windows")] { @@ -2237,17 +2244,19 @@ impl SshRemoteConnection { "a", "-tgzip", &gz_path, - &format!("target/remote_server/{}/debug/remote_server", triple), + &bin_path.to_string_lossy(), ])) .await?; } - path = std::env::current_dir()?.join(format!( - "target/remote_server/{triple}/debug/remote_server.gz" - )); - } + let mut archive_path = bin_path; + archive_path.set_extension("gz"); + std::env::current_dir()?.join(archive_path) + } else { + bin_path + }; - return Ok(path); + Ok(path) } } diff --git a/crates/remote_server/Cargo.toml b/crates/remote_server/Cargo.toml index b780f57ab4..443c47919f 100644 --- a/crates/remote_server/Cargo.toml +++ b/crates/remote_server/Cargo.toml @@ -37,6 +37,7 @@ fs.workspace = true futures.workspace = true git.workspace = true git_hosting_providers.workspace = true +git2 = { workspace = true, features = ["vendored-libgit2"] } gpui.workspace = true gpui_tokio.workspace = true http_client.workspace = true @@ -85,7 +86,7 @@ node_runtime = { workspace = true, features = ["test-support"] } project = { workspace = true, features = ["test-support"] } remote = { workspace = true, features = ["test-support"] } language_model = { workspace = true, features = ["test-support"] } -lsp = { workspace = true, features=["test-support"] } +lsp = { workspace = true, features = ["test-support"] } unindent.workspace = true serde_json.workspace = true zlog.workspace = true @@ -95,4 +96,4 @@ cargo_toml.workspace = true toml.workspace = true [package.metadata.cargo-machete] -ignored = ["rust-embed", "paths"] +ignored = ["git2", "rust-embed", "paths"] From 684e14e55be0af000bffcc2e2064b0c7db341f4b Mon Sep 17 00:00:00 2001 From: Peter Tripp Date: Tue, 8 Jul 2025 13:40:00 -0400 Subject: [PATCH 09/34] Move Perplexity extension to dedicated repository (#34070) Move Perplexity extension to: https://github.com/zed-extensions/perplexity Release Notes: - N/A --- .config/hakari.toml | 1 - Cargo.lock | 8 -- Cargo.toml | 1 - extensions/perplexity/Cargo.toml | 17 --- extensions/perplexity/LICENSE-APACHE | 1 - extensions/perplexity/README.md | 43 ------- extensions/perplexity/extension.toml | 12 -- extensions/perplexity/src/perplexity.rs | 158 ------------------------ 8 files changed, 241 deletions(-) delete mode 100644 extensions/perplexity/Cargo.toml delete mode 120000 extensions/perplexity/LICENSE-APACHE delete mode 100644 extensions/perplexity/README.md delete mode 100644 extensions/perplexity/extension.toml delete mode 100644 extensions/perplexity/src/perplexity.rs diff --git a/.config/hakari.toml b/.config/hakari.toml index bd742b33cd..982542ca39 100644 --- a/.config/hakari.toml +++ b/.config/hakari.toml @@ -33,7 +33,6 @@ workspace-members = [ "zed_emmet", "zed_glsl", "zed_html", - "perplexity", "zed_proto", "zed_ruff", "slash_commands_example", diff --git a/Cargo.lock b/Cargo.lock index ce6bdffefb..bb3e4024ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11350,14 +11350,6 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" -[[package]] -name = "perplexity" -version = "0.1.0" -dependencies = [ - "serde", - "zed_extension_api 0.6.0", -] - [[package]] name = "pest" version = "2.8.0" diff --git a/Cargo.toml b/Cargo.toml index 32f520c602..f22bff1f86 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -189,7 +189,6 @@ members = [ "extensions/emmet", "extensions/glsl", "extensions/html", - "extensions/perplexity", "extensions/proto", "extensions/ruff", "extensions/slash-commands-example", diff --git a/extensions/perplexity/Cargo.toml b/extensions/perplexity/Cargo.toml deleted file mode 100644 index 476f4d414d..0000000000 --- a/extensions/perplexity/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "perplexity" -version = "0.1.0" -edition.workspace = true -publish.workspace = true -license = "Apache-2.0" - -[lib] -path = "src/perplexity.rs" -crate-type = ["cdylib"] - -[lints] -workspace = true - -[dependencies] -serde = "1" -zed_extension_api = { path = "../../crates/extension_api" } diff --git a/extensions/perplexity/LICENSE-APACHE b/extensions/perplexity/LICENSE-APACHE deleted file mode 120000 index 1cd601d0a3..0000000000 --- a/extensions/perplexity/LICENSE-APACHE +++ /dev/null @@ -1 +0,0 @@ -../../LICENSE-APACHE \ No newline at end of file diff --git a/extensions/perplexity/README.md b/extensions/perplexity/README.md deleted file mode 100644 index 337c24325b..0000000000 --- a/extensions/perplexity/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# Zed Perplexity Extension - -This example extension adds the `/perplexity` [slash command](https://zed.dev/docs/assistant/commands) to the Zed AI assistant. - -## Usage - -Open the AI Assistant panel (`cmd-r` or `ctrl-r`) and enter: - -``` -/perplexity What's the weather in Boulder, CO tomorrow evening? -``` - -## Development Setup - -1. Install the Rust toolchain and clone the zed repo: - - ``` - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - - mkdir -p ~/code - cd ~/code - git clone https://github.com/zed-industries/zed - ``` - -1. Open Zed -1. Open Zed Extensions (`cmd-shift-x` / `ctrl-shift-x`) -1. Click "Install Dev Extension" -1. Navigate to the "extensions/perplexity" folder inside the zed git repo. -1. Ensure your `PERPLEXITY_API_KEY` environment variable is set (instructions below) - - ```sh - env | grep PERPLEXITY_API_KEY - ``` - -1. Quit and relaunch Zed - -## PERPLEXITY_API_KEY - -This extension requires a Perplexity API key to be available via the `PERPLEXITY_API_KEY` environment variable. - -To obtain a Perplexity.ai API token, login to your Perplexity.ai account and go [Settings->API](https://www.perplexity.ai/settings/api) and under "API Keys" click "Generate". This will require you to have [Perplexity Pro](https://www.perplexity.ai/pro) or to buy API credits. By default the extension uses `llama-3.1-sonar-small-128k-online`, currently cheapest model available which is roughly half a penny per request + a penny per 50,000 tokens. So most requests will cost less than $0.01 USD. - -Take your API key and add it to your environment by adding `export PERPLEXITY_API_KEY="pplx-0123456789abcdef..."` to your `~/.zshrc` or `~/.bashrc`. Reload close and reopen your terminal session. Check with `env |grep PERPLEXITY_API_KEY`. diff --git a/extensions/perplexity/extension.toml b/extensions/perplexity/extension.toml deleted file mode 100644 index 474d9ee981..0000000000 --- a/extensions/perplexity/extension.toml +++ /dev/null @@ -1,12 +0,0 @@ -id = "perplexity" -name = "Perplexity" -version = "0.1.0" -description = "Ask questions to Perplexity AI directly from Zed" -authors = ["Zed Industries "] -repository = "https://github.com/zed-industries/zed" -schema_version = 1 - -[slash_commands.perplexity] -description = "Ask a question to Perplexity AI" -requires_argument = true -tooltip_text = "Ask Perplexity" diff --git a/extensions/perplexity/src/perplexity.rs b/extensions/perplexity/src/perplexity.rs deleted file mode 100644 index 95b829c112..0000000000 --- a/extensions/perplexity/src/perplexity.rs +++ /dev/null @@ -1,158 +0,0 @@ -use zed::{ - http_client::HttpMethod, - http_client::HttpRequest, - serde_json::{self, json}, -}; -use zed_extension_api::{self as zed, Result, http_client::RedirectPolicy}; - -struct Perplexity; - -impl zed::Extension for Perplexity { - fn new() -> Self { - Self - } - - fn run_slash_command( - &self, - command: zed::SlashCommand, - argument: Vec, - worktree: Option<&zed::Worktree>, - ) -> zed::Result { - // Check if the command is 'perplexity' - if command.name != "perplexity" { - return Err("Invalid command. Expected 'perplexity'.".into()); - } - - let worktree = worktree.ok_or("Worktree is required")?; - // Join arguments with space as the query - let query = argument.join(" "); - if query.is_empty() { - return Ok(zed::SlashCommandOutput { - text: "Error: Query not provided. Please enter a question or topic.".to_string(), - sections: vec![], - }); - } - - // Get the API key from the environment - let env_vars = worktree.shell_env(); - let api_key = env_vars - .iter() - .find(|(key, _)| key == "PERPLEXITY_API_KEY") - .map(|(_, value)| value.clone()) - .ok_or("PERPLEXITY_API_KEY not found in environment")?; - - // Prepare the request - let request = HttpRequest { - method: HttpMethod::Post, - url: "https://api.perplexity.ai/chat/completions".to_string(), - headers: vec![ - ("Authorization".to_string(), format!("Bearer {}", api_key)), - ("Content-Type".to_string(), "application/json".to_string()), - ], - body: Some( - serde_json::to_vec(&json!({ - "model": "llama-3.1-sonar-small-128k-online", - "messages": [{"role": "user", "content": query}], - "stream": true, - })) - .unwrap(), - ), - redirect_policy: RedirectPolicy::FollowAll, - }; - - // Make the HTTP request - match zed::http_client::fetch_stream(&request) { - Ok(stream) => { - let mut full_content = String::new(); - let mut buffer = String::new(); - while let Ok(Some(chunk)) = stream.next_chunk() { - buffer.push_str(&String::from_utf8_lossy(&chunk)); - for line in buffer.lines() { - if let Some(json) = line.strip_prefix("data: ") { - if let Ok(event) = serde_json::from_str::(json) { - if let Some(choice) = event.choices.first() { - full_content.push_str(&choice.delta.content); - } - } - } - } - buffer.clear(); - } - Ok(zed::SlashCommandOutput { - text: full_content, - sections: vec![], - }) - } - Err(e) => Ok(zed::SlashCommandOutput { - text: format!("API request failed. Error: {}. API Key: {}", e, api_key), - sections: vec![], - }), - } - } - - fn complete_slash_command_argument( - &self, - _command: zed::SlashCommand, - query: Vec, - ) -> zed::Result> { - let suggestions = vec!["How do I develop a Zed extension?"]; - let query = query.join(" ").to_lowercase(); - - Ok(suggestions - .into_iter() - .filter(|suggestion| suggestion.to_lowercase().contains(&query)) - .map(|suggestion| zed::SlashCommandArgumentCompletion { - label: suggestion.to_string(), - new_text: suggestion.to_string(), - run_command: true, - }) - .collect()) - } - - fn language_server_command( - &mut self, - _language_server_id: &zed_extension_api::LanguageServerId, - _worktree: &zed_extension_api::Worktree, - ) -> Result { - Err("Not implemented".into()) - } -} - -#[derive(serde::Deserialize)] -struct StreamEvent { - id: String, - model: String, - created: u64, - usage: Usage, - object: String, - choices: Vec, -} - -#[derive(serde::Deserialize)] -struct Usage { - prompt_tokens: u32, - completion_tokens: u32, - total_tokens: u32, -} - -#[derive(serde::Deserialize)] -struct Choice { - index: u32, - finish_reason: Option, - message: Message, - delta: Delta, -} - -#[derive(serde::Deserialize)] -struct Message { - role: String, - content: String, -} - -#[derive(serde::Deserialize)] -struct Delta { - role: String, - content: String, -} - -zed::register_extension!(Perplexity); From 11ddecb995c5f2368ca6fb07e440afa7d80a45d9 Mon Sep 17 00:00:00 2001 From: fantacell Date: Tue, 8 Jul 2025 19:47:39 +0200 Subject: [PATCH 10/34] helix: Change keymap (#33925) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Might close #33838 for now Keymaps that work both in vim and helix, but only in normal mode, not the more general `VimControl` context are written separately. This makes the file shorter by combining them and also adds one more keymap. Release Notes: - N/A --- assets/keymaps/vim.json | 56 +++++++++++++++-------------------------- 1 file changed, 20 insertions(+), 36 deletions(-) diff --git a/assets/keymaps/vim.json b/assets/keymaps/vim.json index ba3012cc54..d90813e3d6 100644 --- a/assets/keymaps/vim.json +++ b/assets/keymaps/vim.json @@ -218,35 +218,18 @@ "context": "vim_mode == normal", "bindings": { "ctrl-[": "editor::Cancel", - "escape": "editor::Cancel", ":": "command_palette::Toggle", "c": "vim::PushChange", "shift-c": "vim::ChangeToEndOfLine", "d": "vim::PushDelete", "delete": "vim::DeleteRight", - "shift-d": "vim::DeleteToEndOfLine", - "shift-j": "vim::JoinLines", "g shift-j": "vim::JoinLinesNoWhitespace", "y": "vim::PushYank", - "shift-y": "vim::YankLine", - "i": "vim::InsertBefore", - "shift-i": "vim::InsertFirstNonWhitespace", - "a": "vim::InsertAfter", - "shift-a": "vim::InsertEndOfLine", "x": "vim::DeleteRight", "shift-x": "vim::DeleteLeft", - "o": "vim::InsertLineBelow", - "shift-o": "vim::InsertLineAbove", - "~": "vim::ChangeCase", "ctrl-a": "vim::Increment", "ctrl-x": "vim::Decrement", - "p": "vim::Paste", - "shift-p": ["vim::Paste", { "before": true }], - "u": "vim::Undo", "ctrl-r": "vim::Redo", - "r": "vim::PushReplace", - "s": "vim::Substitute", - "shift-s": "vim::SubstituteLine", ">": "vim::PushIndent", "<": "vim::PushOutdent", "=": "vim::PushAutoIndent", @@ -256,11 +239,8 @@ "g ~": "vim::PushOppositeCase", "g ?": "vim::PushRot13", // "g ?": "vim::PushRot47", - "\"": "vim::PushRegister", "g w": "vim::PushRewrap", "g q": "vim::PushRewrap", - "ctrl-pagedown": "pane::ActivateNextItem", - "ctrl-pageup": "pane::ActivatePreviousItem", "insert": "vim::InsertBefore", // tree-sitter related commands "[ x": "vim::SelectLargerSyntaxNode", @@ -364,18 +344,11 @@ } }, { - "context": "vim_mode == helix_normal && !menu", + "context": "(vim_mode == normal || vim_mode == helix_normal) && !menu", "bindings": { "escape": "editor::Cancel", - "ctrl-[": "editor::Cancel", - ":": "command_palette::Toggle", - "left": "vim::WrappingLeft", - "right": "vim::WrappingRight", - "h": "vim::WrappingLeft", - "l": "vim::WrappingRight", "shift-d": "vim::DeleteToEndOfLine", "shift-j": "vim::JoinLines", - "y": "editor::Copy", "shift-y": "vim::YankLine", "i": "vim::InsertBefore", "shift-i": "vim::InsertFirstNonWhitespace", @@ -389,27 +362,39 @@ "p": "vim::Paste", "shift-p": ["vim::Paste", { "before": true }], "u": "vim::Undo", + "r": "vim::PushReplace", + "s": "vim::Substitute", + "shift-s": "vim::SubstituteLine", + "\"": "vim::PushRegister", + "ctrl-pagedown": "pane::ActivateNextItem", + "ctrl-pageup": "pane::ActivatePreviousItem" + } + }, + { + "context": "vim_mode == helix_normal && !menu", + "bindings": { + "ctrl-[": "editor::Cancel", + ":": "command_palette::Toggle", + "left": "vim::WrappingLeft", + "right": "vim::WrappingRight", + "h": "vim::WrappingLeft", + "l": "vim::WrappingRight", + "y": "editor::Copy", + "alt-;": "vim::OtherEnd", "ctrl-r": "vim::Redo", "f": ["vim::PushFindForward", { "before": false, "multiline": true }], "t": ["vim::PushFindForward", { "before": true, "multiline": true }], "shift-f": ["vim::PushFindBackward", { "after": false, "multiline": true }], "shift-t": ["vim::PushFindBackward", { "after": true, "multiline": true }], - "r": "vim::PushReplace", - "s": "vim::Substitute", - "shift-s": "vim::SubstituteLine", ">": "vim::Indent", "<": "vim::Outdent", "=": "vim::AutoIndent", "g u": "vim::PushLowercase", "g shift-u": "vim::PushUppercase", "g ~": "vim::PushOppositeCase", - "\"": "vim::PushRegister", "g q": "vim::PushRewrap", "g w": "vim::PushRewrap", - "ctrl-pagedown": "pane::ActivateNextItem", - "ctrl-pageup": "pane::ActivatePreviousItem", "insert": "vim::InsertBefore", - ".": "vim::Repeat", "alt-.": "vim::RepeatFind", // tree-sitter related commands "[ x": "editor::SelectLargerSyntaxNode", @@ -429,7 +414,6 @@ "g h": "vim::StartOfLine", "g s": "vim::FirstNonWhitespace", // "g s" default behavior is "space s" "g e": "vim::EndOfDocument", - "g y": "editor::GoToTypeDefinition", "g r": "editor::FindAllReferences", // zed specific "g t": "vim::WindowTop", "g c": "vim::WindowMiddle", From 9a3720edd32d1d43348cc0d2daaede5734b35991 Mon Sep 17 00:00:00 2001 From: Peter Tripp Date: Tue, 8 Jul 2025 13:49:54 -0400 Subject: [PATCH 11/34] Disable word completions by default for plaintext/markdown (#34065) This disables word based completions in Plain Text and Markdown buffers by default. Word-based completion when typing natural language can be quite disruptive, in particular at the end of a line (e.g. markdown style lists) where `enter` will accept word completions rather than insert a newline (see screenshot). I think the default, empty buffer experience in Zed should be closer to a zed-mode experience -- just an editor getting out of your way to let you type and not having to mash escape/cmd-z repeatedly to undo a over-aggressive completion. Screenshot 2025-07-08 at 11 57 26 - Context: https://github.com/zed-industries/zed/issues/4957#issuecomment-3049513501 - Follow-up to: https://github.com/zed-industries/zed/pull/26410 Re-enable the existing behavior with: ```json "languages": { "Plain Text": { "completions": { "words": "fallback" } }, "Markdown": { "completions": { "words": "fallback" } }, }, ``` Or disable Word based completions everywhere with: ```json "completions": { "words": "fallback" }, ``` Release Notes: - Disable word-completions by default in Plain Text and Markdown Buffers --- assets/settings/default.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/assets/settings/default.json b/assets/settings/default.json index 9693a474e7..dc1040e1d0 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -1603,6 +1603,9 @@ "use_on_type_format": false, "allow_rewrap": "anywhere", "soft_wrap": "editor_width", + "completions": { + "words": "disabled" + }, "prettier": { "allowed": true } @@ -1616,6 +1619,9 @@ } }, "Plain Text": { + "completions": { + "words": "disabled" + }, "allow_rewrap": "anywhere" }, "Python": { From 01bdef130b03c6e2f48386d86173eaeac378f3db Mon Sep 17 00:00:00 2001 From: Julia Ryan Date: Tue, 8 Jul 2025 11:05:11 -0700 Subject: [PATCH 12/34] nix: Fix generate-licenses failure (#34072) We should maybe add `generate-licenses` to the sensitivity list for running nix in CI given that nix uses a workaround for it. Release Notes: - N/A --- script/generate-licenses | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/script/generate-licenses b/script/generate-licenses index 7ae0f1c3f6..771ce2363d 100755 --- a/script/generate-licenses +++ b/script/generate-licenses @@ -36,8 +36,9 @@ fi echo "Generating cargo licenses" if [ -z "${ALLOW_MISSING_LICENSES-}" ]; then FAIL_FLAG=--fail; else FAIL_FLAG=""; fi +if [ -z "${ALLOW_MISSING_LICENSES-}" ]; then WRAPPER=fail_on_stderr; else WRAPPER=""; fi set -x -fail_on_stderr cargo about generate \ +$WRAPPER cargo about generate \ $FAIL_FLAG \ -c script/licenses/zed-licenses.toml \ "$TEMPLATE_FILE" >>"$OUTPUT_FILE" From 1220049089cb35c5b7ea89b1231b4049c164718a Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Tue, 8 Jul 2025 14:44:51 -0400 Subject: [PATCH 13/34] Add feature flag to use `cloud.zed.dev` instead of `llm.zed.dev` (#34076) This PR adds a new `zed-cloud` feature flag that can be used to send traffic to `cloud.zed.dev` instead of `llm.zed.dev`. This is just so Zed staff can test the new infrastructure. When we're ready for prime-time we'll reroute traffic on the server. Release Notes: - N/A --- Cargo.lock | 2 ++ crates/feature_flags/src/feature_flags.rs | 11 ++++++++ crates/http_client/src/http_client.rs | 15 ++++++++-- crates/language_models/Cargo.toml | 1 + crates/language_models/src/provider/cloud.rs | 29 ++++++++++++++++---- crates/web_search_providers/Cargo.toml | 1 + crates/web_search_providers/src/cloud.rs | 13 +++++++-- crates/zeta/src/zeta.rs | 10 +++++-- 8 files changed, 70 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bb3e4024ba..07a445eefe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8955,6 +8955,7 @@ dependencies = [ "credentials_provider", "deepseek", "editor", + "feature_flags", "fs", "futures 0.3.31", "google_ai", @@ -18296,6 +18297,7 @@ version = "0.1.0" dependencies = [ "anyhow", "client", + "feature_flags", "futures 0.3.31", "gpui", "http_client", diff --git a/crates/feature_flags/src/feature_flags.rs b/crates/feature_flags/src/feature_flags.rs index 6c0cb763ef..2c2bbfe30d 100644 --- a/crates/feature_flags/src/feature_flags.rs +++ b/crates/feature_flags/src/feature_flags.rs @@ -92,6 +92,17 @@ impl FeatureFlag for JjUiFeatureFlag { const NAME: &'static str = "jj-ui"; } +pub struct ZedCloudFeatureFlag {} + +impl FeatureFlag for ZedCloudFeatureFlag { + const NAME: &'static str = "zed-cloud"; + + fn enabled_for_staff() -> bool { + // Require individual opt-in, for now. + false + } +} + pub trait FeatureFlagViewExt { fn observe_flag(&mut self, window: &Window, callback: F) -> Subscription where diff --git a/crates/http_client/src/http_client.rs b/crates/http_client/src/http_client.rs index 288dec9a31..c60a56002f 100644 --- a/crates/http_client/src/http_client.rs +++ b/crates/http_client/src/http_client.rs @@ -226,10 +226,21 @@ impl HttpClientWithUrl { } /// Builds a Zed LLM URL using the given path. - pub fn build_zed_llm_url(&self, path: &str, query: &[(&str, &str)]) -> Result { + pub fn build_zed_llm_url( + &self, + path: &str, + query: &[(&str, &str)], + use_cloud: bool, + ) -> Result { let base_url = self.base_url(); let base_api_url = match base_url.as_ref() { - "https://zed.dev" => "https://llm.zed.dev", + "https://zed.dev" => { + if use_cloud { + "https://cloud.zed.dev" + } else { + "https://llm.zed.dev" + } + } "https://staging.zed.dev" => "https://llm-staging.zed.dev", "http://localhost:3000" => "http://localhost:8787", other => other, diff --git a/crates/language_models/Cargo.toml b/crates/language_models/Cargo.toml index 0f248edd57..514443ddec 100644 --- a/crates/language_models/Cargo.toml +++ b/crates/language_models/Cargo.toml @@ -28,6 +28,7 @@ credentials_provider.workspace = true copilot.workspace = true deepseek = { workspace = true, features = ["schemars"] } editor.workspace = true +feature_flags.workspace = true fs.workspace = true futures.workspace = true google_ai = { workspace = true, features = ["schemars"] } diff --git a/crates/language_models/src/provider/cloud.rs b/crates/language_models/src/provider/cloud.rs index 1cd673710c..9b7fee228a 100644 --- a/crates/language_models/src/provider/cloud.rs +++ b/crates/language_models/src/provider/cloud.rs @@ -2,6 +2,7 @@ use anthropic::AnthropicModelMode; use anyhow::{Context as _, Result, anyhow}; use chrono::{DateTime, Utc}; use client::{Client, ModelRequestUsage, UserStore, zed_urls}; +use feature_flags::{FeatureFlagAppExt as _, ZedCloudFeatureFlag}; use futures::{ AsyncBufReadExt, FutureExt, Stream, StreamExt, future::BoxFuture, stream::BoxStream, }; @@ -136,6 +137,7 @@ impl State { cx: &mut Context, ) -> Self { let refresh_llm_token_listener = RefreshLlmTokenListener::global(cx); + let use_cloud = cx.has_flag::(); Self { client: client.clone(), @@ -163,7 +165,7 @@ impl State { .await; } - let response = Self::fetch_models(client, llm_api_token).await?; + let response = Self::fetch_models(client, llm_api_token, use_cloud).await?; cx.update(|cx| { this.update(cx, |this, cx| { let mut models = Vec::new(); @@ -265,13 +267,18 @@ impl State { async fn fetch_models( client: Arc, llm_api_token: LlmApiToken, + use_cloud: bool, ) -> Result { let http_client = &client.http_client(); let token = llm_api_token.acquire(&client).await?; let request = http_client::Request::builder() .method(Method::GET) - .uri(http_client.build_zed_llm_url("/models", &[])?.as_ref()) + .uri( + http_client + .build_zed_llm_url("/models", &[], use_cloud)? + .as_ref(), + ) .header("Authorization", format!("Bearer {token}")) .body(AsyncBody::empty())?; let mut response = http_client @@ -535,6 +542,7 @@ impl CloudLanguageModel { llm_api_token: LlmApiToken, app_version: Option, body: CompletionBody, + use_cloud: bool, ) -> Result { let http_client = &client.http_client(); @@ -542,9 +550,11 @@ impl CloudLanguageModel { let mut refreshed_token = false; loop { - let request_builder = http_client::Request::builder() - .method(Method::POST) - .uri(http_client.build_zed_llm_url("/completions", &[])?.as_ref()); + let request_builder = http_client::Request::builder().method(Method::POST).uri( + http_client + .build_zed_llm_url("/completions", &[], use_cloud)? + .as_ref(), + ); let request_builder = if let Some(app_version) = app_version { request_builder.header(ZED_VERSION_HEADER_NAME, app_version.to_string()) } else { @@ -771,6 +781,7 @@ impl LanguageModel for CloudLanguageModel { let model_id = self.model.id.to_string(); let generate_content_request = into_google(request, model_id.clone(), GoogleModelMode::Default); + let use_cloud = cx.has_flag::(); async move { let http_client = &client.http_client(); let token = llm_api_token.acquire(&client).await?; @@ -786,7 +797,7 @@ impl LanguageModel for CloudLanguageModel { .method(Method::POST) .uri( http_client - .build_zed_llm_url("/count_tokens", &[])? + .build_zed_llm_url("/count_tokens", &[], use_cloud)? .as_ref(), ) .header("Content-Type", "application/json") @@ -835,6 +846,9 @@ impl LanguageModel for CloudLanguageModel { let intent = request.intent; let mode = request.mode; let app_version = cx.update(|cx| AppVersion::global(cx)).ok(); + let use_cloud = cx + .update(|cx| cx.has_flag::()) + .unwrap_or(false); match self.model.provider { zed_llm_client::LanguageModelProvider::Anthropic => { let request = into_anthropic( @@ -872,6 +886,7 @@ impl LanguageModel for CloudLanguageModel { provider_request: serde_json::to_value(&request) .map_err(|e| anyhow!(e))?, }, + use_cloud, ) .await .map_err(|err| match err.downcast::() { @@ -924,6 +939,7 @@ impl LanguageModel for CloudLanguageModel { provider_request: serde_json::to_value(&request) .map_err(|e| anyhow!(e))?, }, + use_cloud, ) .await?; @@ -964,6 +980,7 @@ impl LanguageModel for CloudLanguageModel { provider_request: serde_json::to_value(&request) .map_err(|e| anyhow!(e))?, }, + use_cloud, ) .await?; diff --git a/crates/web_search_providers/Cargo.toml b/crates/web_search_providers/Cargo.toml index 2e052796c4..208cb63593 100644 --- a/crates/web_search_providers/Cargo.toml +++ b/crates/web_search_providers/Cargo.toml @@ -14,6 +14,7 @@ path = "src/web_search_providers.rs" [dependencies] anyhow.workspace = true client.workspace = true +feature_flags.workspace = true futures.workspace = true gpui.workspace = true http_client.workspace = true diff --git a/crates/web_search_providers/src/cloud.rs b/crates/web_search_providers/src/cloud.rs index adf79b0ff6..79ccf97e47 100644 --- a/crates/web_search_providers/src/cloud.rs +++ b/crates/web_search_providers/src/cloud.rs @@ -2,6 +2,7 @@ use std::sync::Arc; use anyhow::{Context as _, Result}; use client::Client; +use feature_flags::{FeatureFlagAppExt as _, ZedCloudFeatureFlag}; use futures::AsyncReadExt as _; use gpui::{App, AppContext, Context, Entity, Subscription, Task}; use http_client::{HttpClient, Method}; @@ -62,7 +63,10 @@ impl WebSearchProvider for CloudWebSearchProvider { let client = state.client.clone(); let llm_api_token = state.llm_api_token.clone(); let body = WebSearchBody { query }; - cx.background_spawn(async move { perform_web_search(client, llm_api_token, body).await }) + let use_cloud = cx.has_flag::(); + cx.background_spawn(async move { + perform_web_search(client, llm_api_token, body, use_cloud).await + }) } } @@ -70,6 +74,7 @@ async fn perform_web_search( client: Arc, llm_api_token: LlmApiToken, body: WebSearchBody, + use_cloud: bool, ) -> Result { const MAX_RETRIES: usize = 3; @@ -86,7 +91,11 @@ async fn perform_web_search( let request = http_client::Request::builder() .method(Method::POST) - .uri(http_client.build_zed_llm_url("/web_search", &[])?.as_ref()) + .uri( + http_client + .build_zed_llm_url("/web_search", &[], use_cloud)? + .as_ref(), + ) .header("Content-Type", "application/json") .header("Authorization", format!("Bearer {token}")) .body(serde_json::to_string(&body)?.into())?; diff --git a/crates/zeta/src/zeta.rs b/crates/zeta/src/zeta.rs index 87cd1e604c..12d3d4bfbc 100644 --- a/crates/zeta/src/zeta.rs +++ b/crates/zeta/src/zeta.rs @@ -8,6 +8,7 @@ mod rate_completion_modal; pub(crate) use completion_diff_element::*; use db::kvp::KEY_VALUE_STORE; +use feature_flags::{FeatureFlagAppExt as _, ZedCloudFeatureFlag}; pub use init::*; use inline_completion::DataCollectionState; use license_detection::LICENSE_FILES_TO_CHECK; @@ -390,6 +391,7 @@ impl Zeta { let client = self.client.clone(); let llm_token = self.llm_token.clone(); let app_version = AppVersion::global(cx); + let use_cloud = cx.has_flag::(); let buffer = buffer.clone(); @@ -480,6 +482,7 @@ impl Zeta { llm_token, app_version, body, + use_cloud, }) .await; let (response, usage) = match response { @@ -745,6 +748,7 @@ and then another llm_token, app_version, body, + use_cloud, .. } = params; @@ -760,7 +764,7 @@ and then another } else { request_builder.uri( http_client - .build_zed_llm_url("/predict_edits/v2", &[])? + .build_zed_llm_url("/predict_edits/v2", &[], use_cloud)? .as_ref(), ) }; @@ -820,6 +824,7 @@ and then another let client = self.client.clone(); let llm_token = self.llm_token.clone(); let app_version = AppVersion::global(cx); + let use_cloud = cx.has_flag::(); cx.spawn(async move |this, cx| { let http_client = client.http_client(); let mut response = llm_token_retry(&llm_token, &client, |token| { @@ -830,7 +835,7 @@ and then another } else { request_builder.uri( http_client - .build_zed_llm_url("/predict_edits/accept", &[])? + .build_zed_llm_url("/predict_edits/accept", &[], use_cloud)? .as_ref(), ) }; @@ -1126,6 +1131,7 @@ struct PerformPredictEditsParams { pub llm_token: LlmApiToken, pub app_version: SemanticVersion, pub body: PredictEditsBody, + pub use_cloud: bool, } #[derive(Error, Debug)] From 6b7c30d7ad19313a09de107d7c5ae0da4f7efcea Mon Sep 17 00:00:00 2001 From: Ben Kunkle Date: Tue, 8 Jul 2025 14:39:55 -0500 Subject: [PATCH 14/34] keymap_ui: Editor for action input in modal (#34080) Closes #ISSUE Adds a very simple editor for editing action input to the edit keybind modal. No auto-complete yet. Release Notes: - N/A *or* Added/Fixed/Improved ... --- crates/settings/src/keymap_file.rs | 8 +- crates/settings_ui/src/keybindings.rs | 206 +++++++++++++++++--------- 2 files changed, 140 insertions(+), 74 deletions(-) diff --git a/crates/settings/src/keymap_file.rs b/crates/settings/src/keymap_file.rs index b91739ca87..19bc58ea23 100644 --- a/crates/settings/src/keymap_file.rs +++ b/crates/settings/src/keymap_file.rs @@ -426,12 +426,18 @@ impl KeymapFile { } } + /// Creates a JSON schema generator, suitable for generating json schemas + /// for actions + pub fn action_schema_generator() -> schemars::SchemaGenerator { + schemars::generate::SchemaSettings::draft2019_09().into_generator() + } + pub fn generate_json_schema_for_registered_actions(cx: &mut App) -> Value { // instead of using DefaultDenyUnknownFields, actions typically use // `#[serde(deny_unknown_fields)]` so that these cases are reported as parse failures. This // is because the rest of the keymap will still load in these cases, whereas other settings // files would not. - let mut generator = schemars::generate::SchemaSettings::draft2019_09().into_generator(); + let mut generator = Self::action_schema_generator(); let action_schemas = cx.action_schemas(&mut generator); let deprecations = cx.deprecated_actions_to_preferred_actions(); diff --git a/crates/settings_ui/src/keybindings.rs b/crates/settings_ui/src/keybindings.rs index 2dd693c798..951dd77541 100644 --- a/crates/settings_ui/src/keybindings.rs +++ b/crates/settings_ui/src/keybindings.rs @@ -4,7 +4,7 @@ use std::{ }; use anyhow::{Context as _, anyhow}; -use collections::HashSet; +use collections::{HashMap, HashSet}; use editor::{CompletionProvider, Editor, EditorEvent}; use feature_flags::FeatureFlagViewExt; use fs::Fs; @@ -240,7 +240,7 @@ impl KeymapEditor { Some(Default) => 3, None => 4, }; - return (source_precedence, keybind.action.as_ref()); + return (source_precedence, keybind.action_name.as_ref()); }); } this.selected_index.take(); @@ -261,6 +261,12 @@ impl KeymapEditor { let mut unmapped_action_names = HashSet::from_iter(cx.all_action_names().into_iter().copied()); let action_documentation = cx.action_documentation(); + let mut generator = KeymapFile::action_schema_generator(); + let action_schema = HashMap::from_iter( + cx.action_schemas(&mut generator) + .into_iter() + .filter_map(|(name, schema)| schema.map(|schema| (name, schema))), + ); let mut processed_bindings = Vec::new(); let mut string_match_candidates = Vec::new(); @@ -295,9 +301,10 @@ impl KeymapEditor { processed_bindings.push(ProcessedKeybinding { keystroke_text: keystroke_text.into(), ui_key_binding, - action: action_name.into(), + action_name: action_name.into(), action_input, action_docs, + action_schema: action_schema.get(action_name).cloned(), context: Some(context), source, }); @@ -311,9 +318,10 @@ impl KeymapEditor { processed_bindings.push(ProcessedKeybinding { keystroke_text: empty.clone(), ui_key_binding: None, - action: action_name.into(), + action_name: action_name.into(), action_input: None, action_docs: action_documentation.get(action_name).copied(), + action_schema: action_schema.get(action_name).cloned(), context: None, source: None, }); @@ -326,8 +334,8 @@ impl KeymapEditor { fn update_keybindings(&mut self, cx: &mut Context) { let workspace = self.workspace.clone(); cx.spawn(async move |this, cx| { - let json_language = Self::load_json_language(workspace.clone(), cx).await; - let rust_language = Self::load_rust_language(workspace.clone(), cx).await; + let json_language = load_json_language(workspace.clone(), cx).await; + let rust_language = load_rust_language(workspace.clone(), cx).await; let query = this.update(cx, |this, cx| { let (key_bindings, string_match_candidates) = @@ -353,64 +361,6 @@ impl KeymapEditor { .detach_and_log_err(cx); } - async fn load_json_language( - workspace: WeakEntity, - cx: &mut AsyncApp, - ) -> Arc { - let json_language_task = workspace - .read_with(cx, |workspace, cx| { - workspace - .project() - .read(cx) - .languages() - .language_for_name("JSON") - }) - .context("Failed to load JSON language") - .log_err(); - let json_language = match json_language_task { - Some(task) => task.await.context("Failed to load JSON language").log_err(), - None => None, - }; - return json_language.unwrap_or_else(|| { - Arc::new(Language::new( - LanguageConfig { - name: "JSON".into(), - ..Default::default() - }, - Some(tree_sitter_json::LANGUAGE.into()), - )) - }); - } - - async fn load_rust_language( - workspace: WeakEntity, - cx: &mut AsyncApp, - ) -> Arc { - let rust_language_task = workspace - .read_with(cx, |workspace, cx| { - workspace - .project() - .read(cx) - .languages() - .language_for_name("Rust") - }) - .context("Failed to load Rust language") - .log_err(); - let rust_language = match rust_language_task { - Some(task) => task.await.context("Failed to load Rust language").log_err(), - None => None, - }; - return rust_language.unwrap_or_else(|| { - Arc::new(Language::new( - LanguageConfig { - name: "Rust".into(), - ..Default::default() - }, - Some(tree_sitter_rust::LANGUAGE.into()), - )) - }); - } - fn dispatch_context(&self, _window: &Window, _cx: &Context) -> KeyContext { let mut dispatch_context = KeyContext::new_with_defaults(); dispatch_context.add("KeymapEditor"); @@ -526,8 +476,10 @@ impl KeymapEditor { self.workspace .update(cx, |workspace, cx| { let fs = workspace.app_state().fs.clone(); + let workspace_weak = cx.weak_entity(); workspace.toggle_modal(window, cx, |window, cx| { - let modal = KeybindingEditorModal::new(keybind.clone(), fs, window, cx); + let modal = + KeybindingEditorModal::new(keybind.clone(), workspace_weak, fs, window, cx); window.focus(&modal.focus_handle(cx)); modal }); @@ -564,7 +516,7 @@ impl KeymapEditor { ) { let action = self .selected_binding() - .map(|binding| binding.action.to_string()); + .map(|binding| binding.action_name.to_string()); let Some(action) = action else { return; }; @@ -576,9 +528,10 @@ impl KeymapEditor { struct ProcessedKeybinding { keystroke_text: SharedString, ui_key_binding: Option, - action: SharedString, + action_name: SharedString, action_input: Option, action_docs: Option<&'static str>, + action_schema: Option, context: Option, source: Option<(KeybindSource, SharedString)>, } @@ -685,10 +638,10 @@ impl Render for KeymapEditor { let binding = &this.keybindings[candidate_id]; let action = div() - .child(binding.action.clone()) + .child(binding.action_name.clone()) .id(("keymap action", index)) .tooltip({ - let action_name = binding.action.clone(); + let action_name = binding.action_name.clone(); let action_docs = binding.action_docs; move |_, cx| { let action_tooltip = Tooltip::new( @@ -828,6 +781,7 @@ struct KeybindingEditorModal { editing_keybind: ProcessedKeybinding, keybind_editor: Entity, context_editor: Entity, + input_editor: Option>, fs: Arc, error: Option, } @@ -845,6 +799,7 @@ impl Focusable for KeybindingEditorModal { impl KeybindingEditorModal { pub fn new( editing_keybind: ProcessedKeybinding, + workspace: WeakEntity, fs: Arc, window: &mut Window, cx: &mut App, @@ -881,11 +836,39 @@ impl KeybindingEditorModal { editor }); + + let input_editor = editing_keybind.action_schema.clone().map(|_schema| { + cx.new(|cx| { + let mut editor = Editor::auto_height_unbounded(1, window, cx); + if let Some(input) = editing_keybind.action_input.clone() { + editor.set_text(input.text, window, cx); + } else { + // TODO: default value from schema? + editor.set_placeholder_text("Action input", cx); + } + cx.spawn(async |editor, cx| { + let json_language = load_json_language(workspace, cx).await; + editor + .update(cx, |editor, cx| { + if let Some(buffer) = editor.buffer().read(cx).as_singleton() { + buffer.update(cx, |buffer, cx| { + buffer.set_language(Some(json_language), cx) + }); + } + }) + .context("Failed to load JSON language for editing keybinding action input") + }) + .detach_and_log_err(cx); + editor + }) + }); + Self { editing_keybind, fs, keybind_editor, context_editor, + input_editor, error: None, } } @@ -964,13 +947,38 @@ impl Render for KeybindingEditorModal { ) .child(self.keybind_editor.clone()), ) + .when_some(self.input_editor.clone(), |this, editor| { + this.child( + v_flex() + .p_3() + .gap_3() + .child( + v_flex().child(Label::new("Edit Input")).child( + Label::new("Input the desired input to the binding.") + .color(Color::Muted), + ), + ) + .child( + div() + .w_full() + .border_color(cx.theme().colors().border_variant) + .border_1() + .py_2() + .px_3() + .min_h_8() + .rounded_md() + .bg(theme.editor_background) + .child(editor), + ), + ) + }) .child( v_flex() .p_3() .gap_3() .child( - v_flex().child(Label::new("Edit Keystroke")).child( - Label::new("Input the desired keystroke for the selected action.") + v_flex().child(Label::new("Edit Context")).child( + Label::new("Input the desired context for the binding.") .color(Color::Muted), ), ) @@ -1081,6 +1089,58 @@ impl CompletionProvider for KeyContextCompletionProvider { } } +async fn load_json_language(workspace: WeakEntity, cx: &mut AsyncApp) -> Arc { + let json_language_task = workspace + .read_with(cx, |workspace, cx| { + workspace + .project() + .read(cx) + .languages() + .language_for_name("JSON") + }) + .context("Failed to load JSON language") + .log_err(); + let json_language = match json_language_task { + Some(task) => task.await.context("Failed to load JSON language").log_err(), + None => None, + }; + return json_language.unwrap_or_else(|| { + Arc::new(Language::new( + LanguageConfig { + name: "JSON".into(), + ..Default::default() + }, + Some(tree_sitter_json::LANGUAGE.into()), + )) + }); +} + +async fn load_rust_language(workspace: WeakEntity, cx: &mut AsyncApp) -> Arc { + let rust_language_task = workspace + .read_with(cx, |workspace, cx| { + workspace + .project() + .read(cx) + .languages() + .language_for_name("Rust") + }) + .context("Failed to load Rust language") + .log_err(); + let rust_language = match rust_language_task { + Some(task) => task.await.context("Failed to load Rust language").log_err(), + None => None, + }; + return rust_language.unwrap_or_else(|| { + Arc::new(Language::new( + LanguageConfig { + name: "Rust".into(), + ..Default::default() + }, + Some(tree_sitter_rust::LANGUAGE.into()), + )) + }); +} + async fn save_keybinding_update( existing: ProcessedKeybinding, new_keystrokes: &[Keystroke], @@ -1113,7 +1173,7 @@ async fn save_keybinding_update( target: settings::KeybindUpdateTarget { context: existing_context, keystrokes: existing_keystrokes, - action_name: &existing.action, + action_name: &existing.action_name, use_key_equivalents: false, input, }, @@ -1124,7 +1184,7 @@ async fn save_keybinding_update( source: settings::KeybindUpdateTarget { context: new_context, keystrokes: new_keystrokes, - action_name: &existing.action, + action_name: &existing.action_name, use_key_equivalents: false, input, }, From 139af027377a0436a253cdc226c1aec5fed1d5af Mon Sep 17 00:00:00 2001 From: Dino Date: Tue, 8 Jul 2025 21:48:48 +0100 Subject: [PATCH 15/34] vim: Fix and improve horizontal scrolling (#33590) This Pull Request introduces various changes to the editor's horizontal scrolling, mostly focused on vim mode's horizontal scroll motions (`z l`, `z h`, `z shift-l`, `z shift-h`). In order to make it easier to review, the logical changes have been split into different sections. ## Cursor Position Update Changes introduced on https://github.com/zed-industries/zed/pull/32558 added both `z l` and `z h` to vim mode but it only scrolled the editor's content, without changing the cursor position. This doesn't reflect the actual behavior of those motions in vim, so these two commits tackled that, ensuring that the cursor position is updated, only when the cursor is on the left or right edges of the editor: - https://github.com/zed-industries/zed/commit/ea3b866a763ba0bcfc12999ee1741c6528c895b7 - https://github.com/zed-industries/zed/commit/805f41a913c6e86ef8be550d363a3cc2caeccbe9 ## Horizontal Autoscroll Fix After introducing the cursor position update to both `z l` and `z h` it was noted that there was a bug with using `z l`, followed by `0` and then `z l` again, as on the second use `z l` the cursor would not be updated. This would only happen on the first line in the editor, and it was concluded that it was because the `editor::scroll::autoscroll::Editor.autoscroll_horizontally` method was directly updating the scroll manager's anchor offset, instead of using the `editor::scroll::Editor.set_scroll_position_internal` method, like is being done by the vertical autoscroll (`editor::scroll::autoscroll::Editor.autoscroll_vertically`). This wouldn't update the scroll manager's anchor, which would still think it was at `(0, 1)` so the cursor position would not be updated. The changes in [this commit](https://github.com/zed-industries/zed/commit/3957f02e189018ef559cd28516f0b872026b0ce1) updated the horizontal autoscrolling method to also leverage `set_scroll_position_internal`. ## Visible Column Count & Page Width Scroll Amount The changes in https://github.com/zed-industries/zed/commit/d83652c3ae1d0356fd7dca7b8922a0116de39ff0 add a `visible_column_count` field to `editor::scroll::ScrollManager` struct, which allowed the introduction of the `ScrollAmount::PageWidth` enum. With these changes, two new actions are introduced, `vim::normal::scroll::HalfPageRight` and `vim::normal::scroll::HalfPageLeft` (in https://github.com/zed-industries/zed/commit/7f344304d56337654a34b1b461a1dc69defd2e4e), which move the editor half page to the right and half page to the left, as well as the cursor position, which have also been mapped to `z shift-l` and `z shift-h`, respectively. Closes #17219 Release Notes: - Improved `z l` and `z h` to actually move the cursor position, similar to vim's behavior - Added `z shift-l` and `z shift-h` to scroll half of the page width's to the right or to the left, respectively --------- Co-authored-by: Conrad Irwin --- assets/keymaps/vim.json | 2 + crates/editor/src/element.rs | 3 + crates/editor/src/scroll.rs | 82 ++++++++++++-- crates/editor/src/scroll/autoscroll.rs | 21 ++-- crates/editor/src/scroll/scroll_amount.rs | 7 +- crates/vim/src/normal/scroll.rs | 105 ++++++++++++++++-- .../vim/test_data/test_horizontal_scroll.json | 16 +++ 7 files changed, 209 insertions(+), 27 deletions(-) create mode 100644 crates/vim/test_data/test_horizontal_scroll.json diff --git a/assets/keymaps/vim.json b/assets/keymaps/vim.json index d90813e3d6..4b48b26ef4 100644 --- a/assets/keymaps/vim.json +++ b/assets/keymaps/vim.json @@ -189,6 +189,8 @@ "z shift-r": "editor::UnfoldAll", "z l": "vim::ColumnRight", "z h": "vim::ColumnLeft", + "z shift-l": "vim::HalfPageRight", + "z shift-h": "vim::HalfPageLeft", "shift-z shift-q": ["pane::CloseActiveItem", { "save_intent": "skip" }], "shift-z shift-z": ["pane::CloseActiveItem", { "save_intent": "save_all" }], // Count support diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 4c53d7f28a..a446338335 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -7944,6 +7944,7 @@ impl Element for EditorElement { editor.last_bounds = Some(bounds); editor.gutter_dimensions = gutter_dimensions; editor.set_visible_line_count(bounds.size.height / line_height, window, cx); + editor.set_visible_column_count(editor_content_width / em_advance); if matches!( editor.mode, @@ -8449,6 +8450,7 @@ impl Element for EditorElement { scroll_width, em_advance, &line_layouts, + window, cx, ) } else { @@ -8603,6 +8605,7 @@ impl Element for EditorElement { scroll_width, em_advance, &line_layouts, + window, cx, ) } else { diff --git a/crates/editor/src/scroll.rs b/crates/editor/src/scroll.rs index 0642b2b20e..b3007d3091 100644 --- a/crates/editor/src/scroll.rs +++ b/crates/editor/src/scroll.rs @@ -13,6 +13,7 @@ use crate::{ pub use autoscroll::{Autoscroll, AutoscrollStrategy}; use core::fmt::Debug; use gpui::{App, Axis, Context, Global, Pixels, Task, Window, point, px}; +use language::language_settings::{AllLanguageSettings, SoftWrap}; use language::{Bias, Point}; pub use scroll_amount::ScrollAmount; use settings::Settings; @@ -151,12 +152,16 @@ pub struct ScrollManager { pub(crate) vertical_scroll_margin: f32, anchor: ScrollAnchor, ongoing: OngoingScroll, + /// The second element indicates whether the autoscroll request is local + /// (true) or remote (false). Local requests are initiated by user actions, + /// while remote requests come from external sources. autoscroll_request: Option<(Autoscroll, bool)>, last_autoscroll: Option<(gpui::Point, f32, f32, AutoscrollStrategy)>, show_scrollbars: bool, hide_scrollbar_task: Option>, active_scrollbar: Option, visible_line_count: Option, + visible_column_count: Option, forbid_vertical_scroll: bool, minimap_thumb_state: Option, } @@ -173,6 +178,7 @@ impl ScrollManager { active_scrollbar: None, last_autoscroll: None, visible_line_count: None, + visible_column_count: None, forbid_vertical_scroll: false, minimap_thumb_state: None, } @@ -210,7 +216,7 @@ impl ScrollManager { window: &mut Window, cx: &mut Context, ) { - let (new_anchor, top_row) = if scroll_position.y <= 0. { + let (new_anchor, top_row) = if scroll_position.y <= 0. && scroll_position.x <= 0. { ( ScrollAnchor { anchor: Anchor::min(), @@ -218,6 +224,22 @@ impl ScrollManager { }, 0, ) + } else if scroll_position.y <= 0. { + let buffer_point = map + .clip_point( + DisplayPoint::new(DisplayRow(0), scroll_position.x as u32), + Bias::Left, + ) + .to_point(map); + let anchor = map.buffer_snapshot.anchor_at(buffer_point, Bias::Right); + + ( + ScrollAnchor { + anchor: anchor, + offset: scroll_position.max(&gpui::Point::default()), + }, + 0, + ) } else { let scroll_top = scroll_position.y; let scroll_top = match EditorSettings::get_global(cx).scroll_beyond_last_line { @@ -242,8 +264,13 @@ impl ScrollManager { } }; - let scroll_top_buffer_point = - DisplayPoint::new(DisplayRow(scroll_top as u32), 0).to_point(map); + let scroll_top_row = DisplayRow(scroll_top as u32); + let scroll_top_buffer_point = map + .clip_point( + DisplayPoint::new(scroll_top_row, scroll_position.x as u32), + Bias::Left, + ) + .to_point(map); let top_anchor = map .buffer_snapshot .anchor_at(scroll_top_buffer_point, Bias::Right); @@ -476,6 +503,10 @@ impl Editor { .map(|line_count| line_count as u32 - 1) } + pub fn visible_column_count(&self) -> Option { + self.scroll_manager.visible_column_count + } + pub(crate) fn set_visible_line_count( &mut self, lines: f32, @@ -497,6 +528,10 @@ impl Editor { } } + pub(crate) fn set_visible_column_count(&mut self, columns: f32) { + self.scroll_manager.visible_column_count = Some(columns); + } + pub fn apply_scroll_delta( &mut self, scroll_delta: gpui::Point, @@ -675,25 +710,48 @@ impl Editor { let Some(visible_line_count) = self.visible_line_count() else { return; }; + let Some(mut visible_column_count) = self.visible_column_count() else { + return; + }; + + // If the user has a preferred line length, and has the editor + // configured to wrap at the preferred line length, or bounded to it, + // use that value over the visible column count. This was mostly done so + // that tests could actually be written for vim's `z l`, `z h`, `z + // shift-l` and `z shift-h` commands, as there wasn't a good way to + // configure the editor to only display a certain number of columns. If + // that ever happens, this could probably be removed. + let settings = AllLanguageSettings::get_global(cx); + if matches!( + settings.defaults.soft_wrap, + SoftWrap::PreferredLineLength | SoftWrap::Bounded + ) { + if (settings.defaults.preferred_line_length as f32) < visible_column_count { + visible_column_count = settings.defaults.preferred_line_length as f32; + } + } // If the scroll position is currently at the left edge of the document // (x == 0.0) and the intent is to scroll right, the gutter's margin // should first be added to the current position, otherwise the cursor // will end at the column position minus the margin, which looks off. - if current_position.x == 0.0 && amount.columns() > 0. { + if current_position.x == 0.0 && amount.columns(visible_column_count) > 0. { if let Some(last_position_map) = &self.last_position_map { current_position.x += self.gutter_dimensions.margin / last_position_map.em_advance; } } - let new_position = - current_position + point(amount.columns(), amount.lines(visible_line_count)); + let new_position = current_position + + point( + amount.columns(visible_column_count), + amount.lines(visible_line_count), + ); self.set_scroll_position(new_position, window, cx); } /// Returns an ordering. The newest selection is: /// Ordering::Equal => on screen - /// Ordering::Less => above the screen - /// Ordering::Greater => below the screen + /// Ordering::Less => above or to the left of the screen + /// Ordering::Greater => below or to the right of the screen pub fn newest_selection_on_screen(&self, cx: &mut App) -> Ordering { let snapshot = self.display_map.update(cx, |map, cx| map.snapshot(cx)); let newest_head = self @@ -711,8 +769,12 @@ impl Editor { return Ordering::Less; } - if let Some(visible_lines) = self.visible_line_count() { - if newest_head.row() <= DisplayRow(screen_top.row().0 + visible_lines as u32) { + if let (Some(visible_lines), Some(visible_columns)) = + (self.visible_line_count(), self.visible_column_count()) + { + if newest_head.row() <= DisplayRow(screen_top.row().0 + visible_lines as u32) + && newest_head.column() <= screen_top.column() + visible_columns as u32 + { return Ordering::Equal; } } diff --git a/crates/editor/src/scroll/autoscroll.rs b/crates/editor/src/scroll/autoscroll.rs index 55998aa2fd..340277633a 100644 --- a/crates/editor/src/scroll/autoscroll.rs +++ b/crates/editor/src/scroll/autoscroll.rs @@ -274,12 +274,14 @@ impl Editor { start_row: DisplayRow, viewport_width: Pixels, scroll_width: Pixels, - max_glyph_width: Pixels, + em_advance: Pixels, layouts: &[LineWithInvisibles], + window: &mut Window, cx: &mut Context, ) -> bool { let display_map = self.display_map.update(cx, |map, cx| map.snapshot(cx)); let selections = self.selections.all::(cx); + let mut scroll_position = self.scroll_manager.scroll_position(&display_map); let mut target_left; let mut target_right; @@ -295,16 +297,17 @@ impl Editor { if head.row() >= start_row && head.row() < DisplayRow(start_row.0 + layouts.len() as u32) { - let start_column = head.column().saturating_sub(3); - let end_column = cmp::min(display_map.line_len(head.row()), head.column() + 3); + let start_column = head.column(); + let end_column = cmp::min(display_map.line_len(head.row()), head.column()); target_left = target_left.min( layouts[head.row().minus(start_row) as usize] - .x_for_index(start_column as usize), + .x_for_index(start_column as usize) + + self.gutter_dimensions.margin, ); target_right = target_right.max( layouts[head.row().minus(start_row) as usize] .x_for_index(end_column as usize) - + max_glyph_width, + + em_advance, ); } } @@ -319,14 +322,16 @@ impl Editor { return false; } - let scroll_left = self.scroll_manager.anchor.offset.x * max_glyph_width; + let scroll_left = self.scroll_manager.anchor.offset.x * em_advance; let scroll_right = scroll_left + viewport_width; if target_left < scroll_left { - self.scroll_manager.anchor.offset.x = target_left / max_glyph_width; + scroll_position.x = target_left / em_advance; + self.set_scroll_position_internal(scroll_position, true, true, window, cx); true } else if target_right > scroll_right { - self.scroll_manager.anchor.offset.x = (target_right - viewport_width) / max_glyph_width; + scroll_position.x = (target_right - viewport_width) / em_advance; + self.set_scroll_position_internal(scroll_position, true, true, window, cx); true } else { false diff --git a/crates/editor/src/scroll/scroll_amount.rs b/crates/editor/src/scroll/scroll_amount.rs index bc9d4757f1..b2af4f8e4f 100644 --- a/crates/editor/src/scroll/scroll_amount.rs +++ b/crates/editor/src/scroll/scroll_amount.rs @@ -23,6 +23,8 @@ pub enum ScrollAmount { Page(f32), // Scroll N columns (positive is towards the right of the document) Column(f32), + // Scroll N page width (positive is towards the right of the document) + PageWidth(f32), } impl ScrollAmount { @@ -37,14 +39,16 @@ impl ScrollAmount { (visible_line_count * count).trunc() } Self::Column(_count) => 0.0, + Self::PageWidth(_count) => 0.0, } } - pub fn columns(&self) -> f32 { + pub fn columns(&self, visible_column_count: f32) -> f32 { match self { Self::Line(_count) => 0.0, Self::Page(_count) => 0.0, Self::Column(count) => *count, + Self::PageWidth(count) => (visible_column_count * count).trunc(), } } @@ -58,6 +62,7 @@ impl ScrollAmount { // so I'm leaving this at 0.0 for now to try and make it clear that // this should not have an impact on that? ScrollAmount::Column(_) => px(0.0), + ScrollAmount::PageWidth(_) => px(0.0), } } diff --git a/crates/vim/src/normal/scroll.rs b/crates/vim/src/normal/scroll.rs index 150334376b..47b9fe92fd 100644 --- a/crates/vim/src/normal/scroll.rs +++ b/crates/vim/src/normal/scroll.rs @@ -7,6 +7,7 @@ use editor::{ use gpui::{Context, Window, actions}; use language::Bias; use settings::Settings; +use text::SelectionGoal; actions!( vim, @@ -26,7 +27,11 @@ actions!( /// Scrolls up by one page. PageUp, /// Scrolls down by one page. - PageDown + PageDown, + /// Scrolls right by half a page's width. + HalfPageRight, + /// Scrolls left by half a page's width. + HalfPageLeft, ] ); @@ -51,6 +56,16 @@ pub fn register(editor: &mut Editor, cx: &mut Context) { Vim::action(editor, cx, |vim, _: &PageUp, window, cx| { vim.scroll(false, window, cx, |c| ScrollAmount::Page(-c.unwrap_or(1.))) }); + Vim::action(editor, cx, |vim, _: &HalfPageRight, window, cx| { + vim.scroll(false, window, cx, |c| { + ScrollAmount::PageWidth(c.unwrap_or(0.5)) + }) + }); + Vim::action(editor, cx, |vim, _: &HalfPageLeft, window, cx| { + vim.scroll(false, window, cx, |c| { + ScrollAmount::PageWidth(-c.unwrap_or(0.5)) + }) + }); Vim::action(editor, cx, |vim, _: &ScrollDown, window, cx| { vim.scroll(true, window, cx, |c| { if let Some(c) = c { @@ -123,6 +138,10 @@ fn scroll_editor( return; }; + let Some(visible_column_count) = editor.visible_column_count() else { + return; + }; + let top_anchor = editor.scroll_manager.anchor().anchor; let vertical_scroll_margin = EditorSettings::get_global(cx).vertical_scroll_margin; @@ -132,8 +151,14 @@ fn scroll_editor( cx, |s| { s.move_with(|map, selection| { + // TODO: Improve the logic and function calls below to be dependent on + // the `amount`. If the amount is vertical, we don't care about + // columns, while if it's horizontal, we don't care about rows, + // so we don't need to calculate both and deal with logic for + // both. let mut head = selection.head(); let top = top_anchor.to_display_point(map); + let max_point = map.max_point(); let starting_column = head.column(); let vertical_scroll_margin = @@ -163,9 +188,8 @@ fn scroll_editor( (visible_line_count as u32).saturating_sub(1 + vertical_scroll_margin), ); // scroll off the end. - let max_row = if top.row().0 + visible_line_count as u32 >= map.max_point().row().0 - { - map.max_point().row() + let max_row = if top.row().0 + visible_line_count as u32 >= max_point.row().0 { + max_point.row() } else { DisplayRow( (top.row().0 + visible_line_count as u32) @@ -185,13 +209,52 @@ fn scroll_editor( } else { head.row() }; - let new_head = - map.clip_point(DisplayPoint::new(new_row, starting_column), Bias::Left); + + // The minimum column position that the cursor position can be + // at is either the scroll manager's anchor column, which is the + // left-most column in the visible area, or the scroll manager's + // old anchor column, in case the cursor position is being + // preserved. This is necessary for motions like `ctrl-d` in + // case there's not enough content to scroll half page down, in + // which case the scroll manager's anchor column will be the + // maximum column for the current line, so the minimum column + // would end up being the same as the maximum column. + let min_column = match preserve_cursor_position { + true => old_top_anchor.to_display_point(map).column(), + false => top.column(), + }; + + // As for the maximum column position, that should be either the + // right-most column in the visible area, which we can easily + // calculate by adding the visible column count to the minimum + // column position, or the right-most column in the current + // line, seeing as the cursor might be in a short line, in which + // case we don't want to go past its last column. + let max_row_column = map.line_len(new_row); + let max_column = match min_column + visible_column_count as u32 { + max_column if max_column >= max_row_column => max_row_column, + max_column => max_column, + }; + + // Ensure that the cursor's column stays within the visible + // area, otherwise clip it at either the left or right edge of + // the visible area. + let new_column = match (min_column, max_column) { + (min_column, _) if starting_column < min_column => min_column, + (_, max_column) if starting_column > max_column => max_column, + _ => starting_column, + }; + + let new_head = map.clip_point(DisplayPoint::new(new_row, new_column), Bias::Left); + let goal = match amount { + ScrollAmount::Column(_) | ScrollAmount::PageWidth(_) => SelectionGoal::None, + _ => selection.goal, + }; if selection.is_empty() { - selection.collapse_to(new_head, selection.goal) + selection.collapse_to(new_head, goal) } else { - selection.set_head(new_head, selection.goal) + selection.set_head(new_head, goal) }; }) }, @@ -472,4 +535,30 @@ mod test { cx.simulate_shared_keystrokes("ctrl-o").await; cx.shared_state().await.assert_matches(); } + + #[gpui::test] + async fn test_horizontal_scroll(cx: &mut gpui::TestAppContext) { + let mut cx = NeovimBackedTestContext::new(cx).await; + + cx.set_scroll_height(20).await; + cx.set_shared_wrap(12).await; + cx.set_neovim_option("nowrap").await; + + let content = "ˇ01234567890123456789"; + cx.set_shared_state(&content).await; + + cx.simulate_shared_keystrokes("z shift-l").await; + cx.shared_state().await.assert_eq("012345ˇ67890123456789"); + + // At this point, `z h` should not move the cursor as it should still be + // visible within the 12 column width. + cx.simulate_shared_keystrokes("z h").await; + cx.shared_state().await.assert_eq("012345ˇ67890123456789"); + + let content = "ˇ01234567890123456789"; + cx.set_shared_state(&content).await; + + cx.simulate_shared_keystrokes("z l").await; + cx.shared_state().await.assert_eq("0ˇ1234567890123456789"); + } } diff --git a/crates/vim/test_data/test_horizontal_scroll.json b/crates/vim/test_data/test_horizontal_scroll.json new file mode 100644 index 0000000000..c6cbac8be5 --- /dev/null +++ b/crates/vim/test_data/test_horizontal_scroll.json @@ -0,0 +1,16 @@ +{"SetOption":{"value":"scrolloff=3"}} +{"SetOption":{"value":"lines=22"}} +{"SetOption":{"value":"wrap"}} +{"SetOption":{"value":"columns=12"}} +{"SetOption":{"value":"nowrap"}} +{"Put":{"state":"ˇ01234567890123456789"}} +{"Key":"z"} +{"Key":"shift-l"} +{"Get":{"state":"012345ˇ67890123456789","mode":"Normal"}} +{"Key":"z"} +{"Key":"h"} +{"Get":{"state":"012345ˇ67890123456789","mode":"Normal"}} +{"Put":{"state":"ˇ01234567890123456789"}} +{"Key":"z"} +{"Key":"l"} +{"Get":{"state":"0ˇ1234567890123456789","mode":"Normal"}} From ad8b823555d6d2642a07d3256bc4c210de4b40b5 Mon Sep 17 00:00:00 2001 From: Danilo Leal <67129314+danilo-leal@users.noreply.github.com> Date: Tue, 8 Jul 2025 19:51:24 -0300 Subject: [PATCH 16/34] Improve the LSP popover menu design (#34081) - Add a slightly different bolt icon SVG so it sits better when with an indicator - Attempt to clarify what happens when clicking any of the menu items - Add descriptions to the tooltips to clarify what each indicator color means - Add section titles to clarify in which category each menu item is sitting on Release Notes: - N/A --- assets/icons/bolt_filled_alt.svg | 2 +- crates/language_tools/src/lsp_tool.rs | 65 ++++++++++++++++++++++----- 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/assets/icons/bolt_filled_alt.svg b/assets/icons/bolt_filled_alt.svg index 3c89387362..141e1c5f57 100644 --- a/assets/icons/bolt_filled_alt.svg +++ b/assets/icons/bolt_filled_alt.svg @@ -1,3 +1,3 @@ - + diff --git a/crates/language_tools/src/lsp_tool.rs b/crates/language_tools/src/lsp_tool.rs index 6cd2f83184..81cc38d33f 100644 --- a/crates/language_tools/src/lsp_tool.rs +++ b/crates/language_tools/src/lsp_tool.rs @@ -185,15 +185,18 @@ impl LanguageServerState { menu = menu.separator().item(button); continue; }; + let Some(server_info) = item.server_info() else { continue; }; + let workspace = self.workspace.clone(); let server_selector = server_info.server_selector(); // TODO currently, Zed remote does not work well with the LSP logs // https://github.com/zed-industries/zed/issues/28557 let has_logs = lsp_store.read(cx).as_local().is_some() && lsp_logs.read(cx).has_server_logs(&server_selector); + let status_color = server_info .binary_status .and_then(|binary_status| match binary_status.status { @@ -218,16 +221,40 @@ impl LanguageServerState { .other_servers_start_index .is_some_and(|index| index == i) { - menu = menu.separator(); + menu = menu.separator().header("Other Buffers"); } + + if i == 0 && self.other_servers_start_index.is_some() { + menu = menu.header("Current Buffer"); + } + menu = menu.item(ContextMenuItem::custom_entry( move |_, _| { h_flex() - .gap_1() + .group("menu_item") .w_full() - .child(Indicator::dot().color(status_color)) - .child(Label::new(server_info.name.0.clone())) - .when(!has_logs, |div| div.cursor_default()) + .gap_2() + .justify_between() + .child( + h_flex() + .gap_2() + .child(Indicator::dot().color(status_color)) + .child(Label::new(server_info.name.0.clone())), + ) + .child( + h_flex() + .visible_on_hover("menu_item") + .child( + Label::new("View Logs") + .size(LabelSize::Small) + .color(Color::Muted), + ) + .child( + Icon::new(IconName::ChevronRight) + .size(IconSize::Small) + .color(Color::Muted), + ), + ) .into_any_element() }, { @@ -836,17 +863,27 @@ impl Render for LspTool { } } - let indicator = if has_errors { - Some(Indicator::dot().color(Color::Error)) + let (indicator, description) = if has_errors { + ( + Some(Indicator::dot().color(Color::Error)), + "Server with errors", + ) } else if has_warnings { - Some(Indicator::dot().color(Color::Warning)) + ( + Some(Indicator::dot().color(Color::Warning)), + "Server with warnings", + ) } else if has_other_notifications { - Some(Indicator::dot().color(Color::Modified)) + ( + Some(Indicator::dot().color(Color::Modified)), + "Server with notifications", + ) } else { - None + (None, "All Servers Operational") }; let lsp_tool = cx.entity().clone(); + div().child( PopoverMenu::new("lsp-tool") .menu(move |_, cx| lsp_tool.read(cx).lsp_menu.clone()) @@ -858,7 +895,13 @@ impl Render for LspTool { .icon_size(IconSize::Small) .indicator_border_color(Some(cx.theme().colors().status_bar_background)), move |window, cx| { - Tooltip::for_action("Language Servers", &ToggleMenu, window, cx) + Tooltip::with_meta( + "Language Servers", + Some(&ToggleMenu), + description, + window, + cx, + ) }, ), ) From 3a247ee94760541906488b4145148964fce709a3 Mon Sep 17 00:00:00 2001 From: Smit Barmase Date: Wed, 9 Jul 2025 05:28:25 +0530 Subject: [PATCH 17/34] project panel: Add indent guides for sticky items (#34092) - Adds new trait `StickyItemsDecoration` in `sticky_items` which is implemented by `IndentGuides` from `indent_guides`. image Release Notes: - N/A --- crates/gpui/src/elements/uniform_list.rs | 29 -- crates/outline_panel/src/outline_panel.rs | 89 ++-- crates/project_panel/src/project_panel.rs | 151 +++--- crates/storybook/src/stories/indent_guides.rs | 38 +- crates/ui/src/components/indent_guides.rs | 461 ++++++++++-------- crates/ui/src/components/sticky_items.rs | 212 ++++++-- 6 files changed, 580 insertions(+), 400 deletions(-) diff --git a/crates/gpui/src/elements/uniform_list.rs b/crates/gpui/src/elements/uniform_list.rs index 342490b882..52e2015c20 100644 --- a/crates/gpui/src/elements/uniform_list.rs +++ b/crates/gpui/src/elements/uniform_list.rs @@ -506,35 +506,6 @@ pub trait UniformListDecoration { ) -> AnyElement; } -/// A trait for implementing top slots in a [`UniformList`]. -/// Top slots are elements that appear at the top of the list and can adjust -/// the visible range of list items. -pub trait UniformListTopSlot { - /// Returns elements to render at the top slot for the given visible range. - fn compute( - &mut self, - visible_range: Range, - window: &mut Window, - cx: &mut App, - ) -> SmallVec<[AnyElement; 8]>; - - /// Layout and prepaint the top slot elements. - fn prepaint( - &self, - elements: &mut SmallVec<[AnyElement; 8]>, - bounds: Bounds, - item_height: Pixels, - scroll_offset: Point, - padding: crate::Edges, - can_scroll_horizontally: bool, - window: &mut Window, - cx: &mut App, - ); - - /// Paint the top slot elements. - fn paint(&self, elements: &mut SmallVec<[AnyElement; 8]>, window: &mut Window, cx: &mut App); -} - impl UniformList { /// Selects a specific list item for measurement. pub fn with_width_from_item(mut self, item_index: Option) -> Self { diff --git a/crates/outline_panel/src/outline_panel.rs b/crates/outline_panel/src/outline_panel.rs index 05352e24de..12dcab9e87 100644 --- a/crates/outline_panel/src/outline_panel.rs +++ b/crates/outline_panel/src/outline_panel.rs @@ -4584,53 +4584,52 @@ impl OutlinePanel { .track_scroll(self.scroll_handle.clone()) .when(show_indent_guides, |list| { list.with_decoration( - ui::indent_guides( - cx.entity().clone(), - px(indent_size), - IndentGuideColors::panel(cx), - |outline_panel, range, _, _| { - let entries = outline_panel.cached_entries.get(range); - if let Some(entries) = entries { - entries.into_iter().map(|item| item.depth).collect() - } else { - smallvec::SmallVec::new() - } - }, - ) - .with_render_fn( - cx.entity().clone(), - move |outline_panel, params, _, _| { - const LEFT_OFFSET: Pixels = px(14.); + ui::indent_guides(px(indent_size), IndentGuideColors::panel(cx)) + .with_compute_indents_fn( + cx.entity().clone(), + |outline_panel, range, _, _| { + let entries = outline_panel.cached_entries.get(range); + if let Some(entries) = entries { + entries.into_iter().map(|item| item.depth).collect() + } else { + smallvec::SmallVec::new() + } + }, + ) + .with_render_fn( + cx.entity().clone(), + move |outline_panel, params, _, _| { + const LEFT_OFFSET: Pixels = px(14.); - let indent_size = params.indent_size; - let item_height = params.item_height; - let active_indent_guide_ix = find_active_indent_guide_ix( - outline_panel, - ¶ms.indent_guides, - ); + let indent_size = params.indent_size; + let item_height = params.item_height; + let active_indent_guide_ix = find_active_indent_guide_ix( + outline_panel, + ¶ms.indent_guides, + ); - params - .indent_guides - .into_iter() - .enumerate() - .map(|(ix, layout)| { - let bounds = Bounds::new( - point( - layout.offset.x * indent_size + LEFT_OFFSET, - layout.offset.y * item_height, - ), - size(px(1.), layout.length * item_height), - ); - ui::RenderedIndentGuide { - bounds, - layout, - is_active: active_indent_guide_ix == Some(ix), - hitbox: None, - } - }) - .collect() - }, - ), + params + .indent_guides + .into_iter() + .enumerate() + .map(|(ix, layout)| { + let bounds = Bounds::new( + point( + layout.offset.x * indent_size + LEFT_OFFSET, + layout.offset.y * item_height, + ), + size(px(1.), layout.length * item_height), + ); + ui::RenderedIndentGuide { + bounds, + layout, + is_active: active_indent_guide_ix == Some(ix), + hitbox: None, + } + }) + .collect() + }, + ), ) }) }; diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index bd0d5e3919..0ec9bac33f 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -3947,7 +3947,7 @@ impl ProjectPanel { false } }); - let shadow_color_top = hsla(0.0, 0.0, 0.0, 0.15); + let shadow_color_top = hsla(0.0, 0.0, 0.0, 0.1); let shadow_color_bottom = hsla(0.0, 0.0, 0.0, 0.); let sticky_shadow = div() .absolute() @@ -4176,6 +4176,16 @@ impl ProjectPanel { } } else if kind.is_dir() { this.marked_entries.clear(); + if is_sticky { + if let Some((_, _, index)) = this.index_for_entry(entry_id, worktree_id) { + let strategy = sticky_index + .map(ScrollStrategy::ToPosition) + .unwrap_or(ScrollStrategy::Top); + this.scroll_handle.scroll_to_item(index, strategy); + cx.notify(); + return; + } + } if event.modifiers().alt { this.toggle_expand_all(entry_id, window, cx); } else { @@ -4188,16 +4198,6 @@ impl ProjectPanel { let allow_preview = preview_tabs_enabled && click_count == 1; this.open_entry(entry_id, focus_opened_item, allow_preview, cx); } - - if is_sticky { - if let Some((_, _, index)) = this.index_for_entry(entry_id, worktree_id) { - let strategy = sticky_index - .map(ScrollStrategy::ToPosition) - .unwrap_or(ScrollStrategy::Top); - this.scroll_handle.scroll_to_item(index, strategy); - cx.notify(); - } - } }), ) .child( @@ -5167,52 +5167,51 @@ impl Render for ProjectPanel { }) .when(show_indent_guides, |list| { list.with_decoration( - ui::indent_guides( - cx.entity().clone(), - px(indent_size), - IndentGuideColors::panel(cx), - |this, range, window, cx| { - let mut items = - SmallVec::with_capacity(range.end - range.start); - this.iter_visible_entries( - range, - window, - cx, - |entry, _, entries, _, _| { - let (depth, _) = Self::calculate_depth_and_difference( - entry, entries, - ); - items.push(depth); - }, - ); - items - }, - ) - .on_click(cx.listener( - |this, active_indent_guide: &IndentGuideLayout, window, cx| { - if window.modifiers().secondary() { - let ix = active_indent_guide.offset.y; - let Some((target_entry, worktree)) = maybe!({ - let (worktree_id, entry) = this.entry_at_index(ix)?; - let worktree = this - .project - .read(cx) - .worktree_for_id(worktree_id, cx)?; - let target_entry = worktree - .read(cx) - .entry_for_path(&entry.path.parent()?)?; - Some((target_entry, worktree)) - }) else { - return; - }; + ui::indent_guides(px(indent_size), IndentGuideColors::panel(cx)) + .with_compute_indents_fn( + cx.entity().clone(), + |this, range, window, cx| { + let mut items = + SmallVec::with_capacity(range.end - range.start); + this.iter_visible_entries( + range, + window, + cx, + |entry, _, entries, _, _| { + let (depth, _) = + Self::calculate_depth_and_difference( + entry, entries, + ); + items.push(depth); + }, + ); + items + }, + ) + .on_click(cx.listener( + |this, active_indent_guide: &IndentGuideLayout, window, cx| { + if window.modifiers().secondary() { + let ix = active_indent_guide.offset.y; + let Some((target_entry, worktree)) = maybe!({ + let (worktree_id, entry) = + this.entry_at_index(ix)?; + let worktree = this + .project + .read(cx) + .worktree_for_id(worktree_id, cx)?; + let target_entry = worktree + .read(cx) + .entry_for_path(&entry.path.parent()?)?; + Some((target_entry, worktree)) + }) else { + return; + }; - this.collapse_entry(target_entry.clone(), worktree, cx); - } - }, - )) - .with_render_fn( - cx.entity().clone(), - move |this, params, _, cx| { + this.collapse_entry(target_entry.clone(), worktree, cx); + } + }, + )) + .with_render_fn(cx.entity().clone(), move |this, params, _, cx| { const LEFT_OFFSET: Pixels = px(14.); const PADDING_Y: Pixels = px(4.); const HITBOX_OVERDRAW: Pixels = px(3.); @@ -5260,12 +5259,11 @@ impl Render for ProjectPanel { } }) .collect() - }, - ), + }), ) }) .when(show_sticky_scroll, |list| { - list.with_decoration(ui::sticky_items( + let sticky_items = ui::sticky_items( cx.entity().clone(), |this, range, window, cx| { let mut items = SmallVec::with_capacity(range.end - range.start); @@ -5286,7 +5284,40 @@ impl Render for ProjectPanel { |this, marker_entry, window, cx| { this.render_sticky_entries(marker_entry, window, cx) }, - )) + ); + list.with_decoration(if show_indent_guides { + sticky_items.with_decoration( + ui::indent_guides(px(indent_size), IndentGuideColors::panel(cx)) + .with_render_fn(cx.entity().clone(), move |_, params, _, _| { + const LEFT_OFFSET: Pixels = px(14.); + + let indent_size = params.indent_size; + let item_height = params.item_height; + + params + .indent_guides + .into_iter() + .map(|layout| { + let bounds = Bounds::new( + point( + layout.offset.x * indent_size + LEFT_OFFSET, + layout.offset.y * item_height, + ), + size(px(1.), layout.length * item_height), + ); + ui::RenderedIndentGuide { + bounds, + layout, + is_active: false, + hitbox: None, + } + }) + .collect() + }), + ) + } else { + sticky_items + }) }) .size_full() .with_sizing_behavior(ListSizingBehavior::Infer) diff --git a/crates/storybook/src/stories/indent_guides.rs b/crates/storybook/src/stories/indent_guides.rs index e83c9ed383..e4f9669b1f 100644 --- a/crates/storybook/src/stories/indent_guides.rs +++ b/crates/storybook/src/stories/indent_guides.rs @@ -55,23 +55,27 @@ impl Render for IndentGuidesStory { }), ) .with_sizing_behavior(gpui::ListSizingBehavior::Infer) - .with_decoration(ui::indent_guides( - cx.entity().clone(), - px(16.), - ui::IndentGuideColors { - default: Color::Info.color(cx), - hover: Color::Accent.color(cx), - active: Color::Accent.color(cx), - }, - |this, range, _cx, _context| { - this.depths - .iter() - .skip(range.start) - .take(range.end - range.start) - .cloned() - .collect() - }, - )), + .with_decoration( + ui::indent_guides( + px(16.), + ui::IndentGuideColors { + default: Color::Info.color(cx), + hover: Color::Accent.color(cx), + active: Color::Accent.color(cx), + }, + ) + .with_compute_indents_fn( + cx.entity().clone(), + |this, range, _cx, _context| { + this.depths + .iter() + .skip(range.start) + .take(range.end - range.start) + .cloned() + .collect() + }, + ), + ), ), ) } diff --git a/crates/ui/src/components/indent_guides.rs b/crates/ui/src/components/indent_guides.rs index 6d4db984f9..e3dc1f35fa 100644 --- a/crates/ui/src/components/indent_guides.rs +++ b/crates/ui/src/components/indent_guides.rs @@ -1,8 +1,7 @@ use std::{cmp::Ordering, ops::Range, rc::Rc}; -use gpui::{ - AnyElement, App, Bounds, Entity, Hsla, Point, UniformListDecoration, fill, point, size, -}; +use gpui::{AnyElement, App, Bounds, Entity, Hsla, Point, fill, point, size}; +use gpui::{DispatchPhase, Hitbox, HitboxBehavior, MouseButton, MouseDownEvent, MouseMoveEvent}; use smallvec::SmallVec; use crate::prelude::*; @@ -32,7 +31,8 @@ impl IndentGuideColors { pub struct IndentGuides { colors: IndentGuideColors, indent_size: Pixels, - compute_indents_fn: Box, &mut Window, &mut App) -> SmallVec<[usize; 64]>>, + compute_indents_fn: + Option, &mut Window, &mut App) -> SmallVec<[usize; 64]>>>, render_fn: Option< Box< dyn Fn( @@ -45,25 +45,11 @@ pub struct IndentGuides { on_click: Option>, } -pub fn indent_guides( - entity: Entity, - indent_size: Pixels, - colors: IndentGuideColors, - compute_indents_fn: impl Fn( - &mut V, - Range, - &mut Window, - &mut Context, - ) -> SmallVec<[usize; 64]> - + 'static, -) -> IndentGuides { - let compute_indents_fn = Box::new(move |range, window: &mut Window, cx: &mut App| { - entity.update(cx, |this, cx| compute_indents_fn(this, range, window, cx)) - }); +pub fn indent_guides(indent_size: Pixels, colors: IndentGuideColors) -> IndentGuides { IndentGuides { colors, indent_size, - compute_indents_fn, + compute_indents_fn: None, render_fn: None, on_click: None, } @@ -79,6 +65,25 @@ impl IndentGuides { self } + /// Sets the function that computes indents for uniform list decoration. + pub fn with_compute_indents_fn( + mut self, + entity: Entity, + compute_indents_fn: impl Fn( + &mut V, + Range, + &mut Window, + &mut Context, + ) -> SmallVec<[usize; 64]> + + 'static, + ) -> Self { + let compute_indents_fn = Box::new(move |range, window: &mut Window, cx: &mut App| { + entity.update(cx, |this, cx| compute_indents_fn(this, range, window, cx)) + }); + self.compute_indents_fn = Some(compute_indents_fn); + self + } + /// Sets a custom callback that will be called when the indent guides need to be rendered. pub fn with_render_fn( mut self, @@ -97,6 +102,53 @@ impl IndentGuides { self.render_fn = Some(Box::new(render_fn)); self } + + fn render_from_layout( + &self, + indent_guides: SmallVec<[IndentGuideLayout; 12]>, + bounds: Bounds, + item_height: Pixels, + window: &mut Window, + cx: &mut App, + ) -> AnyElement { + let mut indent_guides = if let Some(ref custom_render) = self.render_fn { + let params = RenderIndentGuideParams { + indent_guides, + indent_size: self.indent_size, + item_height, + }; + custom_render(params, window, cx) + } else { + indent_guides + .into_iter() + .map(|layout| RenderedIndentGuide { + bounds: Bounds::new( + point( + layout.offset.x * self.indent_size, + layout.offset.y * item_height, + ), + size(px(1.), layout.length * item_height), + ), + layout, + is_active: false, + hitbox: None, + }) + .collect() + }; + for guide in &mut indent_guides { + guide.bounds.origin += bounds.origin; + if let Some(hitbox) = guide.hitbox.as_mut() { + hitbox.origin += bounds.origin; + } + } + + let indent_guides = IndentGuidesElement { + indent_guides: Rc::new(indent_guides), + colors: self.colors.clone(), + on_hovered_indent_guide_click: self.on_click.clone(), + }; + indent_guides.into_any_element() + } } /// Parameters for rendering indent guides. @@ -136,9 +188,7 @@ pub struct IndentGuideLayout { /// Implements the necessary functionality for rendering indent guides inside a uniform list. mod uniform_list { - use gpui::{ - DispatchPhase, Hitbox, HitboxBehavior, MouseButton, MouseDownEvent, MouseMoveEvent, - }; + use gpui::UniformListDecoration; use super::*; @@ -161,227 +211,212 @@ mod uniform_list { if includes_trailing_indent { visible_range.end += 1; } - let visible_entries = &(self.compute_indents_fn)(visible_range.clone(), window, cx); + let Some(ref compute_indents_fn) = self.compute_indents_fn else { + panic!("compute_indents_fn is required for UniformListDecoration"); + }; + let visible_entries = &compute_indents_fn(visible_range.clone(), window, cx); let indent_guides = compute_indent_guides( &visible_entries, visible_range.start, includes_trailing_indent, ); - let mut indent_guides = if let Some(ref custom_render) = self.render_fn { - let params = RenderIndentGuideParams { - indent_guides, - indent_size: self.indent_size, - item_height, - }; - custom_render(params, window, cx) - } else { - indent_guides - .into_iter() - .map(|layout| RenderedIndentGuide { - bounds: Bounds::new( - point( - layout.offset.x * self.indent_size, - layout.offset.y * item_height, - ), - size(px(1.), layout.length * item_height), - ), - layout, - is_active: false, - hitbox: None, - }) - .collect() - }; - for guide in &mut indent_guides { - guide.bounds.origin += bounds.origin; - if let Some(hitbox) = guide.hitbox.as_mut() { - hitbox.origin += bounds.origin; - } - } - - let indent_guides = IndentGuidesElement { - indent_guides: Rc::new(indent_guides), - colors: self.colors.clone(), - on_hovered_indent_guide_click: self.on_click.clone(), - }; - indent_guides.into_any_element() + self.render_from_layout(indent_guides, bounds, item_height, window, cx) } } +} - struct IndentGuidesElement { - colors: IndentGuideColors, - indent_guides: Rc>, - on_hovered_indent_guide_click: - Option>, - } +/// Implements the necessary functionality for rendering indent guides inside a sticky items. +mod sticky_items { + use crate::StickyItemsDecoration; - enum IndentGuidesElementPrepaintState { - Static, - Interactive { - hitboxes: Rc>, - on_hovered_indent_guide_click: Rc, - }, - } + use super::*; - impl Element for IndentGuidesElement { - type RequestLayoutState = (); - type PrepaintState = IndentGuidesElementPrepaintState; - - fn id(&self) -> Option { - None - } - - fn source_location(&self) -> Option<&'static core::panic::Location<'static>> { - None - } - - fn request_layout( - &mut self, - _id: Option<&gpui::GlobalElementId>, - _inspector_id: Option<&gpui::InspectorElementId>, + impl StickyItemsDecoration for IndentGuides { + fn compute( + &self, + indents: &SmallVec<[usize; 8]>, + bounds: Bounds, + _scroll_offset: Point, + item_height: Pixels, window: &mut Window, cx: &mut App, - ) -> (gpui::LayoutId, Self::RequestLayoutState) { - (window.request_layout(gpui::Style::default(), [], cx), ()) + ) -> AnyElement { + let indent_guides = compute_indent_guides(&indents, 0, false); + self.render_from_layout(indent_guides, bounds, item_height, window, cx) } + } +} - fn prepaint( - &mut self, - _id: Option<&gpui::GlobalElementId>, - _inspector_id: Option<&gpui::InspectorElementId>, - _bounds: Bounds, - _request_layout: &mut Self::RequestLayoutState, - window: &mut Window, - _cx: &mut App, - ) -> Self::PrepaintState { - if let Some(on_hovered_indent_guide_click) = self.on_hovered_indent_guide_click.clone() - { - let hitboxes = self - .indent_guides - .as_ref() - .iter() - .map(|guide| { - window.insert_hitbox( - guide.hitbox.unwrap_or(guide.bounds), - HitboxBehavior::Normal, - ) - }) - .collect(); - Self::PrepaintState::Interactive { - hitboxes: Rc::new(hitboxes), - on_hovered_indent_guide_click, - } - } else { - Self::PrepaintState::Static +struct IndentGuidesElement { + colors: IndentGuideColors, + indent_guides: Rc>, + on_hovered_indent_guide_click: Option>, +} + +enum IndentGuidesElementPrepaintState { + Static, + Interactive { + hitboxes: Rc>, + on_hovered_indent_guide_click: Rc, + }, +} + +impl Element for IndentGuidesElement { + type RequestLayoutState = (); + type PrepaintState = IndentGuidesElementPrepaintState; + + fn id(&self) -> Option { + None + } + + fn source_location(&self) -> Option<&'static core::panic::Location<'static>> { + None + } + + fn request_layout( + &mut self, + _id: Option<&gpui::GlobalElementId>, + _inspector_id: Option<&gpui::InspectorElementId>, + window: &mut Window, + cx: &mut App, + ) -> (gpui::LayoutId, Self::RequestLayoutState) { + (window.request_layout(gpui::Style::default(), [], cx), ()) + } + + fn prepaint( + &mut self, + _id: Option<&gpui::GlobalElementId>, + _inspector_id: Option<&gpui::InspectorElementId>, + _bounds: Bounds, + _request_layout: &mut Self::RequestLayoutState, + window: &mut Window, + _cx: &mut App, + ) -> Self::PrepaintState { + if let Some(on_hovered_indent_guide_click) = self.on_hovered_indent_guide_click.clone() { + let hitboxes = self + .indent_guides + .as_ref() + .iter() + .map(|guide| { + window + .insert_hitbox(guide.hitbox.unwrap_or(guide.bounds), HitboxBehavior::Normal) + }) + .collect(); + Self::PrepaintState::Interactive { + hitboxes: Rc::new(hitboxes), + on_hovered_indent_guide_click, } + } else { + Self::PrepaintState::Static } + } - fn paint( - &mut self, - _id: Option<&gpui::GlobalElementId>, - _inspector_id: Option<&gpui::InspectorElementId>, - _bounds: Bounds, - _request_layout: &mut Self::RequestLayoutState, - prepaint: &mut Self::PrepaintState, - window: &mut Window, - _cx: &mut App, - ) { - let current_view = window.current_view(); + fn paint( + &mut self, + _id: Option<&gpui::GlobalElementId>, + _inspector_id: Option<&gpui::InspectorElementId>, + _bounds: Bounds, + _request_layout: &mut Self::RequestLayoutState, + prepaint: &mut Self::PrepaintState, + window: &mut Window, + _cx: &mut App, + ) { + let current_view = window.current_view(); - match prepaint { - IndentGuidesElementPrepaintState::Static => { - for indent_guide in self.indent_guides.as_ref() { - let fill_color = if indent_guide.is_active { - self.colors.active - } else { - self.colors.default - }; + match prepaint { + IndentGuidesElementPrepaintState::Static => { + for indent_guide in self.indent_guides.as_ref() { + let fill_color = if indent_guide.is_active { + self.colors.active + } else { + self.colors.default + }; - window.paint_quad(fill(indent_guide.bounds, fill_color)); - } + window.paint_quad(fill(indent_guide.bounds, fill_color)); } - IndentGuidesElementPrepaintState::Interactive { - hitboxes, - on_hovered_indent_guide_click, - } => { - window.on_mouse_event({ - let hitboxes = hitboxes.clone(); - let indent_guides = self.indent_guides.clone(); - let on_hovered_indent_guide_click = on_hovered_indent_guide_click.clone(); - move |event: &MouseDownEvent, phase, window, cx| { - if phase == DispatchPhase::Bubble && event.button == MouseButton::Left { - let mut active_hitbox_ix = None; - for (i, hitbox) in hitboxes.iter().enumerate() { - if hitbox.is_hovered(window) { - active_hitbox_ix = Some(i); - break; - } - } - - let Some(active_hitbox_ix) = active_hitbox_ix else { - return; - }; - - let active_indent_guide = &indent_guides[active_hitbox_ix].layout; - on_hovered_indent_guide_click(active_indent_guide, window, cx); - - cx.stop_propagation(); - window.prevent_default(); - } - } - }); - let mut hovered_hitbox_id = None; - for (i, hitbox) in hitboxes.iter().enumerate() { - window.set_cursor_style(gpui::CursorStyle::PointingHand, hitbox); - let indent_guide = &self.indent_guides[i]; - let fill_color = if hitbox.is_hovered(window) { - hovered_hitbox_id = Some(hitbox.id); - self.colors.hover - } else if indent_guide.is_active { - self.colors.active - } else { - self.colors.default - }; - - window.paint_quad(fill(indent_guide.bounds, fill_color)); - } - - window.on_mouse_event({ - let prev_hovered_hitbox_id = hovered_hitbox_id; - let hitboxes = hitboxes.clone(); - move |_: &MouseMoveEvent, phase, window, cx| { - let mut hovered_hitbox_id = None; - for hitbox in hitboxes.as_ref() { + } + IndentGuidesElementPrepaintState::Interactive { + hitboxes, + on_hovered_indent_guide_click, + } => { + window.on_mouse_event({ + let hitboxes = hitboxes.clone(); + let indent_guides = self.indent_guides.clone(); + let on_hovered_indent_guide_click = on_hovered_indent_guide_click.clone(); + move |event: &MouseDownEvent, phase, window, cx| { + if phase == DispatchPhase::Bubble && event.button == MouseButton::Left { + let mut active_hitbox_ix = None; + for (i, hitbox) in hitboxes.iter().enumerate() { if hitbox.is_hovered(window) { - hovered_hitbox_id = Some(hitbox.id); + active_hitbox_ix = Some(i); break; } } - if phase == DispatchPhase::Capture { - // If the hovered hitbox has changed, we need to re-paint the indent guides. - match (prev_hovered_hitbox_id, hovered_hitbox_id) { - (Some(prev_id), Some(id)) => { - if prev_id != id { - cx.notify(current_view) - } - } - (None, Some(_)) => cx.notify(current_view), - (Some(_), None) => cx.notify(current_view), - (None, None) => {} - } + + let Some(active_hitbox_ix) = active_hitbox_ix else { + return; + }; + + let active_indent_guide = &indent_guides[active_hitbox_ix].layout; + on_hovered_indent_guide_click(active_indent_guide, window, cx); + + cx.stop_propagation(); + window.prevent_default(); + } + } + }); + let mut hovered_hitbox_id = None; + for (i, hitbox) in hitboxes.iter().enumerate() { + window.set_cursor_style(gpui::CursorStyle::PointingHand, hitbox); + let indent_guide = &self.indent_guides[i]; + let fill_color = if hitbox.is_hovered(window) { + hovered_hitbox_id = Some(hitbox.id); + self.colors.hover + } else if indent_guide.is_active { + self.colors.active + } else { + self.colors.default + }; + + window.paint_quad(fill(indent_guide.bounds, fill_color)); + } + + window.on_mouse_event({ + let prev_hovered_hitbox_id = hovered_hitbox_id; + let hitboxes = hitboxes.clone(); + move |_: &MouseMoveEvent, phase, window, cx| { + let mut hovered_hitbox_id = None; + for hitbox in hitboxes.as_ref() { + if hitbox.is_hovered(window) { + hovered_hitbox_id = Some(hitbox.id); + break; } } - }); - } + if phase == DispatchPhase::Capture { + // If the hovered hitbox has changed, we need to re-paint the indent guides. + match (prev_hovered_hitbox_id, hovered_hitbox_id) { + (Some(prev_id), Some(id)) => { + if prev_id != id { + cx.notify(current_view) + } + } + (None, Some(_)) => cx.notify(current_view), + (Some(_), None) => cx.notify(current_view), + (None, None) => {} + } + } + } + }); } } } +} - impl IntoElement for IndentGuidesElement { - type Element = Self; +impl IntoElement for IndentGuidesElement { + type Element = Self; - fn into_element(self) -> Self::Element { - self - } + fn into_element(self) -> Self::Element { + self } } diff --git a/crates/ui/src/components/sticky_items.rs b/crates/ui/src/components/sticky_items.rs index e98e3023d2..da6c14ff09 100644 --- a/crates/ui/src/components/sticky_items.rs +++ b/crates/ui/src/components/sticky_items.rs @@ -3,7 +3,7 @@ use std::{ops::Range, rc::Rc}; use gpui::{ AnyElement, App, AvailableSpace, Bounds, Context, Element, ElementId, Entity, GlobalElementId, InspectorElementId, IntoElement, LayoutId, Pixels, Point, Render, Style, UniformListDecoration, - Window, point, size, + Window, point, px, size, }; use smallvec::SmallVec; @@ -11,10 +11,10 @@ pub trait StickyCandidate { fn depth(&self) -> usize; } -#[derive(Clone)] pub struct StickyItems { compute_fn: Rc, &mut Window, &mut App) -> SmallVec<[T; 8]>>, render_fn: Rc SmallVec<[AnyElement; 8]>>, + decorations: Vec>, } pub fn sticky_items( @@ -44,11 +44,26 @@ where StickyItems { compute_fn, render_fn, + decorations: Vec::new(), + } +} + +impl StickyItems +where + T: StickyCandidate + Clone + 'static, +{ + /// Adds a decoration element to the sticky items. + pub fn with_decoration(mut self, decoration: impl StickyItemsDecoration + 'static) -> Self { + self.decorations.push(Box::new(decoration)); + self } } struct StickyItemsElement { - elements: SmallVec<[AnyElement; 8]>, + drifting_element: Option, + drifting_decoration: Option, + rest_elements: SmallVec<[AnyElement; 8]>, + rest_decorations: SmallVec<[AnyElement; 1]>, } impl IntoElement for StickyItemsElement { @@ -103,8 +118,16 @@ impl Element for StickyItemsElement { window: &mut Window, cx: &mut App, ) { - // reverse so that last item is bottom most among sticky items - for item in self.elements.iter_mut().rev() { + if let Some(ref mut drifting_element) = self.drifting_element { + drifting_element.paint(window, cx); + } + if let Some(ref mut drifting_decoration) = self.drifting_decoration { + drifting_decoration.paint(window, cx); + } + for item in self.rest_elements.iter_mut().rev() { + item.paint(window, cx); + } + for item in self.rest_decorations.iter_mut() { item.paint(window, cx); } } @@ -125,11 +148,14 @@ where cx: &mut App, ) -> AnyElement { let entries = (self.compute_fn)(visible_range.clone(), window, cx); - let mut elements = SmallVec::new(); - let mut anchor_entry = None; + struct StickyAnchor { + entry: T, + index: usize, + } + + let mut sticky_anchor = None; let mut last_item_is_drifting = false; - let mut anchor_index = None; let mut iter = entries.iter().enumerate().peekable(); while let Some((ix, current_entry)) = iter.next() { @@ -137,7 +163,10 @@ where let index_in_range = ix; if current_depth < index_in_range { - anchor_entry = Some(current_entry.clone()); + sticky_anchor = Some(StickyAnchor { + entry: current_entry.clone(), + index: visible_range.start + ix, + }); break; } @@ -146,44 +175,155 @@ where if next_depth < current_depth && next_depth < index_in_range { last_item_is_drifting = true; - anchor_index = Some(visible_range.start + ix); - anchor_entry = Some(current_entry.clone()); + sticky_anchor = Some(StickyAnchor { + entry: current_entry.clone(), + index: visible_range.start + ix, + }); break; } } } - if let Some(anchor_entry) = anchor_entry { - elements = (self.render_fn)(anchor_entry, window, cx); - let items_count = elements.len(); + let Some(sticky_anchor) = sticky_anchor else { + return StickyItemsElement { + drifting_element: None, + drifting_decoration: None, + rest_elements: SmallVec::new(), + rest_decorations: SmallVec::new(), + } + .into_any_element(); + }; - for (ix, element) in elements.iter_mut().enumerate() { - let mut item_y_offset = None; - if ix == items_count - 1 && last_item_is_drifting { - if let Some(anchor_index) = anchor_index { - let scroll_top = -scroll_offset.y; - let anchor_top = item_height * anchor_index; - let sticky_area_height = item_height * items_count; - item_y_offset = - Some((anchor_top - scroll_top - sticky_area_height).min(Pixels::ZERO)); - }; - } + let anchor_depth = sticky_anchor.entry.depth(); + let mut elements = (self.render_fn)(sticky_anchor.entry, window, cx); + let items_count = elements.len(); - let sticky_origin = bounds.origin - + point( - -scroll_offset.x, - -scroll_offset.y + item_height * ix + item_y_offset.unwrap_or(Pixels::ZERO), - ); + let indents: SmallVec<[usize; 8]> = { + elements + .iter() + .enumerate() + .map(|(ix, _)| anchor_depth.saturating_sub(items_count.saturating_sub(ix))) + .collect() + }; - let available_space = size( - AvailableSpace::Definite(bounds.size.width), - AvailableSpace::Definite(item_height), + let mut last_decoration_element = None; + let mut rest_decoration_elements = SmallVec::new(); + + let available_space = size( + AvailableSpace::Definite(bounds.size.width), + AvailableSpace::Definite(bounds.size.height), + ); + + let drifting_y_offset = if last_item_is_drifting { + let scroll_top = -scroll_offset.y; + let anchor_top = item_height * sticky_anchor.index; + let sticky_area_height = item_height * items_count; + (anchor_top - scroll_top - sticky_area_height).min(Pixels::ZERO) + } else { + Pixels::ZERO + }; + + let (drifting_indent, rest_indents) = if last_item_is_drifting && !indents.is_empty() { + let last = indents[indents.len() - 1]; + let rest: SmallVec<[usize; 8]> = indents[..indents.len() - 1].iter().copied().collect(); + (Some(last), rest) + } else { + (None, indents) + }; + + for decoration in &self.decorations { + if let Some(drifting_indent) = drifting_indent { + let drifting_indent_vec: SmallVec<[usize; 8]> = + [drifting_indent].into_iter().collect(); + let sticky_origin = bounds.origin - scroll_offset + + point(px(0.), item_height * rest_indents.len() + drifting_y_offset); + let decoration_bounds = Bounds::new(sticky_origin, bounds.size); + + let mut drifting_dec = decoration.as_ref().compute( + &drifting_indent_vec, + decoration_bounds, + scroll_offset, + item_height, + window, + cx, ); - element.layout_as_root(available_space, window, cx); - element.prepaint_at(sticky_origin, window, cx); + drifting_dec.layout_as_root(available_space, window, cx); + drifting_dec.prepaint_at(sticky_origin, window, cx); + last_decoration_element = Some(drifting_dec); + } + + if !rest_indents.is_empty() { + let decoration_bounds = Bounds::new(bounds.origin - scroll_offset, bounds.size); + let mut rest_dec = decoration.as_ref().compute( + &rest_indents, + decoration_bounds, + scroll_offset, + item_height, + window, + cx, + ); + rest_dec.layout_as_root(available_space, window, cx); + rest_dec.prepaint_at(bounds.origin, window, cx); + rest_decoration_elements.push(rest_dec); } } - StickyItemsElement { elements }.into_any_element() + let (mut drifting_element, mut rest_elements) = + if last_item_is_drifting && !elements.is_empty() { + let last = elements.pop().unwrap(); + (Some(last), elements) + } else { + (None, elements) + }; + + for (ix, element) in rest_elements.iter_mut().enumerate() { + let sticky_origin = bounds.origin - scroll_offset + point(px(0.), item_height * ix); + let element_available_space = size( + AvailableSpace::Definite(bounds.size.width), + AvailableSpace::Definite(item_height), + ); + + element.layout_as_root(element_available_space, window, cx); + element.prepaint_at(sticky_origin, window, cx); + } + + if let Some(ref mut drifting_element) = drifting_element { + let sticky_origin = bounds.origin - scroll_offset + + point( + px(0.), + item_height * rest_elements.len() + drifting_y_offset, + ); + let element_available_space = size( + AvailableSpace::Definite(bounds.size.width), + AvailableSpace::Definite(item_height), + ); + + drifting_element.layout_as_root(element_available_space, window, cx); + drifting_element.prepaint_at(sticky_origin, window, cx); + } + + StickyItemsElement { + drifting_element, + drifting_decoration: last_decoration_element, + rest_elements, + rest_decorations: rest_decoration_elements, + } + .into_any_element() } } + +/// A decoration for a [`StickyItems`]. This can be used for various things, +/// such as rendering indent guides, or other visual effects. +pub trait StickyItemsDecoration { + /// Compute the decoration element, given the visible range of list items, + /// the bounds of the list, and the height of each item. + fn compute( + &self, + indents: &SmallVec<[usize; 8]>, + bounds: Bounds, + scroll_offset: Point, + item_height: Pixels, + window: &mut Window, + cx: &mut App, + ) -> AnyElement; +} From df57754baf64b118972ee3c42f68a0acc23989ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=B0=8F=E7=99=BD?= <364772080@qq.com> Date: Wed, 9 Jul 2025 08:57:03 +0800 Subject: [PATCH 18/34] windows: Publish nightly (#24800) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The installer, uninstaller, and the Zed binary files are all signed using Microsoft’s newly launched Trusted Signing service. For demonstration purposes, I have used my own account for the signing process. For more information about Trusted Signing, you can refer to the following links: - [Microsoft Security Blog: Trusted Signing is in Public Preview](https://techcommunity.microsoft.com/blog/microsoft-security-blog/trusted-signing-is-in-public-preview/4103457) - [Overview of Azure Trusted Signing](https://learn.microsoft.com/en-us/azure/trusted-signing/overview) **TODO:** - [x] `InnoSetup` script to setup an installer - [x] Signing process - [x] `Open with Zed` in right click context menu (by using sparse package) - [x] Integrate with `cli` - [x] Implement `cli` (#25412) - [x] Pack `cli.exe` into installer - [x] Implement auto updating (#25734) - [x] Pack autoupdater helper into installer - [x] Implement dock menus - [x] Add `Recent Documents` entries (#26369) - [x] Make `zed.exe` aware of sigle instance (#25412) - [x] Properly handle dock menu events (#26010) - [x] Handle `zed://***` uri **Materials needed:** - [ ] Icons - [ ] App icon for all channels (#9571) - [ ] Associated file icons, at minimum a default icon ([example](https://github.com/microsoft/vscode/tree/main/resources/win32)) - [ ] Logos for installer wizard - [ ] Icons for appx - [x] Code signing - [x] Secrets: AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, ACCOUNT_NAME, CERT_PROFILE_NAME - [x] Other constants: ENDPOINT, Identity Signature (i.e. `CN=Junkui Zhang, O=Junkui Zhang, L=Wuhan, S=Hubei, C=CN`) ![屏幕截图 2025-02-13 205132](https://github.com/user-attachments/assets/925ec5b2-c8f4-4f0e-8666-26e30278eb3d) https://github.com/user-attachments/assets/4f1092b4-90fc-4a47-a868-8f2f1a5d8ad8 Release Notes: - N/A --------- Co-authored-by: Kate Co-authored-by: localcc Co-authored-by: Peter Tripp Co-authored-by: Max Brunsfeld --- .cargo/config.toml | 2 + .../install_trusted_signing/action.yml | 64 + .github/workflows/ci.yml | 75 +- .github/workflows/release_nightly.yml | 71 + Cargo.lock | 10 + Cargo.toml | 3 + crates/auto_update/src/auto_update.rs | 2 +- crates/auto_update_helper/app-icon.ico | Bin 0 -> 590611 bytes crates/cli/src/main.rs | 7 + .../AppxManifest-Nightly.xml | 78 + .../AppxManifest-Preview.xml | 78 + .../AppxManifest.xml | 79 + crates/explorer_command_injector/Cargo.toml | 28 + crates/explorer_command_injector/LICENSE-GPL | 1 + .../src/explorer_command_injector.rs | 201 +++ crates/gpui/Cargo.toml | 2 +- crates/zed/build.rs | 12 +- crates/zed/resources/windows/app-icon-dev.ico | Bin 0 -> 156580 bytes .../resources/windows/app-icon-nightly.ico | Bin 0 -> 159619 bytes .../resources/windows/app-icon-preview.ico | Bin 0 -> 155339 bytes .../windows/messages/Default.zh-cn.isl | 403 +++++ crates/zed/resources/windows/messages/en.isl | 15 + .../zed/resources/windows/messages/zh-cn.isl | 9 + crates/zed/resources/windows/sign.ps1 | 53 + crates/zed/resources/windows/zed.iss | 1412 +++++++++++++++++ script/bundle-windows.ps1 | 263 +++ script/clear-target-dir-if-larger-than.ps1 | 2 +- script/determine-release-channel.ps1 | 37 + script/get-crate-version.ps1 | 16 + script/lib/blob-store.ps1 | 68 + script/lib/workspace.ps1 | 6 + script/upload-nightly.ps1 | 60 + typos.toml | 2 + 33 files changed, 3040 insertions(+), 19 deletions(-) create mode 100644 .github/actions/install_trusted_signing/action.yml create mode 100644 crates/explorer_command_injector/AppxManifest-Nightly.xml create mode 100644 crates/explorer_command_injector/AppxManifest-Preview.xml create mode 100644 crates/explorer_command_injector/AppxManifest.xml create mode 100644 crates/explorer_command_injector/Cargo.toml create mode 120000 crates/explorer_command_injector/LICENSE-GPL create mode 100644 crates/explorer_command_injector/src/explorer_command_injector.rs create mode 100644 crates/zed/resources/windows/app-icon-dev.ico create mode 100644 crates/zed/resources/windows/app-icon-nightly.ico create mode 100644 crates/zed/resources/windows/app-icon-preview.ico create mode 100644 crates/zed/resources/windows/messages/Default.zh-cn.isl create mode 100644 crates/zed/resources/windows/messages/en.isl create mode 100644 crates/zed/resources/windows/messages/zh-cn.isl create mode 100644 crates/zed/resources/windows/sign.ps1 create mode 100644 crates/zed/resources/windows/zed.iss create mode 100644 script/bundle-windows.ps1 create mode 100644 script/determine-release-channel.ps1 create mode 100644 script/get-crate-version.ps1 create mode 100644 script/lib/blob-store.ps1 create mode 100644 script/lib/workspace.ps1 create mode 100644 script/upload-nightly.ps1 diff --git a/.cargo/config.toml b/.cargo/config.toml index 717c5e18c8..8db58d2380 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -19,6 +19,8 @@ rustflags = [ "windows_slim_errors", # This cfg will reduce the size of `windows::core::Error` from 16 bytes to 4 bytes "-C", "target-feature=+crt-static", # This fixes the linking issue when compiling livekit on Windows + "-C", + "link-arg=-fuse-ld=lld", ] [env] diff --git a/.github/actions/install_trusted_signing/action.yml b/.github/actions/install_trusted_signing/action.yml new file mode 100644 index 0000000000..a99ff08eb1 --- /dev/null +++ b/.github/actions/install_trusted_signing/action.yml @@ -0,0 +1,64 @@ +name: "Trusted Signing on Windows" +description: "Install trusted signing on Windows." + +# Modified from https://github.com/Azure/trusted-signing-action +runs: + using: "composite" + steps: + - name: Set variables + id: set-variables + shell: "pwsh" + run: | + $defaultPath = $env:PSModulePath -split ';' | Select-Object -First 1 + "PSMODULEPATH=$defaultPath" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + + "TRUSTED_SIGNING_MODULE_VERSION=0.5.3" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + "BUILD_TOOLS_NUGET_VERSION=10.0.22621.3233" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + "TRUSTED_SIGNING_NUGET_VERSION=1.0.53" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + "DOTNET_SIGNCLI_NUGET_VERSION=0.9.1-beta.24469.1" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + + - name: Cache TrustedSigning PowerShell module + id: cache-module + uses: actions/cache@v4 + env: + cache-name: cache-module + with: + path: ${{ steps.set-variables.outputs.PSMODULEPATH }}\TrustedSigning\${{ steps.set-variables.outputs.TRUSTED_SIGNING_MODULE_VERSION }} + key: TrustedSigning-${{ steps.set-variables.outputs.TRUSTED_SIGNING_MODULE_VERSION }} + if: ${{ inputs.cache-dependencies == 'true' }} + + - name: Cache Microsoft.Windows.SDK.BuildTools NuGet package + id: cache-buildtools + uses: actions/cache@v4 + env: + cache-name: cache-buildtools + with: + path: ~\AppData\Local\TrustedSigning\Microsoft.Windows.SDK.BuildTools\Microsoft.Windows.SDK.BuildTools.${{ steps.set-variables.outputs.BUILD_TOOLS_NUGET_VERSION }} + key: Microsoft.Windows.SDK.BuildTools-${{ steps.set-variables.outputs.BUILD_TOOLS_NUGET_VERSION }} + if: ${{ inputs.cache-dependencies == 'true' }} + + - name: Cache Microsoft.Trusted.Signing.Client NuGet package + id: cache-tsclient + uses: actions/cache@v4 + env: + cache-name: cache-tsclient + with: + path: ~\AppData\Local\TrustedSigning\Microsoft.Trusted.Signing.Client\Microsoft.Trusted.Signing.Client.${{ steps.set-variables.outputs.TRUSTED_SIGNING_NUGET_VERSION }} + key: Microsoft.Trusted.Signing.Client-${{ steps.set-variables.outputs.TRUSTED_SIGNING_NUGET_VERSION }} + if: ${{ inputs.cache-dependencies == 'true' }} + + - name: Cache SignCli NuGet package + id: cache-signcli + uses: actions/cache@v4 + env: + cache-name: cache-signcli + with: + path: ~\AppData\Local\TrustedSigning\sign\sign.${{ steps.set-variables.outputs.DOTNET_SIGNCLI_NUGET_VERSION }} + key: SignCli-${{ steps.set-variables.outputs.DOTNET_SIGNCLI_NUGET_VERSION }} + if: ${{ inputs.cache-dependencies == 'true' }} + + - name: Install Trusted Signing module + shell: "pwsh" + run: | + Install-Module -Name TrustedSigning -RequiredVersion ${{ steps.set-variables.outputs.TRUSTED_SIGNING_MODULE_VERSION }} -Force -Repository PSGallery + if: ${{ inputs.cache-dependencies != 'true' || steps.cache-module.outputs.cache-hit != 'true' }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 84c7a96828..25a1ed8670 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -411,11 +411,10 @@ jobs: with: clean: false - - name: Setup Cargo and Rustup + - name: Configure CI run: | - mkdir -p ${{ env.CARGO_HOME }} -ErrorAction Ignore - cp ./.cargo/ci-config.toml ${{ env.CARGO_HOME }}/config.toml - .\script\install-rustup.ps1 + New-Item -ItemType Directory -Path "./../.cargo" -Force + Copy-Item -Path "./.cargo/ci-config.toml" -Destination "./../.cargo/config.toml" - name: cargo clippy run: | @@ -430,18 +429,9 @@ jobs: - name: Limit target directory size run: ./script/clear-target-dir-if-larger-than.ps1 250 - # - name: Check dev drive space - # working-directory: ${{ env.ZED_WORKSPACE }} - # # `setup-dev-driver.ps1` creates a 100GB drive, with CI taking up ~45GB of the drive. - # run: ./script/exit-ci-if-dev-drive-is-full.ps1 95 - - # Since the Windows runners are stateful, so we need to remove the config file to prevent potential bug. - name: Clean CI config file if: always() - run: | - if (Test-Path "${{ env.CARGO_HOME }}/config.toml") { - Remove-Item -Path "${{ env.CARGO_HOME }}/config.toml" -Force - } + run: Remove-Item -Recurse -Path "./../.cargo" -Force -ErrorAction SilentlyContinue tests_pass: name: Tests Pass @@ -763,12 +753,67 @@ jobs: # excludes the final package to only cache dependencies cachix-filter: "-zed-editor-[0-9.]*-nightly" + bundle-windows-x64: + timeout-minutes: 120 + name: Create a Windows installer + runs-on: [self-hosted, Windows, X64] + if: ${{ startsWith(github.ref, 'refs/tags/v') || contains(github.event.pull_request.labels.*.name, 'run-bundling') }} + needs: [windows_tests] + env: + AZURE_TENANT_ID: ${{ secrets.AZURE_SIGNING_TENANT_ID }} + AZURE_CLIENT_ID: ${{ secrets.AZURE_SIGNING_CLIENT_ID }} + AZURE_CLIENT_SECRET: ${{ secrets.AZURE_SIGNING_CLIENT_SECRET }} + ACCOUNT_NAME: ${{ vars.AZURE_SIGNING_ACCOUNT_NAME }} + CERT_PROFILE_NAME: ${{ vars.AZURE_SIGNING_CERT_PROFILE_NAME }} + ENDPOINT: ${{ vars.AZURE_SIGNING_ENDPOINT }} + DIGITALOCEAN_SPACES_ACCESS_KEY: ${{ secrets.DIGITALOCEAN_SPACES_ACCESS_KEY }} + DIGITALOCEAN_SPACES_SECRET_KEY: ${{ secrets.DIGITALOCEAN_SPACES_SECRET_KEY }} + FILE_DIGEST: SHA256 + TIMESTAMP_DIGEST: SHA256 + TIMESTAMP_SERVER: "http://timestamp.acs.microsoft.com" + steps: + - name: Checkout repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + clean: false + + - name: Determine version and release channel + working-directory: ${{ env.ZED_WORKSPACE }} + if: ${{ startsWith(github.ref, 'refs/tags/v') }} + run: | + # This exports RELEASE_CHANNEL into env (GITHUB_ENV) + script/determine-release-channel.ps1 + + - name: Install trusted signing + uses: ./.github/actions/install_trusted_signing + + - name: Build Zed installer + working-directory: ${{ env.ZED_WORKSPACE }} + run: script/bundle-windows.ps1 + + - name: Upload installer (x86_64) to Workflow - zed (run-bundling) + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + if: contains(github.event.pull_request.labels.*.name, 'run-bundling') + with: + name: ZedEditorUserSetup-x64-${{ github.event.pull_request.head.sha || github.sha }}.exe + path: ${{ env.SETUP_PATH }} + + - name: Upload Artifacts to release + uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 # v1 + if: ${{ !(contains(github.event.pull_request.labels.*.name, 'run-bundling')) && env.RELEASE_CHANNEL == 'preview' }} # upload only preview + with: + draft: true + prerelease: ${{ env.RELEASE_CHANNEL == 'preview' }} + files: ${{ env.SETUP_PATH }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + auto-release-preview: name: Auto release preview if: | startsWith(github.ref, 'refs/tags/v') && endsWith(github.ref, '-pre') && !endsWith(github.ref, '.0-pre') - needs: [bundle-mac, bundle-linux-x86_x64, bundle-linux-aarch64, freebsd] + needs: [bundle-mac, bundle-linux-x86_x64, bundle-linux-aarch64, bundle-windows-x64, freebsd] runs-on: - self-hosted - bundle diff --git a/.github/workflows/release_nightly.yml b/.github/workflows/release_nightly.yml index d9287cb082..df9f6ef40f 100644 --- a/.github/workflows/release_nightly.yml +++ b/.github/workflows/release_nightly.yml @@ -51,6 +51,32 @@ jobs: - name: Run tests uses: ./.github/actions/run_tests + windows-tests: + timeout-minutes: 60 + name: Run tests on Windows + if: github.repository_owner == 'zed-industries' + runs-on: [self-hosted, Windows, X64] + steps: + - name: Checkout repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + clean: false + + - name: Configure CI + run: | + New-Item -ItemType Directory -Path "./../.cargo" -Force + Copy-Item -Path "./.cargo/ci-config.toml" -Destination "./../.cargo/config.toml" + + - name: Run tests + uses: ./.github/actions/run_tests_windows + + - name: Limit target directory size + run: ./script/clear-target-dir-if-larger-than.ps1 1024 + + - name: Clean CI config file + if: always() + run: Remove-Item -Recurse -Path "./../.cargo" -Force -ErrorAction SilentlyContinue + bundle-mac: timeout-minutes: 60 name: Create a macOS bundle @@ -213,10 +239,54 @@ jobs: bundle-nix: name: Build and cache Nix package + if: false needs: tests secrets: inherit uses: ./.github/workflows/nix.yml + bundle-windows-x64: + timeout-minutes: 60 + name: Create a Windows installer + if: github.repository_owner == 'zed-industries' + runs-on: [self-hosted, Windows, X64] + needs: windows-tests + env: + AZURE_TENANT_ID: ${{ secrets.AZURE_SIGNING_TENANT_ID }} + AZURE_CLIENT_ID: ${{ secrets.AZURE_SIGNING_CLIENT_ID }} + AZURE_CLIENT_SECRET: ${{ secrets.AZURE_SIGNING_CLIENT_SECRET }} + ACCOUNT_NAME: ${{ vars.AZURE_SIGNING_ACCOUNT_NAME }} + CERT_PROFILE_NAME: ${{ vars.AZURE_SIGNING_CERT_PROFILE_NAME }} + ENDPOINT: ${{ vars.AZURE_SIGNING_ENDPOINT }} + DIGITALOCEAN_SPACES_ACCESS_KEY: ${{ secrets.DIGITALOCEAN_SPACES_ACCESS_KEY }} + DIGITALOCEAN_SPACES_SECRET_KEY: ${{ secrets.DIGITALOCEAN_SPACES_SECRET_KEY }} + FILE_DIGEST: SHA256 + TIMESTAMP_DIGEST: SHA256 + TIMESTAMP_SERVER: "http://timestamp.acs.microsoft.com" + steps: + - name: Checkout repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + clean: false + + - name: Set release channel to nightly + working-directory: ${{ env.ZED_WORKSPACE }} + run: | + $ErrorActionPreference = "Stop" + $version = git rev-parse --short HEAD + Write-Host "Publishing version: $version on release channel nightly" + "nightly" | Set-Content -Path "crates/zed/RELEASE_CHANNEL" + + - name: Install trusted signing + uses: ./.github/actions/install_trusted_signing + + - name: Build Zed installer + working-directory: ${{ env.ZED_WORKSPACE }} + run: script/bundle-windows.ps1 + + - name: Upload Zed Nightly + working-directory: ${{ env.ZED_WORKSPACE }} + run: script/upload-nightly.ps1 windows + update-nightly-tag: name: Update nightly tag if: github.repository_owner == 'zed-industries' @@ -225,6 +295,7 @@ jobs: - bundle-mac - bundle-linux-x86 - bundle-linux-arm + - bundle-windows-x64 steps: - name: Checkout repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 diff --git a/Cargo.lock b/Cargo.lock index 07a445eefe..38bb7819ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5191,6 +5191,16 @@ dependencies = [ "libc", ] +[[package]] +name = "explorer_command_injector" +version = "0.1.0" +dependencies = [ + "windows 0.61.1", + "windows-core 0.61.0", + "windows-registry 0.5.1", + "workspace-hack", +] + [[package]] name = "exr" version = "1.73.0" diff --git a/Cargo.toml b/Cargo.toml index f22bff1f86..a4d8b3cb95 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,6 +45,7 @@ members = [ "crates/diagnostics", "crates/docs_preprocessor", "crates/editor", + "crates/explorer_command_injector", "crates/eval", "crates/extension", "crates/extension_api", @@ -625,6 +626,8 @@ wasmtime = { version = "29", default-features = false, features = [ ] } wasmtime-wasi = "29" which = "6.0.0" +windows-core = "0.61" +wit-component = "0.221" workspace-hack = "0.1.0" zed_llm_client = "= 0.8.6" zstd = "0.11" diff --git a/crates/auto_update/src/auto_update.rs b/crates/auto_update/src/auto_update.rs index 1123d3f8e2..d62a9cdbe3 100644 --- a/crates/auto_update/src/auto_update.rs +++ b/crates/auto_update/src/auto_update.rs @@ -638,7 +638,7 @@ impl AutoUpdater { let filename = match OS { "macos" => anyhow::Ok("Zed.dmg"), "linux" => Ok("zed.tar.gz"), - "windows" => Ok("ZedUpdateInstaller.exe"), + "windows" => Ok("zed_editor_installer.exe"), unsupported_os => anyhow::bail!("not supported: {unsupported_os}"), }?; diff --git a/crates/auto_update_helper/app-icon.ico b/crates/auto_update_helper/app-icon.ico index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..321e90fcfa15d8f84c2619b4d12af892ea5cda66 100644 GIT binary patch literal 590611 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
    vTY6 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�HrG!bS!L|3T>=q}I;P_P>>-#eYy++RDQG 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

    Thread Explorer

    - - + + @@ -368,8 +352,7 @@ ← Previous
    - Thread 1 of - 1: + Thread 1 of 1: Default Thread

    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 literal 0 HcmV?d00001 diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index a97985e692..d6ddf79ea6 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -130,6 +130,13 @@ fn parse_path_with_position(argument_str: &str) -> anyhow::Result { } fn main() -> Result<()> { + #[cfg(all(not(debug_assertions), target_os = "windows"))] + unsafe { + use ::windows::Win32::System::Console::{ATTACH_PARENT_PROCESS, AttachConsole}; + + let _ = AttachConsole(ATTACH_PARENT_PROCESS); + } + #[cfg(unix)] util::prevent_root_execution(); diff --git a/crates/explorer_command_injector/AppxManifest-Nightly.xml b/crates/explorer_command_injector/AppxManifest-Nightly.xml new file mode 100644 index 0000000000..31d2d8f782 --- /dev/null +++ b/crates/explorer_command_injector/AppxManifest-Nightly.xml @@ -0,0 +1,78 @@ + + + + + + Zed Editor Nightly + Zed Industries + + resources\logo_150x150.png + true + disabled + disabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/explorer_command_injector/AppxManifest-Preview.xml b/crates/explorer_command_injector/AppxManifest-Preview.xml new file mode 100644 index 0000000000..44c967f5e2 --- /dev/null +++ b/crates/explorer_command_injector/AppxManifest-Preview.xml @@ -0,0 +1,78 @@ + + + + + + Zed Editor Preview + Zed Industries + + resources\logo_150x150.png + true + disabled + disabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/explorer_command_injector/AppxManifest.xml b/crates/explorer_command_injector/AppxManifest.xml new file mode 100644 index 0000000000..0f0e2c68cf --- /dev/null +++ b/crates/explorer_command_injector/AppxManifest.xml @@ -0,0 +1,79 @@ + + + + + + Zed Editor + + Zed Industries + + resources\logo_150x150.png + true + disabled + disabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crates/explorer_command_injector/Cargo.toml b/crates/explorer_command_injector/Cargo.toml new file mode 100644 index 0000000000..e929ba6fc8 --- /dev/null +++ b/crates/explorer_command_injector/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "explorer_command_injector" +version = "0.1.0" +edition.workspace = true +publish.workspace = true +license = "GPL-3.0-or-later" + +[lints] +workspace = true + +[lib] +crate-type = ["cdylib"] +path = "src/explorer_command_injector.rs" +doctest = false + +[features] +default = ["nightly"] +stable = [] +preview = [] +nightly = [] + +[target.'cfg(target_os = "windows")'.dependencies] +windows.workspace = true +windows-core.workspace = true +windows-registry = "0.5" + +[dependencies] +workspace-hack.workspace = true diff --git a/crates/explorer_command_injector/LICENSE-GPL b/crates/explorer_command_injector/LICENSE-GPL new file mode 120000 index 0000000000..89e542f750 --- /dev/null +++ b/crates/explorer_command_injector/LICENSE-GPL @@ -0,0 +1 @@ +../../LICENSE-GPL \ No newline at end of file diff --git a/crates/explorer_command_injector/src/explorer_command_injector.rs b/crates/explorer_command_injector/src/explorer_command_injector.rs new file mode 100644 index 0000000000..57454bc3a8 --- /dev/null +++ b/crates/explorer_command_injector/src/explorer_command_injector.rs @@ -0,0 +1,201 @@ +#![cfg(target_os = "windows")] + +use std::{os::windows::ffi::OsStringExt, path::PathBuf}; + +use windows::{ + Win32::{ + Foundation::{ + CLASS_E_CLASSNOTAVAILABLE, E_FAIL, E_INVALIDARG, E_NOTIMPL, ERROR_INSUFFICIENT_BUFFER, + GetLastError, HINSTANCE, MAX_PATH, + }, + Globalization::u_strlen, + System::{ + Com::{IBindCtx, IClassFactory, IClassFactory_Impl}, + LibraryLoader::GetModuleFileNameW, + SystemServices::DLL_PROCESS_ATTACH, + }, + UI::Shell::{ + ECF_DEFAULT, ECS_ENABLED, IEnumExplorerCommand, IExplorerCommand, + IExplorerCommand_Impl, IShellItemArray, SHStrDupW, SIGDN_FILESYSPATH, + }, + }, + core::{BOOL, GUID, HRESULT, HSTRING, Interface, Ref, Result, implement}, +}; + +static mut DLL_INSTANCE: HINSTANCE = HINSTANCE(std::ptr::null_mut()); + +#[unsafe(no_mangle)] +extern "system" fn DllMain( + hinstdll: HINSTANCE, + fdwreason: u32, + _lpvreserved: *mut core::ffi::c_void, +) -> bool { + if fdwreason == DLL_PROCESS_ATTACH { + unsafe { DLL_INSTANCE = hinstdll }; + } + + true +} + +#[implement(IExplorerCommand)] +struct ExplorerCommandInjector; + +#[allow(non_snake_case)] +impl IExplorerCommand_Impl for ExplorerCommandInjector_Impl { + fn GetTitle(&self, _: Ref) -> Result { + let command_description = + retrieve_command_description().unwrap_or(HSTRING::from("Open with Zed")); + unsafe { SHStrDupW(&command_description) } + } + + fn GetIcon(&self, _: Ref) -> Result { + let Some(zed_exe) = get_zed_exe_path() else { + return Err(E_FAIL.into()); + }; + unsafe { SHStrDupW(&HSTRING::from(zed_exe)) } + } + + fn GetToolTip(&self, _: Ref) -> Result { + Err(E_NOTIMPL.into()) + } + + fn GetCanonicalName(&self) -> Result { + Ok(GUID::zeroed()) + } + + fn GetState(&self, _: Ref, _: BOOL) -> Result { + Ok(ECS_ENABLED.0 as _) + } + + fn Invoke(&self, psiitemarray: Ref, _: Ref) -> Result<()> { + let items = psiitemarray.ok()?; + let Some(zed_exe) = get_zed_exe_path() else { + return Ok(()); + }; + + let count = unsafe { items.GetCount()? }; + for idx in 0..count { + let item = unsafe { items.GetItemAt(idx)? }; + let item_path = unsafe { item.GetDisplayName(SIGDN_FILESYSPATH)?.to_string()? }; + std::process::Command::new(&zed_exe) + .arg(&item_path) + .spawn() + .map_err(|_| E_INVALIDARG)?; + } + + Ok(()) + } + + fn GetFlags(&self) -> Result { + Ok(ECF_DEFAULT.0 as _) + } + + fn EnumSubCommands(&self) -> Result { + Err(E_NOTIMPL.into()) + } +} + +#[implement(IClassFactory)] +struct ExplorerCommandInjectorFactory; + +impl IClassFactory_Impl for ExplorerCommandInjectorFactory_Impl { + fn CreateInstance( + &self, + punkouter: Ref, + riid: *const windows_core::GUID, + ppvobject: *mut *mut core::ffi::c_void, + ) -> Result<()> { + unsafe { + *ppvobject = std::ptr::null_mut(); + } + if punkouter.is_none() { + let factory: IExplorerCommand = ExplorerCommandInjector {}.into(); + let ret = unsafe { factory.query(riid, ppvobject).ok() }; + if ret.is_ok() { + unsafe { + *ppvobject = factory.into_raw(); + } + } + ret + } else { + Err(E_INVALIDARG.into()) + } + } + + fn LockServer(&self, _: BOOL) -> Result<()> { + Ok(()) + } +} + +#[cfg(all(feature = "stable", not(feature = "preview"), not(feature = "nightly")))] +const MODULE_ID: GUID = GUID::from_u128(0x6a1f6b13_3b82_48a1_9e06_7bb0a6d0bffd); +#[cfg(all(feature = "preview", not(feature = "stable"), not(feature = "nightly")))] +const MODULE_ID: GUID = GUID::from_u128(0xaf8e85ea_fb20_4db2_93cf_56513c1ec697); +#[cfg(all(feature = "nightly", not(feature = "stable"), not(feature = "preview")))] +const MODULE_ID: GUID = GUID::from_u128(0x266f2cfe_1653_42af_b55c_fe3590c83871); + +// Make cargo clippy happy +#[cfg(all(feature = "nightly", feature = "stable", feature = "preview"))] +const MODULE_ID: GUID = GUID::from_u128(0x685f4d49_6718_4c55_b271_ebb5c6a48d6f); + +#[unsafe(no_mangle)] +extern "system" fn DllGetClassObject( + class_id: *const GUID, + iid: *const GUID, + out: *mut *mut std::ffi::c_void, +) -> HRESULT { + unsafe { + *out = std::ptr::null_mut(); + } + let class_id = unsafe { *class_id }; + if class_id == MODULE_ID { + let instance: IClassFactory = ExplorerCommandInjectorFactory {}.into(); + let ret = unsafe { instance.query(iid, out) }; + if ret.is_ok() { + unsafe { + *out = instance.into_raw(); + } + } + ret + } else { + CLASS_E_CLASSNOTAVAILABLE + } +} + +fn get_zed_install_folder() -> Option { + let mut buf = vec![0u16; MAX_PATH as usize]; + unsafe { GetModuleFileNameW(Some(DLL_INSTANCE.into()), &mut buf) }; + + while unsafe { GetLastError() } == ERROR_INSUFFICIENT_BUFFER { + buf = vec![0u16; buf.len() * 2]; + unsafe { GetModuleFileNameW(Some(DLL_INSTANCE.into()), &mut buf) }; + } + let len = unsafe { u_strlen(buf.as_ptr()) }; + let path: PathBuf = std::ffi::OsString::from_wide(&buf[..len as usize]) + .into_string() + .ok()? + .into(); + Some(path.parent()?.parent()?.to_path_buf()) +} + +#[inline] +fn get_zed_exe_path() -> Option { + get_zed_install_folder().map(|path| path.join("Zed.exe").to_string_lossy().to_string()) +} + +#[inline] +fn retrieve_command_description() -> Result { + #[cfg(all(feature = "stable", not(feature = "preview"), not(feature = "nightly")))] + const REG_PATH: &str = "Software\\Classes\\ZedEditorContextMenu"; + #[cfg(all(feature = "preview", not(feature = "stable"), not(feature = "nightly")))] + const REG_PATH: &str = "Software\\Classes\\ZedEditorPreviewContextMenu"; + #[cfg(all(feature = "nightly", not(feature = "stable"), not(feature = "preview")))] + const REG_PATH: &str = "Software\\Classes\\ZedEditorNightlyContextMenu"; + + // Make cargo clippy happy + #[cfg(all(feature = "nightly", feature = "stable", feature = "preview"))] + const REG_PATH: &str = "Software\\Classes\\ZedEditorClippyContextMenu"; + + let key = windows_registry::CURRENT_USER.open(REG_PATH)?; + key.get_hstring("Title") +} diff --git a/crates/gpui/Cargo.toml b/crates/gpui/Cargo.toml index 1ab591e9d7..b7cf6dd388 100644 --- a/crates/gpui/Cargo.toml +++ b/crates/gpui/Cargo.toml @@ -220,7 +220,7 @@ blade-macros.workspace = true flume = "0.11" rand.workspace = true windows.workspace = true -windows-core = "0.61" +windows-core.workspace = true windows-numerics = "0.2" windows-registry = "0.5" diff --git a/crates/zed/build.rs b/crates/zed/build.rs index 531de3ceb9..0cfb3eba9f 100644 --- a/crates/zed/build.rs +++ b/crates/zed/build.rs @@ -50,7 +50,17 @@ fn main() { println!("cargo:rustc-link-arg=/stack:{}", 8 * 1024 * 1024); } - let icon = std::path::Path::new("resources/windows/app-icon.ico"); + let release_channel = option_env!("RELEASE_CHANNEL").unwrap_or("nightly"); + + let icon = match release_channel { + "stable" => "resources/windows/app-icon.ico", + "preview" => "resources/windows/app-icon-preview.ico", + "nightly" => "resources/windows/app-icon-nightly.ico", + _ => "resources/windows/app-icon-dev.ico", + }; + let icon = std::path::Path::new(icon); + + println!("cargo:rerun-if-env-changed=RELEASE_CHANNEL"); println!("cargo:rerun-if-changed={}", icon.display()); let mut res = winresource::WindowsResource::new(); diff --git a/crates/zed/resources/windows/app-icon-dev.ico b/crates/zed/resources/windows/app-icon-dev.ico new file mode 100644 index 0000000000000000000000000000000000000000..de92b6dd3c4a34164a72dec5f2427589e97536a6 GIT binary patch literal 156580 zcmZQzU}Rut5D);-3Je)63=Cxq3=9$y5Pknw(MfqbLa%az9XmLc>mGU40{isWLUp-H^Zdq z5VbwC<}j2c=Q1?Un#EAn($0{TUnE#w(-2Zo+gMg!(^ykp(@+DU8*3_RA-EDO*ASAG zS0q^7+Ro56b0$N1bv;92X(fMiN6&)JzRAD3`ltNw=$-Vxy>}v*?(CcVzq5bxe~@_h z#Hs&5YMR=678I0J@Re27F?3Iu%Fx{2d|4*DY`#(r6NDoNw#OZSw+IuGC^-Y-p*4sa2=Kra)=l`EDZ8j9o`VTS}#P6Ft z1ElwV-;|mE+q);^f%HzEIgg>UcT&lOsk6XxApNr!F8x1q-eRyhQ)bQoKV{au|NT>E z{hvH@-v8doGya3rg7kp&PMfokp=ZL>lF2jYg4N7jy!`*<8FT(GTfN~wh&^NOqW{z8 zEc`!x?!y1m=Pdj`Y5E+nIUqgL<}6~EIe#fb|Ku4ZAUTlvOIEG>KX1v3|Fae>`M+lK zw*O04um2A+W9IxNV6ka)7J$tG>6y7;DZ`w_D;OqCn^iJv!P5WJ=PvrcYQvWQ%hzrE zzhL?5|LeBx{J-PC;r|PlulYZF!P5V87cKt}QU}5lr_CyvyLbh|f@P~2rp%mMGH>yU z|8o{D`@eDf?*Hqz?fk!b)3*PsHg5U9Vf(KC2Tq*+zkKbc|MQlt{6Bxm%Ksp>AUz+b#k_Z>a)f6w7#2z=<+|0Ac*f#pDI zKx#pHmaJOOuz1BTFzzk1^~EO_hxRU5YcU$b%Be~{X_i#<;v97qjFEl3YY@1o^vz;0Nwavk@w zH5)vZuiccrV(q5F73+{Nh`)AIAxI9S2Ba2bH%Md zRn#F^Rh>Z|8&*+c5SNh$>jCKnneqSR6NYb_&oOXta4`7$`!g^w1T%z%hcW1yn1jO< z>IznIX;}^_IRy?$IR!8cV#6?4OkR;gTuO$6fq{V)qz4qP`o?Aq30cJ;F2kWihZyqn z^TF;030T_LvF4Xl*j3gwbyU?gFRQ9+URPPyyrHtL35r2%2(GGc-T=kxs_L7URn|4N zgY+7kSh6y3Gl0!pzkWS~va&LRhfe?lpMVHcbwf*POK0!%w(bewau8IWf!J`|GXY$_ zfy80uWJlkm{~!!f1JYaF(2~Nyz`*3}>d7D@Bg0^AZOzc#KZT*Pw$Ze$d&1M6Nz?yN zo-r3(#`R8`{vTAfg38YBiPOO47)T6MR)NYqP?-iQvnI`$^MA_BdH+FrL1uu=0-0%G zV8EcDq|C7Y*ja|w&fXf3IUu#5G8I(zws!abZ|UrV;I97vAU?>Q$nFP~@jVl#{Ri1K zX~tY|S=`duTYKR6IR+^iSq2MhTTsw5ws%jM12PwcyCzHp*9#zjfb<~noc|N2BjefN zvK8bOklR4zH%LFoEKssFv$SUL_VHsd($Qh+=$W__>K2IkGyeBao%z3`XTnlLZEYqmFJFehz+eU^8yn`%zDdhLbqT0G0EKzi zgel-UY0>gE{}(J>1upaFEL#2_T!+kG0a6+yLGc2rk3e>H_D)*vU}eSZ z=N||+zk9-z<>2s`KIebWq-o&tcE;R=;BZ~Hc{{ia2gT*Y>9hZXFsRI*HGj!}P(1}= zgXBQ^LAbkr%5q0*YvzD}K!%{85C&&kTjt(L)0TtkN03`U?gG^}a~3ZB4~p-Z^A`PI zzjf#Tbz67*U%qAo*bksOY4*Zp;5r9X2Z79;HhaPUsk0aS2btw!XU7~A9Lf+J63PH# z_fMIz9OMoV2KjNtI#9i_;{VExTmFOm0jf*4?m6&(@yfOTLE!{a2dZ~K^)1LAkl8cl zEe6+RAhSSb1_y^SgoK1KxZ2w>PnI*l-MZudoJGt2FI&6e z|MImP|L;3~>i?2e>;Hq)g3Je*4XXcU&R_f=#0H6j%mT$JC~QJQA?8n>K4&>de(vHG z;Cg$*_TB%Nt=aH@)6Tu%xLvtn3%E|*edPH611Hb?2l)?VK1e;NUIe)TM1#x#ndNM2 z!whnNXjnLdtAjoB)S2^^gVci33djvx_w4__dehebI}aTGzj4QIaNP(B8<3wi?cDSK z!p%GX*KXbpse6~M`agf^%KrD@%yO}}XATXE zU;tq=BO|7na~CZIrS+w&H~a_DyAB=!*Ug}Gvtiq=|L7Pbe(=QU|JUw41lP$+R<8RG z(>rtSq9w-qdQ8C~VGQoxexUM!VfKQhvq5TBtlJE353Js>72F;;bmGkagD1}X2hr#l zWd4C;r@-wCQ2PL+7i7ll1xsdw40ZAFX3#S-Vc5C<2*cb(%PT?YV$G)Q|5vWx0>&Wq z=y>J2&HrH-CI?dw(hD*JWY(_zM;X+#bQoGIOTcy3yu~Z@7q49R5Y*0CzjYV5EwOGh zs7(RFJ0bin=rl+Ugm?Z2=>h2lnE^Iy#af2ml1v6~A0LMPDKi<~eE7<+WaYZ>Wve$l z1ceRAY;ap;D@ZRg-UZIfpzsG{ke!=%{0Hd)=>?hb;q!N}nRfQ};CgKO+=Za9ZJTEm*=hbN*t+ zSqnfI#9jgx1Mz3hU&7cseKzCf?Ryzkt=|mRJ9GXLh*>jdg3X2zjEsy7-BYJAbWEMY zP}jAj|#0SwJ3}S=S%viXLp{S{YVdC5+3_0ax3~X#{ zFk=}S;4JDg8Wg8%L2>CCZ{t*C!{cV`UNp)>Kif0D5@|-#UwCnT)mUw|G6g& z-}l@Ar%#wW{{Q;H@Ocnq zVEBLfIauDp#FQyKCPAsRs;;cIsclPLQ~Q~^ruHkfP3_leo7%3U;`ZycO$c1q)P5a| zo7=C|HMd`>Z*D(b*VMMTw5qN&JUU)co=ch$+)jS`A8ap-(A3mq;O7+u+n<(`Z`9P@ zv#+JI?_X0#&;RDmUIgyw{omBl`@b0(!`gAkbXWiXmM%#94y3-Nv+r+Hd(Ymq?0h4T z{UCeQ)zv{17`r$-GgQ_!GsGsQO15???Hf?r0@Bu+4(>C<+FPKu z8K~_9YNvqIf!YY*KJkpX;5H1XP6xHAKyA#H&fZ-y@kx>uHH{3;j*bjmTwDy5m6Z%q zGBOPR{{LsFZ|=zK=$-Tz)J_7mM?hwQ>;bjmI{PMr+tVGrpmz0S(740@&i*O?LGA># zJ3(qd?Ke>S5Y#3ExfSFtkXt})5RjQ5v+JANGyneo&mb-#$q*0_z|hpx#NguY$zWn? z#@gOJVI`>D3u+^Q+KV7FK<0zOqq(yW5$>J6h_-WA|9_BtThE05ZOG#s{Zqj0c2Ij1 z6gD6;L4E+)VPs^?>g4Lq(A?b2z{A7Ckdl!N!h9XQ6Ay#j32Fy|`~mV)d+#KOIg@9g zggYo)K<>kaL2{rl0oex*lS$LS?Qf9TAUjghv-ncdv%zr>N)H9aWeoX+CBmJ(lg@(7 z1GR@i`apgMg$Jlzuz2OV|Fah@1GlwiEnEs7cL23_Kp5Pj?c81ETT86UnD$$+^Q!j$t32MuO z(jUm}Ab)_yS=xIh{0E6|-mw?l_5=A1jHk^4_Zz_N{rQW*?MhI85Y!e2Lei7t%(AX8o9U!-Z`aK)A?fl=- zI}zOX1-S<_1~h-kivKg_Eduw4Kx0^-I0o4VYG;DV1W=n9l8LDd4+?kCxE9E*AUA>ZfYK?*Y>*w5RkflZJ3(>3apOjY+PX$i z7>G`sI_o0H3{c#`%AW;cgrJ3(Os3Qtftg3JclQB_qZ3bJ$U+O^;?sH<;csII9Ooiu&+MUXk5ehr8Q zg&U~fuz}FIH98iGu9x>+1vCU*FKoP*d9=I%US(iy*Ziw}bkipl}0?SAzN!eUqpE z-+$s1cq|h%7J2&WjsKwj$C;}){-3*f`#)%`4is)6w}WUxe1P&Z zXv`7hHc+_$8rM8|`Rf05TX%x{(;&Zs>;t7i5F3<+KxTr>o;q{h#oF2iQIMTKe*9oK zc<>-YV{;orT|=|zwAu47g4_z~FM-BJLGia{?bzz++j>E$s{qjV+=x z<}ADjaxZ8+6x1gKh2Q!uJN}=!d<|^>=AC=~pS^nH|CuY-G4Sat*Z!ZsaqIuJ`w#zv z##}-Eh4ufyVYO;KxQ_|4qrRb86lCX_GiMn7{Q1Ms+}gp=(9|k2bKc?$Ab&4kvk~lG zP+r=!efR(K*KYowK4$^A`~lIp@U&U;|F7M=4eW+(;4y)9|3UQzD11QuI8eBN>}Y6g z5dql=YM+AIK8-CM4E0TILbDevIRo-HsGkPvQ-aD?P`U#3H80$__5a+p8wBy$tJnYE zd;aqOmAm&rQ51z+>$oGeKs9?5L`1;sMzSYTJX-e_D1v zLtsca^Ss3?mVxS8P#+Lf&md!v`*C4Vc%jRI#E|ua%mkS|Z}Ezyet{v(sad%Ut5&UI z`2G7ggRY?|!}dJ~8Rjopk+^8Znm?dE<%X@h!2NrWyD7zBvo?U{3fBAq*#WXkRZEwl zpr8O01q^cP1`Kl-EoYcHZ;{~Qm1{SF(m$w72i0|(w(kLlD@%mSGS zGJD3{MS^n{E@O~T1dWt~t!GG1PG;D#_aMWHwHp~0E?cd-yJkw z0}4MB44PK}jRSx%G8@F-yaPPO1JVmJ17sG+Opw_t)@)?hzI#7INl6LBas~!)|1B;h zi{bRS%iuYKMa$O+EL*c7e)*b>iH+Cp z1TqU`CTOnV)R_wmNtuvvhdY3Qfgv$5ks+_Lo?+9rT?~s?t_AnYr_No-w0Pw@t|hD2 z^DSMyL15YH4T4KoZx960FpP~4QoD5ZdcGyA)^SalyMPJQ#|N3YaqBLIqS|JL)vH${ zTMcJ}`ucsn-3;~JlNfvwGQjFV_i2)qF_rUB)H*hq4#)-!B|NsC0e^4#} z%@rjek5j17!UcodOwf1C+hcCr<;nrL1ji8N|dT7&y3j z8JIb^7#LYO7#LVMNHQC*Vpa|YMmA0c1{QV(P99!xAKKo*k>UJ>^9)55l?>|_Y-RYr z`vll6AUEPN>;JcJ3{OipGW_0hnqm9mRScaI`xzXZTp9EXO<-D>7#J9sq4R&BIY7|B z9W^k>ED#2n4YGqlR!)Jz(aDvernQsd(3%qrzi&Qg_}^#6@c;I0m|HOD|G$4TJkFlY z@N4@ChFwcnF)mxThSAE}o<&SXmfzOVMKd%q)-53=BRVxBCp{xOKQAMvpfEkBpqLb# zky}`tky}s{=az1@TKt(!~cWV7j*xaVJUN6){eb_m@JqdP$S-ha&HnEKj9>qsVfg>>Ak%LAjt9m@*_q81{R!o;KPRx3_U&F zFh8-R=M;FicTczrGN+-n>wiOA_kYm12WZR#G~NN~|F3T0BCFhWEaRz&^&c}&xE^a+4n7@$yG-W1uo*3pIka-|;LH$xt9~U(D2MQ~Y-5@u#b@iPH4vSO; zr4LC-Nrt4PB(R&2i3JN5Ffg%!%S4vi##Zp$IB0ASG-d+o?}5w*jhBGNO~7M76Q}(L zjRAqiA3%11X{0q!ps^m18$cK|UIYqP5C)Bhfbpd1;5lM&d`$+;Lxa{YLE;58CIsqd zgTewd&I{6C+t6AAiUW3TUT}Sa>~%h?A_XG$VWzE7Q@Y*ie*lGvVe;~7AW2_*zfyTi=@dX;w zgrv3E;Isv@8{`I%dXSrfLc+!Ji_5|D6iiIuVixQTP`rTpJo6TxCNz6P*{QN2Dt&GuB(5_i~OQegGI|$Gl2T0pfMV-;~5}pLv(d@8Mf~_$WU3+ z;MP51>KBk6&{z@398f%h%m#;h@1*~5x5LJcK{RNb9yB%&#-MTfey}>w_&7XnKyd_e zKPZks<8D2WwRfN}291Y;(jh25K=y&+17tVI4IsCG+yrvl_T2{=w6wIq`4r}UQ2Rzr zU5(-Bsf!FX4K2al6Q=$IjW2`pE65yBx&@gFO4A^-Kyd+@cZKxf*Zp6#avgZR7i7G1 z&Hn|UH4@8KgU7%?V;%FBuKYiD$x84z185v$HfY@h2rq<;8-vEJKz4xA7buKCY_K0D zPY2JyC+Qj1BzFWxybGZrCE^s zLFELf{{?bCXzXV?Xp9<$=R(G-r_Egmwi{%|RL~d)bS(rZJVE1lpm9?$J!?LAtP{is zrE^$10=s__#Qh+*fZSBy)E0gD`h5mjSy_fnn>N9m&#-v$Vg@B8C5G#_A2T#Ix5xEN znEDqK7NBuCP$e{=E@ZtYCyn>76|C>?^r7F5T8%mKLz6h5H(7*q%JOoXgo1&v*8+Og;V zmRd_*Ya^Fo44U&Vv^W zEp1&1eUoSW1(^*>+pszdWG+YygtzS4_kYFOjo`EZ$`7D1!EL+u{|Al7fYJgiU4!xo z2qW`BY|wZmXbcV%HlT0{gB|6%z6R6l^`JVEntpgIp!MuN&UP~HK}2Y}23jZK5% z0~A)EwggBVWG|>52Dt&`7Lc1jZhQFjEjayOxNrgP{;H}f29Wz7J$uX0*3pwNVd|{E zU~@rhglEnJ*M%UnLGcR`2dx1DjUTsx%5%`#!JY~KJ9;MmU$%Pv|NTc#g2&83{#d+X z&HqKqSN~tQY!!IT6DWK^@dt_{(6}kcjUX|w`_?_RijfNz-Qk1=YErF<(&pgXUa7^GM)yIeEta zJ%^8j*BZ5T_y3{yqdk%otJ$Lp_0B_UQRL24xi$22fua z<^j;U6M1=ghQ}}7Gjw$IB}|$==P$^upt=V%w*oQ`WHu-bfyDP6JM|y5-WlY6P`Q2l z;+6jkmahB{noH~IpZtI2`py53p1b%TG{4n9c?NiV8P?-Ws{~-5)!W-=V zWvjt+d?0s&>;z#@Jb~N*$`g~P&-n{-+mjdX!R|kG>J-fR3@t4!42p`144}Nx+1;No zWyajUAh&|@C8!Jq*Fm!&^K=uZ&H~TvY}&OK?A~c}=Knu&>FR&b{0As6gD@y9f!2qg zxOnCNn$6q)Pn|XIKX~3`?jo=oLG4*k-3M|XC~QD^7Zm;=dq85KG9P3w$e*A&0+3rk zZUVXO&4=#{GBUF8FYb1Q&wru|o;)CWQCr_UZUK4-u&i(&e_8#~@djVu^KPVr7>J5CQP5R;4dhwL1`2e z?;vwPW`ok})S2`CpSpbQ|E@zv|AW#x$eow(Jpk`N0M%`vw14f`%>=mxy@Y?6sAHFm6^i4{bK4;-yP&ojap8=I^AhST>0ZK!lxukQ~Z~otV z^aObAF=$OI$i1LBcThbKnhyl|Vg1$}|3MhEmLD`%1oAJ)AG;161N#9q_XjH5K{Uwy zpnMAAgD}WWFkZX@JWm923&>3%w|)5f7hKjaS+WG=bT9^u|AESXkl%VIOiq|NZ_!^+ zz5>-Tpm+x5FOa#Qv^itW!v7a<-2v~l0L`6(=F4wCdjYPGLFoz99stD)$S*JqYU6bG zPXX_*zchF3g&K*+d=6E%m?k;fMSr{AUA;A0&-Jt|Kx;^-~KVk%E>Z-#wEdy zXJBAhxNsqZjI1mJ$o+j2rXVCYe6SWnF+3& z9=v+{|G;t3y38&A*KFDfuD>8Og1vg?0)c? zSJ1jw1O~~0+yHXRta*$7g537y=YIxiX=#QD6DGi%&j4Dh0BTde|NNVwf8x}H*$bBZ z1*H{GIslamps)d%1&RYu9=v}4(f?y-&;JLNMWFn9?%K`&kKVi^3O@v?d;9+XllLFN zdtE?vG^i{B&7pzpLg3Zl{Wu^ufZPId6Uc2}e?i<28ux{Hpt!ggoc=$2{lhR}(zJv* z3zq%`m20ckZvpqKAZD%x@5hWf%y9{jqe_|C zRX}s-lR^8XWgO(B z{r}w68~-1^e*6E_#moOsoWJz{#03)Z`Ah$gpT7v!|M>0u|Ia^t`M+(?{{J9%gVrv9 z<|M&*^#*WW0@o3Xm;aeCWqQ=(=kLJv7pTmKx&QzF{|umYq315&1i3$G{*skHLFFZA zeiM{`Ky57;2AK<5J8=H`&HuL_Kl^|C@l!M!Bt|TL`v2CWC;uvG))||CAZd3zn|>0xI)C?g!0PgUng6 zcGG_l2C+e98VIjk2NA-vK!YqHrdDs3U z;PD?pK|xsXgU3?h4RQm>Eg(1bOqimxWaT>W+!a4RKivHw252s;tA7eZeRI3Of~Bhtf$~2n zJ#N{#58Q7B?Wse@p!EPCF_0Y)dK*|RoDbTgw*j&r50npasR4;&!yvmsZUDIjUPO?3kezEcZ3pk20J&w};uVFUbnfKg173@b z;&=uIhJE|?F?g8kL-%RUlUTfB?Ez3;1(lnib^qJ<90ZRifc7kc#!NtQi$QMztuNT| zA0&^Fe+19eWS`rv?U@ z1;QY+H|^L9whL5VgX{*mVcwFJ=DYSC0=q3X9yFs3b}j}1iXUg+5Qg-^GKRy)PBScA zzS?Zr>J6Z^68}Ku8OS^k4cd1EDkDI741~dD2+}?h5FZ;xR}12U@mk1QAduN`JJxLc z2eNzNvejnCPo8B+$|+{>2~Pm~0mI=)0-$l}x{f}Eyox%84O@1A(v#S-)f@6a>qS9XPCNR1;dnCvr*dmgxrlT4_b%5?DZRl$@Ath{Qvcd z;moi!n44$I|^^HL$fY!Oi#KbUw)~LF0+r!Px!@$GC3m#uFGBRR_j*bS0d3AL)xP1h2FIEGH5d8n|AJ~k)hYmCB znKzH2c|tG4w0TPz0z%^$IK-sECR8RyGw5rmGs;OxF^LEXGV}BDG4pWqFbnYWv+(io zvhZ+mvv6~AvGDTnfN4HnUKV~{UKU<%9u`4<0TwW++5tu5~5j#GaKYxPN5JP~%4ut<4-_NjOMkhmQ4`lDjgh}%mGz?9c85kJZ z85kIN7#J9YnK-#6d4)vfM5Sbvq~sMRlZ;1}Y+{Z9S`*xizn< zmX4gKZ-8TRdUj4>NkxBob^Wrc+Quz4_04;08(I$5HntwAX>2`K(*VOQsBDlN2!rH7 zGzcTJ8(WXng2bS>wy_P&uWf8QTHDxmq_(m3U~NOop6a@$E#=kqOAAXX`jXSLvfO?A z?G;tkWlYR0cnZoYSSL+i#B_7>EykbM9x?tudz#_@)oUQH5rzL>zrpbT{dI=FJ5Dp+ z-h7-XJUNM7R#`>ZHz?Gxth#zu3B*J^;=)X>%iUgucd*!sV!q2+&7earvqhE^~QV#CBx*dTQv3{?wL528UBq!vbl z*vMwU#T#1w*EF{NuWN4q4{`&@Eugs&klR{2`>v*D<)w(q$cY7b`Lg`Ka2K+N`r}8U z{0~~2{ruQ5u-fS0IA$?9Md93{vck^ZNv}cXgTfuOrUvA;+U9ofIvUV=6VO^D(0Ulq z+zg0r?}O|+28n|($bDcMye}ELHyO?bosl*LygwPV76}=H)<}TXd4TDOQ^9LJLFTvh zPWs=}+4mph29R4oZUVUtQ%76a1o%o9kjpM z)Y6I}H93Wmfq{i9E5A6tvk&5T(3&&QdREXnP|(~RX#XH+JRCF+0Gf*djoE|7;z8r^ zpml{{JarcMyfn~UF&Kl^n8NUM$hba84;aJ7`De@pkN<;sK` zgZ4;*<`qHna3D8<+y=@Y;4tW$^g1iIFphzNfh#h|p8>QE4CHT6xelVS;m403gZGz1 z<(PxQqKw+RCtL!ptpKePscY^4hd*cz5HzO@av#jEpt*d|8V1ms3eZ|95C*L|0_g=| zFdJztD~JzL3tIO9rlISZKxTl<0;#1u$bQgT2~Zq>=HWnT z1hoDblny|4ws-em3=9c31g#GR`KhL+2E3*W#Kwj}duzSDy&1MHoyWky%)(vU(Ao`h zCn!zVw|0TgjRMVCg5m?T?gQiwP@IC?2l5BV&meoj;Sb$w4_a3P!XPm)o-h?WKMQgz zXk8WGOKF~TL&{|7S z7=ywbWG~2mu)jfP3Qhv8`30YC_#c!vL2E8SWitqa%LdSzI_SDga2WtDvnN5$B!HFy zh&(?Taz+6({6OIZ!k};k`3HnSVGT+nAp1e#4_XHWS_=Sj8z>AwZUvQzAUz;Igh$4J zw(T&8h=?+P;uz#VY#7wehKZMySBLaWnED+QXQ1_hpmh$Qya%!mgh6Y$K!vs`*BEkrqh9*n_udN2f z2{;Tu>!YX4gp@C!yfJO|e~=re&0X}rvAqWzjvzmP`~veAXiXf9jZT-AmcoRX>zmrD zKz{4!n*=_m0W{YG3UAQ*Cy>8E`4l7%3LlUfSeS#>hJ((~0Ij_Q)#V@>gh6aDhOR>f zsRN}eQ22moSa^YGP+0@Y!ypU_8(10wg%1dW(l#h=LHP|94j^}d+y{ymkXu1|K<)y$ z5#$%pnI<65f%X}JXlxiMY}i`byQhNmg6s$7L(tkRkX;})NF0P=eh0Z1rc6&4mUun37Vh)GLxws!U{ z1L+0X3CdfbbOo{lBnGk*lm@~6@0|o*ZwT7&52_PDbIK^|hGFZ6=PmvZN|)e#1U(ZJ zww8G69LSnt_`k^}igOj3%IO;Cg(I~#J22gtwZI6Xa`LC?&J!NACvr@gCx14u8(j7c-+fzQVS z@j)2u{|QsU=emOOD=3YC=7T_UYM}l1;JJ%+oBuBdVWc^XrE4~T*Ufg4AwTbd>!5W+dz6j=?zr3fYu43 z#6QUYeUtx#{ogwgGDp8^{eO^uz-^LQ^T2EBCPQhk8MEg72l2sp<~;B@u%Ncfq?vR7 zgYk^H;B~Dq_C!#72r33*gWLd0KcF>Rp!x^qe~>%D7##o8!Ept$4^)5gi<>}HOfo}U9H>bQ_c972JUpBsE-snD-PK*7t9RlakbgmCJE+_OwZGx@ z9yAOnjbI*oo5X?A9enc{~))5`~{+6 z7*x)I)+vJO3Xm8<|4+f;f6%$$eUtaNI=c!K7M0;G|9pIW7&5c-8Qfgm1$z3Y>;diP z0ND$2H>hq0wX;FxE=U}d&Ol`VD11O?yBs`z8oXW(6#t-f2ckjiI6-GGg4Vi&)>U-% zO$N7#KzYBhy&Ih8LHP!RL3%)835qk2ogi~TVFId4LF+3)X$zFrL2S_47myq%Zb5Mm zau=vi0;=;t{UK0zf!qu-2jteC{>gjXTwDcWViLe-SD-{X5(jinU{OgqgPW_HK<|X9 zdq8G_^7yQU%fS0hKrgyesaI*{K%eg>Hb@+&B9fzkt6C}seu?VCuf|0n$i ztua1&=EDD_tJZ?Y0zrNUhXbe_@9g^zN(Z35HK21#x9>XyUV9HZw-&MfYKGHUIY09wEhbe4q*RJnF)>uP}>P42Z?*gT1ikJ7}P!hwI@Jw$o>cU1yrVm zN5nB?WMrUv8i@y5s}>ud%;4$aDbPP@+8$6^0>uS*U*3YH;B)Xn=7a14g*zxdKw%7O z^Bq5b=|3nPfcy=LPtbZ)(Ebn58dOl30NM`%I`{X;>GS`OoVoD-*tv`UkDfmN|IqQ% z|Mwm`{(tAb!{EJAp!xt@mQS7mK935N{%0>(2JiEOW-HQa;qXCM4&>k4j`r4%{*Z!Y1 zZ!tJdL1`Mah6}VF88&VP@++wP2eo%V=@^vvKx~j&5Dju4$nT&w0myA28dOh##-~7T z2Du%i2ILn{PcMO}*d&Iuv^1m`M`eP}{!C8I0LTA?$q4_0>SmCcAoD@t3kqwnxlWVy1Mk5B`5EkgXg>;M2FT4Y|AYME>ER`i znO(>b7#N7^X(S$~{!dCtXYlg$5|}t;#vYJALHQ1pCP8;Hfa)YrJqWT36z-sMw|C++ z@LIrgH}Cuhg#)M@1Nj%UzXo*9+48j;!2Sl6YoKu`7%|3T+SgVvgZ z%mw9J5DhaQ zU%Y!Cyv83gCo&OyhB#<{3#e@9=$Qx}>jI@=ko!P+22>`3&ci!@>+b)3Cr*RUss@`q zcMwx?Wier$yAb*469~8eJKFB;!T?eWU!Swva;B(kPZU(s>oXX1gv?!c+D|3Uj*LHj5` z=>TL8DE))%1*HR!oglx0!U7Z~VE=={YTn}iV1L8t`Abm!KYRXvkpDg0+y#n?%doC7 zg#`hq|C0<#{~n$Klc&wv0}5YI9Ru384O(jp%7-8~fx;RTSD-Wrs;@R~+XdbWw0_%; z|ByW@lfY-0gZ9;c>Nrrl2NdVq_8t0v{qZyKS?9}Eulo}-bPo!9ke@+e0p!fl$Es*@C9lQVE zdiL`F#_hZQgZhBrxZb(vKWI-5Xs-aw|DdzcZ$5qg|HjkjVD-13zXa1DF;G}tfAZ}A z(es!7gZB4<`~&hoD4s$72i1WvKFB>_|1VeyK3^3i50ZmnP+Wo3fZPW1Kgchj`adTp zpP>H}5>ui6pR)%P$Dq0hWEQAz53>iH2IemTk4=H# z4FIzjl=ng50ZJ1f|AXQKbdEA;`@j|AYJh^M7t`0RyOx$B1~S0I2;B z$|Ioif9lM+dqC+NR1bm58&JOfyxF@{DbNuP@4|a{sm!Bet=`pSbyK-|5Ikn{eSHI#sBx;y!#JoPk{E{z{+xv ze?k5R@j?Ax5C(+>L>zJ_4~PxIAh&|fUI4irnY<7`#Ur?tke1F_68WJ^G+L0IHL>@7WLDyS07q{{Nu54YW6Q=Yd0DG0<6v zp#5uLzxGc7&;5YX0w|4uXb=XmK^Rnag7!v&+LDjnefSSLD|9L7KBUDf!1rK){15Wq z{3WZvWgLXP@;^d+CHOpBkpDq$2GviXvJvDLP@IC|7T@?^L_`EbZhjGix3{;zv|01^ zfXWw;8H-o02jAxevIi9YAbUak13_kk>eron5B`7g<=g+A`wv3qBBsvzzx&`}u-M59 zm;Zyx2hf?cpz(k$yY~JEVRSZ#56VBFzS7>qN5T7uo_+fI|NM>H|3P5@vKJKRU^gsX z1-=6U!CnOp0~jB)RvhMkkRPVcnzsk!f6y7Spfk!aA|5ILs{iwgN*R2-eFUb@p1%iF z|AN~4pf(t2Z9Ax30%4dtKzR;S5ANQ7=>O|)KmPAJa0tHFeD#LS|3Q10UVZ%zmIKKX zi(h^H@&D!5@8IwQ(V#mpK=+Zr$~92l2Gs!|8ic{(%OLyeK<)#%735}++d+PqF?;?V zP@1l-Zw8++1NANj1v+o7q@)7ue~=!K|3L8zG7B`O1+oi-LH-BT%b;=qRKD&xa2V`I zi2rAS^9*P|?V1f+{_j3`^rCWEvVR7;1o&PJ> zZUom2AUB}+AAG0Q8t}eCkQ~UZAUA{D4)O!YFW%lh0;Ltzc*nm%c>|P3yuH2oXUFCm}yWlVY#WyH@gWa-XEx5dgu|YIw zj|IrhAh(130P+hs{Wml-fYvBtL_Aag)c;A%$Y${L^x~U2ci~P@9tWlGWotKq@67;> z^MKmkpz#+F28A`K?%99%7})>&jvV_B@+ZXqpu3ik)-izBG(h_5pm3QC-Q$Rx4O$y9 z8(f~unzsmij_u1Y-@tq7K`@&m{(?(QD^MWvMt zrlzJ)-(pgr^q-WT&EVqd&O3ANqHUnM4%7|@?LPsHN21sVo$CPQ15o+@;`7)4x1T)w zzyIio|Df^G?nbKau$ zp!5x@<3auhjmv`a6bysJK=y*tA*gIRf9=M9P#6$f#*w2AR2G8Lz`3i}A@fbEA@gYv zw?Nn+_kr9B5(Bv%Il_2x$IK*TRNDT0x0@=DbBqKyeGI zKR{-J#`8gQ8ldqAQ27d>H-Ycy0o6C4F|1wt5B)!U;`IMRP)rP)6ty7p4jeu4f8C~S z;Bgg@A7So*yJ^iv@Od>LH-p>`@&m{(5;F4argqMF%RkV5eL*QXP+&06oV#!ms4fAO zAD}V?v_}nL*Cz0JCNMszyaj~~C>%f-ls91*R8D}|tJj0;aWEU2PjRxrYC-vW-G7K0 z2n{nE z6jZ*!+7zHYbf9t-G)4o$pt%VcAIx44y)OxLrxI+>8;lL2K^P21JA8U~CW#!XR-F z4Z@&u4Mbzdko~|QH-g*>ax=*7AU{l+KF0^N23S~B43xHU;{E&ggYP(5zil@|TlWOH zh09i72A!V-N<*Oh1e(VJ&2570hq)EZ-U!*>i;E3X3-bpG8@e|ZrVr*nkXn#Bm^g?A zVURe824NI7bT2W;Z6G&-+zN6t)a{pByZYroci)26H-gUE#T5XxwY3acnVAg!k>I_c zO!F46s0Za=5C*mRKxc-4%m>YDf$RrikezEbLHGV{1nmpP!UoBMFif6QHb@@`!}KAs zL2dwHkek46+q?tZHvqXAgh74)9n~BZlf;mgn##b*iQ{rlXrO?`M>N#c7&hK=TJ9v*V zn7;|KCmDkcQU}8@^&quy_IB{RB1j+DzD?WzgU)RSxe4SpkQ+hmG?1G?Zl5r1w!-Ee z`xxXE6|wFQhk6@Mf%cey$^nqTuRs4m=gfO7UA6uhC{01l1n(o>vG4GIke#4;i|u<3 z{NK83|9{XN&(>Z0{)6T`!I%&mBoD$n_ks0-^n>()%>s#mFid{uzW-pecY$conQ{lf zb0#1+faa7z^Ua_!8ju^I^~AHeibjw}3FnZD725!!wYZ85npN8@nelFqljSpPx<0?=bnp zhYvFp6%{jV-g}gxcgidV24*hCh0E8tFI&9s9hz4O$8UoQEObQ#M7Sz@R(@6G!%mKLp#M3d8#C2N?RN&t*7v;xxm&C97nYuHI0ye9gv-E7orM3TlJk z#n5v&z-rcQ2A|V`!UoBMFz5^qZ1P}n$XOm>eIPz|{1xOTklW@hSt)z`*|}z8H^>c3SFLwjuxzy? zD9R2?43D}Wy;)zY%}IBVV|{d8T+gSOW9{HTFyRe;ZpWl3qWE^*=H{V z;bmZXklgHr%h*A9CbC+n7)Ttf7s;&Y^A@vDox6ywcjkPS!kSjb^OvqMY~8+_Va~x2f${$jh@<6k(O~5a4E!(}d|m+q1N$fq4mgU#0T!-k zG(0}Q=Rhzp*#84t$50PGZv%AnJmdh0|Np@X?2%&_g$>#m1c_<}2KYG<42%%dM#<3- z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5TH{Cz{Z#E-@nfg5)uNQy9ce&1+8K8^6~<& zWdMy++t}EE_qFWWwF^8J1k(qiKYsiOzBd!ZhGEc{5@;SUD=Q1E9_Ag8JV-r=2I24D zzk}sLY#4qHJ{t*go)YLRg|A<~qNoAgnFX3hhnac%_H72xxhpXJxw*OEb2mZ!ckkYT z?<)bZSy@>bTwGijKzr~&XV!!EB7n}*J#*#^!_lKh8A3xtVMY#HT3uZodGg@qYF zY77hv7(i;Qt*yalwt?=c0_vL`pfaF2;g4BYF=l3FGWPWJFvi8jF@of)tE(B4k`fu6ot+soGSV4~ii#K;8X6dji;Ee9 zgM%3J^Ya+2a~V`CYkqocv1vqAd1ySu?|ZEI^|1f9DAig#C67lxRa zXa-|rBL>h}6kor61BVGHjP~r=0}cun78V9$V`H#9X#5kw3HO9 zgoHSow3HN^gt$1Hq=W>UjEpp!q@*O9sHiBrn3x#5sE7!=h_Eobh=>T7FCi`griF!t z!L*c=6uYE^1iOTU1iKhWkEkfSjI=bnl%yoPxVSjG1QdhJ5f>8!^Fd~V_;RwcV6%mU zguvn;`#}0Yav(cF>Oo>4b3ts7IEV(B38Ez>CD>(UWY{D??v|EjlLEP0LB>#W=!tj6p9)^cY7Behew2+~typ*A+dlo}N`%;Egi`Fqz)z*Ps33793 zem1XHS6=UV#7H8+?73bjL6X)RJ7Xz_D z;_O@?^ZCR%U~;_tU^Cb_xuJIOh;eZ9i?MU^h;nfAiE{Bm{K3J)C&I-eAk57xD8$Xf zC&$XZSbQuv4M%4bGnzVjGKndxuyP8Ca$}zC8D>5*%Dl;%Jt1>XLs4=jxYcQ~|YcjBLXfd#JXftqdYBO+fX)~~M z=`e6`>M(F{=`yf$=rXWz=rV9{>Vo+oF%Slcv4g}wmO~ zbLujH*qk6UKzfkGK;mHaAaM`|sX>Uq#vEcXz z*?Hp*!~c!@885Ehz_?=OJjULMolKpx`kC72&SRQ7aVB#~aVe{>PcWycwS$0$p1!!E zs+zo%oPxTjw5*=Iin_UhiJ7y5i(8;?P)K}4bX-n+VoG^xT2^Cbc3x*rZed?uLGk4L z!qRC4#pN^ei_2#glvKj`K?@=0fp25Dk*gFD{>(UyKkhD5;oNPzu&N4nRjWo75Jr>1As$0w$gg+;|?`ve5X+Bv!U>lzw6N-HRt3W`bU2un(-$SNw! zs%h$o85vvf`3Hn@)>hT9PUxA$T-n>pRM6JSG;1Y ze`vo398okP{(t%ev1`v>hW{HbGTvQ&fN9gxO-%D=Pi3AucREYglu2wExka4bzJUT3 zR<@E_`i3eBs%m=rrsnnmp%L+!Ir;77)%9x|o7zsbws+ra>*{;m-rfJHqr3k{M|c14 zj_&?H9o_wZJGv+Q>j2-AIpKdh=*~MLhq@0e4l)PKp9sF&6C?)0ouEC^Jrn3x3RhXL`8M|s?41H7T@5o7;OV%8yN*<9d%6| zB{OqN37^0q{`BlT&dSDS)|!bESe8uN$b4bpC8qmVUo*aY^_B7ev9pZ-&z)rWf94E0 zZfF$sV6*>!{0N~hoMZg5?F8eiH7A%Zt=P-7aNbhp!sdFmu*euL3mZEjbq#GxbV*G#k62t!s7r=2t z)A&DeoZnF5_1hJ1b&jNjPa{U40mx}j$b zLg+>)A4Y@p!q_kxbS4dU@t*%+agfJcl#GI^nzpdBvl~}Odne1ondh1Q&)UZLf5sBV{|65;{{Q-g;s1*lw2%Lf zzZw4j`p5A9!4HO?hi@`oU%HQ}x~z&-+s%nfTt!)oS43Rd(%#9rq_TEKXYa(9pgqx` zJ;0!J4)P-?pM&BY6b_&;0fisv{5a5glAv?t>RUSggU(iiV<;bV9x^h9$hU*fsRo^m z3&zduV7*{=6G9Gjo-{~3ia1DZOUHkReGq*Rb?yJ_pmu`vAY;&ZZxB96JqSbH3Rd3^ zKC>Aj4>1>^z5{F~h!657$iJYp3GzEA3_xK4I@1kQ4uZ}d1BDg%3^dSLguN4AmR8oz zG`Dkf;uH{8lu}R;v2%0cYObhac|BnP=3_#}Asu|G$6#82)eE!SHv@ zGKT+qFEYMbet@Z`xtqn>!HG*)Nl}zjNJPaqI6S1GrDJc;gekvad%!{d0i|(Jyo2%p z$lsv228C5^Qyctj@yhz<|CM!3|0`+{7|gG0`d?n#_`d>qd~svd4GL=VUe5C*FO$$`yl`VVmjra1_;ApIZ=wHM^Rn#TX-AdKWji2I;wpyq?j z0G;a%I`bUlcTgCB&JYBZHK4Eog%KznfWi!vZy;w2O!*B8Q{UjQV0L~%C2@H<5hGh$ z&gzUR<~N6qGXDSemGLjAO%BC0E&uoKW%z&mIK%IwhZyHIPh@uR3gD1dR1#(v6j2I~ zO^j{r=)Kr85qcIh=uCO=`9KrF^)|?lp!^0p;~f+>rPcNSODgOB7gyB&FRrZnUs6^7 zA0$><-SEE*9F|T0E5PyG{J*>wfk9%G^(}BY5Fdt#5if_D2~rEfFugFkvZ3`qR&hLb zme+#PX!C!N*&qxu3q*s&L4E=G3FJSJKZ`1A|AR2d-=$Uc;PeVg51_CCg%PMc0F{&Q zGypnBd&1QJt)0CW!($U;Sos7Lh2`Xg^bBp-OG_)5-k&%Qj`II+-q1AvgYIlOzi%JI z|KFb&=5Y3uB}iW2v|lm3IsHBcD`D)&I~URKlazqqm% z9KUs~UH{wrCjalBHv9jS*$e*9m=8Vk26Pq+2rpdve-;ccSo(kFf+gTHabW5|G#JlY z{2z3N&I}MeAH-e^HVZ5VHxr^4bhZN+gYV{soJ9#T7j*Us%&ys>b1Jc5&^eZ%y_aCT zc=>-2AG9BD?vfS%A$TSDY+La8w#z{0+=B4R|8tkD{0};}3uG?H4$v8v6QR~0GI!l&YuV0#{=5y15OZBBw+pilJatfrK^@Pc)EHs%PDK}F!AzB1%^fWw{`Vh z0J#t3PEff8s>eX?2bJ}pG7eP6g3^9>v$=PzIVA9QXoXipbtPakMMJLqg2&^bxd zXD|2VN%Em&;Q zwEv*9H9>mddO_#uLNUl}5C+MC&OHU$1LA}2o-zY`Mi__>##3hg2e}J$J}5E2 zM8h!HKhr_yUO+J@{ejXUG);lh4k*3Mn7ioz{KYFEd(YNw`rki&&VO*7QQZIzJ5U+` z2HocY!qaB| z2l)qd&K8IU`4Mz(6WHI-Gypos281DLVZr}-is|c zPlky@%>%_X`2G3L#G z2I$~(Q6V8A4lge+@B)9(eywNEo>3#}!RM-i)+T`NZwJj)>*?yUFfcLmY8#noHMe$c z0hL9d_yENLsGb6ir-AyppfU{9wgc_yU$}G?xK4%Fw=?Jd2gN%$d_egG6h>2L{RhQ8 zIKP4NDhPw(6XZ`&y)prEM+m5248ovz2c0Dh3J(wljV*y_kUKy$SPdvmfH2G)Fnj8M zkX{f5rxB?6$Ylk%E&$n&gu&?pbPhcz-5_I7c`#+>e~`ODWds;cnF00-$Uoq80Zu!R zbF4vW0D>WH5K#FCN)MoN0ER*70CY~?s*PL0?PE|r0);6kY(ZfR@*613L17Py18sdn zEd~ZgUR_-sX3!ca&>9L*IP+kFJ=>0#Sumk05a9n`m z3W`Dg1=TAkxPLPE>`~C!@u0RQ41> z3Z(vk+6_uiU_5auxGe#88!SCRX;9h#rzNCx0rCq7gVF^EgV>;Q1za|O()%=MnE)#L zz+nQtBLZ4CfZ9c%Gyn?2#*RMlcn4_Q5fsKCcY@pj3iqD=$selhP zjj@5+v5Qx&1DE;WxSu`;oZrE9AlSc<^RHle0~9u(Fa%+czd+`J{0NCZPL-w2Ko})mK<_mImkU!N?MZNYm^K@Hwj4ZvfYZYq z@VSwovpyEDTK~Vgu?^gw0);WiKOlQSVGoLfrq<5Y3aaV~oE)5-uC6Xjptu6H)vKzi zKv75$K7IN$e4V9*xj8fFPRhubc*pL(Ne@8wgD@y8Kyd;}pP+FQP+uN&ZUv}s1S;oY z@eVKVr-9CZL){U0!sfN4B<}z&mn-?MlcLZ3lO!C zxfYNZ%nXn|5C-uxk0*fEp)FjvkU>>Ng_VJUfxo1@ zI=5%y)E{8GL3MNg6mUF%+I)>2z5hY=*6jI9z-LB6;v90n9XPFn>-ky#L16%@XF+if z3Lj87fy!b~ID^tRC_X^`1jQXFEd%t$>O4@~fY#B0)>4DkS;E=@l%xUBx=hg8WzgD7adB}rUSUzO#^&~!pmGP~ACSL5 z{sxsxpfOC)*cRx_63{pdJnlh$1Lb*W+=J?T?C}q|cL)^Lp!k5r6Ue`yIELM+2BINx z-2WfMhG6KNEGS)o=3qe>G%pLrpg5lh9*YE-1;(JcSkT>lAPlNIkT5uoL35NKIZ%24 z-RlR6Yw&nBs7!#?E#Nc&iGPqDP&mNK22i|%(ld+(g%c>9L*gFPuL1QTKzJtf4g_c( z0f!Z+?+9%lK+o9(g()a(L17FEYmi+aGeL0xii@V^_L-o#;p5|F^YQj(1g(Dt)dQ5o zJxDLe3>_UE(ES389PI4uh89+eZC!nPKz4%c2Dt$gU!Zm$Xe<+SJ|$?J3tYEPoeAwH z!Dv{Tp8;)4LHh2XvJB)OP`(1?OHlkk;u|{O-_-~1|A59sL364g8WaW~8ip~%p?5B! z+&725CIFl^(B|$zYYsqV1SlOrdLIsk0`%@55FZq#%hqlBU)RzFp0fspIVkKw=78b? z6eot}mWm7v4D8Ugj}VeMnk-I^02cWc7q9-7}^@eY~`LylWe`a;3rIrkpO zngGxoJ^1b!&>Vd)ID9~3CZIF{!eDbc5orj*?*-3Ef!33N>;k1H7zT~G!panoJctc) z7pOb}(Qw=inZpOASx|WdN+TdOAPhUAHeb*h;jsT?rP#FL!4?q|cW*|N|9e~=2pnk*Tncy*EP#A;SS)ecn z=?BFD823$nl9-%k2Z|#T6Jzk*(4a9JO5=a^>eb-nI0nnNgUSvN2Ho9` zR#t%0MrSYh4k(cOKxqbqL2OW30jCRC-2%NQ4dfRPhNTG*8&pn!$^Zz4v>QO-07?Vk zJOUnzg7h0ed`KA1fR9sy&On^CXc>5o3&=c>UQk$qasQNe+4;qO3=9mMzCJ$SKH!}@ zcfez|;0Ppx0HvLE>(+sF+S%BE8xV>?;RO?i(I7Ecx&yP(?k@(5f!YGldLHanP#uqkL3J_6{m2+32AZ=0nE|#B zWHxAhD5xz7!r(Fhvfc}pkHO&t9Y+9#5h(9~$^j4!;)Bk-2F(qC!Wv{IC=5Y*Kysis zDJ-ju2F1UPwKXWN7(n|BL2(F|f5MI7v%m3x; zxBQ3E%hqrHzib@@FI~6kKZp;am#p3RAB@**{J#W**KYj3c+H0Yi&t;>zX)_6>ZwiYxG5GEf|X;*T5* z(hHjV1?e?`n8{sP+fdj$5jx*D5pq{BC?A6AW8XpsLv801$F z2D4#fETFgt-7gMmZ+G?o2c5IOZSO(wS*xIPc|qs!!p;l^je~&BkcMH>qJ0d0V?Z2WdjI<(f|m9 z(g7$RgTe)j!DYZy@c0ot3@1(nhb^do1qy3Wn1l4f;vWZ`CuU}{A?d=8EAx4IVpftr(Q`c0{J8|kCkY7OY3~~d=Eui)m=w9gQa~6Qd z&q4CYZU^}bRL{ZUAEXbI7eL_v$`_!#52{B%>mopB!h+%$bOt|YZ3qa%;sC@(#-OkV z#{=l@6ez|T7tlLyKxHThgW>~@7cKt}y6*wJu4m!0|1cWV=R(GyJ2yc5Sx9%Bg4v+8 zN%NNc2i?hozz{xYJ`Xg<53&nnE+`y8eg1cxdqf_Td{r%xaqFunvK}0C*74Te z`@!eqgUU`&{DSV>Te@}=q%4M&$xs?x9)rqcBn&Q_LFF^7Twb;A{~}QNylUP51uNI0 z;uUND&j;bS+W9*XM^sK1hZHE zpS^fF0)y6$LDz?Y?vnzo2LfSG8UW4ng5n<3mH>qvEdD{^1q(M28;n8yWzf7eG!1~v zSg~OXIQ~KHA&`Dh9Dvk<;-s#jxt@W6fmcC60hCu6KzrTE$@eflpfd_U`5(0RR9j06 zWF~JzV{3Eo#Azt;59wR={RfRvg6cZ3Kj3bM%!z>G9oqf}xfwJTf}H=sX`p+;|4Gwk z{Rf?M4?6!DlutorDd;?K(Aoh|`2ec-Kp51nf?#ML9Mrx7?b(6WB@j8tSPiJJ1Tr5% zL*@lQ_xFL~0wM;*(SwwBDzrq=ez(rArK2nwsGFZ)|F72lek@?gXV@Q2F27)&GCh zrfuN-4|6woj2D!4VHjGDf!aEt^Z*JYP#A#16Er>osvALZ3yN#dz1g61ut8}6R3?D# z+XKyyf!aPG4C>z@_YXmAkQk`%0HRSacw7M5_XqX!pcoW}pne>fhW7D5X&K}OP`?i3 zFE9=3L-c^gkfGy+png9zy@B12rB4772kn0V)kmOu0u=wCG5{n7i+4~sfWi_K&){$a z?qh@c03dTfcM5{WlR#}R&^h57x9|BsW#-)fjjdhaJwTv12c-ot29E)Bfy+je zxQC7lg5nsIHozD8o)(!>+20mF?85U6dmzI_?fX>(f#U(iybjCC2Y~~j)UNC5BLGpidb6XcE zt%2MO!XP(*+yZhFIR0nO1Gig2X#kdPLG=L`!^{6^;Q3OJUQiwZ<$F-rf!cuJ{01JY z?E%kyg5n(176jb`0J?hubVmSaZ3HOJL3>C*ePJ+e?Sza6wRJ=2R>b%aI6buYfYS_Q z3p&xrwh=SAryo7a5sS50mYzn0*Z6wv;ktn(f~*f#0L2RJkA47&y&FShJx-G z1(jo=@+~%3bMWqCKw;6)(h1#Hh1hQeN*Cz3u?avunT)PQJEoP*LYhz7+yC>?_^sD1~fZBY3R>eGPg08sw{)TV{x ze^9#t8uy?%TxdHFl+WQ9n*Tv%C@3v})(a!@e;+svfx;4`9uy~_xBdxL6fYQX(J4Gncr{PVT6wDnD)iu=od+{~))4+z4_jDDNZ6|LNc~0a6dc zsPPYpdr-asg)0a{%45h_ET}!OW!L`y>o)HI-&eSC+wT9MF#=F~7_`S4(vF+>A9Non zXv_^v_kzk`2nOvphS>*UgT~!JYiU8@KLuPCf#hKrl&3)P2AbPKU`T%)A`U6HLFz$q z42o~e_y>(`PyP>zYfwKH)JFxi13~v~gTerk_o3rq;P^+3^Mb+;6z8BYgxCL*XMo#Q zYq!A4|2}Zu1DOSh|LOl>@h>AI&AfEkG6vASf1tY$L3x=R3|jL6+E)NdOX})s(D?7@ z?T5xc$X-wwfcHvwP52LT8z@dd?gnAF+o9@VWdMi<=>wHtpnL)jKj=6sDDF}69H{Np z+4mom20-`3fbOeXvtjH1%{%t|-+A!p{~ZU9{@;1%*#BLJkN@9!_!yYI^AJQFB)8+h zk^kGFc-#KN|3Px9mCaf79;$|2OU0_kZKgz5h4t*z8NvL2VL{AK)02_Q2~vCWGrj(0CGP z%mUN~0F?uv`V-`TP+9`TA1FLvc?A^jAPfpWkQijG1Y{l+6t-)(?1Zd&=}mKn5H3v}lbXdMtaaSzgS_wHSWj*bp+{)hGdTH88%CxF*OL+0{9 zc?F#Idnf&0w{_Ql(0&(?n?Y-RKLJaX%QkT|H`1FhKwrDsri2##Cuc=xpbpt(>`KL*r?0mVJ2E!aPK=6_Iq z56b7Dcm{e=RZTJ5FAPkCQ@V#1~yS8@j1&=9!?oR~WF9p&Aiepe*uiv`s zKj^+Ga9qRgVcWDFeAg;$ycskW0mh*F2-j``&%=V+BA_-YC~t%0K=BIm4=4?Q{0G9I zx)QYC2{d*Li~qh!kn|4=3sBgA_KASf0T_eVNkP{IPKU0QojMDgw?OV~?FNmN^@Hco zL3%-LMCACFm62gyv}h6dY)MMifP=<dHvT`W2}+Mx2E7nH_8c7f~!*$wg|=$sXh zo6zGQl%^r;7a(N?NIlrklcqz)OrUcBpmMXPfAarbhmQR}dj8V?BWExC-+lPle~=is z41mQyv@V!2cj5n?2af#Tw)?>UjoWsC?*#>o8Sg!E;{V1Sd;YKA4#KLGD|( zb?1Lj84AwVn|J&N<=xerw*6lPnkU+@^*?C6HE0|QwEqG$o(&prhv1F>K{V*Dt|hD2 z{|C)=fz*KVH7E^$(n9aV>EQLppfn9C+dvo;|KL0JKx2$cR)Oz%2E{+P9Sp4(LE(ZD z|KR+CJN{ch;n9s5|7~rZ;PPKgOpG}%KcB(S(2xPNc8An_4^t0XKM1NrX3m_+psWmO z|F^Yu^-ch}4^*B{o&nxV0m`E&`5#(_fz~gA$}LcuMkxb8`k-rOL16`o|K9#7|Mwg@ z@&C}tv;RSN!R|hE^ndS!Dd6z{u=$|4hvCk?|1;+;`oHVovHv^v9{dlg2SE89bY~uD zpCzcA0M#KN8q_v{r6Eu{1(^lHptFNO_JZ1uV7g}_e7!g*AA{S8ps_vBT29bjfqqE) z4=mR|rQaJ586WjX(NK-8YBnG|DZM?sGI=R3CQI?C~P2k z1+)hSx(;wEr2GV}p9aZ+(g&#i1EpzDUIY07R{n#+7ZfM3_?MKF1o!_y_g+4E@&p#0 zB-5btTBD<*!ROQ}DJg;TKT7;hfs|t)w}9I2Ah&_s2#Rx%n?d7sAR1H#fZPc3Cn&9h z$_`Mw2Q=;pihocX^z={pzx(j<{|Aqs{=W~@raN%>e-9}Bq2p|jF&F6CU(g!8u6}SD z0O{Ga|M35ua= z`Cmpx1|0vOb7XJaxIuEf!!&@}{-Ar}K;^%Zq9Q2%`P$pNdM85N2y!>5JO_mnXs_Ca z?YqHqV4!>t!jon|_j$q8gX%SC*#UApC=5a21q#pJ2~)xO9~A$44;=Zw^T1)yy5|4L zc^2en6x`MKA9RO0sNC2C>I>{S@PF^2WB>OaJ^6peoCW`z+PeNXLC62V@eWG^=5N@F458KyCxYJt$v;%5#u=L2QuwLG=M>Y--u+jsHPq0VobYegesX!Ucpu zVxY7Esv|&g4=M*HOqm6adr29*P#vTeimJ^w*r z4GMEmzX4a?f8XKb|99^@{Qtnw zlmGW0KmC8^+=cM?2kk|Nr2!BdHqHa88^9P^&Vb4>uz#TQlc2Z;#W^@$LF3lo`B}(% zO;G(0>JNa*0MLD%AisgywxD({C|*J39w@9pa>(@rC_X`92g=`|cm;(QB&_EB2Za}W zAKakga15(dy& z=A_0uOg-p4cF_67pfig_L`0C{A5u4g(j6#`gUavr-pP>opT7jMmkG3wZRR|1S^&8Z zgh74==>cJoK2RG7R91q+A#f8}=VN1&;f@2akg5kpm~r{0Frao51r0$m79~a-q2$QV)RB0@Bz&IL$%Z z1EBf|mIgri8k7z|Jof-{ zBPjk6`5!u$J#p%PP`eJ4ufgU2nvLK#04T0OWg18yB>rdq2Z@2|e-H+h{U8j9e`q@o z+Q$dwc~Bf9V~`lQT$lmLN1(MQpfM_N`QJMc9QKI#pZ&k1qX(S-H8nKA^FK3Y%wPbm z;UGEUp&CH_KhV7fpfLn>HSqW!FUSs%`$1_ARQ7<%AW$6%&;JXSg3~K<+69$yU<`_X zCPX9l8?&AMLCr); zn%RH!{_}No z_Vi8$?MZ^>X^7o-ms|DgK6f8w( zf9(9_|A$YW{lD+n326L7)^LF1zN`N~=sZmD}crpKyiNf)Y<=sPn`LG=-4T6IsvsCLF0$8@j}oVB+%F* zsD1~v;X&m(s5}SdZ4d^vyFhh1XzT|T|C6T80q<)B<$X}T1YwXEdi;a-a)9F=8jhfN zhvf6QX!Za6|Dbgvps__z{Db_pY3DxhnE*N|SibP2Tg6CD4YoxQ!F{XMWY9Vi??^&{vktIfOi{Rf@z0&*|NKcMky5DjuW zC{2L;334k)FGwG#tpo~JQ2y$lH0}SvQ)j{X^T_FQ|Mwq1^&cb#j#E&Z4_yEE|L>nX z{r}N(7yh5Sc?XR59Xt8IyKfSB3=&jtgTe)r2IekY`v35m^Z&v1$%)hd51u>&&gX|u zpZgEW_s7m$_f6_5VTf3eMM{zB?#?OrQN9k2ekn}eLxTfg%2nkKysjZ9~3^Y zumXh_2!qx?fZ~4IoQ04yFl#QjJ`45U4Q2y7`)n)$s z_b&rz@8<5^yGhFP$cjOCa}*U7F&sU1j6oUN|L^ST?FG%hgWWx2F1XDDZo^HO`hUyr z{opff!0w*C;Q#cw5VwQ;0`e26j05YNIS+jP11KCJX<+LAiIb=Q2gS|F%U8ki1F8!q zOr8!t9~B&@&@=!VdpvgG(*ILeZ~Q-X^!87Ns{@rKAoZYm!Fh|8f%815tcS$^ zng1s*UHgCN2nnM7M>4WB$!DIUCxBOqVelyq~pfO_5dIQinA;|rpxCezb zDBpt0Tu}Uh;~%t+95e>7dOf(E4l3I~>LC6EwK?WP)*G+c0G=xXjU9sG8WiWCFaenj z3a{yN7ySpt^|Uz){)6N}G72)67#@V^r@b~a%OIP5`r3S<{3PC#)3 ziho%94|EsOty{N{qm(2zX#D`F{s*lgQC5bG|A5jM$SzRY1%&}94T91lB>(RRr%{-{ zK>h&v59C*n8^L;J%mMcaK=}ler@(bU|CIj|CQS$DS5TZDJAVnBUnfkO207;&8uy^~ z9w<$K%mbUKytsTAp+dBKeXN-g9jY0FZpf$FjIRQ}H4m2JNTGIe>FDPC?=>UW$PMZTg z!)+sYO*v?e9~3U2@)(3c@d64TkQhh~)c*&y{XuMS{s*;>K^Rm|g4&*-d_HSFc)cJf z%s?0vexNh}N*^FTXm1TX|MyP@?;8f$0SZ@;J+SyU(ANi#|A6KIKxYAv6zNEyuC9(D zBO`-h&)&TZnvnH>d|j~o4{qbn0jI$(&>UX>6mY%)xe?@6kefm28ALj{z3DC6QO;;{{N8te;J(jPh7f+7XP66 ze#n|)P#FNK4?t(SgVF#fO`W)S<^Peh=fUQK(gCQy02&JbwIxA)7?3|e?g8y%ShH#S zf6$sUP#+KEA5gvr#VI&{L(l5~wdIzr*#OSpAT}so!SbMU-eyAkZ!_op2g!lTeGt89 zh9|Wt-S&H732p{UI2v~s7wO64RpRC zD9*uY7gVOrUI6wl$d6z>GePM9QvQR=4p4Z5`T(Hv|LEC^|Ib{%^&eCR96odIKPXLr z;}A5~1Dyv3#sBe(m;Zy($*IfNkjj5h{+|S169HAmLI)TVT&ybus??0&Q0L43U{7;*;09;pq!UUuT6kgzX2Az8e!*d|@C+J*L zP#FNK4?yPxg66L~`yuCzfZPg-1CYBwaRQ5f(E5MS8DJhB9t@Ps|0g6QFo5R&E?m6G zpsA?=ZvSD#|Fl{EVfFvkJqN&N8G_sjax-Y(1EdUqlxraWg4_zipfVDaenDjbXdlVM z$us^RJ9iP>rUS(dD4)XO9~_s^I$+|I8UIgQy7K?bja&auU%l}k)J}lZ|IqjckK2LP z6HJ1f4FpX$p#A}<902tLLHa;t!I|qf!Dh`_vG6~od%XCJs60M#3ia^~9qvo~)4 zKXLgQct00t90)XC2#*U`UWC#hf5F^8ZT7nBK_ z2DLvxZt0!`ivL4kH-f?s4=Ni#7*uD0(hjH$>zh3N|KzDN|DU*U z`TxZ`_rY;;{QSlLlcvr9pCt>9Pw+h4#Q&3~&HR7r$~AC0Id}6mxX;)(VG2B*fXZ>0 zdeD9k(0CE3-3ZG6pnATwv-kg;1xvtb=>zi8 z;|Y|0=PvvYazDsVpm+nNV-USy8R#6}b>MbADF1`hgXBOM#0Kk`yXZft&WFW6sBQt7 z4U+?f6^IX78$1(yRyF7hYzPLGKM-+9+E}=B)qimOL)YGd!X6a&;Pf_o{{J3m{7Xqm zvVh8MPft(Kxh+UBN*WV%hG&KY%bOUxVBa^9#ryAU|yB%7lfx-pkPf(bF@;)ehz~%q++2B45s0|3p|EDfp`G5Jr zqyHD~-1~p>;$@uq|ID=;;B*2iD?npBpt&PZ8v&H>!TG;;61a}Nbm#v6>yMxQzwzYx z|J{d={_g;-n*r_VfTjUZdjQlH0GR`-PcGei@E_E!1m#zdA31=1*Lfq2DPC;We1}CpY{Lr zrK|t1K78^Y6c48^Ujf$%pg0Asl?Kfbg5nr7&vo|t&Hq;(JOZZyP@l0Mx}OxJ4%C+b z=>gT_SMERhf9=r|a2nWi^!R_!ePW=x0EEHw2A#eC=Pg23{jsj46Ll$4OZ1w-``w;a%DE>il0Lo9GH7}sJ0geB_)_;KR6NT;HCo$^5 z%0clDT0;U#ONx*^rMw_JKz4!b1eF1xd<-7LnKb=BDE>ii1eIklw}WVqe?k5P`4^Jz z7lQjgAoqjn08k%b%CuSkPhYF*|M?rY!1i9ed;kB{hmXN+5Ky}fw2lNc?+WSQGP|fXdVvvlsmD?U?{>|H;Zi*8hO||DZd2z>!G?v2Wi#@c!@LzkkEV|9N}+Cia5X zRlwpB)cyp|i%gjbUX!_G#oGTMH-j+fP6tpJfzmLzd;`^G;5N<@@Yn{Z>;m}#R0d3& zG3Wo;E7$+uc={Y%2AsKi{r}YIv%zazVe`bGv@m7H?Ee>T-UjDsP#OUBSnvkmx9{<1g=qcE|i?{FoKXB{>1Rp=~{{Rew#Eu^Sf9d9Ja6JJkdq8CY zC>?^@A)s|Vv*#@WpAP`a$M?dt&bBSHQK`4=P)#tWB$?{@&D zB`{vK4r~@g-Ln6n@B!%q-5&y0zi2t+{DDQw!0JGDfW;Rs`wt3R(7M-N=-NwA`wNtx zKyd+zlfJ%*;P{u3mIjaifcEa3IB|lEn1^Utym&D~S63Hw{WoO(7Zm@XHP|3~LFG8e z4WRtnGkFF${y}4$uyhM@H^`r$xSutDDLCDO(mN>agW7-~y`ZraQ2c}9`s~#k|8G5e z0gl_V*KYiuI(-%-{z2p2pmmsilmCO`|JEIFI=TMj8Mw~~8Ycvm5ukVnmqimmXJst> zf93u|aGZkjGbkP0eD>o1t>>@)-+uY}{~aWJ`^BsOAURMu0jgIZ_%T@Th1>VQ<9ncW zW}vYxaD0Kzh=Ag`i&p#x#XTsVKz^OQU>Ugo0P;I1UO{02s{cW01cX85KgbMFn1JNK z>K88i56UYb{UA9IhOi;$Qh?YXwcz;Qf8;+XtU+T{pzs650VpnJ&RO^$6gQyqUrtUI z9RHyDAG8Jx5}Txxpz}XKYY0H)KWI%EsQw4p0jgU;c7p5%xdGIF>zRZW{|g}JXn@=f zE7L&bBXazM+5q4>VCqb8UO#{B=6_IJfXaY#*KdNwKyeDn*P!?XmGPkX2j%5k&tHP$ z4Af_w04noAYjr0~0q-jT=>d%s9Xose|J|2w{)5s9C_h8mg3rKd2V@5de)8=9^~cY^ z^$#c=!0@eSFTw3m&^X_m`HTP0S-2EjSA+66$Zw!{2E{!%&Omn-K`|)qVPc><0@N=8 zVNex?-41?kp7XKhQ7zXJFl{aAif~DZKLpwq7KWPSd?FT6QKyd(y3s9cy?S&hefq>OYt}4q{s-+T0mXk`-=tp9I#f`Z1F{!f{)5hQ1n2*w z;4%v2UYOfKG|Zo%u?%n;n2){uzi|B~IKDt}3#yN&&X^63Pf%S4ic?S;m^x$5|4Vo7 z{=f6$_5a(?U;PL58A0toP}%^EL&DU8)(+2Eu=xMcv*-U`z5nq4HBemu#n&G^{*R6! z@{j&sd+_N0wfm3$-+cTGoW4MP2T+>4boT*x-v_8J0Qm`qLGc5Nf0!7^{~&Qt+5oXZ z@eiseVDS$V2g$)O*bGqF4=qehNfaVKOSpZ4{Aa{e>uAufKXdDn!|6jO%>;L`NZ^32r#hbVPgTz4b30hMH zqCsf@G)8y%?!Eu_UP07>`iv7m=MaMOe?KDsgVciB1fX(Y)|>_Z=YsO?yhZ=#fbiUf z|3UMAVD`L4U^a+9d(MLYAhjU8eAT-Dm+ssHy9HDR+_#6Kxr6M z2TY$i_y46ExBowQ`yL#(mu}tpKYivL@YpaYeSz9_pfms)$GLj%{{Q=L-u=J#`tASI zm#>272|;Z`c>V|7)d0OC1vH-v#-Me(pfmhIeFPW=@j)2Ww&q{@;K74&0^y%?p9*0#JJZ6hEMNowsNO*sq{C2e%29to#o;y9UGu z(I7Rj{14It2@^>D4py^t6?lFh#D-yzI#9X*^A|1u4+>k*o|oRqkTat}VGjyNP@M{j z6HwfM;$L1)j``rhgA4%y0SskjWn{!WLh}?!EI;Ic}bu$Zqah^+yJPb3`zr_vEZ4r z=l{Qa^UnWA??3*(|K|Pw%XjYnpD}A5czg&nPXtP1pmYH0k6pX}@c+YiAHZql%#~~4 zwIksC4vKfsoj>q%W{~c90`ISfo~;R$??pPt0F<^s?F^VXp!5V<53p$2N^t%0;LZF0 zpfcd$+xP#kK6vzh#kx)ZLF-FE;~k(p4T@WkUtt&|2ErgdsQm{TR|N4Fty~8l4*<0p zL2@7r(hHIUvC%O|FDU(h!Vna;pfK*63fU6~>i2=;e*O~h+E-BAfZ|_GO^q2e?+aSH z0h+&s#3tz^X#EeU4FM|uVe5ZDc7WzgLE{^sc04Hlz;QEW*8kmyj{RS@YCSj|gVHY8 z-HVa)#d2_e2UO;P+>KlZfa3bftvmmpeE9VL;k%FjuiU){kAG1A0AvSf9p2123;th! z@aX^J_n*LN1=MGpG#PT9Bq;8{@i+mp_X@;@W9XPUD2_p6XW%jcIsQTA1ymnM4d^~@ z&^Qt-4S?DOkKTdO=DYuo-+%mn?ctOEp!>|`f%;6G=zo0$*q{lo&2WajGG=>Da{|hvx2x|X9;(rOeF9&i1Xsv4>EdD|H zfAI>izrg;7)&Zcf0hMEra&H+t|AYF0pfB&F3IKto{J8 z;TSpok<^0B0GS7>PeAhtpfs>}*{c87A3py7_`|3FkKTRw|McVM|JNTq`43tnG=K4O z@EUV?ye@&nKPU}=;}jIvPz=t`pg4u{Ve%kx7#l`|%!7p?NDQ=(93KBuXM)GLLHP(0 z|4aUZ;s%ueLG}NG2M@q=e?2`tkjNy11nnOI?EwSz1Er;;!1e!x2~!Z||NO;ZH-Pdd zB>oZQKgjK%@*m`GI0lsk(DEPTW>DP)N`b zA5^!1<~cxZ#EH{p{hvL5(f?bIp8S9Q`Ro5@pTGXUc;nW8P}^bRRLEL;(D?8q(E7`% zv%qJ`f%%|$a?o1aX`p>8v%qWeLF+dma-cgwA!jF#`42i%29*CNOq|jS+T%4FI-Ub6!@==Cb=LnqhmZdU-DwJ{+dyd_-LD`&fXV<6 z2DJl0X&0m)6#t+$_w_sX{=fSA1DpnKJb3tj)|~m^y^o;wA!x1ubT%xg|8?u(7vt6qNj{{Qw9 zXc}0w?EiwLEB}M?EU26ZVNf`L_#g~ogX;MOOIL%{fW$x;BEA}4XTZcj;_xtBy7K>u zH5?E|8s|ybr5 z-s2CR>s!7C%m$?c7zU01fx-pG2gNUl4HgH56%q!CgVci5fWj0M|DZ4ig*7P5LG5Qy z7=q#g6eklWP65~dp!0vWZruvb|Df~R$cTEdmQ|}(F@W~}-ne;_0hFdd`G4Z1slA|i zQ&9YY#=t=F2a1~s)93u(cjV;%m7x2Km#+q|jRW}!6b>Liz%bY^%T|N?O5k?j{3YN% zET}Jz9{->;0U93$^$$R81kgD1+;P#XCD|IX9r;5Fr-ej|9T&&qY+wV&W{0G%hjV(ov>`VR%=Wus8?P(6RtDJ^<1Ws{^pbKd4RsnGNzQ2!rxJI33KG`+v>)P5;kczWV>>qsRYm zJ$^C(_%Yb-M{nMO>x1W?L22LzI1Q}bv<*CVuy_Ub{146(%T~j~2^7DOuma^9s5nv{ z0<9kbl?9-%-FxID`2KWIxPZbQ6o#O<0L2L`{y}SXKyd~d`v>jaBO~g;T0rYZK>dHv zI$+rNAIJ`nT_8I_c7xI&sC@>Ce^A;4=YNpjmV?swT4;Jk_zRo{maPW&XFy}*uy!D5 zeC{Te@*m_+P~3wsDDGhxR2G2NYR#Fy=>OaWi~obhV?cQBf+bM)qW>T{2wn_TgDeKo z2eKEG_8{sY^2p|a%!J8-#6j&35C-)_Kz-3w>o$VhgrM>OR2G2B5>Pn++F!D0>8k&W zpz#QbV-NJ?1>L8KjOY9Zs{^guN5UX65C-j? zM8=?U24Wx745%KkIB35vs2>46%VNUh8UJDZ0@O6{0=&lvR2P8!55w>i=ooDDgjkF?ek}s7~5<^wj@V>$ae{9W);d@fYYm1rS~X zzE=U%o&og-U}eDkg-cQ5|JK7t|7Xuz2sRt!S9m!vV-94^GdTW1Ypp^1EI@mTAQ;kC zfUrSr2asM64JtRlY;alur4fiZSjEA6Hy~<|^?=L<@j-bHg#uKyA)Cmy!gLi%Z~q`a$qsEJY2GB-T%cau(S)XwG}|^1(^8qwf`aUf9gLdtU-PP zjlm(}fBFB3lcsfn;s~_<dj(_M_ zE~xwlh2g~MbN_?RUjUuW2uicy_Rp&I;I*+ZK8OZm(0TmJ*FeTWLE}S^Y09Dw?Zps{aA82~B=Kp3*;0wfNS2Vsy}5C*X! zYGM0pAv8!Fgkk1_)PgWXEoh$#L>){XG}j4n3pCAv(-NeN0F4!Z%7MF2pZ!Np19zXj z_`hk}uK!DxuK|zWgT`<`dqF|z0K6s`8b(W3Z}`7t<$Cb^893}#Le>?7)j;nh0fj9n zj3@xKyQ7Sa9prx8Q5%4e1PHw6jv||TK5DJhw))Fs4od)!)Van2;_7D z7e`vh3=;#UweCd z2GAM6kk}-TjEIN;YlP1K^GujDt!e(^75~8T54!UL9{-T~ALK?*9tXJ@?oUu!M#ihw zL+U$N{4ZJgf8ml9|1Vy@0qxg+|Ns2s=l}Z-9r?d-$@2g67cKoiZ{ZRoy!8M4#mm5J zH$mfW$awyuW#F+mWHHbhPi*2~bHQfA%m>j+|AW=S#UWxK^T6T@Vf-ckL2XT#yWs7_ zd5ivU*}n7t5qrx(&FJ1v&3j@k8pz%4-`Awib)u6ZsVUV9d7{rEQP~L}$f&2vS1B3btOIH5h zfB5MCS6{yUfAQt}f6%xZC=J|w_Wb|tCr|$0dHm%69S{x2Pto}3^631hSj>Q`0htZL z*vtlrgD_YQ%}$Uw2tRr9|Mp{K{P_R#_aDIZ0BDQ|lm=dZ`~Ls%iPPY=4>$~<@e2wU zFdw!*99eudWN#@*4G4q678J&yum*)WsO|^lLr^;k6esra8k1VLkOLk5G#Fd^+gQ2c{1 zs7-M6)ERJ}AC#X#`5G1;AQ~Jd(D(-NVHg&MpfCl6EhvmZ@ec}fP}><42cWnB#Yx}9 zspX*i-{fUwL2<A3<8vPKx+U%S}iTiL1uFHOqi0tV9CngpfPHYy`c67 zXdD_8|DdxNL1%F;T?M&k4df?qdk4v1AU;SO;y+0H5ELF@ykaf5jJ$sL-v5`Mze2|5 zK;v>)#^6Bh>%opeZ2%Akx%1Jh*Z((f+X-I72l6W@{X@b4Us!GY4-czV>%r%og2EUS z)}Sy4)%~D20MEB9S@FBOe{w$P{zoMR1@Qf!p#8g)%>RPoAG8J-6#ur6J0&?f`zEC> zShDg5sQ(5^1E4-UXdDXUCeYfHZM*h^-3;0{zkD6&tYl0Knl}f_uZ8#z}X^Y(wxT+i)?kN;!fM_9x_>PQg>sRdz>K4gqd3?xsgI7rXK$N#U~ zy8VCG-UI)aty%{T8;E~5{)dDCBzzEI0^uXef!H8DpfhekVGL?(g2EgW_MkWb#RVu% zI(sLjfbRd+)KCZIRR+-Buc)XfQ1p?7LGce-{|VA;V{HYxQ=F}}yFX&Vl9gY;c7o=y z7q0-X1pviAXm8@qy@$Z}ErQNOf}NiLy2A&IL3c5(-2`4Y0rC?}4CFVEdJrE}K7jKE zsI9ze-G5M>0BTdOSiSx~2rpl~{yzwV#8<4@0A_>uAPkZRi?2o#U$X&h4oD3$Ub%L| ze~{V8Vjwoy3=Fd&W`OJfsexgT8$jyee5gA?=7PjQ@*p`-x(2P^0QnK*S7bkf!U7Th zpmYJbvl1-6b`vB#S8x0e3R_SZgTflr?*`TTuy|OoWaU>-+%PaOu-RH$F)}hTGEj2% z3n;NDEr7#R?TZ8n1#i8mz zav(m~4CFTVN{|^K^C5k1Q2c<}BVaQ?^%bZchNK>B2I#C0koYQ4-+Udop9>ZT_1#v2 z+Vvp39^AeM*$2W9d5}FDz&8oQ&8MOF-Dj`#X(^L#%nf$&$b1HG3abaP`e8h z_MkWb$HkJBZ$WXxz`(%j=j#KCD{#LZ6p!R$P~3wsXbiEpy9;C{Yeh|i<$@(E9)s-! z%~dX41>UCu>W_f#e*~Si20jxFn$JP&OKW+SBBLK6e~4OGveiG$n> z!XWd&7-SyQ9V^x%{0UM6vJZ@*;vg}wxlr{WHYiL%VG9alP*{WNeo)>A#RCX~;-s>s z!IFW2fyK$eo>59tk^yvo7rAi{(+64un4X@_uwedtkPu5|ZlT8f#mg^&#-qU)G?%kv zC3p^Z{<78J^Ath-RFEIReuBm;G8=SeA~GMu2Kf)G`1&pXSFYa-4ttO~7)Gdt)F+^L z1j&KUV+GO37{A$Dz-u{C)Nj}VzGnzxCd~ZJ|3UXbAghDOZ~hN)3ql=84M+@xL2P6U z5(BvhSq#JmiGygYch&_JjJ(pfv`dyGs`@zm%C%paF{i__$aG zJ3Bk@-7TO?_80MJ@QP#Oib z0YUx%`3Zp`;RND?!VyG+@j6KSg4m$A1JTHM)%vafv5Ifl3SN7MtQN!uo!1DWkuhkE z9_V~GWHAsMWG)DU*vJ@k_c%xovKWYu%WQ0BfW$x;*$faHAqEW(u>ZG!(-ue`fj5KG zAczkNOHi1C!WI<9ps-%B40NsmWG)317jqUa+u;=)F2TUSzRG*E+y7M?Ao@|n zq4FRx5C-W(#&9u^UKrlE4Sd%RSlx!L|3PU4><*Awn?Uw#1>YG176Z#e>;=0Glvbe_ zrXQO)LJSgSptuKNP*{S_vjv4MEboKD92Wkdxg}7Xh$*P>$Vy3q`+hAgEew>L{S1qL zP`rcIl7RTO)|TKlz~t$3QWh^?^8-Gww*oSk0~(KI25d$1zOk16?o4z|_>U$vj zVHlJaLE{jhIcZQjJ$m~5f6)1vAitqwjPQbnJvMQW7zkrC18ewh+77NSkky0A0i0%R zgydZm^`JZrE;}G~4@?eJ=D^r68srAj%|wgVcibgD{AXj6q@`3=;#Zh1D16W^dT~f8UW4;Pb0Nd&)rJ3XXfUaG$q$`C^~o z2mxjW2F7=9UNL~;3bgkJ5_{AkL37C9Q91DOTmgJ=*RpEyVjG6t(fZi_(u1r~?0k=3KKL391P_aFWb3PVs>g2wtm zVG9alSa^f!6>Hy3o-sEN)b0xp3tLC(+;paObkSW&SeJGFCaDygZLnE7#~LC6yLn#KUVc1anN0WXc(jxWERX^ z5Dnsk#6fIi3>F9Jhx!dB2lgXad>c6Z!ovYc4Aj>Hh1rSom%(Wk6qcYc1%)kocrRGG za%E~>u?PbL1LJ``I~lfb+XjjsaQP2rP>I;LZy&??^XI|lHrLmH+JQ`yXU=n3vU2TX z(A*R<2DuYd7l6hnK>h~#19T_PhAlfGeg^p!34_7}6o#NPmq9c#UI#j-d&^F6JfVv3 z1m6dYECynO@Am`69})(ci&Gq%*;{vl?}P-Ihm5hBv3Un}wP1Hc(ie&uQ2Rjl4uZl4 z1#jH;9~4HQumXh{NDdT+@O%#*dxXxJf!Hh8KAAjYE@+aUsimm_6ekRzwVG6lauj18 zK77dV^XE^7V@HpI(}0bgGo!s%0O$P0E9#f7TK@|)&WVgc=>gBzL2(1i+ncvz#4RMe5aQswIYD}mFepwT>QKX&Xz@*;^WQ-jd)lJNY$SK0 zn}g~XNLdFeD?s9)umOb;=&p+8Yd3?}NQ2t>pga!_+trYBY;}tcAJ> zJoXJ?L)LzQ$^y{%5GXBx&aOLo;R?7tyKCR!|C>PfbAs~ErXBx5Wjr{n!07_P2Zaj= zgXNII6;v*ui-Gt=$3Mtk5Z;2Cen>R~q8^JGAhVI&3sMJ)X9x}PA1EJy=F3500lJF< z6gHsq-9YQZL16}36AlSWlz0b+@#5uc)-|;ENrTG$X%l-H(o$0x+}zw4Kyd_$7+PRZ z+=KADw{IC#wX_-9+gm`^FixC4*I?<&b;m&S9q1U;b^(_KpfQ4_tH9&?JNF;?59-f? z{CoV&1@K)xpmr|k4!>Rd4*lP`=ivYCyAOcx@!bx(&v)1U|J!!$L&Z46A?hJ&LHGZH zFlg)ybSE&(42T#=4ai&&2C4yy*qt!55i~?SNY9Sl2f%&;`3>Yp zkY7RLIUv7-!T=N&pfFj!W)pZ1AZXtRINn!7*9M@`OINNtK552015n&&XQVQM;smr$ z6LjV?XuT#VQfP(WzkkmFx>s!b)~(=rASN;#RPQj&n77zw>8f?7(c>SP5AqYJ902Wq zT)bl4e^9?1bf3ZQgU9~wKXw{?Uk_;P=-Amy|Bs)${Qt!HEB`^^bL!&N|HR{KB&a1| z?geyt(#!_A9ps1O=P&;U`3dAV&>a*Yzk>V>@;fLDKw+_P>1y!WFi>6r27>HlV(KPFfl`n%Ayb#Q<984I1+S3($$^>F#1UdT>8Ob89Oo4KU7}zr<$gs`bYp zbGXQBJCNCsG!04%kg*HM-j;>SAY<7eF;IO64hPVDFIw7%g#~C%4YW22#)r_LdGk&G z(ZxY(L3s>etqTG9bIk^n^&#lt2nt(J7=!YCbV58sO=%%RVSX+H6BFfg{iGxr zPhDL@9=gu(v|NoDntsS)Vn1ONnyv6!USFK;Oe9gvRpfJS1YmwGBK<7-s z{sj3SjM3^kP@4yYL1_UAgXa0cVGI%j$-~wPfWiOdGQ2NOrP6J#Gq3>ib+1d4wc2AcsgABs`J202_nY-rd()qvX9 zYo^aztOtsF87Xma+1u6L#t;%53}%xOf7DP5N&}$t#XxHd_)D))i$X;4oe=e=b9JS0|WlYimo5C?(kp&=~`u`N7ktPBOfB_7tpt-jsf@ zo6^ea+2$=><*;n^hGomwZhQ+0XAlOhWx$4!S==CPy0meZ|_1cb2W*FmKU{wLU%5=kbHW z7ZkOBKfh*(i;ZQtdHpKGqJ;|?K<7Jv#0Luo%{AY+euLrD`wt8Y7S01Z3*`3OckY1G zLG#4vob#5f&|b1~UG%cm8+w+n*|>Sd+KuN{tlji*#kx(eSFGFgdBwU-KUS>U^lQbs zO@CIb+w^zEy3PN^Zg80mQVYVkW=Sae~6``gKUyF$haB?Ar|Se1p)GS}Kp?>+A4Na(cW7G0AAdD`K z&IhSM$1pV@abz}#55q8Vd^AWcvOI{tv0>So4K>SFgWX=XZ1sjBsGpLTg8aB@o%iAu zYi;K(U8MsGgT9#yc)b%cng4(I$Z+ELX@(s;4>0`yzlOmqESX`~_N@%RzkFs`wqywd z=sb7OdOT1V4`vLilk)QN7-r3!1$O4+M-LdfrcML1%_CD8x+ctEShi|C!{)8K7|eKvVZ*u83?)rH4D!ytDBj^VabR%HDq+wHh+~K;t7b^4ZDz=6>|`it z>0!vOY-A|!n8;AqH;tjPYXU=M=LCkr<{pOp#tw$6&OV0HrgnzLNz)msx+XAGb@VaR z_e^9ctZiaQFRo&!>YmKdHghpUUyRyv`(GHFk#^e zhO&-H3|V#U45h8T4D}PHGqg>c#Zc7T#gJNB&yZcy!cbJ(#8BMO&QRY!g`upao1uQf z42FWnZieQ`vl%*PE@UWdXk*B!ZDA;DpTtnn1;P^13!4OTZy2+(;n>({Sm zIDY&%1MF^MSQ-I&@$;<<48K3WXV|l43&ZNAOBr@;*~GAS%SML(e}6LU+_a8i!HlU4 z+c&IZIDhmo!-uC287`ka&9H9e3WjSJ&ofN!>R>p&X9vTTGbb6=tX#qH>+5H5IPc!H zj-eniiecr#xeTwLJ!aUyYa7FX-8&c-&z;S1bpIZP*4k=@051=QvxoLF{QmHo;rz*C z42$N>VyG@IX88F0F~k4=e;D3AdC2hP!#jq5-@h;{n>Ux?+^ORXlX|)s?p(XX(Am<+ zkQ5%o@chADuzkn&?_^jodnQ9?OEbgrMe`Y6J-o}XW)Y-LynA>h!|4-8!0JH$1+A^! zzkff72^Rx%Mv2i77!85Z5Eu=C(GVC7fzc2c4S~@R7!83@Fd71*Aut*OqaiRF0;3^7 zg%J2pd+-D1OnHc1FfMoy^#6ajGy?-z!3TsqX!a9{%fP_?|39hx2MFW9`YGifKsJy0 z|9^CT1DZSvpYi{HbUw0jP>9f&{}0vt`cXbgfQ*I*N^mfYhR5&@kN^Ks{YN<;y?i5y zkEJ|CDPP(D|3@#sQR)MJlRHA~6L#nYr)fq^~V8WdNe(tOgFQW5f*2UUOSu_1*cd<) z(JRsz7#bKnT^vIyZoT4n|!ov(p-`RRCp3kU6{M%cuAYz`Qq<$-&>}? z-&1TkH=E;8bAR2FFShCLZ*5&2wsvROTBdVTi=W0=h7TU#%Mwmc)7|lA)9DS_*Y#qG&zfdzzimm}p=|GK`h@Uh#Tm%jN-#*anUSFp-ey-@7w?S1&;(c8x1nYX12s|KHH= z$3gx@H*+4T*F91%xE@>n@Th*B;l96b^OF-280tTp*EjFmXZPmrZgKspi`^4aCD-ly zm38HH>6@FI+5i9O|KG8F|KGPiPKEDlGEP4SIy+L@Ea$+LDb7by7bHU z?~kvn4E}LQd|$)o^Y-%Bdcul3Fqh8&X_gp(5b1~ zA2;^b@+@Aw*rM!>gj6rvyw7u}wD7|9{di z{Pe{0PSxwR6<;p8e|#0b|JLmIMgQ|BJN#*Wcc4C{^8W98?OU_2FS?kKkdeW`&M$Z5 zb=-HWJ)h^kUz5V((h~pw?)e9^X0Jb{Djn_^*yAVl@Z)j5M~k}k7f)WUW@u#86;<34 zYSeS>jmfWHzczgQw0dLSSuP%Z+kQSdixbmx_AvFow{I*JkL&PjFZg;j{PBy(Sfy#Vc<2MtSC1!)MFX zGv59@{qx{k{>9g}x0vPa;feos>H5r2`*~%5Hw&02Ke4>9qH&qpZ5zAA8}iOdnC0$~ za5)fqJ*GdcSaaI?2<8=5W-(QUZu_dtFWD^Y4Uakh_iV?jvx;-(&3MccY*AArW^VI$ zr$yNlg>&}xrVI(kmDwjQ>YccB^@}qzGxt4QmagRYYsJ-}zWn8B|`+<9m=eXZtgzH}|)npMAT0|L?m$w#NT9J#+T#Lr~7j+xb+i`u%_H zr~h9~yjS!2Y{mKNd(FS!-*4KtPmE7?m$d%Re0hh(^O8ywj&%m-{@Gvur`^KVt~tK) z?CF;i-T(2<{iaa%-m0Z`x7?w{?R-hEE{Nsa=3m2ffvv#F{Osog=k83FQT-DeDi-|w zx9%s|W&iiqJpXRR#_1imVC_1K--itgZhk#5zn(iHj`>#ZgXQyfiq$^PKT>-Be|~_c zYuSaQsH9>8@%lWBsp;esj0-rKM{wCJSQ z_H*#CDzF!>pYc#B-(NqE8_!ohPXmgzZ<5(7($OyQatGbAOo4Q7ZMGO`@yVVm&Wa>4JD zb7fpyJUT2=)s)zp1+|Y>o}2Q#M?upS zDL>UUj+|J_6#xI2O5Pv+>q%K^k3H@9rOjg5pPhgB>$U#z&-1?57aW(3KQR0LpEMbp z3W4)g*EZK((6~SOQ++SnhSbwyF|}W>GBm8O`I^VWulD79{11zaXDt7|thaAC$;rUF z@&B*-y(&AuOcVcpeU|s^+S;!Nmt5Q56tZcGhi;%quTWw~2b<#yW&?%=elETYybPQU zrA$c;oD1v(JWl8`1R2__VfGrU%OxS|2_S&FW~>n<8@EG=E(Ga*k=FJ z``r`gAJ6@3CEowoY=89pzc=R}S)Q-ttNSQk9~l0}Kga0L^0z;K-~V41Q}glYk7oNH z%y%lEiyK;6b}An~f8lO&;KX2K+xsy$^UhaFMPWAH2H7yV(E~W`zu7& zhP%9W*dlen=u%4@bAa++bB%@9Wa8pEj@(}zcBXredY!OId{n?>yV?6hAFJ`*nz#P! z=B-s#iHxn&TsZg6Y~*V&lgMQ|&t!3~r}@kui|0Qd&-JSg-);Nz#LLO-{eQpTuez<$ zz{BvjKYZQ6i(lAc%C2tysGk47{^#WXUlMKpv+6snzFL(3-~R;1zu>PoR{U(|lRfm@ z?z?3H-=6o(^2ge|*Dv^*J^g|8{3`3(%Ib6WpL+iNaIgP$Hrd;4TK>ALugq6@+;wo7 zE}X&B!f0{vvn}JIE?JK$@n^ms-Iu;F{m?#vQ16$mw`S%0h`D{mCsbO2nG6{==XRJTj>^6V9WuI-`vm?y%fA;>b{3ESC@$NRZEBoIS#Z@2f ze>iphkI0zXr=mVC7NxI5rs+fm9e8QaANhCr%a{6p4(T_{Ed2d;dva2ZOux-G{>9qI zUIf3dGp_ym?e@o=haZ^leRur#x_$55*R3&Ui(3%#<*>^Z!2=tn#l*VZ%xHOC36*`>ru?6$x}LRXJYZq`{@kZG@z2wi+wFh<@co;b%kq2cfBi|kAYK1{ z?TY?&&sBmdj-KB;C;soN_yeWaW4r(TtK0J`bbXYIdfkVon&%nr{r~qp`FNjf#mDaW zrrG&*R{MU>tv1+GqWSlqbe!YMck3Ss?>?~q`|SU@4?bnj|NJFt?aw07mCq-Z-Lg;h zHusE*3>Uhj)D_fX6CaZrRQ0RU@GECPiCOOAjNRW2ejXHIYUY1tS-%vev6>(se;4!TslVUt z=6`){?cpDRw0 z{Ypv!+8~dlN zi}AMqyxG3pTW_a?va)i;+wA!6-|u$k7c%^2oVr}4+GyLqT z;`!b6KfknRTsPm}>TJB=`<~~r;{5uNAH4%b{+cs|+5Gf=u~&OZMq$wQ6{}4fj=tRL z<*2W#$0X-wH8=Kl_nYsLTWiY?6oQ^wlzUGRDTV_bk72%XqBW7nh!tE?Wz3iBM`yVZMKM___v_Eb)T{=Io;xeM19nNB)?Xpey%8|UPs zhpbJ{sX~Xj1rIj@8190de56w{loeD9`&l~mX^8x-{`4|*-wN1)Pj(Wr``pJ26zmuy$Q0Z;ewyfK6b3($? zujXGeWb1A?`RKvly))B3GaZOo&7#%Vcv9!IUCE~-jr%LkuHRSq{_OSj&!XplSF)>A zd)BzmZr`t0+8>SWKNnfwTkaKT|AKGEr>*O2c|mPv{lAy=A3oKux7_yrj_=x)wp*U= z<`1@g_Cwz8gZX*M=#9_bKi2q_swCI2vG@G9<_EiVVxPAjz5nSrNBXx{3#wyZUwK?< z&l6d`a9elPvcHe^7ulM7e4N%*{`-AV?q{aIWnXLEF8;MWb4OI|4zJ$lEicbUUbQLH zy!%1r$aJAN!;T7rzD4n|+ur=)ulez}{#jFqY$_Mv5E1+oA`rRsZtEeI3%UB|)|LNj-E>QKP4TIx-t)?X_UtQP z8&tY}_TB9o;;fC5zn@24&j0u3|IWXUqwW8n{kCbg*@u}k57ty{=#T&NNc^$&{hxfl ze*Ky!^qafx0Z+rs!sD{#4}|CcV7d3}+V)G!?LMFXaijgdV|jf#|KIcXE52U1yzamL z{y6Wf_3DQvJ?dQW`}0|^tB1BtHW8}t5&5)4lVy_V$9InJ=L&W*D0)uX>))BaIix&n zRf*%0Ig%%L2HY0qNtm}Sbjk0x!f~csMH2s}U(8oHzsu73&(1|kEtcteIo0yLyosl) zRhC#a+L+$?|L(ibw}sK~|N2EQELwH<<)5du_y0bM-}_eI&ZzM1Gw;H?XV0Je|IW7l zuuF?{{vN@tQM{l|s(8!!$&qynPB+Z|c_!V!#H1yA{a&%RWwXoP-t&zA`Mi9!^}pKP zzuxcvRqSkj|I3~Kfvd0nQ}1A3?a=$6eCcJkn!;Dx@3l;RZuv>aecJOAmt-QRDR~Dk z$?Vd3t#I17U|yr8{scSsM3&v(jUASlpB2eDz;?DGPJQ9LNlhIqX1Xs@no<^;wJt-P z$JH%*hCl1I?{|Y@U2C;oZCvf`@*wF?o&Bex_?+82J8D+_i>P>-8ZmR9hEajp5p8B3 z35{nRGY?j_?fLP-@~wim@spYJ-rJm?ID6L{iCI@4HEFCldPI3@LH~uGkdn_`p|3OE zzWVpu?&tac_ri+%gOUqG=at>P{Nk|uKZCe$o2EZ}xBLAu`9BBcAFzkkB}g$CKi)k5 zuTI$7sMhuMZ?j8|@4x4H`SRm0Z}aav=l^(bZ(Q=&_k6Xp?#lmc2hMJm>lIbWc^js8 zCGcFNvctS)OLoBpi#Q5Jls&UnTot;K#W_jEO~k$9u|%MVVwbYUQUOg?rKTXR5SQIE z?$7)2V1fUp*)HADa>*OH4CcFt-`M_Q+gasJ|7s$7l>|Jlnf8Vh#Oa?ZnD=ki`>B7| zJ$k`veDU*g{bzHUyYENNQ`GLT@eO_w*|uf!qRW04-z~}5Zk@6H_K8g*mGfSTGA&)8 z(bTn~z+=)?qcd$Q-_H%n*mgJb|IhIKWzXmD{hj~6@KM)ky(hEhe{I@xch*r*7BwsW z)~sbe!F+b-?}hTe6l)%G#~*nA@7?=L_y7O>eYI0q{iS*R-{dI`7%*`Ty4ZIaHc$=_!37 zcX?gA-M^3ht7i(UU-hp0G3%GF`TbwnoHnlN{Q^V@fLLDa&~r( zu-e9=tgM`2GP~okM9hr?mGc%}&0B0dTj_0vi|1vY$Z4YAKPS!fTG6YPwlJc~`1ixp zmp0tcJ#*)%-}HONo^PvG_8HEP(mxomCHHNK(5rF=9SL~`m;Jlfua`U-@lF57IkU}? z7k=t}V(r|$`u(Bk1?7jg-+qG)_(a@+RG0dZJR?rWDS$wzhMt&c;psU%>m|-|zRwx8>gcu=9K^-*%hN zktNTc+xy<$|J&45Aob(>KR2uEcI~f!alWG>;<~Gc&YY1+OTU$|HR^b(Pb4~xWdx!E?{*mhn@E#^QAm;NCq z?V2{v3D@2|it35l+m{wETU%Rdl2z&w*ka;qSeGW_-YciPmuW7ta1%Kiuqwe| zm!tpVf&g9XTG^NvU%s4q^8ZJ-{hzJ%v*z?#XRog@>*wKpGTS`=S=j2O z=#nSfPach5e6Q3>w!yeZPxh#*czny}YjfJu>V?;qNvr$!KE5$A*rN22iQ4hy7iP_M zowe;?C70fuNSB<>DC>DQ)_fIPwe+x=(ltNZ$0n1Pav#-7Re9ueV%<#csY@!h-)e0x z6wDQ7h@YSrQ-3jc@=J5wRc|-9a%wgUp8M%}a0^oJ7yKe?EZD?^}LS{ ze*b?te}2a@zK1tvN~T2iMd$Aob?=io7+ZdKtHPS9$bW}T7&JNe{duZ?`MCYR!e6Jt z_pOnu`yp6${B~XbU)F5%efB|LO4hQKw#E(fLavXVaLU#~0X5TOZM<(Pv<6 z-F;bI-N4eY)#U8~BZ*gSIa@LgF%*>Tes#`i5>xtio{Dd|`gM{YR$h6(x%GR~E!N4Y zs)chF)Gy#)oUHsJ-)!Pi$v#>8Hs;^_NoiHfF0gT3PT07wF`-i7^v`$49+8@-xuf+ zoH3tH-~+{Y{L57a@zWcHgCP1EQ`ITE1k8n zsQRMPCui3=^JV6fIh>ktALX*EChwn}J1;@%<;wU2`f2RNW~&)A%$Rj|k^yTh)BcXwP=_`Ue`>+aN;x5qQjZZoj7Z1$VA=;E5>loZZsI+0B# zZxgbzxGJAbbM1BCBoboc&$3X-s=gp&$GtbNYaZW!|0B!#)$7Aou9(U%cP{r`@38`~LrbGq&HZcwc?L+g+}*<=wAS`!CO|<#%QG_gi`Y*IM&E zJ8sHU2n${pzd9rGQnHAj-QF|8nyp)3>m6tnkL!q9+;%x#t>DFjKp#J!MoZQ!Hs5xZ z%n-dLD=E6*(w>y%zeK}(VzrDIXU*EM^Q(_|$+`2cFXQh{*sCSt?*2eGr`-Df%}4{i zwp0eA&<9DsW1s&1{>zW$$-zUrf9Sp5%^P(0ckG(eJANI#Q^L-{*>rUy%jV0)GiJ?V z)jaedzZ>g(hGUv64&OE(ryaNU#on)$}& zbpA~`htJKm7SCF&{?zlj`3%YTb>DYi%-e2gV&d}u`Tv?ZesVXLZ_B^CuI_(--S0=; zdb|D{p13GmeDN>OmH9HYnai827PozUt$*Z`=;?`Rl6`WvjUO)ypZL7R=~nUd@Sh6; zlB!qz+5SrMu|!mj%Ur(ergHfQv%UWL3T0JYS3UShlF9L?Qp|KFCC+)lR=e2d?EEF< z^J#UCb&scl)^=Uz#?{w(oMvPQClm_yaL*Pmnt0&M(rX8v{weR?Q^e?a>!fsI#Yus% zH4$AFU4?IM6x#fIkvwB|wxVBFhZ5`3MTf3Ca2vQkzj&&s?!iX)@;}@E|J?uY`{D4o z!pORxQ?EbC|J%I%$>Yb5C1hof{`&e_yyfWk=y@f)4|MY@x!3LgSEb_F#J(+W>H7PB zdB6U6CwuYo{6g2yH_!jQc;9Q%5A_2!`WK!=?TNm3`a)*;h3oeZ9P5=f+?K<$xmZ`m zrhsK~x*EfiTb0`#427C{q&#LV;GHy6!({gr6}zq_hfjMp|Fm!D>e(XDsQ%3PU%BYS zt(B|a-QMq79}@E7>%-b9_ZKtAKiD37RekC4j9Yx~L$8_t)q4>6v!`~t@~hSd%eUKD zPmR7=Is3V#YpdCVMSQVao-zG!jCye9?3u*0ZLMyb8&#DLzmR`%{KyZBsA65|6Czv_ zf4=$Iv~t}Wd5L#(Y&N}@X8->7^Yf1a3IK8M*LIz-zp@3^$6;))Ggn|j1I zOzcqG(9zYaZ@K67xAmRoCt~M+KI3Y1t9(kG_^cAOTL~54-&P;mw))kqZN;L#>U;8QkyXj+&ulpS3q@%lL z=kJq@oc8d=#l`+wwRSIg9w^KI58{K3!Xwy?*b{`lEp* zm-q0`-dgr!l6~&>!2By43NNem^ywY^aYTjht$kP7?oh`+YL|FKufOg7bNx|u=L+uJ z_XcqXe{^m2Iv97Sy8QKxXV+HWiF*D0uFh4-V?lav{+c?S?tk~%$nBx;cjg(Zcs~~1 z4*gs3ulO-b%#`^3BKsY{{5?)V^_=dwrn{E zf4LoFkvGfduWR>*<*)F2eI#72rXV`~YUOGJ8>3UR&GU~fxBI%%)#34PZT~F0hU@#j zZT;~y{$J{zPgB>ch`N@%d0;n{`OBQ=`yRY3oMV%(cz(^pLscu!ule|T#lCL6T^x%S zdm9*<_ByloExK%YMBjdyVz5}T?UtXbZ++Q6{rkP&x{@}BEf8td8n5%uyx2&iL_egfNalIPx#b&nI?t{0#wt5$=Yg_7H-#z>Ps`6R< zf{QQDJiL(E-O$joRn>c1!e3W$r7n}=6PtYA`)X{N*!oyaqA=$7MDcwe_S@AK@!i;2 zD_;9AexJjcJsiwWf9v~eF;{%weZTkR%gi2sp9^=+^vtrT_4)fE*PO41r~faHpxd+B zh*gIzZ(oQx7aX(UTa8ZqKAFqLn=NWSXjr`sbBJKuVpmx4sy3WcvvcLHzU=P5$M=-& z+9G}B?Wz=s%j{P>j@aCvy=vX5d(2_w-`>d0w>YGe@-$Je=T6=oC*Ji9%TssX+57&k z-p;rw&*y6^UaI}KmecV5jE;+$+Y5eNF!VWpHsNQN=#GT9tS2mWoz54ZKN6W?)3qTb zBjZcz`PyTl%H&-gzg(e;59Vofny~#pif#yy!Mc$7!S8k3+cRIzI~Cf4rmYb^qTZ-s|S%J}vq2K+&q~ zjl|vutojT3Yu_aMt99B{@;tD8U&#+@Cne|P^vG3wV3e{qUgy?6K_`CSr`E0lxePg1 zKZe_H9(diB{qo(s@L}ugg-Wf-?*0i?SzIm;R#Y05X+r^H0D;+o*%oqb7yxL8k_bmcK35~ z<;uRk&UtgB`|`VbMV>zxv(@TUb7UDrE}lwFK3!jNHt34q{CNSE&$pzXm)r9?_Why! z|KIW-pVac_Vy*y9lt$<6WIbQ|uDI~UheR3M9sa&^ZC2L(db&O)aJ6ZE@goMsd7O{R zt$$rIVV&^!54WB}e7(Hi{CNjv1`BsbJuBu7uZ@4A%pEp|zjNRGL;il76R*$j5x2?w z%O{vNv42kK(W5p;7>edtn)Vr|s~H$rG;Do+jWJ!&D2u8g}lluP3vDAkN>nP zb+Ym1R~PmjzrxIK=ka`g{l9uU;Rlzz^^c}bk8La8`#Sc@%aRq7mu0an@HWrAvu4UJ zmySsc_x70>->$su$G+IxePhj0t}|PsEDGO<6#0o;divKT)@`c(q+&Q-eePzPo9`=( zUd>BYbUUZnCvV-kvy59iY|VieH!>ayOzHGqk{fu}ed!`^y}LUSjTuf^$%d}Jnvsyu zaPQl;?Y5bB>w~5-s;jAOD19AP^UQeu!oR=2t-d+)Wk-72WbyrPRPAF|U(NrTy!o$z z>2|-h!KF**@-6Bp_^2vvU~r*7+1)>(C`o9^xx66pdnpGO=|5?oq`T?uPv;ch-)Z^> zl792v{+9G>ZP%5%zx;NT-#s|z=2PZ~KW1syzd03rIaDg%@-y;4OQWmnhYEujpWAi& z&#$Uw$W&);Hn1`3h>AJfnS6Z0Q%et5y_Fr?WnvBWm%QrwblmR$PW>9=v!7~ek|w?1 z_dBo7D4B7d2=9Yw(Rl~Y|2cC$At|Zp)?2gQ`4&s({Xg`aN8R&pRQ6}i(ECwGcnn_G z=KR6H_nZEp6IDAReqkSANbEXR40_rfbh`vhy8YBqI*HP-ZO zxqNVCaJqwF;?-4G1Gud87xvEiGINrkN0ZQkMJbnErPoPhFZH?nc==V`?RT0kUJSH} zT+L|f&-tydd=Inyp9k!P4-PQSnlmdT__A>qW7OuVpH;3Vx9-Yao?xgrM{VZg7ncNe zBx9Ry-V|G=ww&?Ry5?JFP17$wto&n_QqENLG&vH2IzJ{~vS7^SR|h#-Ek@ zZ8q&VH_!E@CG(Ho`#*RY4uDoyC^baA?PGFaW^R`5yl`Liz%*mAOZz`8(2KQdQ|T;x zbR=`h+&c7Lt%{y-+^u-b`{Ua7eXZ5+cCzo)vo&YjmUFYI zYJgmz;9}nnXoT3~0?nIf}tlLK>Dtj9rDQr>ocDv{q?BnC(c>CWuwavO7 z)qJ95woB}9-JfyzUDxL4PWKzXPnZ3y_f}2lgd>A+^GQXM)4y0Y{Fw3WhTU^xqxW-{ z{`w`!kr|;7{Ipstz0pVh=HC4Qc{%@c_TR1Ly7he3*Z&1En`)!)Uu~{fKk>u6U9$~; z_plcy`?G&O-^5umyWVi}z34q=XC}pU)E~8;`1(w6WZT7yfk!-3E>F2#Rk_{6#a7r; zW_`3(%dIzWWK=z!goTAo%*@(+XPbSU6;r*Q@lNr1+Y_65{N~wszV&NA=i_(Lcz&IC zy~y?JS?f!-TIrS-yu9;HlFgm%;`QrC-o!}14cndad-ehG^{R(w1%92bbuY${HO_b4 z3h8~>^ZeaV}zl%<~4c5z3(p5q<5c9var(Wa1{zim$b4y`pjqHNW- z=|t&uANwWF5r?L^uDx`oq9ua&@Vn$$@5{|)Uh!2kD4e=DD?2%_jPL9|wO{PN3ZH#p z`DDSS&FaP%_QWr5^@e~&I|>heHMgsM5dZ(}?Bcc8WMnN07(m%8^ZveC+wV-@LYNcM zczAdkIs{w=mn~by!N98(YJOvKTAGm8t)Q#F6<#aOTFLsywDYZ_fYIk*oRO=o091Hfj;W zg-c5pGcUOk&$DKYe`s^6zD>`|R#- z60>glFd^uHi|hY{b>enxtG9G)b9OTOrS*Gm@%g8Bw)TtN>w7%q7GLMYy^bBnZI>Nh zTByiVFM8x<`>|WcWPFMk)jKwN@@Q^xIsRr&^40hK_xUrmD?UFHOl~+c^~WXF=?aoL z>k7qs_BA#t^*33EA2LpSv*XU42|?b|^`xbH7@ekFS{1tbL#uvGu}`L=RZ-orWhtKca zJi97>vBC9}zXg81YRoMExz4O;nE$t5YlHfi$rH??(w;}1*d){Zm-*1uTWv3fY@G14bMXQekBeI)az4L(Vf4vzSt`>E ztLtl`=iTo)}l9O+8i7Ggy1EP=2}Z@?|pIJrfXmKyYJ?v`)=>-XBYo; zQMv8*;iPZ%nYwR^VsB4;FZdvL`G1$8=Z$BoX>YRaADURbU77Xn=KPr73Ex-UV{Hx& zI?SY;yWHb4Pp_M7p^Rv9iPWO23ff$Plm7kN7s#;Wk=5BVK985p&O7A)?}`7TwfVKL zZ%%r=XX$dk1KamJ)!p&y)#{Hk&)2jqTc*a?#nAAo_gGLvHeZ+0?RJKFGe6jz56u3e z+@*YGtM!SZw|~_?Wm@#y+ES|Z;Fj*8$+m4t*|&dg(b~0>uYM6@@rtz`Hk=&ur@I*Z zUDH_-!(*JJrmZNusVwrK`K=>+EI-`6ZZrMiuFu!g)%L!d_dJ%vlP^YiOP>pmWKpH= zRK@^7(HFP)mMHJE_A+>&_3>qDj9Nph@l`=t#wYDw(tkA1JFa}5_HS9(RE?wyshciLydfnEt*mO zwN`Iy>T`z`b982es_qxqR=j=L-qUL57wmO9XkLEav*$zW(`k|yTyF6OEUgu1bw0IQ zHT5gwA)j|F`39@}Pa5Zn_bj-wEwSdw->sAOvfQ}f`|iY1YrS3>^Tf}S8!pXSo*R_K zD!O>Zv-S7*-O3v$Kex1+EAqG3N~+gN?U*`q?^2mfDi0SNs=eAe>mXBCh>3^jw4LiOTkkeHFS&IIpQxy#Zj4)i zklFRf&#sbplzu6-^uCpBzofn4y>G3o>AsK`wCFYoe!QU0)!lc!kHUpNkCh78 zu9s;xsJfVz{pDlM-{UT!z?#ydlYT?iF|I3@C3kYeNt;#XH{Nf*!t=Ja{*gqQ@Z<*1 z!gupIzkmCc_CH8;ZTN!=kqV*HYm?7dZt~+2)x45rdS5Zi`l{_M!=R4}45xx>=lnc3 z*BU%U8~^WVyx8^iuG8inXUw^=q4C|m-+5N0zf26%uLN{-TyY4$!FBuW38nf2i`k?q*l$$J)$gO3BW@w3Hk?vP!@3@+D+cFr2Mo z4qRd$T4uef>*V`+mcA8+OXn~Y-@D~{yE{QF{qDE#xAK|ax4u5T)aG=zmeRL9iw}1F ze%ojFz3|l;3yWgG#V)smrrI1?=#Z+BceGnu?DbO%P9<~K#7(Kc?r<#?nY84Y8Oy;; z29ZZ=7Vs{;;t=1Wu~JpURgh1{!r^_@_1zypOI&}v-v95l>)C@zUjC8?Zr}e`CLs9z z`*-C&r87$;!{QBQX^8H;azCh*XU3MTrIHkuMjaBlZCk~fh9Ing`OFa8?wSkREi-lfa?>Y}#$wzOQCLZUW zwyG+Y^_$Xdp5M(6ZvMP?^R4XNW7hHYPR$FlUuw*d=Ji1?n}PgWhiP}&+>b@#!dTG`8huW zY95tzFHnlwoW{FIW07?Jo{9N8pNiEymcAeHgy(#G)iH(+j{Mr!(S@gVw?7D;|4U?% z#v(s;*S&Tk!hwf%)`i^cne{n)tLgKYXuCj`G`DF>%bHX_Z%CW7-9XxJ!VC@W54my`&oNw%Nu$V*aQ1cE0eXnI6I|XDm zP7e{Ea8^L(xaY!$PwoXJbWEOh)xcTvm2{kul)S|z@vmv}Y3b>PHa0z=zV)uWem=ps zE7>NfaPrC7cofPgpD#W#anZ$z3p+ea&+7d4GubF~zRy{RqfkgW-EG#%IrU78UiU8l z>}J%N!L4o;{kV7Uz5{W|*QEWz)ctw$H1@(omdyW@0m z=;Ie=U*}a`S*myb@;a_pA%;e;e;m3gm}}mqaUi0}b*flm=h8zT&V81d`%NcoeN@}x z=kwe5_S=M6xSlNuf0@?(H;&c#6(6&n*_MNISEwY5*>r5W5Y!zmw6f~IL;VzE0ars= zyBZ1bLh=ud{0}}Jm$&CWaX!B46vMln&*k3S*vLHBkA3pw$yf5WU(C3o-0MS`{UcD}Qq2B$}{ky*Uhh7Pdy|vbe^VwyUjK=%iR~3!(k5x(- zFfR6;w>?et+xxrh=dASP9OnOSYvtITkx{rxVD{v=(?^dK9SO|&{p{(!4a;&EENZu2 zT=CtNC1BPv(3pA~uk?pg;rlkFUy^^3s4$_EK}J&2an`acIcAP79+P${E!ySYsM^2! z;hR1QWzj~)Tp^E_I*s{zEuVgS_HyOl5Mlc-Md9Z>UX{jd`)TyWG~2^EcfYuib<4wB zpY|)QZn2%dzCir;*)@;so|s;ATPauipZ8xyw)XZ~qt?H6f`N-KX1JtjT{2l}(RcpUkyS^h%*$ffe!tH8-oJ0#AFtc}&S}=N z6Gh83JVhK1R%^}CW{oxaGAUjp(|pfYE92&+%NH$=QhEoanVR z*8HcZ_lX?Q_qwsH16el-T8NRZaQ(u&*MpCpNY15>sI$d!ODrvvlhB++qb@n z`%l6qn?tw0w(XDZZP@d@Qt?!yhPmLBUndL-yG{Eh=59Zfpxm|CBFwV6gJWwHZ}hgD zmzp1$ZPOTBTFm!-?42=Z&X(l0SEUR!vtD&hko&H{cE^gjw^!UM|G~|gWB)!qPS)DO zIISVoV)??C%`+#&e17_ibdI=bWJnxL76&94IIxG-GEFqx1lIZZdZE#3b2%^k1T?G|Iacy#JKqXy8B+xwD-ulUgiTvQK>!+clhU)OfctV<4~S8^W<_7UzGs!gXjt@!7isWYBG z|K=L+*%>EJ1%&R{b~eiP{Owh8{nx+QoMYYnLQ2pg`L*Kr8Ey~agC}xad-;grTU2<8 zu|ep!xs6q88@1Q%m3p_L`)w~;ZyF5bp1rC_9C?y$)<%;dH+-|X|A^28nb44)b0DayDP(7J%y~DK6l#R@l10H z5^ZZ|7d*~YIjyQ=VMvP!^Sk}!+I=z>3`%S>rzFIkYudEebBX_o>xI0Zg;(Y}ODgGF z`fFunEAd|LZS~DcII&HfPsV7QMS84Luk+U?*HeWYGrBDerNkMx-Jd6xAi>V;dFja0 z@YpVI^Oy#kY;nfqI`%0+3p5U{o6Gw&z2W6c62|r)iA}675cDs)~^-y!w{! zHk|T`yIp=_(I&k))AjDfFr6^SNON0!@xaF9<8MCw2riN=sHl*b9$O~4@AKUE2Ux6+ zd)g|kNVBk6$@Ke&%ZBKaHZM-!dB^rAbk61tuWfV>mK^tx2)w&z*@J6V%7Tk;zHnY5 z!o_-EpLv&(jBTCN@qW4Xum8k4<<1BxpX@6ZH1>C65^YHdb$s>7T%vBJo!09~;o?t! zy?M9Ux8XRW(6s5NW|$V1oJ~1mr)QmdYyJ60^1H9)`3mX@nx#9$WItN2Xaq zuN9v2)J3dUs}ohdu{WE)EdMsIMrw}>gV!GKFGdFZ2cN8BN#;JT`S9#rt>O;>Q~8CC zv2b72yShg8D+fc?Rw-X!-^Am6vM;_$GTNqsd)*%&iSL&X78dqP4P6?#E~%m5&V7UA ziETGyOjgeJ?slBzdTVZCYV_^vd>#}3W(#gEIM#6UUOUqS;YAu3zeV22RXTI_6|=%q zCkDm@qla@B@vC@7SKQlsRpZsC>y|&y_8tCE#}O4A|7+&z@YSxfvY%F4WZc`f`zF^L z+qI@__e(bW2ekV8K4_RZdrsq$YX`3S@0OY#TgLfmPjb2BsqpAW_xG~z-uB*Y$`RLj zVQosRqJjrbrR#lq%9~Gw45*nRh)fM)ypv+3%Y-BiBT1 zWD<|BF}(NVnE50Ae-HRCtiEK-_F?z_-@7FwB@f=)TWx4$)THd*$G~vu%8Fg7+6U6t z_^GNf1PZbrc*r(;QQP^Il8S$HovNdpTfcnIWf1)PywvoC75Cf5z2y?Z%?^%DK9?sw zPy6;e%l-MMuRp&%{A0)bdg`_AM80!Z*6w@B6@GZ#6?OCAs}l-)rbe9j*WeueEc^J0 zb@FV&MGAhicKph`{-Eo$p5wIg1C?Qpe*~v=ZOne2_vX$vX)QmUkFP7sPF1<4@BS}l zkoaHTqkZv8DYFAlws?tZ8ZPhFZ;RIyRqXom{PO&NCjVZo|MzOmt(oh;^f3N;DF089 z;X$(eZwXNATE%mbVydkC!dEZUVwd%7vOdK1J|j-$5QjsudQ&l5dFyIprB2^!)=7p5 zeR+J7V>6;n-rri5r_P+d^Bbecr>4y@7JW6MF~%$ha>CYcdMUecLxNtbny}3M(5PQJ za>g59#)g*e3^{dZ{{zc|JHGfB9%8K#S9N#LG;cf~A*&qX6Zh+QC% zO(8BXs@N88JjwjL|EZLKck{#LD_$z*hRTZVV^V&)TX26c$DX-f2Ad!Mn|7%E?e|Z= z9R)J?i96|(v6WxgHKE_h-E{7>**>52-W$FRmsxr4>W8m3cdx|G{%~vi{lEKV>eA~& z+6<3-GGD(}z`Jfojk3jik=wKX?ld^EKl!*{PJIHq#wthmJ5lMa*Y(}ZWd!Fd+`ZHE zRr|PJBG(U(r^#L`rm}sySe5zMV%f`=nY+HfIJz;hC4Uw45|}BnApPZsHEp{;{s_-dn%dFXRrN{xcYpOk_eb126?eSY_vz9k zSLQ`U($A`%I;>W>z?*Q)a+iPu^I=&=+Y?!z&+vC|6T2kIu=o8U?T_Ie|75Mpl8!T5 zFL)&N=mg^t4fC>f;@$RlO%}Xg8gk(1!V*`$1sgQ7u1R-(yp)ud#-?9+()+`Q!~Bo; zzOQ}%{r>(%U(T@XcrwYGfnodIGU+~9>$ck8-G2$*9aQze&6@4J^b*QDSq@AXGrr_D1Soi{28{$2j&M&n!lHw|7=9ZDb9ZHS*b z?|UoTx4*^>n<8IryW!GBMM?{oTozuumok5BK*FW2ew3>!Y5 zv*uU#pLb;Q{J%M8&YfFyH;?&(qp6)utkn`NLfuj@Vj`Srw;j^u0S%miON-p?&} z&QeWZiNBXK;eNcU%)vhri?+D~AUP<%?c&oJg4s5z!ceXMeJ6K zb7Z~eh1P%x*JExtGh92Z)6X+~r{9pC4yVa~8jV(E(9^K!U%U));ML2LTr|YHb7h9t&Uqn3pvvASe)~yU_LTAG>BcIA& zdmmD@y|Z`Y8-~I~?)P7oOh}c~+wp+uA86mIar(Ij>2=T2#opXc@;WbZKs)Xu*PV*T zy+6*R+ck%-4tx0F;o%uGXL7dXPg~x!U|wF`)JOBS$1^c>+)d+Rj5tsb8GdtB^rL+x z9A54{>r2nH>x3Q+ciz2r?`;0(R&u_sRn8Ol_q|zh#=kzaXZEh|jUtUrDyzzxyI-(% zZrfeC=V`HvhS}B)J0d;?6rNtU{I-Vk;Wu;sF{Zf$@`lH5mz*BIjj{6DHTE@J8J;Ki z*WND6xxI^b>psRKhLQREuiRX?~g^%6lSQfL*|MNusZD8E7z}TR;lPf*8wHS;4y6dq;{rXhz zUr}4-)UUsDK41UBbNv-Y?X;^VFPD6@ITC2&Ad+12lOt^IcA>+IomX6aRQXEEcOjFT z=+WDHQ3r!lr1c`S7)rJ#?%J_-#WAT(Q9i9pgoVS`n{PALL{>p;2Y0PZyj0%0pCQ`hhy(~xd z|2@)wbfA&h;{Tt|7rQSRvt7tB+n9A#%jVCA!xj}E6hH@%GX$z0;>ua)u%f`x*Dj60 zH>iDnxYcP%b5F_BWi!9&%=Cc2L6QBvodqozes-F2IlA64CFShwR-P)yB5D-&t8 z=$w0dZ$I3cw_r+ti`}ujwmmiLRy^K2t*Ok}WnF^S=W8o>EWNz1R4Xw-rY`DJzI#Zv zQs2q#KUaH&?%#FL?1gf9_VOY*u9hbZ1x^3MG`Ifyy=zIBxK!S>=O;GtRDXN(vbQ~G z$~?mc&?0>8@O4M7ToGBM;WSBQ#@xB0oi?g{XUzFlv2^msT)tH!;ux#paBPbsJBQ+T z!9%b8%-v^4UosZ*mycIl=WN8@>UN(YZ^zHfi2ZrIo7VLDRj+g6o~3^FO8uipzb#gE zr@2&pQ9G3Xdzpic_(@uSTlD6RG%gmautK*NZ-F~m@=FOY)&U&AhI57Xu$@vLyZ*2wbbLZvZQSc4+ z@$tFwRh}~std$;U;IxYHK(X-VczjMd`aN^bY@y|NNX$}Is z8GL8YbcZ~#OD_*P+M@AVf&Jl)O)Hlqeyvw(C_Z%JhJfC_4B1axlsg<=+;#iBa)V*5 zef`((M@8H$@5e`++xBFgCALd$#HIjjwN>XGY#kXV__Uyh+@`Pop5xQS|f;%cp)794|a4 zPyQ_PwoDqd_3`t(?>4Vv-n+h(1h1g{_U>-CM%Rk{papd9{*%h@%`P}GbN|6*65H>D zRy^0PEi%gYE|+ikYA!yD@vy9Y>R*NlNAhJF)uxy1G|k-2#KG56@ZZWh;JJ9j-Zax+ zvw4@y4LkWvC)<3(r46$!rK5E2_DspUuC;XUW7p3IHdo)?l$a}aetYf-dF=qTy4=s& z4aWS%XR?~^KC+Ha6gfS;`{e!y*M!Bcn(cTX7#mgQ@$O;I;afpb0qbX2G^ngx7`Hz8 z>#M7v#k*bkHIJn$o*B>I8Sq>zwCWf`9q7~sh7Ys%|D0`OV9-#uyZPhCLXB5VOjAF6 zoqFPvp7y8gu*#=$KR1WYd~<)cwr@q*#iJ+HZI;QMx+%8AMSEY=vDc5MMZP_~NhEXDquuxa z>fQT1@B5cG0Rju!c^({=|7YMg$D&bGJ8Z$_mkDWUyI$DXB&kbgit7n-8ovKV~qi4Gm;~edP zEB&YSqPzd4g?N~7>P9?Tu5rxycA3S=`7M*;^)$QR=`L7yyYls=^FgVKOIN?1Qh4ET zgx>b2s`ZKgMUUkkb(^iQe5#b>gk_qqzFN)uwq^Ol>GeOSf4uYDPF()y3HJ-2^1I+L zuX)1VU8NOgv*Vg4tNSmydTHT-iQD-%WHtJ)`0G$G-&^RU)z^;a((#UxB`#*N^wO90) zdWcs3_%m%)%RHfzS{HjIJJy}9Y5sRgh4PG2FoFC?$zTj1fRmJVw_tL)K{Icjv52KHd&x0o?CtDOf z;V_lrU9z%|@<+Xuwln@oT|Vljys31~&W$W@v=nmkS((&ccK&>N`1UsEho+NW zi1#?!Wrn#tvG}{S?C^>=)9#%%Q+T^&!c(J2tu;^j7qQ&t+PeRmeME-J%|Ak6K^K*L z8d#@uHtpK;VpnU}$yA%krWN~^wS0RK=6&bIT%ncH5&LQ^>mLcvKOkFvr%`<0hgR-y z`G!l=9gp_9G28!IY~NM-`dVYhg{-qX4a1!C1yv8+yAUh4An&FA^eCs+XYzac_jXOQ zC_c`U!;&b_`oiWcld8>I#-yJcGxTfL{ygz~)vk=K!ilRo=Ju|rFlpJn^+@EN^{@AE z_?NY^nBAQAXi4MpyCu5ocKi|Aa$9%F(M`+S5*5EragtHLu`SnHZbyDM-=~#F=N&%p z|Df<%$7kDVlj3eoHrw4i<$3M71!bFWx-7ovur};4Xs7y}+V6L5U&o#|X)w*cwqXB$ zd1q(m471s09g3ZA3%q2`9)I63wexT% zm)a$v*+utcwq0+nI`_eDTeTc>LC~cO`Uee7w$EE^{qnfMj@%PLySy{shUwgqn6cu< zcLnyS#)@B_KPG6c{;X$fbtF-!vAJStn4sr}P7TX1(?v7=Q_(n|gg z<-JdK=HB+RDYze|^3_hobInfn)m+Qos9!3v3AUKzrPjNJ%ca0~=Kf!A+3ug-)$sns zR`Z(=rd4JOPbp5u`q7^<5jEI9om?D{6Y>}b}{0tZLpj!hFq(b}1AoG5H+X;Cn|UsE_&E3*Cdlr=%EeSeIX3 za#>HRVC9Zti};SO;+3BQ54VUEz5d9vx6RJ+#Lo>YZ#aKcop*J6@%o#0g#MfEc=XBp z!mQc4e!)VsSeOH46jxr|So_=0X2(;;E5FzRv{mdK6}vd*xNFSc5}j5ODD%MSq@`Bk z5`m*3l7>-7oz8Z;8SK-J+`Ytd#)ZUI16>Q}<+GM6`NZTu3_beJZS%#GG7Vg(ziu^4 z;`7iwCarm-ut(Xw??e9IYx#*uNlbgSY(F#pvHySmf3x-bJ;Ln#a!XV^1&(j*%YE^Q zP5yjS=fqtBCt037i0tJtTG-L^X>+J^Vupm!$+D$QYS-?s<&CzxeReZf%d`izD%_e^ zS6>j>%ObnbPFl>6qhD{Aj%3Kps|TaPw|>y_W%)E`f{JfU{o-vuqt`|*$y~*{D`mw* zr%6{f*52l`DR?h-cpLFdzKbuGy&T$(O*;N|7zANl`(;NS6b+3bSv zcgvf*PDt;5Z+}5O_e|-zqw3qMnR+gtearfR|M`>)MRQ_TZ;<2K7#!>y^}%OJ`!k#E zAOBBMI9taeE_Ft1VXxGj=R8lMs-$IGHsA5e+b9wcGd5eSe4J?>(|lTgw?uLA=0_X+ z4tSig2wQQL>(Tyv?nl2E9%(qu+oe36BWm`kOEw+l9D5o3E;BpM=g)XGOLG~Ups43D&Nh$3KzK2 zdnU3>F%xajXWAMISNy@GCcIYP%ZT7 z)YRqz#m!sXWURWq_=~n~3dowOh1rNbmrVy1z+QQ-`O7W zi^JBNZrHow=i^@u6aFkpJs#;*+_6edfPF9b`Q9n#cd15M&e96!>SlZPx>Z!m%=(g& zi8zZ-%(n|sDMdx9Iud{X{ik;OE%M`n`z@xD zPWA`?)EZhcu2w(NDY^fs!1t4nCfuKPIeFRg^b0RbJ{-3H1MW{x(~I3@&?6REb&O$= zhSR*~9gk;pa(t~~zI^#|$CM>Z-%2$LPdCM#>sg>}zt1jW(ngy@$G;im*{XQtN3F4a zSMuOO_WQLAGsMMRLXzYXGjcXeTF~5e=Bu8=)_acc7j3v&ddXMx=!)yFJ3@Fw-QQhV znDsAB@kP7j>|b}og|^HOc-Xbt?7=4A*M`>C%_iQd65KNyRJsE5O*SO|*2~#ju06?Z zzn$hO7sobRrFLefKU3dv3w^yKq&l_SsEX^L&8rCqe80tQ;&4+DQ+Bz2S}a_lV$SDC zkJ|2Ct(vFRI{0i13>X+J3LmlT{l548)Au#ct$*C!|Mzz5@9m&uX<%m7X3@8?=&6^K zjLeZIPnNXWvNLQ5=h-qNfYFN4dUK8Fy{ShY*gicwfzPhdJUD16|5?ACYo0fiu?TaB zcqMP!T(SHz(~{y%Z)BcmomB}*wruHTTzhEK)YFA0mvwJQ`Wa;M%G5<t^^F(oGv z!L+nx6Vqnep1FMEe&LeO*WcdQcY4)d&!C0h!q2MKRBf~niqoEHD`Vl{z2Ma%!IGDq zPv$=S+_b;i$s_BX*!tDSCH74?`>`msby&^uRcZ|FQLHk@LUcXY zOLRpTz5m$Af1G`PTV|(sostPw_ zd(#eHdXskf$o(VVWOsx6L76-XeUGyqtq;1q^U=P&amNIoH*?O{)6o znOa*oem`w^`Yv$0yEa?Yhca>h5Zge|E;cEtL$9u`2F-oW&fE3!jau=%OP3!XWCXQ# zj`z!NuV#GXu(qb;(j3*$X-77>976=t$Vg65Q_Xe@awAbE5XF;{8sK&O3L$oiXtW z>&+}RrN5O^B?VUfU#Pv~QrlHS;nQI{hkMQAdOa8?2M1rfoiqDmjMp*ieFowm!lj#3 z!_S{gub97X@)6Eiz00Ql+4@W&>#NkKHIGeLEc?TxKTlWK>$z27Doss`8 z>)IwWSeL&$a^L{Nv17+}#I098U;4;t_mn^nFZLfotknx9o)co1`M$?BO*$}r9v_n@ z7t=PmtZ(rzbNuhKE7*SjS7ldyMrDr6?R4|0NixTlIBYdz{Pxw3Kl8*r^{x$xmsM9> zSN8GsWA(GyX5mwo>0=)s6+7{)^z192jCT6Ge7vtfIcoO)i#bWh`|jSTx-WLbbniL- zb1V}#O_(<+(DI_dp;PP&XYBY8by0ou8?M5uT~fx|og#MY?^96tcH3~LN=>|oIA`Nr zTiu#AZcN;ATXy!TGyQsBRO?=@aEh4spvpJNR4-xQ zq=Qx`{U029mT&fZ!)2j*`K+x{3QaYup364{PJB^pxc^|`i+^{dGn_v72yzQ7h&*Ym zkr>cu{pPyHOrC8o^^Ddu*<1D+T*%Y>an09z#r4DU{^Qd0eJx*KUthd`|NdEwArhV<9%|u-!zI_c2)|sgbb|_4v_bdBM_S$2PI`KL zk`}mps8Oxq)1=7EpOIfyA5z$o%f{pCm33p^&&MXJeM%;;OJ(!p1y8uJ%npon{gp4G zx#E$qD_5Y%&HG-OF0L7?&K3Bi9$(JUq}A4B(RJbe_5Qim^4B*0-CB1gyHvMV_IF|8 z-A~n5*|}W2SWbo1s>D38o>CFVy8q<4w!@1bxPP3Ozwy1{`P+sLe_HSBv1obj5i>C8 z@p|O*PyDF5AIdJKN=by+X^}qvU1+yyVnXCCSDTw7*u`u zqs?9;7lW6(7Ar~j__4<+q%UFmyx&7vZesf7(~ma&%#d5|V*SXr|Mb*DqajpDR7@6kRVo|8MZ|ly0ty)Kp?qhoTE3T$f`0N#@{asyO{xxX? z{yV*Uibl|)!+nO;b?mc0&U|yPQHZaoaLTMp%cWflS(rq5rps&&RqWQUG2hu;Y4SX0 zj!mUd^|v<%8rGvD>q7>XyFS#_C~yAUiztZ20y+R|IV5B^nuOy zB@MCl=KrPsx0K2)I$a(4-dICybMIcArQJ8<&YpR2ra*Q1M2RNUdPZ~FamB_7lbD`AEoNUd=fD)@>~yoH3t!kjP2b2? zd{@4`_zG`R>oOMUeR5*1JC8m#@jV!DVv$VM=Kgux^Jcy+QdgMKVPJ0F-mSlHhThI6 zLUPj5)vpX2#P|O=%Fxg&ZT<*!g3cuq;bYr5X19hYs~TE;ox$>O*Vdv&#$~FG4*Qrr zZrr+;{O?!w4!QSlUL?pjOu4b}v%op_2TNKm8@=&=$Z+NQpHzp7#SeERDToVo$e!_u zz2CY}^76;z;{_G}6;C|%WM|LZCz7uv5wiB$k+0@)%@-%Ksi`l&GmmLPt^XvK7w_L6 zKR36!B&Yr?%g+~k|CcRaS9;Ft#1Ab7&HGCV=7k>4dHSR?ltDTmWyXBTWXbRyE7k{Z zJSpaCe}_fvMb^EAe}x)_p6oVdl9`e)jnVtvc8U3SYBT*?iryPLdv@0f|Nj0yogrdV z%E?C^MS@G8pKhqFt+lBAWimaROZt;ifkLZ zL)#OW4+(p??w{FEwYTwg{vN5>X6p_=xgugEyLY2|bKrKtB(sw~Gbz`0EWG9@=A`c94NP>61=IKS%BDTW2Q~Y^&03`H{9GyTX3W z>&L$45iNF(FJH1tKYRHrYs)^j#f?>a`<|YjzWDmm^5;C_sqgRYm5`Oa8g#H}H&+$g zzPyPlTYmMtDUdPA*_fm3#lLU%jE0#NLbs>e);0HeEOiswck7e%MbB^5p`L$?q>Em- zt^1OF!%QoIbKx4Vx2}tWHr{$5(Ra0?NI|pgYwn#2MKv|`i<#w2XL|*Y8?yak-;n+M z@QteTe>*0tWqq~UC41%Nv%cn?+V7(CBOlgG-pS9R@mDq2|8LX=iTms))1A&5wA7kr zwer63*K9buU%u>e*J_57-Zq!7=&!h}a%=B{CT<3X-{0TISA6K!vAxb9)yp>PtlF{T z$G<9Q$b>6CcZxgkqUqDV*>?@N-!rikE;#f4?D`2it-tzsC0>^2D{zy4b+CwSX7^L$ znG0{cpZ#*W?BZ0d4;)veH~kUx5dB?eDDl$ASv)h$&1kNzh3Bjt|JZbYs;j9@C^HJ* zC=o4lR6;`Hz`EG#4Nvd=o_OU~K(>iPnR1E6^d6&$o%=RK{Ck`yy})TLyXY0=1f_6q zSH%qNRbBHWMNhfS+|Ta4`Cs+(=dP*6Oa8F1zTG7s_~e19sc9={+vAqp+h%o-I@KY| zO;-BXa?Li+cau4uVK%#Ci?l@Gg5;Jn2b$X*{P-rs>^gJy2xnW|-@ZxLCa}Nf=e7F5 z60W#$uJQsWsf`)iCe7tEz4qCXgU#(I$IYJ236)cm4(TrZ<(+Ql*ZPdp+52DA!f*L^ z3KZ4U)Gl}$GYackKDO9&B>(!)*S(JxoO|_6_HCQl&iG!ATYS@Ar#<=Oa+kx~D3d!c zz;mN{N0923w~l#>^p{3Hes}$jai7Q0M~x1`jgLimx*mRG44Gn6?00M7Ld82}w{t7L z@4nw#`}-fF>tE6MSZQcRFHsmpy!Nu-S~i=H1Fkb|O2A+IFAaqjD{2?{1Y# zsm7s~7C(w*SRx$szsygy`N+R*4~nFhGW1RO*|KVTK)<$*GJ}r5t@THa-c5_&%<*5> zWWLf*SMwcFM~|v}*z-^-=gx+83jaioHK*5bc+N>END$av_Vyt2_dLh7>*Wh$zUS6m zuR7q}+NG+x!QJ83NwECl zo(UIK|9JoT7v|TlTh$z7j?b7mbE6$YG8cF-bw+CE+1ciw*TwEGcy>mTA@AoY>Gj{2 zO3$CJ{&PyBr)cjltsTruIQu5%ZcybYn={+@&#Wma>v-Kaw3gp|?Y=;?BG#DWwGYEi z6OGkv%VWbM+1Ktg+xK_w?};iK-{04mw*HuZZ?|db|HN~Wg_pJ*sZXn6%2eO_`rWgs zTP+SgSP=62cVNEBULU)%l!M+&W~%rq)Gttr?r&bi!?pR$_7){QvBir5U*F()d36@2 zkbX|UOooI^p+lS>=WCR%k6zPQnY%K!cyWTe+vCZ$2@0Mn_Fa&f;>~Vj&}P+V#=ib+ux$3ICU8 zTvw0y>|9jr{z2z=Os44U*G}99kJHwvO?tGiRK4T(Tt8|4_jlgzzb|54Grw43tG#Cl z(|KR%>krTT*r8UZU2UT7^Js^{Klcq!=lvGAK5NBw>1z+4TPv;(SFy2Zm2z0YdVuB5 zhTn09>T)@$&2JVl#m37NhGzz@%YVYj@ww(`)=K;7GWRr$i}O>xzg&-GJ(|^jeP4pt zQRla1+;7X~KDIapUAz@Hb)FiF<^MmQ3;+Bm%-b3j_Q_o^-1y3b9nC*ierlS|AmcOT z&%?FrjUz+PzT{8cdg*n0g1}wd?<)+pw3cwZwKe`YwT|_2+|?b;(i1fWSUEzwD0RH_z}49tXg5u!G(@*?)}wxxBt1Fil^{bxB1dJQ{CfgK1vpz zxZZPW&3+-x4W9NXOV|IAQ}R-<)iTXK$+1MOJ#TByXO;WPmA+H|2Kh`~zo0Derq_E> z3%9DD6SP|9b-F4knauXRl4bhmNB@6|Nh$~be!t%z2bz>N-~aP0Lj!1etwrUhB{ysw z8;WkGv#2mIa2ZVrdU;rB;_K2!N4D zU!}H8CX-gb*v@&mZ%RR(#{#rj*!7(?FpDm}>TxR96>D-YrU&7;W+zU24V%;TDG~+@-QRcy^ zn|h)PJ~AyYnY}fN_idSUZEdZDjEu|bt5(vN=4}7c!}#X*c7E}g0!Gjt$lBUk(A>R1 z;_D|LESCsuKNcvlroFsaAqB+$do5n=h%~RFlx$E77w=EIA{C zV|Tf2)7tNOjxq0@_ugZ#blHBkPvx0rOVW;Ox{Hldbszr_zFleZS>f*bqLBH`t;N@@ zEM}LNhstzkDe@WB=-Y&6FsSAR)}>$X%YS`fWzDAbkM>sibH@Y;bVo_;Q=1znk{N&g z;$ruYz485VwQR34Tw4>_?6&ye>1n!~6T8iHD>jH9V2D0`Rea^a%`%bG8Ux?( zb`+(!Mt#_{XnE*y9sT8#zP&x0lr^K_k*v|G^9(lnzmBW9?&O`qdFB6|nDY~#Tiw!2 z*KK_h#~{SxVwXIziTe>xm_$*VZHmY&haUc^pA&kNd}pW_39V+R6ns*A_iK3KVb$!y zXJ0ICy}hE>J5zOqN~fWXNz2{c@>d1xJcT{i_UYtCm(F(xSTmut=*Off-g~a3NVA=K zx%KRxl*qUkGHHdnulRC)01?Cgz+huPLdZ|6IcKACbRx%u^^arGjI3xqYAR_ngMA*&bQE1@pvK z?k^EpXu0^H@!X=f(HydtF-M{cM0vXU_p6Gx{!HHYd)M?oKd$q}tQAdNFKKTT>Y&~- zwcP&^<5Ve)jNNM{8WmnRy>8>2ceY2KzD{y`+s^T}O!|1A?BS{5ah)?~N`6`O#fSOF z-~0b-&zw2)VC(u?-E(s+n|JQq*^u(L@fJf*!4-v;J_9}1ZqL7KyhKwEvaI@2th}%| z(OKAQuV~r+z9moB{qfP>aJM=6&8_;6cRlK_hwrxw-M{2XK~iCC_2#W*6I6I(%KuK? z@#GPA!LKWlTdeh}*N4eTY>n!9_)zi9t-luU{+|2GP;{i!Y1+0o+CKJ=A{N#!=(M?7 zF!^0~Pw|$t=%a1Y%<-9Wp1wy{o~&BG&$GiR?t-6$r^eo&=Xkg~&-}<^y6nBEi}!x% zh6P?S6YIFY{ogeCzv@=|Ij4R;jlcfXr&zzyk8RPELqC34u(7dm&5y|UIv@4xk@)@& zW%s^>ySqx4OmT{jpP$$}_3K>uHW?moo{OHI?57XJt-hqcH@`@6M~s(X^rG|gzKGv) znCg3C(dWBi2CFW0TU&=I#fZ= zH_`XgE{Dav`|{lViROgoZj(N;d9-+orp7E~tC{q%v* zvDW0-{ht!WrQQ^&hhKlW#6h~s{K0_(44|b3*6;TSSATmG$ss5fTeXZ4y#D84GyBIM zkNX#2%uwj+T6Xxu@dJ&A?MkCFPHYY0G)}+5ydW=Qf$AwF-KHg46?!d;fX|e(* z6ee2EFrC-_!PQ=c=~tg?;B5tWSM90~PP1-ZGiAJ%#T!%nHqHCbT)#BVOE=zl3MHph z2=LqgVR`rW9rKHlXI;*EiOLq8Q{y@fJ3SpbL>8*{6&bJA))G6np~)l1B-Q+lS_OMT zS4P9Sdp7mkS7aZ*DR|E}#H-Z)&GFh~L;t%y_1$fHUY9v%%FHX+lv}yt32R=Yy=$lw z1Jk1;`?n+=<+@XFnAi3yL)9?`HFfoaXDrIzL`)R+>!^EpLu=+KrWBxBOHR-I9AAAmEoMs{uisp|<}mA00WE=bVcmvCMlH70^A6O0x9Qko%pJ60x%q5g zf35T(;_ynnRld}Rp*QZ@r87PPjk9_DId#_XKWr#oWy+~k6g9oYsr9D% z63dg~BJZ~yywaA*{d|7%-b;q;>I^C?Qsui0E!l#;aeB5r^0eUZSC!^++J7@wwC|Bb z=Bz~*Gaj_py=X7^^P}*~sxLiL*Tn1;TD*9%gtYYGHGZl~MWg&DPxgv#y%nPAz$|*s zCi`de`oIX!*Rjg^d?~x%-F^3Wo{@g&@t6#qWqlX9mfU@PT=sYAUFS#JrilOgnHB3a zi#^Y$Dtx}$zpt;aKX|gzIAiOVX>r9rw2YPelyx*a?t9b)`HAW_F8+`pEipS~y;1)B zM234Z9`1=8(JN0#xF>9=@l;XSG-Y1ey;ilfh?e&k)&K7{zv`4dC2HOQLx0VwQ40=o zUgnb)z4tn0tLlNIb547=#~c;o3Uirpiz&Z^c=GE}3!{xr0CQ|fHy;N-w)Rl!rNQbXMFB*Uy}A{r}LAOUZNdK{j1L{oN{PY z=xPZD(3xFvQ|Dzel;0_2m#hC%2&!BPWs=LvwiU@aT?kkp>7f_(vSi}{ZfV_=hU2ZP zzx1%~nD{+5L*z_eZrQx648M0wNLXsPctT|CgF}mYUj-TLi?RN*ZfBmc-mU^(zd1I| zVcNP${9Sg>do02tHl=V>%iZk%z3;cct+m_a+}6!)`<7hP_9SKcj~y43B=nLuTxCcw zVGz}*DEl;L+v7~uDxP!SbPq2w6401)#_LDW&*c|5mNIX6a!PQSbL!(*)#|T*en0;H zJ1o<;>|jgOqy=~L9-p&*zvSl4$eOp=@zEbn9-THXlL55TX=BaLA^|~RK{hrv19S6m zwxYl%X+GyUjqHzqST(iQ^~u9YUnf63x7^3cDzZ^uB_dJn*7LhT3U5Bmt!+uo-y_zo z*6Q_;E&KW&QH_Aclbip(`Qh`3=i5x@NmmNLmWC(%ZCzdHuOhA6}}?fDW|TvgV$nP^}RU~!t26TI|j12?^wl=baCZ&#a~a`g9222z1$upygS3y zth{fr{}%6crr+l?P2dzh)bguMt*QFb7T*G+rBfo73NbDfSHANhjo(*zhT1*XW!FE8 z7+%j@)t@9SCG{w6^Ucdw5^R$h;(y<|K0$?ZTi#u-$Z0n_)@ZbCGoH%Wa(RD8_nhgL zj_xk6MILay2~v0G>be`pP$@T8>(NKs(%@SUkNJf}g-&I(dH76j^V->tCv-3EvMRfK zuWCc+#^VPCyF-@GII(Jvm*)8`f1VS&EKT^w8mTJzulOor#pK7yPOL==GZTIYooM1{!q(oqwFJFJMCu( z950QjyqX%Z{hQ4ki^5xOKR6d={4e5@u{Z4V&^)jHKsURqAYJ_J^zPS{GZSaM2rr&e zI!iormoJ~)S-#CZfn8B43g?YdEX6bLe%-Mtr2XhQaV{Q)z=gMF1|+yfd1-Y`Shn*x z!=k=-;kQoKb)RD41%0obTOLHNa&Fx0v2F^3&N|)LkPB%y>B=slJs# zOiZBSq5kh#|91c6N;cnf*8It@7ACQ@nLA@@dXFsFvVVros#{Ba1Z8xlO_5ZSZz$oL zbTm9Ua_enbm%tWP?`aJkRj*jyNHX8pk|_*2sT<_)`M>Wx?-CA^$CRP$$ZKcM?+ z%KVbe%a-=njDB|+En2m3PdIJ65{he0I(HSJm7jvUJjK{mu=Yh@Pce2$5FAgkh zns8($BSW98En_N2?5+O=acOJivLD57e`h0OUw16;ji5lI?Iy1qAKL79&H3AR@WuO- zv+{4B2UJC`{aCzVlT^>tf3DKKZcQs+N}f&VvioiF^tZ$r>s0x>vVqI9mhG~L*5|g*C(ZUuZfw4)z3!LaKh|$?*S7XoK9ie2Z{D$q%I+J|&dyr? ztn9&a+xL|W4cz*BCUiIRaA-`Dia4p+;QgUPVT#bVs0XellTNQXv2^)U7Sa7n+tn); zcf0Ux6;4!&c=>?+%MPVbi;2^?)=Z8oXk-2zqm>?X?nuGwmy5F3dCvIy%wpZcSJ_*i z*ypL#E86H7&XnQ0rB~=H@;H6*#u=tL8A<25_pk;0k~36Rci70!{&+*mqNGwqx1jEV zPo2RhKA-W@iRU+ta-5lAbLab7dLOo*tv9#@F2?GUDsPjs)^76$x7x(|Piwr;J?h`(UrxnI)yM;lityRIFcE=l>~M zO<{{bJNvYQH_vQi-E`uGZ_u$C!~U){7R%hX$+xJie7tJ4-qBrKR~P=-5%p@#Z`xC?3QO~7d@@>LYa;9`qpeIEof^0oOXRaWABcKzFmf)F>|?=D?KTEa&X7m1rLOr zC+@ecGW)wl%{gOV$NnW+x8r;gvrn}>)|{~D1jiH=&QCVSMZ;qnL4#)%PbRv5xY%F! zJc-vw^1wVZLKJ&!rmK+l7H;fdM|4v$~TXRbCK_&V`LYue*T9oCP< z3G=J9bqm&&AHJ{6p{C-L9Wk|};K!K-R~{r?Vg4`q{NnfZKh>HHjB`J5bnn`y`Pzr& z=3l20i7PsmeX3!Z>FJqeW!Ik04VJ6c-^c2} zpS$Lg`NMt71VVnbuALiX8)=oXsu$`zhtr(?rY9$F909 zI$yw6!Kzes$@YcU3LCFKA7eNbnWy<36WZLC{zzk~z;VN6%a?B~c^PE$I`X{JdN2RW zO~QhD`~MWpn?3vRj~^D>Z|g3RjW9h^88nyct=sE{Tmj=RJKCexh6=5^9(Tm2b9?xY z>L*@H+HJ~Yub*8!{YAJto?Se2@A0C2U&@zlQ#lsk{9*6^v>DeDbr=$-2dU2S`f)7pz@@Y)>(@91-ag+X zE6U*AUDN5(;knN_ zUVd?&ckLksr@eBCH*Xlo)jv|$mUpwyB)9v@l~$F&g=$Xco|!Mxo_P6Oi|qSNUn-1N zugJf&!&>&<#rg92`Inl0^Uj=6?X;w8L;lj~qP`j1IcJw87cDTExnSxfvHfWlflJ<~ z>vznUDR`7Ca9xR3;VIi^Z@x>r?w`8&H`nGvY)i!rOf*l`76(0+(R>=TQathXv)%P~ z+xr`5?hIXh^}rcWR_%DPveM*+a=%Se)!x2|69v64iv$N><`Z%>3+Z3PMC9q2`MI>Nnm~3t|YfwcCukuURRfV2^j<&q&HA>4o z(|c;!<^c?qYzw@k*p1)z;?)iQTcaBzvL3%~L$eg89?i@bk@=LhKUseCof!Ave zyQqckIOi}Y^+RXtnZG!%8aZ5r>5?(^T)mD*$oSy$cZ&LObEU-5K4)gb z@t3xN!QVE7i%IW!EO64}-{gpRSKd1FQmZ&VWSaADj+FrG%J2~f6$T>KtcYT~^aZCk(-6w`{!NC+{4tK zv3Fj=%}t4K?v@Mi=iKb{)9Q@>uiGxD>$G*Tic3%{P+-tl<*+R5iXByn9he@5_uesmFMTF~!Lzmz1J zZ!0`~Yq#Xg zBJTZiOUrh@RY}ZXny#P`k}p}Dm%q`$Z1KNvPmbggD+a5oY3x(N-ufkXznqjfgE62` zLVfdo{<}N}SDg{rv(SsRecG$SISHRbXBYg-a{O~fZjs7XscE{>$Ao|LJv_M9x@CL3 zNYRNb)ju`gDqFc^92U>2oua!VYoU8er-_Qo?x4guYg=DFzjo344P(NmXZIeku=}i< zq|Kd{l#tCa??_DG)8mz;lrT&{x<12%VghMwCmQmuERme4Ms-b^hn6vp1xD^^&oy5-Ki!d+7ay*GFX5 zeEy&xZ`btqH~-^Y&PxtWtEMRCz+uZ24{PJaA zhh<-Um?dOnjyycvZfIuKmbN)_yG~l9=p&EcS`$v#JzmSOCB$UuFV%P4U$1OcR_R?S ze6Bw-Ys%-Kl=p^zRr5Ku-dOy$KfHU*^`Gl+?BQH}KDtlY-EZO5tmw{+SE`5bAaxUv8IrbVXz?>r7YowP43`PiiAmTYWnT_wK{{QLX+BKS;?R{a{rc0Sod z-Em)(OlJG`^!I1)n3;M>k6Cwf+{xVC8*c@CUo)$rNM8GfZ^Cc(KhqOb?OuvhbSOVH z)HtwW;#~{7HJQT4OMU;WW_mQ;z3b_L2M)}IGR?(@j`_a+`fDpsn^0Nuiubc)n6FI{ z2(9@ld`@yEx63-Csa^VBn)<#wvUi_3va-X~KwEj9#EHg*3mL2Rny#{*<#J_J{wfj0 z$`yKcxw*TJj{vvxDz8Y1gr0~pHTP}1Y!`-FiT8i^6Z`OS>v^TH16g6M4UP&syDWPj zOSJRJI*GXYpS5UM8@)ZLpg^GhM|*w8?{~Y;D|K#K%z49rC8&bssf>Hu?`ZXj>{A@F z3Od^KlFs~Mh|p0hF)b-Qxmm_j_uwSe=D6Qmqk4pwt3TjqJLU0u>#?$x?>{+xlD8`| z@_40C^O(iQce{YPVc2>(Mgt`Wu@^y;j;TIuyR;!g!N&1qU#O6#bem{~ckADrX@RMC zFI9K%3gtPlX5ACZbrvCAUFScG-bfj^q5{=cH#wQeuV z{eNObduZRKODe@5wsSF``mr?r)UEYT0uEFk()sQl*rId#!`Joob3fZ0zqhv<9Fd?+ z8INyeuRl6XH=2RrZP{#wxdKNX<(Y?_j;(8Py8rk@NZ{F(GvX|k?G#EmQxrz3|Peoyixi)U>|scgL&6E6-c3&WZoO`}Q{BS*zF0 zQ!sHV3|qi&z3sC`b>M;4!@m}-Ke&@G?QnNcOXo+;ilmF$X?dP&QhuaMWIdU%&DzpU zn9X=bzS5#@t#{M)Chl=aO;dfgY)OI8!LQ41OZ?q;_RN`toSdGx-?y%R>Jrud@O%IN z-!DMRgMRFs|J#z`z|ZIN{jJO1I80LEd9mezTIf`kIgy*s?(A62&bVa3A`Zcgz1-nm zJB4!|H0k?vr7Cxto@oBdl%#p;$i2yyw{ERFF5RhSbAF9%{gM+x-UhGlJ&}0w=?e$j zqpGIUdiOg*wWmM)@K8A8?ADr2e>J@r$B8jXB4z3~4ta^)7k{wsM*by9F_{ZdS=t@d z25Vc=*hN9e14PjQl96TmT{AE6?bh>c0$N9I1Z=Pv9Y5wv@P0NlO z>RpUls8-Ryo~Vss|BB%Vk4YvQX9=HWZ3f!@&0OQ_!w0o4g*pNtyoac2>B`!{jT8JLLkt zt@8F&>r3Y0F*CHY>pa}vr{sNEX#G;IzqjVtE_CqN%;V*HB4~P-_4)3Sr;*EoJ8r*- zwfA;n_9eu0^${n$!4Xj3k$r&OGxgP-OAV zoJaGj-z|*)(Hj3ieO?9AUM*W&xj7x6b4#wgEj>=a$2>hapcYV(sHcN6v${@^o=sMz&QWzLN_ZvN=6%#{s3 zRqveD7w<^hrZ26&;A=cfUDJw)P|M0sCVX$~d;FHaWjgp^i>g@mR2c)4We@H!{S>T7 zUGO~jhDq8A-~ICrvxSGw^A>Q6X%So@H1!6jhy|na?-XOriGuv+)E^u;J!9_Nt(}f? z)o% zB0ST#b=U;WdH(m@y3!;21+~NVjz2tn+|c~F&D~}DzgF>TPt!jbQ_c5wi*C-91d~Pn zmsUQ_3;ph|R1oUGvEMafk zy7StaYf{a*ZIiZ^#y?wn$<=$Z(AqPdZfSZFasQew@koD=ju$#P{q~dW4g1vhvoi&& za4gxTnxuB~vDde~4c8_-vN*Ofc=?ZKv-9h+B0Su2ctk$oXaY_2oem}SKO$0t^p z{lWLGyI$z7_Oo4gp(xiWXhPgSW9HP?A+1M+UtZw-{cL6xQ<#y^g_(hhn?F1}YmoT( zsOe$p6;iLgG(?Z7i^zW3Y9($Tu(kQpzPSw?zY->x_!?SUcY`Y4oE#o-Q$9I48MLcp)+r`IbgSQ_qzpWDg7`o`(9)d3I7sd9;j|1DFgUf_AJS5mZn ziPp&%a}qQbb|x^Tu8T?Hytir3d7~{G1drR7NgChWb#+yHiqxlVFKVWK^*EOrarT6) z&F4825B|&vTNmRw|No!oKWE?nqjvApwCxMTm!?-U=Iwkc*3;9IP*XEUO-*eZUlL-IrdqkvW9puw*5fzwj~<)nt-qT^JG|%N zg@ws8=FV;H$yX1W_vHSz-1NlPo9@duMeIx3e#Mh1Qe%a;+hKw2cfBGj8J+Fkv#qx0 zPIO+m|IOd0i|mV*E*ENO@tX6ZPATMTYUQzodt;3zH)XD#arMIglMhd~SO(rSj{4wK zDR3_+i&b|6_in#QEN9b%XPf07%H4jqEqwp4t1m)dzD!eK=vdS-HRwf&RnC2d-2DgC zxb{tJP~9Gqb)$&EAal;iZ8vStH?3&;mU~59!NuuC=Zj0b=d67azpsX;olmy?Tw}tb z`6h{1rAyaDShh8{_a)qRp7le!?bU3L#@`I3S@tI%1~QImYn1{i#-p;ScowavzI4 znd2cbd7amq2D^-UuUX3?_Se}mb8Ol0e*Kp-ETH|FZEbBE^6pwiZA#%>w!GA9gP;0# zu9?L)-Hl$-nmmHv1WZj%u6_C?9Xu`u|U7PU_ttYE;DPFoWUDwTJ0{7v zAuq^fXm!7q*Gnz;n|tWx<>iLf(K^hFCO1}YQ`vE5g{^~yl7_bH8@0`oRu_HMZd$IJ zVi=#Q8M``9_|b|sZ~eOsPft&`+G;Ou$mX&_-0c5CXLsF?;mcq1{cF?OVn5+kkZFZB zNA2Phb>Gi4YuVZ|a9X$Uoz;2&^r>p~X&>A97n}}%W?`7KJjOs?f8PP|UrNiAB~H}5 ziWR-!E!FoTZt9~anLmS`eww>(YVy|NY1=QYnOw?n#FIzKX>Hiz)$4X~+5enu-w9p^ zu>aTU{avN6uRYv6|F6!kU%xKoocr+R4NuWI?L-v?mVUvA=iLtBfomr*ci+EjVlKJv zl}z=M9b2b+xa``@^z!hn+v~6X3)KDjJS|tYIIYHZW#ps#8*8^m-=FsQ+qLOm;@5jE z&6VsiNLb-_iA%Pb>Hqc{>4w)pT@?7nt5(=dYx6A z+;^=lI8@CYQzw1cTgLn{uht-D4U6GHtG}xr#6Qaqm3Y)2SrExCRz9tG`yq#E&n(p^ z)-AjI^1;8~@7;IbJr=(2lPI{V%DKIbx7Uri-~OM)^2}FdjZa16VpsYJI;gc8bqPFR zx-KFZBI1~8Cb{`*&dh*>xdB0lK$n!7#E!>*RA#&;Ln(oCMH%-#-iJx;~ z%i78!Z5G$^^t4;yhX;XY&YoozENgLd7XJTG`S^z7<9SOWZ$A}Tuqb!&$&P{$bGwBC z8k1k0(y^YDV9KC{#Z>--Pv+@5;j2eM$?o7juVg>PawgR9YYq`KMHIrPr;KCKg_z`dV?1 zWSka03rLl+=oCE8X_mK(<@EGkv8?}dPB_h0J}u!nDdA|>Qj4N5JJkMdiH&kCI%H;W z!?{6%<>Q2qb+I0?!CkSO5})=*pRc{Ze*WCrSw@`BTIF}Y9KQVOMEz9u+geLjxQWDD zFLOAokv1i^%dqyqOPjK`H*TpMC84g3+}zu84*0r$NqJ`b{>HrY=#Xs_nXhDR6*z9V zK4xdp#QeCLmowQuJg@)vJYsK^Y2Ewpb^O0XZcb@P(p>!JLuuKPlRU{X=9bF(>t>gn znqyskId?lNN2O~57k5+H`$bN>erwKgJ+US|dsAPE_AiDsm%=7qX}x2cQoRdaJTN?S z?yTZ@qCG!?f$DCFrWabZai(C6netmRX{cbWWF8N3lqKAp>|z}pNA(QBjdz6rZ1bmn21!oy|pzV4RoFsXa4qR$qDDD z&G8Bi$!d%)W0d+B;^ez{+04$zpN!)!ah_uC)0>ljEQaIPszso5-7{7Dc)^DYhFhYF zAJ|+Lj(PHZ{q^jKokgJAt3Z1%MOIo`hG&R#=jv&Gyh z{vsG5kTKoE`DMiB^;{A@PfOVBWY(?Ip4(cMuJ@bemDR&-rwoN>G4mejJoM$tnj6Lo zw%1K&vWn~2$RFJuD)Pf`#iGeh+)1Y&Yi-f{>9JyITdDWwlMEsUe#%@pH_0Qv%IJ5_ zzpwHCMR%9Iby^QPQt!zV6*V=rf*&6ed;0p4^78t&e#<(1NuVfz)2Mq(tL)pGSEtI& zJSwu#MEqU4nVH`6M$U_>tNDe)*2Xo023Zfc`!Beg)y*KX*7rzZQ|Rhr1)rX<$ld(R z@=2$7`F4rtlkV~d{LpxlD80cY+I4?f1d5~H=ApnHOg z&)ZgfT^-*mzUKjJ_v-^npa8fU9^b3#JuTsAmuSU{h3yfyk2)-$Y;2s~Q1IlSML~^6 zl)b}4<_l>XCdN#9&CMcysitnX{*ABcrpy+{9%M47bpGBGs%>a%+g-N$t@~5aMGL~b z1M*ceOp;@&ezHy#ezRC+s>;gcqS0p^=Uh-`4&4)0dp2%<prY~ZeP@*ze^j@KT(a%&yH5$C4ZgFNI4EQjv^2ep=eh2((Uj>6^MJJ?6W^I*v*{8kb_FI`VYXv$!7gjLLV|!4` z87`u8!(xZninOTuukWkna=BK$yk97jn6RMnTFh;^7aGPtG+bxQ&VKx1q40@IJPs@c zA5JOW zHL=z_eV6{6iSg6B>$;vte7U{tX{}G~Ci&~}Tg}W_8*T3gBn(K55?;eFTT|YsanPuQ~7l2jvtS@FJ^7^$ueN*vGFfvyTdc3 z}OfcgLES7AAhGY`5ZIOFSd&YE|qn;u@CqeCM<|!NJBW zqME-iEn9JbU3O8IAJ_l6#Y|o^EYigpw%^J8DHp!wrTW{56UljRVuLs)#h>6hWRUhk zMYA9+D04$vPU{NuS>0FO^@t_JCF;%cIlJ@ZjKrYL2My9%|23*zGCBO@$Cmv)*RLKb zG#7iDx%!e_t7^L6)^nTA-1f^kYnz|vy|#SQp~W||&L(Dgr8EC~SH8d7UA|Ui`~AA# zN!6D5FD03G{QLEqkpVOzaliPyZOx-2oN7u-=7t@cvs+}xRGI6C_}GkYy9qtKO_N(f5$g&|Kf1wJZC!!E~9spCr0&xdw@p`5ic= z_j4Kd(^I;$W<;vC?%QWIsjA1By-)FU(25(mckQ&}g|ao@f8X+F?Ur4kKJ8i(!SkLk zynXmPbJ!1+89Pm{XFYG=V|rC$wd3u!+aKn>uSx&-H{Ru?B(uTO7Z(?MOkydV!*C>H zYnt)1nsd#w*@Mro*tUJM$yUF$tAhAePHoVwmWZ%9zGz;2V@;-`!>yMOPCQJ$v7^v- z+4AQXHcm2YKQ(3hGo9~mcBkEZJ#X*5)(6g>{)^^b3Q|0kyQ7%VrJ1qB`*elq?PsfM zc$Z8`sED26_HcK>PX-npuMdTP&3P1BTv^lgRkXd@`!tqbc(YpBPXu!RwB*|kZkeU2 zi|s=`OHS=srSR@kRaomZ*0-w_1U~6B&-H!yqh!5?we-x-e%CUe*M5~^V`HoM`s%8q z*3WxW<{33y-}B5Av?Tb-6_H04O-fGIb5GCQ`PR`*ENP?Ha{;5%mz_*QHe}9m5kB+b z+rfeZA%`}z+g~a@rtI@k< zcFS|E6(U)-GOvnm=zE{}SA1^f^PtJU-&)-hSCgLU|7zCLgL9@l_kTEHns4qz;S1AW zr1l=Yx<2XVywt?kLSH`KcA0fyQdCcst>fyehYr@N8yFi0>-?PMqI}GZ^LY5vJIdKw zl_LJ1ZG_EEvWUK1y#KO^>p54K_SAb1gOol8%DzRXC;ZTaPcckal9t&IvTyH+=U z>2jV2f8W>J@B497{}Jd+>$LRriD^B;>i)~;q+h<55!m`AW$(W;QD4;rlBB&}NWQL1 zR;X|^65vpE)@^ku+?r3~cO|=D6B( zZxEkkzCEzuQ61~`%P)^f{5xm0?w4|yevDpA*z#WCfc zmc~2jd;3c|%vuII)vfK}!$i&E56fM``tnW-oRjrqCyWiAzN}4M}{Ka0c z(01CTeO6CGZRPV#(Nog4Z@X;bzI<+SS{dKkozuR36E4XrXcl%kxQ}JCk4Ax8hWx2H ze?3y0zU`ZN=U>+srqYB=Lk>?F=ZTjjJ2}n1RUV{%#bn#h$KZo9BP zEI)g9dCy<1#qU&p{x(oed|$;a+VI_maY56Bnp2v(dqqyHZqa?aKYAAXG)9+I9Q&W1 zGJCuK$+cIx73esN`*e1UCPS$NHt2JVN)tibHKR9@2s&0|lcI5RtZ@)FUr-QUM zPhyUolRD$@^$sq3A-V`ijQa^O4(r)Uq6Tg1{p7`9-*f{RTA@N7z^&iE> z85bU%J}-?WDa}NR*JQSDny)Lvfyh~Yg{t!>YfUR;%i_G5wSB@<%S9I3toN>YB_iOc z`COXGQ%L38gjXBaoR5pW$me~0rrflkSvOW#3{a)YM{=|LX z^}0Xb0%EjnUvE|ZrMR#8i>1)9==Z6wHlCSbTkN~aOonTr*K!{A7U>MTn7TMo&GVmi z+;?BzR3YTWD)iRUimCk4xhcoC&$(>ky8Lotu~mV-_xW%}(2)Z@Jv|CtN*b5WmS6fN znO4%Fq3Il66xJNVwKj~qa+;!NQtbohc|T8EEc~T1C;nckLvhN^O9`Pt^{+R4`zdkU z|KL-{dt!wT-L`!8Z9S!a3lR{kHS zV?Hk8cNRa0&2#D$$=b>iIc?$HtjHgd`zKxBzraAlck?+F2EWTZ%*=m5#qjz6f6gzy zzI3@1gW$v3_to;BY}}VmR`UGvW^2@2V+N~-22YExc?P@O*cx4Y;*!kQsGR@IxjS_x51^X}HY z{moJH<7aVd>#jcz-t~tWqSj73TqwNuhG;Mc!>!`tx4{eouAJ9jm&!><91!34f%VI- zFH;!*{JsC*Hty@H@WRCxHO#^_*$xB;Z(crAFy+u1i9L!6N=xSQ6tA^(DQvOu>^eCy zE9HTYpmCy;ld5xJuC$VaL8nN~5$h9Mogc|=+P}`eh0Es4{;qEqc?H)@(=v=O@-=6& zma1Rev?2QBziE#@Td6K7*y-Q&fTek2)Owj+JCAHC6k6l4@3gPifjKe@PaKgHlWY3) z_Mq0HyF#azZ_w4;`*-q8ug?)T?Jxcp@)VvF)uhp9V1C`{mgnka8?qDK(zCLjO?hX& z_-sbO<{0w@1Jio@%ap0 z-Ywlz487Ga2Vd@3#L=6!_C=QI#tNPrkES?qUH3e}xn(-bt|?L5JHqphRrgnxvp(AO z{!y$;Y}^a0pjZ2|EhQWrD#I=v*d2bYDP?u4?a9@z4aF92ZI$Y|(Ie~?m&xpHdurCR zqLtw`*(dj`VX3@y|MDV^2|TiO;d^!#URInwm3fblzS-liRuTzGdjp+CG=2R2#cx-J z9<2$x$Z()%XYz5sISdCZh5dbe5>irH{=dEdk2iXI-q+`ke(Ts?WvKhTyG8EdPVn3EB`O*1 z22+mST)EP-{KAUmGkrkI(gE-&|ZQBmD8@=!SMGqC5`y1pIR;wncxLQBlI!Q`<_HhEwX@%VmRn>Q!IYW)tYH_~F)CyTApCM@Xc}37`XBkG81x%L%9!yLKnzw;t zt61j$>R=Hrv7dJG`+Yheah%-Y5ZfM{4YhF*j-RTx3T8{#ad}nf>WY+TyXB-+4g1vV>{H%PzY*HHfwx=#H0$NfK9f%+i+4ASFaQ;=Fpy9wEob^>o>a0{++H(V2 z)71XD@5h51{~SHKm{E^cNWsb&pC(WDTbNlVLJHkDQn?F3`zxRQaQ^hr-+{&W#mk3+C{(%Dy z@@eU5jHeQWorPZd9GDbcJz1H*Ug1Qqor~LMwU1Rh(|x=?FJe1=b-PlvkD*d>_3Wh{ ziw&nN+Y#i=aV6)yHs_%x^R`ur!YgFbtK$ zoGafayxecD(0Y~kiG;y7tHQFHE_$q`DX z)h}|b7Vh~F*eRGgeS((DG#j~4^NdHLHUhV{Jm}+{`BBno`GVYsYnL*a+?9_f` z*9u3@<_X<9V&|O7KKyp}_pc&%w>704G_svpq`c)f&mRl+PLIZE0-7H66W(`xdAMqe zAph*B2^upLf7)&8aa$~-=$FL9$FJ}<1$54Un2^`OnR4 z7JU^@PklDDvFTarJw54g8}EzMmp^Yd96o&b$7B0{$!p^F&U$Q-cJ6>+!|`wLYIV;4 z3^9m)niS%;bipEy$LZ%1YHFCyrpY!tGb@C}hMagHd?U?iU9?ld2?c>e#n(7Z16Jhk z+kSuV>F=x^8(H2~yx;V=&6#JVp10}s()CYfZ0dNrcXLkJjBQR|qh@*R(~@2BXxZkl zMV7KVQ=~Yi-v4@j<>3zxWM|m3Ju7N+p5OXH-phdRS86@mDLc!U54}9jD-`p7z4a(j z6JTTebus5k;jb^5bL>jJ*pF!LWLLOi^=H!anzZ}>n5%_Z`xejGtdp+v=;g~yo5zyp z4?LY7e=oS|ZKcYC?fbs!f+q7Vik@&xQhBJ+wR4)rz1`m@2EV+Ve{=GY-p{+;CW%(< z^xL|0!4#+6Qy*VA*c@SG)HG4mdB&U>ZqrUqX!_s~u)oFf>6>feA9<$#6IyUYar(n| zyEoJ(E1uczdzo!Zq2{J5b8|C3ta1?CIeTiP8T0@44;rWEHZ*R1uu5Dg=FQ#@o5Oyl zbIfWhYPw!_RbXvr0)OPgF1`u|Mu%OwGylc*oLbLaaq*U;JJZZ{Uq#jQbHcSPj-_ee zy0EKe;;u`nYFe4@+unYvaVcz?cro!wWZ&U-e#Ns!SF$`ON~jbpvg)YZ`@STqTCOtZ zd8Y;2cI(KxdzIRsE?x}$_r3mqxr%4g-{0RCPha|6>cBGJ*&pUSw`sq=Ch~Bgh@r^S zok2gp&E@w$bH>j$;n8KCkD?Fvhi%qXX;f+o5?o|)tn=~lf?sDOO=k1*@bfn<&{{H6 z|Eu@BcuPhnCo9Gt!!DQxWvSX^M=WZ3e!v0?3%jF=a>3KN)pkL9m63TR*PD7bCzRq-{O9&C|g&+h26 znB#1qxAJbq2eGQo%X%CMtq&hMe)(=%`0I=09E&;`ucLmy+P~E&7-eQDoH^rT`{h7$ zwVHD1`NbA##m^4B-G2Yv`ue}Gt9{q)z0MH#eb;qHhO+nf&hp!QVAvj|%ck+ZWP+@1 zS<>qhCpMkbIJBUV>E=T5bJ}GrtEbpWt+||)_)K#*wd&#KrYG&?9mgz@aEc)gwDL%R= z-Q$d-?EP!ydea zF?bmXDu^&FyJ&O#$;rv;@7O0i^LpB4nZGq^PtjAaxV=@T^C}*3e%bXUhWWpy91Y@DNUit~hg&4+_?GjCO{shP6n$+2I%H>EkSh#s}5`(x23W7!lHboj*$ zAq~;n>9#8c3c^;^d3#oGm^As1`kA8nle>a$b(SsJ!oMc5zk-=F_xAEUp=CO?I&;=s z;eNQ__LrP@4`e^QIw&2!;$TZu+m@GS9s9QReL8Ni{+dt^f0AEKr_NTZc<+S?c3cA7 z7MwaC?ya=BQF(sSsvTk(Qcm81TE|}8;CQuFs!ztQ>+$h^yKO4_qFZZX_;pt zRjIr3Y4cf?`Uea1=g*lX^`Ff-sAV>@KW_+25ZA;@krkh1ZtVVE=;P;;RIx(dS=qT& zlfh7O>a0*t(d|OFy-e;qCJU}ua>%p1f6cCOdc;4o|3%CKzv=A0qSu#7surH@ zxw}=i+0~4c`i4Pfl{CyvH?(J_Z&UhZ5BC-C{^F>MPBw9L8eq3MsH~PNa zyd#C{M4oz1`p_k+UGekNQw60xUzX~}n#k&H`!a_yrt0O=AD^c0?*XkheDHeR?mp>W zw&R|2wo3kdB66#G{*CJJX&*mcI^x+GuF!OmX_1DL$k7?IW*vLnZ{MeL)?ix>=d9Yl z4BFi$ZLj92J@hV#_5aDDtg=x2X6ox7LR>9L^}9Fd+ww9!s{Hh-RcMLV?hl=Q0>Vy9 zzHhkj?fT~XPpv%9z~kYI?j3q+Sg=gY1yjbXL4@U3Xd|WFPoiy zrDxWCndmO}vuM_$;Ppo%*M^;MYj6Mg>9qcH&_32b`@Zj8|6H5lz~loAdHesC$yk+e z{Qma#@GR5pii8A(^P6DmV-#PTEUYOiEnOi zm!B9Ev9CyEYZddcB?UGL6V@=Te5$RwccwI-A@>!IDWdUzL*$yA?r|@-G?15h+@P@F z0?&s6mzae`wapv2{+ZqkS`k*g%3daMQIp3ijxCpR1Y@W8Y->uejeBM*ouR(z{5=&f zH%YHwTx|;TM7PK`-Lwssn;O3PUPjW*uD~N&hyK<6F8FalafQcwrYqa_e@eKvR<-TW zn>S}{%kS4-pO?1gQ_CV9zejua@3&unHOt1vrl+y7ao${31@H5c3=Dg|ZC!u#*4FHg zci-2ECnqP{7#K`wUZk@~#d^d4BVYFY{cSh@sRX+Q2Qy!&M=sY2C+3bt5@%YD%UAQb z^T|6djywKos`o?{)4g$NrVN?O5AIi+xW-E;qEmGX%VUGdK?jA}vKL)RQN5TTr&JXC zS;fzD5gUu%dvD!SD`iue#8~p4IX4>lf`V{H~VUa0tU z>h?eBjNwi4isvgHb=LORKl`ZO=cihzdwQ{j_alqYC@MRhd}7Cmm+@Z(p7@5?UbXc615I3f1b z`2bhlOr}OjK?A+cIjWplzvWi!{%p9w;h3{s_@r4uNmfl-#*?y^g)9}Eq9bdW7rF6^ z%+v%42K9iSM|C-VcUwHYXfO_jIdCiA^ z`3npmFz~d#ocVJ7|JUO0_m~HrNZ)L8*5dpO%lM5+tncsaygd7L+;sI;#yfSt-&WlF zJg+@_-Ojf8|Gq3wuBfnBe|3`0X$#jl|L=B%6-DQjtL9_^cZyYST$%`e}-CmyZz4qR`Z`=sabv($}Gsy{eSwRcEMEh`H32ozOFU9m3A zGk&FKhhz1m-7YET&If*aG1(<~<*u&#jcH0(Glg89SpNvwX}_YO@x#iHLmCMNPFoB9 z&SQ5wwU7DgdyUO^xY`)Ig@xuV{nhs7ZAFVGgO=GZlMP8%CD?xbE_n4s^UaNoyq7O; z?szQqNJCHQ|DuGxghZK1@zb6j|8Dc?!*RLW)dfu+OTAX+R8&~({&0x9^6RUsf4ai= zG~NHc@4Ia#k3!WZsl4sCEB<^uZfI!OSo`~1;PT6k>-^XB%<46Ip+@>-Nr%mn9@5j$F7PAa&Nt>aCBu(!|MHYWtSVyJe+VC|w<~ zVyWE4&ih^~j}eg$A?V3 zBEs>@T{L&{Cid8hOZQhl|Fu+U>38Oq+?)3|eBHaPm;dlR?Zd~ct{tiruHE`fdE!|m zotfLX<~K_)3v%$xKdE8z``5;#t3h8(r7bESsg%9B(YJDC=8>&dlPs>ist;MRA((3- zm*kR926Gn{r2V;~{_ml@-G~4A?@u?s)jDTgAOAh_-M4SC9{xg;96b6q95HKX_Q+u| zD-?ROF?CLAQqRH#k2ap({8w;y+N7e&v{jR49T66{aP7%8DC3C`Q!DFeRFK)M<>Zv% z=yclo_2t{sch6b+d$#?#qThFZtIXllXf58q>ifH$&*xoUzT3b4_WR$vezVULzv6LY zUTSom-gNF}g#hpAdPn!w{(i7aZ{6;9yUM3C?D%}n+R)y#J^7HU2XDqnfIIdsg$TSGQ6$XT98;_I>8wd3W61s-;DEr22wbr|9sUW>MmPJNNAi z=@)Ifx^t{5xqg3t>%23jG1YoQj&<6<8-LUj8yY%`4A$<;cvBg-A^rB|^M7vMyB;UM zRrhxDgnf@K9R2XZODd-3W?g<*n(odv}Ml(D&!n)I?g^dwIpF~Y97-o$!3?E z^NpE0CnWyT**77A+cWMDlU~1~!?|bgREs%YtdR~gS@uM7?v$N*iAH~)Z4R8qzxlJw z=AZpr9KzG;<3DVFCUR`Yd#Uq+vrL*SLwMdSxo76AC25~F!~U=BKUK4z*1KhsB*w-c6vb^x1TyLn~a4{E_@(zp}ph^m3C^$NS~~Uc2mXUwdSm>w{LS6Ho76 zD2)x(5wpA*zHsqk=JzUll_eaUl9Q7Y(rO-Z#~--0HT&j9*{5OxyZU%yPjfACJ$V1$ z4|e}^XZ-$mEM|4ttiR*pb79X2gFc=kY14D9Ihg*O(<0@4Kx3e3blQe}6`^MXmCw zTq(@zE6ewt{J|7->&1&V2S652?V2%r=HYvLs|!CIaBNxFl)GC{F4eQ6;@EtT*a>fT zyE;#mXqh>4Er9?G{IqIgv-jc4Ce0}W-bs}ZvAPAvIaAsQgO`uU3pC2&pM3GG%qnz zYjFAcYvy;3#98avG(2xUwkkGTVI92Kq@m%ZnwEi{H~SLB6GHQ^XQXqnNTn!USJ9aJ zboyIn;Q-?gf)Z|XG;_|Xsk{$Xc~Rb2OI>(zo|EJA2Vp(PS zero-VZ(ruWt;;>XB6oM(i9@HKf8O_c*TYSzr%U|(`TP6(lOG@J-SO>K_Q&J(e~!PG zsNeUP>A`XPe}?b&evcF3V%_uamt({?nb7AmOAb8AoS>rUzo&A?9rFwJw{BY(>=Y64 z74h13*XX`6Pj4pQwlA&jvhkm@B;@7YE9>N@r7jN8Sa2iEVc!e4oh-AA_7z@ZU&DW9 z%@e)C}FU;YI%aS>A=!foWv9wnAsA(Sqn(d|8%a|ONO-}2%XQ-L#GEuZ{ z*@3fduA9ZWJ_<>-_&7`Ve&3wHeA!4$XwBF4FReSd%}?jOGG09K<>l7MWtuFD=hQ3e zSmg2L%Bq%p-L`n|T9%}QtRf+HewhO&X1hQ9J@I6IbXnIo^^W@3-^VNe3(PDJe_!8d zaAkS??Y+P2?f*SKUiSR+p~)L;J#L44wf_D4H!C5*;eP%9zdkNI-fTL(A@Oiqd5?MH zX9Wg^gn|Nr>+$urRn^rQRkw~WH1|Keh~d&kmo10bFE=)`AD_m@f4;n=B;L(MZ)w-D zD_@>9tlED$B&K5J}yI#GK^L5y_JEf2MNmmST9f+~#L&omxh z#%8EmQ#N6#RLASma~b99jE^}j)CpefHt+Dw!*QJLOT-+U_otf1{oU8`-}RW(Njvl3 zwxW7_4!nPv=Vi!jvSqX8oEcnmtKw(X`tsJMeOvFL_GyEq-lN}>CuA;rr}S=rN1|@# z;Z3qnx+|yL>VEMe%h^4hv$cjVD$~c;@8O4q&K5N<1k%!rjn*`pUoM zc0bwYzj`14B~z*F^=qT6>Sv33bkw60vez!Qzm{+|z{^pScd6(Wu7y*Y!niI?dhzOw zOL@7u)$Uyr&OcAQDaf{JYuhEMLJAcw`;j{T>%Vdogt!R$Ce{8F9 zQns?u(#aVIofgb{=-quJ%CN!f@RFRGMwJzn$)}Hf;tjT1#gzW>+U7g%lU{k$9xFFk z=M~$KA-V31ld@)z*Ua~wra|ksFT5+h!d)oNXPZ#IPtzimFY1eQcj=zCnRcI^P z`SWKn+@V}9qC59Ie`XE3_O;dgZpmalvF@5zS2X{eod4(K{wZ(k6s`1`7#RLN(*MVl zes0de-}WC~e>o$3`^ACc^{0}P+1Gg1pV9km6u$ZjS5);**Y01t^MAfQyZ!4ozCY^} z%3cfDEN9k|GM9=fKJ!D$D$PSy{|V=iwqDFQ2~Njb}eT;yoEwC=q0vMhFLk>t}N$>PnMXJ}6sWMP~!d1lSTw*F1Ogr503)ujCR zb?5~1Le^K(hW~%uc*!nz^V8k^b;T(qr;6UpIvX-|TI^;n*8SVd754mmHv8*xyRVvY z`)Vpv_RnQ!F!(HYFVlFV`O^XflJzWLR@_R*1(dp9lOi(bC$*_@dx4cMPP&u*L_ zZDMla^X>gxfAatO#a18AQP!)lPEh)quT-S5`}1T+0ZxXtFfJ=Gi8acJ2i9DEdtCW! z!ogCR8{2qqZ+fsJ@34Xgi}RdJ4IW{0v%hENTKoRXi+MG9MWna6KD*TPxjLL_dFpvz zT)*jFlU%v-|KyIg!u0|o-0MW%p5fzI74K7cvr4i1Xv7O+MaN|f7N;|eH*~o?Nb5E% zoDp*B=+jqUHu9LQ+45rVssP7K)}>AvO9g%~{!wUnU;V*GKJm})YgS43rtEy(5O?H* zk?#hfnNOCeIG&Dpzdq2yxxsYL#*dfzZFW7~ecz@sE9cTCm#IraH*XD9R)7EX3t!9h zxLtm=?~3O?{rXz}afZL|>ph$e)!wU%suZX%h#{G|N0b+S{Rs*sR#r-nd~+zvN`g~%uWs`1Czj4 zN-lZLJ^Pk-8cFSwU-Em$?8OGg{S3=Gqw61c8f4rHmTQQNS+q1*?Wvkvo(WG&&zUPJ znJbo@IijItwAEsf?n=}7m$^Jn2`HWFx#Bhd@2)Qfr{1lOKmGMTw~dz2l$iD9ZNF!) zZCdi?*SbC2C%S(u=~(Q<`FWYPnfmo3hZOI=o6B+GPJ^)PgZW#Mv=7?cpKxY!iW`@Z zo7%#i{LHh?)HOAD&G4$Xx&0^@3y9?yglg?k{d{YpXatEimT> z!=0+tt?hEZ(l=lIZ$3AiJ0XkfL+ygq++R*C4h`C@e=+;_wo9{*$8Y^6FS&KO+HzUh zGtWa#RN8YCH8ED@I%s9U;?Vqc!jBs= z>3^42YO*=c=9%icX7Snui(i)>o3!3IbIsSu$%;ub%DJKCzEWisQ{TGVB4X1f=es}T?bhi>@1NN(b29mD)Q0DbwzkjDvs&bf zF$g}~|IgfQCr`}-wuF7N(k*uiW&hT5cbK~?=;!eZNxqw(8l63FcypTT;^peg_W!<{ zU-#PF{?EqCr>DhMOwT>t_~LHbcTu1Ca-(AWUfgN5Z~n@RHHTNaVs$=6i{FLY*4KKbR$4l5Qfb1#Dr zOskAPTB;lBeo1#xG0L!KZg3D-5v=UaUt4=Rx!=anHg;xl&T_Su6+3?}x*j&^;3L<$ z4_V(8z1^}tSv2nG-@lb2Tn;N)cD#$;*R_4>x!DW}X>Y37R%ksqRJNdAs-iAZPF8%X zz&ouMpRQ<~30)Pija_%y$=Ts9PK%;=KYUos|M$r;={&2=X=kh7pLt$1ovHJfQb3a6 zk#!D2qDcY~E;|@ZBiK(S%@@3^en_GF)cn^wI4k`RPfl`Fow8GG4mhj>m@;HXYr)|_`g&ybKKWAxF=ToOW36*Z%mtW81`7q@bd&#s-n-iTE^Y1*j zM04}<{vCEVq#dCecd8?B2cq9;yC)c;P_ThV|*q+lu6$xn6d*xx=3!U-3ut!D4wBz(Vf40W|e(-MTVexyfp53`RaozQe=>nM()4s2iGwYJ@U&5qxl<`7C#A3PA&yO6j z;J#`)$?dM?$(%W?!l(Nx<^>#=-o(V@ptEz*rpdV*#Dv5mFPmRlQaGE%RJ8kw-3tCR zH>NpeR$*TkFL_hay>4@(SZ}S;E2hQ!-uz(t_%EX4+WH)Wr9Bto4=tHxq1%6%_hQdH zv&B+VzOFvIm0zmSCRjp8Lr2J1$4};S&Ho1*liTRMs(zP1%shd#xa zKi~P*b^r4G!W)JgV%F|Yu`Mr;J9U}yK$#An4`!;cs-OBjsKT3IPlWdmjZ8>*M{_I!J{*xbyC# zr2hY|zxDCbw7I*>dNxd(wf1yV*-h8RJBE{JPH=9?R;{8Gp`(fuZ8bL=KiS&mG;}8cL5IF8P>x*CHxW=e@-7 zM&(c|TXVmIcapa}KjFBs{(jG#`C;Gw+}X1eLa$BB1uKPHb&l!D@ZxZR@#N9$#+x+PmB6?(|)fo-(s%&71tP#F=3Z z^X1jkr!vLmf4y{~WBLB6N{Y(I6)cZF-{b4i6z2AOcEf45?@SR2`3a6Z8y5QWba&6X zJ^N++WJhT^CtrVK-?}U-aarl_DKqx-{nK3fJS{!_-^T~izvb(H&YySR*f>_x+D}oy z>550!EZ-+j@9c>$;C2juAFw0qZPwS<;jwFX-=1Fl{9)*xwEWKRH7pgujK{w-F?%=M zUC%7Phx5jUhtne%RCom27Bsgr)IYELv_@#fZu!f{`wo@!Up}(LP4mCiTl?CEzWMV+ zjFT76k(oPLH2>DTxoa)8Lj1M{l`4k#aTOijkX2q&pA~^p>43XU|+ao#zYNXS-VK((<;+Z(F2gi<`NF z#T{mswk_QFdb_Jb?3dn|;u8v2UY>LBa>h=VnY}Cln zziMBaew;VytX|8-=`-uHk1=mL?_H-Zut;`A=nA#x&(h3VZ{Oojzt`5(*&bf_qwdhY z@WzSD8(+U?Q{y^t@$iAK*Z)fkFxdZKT(Ov0Bf=q9D8#CgEwPU2>KwJK?;nmy+aIkt zDYif<%}-7^SUK3lu=N!6@bfDN|bM)G)Ywpe4c4^jCab0P- zeNS$kJGV|-_IRWYi|FeUlV0{Oo4V@yc@ego5(&#zi?N+Kx5!rbwZgtG9>xnL{n49^ZArg5?fSKO+-qXaAR7F58$XmA7c`xvXuolr1l2eJpG$Ji7aO+B);C){;^}U(Gl+ z^Jeb2l5pvVoKd>{tXuZMWtY~qy-J_;iJR|%NRM}xm+#x`sI6*(6EcNoySje9yz=2; zhEJ2q`O~h&ghrjemUZvMn>%mzZQS^{x?iU9ac}Z*f4{2GrU7N)ueDoSlhS9n?=HF}d-uNe8J+Amtc!hCwcY%t{UEBcNs^;>`aU z(s%OY*U2otd9iE@Z-YzZ;n^QwoH;XP%^Ckr<@~>l;XLJx3^U<5s__r&~QR&0_%pU zoNLlc7Ihk#KfRXXTXERu?1{D;Yy8iCS+jI+L+kw&OJ_gaQWd)?^H`>0%z3K?ZP~`R zI~PxEJ@ZXx%DbFhdXY9QLf@UFzglny_PEcO<~>RO!iuHmi_FigINfw+{wYzunU*X9 zo1R6j_>v>Q@_63+-f5?wPTp+%__*I(yULt5XMTLSapcGvHYZOfPDSS?4w>6rOLBj^ zC>69m^}fw}yZTnsx^?dgHtdcq-@>oCDMI}7nN6}WveK;IwcowpA#rzd_y+|}o#?Gx z?z=wy(LQW;>zDI~cYZR=8|p=N6b1{){!`t;P*t_){6fYDyxbL$OqW$p*8Mc_y?!fT zwO+FQ4d=S20?!Va>6Ja#e9(O7<&%@!rWyY#u2M@cKEPUgOls;@%W(D;FIR1F?pXEq z_bDZzZSPt4O*vH7vaQ)*gWB?}tshUCFaP#V-qPua{*##FneR13xqdE+))48EeY^Br z&AtooEPj@q-qbzqsmRhPmZvv;a+;vsQouUVwJAqwlGB9AFNzdTWJ(k_b-dAWPIq;! zEn56=?(BaxVMzyi{8D5mzL`AP^3zMEMaTZ0y->Htk@v$U&qXsCOAJ^J&N!M8moZJ& zc%hoYxlJZoGgempm1#7&wB^mO$Hsa>#t)QN>bd^lG-hfLHQtgYYv8;wE#A02N?V_& z)Hn0(N`o~mS}R!Ua?gEVT|Ct*wJfbHFKb`Sx{%XTZ+&^=le+KCZJ_nh~aj#k9aPkJbbq^|+R)HT7uT?Id+IDrNIK{;t5qOMAd^j7 zDM%ooNx10D)4L`4EA(26~nRyB~E3F?c4LIuL#1!RPX?0R3>GE9D z%WqAYjX1BTu1ykS3b2}{{59Kx_2}dGJscnXPo=XR6$~=dsc@2!4A8PY?!*w(aL6Fn z__!d8*O^yK);=h?6uZfci?j1cu*aqim;bC#@jn@Hota@lsfe_pt)bf${wQXF!UlD* zL!R?hue(fYQP2>I4r<_JnkKSlrm4%GRn2@7E>W5p-W%AwWm~*%UkXYT(9&#anlej7 z(=m!uOzVBbt;wpqiLYy__4T95IQe4?&dj#|XSnanrSFgKRljeXrZ|I@NtdDQk>dr< zl`%V#q`J5pxEC-*2t{1tXPI|W`ME#Wob<}i`iot-Wo;@1R)?)UG=2Xk`@)Z|;(`+o zUH|v#f6!8y3$u^+cPenWY>g4KbPwA3ic_&A#EbK|&>*4(8A&&%*m;-w)1etjwrqbq7$zvD9+s4mlSbvO>7gFBNNvIqo{m^G@&%swYp5r zi#d&W6m>3H_4G131{rWGp8PIyAR+PS<#`-BEXTV!jh8Px>>*y1rQ5KWOMUNA1xJ~+ zdZz=YC8^wJnIX!_*|)EFj=h3MfQVh{GzE=iHx~BKm~Q#$s^i653=9rud{kJLS1@sI z2op@^N_x>TSJ8!KXOn6sUnGa)$n9&=rFt*D`K zWI~WrfP_ZTni)4e1vr)Lc^*zu>B!h%6g=mPw6<}#K%11zXYS2y6U0nrbVvq81f1%& zwCd7Q&ziC@(bM55_f#SG?r9Dl6Xt4^olKNyN}3%TaHP9V;Lx;>drB52a&|hn?(2Av z@sV$lhM~uiS0)!Gekjag^mgNU)}Cl0t$**%;(g*CQ|_){ydikl*f4m3$O)khEQ?sf zI5(&$eh?L5=@4<*6S-QIQS{X>kvN4}d}q&0V`=qr?5g<3#2h6&~dR^n0wo-?#ILS%!&$$+uL$42L}hMv@AGz z(o;%0c*^=o#Bp%070Eg6wt`6@ za-tgVqO$=?#@E`!+gAF%w=iqbeV{FR^O4sfe#WJXXIM?TTFN5O!nI9wZS!#n zOh5$sFs05-v&n~r%YBQhm9RA(-azXGuWC8 z8kQ?{9~LXyqa*Ij&ZWZ9D7GPmPmwuFyJ8-{BI}`m#*?iAO#8SJCZ?Xtp`2tt9r_A%SVHH(i_MEV?K}t8imP%I$4C zqt4gFQ2ULzi9XF*?n@h zT<1TpSihb>DqBik-ra8g@|3{dmoGCA?ceE|*l0t4onjA z(hON0x@G(J#Q|E4%5E+1e;3HGFAUOn^7%uJ{JiH2C!BX}w##D{JlHAje)9Qeg{}=E z{*@bK#bsDFbX;0`v4cZvUH4;)6Hkja=x~4j{CP#l>Vjg+jHL-T#fo;y*qm>EcH+>6 zTsw%)`lf_-F|7ocgWyLidO!fN&3f+zxi$V>({ReGrnEx z5?y`&-r1)APXp{}=y{2l?wJyx;fxUCEx>hurZM*Nto2`u}a! z{@{1GU++8#{~D_4a-V`g2kKui(0Uzp|>nTy+2VX7l-^kB^SN zc>DI~Oyl$un{>{cJ)3xPl4`}nR`Cs4SGAOsdiwhpN9Zity<2+Ud(a`&6M`0nXf2G< z3tlLot5fytj3mRwD>s8ywyazUTHW>dtoeNxiMA8ZKNrM`PxWFA@-i^qwQHAy3r7=! zOH0wto~X5K3@_fkZB2E}J`$=WYG9nTRce}EY}dz+g+0B!3sryb6V=s z)ZhF1w{0`?(7br%`Nd6=AD6ni%>XF9^_B5VUf`>s=wMuWm>=DP&js%f!ms+R(_TNrB_S zwQFtf-sMd>o$BN3TWB|b`MPy_+j6C|udQJeOuV?rwc^*y<&}rqctMBb_sLopoK&6O zF!STQ?|a(qf1dPDy1T1XL1|6IMyBxCQc=+EmLTtNWSy=GInjM}Y^sUavdsDjwUyE?2=&TU!fCoo4y>c+P(g(3=jr zJL1Xb$~QMQG7Ad}gOcKf+qb*>>;F6kol(0n`S^!h+3O#6X|FrLt-q(iTYs;Ju&{8) zS`E+z6wc1h9ESy_da<6Ku77-+KmH zoS3LAAuoR%6oxNfX0D0c%%<))=fJ0@r$6p}U(5gc+Sh(xBG7Cp;>rbwtT_*_52J4@ArOxv~KsiL%Q4VG-Yk=0!3)V_PkiP)Al8H;xDr= zTKhkH%{@u$=J`LmX0>@w*V)9t!`cJZ?NeDZcZtJm$)`pmObWZ%E9>&@3rym8~*=D&Nt z-O9Eoc;N8t&iy}U?>Ef+`1gJNf8EpGYoyYSeR_I&wwj0SrxVHvY2Zuf*2V4?(@~b! z?@ylh`_uIOJPbdcneXomkFOOqzh7fKLlSff+pDXq3s0&}e{d~2|LFU__ufAQ?e@EM z`*xt#)Pmn{w?FQ)es^H|{=d07H#e~g3k&afzwh^lOWyiR-~YdF^!HK}!}CS0HQPZq z*D^FLpI4<-{O@7AykGzKcXw}>++P*C8gxMH;;6NcE-ZA8*p$LKO+TKG0dzFqw*32j zr}g*CFc?@_btNC~d-$kZ|Jao)A{`vpuzT zEWZDJ-}i@yxb=_Je!n|?<@trq?E!kz#dE&*$y%S=dG*R^{rx?*)!!OA42+DL_-h_8 zGc-It-k<#Z++0urRQBcuqtc=3`@iq8p1!dmk-6;6jmCTT;&^y?Oul|y8N9sU&yPaT z**eGjWI<`++4tDpWr+m^0&m~G&8*#?f4?uQXDc{dfBdij-6Y0vK-k}AqFwU+eYL({ zJ%2r4|L@iMf2z*QTy?VoyQ8iw65G0hO3ZWSf9gTe~DWM4f D^1kZ= literal 0 HcmV?d00001 diff --git a/crates/zed/resources/windows/app-icon-nightly.ico b/crates/zed/resources/windows/app-icon-nightly.ico new file mode 100644 index 0000000000000000000000000000000000000000..7d5f53f2eec36306e1b423fa3cee0f0642501103 GIT binary patch literal 159619 zcmZQzU}Rur00Bk@1%|Wyj0|B63=9noAaMl-4Gu;IWdTM82L~wMiGjgef{8&v0m5G) zz`#%(#l#>W0O4n_Ffd4GGcj}q___0PNpUeSFz|YMxCDV@L70P$fq@~WXhj+W0|R4z zkzWYo`9xJyUc-#M8+uWbWpd`R?hDU)hp`kszlkNY! z_f?XeK0oKy$jkkSW;&pdoUoc}+bV&*?q6gr9QRE-^XhvVoAOk9rC-c>$^U-Ve0sj_ zUaC^lO065G8k3#A$Z5L%opkWJAfthTQiHGrL5KQ({aD<_5hpX70G{aURVrxaQH zZ&VsAjyXQHno;X|!B@FCKNeQWzyD!ge`5Kcljr{*n!jV~gMSwFJH-D#-G1-u`I+qe zkLF*|o%eq0%)4LZ?|t6>|CoLq!~M_e#2?DpxA1Um`nm6$_Wj!HuRk4mUjMIz`G>-u zxSy@>8K+OyY_x0)X0f>YU-PlOkFHC7hx*sL|80ID9N(ie%IoG=?|1!mJ>pMMuSNay z>O8jZyA8gq-&^!__ou(%|Mwr;zPx^I??b!!{{LTXjsN-XD(^$<`gbMFKNeSx{H}v%P36}8gSMQti=%YBJ6}v){ zA=3w)1EM!i74)zjVOVqdpNYA!SjveB&R()7t~|KHSJ%TD@hd0o*x~s}g>m-nLkViOuBFU|rYAx?66ft_GWb=@_;a^N%KC)n zxySV${&=Q$>!xAHns2vPFEw=7kf$WAE!3fNBILmnQRB|?qmu9Lc#1AQ@xE26AgU?w z@getlM|<<@eC?zef_=9ZeSUhMnIVUDiNgJENd=alabjmCvMe^3c*3AD$*ZyRjL;GN z35D~5H~3VvulS|eAfdTWaYEb9&E`i6Ht&_bm;7`d-@kt!^Z#FZ$@XEN-k+(;Spnz7 z3{Hp~==yqp$# zZjAfbj$P}x>lmq$`f-<_h2E*_J!a>UHvXTN7gE{m@${h4HaD)%pZ2xuzkc%f+v_cQ z|J}@XMflY}R(o*c)bGuvK@n5d7y7nd&^w@cw{piMSslCBf@6nfu+6b5__X0G+ai0Z z5Vn%z!LA{VH@)ZkidyJ?ecpetkdbZiJf8>8x&NAPTc6g$++JDF>&yDA;oze8?-`SR z#vC(IFyiE5+TTkj*tFT#Lga$StR;Hc8Z0I!i`Oi z-x5~*`TzL-$Kd7C2bwGPez<(!=*A3o?mv0b4fj?YU7Md!^iR0H{qd)K<{v5!3dz6g z&wpI^)cD{lXV;}6Tfa(KY}>S<^x(5!GkPW;oxVtfc^l(#)i5>oE7SLG%24j$IbpHn zM%Ka$4Tl%yTNX(NPx#33dRa%+smZxvVr8?przo(ZZPn1`ZcFOYqBXgI@M8YY^yShA{@2w0+rD3;)r>fD-!QoL1 zMxr@e`(E&WS;*b|JumD*q0;K*--XU_UJGM5xy*4HQ{&cK4vY@5#e5rYOV6qJeoVSo zy3x|>_8~?Y>$^NsD)lk@4(#CUiFWSd{#ne_A=4of^vc}Ys*_hB;f;hs_mlpFSH3Fs zCGM%k?%8Rt_BDCOt!8H4q^Wd#s<~$D>n|{n#29-SxRo_&Quu{G}YSIJf1SgILC!Q^y{?l3ikP z`D`LbJ+FU>?&OmhrWgLp&SXr~f^Sb-miNGI15B)9(B6 z?2`i1Ue3QOaz^l&pTMr$29n|(#tn?o^BuqJPFQwHYl7iYri8wyzog7HyETs9T%c=p z&{$)(l3xy!gsnla!z^e#kTF1!DIe6!l?9xpKo0{W<*?P7qB}iB^ZNBd1xr#6Odc8{P zUU>!Um$w%m{5(yY;}Ub%iHE1Q|Gy!B(=_ehi)nx6v$ltwiuzzHkU#D6 z^_*NCGp*TbKJA<{<#UGf@BUUthL0Z143M9hdL3H}~fL zi-}Cxc)9)ROC?sHt!!!iS(`WyG{i7Vbl;F|_G!H#m$5N`v*C*Dt4GQbx2NzrRn_j@ zU&xvK`rvP$qEG7mS7fKzOWP?_ehir`Xi-`4MIn6pKY6YwMz%ByPX(th#sys)@`C(a zU(V+3klc8ieR;!+e#c`c|7&N-@3LjwZS=^OZ=K}HDGh7#)Jl&3=w3XX)rjHb=QhVQ zlNEk$RartkvrnB@)V|F5H%3#ZY7H}6$}xkorm8AO|Bq}Z&!4&;Wqwu3!EB>Q`lVSf zGV|Vq*x560+#7kScIE+{#5YTho1J>r6m)T_?raVj>w;N_ukm^OjR-cIGc(B`=wqQ4 z!<+BI>})UIZ#GhGpPKbge`TJ`y&qfc>vu8!S?Kp~{;xN(A`*5RIcH=Q#r=O^Kk;%( z-6E5x|DH)N-_3!Jp^5e&EU3wa=biOl0DsZ{P66srv7OVz8>=iei*;t#jH7NFO)(qje-&5_Y zyBP13fBgR>{r$;|1;83}dvf!0yHK{w$JayeXwwW}v|Om4(whPiJb&xkob}FJQGOtZZjdxSVgqq6lPBkv82nDnzAo@saLrU9!`7d3 zH{aT%f91i2yI+H)x9e?wA@cRfny-n9H?o-LOxyH;O~+vqZ;tI$UL}7H5tfp#YC#ry z8uk7xQAc%Jo?LG1Y22u6c~xRTR?M&DhJ@LH+Q7>GRtkZTt56ZSazv?^&W<3#nR*DKdo-p=N;bF zar{9E&ttPE#yd+@>J`p67s)*NJ>#HVwbKNbEk(5_O@7&&D2~3~KjHiPHF-=9mleF8sb~(;ZI;*U?)V$iq;gnPI@v2?kmicekf~>R_T>YT-QOiFg zwDvf2K_H{$?VQHs<;wbt>-D%#Ud!%C>|1rSG5+4Z*P$g>*(|nsXiGb~b*??PH1mUj zp+hL+f-v`fbv5Rh50}?Jf3=z8?po{P{j77knRn@~pYvwj&508i=5g7!FRZUP>C2_r zp0oIJ(}M45S{7b&P9AB~X=t$a-Z`&AdA9QD+A}-{V~i$GJf(Z)*GiY4Mbk8$BGwq# zo<4KmZ;3xU^TqF1IVXj=Tm9US{M1HHk(A|>`s z!awbv)}0hNIP2r`q&a`(?zblU6)`>hnE$^snCC(3{68TR_dP4T)_LoH_naTT8w##Z zTu`f5wa{NNS-0_mmuG}n;3Oj>LpAHy3PMLB8*E?QW}3R9DW%=7E-a#D*{lOQCN|U^ zQ}|_R;o9;v_l~0Mwbtp6WDIqG&Cbi#O%-1D{2ZtF|07Bp^Q;_hR-4UF5Pc!OpQ-qm z2}5Mdw=hdh;}1KHOcleAE&XI8)pPB7;%c^y)?s0yPK=B* zn{^bdr`D&>UB{|^y(%@W?@(pJT!A%n_b$bz{tB7Zmk=jp6>aVtK&e?x*m z(5H?$C6lJHoMlxkZ8s=et7BwY+A#OHyx!WZuC?D57p>yFufQYL8+dNFP;QSa&*o3> zId~qsMJ#PvWb?!`y2ZxVVbbKz7013kl`VKAJb&8K6uAZO5~lTLRIts=GRWj&7UG&N zylcJLqA!0|YCjQS+-|e%`L@K@Zue~6mxvrFTxh|@mZHtHTx{8`3-5am?VHTJ!}(3w z#6=8iIlNUh0_|BJZeiMT>e<1Ly2h>Cyb_N7?>C(}^}ESPy>rz;V}ZsUEJ5uHnH%ny z+d8e{ZP>fu8`mnXh#UFqF6Bu`Shp4Oy%yJ76Bj*K=fi}@j7~kLMc|98mtJAT>tM<`QMXw7~+0(`rmCd;qO)JS@~bk;r~mo|7#xam@>26Wy89Q z`n_I1Rc2(#x=aY})rw^Z%)b!h$H}+hYu~v&;@ZjQjWM+zLW3Nes*_B@mDj}3QQ|0GFamue=+%Qev$|TeEbm%0bW}eS+}O8&TGyrL?0)X-} zEGbB4H9E^RZRU>2lkfI~ak@WAVRH1FrZivX3GeblbL;XM?uboW5WHdior}Pf)Fg)QWcsttGc|xV=YJ*J=CCnYaY~FXqy=nFNH9jI$B6B7&VOXS^u)6oq`RTnTi6?5doHa|@UC*v?a?`8CtmW4a zom!%-#~z}jwYD!q_mF_-yW0zE&Y%8z{=2hhP+ssd$EP9Z69RaXwT>8EX3b|ZJeD@a1(MU!RGtn=LSHx4~7H+vd@JiP8By`_z=m=IYgn zUJ`Tk7rEeZzkB8Ngx9&YifyY7+=vb>jAO`V7T_;9yX;(FX`?akKK|EiLMhD`^o`4y z%y(%tEK|CzsUtAm+=y$H1k;0Axj$#Rta`4_Fg2&(tJ$3wJzvf({j_cMtZKCzw-!du zPS~S4RVZ`i>_b8>$wvfI^?f)sbsdf=>Es{2;IT2_?e}1ZjQrOY)W#XlYk}_#QTSe2BZ86c*W7j$^=jr|>YU<1H+qmv*Jh9rC*QU+c_2t=D zi_gmjUHO>&X2KsKnf~hD$XU!XA}36vI9(VE&aRk0Wkd5?vnNq1^-KxVE@twy|2I_r zyR^D`#mD(QTn}33|9En@ev1!-obsaUy|UU@FVAlX;BcO$vswRX`g`{4@d?5H6S)f2 z&gV@Po_CvR(YzHcdC(9aVuAl#M{mc)}%bZLNCGyuke(?5oZGUE#&6hi( z65IP0zkdJl!P@N(Zf^BoOM12zKX*vkQ2&)t9`?R91|1#dp zmBRCdADgEMY&`R`bdiFt&r%=TYld-4m5(s^$@*+(ivqX&U^xAbk10?~ zEKpn%e$*N4a{k|Y!=bs&;MkWG)ntRaH;-hz=IP77<76KF;+dJ7>BbEH z{;i@02FE;h&e@~mY93T+cY^IJRf%bpI4R9; z4w-$d@4=-Ot9!B`UVs0lC)s?B-TzHJk*k1-&AW~J$5tc7)2Y`Ik{M2(G27;GH>TP^ zufgy9m&+FerpW%fc)rH#xMPvljjY&d5wD(XxyXJc?Df)`$2Szqj8pbyybn3dwWCmT zA$Q&Zr3Z#rMV7@~UO)MhU2Dhb`F{k0UL4VIS-S0LLKCNpaAm)O<<_7BPyOwiyXEV- zwrz`Y^l`Y#;eNfm@b}g2hP(ILOKhzy}=*XKL!^W1E6tG3v2{z&g_RBYSI zcI=dzV;M`+!H>PMcj{iMZfXDR5YrUYedX=qnLZyrsLwmRli!x_@ioW1VEbYbsl1GX z9-qoX4quVJwbxM3=KGcnpYCiq9w@QvMa1ek%QUJds@t99ezrigedFbOcTyVkCuUA5 z^YyrR*v$G;*pjdY`@Q+w))l^+>HjiuO_#@RzN9wY`Nx%8XZ~{KFmrTU`j9!nYQK9C zm&mk2)8^!My}M5yrlf?v{`61m>9fDuf9K1WSeAdW|9@1LZQ@cVFROXUqO&+SHGZ~E z`{(Jdx9XQyqU%*P{zQi^S%+el`j``z$F3!$E#3cZJx^3&S5TI;;$#t#odG;d9g)YI zJO#3*37-!ME|~GXrfGx7zWvgfH#NDNXNcM)-^k)V`-?+-{_d7lV$0=c+Fhymy?uXQ z_Ws{WV%6=d*2FSxY&K*`etN}Jg@3Zb)4-1#Se$M1^0ovUZedY8*n3W_<)~@;maQCC z;rtt}N@-LIxZjlNX;oymzNN|i<-y$S9p9ebKel#yoVe>edxqnDlZ~S-{-2q=VtM)j zL&cxTkuG-?J9_YnDb`fXLL|Kq3^+q88atE8GOpLam``K5cjCu0S8oo-54 zC~ez)s#>DCr}ceVBG>Z7d(2ZBPA!=GgM%l}X1U+$&YcsEJ_^z}d5kyXT;Kr*S=Z-= zIgbvt{aIgCdR2?-!zulmcm0K|1(#B-ejew1_C7`QhV150-Sx&74~I++3Yxspp{HRj z_m9h~53M?6qMYp5X0U&&*Jl2=j{XHFAKzRfzuojiugizYDOX&7*?rQtzQuOR_xMdHuNh)rTY5+Sp{oViVB&CC^PF>BaX2eyCZw%+ma>-7iXn~hrCJ{ep)WT~BM z>9OVCwo`v*$jvw(>a&?QJU>g)I`HcJKQ%?XV%6;)ib~tIb3ZoNwp-!#uWcs@_ON?f;^E+%Ti0`Ea#16Ps+LbTQh97mTTB)BkPOn{TV*rH+#_D_Wb1j z-kEoPe^QSBvC^M2Y44>;QzP|Gzq}`+7E#tXvHRMKm2&Sl{GD{EI^dh;t}`+ZXO(K+ zz4}UXso(LUy`3Ga%>@2DG>`cwRMi+$=ScfWqa={wJlRmoDV1rJhj7@)kt}XiGJGZ@-;%| zLels*P2HtF^IxRt)Hq|yx77uO2_3T>-NTHhPc^mBDdw41CC_m1`*Nm)U8i64AJqK! zoGD6D@pj4P#(#6Ri07Pk_O)7MoVUhY^I*thQM+2RZ5(d{UpjMVEdE@n5o=cQl~F<6 z+I;hzPg=@njY5KsMEhNqT6R-rijddm(A-@%Dq9ylkbGd;^rZTyPISLb3%7i=5c~Ce z!rg0E@C%&m^h!D4(vW?iPVLLRGar(_xZgZ5v+Rcgv)cytxV`L59jCUqtlM3uAJ!Du zwYNXM%;eI?$b18@)XxT2L$sFp91or7_sxc-{MACM;H{6_szg~z+!?3aeU@>1{o12W zK1Kc0cM~DDbhVJVHp{mheQD0QxZ(`cu`8Q61K-~{?P=z(#h3c)>w}_GlPA?%@S07i zsoiWdYcg@BDkF zED=9*!pt~kbKinx3P%K=xEWlPD6D(US0uDtC8Kf~r@Otvlo|VYHJC(x-V$lOocF3Q z@ZZuIu{occmhZkVmMl8wwLP=ta(nw}uT5Nbd3$Dk{qmYGj6+kYPI8OR&6yPrZo3XE z*(`peDRx^&FHx9w$D2>2r!d3WN|xX{#1hppDV`OCJlC$U#n@z-Iwv---eBFEHj zeq3PMp+0Y6j?sa?64QBtvJU2SXw03{-MIMp<@=v+*V`C0DBaYU8uRNp(-syL216Yc z4W){$Oq1`O?LE)^qn)M2?`DzC-}OvkZvNZ$Y(8~n?&(8Qv=ovaPihF1T){c_Qsm-U zZYA6;Kl3DA44nVGm>KAM{@@ki(oZi>@!Z+L=FqbCy4U|Zvx{6}e!NJoc=1zxschp4 zS#$YHiEUD+o7c;gxQP1fy=eZ04ruOPyih_~Cf;dMT7fR zTsH(Z#xSHD~L=h7Ue zte?8v6HDeS-{Q+=CU=iD0DYhqkZZQ1>w@f95=;dq1YeyL540?O;>>)FOJq z!~5SGeFcZrJNUo4>7=!~ObKlax)z=wVagObi`j6Qb#!V{g3sQlY0te@E38}job85Y zg4@yhNtOy*t6!-bK4?!dTakNUNl4zowg2V{?3%h{g?&xbCHaTE52Wq?b4v*n9a z?|;{s!p9dZ-x;|xVxz52-zL{br!=NSNM6?W&YtMBdec3bX%hu*?+s!UssH>FBz5Rmh*~B?hzcDs< zHmr3tNT^p?WfpvrSw`&Xk+i;`O~?H-Hcbe!n{aO`lhJkXrgsu z=h|zDIjxUhZ@(yaerl@3!G*3|oSJH}&Re){efm%+XLIT3HlOwElV|NaCj2V+)QQz` zrwulA%Rk_iES6kw^9<)nd9hLz57C)YZB2~)4)gAwk@NXvDb&28(fG?^^=J1P7}x*3 z^!-m^2IDWzh6de_zq?yX%Dm*#S#FI~bwk*3*Yy+vQ}Cv zZ==&O&4$S<9mFbLZ{MeQKI-Ce6YZs1y!LCR9avM875<#Nh_(^H<^Yrb&9^X8n$w>OGYJ+AJ` z+4S>mYG|58)5gp1n>VUoTJY~HbHx7_ISkF4dJlHg{gjV1*Hjg3PMn?jvf5>qrNdWC z(VM!?vGtx+`FaZi*KbJDy_)h&$Lf!WHRpQ|ZwZ&bawZ#2IlWw;9C1gwBh=wUXm)~8 zYmZTsd}7fvoqIp7u7AbbGf8R6>9lFVt}Bl6_83lDv6z41gsC-*A0ixW3Jv5|ue+bU z^`Od^5&#}iFY$xdrxSd5IJB`@W$oJVu`M`+qgIB zUS;GAZ1-PueU032&lM-47IH4k;z?V)t8wQ8VV4b8BRXO;HB-$+cTFn#G5y6e?mb_n z_jk`dF5fCWpE)^$Y0-713Q_l^2R(LZiB4E)e(JaH#@FjLC+={0zLI0Xk$GYNcgvor zS)3!MWih#HlcdX@iKmYDv(KI~>41ge*6KxtoX49(R?m5LrSb8f_g^B~PhFD#z~;ce zkJTb^<&n45*HQS#NWclcT8lfOEDA(`xXB3yq1f-c#!*y z#u(-z-k|cD@Go<_tqs_^_8ydQS3UCg{2Bh$IyL6^1f5PFa65G6bywQ#OX9Ptcu$^Z z`xLdSeA4;Yyy*PGtzCWTPg_fW<}+OS#6VYQwLKin>p$1Gn9|H-$5{yyM>Igddz?$?Gy5YJ{FHy4=ux z@Yn$z;hq~!cVl|mnVxzAwWJ@nAG)Cy0UMR{RcrEXU z+!EbscbY|1ZY#90_DJTaRQYe7Ey(*v%7S&_{bhV?PH&?2S1=wo&u^OCBV(!Sm-8x# zrK{0XJC(mc)iPE7kce%9hsycP1wKAC{Zow;maNn+{8qo<;hK62tuWsXoBoY2bdJ=x znVoyQ_x_@-Z_o1?$#5Jisd)5x|JQ@dncPqRm)3i`>;382$1VnoxDAg6$Q`;McQB)Z zZPVUs3R8kJ=7&hM6gly)VlaL1WJMzO3=@4q4_W0@K=ed^xFp(B{MZ_usZoTA0LT z6!RzYnpVn!#=|-*V?#f_J*}d?cWoe#fyJ3C*K%0YxYG`u6XsvIYSDu0%a|q$rp)o+ z?Y*+w?{aJPv?Y=c_#}m2giUWPJhc79shx|=PVArJ@6Rju>qh%k-;>jRD-U!%1({aFu|7U!dia%Tb8BwaoZ4TSEcVf!W{-By z=70I%u*hqRn;*XX3|`NmchF#Ef}!Q2o*q^owwaTYI2m6*-}m@^(YE5pYmzt0+we3L zs5`j0{4Zo<3XXWuE^@@Qb?Ld}<9`>+m$rxbe|sUmYTH^?2jA00Qcoi-H*a7*&11GY zSGf6duI%3zhf}0WzYA(@G7L>T&Fj7Wg6uTTL+`F`|M)Ebzf_VJlhLLfyc_K_4XbRA zX0|ryEk5nHnXyDsWSg|8=&XiX75?x_hs|z{B6Ea}&3{v_d{BD9iJ zeN(w*>Xp!rLOtcMqK-n&4b%U#mn;riDl2(p+u`W_e@(ZzA8&oDk>zDBVKq_X$D3Jm z-bwa%Ssi?+aesbH;_t6p?z`QVjJsKJdgr=H&uknG)3ijH+b7+yIWtkjIFLu@ap{v4 zejb;eo%@&9x%u(D&7T-q7+31day;{`y=Z^xoeBeK)sVBxtlnj8Xq&cWTb%Y=2emqn z^-kAjl2Fk4Zx^?CC!Vll_&VOHdo$JDOCs|$dct`uM+7F&2 z&RQ#U>7eR~#rdz^WUP+q-_+47E6~N$m-lXA^tlO>&L?G6?myetl3&!4Tb81AcukM# z7k)bzl_^0Hm3G2kXU}5D=UP=b!8g*^_vqoml_f8>+4NmoyK=gt6PK}zYNn*Q?2#qe z_w#u=glcY!?rF1RTy|Y?!!!G$EXS+MraiAYE@AMK@AK{ULvPRbOnKrMa?teo?_OnN zw$dioQ*|QBH~6;Q(%C0edF!BM(A<>;;xmr291W44bTW6qYB=JSMqF5*(^ zGn;tpFk}9n*UNb|8sPxegl_b_y-7n&s60h7?g=-;V)u65kkwjkKDk9rXv->Y#mt{JAy-m8^Sih?V-h*DFn zo)~>A)7X;>7w?QRK6a&M7X=b`f%>lQUk>EbAem4ZELGP z+z|?0;qISP);*oS{q*OT?|&XhWLV98Xx7Pig1Bq)+SHbxc@qnb+W#H#nWXyRiMU<+&$ZGX zjv1?0&Q<&+rg>uhpUNvPfHmV82~Ac;gI-2O$7LtkIypNVZ^$aPg-K?4 zR)1~W&11>>`im`-QMZ4f<`vlkVuw#;J@d($=&N1E&b)GU&*!9wH5I`gKi7mhdwH~) z)v_1~=cf1cCG0)7QT$fj)5)iszWzSYb7YI^#ymT*V?Mv;AAI4Sb?V8PVDmz~Q_^cr z>=ssEd+r!(LhDL~G6pT3Z{Gv`%?iG)Y~P~0xnow^ky+XY6Weaw3rbgy+|#DT8Zh}! z^`!UHPuD*-YuPBOp@+aVraMyDU2d+Y%};yvZ}s}qk4--7tEtGm*xK&Or8x<&rLKB> zTly_S^YOGBjGBpCOxbQ4CS6}RyL+ax@WPqz4n)j+tH<};psi${tii208o}2V&OSfE zRs3oR^EI^zr4euBIj2UPb$_*WB1hScg|pAPo)NJ&c^!Nsjdx@0g1KkER!2_o%vcs| zAav_->#d_F-7e+KYuwlne@-BJr`kpRfL`?ty$fEQKAbFDyG_C3O15Z^^upP)id*Jh z=typnHr=pw%7wQNa}18Fo4j`V{I#2PQU9vs#4C^4jzun+@<4p%73BjNwvvrJ3uo(3 zoYW@}?6i3wmEq`G{0M;$nNw-;r4|M5DtA@q& z_T377r+$Bs$e+tPv334?<&w2BW}OLHZl<>wn>X6*SU6RHIp^Y<&P!MHqgCWjty+D| zbd52?wT(7=>f^NPa)l83(B5xb`UM#EBls&nZU%cCjP%x8~n z*&=6jd!2#h?#`{n(FS_{YCJ;5$7TonY&$NI&-LH_7i*bZJ;%0H8|uoqv!8Ecy>Ln9 z&=Jn;=i3Z!N-dP@SK*6sJX~dU?AA??&3enknVbZdrEfQ|-OL)!ucpQ+k(-#}k5j5)WNX39j$ zCEQ`TJhywsoV#v&&EhI~R(<4{Ja_Yqd3Rr}R^A#kJ176arO)z?rdcBWioJ2lKHIh% z+`AQaYpa%P=f<*UHfH*E%+dWNv(%HfTs&r_mVQ2A&rZgI_8VInswE~H*na0wvrbR& zm^4#DXopdpbYj&vnO83**4;XAtX2DgM4<0A!<#n`q*NED&hRPg*;>q>yvNkhH1L## zvJWglNWhe;HtB%)u zW;bVzD9^o+hQf}!G2TyFj_-S{yyKU&{t8F6^*`QB&fHK|$L;=p-}T_4&V*STHAI31 z_$CLINiMy&US4aetJbnfkG`6_<@7T~?D(iQ$=>bFv>l&z<{y>b|82JGZ~aXV>ZBBE zzAhdC8^^-LZ4(pBcW{U&?&9hB5i= zgXiCu+DNXpa8VVOT=iw2X-DC*X~~Zmjwm+7vbL=IZqhKPVNriUS0zh?x$B4H3F``9 z{_KA=_x}H`80P4eM=V}OOmPg`H@!4@LhgmL`JBx{D}ShSOg3s?F{{bZKqBSXhOG?^ zcXQa1H#@GLekzE6b=IE7x7yPS|4PR<&z{2=pxCOcaQ5io3;Gi*rde18rK`P&nDj=( zP;cU{+S+|S{{K8RK1+oA3p{qRWYlm}TxZ$+=!Rp>XoCGyejn0{&?! zC;mFrp*uC}ABKi9%Vv&(NoXf->^-08VS-P{RL<(84^*FwI);!a)c@^gkeHH^F zmL#X5B})wthAlSIZP>T{?djPP?{gk}xcfapL|ehZ$HwE=hpbJy#cl5bULJAV`_}g$ z>yoTM)})97z1tapZXeQ#Z|O$%$2${Wp9Sxw1`yOZZcp$|*b6g3#L&7H%Z4tI%S-GoZO@Nc#}k$!;F{9 zrc4P5eYxdChpUVwkq^oMJI7yeZkXoKU`y>F!zrt z*_F5DWv;kAzWHR$hO=TpQET@2_pOa;m)tQ?=gA>wMNhSNN1fQN`KtCD`7%fBr_|3l z!>z8@3zuiUU|+!W$`a5b25+w#xTN@Qypa&!Z4sqR$g{daGg zWXSzDECn{d{}9uTKMem5&2VF1(CDY&9a%LKYPv#dp5SsJCl6(%~-o(Wk=W7*)`w!YZn+a99&&^HreFEIsG!vR*m#3 zSu4-;{zoH{S1gxXac$DE$Vl@U%9FeF`ndlo)G)F?ezot3+SWVUdfjZU->7}Oiy=kD zNh!FuO3yj1Ce?`jtK8LRS91_|0~zjTI#85q(t+p<^_`?uFc!HpKY(x`CEcQ zr&$!!-*-x^ii^Chd9=>vn0Cq5O`hMD+pK(UU-er@_xI%aoc8;+ztc2j!Y`JcZbyV7*4ruCj3SI=GT^YUZKcHN}I@8`ex zY)M$M+pHLsjUh|;cdb08bb<5KZgW$fn~wgTQB~a%8owe9cRaBuIHCJ3yh+d4RbsoE z{rt(Bl&A6>?*7-bZi)QD?J<`Hb04isH-47j$G0iaMK3JpM6UBGwhfsIZmWLhuq(fH zf6`pEt83|Rh02#LbJyvdSfD%Ss@Xwt)1@2}MT$?ooqlTn?+-g!PPI?Y-m*4ml~J%@ zHLvBr2O0|(JP~bwdDvl7WyZY**QRrOB|S~`#Ijc|Nt`)thWwLT^$ns7yeB>`D){wT z^5S$>gLnQKU*^3%>Khu(dal#%qWF>9ecKr}6-<_uSiWv+#K$9g{2V*kHbyJ7iD{N( zTswc@mgy3fIhBtRd(4hMZIsR849=Lih<#^NP&V5Vv6N$xaZxS?U!_i5du1b2ef=&= z;QyC@EPh%}dY>?7MzjLk)D!7k*=vhmwJvznDOxjmlbO!9g9le%**5v8;ItL1z8*Zb zV#^(ogiY*n#y+-@nVPw=D@&*Tc(u7LXF^o_?W!*8vdagZt+%Y3q;MtgfW3#-TiJrQ zYgQPza_(Fj$hpQO z!c1OEA2JPaTd~r$<=Gvp6Q)X*;fhmAjW%uh`fPzws;XmX^XvIvDveHkn=D~yWExYP zmJswv#Z-LL*>%)zo4jRnT5ikHxb9W=v~o5C zz2ozc(o|LDPu0q3D$KUxJ(2o3#`Kw!mf*HoqPq>J9_ZrsV?OX`;d8mb*(G`mi|0Jh z{q^LA<4bq9NyQwt+b)X#|8V!>+(WB(Ou6RRcy7m?>A@Sb4j4W<^SFPZRKMVD<)3$M zwtDz)mbmqMO1X1$IPYGGOW~eoc71YY+jUop_S*{tRdWRAbA9{tjQ_iHomf$Kw^{1Jg>o~>-> zryrBB-f-?w(Wm1DI@V?LVggv1*`2pa&FDx^jFMy06w^N_l2)~7f{y{4r*W#X@wV$X zCI`wN5nE}iGbujWcZy{g?~b?3m!_`$ecC>SbyHZ#8IR1kUkQajGP`TVBVzmCpSXFr z^Q`*n?uh=TgkN-v z%s-vK2RwbEgUqk5>)xyWtP7Nw;j&ffU)847{H`%~t}F;zsy^BE z6Z_Ij8tfD77Ry*KEd71-z&@Mkt1}GuLuN|NFmjy`%yet=#jK?nYwk2OK0L8@`u*0GF@j$N zPId_Rq^89=d3Rk=(A?M@X7lVoL*rZTx~4GGH4aIOHEonA1Q|8Kqq+|!#L zJJr?29e5?@Q+B1=nNR6H_xzTghMJbC*~(TEQuFn8Dg8^5*xvT0J>d9N}iRu-_?DbEO_9yb64{?fXKBo)@N96r)pr zrpE7D-G8U1JU;#Os<7fx#yvqVe#z~c^TRgM!)?;S4{SN6j7bf-X51CxyOSfXE42B2 zWwDxiV(%t}nus^D{C}SBWIvqLeuT%FFQmUpG*VEaH?-N{#bnbo?+dxzQ=(eJ{7!#9 zA9paNnz{Qgb4>lmSr$x&$wg(%>GNwOTn=o#U(YHN%os2K_ga6$8J6Gq``Qkdm$kmq z*4p|hIW=c_=%gx(V-H-{byr?|-~EvLpxLEIs!t0}s3O0k) zr!RQ)W$kwhUBO7VN!NS@wu(yq`v1}3`^3$eT3^q5zB2i;`RJZl4faDKJ;wgQp2|;( z`4+6)KH<-%JINVtD(PF3z6qVMw@6&-dg{oU9Nu}x$`K9<20tEtSC&3vyFn~Lbl;Yu zs$-X|#peIHveI-?%z`QY-!^G3I8&|qE!tP{Eaz{HXLc`_E&1}QGgW3?&F%IN$JW>T zUd(j*))w5C{r_o_a1+-^}(Q_v5eS zij(X<%oYE>xb(<31|P90(L8;x@@Jg>-Z0~kgVgMTmp_jO`fuM*UnX0Lu=x6t~6CTSPa0 z-R0x<=Rn@*j2wKr1n&_Q~vR((_$ovR3$X`X`q%d{X+`TU;8q&M{B;TGdv;@NNTDvBrSC z^1)T#A4D}wy+1p#CwSv3Gtm>FtTIZg<9<8-N{Qe;vgGOJ1)n`UKQ7eT-7>At>X)U@ z=4C4%L@soz_#w>y@L6~G(s<)F|9(x9RoB@2J~rjlWuXI#-*gSqC5@-wFjUgk+T)l# zXTSe49`*avvYi?_@~+G}b5(flgx2SJef!mK#HW1OY+#`layhqPj$-SQX0b!P;`iL% z+zY$xw{V4nLyKfxxIh5eiH_4gffaz?f45wv$)~fQJw-3G4dbPE*GAH8l ztjmgjf?n)pX}%zPLSu@LqNC`Py*H0v1T=(JECzqzKaua{}{5|872h#=b{$Yroe*W=;yU_|$ z6^|PPuW{MfVZv;DSU>N};*d=WM}+1cJG0?RgXT+H)!O~;OSeAX;L>A$>d0x+=PW8q z7UeGct}OS4G1pN2K=+YV^1Z61=DRnl=x@BaZPuw59l|+RIkL|E<@JftD3w6imxD4sFbys2+f9GSXkZk0kFU(I@hr;|8K>P-v|5Fesyothn~v}MTN(4`#^R2D5uOGyF`W*13C8!d96dNf-oA-_ zWAkrA2*b8lw!FbDg_9Xyu6+4D!ujaW&Ys|`4VuZ%pNKQd@1N87;MYf^m)8xt=kH%| zr9f0b?03W)`K;3&pZ0z}&m6SVe%&lF+s=lwVwxT}SwyP~GOMo0P-qaIxLJN5?j) zGuvy!F@>c|%mt4go8_~#s3_88q3yMZg63}-j7kYx6z4G>`(hF~JGk)b{&hVv$t({} zuk>pc@Viu5bV1mARpXlS1)>U9c5M{!UU7+IQ_IC)QW9dG#s5$AEqN5cVDy7eX3qoJ zgR6HeJ@k72r>1Ye{VW8s=1g3)P0jD0%`eLXeB$<>SYBlws`<{bJ6|SC^PGoaBhQ29 zMuHozMjW3Zt5^R^^F~%zbNRi)53Sj)TGymHfB04Bn`AH{BU@{+0;EA597r zvohHA=#%m@E#tdKq-)hobB?N*ycT}5@1tB!sHafy#dq4~6Ta3;bYGC2nx*^fWaCN! zXLAjel@`Iz%KSDg37cnW>YRA(m74J8PvZOeZ{B@(aL)f_XLgh_?tFN^?P;L@b{&>^ zTasF5nzO!^Ix^$y)0P!~O^TP71;-k)Zayn@=u<#X`<92xWPCC?PA^uCQC;V})7NK} zit&f$iM)*0R`Q0KZF!S^wpG(zMdy%;i&(h#nTQXYg910`eG+*dr6C~3Za!uAI{tte z(|Og7iRFbn{`Rr9^lt-v)=#S3x^(<%jw#V)2`gt#AC%@qJ zeV=-RxOP{C*f~e&6_zCPyKm>~p4ci-!12EBscnVsai$_+K6Fdo()8Tq*l%<}8_AJKM9b zO}xb8(Q}0Jn(3(%EF4Kvk9(}Nj)&E%95Le6{8HIEbIK8o1)FU6SN5=Yu5MGjwcjbR zPTt`FyE5Cajs9!kd993m;WFDPyd#~uXd27`? z5;-3)d%%)oZ*}nP^>y7QVqRx93hQ3J(z@eCT17&oe{*0+zJcE{UJg&5>p9bJniM;Q zu2*hdnxk=Mb>2rQan}?9>#b*vLjG{Bu39}~$*~uOFCT{&yq@Y@Qmp!Z!j3mf9t8H5 zPV<>M?@ROd%msoep03Ve1$|eVcn*dIv+NfTOU#_;FR?u(Xo6QCvU^_HiMv$nQeJQh)Ug?fF;3bTseV9O~U(QmC?IOM~H}$KOvMw&Qg- zSGW{>Ayj$isW3Hx5I=?JV|7nF%<_2)rk-?d^`2iR(_iyV(|~zhl(XqQ#>fTMaSyJY zzTR@2G3fLf$v>Yw-hY-@H&1C1z*ihSlp;`kG@oz+S4Sj!uXQgCo(oQHX2R}Y>A&QRqpxv^!gDgo}2k+ z6^k5B@VK0s`CV3nRl;;#$_o2AlkE&j=gt!;Q?;}>-tXOzp*BN9zL7(-l5@2|pdXu& z!BvlCOqz$5TUsz$_s1Sd$!?O?zvI$T?CF@)VXxpk@lVTz%00il&sakLPz_>em#Uw8V$Eb5H zN{?9?mqktwO!a9!5prab=5o)kr**`lcE;%kKU}N7zvJuYXp4P29lo%8>@sXCi0+LfIshvv1#i`dOW(VSB>qucIHM-#?Lb<4Msv zj%%YIPJJGyo8{nP#;1Gf#>01VVoW?o6@nWZzgkEh`YL`;bTe;o(`&(+?vK}^T&jbtxMa zhGjWRG?ErpY1K7^tmW0XS&}sApvSHJ?>@6^I48E79z1MODk5cJlOJCxVcj3EwJmd| zX!%$3eLZuJ%N@&j%rk@6ZMJmB-9{t+;Ejss@2AiB=Y8~fWQCZa`{d_Zs_jKu=}ux> zH|erFE%kY$B@`Fk%(FO7Uh}muLv@M!_6`5P?M}!`d~GUWK5ZJ~8k5wAtQ~81PS3iX z75nzk3a~9*TFHvmG&h96wO63|9qds}ppM9!! zJ8RLl+p-qN9Mfv+*nB0WJAY|ye);92zMF`%FyFD(ba_Xv!~=8Fcckr=u%GfQxba}j zwZdh~p8Y?+_{hN~P4%^E{N4wa&%2hTHnAz9eD41XtOZ>+s$Z++?Je2rBRyw!)69=A zw%c_@uiw}FbFFjk;wzTZQuNNAJRBuCbJ>-qAf_g9zuIpJZ^T;j6&;s^o{V@hV?${r zd)|_Wj-XQ4ORH-4$X=RvRQuwyi!vs&8+l^3hRKzM=T9li{=Rj)z~1An{dQ{CwU;KH z{(J8I{*G@M{4&hvY(DnfXfr&#O2wkzu2u2+=>x$LCzj1I=iq(iTNkEsGSW-#u~YXJ zFP&Ro8z%a0i%n!H`ckl%cTVLW<>s?)e8Q7;k0+`BaPeIKs^JP}nXuJV>DO-achy~9 zlIWJ8Kg;W+vZna4YtlyFRJ3&i@`CTRUvExj;&W@%{54g~@sQ;)t8R7Kw;nsC|0Xpo zQG2?_`FN<+s^Io{Po{4;Yjx<6#I~{r4}J$t_us?+&Fa(Ur|%cd_m;nPc1rGbZSf^X-*(L0`2ASuo4p^GeR%hH;}fO>uRYn9NKD-I zJt3z3hGog;*G?PRLiBRNe|~9pKYe544+)9p7t{AnQ?CBHQpH+3K(mxg}_SLF@rzE`$0#gTT&}dfP0t78$M+44#X~GPkI&Wi^wvWy)#-x zbe))2NwI{ko;xSt1d|8XpAy@$gFQQJWHyqo+|A(@E`?qfU9{++%cGcJFHyiuM9D5tS{^kDi9lvJhC;fet znqz-&@<`96 zIUzLENXa}ct5#mjOZ?jNbJwCL+0F4xpYr(ZBZrAU8*efA*&N=+w0x=6zXH##qM@^o z6bUle-@klWS@Tpb+bJil9URjqMZ1d5*--nGC+_D@ant!5oo2n)`t4I~7k*ejTJyA} z#?QsOg5%$7O?>}p6_ft)DW{#6vZ&uyIJ)3wUT%JK+>*m`cOS*}n9o1F`TlSI2X6O! z&w7{dck}cR!uO~F)~hN@B6^` zHg|guvr~WT1j?biAgsh<(0$1Nvx*lFzvokNer?*02DC-=XP|KZp8TIZMdLv*gR zG%nK>*R)u@Kq)j>q4KKVjeia@Ez{b{{9iuax{PhL%35lTTbP-v;);G<$I0UiQ-V*t>F&f8S++6DF>N!)YZ{PlNYT8Wd7>QwvclS-_I{%>yU~* zSuwRSd;jlQyZ%30GCy#=u;c^PNcp5YA(vNPRmxeBbLNl0t6HtionEJkvf{p8{n3!e zuvfD6OOWRogJ6+MJw*?zH%{pJX5@T+z0c$1CoK0{_U`dhr2~N$lAn6E zSUoOhzFFB6Z?q;iWcg$fff(OOa&kB3Fa?#bSfm=qIDewbRLj<#QTJ5uP7XQWxNtEW z|BMy#I}8_`Td?-YZQ-7V8l4`a;9iv=>v)B^cW!3!C^cWuRoNZKYoxl>RH z-_;*~aXIOVgvZaQ)HIU&`9-)xQMCWyzj~96X&)Ls9$@h~Bh_~B0#k?SW7%G*_bT=Q zzUsS=mfHMmt?#P(b>b!0Kl5C9(`v)#0uy3=v&BA#O{uK8wBbq(-^s*;s(f}|qGhV4P`%JpC zB(!6tnZq34@Ly{Vd{1@yZ&$*QFk#M~yH2tJt?UO{jhA#3-nIvL_gjN^W~37-TkVM1Lm%r5WB2l z!;PtB*EtpkxJ`01)040@;d>{ukbe@J+!D(d&GO9iDqN>NSf=0*bMNWrb<>aAsaL;y zvq8DuEun13pP9=)e48GB(NyDeR0fOa@(u~>M21zyXFu|mc3rG^K5zLIk(0}2_)0Aa zTe(f9o5bh6XYO29NnaE+ zS13}2rBmVl3PW4_qie(Snu3^=e+ws--f6N+i~YC4=}p?DeV>9Ho?KaZy!Gk_fp@~I z@3$L0sGZ4_!u_46=1G}Vp~xdIIdRQd*|EwACk_am+Og})vok!8l@1h_Y_{}CJ$;_@ z?jDUD7G7)&Q?3+#ep;Rwd-d|fPB!D}m(Mo^2i6^!ne$LffVYC_XsHI{GIQqMyE4(` zuYX%UH2;5J?3k2D%yL^bhTeMvRYPDHbo|_zO=ILVYra;xw^m>(?gHNE!S@B?Mvre7AIch^XAHQ zg|EdPh0ZUdS6aAd@Nf9|VgAvj&)@I;5&!q-exB&ugS%Fy2rZkr!bEuL9H!)>GA%t< ztB)C^^+@oaZtD3Lk^V#LLaIW^ajy)fN#89hvcqd5-Bs;$;;oC61@sx2-^A|iUH<=! zdg1G-(X~FaZuLIzVY}2m?~RAfb$09374nl}wm*6!5^na8U6TFV19OI5<%$>d_u1)R z2uTiIp{h{j;>UVa*E*wXuR{xmCPR4rV_u2ukQl*JArGF&Sm!H6I$U|Zd+T?8Z;{Vu zA6*k=j}=JXJVov3PCA9`W02 znoZdQbT(`g+`acx;-`}vvg+#&Exq2Cu*y%1asLG2$YO!j7yDHHXGm~12ZUA%DNDPQ zz1Ng(u==}6bfWN1!yMaC>yL&iA5xuT<=+R{5+&T79}Jg+Wk=C-~IvSI?4Ca}&q`g;GTvyVEtJV{v`f>_mBQ{|84KoeU(2LmhN~(;ipu8%`-`s{VrXeJwZLq((|vDx%)(0?zT^(~Zp9(^*myU->>Xe{$xC0wA zI{N{(klurDW88GBHqU6>5Yw>u!wX)+Lw_7P1qEGtC$xFQ6n^rXm2}DE0n3usQ%Rx> zT%2uMM=m72{-oBI?=@%JMqa1w3<4=UE3dk~aycoQ+)y|*;&yARj6qmx@Q z6S8vbclBPc|LNPZbpQD_-8MDNik!F`2M%uKyA~yorIMHEtK7CEK>GbsiR_>rDM7tt zt@;9PgUEm0&Hw5{o*YZ)Uvw_gLGq@R*;4;KuCK zgC*QM(zLkKwy3Rix%WLZ!pk63mreGqVS>6tgwj&6PVv+yveS<%1TVJT#TXs>;k5LP zx;N_|UCjTv{@u?%d;V;$=e_%9`o|CIcAa;x_c^RP^s%=*z@K^5M~=52d9GP1sI?r; zU8&;SEz*3dTyohem0Ancy8?^77ARj@6ndCnmABP$jk3@A+($ott-Ek>=T#-Qpqj&f zw#m4>dgpzN;pB9&$u~vjFjwWL{C~Lblfr_T^Bgnyw~CfAs9dz%#w`)9sK@VRw`grl zVCucOYQNk|nODfP{jBY;J)XSd=h@pc-pieSZotQHyS=fhN^J9O?mgePCg1RqiNB`5 z=JB7+>4|Un?)})hzMFSyp+nD(PdmL8k}t}g{dg|?Uh_tl8(h)-Yd~A-dp1^leIBn< z$}9NzO}nzn(M#pf$#*Ury(f1`Bo-(BffjQm$7OZC_N-mXw~ z{lh);{KPu%ys$?t?eptJ9-rO(;u+)heSb`SnO%k=M^T=Wyiz z{T9u@TDpH@#gom`8BO2Mxtn!Sx9p%oOwGH+68RA&n{8u$zq;+z`%U(me%z6x&*fY{ znXaq<%lgALg!^;L>G`!{+mg1lALtd2cfYVN?d>16b9S|o43FRH@9z=uo#QvIs9D!y#)KM=;}Zq8Tu;hWqxz4^xsrFL7mrHnoQ|GU?>>I7$fWfQmil^FB?*J;(_2aId~voALK@vPr| zf6&|CJO5WE-xc3D*z{X9(_Y`TBYGjfx6h^SB$V z0!Kr4yY zII(74=UF0aELract>a~0H%(%z-As?Ou8)IK51J;$clbgW!Y5`L%HwE z_cGl5zhjm~E4@-rd4GqyLDdx+tF@WhO3ukGy>7%d z&Iw@wi;8q{IFOt_Zcb?Gq?qGHBI8*WW`u%_lQv>^#X`MVX zxwWTjg58lvFV*-y1r~EC$i4S;F?qb!@Xs9Y?jYYRo&NWx5~0PO*&lwb-_I8vttpzB z5G#MwVX;)N$VvXJDD5htEl(gRf@;$>Y9TQ%>vI}Oq0F$H~jsAEHi;WjYWPLrF!dEUVBm!bV$rRZb#c^ zdAs)4_xJD`-Ez~KI-TKw)Q&9Kg?II%jcyvw*drsOsF1l^@uA+Ng)d)ieN_LmaW>PG zdFcUZ99CW)hF<$;y4syl^<_V!I%SfhQL^kSW}Oeu@?%9e2E;T?`jcvVQy_tBf=R-D z8JArmJhF2nj)lIm(SFoxBW-X>(|@CM5BuhmOKRGe_}OTx##Fqs+4Weg`|n?)?7C08 z<&VGr_kI2S=~9kahkd90k}zTTTEShnFaF7ePE~_L6IvprzN++`DYz=}_7TI8mMjz3 z4>zB0(7tcn?8f5s={MKAjS|b2MO5?|zVXgYe0t>T+leb~`F)wob3iNA`WT<68V9rD z)UE42Fit8wbf`z}1pI$G){{9b3O!2}Lj%PpgC4WZ6{JfJ~@iBcLTk_Fa zzaP2FAN?x6E@|if3)?4jEq6J!_s4+>Q^p4Sww1?@E?g0PPs&48*k@~-M0!D9lZ4nK z=>?Vbk1A3gt}>k%SnTwP`%Io;l6j-y73;r6A$D#7S6|3%n{{F@@7j?O=la~2&1&p&Y6?#uusnWsZ>@Ro*OF^;dnOpa`e?Q1R;BUxWr{~#L>waAB*HaQ zg9SqE?L$g4RhMsk&lYs8$Nj`%mAdamufosHN_)t;s=M*q9gCSWm3ftBZ|=2ZeEs}* z#Y^q?hb$6{ZGZk;{^6B=?dN~KqTj<}g8qD2q-KA=J$D&LxAO$nN1xb|G7N9kur2<$ zG_GqxaM7%~w3}C!7zW#NMEY-gApSe`$n^AQp~2mMZt4GawOiogzg^DtLvif`-$K_{ z+ZmmbQ#RgCySiqp{^A`|UM}uU|8Qgb|Lfo1{^Y;+({sm1=M8BpFD>ra%U|nzFui@p z&r_vy{$F6dQ}vZ?26Np1ulbKop0DS~|9h>JW$MGUph)cu4`Y+$i{b&C2*qx~pm;9M~d0zawaMOE^ zZ=P{1)D`rh;Hc8-s`$}ZL08_K9j25ubXYz z>gtzVpL6w-b(?CChbqrhp0x&s-cF@oJY;_VW(}_4Pcql8>^O8Mq9e!Y7>F-WUn`UNBDH51kuOP_o4WA(;+Z@iM1?ftStY{e|k zon4RKpZk7?A;nl_$&3$2%56JEA|~f*ZTxA*rg=tS*XdRlHu}cm6+( zdA}~-UuoAc>6^;NCo7j|d)CLlJ`uvt5G;E5a?iqoHv-*zX8*px?<=;*YsbGiHG$pV z4#_Q$injUnQk^?vPU>?_odX+PA1!z<%)CD?cuwO?+n^Bt(-*p~&K0`y>v^_=i`1X( z1tw_)SGTOMn-RYMU9&3tv8*$dJms%uS#ny*PJKL&SvVq!ymMwWubky*t(YRkxADpK!Y{uzCl!8wD#4X(IN2)bgU4KjcLDr| zE^IwyF2Aq8`tFJ&u8(v?K6X60eW>8c1;s7ZJ3g)b&v5m{9r@2k|2yBPetmq&bM>j$ z)l7o}4QH&q&g%W>%%jO4g#0*9a@XIx5!I4rm@d9TW`~Ty+$UOUJNLa2-?UL$_kFV# zd-4VOyIPFL51LA!+B4<(^&4!SE6+zJ3npvdw^xbz^~8CFyWc$aw4e8+x{n<#)H)a{ zeM0P|%${3Ew=@0Abm%M)p0@hlEbTDg`YYxQi6#muZFU}aC-2Bt`l}k`eQu?ZjQ7kb zr@u)=<-|oD{&&0Sftsk-mr1c_Q_Dqz*upm5ULWr@JCQeU|39l$7o~)Rnu7X+xuh76 zuKpcXw_a0WX@>~YHN80ppDpD+`upCF7H)aV#S50#Jjg0pZyUH;B6(wVX}IdSO@@Y7 zRE)M-{J!%4QUBjZ^Y8u(4SC$2u*#6{p6!(feY`4ZDw9-X@5`MmZkl5(_;pT#&6khu zg371&_6myI6)`U8coFTQ@40tQ?FG@}2G>^I?sNV!>qYXB6^G4Udni8qaJQB-^C`oA z8;#^@{``5tvxAUGIidyB&SDrcJxn{n-=3E6`+;4 zmcRB7&$oN~`qtSVdh|kUUCq0|J5^s96qGk6q+HN@cd}n>KO@t(`*zp%SiNEnis{|@ z`Tn=#RUh|%%>HlpY>puO{|7(j_ zzgd0r)>PE(KYI6ixfCJIhXI~YCb zyS4gZQ#{iifv>aUl~&G76?=H(OyC2S>{ewzKVSXsjcSSSdzrVY3(x<#`1`aEr#YU> zB$^zi(dU z8%3G8`>tF|xNNoFp1Sa9LXVD6pPY->;;5Rr`|;=h^Ly(5_5T=ryZ2AXZFax6L0i76iObno*58{PK0TUxeBTq7Dd(5f{(pBh zc24c9HFq4Drv3KT`Tm@Bh3MkGjthDs?=Sv#Qd!H;$)H=ty>&*p(y@z6;sjke`HmX$ zDxI9<)1Gu)KZQ-m=76qP^B&ds@Ws%#@TV&KW#* z3r;#n=oolRaOFrXJd&q)@z&GtYg0BYU7|KS^ndTA4Ra-a9E{estryX)%bEW7`UKs7 zd91;n8s^0sXSeiDN;z@h+GNJKi}@x$OFuu2o%u0LxIuFFdilc+exjF79og~wq0**X ze?R@;D?I+;%I?V#rP3R3UpEW-BzhxSaI?mKMi+_vzKu3fU2E%25A{xu(^0-5Vw+>@ z_9|`Hip56?ZgcIuy=uqPvg7Hj71+oLZ% zCG(2VoYFH|i==NxS3L^2v{Ixl*tBx`KS4n1YaC!mT5kcB>igb%oVE`?|*AJq43JG zjJsAsa@{Nq-YvRk90R4K3OM!}rj+q2omi0;;1wCp+_~}dlggO?&t@C+c~6M=bUMga z<*gZYS9s`=0H`q4*kg3}9LKfSH6+-+juuV}OK z_a{#DB+N-U{dH0XyY;4y*zUL5))wCva##E=zuy#pZVKbe2d|=pTd#BdJlgBdAam{9 z`sAJEJo_UWv_AUz>}y@E&XIU8-K>a3F!}A9!#h6Z${)YI|F@M`b$h})f!)q?Dj(%P zIH~_<@o)Wq=KEW!er@PEm2`>q?1LE_KL3z>6T4SeT3^-R$r9gvq0SRSZf(ul!?@pO zg5BIAZuPxp6RTd`^txL%Y16xy_gbayif3J;-X42B<6Xp?{d=`@8$N{>&FJuH$to0F zcPwH56^2W#4D}uzcbzicZfnZE<`uWp(8*5w;lfIv8BQyYetKd2o>5cpy~pW)4|*BD zUMarH(za&B>7M4TqK}HyG#$Qjd@b=7dzHbIoqc7oscC*e$Hm8gHU}?J=st4bVDGX; z(kIkQIb45bdL&Po!ZO8I|4&il*Y0ggPI5@E*P9kN$w?%v*C&)w;u*K($1UCl!WJ7E zj_;G+aYZO+Z<)Vk!7;r_-)~e^IM>?j=wH*d&*1R8l(1u)5)Oo2nX-*3fiXgdKWfj9 z;QL43eDe`s*Sb+`+oXS?GbT=YH=9X$o43z4_Z7>eAGkbFI5ItJkLp`~8J?@Ne%x(1 z@$kc3$+&+r*DL<)5V8L8v--xaKjQCp|A_xRwVuB^zmD_ji$y1fe&Qs9=ac-41R5qRN^yDeMLlh$S?}7G=JTtU=p?%r z&2MI}XneU-YTK=gY4XhPSv&4T{$%kK-?Y)!@kOVWfv{fvuS%Eq52w4QPMVVBkdbcH z8T99rnb9UfhU{75=i46KX1(>e zw!n*Hv-6P`7ti%i2y)_)i{{Tir0>L-ki_-qtlKN?8SX0EnljZm9C=*VNGl#|xUluF zMZn4fK1GSSeX80H-3>*@uFaCjnK!ro;G*qL*89yP zf-RmpoH`_G^uQ;KF>}g|yK$QYrfh2wk=*!NV7J&h$;849Q$pgCx!)b^WchvJ&F(k5 za;B_2*7@LhdsmupQ}`>r?kq*Oeinr#4J-$KD}%PmTRK&9&z}BYY2Keh_4V?T&hsaJ z|61RcRl>Mz){5}tE7=O&3di^=eUE(Oc(6uq$~863ifLc}G3^q3;N~jxeY{z;|ZJrpk`_mj1 zgFi*_@8(9eFBJ*&Eff8a`my4LVfM@f!6Vh4XH!1co)wb}Og($l*VBIu{}k;HUN#k; z|3l~Rzj3gJMGE!oivqPGqRbOSkhxVd_JapR^p8ny??Z|sn+e5 z2Fuq*mOCEN)2~?XOF6Z5!#}HwjXZB2G_dUFsCfQ8|KL?+Q;|q5Qwi<+t6SD?`VkPd zb=C9|g+u>lyG!KvCiFJzrYY7+D|Qq)b#NcKA?9uH*sWPY{gUs8=2OfX&gbTRncQi8 z#OvF`#z3deh}Romu8^$1zQ0g9aiYpw@rJdV4)b4e%U%;%u=07B@e-bpLwuQ$y_buO$#h#rv_WkR<{i*iVMS+hYYPa|PR(!0|d@o~? zUg7*B-A9CC>+F+4lXBv29lEK0K51jM4#Nx2OQB^(-(n?;i+q-9aql~P>!`2IueJRT zPi?nt%!&~&S1an>WpdT4!pm!2p+{Zch8>-6-Txh`75|^T|IhwI_h#GkneStXUe9^> zJo}Qom5URC&3ui-mSu@tiQ)5#UmDuDI;zS#4E`q&=U1zdz9H%8|;kdfk5O`ob*l zB^x5uC$t*nnY8Ao7u}NPaLb(~`BR z(ZJr0F(xSRjOwd9tkhCwNFDjzY;uznMNH@MsK(4T8| zV%zzygwH>{MeWS@!jFsPkA3_)+hWf?eNS(eEyu4v6n~%e`=b7%mG-sokN!V({;$Bd z^?zC3{AdbTF*9*ZNP@Ff#k?IyzHw-(?Mz>?XsN{11;H` z?5f1Y?Hfb|rg`e@6`9YmIl1&|CWDLNzlO$@S-Nu@x6EKHW$xn%&XixL5F(eJy3YR6 zUdF&aPED07$=v&S6b>u6_}b-7_;K%YvySJz>SX?7x9+*lWW0ZFYN*7)LeBkrdT;1{ z_)>1)dUtjH!)w~xm%a*E$UW1`C(vr?zAV>6nh)RV#~=UMZ_~q_eyrm6>HGy*ZZDph zZ}|L!|6cjW{eL#wx9l}{z43UK?~!$Hugh|p3GUvOb2zb5M@?y}^M}Ay#?Bi;*WTiP zD1Rd>W&{8JDR0;%x;M`f?^JwFW(#E|+UlM|z4UN`u z%4N>{HI0X}ZfAf%;Hnu$+n(H8*SuzD`O;b%K|T&p&?Q=3>ew_m4$0O=+3%#^{9K7uyZ* z&tGV5rR8T*d*0LI;KPOe>2Xlxi;!EoNd}<5gz) zYHI~g{-0ObtIqL!hz+5;?EJjr*X;Kkg}n^PIzFmPbOk)Mmndg9GWqI9DLMHt%1Az5E7i^H zS#5TVmnZf}BIg{I73zvsOAH@$f7W9f;%-PW50 zFZ#oM`f-p}(U*!Bi^B^(Uo}72J#X(c;Z_Zg%;{Io1kE@ek}~&L*ee$ib}t>xtG=OA zzfTlSN!h;1YP~4i4dweqjQRh*m3nN=`1qrI-tpJ_f62wX{gSwu^?>&M|8eHI3=!Xw zrgB7BYkYtA@2GWn*@o(`ZvCYfR{ij}(OVpHmTlkD`k(LQf0?bF``>*3RsH{W_>Oa`4mr(U?(xm2~`P0_?`!Q#ck5&xt7URFgoQD-&2V7PD@hyVG$l%cDgfPxBft~AD zw+5)~-p+PZXQI=Q1rmKU5vRpY^fPf;k87ba@<~(ZqeyWl8hO zUl&APyQ%K7tJ>J}TtqOK{k2r#zf?s&$)cto>C={Oyiu7Wy*=Lkz^4RGwRe-(L~b(p z)fLcSx8EitpYiIs6&kvyd*z?JX6$8TRXDkz&)|GaFPR}bo6 z?L2DHQ?B(;+NG^jEYD=>s^IH2pZ1-}pTU@YXRkQ}>n|S0_qC7P=K1Ypx>OLdulnrv z%1q|Mof>L_DLOgEf{%i`I8IxhtIg>0|Myk=et6#h)ApauH+(p4ZRxisvh~E>KQl?OJ;|Yu)^r%T?n2XZ{wfUM%K!Afs6J ziIn7T+0q+TPZCqk)@42SsN)Rocf6WW(7)-X8so{N|8rL;6ze3e*W{UR`$gGmu1)KP zDZGySat4oo9Fvje&*j%*VO!Kt!*otcBK&l5`l_i3Brn9MK@pp+b8&=8Yw7U;~UB5SRvP#w2Rl&lX>YX+Vqwj5I73gg? zIK+3~GU%YPa;5&xFOhuJ)33kYU$%9-!}()#4z6aGOWq?|`0Uj8ee1jbFRlN1edG6I z{R`uE^DMS17?B0wVFXk-lTOmZ|CR!?)>IW%4G9(*Ouf+MyDT3 zPMf!}?q9?zm0t{D4BA#{dTFwr{_l?Tloj?&d9r2QvEYeptADaFIN4=(e(c(qf++zL7df#!{$-xmxjDz{MV~O= zy_qXBH53gGN^mOmE_Cj3{Bh^|jzyl8kCT2`zFqHKr++r$_Qc&ay5Egn{kea!y5+&a zBNi3q{J*d3?Wef=O?$19_` z?0c5YJW*m{zx+k7hXg0*tjp;#KDLw2hn;Zn)IDCcY{i6IRiWx8n+qyUf#jCDvYJ#EE^tl4_RpV+RClq^>4A$| z5?R8`u53A~xx(Vtw7`{m53ju6$G|x8pri6}lOoL@OF4qR{EiMknR74VX6xTgHI-eC zJ2=AjO$(Z2IJ3!gig5dTLso@SRi=hAv&rr5_WdifTAu!ym!$B>C${w0O|~0uLiZmf zS$%AX*Z+4V{_xxDbu8;F`HdE73kXhW-pIBtuY~7}LI~HjsHe&;kLEgfHH-BzDYJ0C z)+mggB_z5#OzG)u)tFH6&taMif3+sAah;p`+-rvt2Z#Hw{NNrYCGEhDoU+dklN9?| zZdCQWdtsKOt{flUe^60jTlb;e8@9ErR*$;0-s;bj-jlboj&f@J6056YdDL=4FYKS* z89py-ncK-fZswg|adzrkb~YB4yNn!S{--4pUrC*;cCAaj9+UY@xOtV^F*i3kvFPhj zzt{>}B#XG(?5Bp;&v)+uE!8}u8uNSa_mp#4o;)tQ*5xo6as?b!JT$}WfM@ND&H6t}F~Nw+HXlUghOWlI@w2DTY9 zwi*TmtlL-j>%H(S%>-@B8zCC)bG3zKV&@;$PqEM8ZFZp%?0kp{1R z)0C%nlQqvA$*a^^xJuHRX)5phgbU~R82euAVW>S8(y>q5t|`DO@7q0b%bo6CJmJzg z@sWqmiu0?~Gb+ilH7t0vexa2~p-AddzsU=(lQT#D6=57t{cLoiuLb=JnEtYQ;=SrkFj(n?#KPAp%i{bW&0-O>}a zzn7egQLjHLAmHrM)ARCY>5p^Y8oL3I&F#Oj$B^d@$6gJ+ot z-rfoe=G&dI0zZ5K)=58^v>`dU}`#po#A@qZSqqXU*m935X zHaXWW%UjiLUM%SK&+7hDah5wPj|tyc#U!}F=En4iJ#D#19wf%LX4$xXiJO|YDe;Ys zrQ;XD#GNji^9=2j|GTMi-`pH#*t9{?5&lOtq?$f4OGjgOD_?}3a9v0{-FyGx-EdQ(gF4`vxFm^WoFW01JKIr;7!rKa~2$_@I0*z#>R@m`yDdY2nZSc1xZ&5NxU&rVC7 zGSj`}#Jhl$Rxcjr4T6jOS5691S!|u15&g!-%q_$ErbhCind)kblzauZt@IW-YhAwn`q9YtRg%*)(qFz8?hu;xTP|g-3g=TH z^R7R}dSdF!7z2z?y4l`ZdiTR;%SqyoF23IXXPwH46dosMhhTxl{^8e!TBlaKOxjnt zB`~ord)X4THjiDCvd%9x7kOv%PMduigV2Mo@e^a5FYUW*nk@1BUGI;g|8<(3UoB?} zKHI*RMQrJkKi_t*saIY;NqW8K>yMOgWXW3g!tpPF<^|!{5I|^^D2GMPJS= zQ}({N)?>95149FYr;B4qy-wdLlbjXWl05tD8Wa+4?yXSOX=0!4yzTCn*!Dcbc*m6F z7X>Ao4<9r&^yxUg^pwM0hPC1$dtDBtm+Z+ss>!i;r~0Q}gMhg;v5)3i`13HZtS`LS z_u-O%y!+K21|^x8*9D)C-rk^mcB!)F+n!S%)k1-#=XnoAXh*iQ__Dr=tgSP2{xVnN z;=5Z+F0#I1u0MY~%iqr$ZOwT94oBXe+Wxc7YW#_HAs*gmbe--Tow>Z8;rzd&{~zw_ zuK)g3o;8u{v6{hEkB$gUh1Qnx{bkPf{i1JNv@Mh}7q9z!Z{3FH(~OUn`OZK6KqdG> zn4kIne;+oi3*1%o?Up&$wWmvcpWb`=vP-u2!>9B6)!C0_Fl{=}ZC}f~Ze{8=e$S;` zr(Gi>md*U~Yl2G7r9W~(JshvvRE~vMc`5`aoj6(&wujZxk~f0K?*6Z}v6eeFDR^3P zhJ@~&zaUPyE##2%Tl<%7^X%WVYst=dzdR-=e16>%(~dofAK69nYFO{d|-uI@)mdZCa%@R zxpL=K=bnvL=h|HT>8CJv$IGCTrV|2!SbK$(Q^Fp{X0fL^y>PLcb+u(->nS z4frf0XTY3;Ry*>e|_vNJBUb~CT$xAw0ArPunR^S8g8mH%H}`1`B8t8p#I zu|96;zAaZ7Q~8ev?2+%9*rum_P|eEJ@MW*T=dC9etramTi&>xjL04wAs`brz3d`PI z`dP)~knucd=EC4}J+2WNdv7vmZgJWowS@Pnn9>>k(SZ8YRT%g3Qc%XEsT21wPrSf>G3&>T>=|+atRE7t zG^B-|obu_>mFy_r;~ze|M*iM5tt9pZuL(|F(?Zdn`U zI5%Uyu)yw)lV!a(b?J?&(_VNX}jY@8cTVD`yF)GuK4HoM(&WrmM|vQRdFn;)0ZCl^dYz8czCN@7Ke;* zj;WimWxL2y_OF|3OFoxx{Cwp5W99FbKjZ(rlt1+E>UUSuE$Vy zuEpY&Rk3TQeBk=cHDh^?gMo6HZcxIN;O3`Fhx*){m`+bBw79Dg*<_oe+I3n%EcNE+ zjW*#Ey{q$MmMYsMUVQr8RZd+`)whLHBFN0i?DoOEMOQX>D9bj4R1*H@iS3UXUy zx-};yiucryAm2!H` zoXYiBI;Bfdaf{%--i+t6azEdgC524xnK5CK;}=dJwyVEpO<6k6bg|1ny;c?@!9c-$ z`|0!N|Mm_y^{`VaXUpmlq&Xw4#ofM~@1pUEUV-Uyg&QL*@4ovH)hpDU+Yrwt zAuYK3!t)D;jXT-isO1!kUCTRk^|nIKQ>*QQcmGJ7UR+-A?WO#l_mBSH>i?s#uKx4< zL#E=5A+Jl^?vx+ePkQ996gu)`@o0X_6ZNuuU8)Kl;6W*@Zr<>dxsuw zwVd~B-sc~;?CZt*>z_;doWC~XedV5itG5UEFMsjOJ)%B?x4$Nhd!zNC@c-@6<$Kj0 z%f1x;o6|T&Y1_JJ=KJn^#$~G}h;h&P{XuP;{LKU3l3)LrTK}PR z$3z+4t1Av&j-SAAvHbtlT$z2w&YR6#c^Jj#TQ^^-=A`Y})bXrTfQI=l6G||C{Tc zm~-geRp&cDp6T^$-0@)|_lM1v$8L*VliKr7x?O6Wm%+6M%JDTEx5MQQy}P>lM)l)u zmlg}3tFPcrpSP!DL&Sr#_xCM5u;$>CGg5ND`??w2_k4X?yQN)4$49>4Y4ouhbx(A5 zr5?Hd@26=)L%LnPV0is&Gr9lYmNU$Id^Ns`f1$B~UyZ2!7hC>=W}QkBJ`- z`NthUJl~@G=(?l-tj#}uDUWAx*zt2xK+EPuA3iNF+fY{5@=oKy*ZAG4aWfYluGoA` zdA?=y_PXa~6SM4BC_QMbxv&5KF#lQ(ja`v{D#Lf`9}!9H5U^T*v%<|;iZ|!2z%9Q$ zU#Btp|5+)!=l4|SlFtm6&N5atO%od4n1~==Z=KqY|Uwr)fziaiM zRgz{L4vFrFJ<|UFPHN5L<2FV1~>Yx1h^^M2mj z-}E}Zn)&U<3b9*hJxAZYZw}_}V_Wz&#TZQZymK|{0i{G(%sg?-9p?*0Cy7{pWYt~>n0SNUq`GlJ{#xEOuDC@4wt zpAMTh{Z`^8(}N$^CbN1yy%*)ZVwrHuQ<;rlI}{J~9(%Ol&Wg3to5SX{r0r___CsL0 z-Ok>pjR)Vo-tL{6-s5s7I$ZPqQSsmP$)1_-Ti1W+f4%ipyO)Gkga4na)9och8{&^l zm7CM?FnaFVXCJ3bc70_%^K#qLHe0C!VJ*@6^2#Na3_$_$!JLb7XL}hmPkC^gZ{5mj zzWq^+6W#iw)4#Mab?@~PsL&9~KV97Sz;#kicK2dw?;EEMS~Z^#%>RE*uHyQR!4Q`z%!VQ|_GY=jk8r#Q&0iU%7wZKjnJK-Ru8LtUBqs z^nAYN+7^zwW#@MAmc`GW+HQVdo%0uuMMXBhX4lE~!lW}&yTmllw2D8Fcw5-A(e3V3 z7k>R?3VdfA*Y{88%*j2NbH&i=_|A#1-U&}*FD^N*B60bn;kw$dW+yt>?uV@Ud4W@K z;+apcUq(pGXXwk9_f+M&^rw--h;L!6Qi*Pl;fATK*)8QSf6lzJ&{Jn$kFmv$Yl~)| z{5a4v;)`6b1NI%YDBa2jDwyh&Xx)d zUOd;cMA&5O^A~BWAIs0wogF16xpGtYoZ!5@M!SQi1nXbU3udy^uJG>Ae&3q0l_BZx zzd0_sFQ$8XIO^Ol-nRPRmn*^DmZ}laic1uHTxEIhp1#uD{_kDe12^B9wdu+I4=r-O zX0No_lEVA#p3S7mI_JCD+g4UCyQll?McVsEZ!X(6Jm2@kxbC=*nbyv*qDk6Zi$(am zj2dIx=Za~bOm-(DH)aJdoX&W%R)x8#Rkl}fx)94@oq0VoUD%vCxE0@;%;sCRvf#(N zO+7J--={E!P0eAF63x#ploq?Sz2nS@E<>LWK@$bOKDLljIkEQ6rBz~$)8Y?>n2NE- zIm9j!We$>@*1;8$v0p&HN#Lq)#)DX~pN-W`d-SIzRNirRyIiTDEOI-9qgyPt!=Yd(OU`@OPzGz;3ryg;&wXYjC&P{27DK~n2sJ% zI(p;x*2;J@zH1v7&hB~eocm`n!?sNxjT6>Be&_aVGOwG!o2LgS+KDFxrq1zmdgu0R zrOXWN*a)u~T@q*7IM=PacvkGhzOQ#`!B!d<@(3ZwExR2-rDZHuh!H55l5eF zkL1A#?n-;}Q;I)ntuS)BcrIGxbf$M{^Nq@o$-F;i>bt1UWLm+l5ahppDN96CvFNQb zwyZ5{JH2Ploh*8N$zo;+V@>V#;*Y*;ztShw@^fR3kfvzj#9X&aha@-N^^$R1*EIk9 z6u&uMt!|#nm~Q&c@XAYxdOP=P0aJ9TM$qlbXTp4?Zbns4O-Jqcoe-XOlq3n8M}4IAC7RVEr*1kYvdT-?%DGFiFN93)hL|<`b&;- zbcYGYZTwVfXfW^3W$^D*-@$e#hxM(7wX-MfJDv4VZkO1ysP>i146d@|ZD9-c zKWN}#s8kx~w|2_je^0}6tarBMiZJs%PB7sSiI-Cpn121gzK8YNmnA!L8Z|<5-=r8_@V>%cmhG%o)3NmKsd_o<_>8-M>~=KS zF5qnlllvv%q*-hn*xsW#@xi`WuA|eI@H}Jb*{OM72_i-?fi|8uehLXR$7Qx5LgmhwgA zW`(xeAFExR8U1M-r+*7CNlGz!?Y2jt$7Sh8ub`Ln@|4zGyE0YdWzvyzkA;7v>Rg{3 z?Bd0JCU0-w+~fN?p4UCN*Kq&+-^cHd{+s}Y`nUmt3hIK2tyuM zQSyy6UnlF8Y{rVmS~mNy*Ur7~@!Kh=)8OQ>>Srf)3k1xPJ_${1P2822V)8mnxREC( z^q|E~wQX{qE@qOFiqh?QWjy9HPdyV}^0X_?T>AWuKQnn1`6Rm~8no~4YkpVJ_+oFt zhM9?LVog7t*i_`aLXGX*Rc(>P#b<08ANxd}Nbz9uW8ARyQQ=JgpBy%SHgdZ*sAPFq zE6kZ0=ddKyxon-%>b@h|*)I=DHrwndd2sOE(^p&zze-J-6>|AdYs2GLYzsfn`mdqh zwU%d_et+SIYq>i%YL|JR3w?2` zV6(Js&WXsGKR=y)&-Z+e?V7Fo{yqME?bho%-{ZJ);ug8zUF(s$@AtdC>9?}izW-gj ze<8m`&1aU|{v{lG?{3cuzUxs?`qg*tY#zq$&6+C?dF%HpDL?RvQeas4y0NQ)L8k7X z)wcODOcxVB*d}FMd^`8Z$KCgOr~f-JRs4VYzpLDZ&l=eaE^9aboN4uF3nv zo^@QPe!454WB0kJPOj#oo#MHDetu!MmPjxk+T$+4CbKJ*SthpcgxYh5ZIaPOXESEZ zf9GP)(AlXz>BCuzij@pKA3nKGk5|^Yon*60sBl_!+UH+v{%w_JGB+*u@%24VQ4Y^J z`Q7*xx@l)5Fn($1$?T%K*txtsB^_q_Xz zRR?%yB(ARdvg$&ryy-2Ul;_Mb!G}Y?X1JG~O=KwidXD$+1ZF{@@21~xWbqt2v%zW} zH+lQ!Qu4LQY_-=9n)3PAd}CUbx%R+B9~F&_ z?=?1_Tq1PS_Ufuo%MInbjy{aOc3dR#l6WT1nzc(~&dm9%&9L~Dq&r*1m*DgS-AsOo zP~T(Wcb=ZyRg=Z4zvZI4eI3{N-+jszKa!Ux#vV!ft+KBA;O=>)AKmvK=)U*y^oI90 zuLRjN)OMe+y`gVnxtz6K?%?(hcU>d5?7LhNUAn3D=tb+a9pBB*9}eRy6i`>Wc|vt= z=HoUt>+>94d0BIBEje@SN_6xC>G}H==JpnIoMu(}UQjyeR1`0}=%J~zO(br`?LW78 zorC|2pFiUcTX0TP+U9?*G+1owd><{H9_h&|jM+rA=Ts(eZfeMu`ms)QqZsFFeV*E5 zD<}1-+&sA~(}C$LOO2d!v_;p?)rC_hbQwLKY#bVUFS_#oA%hOte_LO3$>^_5P}VcG z2(YUQSiNDvp2jM(#(ZYEKYxo2!rpA3lv{e)=c2xt(Ih4Tw*FO_1|_x}Jol?ZvU%HF z)z_G4JI+k}&?HiBJ45p7EfxuzJ>LzcPMvMx$vx-jT?(#{_rqz6Qila5s6afu=6&`R#k0`H&2STxb#K{Hkdqbx}a|(_oq2MA@{(& zo%s)b%zb~z`~GM7d3%2q80XCSQTDe($)c=d*Nfyg0)K;2cHZJ*sh3%JpLL?}>a4UI zX|mf^ecW3AU1ilvu~}bDd2+iSsJ0vGuF0=?r<7N>G$OmOL+gX*U#kQUZT03mLT;rT zi&lv_i|Ni*=5b2dvU~T2yx;>y;U{0tcT7E$EWckvn60*7?)Q~QiR^&u!3FmZS*g$C zb-uAYTF{m$lKE3n|A~Ezy_{qP)%}lM5muR5(DcpixYe<}`zyU(TzFZ(s_D#fTZwI% zCJ#yivVYkHuj=&fkJxogtD$yvgG8m@+v@$VYBs;G?mg#uQ1BSjwnBqrCz#R}%-8pN zdm$oxvBOc@!&j#=XxU|iDq3$2{CdkE|MT|ac2AO9N_w8|wwvB{?F5fi%YsMpZhH-n z8ssl6FAY1jHGN^Ou;8jylO_eHZtf6DQA$mjdo|OzrJmWo3g zjwJmSS-1OjY{gCff9?6ZG>^Xs-Sb%0X*PT0pM}$Ze7&&JAU)vQe6Fyhx%p1c!9Si_ zirO3g`WbhroKbLvday#&hKT~=d{f){n5Nz7nlt^&-Yrv|x0|15NR-*b(CBqV!N}m1 z*xZ)FBvt>TzgN2|EsZcZRnu6vQ(#@Y|2^(0@1?!cL!a1e+dS3zO!@l!JMVS-Q3hbW*7VO>EmT2hy!s_e93niJ)H|;LC!t(UA-lY6m zo(Gr2$|A~MEpLCr-M*qlM$WWx*(woNu?6~Dn3;rr`!rfTFEa3$6`7uIk$!ReBnRhf zPcBCB^eCH$->6&Vo)f*qCqU$)-=g5~=`)^4WFK)@62EOz0&nA-gB#R^uIFtG_}6H} zJwJ6b-z)X{AKN7L?Dnzj{&-mZdP3c^xIg#m-8BrUi*eV0lFiw#t=*LuHq747nPGUa?&h_gL|!G=?OJyMUKvOicBo|~A_eCNus zKI{CaT=qeyPF+;q?k7+sxX_2+*T6F5bVb0^ohR5PG6~#V=4G?&v`(GdehGoLj_A0( znqq;cd^hyAOue>QdByd-15Yk|oguqZ^6ay(JAPi(Z^<<~m}7cLN8tTJgj`;y(3UN)S`Hgu>+|1GR-(kV#_dG3g8Kg%TJ0;kdc_|f zo1UNW!cls!?wD9KkzX@HiqhWQH;;$92jGe7x9vrjM zNH~p-H(n8_B)9<$kaZPeObz;N06P_|(L{!_W)LbVhB;A8d1t08| zYtPFxu;1*k|Hak*d#m4AG-y8g9yO)9=XLz1-s5&3-(Sp)cQL)qz}~bn_FI<1G~Pdb z+w&ft-oJ^rXzQ<^kux8$ZT$J@1lJi$o_qaH;$E4%HTT_JH1CW+)49)Et31wlYN#DL z(@}fm?D~5Lj;dETNGyC?_*nZ|;WK}~?t4u~vg5xAPcCFujLckpW4pqtsTV{xdi`_` z`@m`G>s>u{J@>xHDc{~J^V#P&-Q37^zGm(D{@wehE?@L&tr~CJw&0+tQ8U$}A7>Xa zcdWLp%c#ELxwc1Lvh>NODT+&zUu@!NmULkF=JzhCY>U(Ow@Xb_5138TKhb((c~6~c zYIy6t^eHzam?IwCyKkl2_P~+H=F*E}-H1vdN9g zEaBV!?mMccsh(db|LK@?@_}bxg>61xRXrr|V2w_ck!a6G4jo}eCIKgwkSkw59N$*@ zIann&sd-;b37fz>3*Ry*g@pDxn)e9o>9b#d((u93vb%*HRZ^boubh$E(!Fkl(1Kt27Yq40EGpkK z<=sk%*zoR;ir6hy!$Ve+Yc*O9>)!i&c#pJy##{v+Z@HZh?dGaDKHt%>dToes)TP>= z&FQHZ!`SLR{5YgP|5UA|#EY`&P8=T>Puo8)ZspCODYF|E3ct$c=rPd0*DP@0?G5*D z-F(Y7R=f#*{;-|(*WS$*9}ks3c=~?tr$_srH@`o$v)#Vy z_8C@(LiLX4EoJOexv3=^Hv7oa%BI{YyZ0AOIjQ+(mQ;1R)tfm{O>=HFNVBUkzi+Pk zYVE>M_n{z^HCgqTcH{bk-%s_fPgo^&IBA^>H@8G{R?zwhCugX7-tx`5^Z9l9fin`* zj5;fy^iPwzx;A-l9IvJFdYugW{8S}jrJC~wQ(HH;)ZNcsvz+(W&!UGVzuWb&YvvyKx<~xwErG2MQTqh zoR#2YEzT0+pvzd+Bl?;Dz3aA{?_A!@xg)&ML+3(-9Ou-1{6>i#I&G5Oa(~xZopy+* zP2{lD6w|D5DrH;qS61S~T??@%5&^zCG06|J)MqoRyq_1MoA&iMY@?|6M9PUeRDWjD$GSNvIS9`AK##?+Mo5>KY^*9B;P zs@U|aj<7~i@4FN$+N6_b zq-3lv`di@7Ch^7zQp;`~d%AN~Zq|-tnG&uMACIatlszhmIcD{!(L$J)$JyzS^`!k}$uVV?Y_|W|e7WLYxy<3t-P^zH3qJjp;YX^&3#CH> zhB~`ze%=3g?RCMIK3wNO!*HTtGt_5<(hE=ewJ``Y7m zxN;nv;#;H-Ej|5rYY1b3+|2^XXA}SHaBY9E_{DT$E z69O0(%7)d|_vma3jl0En+v11aqowaH+ZOVFu=CR3RGe%X^OWV}dToj43F@Y6Hm^wk zw37F2gG6K1Sp^o>mL857O}8ebO8?Ma@WGJd)89ws@`1(vTTjdju}o-kOfa>1IlWq9 z*JX=;x%d00?|*-@>RihG>KC+|Pb z(oGdTsm@;H_f`17hA$NdzvpmqE_>^~We&%rmZgh5wP!n~v}L|pqx`{c(XE`8m*On) zE3U8k;BMl{b!r9o+X<|hCu=j`+~vGF>)_k`TP^vvoAzh6_nlgKLL#dFak+0wSBg*H95aD%#f6O1tyj-cxEjU#yyp?yfeTeE z@`>3_wrjW8ERD%ME-=+owf`1&N&KX@frFoJQ#Y_AX8-bokTk{wxL8q22tBfDLI&8^|b8&9UmYtpvcIhw9C zKE}+Z)VaZvOW(~@cy&RzWvPze?A>a{+7Yvh1dgn6)jqmcY_|E870YyHGqKE9&|Z+5 zmY8w$^byv+xi%6uN$*vs)y1E9w{ZZ*5y-m5IL zJGtpXW$3h(KXVl4d1{ztu4otNZ|R=<xxO~H$VCAEAN?faLwij>naZC=_*$l*CkEJ6_~a+M}DRQ%a6ON zZK=~=KD@fdEw#sMhNSrX7Z={^HfY?KbWu#hm~Cf8e*~Y&?JHe(PpquJtbN@;r}aph zmioJEt1L<;tNj*sn7Vq~GzSUmT%%Z`x{C@}2*Y6TC6j`mJ z*?+nvUhTn|zutHL_BmVp+}hg3&U2!d$9@Kj3e&cY9kmBG-1h8_wG%{E7iw7obnExyD$?I)uH7~=@ai!07vHX6OKla4EKTDD~pWxYFW2S46y6W@g_Ne|AB4JuK$xWuIVuJ*X`rI9`b1I4gL>v z_pCoQW6jO)vPO?To@uUTT^pvZwRO&wd*3A&2#2W%{Mu<@5gw+dsd&gwd+XL~1?eij zM~bE{iWG;RNQfuOY#v1mFAu2 z6kQ6xaOUbilGnc}yiMs#wQWx71SS<0j{ZrhjOQjx9+s4Ci{IiD@4sV`>CW1H-;Oo7 z9ua&gEnvlH`sx;!&|VoMRqGX+OeHzuhi4pr#(r$C{JpS1fo3O`TO7eRH*N{5tGOfH zDwblh(rqUz!{YdFod)yfC#R`u@0t_RnR$6?uczPnh2IsJez~4Fw#ZRZcJi@<+s_9D zOqArc=3M+$_~c}XUvh~NNfC37f7P#JkNc?{&h}^Dm&Wf8-YCyM^6TSbgR(B`dsQ-r zCw(}Qe(q3+sMcaPVJoqt0^BN{Zdp;BHm`p4@1C+%LAP_GliDgZG5y-xfiV?pjvL3{ zc2()Wv3f~=1cPOVwXo{}Gii=lU$p;oT=Wd-RSq`!(!5L0^S4+@oPNjy7KT-}6-E`E z46oU2bR>^``4pwS+HpS1x1Wp8{oTA)_s=5X3)5V}=3bA;TrDPH=aRVmm`13}xqOyI z=iXlaIqlTf8)ZLEwNLpp@0}upTeo7LgK2Kd&QlIDOlx)-Z1i($;@@ztFUolrn>j;F z;A>}Pd57alXOd_2%(nP(ZGFbu)QcHS=FDHin)8-lUc=~Sy3(M;u6p0@Q%}}>f5E!f zbZZFPk{*+bOHTaA+Z30)^SbBx<O8zb=F^VAIX#BEJ{hcjsC+@cWpDcH z)B9B?_dcFvynoX-p|h4seBN8EpBEnPzW;Acw>(4K&wcgn;rrfST7UoB-2X3&qdAxG zbTE~56zTFD;^ARDyUekAJM-G8s@AEntqq< zZ_PfT#-%9%H;!>K8|B}SYWFj|yv|+f#|fp}YuY8%S=P(i)^7|xTi4Lm5unyS^OoW_ z#%(JVHhtN$VQEXInc6F(-Wn!%`7rTC@0Ko{^M3Vq7SZJUSKK_+lM{3fTQc7-viorA z{zLZ4IVXBntuyU>^-7E}yp~y`+FNPvPW3|lURxXYw)kID=Wm_bGpj~^OZ%#e@4aND zBg--_Nw1t4_F@{-x87S-PnouCa=i25lB8cyy@eOSl)B?dXDPbRxyNZxOON^v_@N(W#Y*`E149ljg`sGbJMH7d}e$j>7JKe z@b9Buc*IHlIai$nIUJKV9XzPK#W`+;p;1ighRWjJ&;8pBUPa7JdDS4*eq=|!vWJt= z-7PyTZU|NEGCa89`m1WTE!A(m*fMNaKivJraz%uu3(sk@+b!|Fb_a?dadN!ixpTb9 zr7`Eq%(xmR-pPgOZ<5)VXO|kzdm!*Ii#=QQ)5_W1uEpl>9c03b?=pO?={6{BogG)` zA(X1btT*+3>nH8LjcYc3f1tP^zT`!D^pVDohqlW)NvI^Y**@;uekSEf%G#WQYYS${ z9J}{&{o;6=*19^OzxO8JsD8%yWp}kf8Pk3DnE#7rE;`M)aQ@=k`x=DH_w%m*_woL} zV3})Din6vzG6K%+52klGmi}%2cUxbumiuv)#O>AM_1y+rIuTpL!d=p{k2mLYuEP_8kBWqRY@$D|KZEZymX74 zRsZWa3&))5oiBIG)!ts2$@b}xc~*y#x_#p3V^Y`mr!et3Z8PMn_*cG0d%@~&nZ40F z`A`|5{!`HF!Zj~6h2w>RYbC|BO^_;<7%R3 z^t!ro%O>T78@r^m*-n_8xyrY0Wy`%e9?org!j<)F^BATFe&*z0lU=;A!Mp3h>{Bb^ zk8Ra};w_7B>{ElS~KKWfjyI;BA+>R}f_3@MQ z%d);~^-H)TvhAkB-ZGiboB1ED)c?n{>f|oAo=Y!8dYv@cFP%U7M3Z6p`i(kIcK^F& zX!C`=`0KgvJ3jB;_Tj?uXOpBE93T8G(%|fF=-2rB_0Ofn_al=sR4cV28`I5%FLyC! z?AjjW6R}NSeW(AbnFnL<7teKBUb=4q_vyVZVRq*0=S(&E$sqZqTki0t^AQq}t2h6@ z+Ih>Ag(+!%x?JkHJ#7zHWj0Ol%y}y0$(_Q(c9gM4aUu)9ocR2ljitrCdyVZT=XFS2 zlls!_xO7SD^;v>54FwtFt`yAwc|ASAU)Cp;^+NC#dp^d*3o9L7`8t<1P2s)MRd6(f zZQV8n?wE?K&bjGU7pt|G-VB(u!RyF|*;YJvGXnjleQ2$(7CIobZ?A^>|M^89<0ErD zZz{e#Ulhshvu#VMMsQu^t)>%;l>%l=`*go)X~kAc@B8y@-iit*yiKp|UcT?g{s%9s z>ll|sG2c`xwmrf0z2*Vaohw-u-T_@}1l1F>53(hQIR%82&(r_+Ni%jsk-zN+dHqH6 zLX!?%?C0CV^k=8dDIcywmo`u0*f4Fw9l3)0?)nF!W_qa1{*V>KeNyxIDb7gtGp+*M zkDukoA6K4lp<0$K^VuT8!D(e(Z0=?`wY&Nux4K;)>IHPLrvBA$l+fT*(_p;M({k-_ zh}(?~&QtDMcX{P{O!Ga);OJJt|No&`PVSXZjc4ZOZ5oSR@7gdNuvB)D?OXY2(iX|2 z&K4!1{9ie*L$>g2oU*H@bJN+V=DM5SYo?^}NeCHEV%3~FGhpr252qb-jyauC_7Bqj zQgwFW-J5Q^H}^`%{d%MRe|p{5y*I2smrls-nw?l;uaX_YYc3VNBrw_Mm=J64m9^I; z%Ay@6mp92zX`9{S*xC}3C7Sd2iOc1{ESV;zvbf}ntx9jc8Y}m(=SqmZ(6i&*#JBDy z!_24$Y^ia-?lsRT5=q+{QD~UHsx+ugO1VyOnbWojo4t6l%%s0m$NuvgQ zj$R&Lz3qNsFTX1s*{EXBwb-#oVEU9ttGVx6u0F8g*pL59R5;xaKqcg2y^Rfe&5^p(pt}0ygtMZ7%EN9U-kdR?fI4e@0{rUP3Qm5 z-v01OxP4bv?4OS*#~m%VJ8e{da{Xc2R)(yt&N=NhS%$`HbxlwGsx9j#?UL$VwpS&8 zZAf9}l4VbIKU&0fE3S%PRKR-Z!9z7+L(z?X7Lv{vcFy^-Z;5)*7s0!6)0ZCoG$(Ym zVCqLV{uWh(yDJ`4ujNu&eE+3MNQuk+;MFNTt{Lu+{Wpn~Ju)~`9nyQ|&O@H0_ku|h zmf9xwR@{8tIAzyq2Im_MM;<*rknqM%nPJI$+c_%}w3+XV9x$31bzF0I&|m&v5{Z-U z&e*CTYPIv&$+pJT-OP68(hf;qpM=P=umAIJl3mPIwm5h7yEPZinBLXvy*SxJbF$$Y zg}*E7)EBc!w_SM0>vZE{!h}xMEpex>Txk<|qvz+a;FhN=0|(>R5GL=F0pECcd|toq zapV6T%8E+`D=u1Z`*7g>yPiuARF;>!t-Q#1Q2*lFoX5YW*T~0x-aaq&%PjxEn8Vx6?caiw@WC``Se-X(_8LzPlbddvqQrT zZZ?(A`LpHwPc+RDnEGlf*Y{7;aAvLBR+J%9o&QZtV~?gMuiwO#??07K%{#HuYwa@8 zUzPUnxIHB~KYA8urSq??_Y>IloQ1{Yq_IDH=-+v_G_)^e&S7YBmOsA1#WnC`klL3P zhQ!k^^|-EGW3-yzo+mNIK<(VDHwG?yUc_c|IESPy5(rP?Vp*A+$GD`$ZJX9>ab~BK z3R~IVb_qo%l0Gk!IwmRMUh!q}?ux7Z^3$`_+#O#oVHVsMpRjXpudx2Vd+D)%;{QA? zfAFPte{b5~j&El|zrFr`x+QD)%IN0R ze@;BpXJRzpJgk^gxX$s>Qu)c>;&ZQB9n3D$nVrO+7$7jkMM>6{`Pwtq{Oq$VSDfdr z{S&kO`eWDp`wYiB5-k_pef#Oz6uTn}PMus_e&)l88KP#~=>^7fyROxTO zC}FR}1qnZMri!FwaR)K%ny>F##(n5ZL96(mtGXAR3P~h?xXK@UP!d)riiH^R2(I`V!NPSz&vw{MtG1&8?K{(x$t*ZD%xFecABi zSf*d~_SLFWLZvr&{e3u{dETz{#^^ZHqnG2~3hX_8;g?~#LSSI4>Je z9Xt{fRqZ#fQ>i>I;3RK+S-)|Y=WXTXTXF*K|G2~FByV^(>%nx{Jy~oFtB1Zh;jGRvI9SlTdTCD z?sePoF}0~`{=WUfwOi+%GT&RmrqsUGxgowPBzPrDpG|(#$;75ynR!3X@M-XeHN1W& z#B}oLa<)0U!Y9RBFtq2dG`u^h^4H1rZxs3Du7(IzFA8vFkaFKr~^2?1ml`LX|Jbe%E`ilFT7yf;J;Bx#gU6a@C zjwVM-%g;I(+_1fzT(|7};$^+UylL(#tKWUuTYP}&aE#J*zdar~yUORi+jvKANqfqn zhtEwXb>3i`Q|%FFFSxll=;oOe{s3V2Hu6Yd3XHa6@2kSF=10; z!HZ>F3WsL0NBu}$FU?i(=pE+?A+dDH-OHb*J!e=WUmmf4AEV&oD|@{QdRAQ1+Ok_V zuj(j|jPkWUsV&yFcaA8%V>OZPd8x=8ZK-pPbt;>*1b58;N1U&|^3JJDVE;Q$r)s}U z!4tEc^V?jH{B*bZwX??VYD>YNpTYtSoB2yQnniA}E3+t??Xm2)Wx>0Ltk2SwPB3jg z%s1Qo8bi3n*RM-`*x3#msuC%s^hAYsnF_?+jj zze?2^K4_cXq5SdNW#(IN8|t>RN;W5#`y}K#yl5=$FME{a%3^M6QM38*J7c@akJg2; zevsM1ux4M)>TjMrlHHPvSLKI)nJS<Dk4M=rY*t0Geq)~Z=Tp#+&rzF7t8FVd zvfduGtTme+C9rDw%3}*!|HN=T4Yi-1a#Lc7dh61fpewIUR~>tL>X=`tm`uas?fwDh zSLLuhjPAdE|IUKD_YQy6|Jj%x`{#Sjhw6{L=l_YVy17f^p2uM~!2^zyl9CT@>`!#) zkyHF~ie<`s&w71@c?O?*l3naioM-3nYyNXsZqeFl^SPb*@0UtE(`}L$Se(U>bYlPQ zYZvYdPHEN9+?{;GL*Q-0CZ^5n8Wwr&wXM0W%(k9QN^0*K!84jMrhJ0O&N;MgEUaBB z63tn2cZXnxSue}Z7f%jbPQLB&IEU@Fgi#eKP*8n<(?VhvDPe376O3f9=lS`f=Tqz@qmL#cfYWgk%fv$eemx z=aJ2lm_*rl-I{;r|NiUM}$w9k;%4 z|L${hi)U(2tx|cmqVR%5#b&3d(388Y)Y}`1>gFEtzQA+niv{P5WmlM9NbHK{dzClE zIOV9AJ(q#(UJFTe*M&1~2|0<^Z;djxkDB)<|JQoIIBDI6{Ks~`v<_N0U5(&b+n%P% z#jW2Fzc2p8A)i%xVV0_*daF+MPFIZiQ}4gP9kNw<*_dA`v-H9*K*JM%=5Eo)9D#MpT%s7 zD^l62rds*3@p@l)#GKa;+h=_JoB3wEB~`F4VSg5pfgn9q?l|HQ=&^0fXI zPHymbd!hWs<@mzZ2DN1hL1L~+0iVOzS{iRz7;v|l++0)mz(sGlE7s{|--I<;Vdv29n z&|fmW<8H9vzONguF&tTOecs>0)&E}C37xOM>;K4dzlE+x#!b19m13W7IApBnnk)Wt z>!rBfw#tc%t8TmBt#CWKU{2bsZ)-YydJ=UylS8^q+Yg`5b`%k83*!we6WH5cD7J0Z zf?0VFyZ^t|SLEaEd0J?kvLJH3Nc+V*%}qIBljiLCB)MSrl-x7UDIJEVE(JWZ7~CqIRZN#V zws<{mpStbGEk&k_THFSL+6y*DZ7le3_O?<(-uCFk;-{7`4dzuP3S3Cp>3w5YAzSoD ziJGF!-90{?sgr!wz6jn`N{P;1)pH}P(_d|m{PVOW$&%N8t}6}mI(;i?2DfI)CPk}~ zm%kVMt5a#2uh($6{+-p?nbDQACfV?Z&QqEl?X~h@;lJZD?w1VI@9vutETeL0&n!px zWr;C2emhqtkEB2IDuK7~Frq9WdGeXhcZ<5M$U&f`pzbp>rZujgkoU`PN-FChN zZgb0);P3y~e*Lt(@;drvr{-D9->nh5d5aZmcOLUvy+zAIvQqsO!{ird*KL!SR>ZXZ zw(P84sfDsFT5(&PF2o%4IIwZ|^^0$h7_K*3_`}s8M9Crb-){*HhFwiJ+cz!=%W~L% zy|*Y~*Rey6-d$OnE`D0e9%>XWFSc)kRoafs)?XUJ}v z5zn!K>qh5NqwGp4cZK7O@qZ4uN?vYE(4IN}_fG{s!?h3i4_QvPo8zH#dNKc}t$P*i ze-$lnpBo|JA)m7)zlZV0j(rCgx18V$EJbsBK@+I(~m620)w)#eNPZU%|TU#03kyz;lm(z56{=o4FQ^I>;2 z7mIdSXy<34c8;Pc^Z7-YI^SrC?3^I#JatLY{%JvvC+#lG4Q1HlrQFYTq*d`ydGbz` zCC1Hlfk)H=FS>~|av81DuiMD@?D=9Qk4>NX*B+@cmbiLm;r#YOW22Tib*zlDo1$uu zhgJRBwQ)nQ<9=fecTYnu?XU-no^?eo5VB%C;4(*{rQ{o%_Hv0b;z4P;0 zf2`mBb{h%*1D8d)HR3#HJn_-jnUnN6%|NR7$^Pv}55?WII2OF?kL9x&{-00qD8E~4 zaH>W)Amz%R=f}Of=SnUUGW2`2TR2ty`kVgr7}frCrM^2+5C16JCe2xprIR2fvpbpF zzwYJr4^#R7_ODoO>SOA-JwS1KonGi$lhP9>OdPY7H>x++g|+UD{`ju%+!3}9Yi@MZ z2;5D&FwdrQ(xkIH9j{v06wklV?kxV~-)5HmG7pw*{pBq&^FYfAR`%yk*F)X9v^joA zFvl;eTJ}b*q<0nL#zienLK!K`G|ih=ep!+xGVNZ&N?r|yWsEh)3xc`#OBhwD_s2; ztWo`AL(!(=cm9iCiR^Kdf4WRX@W!uy%^UCZ&5%iIVAnZk-&V~3UvJ;Phx|$JuLKuN z=Dbs~j7Mp0Pg3Gav8y{*R2*k=w+J=dw6FZD&ym!I6t^44(q30it~liSbJmIjSC6D_ z&H517X>GW1L2>j$HNDp^76sq_`!6xvv}i+#uzE;^@48dgfmwl5Ry>_ksn^uFZk>$9 z_v)i@E1Zzdddy4@OKC7iue%GTfv^Q_XJ6LNHUT&_oa@t%LN@V;TpW0s}5UM69uR&Qkc zTGI4Q>EQSH!}))kUmI?52xWF=&$+`8Q^8bl)#IkA*a~x%D4l4oCGoNh+u2(Du3xNp zaPZovJ;vum8nd`1%9b9Oz{~yNWx8VWrYf$I;unt?+Me$F#{2j@Tfb=jt}E~RLhszT zG>O%R_s7qSQ;}@xhnO}_=IUcS)5ma{+mbt^?w)7X`nBc>CzRL@`10I2v+(xYPkRkY z7>`NrxV54ygl}G2*kKc=i|@quswufov0G!);u3gb{_B*>3-5l**p~Gp^}_jE%z=DU zBvPDG*Is&l(JkxqvvtOPyqnq z5#j%Gc-PE55MmnhxbTr%^XL8&1KtmB>mOUy{Q6%Gnt74kzBf~N{_pGR#bOUqgtY}@ zQl4y`*0*DulF4SSyGa5JBFgiUv^Xv1=JhOG>NmNO(esO>7-RYVT;cma9x*L6eKDPR z*4L{>Ay*nU33l7ZwUoO3`SkXLs>g%SOCP0ecfLBgVn@kkuER+T!V6~##r>|g>hb^k zr&4FTZQRep(LWxoe{<;CfiDvderl51$zdL|YjsrBx4h-2UmdIQf9ZHIYk{NZzqL!| zeTgfQIQ=td!7RJyS!{QH-i_YzocZ~cZ8p81w@ArIaf<0R2-#(vHQnQ6VGWD#j@Z&ihH+S;7gS-#Ao~{vmGE?;k>zh=WRGEc$xs?T7 zYj3WedG&zr-Mh>Q(u*0D=S;j?CwcL$A>aKs8)~hdZ1n!JRJWVS-EmUoXC~%__dnmf zw{pI?-r87+r>A32tl1Q3G^c>u_eALGqWi5mhVv?(eywWW{^zgs$K(J1nDop(c+GfD zt%uFyxPQ*uAKdGY(UHD7l_NWCs@3G0q&AMfK^C9ay~(~5_i{q&!6gq?tez;I@nY|d zQcJhnRU4C|Kkl3?d@F+a`H?rymzp@%O>2!?YspyL&BLDDcrvW{n^U*Z9kVJ^ugHo! zf4}+Gyox{ja5~>LO94}hD(MfOzUMwP{{J~LVmViU=wFYVh!fq%!wzxjJiTps%I2m0 zmc1?-W~s`TUanA1vMxLn-g#-?gkR1VIQpM7&ve}Jdi~nR3+->5{@$A%GmW!fj#sO) zPpCyZZQB%WkHrcV_TRM~4LxToEL{F+No?+>j*#ZG4rmBXMW11l^@2XGs(20 z`ImZ6=#lFTH7jfm)P4LeetnS`!{V^pr#qIcddgZXvLw_;H>B%k=bQ2mPE&cDT}(F@ zF)&zQ@wmA zPvdu4%;6C@MNTWWbj0$Xa@=Z za`#Bl<6J+!dY`QPVjFOtC$IiAk6~fE(5JVNXB{}K&sW%deQMUeOv3rl3!a_}Tyeoy z7Z+<}pH_T)rzlG0{nl)gz2<85$4vA@^qhTCclWWJJdysEUDWWV)BN@4E!qBBvrjo0 z$0?G=w(3}quBX`1P>r)wi|Skh|NT}>2>5NV$;&1w?km%duE_^hZ(&^HQI|0F)T=Mf z(?TB1DF40S-v5_R5*V%?d7{vtR~--%-)Sj)>Y$M2Mb=BpUF9GCUa{@=;}ts9N3{=W z*UL}6V)pLQWZvZ;{ipPLP4b%~xK!$boz2v#p}C*frk;Cf;j*JsH{}A)YmLcSG06pw zT!nM)1b8}R$WO82p7ZCHQ2vjVuMMpA)I(o5Ut7cmfo`FF6nHlPj)EFBKDB6MOW;DlfA&Dt()$1t|$OuCo*Uv1$uL{o~%ve;?ex&+@pe zkLlggO*f*LB6n(Dvbd|cO6r$Je$Tv9SI<0~I48m*^WFma*QI?*I#z|@%==Y-#N|~i zewwlCRp({N{jWqOF|V%6;Nj4aXgs;aY3sA1Y4fvnewiKGz%^w{>%s#^YvSX-3xppy zmQ(g}>8FhC%5k6ilyB_1`S1+$p+8-ANriR~KAwNO@b1SMIiVk71yuHIO5&EVoW6sl zZEl3>{TCja_?7Dxh;j)U++K50-{z1)@{Ouz$1*)PmRIkeJ=r6rl0rn zyEegCOt0?n#dJ2_0XQaq9m5lzyDs;<42R{YK4a? z2knWx=sxAIlji+?O|LcIHzhs{3XNaI!Ex!_k|z(U*8bya{~k{cBVQdGz(-cJCZCxW-o6xk)y|pvhl*ZXETV5p>rk;q5Li^L-~W zt=4>*bdg!V`nj5u{+Ej{jynhhio@b*Ge=xUs&cdF zVNQ{(4IhKWJ_;#4n9f*U|6g(8dOc>l-|PJ!|GR(lq^gdlxuRj*?^yn19<|qO>wn*F zFZ{!5+LX?Eh{f2W_-V;63FXa}kB@yne@*OjckD5qysARp7DvycSsxPJ|1ck2v_?u< zx>s4`Wa5UYjjK7!_ocR7|F_oJa<8Rjcc}1UMR88~&L4-?zk7J_e*6iZxt!bg7f!mZ zxyhvJ#p`EDS=zx2On;OP_^xf5yluwfWS&VMgE-q3=?ll(OG-*H?V1~RIN6tN>1)Y{ z*RK0-HJ$4FMAUvu=Tq19MP;>j%S`5Myyn4W@Ups>WtUR6BFCqD%WrI|-D#@*b?-(u z^P-^lu01E-ZO!2{TUB*TTzc1pwX2O5O>WrY_%6sfNbvwuo>Rfpd9St!)JQ}fWbS2s z_xlAO-~Eiw@8%rXxiz^=L@V2_hc#xEray?eWm0lj zK}dV!DGh-Lo^!@tzBhL4JH@?vme=}sQk8m!27UK$Dty^=ae`;wA-Vc5o0mV7I&@2L z`M0pBYt05s)T^xVP3Xvqr>p zPTs%5mq(8W%q;&qPrTYfKK$MC8hwdVi#C*eed}Q?A7W^s)BMbKM$fVJ@!_c|g>PpZ zefP5C?qo-YWRc8JMZxlri|Hn*QSY^1xUu!7vpcfn*Hqr^x%gXk8JE_?XJLGovNa`N zToO`H+hU{396VcT@AS`U30u}DxfY)cQv1Y{D>9MoQclg2v&Dw{*GV0EUZ3pm-fP%i z_0GojfR$tN&DDpxIkqy@U9js}q<6#RYDmz+_slW5C65E-nN&-TC|Iyb?)+%%Fm)$) zk+XnA_hv=)M=B>)&b#@i>e~9%A7bnOTjktM`RucER#b$0#h>EhGv{9iuD1OmeXpK5 z?&Cb)HL_bb^iFkMqwIH|wKLX#$z+X$H%Zoq_#-OcA6Ym1Vf8ut!#d`FE=J47{f?J8 zrhUKKL%iY7-IMF}3!g3IJJ#tkV{3lhy=eYgD(&JqhM*{@;uqt?9Xu zryV9(GvT~NwroYK;Vc`KV&T~ag0-$M<-DpIR91PP*O#pLb?tSs(XHHbj>kTKmgBGa zvM8YH_k^hnwcohg@-+2JROv@t6fim@BXa#?E<>aH(oOsLqCFXM_qB()tY31Hm$>e@vpMa6Pm1F4 zfEhi@^25IDh<}yDV{|9)+L5DS$MP;cSAVi~R^$(}<9tuKayPxZ@UE&s;_Q{iPM0Z% z9@T41^e+r)O#N%!oHhBjOxi=c5MfQvSmk%7i5-uoUZ~t4F3)`bboIm&4u%GI);Mjy zo87jT%fsgI1joH<>kof#vTbQB{Qfssmr3vRzQ zH@KVfX0F_aC$?+t%r;ccJzUg&@w{`|8`b$uah<`h-KAS3HnAyx2~^#>SS>D&fAP%F zh@9`6Jf#x0U0pEu`%eFPxgjrZGuX3)2;Y=h9o6IM^uXt%?n~~cdkt@{*?8w=_zBB( zn-=e#7Ik!auWDPU(3QHx=tHV*7bJf(rIc)17%Fb;Vl~fwN9&5SlYa25IAjuHy(~)&FiAU*{11aLK-+uVHr7%ZpWSf6AmTF`XT^%DlnQ!Q+_H%iiG3 zRHp7E>8;OQ_f0&pQn7>mm!m-WYo1kWxmet`tJ{|L^i-W)c>C)meWT=vBiHE6}E`KktcvM_`Hj-hPv9|Itm2$r+*SO{Q|NP@KTUUIjKf^XA_kkK)d%w`Tn$J=l z4f?ei;?B|&9omonY)M2r5pr2Iv2vTytD{nf%(MSdJ& zFAML{S$cPYsOj=&8#7^bNMDlhf@zSBJj3&{}e!v1gO<^X7g2n=H?n zWu4i++sRz%W3l7GQ%mxEW?x#6sC4l7j9U$>HQ8&{&1hg05Kvb>$Fk$e1@6-4A0MC4 zV>EwY=wPz@$+B%xr?ak0h*q6=pSVayo{jC^kH@oroXLNaxHC581bT1Th3?8qeFy(U!!tyGbEOS=E%C-!bQWvZKVr z<3E1vx9N_K+ugYJu-IwYsW$9xyCoh}pW9oy{c&;puHs9~e*5xzK4_eK$Fy92&jRzm z7WL}fbN20@e8Q~O_MGIG+J>!ej}LLaJ;xC4DRAsp;i1R#qm!POT+n1JxuP9Ban-~V zYb^>U?sED0`EzW```s5A)RsQ`)sYp{xV7b8{JJ2=KZ>kX-ybtAv9^%hIe%BI;-?uZ z+`1~y4;uH?NB1t?9(m`xb@hTS<6ZMlrZ}4Z4z%Fv?0>MkA?wkFx4f*sCkC#yF5&ic zRUwl!B+aM1aZ{IeuY{aZ(t>OKF%a6#YwcAjQy zw`=N?Wxk;<7oJ=e#~BuP?5i$IZ3gGybt5n~%0k^vR^!SKZY&EFTND zEjS|dp!fZLzWiUEhb=xfRmuE!b-UkrJLue-FN@`BKQEKYQ>xvRz-A*fd(Si0EsTHf zF(f_sxqjuxWAiOqrq}(i65B4}Z1MR-!`#bpYOI`!+oyaM*_4!bb#m}Bh1>(zc$1F5 z%j&(-m&~#~e{TW9ln2csGuPVg`=BKPNRTA@zro7R)?u>b7rv zPdn4MN=3I+VZNS-g6@+7aUY(U);#-|w?@P$-{Jko9Z~mB&7W%L%{pz>--GIP-%On3 z1J15#S{9VL=f(On1wSf9_3SP_et5p*!>p}4wxxdD^gjOh%yuiAPcN7DZ1-Vde^6Rq zES$Fa(B%2E9>1)1^%Vcz;Qqg&vHf4cx*XF}i=7sq2>W1I{jgB~eWLBwDyC1Tc;Bh9 zIcwW~o|`}K(dYd}D~?35y2r9yow8YOVaxm{=O-}Q%awAkGfXWNn)Zm*8BYwM`f<4)YA$t@#TVEpreck7h}j64UK zzxtdmt`%Oa_b&9m}2df7mwvOT>AVfF(6{j;c$ac>HCrSn|F~%=SpYBR-v(OrEaW&P%-&O5i%lE3x9b z>>}~mr7xWJy#M~q=;sNuDgH|LPp>fjQsrzlw@~CnF4=XYG(SY8soSoHGDn*EkdrAn^PPAvW`;HJ4=;AqQ3&iN5Dl7x&(nu`P$F`e?` z3_27(af&MUddM&bHnOGEPpOuKOgq)ro;y=rhVJzMfR45 zF`YJA(Y)r4&dT#i8w?&)bsk-%CRY1;>V}6#sXKbuWEJleo;{+l)K*gQ-u#{Qo$Erm za?bx$Yh&wD3%;;KW3^Pb1;f{6lRsSQoU+jHr+3uUTUD~NU#2BUD+~8D8s7AA6M0(Ar8KGHotoMA^fyy*qCP9rk&9_32iPTq}|Og|j-cUX>I}SAIA)E9YS7RW;_Soo}wb zezdY9ab@@H4AU+$m&7wXJpI)1^ZvS=%G?|V`#--T3$2W5#Qhone0LHLJbxrE+vaOXVmP_^ zCi$6t+x}KthC!uVC+h2dpH+T}%zwfa-c0#^KtH~f_ra^ihNIo<(?pjGU;aL4<&vd; z=5+14X0^C+(TVQZ4i%<1SB1IFH+mdMYPu+VP)T*Q%iNv2I!~Her!=hpcTdKA&w_&! zXKNqfDEZuxr|Gxv;OgtUz1UW6IMLaB$KqNPuc{*FXO9~p65jrNnZlPn5A0juZsf2v zE!3w;^xE}T9}lmd68QJ$k|`{wEsU*YiYt%z8r{m$x*9%>W%8C#)nlr4rCbq53)i^K zTAlv&m|N%dS1bLjA{DhShH-xMV^Vm?>Y?EC!gBLnp$8sZc>%v{iWi-?V14K@sY0g9 z(WYNv)@qdud|8R^5IVP~<6yLQ?o*B_II~*7G8W^ws*>sCv`hoHO zeQOuYI=M_Pkn!LIw~jQH*^?p;UtO~5u#%9~yXY-i{$Hyu`J1zZ8~8DtdtmAy`uKf1 z)2o%CtkDvc?^Hb`B7{nmHXXH^a(hArW9H>AvG;6^U-wLZe4kTLV^!`hn`tiXlNY^d z$x6GZ?`-zOKveN}^)j>7{hxMUb)R_Y_ZnMW%|z{Oi{=_^6`a%1c;n-YWyvbP`(=7- zDl}V589#IVc$PJJ>50j`TzA*8vn_O0|KGOp?vp>2QOeSXl;`IN+8j2W;{EYjbx1Jd zf0f86yZcf5-IlON=om;zDfV>~7EWI~iDl2b>Fow{Jhe^;zV}>W!X&plX5TT>K*p5A zZg;)j?rKS2vN7D&xU$9Q-jg|jPx1smR~)r+GTtgNjcMK&?{iD$FP!>5+idMD>l3r% z%y$__e?0yA8&i$=$5-XK90kcjrdt_WoDv_cc(z1uZbj8B7x~sm2~mlz*45hUwe~b! zN_{<3G+<(6>iM4Vzh9j>WEbD({Z)HQ>uZv-UjOPd8%lRaJ(rTK@3fi}c=kxN;?a(! z?^Ts|IIOCjzPm2xWYw{``7;(pYA2n!y7BspYVo~lR}!vVVRqR1FyQ>LRjMDAG(66q z>(QCD%3Su%F4vsU*$ZMid|tAC=#sy|Fwtcj=XK{_H6kzFWKLC-pWDO5_v(d-{_kHi zY{gd3lw~&+vRuHlC2-!{4d2qvK3KQ?Op0>gyS=NI%D##2%<68`?=q-7 zb*CTC4(~7GoGn>==ki~nJq+!W@=Cw*GOml_o?!c?;!KYJ`x_V7M6Yw)nzL+)+Sz^G z=9WA?PxDUXIWDQn3Omrvb0O}^4*jj~pIzC*)>e4J`1i?Kt=_W=o{CGzzRsDuqR4XA zi=7Lv&o<1}bFh2sw*7SI?YuXii{3wXl#e&JP&SWFY0%}`&v4PM#M*B0o3FDDZg~B< zWkFo=1IMaIb&>(=BOO0|{o5BOS$opSrpL}PAZ_+qo>`{tH#(YKc=9$R>slV7tf*Y#Uvb?hXQ;|KMHET^yk zT6+FYT{vf|mFNqXo~p%CbNfCQ%wm)eKR)GF+)XF{19Mh!+P;w5U6ipd?0-#eC_^Ss zXkJ2s&BO!ztF2Wcd)`>F2KOvowB0{-qK-{A=hZVBx$U3cdzD2koSvkId2*McvXLmot?sP0~Eqs?IKv%B!~Km`GAXo#m^b8BgnyKb+d@HEol~ z&XR~}uk_>Q>H73(oUr9oBrPT#_it+LyXY|JcRZ z=>^l9)Q)IgPnl9Xr=eic+_09aXPabZtofkRwlpAO{=W6@yT#p?DfKqaH$2gqF0yCK zR#92@^_#>evo#y!v3-)1@{C_~_SN5YOY5)P;n;K_d4BA>%Qh$4W=uL-*=i~AxmJix zck@{S0Ye_g=HNok%ZAHEm%q|E(Kvah>e2608y42Ry*^*L>)%yL=6|o`^*YoUvwOlkJW| zz1U5EgKTywJXkct=Y2BM#2#t?&n`bjxz~S8^X}d|E5h)5$Kq|ey*j<$_SMaQ*wrv2 zvv`v4an1XU+^Y(uLXS9h`j)-f8vH2e*UY~sHeQ&Rnx?ny-JV11d;%XFlRBFuvtO@r zSqzUK%VUYC2Zw^?F6$QBn^|Q)S9pBrJ%`)-SlRumAsU<;lmbvS+iU zq-@lGKIdw{IyIkbPoK<)m$}+tXk^wW5%OB>aNLnUP7YTkJl}47WygHz9BU>shr{M) z0arhLeruDIvGnMRYByukjB7d)Ek9c)_~+a=?z>~>SY3CZNL^vYuWrUO+m6gJsW?_- z%`hw9KgHm#2?NiqSjVI7OBv!fJBMA)RNl3B!KWn0-`DxAd2$cjt6cvv%_unD{@sJ! z9Kq3V=E@meFtLtGol*b3CZcd=r2UfIhDM=mmY&&p5jUb3HvHUnYfa@b0p(@wsVQb# zl$V<6D8K5Qa^0n+Ed1W;x_1wyn!gGMg}#|5lx_G?G-ZvvAw#4@_QvXE)30SG`0(Gh znRv%qc$1le(T1`Ro~T`}R{|I2I88Qf_Ec8?x=7m9(%`@?LH1~AopbG?LT5`Zr$kkz zG}p;J$YRp@vYBz3wX(8-+p%M%mxO-I6BJ+kX8kOwGiFP9Z`i5s`I~ii(d};$_Ii7( z#96m|ii;997u~Apc<;G@TiN}Ev$GW#s-Ls9D4e_^(|D4N^S>(7>2Af{g6=c=rCOAZ zyop-O6rZLNarO+KvBAtpopR>9J$DyID!-Y-ZSi%=lx34=9!}~0ut(gygS)@l{;t=g|8UCmo5i37pkzs*<^ zZSyyPJ?YrQ+1WDtHoEOkvH7ubXPaBs%oCl~T1TR_?o@ming3(y<`>^sB&_S)n{Q4# zT4es{;`z6o3sz3%|5Ukt24jNFpO>~@ybbvndGabQimX%0ng6Qr6XVR3oVgn!-m%W9 zaO5>tz4LwlTdzYGgZf%#$D296Q9fs5lyKenjf-F3;qBLM+?Z1IW1oH0ldQvG2Xysk zGqBi{=C{{9G>qLoBcEMn_ts+zpNB@w`CReD*xScUW>@Ng&f7BU>Tg<2TOMWe?6uENv>c{$6SBSt~8;XMg44hrsUF@f!OYt(T`ZU4C2X!j@O* z%A9s=r@D<^jq@K-8+Vz#TaP`A*0Est{{P{o87cyKHJt|Hhp+RN`Ejb=yVjDtJv_oX z?ZR6_xxZ&-q$g_V9C-R-!n$vt{(RnF_xOL2#^it^yXA|k4<9J!j-O@pB0c-mJchv9 zkGZa1?4kkZU;VN7H0o8l@$&nUBCUzhCj!1jP2Y0A!~Fjb!J0qedK|YmRJ;@vm{P8F zt1)G5sITt5AMtVR{(tKIJImsuCuC{0NE#ig|K6=ozy7@W*T;vAQru!p7v8y7^Sod7 znEc;EJ15>rVg2a;Ak}EOg7V@OF8?y0OJzSxjnPnlw!+BAcDKR&skSF2&IZ1E0Q?J$w*Zr+jCw{u0bxq#DHs#}??du+T|F09zbIN*TbZW)sYbq`k@)y^1 zt2g~H%g`znnU-NJeb>Lnyl?l(Q^gym%KlV!;W$$e_R-Iozq#=Fztmsf{-57^jY(kr zB?C!`X&=)W{}iv@aw%o`+^VyyCSBkUlhS2xTghn}*RR1t29_ZU_uhEU5SF~8 zWy{qQ7kecircGV3?%T$F*MrK_M0{ipRts{tI$k-e(P?&yw_vN#1_pTo!PHeLj zaZ$We?&+kui|dzMzA@`qT(qO27Q@~%leaHBQLh~@`E>H79U(@i+0*AF zadCe<#&4S*aN6%nnqE-H4AwbCRZ)`K+(#^KzHef3Un$;GCsL{68p*+vojNOFs!mc? zB*$Gpf!#BXIO|)mu2W)(ec@Os!n0uJPMK*zRUB(HjJT&QQf&I3bb0Qa?BvXZpiQ0H zsmX1R%C&u!_o^i?{myIKtfS1c^#8#V-%7SN&91BQJ-L75-N{*tBRAiS)3JT;vVv1K z`EN$=-p|he{wij;Mlen`Z7-86a&rh`dZuU9$E3GfnD3^Kk60t)rArfZ57^3`-^8&X zYYOM8^_^2Dq-|B2WW%{qA!yYU6{e#({|^3^m}geY#$xi-_0_M#zayH(-v4^J`T8}9 zg4Z9;)tNCriVIj<%k(Ya$Ip}VmrLsj8+#np^86^u9_RX?@=t;42Isdsw=%7kn(f|| zvhmQPO;aOUzgIgpJEgF%FWn*@b?&O$N}cMv{Bp-W#~C)~AK#fbWewlP$5twOI~K}s zeWp4ox2J2qPSKrdH~Lt8->KgHA9iTpm#>|@R#%j~&5kaL>bS%-QM&n4PVy$(9TiP| ziBp$ds<)Oby>+T5&wE$nQH}i7P47EYHL7>GnJ&#y7i$moE?my2a`lSGRl$Z`(<*JJ zSl!WGa%J9{=t_RB*K1r@x|?lQ{%mEO?5tNWCeskUw_3Km?zqU?b?sMuCEJQ_uvu#D zdAXG7bFRyNj)bQMDmx2|8djKTU0lS{xh8q3a)fbI>(iV61OnIh&gzl~^5FPnJHf{{ z=?RZmRP>$4GtC`d{BoYYX6d%sG1a0B3^gy7Z__(!sCkAG-QwL7uVlFz*sWYL+1;#@MO5$EtK9dc$G1;CSakdG zy6t%iEDt`Of4A`3#)XP0=WVV_1YTKsbN}Ulpq`@VA;BMHkQ!)H8m@(bxqKT6|+mb^Va=o*%9R%an~ft zP|bVE%%aZ;vaLV!c$$5CT(#O=y56bhvunk93w@lxXP=ZP;KcT0+xwdbjN_vpy-~KE zWvYF7dfj}DRXb{9R4-xyFhkg2aY0)E&vaKf{T(O7_x73(0 zHDR^Sq(Ye~b@NxBogtQdY-2>+5k1Rm1!_Me7XO`*9+KUp-;yYA>RtW32Iu3 zW`(Wos79CClrOH1ZJ}vzEcXER#9*HVGHN(~MlSJ)<*Sv-^r|cKrIzM`IQT(iu zDvurP)A#;n*z>ZTzk8!=*i^$^vHA+LMgKM4n4}qT%~Sfp?oUgm9zEL}B75e*t;B9+ z^RPPOd8SxXB_Tk^ieR`R1PF7gIK_FuAm);MkS;$T^BV>s3#7_Ad4@;&c?} zQSN`{;~QCW`8{X1!G;%tao?_A+gNwxP{dt<5W^i!vMRfb)fZn2oog-0_%lgRY|^A= z=k-r!EclWiopSia7ImHjuj>k&Pkl-~?i?)PBRnc<)a$eR6$nP0(Onq&1Ukf^cmF+mBR{sIp7! z8MB|>zR1d<#nnCiSY3U^(ySf7L>gA_XZ-VE|BZcb)C??>?n}0JoSYRSi9y!^ry}LM+o8yJl>c4dh&jc^OAMxbL)4Q`Z+joBP-kF%pcU0p4 z%9u&&;-^g3ZhS7zX7m4P@Scyg?Ms);IeBunk8h23|9fk}Pe<$y`GtI2`Dj^`|ICxK zM8oHtwm4+CnWNL`(;azM1DOfhO$)Xq-?edY?N+*e)?3+2x&l9?HJp5y-C zdb^e^FNwAthj#mJdhlRzO~*}(meeQDIC@spZrjAsyNdJbFKxa#$*+>QoC6fS*DngVFtuiCPv|Vul}~yme=KO}=~9mlGIG6kQouN==l!lZ@1I|_ z`MX|9bjO~1-)DI<^31(mr*3?I;+3d9XL%l*3Qwm445WNIhWE^(*N?lbg?qWm$ixPKivsk`ihvS~ssq*|ze&kh=Uk0ozSW zcNE;{zH1liSbOB>a`vUn#rIYu1xRUKPTiKaQsUAhzdscj{;}(CiUwb*$~wMEVI5a+ z#QY02)?WW#bI;6DS{%}{Y@;QYPN?cxoukW&>-ai1A6#|Hc&g;pf?vPa-0DxS{*ahnJK3ASd(y+R+VI-1jW;)ZnCmu4bCE;I3LgzWc=8qpeu zb6947c>G!^>gmn~<}i1hdTD;IWm%IdZY+T9l-ZaVxqkdf8AZoi46R_hdrwKB$? z-m49@V&`_6*u@(E73nVM%~^0artDDG*(Y6%26gd=+Jvqz2r95p{=>?#t8UAoM@`}f zt}}uR_^$Gy|03M(H}W zx*t=Eb3fydd#^*td&7pM-En_JgE+FZc0US;Xim3d3MsRzYg-vq?AIB!t{~@9ulF*C zFa1eJ-p3XhUA`Ls=e#E?1H=A*<=ZwL_Wc&<{iI8QIX`-iz{`O3*N;r%(lO6w+Vg6r zD~HngsY0h0MIXt@NtEf74Y%8<8Jv?FC}jTnlK=BAg;3t8c}veOQORjpWIuhA&*TPYTYi2)uf^bR&=Xto9jVtyeEiwS2b6Atf;6)lU7!05@&ZN%!{5ll;=n@Ve)P zfL8I!Z*z`y=q0;%t((m;!7HoVG%RBiC;#15f*F;ey*mFMST6p$?xy+Oi|bX_xz76| zcwx1Lw?tV})YGC#ZhS&JqmgnFEs;;i(tCusFf z`IBl>isWXLbO~(MG8R5>^5=?v@;?8fd+{=kCoe^=iZbqyU9S@7d3u4HPLQBbtkJ7! zFE3gDdwBIe!@S9w2l)TqDSPx}EeGpUl_Ou-9JXejeic6{af)rIsoM7m*96+kIPQku zUlnq0WB8Ff{e1c_&&oy}%hjLR(JR4Sou6T;eoDeP$imb6qD>n2r`@&s-P^M`+9YI@ zezi`Sw(>~NJi|!yCT50$t#dAUG9G8FxLUsc@v_}gJh^8wT{>+h8Squk+jQgZ5fQg3 zP1+&6D}Q=A?0)+>;!HxyZOQBa|0h%O&3xH(B@gtLUn`jQP+aihX{Hs|c$T%#bqno| zcjjZ*=&(00Y)#(Z1q|u-_rAn^mfC5+S9*5G#39B4lZ^WozFabgS*7NRmDuyt zxm-)cl-hPAO%!d~^Sm_I$WZ5K@6$P~`ulH(s0e0yomBNTYI~&-nWZ}TNgd*II+@HrtzfWY}K7f_Z%z! zMPFZfC2UEIi)Yfst^W_7Ib%?}?`j+4)}-+woI;?J?kRsCW=A2H|q zAq$nvbhEz5JrCQjeLT}FyG(tKh1ha4zm4*IN7eeKDA<;*SvPT&!OWRb$}H_O4kdeq zg-p4gvo>H_`(B2yvbayF1*Q*gd|tzLblLfR6^eloE7vHhOy*5B5z|xn?Q0`ExoGF> zqhGdh81TmanVy#fMJ#Nf6w}DS)p?q&A-a9Ebnc(cvf}Fm6hl2zmO1_ceTkUw3cng8fgjk9b7ZR zCqz^(uI%WOj=UGnB4{JIe66qV1B+!E_Y2Znv$RzImRwHSDf_{F|EA_*f8Gz`Y)AAK ztjb`uNvS=vu(!Zi_IJ{sobEZl42+Ys zoaH4D?Y#1Qvcb|-il^+elsJ{HXf>Pq?f4zAbH#h5U2_+(Eoc4a;JTGL^^N2M;r&H| zlS@}G63G-^wbF5a%AHTSy#G$|=O!72HmvSFl{&%fpw;3O;kWtPGt&ync1@UV{7{Bd z+*3tPXg1TG-z!zi^pC80=Pi0R$-JkoqjO&G#RFGGW;0c13NK36DYyN#Qz*_P=gSAf z2W#ysIX3g2+LlqP?d5e_;MK~5&+D@FM0@*JU!8s_d-934#~xx$zS(Xu6OZ=_PXEKV zK3G_bRZUeo!14CcqYdl-zH^F8)@?Dc7vH%)#O{>P6~ls677_2mXH1Nl=J0$@x#NjV z1x5!RZ887d)As40+xbFYzw@Qs9}dpHv+Ikad&5697n_+u)qjn|7Bz$@^?Ew3JilqH z!RJdhR@&#bw4C_6LU69bcIi#bIYGHU=cTsyD?6M#sx~G0$P~lr44YRee!cvB&b-O4 z_JJX-b&Bf3HdZL5LQCDkYMDoRb^KA0=>h14dW$13WRD=1~zORc8_P?rCczke% zCGXcW9qE{j zrz`6JTEoeB*J8CNDm?afm9^Eb_#MPX(9Y?*12yII0l z%{A_4Q7UASbM_Nb2&uX;)vmE{{xtUrmZD;B>%^}8laCgEn#ef&xDMalh=*^I_b&Km zo1A-jK_1VvYOhdThE*>lw@rL*wngxA=}N6Ni+OfAK3>yUROMmTNdBzndDz28F-B20fa3xP~nUv;&BBQDM zqLxX8^%_W;-w%EKO#F&P&EBIom+#TJcjAUk-p5_#>zkDdKISyMcgsEU@_5yoIeyc^ z_82LvGy90-_;g<=Pky#|_0dn!YYv#k8;Grp*IeS+>V27aw)^CzW=vMRlQzyRG8EBC z+kgJD-w1xBW4;4~_aI757)GPoMLy(tXR9&V{|#8(*3xEmP<)c8th( z+PI{)Q?u%qDs#8V>9FpX7mV+HQEvZmBmDLoxyg2aEi&pO1Acq?91mStB3_lnCZDln zTiC75?z#Rwt3KCg%aq>dn)I&v*zEcgVgA}O&Ap4YUas;o`R8}mD@A1GlEsc%%_W~z zy;iN|`24nExxCzm7kl?=-E_Nq;9F})o#LS-WrD@lTPkln(tUsTz_q~cbUE1zx~f~I zGWu+n(VO?l;`0=J51W>}a}__lW&P|Qe)gRCCD`;=<=5ob6FtopTkAh@9hBu&rSsw-=vRT*argf1TW7&sI%3 zeahmJgyWmJlUb+qsP!o7Y-2t*_sb2-<$G6r`}f?h%BHHme|=q%Y(fupIR(!HSD>$AMFsy4ndzwy>}rh*EC*qn_#$*d)!LetL5aLXUF*;^<0P;E+Q zP^fZ)v}RXcj?!P1N#S;hrDrsbtXtT-LhX{D!K=ZOKZ{&) zd$wC6Ikxoc#?F#sEncz#SGE(CUUS>5pOm8yp?nh;lPx z+$|ZZYM5izzPT@F`ZyL`jsjL6}_c83+ zl~ic;-u=hqTp9MI+|pm&mw2-V9b-5soV38_A#dw670yMkjyCol*Rdr zpFv$B>vaw5c(!|A?ce=z)jRmSj;o+@)rW;s{q@`fUT&5ydz4#t)@G7y^S8=>3pLn{ zcdee+d`#;QzuVTl3-6BT*qwZ_W?t9^mY`f)?WvQusJx8om0iBkenuW=uIYV`UpxHN zMfN>*DwwopV~NhvWy`ePL{Gi+w=J0^bYqr*&JUsa``6rA&3(A@lGCOakvluA&T~h~ z7W*pBKey$+(qm;q##AN6hpX*$eYTcGYo07#Gfn40TH4iO|5d6%|Mx%jlbGDQW$j9J zhuz1${!i69bK}uom&7kqPF1U~3@F%=^e)M?PA~UCr-REW^Y5Nh)7=jk+CIOd^yFiE zSdH7aOE23Fe_C|iH_c@E89_GDdF>tfQ_fufJNv-ye;?1q|G4#g+6@MV2hH`*1HMI{ z?%x06==9}E%dSgKYt>yecVED1-)lV6tPiR3*NU86C(I@znxg%9fn=@2{5MPfX3Tr2 zb!dZ#dD7#CIyv`80S~4oC-2u<$HJG>J7>!7{YN7g*1fvE%$?^}x3cxxl(v~(roXkG zt-Rh_Ay#$n+npsW3l?@;8kpF=&q_+!BT-rUW=ZO{wNFje(-*WfUB8^t&>2&Eqs=JW zP=A$|)>4VE?@vGdeW>ww`&!PwaT*$%XBACZvuVom33sM+tSh+OC%NL#(ivV?+YcS= z{5CN_BIJ*a_>RDf)k0k>^1h03JXY)bWV}3Ri>maOl)FhA-JfX09BR}wZ!G^md2W7Z zY5KlUvxe{g?i{r#zq|hjV?xzjMt1>;|HWT=^5jC-s>@fcPu5-k<=(&y@34iEJ$jy%>O2aypKtoH8=Zig#MB%%Ash()DY}+KZnD?O(2EviDBFGAZvC z35mn&cHL@W@(HnHn!4rXr?r!l_0A*|cq|3c`xUDuBPYdJ8o?=pF%kf_S zsKak_Mx|fVqW;`3l4fA|bHLtqeQHJ_)07u0Ya04Dg`EEXm*e~CN1Jn>m_urE%mZ43s-KDOxn@uwczT%n1&-tK4JII zFL>ws(k@ZNYmd^bd)c8G(uyiys~0~q@^xLoz{r0$!S&9O$IAlOa+kZTau4O_JN0?` z#0&N0*z>yn*3Yn*tov3951y{8 z|Np(eq1|xu-<#_c1Ru($J&>I&xiDJn$OO%W@oucAy-XLhbf)<2C}L`RdPB`)23zVw z4legQho=1x63?0|JpKIb7dtdos8+nH)!(@K-fue%N! zq#x*%beGCj+duV)XoTb&mCS~PQ>QGcZJw`v|IX3si9J@e;_eG0W@)|r-sh&jI(TBO z=`DA$ayzGg>nySL_(KOQLwUdE?-u)WJ-rPtF#7n#eLTEu2%ytu-x z_w~@V6E%0NKJI)!U1;K6(T2#**vP5pqTD5})Xg^0xT>jp)9S!?iRu@Z`gp7iBf1>a znhSngaOWv4PslXWN|^OS@`IgAUFw$=qRw5s(yB+5?r}Bu-QS`jKF7_mYlZEf7J=%I zDjM^nXNgRG8_A{IxKDqQpn}uFEAw{VI~m1)vutaKdOOC;*1~ZKNr#c?v)?vZM3-PQks|RvqqhJCw+3x z{Oa4x8WxwB7V;?2u!*bjdm@L?QIBi4RNXejueda=ZX8`oN^}KY*PIiy=ofMc1_*WTapai zK67Vizl+(j)6->BrCn-rb^c{9V~SYG zR`=?~Qs?h~UAm|Km(g8v;kWXNv)>zE&NnKsIlJq!=J8k3@oOb{GXKSYyBfmw_=D>1 z{_K=T7tXtz&N5WFl04V4{eVT$+@t4?T6lGpCh{N7c(L)7leLJn@BwtLDFyHc| zVYU&!N56jf`_01X3AxUv+ghX2OTS;7n>el(Uw|rOz7x|ZIPRo z-R^eFXGm&T!{`*_`nWiLO`lQf&of%9YfoFJ{rDoUXSii0`}3GCY3-MLUrsR!^RaK6 zCaSVzs?V;Q%N%!$KfE$!O2-44gVzoe=|8)FaMtXE?8;T;`!^jE=I6U%DL-YK&SJe4 z(E_5~x{0jQwRZ}+?w-GV=1+;YsZvs@o7$#Sp6GbhD{AxMSNZyf#ruuJeVsg2_uM(V zGe2dLfk2YcG$)xwr}|GGKaiv2%E!UL#L?I&*0Z-NX`Azdxfec9;*Db3llWOP=>r6U-?5ZnKM+isipIaGW(<4peKxkf{^eKU^7@quncNVWaH=ir^y~a@ z+dhc)@n~&fzW=87j`>G}X%3n$U(P>nyYXG-r`P%4UVl2%Z~ypGzUTS;w-5ABKm9QM zMO8kdSlt8ley)>CbC|shUY+0c(fj=FDS2OUZt!Cg$T?N5us~GsxS3@vJ zP0o4-fr3p8{J9$#_%qiq@TISY;EdG_d>LyHICBjHf7V(C{%j})u|YU{9Rq*CMh5=k zEe!nm8yWbr*D>&At!3Z?nFYciGe9&*ZO%Fdeh>z!0pYB5VDlye9H!%p5ZUxgY zHT)p6LFzy_XB`6{2Hs|3DZhl(m{c5QH;V zGYEok#%cz^^wkUkFpM|;p>YpN1L*Oey`DiJ9~A%VA@L86cTn7eFfsAJ798*VMVrAi zBL0!m0Iv84#VaU|VewzGh4T2%TgSi$!ujhM_~3Xw17AJ_4@BHiVy95%S_YvkWW0t! zD02;iASnJpaZXD7r>$b(!-)TN3n&_ge3oFm6Sh`okE5S9k;#y_O&=ZD5SDDL^vS1~~92WTCUwT?jmRQ7}N zA-4Dji9s<&{KM*m-1XqR&ku?lP@V>r|1g}n7E&L8(hSHBP~3vz5~L1O03^1LZ4jrr178S|yAG#1F+ zV9b}Y%9t+=B)8I7plGwPK+Za_IDh^Ih@P}n#{Bu~jl~wOHOBne>x}s`*BbMsLD+m5YmIr6R~n12x&yWstR{1Ba z@;q`nK#6x){6lGwdXgfEMvB3CJ{uJGP>fRUL(>9Mx)4lTVIr8iYO+Au>dyihtN#mT zt^E(8`7>7k2jjHW|M^o_{pU|z`JWGp`Lovi2V;<$thN97(^mZ#$lLIrKYi7IzKk{h z`Loyl=gV0ApD%L_f(EI}fr>-r_%ql12VsyNzVy}q`Lfsj2hsd_>;LnC%mB&ftozTG zwe~+>)*6U;Ao1LF|G{cN=I5;Y&!4;QKOb1#n*aQT8~^j?t_6#M+`$hr6C?*x2QnAN zF5K{+zi8usK9Cp)7i{>?SGeInU*5X^d;LnE(ikXhg2X{MZ#^WPfYJvDgW?%PgD^-v$ZU|BBBXfF zT?>kPXxdl@P7l1f>vnLbt>J-}`Jg&kIU7AUc1;S^m;Z47`OK7z6|AjK4aSw|BthN7zbJzVBDc<&9Fl`k${)GxQ z{1;4L1HquOA#2TlK~UU-%6L%PNMHS502KcqcJ?}O`3;Iw!Q!p|`9bjxk_U-rtO1uH z0@>>zbpt5QGePRt{^!p`!r34;s2o}SU$AWJe}RH^|M_#){^!pF#WARC2c?BI{{_JL zea(M9P?-aYuY9OFP`rZGgYx>i|AN&!z~z!a(Z>J$h0r(#nN_g*!Z6h#D}I8aC*pF|6ibL$A8|Ob&z;3-t?cZ2!uEO=gr^npSJ*n*XMxCd~9(K zss~CoG4PkuCk^m{#%DnBkAy*GfFLyfg$ve$(!d>1+=Jp;7#!#8|BK|U|1VOo0bKrr z;xT*mfBwu>|M@dk z{ujuFsspKo#Vtq=DE`3l3`rCGIcvaa1e7iWiZ=WgC|Lhr0Ay~~YKR@ho51qmdI4k( z2!qm1-unN7fZ7SrIslZ`1d2C;>lBcBK2RF~l;=Td4iex0c|mQ1l1<BL-N01&RPb+;!O;~1sneh=dXv9_t|Uz z3umqQFH*PxjD>U7f%%f1NB#?Et^O~Zz2?72-a2sF5C*Bu-|$~Jcg=rrn#f%9AJkp| zwGlvd1}H6n(?;g%|AOhO{)@IA{4W3sdr(|wulX+sN;jbN0;0iuP@4i&SFHLkki8m$ zvsOXk8yfc_9S6a2D3G%TViqV3fbEQwgM=P7H#}5P_hYJE`aI;P~3yslEM>? z{TC?T@}Cb>CxFTfaQ@%)pRaiHe}T&F|M~Ja{^tXwjiOEe`OCL}+kN2nA1L3$<9;)P zK>238TDajqxSYsJo4oS@&Nk zXU%`HwtfGFa#sHr%w6+eFn28kgVILUYDgK9zUsdqD1FuM`7ctp`@cZus{g|EyZ(!G zANel;N;CNz{!1*p3W@)`wg1JYocu3Twf#ST*6RNv9S8mkH|zqJAE0yvYIlP3JIJ2G z4gUo|@ee8kK<0NI0Q14+0;qff#e4pGa9RMB51_OFj%QFh0@V?qG60kgKx|MMleg}_ zQ1`+Ay!q?Ec^wqb{KcF9^MUFLNPPe2E7=UL2lzp01eB&KHZ$;*Y+?Yl4Iue`GXsA) zB>n{|won?)IQ65%KX@DkR1QGmA5_i?g6dvSISnn-!SSEF?!R!}hW{dxC52#8KANO zT1SBLJ;)4DSpc%Hc00JN5UStxUwqc-|DgO0@*_A-^VdPj1yDT!DsMn(0v7Kjo4|75 z^Z-f+#hd;MRc-q(Si1Q?sEr^{vKgHJL9`&Kdq)IKQP^dAxbn;H1apm7gM12l?%aNK8s#!lCO$J~+20RF7CcR_tM zPBmhSUd=?fd_W7OaP0P&xqN+;#s&!RcV#f3cE{|3wR- z@&z0IixzMEFPys;Tvvd~3lJ7-*bR<*uz1mi|5CHg{};|*_g^S)EjYe~^4EdO1mTj6 z;ItuBupUxJfbv`MhW~<~bXULozYr*nK;=~FrvE}Eo4{qdVBrQZEmXK3tWKzK!+)XT zjsJxzw*Hq~d=Xst3xVqNytV&@8~1?K3WCfB#dZ1S|3amk{tFgv{4WS<+ZJyEwbm`kx<^ERj2jy2#dopJYgr5f~4?yt;N)KQf zq^@xNf05G7|AmV-fa?hHiN_&rPmmlaenD{vYP*2z_I3Y-iZ=cSr5jKh0b@|w0qKRR zk(ht}zvSH0{{?c_fa?)(x&i4e0ks1*g42O;2_#(!6@$_Qq>Ug1N+V^P{|i9VhUnB2 zkoX7Xb5I!oY8#ep{4Y=rDJ#J30#MwSZ2Zq(zWF~NDE>j^OvRRbdc;3u3>}*HL2(Yn ze3_u}c<5M5)>?2r0JXWnVU@oD9RDCTC|`o&Nu*%ie-Ti;=C1uOmbdP|c*&;!VnrLk zSiE%8fAOLX5L~?Bzj*P6|6&E8vH&E%{=Zo9dT_ZQJMYYY;q2Am_9M8y0F@2kHp069 zA|)HaZ3SUaJQr>FFPyjbzi8E#|00!J{)5CoWdbPfLG20Qf_49e3)lS@F5UPaoIdi` z{Rfv7pu7(1hk!813{YHw+9#m$0VD@XC*U-&?!O=?o#n0jFI>Fwztob8;P@5-l{cU` z2k9-_{2#;@F5mQD7-UY-#{a_QTmB1`LdytHdl8ggKr|@6K^PSGr5peAgX4JPe}0e{ zD9^*oeNg=X&j0`U%QpSzEm#k3_kr_0DF0V(WdP-W!Ak121Hkj=&^YJMUc&&v;JLEX z;J!1cUj=I4g6hNUwf_YR*8K;y1wr8gYO{m#AgCP&j{Cy(|HZ4eg7Y{yehb%w;~5m+ z5*3@l@h%QhQ?e1PMl^rzf3bqK|HX^f{}(UY_#eav<$tltt^Y*}*Zmg(r72Kc7Oej- zQUdB{fb#f8a2^N8bMeOiA{ATygX6ww`uIPR$)|2fe06G(B-8M=@I)OQicTMOw^ zgU0Vb<2E1~)J_BC5m4R$4yIjMeF~I z7p?yr;T=|W-o`Tt^NoBoS}%8ByL|3%9;gWHOr zzNT>DhX0}G4~j!!ko}-I0L3M!yf0k;UwZ!e|H7cS2E`R9Zb9tQjgayJ6wf7~ zw6poYFo+FGAE5H3coSG2lny{~Ewk(*xQ+moBcON(Vd>?U|AXW}7!=mu-e% zFniN~(b{bgb4oY;mt1lI++PqZ-Sl6$dh36I(oJ9tN&^CApmyM9a9sfEBMMY(fy6r~ zEr9BPvd#Y`CY@mss6@m)wc}qP7qkXuEdxI&9e^-sJx$h{t>C;59an+PeF)^N`wzmP z_7$k_1RCE1xBo%m25RSl+H;_KzhM1;@#2mDC91ak7YD_6@rM5rr5pcCR&Dt&QMU2F zbkmOi(#<>nOMt{d^#Q1UDBt{Fylm5dvC>W8{(>l|?kL;*U$k^1B)-eH{1*Yqm2Cpo z1tOq0D+cB3P5(jluyE;SaQ!a|t`9c;2c;8Gx&W0^BA~QUy5YZY$p&ya0E$O28x-dt zbIL$@7Zi`1{)>Rp6-XRpHi!mcQ2c`07N9r;)d8S(P5T~jKLk|%fXaVikQ_)|1*lHi z3Qi9qm0KZwl#ar!$`a9u72ivNmD;P{rT-27jneB*x!P&r?;{=fW;6aOVZ zWday){0}Z8$~J-945CFF|AR5eoQlo=#mYDR7cJWeDgTQ%fYSpk?nSG&{s-lMSe%KJ zgYq*d?l(fxM9HTAV6l=-|3T>k97mw|1m%5D9aFmvTz7-a0Hq0#IiUCi(Xc!Z%HyCm zKUgm)4lB2U(+H^UmzZ$^tRK{W0P6$Efz#5~|02~}|AXTnlqNvw08}=B>COMa^-B5X z|AL_MpkniX!OAWFL3tmH%eMR%tlA15GXnELa#fHx2gN%KliSuu)+b!H5fb;XGytLt zH|WFjK4|VU8#I5m>OW|VQ~)&R0UGxN)disOxZHLBg+TQ)s2%{-(FN=O%g#ObUldf< zgYt99hW`?vxCf<$(#`+nCL98{0VRqz{+F!S491}P0Hg*~|BIJy1eXDFi_Ss%h@iAk zw&lMFsGbMKeHk?GgW6o6cr4xsDZfE%CUGJ*=fHhKkbY1-FAUWKN-L1`u@T&skeqr1(iR29F{m5> zVNkoIc*B3GW#_?d1CU-JP}>63My%ZYU#N03xE&~14$AMKw6G1#7bx8fE+ar?0yrIj z%8SY^2C#UC(L%M`k)x6Apk%MN2pRmzr?+zs&4Y|3ykR{g-Ip^Iv-5IdHs#>I3N|=OOhiNZs7i|Haz&g7du8 z+*AL>`wxT5VX@Br|0U;~2FI0H)6V}gt1d$FZOO*}l1tA27i-@ORwpt0qD{O0OD#SJ)+180?Z5QOi~mLHwu9A4EjaUEa>|ka5`72%OHMobUt;oM zu>InF2mVXVJM~|*VaI=w`tARvS6za%4J)_&mt1l2zi7wa|3aYhZO*Cx!hHw+3sh|W zFFN(;f6*By!1aP~=f3}9i_ZQR1eFg}TP6!uZ)HHn!qkfYg7pl7`6&1ncpMBgcMY0P z1I>ej>V42W7l;qSpuRxf2FRESXgmPam(E}RUj)<#0<{5(H$m!vl8yhR+V}pKDBb*D z66Eiytzfo9$>#r3Ra^f{mT&zp2@)&Y@?WB2D;SHHZT=6cJ3!+^;I;sW4=PtdZH$u5 z|Aj#qR321p`7a7;6M)L((oNvDH)uRixD3?p-}GM?G+qN5rv~LokeaG(|3Pgvk?L*W zI$5L=)K=dL@3RSm_@MF`R6c-cu>OtzLFGKSj|pnmgZcqb3{np^4`eo|jEA~GtZmPK z(Hc;_0&NF?+9jZV0jOP40kUuFe~@0`n(dJGAgCSy<#AA%4=OXNxBV9cjVXe}D!2X@ z1mWs!HwA09F~G1;%{B(A#DB>~2BE?Y41%CE0K<9f{)6U51VQ5wpt2q`rwLk*18M_6 z=Se{GTcExT7#D)V2-Kef)wvu0OHDrsZl{TX%KwTj|K%5){SS&$2~a$P#@K4M{gwgIlu7=W}^ij9{zj(!#|8n!sfa`tn$}RszLGfI*^}lH4w*R6P+y0ByZimEU z)t3LFpg04?7byHIw*D6amGL08)!Y6{EjSIyui&r;wa2#n7p~s+U$|=9f6(}zFeolS z`k{OwP#UY*4w0*Z#Gl06(_k|}^);yN4pJjpzvDlsEC-bXV7hKQxGWF>xB0jJmj;y+ zpfmw8yJE|KQ27Ar4}$cA%n=&-1Liu03kwK_v0|Z0U0jT~2jdg+NL_p)-pfP#S*cFHk zn%@G=pA~QX4<6?NjfH~pKB#?LwBbLfT_)bT2hvvqwULWA{ue9V0FHlH84t?uQgu82 zOIAbjK8O!yS8x3f5*IJu@?Waw;D3o4NLmmF)eZGK{)?4w{V!StN&{Q}i&k#~$Gs>h z96@0X>LY^U8Prb%|HZlwK-zrekan18!_NOApm+tDQM&`2?}aP3LDB>$?!oc6 z1DrlUWdtaFi1i)>=TUH34;oJZwKqZbfX1D`>bFDMc_8=HZT~M?yB(Z1K=~h3W`Noj z68#7NgVKs<{r3N&jXS_>u=$|02ug1t_d??LzaWSPvTpl-iHa@%B|z#x@n5y=zgXoK2nLk{pz;6|f0bMRi`8rcV@SJu z%YV_D?cnw{sB8tb*+Jr z@k-F#H>fNC&4qx|$mah-g&Y4%PCN`Q|3Txmp!!*?YTJKs9c5pX>K zDFZ}6;{%{P4Q>Z){V!a)1&l>1wu0M;p!_ZbY7cM(BJ7XdDYP@3{$FXM)s%>J8bA*Z&KH+JK<`b@}H1VxTyz+zL(u;-I>|dOIW? zfYL(E_WzQgx&TDiZvQV;zw^ID)wcigb5H%3sM-!5O9rQ%njQbetDtG1V%vXFP(5F^ z`M=DxWB;XRpZpI>2jcDf{!1@9_a7AZAS|=u;(u^kuzc%(nN^qmi#G514@x_d3(x)+ z>pB3Q?*om=fa~U(ZU05;cm5Xvg*&Kx2bIa7GG^upu((jo4sbpNjmLoUEjZpm@d7Gy zK=BQVH&DBz9@G}t0crDt>W8YW|K+w^1D88up!f#$1?qPE7i-xKPD8@=JO2xV>ZK+q zAC!(j?E+960Tky=yTJ8;Fo<2ZLqWKa7V*ECLAVr(i#J+=#xg;3rJz18s0|2e#&c zB|v3-9ViVzFsROl*9D-oP`mxVMD=!X{7Zo9elXttA2cTb!qStE{+FF|5?n4w)bIQ+ z2Fj-(yUMrx7jNGSo(}-!Yw4vIz-a;0eiZB23m%UZ1H})hy#Q{DZ}~5|@XUX)zJuU8 z8=MwE?RHQZ4~lHrW8iepfmLD|BfxNY72AC%9T1wD5Ge20ZUdJApt4+|VJEmumulVfU!rcuf2pQj z|0Qa-|Cesu1Wb~)c7b%){{Qj|&w%xU)Qf@2{qoKKWv3te zFEjh(e{oRR(Rc8_)Rd#(HX^8BCeghg(s!@g`d@nXiT`4)yTSc$>BVRNgW6=^c^Xh! zsNM$dJ4!7*_g|!WH>3^#)ycIx{)_Y+fRqW<+re_6av8LC2vqii;u?+{c7pRXsB91g z#cAWN|6<_!WZQp<35OtUzMAd-L45~M+JvbC<$WP=834-Xpt4{GxI7SU-0@$eY1e;H zUlNq}LFq!QeXpTN^DYJu7H!$Z0K#NNI+7-l@+}M~xNNH}DD1%XX!%y~T&5tXZC|$K zzfk$s|ANJ!aqMmX1gh8_PU8+QJeY}oZ*s%iIs>DE2}L3KZYf#DD8pb z8x-%Lz9ASl?*gj<%XREE6m8wjfQ*r%k}Rf3#a0GnELyqM4ismgu@MjkwUt2m92DQ6 zb`&@*RDjaLrvKn^OVC^hXeUKcpZlHM*)XtY$ zc=|u6?FQ34zqXP~w@sLi(%vc?cxCxh4!3@*c4KxO_;aGM?!ub@6KXv|Oy zlukf(0;oIyjcfKE_zw~XV^ANUWfwS~gUkTMyJ+jK|DvGs6C?*pM<8=sc7ewy#k=+z ziMH)wK*nT6I+7;Q%B>72xMB-9{zXCM9jG5vz6IQ;1=Wq9_!kAWk3jJZ!k{%1pfN8{ z-3Q`>>Iu+X9jF}y>Zet21(*Avasb>0tlj=!95lWIir>av|0O}`0fa$uS`VoU#6a-@ zio>4$kTD)m8w?cB{RjVx)$aHYvLDp92GgK^6{wB|=>f$j2!rZnXdMo!Lt%Y4A&_|e zc1Zsk)JLxe^{u!67pe!1wQTz@2wD#a67L3$!-D4CLG!R%{tJQlpfmt#lY`oOu(lbf zP6oBfnm}>B101LDcn6gM&AY*A36#%4c^*{fgVGiVgYr0t2DuN6TlV}H1!2&*3A7CW zD(^w<0kO8-|3zD%X`*$vu~^$42C;SoMv6+Zn4(qN7*KHKHak#$1;;1CIH;WlDxX1l z6V(0#wevywzG3HospehaGC{C<`+wG=P5)VE9{g%Q zP5&86HveZR+W4OV#ID%-pP_IQ#LSXS|Jm1E`p=NJ@ju(j3;$VX9skcp!So2G!r7avD@`fZ_|3k3nsFQ2hWZ13+y6#qHPsi-GELaGKclUt#CX|DZMk zXr4l>WzT;RP`{*Q4>*sDweR^a+O`|a2BiT|ngXk9+xuUvYrnBr`(6gI4g@AE(vdWY z)oy1Ht3hD#n(g5D2lbOgKxF`EoCMUq2K7h4@xKk+)(4Gyg4$2uH8!9!0Mwoa&5eQ9 zz<}}}NDpXCta>ZB43=o#`CqJV$A1Y>d#`cle~IQ@|0O~34(jjM?*!*RP<+}=I{bg~ z!Mp$akKX^^z30~duD!SZcOSU(zjNR1|DF49|L@p)`+vuQ+y7hl-u&OP`{w_aJ-7Zh z?YjBDanG&)^*e9=uit(1f6ex5|EsoL`(L@^`u~cp*Z!AnzWTpp^VR=Fo38vX+I;nY z!Nx29^EY1ppS%9@|J)5%{%5bh{6A~cmH+8$Fa1wjbMb%bs*C?qR$lm@wEW!vNyFlu}?W~$@|3URVXv|ZzYBRY01(){?J0SCb^`JHYB<{sQ^?vhCa2gPA z+V!8Ua@+sF(~tgB6a4-A@Bh!=fB%2`_2>WRpTGaV|Mu(uo3FqAzx@33|Fcg&{y+Ng z{r~;9-~Qiy^Y#C&*I)i$fA#tQl^37>UwZ!O|Al8C|DS#I{{QKhpZ}kF`}P0HhwuLH zefRahOxvFStf09WP@f%?pIi3)2aVBy(*n4yw)?+G%dY?8pgas}|A8>5ZQQyC-1Y0Al$YGoF>FUX#YOlUv>5gHKQMH z*1v!M{{Q~-@BjB-fB%2^`TPHeZ@>P({qpnw%g;alKl}LO|Kkte|37&5_5aDkBs=Rg1Wf8^fV|GRF!`oHtWtN)v?ya3l5+@Sgp)TRUFWpLbp+VH!; z?RZf84TQzp_xuOd|B73#f#PZ{7P}vhU!3*|nGdi?)E`buT#XLFE8w9vV~@ zfYpK00VwV}_JZpJ=?Mpo#k=-1NOVJS&wk{nB#SNCwueCigj@G8NVM!`5Ubi^2g;kE zb{H6g+OFX802KG2e)2Z(_zGw}l_+TL8q~%Et?>fIFQ~0uz2(1D@BaT{)m#3H*KYj} zYU_*Df$D!y+=KEzh~D{MvT4_U@%kO$dO&XF`Ts1X8~^)mx%wX&RPDU+p8>RnxM|ma zrOv(oRoeIbSMA#SU#)u|n61*W`#%_W?)k6Uz4yOz`))8+>e%~VsbkN7<-P;|729_I zS7_h;U%qYkfBE*^{}np-f@!(dUH=uj_x+dc*!^FwbMJrIwmtu4+xLL;w{+W{|5B~H z!0i&rp8fxY8g~4z+I8dqwkIF{@4E5wzw6<9|Jgz1A*ihe#h`K@)Rq%(+5KM5}9o_L6?I7ikb)w7>Ls(U|!RM$QR$&S4Ys)z5{Nr37c&=}0B zi{Nw$Y7a`!I|UhYtKIQmdh+4_@@p@F$MrydRoZj~JP#vQyY0XHx=a5hLFu+?%YV70 zXaCDgKMKz4GILMITz%ocK>MEme4z4W z>Dm8+{RjVZgXU~z9Q!Xk>o`~qfB%91B1_Nw=dRiMpRZ%je~~p8|8v*x0JrHtY~HSY z|G7Zzoh4`g3rs)upSxk_f8NQ5|MSj1@t*;-W~h7L|6QMc{NH%#`Ty{>m;MWExbj~J zRIj)1{V%)j@_$Ltx{a1S|7Dh({V%=XG^Y zjsFr84}r&_WLI7IFE#hXfAP+J;5loVW#_)iiew05^|e4_gy4MKz6Y#EX7QQ-T%dMq`=0;XZoK@z=F+qOAxqEwX92ZsL4En= z-T%eg_JZqjP@V_a8JC1X{NQihoeP7Vq5qA7q~rsBZvr2dIqi z*!y3iYd-{c?+3R5B)Sj$2el0(diMVp@7!+;&ikM=FzGOZAwOkU7yTI*sP~8oZ1GVYIYPN#=@{&zE{!4+%ww7K0L2OW; zUT)6u|B{W{|4TMQ%6F;uJ^v*@Z6c5wP`HBHLybHCD{Q#*A7r-j*6ZMU05m7c+qm;T zL&5t0nP_Psd-K)*pfteQxZ}S->#qNTExY~;we0*a+_w9_Q2TB$AH)`H0*USVFWkQS zzxb?UkhXg3?*9TH_3eB9^Ml&%AoXp#|MNHR{LkOA3yg(3_x=|It>*>Rw_W@GOLp%E zm)FwsPX6a@+5KO-d*A=fH(vf+Ees{i1BPN{vW9Pm*_vp0K>>}Ne&x1?m_V{*}Th60@N-8jkkhmP<;llk=^OQ?0vf4-(&{{>oh{}%$`8OQ!Jly3T;wfPE4T|h49_us$&zyA93|KpF} z|6hOk`TzOnpWy!Ay?0;#-+J@)|BW|a{$G9d`TzFYum7t|JoKL%)Q0KY`(I}MX>huc z>D~W-)z#meZsC);-GYEs@9JF?H!lD1t6Ay#S0*KflW2p&; z7?3e?T$00Y|nxJpt3@$bMJr2_Pzh5K<%5(egEZ`o%;{!^DBVr#kRfw zc^Y^9=Wg5u&WFNnd;fER<^q?W|IgE~^FKowWoZD^=lk^I_y70*|NnpS?brW@@4x@Q z{pQR68?V0nzx?9!|MM?C{XhNm!~eq%-~Hct=gt3Jci#M8d+o)422lULbN_$&HJASL zx9$BeH}TN_rI(-opL6cXf4^nt{&Rrx#{ARZd@8r%0=V1Ml3r^dh{@tX*;B{;Y zYcKtm1eNQcJl=m0+?E5UgT90R#X;pn{~>Uh4_ZGgJ?Zd&Ne~}2|Ji>CybeZY%8~z4 z6Ay#>5ysM!4l^KQa^f6Wk5tEA2B~%!-p3%>w#QBiZ~m`*@D?053oktVzu>~t|Fh3L{y*dNqyJM*KKwuN_=Ep_M<4v}K6>we`;oi< zoA=-O-+AZF|K>A~|5xp~^}k~Gt^XyvZvM~MdiDQ=6A%8czwzq-?z?aP3xWC@pt8Ml z|9}3Deg9?p4}i^{e)`dWpXKNNbF}RKFADMxD6fP3*SjAa$Dnc=)ZYV@?;tD%ig!>L z^dI~$J>ej@+y}MgK^T+=VW^laDaSOhI7exFm-y-MNne1$XSTlj+?5Um6tW;5@q*oQGvVWnIgj|EgO+W&fW4 zvYq?D?Ril9TcQ8JfBC-s|7E-Of#Y6r`qBTgpf-8e-v2V)`~HKO z`oDDNzW?$|&Vu^0|ApK4{%5G)`F|2pzfZOQz<=(Z{r@FFcJ>_jFW9;7KSR~l|Jhqn z(}4HVv;RT;1&|y=;FQ%2mcF#;(gYM z|H8co{>x50^ndobC;um%di39W`T75xpniGZ!T+jjFaDS4I`CfsG+*6&@V^u&@AgCD z5EPG~vOsRuiT_f)2mi}WIr3j-@{#|NpmKfkk^j<@kNgMaZJ9}j|AXoPDNvhW5+v@W zCLIR%vq9?{KxqM_PI~fDV{qJ0J;ERZ#pJ{}vL4x<0}L`qSg!AYoeZd7*0~QHcc45g z)3YC3e}npOvXc(~mjQ)K*S`PqeFq?M4r2H2|1S>;r|y0KHMU>-FW0mGzg*ve|1zNd z*~CNtWkG6t5ByhNasIzV+aB=P0I2^b+_CRJL-qFmy~pl@vNaeh^&k8%wD#hEnZ5(y zau-yG3U=-N&rrMVf9}p3U^OrzZOhgF4Ar1MJ!nkr0Jy#d=~JG4;=l3rm;dFb90l(o z0kyS2ZEp|;g*Pal%FHO1(KrDga3jBVHdFTeWY|LW^6{|ojU_%GD8|G(1C zoBstm_x+chbm;%o(~ti5o_P4*bNRXd+@SIKo&*0C*IWeG0rIOag7Yn?{Fa$=_`mEF zP&|Xu!@>V5yKcheK=BH~ptuK@>ELv5_`mGjli)lqGxf-SX;67T`S5=!Fn#1dXsj5N z2BfDRHkO%oltC5=BgZ8+; z-2Y#u|ImNY?gRfBszC9N823?`eB?g|sGZoi|Gyl_%n678OZOl8FVwUDKSSM)|G7I* z(?HIS8(?wq`KSJ?Z@da_SA+8*$R869gY%@u_Ur!@7M}SJ%42d8XJ=Z#o^>5|3UE#N(WLC4*!>(dK8@B!SOix$bY%%$H4InqCx6F z7##N?w}Iq9^o(Qww4vNW%b7Vd86Av+fu-wE$ z4000=G00CkY$p%O+b&yEg-z-KSMKwW^CU5p9R$KpL7_!<_}~hs7#idaqPd~w4?u%wp{%`3)Fr% z|Mb6b|DpdP{fEGDBn%Ne)|K@?i!LmY;MO6!#2jbB@``fYN*a z0Z88KKlooB)F$cP|6gVCS#X?#$^-d{2mgc807y70f02z>!0AIC zw6AXBq5r(y`~Gu*+K}rn{}<>x@SmZ1*Z=%Ix4>}^BVK{#b-w-j|MKgv|BpU?|9|(_ zpZ^zLeENU<$;bcu9=`v-{m$$En{U1PKl$b7|DuzQ{Fj_`@YuLHS@hC=QQ+(*P)4=pMKOuFJt`V%pLFp!6mKN)OXP@p|IF{H){P@?T-` z8OVA@s2phQTyEyE|FScW{+FM9{J-jg)5h|%jx)&5MqqN{99fUT6lnZUKFlBw!jq2J zDNKRnIZ*iw+OI1+;n07DNuc}pfY08;s5e; zPyQF3aOgj1&Z6efz5nG0?*4aNe*V7zsDB2^zf+F>mzo4=*MZ_1RKCkhKLX0D|7Ah+ z)T93u=AHuQdD-d5!Rr>~XPx*j2O8T4iO)LmUv}p4|B&=>^uO#3NPbtC4N?n=`(ytV z=A8JiF#E)R+1ba9s=3Uf{%M5ryl;VI`i0n#VLotX#te?6+r4hb-=_! z|CJV<2DhUW=AZsAH~A>IO(Z$_FgP#woqPz3vi~a6j{N89*bAyy5JhZw1r1=o!9@@-+B$M-$D6U zZ1LIu3Nw%Ymz#0)zwo3(|HJp(`rmNm{{N<95B`fyIr?9G3aE{K_`mdwV_laq;Q@inEUY2jy8%c`XMnyN~`?n05R=D9%Cg zEI%6(-*U5$|Ca&fdl;U1{J%1&4w!N5ztX&u;4%S}=jB0hKj*}Mxmm~mE6h1%42pAw zxhEJD=AHy&vLYQxlj5|a3=n*TL1Eev2Gv=|>=dRR{x3J>@PAM_pfD8@&!D*0+H&o` z(zK)h6(%3~uQK!4e^A_mXiy!kGX3a(P+6cf?eKq{?brV+O+EZyaoW-UpuV62s2-bg z^uN~5oBx#;p8l`A;=+H0X~)3vFFxt;e}uR+f*Z(WbIQCz2*G+K09hA4h`4yTLw07Tw@{;B^e3r`y> z&O6C~jFF;}ET+=TV+=|&AXst6Q3mDd$Lt_^_Q-$5>BqnrR0o4FC_N~G%Cjj){)5zj z@;3;B(tz5m_4bJRhV%UyjPx~bKn1o zXC8y&7euH|KlWd6&Ixc|SzyA!|NIjX@xK-n|6O~*;jA+2#DArk$Nx)CKlY!YXFo<7 zC^-G-KPYVof%;<8j{WDKeB^)s*~kBzk3amMvi-(?@u^4uE6zL)&fC&6kN@{td+C4P z-rN5R_uu(1Ipf%WDNvoZ{5&}RLHRdp&#nJyyKersTY2HX$kbzCaZp@?%5HES4k{-= zex7~ezanV9d-n1FpnR^n`U1HA2E`+&K9QSq@;?YG&N~I(=LD)BKS z0HpyCmY;j#zw&}ppfqEwIR6xb;sOLFE7FlPsmwdcpbWxuPckUaIRPpI;PJ08_2_>k zP#**o-=O{ns0^BN1RS@Z@*WiT$}^7sR|VDg(~tgFn|=Jh^0Xu1HoGE-o__Sd;*6vJ zl|Xq6RIY*Y5h#479|QM~6=xg+_iY$j_xzuXwDw1B<}vX24=8SgCLH`PFbNU=Yi_*! z56aJ=e4#ey_u-=+g*nH;Wwz@4Q{X%e%GZkXPW)G%e-fPUL3vz$Hk3UV zl3qadBPjksX+d%R$^Q!TAXst!DR7w~Kl_BS(&94=N=wc%D1-3Qvq&*X9#eJk83xrw zXBbo$o@P*4aEig?!V^2S1*iWj&piHLch9Z=pu7w!2eda|{cn8g(SJ~y&|G!lzs|Pn z|JCN4_^-X}+<%ipcmIRZfy%67{|)xv{;#{^`hQT`(A#z6zs9QbV6$}g-1@J7;Ld;D zy|@3XE<68Ud(W-^N}%#_?#ch$8?OAHcn-1lOKZWY|Dwy!{#W04`M=b%v;X;#;(y(( z*Z(_#e6T`hT0%7yqm5zw=*l(P?lT>z#P;Ut{Nu|JwU+|JT}j z^}ptptN)efpZc%4;qrgIT{r)0Z@mWYJL@00|6gtK8F2lsfAs!;l@;gz%gsFj4rk4c zSN@wEfAC*zY9uHwV{4fT5|Tk$@N#p%FE6%sH`~8ptABjgX*da z|q^wn%as0o^ zEGV9R{J$p1ouE88`}lvA*(d%h&ph^Dck@+n+^T@Y=RnK?9=g zz-=o~`9I+_BF?nto%}Dg`U1FYmY9C@zu*)^`)|#ySN~c14}!x`buOq~bnL(AjHCa# zrylvwGv&yCAy7Hcd*FZ3!MmWShvSmNcmK11#t>$o_zz0oYI9Hh*IIb`zvkjIV81HP zIr-mq^~L{zo38#3+j0$DPlLv7wYFXd*S(;!I(*Bu|6yCN|F-~*Va_`CUk+5pgYxdY zlm9{aADnN&VkiHD^X&Xn;JmJ}A_{oPWw#1swn97*toBXHZ>v9w{ctV=9BneI%?n^MsuesQ!Xt5F3P5 z=AQVk4)P}`{N|nbuR8bSf7N*>|EtYE31)-R3y2Sj6Sa9K|En)J^4-ht|_xhMZC z%>n5-^zWRUb{kQ)QK7Rkt2^ue$bK*bK#6$l}4&Q_812KvY z-Tlur>F|G0IBP9F`(Jb6>Hk`b&w$eaD8HI7KmXr-{pJ5Yo38v`qXWoH>cX+U-PIR+3WFV+#dKzSa4Pco=4JY}am_vC*SQ2LyE^1u4R)1Yxj za9kVgzw=*p-YGCv1C6yVIQ<_~zk%4ApzvC7>OY9qT6^)o%KVf6RTiB5ueIbXIKL^) zJ^A0@(7pd^%P;)b-*){!hz|;Lg?Xp`Gfp`4f6|4gpeO=k?FFa)OMt>>_KE+JbB_NP zorM(tcV7QzoqQOapG*$k{m(k-(Er!peu4FY2nNs`+WeFMg=ZfB&p7Ag|IB^2LBeoc zcI^ItW>8;k;pzVthwp*oALK^Wg{S{J9e?oOdHtpTp3wLQ#ii!DOW?Xid-?hQK3lH+ z_uh2%zsaf#|78}O0>?8b|LPvO2hPKKNACXz@j?A$wr~j+W2hnH#gZQ8{p}*l0I9+HhhQz!2g46%i7oGyA z5l}h-=>g??^8XPJEX z|77I&UwHbz!nSMwH5Q%zFFEJLe-WhkUw`+_e~xKK!1+^a-6gQzho67I;}<;kJK^Ae z2GID>^7H>08h8D7--x<~1e69?ryc#Ty6)nCttDsv>#aEVUwz4$|0Wx*{I^(j@xRU5 zOaFD2p99y`pmu`B(zE|{R$ch-w(07Bw@p|6o2|JBZZE*{FvuOCw4$-*A~?=L;-Il^ zjTPs?@u_$4?tje{=l&}$ISY<+SiGyPIQL&=**S3j2IX^&jaR^V9u(&)(0B*YAgsRf z{C}kt=Z)1?o@YSDJOUw!duC_eLFebE`Pxaxw_|JA_aXTfEt`jWHY_yVO7aJvc`_v(w!fY*w$ zOga323ex<);qr6;B|-JZf>Zyc=AHO2G4BLCe%IZ3{hxjMk^jnzPXAY4cn{IST5{&U^3pTl_yv{O8p|Q&xGJdJUUv3BIBsG2cJZ12 z>MPFw*Isk+zsAb*|J7EU|F694?0+p#I})U3+1dXp%g+7><#!MblGj*u;lJ9-^WZk3 z`l<_Hz544f8*8k-z<`VqF-aZ^-1c8|hCvO47oTBJo`2d7l-^Yqo%ye|?A(7u>Pyf4*Ijx3zsSPV{}2B8OCYwfOP3yh_@8IqNpM`+oqYITd&T+x2CFar*I#w< zzxK-W;P}^Dcj-SUZZ%h&|8KM5%76P!SN|KWxd1MYHCJBvud?*qe=AUbVey&&rbq7m zR|Tb&mFNGfgXET<2j_2{4VU5Z4~kPze5!)tcIA2Sd^o5dptbSJf4yzj|EsRJ@E;_v z1xhQcFM`=Bpz?Cnh5vdRE*opCxyYc2gvpC_gf8_ZXBpsl=~)Jq#b@k5>0N#4ng3eL z&;5tRt;W(b{|z@^`LDC)0yuALE<5udl&?W)1e8~_mY@Bvzw!b&U09xY04`5K`3F?5 zX)J@}CGGWB{wps$^Iv<@6-ZiHdKTOkVxM{J|74{6uMaAF58VE*w&e7G#ieKdOUy^a z|K?{O|MSc_{$G9B+5ez?2P$WU=AZb#?(XaVk3N0>f9L(T|93xp|9|h}_y5m+|NVdG z!}tHULHPYQa2xUJyRRsTq3pzi|9lHi|5smg;lI|(bN_W#pZ~A7`oe$xH5b8r`!kQg ze9e{T|C_J7^xta3mH$TTF8)_ueiodU!TEa2)&DBX&;1AW;XwHt6n`KLifd3gV0`l7 ze^pQ&v--k+jWrkktFAi#Uwt)*2JtU~`MSGq{0FU@Q(bl8zX~Y7ue$_s)4EIlL1G|% z>T525;~$g;U>FgT(d-3_LA>^11f%bN_Xq zWh5w`L21Td&4vFuE6)E1wUbhdPQ&Ha-+TL?bJp?y+UqWX?b2O!0h~s}7M}Vqvi9PC z@vT??v(7yBpJUF6|2zv$|7V|d;y*j6FSGmRf8OQi{xi%t_P-Emt`TH#*@=h$c^8}n z$C2)ui~o(*U;eMZ<`Nj|tiJFc6!$u7F8()Jclp2d=BxirHeCL%2@+oglDhyd&q3)x zb;bGrYS6r@29jF?$-g@5E`#Gxb@j#n8fz~7R|DniH5dPb`D;P(fAK#|z1CWYybd`2 zFaB2psRNm__R@dVHJ6Mv)?Q>#Uwa9T$%}P_E{)~q8IZBclCyT;I0w~xApb0d#2F~g zL1lpMrpy09WrOajbN|8dz4AP`+yupg){67svJymt@+OD|we>)G0u=wCGy)o{0i`9w z{kOq+SYgST|6Fs9|DSQ~1t==O*mT{+|KbZyg3Xdybo#&aQbhc3eDL-^=j`ME&5zvs zZ?yi>f8AB*!Fg75)w%!Lt1tXl2c=1n*t$#qEsxy$4=STUaR@56w7_}p{D1BRC;yir z%{PH8tvd7gKhJ_w|CLvs`){!R(to|Rm;Qs&0tkcj>#n^B76Ye^b(g{Avev2#V0VDp zYet9eg6nH=zFvL)zZ%FbYc7EEIjCKzz6KGO8lX4_@z-AbuetWpf0fl2{%dc){vVW1 zKysSvE`ryUX{@{WUv1sR|JoZa{nuK5>A%X_i^dx3E-@fuL`;&$(pq_e0fNsnXs$TV zpu75_o%X5=|8+rWb@_R4yB8FXI-vS+`Pu(g$M1vVUmuj$SDpV4Dl7C?UjVDqh0@li z9{mUD0hs~HJL)UX|JPV~;lI|33;*@DUIWLg{`TwtHCCMaue9v!f1dd#|4+Gs$o~eb z&;QptbQj!aR#;nYKL8Ev%T@_(JR7yoO6!W%TMwDSCauEl5m7b2}W1f_wB(~tghfyOOB{#bkQ zzror|{~gXe{%^4E(tqO(m;dXoyYwH_9ss2cka-%b&;K{tee*xae|kG_{8w9b{y(Vi ztG)j6e^8$Q6z`yXZF>6Af6cWQ!D68Gf*R{Cfy;W3I#B)wr47rI55eUEs1AVOOaJvZ zUiq&MDhJkG`mY5VOWbtTSZl*&24qZLtRr-3ue!hh!&<8@fa4$3Z&3%eS65y5ufFX3 zf31}ud=4BRdf+&RvR9vnm+v~DItzqXp8s#M<=TIc8KAfag%v2wv{r%Iz90-T3sOgb z(wXA2bN|`rocKQ-DgT4Y6}dGR{%fo}_g{Y5ng4Pt&Vr%`j2GR0{hwj_(f@4oPX6a# zc>2HKigW*E_uTx?v*6@^{za$%3oSYGUuX%07GHhgzu@9C|Am*F`7gNi%zxo!Xa5T< zKJ#Ds;NAahi_d`P2P5|10h-Nc?MWxXhrv z5rPphNghjQ^+g74By609KH*#7kTEN`ak6= zBL5q%z3^Xp=^1eRD=a??E+1j>^W^K#|DZIm?!nvtn;*UZzv2Gd{~I1a@V1wq{%?8m z;s3^m@BVK9;Ro-)Y>>Kb&p!U&{^HaBO%LDw-}vC&e~|uV_ul-Uc=g5q$6tQJj0e+| zp!Gj1&iz+jeI6X|CY!GOH`#mzT-F$Dy!>Bh-NpX~Tdw{$-GBSP_WDcz&5qoIIYDlax({tqh8L3KGu9Vp-Hfa4vM1}=fsf#eNAb19&){tcJ^YpjQ0^>vs3 z>wx+Mo38xV-*olAHb`#6C1b6PR~WRBFnO_#(51Zw5&v4NFEVJZx@ZSV&!F;JW5vb) zpg05NV^BQ`YS(G6I{)AH>?3fQ0AhpUS$EB)|2nHL{s*;@K-l)k{r_MwP+AA~V?br} zrT-eMLG*?Hp#Bi3Y|{a?bv9l3&pz+u{~6a`g2Ns}7=Y@>y*K}Z%2$XWDAT}Z<$zy@zACv~5SZD1eJI&P>|7)(g2#Lcr zAoc}t+X|G&wLopFH5dMa$^#JAU2_3kK7#95P#Ru+@xR&bTj22u-F27$>#c`i9gzRl zT>7uQ?jkt$4Q3qOIzwF$9rybYn5$z~;l%Ia|Uu4tO z|Eg<2b@A2z2Ai&e%Xb4%UA!LD9=QBpd)?*###=!7^U{BVO;^BJf76x!pfmu=znbeW z{Wscw`#&h}Yp%ci-(d4qaDG-_f91c<#;gB9<$>0QEB`@h0@N=C#WN_*LE`~Bo38%X z2dUqD4cxah-gezsXVX;%WK3SHBXsGkyTqWg7J;?bUbF+XbHMo?G!C-n;(t)v7nH9- z?P~}=4;}{q^_BJ4f#f0WB9IzTeGh79gX(-x+=JRfpmd-Kj(bR-7Sxvor7_EMkHKq! zWslxNZU3#m^j`v0{;$38UkhYDXdZaQ`Trb?Pyd%)eg41P>I+~jv-13Zg*6xc%dffc zUv|~`|B7ob{+C;I;lJwo%m0c$RR=mlP8l?gzwXk1`85~8>Og!D2I)}($$|Qg zE6@KgMmvM10@N>9dgi|hxNN@yj%(LT&%o_Km&?z==>Z(q8!rDh*aRsDKxMVg#>?RO zUl0w(;JkhLKRB*8LgE#a9t^i!1FO^AaOJ%wf~?w1oe$q zjCD3&WzgMn4UQ2pNghjY(-j82jaL|SL3qOz2CdZ>?6g7U`I<}MvL6(eAPkCIP~3ys z2B0#);r!$OMxZcRdjZ@}GT(CbzboH~fDx9;+PP=8hn6!&XE_2#Ajp!O4} z9S+L-;J)z6i~l+2pGJv)!wr|gXC-KW`bD7l-vDY)gUZTF{}onW0AnRkpLqRcaQrJm z;}nz@K=B0P%Y(|V-M7GHs3NEh0vcOid+9$Yu5~tD1IMTOhRgre)?Ws%M+T)CxwV(T zV+0jQbCI9|q5Aw2aDPD!)F<3<`M=@DEB}o)UjA>m`RaeYjaU8~Zn_F)8-T{gK=PZe zg6nRhEfCrmwC-Ueq)Y(CsSc<<-v}z}FaNi?@C;lAz~Wwi^EGh!52AH9UHz}O85H+d z|LbhN`rly7bz{A4*BSJ;-(WD<0m0;HW(KmQM^&p~Ec9((X#bj!8>l}PJRK#r=t^5Vbl`KSLiK=$vx`QP{Qv;U^s zu7k^ar?XG~TkN~@A5_2F9lQVE^6)*d+l=?#{%>*o;eU{sp!G7==bwV}Hz=>$o_`8n zL!-6n>VK;f55a3tK;p)S?)^7A_Tazamg`_YJDh*^AEZWm>-GP^58fMt;@xo9O$MXg zw-}6f-$FzrnJhg}d9vv$gDwbfyuzTl_M)8@xUPnbap|qU_+N9)MQ}S9ly5=(ZBRd3 z2bAwYZT__vz-6KF#>-$D)K>zP6`;JYy$(`8f@t0KkbV&;UchAnXpU|D<^L+HFaDR@ zee3_UtBCO*P+iHg@YH{a73cm-f%`__maG5Gwq1jyDNz30d=1=g1Lb8<-q+g% zs^cLT)L#IV>!9);#0JH+_NFV~v2ak?4$9xUTOfH|bJNxTAgl$d`?p;Cue0SEIDLc4 ze^B1n2j%^pHy8|d-XJs95!!UtUtvJt%M4oUF4<{=%W6n@4eING;vLlQ0ksRjY|wbh zx{Lo^E<6GEi48Vf`fm*Cr+~&yL2ct5H^A*>-3^!j8-e@)E+en~2k}8|Wzg6Ns1E?* zgT_8YmY(~chcqU8_~obn8lXNGD1UCb`rl~tmH$SYul+aKdhNf(_Ur#mw_W>hw(a_V z^KIAvn{EZMul={$aRV$4QUekP#f$asoBz$WLE^}4`}O~3+i(20-g)!C#r7NjEqC1b zZ?o$rm~XT5#(!Hd`^JCk9XG&sfZ|Gg&BgycHxcC$C=En|=CD9zJjiX^K;;L-O~zZV zLCS+I*Z!ODxc*;v%a#8|Td(~Gr2)g;Hz9TV<}3fTw_N?N55hZd{I@yt7+kM|;ujRx zAR0722Erh=?p8?LgJ{qgg6_6!#=6_CGazF`Op?daS$~-Ug0C>>uD`;dz4o#lsILRU zdK)hP*9Y}&)?EVkZwx{GAJF*6#>@Xf=>Zhy1{)!953UnI?bQvJ|2v+20&W+9>P9f$ zaOJ-~xUGBnzdpzeQ2z*wul@)1k3i?eaW6rP@qog4uwu~og35*~;Iw24N{idCfzy)l zwrl@k7?jS8wq5&gvK$ct-)bBFy*z^;JX4T>lTM-}SfM0Jlv*@eShZZNL6s zfBOyayfA2PSZC`EaQhF`283bqay>#9sO=BO8?G=IZN6#;>XU-v9aKJp+PI*2294K% zXwcY)9;mM02q_yt>A>^q^Z!O0ulxt41;dS3!Q;Q6bYKjsw?O6prmNtx8q_`mr2)e& zkiImC59(8c`oSveF8>GB?Ly1X|8IQq;s2tC@BUA_{__9aNALenyYUi?r{8$>fBMZ= z|L5F!{eQ--*Z*hTe)E6EO$ZxK-+B!en{)fk|5;H{G_2HIl|4nw>0H+VP>o39iTxTmNz1;Y32#VwF z&@`|ek_N!>zwP>e?liXEsO zs}1URg6ecoeuc6@@eWD@APnm3m~XrK-*_{q|8oUg-h<*CgxxMY1-Fkt;~}8>8Z?Fh zYIlRmelXsA72IY5wevx3b5NTIghAsTpuU>;iu3=qPCWcCu=MPIKG1o7p!FczuKgEW zec?a|)-Utq<>|6*${{TE$x>A(2eOaBEyYt4>5_%F2b!hgY) z7yk=^?t5Hw@xS2ei~q&fUHT6?^ACh2*IoKAvG&q`kXcfjuKrite&fI7+DrdIb-&o^ z3;#iLHwvJ3>ZU9I)j@4MP}^h2_5T*2`g`}y|5l*(#LgRFzUhu@|LynO{BO4N1{hoH zy!qc~+x7o`SD*ja2ek#D*kIfB|GL|*{ntk-<3VgtA3=Bf_5TJtuKza#r4F!(L_CKf(V6fvRgTc<5189-Qn(^Uo#Hr{&G78Ea_F$=v-pfTvn z;PFjReCuz9jDLXYbWquCyyeP&!_A;^k1PMJ_uYoX`Nk{%LHPmPW&_m?APj9AS%S*O z%~$_}^FOE!1ZC@Ox(aUFfy6;&0vK<;3a<0OealUk|AXu{J#_cK&Zf)%bvIx6ufOHW zfBmhHwv;Yt{0&sjfcRUl{Rg$9L3Jyr%+v?fsi683+KvW=y$-0}*$Qe?gUVzm-g51~ z&C&b+LFx^*UiqMJPEg%&6Do(A;^KxUeN+T`1>fzuc$&4BDO+zM%%foMZe ze+^XbZoU5BaO?H|E@vM9w>^9hoR97I-1={K@GiJ4x88Z;lQb(gZ9GK-vU87oYw&0i`KWdf9#RzbQ2Cji9v2 z&YS;1@ouu~=6~HCH^AfQhM+P8inX_2H`d>Ig8><>2K~*~7%aEn zv;oz}ps)tTI|%E6$~{p0gT}W(`E1h_aQK4MfH0{41nLWe>IG1L&-v`*|KRxC4C))* z0N0g%;f{JDqy?-(=gh|F#G2famK$Y><8Kpgg?o+J6w+^U|~bHv4ab`;9JV zAOE*KboamUR!}{D9qcYpz3q1P@qf!*khlZa?K`jk54`jYoVIPC`Q2&X?f)RQ{hnL@ z9roV(ZwpE@dvE;*r2(7WxBgr1f{0n~xe2ZlK<0t!Lr{AFR4#zx-vHEJ*mVP3t{Z{s zcW7P*m-E|i{MQAw0e0R5mm8pRAH)Zx2kq_G4fS{4WPsos40=@P|AXQj8EbF6Zmqis zlz*;)+pVB6GElsM#=7)D?cS}|!0mcaoPhEis9$Ze4b%q$^~x_Ozs=!$|3US+ z2{fO9!Wop;Ky4%=P<(8;22LL!eIWAm&F7JDz+9b_Ylfl-59Up!5LK4-yBB(}2<#$o(L9g8TrI2k}95GiV$Dl>eQM-Uqkk zLFF~5O>YB=$DKF-+wQ*g-|P4TaNOF0ReJ8u35$?NaD`Cn(pO{DmTqywa^Ocv7sI`#`212))t-4c}F zL1WaQxB=x!5Ze&cc7c`yu&_4RdIhv50bCXsZMhE4x1cZvn3; zg33Tp+#7Gd3LYN;=>^3BNF6A>fXaUm?Qs0ze{i}0^{sbY2baO1bOVY@kiDR^08$4^ z2OtcppG~$y##})1AoHA0K7^DZ+pmMi_dss4fTkhS9oNBabWpro?!NKg9Nb>J{@-#p zB)-jeLCW;t3s1piJg9v4ICuwK$Ai*=?Y>+8T@Kv-?|k6)f4hCR{yXiz4bJ}#`)>aS z$$`uPr6c=&xBq*edGy}`RIlv41~*sErLu z1E4ekDjz`M4T=v#PNi<@f!!|2rLkU{KtHFsS@@*mvtcD8B9YLF$C)8?XM`?z{cp<ybg+U%YC=O`5jd5gZLl}N(Z_-Zc2dS9)zhC|DZUBVNe-h zwCyUWECAs4^y7!;SFcA?e5JK#Puh!0ZhbL|DVeg@@VQ2GJ&mmNX=+1iEQV)Q}1dMjw_zx-<3_$(DouG36 z)_(&~9kAyXc-|MB26jWz09l1Tk|t1|2VqFuUt<8#dZ2#x)~o+*jy?DfN~56i-U2i) zz5mXCP`o_a7u~vh&7&`%@49gVF#fKiZvm@E9xLwCXTfyLh2|J^`!GpKIgb@RW|sYl?t*lfqO|IQ~L{I@@F`@h@SNB`}P-2HD2 zN=rMg{kJ=G=fC~2d;dXkZnf{$e^+pwdgDK+>~;gO_uK@hL6?&c|GON%3+}u7-+cMs z?(ki3yxSZEmBXO6{0(rNd7pdy-+VWu%=bC>_`lWu+u$~U$B75vbOVYn$0PUtN8Eh_ zE)zgz`kZ|X*6V)w&i~MhPyag~y8GXL|DFF{XCMD}I(+ZH^`6`R1I|AF?{VrOxJ+>d zofUZM;s0Q$S`cl$4-y{U=b!wyH~?t}_?&(8-}dm`|DbrcK6>xJ?ePcT`X03A!r}Cz z|Dd%A7W;1hH`#lO!DP=Z24g5Tpu+sW!Pe^x2HUQoVB_uAZi4c@Dd@}&&{!pC%><}@ zy6Xlw-|Kv>X9f8KposZlF#|tQ)E%)90Z@vdqR$u>b3CeQ^L4B(m;C3}c z&-MSNyRL)N1}H8;<8`)&ZvVH~3mSvH{@-T*t^Xi1Kx(Y_-TZHT@HW_NP~HWl3v1AL z-JYBOosZrF>j9bJeE9Bvt9`e@dD$M+-aBynzZFQ$p*#PbkKX-nwfE+KCs0~Ceh(b~ zpnU9l^!|UZQ;)zHlnxvZ-vihCu1D_vcL13O>ND=U{onog{r{HxZh_l}ZpZIK(i~_E z;n3axp#HAu-kbl;LG4ITKG}2YztO(i;63UlAoiYHw@vrnW-vj*w1|KGZPys|w_WSk z1C5VD=bvG7TA*=N5F0j@ZMYpWhN{2q>VMGOCP)r6$6*I5C$?P&_nVDCeS#e~z;!XG zFKl=C9=J~oQU_{NgW?=iFN5+iXsp!|)E?e({l7h^|G(n~xIGT)SA)_A2!rZSQ2Ma~ z)s?$%g5%R{HzZAf#6f0&;uSQ`VznPs=U)GBy8Ak~ytVq7GzFFap!y!#<^#nm zsGI^}a2dbv7P#E9Ie6#4)!tkG9YE<|-_8G^vd8YgZSXj*&Hg+8Z9wh1eYgL6o_hEn zRIWQ5xbxrj(4GGv+UWp9uhWsc|84i*{%;NHCmg&Bj(1S`4l)ZgCIxEufy@HsBTyPJ z+k5LjC?6St%CvpAK>7Z^>E7E@K=F@^sS^L7^<2aS0Ol0IiDzwdXs0;v=AE30b6Exp- z{l5=rTy6KQ|Dg0?yz|C?P~R9tgT_b9cisH&e&zXpvt2j;gZQ8_1XNFg$`DXH3KSop z`V!QR0{|hAMd+h}{4nb^C{|clYByYL*)_)Kiq{kZ6#|DkzfXZbk z2FZiuKyem)<0UxWK)Wq`r!V5 zoBenHgW}odz}^2g2k-v3KXmuM?Lkod-~I1+@Gdz1ZTH{#?{E-=@BVi<08)P!JpKeq zKOi|PP&snoE_e;0+1@+gybo%RnC`v(A0!7#7sh*UF_`bW&0w(~fys|?RGpysH`sQa z0Tk~rY_{{}R^2V2J{M^2>iU0!ZIE>cptX~rc{LDixDAw-Z~iyh0m7iN`qqC?Sq^I7 zn}EhKcR=#5*)C8yd<&eH!D#_Bwgu|{g5q({?f?EaUxCfA*nJy39%cz@>+S@V?YF>V zWuUl+#W5&;VEGdy29g7{GpzRB`47rRW_xb`x7l~+KPb*YZC4Nmv90#q`45Uy5C*9S z#UV%x6!#zu5(DW6$%C-%{=5Gz_JGRwJO3TQaRZ9`JOAwu-uoYN`!zUTLHa@QZ+`$5 z-}nC89k~17;UEM%9)$2g=7G`zMEu@=+XJBZzXzUc0*QmnaXozRzvccr|3UWJAH4hD z`oNw47W;35%KiUV2kvZ!#k=MHI}BF)?=V;&xPuyr6!1XtZ?yde12Rs(_KXFzF3EWN z4e%NyP@IFxYS0=Ly=^zZYZ5@^0H|y*-3iI>p!ykfwvX%OXW;Qpvt2j;gUW7D8Eyg^ z`vlF8f!Z=K_HNKzC}7LvFK{O~1K^Vjbg*T{t@w)l~+;#?ugT_=qwBtcg7~cWc!JxVqv_2Um4l0)| z_T2%;35d4X3rR1**I$C|vpIC{zcsAx-go;ysIIm;aOb}@s9yuh`_Oz1DhC`7-TUuw z@E$lWLGc-O^EJ3W0L3e)YyhPZ5C)|K$3u{`0xApa4&DK$0Z^U?sj~#NGeBqQ?7hih zx&Jl;DDFWR6#sSy?@|!ss9HhsZ@l9MgE3MXFx(EV3yy>07le&L`5Cn4W!Fvc8YNJi zgVF;`9K<%NInJC_jU&%455Rgs@ehh`=R+WINc{kcXOK9k z{s)-@%J-mj1u6?bX~JUv?bDVA?l3^&A5!*%(tyJu>c+px4n+P3#l7M78w{qPHRd}Y zc^ed$pgO=9G*`JD)Lw(EQv%2P_8Z_ePN2RVs9kTc{rZ0+P&(Lk1H6987&PX->(+lz z9D=aXPEh*`l=mU=4;l*viGwhxtN@i8pm6rO^5Vb6E=av$yc1I2Tke6B?Vvi`bT_D; z2i5VAG5}Num_X}xki0R}PEg$rYQKTXSy0*l)w!TF0pZ{I527uh`5nXt%kR7MKj7vo zP}vKvS3q$NYLkP?23XvHXi&U^;tmvNpt|4j@V)<_xOYB$AH3%QB=2$vROds|3y2Sj zZ&0}pt`9(C2#4Ct%4Z3e3Ycfi>403`lFb%FDtd#IV1LLMak zuQR~n9;q(KH-fh9Ky^L{gX(xtUmMh)1C{x(dH}3$+x7pT`87~EV6pq=f6)9k2!ql9 zsP6`9i-YDoLGcXAtDt-eiYE)u_$R2|2ek)x-u&-%;pu-+ngi7v*8A`N_qz5HQqF_b z-1-mF18S#%XpkA8c(>bs2b|wQc^=d@a6SL@zXfPM7SyH&<$rK{@6LZv-Ug`w#W|?H z0AY|AXpc(J%~$_HX%Cc6KxxS9;gXdzRTfz|Ls6>2k-uO0_(f`AC&Jw>cMH?AS9iD+LG1>?&gB( zc@RdVfjbQ5`>E6JM@}-J_y@QBkm>+%8i14wcOYf^4RC)A6t|%K4eEn~##2G@56ZKk zwacKi;Q$)<1C3jQ*17BfQ+-uVxTf6t@$|AXS%<;Xp7 zUlOFw6_h3pg316;*#T-Bg3`pj`=C1B_TXIxn*(>j?LAOB0AX6hKPWAL;vXF6$Y}u7 zF4%E{0aV``gUa!ppfms}-$8RKpgzCZP7oi|{=W$s9{`OHg8F&Temy8Jg8FixaU4)w zfUp&KE)+Dr2dWn!?L?3`C{9g4^#*884xA=#f!o@k{v8N|;t|xQv;p-Uci#f{w?Jd` zp!U4`=|}&4E1+;7c)ekUi2I_Bv z`(3xedDb43wm|cC2SDRCka{0f?py2w)%}n<9~}Rn{CxP{e+N*W29M`~;t^EO-vO5= zwxD+BAyB;D{qK1A?tjpj5GcPp9l8s?Pu%P1{r{kLBWU~(R311TzRLirVF6g8Vk4v9vcUx0Z`rs)&HO}+y2DE z|Df~&YV(1_L3t8}O`!SSW*=xi3o_?n4$hZ1!Si3BIWQ0(G-nDb`$6qJP&*71_jaH$ zdQd%qghAtIrl2*qdv1Z}OhD#?%&^#V6TBV~lvY4#1Ee1`&IW4lfy#5xxzC`sKd7t+ zmDiyDHmFSxVnfRM+yBi#<8@~qfyeql^5*;Qfa4d`uCv?^iGNFQy0{B22SEJ;Q2c{1 zs2vDu57-~P`yaH102J4*p!t9!_rUQFVuLVfeAw&Qga6Kl?}O(M+>YM=uf6*=gVW)A z433BIfzyCJEDapE%RtNc2c-pg{)fgrs9pf$oi`Xvc7n=*8{od3IjC(98rKEQyMop+ z?79gauLF(UIiGn99=8RR*`V?ol&?*8gXYX`{RiboP<(*+pu7x{gTx;w{vrK+P@H+3 zd-5L^|Dg6gNG+%w0q1+r{3&QoY2R(|`WQ>lSS^$d8dC+S1*IX6^H0EiH&7gd#?nA} z9Mng!2Bjm=xGku^ec%o_pM&BT6!)NV1B5|sI?&jU_r<6GL1_l0AC&Lm?ehb7z~eoj zx(8I|gX(@znF3;i%5+fu4a(=BK3(9YXW%gb5FeDcL2>Q@%I~1Hi=cYo$i4qANALZI zq=)+qE=TTxvGb98;B??{=pF+o4cJhz&j*TYY}j!7O$H+@ac>HVdj?ZbU9juMZBW|| zwB8AnzrpPQXc_?35g-g|7g~YFeL-tu!F4)lZu~YlPC@Cy9yA^fDr@)L1dq{z;v5{e z;66TR><7|50OfyB`3=gypmYN&pF!%t@eG|;0f~X+L1h6bEr9YlBn{jGx7|Q-4vJq; z9D?E%#0FsyA5@=%@;!(T8jA(dFbpaOz+(xZH9erdKWIE3G^Pt0*8{cFK<#?)91*B3 zc;`PT4S@Q7p!IK{cy>Dqst@k|cRvCe2ZGf9ptyHDeDA;8(fj{hj@F^ zQ2qqPC8+HO%IBapFd#l?ZVi+!KxIBCUO{Cshz7}l@+Bxft)cBeP@I9*$be{29D?#V zsI6do_FQ*bf?~1N8@Q{r5QW@IS~* zSpEgYHz-a)W3iw(wg#yMjjcmz(A*nX95gQrYUAy@^WXjCL-1G;sDB5_>!AD(qCssr zP?-+O^B_4;K6f|-N&|Pm^O2ykAJonVl_?-IK;u2m(EJXHZ^t9|{<|K%_uupA{r^r! z?iGOI84~yR8C;LtXK(}IqxTuyjzZD{DE_G(&-ly(mGz)B0MGZJ{J#qt_n`RSb(6t% z-z^54y|+(*;vW>ZpfUke7WiIz_8-Ky1g)jo2O9gm310sIN(Z318E{$v=X=l?4rnb5 zXs!*y2E{$dEU(MYAmsumPWRmc&%1&0Jt%L3;u};Jfa($p(EREC+u->&P<(>&I;hPC z5(n+OfvADZr-0%XlomiVNG%B4g2vcD>o!1n8??3uw1ym%*P&zf;n!b+$MHe&ZVwvQ zJ#-h`jtB7_p#3;d{Dat___sfF=fBh8JO6DDLHh8Z^bvLA6?k0H^~im2e)oXpeV^kG zjyoQ?2Z>`)JRb$IL2-`2?nm!4cpkftFRExJ2QKSD@eaahac{o+CW8eG@43ZczWe58 zP@IF}AJhf_&!K|zIB0$AP4L_(DBpw1Wl&iG!l3yXuo!5)HE69A6ocX)RF>F*^5$Mh zn*kD!x4`qQpt=Jzb_)^%#V05&xEzAa+k?^uNDdVLAiF?pP`M6@YbS92ybYeWw*k%P zg67&mc7XFgq-_tXA3$*iice791(g|~`Tka`fRl7Es)J9KFu~qQUtb8vh_Z2)i8xl?But z=OHz*m_qY9xXg#L&3D~oK#qSH8>Gf!_f1{XT{kCK?74Z}95lba7gE22;u{nnAPky2 z1Mxu^6#sUhwiswW5Y#sZr$g9ASJxF3r_gu? z#l6R|`wSo&6yL5;aS$7n=RJ=-AT_#ZqTY5NB(H;*hSudYiF|ShMn1-n|96z@7OsXylZE*_m-U{4DY*bXR-H|o!OpSc1{QHfN7h3 zx9zO<-L|vcf7{Mx-z~eC2k#(y_Cd_GJ8;|1<;1RwoDSZ#vpsOv&Sw7|JDUTj z*!I93JBI^z?d@hwoY2 z9Jp)YbmYE*?cux9pgz0f;k)4WyA!A#f8-tms67v^=b`Zoig!pnL(%{!zr(Q4v4=E? zOG*p{#XSgP#6McRTOjlI-eR!YdyBymg!e#b5Fdm=Vj$Xj?`;Nas5&c9n_~ZM2D^iI z7;FyQVX)qJo52Q(L2Qt`)xO(caS-2T|7`}_{kIuFGz{DBzXR59fA}t#wmATiw>@y1 z!48b?FxVZq!(e*=Vh6|`7zT-fFsQ8!(hsVi9boBP<5dA1;qt;+zToGZ9!`G-DUvEgW?~A!SN4D8?g9?vO)0= zYA-t+xyJx92Q~g7aZgPAgW}!k=zRuo8aQ+p9QUv|N2W=Me^?p-mGz*w2F1VkvHJ`@ z1JuT&B)vEvxWnMM|2Bg?DEvY3x91iEDBfWh6z8D)4Z^?Z(g7P&e?<2=MjEyh;!F2$r{0HTK5C*Z)FePy?*z}t3y~ThW&#-s}#Wk`xh!4U9 z;~x~CPz;J|P`*dTATe0{!`Pts1C6CP9lgf@D#Hgd{z2|Q#)B=sM%^EI30nGn{;M;=)ejxbrAU@nU1_rQ!NONxNAo&9b^~@kX+&TsZu!RU|h=pi;xa&dU z_5c4PIfsG4o-iNDxeN^Q|Nm2)kK}!D0F3fM5e3Ek|NoDM2Q(}|)M$7Ny7WNp@&MgD zQp+p!^6oz<-M}!Y{DiSVG>DI0o}!nx=;bj|h6I<_NDc;<=SU6)m-k2x09p6{Kiooa z@r{(j!N&dn{~ziCaA^RCe&!km{;ahO{F!SQ_>eG&&z}X6lye^@Hz&*d>Dqv z5$!=73Wc)PGGO4$H4K6vjMM+C3Hu)!HekPl!T{uV5C-`jgh75K+5Zqf^A&7h;6=vy z8*umzzpzlwItDP#UdJGmjT#PM|7WgY5XgXG;Qf4;(v417f!8Tg7ffiZsHqRI+puVoO-Sqt$$C>&s6015{v7R*`; zP6v=MfchVl2S6Bn+xSyg z@8nBaxr;At)h@n_)w}r9R_zkV+W=;R_+Xs1W*1-PnqB-LI%D-NzT6GF__Ef5#lUpN znqB-k>vr*FLvhyHUHnCxcJYJMWUbr9m$QBsU(UK+`~@3!^5w4E#+ScgJzw719^Uk& zf^h#AZeW1NJ;?9S_~$Fx#K2#+8HcYS!mx5lAZslHEDXST0F(xD)-ec!=*%^xLYZs+ z3m0zwFPO3Vzd-t${{k6n{`04;{?DJe=0AV>>i_&1tHHED!6vBq+W&m%YyR_PLTLWX zwg34+dWtqf#In}@=gVIApD%aae?Aa9cm03<+;#u?bJqPADBJpFQFIcsM6PEA6@ecJnfB9wxT>b~8d$9kpgn>ZTYHgvs z_5X!I807cdb^pbxcKjF4Uh`iBBnA$HHUEXO*8CUBT?Y;iq3kvPg)6uH7tCJ$9~3r% zIcxt5X084&RJ!@UVE+35g2fyE3pefkFOawHzYs`W$)^8;MH|3;f&6v<1#;K@7bsZ& zU#ND+e}Vk4n{TIlG@{2b97l7f4t^fJK{@(nbuLOiQ z{pTy$^q;SE(|^JGEu5e{55i!-mu~^bzhD)n{{?c_F@VDWJsdLE{0I9#Z~cEr8d&#V zq+s2D@v5!=#R}H{7c1QGUmT3r{}(G*_g}1V-G8y-4gbZew*HrB+6xJfymkMD^C4KI zbmM=af_49ei#GfhsoeTsxN!Y{ArJ<|H3-Alg&Y2h)b98%QoH@XaNQ1Y*a(5rOv$GI zAR3&GiZ}fis^0!zpm^hdeh@C%1g631p>*?q{<2N~A%2JW8UMzrFJ83azeLG~|KdgK|BDx{|1Vj;;6kL@BA-Pxc2jfvT-wzvJ{jC=B3uJp(_ei~^NQpz;iqe?ei82TJ1`z-eC$ zPpUSrW z7pdC`PP3A|hyRP$Zu>7$wdKET_ksV?jXNQ@Wj9z%s&)5&son$s#j3acmuTJdU$kl~ zI4(i)DN?=}9G~L72mgyyZ~HISw)ejXC_lCC{x90H`@cx_*8igId;W{mZTm0QcksVx z>+b&|Ra?NcXw%OB68#7Ni?!|fFH*DZzxaeh|3y3Y{uip)@?W%T-+!UTo&N8gG2 zf5Dn<|Am@&{TC=)D=1jAjR6^>X8^&1^$ZBSfk7~LZ9J&_<;z+3pC4KugX$tdP@V(D zYt8omq9vRDOSSF!FHyPmza$ctsMz{n0+jz7cK#PF+x%a&V(WjAauDA9Uj!Ow!XWXc zUEuf=2FX`#gRnv6WX0D1ATeQ(o`#*^xCND;pg0z(-0~lU#XI-?7XkShWJcB2|H2^s zHQWCSR&M<-She-PVD+~Df>qm~^wv0`+U*R;7~TIuMH?7UaKZYC;Q9zu_Y`gX&tJIV zzW}I?0+q?2vZ->*fAOYW|HaBS{ghI!SN6FGsqv++x`oKaMiZ|A|U@)Z~ZS+z4gCv&9?s{ zwcEh)E>g4gzgWkf|Ke@CA!2pg|BKY^0GEeCwcGv+f#SYy`+p&D`MG_fP~CP0;d&U} zf$n_<;gU^oECgbgZrTJYW5M-I@g_(eQ@HWJ0I1F?-uPd<=fHoFvQ7WRDz^R?2c_|v z?f)ffcR(?Sz5Ty*_W`iq#j3Xb7p>U#U$lJ7e+f{$Rd4?<+PM3_#DpW@coyy0|6jCu z54fBM`5Rp3S8w|-1PZUN{a`-{*Y1GG*MVq|U$=w(Eiw7|_Ar#+?kpjXN>@U$&V+7!~ga`5)9y0oTDroBj)c@kVf61S*d~ z@d(P-ApeWkZvQXYu=BrU-3|x_^LK&6MzUkye~G4D;PfKdbKt*N{m%bl&Ab1LcOL+k zX=0sw|BHd*v3|#Y(XRdfL1nsd?e_mdpfu396WkUM2KfaXmplFoH|&6vB@H|Oi-F3F z=3U^rM5J-&e-WtvA?%(1MVi2Pr%2N-1~6{k#URqW3&Z~+65vg<5z2=dalEpTBa;fBvei|M@Go{uk)n_g|oC*MI(+?f>~Z z_WkE?-t(Wodi#GNkeLm;{tMSb{0ItvNEq(_F98bEwmttvLE+H6`@cvNv>a{P1ujp; z+V<=cZQ0EL#;v;uvey1*$X$n^ zbJqN4sNVXYA!qG>hWz#a845Q1XUO01pCNDke}=-1{~1a)|7WP#@t>jZ;D5%_&HuTo zxBV9Yr2$Zx+PwR}CkpIQn_Anr0^Z*d6 z-Ohl94~T;N56Xj}bOv<$1<@?R8GcY*3aP@UAc^S^lG&j0)%wcY#wzy194 z|CgVC{(t`d`~TM;zyE*v@%#UWZ@>P(`SSDsvrj+%KYaJ~|Lr$l{$G3k>Hmc%AO4?u z^#1?R`)~grxbx=!?pv?_Z@c#L|E9~&|F6IC@_)nr+yB|Bw*BX>+5TUs5fZ1MxE5>P z^7i-<~U%YegF0qci4B|)_-T&eZI~h=L z{f+}-wLAWUuxQP8a6T1pht%U@pfbL9|9|n?t^dUvcKjEw-wyUWC|~op@A>aA_auDa ze8HK=|2JKI@qgE?SO0h1c=>PhySM? zfAD|OvHSn~4&VFVb>Pnb*1b3X*Y3Oh|M=tg|Emt({m)Xh6j2-}zEqfS{u|(6Z z0}@TU!R59@wBx@-%Pw%(NVM#R_`mnSf7a@4 z;Jn^;;0`zp>i69G&rr1CKSS9jh<|Ig{b#7&_MfR~=YIweyJp*e#@g-w8Ed!wXR6!& zpA{4yHQWDlHtzb**tF|^;nu7FC!Kx#p9R#;1EqIpItRs%)P#foCA#+gm+0C5U$STa zfAOCE;BW!eGoW%2jC&94lI%aofQ-@oFV(h}0R^}2Js{b-_rD}4T{Z9iFEjD*f2o#T z|E1e@|Cegr`Coq8;r}wAFlgTkj(e$zhyP1VIP{;pW%qy1hMi#lG1Tq&-+mAh2H=1o zMEv^?E;C+!`T2j*g{S`+8+QI@>pS>AZ`-y1ormuIX9uOj>Bs(ycR|X0kRN5|oB)Tr zWZ!}RAS^xWI5_?#`w#w?>_7BhdeV{qQWFmClA3sk0U4wFU%GQ20}AfgcR;#x-+#&W zz2G*k?8L+WWjgl$m+Rj9U$$%Sf7zb>VE@bX?Ef#-x$nPJ-@*UF-TT4*26^-5n=g>K zF5UFM1sVp&9=-o>xbXCU=f!9Kdo4Tr-*efy|E`P9{C8e_`oHt?bN?L{pZ#w(=fwZ0 zwHN=NdG_%?XWQQYtnGXMXKcCpzwyAG|7@VX#pJ{PrKcSEFV%nWzs$r#|79i}{x37( z5Xg@Z3=*4t;=lBy!~dlx9|q@5nJGthNl!k)fQ-@oFVk~?0U68o9y}lo%3mOVcJ2Q! z*LUE*T<`w>ay|S1%lGd8uQ>haf4SZR|7Cjj|Ca&LlMnwF?mP6Kp<)}z`~Ocq`S72i zeb0Zk=3U@$XgPcjEM5W13uT-CGc@h`&oJf4e}=|g{~7uZ{%300{hz&K-+%UrhyEMP zJpO;r{kQ))JNEtOn0WYq;-)MAEB4<0&jCvJQ;+;H z6=od&FF)bXfBF6c|K9ryl(;H{;lU`Nd~Ieg^O1=spMLzm`ufX%_qCV)^Y{^#pI z^q+6yq5r|_FaJ;9brZ~&oOTTCN4e=o|I1E4@?UP&@&9r&j{ldNc^n)EvLJfyNibi2 z*75)HvqAX8F8Mhp7!;5&y8jiYA7wzs3e%1pke_noKL{($Iq_d%%8~y{(~kUCo__Sd z%JifE)fSxwv*o8A`L8th^C;y90I0R1DAio^}#edKK|IASTM{mCJpJmda{|v2r z{F9(1LX!{w7h7=pzwf$B|Kqk@ z|1UK8=zp1cC&6(Jj^|m&|0^#)3-RNe6JY<#&p!EIY4I6wxX6RtJ@>?arTM3JDb7E| zfQ-@ouQcm812R^bf9inBg46$%W*z^pvG&q`<=H3xt1mqLUwg&5|0*+&{nuP|{=e#i zQ~#Ccp7^h^?$UqN<>&uP%{}>_Vd5c>_x~RO<^PF?{xkL;0P`caUHdPv==6X7*~kAg zbng4#bLBZ$yb}}#Q;+`FTYUDv#)|X*Rn}bmZ@l{A|NP?*|I5rf^c7gW3;>p8c=6;qrf# zmFL0XpuGG%NNktVqB9K07~TKMb51fS&qZLRStkxC%{~G4zv|qR|5aw6_^&$W#DDd9 zCn5CWGyhfQo&aN|IVb-s%{uvCa>mjB3|;%d{yO&b<9~*}1OJ(!{tw@J?LYgZL;sDJ zp8a2Z=q@-Nw4Z(iR@-~-$$y3khyF{>I{sgA-pT*Ei_iWK+j{N4{JfL@nIe??IEFFpHTX(5CSDhrfA=@R6&#b^F2!|;+byOfun zWkAO0{#TiQiUAob&pUZQW!|a(Ags0K;(xXIryzL2ssHK=PW{(idl4M}Y70*P*I0e= zzvilo|7GT!0GH(;PaS>w;XlLlqu?|T;)id)_Mc<^$^Q)}AY~v!>+b&y-TVLNAG!;Y z{@-)%$$u_Txd!t8x=a6^*I)jxy7=^e)ioFY+pfF(-+9AjaM`E2_R@d#b(j7tEjsgG zWyu*ZTNM-rOV0jRU3Tuj@{+UvH9_fP>Dm7(%g+8+U4HJr%JOr&RF|J)K*s3)S6g(3 z0U4_Aq>cW%%)fb)lufF)qe~raw{%bBh`(I72!Tve%{L_Di$%p=POg{qVNA11!pLN=i|HaTa2MeMR6E8jc&pGSZ zf92H|{_C&2@Lyxux&P`b&i^-EbLqd`hRgpImz?>pwf53~&9#@neg*kW6?A9(>I?tX zSDyc`w&MJM<>luf`EkYh{~D_={8w9f;lI|Ji@VfUU0^`Q=>FGOdX51ZYb`&2Kx65- z|LRN5{?}T0{=eq(v;Vc0f$+Kix+~BB*V}OUzt*yI;IPqHaRHon6&9WO&oC9@-{a3e z{b!ta;y>4{V_;uK@4Nka^$M(R z>eUzjx#yq!ueki&f2~y)!1tdUthxB#V&fIC|3LX&4eYP;|J7HW|F6CI>VLIW7yhfQ zzW5(34oZs~E`#}?a8g@y@xS_-i@P+|Tx8H#i@@mq*IaR)0U2woIDbHM1<2nZd=7m7 zw*Kn#|8-WL|E~jb*QP7raM4(K{=dfZ^Z#`=Uiq)G?$Upz84&-Tc=_o+^Zb+lx#u1S z`zvVIjsIMW&-~|GaPmLryc7SKXCMF1x8~x17Eqpf6fJ` z{wu6F{~vr0-P())_19hk$0z6>I_)i2|7)zd0P@#=FnjH#|7vS5{#OU#H5dQu?YItR zgUV$P*4%J;m*%=l44Uf^m;nuFt-8RVwGs)hx^O^y)rJ3{FwkCk?!Wfx^Z&J>e%Aq| z&vlpnYl8To^tkfkf9(yI|EsRM_@8O^39uiIzx?!{Y3}j=0t+F1VUV9f_T2iPc;dnT zxI=gT$Aj?UyZ_@3-uWMYn{G+U3Uq5 z@0#xBEC03EUiz=I{_=m#b(g^Qg8jJe(tj-|A0(~`l3#!MzxIYJ|Ft$;-letSG6OP3 z^FD*t>We5?bM?goTB|OC(;z4u47ObPue196f8Es=|LcP4DA4_2YcGM_qPhCgf339_ z|EsLN@SkZO#J?wAe*Vw7;@p4s`KQ4CA%~cH{l$M_P~E%c;(zV+m%w*`gVKY}`b+=y zHeUI!v*Gf8y`4AygZv6ge;VsAgYQq*+HmE+Cdl6#ulxtyVW_?F$}a6qR~V2ny8m_7 zUSdGQ2eemT{I9*{!hh}6AbcKtU%4JAErQ}=EC2O3LHw?>@$!GYt=GVDtiAEde-H-U zC#?kvn@v~$gYIwE-Fy{PM(onva*aU;31j$w{bdH7^_LlRVR+Nk1NvL8{ny=a8GNUM z{zk~1&!Ds4_19ej-%|v-_fv1vHSql|p!Bb`>FR%>&DX&0-VZAOm!193zVz&W{fZ4ojFaGCRbKyVd$_xK_*IoI~vF!YR{&knZm~rX3{|w8||F1p& z6l~Ul=b!$|Y`OwILlku8pwYG)|3P=7f$o|!-h2DM;htOIc-9BsqYb&Q2FwPXUk?%6 zrMK-m0|@JGyUqZ@=>FH;aD@RG>#VzcKzIG+|2m+!UJuHHm%#T?8f>`q-*Cfa@HxkN z8?O8Zg$pb#g4&7vOV0j3{_-=}-Jmcy_VUyJ#M0{|aj^{g+&M@&CC`KS0ig;C~Q`6!PD{ zfB%2|`}hCP|NsBr|NH~KXBu?(Ea;w3GtfN~pnIscUH@+gzN75=f3pL3{_AbM4#qlL zuY>QY(b)#Nr|iamz3n%4>2JTmfQ-@oueb3k0|H-R(BE|RfbPc2|3TPb)0O{*o38vf z-g4!?(Pj{R4SYtaA&3o%i>=rG8*IJ;uB$+KPcW3vP(NtxrT>zf zul|?ccJ06XhD-l-w_XL`R|>jg33T5k2!rl62Hh0_x`PjN?ykWOkbkfL*8|<*47;BT zbT`Y+o4fRP++aY)82;aMl|c^`@7LP|DnGA);}=xs7;U-o-)!4e@EM;LyKnwC*>df_ z=~mFat=Ik=g6;|5dKG-%E2xYHVURntHeUX3ue;d$QfuQ?zLFWsD?tlfK z;duK$=-xljJ%Au{40qo6uMg6{^Cp80G;XB}a$ZhvP?wq#+-B||;127Fy z4>~&+bYBkW++EO}37|T_VCT*MM!RnPH`;v*bf54}*uBv(8r}Z}TdpzaBVnVh*EWLg z{086o2r65)UWNE?`?deZApe8UPrUu#eEaqPreJ&ne6PC&=+2jy27 z2B`(z?F^!AK=*cRzwsZe2Xt=?=uC0Y9k{z7cSu_AzV+YZ*aPrA+_rmf{dd}b`#HK4R$1S)?)aSih4_G|w^=ZS*uHV0vlKS1}Ro9?*w-+ae) z@V&Aizk=>b0OeQ9UDv^P)q>&|Bo4|$<~t$kK=-Md?*iRJ54oGxau+16gU-mb1;su1 zj&V?Wxb+`&|FFxEd*HjKL1$oE>;|2q3pr2MWH;zMbx0T(gYIG31&aS$6ODF5?huC2 zIQIFNn=Xr2U>Eg-(tf!qI$LH<5^AAAoV=qy&dqxZr0e1OhcwFcdru=DzV z$HRC2+Z_ho*>eMYCa&e48~?2j-2M-`SJQm=jsFgZ@BDW-0=oO|CRiQlj!w`S*`V{Y zE%)5~?{oxom)4#C&d2WmcRhCRzvF>h|2HBdz-Mn-?7#Kj`pCWiCZPLY4ubC%i#Gw^pNhCg7v2B*Fn@#T>kL|3uLywBKFI$d z+7MLFK(XQWYvB98OriH$g7Y&d?;f}Vx&LS<Ag|6PuQ z?jnTTF=+`pGZj=GLd#Gy&|Mp#`xf@z5(M2JiF}7BZvTVt|6+jN3-}*&w-4xUH_#nW zpgZ6|_W*(Jelpt$x#JIXpAYCfaAVLN>!ABG4&VE4z6)}%8|Ypy(7Dc_v)n=Fzk^6Y=>8^45Fd)ILHDeI?&5&n?Ps~~_J3zkIRL$15p>qN9q7(Q(EWS+ z?|{!~wg=tA29nBnQe{wje)({0+wU z{=1!c1U_Th;UMU)Daf62pmUF{Kxf<@0Nqz}yWA4#?nuxbQWpC#?-7Eef26x0p?AT6 z?qUOl0VvKvZ43}?47v|)FR0GF0lw$S1XSjN?sP=LpfvAv^5K6_{9A#;0di-T$*$Xw zI~qY}KOX?y<#QW+ACKkUJK+17%=X;*Z?*sKf2U&){@Wh855Bv_0(2)Q=pIh!8T_Cy z0G+W8x_`y>_yh2rnxJ!=L16%*L1(ms&g2E1%Wn<6Lko0|lI4ETeQJ<<6tTs>AvE4W zcc6jq!`N|yL3hh_E|8x=_a4FTzS?mET=s$LbWoiOI?ot%<}nDHg34de{WYNbPC#d% z@3{%SlhhV;&m-vG*Q58rcRpKz@-OJFqrJEO+aJCEACz7|XAXnzF0$Hp2Yi1zD9%Cm zNr29v2DS4*cZ=8_ya&F20-XL2-u(}{>kbqap!>5y=TU>sAqJgE47zh7;N)X&(0R0= zyF)pmX>k;RBL~oaJw^7jg%T-O+phL3!N*bXPp+ZVpiS0g7i( zz6F(I`)~huJboYC*965S=$<9ey(^$_0Nu3$N(Wx29{vaU8&q$A?$K}o-KlZp{(qn2 z5A-nZQ8@^?Khqh<9cm!|gX4Ys4F-_EK^SxvKIlw*(}UMJ!SyvLUZM9{LgF5DuQcdh zyPM!M%B`U1mV?SUQ2c@TApe8ztpNEOMuX~2P<{rTQw=(69Ml$qol^~}M?q}R`QxCt zh2>>%x(3}_0=iQObg$H5Q2aygngHD&1oAuR?g{@>4|zc64LgI*oji=VPX=_hEhr73 zr+pY7=6{gCK^W|B&>8SMA?N>_gU@`vRR*fdKxb@&>L^fM4W^;~2Kg0KhkWV zoVD+E{NaCyzwiI|Ja)en0Kzvv@fX?y+4&U8qclho^mm~M$E%)Ey2l*3pwk+s;VGstfk;4IW{;(sCbdMem$ag=O zLC^n(#Qjb1Ij^AeeL-hKC=^it|#(2%(ua3 zGK0?V1f9bQ!XP#%y@Jkh1>=K|b9j-@T!o#n3i2Dm|A;#j+`#u}K>0^VyGy}z*9`^` zhMjv2^FP?{AU`AHy^yo6LH>qexL=X|4m+n7$^RgKg3hOg(1>%XL3|YdAA+7i4WbW0 z?g#_>|1jiyaZnh5;v3{=clg}`P`@7~&F`@E0P;HsBm53J=lvGadG8=L?)bL>oezxW zf6#fp5DbZbkUuH$Kd6j{ovjQ?12F%49EF^%4x(ZHA(sZ7cWejp2k87_aJ(bs0}!8t z__qbeJ?QLm()|xQcNjhW!~72l1NfQa&~t{#_3x;@krM)>jLCx4f{$6Shn}9m{~vN_ z0`q^!=?aYhp{FjuY3Q*K^)MQ&oq@rAlm@3UjBtR36O2X=Pk1S?GRn@cw4d-e(vFodE#a z(+tJ@IqM+%`9XV{L3_E8_HFZl_wIuB?}G3~q_;rnsn`?8VtWP|o%3t+V$vY!>S z&m4sLKz4&LY+p6VZV(3TqlVj!YAkg z+Di$t6NW+i>p*_bU(dh~!*Khdd)A8(`_>_QI5&g+kKu;gbqqooYdi(B)}7@~U;U3S zb=5zi>e7YyJ!7uKzCp+BXT>6AaqN3febP0NKOJ58CgWw+^yr5w@onw2!xB z^MBq#@E+E;VEaJ!g7>U$0q@xa?M(#Z9Oyp9%r)->LHkkj*8LYN+4x^9fBk>4{B{3D zK^U~hs&E5%pCNd!Wie>a<$Ca*Q=!sL;Jso(6M8Ne8nW;0fKg7-w`g7$Q-|1Vy;>AytjhX0ZkoBm5wZ2m7^zUjYc z@rM5*p#6-+8^Qa8V0#b?K@fotf%ZXz_9lV$=!iG$`Y+wQ>%TN;?+s}0Rm<-GVxTqqp#4*zy;n`U{)>S4 zHQWD#_fXYs2k#33?Vl5C+WB9sX%}QaUEPlVg0*fc8#-_C&#P z@y4&9J=tJ46m0k}+OYG#c*U0glAwK1)my>)dq8^K<*K3*a2S458B5B+UqJ*xBb6x{f;lf4Lca%xO@wPFbtP%f$R$|+Vo$r zd<%FVnP}Bk@E#P9eVmos{-o@u=MPUkH@Wsv-N)L~FMF z7p~dVR4_JBrzt7S$|2-C+{_nQ%^nceyr~lU; zy8GWBH0Ri|`@dM%zW-8F4ukg#i1#1-FW!3q#QrDIv!4NmC0q9}z;Vl-{~$L=f!4ye z?EEj&z4t$8FA9I>Uhw*Fq4vH1|Ni~=f9ZuM{}-Kq@_*jBC;ulOfAGKk;NAcAdvE<$ z0Il(zck+MGx=a80Kzmd`>&GV^f~?^Otpn^k2wJ=TS8Bo`1{jv^-p>HXUHkq^ckKHQ zTAM7_y$`%L8?*-iwAOgi@dy8tw_N?t*|HlP4mOKU{}%(T7oT+azuc4~|1B4u{-3k` z#($Ifr~Z2^Is0E|(&7J-6ApsciAzm91l~&lT1zc6^~hhDsYe)KSZ?AW1~8s*aPYt4q(lD|r$W}6b9C+h-*f!I|D>(g{_D>={$FJ_WbM)VWf1#RmY)N!X#}n5 zQ(1EMzsl0He^r*9Wq@Jz#b+7dc*$At+CY%K;5B)mb+gOP{TG>k>VMz)C;yWV-2T7o z(L3;3wMkc>|9|`I&;J)ceuKk7f9=Kp;)_oI*8r_y1Fahbt)B(06 z&D>x0)fX6G7uk96Uv>3`|9*RKLENzZ(tjDydc`#t!Sml5YcGP=?1I*hfY$DS)^llX zxcpah{bdFi)?Raw0fx0e>ykk3-*D-_-r7sxH7KCRg8?ZyA&Z@&D`Jo)f{#>t2O z(?Im;NB`4LJ^G(^>e2s{6A%CQTz?661L#h1@Z1_`t-`LGpmiGmb+>`mFM#Lo|AE%2 z!12Z_40=!uvH$Xa!%dgr>tPHwUHz}N{?dQh)ffNw-gxzY#@#pnr`~w^f69$l|EJx0 z{eSX}R}g&b)&Hq?UjLtU?+tiujLG)v|3Mfu#&5Xu2GsuRpmhWPkk?D-ZNAC?!k{$* zdYi6-*LoOkhRlhB=lHf>2d{z9-gM=^+Quv3uvOlC^}ouNtN&GZT>r1K<=TJME!X~Q z?zr(^9W-pI!1JQl!1ICzJFXux+;QW-!H(4Z2(QHh4Y>G$#idj|a^)facfi4&D22d+;v!?q<*(y^e?O{kI3rA%gF9 zzXO_c@C413f#wWB7&JC+2(lY7Kk^QgenA*C4*;4A0=WZ3gTezej|ZQ(g5E0&n!fYiVRJ&DIT6qpF=%Yia?edqn|-$rS?#&?1(Xg! z7&M*_iEGfj=I#HWF?*00WQ-p)wtwe8Xl?*Bjt{yw*Wu9JFRn-LAM!kQ-xD;Bi9B9! zcknI)Xv`kuUl2yN8$2!v8h-;}(AXSo91eV69OT|GYtR@Z7~f&A*$)|C1&uj^%mrbP zKSB32fyU23APn*M4F=F%sGxiBz~jMCyFugO;PGG3SRoXH$3Q{$f-v;n zLC`&CFuT$1M<2Hbxd#*;AbVjL6z&keL&jslcEbD)qM>%f$Dl!WgD_F{-)8{bRqA#W zI(B>nawj#oz=jfk7#Qq-Ffhn}U|`^Xz`(#xO$;&@az{e?A zP=+YL96?Z@7=)qybMUwYsP7K#HwwV|-US;N_zO2M@E2`l;4j|9zz^>4Ze|e7ThAZ_ z#R93Tb$F9jB=e-KiswmQ8ONKtCXOd{bsTT{nmFF+IR}o&jg)IBUrSNfj4utCV%d_ z{~~3Z|4UVa&X?HwU$Au3e*w_>E@hxT&t^zJu6Emh;o5EBGhXf7PcQA<6 z?MwilK~cB;KX>)E|4j$({BPTT=YQUoEB{m0Ui=@o`r`k9<>&tMf%d%j?Ef#;xewHT ziWl#K>>-tG*%L3-zURMG$DaQj&Aa})EE;h zm@Cfz@3{2rf7j(_|I5!l{@;4(+5b!Lzx`KPe+j(bK?AhTeA89X+T1wM`g(9XY2(!d z@Onv58*AOA|Ls>_{O`K<0!)M0v+ln655l^jegd@3p}+HHJgBV$ZeMJ^nrN`)DtP^v z;nr*awLp73K<$dHSO2Sm*7t(epY6W+-)8Tv|Dd%rp!I(GyKW{J?YhYTs;BjL+|UHA z(*f1xpnA`IA875x&Ho@8v?d5N-)wjI?tjO__rMrbKbRc2qiMGH76YiB0hP1HJ8ql; z)oY-+UQnG0!k~H$vQB(ztMlP|r@-~q{yX4#bMUJ9ws0o^v1(k!KG7+X1QobS0FM-N5 oSUG+GbkFNu@ZGD9Xmi}4f#(P83=9XD85kNEiNheZAUzJpJdEUeCf9eXpl@2EOEWYTQn9u%@($o9=y(ZgO58U+B{#ox*F@t=qJ3pWm!yZ|>}z zJlDEhh=uW(#3U6(Pa%dy8mG<+vpD{{TPUNfv}Vm30|}mph=_!;vT4QVZKvnn-exGn z=XrU`*RQ2!W@ZsFF)3+jZFT$o_uo&qkrQTN^!D~{Nj!0JvAbp69}9-JWwX;ZpG+}Y zc>VRotgSb8m+N8J_Iy>^p_WWow>l$3MKWFHYV{GJKgPQWD7$eC#gle{jA2p*JZ?zoV(H6k)H@&3Nr zoSd8|-0yB|Og5SAJ4q$cKw`tDO_TZ)O{6Zq{_1gg%EtqTDMlyPXBtQt%=9U8o~FAcM=&=h=gB>X{rA(2WdncVtX)=5!UH13z!wJ2; zyvH6Js{7A#ap5>Tp=|fr0*faf9v(KC?fb~$*^7&dzf{?R(r0}9`Tnyu6W+}Eey>`8 z_3G7gEDD)IQ*(2BpWA)kxn}L!iOVwo`PhG&*guDtaoX<|-)Y(xSnW zX`&QzaK)t#DVIQxIVvh2SxmEfXGPyxbxNhr@YsdCtsI9N!dAO(&)#oe+O0b8h{>$8 zHHDJNGkT6|cx}G9sk_W(Q(UuQOQOr_t1b+amzm7+y)~CFP$Kclgk@^?WsMillsxIT z+>+LBdx1UVgfGiM33F@FBcy~R3K zg@dD+VPZq!oP?gl!o+zq{bpain(Fqq^x193?zRnzZ7s4bQJio!rk`O8b*uB>*rdR7u~CT{;|W|rb&DKo=G=v zMov;mw2%RnLX%Xs+>$+%*1o{h-Ja8;tf;s5pFnbuN|rI#vzLa4U3RHlQn)D4+z=tY zMX;?V@xEu-S<@NsS(dDvn{&;(Ve7pa#~xL_iOTrc`v0RTN7aRhmfF(=|0)Zvn*I3Q ze{j34klhc?ALr`1=l_?Ash8|H@WA3u8T*`Sy_$y>cMAAqWDl9{e)#O~hn7l?^^Ml~ zt;Oe?KXMg^+w}DE*9)%O+rqtmM?>xVU6OL&BX&G5`|-s6VRanu{~vKXo+VZMP<}8i zS~0e@J)ZgTWPvk>gSht-nVOB z%DhfaoaB`CAX{5-nY=>vdB?|mTdW046nGRvGtM4x<4;RF$ng30g8R+yWJ;VRm>Cyv zd2&VV=r)lO*l}B%X`_fEj5r7JaaZdWJV8Xv~CdV zF-=GHBR)w1jVjx|CnqyUUvEkdFl5XnL9$rY?7XR76 zPtMXoIWF~@&fx$z4SqyV--*Z2xm>!}a+$Et20@1irTk zx?}(U*XGFSvGrxOrPtR-#WV-L|FyLuZe`*5L(=jMo@?%II_dg*-xQ zw*2YU-v6FAy=|b##g`=!F)>RnW)!@+Vfb#xW4=B)Yq!NWml^MN zxN!3r+h>{iB|o1WUXCiBO&R*56+0##%qB;j+Ao%J}=d;N)BpL7{JX7pX;*UhXN_yd^2@vC9NReY zwwAEycfYSvUBwzs+9Ahw7EaV%Z(lI&^ol&gvt6(GTXfe2X1`l(_v7X4of50q4L-Vi zs++sJ=lz^N`St$)E0#=9NjPG+`pE;1YkUWm+n-6ECsiD`{5)&-1q0_WKbh3hrz&n! zS;MpD%$#}Bd-|$hzS$i6G`wVTh1-~vs#zcmw!^<{cAsdoZnyg=l#Dm z(^t(+I>{m-RdKk!`HOMQ^KN}r897%q=`B)f6#7u8$X9DWBa|9RkNQk-~QqMRHQ<$(74GnXvg>2xdk)5`*$5xjJB5H zI%CrM&qZ*hWPGYj?*+Lj?L5&j`?H?jiH_O7%2@Bvm!0N@dS@?G-95C-&*Se8zpvYa zEqQ0#9X`cA`CW#L zHCN2!-f!X0ABF3G)(g7$+dN%lzjz_<7HPAYwN}`tC0>)pL2>g=CnZf@?F;Gtv0_5E^!i6&BpGJK5Pp4(p- zCK`DDe6TkD={ElV#xYg)d$<-UnuxUhmwWc_@kM{di;MS1ir1EIDxYmIW6r%p8E$+f zlV54dPYaxp&-ps}tZ>cp(s!2)7{1+Me4YGx!u;QjcP6vXGx)=%BguH_$>Wdf-`5pA z-kz|?z>aSY%fAoDD^7iWR`JEPxFlLIQQ$&`%bS~<+drSP=1=Bf=a+kOEjs_{_xk_e z&r3B--}hzdnX_jvW^K)|Ix=h3tz(lvwp{(!a=-p`J$oHn+>hA>nkDH9FB;xhe=s}r z&HvBq_dlL${%|n5x60tM(63}$UH%1VNYo{k9GF)l1 z`gGy$WcI54`xl;eYe@N0R(!Bh-`7l`SK+7BhiWF9N%H?sE;qW(H)H_Up*!$aKqPb$w>-}}Fp?ZLh3_h)y%3=0nryn2U$$6YwBEbf5*-!rG*F#qqraEH@Z z;m0ZWbysD>|9kHf_$m^s?ho2Z z`wpKjH!x<(b*Q+1uv~cSyxHQP_H)MFOfp^`sBF$vytbkDa_Lg(Z41o%w%?OARycqC zF=Nl1*?Rm_%NL41E|Pj|_qMu;S@q@1hvNT24>zU!x%cEy@%+`w5|R(*n_u{TMwv;! z^5*H8Z@0~yIdkFdx6jT-tzNyFA^i*oOS+ldwzCSx#>QvPolEN3wCmnu-TJ?V|9oKD)O3 z|Iqem*NVHq}OM^Nt-SRHw%r@-@HvrM{j0!>{Z6=S|=9M0JJM>({SA-J!?F z`-`8P5PY}uyItM;=I;i-F5Oq!&)UmpqApPLbH4oY+j@W1t&?o`7StPm-_G`Z^GnW9 z@8^PrZmWwv8EkNvb!E!=_#LY!9Zn8ST&J7UGc{rI4VOJ9?{_i1W>k4~E?hocL(FaW zTJ1F{iVQa+R?hIY{vFNx``n4+yg5N?#%__bI3wh4_`?|o-_p5gLsbE4l_ zhrg@ys`{C1XC}jBe8B(q{=Xl(>!y^gb`)tlbLPy3;^%(f-rYUD^ZC5f@9ys2`Rmo{ z|L08^R-HO-_idxi>HHqhSiznB_4eQ2+aJjPvwwfuY32RvT{unL1nzy`8h$CR=JLwe zf4*G1;^xH3EPbjFWUR9y*H!fTq*YnbVORG~kE|(N?R&Q+%VNK2q20vvVJ``OeN^FnC3>*MAp%|hpmg~Ri>IgUtb z3aV^)f7`#iy3f^SKJSm${zkht@`T5!PLKQbERf-&)Q4iGm}B4fKe(u)tGlWCx*jMH z&ds%cSz^`WrkuC??Y8>RD+yoL@BE=YnR9pf`?UZ6{>s=^O;PcTh>w51|Nl4XozJt& zZ?%6FTY9%4gXPWr@3Xgv*Qv!XSpIKX&?1kkx?vlIHU973*nNA+tnVk%ZC@=pR@N=? zxNggj^=S=-kI%-XK2lTZywxp<@DO0!F=>;nul|G#^Dg4xhymC1q5AEH(udRws zUU-h3%*H>Y#Kbc3l^g}V%QeD5j_pBH=e*3N3)-ggf{W?5Fq=RtOQM5F8;hfdKt!_u3!_kq-Q<{xT%pWowN^jYrTt^&>|`Jk}bzHK`{9GV~X+vG&J z$ld>XF8liD|8I>?xw}zX)ibFxa8XD6|F7}??N2k`*q$HH*Lp_p+KNrvww;szdzL+5 zFKcDs?00(?)N;Jr`P@A7++L;qxA`+ZuD(5`r&wl+iQkMPoF^-o4jcBU&H257uYZ4D z-)p@YPj7Lj-Q2yFbaaC|z@$h_y%)b%d?|K^@ZpSM(|;Ty}M_4ht%?XtdCu`93sX7DAYdHz#PJSBXS z&LnV1JL}a{On+`)rha};UgyocjOSGe<%cE)ep|cbO}w||mEf?pw#BxGe|bd8YyXXS z=|81#Rgci^c)wTbYms-OP--Q6>1&Rlp|l3^m%b38fk-;3jw z=Xd7`Rf?bDh{_hIeWvU`H8%Wy&93rrjYG^QKRt6Z^gNYer1+M1q4@(&bDdAC(&wH( zT)y3KQOm?nTc=L(za##6P^x#T83I|6Lmn9=)w}iG@k|PIbQ$T>&#h!b0rz( zQY^h1=_Q))8bVIZ-1IarweR0);mSY8c9t9s(;MXWy5{{k7yjCK|J#>3Iyz5GlJDkC z_txJ#Wx4I!%=;H=4wzqIm{WYt(&lZZe{yDKr^cow6C4E!KD*nUdT#eyvhj9^UAgVs z+X}x7Ge2&2cVE8u$L8KcsjmVROnn}4K0e41RvlCOQ)mC5TJger=fql0eRMn(Uz>QO zdY@6^p1e1DqFjy{$=42?Rw|b^@Va3#JMPuH)e;SBi=5davbaw#zI^y~dCampiPzU+ zOZBGRw^WvSpM7po@vY}}S9k0Wd|vkMXOMe@+`LEgG8hvsz52VZQ^Yv=LSKTwWa+0N zvfTmCj;dam$^T=W_Uu0gw&s?VJA1U&y1V~*wfp_kZ|lD$6iy4fo|hoRcFivBO5pOh zyb;>Bf9CJLt(||la1+Natq;Pd-tT!^Zdv)r;`a9Z^t!rvM~}Ley}x%>G(2YF=J5ad zQ<(!o=Y5{@TtUgQ_iKSgN^NrUgH_LW-+A}7CB89D{LE{<`PUwaf82cdT(93j6~o0J zTT1q_JDyp;|B2ANUmdC@CNeiXDh}K8{x~8l{Q8@lQ*jsv^T~3r`blYba|)}Z&T0lN z`!_k*wtoBWQ!m{owF++%UF5eae$&^8RiVdq`)eDXuVWJ~irRf4^UmZ`wR(5+Z_2RV zi?Wx zZz$K-DW3Ln%Pf|_C#%@ZayXg9gEW@!d42f0tlU;H9pO1O%aiKf7sY*?T>fd-^}T&N zcUm?noQUo;?)YPViu*^KWJ7N+@4T;T(hGllNNhWtcrLvDvi1Fw6Z`F41pge<&`1{`Ng=bms+x{~-;eV%dRaeK0_5WV2-?U@Li3*!#*Ix^=Fy7vl`@5}@;l6;z z2Ve8MM>ZxO-|?tRd&iec-ZwWUvpWhD-23@_@v5Gq7J4Sp_t`h3fhIeM?>?9I2?vF7{E zPqWRgefYmpuEz26(PzgJw|v=qHF)Yav#)Z@Pm8CWdwZ3d0d=k59aPR+~OPNtlxSj@keasT&Ot9L$oSlpxf^!dMq$JO6SI7eq}SB?MTy3Fc! zs5WCt=B0=?4tB|z0!7jp-lbMyYZ(TcRiD7liajvlF6EcC09h5*WSIP zRIfGr&h$5S>F3?eZ)SQwUuRcu|07_}H0EyEE(Ok(z(srh)#rZb5BK@8{=VJm?{3~yc<@eq9=bjGuT4mcOZ+}kz|0n&$t3LS&{{3e?<>q;Y?R9Va zGtTa}DF2)NU_<5N-e}uJU9+Z~yrEZTsC@6I@%5s2=gf|~Y3f&9m&%rITcNteNs(g? zw}$IX>*^Chz3Q8f%oBWen^9U=f3_WKg{EBEys3U$?{o(_zswfdR?h6l=OfqUvpAVc z>B73#Y;(MpUA+*ylxuf7Q{T5)9`>h7(^|EEF)YTeyu}~A=&c~dOd+iz}Kdqa;civs= zs5?97e0a1!l6mo#C@1A9P3re=i}Y;IytZ(ck-3?O^Lm$nK=~i5wceh{UwwBD&wL$__v&k76~FshI3w6U+R;|im|lQer^8d#xKKrJ73>n z-96d;!Q9=)gax#f7OXJUySZb#M_=0cBlm=FE2wUb={xr^e4(u6kAfByBzxOM zMRrB5a}}M%ZEyESu(C2aP`I*hk^DbLyU#QIKTlp?!Rja=aNMx@ph9@!zh&ncdD@+y zJ%3)jegFOUpRaA-*Sg#8cVeaYkGnd(4q*x3uKu>$RQWAa>PB*TowJa?MDCZw3ybbW(`<*IvYF_QJP~A5XS^wg`#|0GE1QgdO%%1aH#Qvb#|Fu1eMN(b(}wavl-%ko(eDe^yFlWU8d2@4g2=>tuiv-Gdq0Ms~5orRSVAumdfo9J$r<| z^3PFw8J@)4-tBu|Nqu{l^YQ9aPW`{LO*wSe$B6vW-Tc&Nj?c{hnU{5@eoyJXvSW(0 zU$$3Vl+`x91Lw{Ke!stGkLthgE6aV#_K0X!$?piM-g8}2!Sz_yuixG0#q%@H?lfQM zqoK)=YxvIh@g+^4{FgHSDwo?D|BuXy4a+?JJpS9SuARcI7jn5;K3tl8?Z>O4GnTt= z{kgY#edE^Bwr0Uhp~YEUb53cB&vd%7Px0qZ_4hCD@#TkKmH#mwnAZo|jkL_pR4jUv~n z67$Nm+`kTn=P#sIc6wD_3h*oa{ao*FNT1=kLfK{dzt> zROCoT+`$jRtc%1#ZuG8s{bBL@n8!B^p1$IKUU~Mj9G`l)B>(XlDw?+Sp~1_7^bLD% zJU&$a`}zA+$!CmzbK>{?ddYt({?F0)3$MRQ@UVrw*miZ%{rC07?F{q(|9QUiai8^# z{q^BJzn-YF6x%%(VYRaw6cUAoop$|oqIfH^MUWSFJpoX z|J>M}bLM{Lj$3x7<~Ow;b6yG9pP~D<`^U^hXU}oZ4m^_MsTu6`BJZoE-{apJ@y>s3 zSL{5t_SlY--?{idd|tkT|6e_G*16qRzXsR;{rcTw`+^p&`Y^wbYglhDyqOu1{NvH= zYaS|3EB&qdkH?t%@7m^QG%w-OjWhvUXNAkw!GZI6t^4o(tTp&&WOHo6=El_Hay)E4 zYQjwl3vT8VeR*-Q-Gry&1kV9?yHA3L44ynWIa$W0V#43w--~~INM!hTJbq8)zxGva z?hj9#-v2}Tt8tsxCUs*bO-~`?m){+a{h2PmlZ%(v{`)`Pus6mskDjyI-d(|L6CAMfsm6+&^{QI(Cfh``z;U&QfeP zOXM83-#%+ReQ#X<{-3k=Kb$Q8FTUve^fyP_nHOySo9=D;mCMTe!<~R+15c+nG5`Pn zat^hYsar?TrU4+!>X4~Uw$LIaq`7~s~ z)XN_og^Es#HETYdPPY59Rd8+Df%ShcOx>{O zT#C)XB`fdV?PX7xeD>W$rMGYGwQX-OzxjRSZqdn~);G52%kPcr-@0|HjrxXt`~ICx zXK-oRTm9Y0+S*&9?MPwIs!!JWKX^SGHn1<2-~BD7BTK#G$ph(=um2vCxTK=^GPmIC z)6X_fZ_VZLJ+;0jf!WH*c+%y44U5|Uekt30`RdwiRmAs8R+%|0c;Qju+p-1q%nzw%Ib|pp|9g3Q{;OZlZN!f;+RNO^H);AR_y6V3>B&xq^Xsw*IuG^XCzdxSSO|G}SlztduKUrA{v^KYtgSoG(a`|lYCK6LBv;JRi$qsMIq zkJ_8sux%RLZ0BoUYkyh&!SzD(_nJrsyDtm*FTVdC85j5L-|zR&gXjOc;(Sc{#{`Ln zp7;JoidL(79=iYU?fp;R?pG=wPChQ#%(mL0`sMLuLiKS)N19rF_`aH+WV!tM^A724 z#Rum_zKi$$aUj=u5u59!^Va>lbn0IoKmX_V`=9nzUG=};r&iRwKfYuBn;CEJyPf`j z_FtOtovF#%_OJei^Dh0q?A-gh@Z>emvvg9nfBC+vIQwU{nRIvI_p=i!w?y|?pFNkp zO~U-?#+2vh|Ls0%d$P~GF8|21^Jk_!Z@T&Gr})g@zR!YF&vj}o)Cd%|`=Rg5w@!7= z_SJ`z^Y3)N(L#`^>U7*IsA!htLaOC$~TOcK*JWf5jo;h}hWF z)YMkcWWbLPiDzDR1k5@1TG5dyFDIwq(GkwD@bJ%@SP$gR|GlNBUvc}&SC8&G+_<+n z^Z5Lavo(2UE%P~6_Wl3L=P~S!54YQ2Yi}#vZFG(i9wMf)Nt54lk^7hUmWyOVQc)p<9S=1%Rk=6+uzba2-18B*o` zQWiHi{`x)LRK9faBhDYi3$*^PTc^KBmTT>Xs@^C^nHwKA&pbFM_PxW!=?hZz?`0ol zuvVYk_UW1bx1U?nbw323-!~=N?kne`n`^Q!1d2W!yi>?s?Pn87u?$(>X zue!eb$GrDH5;Lqsg;#8w{A84_1A9IDRui#j(N=67$3i{ z{V2NJ$>nK>{npa|B^HmGy3=+hoaZ_IOLP9tVwWouG%uaiT3Y%s&3Bn$^dHGNR~KLT zbWr-}+>257>$;-$Nd3O{g!5H&WvSLq6|1Xkkv0AGYpr@8^8eZB_0%}X*h9WL-q-3x z+GN+g8;!2=n4FD?`I1~=dv1!Ob=;uoxNGUhynQRoCCcS%9-M!s zD;RX&@zp&Z)U-BCh^je6Jp9jJ90UAH*UIo^jeeQ?95h?%$oY%sNTI^TGvj8t$b}Op?*r^oWhE!Y$dwd zhf;(yECT%%7RSx83-z|U*l+t@Y56t1`eRRA1ibQ{SntKmd(!olp-TA142{GE_x`DE z-M!@o-@KSl(aXL?e>}JLOHyj`nwEoMmPXANn|ijGe>~#inpLge6BV_oE=T6>{EG7d zUcyJ-Ka^2R4N16p+TiETZ%7@~!rC(aqH9FNNoQV0mOw zwzK`g?Bk#y5-5~O?nyM7S@8Sq_RrhjS57~3eoHFDB^joQP<0^Z4ql@>O`+BMw z_O#hNZY$<+KK%dBB@WKFyy9oe6xQ?KR{W$=e}C66N$xi$DOa2KJ)1vSbH>Xn_vfne zCrEK=-z;Cr9cZ##^2|N){clCi_6u(HIS^ESPsV6X$d?n|Qu8=Upq)rH1ddnH~aK{`F7dB=|gzC0|)0>M-rv zl!VxM3-&(l+{MHBV(s>tK!$ZYpGjRZS$Z+Uz})=!xw+Q+D|rr_I>oj4Vuy*Z=cJbE z_j{+S+dTXzV_oH=6cEdtSu#JtHzzP*YL?@5)&3q&&*RDGb{6#QoY_%5O}H(av$vqw z@6V@mp{4h=Jr3w+r3Y*f0 z{`2RPwc3vTYe|a9Sn$(Q#X5Z($EM=yok#^>MGb=TN@J1(V=f9Kw# zGv{aj59dx+h?0yhoa^+o_N&;&irl+5ZS_rmP5CYT>bZw1%UWH=YxT=sHFrkc+;lPO zl&!k(voxh|aR%O2^A=PoqpZ$)!Up@f!>^J%O`yIzOvaOlkdr@opp1Uaa_te ze^|3m{L0jztvl?mS}u+IJkhVZZuvaz<>AI+{eN6#Rtrr0;Qw1qB2=#UX_-XtTE>F8 zO^=-KzRud6`1+1PEAs;0#^mFDTn?LWf)Z{?52==e6H@!FTl6G8KEBk2ZJY&#JBOR6o7!<}$%U>EHYvrey2i zVS6m7=6gCh`0kQ3j2<185-}W7OFdR62A4kmIAiNp(>_`2WB>mC-d{PXA^z8;=@C&; zPA)o@>IL8D#!nPpEwDN(KIQhA)%{nh;=C+17rPZR7hFBOz43rJ|MAKX88uQGg3~p$ zFNKC)Teqex`%_7?@Gp_CCB<8&ywN|MF3x}3qcP&kL07fMbDj5UrO({BDWhPsu#M?7 z-)#+TTKk-)FS<6d;Qy(0(MEm_AHSA<<~XIKvGvWTXOogskE`Cd>D{m3qTOL%{=cV* zO`=q1N7OW96Oq_CWxlg@RA*%W7IlmFp7Q@#@4*#HZN8K8kJcLG6-uq$puaLKFfeZM z!d;*8Z!(9Ty7X>o<)f8)R~Etv;-SPUm>Yu3lgV#9Ie|C zbs(ZICEB?(Rq0T>{TIf-(4Y6-|BcHvn{6qw!_W3*{9Oi@z#}Ios~2lM-nr9~;aPh6 z6TSqdE&HBc6~E57>Qhe5$*sPgmsylAl zTk(V5gDJK`Uyoi;+H|7qf>mAZT7@T@WP3K9D&SqSSApA<)qPRb(txiviw=1kW+=?7 z*|D`_=D~9%qIW#!W^LYeDsQH8%-@>+{m*RlPG}aXuKgG7?>@ULYqP(|feh7D5$)<} zRsxQ*R3s+vvgw@5{ms~MZ^f0zapj&o^VxQMNPPZm;kRGEtp3)`uiHQ0IDhU%fd`Yk z^%4sUC#G$lsm#Rq^HunMAL$$1EYtMME9w7ii3zTdM}6TJOV7JZXIb=ne(zpcbMEimC&yoW*|}H#Y+a1T z#M*uD_TT)v>gJPb;rIKO)vT5H{_{`V&W)1q=d8>Yyl&KWeuhcCT;;!m`Zufoa6kH} z_T+5()t@2Xdj*YA0G%IbByUY%)Yu>ZB#epb0=YQWLo-|n9Nwp2AT-ZDu%uKajqX-rk5kxQ!# z6OZN*!{={aG8Gi)&V7`7S*WV}tf%_Q3;zBO%l0%JOnKPxY`6Ef1RuWNmoI&nN`C!# z#x9 z!&aTQa?Wl(s|jbX7xsjPO{)@ppYz5|u`gHF&c3|#jVQ}wi#E?U?>wViZ6@yKcbmFw zv2<7R+0+{<%cG0mv*!6(u6+OI=Bo2;E`|4EKE`Gj*p*fo*?fB;<-^VNJ3LtLF5mOF zZ#Gr!Z)IUu+uFi3&%)){iznapJj$O}<}Tomsebx%&wu%UeUFd#Z{D&6w2|fZ_Wb9Y zPU}71Jpb>TnWhZl@im}L5>H-STzsVP3}{Y)-R=Y9%pSHco6>L2vCWs-sa|t{4U$%t(nH{`Z=eec(Ja_)nm8I!h;s8xOoO| zjVkVR%84jmvcSiO_s{xA+N%o`!Xo?)g3M2z{vVgSbEc))5=Y1&$0CfwaWPb@ByDb; zF+Op4-M$QikT(|mFaC0Z2Y>g zQLRLpF)-od-*qb}y2~qei_xw1NJc8J@9B(GldF3>Ki*utT)gA7xQX(~^2~Ux zJzn{%L4#n3jJKngM^X<=$n`I6nHzKOt z*)JS8C%Z)BW7iWm#ppS2Pux2m7}ai|TO!gG*L&dH%`*}biiT~4&XKaqSQy_#Wkf4F z-Ii@_dz!9$RoAm|#olVU2*xtKEzRHe|NpC*5dGxx6pP@)R+rfnUNfAjW60b2G%Tvu z!(75!Si&>8T2t)1(KglX$4i?8rNz>sRs{CtEiq_J%qU8`A!C%Yfjcw!ul7fthT43Y z>knRU?wLRRW09$ae$&Dl9J~~NOlk6roRQnK;wyvAstkFTfR5^riE%%w+os>pU$M}8 zZA@K$C8t}K#Bt4>C0n+;e!2gzV7cjp4Z9{zP>E7{Xz4m{$G6(7IkC1!pT9b%yZqzM z%SU~4FYfr>u9Yr}%cukGsV;KR*6Wt+ORe+kqoC@4!4& zW2Q%QEwx$OBA0sjElhvlv`b;Rw0@QTk<_)<-OWz#F}U1fvURG=bXi`Lf~mc`tk(*( z+_sJ|QBbV;BRpTk;jqDyn>m;Aw!bW~O25aDqN94VpOsBkrBi*&=N1o(Xzt5XrBvoz z&Ykz#B%rl-W1(S{V7b>i_34d{`;qIOAbW7654YraXRY=jbvKVGQ0dezye|*}bVQ6?Y;>aW2e7;{lT^oBR@)oCA^Lhkr-)X^bCS8-UUGrkswOK5m zlM`5astW%6C}fCQD|R<;`p%t}yY9Z5>CW_P&r?aRg7foiebnltv~GmC24?ncIhEFW zGB81<&Ci-?%D)J6&!pUs?{7`&t&Ta?N!IMYLRWu$2o!oTUQE|q@{pyY1tLL4Z_is+cBI!qeqnWPjJeJpfTKw~UdTh9oqS+CFAnrr?t`Qvsl=Vgy@!xZzn`(+YK zmaJ?pm1cJAxcuebl0D16UaK_z`uyyTj=T13d7o!xnjct__kDXU@7Fiy{_S6!yU?3y zTZ6m(uZt_Rdfl4CR=aM#x#Vir+)Dlh*I!?J|J^(H!2BOa)L)$2^7Kc-5upZ_&7uF# zZ%Ym>%oLk){h{eq z6=CMRQ|zlR`YEJNnzmn$E8+PzF$J0X26yURLXvXRGJkoqLZi zi<(@0;na@Pn!csaBjuOKMEX}ed@L?`ysa?ll!HN|M@!i5lZ{VVoLmnzEV$a_88!dP z1z)cJRi}E~SfgW4+OJ$|u~O@-TgG1B^}!owG3Y!`GwDA+-Eq27N@b;GI-6Ag@txai zkMTOVFsJR}x^h4zwa~qVLHx_$9?z67-` z{@F=d-N)~n?or4$Yw6wcL1tBHZT%uM;|UYLi0tp=|%mkQdvv zp5J@*hs)yS$C^8rW2552F5IZT;hjBmqE2c6*KxH!r}E=-+vm*Kv{vYJsKxD#voCz# zQ)++4ti$T*0dNtD`!u&*)MGYR$dAL)ko5O2XN?g%{Nw@i4Ml~(BGH4EaIQ5#! zafe9?Z_BLxcloPLZugOS;watl_;|muRPU!4hiNN&9=GhMa}7)2Z!HYam%Nc%P0P5NS$?(I|K9xi$3peI^wQ**RaFnf{>NA^xSRLk`TUq?!Sml9 zZuPc&9FV!eG{CFg&$oHUl5I!c?9Sb4X1Vpf`JxGHYO}g_C*GQS>UxjH8x~KIpJ&qT zoMnz1&GacTkrHfsXztFJkel24v0{!oWA$D+&q*G0G<>%+Uiox=bw!fGQJqOKCxZ6e zE1&-E;{oSaWjVSW?*uNcl<_|&ov2ZD_HR$1-|^>F_kvq3o_@O9`{(mM-sl;f78@rn zD*ygqk6AC+7q@owc8mR*@kPKo64)d zK+tQR@A}g-e|b2FL@n%RT9U)EMn2Gp z0j<3Z&u#_Hj^)^A~+%il=d&1;zH zCK;j@Tldbx+vH`bx*5mZ4IT5FxsL6)Bs#l)sdVPN=^BTuR?3$juBYr!~FYCPgmh zp4E+MqMnZ(o4U7nJ193unxFXn?)LQOJ)3Hx*$!DJTQG#`9u(TFlCb`|GEZVht3$Z% z+JFfL9r;GCS}}j4gpGa(PHNwCYstjeUd^czpJ$w%n#^Ss#NQs^eKll`a*2ju;RB)D z(cztiwWsp?UoMMzy;jg|&2P;tk$I2&Tvg706w}f>IOT8L&4(v;>2H4gp?_(K|L5|% zUspw+iCS9r>EGI>@^w-lx!+g*e15VlD0zyC-^+ZJf{G*6b)Td5z2A8IC2!I%qidh#tj0+y3vcEm^(b~Ny2Ehh+&LpTXJHeg8zBqC+a=jQ z3*|hE3Fe;2)03O3>gO5k5v*Y5lO%3b@kh68x?zvntBa}Er+ziMF!64s(W|_ZnVW6y zX)NwZVor9RGb>9`@&1dR*XN{<9ot!4wzO~3EYI-V)vRe!ZH{jo^y=&uP4PWHqw~%D z&&8*oZ3=Z;IQxLc!b#m1W=U-Op?mw_r{8LqRfDSYQYFGmb+ycw3ALprYgTMOrF_As zLp7*vvdClyD~|^+I?DGwwA%OE(EAIUVRPXu<_&+2-hXSdUTS3tjl^V`iiHgJbE=b z&~4_k=BJ^b|2+?y$=7}0^o~zbfeb2fZ$k2vPTf`H-)wugQM>iW@0` z^^o&s!6%}63zZxupIw@;E7UUMMjXRrsc-M^zqjfP-8|vS;w!yM2UP?+qhH3|oWxx^{-R>U$Z$r&xS-$oTk9A@yO6kWKKr!vN{P3ekO4{1md%o{| z&pJWHbIDDYNt{BtLXD|^!!4(|o-X{W>1Z!GxjSs?29x<|t>tTj&s+>D?f5Hu?uyQ| zUC*QM-rmZvt>VDfSwb^HgsSF!otecmIqI8i%C4pmuIWS_*YzgPEamF>3fkjU=d(%<(hWbc2k5dUnw-QN92W%vJlyRs?I|F>H| zm^l4H*6tbqO_tu@&a$nLOZ1r(|AUapThC-CypLD7-1_EKX43_|3t=5R?#h+FZ{J_n ze6Yc7v7^j!li6q4d)X@jJP%A(_kXs8;GQ0Z*}D2dm)d6&lLV< z?Vn%49cyz$)Nh{U{E|A$3sa`Ho|{hLF z{ytS-?zm}xRo=c^YJW@AGne50Tf1Kz`BJoS*_|hgW~=P~B(%={-kvS1Q@cv%o1gDJ zE8!vJe5>EHkFWB$^t#8D{rBH(`kQ%hLrmnK_dkyW&ih_me&DP4?YZ*77d2L-%G%n# zJK>f0^@{zjr`50g`82oL&F_l2n*9Ci4-Q##z2aiUxn;9KJJ2ex`ntR*+r3lZz2rxR zO?(GTe7!xDlf~z3aR_!^Y7xcu=*b#e)04Vi1@%O|Utc!$KDRbZknyZ!^VTh1M=yFm z_t9I|qG`Hl>Mqw~8mA}Ru4!5zXIpua?}uNi8~416AyYR9h}KLxZV}^mC3oHtDK~?% z9OtWZJVYz!KGe?<>h}E|`^hCm#Ng9~KBK=|K3P?T-IhAa+7z_9;6q5_i~}DH-`Af0 z`e*m?9YOO?f77m8slViMXT@>%z7I|F|8w=a$FpfnoZ;KECGVNpyu9Amj&iRVIX`r( zEtC1(T_M+?xick@<@JFK)1`%PBp7<#K>NYJy}5Z9bVSXoSFdIoGc3NSk*@hwS~$sn zr^$+k^{aC?gw3oA`}%9vyy*Cb&MuZ&;ecfo<80@_)9g?;M}V z&U$Ta%CtMTPrti!`T1p|rpUWHWkn)BAC2eyD8#(CWq-wO<+qRC-?rNS(V=?b_8<3u zUR2)mpmh7?ibtY4TU!5}$gy-k#ln2Wc}3}D=WSNo)@89TFOXdAnr&|$V9#OPXt<$V zE{cz<2DC=(r0Vny)!*~V-rhQT>eQ*3#td)EW*@5`-BW^b@6>~W}z z(Ve9H+vT*E`BvV2vo9J?*Wxz48*=qp-h4~t3z?-7!GKUYc=z$)x@O zo%9DO2^Jd@XC~IaJo^0e-2Rw^?=>zWo)h1Eih1v#@_m)dDUMxUNsO+UElzW?B>f+j zpSdz`_MCI8>I84T?qKrpk>v{DE}LZYIqtwF^X~PNLuO{SznRk?@!nUWr?=Lo;znKm z$NK;0@9>$&oO9AvaPnW>Q~&DOyibOz?pHQsCWj0D64CHq$ys@Nq2j!z3G0nw6%1Y< zv+hj%{_bwgm&Ni^7rXao9pku?VIsH1=SQ;4nCOzEtf$52I#OQgY-Meh`pfXOh`BTdB zPRs31$y=AB8_llGAau)Aq^00`Z28A2%WYggf7;G`Z*E}ff*#%*%hjuH-@bQDc>afq zF#h^pK?C7~N8D%byn7;J;(=gw?x(M}N&44Z+R+jyrk`4HX^mWzfUVfvwnw@bLb%V` zB-cbfb2{a{=l$7|uV&sovy1vRx@gX|Pbu$xwa;EoDx!Pm_hr&M3fw1uv{-2FwdVVK zafT&o+OaR)XRN9SlgiNgGpTZAfO%oMt6#3OS@rr=4JxJ!-9<&izh3#1;jhKHfB(M| zf^`p;?`JTNbG)&MXHRC9dACWZd}7S(-3D%+z6qUHuUE<4v(UAkyH#W5M~N=)sZ$p9 z<(eo@2<>tHkve-);R=1zn=+e=*DD`I5K8Vcx=o&i;vmg zJ>nHxWpSs4m}v8cE24{J;xg~^|M@gWbJC=_%UqfHW;brVcI>fyfr)XKk(~DNw3afJ z*?xc0Gz_$L&a!Qp&G@!$>$}Bij9+!+78}fw@cS0@@5yw%hlgZ+tNzY7cw~asR@uXK zvDf*NvoA+(s!VzE+}V6<+9u1HFJ4~I&q$q9`lsDaV)v;x3_5y6^e@*!@T2 z{QpAM``>1X?P3&UTg>=*oquwzN@_{G>f2;j_bJ8CbrszuM2>CLQl7E*dTvyIp24M} zDXLSBrruGyZux73l)m)FWt+L1%KC$n6X#sBJ!|IT zko`7Cd~R=EV8D45|`YwSI9vi@Q% zR{bbGR=-Y@R2z?l^3gx?6Bgu0WZvMjI+?lWfJF2q>zn55Rvvr)S}EWB?26gD`=(|Z z`0X|7Il1t_BbzRZZF~MNJ`(c0@ZWEh&>IFi=a-tO-6&>fJS;P9P9npa=SDA=3$*$G7gzrFsl_fhE;6@s&OzE+)pM<2TiYk#!Jt#xgH>IbTg~l@X)`hEde)#Op-%p zX5K3Pu6}Q)xvgA})U@AEpRJbRx?|pxJpIAj<7>VK-*R;7$*$((o@=Cf!nVWbrbb5& zhk=aL-Hm&h70U0HPPcm+d)uuQ&Z3 zVt(@ZRn^(%zT!DaKHIb$r$u(k?r(~JvLa#LpX!-A|NeYb|5p5AVEBbsH)ibTxcz1w z|1{l|R{CD^8k}#mGVWA6FfIF*b@_w7`$8I1E;g}W-jv%o!F$C@`+h-{2~L;JC{JG- z=a!YgpcA(4jKt*Y|IN+J&dp(*F@OH@>#r}qEz2~U%~132^Zay!7ngIKk~2=Gd07iw zUc0RB;vSPoU)7n)pZuJ@R30e@wx;*^|$g$p!8f+_2@tgPXDYZ^j=FKXzoL`;xaEhM@`piOXcC z2-lg%_!-Cl*_G-2ZkddH)Z{yp&rX(%`uf#e^Zn0^6I%N`u4pU0H2I^d&meX7hePZl z!^0C!TnTrJ(7S9~{jK1~hs4TTm**{;e6r1bPn2)oxS`(Wm;%`s5)Q9N0tL8^vHP)*b&ri)+J$< zPMrT2Y8)Hf`i<$dbJC678JXvTlMgrPutY>V8x#Lb@HAvR)7YoZ^8H@5e)acv zS7+z%o7t_mtHXfjW!dgC=g-f#WG?vdz%eW=?8W!rs@@{U4d?nDn6m@$ZFrWTa zeE)*gY?pdmoacINt>63Me{I&x{XZ7hZn&_a(BrPKS5{hf?A;y0hYZ#}mzZ*DZ|07+ zMwe`>_$8ZcnPfNKsX0{g>{9*)51sW&?rwj6Nz0$?``OWayxo=6ZBrTR!pmGU=I4HT z*DwE+b^TBA9T(sInV8YadCM|pSx&_=fu7Q1E2m^W5ef1#wGs(popa@b#gtVs|K^{b z!y_4Td$HojXA`IGkZ2b1W7@s@Me6j}W3%u7Nt^fk&htqsoJvmM#WK&%NH$!(8d|ki z?(xSRNBq+wy?H+$$Ou{6=~a8`+LXET*CZ}FWgDoMA8On7XdBzU@`<+Q%yvo2_djoW zl_chGQaUrmG-%NYtx9dVhf7vmQ*zt1F=h9DsZSNf3xyBWu-uk%36u=JP;#}S@KF|5 z-TZa#no~t5KeJ|hefU7ppFp*^mG>4e6F$@JTdKrEZ>b3 znYz84^by)=E= zZ~xcVg6ih`NIrh`o$blJ*5zy=`yNV4cDygSQf$96dX3v@MX${At4^iU7A#6!5X8hi z<4;ZNMQ-NojfW0ga{IX`nD_dbJd@M>-kuFd*cWO{%ibXQQzZ1!clWB?3l})Fbyuyr zV!3A3(FmihkAm*+w@%FxG4^}#qoaJ^SGRfJkIa>cm%M#U?)=rM4llN~3`?s#mUN5kB_|mvPJU4%(MgFj+(vyaY8Zf!>Zd4j%i1} zY5U^-QS*BAT;`pcU#C}0UCRDpQu~(!nXBHvJnxkosTLy9P{MoW+}XmTqTwHIUEeot zv3vif{QGwA_W%E9+|4q_M=d8OXT!E_$A0~?x*l6D%P>8@Ofvr08^a_Uje^uqKWv`{ zm9E}A;nM2VsauRiWY+gj-?I8u+)tfDtcMHcHMRyFSBR6&<9pe>sjZO zMwy-~HPyV+BvlJMuhcvbSM}pPsnDpbeDC8m_m6+n-#+=!DY!Q<=-g6Pv5d{dE6-Zz z*&X4I`&n6WC6wiD$A$cfslwkDdv&bcC3&)(H{5A!PgHtLiIhT#7S~42TL+}_9kkWg zc5z1P9etUmaD3U~;^Gsw-|sLVxc~p}{oK4vQ8#(*NZFvO)e{X@nb^ot4HFA%T(XoyZ3OteNBga#nJSK7sG|ioLqvJKT0iPlV9t3 zQJZxIPhs5h6JP9RyH1wdyT?%Nd1%B6ppck`yZE&jORMuXfI#vKou zxFz`7*Q{T^x&D7$-oBq{AiVcem-dd&-0=&1*$!!xeHQwq-F-3G`s8dWg|iKX+8Z`* zVDMddS!7n<>wELx++DV`M(_2GZuL2V37dEGZrr`d>Pf;p`GRXlL`+iuE)#iban_09 z-xx;*+S!*TY4u8Vr{ zT=NwyqVG?}rYmnMtO`(OUuO5gE0^y;xu3C$RGjOv`;v zxo_;P7T9|g|5$G!dUa;l0ZZ#$cfL$?{&Qfpz4wnL?i&m)D~LE}wcOlhaGz5qD*v;< z0gW?Tn`?L)-CNbBxJGThd}e!Vt6xIvgjFZp^tTys8NXfd;`a1eHVe+*PHf2wezC1d zsLS>4p7*A@&0E-*dMAWAXSnj|^(icLXV$wZapYm(o6e*OYSRjyzs;|=Ryw2||I_Q+ zySu0V{IR*4H{Je6v;B`>pDXx}F{I>n-pw=5XZzLn{s-U7lHDa%X3r;Oick3}k*cK@ zH22l4IbFTW0&=giFn+aUys7o^@ow(4TQf~8XZe0+eY5-g&NmCiu1|Y?G57(uO$!cU_;=ZNo9#S2WUeV@=g-S*owI%QX=}Th3D5UGx_lzJ`{?|um;H5* zZ@u|hdqcv`BbG<&RiC$-xT?Ph+5hfZr%l!;cZb^2#8);?FJyiG(m2I-8ILoQN%Vvz zn(chDLK}J=pUSghZQ-Tkd$i>XVJ0_1xs^%&fK2S94u>j#a!m7`Mz$;rT-|%Tlo~>a$L} zuAJo+y}@XvgoLK2RWHkzg={-8QzR=Igvpucg@v5l<8 zOZA@pe{F8x^}hO&-aFeX%gudkb}_x4SvvdB&)vKCJa%TUJg9BQd%s9GP{dGTsby(- z)|7h&3AGtId&-43_$_>!6@Kj2h8H)oS^DN)SI#(lXv0pmHD9Nm2$s_-ixpRUGI7S; zpVg03U!PNpD}-0{8kUyJWX%gqB4!iocorR94>Z1b5vl;}0*gGtQal z96G3_d=vS+lW(t1g@p!OGFKBkG&YM;K zk?${0?0%luWv#G$`FYoZO|Ms}v�aowA~H;+mJwK`j8ygT_kpjH6gj2sB8_CDhi= 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 U1H%Dk28ISk;xI@pNDoLa00HsmbpQYW literal 0 HcmV?d00001 diff --git a/crates/zed/resources/windows/messages/Default.zh-cn.isl b/crates/zed/resources/windows/messages/Default.zh-cn.isl new file mode 100644 index 0000000000..d900c7d448 --- /dev/null +++ b/crates/zed/resources/windows/messages/Default.zh-cn.isl @@ -0,0 +1,403 @@ +; *** Inno Setup version 6.4.0+ Chinese Simplified messages *** +; +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). +; +; Maintained by Zhenghan Yang +; Email: 847320916@QQ.com +; Translation based on network resource +; The latest Translation is on https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation +; + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=简体中文 +; If Language Name display incorrect, uncomment next line +; LanguageName=<7B80><4F53><4E2D><6587> +; About LanguageID, to reference link: +; https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c +LanguageID=$0804 +; About CodePage, to reference link: +; https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers +LanguageCodePage=936 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] + +; *** 应用程序标题 +SetupAppTitle=安装 +SetupWindowTitle=安装 - %1 +UninstallAppTitle=卸载 +UninstallAppFullTitle=%1 卸载 + +; *** Misc. common +InformationTitle=信息 +ConfirmTitle=确认 +ErrorTitle=错误 + +; *** SetupLdr messages +SetupLdrStartupMessage=现在将安装 %1。您想要继续吗? +LdrCannotCreateTemp=无法创建临时文件。安装程序已中止 +LdrCannotExecTemp=无法执行临时目录中的文件。安装程序已中止 +HelpTextNote= + +; *** 启动错误消息 +LastErrorMessage=%1。%n%n错误 %2: %3 +SetupFileMissing=安装目录中缺少文件 %1。请修正这个问题或者获取程序的新副本。 +SetupFileCorrupt=安装文件已损坏。请获取程序的新副本。 +SetupFileCorruptOrWrongVer=安装文件已损坏,或是与这个安装程序的版本不兼容。请修正这个问题或获取新的程序副本。 +InvalidParameter=无效的命令行参数:%n%n%1 +SetupAlreadyRunning=安装程序正在运行。 +WindowsVersionNotSupported=此程序不支持当前计算机运行的 Windows 版本。 +WindowsServicePackRequired=此程序需要 %1 服务包 %2 或更高版本。 +NotOnThisPlatform=此程序不能在 %1 上运行。 +OnlyOnThisPlatform=此程序只能在 %1 上运行。 +OnlyOnTheseArchitectures=此程序只能安装到为下列处理器架构设计的 Windows 版本中:%n%n%1 +WinVersionTooLowError=此程序需要 %1 版本 %2 或更高。 +WinVersionTooHighError=此程序不能安装于 %1 版本 %2 或更高。 +AdminPrivilegesRequired=在安装此程序时您必须以管理员身份登录。 +PowerUserPrivilegesRequired=在安装此程序时您必须以管理员身份或有权限的用户组身份登录。 +SetupAppRunningError=安装程序发现 %1 当前正在运行。%n%n请先关闭正在运行的程序,然后点击“确定”继续,或点击“取消”退出。 +UninstallAppRunningError=卸载程序发现 %1 当前正在运行。%n%n请先关闭正在运行的程序,然后点击“确定”继续,或点击“取消”退出。 + +; *** 启动问题 +PrivilegesRequiredOverrideTitle=选择安装程序模式 +PrivilegesRequiredOverrideInstruction=选择安装模式 +PrivilegesRequiredOverrideText1=%1 可以为所有用户安装(需要管理员权限),或仅为您安装。 +PrivilegesRequiredOverrideText2=%1 只能为您安装,或为所有用户安装(需要管理员权限)。 +PrivilegesRequiredOverrideAllUsers=为所有用户安装(&A) +PrivilegesRequiredOverrideAllUsersRecommended=为所有用户安装(&A) (建议选项) +PrivilegesRequiredOverrideCurrentUser=只为我安装(&M) +PrivilegesRequiredOverrideCurrentUserRecommended=只为我安装(&M) (建议选项) + +; *** 其他错误 +ErrorCreatingDir=安装程序无法创建目录“%1” +ErrorTooManyFilesInDir=无法在目录“%1”中创建文件,因为里面包含太多文件 + +; *** 安装程序公共消息 +ExitSetupTitle=退出安装程序 +ExitSetupMessage=安装程序尚未完成。如果现在退出,将不会安装该程序。%n%n您之后可以再次运行安装程序完成安装。%n%n现在退出安装程序吗? +AboutSetupMenuItem=关于安装程序(&A)... +AboutSetupTitle=关于安装程序 +AboutSetupMessage=%1 版本 %2%n%3%n%n%1 主页:%n%4 +AboutSetupNote= +TranslatorNote=简体中文翻译由Kira(847320916@qq.com)维护。项目地址:https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation + +; *** 按钮 +ButtonBack=< 上一步(&B) +ButtonNext=下一步(&N) > +ButtonInstall=安装(&I) +ButtonOK=确定 +ButtonCancel=取消 +ButtonYes=是(&Y) +ButtonYesToAll=全是(&A) +ButtonNo=否(&N) +ButtonNoToAll=全否(&O) +ButtonFinish=完成(&F) +ButtonBrowse=浏览(&B)... +ButtonWizardBrowse=浏览(&R)... +ButtonNewFolder=新建文件夹(&M) + +; *** “选择语言”对话框消息 +SelectLanguageTitle=选择安装语言 +SelectLanguageLabel=选择安装时使用的语言。 + +; *** 公共向导文字 +ClickNext=点击“下一步”继续,或点击“取消”退出安装程序。 +BeveledLabel= +BrowseDialogTitle=浏览文件夹 +BrowseDialogLabel=在下面的列表中选择一个文件夹,然后点击“确定”。 +NewFolderName=新建文件夹 + +; *** “欢迎”向导页 +WelcomeLabel1=欢迎使用 [name] 安装向导 +WelcomeLabel2=现在将安装 [name/ver] 到您的电脑中。%n%n建议您在继续安装前关闭所有其他应用程序。 + +; *** “密码”向导页 +WizardPassword=密码 +PasswordLabel1=这个安装程序有密码保护。 +PasswordLabel3=请输入密码,然后点击“下一步”继续。密码区分大小写。 +PasswordEditLabel=密码(&P): +IncorrectPassword=您输入的密码不正确,请重新输入。 + +; *** “许可协议”向导页 +WizardLicense=许可协议 +LicenseLabel=请在继续安装前阅读以下重要信息。 +LicenseLabel3=请仔细阅读下列许可协议。在继续安装前您必须同意这些协议条款。 +LicenseAccepted=我同意此协议(&A) +LicenseNotAccepted=我不同意此协议(&D) + +; *** “信息”向导页 +WizardInfoBefore=信息 +InfoBeforeLabel=请在继续安装前阅读以下重要信息。 +InfoBeforeClickLabel=准备好继续安装后,点击“下一步”。 +WizardInfoAfter=信息 +InfoAfterLabel=请在继续安装前阅读以下重要信息。 +InfoAfterClickLabel=准备好继续安装后,点击“下一步”。 + +; *** “用户信息”向导页 +WizardUserInfo=用户信息 +UserInfoDesc=请输入您的信息。 +UserInfoName=用户名(&U): +UserInfoOrg=组织(&O): +UserInfoSerial=序列号(&S): +UserInfoNameRequired=您必须输入用户名。 + +; *** “选择目标目录”向导页 +WizardSelectDir=选择目标位置 +SelectDirDesc=您想将 [name] 安装在哪里? +SelectDirLabel3=安装程序将安装 [name] 到下面的文件夹中。 +SelectDirBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹,点击“浏览”。 +DiskSpaceGBLabel=至少需要有 [gb] GB 的可用磁盘空间。 +DiskSpaceMBLabel=至少需要有 [mb] MB 的可用磁盘空间。 +CannotInstallToNetworkDrive=安装程序无法安装到一个网络驱动器。 +CannotInstallToUNCPath=安装程序无法安装到一个 UNC 路径。 +InvalidPath=您必须输入一个带驱动器卷标的完整路径,例如:%n%nC:\APP%n%n或UNC路径:%n%n\\server\share +InvalidDrive=您选定的驱动器或 UNC 共享不存在或不能访问。请选择其他位置。 +DiskSpaceWarningTitle=磁盘空间不足 +DiskSpaceWarning=安装程序至少需要 %1 KB 的可用空间才能安装,但选定驱动器只有 %2 KB 的可用空间。%n%n您一定要继续吗? +DirNameTooLong=文件夹名称或路径太长。 +InvalidDirName=文件夹名称无效。 +BadDirName32=文件夹名称不能包含下列任何字符:%n%n%1 +DirExistsTitle=文件夹已存在 +DirExists=文件夹:%n%n%1%n%n已经存在。您一定要安装到这个文件夹中吗? +DirDoesntExistTitle=文件夹不存在 +DirDoesntExist=文件夹:%n%n%1%n%n不存在。您想要创建此文件夹吗? + +; *** “选择组件”向导页 +WizardSelectComponents=选择组件 +SelectComponentsDesc=您想安装哪些程序组件? +SelectComponentsLabel2=选中您想安装的组件;取消您不想安装的组件。然后点击“下一步”继续。 +FullInstallation=完全安装 +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=简洁安装 +CustomInstallation=自定义安装 +NoUninstallWarningTitle=组件已存在 +NoUninstallWarning=安装程序检测到下列组件已安装在您的电脑中:%n%n%1%n%n取消选中这些组件不会卸载它们。%n%n确定要继续吗? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=当前选择的组件需要至少 [gb] GB 的磁盘空间。 +ComponentsDiskSpaceMBLabel=当前选择的组件需要至少 [mb] MB 的磁盘空间。 + +; *** “选择附加任务”向导页 +WizardSelectTasks=选择附加任务 +SelectTasksDesc=您想要安装程序执行哪些附加任务? +SelectTasksLabel2=选择您想要安装程序在安装 [name] 时执行的附加任务,然后点击“下一步”。 + +; *** “选择开始菜单文件夹”向导页 +WizardSelectProgramGroup=选择开始菜单文件夹 +SelectStartMenuFolderDesc=安装程序应该在哪里放置程序的快捷方式? +SelectStartMenuFolderLabel3=安装程序将在下列“开始”菜单文件夹中创建程序的快捷方式。 +SelectStartMenuFolderBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹,点击“浏览”。 +MustEnterGroupName=您必须输入一个文件夹名。 +GroupNameTooLong=文件夹名或路径太长。 +InvalidGroupName=无效的文件夹名字。 +BadGroupName=文件夹名不能包含下列任何字符:%n%n%1 +NoProgramGroupCheck2=不创建开始菜单文件夹(&D) + +; *** “准备安装”向导页 +WizardReady=准备安装 +ReadyLabel1=安装程序准备就绪,现在可以开始安装 [name] 到您的电脑。 +ReadyLabel2a=点击“安装”继续此安装程序。如果您想重新考虑或修改任何设置,点击“上一步”。 +ReadyLabel2b=点击“安装”继续此安装程序。 +ReadyMemoUserInfo=用户信息: +ReadyMemoDir=目标位置: +ReadyMemoType=安装类型: +ReadyMemoComponents=已选择组件: +ReadyMemoGroup=开始菜单文件夹: +ReadyMemoTasks=附加任务: + +; *** TExtractionWizardPage wizard page and Extract7ZipArchive +ExtractionLabel=正在提取附加文件... +ButtonStopExtraction=停止提取(&S) +StopExtraction=您确定要停止提取吗? +ErrorExtractionAborted=提取已中止 +ErrorExtractionFailed=提取失败:%1 + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=正在下载附加文件... +ButtonStopDownload=停止下载(&S) +StopDownload=您确定要停止下载吗? +ErrorDownloadAborted=下载已中止 +ErrorDownloadFailed=下载失败:%1 %2 +ErrorDownloadSizeFailed=获取下载大小失败:%1 %2 +ErrorFileHash1=校验文件哈希失败:%1 +ErrorFileHash2=无效的文件哈希:预期 %1,实际 %2 +ErrorProgress=无效的进度:%1 / %2 +ErrorFileSize=文件大小错误:预期 %1,实际 %2 + +; *** “正在准备安装”向导页 +WizardPreparing=正在准备安装 +PreparingDesc=安装程序正在准备安装 [name] 到您的电脑。 +PreviousInstallNotCompleted=先前的程序安装或卸载未完成,您需要重启您的电脑以完成。%n%n在重启电脑后,再次运行安装程序以完成 [name] 的安装。 +CannotContinue=安装程序不能继续。请点击“取消”退出。 +ApplicationsFound=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。 +ApplicationsFound2=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。安装完成后,安装程序将尝试重新启动这些应用程序。 +CloseApplications=自动关闭应用程序(&A) +DontCloseApplications=不要关闭应用程序(&D) +ErrorCloseApplications=安装程序无法自动关闭所有应用程序。建议您在继续之前,关闭所有在使用需要由安装程序更新的文件的应用程序。 +PrepareToInstallNeedsRestart=安装程序必须重启您的计算机。计算机重启后,请再次运行安装程序以完成 [name] 的安装。%n%n是否立即重新启动? + +; *** “正在安装”向导页 +WizardInstalling=正在安装 +InstallingLabel=安装程序正在安装 [name] 到您的电脑,请稍候。 + +; *** “安装完成”向导页 +FinishedHeadingLabel=[name] 安装完成 +FinishedLabelNoIcons=安装程序已在您的电脑中安装了 [name]。 +FinishedLabel=安装程序已在您的电脑中安装了 [name]。您可以通过已安装的快捷方式运行此应用程序。 +ClickFinish=点击“完成”退出安装程序。 +FinishedRestartLabel=为完成 [name] 的安装,安装程序必须重新启动您的电脑。要立即重启吗? +FinishedRestartMessage=为完成 [name] 的安装,安装程序必须重新启动您的电脑。%n%n要立即重启吗? +ShowReadmeCheck=是,我想查阅自述文件 +YesRadio=是,立即重启电脑(&Y) +NoRadio=否,稍后重启电脑(&N) +; used for example as 'Run MyProg.exe' +RunEntryExec=运行 %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=查阅 %1 + +; *** “安装程序需要下一张磁盘”提示 +ChangeDiskTitle=安装程序需要下一张磁盘 +SelectDiskLabel2=请插入磁盘 %1 并点击“确定”。%n%n如果这个磁盘中的文件可以在下列文件夹之外的文件夹中找到,请输入正确的路径或点击“浏览”。 +PathLabel=路径(&P): +FileNotInDir2=“%2”中找不到文件“%1”。请插入正确的磁盘或选择其他文件夹。 +SelectDirectoryLabel=请指定下一张磁盘的位置。 + +; *** 安装状态消息 +SetupAborted=安装程序未完成安装。%n%n请修正这个问题并重新运行安装程序。 +AbortRetryIgnoreSelectAction=选择操作 +AbortRetryIgnoreRetry=重试(&T) +AbortRetryIgnoreIgnore=忽略错误并继续(&I) +AbortRetryIgnoreCancel=关闭安装程序 + +; *** 安装状态消息 +StatusClosingApplications=正在关闭应用程序... +StatusCreateDirs=正在创建目录... +StatusExtractFiles=正在解压缩文件... +StatusCreateIcons=正在创建快捷方式... +StatusCreateIniEntries=正在创建 INI 条目... +StatusCreateRegistryEntries=正在创建注册表条目... +StatusRegisterFiles=正在注册文件... +StatusSavingUninstall=正在保存卸载信息... +StatusRunProgram=正在完成安装... +StatusRestartingApplications=正在重启应用程序... +StatusRollback=正在撤销更改... + +; *** 其他错误 +ErrorInternal2=内部错误:%1 +ErrorFunctionFailedNoCode=%1 失败 +ErrorFunctionFailed=%1 失败;错误代码 %2 +ErrorFunctionFailedWithMessage=%1 失败;错误代码 %2.%n%3 +ErrorExecutingProgram=无法执行文件:%n%1 + +; *** 注册表错误 +ErrorRegOpenKey=打开注册表项时出错:%n%1\%2 +ErrorRegCreateKey=创建注册表项时出错:%n%1\%2 +ErrorRegWriteKey=写入注册表项时出错:%n%1\%2 + +; *** INI 错误 +ErrorIniEntry=在文件“%1”中创建 INI 条目时出错。 + +; *** 文件复制错误 +FileAbortRetryIgnoreSkipNotRecommended=跳过此文件(&S) (不推荐) +FileAbortRetryIgnoreIgnoreNotRecommended=忽略错误并继续(&I) (不推荐) +SourceIsCorrupted=源文件已损坏 +SourceDoesntExist=源文件“%1”不存在 +ExistingFileReadOnly2=无法替换现有文件,它是只读的。 +ExistingFileReadOnlyRetry=移除只读属性并重试(&R) +ExistingFileReadOnlyKeepExisting=保留现有文件(&K) +ErrorReadingExistingDest=尝试读取现有文件时出错: +FileExistsSelectAction=选择操作 +FileExists2=文件已经存在。 +FileExistsOverwriteExisting=覆盖已存在的文件(&O) +FileExistsKeepExisting=保留现有的文件(&K) +FileExistsOverwriteOrKeepAll=为所有冲突文件执行此操作(&D) +ExistingFileNewerSelectAction=选择操作 +ExistingFileNewer2=现有的文件比安装程序将要安装的文件还要新。 +ExistingFileNewerOverwriteExisting=覆盖已存在的文件(&O) +ExistingFileNewerKeepExisting=保留现有的文件(&K) (推荐) +ExistingFileNewerOverwriteOrKeepAll=为所有冲突文件执行此操作(&D) +ErrorChangingAttr=尝试更改下列现有文件的属性时出错: +ErrorCreatingTemp=尝试在目标目录创建文件时出错: +ErrorReadingSource=尝试读取下列源文件时出错: +ErrorCopying=尝试复制下列文件时出错: +ErrorReplacingExistingFile=尝试替换现有文件时出错: +ErrorRestartReplace=重启并替换失败: +ErrorRenamingTemp=尝试重命名下列目标目录中的一个文件时出错: +ErrorRegisterServer=无法注册 DLL/OCX:%1 +ErrorRegSvr32Failed=RegSvr32 失败;退出代码 %1 +ErrorRegisterTypeLib=无法注册类库:%1 + +; *** 卸载显示名字标记 +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32 位 +UninstallDisplayNameMark64Bit=64 位 +UninstallDisplayNameMarkAllUsers=所有用户 +UninstallDisplayNameMarkCurrentUser=当前用户 + +; *** 安装后错误 +ErrorOpeningReadme=尝试打开自述文件时出错。 +ErrorRestartingComputer=安装程序无法重启电脑,请手动重启。 + +; *** 卸载消息 +UninstallNotFound=文件“%1”不存在。无法卸载。 +UninstallOpenError=文件“%1”不能被打开。无法卸载。 +UninstallUnsupportedVer=此版本的卸载程序无法识别卸载日志文件“%1”的格式。无法卸载 +UninstallUnknownEntry=卸载日志中遇到一个未知条目 (%1) +ConfirmUninstall=您确认要完全移除 %1 及其所有组件吗? +UninstallOnlyOnWin64=仅允许在 64 位 Windows 中卸载此程序。 +OnlyAdminCanUninstall=仅使用管理员权限的用户能完成此卸载。 +UninstallStatusLabel=正在从您的电脑中移除 %1,请稍候。 +UninstalledAll=已顺利从您的电脑中移除 %1。 +UninstalledMost=%1 卸载完成。%n%n有部分内容未能被删除,但您可以手动删除它们。 +UninstalledAndNeedsRestart=为完成 %1 的卸载,需要重启您的电脑。%n%n立即重启电脑吗? +UninstallDataCorrupted=文件“%1”已损坏。无法卸载 + +; *** 卸载状态消息 +ConfirmDeleteSharedFileTitle=删除共享的文件吗? +ConfirmDeleteSharedFile2=系统表示下列共享的文件已不有其他程序使用。您希望卸载程序删除这些共享的文件吗?%n%n如果删除这些文件,但仍有程序在使用这些文件,则这些程序可能出现异常。如果您不能确定,请选择“否”,在系统中保留这些文件以免引发问题。 +SharedFileNameLabel=文件名: +SharedFileLocationLabel=位置: +WizardUninstalling=卸载状态 +StatusUninstalling=正在卸载 %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=正在安装 %1。 +ShutdownBlockReasonUninstallingApp=正在卸载 %1。 + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 版本 %2 +AdditionalIcons=附加快捷方式: +CreateDesktopIcon=创建桌面快捷方式(&D) +CreateQuickLaunchIcon=创建快速启动栏快捷方式(&Q) +ProgramOnTheWeb=%1 网站 +UninstallProgram=卸载 %1 +LaunchProgram=运行 %1 +AssocFileExtension=将 %2 文件扩展名与 %1 建立关联(&A) +AssocingFileExtension=正在将 %2 文件扩展名与 %1 建立关联... +AutoStartProgramGroupDescription=启动: +AutoStartProgram=自动启动 %1 +AddonHostProgramNotFound=您选择的文件夹中无法找到 %1。%n%n您要继续吗? diff --git a/crates/zed/resources/windows/messages/en.isl b/crates/zed/resources/windows/messages/en.isl new file mode 100644 index 0000000000..2e82bea4ff --- /dev/null +++ b/crates/zed/resources/windows/messages/en.isl @@ -0,0 +1,15 @@ +[Messages] +FinishedLabel=Setup has finished installing [name] on your computer. The application may be launched by selecting the installed shortcuts. +ConfirmUninstall=Are you sure you want to completely remove %1 and all of its components? + +[CustomMessages] +AdditionalIcons=Additional icons: +CreateDesktopIcon=Create a &desktop icon +AddContextMenuFiles=Add "Open with %1" action to Windows Explorer file context menu +AddContextMenuFolders=Add "Open with %1" action to Windows Explorer directory context menu +AssociateWithFiles=Register %1 as an editor for supported file types +AddToPath=Add to PATH (requires shell restart) +RunAfter=Run %1 after installation +Other=Other: +SourceFile=%1 Source File +OpenWithContextMenu=Open w&ith %1 diff --git a/crates/zed/resources/windows/messages/zh-cn.isl b/crates/zed/resources/windows/messages/zh-cn.isl new file mode 100644 index 0000000000..50c03ccaaf --- /dev/null +++ b/crates/zed/resources/windows/messages/zh-cn.isl @@ -0,0 +1,9 @@ +[CustomMessages] +AddContextMenuFiles=将“通过 %1 打开”操作添加到 Windows 资源管理器文件上下文菜单 +AddContextMenuFolders=将“通过 %1 打开”操作添加到 Windows 资源管理器目录上下文菜单 +AssociateWithFiles=将 %1 注册为受支持的文件类型的编辑器 +AddToPath=添加到 PATH (重启后生效) +RunAfter=安装后运行 %1 +Other=其他: +SourceFile=%1 源文件 +OpenWithContextMenu=通过 %1 打开 diff --git a/crates/zed/resources/windows/sign.ps1 b/crates/zed/resources/windows/sign.ps1 new file mode 100644 index 0000000000..d00b33c0fc --- /dev/null +++ b/crates/zed/resources/windows/sign.ps1 @@ -0,0 +1,53 @@ +param ( + [Parameter(Mandatory = $true)] + [string]$filePath +) + +$params = @{} + +$endpoint = $ENV:ENDPOINT +if ([string]::IsNullOrWhiteSpace($endpoint)) { + throw "The 'ENDPOINT' env is required." +} +$params["Endpoint"] = $endpoint + +$trustedSigningAccountName = $ENV:ACCOUNT_NAME +if ([string]::IsNullOrWhiteSpace($trustedSigningAccountName)) { + throw "The 'ACCOUNT_NAME' env is required." +} +$params["CodeSigningAccountName"] = $trustedSigningAccountName + +$certificateProfileName = $ENV:CERT_PROFILE_NAME +if ([string]::IsNullOrWhiteSpace($certificateProfileName)) { + throw "The 'CERT_PROFILE_NAME' env is required." +} +$params["CertificateProfileName"] = $certificateProfileName + +$fileDigest = $ENV:FILE_DIGEST +if ([string]::IsNullOrWhiteSpace($fileDigest)) { + throw "The 'FILE_DIGEST' env is required." +} +$params["FileDigest"] = $fileDigest + +$timeStampDigest = $ENV:TIMESTAMP_DIGEST +if ([string]::IsNullOrWhiteSpace($timeStampDigest)) { + throw "The 'TIMESTAMP_DIGEST' env is required." +} +$params["TimestampDigest"] = $timeStampDigest + +$timeStampServer = $ENV:TIMESTAMP_SERVER +if ([string]::IsNullOrWhiteSpace($timeStampServer)) { + throw "The 'TIMESTAMP_SERVER' env is required." +} +$params["TimestampRfc3161"] = $timeStampServer + +$params["Files"] = $filePath + +$trace = $ENV:TRACE +if (-Not [string]::IsNullOrWhiteSpace($trace)) { + if ([System.Convert]::ToBoolean($trace)) { + Set-PSDebug -Trace 2 + } +} + +Invoke-TrustedSigning @params diff --git a/crates/zed/resources/windows/zed.iss b/crates/zed/resources/windows/zed.iss new file mode 100644 index 0000000000..7c80676ca0 --- /dev/null +++ b/crates/zed/resources/windows/zed.iss @@ -0,0 +1,1412 @@ +[Setup] +AppId={#AppId} +AppName={#AppName} +AppVerName={#AppDisplayName} +AppPublisher=Zed Industries +AppPublisherURL=https://www.zed.dev/ +AppSupportURL=https://www.zed.dev/ +AppUpdatesURL=https://www.zed.dev/ +DefaultGroupName={#AppName} +AllowNoIcons=yes +OutputDir={#OutputDir} +OutputBaseFilename={#AppSetupName} +Compression=lzma +SolidCompression=yes +AppMutex={code:GetAppMutex} +SetupMutex={#AppMutex}Setup +; WizardImageFile="{#ResourcesDir}\inno-100.bmp,{#ResourcesDir}\inno-125.bmp,{#ResourcesDir}\inno-150.bmp,{#ResourcesDir}\inno-175.bmp,{#ResourcesDir}\inno-200.bmp,{#ResourcesDir}\inno-225.bmp,{#ResourcesDir}\inno-250.bmp" +; WizardSmallImageFile="{#ResourcesDir}\inno-small-100.bmp,{#ResourcesDir}\inno-small-125.bmp,{#ResourcesDir}\inno-small-150.bmp,{#ResourcesDir}\inno-small-175.bmp,{#ResourcesDir}\inno-small-200.bmp,{#ResourcesDir}\inno-small-225.bmp,{#ResourcesDir}\inno-small-250.bmp" +SetupIconFile={#ResourcesDir}\{#AppIconName}.ico +UninstallDisplayIcon={app}\{#AppExeName}.exe +ChangesEnvironment=true +ChangesAssociations=true +MinVersion=10.0.16299 +SourceDir={#SourceDir} +AppVersion={#Version} +VersionInfoVersion={#Version} +ShowLanguageDialog=auto +WizardStyle=modern + +CloseApplications=force + +SignTool=Defaultsign +DefaultDirName={autopf}\{#AppName} +PrivilegesRequired=lowest + +ArchitecturesAllowed=x64compatible +ArchitecturesInstallIn64BitMode=x64compatible + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl,{#ResourcesDir}\messages\en.isl"; LicenseFile: "script\terms\terms.rtf" +Name: "simplifiedChinese"; MessagesFile: "{#ResourcesDir}\messages\Default.zh-cn.isl,{#ResourcesDir}\messages\zh-cn.isl"; LicenseFile: "script\terms\terms.rtf" + +[UninstallDelete] +; Delete logs +Type: filesandordirs; Name: "{app}\tools" +Type: filesandordirs; Name: "{app}\updates" + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked +Name: "addcontextmenufiles"; Description: "{cm:AddContextMenuFiles,{#AppDisplayName}}"; GroupDescription: "{cm:Other}" +Name: "addcontextmenufolders"; Description: "{cm:AddContextMenuFolders,{#AppDisplayName}}"; GroupDescription: "{cm:Other}"; Flags: unchecked; Check: not IsWindows11OrLater +Name: "associatewithfiles"; Description: "{cm:AssociateWithFiles,{#AppDisplayName}}"; GroupDescription: "{cm:Other}" +Name: "addtopath"; Description: "{cm:AddToPath}"; GroupDescription: "{cm:Other}" + +[Dirs] +Name: "{app}"; AfterInstall: DisableAppDirInheritance + +[Files] +Source: "{#ResourcesDir}\Zed.exe"; DestDir: "{code:GetInstallDir}"; Flags: ignoreversion +Source: "{#ResourcesDir}\bin\*"; DestDir: "{code:GetInstallDir}\bin"; Flags: ignoreversion +Source: "{#ResourcesDir}\tools\*"; DestDir: "{app}\tools"; Flags: ignoreversion +Source: "{#ResourcesDir}\appx\*"; DestDir: "{app}\appx"; BeforeInstall: RemoveAppxPackage; AfterInstall: AddAppxPackage; Flags: ignoreversion; Check: IsWindows11OrLater + +[Icons] +Name: "{group}\{#AppName}"; Filename: "{app}\{#AppExeName}.exe"; AppUserModelID: "{#AppUserId}" +Name: "{autodesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}.exe"; Tasks: desktopicon; AppUserModelID: "{#AppUserId}" + +[Run] +Filename: "{app}\{#AppExeName}.exe"; Description: "{cm:LaunchProgram,{#AppName}}"; Flags: nowait postinstall; Check: WizardNotSilent + +[UninstallRun] +Filename: "powershell.exe"; Parameters: "Invoke-Command -ScriptBlock {{Remove-AppxPackage -Package ""{#AppxFullName}""}"; Check: IsWindows11OrLater; Flags: shellexec waituntilterminated runhidden + +[Registry] +Root: HKCU; Subkey: "Software\Classes\.ascx\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.ascx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.ascx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ascx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,ASCX}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ascx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ascx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\xml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ascx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ascx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.asp\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.asp\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.asp"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.asp"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,ASP}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.asp"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.asp\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.asp\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.asp\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.aspx\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.aspx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.aspx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.aspx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,ASPX}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.aspx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.aspx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.aspx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.aspx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.bash\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.bash\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.bash"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Bash}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.bash_login\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.bash_login\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.bash_login"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_login"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Bash Login}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_login"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_login\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_login\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_login\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.bash_logout\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.bash_logout\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.bash_logout"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_logout"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Bash Logout}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_logout"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_logout\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_logout\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_logout\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.bash_profile\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.bash_profile\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.bash_profile"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_profile"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Bash Profile}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_profile"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_profile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_profile\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bash_profile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.bashrc\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.bashrc\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.bashrc"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bashrc"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Bash RC}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bashrc"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bashrc\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bashrc\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bashrc\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.bib\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.bib\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.bib"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bib"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,BibTeX}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bib"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bib\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bib\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bib\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.bowerrc\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.bowerrc\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.bowerrc"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bowerrc"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Bower RC}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bowerrc"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bowerrc\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\bower.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bowerrc\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.bowerrc\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.c++\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.c++\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.c++"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c++"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c++"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c++\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\cpp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c++\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.c\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.c\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.c"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\c.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.c\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.cc\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.cc\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cc"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cc"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cc"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cc\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\cpp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cc\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cc\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.cfg\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.cfg\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cfg"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cfg"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Configuration}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cfg"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cfg\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\config.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cfg\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cfg\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.cjs\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.cjs\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cjs"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cjs"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,JavaScript}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cjs"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cjs\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\javascript.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cjs\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cjs\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.clj\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.clj\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.clj"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clj"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Clojure}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clj"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clj\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clj\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clj\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.cljs\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.cljs\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cljs"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljs"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,ClojureScript}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljs"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljs\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljs\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljs\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.cljx\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.cljx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cljx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,CLJX}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cljx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.clojure\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.clojure\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.clojure"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clojure"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Clojure}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clojure"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clojure\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clojure\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.clojure\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.cls\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.cls\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cls"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cls"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,LaTeX}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cls"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cls\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cls\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cls\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.code-workspace\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.code-workspace\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.code-workspace"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.code-workspace"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Code Workspace}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.code"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.code-workspace\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.code-workspace\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.code-workspace\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.cmake\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.cmake\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cmake"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cmake"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,CMake}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cmake"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cmake\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cmake\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cmake\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.coffee\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.coffee\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.coffee"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.coffee"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,CoffeeScript}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.coffee"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.coffee\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.coffee\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.coffee\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.config\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.config\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.config"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.config"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Configuration}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.config"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.config\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\config.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.config\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.config\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.containerfile\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.containerfile\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.containerfile"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.containerfile"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Containerfile}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.containerfile"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.containerfile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.containerfile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.cpp\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.cpp\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cpp"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cpp"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cpp"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cpp\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\cpp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cpp\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cpp\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.cs\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.cs\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cs"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cs"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C#}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cs"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cs\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\csharp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cs\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cs\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.cshtml\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.cshtml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cshtml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cshtml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,CSHTML}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cshtml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cshtml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cshtml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cshtml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.csproj\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.csproj\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.csproj"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csproj"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C# Project}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csproj"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csproj\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\xml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csproj\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csproj\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.css\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.css\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.css"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.css"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,CSS}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.css"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.css\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\css.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.css\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.css\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.csv\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.csv\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.csv"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csv"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Comma Separated Values}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csv"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csv\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csv\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csv\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.csx\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.csx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.csx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C# Script}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\csharp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.csx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.ctp\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.ctp\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.ctp"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ctp"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,CakePHP Template}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ctp"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ctp\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ctp\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ctp\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.cxx\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.cxx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.cxx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cxx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cxx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cxx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\cpp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cxx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.cxx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.dart\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.dart\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.dart"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dart"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Dart}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dart"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dart\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dart\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dart\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.diff\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.diff\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.diff"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.diff"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Diff}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.diff"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.diff\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.diff\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.diff\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.dockerfile\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.dockerfile\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.dockerfile"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dockerfile"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Dockerfile}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dockerfile"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dockerfile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dockerfile\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dockerfile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.dot\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.dot\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.dot"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dot"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Dot}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dot"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dot\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dot\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dot\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.dtd\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.dtd\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.dtd"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dtd"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Document Type Definition}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dtd"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dtd\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\xml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dtd\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.dtd\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.editorconfig\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.editorconfig\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.editorconfig"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.editorconfig"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Editor Config}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.editorconfig"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.editorconfig\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\config.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.editorconfig\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.editorconfig\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.edn\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.edn\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.edn"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.edn"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Extensible Data Notation}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.edn"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.edn\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.edn\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.edn\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.erb\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.erb\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.erb"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.erb"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Ruby}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.erb"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.erb\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\ruby.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.erb\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.erb\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.eyaml\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.eyaml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.eyaml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyaml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Hiera Eyaml}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyaml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyaml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\yaml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyaml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyaml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.eyml\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.eyml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.eyml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Hiera Eyaml}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\yaml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.eyml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.fs\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.fs\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.fs"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fs"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,F#}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fs"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fs\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fs\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fs\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.fsi\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.fsi\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.fsi"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsi"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,F# Signature}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsi"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsi\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsi\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsi\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.fsscript\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.fsscript\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.fsscript"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsscript"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,F# Script}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsscript"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsscript\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsscript\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsscript\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.fsx\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.fsx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.fsx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,F# Script}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.fsx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.gemspec\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.gemspec\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.gemspec"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gemspec"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Gemspec}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gemspec"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gemspec\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\ruby.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gemspec\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gemspec\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.gitattributes\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.gitattributes\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.gitattributes"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitattributes"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Git Attributes}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitattributes"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitattributes"; ValueType: string; ValueName: "AlwaysShowExt"; ValueData: ""; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitattributes\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\config.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitattributes\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitattributes\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.gitconfig\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.gitconfig\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.gitconfig"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitconfig"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Git Config}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitconfig"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitconfig"; ValueType: string; ValueName: "AlwaysShowExt"; ValueData: ""; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitconfig\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\config.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitconfig\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitconfig\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.gitignore\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.gitignore\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.gitignore"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitignore"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Git Ignore}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitignore"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitignore"; ValueType: string; ValueName: "AlwaysShowExt"; ValueData: ""; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitignore\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\config.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitignore\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gitignore\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.go\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.go\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.go"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.go"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Go}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.go"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.go\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\go.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.go\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.go\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.gradle\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.gradle\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.gradle"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gradle"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Gradle}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gradle"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gradle\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gradle\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.gradle\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.groovy\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.groovy\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.groovy"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.groovy"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Groovy}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.groovy"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.groovy\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.groovy\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.groovy\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.h\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.h\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.h"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C Header}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\c.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.handlebars\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.handlebars\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.handlebars"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.handlebars"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Handlebars}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.handlebars"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.handlebars\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.handlebars\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.handlebars\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.hbs\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.hbs\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.hbs"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hbs"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Handlebars}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hbs"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hbs\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hbs\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hbs\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.h++\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.h++\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.h++"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h++"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++ Header}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h++"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h++\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\cpp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.h++\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.hh\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.hh\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.hh"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hh"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++ Header}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hh"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hh\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\cpp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hh\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hh\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.hpp\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.hpp\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.hpp"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hpp"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++ Header}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hpp"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hpp\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\cpp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hpp\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hpp\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.htm\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.htm\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.htm"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.htm"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,HTML}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.htm"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.htm\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.htm\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.htm\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.html\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.html\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.html"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.html"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,HTML}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.html"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.html\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.html\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.html\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.hxx\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.hxx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.hxx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hxx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,C++ Header}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hxx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hxx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\cpp.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hxx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.hxx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.ini\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.ini\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.ini"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ini"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,INI}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ini"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ini\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\config.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ini\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ini\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.ipynb\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.ipynb\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.ipynb"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ipynb"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Jupyter}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ipynb"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ipynb\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ipynb\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ipynb\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.jade\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.jade\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.jade"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jade"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Jade}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jade"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jade\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\jade.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jade\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jade\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.jav\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.jav\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.jav"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jav"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Java}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jav"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jav\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\java.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jav\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jav\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.java\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.java\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.java"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.java"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Java}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.java"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.java\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\java.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.java\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.java\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.js\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.js\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.js"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.js"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,JavaScript}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.js"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.js\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\javascript.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.js\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.js\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.jsx\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.jsx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.jsx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,JavaScript}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\react.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.jscsrc\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.jscsrc\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.jscsrc"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jscsrc"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,JSCS RC}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jscsrc"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jscsrc\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\javascript.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jscsrc\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jscsrc\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.jshintrc\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.jshintrc\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.jshintrc"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshintrc"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,JSHint RC}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshintrc"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshintrc\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\javascript.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshintrc\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshintrc\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.jshtm\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.jshtm\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.jshtm"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshtm"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,JavaScript HTML Template}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshtm"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshtm\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshtm\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jshtm\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.json\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.json\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.json"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.json"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,JSON}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.json"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.json\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\json.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.json\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.json\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.jsp\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.jsp\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.jsp"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsp"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Java Server Pages}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsp"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsp\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsp\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.jsp\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.less\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.less\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.less"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.less"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,LESS}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.less"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.less\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\less.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.less\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.less\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.log\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.log\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.log"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.log"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Log file}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.log"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.log\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.log\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.log\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.lua\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.lua\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.lua"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.lua"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Lua}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.lua"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.lua\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.lua\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.lua\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.m\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.m\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.m"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.m"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Objective C}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.m"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.m\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.m\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.m\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.makefile\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.makefile\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.makefile"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.makefile"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Makefile}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.makefile"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.makefile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.makefile\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.makefile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.markdown\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.markdown\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.markdown"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.markdown"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Markdown}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.markdown"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.markdown\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.markdown\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.markdown\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.md\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.md\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.md"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.md"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Markdown}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.md"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.md\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.md\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.md\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.mdoc\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.mdoc\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mdoc"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdoc"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,MDoc}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdoc"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdoc\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdoc\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdoc\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.mdown\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.mdown\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mdown"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdown"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Markdown}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdown"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdown\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdown\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdown\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.mdtext\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.mdtext\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mdtext"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtext"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Markdown}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtext"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtext\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtext\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtext\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.mdtxt\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.mdtxt\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mdtxt"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtxt"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Markdown}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtxt"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtxt\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtxt\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdtxt\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.mdwn\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.mdwn\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mdwn"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdwn"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Markdown}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdwn"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdwn\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdwn\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mdwn\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.mk\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.mk\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mk"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mk"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Makefile}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mk"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mk\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mk\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mk\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.mkd\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.mkd\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mkd"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkd"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Markdown}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkd"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkd\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkd\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkd\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.mkdn\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.mkdn\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mkdn"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkdn"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Markdown}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkdn"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkdn\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\markdown.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkdn\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mkdn\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.ml\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.ml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.ml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,OCaml}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.mli\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.mli\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mli"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mli"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,OCaml}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mli"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mli\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mli\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mli\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.mjs\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.mjs\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.mjs"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mjs"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,JavaScript}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mjs"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mjs\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\javascript.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mjs\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.mjs\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.npmignore\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.npmignore\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.npmignore"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.npmignore"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,NPM Ignore}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.npmignore"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.npmignore"; ValueType: string; ValueName: "AlwaysShowExt"; ValueData: ""; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.npmignore\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.npmignore\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.npmignore\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.php\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.php\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.php"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.php"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,PHP}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.php"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.php\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\php.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.php\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.php\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.phtml\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.phtml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.phtml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.phtml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,PHP HTML}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.phtml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.phtml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.phtml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.phtml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.pl\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.pl\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.pl"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Perl}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.pl6\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.pl6\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.pl6"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl6"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Perl 6}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl6"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl6\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl6\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pl6\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.plist\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.plist\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.plist"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.plist"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Properties file}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.plist"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.plist\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.plist\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.plist\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.pm\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.pm\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.pm"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Perl Module}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.pm6\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.pm6\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.pm6"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm6"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Perl 6 Module}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm6"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm6\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm6\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pm6\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.pod\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.pod\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.pod"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pod"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Perl POD}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pod"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pod\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pod\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pod\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.pp\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.pp\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.pp"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pp"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Perl}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pp"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pp\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pp\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pp\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.profile\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.profile\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.profile"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.profile"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Profile}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.profile"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.profile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.profile\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.profile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.properties\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.properties\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.properties"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.properties"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Properties}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.properties"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.properties\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.properties\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.properties\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.ps1\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.ps1\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.ps1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ps1"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,PowerShell}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ps1"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ps1\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\powershell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ps1\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ps1\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.psd1\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.psd1\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.psd1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psd1"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,PowerShell Module Manifest}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psd1"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psd1\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\powershell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psd1\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psd1\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.psgi\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.psgi\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.psgi"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psgi"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Perl CGI}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psgi"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psgi\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psgi\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psgi\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.psm1\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.psm1\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.psm1"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psm1"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,PowerShell Module}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psm1"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psm1\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\powershell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psm1\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.psm1\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.py\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.py\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.py"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.py"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Python}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.py"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.py\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\python.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.py\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.py\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.pyi\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.pyi\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.pyi"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pyi"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Python}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pyi"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pyi\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\python.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pyi\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.pyi\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.r\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.r\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.r"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.r"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,R}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.r"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.r\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.r\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.r\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.rb\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.rb\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.rb"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rb"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Ruby}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rb"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rb\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\ruby.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rb\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rb\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.rhistory\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.rhistory\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.rhistory"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rhistory"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,R History}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rhistory"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rhistory\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rhistory\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rhistory\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.rprofile\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.rprofile\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.rprofile"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rprofile"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,R Profile}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rprofile"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rprofile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rprofile\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rprofile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.rs\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.rs\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.rs"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rs"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Rust}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rs"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rs\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rs\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rs\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.rst\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.rst\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.rst"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rst"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Restructured Text}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rst"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rst\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rst\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rst\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.rt\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.rt\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.rt"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rt"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Rich Text}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rt"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rt\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rt\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.rt\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.sass\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.sass\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.sass"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sass"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Sass}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sass"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sass\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\sass.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sass\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sass\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.scss\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.scss\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.scss"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.scss"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Sass}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.scss"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.scss\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\sass.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.scss\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.scss\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.sh\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.sh\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.sh"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sh"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,SH}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sh"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sh\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sh\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sh\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.shtml\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.shtml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.shtml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.shtml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,SHTML}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.shtml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.shtml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.shtml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.shtml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.sql\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.sql\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.sql"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sql"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,SQL}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sql"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sql\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\sql.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sql\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sql\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.svg\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.svg\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.svg"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.svg"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,SVG}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.svg"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.svg\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.svg\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.svg\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.t\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.t\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.t"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.t"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Perl}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.t"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.t\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.t\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.t\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.tex\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.tex\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.tex"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tex"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,LaTeX}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tex"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tex\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tex\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tex\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.ts\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.ts\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.ts"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ts"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,TypeScript}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ts"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ts\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\typescript.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ts\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.ts\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.toml\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.toml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.toml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.toml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Toml}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.toml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.toml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.toml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.toml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.tsx\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.tsx\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.tsx"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tsx"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,TypeScript}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tsx"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tsx\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\react.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tsx\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.tsx\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.txt\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.txt\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.txt"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.txt"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Text}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.txt"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.txt\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.txt\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.txt\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.vb\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.vb\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.vb"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vb"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Visual Basic}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vb"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vb\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vb\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vb\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.vue\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.vue\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.vue"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vue"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,VUE}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vue"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vue\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\vue.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vue\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.vue\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.wxi\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.wxi\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.wxi"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxi"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,WiX Include}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxi"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxi\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxi\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxi\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.wxl\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.wxl\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.wxl"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxl"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,WiX Localization}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxl"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxl\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxl\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxl\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.wxs\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.wxs\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.wxs"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxs"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,WiX}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxs"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxs\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxs\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.wxs\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.xaml\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.xaml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.xaml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xaml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,XAML}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xaml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xaml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\xml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xaml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xaml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.xhtml\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.xhtml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.xhtml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xhtml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,HTML}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xhtml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xhtml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\html.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xhtml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xhtml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.xml\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.xml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.xml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,XML}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\xml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.xml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.yaml\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.yaml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.yaml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yaml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Yaml}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yaml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yaml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\yaml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yaml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yaml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.yml\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.yml\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.yml"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yml"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,Yaml}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yml"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yml\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\yaml.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yml\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.yml\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\.zsh\OpenWithProgids"; ValueType: none; ValueName: "{#RegValueName}"; Flags: deletevalue uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\.zsh\OpenWithProgids"; ValueType: string; ValueName: "{#RegValueName}.zsh"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.zsh"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,ZSH}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.zsh"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.zsh\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\shell.ico"; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.zsh\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe"""; Tasks: associatewithfiles +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.zsh\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: associatewithfiles + +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}SourceFile"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,{#AppName}}"; Flags: uninsdeletekey +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}SourceFile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico" +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}SourceFile\shell\open"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe""" +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}SourceFile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1""" + +Root: HKCU; Subkey: "Software\Classes\Applications\{#AppExeName}.exe"; ValueType: none; ValueName: ""; Flags: uninsdeletekey +Root: HKCU; Subkey: "Software\Classes\Applications\{#AppExeName}.exe\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\default.ico" +Root: HKCU; Subkey: "Software\Classes\Applications\{#AppExeName}.exe\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#AppExeName}.exe""" +Root: HKCU; Subkey: "Software\Classes\Applications\{#AppExeName}.exe\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1""" + +Root: HKCU; Subkey: "Software\Classes\{#RegValueName}ContextMenu"; ValueType: expandsz; ValueName: "Title"; ValueData: "{cm:OpenWithContextMenu,{#ShellNameShort}}"; Tasks: addcontextmenufiles; Flags: uninsdeletekey; Check: IsWindows11OrLater +Root: HKCU; Subkey: "Software\Classes\*\shell\{#RegValueName}"; ValueType: expandsz; ValueName: ""; ValueData: "{cm:OpenWithContextMenu,{#ShellNameShort}}"; Tasks: addcontextmenufiles; Flags: uninsdeletekey; Check: not IsWindows11OrLater +Root: HKCU; Subkey: "Software\Classes\*\shell\{#RegValueName}"; ValueType: expandsz; ValueName: "Icon"; ValueData: "{app}\{#AppExeName}.exe"; Tasks: addcontextmenufiles; Check: not IsWindows11OrLater +Root: HKCU; Subkey: "Software\Classes\*\shell\{#RegValueName}\command"; ValueType: expandsz; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%1"""; Tasks: addcontextmenufiles; Check: not IsWindows11OrLater +Root: HKCU; Subkey: "Software\Classes\directory\shell\{#RegValueName}"; ValueType: expandsz; ValueName: ""; ValueData: "{cm:OpenWithContextMenu,{#ShellNameShort}}"; Tasks: addcontextmenufolders; Flags: uninsdeletekey; Check: IsWindows11OrLater +Root: HKCU; Subkey: "Software\Classes\directory\shell\{#RegValueName}"; ValueType: expandsz; ValueName: "Icon"; ValueData: "{app}\{#AppExeName}.exe"; Tasks: addcontextmenufolders; Check: not IsWindows11OrLater +Root: HKCU; Subkey: "Software\Classes\directory\shell\{#RegValueName}\command"; ValueType: expandsz; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%V"""; Tasks: addcontextmenufolders; Check: not IsWindows11OrLater +Root: HKCU; Subkey: "Software\Classes\directory\background\shell\{#RegValueName}"; ValueType: expandsz; ValueName: ""; ValueData: "{cm:OpenWithContextMenu,{#ShellNameShort}}"; Tasks: addcontextmenufolders; Flags: uninsdeletekey; Check: not IsWindows11OrLater +Root: HKCU; Subkey: "Software\Classes\directory\background\shell\{#RegValueName}"; ValueType: expandsz; ValueName: "Icon"; ValueData: "{app}\{#AppExeName}.exe"; Tasks: addcontextmenufolders; Check: not IsWindows11OrLater +Root: HKCU; Subkey: "Software\Classes\directory\background\shell\{#RegValueName}\command"; ValueType: expandsz; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%V"""; Tasks: addcontextmenufolders; Check: not IsWindows11OrLater +Root: HKCU; Subkey: "Software\Classes\Drive\shell\{#RegValueName}"; ValueType: expandsz; ValueName: ""; ValueData: "{cm:OpenWithContextMenu,{#ShellNameShort}}"; Tasks: addcontextmenufolders; Flags: uninsdeletekey; Check: not IsWindows11OrLater +Root: HKCU; Subkey: "Software\Classes\Drive\shell\{#RegValueName}"; ValueType: expandsz; ValueName: "Icon"; ValueData: "{app}\{#AppExeName}.exe"; Tasks: addcontextmenufolders; Check: not IsWindows11OrLater +Root: HKCU; Subkey: "Software\Classes\Drive\shell\{#RegValueName}\command"; ValueType: expandsz; ValueName: ""; ValueData: """{app}\{#AppExeName}.exe"" ""%V"""; Tasks: addcontextmenufolders; Check: not IsWindows11OrLater + +; Environment +Root: HKCU; Subkey: "Environment"; ValueType: expandsz; ValueName: "Path"; ValueData: "{code:AddToPath|{app}\bin}"; Tasks: addtopath; Check: NeedsAddToPath(ExpandConstant('{app}\bin')) + +; URI Scheme +Root: HKCU; Subkey: "Software\Classes\zed"; ValueType: "string"; ValueData: "URL:zed Protocol"; Flags: uninsdeletekey +Root: HKCU; Subkey: "Software\Classes\zed"; ValueType: "string"; ValueName: "URL Protocol"; ValueData: "" +Root: HKCU; Subkey: "Software\Classes\zed\DefaultIcon"; ValueType: "string"; ValueData: "{app}\Zed.exe,1" +Root: HKCU; Subkey: "Software\Classes\zed\shell\open\command"; ValueType: "string"; ValueData: """{app}\Zed.exe"" ""%1""" + +[Code] +function InitializeSetup(): Boolean; +begin + Result := True; + + if not WizardSilent() and IsAdmin() then begin + MsgBox('This User Installer is not meant to be run as an Administrator.', mbError, MB_OK); + Result := False; + end; +end; + +function WizardNotSilent(): Boolean; +begin + Result := not WizardSilent(); +end; + +function IsWindows11OrLater(): Boolean; +begin + Result := (GetWindowsVersion >= $0A0055F0); +end; + +// https://stackoverflow.com/a/23838239/261019 +procedure Explode(var Dest: TArrayOfString; Text: String; Separator: String); +var + i, p: Integer; +begin + i := 0; + repeat + SetArrayLength(Dest, i+1); + p := Pos(Separator,Text); + if p > 0 then begin + Dest[i] := Copy(Text, 1, p-1); + Text := Copy(Text, p + Length(Separator), Length(Text)); + i := i + 1; + end else begin + Dest[i] := Text; + Text := ''; + end; + until Length(Text)=0; +end; + +function NeedsAddToPath(path: string): boolean; +var + OrigPath: string; +begin + if not RegQueryStringValue(HKCU, 'Environment', 'Path', OrigPath) + then begin + Result := True; + exit; + end; + Result := Pos(';' + path + ';', ';' + OrigPath + ';') = 0; +end; + +function AddToPath(path: string): string; +var + OrigPath: string; +begin + RegQueryStringValue(HKCU, 'Environment', 'Path', OrigPath) + + if (Length(OrigPath) > 0) and (OrigPath[Length(OrigPath)] = ';') then + Result := OrigPath + path + else + Result := OrigPath + ';' + path +end; + +procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); +var + Path: string; + InstalledPath: string; + Parts: TArrayOfString; + NewPath: string; + i: Integer; +begin + if not CurUninstallStep = usUninstall then begin + exit; + end; + if not RegQueryStringValue(HKCU, 'Environment', 'Path', Path) + then begin + exit; + end; + NewPath := ''; + InstalledPath := ExpandConstant('{app}\bin') + Explode(Parts, Path, ';'); + for i:=0 to GetArrayLength(Parts)-1 do begin + if CompareText(Parts[i], InstalledPath) <> 0 then begin + NewPath := NewPath + Parts[i]; + + if i < GetArrayLength(Parts) - 1 then begin + NewPath := NewPath + ';'; + end; + end; + end; + RegWriteExpandStringValue(HKCU, 'Environment', 'Path', NewPath); +end; + +// https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/icacls +// https://docs.microsoft.com/en-US/windows/security/identity-protection/access-control/security-identifiers +procedure DisableAppDirInheritance(); +var + ResultCode: Integer; + Permissions: string; +begin + Permissions := '/grant:r "*S-1-5-18:(OI)(CI)F" /grant:r "*S-1-5-32-544:(OI)(CI)F" /grant:r "*S-1-5-11:(OI)(CI)RX" /grant:r "*S-1-5-32-545:(OI)(CI)RX"'; + + Permissions := Permissions + Format(' /grant:r "*S-1-3-0:(OI)(CI)F" /grant:r "%s:(OI)(CI)F"', [GetUserNameString()]); + + Exec(ExpandConstant('{sys}\icacls.exe'), ExpandConstant('"{app}" /inheritancelevel:r ') + Permissions, '', SW_HIDE, ewWaitUntilTerminated, ResultCode); +end; + +procedure AddAppxPackage(); +var + AddAppxPackageResultCode: Integer; +begin + if WizardIsTaskSelected('addcontextmenufiles') then begin + ShellExec('', 'powershell.exe', '-Command ' + AddQuotes('Add-AppxPackage -Path ''' + ExpandConstant('{app}\appx\zed_explorer_command_injector.appx') + ''' -ExternalLocation ''' + ExpandConstant('{app}\appx') + ''''), '', SW_HIDE, ewWaitUntilTerminated, AddAppxPackageResultCode); + RegDeleteKeyIncludingSubkeys(HKCU, 'Software\Classes\*\shell\{#RegValueName}'); + RegDeleteKeyIncludingSubkeys(HKCU, 'Software\Classes\directory\shell\{#RegValueName}'); + RegDeleteKeyIncludingSubkeys(HKCU, 'Software\Classes\directory\background\shell\{#RegValueName}'); + RegDeleteKeyIncludingSubkeys(HKCU, 'Software\Classes\Drive\shell\{#RegValueName}'); + end; +end; + +procedure RemoveAppxPackage(); +var + RemoveAppxPackageResultCode: Integer; +begin + ShellExec('', 'powershell.exe', '-Command ' + AddQuotes('Remove-AppxPackage -Package ''{#AppxFullName}'''), '', SW_HIDE, ewWaitUntilTerminated, RemoveAppxPackageResultCode); + if not WizardIsTaskSelected('addcontextmenufiles') then begin + RegDeleteKeyIncludingSubkeys(HKCU, 'Software\Classes\{#RegValueName}ContextMenu'); + end; +end; + +function SwitchHasValue(Name: string; Value: string): Boolean; +begin + Result := CompareText(ExpandConstant('{param:' + Name + '}'), Value) = 0; +end; + +function IsUpdating(): Boolean; +begin + Result := SwitchHasValue('update', 'true') and WizardSilent(); +end; + +procedure CurStepChanged(CurStep: TSetupStep); +begin + if CurStep = ssPostInstall then + begin + if IsUpdating() then + begin + SaveStringToFile(ExpandConstant('{app}\updates\versions.txt'), '{#Version}' + #13#10, True); + end + end; +end; + +function GetAppMutex(Param: string): string; +begin + if IsUpdating() then + Result := '' + else + Result := '{#AppMutex}'; +end; + +function GetInstallDir(Param: string): string; +begin + if IsUpdating() then + Result := ExpandConstant('{app}\install') + else + Result := ExpandConstant('{app}'); +end; diff --git a/script/bundle-windows.ps1 b/script/bundle-windows.ps1 new file mode 100644 index 0000000000..9b61d220cf --- /dev/null +++ b/script/bundle-windows.ps1 @@ -0,0 +1,263 @@ +[CmdletBinding()] +Param( + [Parameter()][Alias('i')][switch]$Install, + [Parameter()][Alias('h')][switch]$Help, + [Parameter()][string]$Name +) + +. "$PSScriptRoot/lib/blob-store.ps1" +. "$PSScriptRoot/lib/workspace.ps1" + +# https://stackoverflow.com/questions/57949031/powershell-script-stops-if-program-fails-like-bash-set-o-errexit +$ErrorActionPreference = 'Stop' +$PSNativeCommandUseErrorActionPreference = $true + +$buildSuccess = $false + +if ($Help) { + Write-Output "Usage: test.ps1 [-Install] [-Help]" + Write-Output "Build the installer for Windows.\n" + Write-Output "Options:" + Write-Output " -Install, -i Run the installer after building." + Write-Output " -Help, -h Show this help message." + exit 0 +} + +Push-Location -Path crates/zed +$channel = Get-Content "RELEASE_CHANNEL" +$env:ZED_RELEASE_CHANNEL = $channel +Pop-Location + +function CheckEnvironmentVariables { + $requiredVars = @( + 'ZED_WORKSPACE', 'RELEASE_VERSION', 'ZED_RELEASE_CHANNEL', + 'AZURE_TENANT_ID', 'AZURE_CLIENT_ID', 'AZURE_CLIENT_SECRET', + 'ACCOUNT_NAME', 'CERT_PROFILE_NAME', 'ENDPOINT', + 'FILE_DIGEST', 'TIMESTAMP_DIGEST', 'TIMESTAMP_SERVER' + ) + + foreach ($var in $requiredVars) { + if (-not (Test-Path "env:$var")) { + Write-Error "$var is not set" + exit 1 + } + } +} + +$innoDir = "$env:ZED_WORKSPACE\inno" + +function PrepareForBundle { + if (Test-Path "$innoDir") { + Remove-Item -Path "$innoDir" -Recurse -Force + } + New-Item -Path "$innoDir" -ItemType Directory -Force + Copy-Item -Path "$env:ZED_WORKSPACE\crates\zed\resources\windows\*" -Destination "$innoDir" -Recurse -Force + New-Item -Path "$innoDir\make_appx" -ItemType Directory -Force + New-Item -Path "$innoDir\appx" -ItemType Directory -Force + New-Item -Path "$innoDir\bin" -ItemType Directory -Force + New-Item -Path "$innoDir\tools" -ItemType Directory -Force +} + +function BuildZedAndItsFriends { + Write-Output "Building Zed and its friends, for channel: $channel" + # Build zed.exe, cli.exe and auto_update_helper.exe + cargo build --release --package zed --package cli --package auto_update_helper + Copy-Item -Path ".\target\release\zed.exe" -Destination "$innoDir\Zed.exe" -Force + Copy-Item -Path ".\target\release\cli.exe" -Destination "$innoDir\cli.exe" -Force + Copy-Item -Path ".\target\release\auto_update_helper.exe" -Destination "$innoDir\auto_update_helper.exe" -Force + # Build explorer_command_injector.dll + switch ($channel) { + "stable" { + cargo build --release --features stable --no-default-features --package explorer_command_injector + } + "preview" { + cargo build --release --features preview --no-default-features --package explorer_command_injector + } + default { + cargo build --release --package explorer_command_injector + } + } + Copy-Item -Path ".\target\release\explorer_command_injector.dll" -Destination "$innoDir\zed_explorer_command_injector.dll" -Force +} + +function ZipZedAndItsFriendsDebug { + $items = @( + ".\target\release\zed.pdb", + ".\target\release\cli.pdb", + ".\target\release\auto_update_helper.pdb", + ".\target\release\explorer_command_injector.pdb" + ) + + Compress-Archive -Path $items -DestinationPath ".\target\release\zed-$env:RELEASE_VERSION-$env:ZED_RELEASE_CHANNEL.dbg.zip" -Force +} + +function MakeAppx { + switch ($channel) { + "stable" { + $manifestFile = "$env:ZED_WORKSPACE\crates\explorer_command_injector\AppxManifest.xml" + } + "preview" { + $manifestFile = "$env:ZED_WORKSPACE\crates\explorer_command_injector\AppxManifest-Preview.xml" + } + default { + $manifestFile = "$env:ZED_WORKSPACE\crates\explorer_command_injector\AppxManifest-Nightly.xml" + } + } + Copy-Item -Path "$manifestFile" -Destination "$innoDir\make_appx\AppxManifest.xml" + # Add makeAppx.exe to Path + $sdk = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64" + $env:Path += ';' + $sdk + makeAppx.exe pack /d "$innoDir\make_appx" /p "$innoDir\zed_explorer_command_injector.appx" /nv +} + +function SignZedAndItsFriends { + $files = "$innoDir\Zed.exe,$innoDir\cli.exe,$innoDir\auto_update_helper.exe,$innoDir\zed_explorer_command_injector.dll,$innoDir\zed_explorer_command_injector.appx" + & "$innoDir\sign.ps1" $files +} + +function CollectFiles { + Move-Item -Path "$innoDir\zed_explorer_command_injector.appx" -Destination "$innoDir\appx\zed_explorer_command_injector.appx" -Force + Move-Item -Path "$innoDir\zed_explorer_command_injector.dll" -Destination "$innoDir\appx\zed_explorer_command_injector.dll" -Force + Move-Item -Path "$innoDir\cli.exe" -Destination "$innoDir\bin\zed.exe" -Force + Move-Item -Path "$innoDir\auto_update_helper.exe" -Destination "$innoDir\tools\auto_update_helper.exe" -Force +} + +function BuildInstaller { + $issFilePath = "$innoDir\zed.iss" + switch ($channel) { + "stable" { + $appId = "{{2DB0DA96-CA55-49BB-AF4F-64AF36A86712}" + $appIconName = "app-icon" + $appName = "Zed Editor" + $appDisplayName = "Zed Editor" + $appSetupName = "ZedEditorUserSetup-x64-$env:RELEASE_VERSION" + # The mutex name here should match the mutex name in crates\zed\src\zed\windows_only_instance.rs + $appMutex = "Zed-Editor-Stable-Instance-Mutex" + $appExeName = "Zed" + $regValueName = "ZedEditor" + $appUserId = "ZedIndustries.Zed" + $appShellNameShort = "Z&ed Editor" + $appAppxFullName = "ZedIndustries.Zed_1.0.0.0_neutral__japxn1gcva8rg" + } + "preview" { + $appId = "{{F70E4811-D0E2-4D88-AC99-D63752799F95}" + $appIconName = "app-icon-preview" + $appName = "Zed Editor Preview" + $appDisplayName = "Zed Editor Preview" + $appSetupName = "ZedEditorUserSetup-x64-$env:RELEASE_VERSION-preview" + # The mutex name here should match the mutex name in crates\zed\src\zed\windows_only_instance.rs + $appMutex = "Zed-Editor-Preview-Instance-Mutex" + $appExeName = "Zed" + $regValueName = "ZedEditorPreview" + $appUserId = "ZedIndustries.Zed.Preview" + $appShellNameShort = "Z&ed Editor Preview" + $appAppxFullName = "ZedIndustries.Zed.Preview_1.0.0.0_neutral__japxn1gcva8rg" + } + "nightly" { + $appId = "{{1BDB21D3-14E7-433C-843C-9C97382B2FE0}" + $appIconName = "app-icon-nightly" + $appName = "Zed Editor Nightly" + $appDisplayName = "Zed Editor Nightly" + $appSetupName = "ZedEditorUserSetup-x64-$env:RELEASE_VERSION-nightly" + # The mutex name here should match the mutex name in crates\zed\src\zed\windows_only_instance.rs + $appMutex = "Zed-Editor-Nightly-Instance-Mutex" + $appExeName = "Zed" + $regValueName = "ZedEditorNightly" + $appUserId = "ZedIndustries.Zed.Nightly" + $appShellNameShort = "Z&ed Editor Nightly" + $appAppxFullName = "ZedIndustries.Zed.Nightly_1.0.0.0_neutral__japxn1gcva8rg" + } + "dev" { + $appId = "{{8357632E-24A4-4F32-BA97-E575B4D1FE5D}" + $appIconName = "app-icon-nightly" + $appName = "Zed Editor Dev" + $appDisplayName = "Zed Editor Dev" + $appSetupName = "ZedEditorUserSetup-x64-$env:RELEASE_VERSION-dev" + # The mutex name here should match the mutex name in crates\zed\src\zed\windows_only_instance.rs + $appMutex = "Zed-Editor-Dev-Instance-Mutex" + $appExeName = "Zed" + $regValueName = "ZedEditorDev" + $appUserId = "ZedIndustries.Zed.Dev" + $appShellNameShort = "Z&ed Editor Dev" + $appAppxFullName = "ZedIndustries.Zed.Dev_1.0.0.0_neutral__japxn1gcva8rg" + } + default { + Write-Error "can't bundle installer for $channel." + exit 1 + } + } + + # Windows runner 2022 default has iscc in PATH, https://github.com/actions/runner-images/blob/main/images/windows/Windows2022-Readme.md + # Currently, we are using Windows 2022 runner. + # Windows runner 2025 doesn't have iscc in PATH for now, https://github.com/actions/runner-images/issues/11228 + # $innoSetupPath = "iscc.exe" + $innoSetupPath = "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" + + $definitions = @{ + "AppId" = $appId + "AppIconName" = $appIconName + "OutputDir" = "$env:ZED_WORKSPACE\target" + "AppSetupName" = $appSetupName + "AppName" = $appName + "AppDisplayName" = $appDisplayName + "RegValueName" = $regValueName + "AppMutex" = $appMutex + "AppExeName" = $appExeName + "ResourcesDir" = "$innoDir" + "ShellNameShort" = $appShellNameShort + "AppUserId" = $appUserId + "Version" = "$env:RELEASE_VERSION" + "SourceDir" = "$env:ZED_WORKSPACE" + "AppxFullName" = $appAppxFullName + } + + $signTool = "powershell.exe -ExecutionPolicy Bypass -File $innoDir\sign.ps1 `$f" + + $defs = @() + foreach ($key in $definitions.Keys) { + $defs += "/d$key=`"$($definitions[$key])`"" + } + + $innoArgs = @($issFilePath) + $defs + "/sDefaultsign=`"$signTool`"" + + # Execute Inno Setup + Write-Host "🚀 Running Inno Setup: $innoSetupPath $innoArgs" + $process = Start-Process -FilePath $innoSetupPath -ArgumentList $innoArgs -NoNewWindow -Wait -PassThru + + if ($process.ExitCode -eq 0) { + Write-Host "✅ Inno Setup successfully compiled the installer" + Write-Output "SETUP_PATH=target/$appSetupName.exe" >> $env:GITHUB_ENV + $script:buildSuccess = $true + } + else { + Write-Host "❌ Inno Setup failed: $($process.ExitCode)" + $script:buildSuccess = $false + } +} + +ParseZedWorkspace +CheckEnvironmentVariables +PrepareForBundle +BuildZedAndItsFriends +MakeAppx +SignZedAndItsFriends +ZipZedAndItsFriendsDebug +CollectFiles +BuildInstaller + +$debugArchive = ".\target\release\zed-$env:RELEASE_VERSION-$env:ZED_RELEASE_CHANNEL.dbg.zip" +$debugStoreKey = "$env:ZED_RELEASE_CHANNEL/zed-$env:RELEASE_VERSION-$env:ZED_RELEASE_CHANNEL.dbg.zip" +UploadToBlobStorePublic -BucketName "zed-debug-symbols" -FileToUpload $debugArchive -BlobStoreKey $debugStoreKey + +if ($buildSuccess) { + Write-Output "Build successful" + if ($Install) { + Write-Output "Installing Zed..." + Start-Process -FilePath "$env:ZED_WORKSPACE/target/ZedEditorUserSetup-x64-$env:RELEASE_VERSION.exe" + } + exit 0 +} +else { + Write-Output "Build failed" + exit 1 +} diff --git a/script/clear-target-dir-if-larger-than.ps1 b/script/clear-target-dir-if-larger-than.ps1 index 8bb77997d6..c18c308624 100644 --- a/script/clear-target-dir-if-larger-than.ps1 +++ b/script/clear-target-dir-if-larger-than.ps1 @@ -18,5 +18,5 @@ Write-Host "target directory size: ${current_size_gb}GB. max size: ${MAX_SIZE_IN if ($current_size_gb -gt $MAX_SIZE_IN_GB) { Write-Host "clearing target directory" - Remove-Item -Recurse -Force -Path "target\*" + Remove-Item -Recurse -Force -Path "target\*" -ErrorAction SilentlyContinue } diff --git a/script/determine-release-channel.ps1 b/script/determine-release-channel.ps1 new file mode 100644 index 0000000000..eb3ad9c005 --- /dev/null +++ b/script/determine-release-channel.ps1 @@ -0,0 +1,37 @@ +$ErrorActionPreference = "Stop" + +if (-not $env:GITHUB_ACTIONS) { + Write-Error "Error: This script must be run in a GitHub Actions environment" + exit 1 +} + +if (-not $env:GITHUB_REF) { + Write-Error "Error: GITHUB_REF is not set" + exit 1 +} + +$version = & "script/get-crate-version.ps1" "zed" +$channel = Get-Content "crates/zed/RELEASE_CHANNEL" + +Write-Host "Publishing version: $version on release channel $channel" +Write-Output "RELEASE_CHANNEL=$channel" >> $env:GITHUB_ENV +Write-Output "RELEASE_VERSION=$version" >> $env:GITHUB_ENV + +$expectedTagName = "" +switch ($channel) { + "stable" { + $expectedTagName = "v$version" + } + "preview" { + $expectedTagName = "v$version-pre" + } + default { + Write-Error "can't publish a release on channel $channel" + exit 1 + } +} + +if ($env:GITHUB_REF_NAME -ne $expectedTagName) { + Write-Error "invalid release tag $($env:GITHUB_REF_NAME). expected $expectedTagName" + exit 1 +} diff --git a/script/get-crate-version.ps1 b/script/get-crate-version.ps1 new file mode 100644 index 0000000000..d86c971e32 --- /dev/null +++ b/script/get-crate-version.ps1 @@ -0,0 +1,16 @@ +if ($args.Length -ne 1) { + Write-Error "Usage: $($MyInvocation.MyCommand.Name) " + exit 1 +} + +$crateName = $args[0] + +$metadata = cargo metadata --no-deps --format-version=1 | ConvertFrom-Json + +$package = $metadata.packages | Where-Object { $_.name -eq $crateName } +if ($package) { + $package.version +} +else { + Write-Error "Crate '$crateName' not found." +} diff --git a/script/lib/blob-store.ps1 b/script/lib/blob-store.ps1 new file mode 100644 index 0000000000..38bf1682d2 --- /dev/null +++ b/script/lib/blob-store.ps1 @@ -0,0 +1,68 @@ +function UploadToBlobStoreWithACL { + param ( + [string]$BucketName, + [string]$FileToUpload, + [string]$BlobStoreKey, + [string]$ACL + ) + + # Format date to match AWS requirements + $Date = (Get-Date).ToUniversalTime().ToString("r") + # Note: Original script had a bug where it overrode the ACL parameter + # I'm keeping the same behavior for compatibility + $ACL = "public-read" + $ContentType = "application/octet-stream" + $StorageClass = "STANDARD" + + # Create string to sign (AWS S3 compatible format) + $StringToSign = "PUT`n`n${ContentType}`n${Date}`nx-amz-acl:${ACL}`nx-amz-storage-class:${StorageClass}`n/${BucketName}/${BlobStoreKey}" + + # Generate HMAC-SHA1 signature + $HMACSHA1 = New-Object System.Security.Cryptography.HMACSHA1 + $HMACSHA1.Key = [System.Text.Encoding]::UTF8.GetBytes($env:DIGITALOCEAN_SPACES_SECRET_KEY) + $Signature = [System.Convert]::ToBase64String($HMACSHA1.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($StringToSign))) + + # Upload file using Invoke-WebRequest (equivalent to curl) + $Headers = @{ + "Host" = "${BucketName}.nyc3.digitaloceanspaces.com" + "Date" = $Date + "Content-Type" = $ContentType + "x-amz-storage-class" = $StorageClass + "x-amz-acl" = $ACL + "Authorization" = "AWS ${env:DIGITALOCEAN_SPACES_ACCESS_KEY}:$Signature" + } + + $Uri = "https://${BucketName}.nyc3.digitaloceanspaces.com/${BlobStoreKey}" + + # Read file content + $FileContent = Get-Content $FileToUpload -Raw -AsByteStream + + try { + Invoke-WebRequest -Uri $Uri -Method PUT -Headers $Headers -Body $FileContent -ContentType $ContentType -Verbose + Write-Host "Successfully uploaded $FileToUpload to $Uri" -ForegroundColor Green + } + catch { + Write-Error "Failed to upload file: $_" + throw $_ + } +} + +function UploadToBlobStorePublic { + param ( + [string]$BucketName, + [string]$FileToUpload, + [string]$BlobStoreKey + ) + + UploadToBlobStoreWithACL -BucketName $BucketName -FileToUpload $FileToUpload -BlobStoreKey $BlobStoreKey -ACL "public-read" +} + +function UploadToBlobStore { + param ( + [string]$BucketName, + [string]$FileToUpload, + [string]$BlobStoreKey + ) + + UploadToBlobStoreWithACL -BucketName $BucketName -FileToUpload $FileToUpload -BlobStoreKey $BlobStoreKey -ACL "private" +} diff --git a/script/lib/workspace.ps1 b/script/lib/workspace.ps1 new file mode 100644 index 0000000000..c6fdc274c1 --- /dev/null +++ b/script/lib/workspace.ps1 @@ -0,0 +1,6 @@ + +function ParseZedWorkspace { + $metadata = cargo metadata --no-deps --offline | ConvertFrom-Json + $env:ZED_WORKSPACE = $metadata.workspace_root + $env:RELEASE_VERSION = $metadata.packages | Where-Object { $_.name -eq "zed" } | Select-Object -ExpandProperty version +} diff --git a/script/upload-nightly.ps1 b/script/upload-nightly.ps1 new file mode 100644 index 0000000000..7fa453c806 --- /dev/null +++ b/script/upload-nightly.ps1 @@ -0,0 +1,60 @@ +# Based on the template in: https://docs.digitalocean.com/reference/api/spaces-api/ +$ErrorActionPreference = "Stop" +. "$PSScriptRoot\lib\blob-store.ps1" +. "$PSScriptRoot\lib\workspace.ps1" + +$allowedTargets = @("windows") + +function Test-AllowedTarget { + param ( + [string]$Target + ) + + return $allowedTargets -contains $Target +} + +# Process arguments +if ($args.Count -gt 0) { + $target = $args[0] + if (Test-AllowedTarget $target) { + # Valid target + } else { + Write-Error "Error: Target '$target' is not allowed.`nUsage: $($MyInvocation.MyCommand.Name) [$($allowedTargets -join ', ')]" + exit 1 + } +} else { + Write-Error "Error: Target is not specified.`nUsage: $($MyInvocation.MyCommand.Name) [$($allowedTargets -join ', ')]" + exit 1 +} + +ParseZedWorkspace +Write-Host "Uploading nightly for target: $target" + +$bucketName = "zed-nightly-host" + +# Get current git SHA +$sha = git rev-parse HEAD +$sha | Out-File -FilePath "target/latest-sha" -NoNewline + +# TODO: +# Upload remote server files +# $remoteServerFiles = Get-ChildItem -Path "target" -Filter "zed-remote-server-*.gz" -Recurse -File +# foreach ($file in $remoteServerFiles) { +# Upload-ToBlobStore -BucketName $bucketName -FileToUpload $file.FullName -BlobStoreKey "nightly/$($file.Name)" +# Remove-Item -Path $file.FullName +# } + +switch ($target) { + "windows" { + UploadToBlobStore -BucketName $bucketName -FileToUpload $env:SETUP_PATH -BlobStoreKey "nightly/zed_editor_installer_x86_64.exe" + UploadToBlobStore -BucketName $bucketName -FileToUpload "target/latest-sha" -BlobStoreKey "nightly/latest-sha-windows" + + Remove-Item -Path $env:SETUP_PATH -ErrorAction SilentlyContinue + Remove-Item -Path "target/latest-sha" -ErrorAction SilentlyContinue + } + + default { + Write-Error "Error: Unknown target '$target'" + exit 1 + } +} diff --git a/typos.toml b/typos.toml index 83d1f2967d..7f1c6e04f1 100644 --- a/typos.toml +++ b/typos.toml @@ -46,6 +46,8 @@ extend-exclude = [ "script/danger/dangerfile.ts", # Eval examples for prompts and criteria "crates/eval/src/examples/", + # File type extensions are not typos + "crates/zed/resources/windows/zed.iss", # typos-cli doesn't understand our `vˇariable` markup "crates/editor/src/hover_links.rs", # typos-cli doesn't understand `setis` is intentional test case From 8e8a772c2d40348740125b7ca851c94fdac0072b Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Tue, 8 Jul 2025 21:24:43 -0600 Subject: [PATCH 19/34] vim: Add U to undo last line (#33571) Closes #14760 Still TODO: * Vim actually undoes *many* changes if they're all on the same line. Release Notes: - vim: Add `U` to return to the last changed line and undo --- assets/keymaps/vim.json | 1 + crates/editor/src/editor.rs | 42 +++- crates/vim/src/normal.rs | 216 +++++++++++++++++- crates/vim/src/vim.rs | 2 + crates/vim/test_data/test_undo_last_line.json | 14 ++ .../test_undo_last_line_newline.json | 15 ++ ...t_undo_last_line_newline_many_changes.json | 21 ++ 7 files changed, 303 insertions(+), 8 deletions(-) create mode 100644 crates/vim/test_data/test_undo_last_line.json create mode 100644 crates/vim/test_data/test_undo_last_line_newline.json create mode 100644 crates/vim/test_data/test_undo_last_line_newline_many_changes.json diff --git a/assets/keymaps/vim.json b/assets/keymaps/vim.json index 4b48b26ef4..571192a479 100644 --- a/assets/keymaps/vim.json +++ b/assets/keymaps/vim.json @@ -364,6 +364,7 @@ "p": "vim::Paste", "shift-p": ["vim::Paste", { "before": true }], "u": "vim::Undo", + "shift-u": "vim::UndoLastLine", "r": "vim::PushReplace", "s": "vim::Substitute", "shift-s": "vim::SubstituteLine", diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 6d529287a7..03e2124742 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -865,9 +865,19 @@ pub trait Addon: 'static { } } +struct ChangeLocation { + current: Option>, + original: Vec, +} +impl ChangeLocation { + fn locations(&self) -> &[Anchor] { + self.current.as_ref().unwrap_or(&self.original) + } +} + /// A set of caret positions, registered when the editor was edited. pub struct ChangeList { - changes: Vec>, + changes: Vec, /// Currently "selected" change. position: Option, } @@ -894,20 +904,38 @@ impl ChangeList { (prev + count).min(self.changes.len() - 1) }; self.position = Some(next); - self.changes.get(next).map(|anchors| anchors.as_slice()) + self.changes.get(next).map(|change| change.locations()) } /// Adds a new change to the list, resetting the change list position. - pub fn push_to_change_list(&mut self, pop_state: bool, new_positions: Vec) { + pub fn push_to_change_list(&mut self, group: bool, new_positions: Vec) { self.position.take(); - if pop_state { - self.changes.pop(); + if let Some(last) = self.changes.last_mut() + && group + { + last.current = Some(new_positions) + } else { + self.changes.push(ChangeLocation { + original: new_positions, + current: None, + }); } - self.changes.push(new_positions.clone()); } pub fn last(&self) -> Option<&[Anchor]> { - self.changes.last().map(|anchors| anchors.as_slice()) + self.changes.last().map(|change| change.locations()) + } + + pub fn last_before_grouping(&self) -> Option<&[Anchor]> { + self.changes.last().map(|change| change.original.as_slice()) + } + + pub fn invert_last_group(&mut self) { + if let Some(last) = self.changes.last_mut() { + if let Some(current) = last.current.as_mut() { + mem::swap(&mut last.original, current); + } + } } } diff --git a/crates/vim/src/normal.rs b/crates/vim/src/normal.rs index f772c446fe..baaf6bc3c4 100644 --- a/crates/vim/src/normal.rs +++ b/crates/vim/src/normal.rs @@ -24,9 +24,9 @@ use crate::{ }; use collections::BTreeSet; use convert::ConvertTarget; -use editor::Bias; use editor::Editor; use editor::{Anchor, SelectionEffects}; +use editor::{Bias, ToPoint}; use editor::{display_map::ToDisplayPoint, movement}; use gpui::{Context, Window, actions}; use language::{Point, SelectionGoal}; @@ -90,6 +90,8 @@ actions!( Undo, /// Redoes the last undone change. Redo, + /// Undoes all changes to the most recently changed line. + UndoLastLine, ] ); @@ -194,6 +196,120 @@ pub(crate) fn register(editor: &mut Editor, cx: &mut Context) { } }); }); + Vim::action(editor, cx, |vim, _: &UndoLastLine, window, cx| { + Vim::take_forced_motion(cx); + vim.update_editor(window, cx, |vim, editor, window, cx| { + let snapshot = editor.buffer().read(cx).snapshot(cx); + let Some(last_change) = editor.change_list.last_before_grouping() else { + return; + }; + + let anchors = last_change.iter().cloned().collect::>(); + let mut last_row = None; + let ranges: Vec<_> = anchors + .iter() + .filter_map(|anchor| { + let point = anchor.to_point(&snapshot); + if last_row == Some(point.row) { + return None; + } + last_row = Some(point.row); + let line_range = Point::new(point.row, 0) + ..Point::new(point.row, snapshot.line_len(MultiBufferRow(point.row))); + Some(( + snapshot.anchor_before(line_range.start) + ..snapshot.anchor_after(line_range.end), + line_range, + )) + }) + .collect(); + + let edits = editor.buffer().update(cx, |buffer, cx| { + let current_content = ranges + .iter() + .map(|(anchors, _)| { + buffer + .snapshot(cx) + .text_for_range(anchors.clone()) + .collect::() + }) + .collect::>(); + let mut content_before_undo = current_content.clone(); + let mut undo_count = 0; + + loop { + let undone_tx = buffer.undo(cx); + undo_count += 1; + let mut content_after_undo = Vec::new(); + + let mut line_changed = false; + for ((anchors, _), text_before_undo) in + ranges.iter().zip(content_before_undo.iter()) + { + let snapshot = buffer.snapshot(cx); + let text_after_undo = + snapshot.text_for_range(anchors.clone()).collect::(); + + if &text_after_undo != text_before_undo { + line_changed = true; + } + content_after_undo.push(text_after_undo); + } + + content_before_undo = content_after_undo; + if !line_changed { + break; + } + if undone_tx == vim.undo_last_line_tx { + break; + } + } + + let edits = ranges + .into_iter() + .zip(content_before_undo.into_iter().zip(current_content)) + .filter_map(|((_, mut points), (mut old_text, new_text))| { + if new_text == old_text { + return None; + } + let common_suffix_starts_at = old_text + .char_indices() + .rev() + .zip(new_text.chars().rev()) + .find_map( + |((i, a), b)| { + if a != b { Some(i + a.len_utf8()) } else { None } + }, + ) + .unwrap_or(old_text.len()); + points.end.column -= (old_text.len() - common_suffix_starts_at) as u32; + old_text = old_text.split_at(common_suffix_starts_at).0.to_string(); + let common_prefix_len = old_text + .char_indices() + .zip(new_text.chars()) + .find_map(|((i, a), b)| if a != b { Some(i) } else { None }) + .unwrap_or(0); + points.start.column = common_prefix_len as u32; + old_text = old_text.split_at(common_prefix_len).1.to_string(); + + Some((points, old_text)) + }) + .collect::>(); + + for _ in 0..undo_count { + buffer.redo(cx); + } + edits + }); + vim.undo_last_line_tx = editor.transact(window, cx, |editor, window, cx| { + editor.change_list.invert_last_group(); + editor.edit(edits, cx); + editor.change_selections(SelectionEffects::default(), window, cx, |s| { + s.select_anchor_ranges(anchors.into_iter().map(|a| a..a)); + }) + }); + }); + }); repeat::register(editor, cx); scroll::register(editor, cx); @@ -1876,4 +1992,102 @@ mod test { cx.simulate_shared_keystrokes("ctrl-o").await; cx.shared_state().await.assert_matches(); } + + #[gpui::test] + async fn test_undo_last_line(cx: &mut gpui::TestAppContext) { + let mut cx = NeovimBackedTestContext::new(cx).await; + + cx.set_shared_state(indoc! {" + ˇfn a() { } + fn a() { } + fn a() { } + "}) + .await; + // do a jump to reset vim's undo grouping + cx.simulate_shared_keystrokes("shift-g").await; + cx.shared_state().await.assert_matches(); + cx.simulate_shared_keystrokes("r a").await; + cx.shared_state().await.assert_matches(); + cx.simulate_shared_keystrokes("shift-u").await; + cx.shared_state().await.assert_matches(); + cx.simulate_shared_keystrokes("shift-u").await; + cx.shared_state().await.assert_matches(); + cx.simulate_shared_keystrokes("g g shift-u").await; + cx.shared_state().await.assert_matches(); + } + + #[gpui::test] + async fn test_undo_last_line_newline(cx: &mut gpui::TestAppContext) { + let mut cx = NeovimBackedTestContext::new(cx).await; + + cx.set_shared_state(indoc! {" + ˇfn a() { } + fn a() { } + fn a() { } + "}) + .await; + // do a jump to reset vim's undo grouping + cx.simulate_shared_keystrokes("shift-g k").await; + cx.shared_state().await.assert_matches(); + cx.simulate_shared_keystrokes("o h e l l o escape").await; + cx.shared_state().await.assert_matches(); + cx.simulate_shared_keystrokes("shift-u").await; + cx.shared_state().await.assert_matches(); + cx.simulate_shared_keystrokes("shift-u").await; + } + + #[gpui::test] + async fn test_undo_last_line_newline_many_changes(cx: &mut gpui::TestAppContext) { + let mut cx = NeovimBackedTestContext::new(cx).await; + + cx.set_shared_state(indoc! {" + ˇfn a() { } + fn a() { } + fn a() { } + "}) + .await; + // do a jump to reset vim's undo grouping + cx.simulate_shared_keystrokes("x shift-g k").await; + cx.shared_state().await.assert_matches(); + cx.simulate_shared_keystrokes("x f a x f { x").await; + cx.shared_state().await.assert_matches(); + cx.simulate_shared_keystrokes("shift-u").await; + cx.shared_state().await.assert_matches(); + cx.simulate_shared_keystrokes("shift-u").await; + cx.shared_state().await.assert_matches(); + cx.simulate_shared_keystrokes("shift-u").await; + cx.shared_state().await.assert_matches(); + cx.simulate_shared_keystrokes("shift-u").await; + cx.shared_state().await.assert_matches(); + } + + #[gpui::test] + async fn test_undo_last_line_multicursor(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + + cx.set_state( + indoc! {" + ˇone two ˇone + two ˇone two + "}, + Mode::Normal, + ); + cx.simulate_keystrokes("3 r a"); + cx.assert_state( + indoc! {" + aaˇa two aaˇa + two aaˇa two + "}, + Mode::Normal, + ); + cx.simulate_keystrokes("escape escape"); + cx.simulate_keystrokes("shift-u"); + cx.set_state( + indoc! {" + onˇe two onˇe + two onˇe two + "}, + Mode::Normal, + ); + } } diff --git a/crates/vim/src/vim.rs b/crates/vim/src/vim.rs index 9229f145d9..95a08d7c66 100644 --- a/crates/vim/src/vim.rs +++ b/crates/vim/src/vim.rs @@ -375,6 +375,7 @@ pub(crate) struct Vim { pub(crate) current_tx: Option, pub(crate) current_anchor: Option>, pub(crate) undo_modes: HashMap, + pub(crate) undo_last_line_tx: Option, selected_register: Option, pub search: SearchState, @@ -422,6 +423,7 @@ impl Vim { stored_visual_mode: None, current_tx: None, + undo_last_line_tx: None, current_anchor: None, undo_modes: HashMap::default(), diff --git a/crates/vim/test_data/test_undo_last_line.json b/crates/vim/test_data/test_undo_last_line.json new file mode 100644 index 0000000000..a2f6fc0995 --- /dev/null +++ b/crates/vim/test_data/test_undo_last_line.json @@ -0,0 +1,14 @@ +{"Put":{"state":"ˇfn a() { }\nfn a() { }\nfn a() { }\n"}} +{"Key":"shift-g"} +{"Get":{"state":"fn a() { }\nfn a() { }\nfn a() { }\nˇ","mode":"Normal"}} +{"Key":"r"} +{"Key":"a"} +{"Get":{"state":"fn a() { }\nfn a() { }\nfn a() { }\nˇ","mode":"Normal"}} +{"Key":"shift-u"} +{"Get":{"state":"ˇ\nfn a() { }\nfn a() { }\n","mode":"Normal"}} +{"Key":"shift-u"} +{"Get":{"state":"ˇfn a() { }\nfn a() { }\nfn a() { }\n","mode":"Normal"}} +{"Key":"g"} +{"Key":"g"} +{"Key":"shift-u"} +{"Get":{"state":"ˇ\nfn a() { }\nfn a() { }\n","mode":"Normal"}} diff --git a/crates/vim/test_data/test_undo_last_line_newline.json b/crates/vim/test_data/test_undo_last_line_newline.json new file mode 100644 index 0000000000..2b21ccef09 --- /dev/null +++ b/crates/vim/test_data/test_undo_last_line_newline.json @@ -0,0 +1,15 @@ +{"Put":{"state":"ˇfn a() { }\nfn a() { }\nfn a() { }\n"}} +{"Key":"shift-g"} +{"Key":"k"} +{"Get":{"state":"fn a() { }\nfn a() { }\nˇfn a() { }\n","mode":"Normal"}} +{"Key":"o"} +{"Key":"h"} +{"Key":"e"} +{"Key":"l"} +{"Key":"l"} +{"Key":"o"} +{"Key":"escape"} +{"Get":{"state":"fn a() { }\nfn a() { }\nfn a() { }\nhellˇo\n","mode":"Normal"}} +{"Key":"shift-u"} +{"Get":{"state":"fn a() { }\nfn a() { }\nfn a() { }\nˇ\n","mode":"Normal"}} +{"Key":"shift-u"} diff --git a/crates/vim/test_data/test_undo_last_line_newline_many_changes.json b/crates/vim/test_data/test_undo_last_line_newline_many_changes.json new file mode 100644 index 0000000000..6615e8d79a --- /dev/null +++ b/crates/vim/test_data/test_undo_last_line_newline_many_changes.json @@ -0,0 +1,21 @@ +{"Put":{"state":"ˇfn a() { }\nfn a() { }\nfn a() { }\n"}} +{"Key":"x"} +{"Key":"shift-g"} +{"Key":"k"} +{"Get":{"state":"n a() { }\nfn a() { }\nˇfn a() { }\n","mode":"Normal"}} +{"Key":"x"} +{"Key":"f"} +{"Key":"a"} +{"Key":"x"} +{"Key":"f"} +{"Key":"{"} +{"Key":"x"} +{"Get":{"state":"n a() { }\nfn a() { }\nn () ˇ }\n","mode":"Normal"}} +{"Key":"shift-u"} +{"Get":{"state":"n a() { }\nfn a() { }\nˇfn a() { }\n","mode":"Normal"}} +{"Key":"shift-u"} +{"Get":{"state":"n a() { }\nfn a() { }\nn () ˇ }\n","mode":"Normal"}} +{"Key":"shift-u"} +{"Get":{"state":"n a() { }\nfn a() { }\nˇfn a() { }\n","mode":"Normal"}} +{"Key":"shift-u"} +{"Get":{"state":"n a() { }\nfn a() { }\nn () ˇ }\n","mode":"Normal"}} From ecf4d5539ea1695a7408f5b8d542c0ca02e43315 Mon Sep 17 00:00:00 2001 From: Joel Courtney Date: Tue, 8 Jul 2025 20:34:20 -0700 Subject: [PATCH 20/34] helix: Stay in helix normal mode after helix delete (#34093) Currently, the HelixDelete action switches to (vim) Normal mode instead of HelixNormal mode. This adds a line to the helix delete action to stay in helix normal mode. There was already a commented-out test for this. I've uncommented it and it now passes. Release Notes: - helix: Fixed switching to vim NORMAL mode instead of HELIX_NORMAL mode after deletion --- crates/vim/src/helix.rs | 58 ++++++++++++++++++++-------------------- crates/vim/src/normal.rs | 1 + 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/crates/vim/src/helix.rs b/crates/vim/src/helix.rs index e271c06a5e..ec9b959b12 100644 --- a/crates/vim/src/helix.rs +++ b/crates/vim/src/helix.rs @@ -368,40 +368,40 @@ mod test { cx.assert_state("aa\n«ˇ »bb", Mode::HelixNormal); } - // #[gpui::test] - // async fn test_delete(cx: &mut gpui::TestAppContext) { - // let mut cx = VimTestContext::new(cx, true).await; + #[gpui::test] + async fn test_delete(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; - // // test delete a selection - // cx.set_state( - // indoc! {" - // The qu«ick ˇ»brown - // fox jumps over - // the lazy dog."}, - // Mode::HelixNormal, - // ); + // test delete a selection + cx.set_state( + indoc! {" + The qu«ick ˇ»brown + fox jumps over + the lazy dog."}, + Mode::HelixNormal, + ); - // cx.simulate_keystrokes("d"); + cx.simulate_keystrokes("d"); - // cx.assert_state( - // indoc! {" - // The quˇbrown - // fox jumps over - // the lazy dog."}, - // Mode::HelixNormal, - // ); + cx.assert_state( + indoc! {" + The quˇbrown + fox jumps over + the lazy dog."}, + Mode::HelixNormal, + ); - // // test deleting a single character - // cx.simulate_keystrokes("d"); + // test deleting a single character + cx.simulate_keystrokes("d"); - // cx.assert_state( - // indoc! {" - // The quˇrown - // fox jumps over - // the lazy dog."}, - // Mode::HelixNormal, - // ); - // } + cx.assert_state( + indoc! {" + The quˇrown + fox jumps over + the lazy dog."}, + Mode::HelixNormal, + ); + } // #[gpui::test] // async fn test_delete_character_end_of_line(cx: &mut gpui::TestAppContext) { diff --git a/crates/vim/src/normal.rs b/crates/vim/src/normal.rs index baaf6bc3c4..6131032f4f 100644 --- a/crates/vim/src/normal.rs +++ b/crates/vim/src/normal.rs @@ -140,6 +140,7 @@ pub(crate) fn register(editor: &mut Editor, cx: &mut Context) { }) }); vim.visual_delete(false, window, cx); + vim.switch_mode(Mode::HelixNormal, true, window, cx); }); Vim::action(editor, cx, |vim, _: &ChangeToEndOfLine, window, cx| { From acff48fc0d7a39199d713d2b11623332f1fe83d1 Mon Sep 17 00:00:00 2001 From: AidanV <84053180+AidanV@users.noreply.github.com> Date: Tue, 8 Jul 2025 22:43:43 -0700 Subject: [PATCH 21/34] vim: Add `:sp[lit] ` and `:vs[plit] ` support (#33686) Closes #32627 Release Notes: - Adds `:sp[lit] ` and `:vs[plit] ` support --- crates/vim/src/command.rs | 56 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/crates/vim/src/command.rs b/crates/vim/src/command.rs index b24ca75e8b..c001f55a41 100644 --- a/crates/vim/src/command.rs +++ b/crates/vim/src/command.rs @@ -28,8 +28,8 @@ use std::{ use task::{HideStrategy, RevealStrategy, SpawnInTerminal, TaskId}; use ui::ActiveTheme; use util::ResultExt; -use workspace::notifications::DetachAndPromptErr; use workspace::{Item, SaveIntent, notifications::NotifyResultExt}; +use workspace::{SplitDirection, notifications::DetachAndPromptErr}; use zed_actions::{OpenDocs, RevealTarget}; use crate::{ @@ -175,6 +175,13 @@ struct VimSave { } /// Deletes the specified marks from the editor. +#[derive(Clone, PartialEq, Action)] +#[action(namespace = vim, no_json, no_register)] +struct VimSplit { + pub vertical: bool, + pub filename: String, +} + #[derive(Clone, PartialEq, Action)] #[action(namespace = vim, no_json, no_register)] enum DeleteMarks { @@ -323,6 +330,33 @@ pub fn register(editor: &mut Editor, cx: &mut Context) { }); }); + Vim::action(editor, cx, |vim, action: &VimSplit, window, cx| { + let Some(workspace) = vim.workspace(window) else { + return; + }; + + workspace.update(cx, |workspace, cx| { + let project = workspace.project().clone(); + let Some(worktree) = project.read(cx).visible_worktrees(cx).next() else { + return; + }; + let project_path = ProjectPath { + worktree_id: worktree.read(cx).id(), + path: Arc::from(Path::new(&action.filename)), + }; + + let direction = if action.vertical { + SplitDirection::vertical(cx) + } else { + SplitDirection::horizontal(cx) + }; + + workspace + .split_path_preview(project_path, false, Some(direction), window, cx) + .detach_and_log_err(cx); + }) + }); + Vim::action(editor, cx, |vim, action: &DeleteMarks, window, cx| { fn err(s: String, window: &mut Window, cx: &mut Context) { let _ = window.prompt( @@ -998,8 +1032,24 @@ fn generate_commands(_: &App) -> Vec { save_intent: Some(SaveIntent::Overwrite), }), VimCommand::new(("cq", "uit"), zed_actions::Quit), - VimCommand::new(("sp", "lit"), workspace::SplitHorizontal), - VimCommand::new(("vs", "plit"), workspace::SplitVertical), + VimCommand::new(("sp", "lit"), workspace::SplitHorizontal).args(|_, args| { + Some( + VimSplit { + vertical: false, + filename: args, + } + .boxed_clone(), + ) + }), + VimCommand::new(("vs", "plit"), workspace::SplitVertical).args(|_, args| { + Some( + VimSplit { + vertical: true, + filename: args, + } + .boxed_clone(), + ) + }), VimCommand::new( ("bd", "elete"), workspace::CloseActiveItem { From 6daf888fdbe5cdd402b69d1ecefa2ba5e40888f9 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Wed, 9 Jul 2025 00:05:46 -0600 Subject: [PATCH 22/34] More Tips'n'tricks (#34103) Document one way to avoid pathological cargo cache problems. Release Notes: - N/A --- docs/src/development/macos.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/src/development/macos.md b/docs/src/development/macos.md index ee6930c953..91adf78193 100644 --- a/docs/src/development/macos.md +++ b/docs/src/development/macos.md @@ -136,6 +136,21 @@ This error seems to be caused by OS resource constraints. Installing and running ## Tips & Tricks +### Avoiding continual rebuilds + +If you are finding that Zed is continually rebuilding root crates, it may be because +you are pointing your development Zed at the codebase itself. + +This causes problems because `cargo run` exports a bunch of environment +variables which are picked up by the `rust-analyzer` that runs in the development +build of Zed. These environment variables are in turn passed to `cargo check`, which +invalidates the build cache of some of the crates we depend on. + +You can easily avoid running the built binary on the checked-out Zed codebase using `cargo run +~/path/to/other/project` to ensure that you don't hit this. + +### Speeding up verification + If you are building Zed a lot, you may find that macOS continually verifies new builds which can add a few seconds to your iteration cycles. From 4ed206b37ce2b1713aa20361dfc74bda4a59b11c Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Wed, 9 Jul 2025 00:14:04 -0600 Subject: [PATCH 23/34] vim: Implement /n and /c in :s (#34102) Closes #23345 Release Notes: - vim: Support /n and /c in :s// --- crates/editor/src/items.rs | 14 -- crates/project/src/search.rs | 3 + crates/search/src/buffer_search.rs | 20 ++ crates/vim/src/normal/search.rs | 271 +++++++++++++++++------ crates/vim/test_data/test_replace_g.json | 23 ++ crates/vim/test_data/test_replace_n.json | 13 ++ 6 files changed, 263 insertions(+), 81 deletions(-) create mode 100644 crates/vim/test_data/test_replace_g.json create mode 100644 crates/vim/test_data/test_replace_n.json diff --git a/crates/editor/src/items.rs b/crates/editor/src/items.rs index fa6bd93ab8..2e4631a62b 100644 --- a/crates/editor/src/items.rs +++ b/crates/editor/src/items.rs @@ -1607,24 +1607,10 @@ impl SearchableItem for Editor { let text = self.buffer.read(cx); let text = text.snapshot(cx); let mut edits = vec![]; - let mut last_point: Option = None; for m in matches { - let point = m.start.to_point(&text); let text = text.text_for_range(m.clone()).collect::>(); - // Check if the row for the current match is different from the last - // match. If that's not the case and we're still replacing matches - // in the same row/line, skip this match if the `one_match_per_line` - // option is enabled. - if last_point.is_none() { - last_point = Some(point); - } else if last_point.is_some() && point.row != last_point.unwrap().row { - last_point = Some(point); - } else if query.one_match_per_line().is_some_and(|enabled| enabled) { - continue; - } - let text: Cow<_> = if text.len() == 1 { text.first().cloned().unwrap().into() } else { diff --git a/crates/project/src/search.rs b/crates/project/src/search.rs index d3585115f5..44732b23cd 100644 --- a/crates/project/src/search.rs +++ b/crates/project/src/search.rs @@ -404,6 +404,9 @@ impl SearchQuery { let start = line_offset + mat.start(); let end = line_offset + mat.end(); matches.push(start..end); + if self.one_match_per_line() == Some(true) { + break; + } } line_offset += line.len() + 1; diff --git a/crates/search/src/buffer_search.rs b/crates/search/src/buffer_search.rs index 35c8fcd230..c2590ec9b0 100644 --- a/crates/search/src/buffer_search.rs +++ b/crates/search/src/buffer_search.rs @@ -939,6 +939,11 @@ impl BufferSearchBar { }); } + pub fn focus_replace(&mut self, window: &mut Window, cx: &mut Context) { + self.focus(&self.replacement_editor.focus_handle(cx), window, cx); + cx.notify(); + } + pub fn search( &mut self, query: &str, @@ -1092,6 +1097,21 @@ impl BufferSearchBar { } } + pub fn select_first_match(&mut self, window: &mut Window, cx: &mut Context) { + if let Some(searchable_item) = self.active_searchable_item.as_ref() { + if let Some(matches) = self + .searchable_items_with_matches + .get(&searchable_item.downgrade()) + { + if matches.is_empty() { + return; + } + searchable_item.update_matches(matches, window, cx); + searchable_item.activate_match(0, matches, window, cx); + } + } + } + pub fn select_last_match(&mut self, window: &mut Window, cx: &mut Context) { if let Some(searchable_item) = self.active_searchable_item.as_ref() { if let Some(matches) = self diff --git a/crates/vim/src/normal/search.rs b/crates/vim/src/normal/search.rs index 182e60e56c..24f2cf751f 100644 --- a/crates/vim/src/normal/search.rs +++ b/crates/vim/src/normal/search.rs @@ -71,11 +71,13 @@ pub struct ReplaceCommand { } #[derive(Clone, Debug, PartialEq)] -pub(crate) struct Replacement { +pub struct Replacement { search: String, replacement: String, - should_replace_all: bool, - is_case_sensitive: bool, + case_sensitive: Option, + flag_n: bool, + flag_g: bool, + flag_c: bool, } actions!( @@ -468,71 +470,89 @@ impl Vim { result.notify_err(workspace, cx); }) } - let vim = cx.entity().clone(); - pane.update(cx, |pane, cx| { - let mut options = SearchOptions::REGEX; + let Some(search_bar) = pane.update(cx, |pane, cx| { + pane.toolbar().read(cx).item_of_type::() + }) else { + return; + }; + let mut options = SearchOptions::REGEX; + let search = search_bar.update(cx, |search_bar, cx| { + if !search_bar.show(window, cx) { + return None; + } - let Some(search_bar) = pane.toolbar().read(cx).item_of_type::() else { - return; + let search = if replacement.search.is_empty() { + search_bar.query(cx) + } else { + replacement.search }; - let search = search_bar.update(cx, |search_bar, cx| { - if !search_bar.show(window, cx) { - return None; - } - if replacement.is_case_sensitive { - options.set(SearchOptions::CASE_SENSITIVE, true) - } - let search = if replacement.search.is_empty() { - search_bar.query(cx) - } else { - replacement.search - }; - if search_bar.should_use_smartcase_search(cx) { - options.set( - SearchOptions::CASE_SENSITIVE, - search_bar.is_contains_uppercase(&search), - ); - } + if let Some(case) = replacement.case_sensitive { + options.set(SearchOptions::CASE_SENSITIVE, case) + } else if search_bar.should_use_smartcase_search(cx) { + options.set( + SearchOptions::CASE_SENSITIVE, + search_bar.is_contains_uppercase(&search), + ); + } else { + options.set(SearchOptions::CASE_SENSITIVE, false) + } - if !replacement.should_replace_all { - options.set(SearchOptions::ONE_MATCH_PER_LINE, true); + if !replacement.flag_g { + options.set(SearchOptions::ONE_MATCH_PER_LINE, true); + } + + search_bar.set_replacement(Some(&replacement.replacement), cx); + if replacement.flag_c { + search_bar.focus_replace(window, cx); + } + Some(search_bar.search(&search, Some(options), window, cx)) + }); + if replacement.flag_n { + self.move_cursor( + Motion::StartOfLine { + display_lines: false, + }, + None, + window, + cx, + ); + return; + } + let Some(search) = search else { return }; + let search_bar = search_bar.downgrade(); + cx.spawn_in(window, async move |vim, cx| { + search.await?; + search_bar.update_in(cx, |search_bar, window, cx| { + if replacement.flag_c { + search_bar.select_first_match(window, cx); + return; } + search_bar.select_last_match(window, cx); + search_bar.replace_all(&Default::default(), window, cx); + editor.update(cx, |editor, cx| editor.clear_search_within_ranges(cx)); + let _ = search_bar.search(&search_bar.query(cx), None, window, cx); + vim.update(cx, |vim, cx| { + vim.move_cursor( + Motion::StartOfLine { + display_lines: false, + }, + None, + window, + cx, + ) + }) + .ok(); - search_bar.set_replacement(Some(&replacement.replacement), cx); - Some(search_bar.search(&search, Some(options), window, cx)) - }); - let Some(search) = search else { return }; - let search_bar = search_bar.downgrade(); - cx.spawn_in(window, async move |_, cx| { - search.await?; - search_bar.update_in(cx, |search_bar, window, cx| { - search_bar.select_last_match(window, cx); - search_bar.replace_all(&Default::default(), window, cx); - editor.update(cx, |editor, cx| editor.clear_search_within_ranges(cx)); - let _ = search_bar.search(&search_bar.query(cx), None, window, cx); - vim.update(cx, |vim, cx| { - vim.move_cursor( - Motion::StartOfLine { - display_lines: false, - }, - None, - window, - cx, - ) - }); - - // Disable the `ONE_MATCH_PER_LINE` search option when finished, as - // this is not properly supported outside of vim mode, and - // not disabling it makes the "Replace All Matches" button - // actually replace only the first match on each line. - options.set(SearchOptions::ONE_MATCH_PER_LINE, false); - search_bar.set_search_options(options, cx); - })?; - anyhow::Ok(()) + // Disable the `ONE_MATCH_PER_LINE` search option when finished, as + // this is not properly supported outside of vim mode, and + // not disabling it makes the "Replace All Matches" button + // actually replace only the first match on each line. + options.set(SearchOptions::ONE_MATCH_PER_LINE, false); + search_bar.set_search_options(options, cx); }) - .detach_and_log_err(cx); }) + .detach_and_log_err(cx); } } @@ -593,16 +613,19 @@ impl Replacement { let mut replacement = Replacement { search, replacement, - should_replace_all: false, - is_case_sensitive: true, + case_sensitive: None, + flag_g: false, + flag_n: false, + flag_c: false, }; for c in flags.chars() { match c { - 'g' => replacement.should_replace_all = true, - 'c' | 'n' => replacement.should_replace_all = false, - 'i' => replacement.is_case_sensitive = false, - 'I' => replacement.is_case_sensitive = true, + 'g' => replacement.flag_g = true, + 'n' => replacement.flag_n = true, + 'c' => replacement.flag_c = true, + 'i' => replacement.case_sensitive = Some(false), + 'I' => replacement.case_sensitive = Some(true), _ => {} } } @@ -913,7 +936,6 @@ mod test { }); } - // cargo test -p vim --features neovim test_replace_with_range_at_start #[gpui::test] async fn test_replace_with_range_at_start(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; @@ -979,6 +1001,121 @@ mod test { }); } + #[gpui::test] + async fn test_replace_n(cx: &mut gpui::TestAppContext) { + let mut cx = NeovimBackedTestContext::new(cx).await; + cx.set_shared_state(indoc! { + "ˇaa + bb + aa" + }) + .await; + + cx.simulate_shared_keystrokes(": s / b b / d d / n").await; + cx.simulate_shared_keystrokes("enter").await; + + cx.shared_state().await.assert_eq(indoc! { + "ˇaa + bb + aa" + }); + + let search_bar = cx.update_workspace(|workspace, _, cx| { + workspace.active_pane().update(cx, |pane, cx| { + pane.toolbar() + .read(cx) + .item_of_type::() + .unwrap() + }) + }); + cx.update_entity(search_bar, |search_bar, _, cx| { + assert!(!search_bar.is_dismissed()); + assert_eq!(search_bar.query(cx), "bb".to_string()); + assert_eq!(search_bar.replacement(cx), "dd".to_string()); + }) + } + + #[gpui::test] + async fn test_replace_g(cx: &mut gpui::TestAppContext) { + let mut cx = NeovimBackedTestContext::new(cx).await; + cx.set_shared_state(indoc! { + "ˇaa aa aa aa + aa + aa" + }) + .await; + + cx.simulate_shared_keystrokes(": s / a a / b b").await; + cx.simulate_shared_keystrokes("enter").await; + cx.shared_state().await.assert_eq(indoc! { + "ˇbb aa aa aa + aa + aa" + }); + cx.simulate_shared_keystrokes(": s / a a / b b / g").await; + cx.simulate_shared_keystrokes("enter").await; + cx.shared_state().await.assert_eq(indoc! { + "ˇbb bb bb bb + aa + aa" + }); + } + + #[gpui::test] + async fn test_replace_c(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + cx.set_state( + indoc! { + "ˇaa + aa + aa" + }, + Mode::Normal, + ); + + cx.simulate_keystrokes("v j : s / a a / d d / c"); + cx.simulate_keystrokes("enter"); + + cx.assert_state( + indoc! { + "ˇaa + aa + aa" + }, + Mode::Normal, + ); + + cx.simulate_keystrokes("enter"); + + cx.assert_state( + indoc! { + "dd + ˇaa + aa" + }, + Mode::Normal, + ); + + cx.simulate_keystrokes("enter"); + cx.assert_state( + indoc! { + "dd + ddˇ + aa" + }, + Mode::Normal, + ); + cx.simulate_keystrokes("enter"); + cx.assert_state( + indoc! { + "dd + ddˇ + aa" + }, + Mode::Normal, + ); + } + #[gpui::test] async fn test_replace_with_range(cx: &mut gpui::TestAppContext) { let mut cx = NeovimBackedTestContext::new(cx).await; diff --git a/crates/vim/test_data/test_replace_g.json b/crates/vim/test_data/test_replace_g.json new file mode 100644 index 0000000000..583d1f89bc --- /dev/null +++ b/crates/vim/test_data/test_replace_g.json @@ -0,0 +1,23 @@ +{"Put":{"state":"ˇaa aa aa aa\naa\naa"}} +{"Key":":"} +{"Key":"s"} +{"Key":"/"} +{"Key":"a"} +{"Key":"a"} +{"Key":"/"} +{"Key":"b"} +{"Key":"b"} +{"Key":"enter"} +{"Get":{"state":"ˇbb aa aa aa\naa\naa","mode":"Normal"}} +{"Key":":"} +{"Key":"s"} +{"Key":"/"} +{"Key":"a"} +{"Key":"a"} +{"Key":"/"} +{"Key":"b"} +{"Key":"b"} +{"Key":"/"} +{"Key":"g"} +{"Key":"enter"} +{"Get":{"state":"ˇbb bb bb bb\naa\naa","mode":"Normal"}} diff --git a/crates/vim/test_data/test_replace_n.json b/crates/vim/test_data/test_replace_n.json new file mode 100644 index 0000000000..a03c69e9b2 --- /dev/null +++ b/crates/vim/test_data/test_replace_n.json @@ -0,0 +1,13 @@ +{"Put":{"state":"ˇaa\nbb\naa"}} +{"Key":":"} +{"Key":"s"} +{"Key":"/"} +{"Key":"b"} +{"Key":"b"} +{"Key":"/"} +{"Key":"d"} +{"Key":"d"} +{"Key":"/"} +{"Key":"n"} +{"Key":"enter"} +{"Get":{"state":"ˇaa\nbb\naa","mode":"Normal"}} From 1569b662ff8ede1d126b27d44966ddbf0e207cbf Mon Sep 17 00:00:00 2001 From: Daniel Sauble Date: Wed, 9 Jul 2025 00:08:23 -0700 Subject: [PATCH 24/34] editor: Change `drag_and_drop_selection` cursor on delay elapsed + Add `drag_and_drop_selection` delay setting (#33928) When [`drag_and_drop_selection` is true](https://zed.dev/docs/configuring-zed#drag-and-drop-selection), users can make a selection in the buffer and then drag and drop it to a new location. However, the editor forces users to wait 300ms after mouse down before dragging. If users try to drag before this delay has elapsed, they will create a new text selection instead, which can create the impression that drag and drop does not work. I made two changes to improve the UX of this feature: * If users do not want a delay before drag and drop is enabled, they can set the `drag_and_drop_selection.delay_ms` setting to 0. * If the user has done a mouse down on a text selection, the cursor changes to a copy affordance as soon as the configured delay has elapsed, rather than waiting for them to start dragging. This way they don't need to guess at when the delay has elapsed. The default settings for this feature are now: ``` "drag_and_drop_selection": { "enabled": true, "delay_ms": 300 } ``` Closes #33915 Before: https://github.com/user-attachments/assets/7b2f986f-9c67-4b2b-a10e-757c3e9c934b After: https://github.com/user-attachments/assets/726d0dbf-e58b-41ad-93d2-1a758640b422 Release Notes: - Migrate `drag_and_drop_selection` setting to `drag_and_drop_selection.enabled`. - Add `drag_and_drop_selection.delay_ms` setting to configure the delay that must elapse before drag and drop is allowed. - Show a ready to drag cursor affordance as soon as the delay has elapsed --------- Co-authored-by: Smit Barmase --- assets/settings/default.json | 7 +++- crates/editor/src/editor.rs | 3 -- crates/editor/src/editor_settings.rs | 28 +++++++++++--- crates/editor/src/element.rs | 25 +++++++++++-- crates/migrator/src/migrations.rs | 6 +++ .../src/migrations/m_2025_07_08/settings.rs | 37 +++++++++++++++++++ crates/migrator/src/migrator.rs | 8 ++++ docs/src/configuring-zed.md | 13 ++++--- 8 files changed, 110 insertions(+), 17 deletions(-) create mode 100644 crates/migrator/src/migrations/m_2025_07_08/settings.rs diff --git a/assets/settings/default.json b/assets/settings/default.json index dc1040e1d0..8c105b2c1e 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -228,7 +228,12 @@ // Whether to show code action button at start of buffer line. "inline_code_actions": true, // Whether to allow drag and drop text selection in buffer. - "drag_and_drop_selection": true, + "drag_and_drop_selection": { + // When true, enables drag and drop text selection in buffer. + "enabled": true, + // The delay in milliseconds that must elapse before drag and drop is allowed. Otherwise, a new text selection is created. + "delay": 300 + }, // What to do when go to definition yields no results. // // 1. Do nothing: `none` diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 03e2124742..c5fe0db74c 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -1170,7 +1170,6 @@ pub struct Editor { pub change_list: ChangeList, inline_value_cache: InlineValueCache, selection_drag_state: SelectionDragState, - drag_and_drop_selection_enabled: bool, next_color_inlay_id: usize, colors: Option, folding_newlines: Task<()>, @@ -2202,7 +2201,6 @@ impl Editor { change_list: ChangeList::new(), mode, selection_drag_state: SelectionDragState::None, - drag_and_drop_selection_enabled: EditorSettings::get_global(cx).drag_and_drop_selection, folding_newlines: Task::ready(()), }; if let Some(breakpoints) = editor.breakpoint_store.as_ref() { @@ -19899,7 +19897,6 @@ impl Editor { self.show_breadcrumbs = editor_settings.toolbar.breadcrumbs; self.cursor_shape = editor_settings.cursor_shape.unwrap_or_default(); self.hide_mouse_mode = editor_settings.hide_mouse.unwrap_or_default(); - self.drag_and_drop_selection_enabled = editor_settings.drag_and_drop_selection; } if old_cursor_shape != self.cursor_shape { diff --git a/crates/editor/src/editor_settings.rs b/crates/editor/src/editor_settings.rs index d7b8bac359..5d8379ddfb 100644 --- a/crates/editor/src/editor_settings.rs +++ b/crates/editor/src/editor_settings.rs @@ -52,7 +52,7 @@ pub struct EditorSettings { #[serde(default)] pub diagnostics_max_severity: Option, pub inline_code_actions: bool, - pub drag_and_drop_selection: bool, + pub drag_and_drop_selection: DragAndDropSelection, pub lsp_document_colors: DocumentColorsRenderMode, } @@ -275,6 +275,26 @@ pub struct ScrollbarAxes { pub vertical: bool, } +/// Whether to allow drag and drop text selection in buffer. +#[derive(Copy, Clone, Default, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] +pub struct DragAndDropSelection { + /// When true, enables drag and drop text selection in buffer. + /// + /// Default: true + #[serde(default = "default_true")] + pub enabled: bool, + + /// The delay in milliseconds that must elapse before drag and drop is allowed. Otherwise, a new text selection is created. + /// + /// Default: 300 + #[serde(default = "default_drag_and_drop_selection_delay_ms")] + pub delay: u64, +} + +fn default_drag_and_drop_selection_delay_ms() -> u64 { + 300 +} + /// Which diagnostic indicators to show in the scrollbar. /// /// Default: all @@ -536,10 +556,8 @@ pub struct EditorSettingsContent { /// Default: true pub inline_code_actions: Option, - /// Whether to allow drag and drop text selection in buffer. - /// - /// Default: true - pub drag_and_drop_selection: Option, + /// Drag and drop related settings + pub drag_and_drop_selection: Option, /// How to render LSP `textDocument/documentColor` colors in the editor. /// diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index a446338335..8a5bfb3bab 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -87,7 +87,6 @@ use util::{RangeExt, ResultExt, debug_panic}; use workspace::{CollaboratorId, Workspace, item::Item, notifications::NotifyTaskExt}; const INLINE_BLAME_PADDING_EM_WIDTHS: f32 = 7.; -const SELECTION_DRAG_DELAY: Duration = Duration::from_millis(300); /// Determines what kinds of highlights should be applied to a lines background. #[derive(Clone, Copy, Default)] @@ -644,7 +643,11 @@ impl EditorElement { return; } - if editor.drag_and_drop_selection_enabled && click_count == 1 { + if EditorSettings::get_global(cx) + .drag_and_drop_selection + .enabled + && click_count == 1 + { let newest_anchor = editor.selections.newest_anchor(); let snapshot = editor.snapshot(window, cx); let selection = newest_anchor.map(|anchor| anchor.to_display_point(&snapshot)); @@ -1022,7 +1025,10 @@ impl EditorElement { ref click_position, ref mouse_down_time, } => { - if mouse_down_time.elapsed() >= SELECTION_DRAG_DELAY { + let drag_and_drop_delay = Duration::from_millis( + EditorSettings::get_global(cx).drag_and_drop_selection.delay, + ); + if mouse_down_time.elapsed() >= drag_and_drop_delay { let drop_cursor = Selection { id: post_inc(&mut editor.selections.next_selection_id), start: drop_anchor, @@ -5710,6 +5716,19 @@ impl EditorElement { let editor = self.editor.read(cx); if editor.mouse_cursor_hidden { window.set_window_cursor_style(CursorStyle::None); + } else if let SelectionDragState::ReadyToDrag { + mouse_down_time, .. + } = &editor.selection_drag_state + { + let drag_and_drop_delay = Duration::from_millis( + EditorSettings::get_global(cx).drag_and_drop_selection.delay, + ); + if mouse_down_time.elapsed() >= drag_and_drop_delay { + window.set_cursor_style( + CursorStyle::DragCopy, + &layout.position_map.text_hitbox, + ); + } } else if matches!( editor.selection_drag_state, SelectionDragState::Dragging { .. } diff --git a/crates/migrator/src/migrations.rs b/crates/migrator/src/migrations.rs index 4e3839358b..9db597e964 100644 --- a/crates/migrator/src/migrations.rs +++ b/crates/migrator/src/migrations.rs @@ -93,3 +93,9 @@ pub(crate) mod m_2025_06_27 { pub(crate) use settings::SETTINGS_PATTERNS; } + +pub(crate) mod m_2025_07_08 { + mod settings; + + pub(crate) use settings::SETTINGS_PATTERNS; +} diff --git a/crates/migrator/src/migrations/m_2025_07_08/settings.rs b/crates/migrator/src/migrations/m_2025_07_08/settings.rs new file mode 100644 index 0000000000..c9656491ce --- /dev/null +++ b/crates/migrator/src/migrations/m_2025_07_08/settings.rs @@ -0,0 +1,37 @@ +use std::ops::Range; +use tree_sitter::{Query, QueryMatch}; + +use crate::MigrationPatterns; +use crate::patterns::SETTINGS_ROOT_KEY_VALUE_PATTERN; + +pub const SETTINGS_PATTERNS: MigrationPatterns = &[( + SETTINGS_ROOT_KEY_VALUE_PATTERN, + migrate_drag_and_drop_selection, +)]; + +fn migrate_drag_and_drop_selection( + contents: &str, + mat: &QueryMatch, + query: &Query, +) -> Option<(Range, String)> { + let name_ix = query.capture_index_for_name("name")?; + let name_range = mat.nodes_for_capture_index(name_ix).next()?.byte_range(); + let name = contents.get(name_range)?; + + if name != "drag_and_drop_selection" { + return None; + } + + let value_ix = query.capture_index_for_name("value")?; + let value_node = mat.nodes_for_capture_index(value_ix).next()?; + let value_range = value_node.byte_range(); + let value = contents.get(value_range.clone())?; + + match value { + "true" | "false" => { + let replacement = format!("{{\n \"enabled\": {}\n }}", value); + Some((value_range, replacement)) + } + _ => None, + } +} diff --git a/crates/migrator/src/migrator.rs b/crates/migrator/src/migrator.rs index be32b2734e..b425f7f1d5 100644 --- a/crates/migrator/src/migrator.rs +++ b/crates/migrator/src/migrator.rs @@ -160,6 +160,10 @@ pub fn migrate_settings(text: &str) -> Result> { migrations::m_2025_06_27::SETTINGS_PATTERNS, &SETTINGS_QUERY_2025_06_27, ), + ( + migrations::m_2025_07_08::SETTINGS_PATTERNS, + &SETTINGS_QUERY_2025_07_08, + ), ]; run_migrations(text, migrations) } @@ -270,6 +274,10 @@ define_query!( SETTINGS_QUERY_2025_06_27, migrations::m_2025_06_27::SETTINGS_PATTERNS ); +define_query!( + SETTINGS_QUERY_2025_07_08, + migrations::m_2025_07_08::SETTINGS_PATTERNS +); // custom query static EDIT_PREDICTION_SETTINGS_MIGRATION_QUERY: LazyLock = LazyLock::new(|| { diff --git a/docs/src/configuring-zed.md b/docs/src/configuring-zed.md index 8bba431554..eec9da60dd 100644 --- a/docs/src/configuring-zed.md +++ b/docs/src/configuring-zed.md @@ -1218,13 +1218,16 @@ or ### Drag And Drop Selection -- Description: Whether to allow drag and drop text selection in buffer. +- Description: Whether to allow drag and drop text selection in buffer. `delay` is the milliseconds that must elapse before drag and drop is allowed. Otherwise, a new text selection is created. - Setting: `drag_and_drop_selection` -- Default: `true` +- Default: -**Options** - -`boolean` values +```json +"drag_and_drop_selection": { + "enabled": true, + "delay": 300 +} +``` ## Editor Toolbar From 45d200f2f8b86605c5137bf49441c74b5288cc51 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Wed, 9 Jul 2025 14:44:29 +0300 Subject: [PATCH 25/34] Wrap back around in context menu properly (#34112) When navigating back in the context menu, it was not possible to get past first element, if it was not selectable. The other way around works, hence the fix. Release Notes: - N/A --- crates/language_tools/src/lsp_tool.rs | 2 - crates/ui/Cargo.toml | 3 + crates/ui/src/components/context_menu.rs | 89 +++++++++++++++++++++--- 3 files changed, 81 insertions(+), 13 deletions(-) diff --git a/crates/language_tools/src/lsp_tool.rs b/crates/language_tools/src/lsp_tool.rs index 81cc38d33f..9e542f582a 100644 --- a/crates/language_tools/src/lsp_tool.rs +++ b/crates/language_tools/src/lsp_tool.rs @@ -735,8 +735,6 @@ impl LspTool { state.update(cx, |state, cx| state.fill_menu(menu, cx)) }); lsp_tool.lsp_menu = Some(menu.clone()); - // TODO kb will this work? - // what about the selections? lsp_tool.popover_menu_handle.refresh_menu( window, cx, diff --git a/crates/ui/Cargo.toml b/crates/ui/Cargo.toml index 625bdc62f5..c047291772 100644 --- a/crates/ui/Cargo.toml +++ b/crates/ui/Cargo.toml @@ -34,6 +34,9 @@ workspace-hack.workspace = true [target.'cfg(windows)'.dependencies] windows.workspace = true +[dev-dependencies] +gpui = { workspace = true, features = ["test-support"] } + [features] default = [] stories = ["dep:story"] diff --git a/crates/ui/src/components/context_menu.rs b/crates/ui/src/components/context_menu.rs index 075cf7a7d7..873b7b9e63 100644 --- a/crates/ui/src/components/context_menu.rs +++ b/crates/ui/src/components/context_menu.rs @@ -690,20 +690,15 @@ impl ContextMenu { cx: &mut Context, ) { if let Some(ix) = self.selected_index { - if ix == 0 { - self.handle_select_last(&SelectLast, window, cx); - } else { - for (ix, item) in self.items.iter().enumerate().take(ix).rev() { - if item.is_selectable() { - self.select_index(ix, window, cx); - cx.notify(); - break; - } + for (ix, item) in self.items.iter().enumerate().take(ix).rev() { + if item.is_selectable() { + self.select_index(ix, window, cx); + cx.notify(); + return; } } - } else { - self.handle_select_last(&SelectLast, window, cx); } + self.handle_select_last(&SelectLast, window, cx); } fn select_index( @@ -1171,3 +1166,75 @@ impl Render for ContextMenu { }))) } } + +#[cfg(test)] +mod tests { + use gpui::TestAppContext; + + use super::*; + + #[gpui::test] + fn can_navigate_back_over_headers(cx: &mut TestAppContext) { + let cx = cx.add_empty_window(); + let context_menu = cx.update(|window, cx| { + ContextMenu::build(window, cx, |menu, _, _| { + menu.header("First header") + .separator() + .entry("First entry", None, |_, _| {}) + .separator() + .separator() + .entry("Last entry", None, |_, _| {}) + }) + }); + + context_menu.update_in(cx, |context_menu, window, cx| { + assert_eq!( + None, context_menu.selected_index, + "No selection is in the menu initially" + ); + + context_menu.select_first(&SelectFirst, window, cx); + assert_eq!( + Some(2), + context_menu.selected_index, + "Should select first selectable entry, skipping the header and the separator" + ); + + context_menu.select_next(&SelectNext, window, cx); + assert_eq!( + Some(5), + context_menu.selected_index, + "Should select next selectable entry, skipping 2 separators along the way" + ); + + context_menu.select_next(&SelectNext, window, cx); + assert_eq!( + Some(2), + context_menu.selected_index, + "Should wrap around to first selectable entry" + ); + }); + + context_menu.update_in(cx, |context_menu, window, cx| { + assert_eq!( + Some(2), + context_menu.selected_index, + "Should start from the first selectable entry" + ); + + context_menu.select_previous(&SelectPrevious, window, cx); + assert_eq!( + Some(5), + context_menu.selected_index, + "Should wrap around to previous selectable entry (last)" + ); + + context_menu.select_previous(&SelectPrevious, window, cx); + assert_eq!( + Some(2), + context_menu.selected_index, + "Should go back to previous selectable entry (first)" + ); + }); + } +} From 7114a5ca99aa14016a278100f136a32dd7911521 Mon Sep 17 00:00:00 2001 From: Bennet Bo Fenner Date: Wed, 9 Jul 2025 16:39:02 +0200 Subject: [PATCH 26/34] Fix panic in context server configuration (#34118) Release Notes: - Fixed a panic that could occur when configuring MCP servers --- .../src/agent_configuration/configure_context_server_modal.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/agent_ui/src/agent_configuration/configure_context_server_modal.rs b/crates/agent_ui/src/agent_configuration/configure_context_server_modal.rs index ba0021c33c..9e5f6e09c8 100644 --- a/crates/agent_ui/src/agent_configuration/configure_context_server_modal.rs +++ b/crates/agent_ui/src/agent_configuration/configure_context_server_modal.rs @@ -740,7 +740,9 @@ fn wait_for_context_server( }); cx.spawn(async move |_cx| { - let result = rx.await.unwrap(); + let result = rx + .await + .map_err(|_| Arc::from("Context server store was dropped"))?; drop(subscription); result }) From 81cc1e8f753222be31ba3df8a912d8f8d71206b6 Mon Sep 17 00:00:00 2001 From: Smit Barmase Date: Wed, 9 Jul 2025 20:26:21 +0530 Subject: [PATCH 27/34] project_panel: Improve last sticky item drifting logic (#34119) - Now instead of drifting directory along with last item of that directory, it waits till last item is completely consumed. Release Notes: - N/A --- crates/ui/src/components/sticky_items.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/crates/ui/src/components/sticky_items.rs b/crates/ui/src/components/sticky_items.rs index da6c14ff09..218f7aae35 100644 --- a/crates/ui/src/components/sticky_items.rs +++ b/crates/ui/src/components/sticky_items.rs @@ -159,10 +159,9 @@ where let mut iter = entries.iter().enumerate().peekable(); while let Some((ix, current_entry)) = iter.next() { - let current_depth = current_entry.depth(); - let index_in_range = ix; + let depth = current_entry.depth(); - if current_depth < index_in_range { + if depth < ix { sticky_anchor = Some(StickyAnchor { entry: current_entry.clone(), index: visible_range.start + ix, @@ -172,9 +171,15 @@ where if let Some(&(_next_ix, next_entry)) = iter.peek() { let next_depth = next_entry.depth(); + let next_item_outdented = next_depth + 1 == depth; - if next_depth < current_depth && next_depth < index_in_range { - last_item_is_drifting = true; + let depth_same_as_index = depth == ix; + let depth_greater_than_index = depth == ix + 1; + + if next_item_outdented && (depth_same_as_index || depth_greater_than_index) { + if depth_greater_than_index { + last_item_is_drifting = true; + } sticky_anchor = Some(StickyAnchor { entry: current_entry.clone(), index: visible_range.start + ix, @@ -216,7 +221,7 @@ where let drifting_y_offset = if last_item_is_drifting { let scroll_top = -scroll_offset.y; - let anchor_top = item_height * sticky_anchor.index; + let anchor_top = item_height * (sticky_anchor.index + 1); let sticky_area_height = item_height * items_count; (anchor_top - scroll_top - sticky_area_height).min(Pixels::ZERO) } else { From a9b82e1e5740f2ee3dfe9265ddb0d430f8c07e50 Mon Sep 17 00:00:00 2001 From: Peter Tripp Date: Wed, 9 Jul 2025 11:04:13 -0400 Subject: [PATCH 28/34] Bump Zed to v0.196 (#34127) Release Notes: - N/A --- Cargo.lock | 2 +- crates/zed/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 38bb7819ca..5c22b90526 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19972,7 +19972,7 @@ dependencies = [ [[package]] name = "zed" -version = "0.195.0" +version = "0.196.0" dependencies = [ "activity_indicator", "agent", diff --git a/crates/zed/Cargo.toml b/crates/zed/Cargo.toml index 884443e770..48591d65c1 100644 --- a/crates/zed/Cargo.toml +++ b/crates/zed/Cargo.toml @@ -2,7 +2,7 @@ description = "The fast, collaborative code editor." edition.workspace = true name = "zed" -version = "0.195.0" +version = "0.196.0" publish.workspace = true license = "GPL-3.0-or-later" authors = ["Zed Team "] From b9b42bee990dfb94a9c29ab2b4bafae19444395a Mon Sep 17 00:00:00 2001 From: Oleksiy Syvokon Date: Wed, 9 Jul 2025 18:31:58 +0300 Subject: [PATCH 29/34] evals: Fix bug that prevented multiple turns from displaying (#34128) Release Notes: - N/A --- crates/eval/src/explorer.html | 204 +++++++++------------------------- 1 file changed, 54 insertions(+), 150 deletions(-) diff --git a/crates/eval/src/explorer.html b/crates/eval/src/explorer.html index fec4597163..04c41090d3 100644 --- a/crates/eval/src/explorer.html +++ b/crates/eval/src/explorer.html @@ -324,20 +324,8 @@