From 9d092562af1570269c62be9a99b6e7e9a7470c87 Mon Sep 17 00:00:00 2001 From: Vincent Baaij Date: Fri, 1 Sep 2023 10:56:31 +0200 Subject: [PATCH] Update workflows to build when md files change Update docs --- .github/workflows/cicd_publish.yml | 3 - .github/workflows/deploy_preview.yml | 3 - .../Microsoft.Fast.Components.FluentUI.xml | 304 ++++++++++++++++-- .../Demo/Shared/Pages/Icon/IconPage.razor | 15 + .../Demo/Shared/Pages/IconsAndEmoji.razor | 18 ++ .../Demo/Shared/Shared/DemoNavMenuTree.razor | 3 +- .../Demo/Shared/wwwroot/docs/IconsAndEmoji.md | 72 +++++ .../Demo/Shared/wwwroot/docs/UpgradeGuide.md | 46 ++- .../images/Icons-FindReplace-RegEx.png | Bin 0 -> 17963 bytes 9 files changed, 417 insertions(+), 47 deletions(-) create mode 100644 examples/Demo/Shared/Pages/IconsAndEmoji.razor create mode 100644 examples/Demo/Shared/wwwroot/docs/IconsAndEmoji.md create mode 100644 examples/Demo/Shared/wwwroot/images/Icons-FindReplace-RegEx.png diff --git a/.github/workflows/cicd_publish.yml b/.github/workflows/cicd_publish.yml index 833f78652e..6735465fed 100644 --- a/.github/workflows/cicd_publish.yml +++ b/.github/workflows/cicd_publish.yml @@ -4,7 +4,6 @@ on: branches: - main paths-ignore: - - '**/*.md' - '**/*.gitignore' - '**/*.gitattributes' @@ -12,7 +11,6 @@ on: types: [opened, synchronize, reopened, closed] branches: [ main ] paths-ignore: - - '**/*.md' - '**/*.gitignore' - '**/*.gitattributes' @@ -20,7 +18,6 @@ on: branches: - main paths-ignore: - - '**/*.md' - '**/*.gitignore' - '**/*.gitattributes' diff --git a/.github/workflows/deploy_preview.yml b/.github/workflows/deploy_preview.yml index b5d0e62552..edf256917d 100644 --- a/.github/workflows/deploy_preview.yml +++ b/.github/workflows/deploy_preview.yml @@ -6,7 +6,6 @@ on: - dev - archives/v2 paths-ignore: - - '**/*.md' - '**/*.gitignore' - '**/*.gitattributes' @@ -16,7 +15,6 @@ on: - dev - archives/v2 paths-ignore: - - '**/*.md' - '**/*.gitignore' - '**/*.gitattributes' @@ -25,7 +23,6 @@ on: - dev - archives/v2 paths-ignore: - - '**/*.md' - '**/*.gitignore' - '**/*.gitattributes' diff --git a/examples/Demo/Shared/Microsoft.Fast.Components.FluentUI.xml b/examples/Demo/Shared/Microsoft.Fast.Components.FluentUI.xml index ebfbfe5811..263ec2bb61 100644 --- a/examples/Demo/Shared/Microsoft.Fast.Components.FluentUI.xml +++ b/examples/Demo/Shared/Microsoft.Fast.Components.FluentUI.xml @@ -209,6 +209,16 @@ Defaults to + + + displayed at the start of anchor content. + + + + + displayed at the end of anchor content. + + Gets or sets the content to be rendered inside the component. @@ -598,14 +608,30 @@ Defaults to + + + Background color of this button (overrides the property). + Set the value "rgba(0, 0, 0, 0)" to display a transparent button. + + + + + Color of the font (overrides the property). + + + + + Display a progress ring and disable the button. + + - displayed to the left of button content. + displayed at the start of button content. - displayed to the right of button content. + displayed at the end of button content. @@ -623,6 +649,11 @@ Command executed when the user clicks on the button. + + + Constructs an instance of . + + @@ -1151,6 +1182,7 @@ Gets or sets the index of this row + When FluentDataGrid is virtualized, this value is not used @@ -1750,7 +1782,7 @@ Closes the dialog - + Constructs an instance of . @@ -1793,11 +1825,21 @@ Text to display for the primary action. + + + When true, primary action's button is enabled. + + Text to display for the secondary action. + + + When true, secondary action's button is enabled. + + Width of the dialog. Must be a valid CSS width value like "600px" or "3em" @@ -1940,7 +1982,7 @@ - Shows the standard with the given parameters."/> + Shows the standard with the given parameters. The componente that receives the callback Name of the callback function @@ -1948,7 +1990,7 @@ - Shows a custom splash screen dialog with the given parameters."/> + Shows a custom splash screen dialog with the given parameters. The componente that receives the callback Name of the callback function @@ -1956,7 +1998,7 @@ - Shows a splash screen of the given type with the given parameters."/> + Shows a splash screen of the given type with the given parameters. The type of the component to show The componente that receives the callback @@ -2012,27 +2054,159 @@ - Shows a panel with the dialog component type as the body, - passing the specified + Shows a panel with the dialog component type as the body Parameters to pass to component being displayed. - Shows a panel with the dialog component type as the body, - passing the specified + Shows a panel with the dialog component type as the body Type of component to display. Parameters to pass to component being displayed. - Shows a dialog with the component type as the body, - passing the specified + Shows a dialog with the component type as the body Parameters to pass to component being displayed. + + Shows a dialog with the component type as the body + + Type of component to display. + Content to pass to component being displayed. + Parameters to configure the dialog component. + + + + Updates a dialog + + Id of the dialog to update. + Parameters to configure the dialog component. + + + + Shows the standard with the given parameters. + + The componente that receives the callback + Name of the callback function + that holds the content to display + + + + Shows the standard with the given parameters. + + that holds the content to display + + + + Shows a custom splash screen dialog with the given parameters."/> + + The componente that receives the callback + Name of the callback function + that holds the content to display + + + + Shows a custom splash screen dialog with the given parameters. + + that holds the content to display + + + + Shows a splash screen of the given type with the given parameters. + + The type of the component to show + The componente that receives the callback + Name of the callback function + that holds the content to display + + + + Shows a splash screen of the given type with the given parameters. + + The type of the component to show + that holds the content to display + + + + Shows a dialog with the component type as the body + + Parameters to pass to component being displayed. + + + + Shows a success message box. Does not have a callback function. + + The message to display. + The title to display on the dialog. + + + + Shows a warning message box. Does not have a callback function. + + The message to display. + The title to display on the dialog. + + + + Shows an error message box. Does not have a callback function. + + The message to display. + The title to display on the dialog. + + + + Shows an information message box. Does not have a callback function. + + The message to display. + The title to display on the dialog. + + + + Shows a confirmation message box. Has a callback function which returns boolean + (true=PrimaryAction clicked, false=SecondaryAction clicked). + + The component that receives the callback function. + The callback function. + The message to display. + The text to display on the primary button. + The text to display on the secondary button. + The title to display on the dialog. + + + + Shows a confirmation message box. Has no callback function + (true=PrimaryAction clicked, false=SecondaryAction clicked). + + The message to display. + The text to display on the primary button. + The text to display on the secondary button. + The title to display on the dialog. + + + + Shows a custom message box. Has a callback function which returns boolean + (true=PrimaryAction clicked, false=SecondaryAction clicked). + + Parameters to pass to component being displayed. + + + + Shows a panel with the dialog component type as the body + + Parameters to pass to component being displayed. + + + + Shows a panel with the dialog component type as the body + + Type of component to display. + Parameters to pass to component being displayed. + + Shows a dialog with the component type as the body, passing the specified @@ -2041,6 +2215,13 @@ Content to pass to component being displayed. Parameters to configure the dialog component. + + + Updates a dialog + + Id of the dialog to update. + Parameters to configure the dialog component. + Convenience method to create a for a dialog result. @@ -2433,6 +2614,11 @@ List of delimiters chars. Example: " ,;". + + + If true, highlights the text until the next regex boundary + + Description: Scroll speed in pixels per second @@ -2885,21 +3071,14 @@ Gets or sets the visual appearance. See - - - Width style - - - - - Height style - - The maximum number of options that should be visible in the listbox scroll area. + + + Gets or sets if the element is disabled @@ -2976,6 +3155,16 @@ + + + Width of the component. + + + + + Height of the component or of the popup panel. + + Text used on aria-label attribute. @@ -3683,7 +3872,9 @@ - Pattern explanation:
+ Pattern:
+ ^(?:#(?:[a-fA-F0-9]{6}|[a-fA-F0-9]{3}))
+ Explanation:
○ Match if at the beginning of the string.
○ Match '#'.
@@ -3766,6 +3957,12 @@ Gets or sets the id of the component the popover is positioned relative to
+ + + The default horizontal position of the region relative to the anchor element + Default is unset. See + + Gets or sets popover opened state @@ -4030,6 +4227,21 @@ Gets or sets if the skeleton is shimmered + + + Gets or sets the width of the skeleton + + + + + Gets or sets the height of the skeleton + + + + + Gets or sets whether the skeleton is visible + + Gets or sets the content to be rendered inside the component. @@ -4246,6 +4458,11 @@ True to let the user edit the property. + + + Render the tab content only when the tab is selected. + + Customized content of this tab panel. @@ -4429,6 +4646,12 @@ Gets or sets the content to be rendered inside the component. + + + + + + Gets or sets the text filed type. See @@ -4474,6 +4697,12 @@ Gets or sets the content to be rendered inside the component. + + + Specifies whether a form or an input field should have autocomplete on or off. + An Id value must be set to use this property. + + Closes the toast @@ -8507,27 +8736,32 @@ - The anchored region position is unset. + No positions set. - The anchored region is positioned at the start of the anchor. + Position at the start of the anchor. - The anchored region is positioned at the end of the anchor. + Position at the end of the anchor. - The anchored region is positioned in the left of the anchor. + Position on the left of the anchor. - The anchored region is positioned in the right of the anchor. + Position on the right of the anchor. + + + + + Position at the center of the anchor. @@ -9248,17 +9482,22 @@ - No positioning set + No position set. - Position at the top + Position at the top. - Position at the bottom + Position at the bottom. + + + + + Position at the center. @@ -9671,7 +9910,7 @@ Inspired from https://github.com/MudBlazor - + Splits the text into fragments, according to the text to be highlighted @@ -9680,6 +9919,7 @@ The texts to be highlighted Regex expression that was used to split fragments. Whether it's case sensitive or not + If true, splits until the next regex boundary diff --git a/examples/Demo/Shared/Pages/Icon/IconPage.razor b/examples/Demo/Shared/Pages/Icon/IconPage.razor index d6f925e195..b93505806a 100644 --- a/examples/Demo/Shared/Pages/Icon/IconPage.razor +++ b/examples/Demo/Shared/Pages/Icon/IconPage.razor @@ -13,6 +13,21 @@ contains all these icons, which you can access directly in your projects. To use them, simply reference this package in your project.

+

+ During the DotNet Publication process, the unused icons are automatically removed from the final library. + You can configure this behavior by setting the PublishTrimmed property in your project file. + More details on this page. +

+

+ You can create your own icons by adding a class like this one: + + + public static class MyIcons + { + public class SettingsEmail : Icon { public SettingsEmail() : base("SettingsEmail", IconVariant.Regular, IconSize.Size20, "<svg width=\"20\" height=\"19\" viewBox=\"0 0 20 19\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15.6251 2.5H4.37508L4.2214 2.50428C2.79712 2.58396 1.66675 3.76414 1.66675 5.20833V13.125L1.67103 13.2787C1.75071 14.7029 2.93089 15.8333 4.37508 15.8333H9.76425C9.91725 15.4818 10.1354 15.1606 10.4087 14.8873L10.7126 14.5833H4.37508L4.25547 14.5785C3.50601 14.5177 2.91675 13.8902 2.91675 13.125V6.97833L9.709 10.5531L9.78908 10.5883C9.95267 10.647 10.135 10.6353 10.2912 10.5531L17.0834 6.9775V9.17258C17.5072 9.14483 17.9362 9.21517 18.3334 9.38358V5.20833L18.3292 5.05465C18.2494 3.63038 17.0693 2.5 15.6251 2.5ZM4.37508 3.75H15.6251L15.7447 3.75483C16.4942 3.81568 17.0834 4.44319 17.0834 5.20833V5.565L10.0001 9.29375L2.91675 5.56583V5.20833L2.92158 5.08873C2.98242 4.33926 3.60994 3.75 4.37508 3.75ZM15.9167 10.5579L10.9979 15.4766C10.7112 15.7633 10.5077 16.1227 10.4093 16.5162L10.0279 18.0418C9.86208 18.7052 10.4631 19.3062 11.1265 19.1403L12.6521 18.7588C13.0455 18.6605 13.4048 18.4571 13.6917 18.1703L18.6103 13.2516C19.3542 12.5078 19.3542 11.3018 18.6103 10.5579C17.8665 9.814 16.6605 9.814 15.9167 10.5579Z\" fill=\"#212121\" /></svg>") { } } + } + +

You can use any of these icons by levaraging the <FluentIcon> component. See below for the parameters and examples. There is also a search capability available on this page wich allows you to browse to all the different icons. diff --git a/examples/Demo/Shared/Pages/IconsAndEmoji.razor b/examples/Demo/Shared/Pages/IconsAndEmoji.razor new file mode 100644 index 0000000000..2778bc522f --- /dev/null +++ b/examples/Demo/Shared/Pages/IconsAndEmoji.razor @@ -0,0 +1,18 @@ +@page "/IconsAndEmoji" + +Icons and Emoji + +

Using Icons and Emoji

+ + + +@code { + + [CascadingParameter] + public EventCallback OnRefreshTableOfContents { get; set; } + + private async Task RefreshTableOfContents() + { + await OnRefreshTableOfContents.InvokeAsync(); + } +} \ No newline at end of file diff --git a/examples/Demo/Shared/Shared/DemoNavMenuTree.razor b/examples/Demo/Shared/Shared/DemoNavMenuTree.razor index c43f901bf4..160ad78382 100644 --- a/examples/Demo/Shared/Shared/DemoNavMenuTree.razor +++ b/examples/Demo/Shared/Shared/DemoNavMenuTree.razor @@ -12,9 +12,10 @@ - + + diff --git a/examples/Demo/Shared/wwwroot/docs/IconsAndEmoji.md b/examples/Demo/Shared/wwwroot/docs/IconsAndEmoji.md new file mode 100644 index 0000000000..30a35b068c --- /dev/null +++ b/examples/Demo/Shared/wwwroot/docs/IconsAndEmoji.md @@ -0,0 +1,72 @@ +Starting with v3, the assets for the icons and emoji are removed from the library package and are provided through additional (separate) packages for +both the icon and emoji resources. The components, and icons that are used by the library itself, are still part of the package. +Adding the [Microsoft.Fast.Components.FluentUI.Icons package](https://www.nuget.org/packages/Microsoft.Fast.Components.FluentUI.Icons) and/or [Microsoft.Fast.Components.FluentUI.Emojis package](https://www.nuget.org/packages/Microsoft.Fast.Components.FluentUI.Emojis) +is enough to make the resources available to your code. + +We use the [.NET trimming capabilities](https://learn.microsoft.com/aspnet/core/blazor/host-and-deploy/configure-trimmer) to publish only those assests that are actually being used in your program. Usually this results in some very small DLL's that only contain the resources that are actually being used in your application. + +We still have support for both the **complete** [Fluent UI System Icons](https://github.com/microsoft/fluentui-system-icons) and the [Fluent Emoji](https://github.com/microsoft/fluentui-emoji) libraries. + +## Getting Started + +To use the **Fluent UI System Icons** in your application, you will need to install the [Microsoft.Fast.Components.FluentUI.Icons](https://www.nuget.org/packages/Microsoft.Fast.Components.FluentUI.Icons/) NuGet package in the project are using the main library. + + +To use the **Fluent UI Emoji** in your application, you need to install the [Microsoft.Fast.Components.FluentUI.Emojis](https://www.nuget.org/packages/Microsoft.Fast.Components.FluentUI.Emojis/) NuGet package in the project are using the main library. + +#### `FluentIcon` component + +To use the icons, you add a `FluentIcon` component in your code like this: + +```razor + +``` + +> **Note:** Icon names are structured like this: `Icons.[IconVariant].[IconSize].[IconName]` + +Following this structure in combination with Visual Studio's IntelliSense makes it easier to find the icon you need. + +There are several other ways of using the `FluentIcon` component with the `Icon` class: + +- Using an icon instance. + + ```razor + + ``` +- Using the `Icon.FromImageUrl` method to use your ow images as icons. + + ```razor + + ``` +- Using the `ToMarkup` method. This generates the SVG code without using the `FluentIcon` features. + +#### Custom Icons +You can even use your own set of custom SVG files as icons. Start by creating a class with you Icons like this: + +```csharp +public static class MyIcons +{ + public class SettingsEmail : Icon { public SettingsEmail() : base("SettingsEmail", IconVariant.Regular, IconSize.Size20, "") { } } +} +``` + +The `Icon` class and enumerations are in the Fluent UI library itself (so, you can be independant of the Fluent UI Icons library) + +After adding the class, you can start using this custom icon like a "normal" Fluent UI Icon: + +```razor + +``` + +#### `FluentEmoji` component + +To use the emoji, you add a `FleuntEmoji` component in your code like this: + +```razor + +``` + +> **Note:** Names are structured like this: `Emojis.[EmojiGroup].[EmojiStyle].[EmojiSkintone].[EmojiName]` + + + \ No newline at end of file diff --git a/examples/Demo/Shared/wwwroot/docs/UpgradeGuide.md b/examples/Demo/Shared/wwwroot/docs/UpgradeGuide.md index 10867c5b34..efd1c47544 100644 --- a/examples/Demo/Shared/wwwroot/docs/UpgradeGuide.md +++ b/examples/Demo/Shared/wwwroot/docs/UpgradeGuide.md @@ -1,4 +1,4 @@ -## `FluentDataGrid` Breaking changes +## Breaking changes The `FluentDataGrid` component is, as you may know, a `QuickGrid` in disguise. We aligned the underlying code even more to the productized version that will ship with .NET 8. Where we previously aligned parameter names to the `fluent-datagrid` Web @@ -10,7 +10,15 @@ * RowsDataSize -> ItemSize * RowsDataKey -> ItemKey -## `FluentComponentBase` changes +Another breaking change is found in the `Align` enumeration. Where we previously used the values `Left` and `Right`, these have now been changed to `Start` and `End`. This to make working with those easier/more consistent in an RTL-based application. + +`FluentBadge` now uses a `Color` \ `BackgroundColor` combination to determine the fill values. + +`FluentCalendar` no longer wraps the `fluent-calendar` web component. It's functionality was too limited. Not all parameters are supported in the updated version. + +`StackHorizontalAlignment`/`StackVerticalAlignment` have been renamed to just `HorizontalAlignment`/`VerticalAlignment` as there are now more components using these enumarations. + +## FluentComponentBase changes The `FluentComponentBase` class now has an `Id` parameter. This has been lifted from the `FluentInputBase` class. The `Id` parameter is used to set the `id` attribute on the root element of the component. Previously, in the `FluentInputBase` class, a value was always created for the `Id`. This is no longer the case and @@ -18,9 +26,19 @@ a value is now only created for components that need to have an id. If needed, y parameter yourself which will then be used as the 'id' on the root element. ## When using icons or emoji in version 2 +We have changed the way icons and emoji are used in version 3. We published a [Icons](https://www.nuget.org/packages/Microsoft.Fast.Components.FluentUI.Icons) NuGet package +and a [Emoji](https://www.nuget.org/packages/Microsoft.Fast.Components.FluentUI.Emojis) NuGet package. +The Fluent UI System Icons are a (still growing) collection of familiar, friendly and modern icons from Microsoft. +At the moment there are more than 2200 distinct icons available in both filled and outlined versions and in various sizes. In total the collections consists of well over 11k icons in SVG format. + +After the following changes, usage is very simple: +```xml + +``` + There are a couple of changes that need to be done to upgrade from v2 to v3 when using icons/emoji: -### Changes in `.csproj` file +### 1. Changes in `.csproj` file For version 2 you needed to add a `` similar to below to your project file: ```xml @@ -35,7 +53,7 @@ For version 2 you needed to add a `` similar to below to your proj This whole group should be **removed** from your project file. See the [Project setup](https://www.fluentui-blazor.net/ProjectSetup) for instructions on how to work with icons and emoji in version 3. -### Changes in `Program.cs` +### 2. Changes in `Program.cs` The `AddFluentUIComponents()` service collection extension needs to be changed. The `options.IconConfiguration` and `options.EmojiConfiguration` lines are no longer necessary and should be removed. @@ -48,8 +66,8 @@ builder.Services.AddFluentUIComponents(options => The `options.HostingModel` setting is used to determine the type of project you are building. Choose a value from the `BlazorHostingModel` enumeration which reflects your type of project. -### Changes in code -**ALL** occurences of <`` and `` should be checked and changed to work with the new format. +### 3. Changes in code +**ALL** occurences of `` and `` should be checked and changed to work with the new format. For icons the new format is like: @@ -67,6 +85,19 @@ For emoji the new format is: > Names are structured as follows: `Emojis.[EmojiGroup].[EmojiStyle].[EmojiSkintone].[EmojiName]`. +📢 You can automate the changes by using the [Visual Studio Find and Replace functionality](https://learn.microsoft.com/en-us/visualstudio/ide/using-regular-expressions-in-visual-studio). + +> Before to use **Find and Replace in Files**, you have to backup your project. +> The following steps are provided as an example and may not work in your case. +> You have to adapt them to your project. + +- To search: `` +- To replace by: `` + +![Find and Replace](./_content/FluentUI.Demo.Shared/images/Icons-FindReplace-RegEx.png) + +The preceding expressions are defined to search for attributes in this order: Name, Size, Variant, Color, Slot. +You may need to change or delete some attributes, depending on how you've coded them (and relaunch the process). ## Using the library from a RCL For version 2 you had to add the following to your project file: @@ -77,5 +108,4 @@ For version 2 you had to add the following to your project file: ``` -This is no longer necessary. The code should be **removed** from your project file -```xml \ No newline at end of file +This is no longer necessary. The code should be **removed** from your project file \ No newline at end of file diff --git a/examples/Demo/Shared/wwwroot/images/Icons-FindReplace-RegEx.png b/examples/Demo/Shared/wwwroot/images/Icons-FindReplace-RegEx.png new file mode 100644 index 0000000000000000000000000000000000000000..72d1bbe74b896e562ea150b9258e9ac215a86858 GIT binary patch literal 17963 zcmce-by$?`w>FIW2r3|ogh+`pa)FLgi(}v7fzphK7cQE%Eh>A{yGmJT$Zi zpPoDfj=1pYIs#u092Lcd(aOh3_JGD;rb048XlPZ@n78_mf%a3ouj;@>&wK7a4+d-t zjnL3UJ0-pdDZA+$EqmGF&1SOPW?@Fn_p-|NHNl$DIk3L4=s?zNs8;+-4J{eJ*Q?E| zg#L~>=rv}Sl{m+A!M7tMzCG4eI_C?l$T4s??rX5TO-I7p2;<0azc8Z%cfqOc7P(K<&aS`i|2Er4 z#fD2`9%Bh0^E8p`N3O27Hw`G-LZVq)a4g zt;P@qqe&Kw!2}*dZzabUDL4R~x#spl){Jbuv+3Hg(YQWsl@(@|Ik;HC#aJ=B~oC{jtv#xhslTCLIp~ zJc_TW=Ow}sg`BCF4EFIkSXM3fmOdl9zi&G?TD-mS<5%(|&%G50^4JG)>)mnf{~a{I zE1V{mU)!iNk2~4TpGyjRequz9iEkx1-H=mI9K!SrcM9X?(Q@iz35I$`n6iS6^-#VC zCB-Dr>7?Cy?^8Hk_|?Jeh#V1_=V{l8=MJB3+ttikPcQ^@!r!Dk`K?qmqf1u6&}7Bu*gF;@rwAlJCs=HA;%}UkRFuYZWLucziO# z+7;rveT0TKDu*{hm!qUruq(@|!^rr4E?!UzdDR`5orjaH-guo0iFUL7Bv{Xqc0Ri- z$nwzJ%j=G?{q%9_XIzQ*GGE`(y{btW_48-An$Vt5b;u(Ud3jeLctECiSyPKJ!cx`f?0j(ZE7+(=6UxyEavGR!8nwdN^BJ#U*PdR7=VXdoA#UQ!W=D z9fzN0)8yyO=wDPE=3rk68sMvyy%|mlV|arDm(l~1Zdqwdc@bq6W zSzB8}uKT%>@N8770K|TP6z{O5rKL}mhhrH;&2^f*cH?>z{EcwA1BVDyTQ=>vv_w8% zQj>~?M+p*({9G%6Rp`ocGWY(Ge%k7tpHP$HWY>_)U7J2UaL@%4A#BtVW()Rji!0OT z!gqMO52Dm?%EmoB81>pe5lztk_T>g@ws=h_qrmiM_7&6^kJl|bx3e}%Ykc9wQ06+m zuo4FyfntsEQA|_C`$bigDA^A9n61FwdTk>tT2XM1W5>%lL$)0IPiW{JBzDYX63w?GpB`RCxT}#7vmYmh zH=3JRj?WtAK9W;^nYlobCisWN^&^)_o0MLE{LY~uf6VJwUYF7qe#WQyE+GVhM2^U{ zhxNa0xsx&w!`s{GwmOx1UBTqu9|Z)W-rtY!CJ8mBP@6^ArO~tHgFSi3{Hp`)_S@zU zc_|gDuV~-a#@ew23W1!wzA}&J|F%-8BH-fJB~1-EFmTN`@HT&OOhl@JdB|(_v(o4N z+uFf~XXc|_{Ebap<%65ck6 zA^E2}#{;gEQeis&J^rNs06Vgyapi|}^#Re*>5+7H1x-EIBj)sldY2He`KyboVmjWm zl4)#3I%*Wy4_U|P!?3u*D&h#Y=4VpfJ{U46W5SAhBCV_FH!Jq8US=HUXov#hba#TV0~gj?7J zX*hXWyiHc$GMfJAK^QCr*VCol-L-|u!NU*rUkc82qmWU9`lTJr@Z#zA zH_`h;^^TrRFV`Jme?~HPm)>M@V3sQQmEnJ>Cp8Gu^U37uCanK0UVo; z%I_BeHXfHlkK&d$pba67A1d1PP=!2O&Dxd9`) z>NRWL8eOM6WB7p_7-!;L2w=h8$k+LSD_|5W|2G@DRc8Wo-WE=y=AU)9F!vv=8_Jif zzOXD&5or4IWZ#oUbZcAZ!vM4YkrLge(-3Z9zKTB)|Fe?q$?>nukF{_e64lGy(aSpVCUE8OLoj6SU?vKM`A?BVb9I`V%+nmJzt*Sp`pEvCL#gj z5Z%4(xM~W5SATibD^d%tPM6O%k^caxJ?)o@Mfd_ z!=Eb_; zN&WT%v~o+O2pFE45jUf_AY*yW18shRq5hypiBsSj|4bbfV;pP3{?SMpHyfL|5_>vR z4A#PiAll7AA+zDc;nx;sGZqi4eXUsO=IuD}BVcCkb_L7zr*`C41qNz{Yd0@S=m)-b zhsex~7tU-Quv2a*0os!ePwlEU)xQb_VN@GyqE(s+B}@n4<_L2;-b-Hv^cgOwm7dUb8}I7IhqlFMW?d% zd>ss|tq`aW2pVwB}2OXY8+!h*Rd?KIFP7hDvt^l^kjXN)LpZy+7Y#B6-nU_(DW8eI9DvI;#+a(2OM@BJib}!a`bgaUClJ1V)4_! zrsEQ(y}Qjk73E)WGc~6|$U)_dS5hZq#y3iq4tOc7Hp^JFpaaU!sBo% z@H)%gc^-eq5196h{)$_(4JRf+L!%9xkA!KI_GSG_4%?sEnNQx;YVeCLPv5k(2yWC- zxnA|~!wn)jLx6hPU5j2vY1q}XtScNy&4kMlQ=6&}iF_4JpE~oLQTR6Lspm@&M))ir zx54C}JDB*o$Xm zhU0*3%5vHn&V9E+j@sgXeQ%O!mBI;GlCtxSj#Ryw*YEgtdQ!6QO|<>S#zqJXxM3yu zACvw6)3}HR?_dTB>t1&g8u60%g6`o;kpG=7>Pq)MxP(D`P^N+i^(GFQzt6$HKfDE^ z(iVp;$(vg^*r&ZyN8sN6cedJZL~^gV?_@SWyj!F#HQv6s-dFALn3Uljaw7Qq87_Ld z12O65Fam^9xl~kDeYO~Mo7RGejTW%~?%?+G-F3%xct^}r8jHW=l|EB1twIKX8KG6m zyMdhnA#JYD-!AAszK?o*eEfRA#@$_@vLrCXXufe8I=A1O_BuKQJ@&^V50Fn!PJpdb zj>&w7pyT)qjLO?|x?t7IzYp?FiGpRychK)~R43xa{jpY@e;Q#a6*S1bd$;Dkb_>5a zk53N^dj>C>>K_=`qERZ^KG^aWky9LpOqX0-g@wZatWkCEKN70aZQFTlTRS}A=l+i| zjhgYwwOi`VCf-H&A_6f9hdI#DKC3r-Tv?<30|8o}#k?uqE zm#pu0Hs5|ODUmUmTDs!@+<*G1;PxkHP2^}zwoC4B<1d8% z7jC0c>0B=fpK2T0EH<-MNQG;CZfepkRL{a5=7mPVsWiUQg|US<{K3-tlUG7JOn0zX zsV2VmvENhEn4O)b_Q?Ssx(@fu$d{n~0i8D=X28oL?HneRK7#hOS7ejWjd%z1p)&?Y zm+WRKE&=|n5)T&+^!~BolQ%f7u5_*nW7{3%0(YyTh^3gG5f73E4Z~G~^xNWtcZ*A{ zqk9=M!z{ZQVaDvfHh1d$1p~og#wJT^jY3C@rMl&Y5*G|o$EfB^!Eq;rvrN;mPUM=p^=AJhZorE=fe0FSfATVMNNv5^qdwYiKS++A5zzA* zBZb(@9ZVSWmDV>k!z-JcR7nNhoX*SZrq#h_W7`e z1TQDxG*)1fug=4oQue-mvRCAFt7o+rAUB6iZf`CltN2<9(~79j*9P&cvuboyL8mYw z9TCVItB^`L6uuA_mdGrJ&x+nFSd=@Lp?#97s%_)w$S}W?l)S7_sPo5wLXf&)KzWG4 z!e~{-<%N3IPUK7bwqLo18G|>CKkgO>^gA$ORU=7pM_t9Z5K&n~2jn*1sKM}Dld2MO z(4O<8R5Ts`%`28GCil}b;D}r>urr%WF)r6+%;NUqD~aBrK{~+17*pG=R>x& zoP1d`S!>~R3*OO@d}NSu+^G#4N8)EWidR;xgXqi>2NU)>97!E@G2DHLmcNY&kE4`& zb!&1*sMcqvR9opVt~H`%dHYdGR-W>pBvQ45iBL{H*=%nOg!iCysOY&~_EH+P)Wit0zTD<3M7JY6$ZPM~u*lY0_g z(kET^tvrdcHF~Js?s*;=1Q`K!>cSaL8-uX&SyCc&$#4YkzSHVR$iHtM<9t!%W=!Tq z&F(Mn=(o)1lTE2r!yuLe3T<;VV8Tl>t}n5n&nRg5-hewoF=8m$_G_73$w^}5eoDhg zd($*vzAPsp9JjCc-Zzs`2HL%RYm_G2FqhZ*0RJ{K_D2%CjEG1Nj?Z;ZK-h^73ISUI zRopheo*qe-)$#;4ca}R)}BIAr1j10)qTv~Tbs|(hRdAZF= zeW{2+YLgLkt?puXSYz!5*PK?`4zIQ^daIrFB27wi(?xcstUMT^vp>xV z&D&3WD!g=j6Dd=Pl(0D@WzSS%t(4_7&74$A$JdpmP+s8YL*vGjev`of2OoyFi zFW%V@98{{yU1foSEH`>eN2rsUO6G6dP7yAqk;Ue0TEkE2cLpW{bl;S)WjZrfZmcqy zHlHr_;58mCOJFPL&=o<04pKmf$v>M!9xY~ByK>_wNI4I~#H7!FDlRN66W#QAE z=ern2_m*>ICW*PBVgt^7V=^T zKk0-?VT0e&(==#uxbNK6q{l{)ujHKzYc)#UgV`ILN7GwjXEQK61u`~RvJtLU7K@He zo_D{N8pBGcZwfrlCYjby@*!MifZuFiZr*&ZpK@2LDfg&yUnnaaopt2fDlZ)0+HL(o zqCByaAWP0y5G9h<&9hbIHSmGhHaYxh_^QiAVHUy!riCGg!mK$EnN7hED2Fq#O8mIOyP$18ZWJ^Q2wm2rG zE(WBGEmJL2%`|B%`|5*QO<%h~U)iR|bmBnS`$Q{^#}~>iR}1TAe1BM22Q%(yIr9Vji4Oy)xRjp%jdNNjvP7J%&&4 zcJ!setCrreGk%v1eBJZW9+v5eN%kI(o&mB>=?%)Yyqp^K8h95cQB|$-_}oQMlRvR9 z`*%S?&1mLj*=Qa_s^jftDkqK!G-AqQWbHaiW2VhP7Cauw`LYmVro&{K?@+f{q}CoD zc`_-gV)v-*>-MhY!Nk*&P&s~eI8*F|{sK*gTwuB#pUC&etQMRfA4W-S4cg{gKDW(# zm{6V*g_CVh+Kb23=xOA;>iT5?t)lfovcf3Xp+%l2(JXt~)(5d@n(dY30aY#6iVY9r zdS}q6-hG80cv{g`*OV2#i#m9snTEg*HrOl+A`zN5>%g*EwEqWyhEhP?F;m``VJ3>;Ha9`Y8f zKbm$g%BO14AyX14I85E}WLE41pELZbZ8Mo+qG?uzVaP{5W#>2S+Lk5L5!2RZ-!4)CCtzw>aNg zB)NT&_0P`{G@+|FvbS@|=jfxfri6);FOR^wQzq39jB)-beVJWBQuJB3b0;a5sqMeM z$+neb*NsLwooDsnTRCV)Es6=L&RbhSX(s3DmPueHlwYM1%*8p=UGaa1sI5bDv@hGs z_PjaMxhH8De5zuSswpVpHE~5B+j9>_(;}n%lrO~eu+5D(n_rk4=QB2sYU)1=h`H>P z3+J(dUb%3M$gc#oQrSYme+>NRKKX1d?$U`ylH2dk@!(5s2{~)NB1{YzrWoOI)*{>I zsWUaKa@-FW-Qx3Bjcl1}(j0cYY`kN5&&4YGjhz4TPgbTf&vr6%Zxe6pVc$cOka^XS zNn+#N2KiJBS?=)B9Q)*yFP*ZdSOQd-LOM@cUU=J;rCU}lbk0P59?P3Rn-K5b)<}av5Pyyyrs{H^W=ZzeW42*NGHl7eI%eib#jo5{%BN`idm= zKJZvl0t8)@TPVC1dZ#TK{hN1Ky07KhW4od=-%kax=>lEXU|xOGf^0AB%zDfZFI5@< z7io>->@z`|qZn3y%yGPjdM|Hf6enY3Dj{)WvnTVM)Ywqmn(W&XJelOW)UzfGC32=0 zs$XUCPG=jjEVsqPGim0+=-#eR?@cbS_eJm2Ec^(od+zDkS*mtJ&9poEk@wD~LD4V? z!bT8uQ#7;uS$uH2s(_pj)4+BL=a#VBb^~ro; zttQw=fTUb=DqLTCgVda9wqLuau7~0Z!{tKNkg#qb-?5*#CCE~aZ~NL z%+aUV4fG1{!vQ`{N?S8RqNwO_a?C}C;8_v^79B=Gdy7Gr#C5*v(z{`BbXK$DMzha8 zxrX*Il7EzNihFG%iux~*W>PjOIb__!abH&{bJk7wgW=^bG*7Pf3s)NT(0rxipXcyn z-p0i0Tl27u#TE{z>I0Md9ezvM-4>b#Y^Ti|1RTr)+FB#rIcWi*-vLy`Y1;Y?EH3~F zpl7sEs(XS0?L_3?_?!RGXwTW%83CA<&qNGH-pH+yWI{%@x088xM+1c!9qGA6nnIbwmJL#-_&pXh9g7gRFY(5AIsb^!m-sq_yG z0p>gNK3Qoye+9hIM|YYPZZ582IpFu|_cPCbc}H65M%T|c!{7^5ILTv{P&w*V-hdh$ zNB#VDuSQcR=?P+!S(ipvtNiTxTFix1=~3U*aY2#FyD8d5ii#GM+o!At#(IIT*@cl` z1v4dU@JJZK47;X&PqS&ni5P6@6EzW-S%~YKsQ7`Yr1(`56-#^IP$_-;0UbUs!`bf(nZ3e%8?S-RgMN?HLHWBmsYm@DFoZiY zr3>jrzo2Yx5h^pBN5%apnYeIw`#_U#>em4L>9lTk1_#(!-WId(>SnxVlE0~HrkK82 z%&7S5{^J*xMN=C;xsuB#6QcdAjbl_Q~%a-%r-+cC2{y{5&&k}m;KRoy5 z%}Uew*TKuf(7Iud_`Oy&tKI1L&i0^JUey$~g&F*edJ%QnX5~qFhRw<3e8~jhd5aoP zyxNi4nhKp@Cuo5WH+~p|u{^nuctvs|p;+=80byv73{T{$%vF99_lA^FTh&-Yi}%jc z)KR`GX!F|R=wqeg;gm5Ky2U%`AjH43 z0rS?j+&j-(9qfC0)Wy-Z0~Gr~`({;ZZ&QcIcuaa1=3Pe8HR85EX4FNg1=O)_IjsE5 z<&Pqw7$e^!CcS9Fu2Um^aVAS){qxVND@4?$Hc~BJjna_kLf3dlS6-8QqNzNLKcJ8` z3wp~YQ-qb{pU75OjF-=*AzYv|j|qt!)MN^7<5s|`lBy@_cr&Vh^h4H*oz5%%vL;st z&Ei2mb1s>gAEW5P^#|4xO&-ZS$$~)Rp=j<6>Bo!H^mXI-ET(hK&T7VUeGbZz4qZkJ z*4>3W`oHgrF$Iav23l$aj^~Tw;5)o@lB|bmc!4If=p_fOrc=xXq{}^RVsD!hUE|BN zFQMnKtzNy9QF*$Qs(*=23k zRVBvA3uB8&rVKRs^c$k=S(Xb9wKbpy>AfPhidx<^6UAyMy9ZJn+sDp5m>tFc4H?^}^rUnzUoEK2>c=GWqrev)Vqvo^`!6WtcMn5Vt@aPBW6V{n zln%Hw%>=ob>!A~XpEGAp* zAN9_Z|F=+e!*f6jz$w9J9XUb29+oIx)UiWb75;rf=4vIo;5`YS&X#oOKK9B^;h%Og z#NJ+XZRk~z8-<~j^vt)(F3h?hby}CMQc^alk&_BfIf&DmGlliFQPOb!!VgS`f>Jtn zALHXL`{i>fr`iE`>&mKYEmMwkJCP9QAA7BH;tL5_-{TBV{xkroG^KT6eDPRg4&(kP zf9>GF3@>}kk%t_l(rK8JlAfBK ze72CNubB4^G} zn*FhlEyVSE6r0%)t37mzLQDwjdyufp=u7{^2k_7t9(>sBvaQ(rXRvjNv=17i;r@L* zc``rD1He2LgrTMUgiw>x@4)O0_^#B+nqJ1Xdp)xICoMseCXgce6q3FX)b&U(ahY*~?X zB5lu|m-8V>=$qHC9@NOQ+uv(hG=k$dm``l&UzQ->T}k=T%h5QF9!{%L%ye(HXLJ*D*{YBg`i!(UY^r)h>j7i(Zbp-)NC-*)${V*1;3}B$Ud( z=JoR_Av(QyE7M?$8W5bdAxdr~cTf`tD;jF@e!DL7C@hZ}oh4M7es`Wu@{eiTpdQs; zQGM37bp1vieIkfm*n&rC=;c=IpyFQdU7wEklc+z6ZIAPRFRN~~bo|O;R)Doovd3(9 zzIia@*lJ_((0eCKd$d=fFvApLPa0MOeip-8U?e7KtdsLN%ZcEE0e-5Hz1zr#rzY&T zz)uwRrWJKLDVIC3%i?{88T-ley7CP&Tw&vIh24s){WTZ`w%mLtbhKLY^llV$Oe%?^ zqf@XQ`N!~a>qQD5Fr=;7-OL&@KFK4JZ*8K!NL+qk-d+i!TZOTbdygO~+4hO70B?<- zo@Hgi(5sOaXFV)qi|)xqK86J=6)kMd{3&3nn zqcMsn<6B`{fX=P;{kueSJ1KmYrw~2{iG!wAIUOjqvb)y{7UWFGfkUH8wLjK0F^Dp` z!F=2VYU~~Y<`4T|_5Qo+JK|OYHCuHoqcey>h-_yDd7wL#bXGsBM%Q7RDh>9l!69v=9=qW-?vDP5a&FsBG-Y^9w52bkjiS`JE$; zOPC6oAQ!8>bUT{c?q?H*mI!IbPr9`*dbx5w@yx*PpdZWfxtgA|YcjiOD%-+b5lM9v zSyDgYK0H21&mZq)gc8-e*<9Nab?bj%eC$P(sTv+cF-V^1cNk$237y95LNzn&k<=I+!_>b1u z5;2J%7kw~o<1yX_ho#sbHI*ja;W~Hl0V21Wkr-?W#N0>d`E!A|3A?yAVs)gsxrW1f zQ6Ix-(%rkwsiV5_N4kDx-Hm1pNhgG5Uw%q1WZ*K1VfCu$#C_HmwPPwo(E;4?rc0+9 zV~;M!(iRo7&Q*c`FM#}wC*Bp@OfSk$9$)*-3?=2#4`El(1w#Qlzp;Bg# zvws@PWj(8J_#2ALLuV3nQ}LMfPl@!l&8+2j;I8>wV4ubW78G6dPI58U8kwbaw~aj4 zQ>`VhE~t`AL%>x+|JI-xI@#&se(k+zCn~}ng|P@LJ~45i^L{mp>5B)#OTAj{WLCC( z?w6pjc&y4u>`y2ZCNR%u?rrfZ@z)@kpNgQ<+0F8EzLr`{v4r|Y#;-Y!%j1nHEmX-V zDg!4hNgd9pbA(hA*+(AGA7*rv@si_lvRTyzyvl3BcS5Aigli(Vv9f zQ3i$ehFnp?8D0mxc$i}~Ck~|f{OAEk9!ZK5$68W}E(p`I#qNnRBf<>Dvh~OS5sj)b zkD6IU%_n`p)Obu9)#tgcM>b49ZzsJgA)n;_xZbwVmK`nm>f~`VD<&C;o193xr)XPb z2K<@s6+fAQwS9gEb85v%*A59$Zf9E##B(&nT{FPsIpF7;lDP8x#pIXr=%$H zx8!iJ*ipQ*x3kYV<##`L`mmtN1Ntqpe0gH**LR7iN&I!FH4J0&~a?uUD1d*c0v( zU2nkc`-KUWsQ3L?$ba>&Bfb2)LWP`525}v+n{?xjve;x$qJc{^;ONawAy+oIgo%uw zQ5uolPuZomnmH5ckDx3<%ZkA(&HZ#r(2~FMj*QlmMcafCDOJpXhl-`{<{c`^BF!HJ?T zC^?BiO1ZflfNh9qpW9sNKlg%d#-%!SWjHID9lPDr)f}sHv5~n`jeRH z6>V?JLq)G*pnjDn8kV1*|iy~ zf8l9YrB_QSAXuZhQ^TB9AMpU#fkwMj_aSh$NjnxiDeBhEbXdkF72;Im` zi{-8j#~K(IFkVRDYu&DNJ2QZXDv8vW;6Y-I0Re&cFeCd@ALe6&xR@fhe`LQTjagoTJm{E$2~QWy0r`0 zfsWaFD|yqe$a$Z?flnLgPDS}+MM>{qzQwDn=Pj4|CUY|jLo|VJVxMz zD_bFeYk{u*7AO3>=HMUXZ+pDq1psy@D?rv3Z%*vR&NV}vR8#~g+!7*L9D#pEn+;{# zgCGu$F^8k`^+1+CVmeSFWe;a(?yCS&hTpA37bqeJh@EVZ^#^>5np`6{Z8Oi)x|gX2{;GVzcg#>#C`YfAZWuP> z6|MDwJK|4J{CFl=#?lwQt&;smVsGh_4k|9n=BwN5M8=e{>OT4vZQjdQM`ZobnC@(uqvr?l|Mc__9+TG@|+hiCYWk(LkZjUP1F=nsa zJT&#hejPatE}3^1ni?WU_{7AIh#uOvNk(i-F;zvN10@HYBy_oMEH`7=ZE~WuU9-63 zYDBjVpNVGY4SeLRZGph~ zQ?^_b`)KTynp7T{Da&jsvM!CcPq0AEa(euyhGP$J{ZGe&MVB-_QVH}@QY_B!A-`JP zg$(S|i!J9N)oJ+s%62Si^g$s3b9a5(gJazMp<%`2VA&NC>4O4x-_#!7UaE>`)w!@jf{AC_SMyI@iJdN1HwG^*f#Arl?RPkP!6a}6Ke&}U08 z?xt7W%TQ&s<;j0od8YEwirw>c#_yB@pTZ*k_zm@D;Hta@2tm6$x_D$8AOZYwYX(F` z=ouH!mlR4m>+0_RA-_5Vwo#NIc>b#fLDX7N{+s+caP+gy)t}Ud-gs?wjQ;SnGu$Ll1(3$ zUgTUAU3H0=%XE?p4mnUW#xpS*#)g_XeuREC#(e$F>f3~c7r=ZKWqgqnyO~s_|AmEj zh#+hFacr3|8}I_)EVw3FtHXZi+5VMN-QAo_{1Ph(4NYry`2C9I(_EV4iWc4PEk9P? zyg5FWKK-7sYsIc^7m|qjnF@F6%p;sC0;>tIF9#C1;XNB5|IzF&YOW%)<^;3^;TxLi6g( zBvpgb(1L)C_E|;jEX&nS#J32>k#GFqvMq0Sy>V< zoK$EYAIh5!E>SXQ^@|1KGs+P?TOu4%dj(MCz6V-7eITTP0N#4;Ec2Z!yYJ(xwwE1- zpLE+L35l+citM^vmW{Wy2tswK?$WU=EJNBk0!O!;ouOK7jJTOm{O8@~6JC47Xa3f> z@mQ%pR?>My1a*n#NP?dwJ(Uafg0qPUzgEDRsqM9keu)dj9jm-5fH`wDuXAgNeR=#U zQ!_U{)*E>Ys;Czw1@AaQA|@1A83bk&iv~o{b?r-i%JOB;z?3fZ<>oWL-Pfmu%HG*F z($tCz(CHpm+f)vb1lj$Vc6mPSQVAJ3n~rl3lyx6|VOh3dXV=tR;T)9lGnsm(+q>^A zy;bR&vJ&2XU{G$^cL!>;1u_IcZ3pdSU=vVOa?*~lxdk->Tl(I%;1B{owsY6l`8hcX zJ9H9i>+fTb(KHFiC{_Cn__@;Ahb%xcDPOu5y@N`Q*S-7JgW3ghGGG2qZp{2qq#^o==yeL?#>T%&#X-)jDKUtV0C!7lWN zKM0ZoahA#L$&P9Ge~O0?2P8lbop_`3Cug*CK5D-V7Vl#lc?Y+DM4nVpuzL$1ODQg! z@lpSEkk)-z=vdZ!=8b?JH7q%d05w$5<7EcI`=p5$gK;aQ)?Des>)YiMZ&)`b%k4II zN37Jvll@1AZTi`A)J=9LyT0wiRfSqWT^#!54{0}HAU%>W?kf%0EAB+b6&CGgd;!9YzM23Qc)s&*e= z85``MArEv>H|<`Cg@uLPiyj<7=_=Ghou%M)7Y_1D7o}1v|7LB4b%;zHXa7+y5hngR zsZgV9!b}|HGyqb|(+lT=;U?P#Tao^Yd>CRw%IeEYe46{!_y~=-#Z#)8kmgL>K()MV zhjQjwiN!!l%>y)1(n3u5XZz`Do=8WBqDM z&bic%(cS?6YA`TUWn1VmRt-K%d^yH- z%h-Z6FJ)!p$GEez&RJX8bG(EWiwo){zBR5C2fd?E9(&&m6;Ke|c^enAq7b{xgjlpz zq|nzPn$D5j3J2fsP5TGaAYffH=aZeV=(aB{E+T*`IDY}3^C6n5IV@?oWGipVGot-U zw?>LzaLPLawA4%S>dT=qS|gi3rjd&2>3?;Q$j`h3l0exMjDKCt8kdWGwRZe?UMK&k zNBvqnDV?|qU8K-(>It@MiGt%NciEaZ6rokWZhL7lQnJcEeO3VF<|>0eF(pm$CKalQ z@?efb%^D0cAZJ^tEr40A<|u=EY+?vrKM1_t$pRhgBDZumbJmMU4GX?2fcq1ZT?;#i z!Vj#j=Vowg3=IhEwWAcItm4x?+xNis=F(4*bt2oe9)1CjQUjA0LubUo9^NW9PKBz2 zFp8j~s%N3&&MMnwrH*h`k-=b@ zs^1eL!>{4S(K23qZ|FXQ?t4JkHSEh(T5*84WmMGafG1FR68YZMCd48gT3E9}!Wlo0 zB5;^}ig_ku;Qe`qO4vl;uy6^QLali}=v?{4Ck1j5tT2vreWoSL?~1`$eEmA_f^S6UvG!L3k`qO6`>`m{8uk29pSdm)}>wXIqCFf@;7 zbaybP4zlpE1SmFa6;9QAZFRC1e|ZhnaDr6T^e659(teLyZ4rcTs5KL=l%q5gDxD6j zbTB=BNt;~-+ZqdHoawg&T9s`wrhglH*jbh{ggfMce$-e>Me@a&Slj~<#v@(6DMsqD z0S$U*Xt8D~L^s)!(>CU(4B$LWtb~^p_vO=B+KFX3$*Wf&G!Y)lOF3)rue7%uM7!tS zWG=nWe+=Y^@VK(bEz5GcM+|cUnok#6;_)~TeV%;7ewRh0NU*nx+m)80h_^Fcqx2d<8PkAUOw6_7k_k$51b^_@*>nA4nzWymq zxILq3+XhrP?DTc`0NBO4rPA+RhBUa&?nF(~p@;XP;mO4tB;YK3=~8NZP+2b0XDzhm z#!R|apCCLu_lkRle?oKyFp?hu;)7|}W^Z^TUQJ$9`vU3wPUrIPcZhfE{GADFVGn^) z4IbjZ>(Jm&{tLDKzex8T?#OU{)SiMqq50;l!rbni%3rX51OhyN>;8W{`9F#F|K*-* z1f2O>xfUHjEOfRyBX8Z|Ljd~{c&lsy6knWA)+U~w>`<<>{BT2^4Updp4@O0}A)bya zZvTm)2!UM$g}?yOTY@=&-c`$W+BCklb^t|#*xXBiLg6hNBlv%D(*N=x|3yPps}%

x}&P{Af;!9~ta4q**8DG*?*Qy)idW^zJqgOFv zltSAu`Bq20>nyCx>%$7qU?-Q}LDd9;RQDpaFW2^u&V$N#VOF7;HFGNq)=4=J(LOiP z3$+%QEx`sKw<((OHntkpiU)ZM@&`t-V*iKt}#M8s5yFLpaj zY#;}9yj0x3r*rbP7x4E4UAK%g&R@6D&_1c2K$NosD*kT*VS+q#v$c$%N*689fdEUG zc83w&A7|F3<-Rvh=rs&MkHO*J+>|!v6{e2n-KxS_T6VH#a-|wfpTe2vcD-gb<4w*s z6<=*FwVmB*pHGY4>-}j>OTJjTd}6|ZmM!k;g{Sra3)cVw1Tr|hUI&_xIEY{R-T>k> zo>8kIZGv~Ai4&+<{;8fz`_h{}M>Ji-fNhs5f(fW=7Q(&;0u9O+);gvcVL*|9555o^k*dGhnK0x($=2J&;o!hh6w82*74%!GTGcJ>bj6}K7{goEw~Ty( z0<7w4Ebd0AM|c-BGoP-%M4sICh1Rw^%jl_VK=>wy!>G=cT$HouHnGq?xYBOAy1I4% zhLjC^UWRXlCL+tNFTb7aqRg|>ORm@To*at5RB>G*-)q=DzyLrGQ?p!Va`FeYLDO_l z=}z-6-`Pb#*Dm0=*niCISlDjjIJ=!zYhiY{Z&6EFHOB|kg`@%!^3n%LKm(6yDUM@u z>zkDWi;Ij7dFj`$%{LR07iW3)WgME(l{O}4`zr&bxt$>b04|{`LzXrmdpCX96OEzc z5kdBQCeFR^+Krq|tc-l_Ot-&JqlAk@%Vtm%keeLtxdMgCbR8l#zje9ilv${k>1a1k zNQ(2Ehu3ZQjC03lN1&J=N6rGK2w9BKkk?TQ;T73Z;bl84%!|w}OOCVY zWd`)iXGhy;9csuC@nt01??EI+^Z1~_?DGb)%$SirC%*Q{h@Mp*mStv~#G_aTv04nY zQ?zWzNium?EnqmK1(9xR-GTS|s*B-&^laM~JK&L8poHt+6>V(V&))T%o!O^m)%S%H zj>u`P#AHh5ZPM5PR5(&s*855m89)``5s}jDsLbWk!hOcllra-8pmE U&*g4c0M>L2p00i_>zopr0G}Ar@Bjb+ literal 0 HcmV?d00001