From adf52d56b776df17a5a4785ab5ca85358b774821 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BE=99=E8=85=BE=E7=8C=AB=E8=B7=83?= <1043137532@qq.com> Date: Wed, 13 Aug 2025 01:08:21 +0800 Subject: [PATCH] 2.10.6 --- Plain Craft Launcher 2/Application.xaml | 3 +- Plain Craft Launcher 2/Application.xaml.vb | 1 + Plain Craft Launcher 2/Controls/MyCard.vb | 3 +- Plain Craft Launcher 2/FormMain.xaml.vb | 28 +- .../Modules/Base/ModBase.vb | 133 +-- Plain Craft Launcher 2/Modules/Base/ModNet.vb | 26 +- .../Modules/Minecraft/ModCrash.vb | 22 +- .../Modules/Minecraft/ModDownload.vb | 52 +- .../Modules/Minecraft/ModLaunch.vb | 49 +- .../Modules/Minecraft/ModMinecraft.vb | 4 +- .../Modules/Minecraft/ModWatcher.vb | 4 +- Plain Craft Launcher 2/Modules/ModEvent.vb | 5 +- Plain Craft Launcher 2/Modules/ModSecret.vb | 2 + .../Modules/ThirdParty/DragHelper.vb | 2 +- .../My Project/AssemblyInfo.vb | 4 +- .../Pages/PageLaunch/PageLaunchLeft.xaml.vb | 28 +- .../Pages/PageLaunch/PageLaunchRight.xaml.vb | 4 +- .../Pages/PageOther/PageOtherAbout.xaml | 943 +++++++++--------- .../Pages/PageOther/PageOtherAbout.xaml.vb | 6 - .../Pages/PageSetup/ModSetup.vb | 10 +- .../Pages/PageSetup/PageSetupLaunch.xaml | 2 +- .../Pages/PageSetup/PageSetupSystem.xaml | 28 +- .../Pages/PageSetup/PageSetupSystem.xaml.vb | 8 +- .../Pages/PageVersion/PageVersionSetup.xaml | 4 +- .../PageVersion/PageVersionSetup.xaml.vb | 12 +- Plain Craft Launcher 2/Resources/Custom.xaml | 4 + Plain Craft Launcher 2/Resources/Help.zip | Bin 85730 -> 85810 bytes 27 files changed, 705 insertions(+), 682 deletions(-) diff --git a/Plain Craft Launcher 2/Application.xaml b/Plain Craft Launcher 2/Application.xaml index 8f98867..3d5488f 100644 --- a/Plain Craft Launcher 2/Application.xaml +++ b/Plain Craft Launcher 2/Application.xaml @@ -1,9 +1,9 @@  @@ -345,6 +345,7 @@ + diff --git a/Plain Craft Launcher 2/Application.xaml.vb b/Plain Craft Launcher 2/Application.xaml.vb index 5ef002b..b527334 100644 --- a/Plain Craft Launcher 2/Application.xaml.vb +++ b/Plain Craft Launcher 2/Application.xaml.vb @@ -140,6 +140,7 @@ WaitRetry: ServicePointManager.Expect100Continue = True ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 Or SecurityProtocolType.Tls Or SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12 ServicePointManager.DefaultConnectionLimit = 1024 + ServicePointManager.UseNagleAlgorithm = False '计时 Log("[Start] 第一阶段加载用时:" & GetTimeTick() - ApplicationStartTick & " ms") ApplicationStartTick = GetTimeTick() diff --git a/Plain Craft Launcher 2/Controls/MyCard.vb b/Plain Craft Launcher 2/Controls/MyCard.vb index 47652d9..b2af717 100644 --- a/Plain Craft Launcher 2/Controls/MyCard.vb +++ b/Plain Craft Launcher 2/Controls/MyCard.vb @@ -320,11 +320,10 @@ End Set End Property Private _IsSwapped As Boolean = False - ''' ''' 是否已被折叠。(已过时,请使用 IsSwapped) ''' - + Public Property IsSwaped As Boolean Get Return IsSwapped diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 93abb67..f1befdc 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -11,6 +11,19 @@ Public Class FormMain Dim FeatureList As New List(Of KeyValuePair(Of Integer, String)) '统计更新日志条目 #If BETA Then + If LastVersion < 367 Then 'Release 2.10.6 + FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:启用 MCIM 社区资源镜像源,以缓解社区资源难以下载的问题")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:正版登录出错时无法给出正确的错误信息")) + FeatureCount += 9 + BugCount += 9 + End If + If LastVersion < 365 Then 'Release 2.10.5 + FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:下载资源时,会单独记忆每种资源上次下载到的文件夹,以防混淆")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:网络底层框架与下载稳定性")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:无法启动一部分 LabyMod 和 GTNH 客户端")) + FeatureCount += 22 + BugCount += 26 + End If If LastVersion < 361 Then 'Release 2.10.3 FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:无法安装部分使用老版本 PCL 导出的整合包")) End If @@ -83,6 +96,12 @@ Public Class FormMain '3:BUG+ IMP* FEAT- '2:BUG* IMP- '1:BUG- + If LastVersion < 366 Then 'Snapshot 2.10.6 + FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:启用 MCIM 社区资源镜像源,以缓解社区资源难以下载的问题")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:正版登录出错时无法给出正确的错误信息")) + FeatureCount += 9 + BugCount += 9 + End If If LastVersion < 364 Then 'Snapshot 2.10.5 If LastVersion >= 363 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:无法添加新的正版账号")) @@ -268,11 +287,6 @@ Public Class FormMain AddHandler Closing, Sub() Helper.RemoveDragHook() AddHandler Helper.DragDrop, Sub() FileDrag(Helper.DropFilePaths) End If - 'If IsAdmin() Then '下列代码没用(#2531) - ' ChangeWindowMessageFilter(&H233, 1) - ' ChangeWindowMessageFilter(&H4A, 1) - ' ChangeWindowMessageFilter(&H49, 1) - 'End If '切换到首页 If Not IsNothing(FrmLaunchLeft.Parent) Then FrmLaunchLeft.SetValue(ContentPresenter.ContentProperty, Nothing) If Not IsNothing(FrmLaunchRight.Parent) Then FrmLaunchRight.SetValue(ContentPresenter.ContentProperty, Nothing) @@ -389,6 +403,8 @@ Public Class FormMain Catch ex As Exception Log(ex, "清理自动更新文件失败") End Try + '上报 + Telemetry("启动") End Sub, "初始化", ThreadPriority.Lowest) Log("[Start] 第三阶段加载用时:" & GetTimeTick() - ApplicationStartTick & " ms") @@ -874,7 +890,7 @@ Public Class FormMain '错误报告分析 Try Log("[System] 尝试进行错误报告分析") - Dim Analyzer As New CrashAnalyzer(GetUuid()) + Dim Analyzer As New CrashAnalyzer Analyzer.Import(FilePath) If Not Analyzer.Prepare() Then Exit Try Analyzer.Analyze() diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index edc5b95..b4ef294 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -1,6 +1,6 @@ Imports System.Globalization Imports System.IO.Compression -Imports System.Reflection +Imports System.Net.Sockets Imports System.Runtime.CompilerServices Imports System.Security.Cryptography Imports System.Security.Principal @@ -13,13 +13,13 @@ Public Module ModBase #Region "声明" '下列版本信息由更新器自动修改 - Public Const VersionBaseName As String = "2.10.5" '不含分支前缀的显示用版本名 - Public Const VersionStandardCode As String = "2.10.5." & VersionBranchCode '标准格式的四段式版本号 + Public Const VersionBaseName As String = "2.10.6" '不含分支前缀的显示用版本名 + Public Const VersionStandardCode As String = "2.10.6." & VersionBranchCode '标准格式的四段式版本号 Public Const CommitHash As String = "" 'Commit Hash,由 GitHub Workflow 自动替换 #If BETA Then - Public Const VersionCode As Integer = 361 'Release + Public Const VersionCode As Integer = 367 'Release #Else - Public Const VersionCode As Integer = 364 'Snapshot + Public Const VersionCode As Integer = 366 'Snapshot #End If '自动生成的版本信息 Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName @@ -791,8 +791,8 @@ Public Module ModBase Public Sub CopyFile(FromPath As String, ToPath As String) Try '还原文件路径 - If Not FromPath.Contains(":\") Then FromPath = Path & FromPath - If Not ToPath.Contains(":\") Then ToPath = Path & ToPath + FromPath = ShortenPath(If(FromPath.Contains(":\"), FromPath, Path & FromPath)) + ToPath = ShortenPath(If(ToPath.Contains(":\"), ToPath, Path & ToPath)) '如果复制同一个文件则跳过 If FromPath = ToPath Then Return '确保目录存在 @@ -861,7 +861,7 @@ Public Module ModBase ''' 是否将文件内容追加到当前文件,而不是覆盖它。 Public Sub WriteFile(FilePath As String, Text As String, Optional Append As Boolean = False, Optional Encoding As Encoding = Nothing) '处理相对路径 - If Not FilePath.Contains(":\") Then FilePath = Path & FilePath + FilePath = ShortenPath(If(FilePath.Contains(":\"), FilePath, Path & FilePath)) '确保目录存在 Directory.CreateDirectory(GetPathFromFullPath(FilePath)) '写入文件 @@ -886,7 +886,7 @@ Public Module ModBase ''' 是否将文件内容追加到当前文件,而不是覆盖它。 Public Sub WriteFile(FilePath As String, Content As Byte(), Optional Append As Boolean = False) '处理相对路径 - If Not FilePath.Contains(":\") Then FilePath = Path & FilePath + FilePath = ShortenPath(If(FilePath.Contains(":\"), FilePath, Path & FilePath)) '确保目录存在 Directory.CreateDirectory(GetPathFromFullPath(FilePath)) '写入文件 @@ -1294,11 +1294,11 @@ Re: ''' Public Sub ExtractFile(CompressFilePath As String, DestDirectory As String, Optional Encode As Encoding = Nothing, Optional ProgressIncrementHandler As Action(Of Double) = Nothing) - Directory.CreateDirectory(DestDirectory) + Directory.CreateDirectory(ShortenPath(DestDirectory)) If CompressFilePath.EndsWithF(".gz", True) Then '以 gz 方式解压 Dim stream As New GZipStream(New FileStream(CompressFilePath, FileMode.Open, FileAccess.ReadWrite), CompressionMode.Decompress) - Dim decompressedFile As New FileStream(DestDirectory & GetFileNameFromPath(CompressFilePath).ToLower.Replace(".tar", "").Replace(".gz", ""), FileMode.OpenOrCreate, FileAccess.Write) + Dim decompressedFile As New FileStream(ShortenPath(DestDirectory & GetFileNameFromPath(CompressFilePath).ToLower.Replace(".tar", "").Replace(".gz", "")), FileMode.OpenOrCreate, FileAccess.Write) Dim data As Integer = stream.ReadByte() While data <> -1 decompressedFile.WriteByte(data) @@ -1309,10 +1309,10 @@ Re: Else '以 zip 方式解压 Using Archive = ZipFile.Open(CompressFilePath, ZipArchiveMode.Read, If(Encode, Encoding.GetEncoding("GB18030"))) - Dim TotalCount As Integer = Archive.Entries.Count + Dim TotalCount As Long = Archive.Entries.Count For Each Entry As ZipArchiveEntry In Archive.Entries - If ProgressIncrementHandler IsNot Nothing Then ProgressIncrementHandler(1 / TotalCount) - Dim DestinationPath As String = IO.Path.Combine(DestDirectory, Entry.FullName) + If ProgressIncrementHandler IsNot Nothing AndAlso TotalCount > 0 Then ProgressIncrementHandler(1 / TotalCount) + Dim DestinationPath As String = ShortenPath(IO.Path.Combine(DestDirectory, Entry.FullName)) If DestinationPath.EndsWithF("\") OrElse DestinationPath.EndsWithF("/") Then Continue For '不创建空文件夹 Else @@ -1387,10 +1387,10 @@ RetryDir: ToPath = ToPath.Replace("/", "\") If Not ToPath.EndsWithF("\") Then ToPath &= "\" Dim AllFiles = EnumerateFiles(FromPath).ToList - Dim FileCount As Integer = AllFiles.Count + Dim FileCount As Long = AllFiles.Count For Each File In AllFiles CopyFile(File.FullName, File.FullName.Replace(FromPath, ToPath)) - If ProgressIncrementHandler IsNot Nothing Then ProgressIncrementHandler(1 / FileCount) + If ProgressIncrementHandler IsNot Nothing AndAlso FileCount > 0 Then ProgressIncrementHandler(1 / FileCount) Next End Sub ''' @@ -1449,22 +1449,8 @@ RetryDir: IsInner = True Loop - '常见错误(记得同时修改下面的) - Dim CommonReason As String = Nothing - If TypeOf InnerEx Is TypeLoadException OrElse TypeOf InnerEx Is BadImageFormatException OrElse TypeOf InnerEx Is MissingMethodException OrElse TypeOf InnerEx Is NotImplementedException OrElse TypeOf InnerEx Is TypeInitializationException Then - CommonReason = "PCL 的运行环境存在问题。请尝试重新安装 .NET Framework 4.6.2 然后再试。若无法安装,请先卸载较新版本的 .NET Framework,然后再尝试安装。" - ElseIf TypeOf InnerEx Is UnauthorizedAccessException Then - CommonReason = "PCL 的权限不足。请尝试右键 PCL,选择以管理员身份运行。" - ElseIf TypeOf InnerEx Is OutOfMemoryException Then - CommonReason = "你的电脑运行内存不足,导致 PCL 无法继续运行。请在关闭一部分不需要的程序后再试。" - ElseIf TypeOf InnerEx Is Runtime.InteropServices.COMException Then - CommonReason = "由于操作系统或显卡存在问题,导致出现错误。请尝试重启 PCL。" - ElseIf {"远程主机强迫关闭了", "远程方已关闭传输流", "未能解析此远程名称", "由于目标计算机积极拒绝", - "操作已超时", "操作超时", "服务器超时", "连接超时"}.Any(Function(s) DescList.Any(Function(l) l.Contains(s))) Then - CommonReason = "你的网络环境不佳,导致难以连接到服务器。请稍后重试,或使用 VPN 以改善网络环境。" - End If - '构造输出信息 + Dim CommonReason As String = AnalyzeCommonReason(InnerEx, DescList) If CommonReason Is Nothing Then Return DescList.Join(vbCrLf) Else @@ -1492,22 +1478,8 @@ RetryDir: DescList = DescList.Distinct.ToList Dim Desc As String = Join(DescList, vbCrLf & "→ ") - '常见错误(记得同时修改上面的) - Dim CommonReason As String = Nothing - If TypeOf InnerEx Is TypeLoadException OrElse TypeOf InnerEx Is BadImageFormatException OrElse TypeOf InnerEx Is MissingMethodException OrElse TypeOf InnerEx Is NotImplementedException OrElse TypeOf InnerEx Is TypeInitializationException Then - CommonReason = "PCL 的运行环境存在问题。请尝试重新安装 .NET Framework 4.6.2 然后再试。若无法安装,请先卸载较新版本的 .NET Framework,然后再尝试安装。" - ElseIf TypeOf InnerEx Is UnauthorizedAccessException Then - CommonReason = "PCL 的权限不足。请尝试右键 PCL,选择以管理员身份运行。" - ElseIf TypeOf InnerEx Is OutOfMemoryException Then - CommonReason = "你的电脑运行内存不足,导致 PCL 无法继续运行。请在关闭一部分不需要的程序后再试。" - ElseIf TypeOf InnerEx Is Runtime.InteropServices.COMException Then - CommonReason = "由于操作系统或显卡存在问题,导致出现错误。请尝试重启 PCL。" - ElseIf {"远程主机强迫关闭了", "远程方已关闭传输流", "未能解析此远程名称", "由于目标计算机积极拒绝", - "操作已超时", "操作超时", "服务器超时", "连接超时"}.Any(Function(s) Desc.Contains(s)) Then - CommonReason = "你的网络环境不佳,导致难以连接到服务器。请稍后重试,或使用 VPN 以改善网络环境。" - End If - '构造输出信息 + Dim CommonReason As String = AnalyzeCommonReason(InnerEx, DescList) If CommonReason IsNot Nothing Then Return CommonReason & "详细错误:" & DescList.First Else @@ -1515,6 +1487,24 @@ RetryDir: Return Join(DescList, " ← ") End If End Function + Private Function AnalyzeCommonReason(InnerEx As Exception, DescList As List(Of String)) As String + If TypeOf InnerEx Is TypeLoadException OrElse TypeOf InnerEx Is BadImageFormatException OrElse TypeOf InnerEx Is MissingMethodException OrElse TypeOf InnerEx Is NotImplementedException OrElse TypeOf InnerEx Is TypeInitializationException Then + Return "PCL 的运行环境存在问题。请尝试重新安装 .NET Framework 4.6.2 然后再试。若无法安装,请先卸载较新版本的 .NET Framework,然后再尝试安装。" + ElseIf TypeOf InnerEx Is UnauthorizedAccessException Then + Return "PCL 的权限不足。请尝试右键 PCL,选择以管理员身份运行。" + ElseIf TypeOf InnerEx Is OutOfMemoryException Then + Return "你的电脑运行内存不足,导致 PCL 无法继续运行。请在关闭一部分不需要的程序后再试。" + ElseIf TypeOf InnerEx Is Runtime.InteropServices.COMException Then + Return "由于操作系统或显卡存在问题,导致出现错误。请尝试重启 PCL。" + ElseIf TypeOf InnerEx Is SocketException AndAlso DescList.Any(Function(l) l.Contains("WSAStartup")) Then + Return "请尝试卸载中国移动云盘,然后再试。" + ElseIf {"远程主机强迫关闭了", "远程方已关闭传输流", "未能解析此远程名称", "由于目标计算机积极拒绝", + "操作已超时", "操作超时", "服务器超时", "连接超时"}.Any(Function(s) DescList.Any(Function(l) l.Contains(s))) Then + Return "你的网络环境不佳,导致难以连接到服务器。请稍后重试,或使用 VPN 以改善网络环境。" + Else + Return Nothing + End If + End Function ''' ''' 返回一个枚举对应的字符串。 @@ -1556,7 +1546,7 @@ RetryDir: Return JsonConvert.DeserializeObject(Data, New JsonSerializerSettings With {.DateTimeZoneHandling = DateTimeZoneHandling.Local}) Catch ex As Exception Dim Length As Integer = If(Data, "").Length - Throw New Exception("格式化 JSON 失败:" & If(Length > 2000, Data.Substring(0, 500) & $"...(全长 {Length} 个字符)..." & Right(Data, 500), Data)) + Throw New Exception("格式化 JSON 失败:" & If(Length > 2000, Data.Substring(0, 500) & $"...(全长 {Length} 个字符)..." & Right(Data, 500), Data), ex) End Try End Function @@ -2641,10 +2631,6 @@ Retry: ''' 相对增减控件的左边距。 ''' Public Sub DeltaLeft(control As FrameworkElement, newValue As Double) - '安全性检查 - DebugAssert(Not Double.IsNaN(newValue)) - DebugAssert(Not Double.IsInfinity(newValue)) - If TypeOf control Is Window Then '窗口改变 CType(control, Window).Left += newValue @@ -2656,8 +2642,6 @@ Retry: Case HorizontalAlignment.Right control.Margin = New Thickness(control.Margin.Left, control.Margin.Top, control.Margin.Right - newValue, control.Margin.Bottom) 'control.Margin = New Thickness(control.Margin.Left, control.Margin.Top, CType(control.Parent, Object).ActualWidth - control.ActualWidth - newValue, control.Margin.Bottom) - Case Else - DebugAssert(False) End Select End If End Sub @@ -2665,17 +2649,12 @@ Retry: ''' 设置控件的左边距。(仅针对置左控件) ''' Public Sub SetLeft(control As FrameworkElement, newValue As Double) - DebugAssert(control.HorizontalAlignment = HorizontalAlignment.Left) control.Margin = New Thickness(newValue, control.Margin.Top, control.Margin.Right, control.Margin.Bottom) End Sub ''' ''' 相对增减控件的上边距。 ''' Public Sub DeltaTop(control As FrameworkElement, newValue As Double) - '安全性检查 - DebugAssert(Not Double.IsNaN(newValue)) - DebugAssert(Not Double.IsInfinity(newValue)) - If TypeOf control Is Window Then '窗口改变 CType(control, Window).Top += newValue @@ -2687,11 +2666,8 @@ Retry: Case VerticalAlignment.Bottom control.Margin = New Thickness(control.Margin.Left, control.Margin.Top, control.Margin.Right, control.Margin.Bottom - newValue) 'control.Margin = New Thickness(control.Margin.Left, control.Margin.Top, CType(control.Parent, Object).ActualWidth - control.ActualWidth - newValue, control.Margin.Bottom) - Case Else - DebugAssert(False) End Select End If - 'If Double.IsNaN(newValue) OrElse Double.IsInfinity(newValue) Then Return '安全性检查 'Select Case control.VerticalAlignment ' Case VerticalAlignment.Top, VerticalAlignment.Stretch, VerticalAlignment.Center @@ -2705,7 +2681,6 @@ Retry: ''' 设置控件的顶边距。(仅针对置上控件) ''' Public Sub SetTop(control As FrameworkElement, newValue As Double) - DebugAssert(control.VerticalAlignment = VerticalAlignment.Top) control.Margin = New Thickness(control.Margin.Left, newValue, control.Margin.Right, control.Margin.Bottom) End Sub @@ -2989,6 +2964,13 @@ Retry: End If End Select + '上报 + If Level >= LogLevel.Hint Then + Telemetry("PCL 错误", + "Level", GetStringFromEnum(Level), + "Title", FilterUserName(FilterAccessToken(Title, "*"), "*"), + "Exception", FilterUserName(FilterAccessToken(Text, "*"), "*")) + End If End Sub ''' ''' 输出错误信息。 @@ -3055,6 +3037,13 @@ Retry: End If End Select + '上报 + If Level >= LogLevel.Hint Then + Telemetry("PCL 异常", + "Level", GetStringFromEnum(Level), + "Title", FilterUserName(FilterAccessToken(Title, "*"), "*"), + "Exception", FilterUserName(FilterAccessToken(ExFull, "*"), "*")) + End If End Sub '反馈 @@ -3091,9 +3080,23 @@ Retry: "文件位置:" & Path) End Sub - '断言 - Public Sub DebugAssert(Exp As Boolean) - If Not Exp Then Throw New Exception("断言命中") + '遥测 + Public Sub Telemetry([Event] As String, ParamArray Datas As String()) + If Not Setup.Get("SystemSystemTelemetry") Then Return '用户关闭了遥测 + If Not ClsBaseUrl.StartsWithF("http") Then Return '开源版没有设置遥测地址 + RunInNewThread( + Sub() + Try + Log($"[System] 匿名数据上报:{[Event]}") + Dim Url As String = $"{ClsBaseUrl}&Event={WebUtility.UrlEncode([Event])}" + For i = 0 To Datas.Length - 1 Step 2 + Url &= "&" & WebUtility.UrlEncode(Datas(i)) & "=" & WebUtility.UrlEncode(Datas(i + 1).Replace(vbCrLf, vbLf)) + Next + NetRequestByClient(Url, MakeLog:=False) + Catch + Log("[System] 匿名数据上报失败", LogLevel.Debug) + End Try + End Sub, "Telemetry", ThreadPriority.Lowest) End Sub '获取当前的堆栈信息 diff --git a/Plain Craft Launcher 2/Modules/Base/ModNet.vb b/Plain Craft Launcher 2/Modules/Base/ModNet.vb index a3dc0e8..6539356 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModNet.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModNet.vb @@ -22,9 +22,6 @@ Public Module ModNet Return If(Encoding, Encoding.UTF8).GetString(SendRequest(Url, Method, Content, HeaderDictionary, Timeout:=Timeout, Encoding:=Encoding, UseBrowserUserAgent:=UseBrowserUserAgent)) Catch ex As ThreadInterruptedException Throw - Catch ex As ResponsedWebException - If MakeLog Then Log(ex, "网络请求失败,返回内容为:" & vbCrLf & ex.Response, LogLevel.Developer) - Throw Catch ex As Exception If MakeLog Then Log(ex, "网络请求失败", LogLevel.Developer) Throw @@ -244,7 +241,10 @@ RequestFinished: If Response.IsSuccessStatusCode Then Return ResponseBytes Else - Throw New ResponsedWebException($"错误码 {Response.StatusCode} ({CInt(Response.StatusCode)}),{Method},{Url}", If(Encoding, Encoding.UTF8).GetString(ResponseBytes)) + Dim ResponseMessage = If(Encoding, Encoding.UTF8).GetString(ResponseBytes) + Throw New ResponsedWebException( + $"错误码 {Response.StatusCode} ({CInt(Response.StatusCode)}),{Method},{Url}" & + If(String.IsNullOrEmpty(ResponseMessage), "", vbCrLf & ResponseMessage), ResponseMessage) End If Catch ex As ThreadInterruptedException Throw @@ -807,7 +807,7 @@ StartSingleThreadDownload: '是否禁用多线程,以及规定碎片大小 Dim TargetUrl As String = GetSource().Url If TargetUrl.Contains("pcl2-server") OrElse TargetUrl.Contains("bmclapi") OrElse TargetUrl.Contains("github.com") OrElse - TargetUrl.Contains("optifine.net") OrElse TargetUrl.Contains("modrinth") Then Return Nothing + TargetUrl.Contains("optifine.net") OrElse TargetUrl.Contains("modrinth") OrElse TargetUrl.Contains("momot.rs") Then Return Nothing '寻找最大碎片 'FUTURE: 下载引擎重做,计算下载源平均链接时间和线程下载速度,按最高时间节省来开启多线程 Dim FilePieceMax As NetThread = Threads @@ -990,7 +990,8 @@ NotSupportRange: Th.DownloadDone += RealDataCount ResultStream.Write(ResponseBytes, 0, RealDataCount) '检查速度是否过慢 - If DeltaTime > 1500 AndAlso DeltaTime > RealDataCount Then '数据包间隔大于 1.5s,且速度小于 1.5K/s + If DeltaTime > 1500 AndAlso DeltaTime > RealDataCount AndAlso '数据包间隔大于 1.5s,且速度小于 1.5K/s + Th.Source.SingleThread Is Nothing Then '并非单线程下载 Throw New TimeoutException("由于速度过慢断开链接,下载 " & RealDataCount & " B,消耗 " & DeltaTime & " ms。") End If Th.LastReceiveTime = GetTimeTick() @@ -1027,7 +1028,8 @@ SourceBreak: End SyncLock '合并 If Not IsNoSplit Then ResultStream?.Dispose() - If ((FileSize >= 0 AndAlso DownloadDone >= FileSize) OrElse (FileSize = -1 AndAlso DownloadDone > 0)) AndAlso State < NetState.Merge Then Merge(Th) + If ((FileSize >= 0 AndAlso DownloadDone >= FileSize) OrElse (FileSize = -1 AndAlso DownloadDone > 0)) AndAlso + State < NetState.Merge AndAlso Th.State <> NetState.Error Then Merge(Th) End Try End Sub Private Sub SourceFail(Th As NetThread, ex As Exception, IsMergeFailure As Boolean) @@ -1069,7 +1071,7 @@ SourceBreak: '当前源失败,但还有下载源:正常地继续执行 ElseIf Not Retried AndAlso Sources.Count > 1 Then '合并失败或首次下载失败,未重试:将所有下载源重新标记为不允许断点续传的下载源,逐个重新尝试下载 - Log($"[Download] {LocalName}:文件下载失败,正在自动重试……", If(ModeDebug, LogLevel.Hint, LogLevel.Debug)) '在调试模式下给出红色提示 + Hint($"{LocalName}:文件下载失败,正在自动重试……", If(ModeDebug, HintType.Critical, HintType.Info)) '在调试模式下给出红色提示 Retried = True SyncLock LockSource SourcesOnce.Clear() @@ -1525,10 +1527,14 @@ Retry: '获取实际失败的文件 For Each File In Files If File.State <> NetState.Error Then Continue For + Dim Detail As String = Join(File.Sources.Select(Function(s) $"{If(s.Ex?.Message, "无错误信息。")}({s.Url})"), vbCrLf) [Error] = New Exception("文件下载失败:" & File.LocalPath & vbCrLf & - "各下载源的错误如下:" & vbCrLf & - Join(File.Sources.Select(Function(s) $"{If(s.Ex?.Message, "无错误信息。")}({s.Url})"), vbCrLf), + "各下载源的错误如下:" & vbCrLf & Detail, [Error]) + '上报 + Telemetry("文件下载失败", + "FileName", File.LocalName, + "Exception", Detail) Exit For Next '在设置 Error 对象后再更改为失败,避免 WaitForExit 无法捕获错误 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb index 2ed1744..9a5dd9a 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb @@ -2,7 +2,9 @@ '构造函数 Private TempFolder As String - Public Sub New(UUID As Integer) + Private TargetVersion As McVersion + Public Sub New(Optional TargetVersion As McVersion = Nothing) + Me.TargetVersion = TargetVersion '构建文件结构 TempFolder = RequestTaskTempFolder() Directory.CreateDirectory(TempFolder & "Temp\") @@ -508,7 +510,7 @@ Done: If LogMc.Contains("Couldn't set pixel format") Then AppendReason(CrashReason.显卡驱动不支持导致无法设置像素格式) If LogMc.Contains("java.lang.OutOfMemoryError") OrElse LogMc.Contains("an out of memory error") Then AppendReason(CrashReason.内存不足) If LogMc.Contains("java.lang.RuntimeException: Shaders Mod detected. Please remove it, OptiFine has built-in support for shaders.") Then AppendReason(CrashReason.ShadersMod与OptiFine同时安装) - If LogMc.Contains("java.lang.NoSuchMethodError: sun.security.util.ManifestEntryVerifier") Then AppendReason(CrashReason.低版本Forge与高版本Java不兼容) + If LogMc.Contains("java.lang.NoSuchMethodError: sun.security.util.ManifestEntryVerifier") OrElse LogMc.Contains("java.lang.NoSuchMethodError: 'void sun.security.util.ManifestEntryVerifier") Then AppendReason(CrashReason.低版本Forge与高版本Java不兼容) If LogMc.Contains("1282: Invalid operation") Then AppendReason(CrashReason.光影或资源包导致OpenGL1282错误) If LogMc.Contains("signer information does not match signer information of other classes in the same package") Then AppendReason(CrashReason.文件或内容校验失败, If(RegexSeek(LogMc, "(?<=class "")[^']+(?=""'s signer information)"), "").TrimEnd(vbCrLf)) If LogMc.Contains("Maybe try a lower resolution resourcepack?") Then AppendReason(CrashReason.材质过大或显卡配置不足) @@ -856,12 +858,13 @@ NextStack: ''' ''' 弹出崩溃弹窗,并指导导出崩溃报告。 ''' - Public Sub Output(IsHandAnalyze As Boolean, Optional ExtraFiles As List(Of String) = Nothing) + Public Sub Output(IsManualAnalyze As Boolean, Optional ExtraFiles As List(Of String) = Nothing) '弹窗提示 FrmMain.ShowWindowToTop() - Select Case MyMsgBox(GetAnalyzeResult(IsHandAnalyze), If(IsHandAnalyze, "错误报告分析结果", "Minecraft 出现错误"), - "确定", If(IsHandAnalyze OrElse DirectFile Is Nothing, "", "查看日志"), If(IsHandAnalyze, "", "导出错误报告"), - Button2Action:=If(IsHandAnalyze OrElse DirectFile Is Nothing, Nothing, + Dim Detail As String = GetAnalyzeResult(IsManualAnalyze) + Select Case MyMsgBox(Detail, If(IsManualAnalyze, "错误报告分析结果", "Minecraft 出现错误"), + "确定", If(IsManualAnalyze OrElse DirectFile Is Nothing, "", "查看日志"), If(IsManualAnalyze, "", "导出错误报告"), + Button2Action:=If(IsManualAnalyze OrElse DirectFile Is Nothing, Nothing, Sub() '弹窗选择:查看日志 If File.Exists(DirectFile.Value.Key) Then @@ -918,6 +921,11 @@ NextStack: End Try OpenExplorer(FileAddress) End Select + '上报 + If IsManualAnalyze Then Return + Telemetry("Minecraft 崩溃", + "Version", If(TargetVersion Is Nothing, "null", TargetVersion.Version.ToString), + "Detail", FilterUserName(Detail, "*")) End Sub ''' ''' 获取崩溃分析的结果描述。 @@ -1102,7 +1110,7 @@ NextStack: If(Not Results.Any(Function(r) r.EndsWithF("\h")) OrElse IsHandAnalyze, "", vbCrLf & "如果要寻求帮助,请把错误报告文件发给对方,而不是发送这个窗口的照片或者截图。" & If(If(PageSetupSystem.IsLauncherNewest(), True), "", - vbCrLf & vbCrLf & "此外,你正在使用老版本 PCL,更新 PCL 或许也能解决这个问题。" & vbCrLf & "你可以点击 设置 → 启动器 → 检查更新 来更新 PCL。")) + vbCrLf & vbCrLf & "此外,你正在使用老版本 PCL,更新 PCL 或许也能解决这个问题。" & vbCrLf & "你可以点击 [设置 → 其他 → 启动器 → 检查更新] 更新 PCL。")) End Function End Class diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index f2f9923..e6d517e 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -594,7 +594,7 @@ VersionName = Version Me.Version = New Version(Version) Me.Inherit = Inherit - FileVersion = Version & If(Branch Is Nothing, "", "-" & Branch) + FileVersion = Version & If(Branch Is Nothing, "", "-" & Branch) End Sub End Class @@ -1106,26 +1106,27 @@ Public Function DlModRequest(Url As String, Optional Method As HttpMethod = Nothing, Optional Content As String = Nothing, Optional ContentType As String = Nothing) As JToken Dim Urls As New List(Of KeyValuePair(Of String, Integer)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10)) '至少 10s,要不然有时候远端服务器来不及完成 - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) - 'Dim McimUrl As String = DlSourceModGet(Url) - 'If McimUrl <> Url Then - ' Select Case Setup.Get("ToolDownloadMod") - ' Case 0 - ' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10)) - ' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30)) - ' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) - ' Case 1 - ' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10)) - ' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10)) - ' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) - ' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30)) - ' Case Else - ' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10)) - ' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) - ' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30)) - ' End Select - 'End If + Dim McimUrl As String = DlSourceModGet(Url) + If McimUrl <> Url Then + Select Case Setup.Get("ToolDownloadMod") + Case 0 + Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10)) + Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10)) + Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) + Case 1 + Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10)) '至少 10s,要不然有时候远端服务器来不及完成 + Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10)) + Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) + Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30)) + Case Else + Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10)) + Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) + Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30)) + End Select + Else + Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10)) + Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) + End If Dim Exs As String = "" For Each Source In Urls Try @@ -1232,7 +1233,14 @@ 'Mod 下载源 Public Function DlSourceModGet(Original As String) As String - Return Original + Return Original. + Replace("api.modrinth.com", "mod.mcimirror.top/modrinth"). + Replace("staging-api.modrinth.com", "mod.mcimirror.top/modrinth"). + Replace("cdn.modrinth.com", "mod.mcimirror.top"). + Replace("api.curseforge.com", "mod.mcimirror.top/curseforge"). + Replace("edge.forgecdn.net", "mod.mcimirror.top"). + Replace("mediafilez.forgecdn.net", "mod.mcimirror.top"). + Replace("media.forgecdn.net", "mod.mcimirror.top") End Function 'Loader 自动切换 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb index f682f62..f9cbe79 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb @@ -66,7 +66,7 @@ Public Module ModLaunch ''' Public Sub McLaunchLog(Text As String) Text = FilterUserName(FilterAccessToken(Text, "*"), "*") - RunInUi(Sub() FrmLaunchRight.LabLog.Text += vbCrLf & "[" & GetTimeNow() & "] " & Text) + RunInUi(Sub() FrmLaunchRight.LabLog.Text += $"{vbCrLf}[{GetTimeNow()}] {Text}") Log("[Launch] " & Text) End Sub @@ -101,6 +101,8 @@ Public Module ModLaunch If Not ex.Message.StartsWithF("$$") Then Hint(ex.Message, HintType.Critical) Throw End Try + Dim IsSavingBatch As Boolean = CurrentLaunchOptions?.SaveBatch IsNot Nothing + '正式加载 Try '构造主加载器 @@ -145,9 +147,15 @@ Public Module ModLaunch Select Case LaunchLoader.State Case LoadState.Finished Hint(McVersionCurrent.Name & " 启动成功!", HintType.Finish) + '上报 + If Not IsSavingBatch Then + Telemetry("Minecraft 启动成功", + "Version", McVersionCurrent.Version.ToString, + "LoginType", GetStringFromEnum(CType(Setup.Get("LoginType"), McLoginType))) + End If Case LoadState.Aborted If AbortHint Is Nothing Then - Hint(If(CurrentLaunchOptions?.SaveBatch Is Nothing, "已取消启动!", "已取消导出启动脚本!"), HintType.Info) + Hint(If(IsSavingBatch, "已取消导出启动脚本!", "已取消启动!"), HintType.Info) Else Hint(AbortHint, HintType.Finish) End If @@ -162,7 +170,7 @@ NextInner: If CurrentEx.Message.StartsWithF("$") Then '若有以 $ 开头的错误信息,则以此为准显示提示 '若错误信息为 $$,则不提示 - If Not CurrentEx.Message = "$$" Then MyMsgBox(CurrentEx.Message.TrimStart("$"), If(CurrentLaunchOptions?.SaveBatch Is Nothing, "启动失败", "导出启动脚本失败")) + If Not CurrentEx.Message = "$$" Then MyMsgBox(CurrentEx.Message.TrimStart("$"), If(IsSavingBatch, "导出启动脚本失败", "启动失败")) Throw ElseIf CurrentEx.InnerException IsNot Nothing Then '检查下一级错误 @@ -172,8 +180,15 @@ NextInner: '没有特殊处理过的错误信息 McLaunchLog("错误:" & GetExceptionDetail(ex)) Log(ex, - If(CurrentLaunchOptions?.SaveBatch Is Nothing, "Minecraft 启动失败", "导出启动脚本失败"), LogLevel.Msgbox, - If(CurrentLaunchOptions?.SaveBatch Is Nothing, "启动失败", "导出启动脚本失败")) + If(IsSavingBatch, "导出启动脚本失败", "Minecraft 启动失败"), LogLevel.Msgbox, + If(IsSavingBatch, "导出启动脚本失败", "启动失败")) + '上报 + If Not IsSavingBatch Then + Telemetry("Minecraft 启动失败", + "Version", McVersionCurrent.Version.ToString, + "LoginType", GetStringFromEnum(CType(Setup.Get("LoginType"), McLoginType)), + "Exception", FilterUserName(FilterAccessToken(GetExceptionDetail(ex), "*"), "*")) + End If Throw End If End Try @@ -891,9 +906,9 @@ Retry: ContentType:="application/x-www-form-urlencoded", Headers:={{"Accept-Language", "en-US,en;q=0.5"}, {"X-Requested-With", "XMLHttpRequest"}}, ThreadCount:=2) - Catch ex As Exception - If ex.Message.ContainsF("must sign in again", True) OrElse ex.Message.ContainsF("password expired", True) OrElse - (ex.Message.Contains("refresh_token") AndAlso ex.Message.Contains("is not valid")) Then '#269 + Catch ex As ResponsedWebException + If ex.Response.ContainsF("must sign in again", True) OrElse ex.Response.ContainsF("password expired", True) OrElse + (ex.Response.Contains("refresh_token") AndAlso ex.Response.Contains("is not valid")) Then '#269 Return {"Relogin", ""} Else Throw @@ -942,20 +957,20 @@ Retry: Try Result = NetRequestByClientMultiple("https://xsts.auth.xboxlive.com/xsts/authorize", HttpMethod.Post, Content:=Request, ContentType:="application/json") - Catch ex As Net.WebException + Catch ex As ResponsedWebException '参考 https://github.com/PrismarineJS/prismarine-auth/blob/master/src/common/Constants.js - If ex.Message.Contains("2148916227") Then + If ex.Response.Contains("2148916227") Then MyMsgBox("该账号似乎已被微软封禁,无法登录。", "登录失败", "我知道了", IsWarn:=True) Throw New Exception("$$") - ElseIf ex.Message.Contains("2148916233") Then + ElseIf ex.Response.Contains("2148916233") Then If MyMsgBox("你尚未注册 Xbox 账户,请在注册后再登录。", "登录提示", "注册", "取消") = 1 Then OpenWebsite("https://signup.live.com/signup") End If Throw New Exception("$$") - ElseIf ex.Message.Contains("2148916235") Then + ElseIf ex.Response.Contains("2148916235") Then MyMsgBox($"你的网络所在的国家或地区无法登录微软账号。{vbCrLf}请使用加速器或 VPN。", "登录失败", "我知道了") Throw New Exception("$$") - ElseIf ex.Message.Contains("2148916238") Then + ElseIf ex.Response.Contains("2148916238") Then If MyMsgBox("该账号年龄不足,你需要先修改出生日期,然后才能登录。" & vbCrLf & "该账号目前填写的年龄是否在 13 岁以上?", "登录提示", "13 岁以上", "12 岁以下", "我不知道") = 1 Then OpenWebsite("https://account.live.com/editprof.aspx") @@ -1364,13 +1379,13 @@ Retry: McLaunchLog("新版 Game 参数获取成功") End If '编码参数(#4700、#5892、#5909) + If McLaunchJavaSelected.VersionCode >= 18 Then 'Dfile.encoding 需要放在 Dstdout.encoding 后面(#6934) + If Not Arguments.Contains("-Dfile.encoding=") Then Arguments = "-Dfile.encoding=COMPAT " & Arguments + End If If McLaunchJavaSelected.VersionCode > 8 Then If Not Arguments.Contains("-Dstdout.encoding=") Then Arguments = "-Dstdout.encoding=UTF-8 " & Arguments If Not Arguments.Contains("-Dstderr.encoding=") Then Arguments = "-Dstderr.encoding=UTF-8 " & Arguments End If - If McLaunchJavaSelected.VersionCode >= 18 Then - If Not Arguments.Contains("-Dfile.encoding=") Then Arguments = "-Dfile.encoding=COMPAT " & Arguments - End If 'MJSB Arguments = Arguments.Replace(" -Dos.name=Windows 10", " -Dos.name=""Windows 10""") '全屏 @@ -1692,7 +1707,7 @@ NextVersion: GameArguments.Add("${access_token}", McLoginLoader.Output.AccessToken) GameArguments.Add("${auth_session}", McLoginLoader.Output.AccessToken) GameArguments.Add("${user_type}", "msa") '#1221 - GameArguments.Add("${primary_jar}", Version.Path & Version.Name & ".jar") + GameArguments.Add("${primary_jar}", Version.Path & Version.Name & ".jar") '#6942 '窗口尺寸参数 Dim GameSize As Size diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb index 422cf67..6c11868 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb @@ -989,7 +989,7 @@ ExitDataLoad: If ToString = "" Then Return "原版 " & McName Else - Return McName & ToString & If(ModeDebug, " (" & SortCode & "#)", "") + Return McName & ToString End If End Function @@ -2415,7 +2415,7 @@ NextEntry: Public Function FilterUserName(Raw As String, FilterChar As Char) As String If Raw.Contains(":\Users\") Then For Each Token In RegexSearch(Raw, "(?<=:\\Users\\)[^\\]+") - Raw = Raw.Replace(Token, New String(FilterChar, Token.Count)) + Raw = Raw.Replace("\" & Token, "\" & New String(FilterChar, Token.Count)) Next End If Return Raw diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModWatcher.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModWatcher.vb index 54ce14b..c4f08a4 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModWatcher.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModWatcher.vb @@ -349,14 +349,14 @@ State = MinecraftState.Crashed '崩溃分析 WatcherLog("Minecraft 已崩溃,将在 2 秒后开始崩溃分析") - Hint("检测到 Minecraft 出现错误,错误分析已开始……") + Hint("检测到 Minecraft 出现错误,错误分析已开始……", HintType.Critical) FeedbackInfo() RunInNewThread( Sub() Try Thread.Sleep(2000) WatcherLog("崩溃分析开始") - Dim Analyzer As New CrashAnalyzer(PID) + Dim Analyzer As New CrashAnalyzer(Version) Analyzer.Collect(Version.PathIndie, LatestLog.ToList) Analyzer.Prepare() Analyzer.Analyze(Version) diff --git a/Plain Craft Launcher 2/Modules/ModEvent.vb b/Plain Craft Launcher 2/Modules/ModEvent.vb index e6bd0ec..87e9bf5 100644 --- a/Plain Craft Launcher 2/Modules/ModEvent.vb +++ b/Plain Craft Launcher 2/Modules/ModEvent.vb @@ -116,11 +116,8 @@ End Try Case "修改设置" - If Setup.IsEncoded(Data(0)) Then - Throw New Exception($"无法修改受加密保护的设置:{Data(0)}") - End If Setup.Set(Data(0), Data(1)) - Hint("已修改设置!", HintType.Finish) + Hint($"已写入设置:{Data(0)} → {Data(1)}", HintType.Finish) Case Else MyMsgBox("未知的事件类型:" & Type & vbCrLf & "请检查事件类型填写是否正确,或者 PCL 是否为最新版本。", "事件执行失败") diff --git a/Plain Craft Launcher 2/Modules/ModSecret.vb b/Plain Craft Launcher 2/Modules/ModSecret.vb index c690527..00635bb 100644 --- a/Plain Craft Launcher 2/Modules/ModSecret.vb +++ b/Plain Craft Launcher 2/Modules/ModSecret.vb @@ -12,6 +12,8 @@ Friend Module ModSecret Public OAuthClientId As String = If(Environment.GetEnvironmentVariable("PCL_MS_CLIENT_ID"), "") 'CurseForge API Key Public CurseForgeAPIKey As String = If(Environment.GetEnvironmentVariable("PCL_CURSEFORGE_API_KEY"), "") + '用于匿名数据收集的腾讯云日志服务上报 URL,形如 https://{region}.cls.tencentcs.com/track?topic_id={topic_id} + Public Const ClsBaseUrl As String = "" Friend Sub SecretOnApplicationStart() '提升 UI 线程优先级 diff --git a/Plain Craft Launcher 2/Modules/ThirdParty/DragHelper.vb b/Plain Craft Launcher 2/Modules/ThirdParty/DragHelper.vb index ff950c4..e2d79e7 100644 --- a/Plain Craft Launcher 2/Modules/ThirdParty/DragHelper.vb +++ b/Plain Craft Launcher 2/Modules/ThirdParty/DragHelper.vb @@ -137,7 +137,7 @@ Public Class DragHelper Dim fileCount As UInteger = DragQueryFile(wParam, UInteger.MaxValue, Nothing, 0) ReDim dropFilePaths(CInt(fileCount) - 1) - For i As UInteger = 0 To fileCount - 1 + For i As UInteger = 0 To CInt(fileCount) - 1 Dim sb As New StringBuilder(MAX_PATH) Dim result As UInteger = DragQueryFile(wParam, i, sb, sb.Capacity) If result > 0 Then dropFilePaths(i) = sb.ToString() diff --git a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb index 407176a..c257a02 100644 --- a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb +++ b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb @@ -51,6 +51,6 @@ Imports System.Runtime.InteropServices ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 ' 方法是按如下所示使用“*” - - + + diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb index 3ab15d6..f22dcc2 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb @@ -243,19 +243,21 @@ If Not IsNothing(PageNew) AndAlso Not IsNothing(PageNew.Parent) Then PageNew.SetValue(ContentPresenter.ContentProperty, Nothing) If Anim Then '动画 - Dispatcher.Invoke(Sub() - '执行动画 - AniStart({ - AaOpacity(PanLogin, -PanLogin.Opacity, 100,, New AniEaseOutFluent), - AaCode(Sub() - AniControlEnabled += 1 - PanLogin.Children.Clear() - PanLogin.Children.Add(PageNew) - AniControlEnabled -= 1 - End Sub, 100), - AaOpacity(PanLogin, 1, 100, 120, New AniEaseInFluent) - }, "FrmLogin PageChange") - End Sub, Threading.DispatcherPriority.Render) + Dispatcher.Invoke( + Sub() + '执行动画 + AniStart({ + AaOpacity(PanLogin, -PanLogin.Opacity, 100,, New AniEaseOutFluent), + AaCode( + Sub() + AniControlEnabled += 1 + PanLogin.Children.Clear() + PanLogin.Children.Add(PageNew) + AniControlEnabled -= 1 + End Sub, 100), + AaOpacity(PanLogin, 1, 100, 120, New AniEaseInFluent) + }, "FrmLogin PageChange") + End Sub, Threading.DispatcherPriority.Render) Else '无动画 AniControlEnabled += 1 diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb index 4591213..b3323fe 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb @@ -93,7 +93,7 @@ Download: GoTo Download Case 3 Log("[Page] 主页预设:简单主页") - Url = "https://raw.gitcode.com/mfn233/PCL-Mainpage/raw/main/Custom.xaml" + Url = "https://pclhomeplazaoss.lingyunawa.top:26994/d/Homepages/MFn233/Custom.xaml" GoTo Download Case 4 Log("[Page] 主页预设:每日整合包推荐") @@ -129,7 +129,7 @@ Download: GoTo Download Case 12 Log("[Page] 主页预设:PCL GitHub 仪表盘") - Url = "https://raw.gitcode.com/Deep-Dark-Forest/PCL2-GitHub-Dashboard-Homepage/raw/main/custom.xaml" + Url = "https://ddf.pcl-community.org/Custom.xaml" GoTo Download End Select End Select diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml index f872639..784edbf 100644 --- a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml +++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml @@ -1,492 +1,451 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb index 10c4f07..13e7a3f 100644 --- a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb @@ -18,12 +18,6 @@ End Sub - Private Sub BtnAboutBmclapi_Click(sender As Object, e As EventArgs) Handles BtnAboutBmclapi.Click - OpenWebsite("https://afdian.com/a/bangbang93") - End Sub - Private Sub BtnAboutWiki_Click(sender As Object, e As EventArgs) Handles BtnAboutWiki.Click - OpenWebsite("https://www.mcmod.cn") - End Sub Public Shared Sub CopyUniqueAddress() Handles BtnDonateCopy.Click ClipboardSet(UniqueAddress) End Sub diff --git a/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb b/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb index 39fd0a3..7e28d54 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb @@ -41,6 +41,7 @@ {"SystemSystemCache", New SetupEntry("", Source:=SetupSource.Registry)}, {"SystemSystemUpdate", New SetupEntry(0)}, {"SystemSystemActivity", New SetupEntry(0)}, + {"SystemSystemTelemetry", New SetupEntry(True, Source:=SetupSource.Registry)}, {"CacheExportConfig", New SetupEntry("", Source:=SetupSource.Registry)}, {"CacheSavedPageUrl", New SetupEntry("", Source:=SetupSource.Registry)}, {"CacheSavedPageVersion", New SetupEntry("", Source:=SetupSource.Registry)}, @@ -123,7 +124,7 @@ {"ToolDownloadTranslateV2", New SetupEntry(1, Source:=SetupSource.Registry)}, {"ToolDownloadIgnoreQuilt", New SetupEntry(True, Source:=SetupSource.Registry)}, {"ToolDownloadCert", New SetupEntry(False, Source:=SetupSource.Registry)}, - {"ToolDownloadMod", New SetupEntry(1, Source:=SetupSource.Registry)}, + {"ToolDownloadMod", New SetupEntry(2, Source:=SetupSource.Registry)}, {"ToolModLocalNameStyle", New SetupEntry(0, Source:=SetupSource.Registry)}, {"ToolUpdateAlpha", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)}, {"ToolUpdateRelease", New SetupEntry(False, Source:=SetupSource.Registry)}, @@ -356,13 +357,6 @@ Return Not HasIniKey(Version.Path & "PCL\Setup.ini", Key) End Select End Function - ''' - ''' 某个设置项是否加密。 - ''' - Public Function IsEncoded(Key As String) As Boolean - If Not SetupDict.ContainsKey(Key) Then Throw New KeyNotFoundException("未找到设置项:" & Key) With {.Source = Key} - Return SetupDict(Key).Encoded - End Function ''' ''' 读取设置。 diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml index 4bbbd5e..82c7e31 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml @@ -242,7 +242,7 @@ - + + + - - - + + @@ -79,13 +81,13 @@ - - + - @@ -109,7 +111,7 @@ - + @@ -124,6 +126,7 @@ + @@ -145,7 +148,10 @@ - + + @@ -155,7 +161,7 @@ - + diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb index 76776f3..7ead8ef 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb @@ -35,7 +35,7 @@ 'Mod 与整合包 ComboDownloadTranslateV2.SelectedIndex = Setup.Get("ToolDownloadTranslateV2") - 'ComboDownloadMod.SelectedIndex = Setup.Get("ToolDownloadMod") + ComboDownloadMod.SelectedIndex = Setup.Get("ToolDownloadMod") ComboModLocalNameStyle.SelectedIndex = Setup.Get("ToolModLocalNameStyle") CheckDownloadIgnoreQuilt.Checked = Setup.Get("ToolDownloadIgnoreQuilt") @@ -50,6 +50,7 @@ ComboSystemUpdate.SelectedIndex = Setup.Get("SystemSystemUpdate") ComboSystemActivity.SelectedIndex = Setup.Get("SystemSystemActivity") TextSystemCache.Text = Setup.Get("SystemSystemCache") + CheckSystemTelemetry.Checked = Setup.Get("SystemSystemTelemetry") '调试选项 CheckDebugMode.Checked = Setup.Get("SystemDebugMode") @@ -81,6 +82,7 @@ Setup.Reset("SystemSystemCache") Setup.Reset("SystemSystemUpdate") Setup.Reset("SystemSystemActivity") + Setup.Reset("SystemSystemTelemetry") Log("[Setup] 已初始化启动器页设置") Hint("已初始化启动器页设置!", HintType.Finish, False) @@ -92,13 +94,13 @@ End Sub '将控件改变路由到设置改变 - Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckDebugMode.Change, CheckDebugDelay.Change, CheckDebugSkipCopy.Change, CheckUpdateRelease.Change, CheckUpdateSnapshot.Change, CheckHelpChinese.Change, CheckDownloadIgnoreQuilt.Change, CheckDownloadCert.Change + Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckDebugMode.Change, CheckDebugDelay.Change, CheckDebugSkipCopy.Change, CheckUpdateRelease.Change, CheckUpdateSnapshot.Change, CheckHelpChinese.Change, CheckDownloadIgnoreQuilt.Change, CheckDownloadCert.Change, CheckSystemTelemetry.Change If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked) End Sub Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderDebugAnim.Change, SliderDownloadThread.Change, SliderDownloadSpeed.Change If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value) End Sub - Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboDownloadVersion.SelectionChanged, ComboModLocalNameStyle.SelectionChanged, ComboDownloadTranslateV2.SelectionChanged, ComboSystemUpdate.SelectionChanged, ComboSystemActivity.SelectionChanged, ComboDownloadSource.SelectionChanged + Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboDownloadVersion.SelectionChanged, ComboModLocalNameStyle.SelectionChanged, ComboDownloadTranslateV2.SelectionChanged, ComboSystemUpdate.SelectionChanged, ComboSystemActivity.SelectionChanged, ComboDownloadSource.SelectionChanged, ComboDownloadMod.SelectionChanged If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex) End Sub Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextSystemCache.ValidatedTextChanged diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml index 67171b6..977fdcf 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml @@ -211,7 +211,7 @@ - + - + \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb index 6b07ace..6beeaf3 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb @@ -355,6 +355,15 @@ PreFin: #Region "服务器" + '自动替换标点 + Private Sub TextServerEnter_Change() Handles TextServerEnter.TextChanged + Dim NewText = TextServerEnter.Text.Replace(":", ":").Replace("。", ".") + If NewText = TextServerEnter.Text Then Return + Dim CurrentPosition = TextServerEnter.SelectionStart '重设焦点 + TextServerEnter.Text = NewText + TextServerEnter.SelectionStart = CurrentPosition + End Sub + '全局 Private ComboServerLoginLast As Integer Private Sub ComboServerLogin_Changed() Handles ComboServerLogin.SelectionChanged, TextServerNide.ValidatedTextChanged, TextServerAuthServer.ValidatedTextChanged, TextServerAuthRegister.ValidatedTextChanged @@ -399,9 +408,6 @@ PreFin: TextServerAuthName.Text = "LittleSkin 登录" End Sub - Private Shared Sub TextServerEnter_Change(sender As MyTextBox, e As Object) Handles TextServerEnter.LostFocus - sender.Text = sender.Text.Replace(":", ":") - End Sub #End Region #Region "Java 选择" diff --git a/Plain Craft Launcher 2/Resources/Custom.xaml b/Plain Craft Launcher 2/Resources/Custom.xaml index a2459db..c171293 100644 --- a/Plain Craft Launcher 2/Resources/Custom.xaml +++ b/Plain Craft Launcher 2/Resources/Custom.xaml @@ -138,6 +138,10 @@ Text="· 下载版本:切换到 EventData 对应的 Minecraft 下载页面"/> + + diff --git a/Plain Craft Launcher 2/Resources/Help.zip b/Plain Craft Launcher 2/Resources/Help.zip index 8936ebe3836239785450bfcd4a04c0f618fa1f66..224f7d5666d329d2c1c5cce6f766bb20f00518e9 100644 GIT binary patch delta 38863 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 delta 38698 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 CR-qvP9@!|tONt~_hqc#_ z+la6gJCjb)D5os3X&+cCBSYrG!@3oFaxr6r{24n^PCq5PMnZVmEp}X_?&ZwE|Be5v zk!=d{+$jMg1VCCR6GIgyvcOb!Q2Gz<&-!m)E|hebbONU*NLX_xHWy`XEZJiJVIu;$ z@!}9g-HyDN5_Q{4*xdC)C|J^2u@u(PZH^myPRr?P-6aaIQPxwgohQ=>JSJV_5~tsp z>#UZo()D2v<`Jq>`*aCo5uUB5v^CIsA|JtV(-}lc=76(GPo9Oqz)}I`fTaXUEe7_VJ7JQ;bQa<|oY?^Xq`oVe` zDd2K_DWDR+N*sa&|MV{mrIE}}tTE|Ttiib;^R+sGIO07`oijn)A>@UjbE3mVp#1VED~@?SYV|xm;{70~88jb&6C|Y_EN-jI)ji2nSS)bE-9k zUwKGBh@1x@ZdBv*1NG$L8_0}{`zfRj7qRBxjeutF*pB_2w#a>ZQZ9=9+!Y@a;Twb{G@^!i$w;ER27$t~;G;Y>w9-8PTu76HvDHnso|zdk%^8hF*#uUDF?^ zIsk1^TKLhc)~3f@a=T~FB2E&io5XLk^tsochmt3hb|KzO6QU(N_`5-D*FT5vD%PVL zS1lpdXOdQ5%ZoX@GM;v~bt=1~Uy8M^YTds|is0s?x~JhYD=Xlt>KDp!RfONmcV1&6 zrX!na{_ygFBSW%v(Yt4>wr$q_;FGTb_yO#NJcC3cg57dKdHTNoi(`0GSy)21Kc7A< z-zWoNe4l1Y_G=^`O_Cq~GS%sd&b7<_JU^v2Xu8u6gJ6#k@C}lpQ4e3-!b7G|AeW}F{Q|elS+)(obV8emIF;p9|N2P zk*$B(a1c{ca@{%bi*C)ViYYr1rhBgKh>FRK z)36xeNq2J7bC})i3u&xM2#E26VoCQzzld=}e~awR3WlB!7Sj7ts=?(x+eg5lR9;=M zZcoihm8S3MwQ*n&(cDKytiECXM-51MK%HS_8FL~23#n|PmWUX6=gU?d=9R17u9@~A zAmSP$?Xj8g5C5w{Y*XPE2Y#$he~$7-OMcA~00>Dc%JpEl{+5!1U+O9%3d(ur@3N{@?XoUTr6uo^6v6!sUI#i0H(jzke8PqEuu44HzAVA2HWJV+Dg zJ}cuL8e!r6p(j;ajpijeE)l?jIm4o=5vhpSaWiS7j6CL3yjt`tDTsx3%HrH3+$FG6 zh(pUD{e=22My|30=s(nU#GF_ni6}l#S*lh>+MZSW2DFE+oyfF360(bDoTm4d_alB2 z`i&&6##KBWAA9A zxnTI(+L5-~Cw23&d>p_a?@yB0NP_n8yl}E3x^Q80*44`h{vt08 z0~h!14*M1Uk1s#}j_K8MrNNvBO!Re~@L!<%AR1Pv)3TvJXote^y?Lt^j2N=TE0{c?mD zCEVE^M|5Ie2rkY~&RL4iSm_kCxlpJDnTr<6&@a3s5fia}D;`poBw|UjN-Cxuvp~8# zSKQLU3?HemDFcaxmN9t=O zoNfO7JJtrXc2m9vG@>T;9XuHczxM5j!C`^X6AU;e41a!-+Rfjo0mgC5 zjpPm)GeYJSI;!I5i~gN+p1qGbOTZ#JP5>Sc1&wuQ+b5i)VQ+0Q>RJn^vP9+TZa{BM z4Qoc?@Nt@^qkD9v+%v5Ysyk$6MKQo@J%%HMo;eL{oB!S+`Dg9g?CGm{X zw|6Gt6i{T~e}ce#Q-=c_LI+6~BJzOqvZ(3pS)889@-;O}z*fbW;D~+XZEuuLq$KkA zec7V?gM1_?yLxDsU>ZD_N4>681khrdWE8wYH?9ZZ-4wnIzjhq-A<#(g>|S$HnL0vx z;O75b8jFYX+K-`M@)L&ha^s@?{9hqF1kB!pb{&uT-nu10MWL3!)w` zPwPBmYE+6m+U`wescsGjZ9P9Rqiof`+(Iu1)!2_iy|A@PXsrD~`dwl)FuGq0GkooO^*L=BXBymH9cz1AgfPLC*A+2|e(zPn$y^rJn)SC$ z;i%(G_S>@vd9N8#q=@lA0*X4pG?nyTg)Q)G#m@%wYb_TAvPI6g0^#ULD40Qj-Up@{ z6$Z+w_TAdMaKvA{sHQ~ogc|6=s7j#Xa7uu0!mF3PNifBj!+0-BXfC$20CxjDboU0@ z`J{;~PDdz;DWz=|vnlh+5oaCILK=iGaha&h)su)L0ji%dm}VFk0N9Ue9PHL(k=}M* zPF^f<1!kJFd zM%SMS(v{5-^N0-rK%KD_vXHP$YnNevL&M!@dTWZ!6*r+F z1tO@XkiJw+n^RYhgLb2#HhX`AWGKF3jVQ6s{ZHr7co5=HdnIVbHnGC zb&46|~#dsR^KrrF!$DXi0m_Mttbo>J(H0^!o7zz*rNYTe8 zAo6Qqea#=yZdkuX${q1R6~Y!NC9K?RXS*IAjg8WM-RV@Ii8UughY-xVn+6t&k}BqI zMn0if^D3|ad{s!x+s3?;IH#FgI}Zd^z|{;blu{DPjN$O`6I#fvJxrZrG1c`GlOiyc zWrT-6Z&o+OQOF<$ z813myFyM|JrAT-WdbQY1&$4S!BC<=>FzG3?^+-xqi2hUYw`Q(-wqz*0#ejXL5zH@M z70E>h?A{cU?jV~=qg#C*!VA)cN3qsw+`Tb=Mm1&CHMhO*d+Pl5Z?tJ?1@{T! zpqiHAqm)5KrI3gj6G_@eiK~wglotjLH85cTBBO{f*e+kscckCBttY7#oh*!_oi6;D zH1>A;r?URN%u*?6rPS01wzXZX==FST$4zh4Z0aTONYSh@?_;3wc7v0(Rv+nJrfijo z`0%)YbJ^WpDhH13C3a-k$@M3Cjp*q*kLl8A>wv?=+N@AbXDjPSW?*BTQecXUp$qE) zIbD3+&< za4)U}8Fpo&sl`8d7q7mRcQVW*dh!u%z_$ejRj7MZA-*MDr|b{&QJ^!u>A6UxtT(M+ zr3EcLCzT*3bU*Qib<iwoLy3XtC~5wymJJ8|*?Bgz zHv>Vn?{~2!O?6RToPbf*)MC5|q$*~EO%?+NZ|+}CY-!cYEl6n^P2YCS@5i;e)H?C7 zzsN^&;@NH%tS@_sXxaeW(G}Ph>Fsn*jreECXoo0RX@ew@k)u2b`0!(jE#|2JQ~WuY z?k8A`)5p@|f4QGXWhHB6A_^KrLIB&To}I6j;w}EhgTd^y&=Tu2TFKsh-nb372Sk(6 zqLfo0?`c!8CbR{7eLlOd+azZli#57T&FSe6Imv`4@hg>|okB1NA^7sf)B;!3$cYsf z!ySIMwJ1SC3W>(Pcbug;V&uJ;>Wp$?^dFJ0b9`GQa_P&zn;#Aa9IoD6(fSkQ=;xjN zthcU1GkIlMrbkYVw%Z$jF9o7n`au7$a{wl=t^Kzt1U7)|?*a`1(t-}mWFrQqu+tma zE8?x8{>zs6MxxccD1+$>WNt>TD3L*FZ&lZyU}F8_~*qXQN}T$@Oi`abb6YVb#6KiNWwu2ICI-_ z@P8YKO}wYN{d}PnAcvYkV0fJY9h27tSkA>JLLa^^%pD{-a(_HA4Jyh*il7y7d@R#? z^^fkrhYs_a7@4r}*tq)GZHE&%o&6|F7jd+7gf&vMG?a1ZZps9G+FTKan>4P{*<`_& zK1^daKP63bDqpfI5Ec1#j0vd$stQN2CmC#G5fWtL&wx}}U;3F%&M&(91pkC>%U>=g zen<9+$U=6L9Tbr_#ht_P1lgBseIAjAJ)&;%&%;Tp?LnK~>B#fjeA%6`oTyij3BIQSc#fTz%Dz3K4w*0hOoQrF<2q&4 z>ga(_RFbx6MwR!185gc5Q6-k%EPJw8yOrH=`?aqHw8+Yg9UEz=Cp}@FBy?W)Bs=yQ ztX)7)OBQ>8m9^X8 z?W57R`8Ut6J6B*=(PR6$QO~wGwcvj8%`t-W=`*;jUMvDvp0EEfD_Rk>#O(1EfG{lxW2kXz8}So+&XW!|BG89W;j9&4)CHgs`i%w5=siTU+tNS{i; z%3FCV*}AlZwsNtib!U6&;LrDtOzmaIjc`Ld{qp`NDYA!)(Vu_HW^FUQb zKdP?K<4OZuTZw;}EL-<%_`_A^`}jU!{VcPttH;G>c(w%2owyYcdXq_n9DZL5uU}-YEg75Z#cXGVj7(?zaGE**kFYS?eD`!nTw~&?!iS+nHpxFz?|lrEW)4> zmtR!r0%rzIa3#@Zdf+13b{CH6!rPzgiuw(AZV_mxzUHW{gr%NkL=Pw+R~$syn7kA) zokh9$9xQBi%;BG(T(%ADL7Xd+9n%>m(F){l32aS(91&nGNK845Sr#iUZI0{@;PNhT z?-KtM+TUS-@y=ln#H>me9qNz%kU^fTo562UN4=EeId&9H6EFR=pP=KPLLavq*31SK z`5H?t1kkUR>AG^Q75H&fS@P~qP#ob(jB#z1Vv?b|KV%6I$e>aTTJX^W>!~iavaE|q zBWas}gsnw<`|14)pBVfrt2qpE&H1U$R(fm3S1D=>nk9oY=?drHMQ-uyjI|j%-Q2b; zPsME{5u@OWASgCJ*G^*D5uuhM`-eomUigPZkbXZXWzSxRqk{uZ$B*OFPsNv#TYEEP zHKYa=&xnLGhV#-don;Xora9=IpwOE)k|2)&X++1IKvMn?q_Co)p6apRC*B_(07N5| z6#c-I5gND6D-66QnU+U4#PUG|%^X5K&3a59>1;2VuFxV#y}1S+d3!Kh3tcG%(K2aw z;A@~vKk=g7KhWnM{33^U{Y>+*eLg-i?x0M^41T$UmoI|ZtAi9(pWSTvWKn;njecFg zn8tbe7pCA=;WBquA$!_}c{x`d$F9<(?Xq+OOaY>#5ngSzO&Hu0d+{@?-azb(SgCk~ zaJe^Ay%rNVm|Srrn<7VQ&?&KW?NZnLZbqgMtde4@lQAB0DZ_F~5C;+|_@KP5x3q0v z?$2hH|DD<^`8CY$thO!4;|;g$KiORXkN%I|;l&ut2JctPzhVS!0b!X>osc9LH{kUfDs|7$CC(;*_@Z5O zBiOGvXa9gvlu>a10%qlr zDHhut0PO!PU{IYVA%5=vE$iy7dT1EJ{s+{lfinEmP4xorU;tTlnm$I(uM<|K`#LM7 z4n4|OT>r$b+4AKrykDN29pn1+yfOP!4XovV`RhUDi7NVi-arguL_lNd4n|@c_=Cee zm2JRJJd^?!>EzSHyj{)U$8JOH1_JL7krRDS-Mv|C1weAp?>-tI@nho$5+3UdsVwv-LG4wux4E2ISSU1+)c5o^P$VP^~&@@^vBA^nWS~?KD-% zBqWiZpsm=e%p9>+2+yOTgj&?c(9E{^W$2FE3ALlW2W}@3qvT6n&FuRyS7^)IU8@fE;`NX`*u5l z&SG;-tOV$4{_`K5uH$O2(ia2e$%%|ZgJvVT3Qf)9qJ4R#9Sfh5<+VgDQBgyJ5~-9l z_ZLVx5tqk6*I4~RC7U1}yRXbEHBUu>P~PXR6Z#}z`sVh73!I~sDb~FGAZAm1obJv; zu~uKe)+odfH|Ys3o@~Cb{N^i*Z1y6x{LNu4dI{*q*X7;0w*L{xRbTy(81DhGTHR&k zdnpW7eY(JjtIMXQJ=u1bJA$q{)x$(6%h4M=$PG2!65GWf8H>@ShKXNs`o#^R^AF(< zZ7I}2C(Gi7OUX)yuO|L35@H<8Y`OM*wPC7v>InrSL{Q+VIZj}QvR}4)oV9TjRxa>4&nSURp;&$8lWaj(KQG1! zAsph~U}0Eec;5)C{{o$Tzu|t!P}yXPO0K8_Rp$3}7?u^EyuQ7C88J1R$JxBvVh71A z5g~YTff%W$Jqjd<4cUVe$rA~yIlhF#j2yt*q_haSz(KG?g`SqqV4G z#<#+9l@ttau8ia{BqIEjb6%CVEZ4ARbTMs-c;&--#VS)S zzhqC@rIjVcoV!h^_M0AQTxbA#i!dujs`lb-Hnrguy=Km@wyA!JOiC^ddSN}dhaJ#P zTZSqY*#gJgZ|?22G#)=7=ZiQI+O`Jkld3t{B)vb2fa<& zsN-X^Ii|c?X<_(g<4+xLU_pM4W}91RPFwRckUudWxP6BDVwuX(QnG{6C`wGwA8tPw zzL{e>Wkfj?FlG$S8Y~);pcWQhlUg_>VOrSRghn$& z$*Qnrj?|z^3`62wXw1v-1=N6jd9rE?kEVIGl7q{!M(u|**o;96C1Pj!ZvZ6a7dAY$RuSg59ObB@L`^tm&%oi;!n0d4V-qGa~0s_ zoy(fDtgFdbG5TCQp>`CY{q-?X+^{o1@Q$C09TbMSj54CkIa4_UL2Wu6=vX}fyBOos zZFTxOU&W=P75D`kOQ!{10vPHzz+y*(njXH{**^&P5>Q0#NdW^{!`GrT9ywrn-W}M)YfF{L$zASU7+L_ zZ!!)4EipbDSjlgte*7XmbCtxM%ce05gB%USUAGbpE&Gv&$=AeP4K>zaW|(7Tx$Ct z)ZSk(Fqkha!%UXNP?C9B7|h8RiV({44Ks8QG z#Fly9xuBFij(+Hy+O%_|jyCDKWi})MSP@&5EWj9V3wnN4SEer2i!s(+o**RWi8Ofv zjS1_l+DX_b5B@y?DcKEf|=*Ea1%m6q-3+ zzp%%&qqL)0(o;PwSk%@TCerZd&YyqoOwCBordb?T1)^1+Tvz=)Hdk zV!q#xoXRN|p_@AKHPz`4>OGh}D|P<@gTzR2trt^XyP=mMx5^804YVfUDeWip($Ghi zxyR7R28qJ`Cl@wrX{Z0-SPhq};ZK+C4a{-^B0zPVE#BpMR75UZmQnUB zuT2K^g9@SI2q z5ULB)H3><7!@#v(q)Irgb6uImyv1&*x*~tOSP4L16z1J4AtE`77FUc>ZlNaU4nS$l z<3b839!yw<4*LI!)Cxo0&05uzE%i}!f_N?HT2=QeQM^#jaudgxBy7^;{8B$cJe6=G zW~kzr6wR*EJV$~C$Xh|T1hkY+ruq zU8tUG+{o7asi(hnVE=YTS#4&~jjtc}E&ed)%z729{Nkkr&NdLKm;`2G7v)QCOJ2VIcf z+Ys^NI|=j2)_`b?rn_JIs-k10Oor;98zVM6WyoOR6v;8N?zNa&84-rA%DQpy?2Nl^ zALu^-GUbwwr|=BXth%(E#>{^BMTe`g{N`ABQSC(vxHX}A$&er%VZ#q>H@Rou#1$u_ z?&d44OOxIXlJlYpAC)NhWgR!G1eZVUVb8PY#MhiDaa1<|s17^*op40xp8T)6cusR( z4VFK^PD7EN_neUkmzURa84Y8Gl14`fL!F-L)6C!jB4k&nA596;0A1{U`R=(cfoGk% zcbA0&u<~c1)&na1M*hNgPOd1mDg`=$Ex(0Zq_$+i2Gr`on^mkb%({{M)3rzjN@i77 zoSzpi4~H{^$UHVD`#rm!WmhW_S205a*B}?3N372Iw7p-2APV`SzSrk>@Jl#g5a)(1@Rl&dE zl+aC2DoKhkN!gPH4RNKNW;K-9m?8i2$b*kgL0s++zY8WxA4z?d0kI?_kqXmz*eDZZ zK({Ek+b7q^*@9WViSWvC;9i+a((5wcX&y>_&SRrE=c&W3lAuzS$NY%Z!4p~(w5BH; z-#k`FwM~IkgxceGIQG?@7i&WoZ|>H;+Re~uMY4=SQlh~j(Zaxy<2=hcRfiyEpkw7&o88kjVu1Z6;B7tobV7PyP!uA387G&|5d}Z}I=b`~*Q1ZbWKSyrH zMdwJiO~9gtFjDqFv*Bpw1nm~*B&O(Bi|Uxb{zMAQ!}ioe_|JcZqXltN%8u_OZLhbA z%0%DFC`hp=DoceFCh*I1nY056bmY!Y2-JKk9gC%i$FXYQ31XHtCX-dpTdcqU4$_cz zwgPs7olDres{^p&7hKN-Hhb&*xWEXzBUti+hdeJ60*d-K@}fnv(gOX(7k!_F#qk1G z9VjYDU0a32O-v_my8?${anw)241EY zWDQ#U%JFDE`lZWu3{p8cKG3n!#2;|^TS?YOyubv1T9n%-+ixH3`1Vl2{RgDX zGmGMn8^l+Lf>nT(C)g;Ka)+2IlTLM^8m=HQBjH7|G4IQbY)^KBMnX4WrrJJ8>4oS& zMeRxIl}S+RYpmbZrOn>B2hpoKpXuEv)9B2_oT)f0NkdL(F3`Xdp4%9Lttc*2NXeaO zegXAV|LQ_&VP#bchQFpEN-w^}`BYBA3$Bv}cB}ssl7JotD;}%JtOYtXba>E6_fr_% z$&K?me+o@U2VdX#a&>PRTDQ+)%9vmau4w^|15SusrYhFJs}=l8{LzI!_f` zhjgi$oEVUN*VV1JI%l58y<1W=_n9!)rwvj%ehv|J^objnlPWghVygQCn)CeM{A9NU zWwK^%3JA*lx()?ZHY^vy+3Kpjy7}rNDiv3}v=7ClF(?d`jY3}l-_)#d<$N)WWGHHH_gDZDd&nYYH{>3)cDa&CRdAw zL&)lM1i~sADtSCWmhGsMxM3y)p;(t<)#v5!L^BSOXJWO8(X$wg2L^aBkO{?U&yZ`X zK~>WhqA_b)l)FEeulFqHC;1IY0gln9Vm<-jH8<<_Lm!%5CuUKmJ&BwYq@uCK`Mdj} zevwKU6z4ax#BREat1%>kVPj3FM%J0#`dEEEKWd*aRS9knG zG`?1yXeSv1;^x49U9WnZPe{dKXLY^xi8hCM(nJpU1}FbrBTqpy>l=pT`zI8*Bz3F% zGD%bQew^>OS-^(7AaXBomLeqxLwLg%(Mxeg@IwYOFoON=-;+dHtg2(zERDN^B2=Ez zW3lw{f%(pyp{=sN4R_Av*xZxF$5B;6kI|WFR9JMwXKpF@R+#VG)OP1CmGas5a7S!$ zH0HR|W5e~4gL{j)QRMU{_rG0r??e3nKdb(X~*lwRTdj4KDdqFm@jXC~t!3F&=v5-mzUEZ0@cT~WOm*^kGSJ6t z&21ARTx5P0BjkJ{V{$sw`B|F*D|LwhFt{+%BI_rofPxO><1i*hXmFS+Vi#d~v^JV- z&8^J{;VQ7$n=VMlG~Bq%{dy|hlE&{>0;&Neamyi<|OzSb9^&mP-naiYfG}ZzpxWiY&ak2Rq6K0O*ylz+xXyxi+E^Efu1nG^6PlZ z)v5>4RbAR%f$Dn9@D9#={n!C?mwRDaby+qP|X+%YP4(y?tP9lK-OwrzBD`+v@P-*N99qdu(h6h7>|o;6qP@tbo6 zC`8lO@PJY-8&6eu&!3-ceTQ3f`z(z~9M_`&XeQq22{6933c7o&fd?Bwu9xgwhUKJ} zTISA|i(8rwsdp{OZ4X`8Z4mx&lECG zQTrDA*A(&u4+4S>LXs-X48TeJV@L+nS47pu>RuZ7Vp_L7^_j7*1|%jA42p45q#e#p zG?tn#&2h{VcZ@HBq%_aSxW-QxXb42Y($j{AV7xG1WwEkqeuns#mWBkHEDa#ZitxBh zc?#w{d*(hjo|ncVbb44>sCbZ@FCYjkVnVXf=d@1M8;j#&C2R()5Um4gODKSiv6(a? z{o!53VoHIFI|2AfNmSmo$FV(60!onmh@pGJ(xO4X{&wO1Q1ZAYgS)s1fZF-v%CJjD z&GbsfMk~UtqqTC1kg+}O?L@J9-CSK@r?1_q)r>;6s7}~I<={HYNvS72OF5IncK=Cl zu3};2iN}-8{6cYUkpG=++#hH?_2S+HElh@PdY^Ds#0`hu&y-dGJb)`#c-CSY<=-+;n5S)F)lz+ zGnWE_U@NhJ%DGb#sn)BtQp9q-c}RouICJOBnDot0J#skNs&)O)hZlI>yKizurMwW8 zbOQo1_@+l0x+aJw35CR>PrQoU$sQ}%*?$<_l*NWg5Wkv`E)CW=v8ff;+m_U3Sg*2P zl$V%J-+oss;Psw;l~JK(3MIiFmguUt)$oAa4tALxY3oof556) zs9sR;MmAc^G5{&Hlm+%0z;QgiM|M4A@vZm1vQ1G0=p%JDafp0kvm+QJ4C0Rvm<+tK zXXS)d8IRJ%Xq9vRIDN^>9s>ns+y3^Apgky5m^N{gTT67FY`)Qsx2?9?Y?V?>sYES3mc` zZ+L`D_mO`EBTK|IMFFD1a^&`Y7CX$g8>*3e?6awS;kp?VwLa4d+kxmgZg8jN?o4%H z_tb~5+$%Hg_&|6(DI1zx?0I{iqSpnG?6Q5VxS<|E;vi(=1d78PLNA>VC@kW!J|wFP zupy2aP2{7@0I<#ZNC8giX4$jNLhMzGYfQ> zlkZ&gxK=RubZ)}#NuI1hh>24Xcivj{mhK7%d;0NcEEb-qwHI8~$@U6lESdoF07%mH z>8irxgIk(##Cg^t3ZxDDJSwIsycU{Z?wO?JYVyjv2`(;{(&gI$SzTbj@p87^@6ER+ zV6XoYIjEyt9xE0XQe$FziFZI3QENKtXU>lFsw{^lp45DUh7-OH=&_51^|*3%x!rzU zaHXw3@suEQ1?mhs+C+-q{zkL%CX~|8jv>#FLbqVf;5a&B#5|;|hg`%>k&bHT!d9`k%()DhKfwrw0ch+t@eYhYGbnpGW-&2~lcB z>qmf!G9JDKSfH4O`2)ocSSN-b=;F1FH{YfV{Jxh`NU>WBtX-bJ2FiW>b0I)3fdT=!B<(R{o}{WR~DA;i#EyLU&8JY|Kr zK1_;agYV3DKr(Rw*my+M@W#`4@Igl{@s52}ze%4a1Ta-!mdk_GJc6(n?y3%1R%7?8 zI;LsNit&!EA;qTCN2d5jAT;=h4rVQ?Atffe>na-g;sUsSvbu5!4o94obLbGM=-hOK z9^SAsPTV(|$=KTRWcec1YRYW*;eoKlnvXIQ!HSiiG*4X>D~W%qT$OdchU2&yq5hgg zk78`Y6Ah0bH-YlJnV#-VAj?g~qiZ9+EnI3{&+lIDyt~hY|Jxn?y>|a6b0;y}k@KI2 zogJ)C`on+sN!K8W*G_ner;acGl#BipMN*T1fT;NYElUD*CF{2x7C*z zPE|kqE^~5Re#9b)7!5vY*aZsnSQ7B_e`Mt35Dn;5rcdkWO2tm}+jUX&whXvxx{ zn0-wuuyzBV3y^?Cd^#!#9fHHx2X0WWciD!`VRu2YA*&vKZMvRyqmmTKw|?eN=DWAw z1zt%z4<3ZPi z3(=hjDi0@?zsq#SX5UM!f###SHhaBqU)2QBz0L|x>kpn(?1}3OrQEh^$}=BM z!nVYp&o_&Q8%KN#)utMxC5`D^i|A1yqL4p;?11)+vz0?3+bVn{y9Pl0dqA@rR{Xra zQ;!4^h+AMm?8hli-s4=1!fyi;JR%=T!}nR-`IpaqT0zeG;F=Yl!V$<8he#Wjg$1(|dLU zf}gJxJ92qY&v+84;jnbqVT^tw@HJ*nIO!Fuv{(*@8k?cFy$xmXI}Yh)6mNfby*Q`x zyKfo0W+y+71aIX4V3FAq%dk zZFXK?_vfKlS2{8i&J#TG&j7$CexL^c7kO3Z9AI>ZrsB}+==N&~`ou^izcbu-mv1a- z*jvIyQuEjD(*BSG|LMv}sI0$(wu2cclI{uSPvqk@{WjXg(`!^Kw~ccU^76y4_BXh; zGn%(`T-?|@BoP7tu0UPO+0*A%D7qj=G2ZXkR8l% z$jcFtp{GRWZyjhYnQY+N4laVh&xK@Ise!Su2>7!DC7D(MQgdPM6po9 zp*!b2t_#zU$uZmm2pn~;A7lf)1UpPd4_k_9eWrxz=GaJCdz$(Yh5+=obzT-sunCH5 ziKN&Lj~tY&w(=UCDLzr*+6O)puvJyqzh>`8_4BDOG|#YCf*ska5w3sE*CSNW?sZxM zmL=wUwF&@L9>YtO4g2eH{hU&e^01#X#TX}lv@e^|hX6*|x2?*BlBvMiJ$Sl?c0W_b zIS#Rks(e@ozRV@%nhMc!lq9cYVX-K0-M*V2l5nRoV?%8YY=J_9nW=^c*ficSuJU-< z2_7RkSh2q@k##c$otQvxTvTk>oCxYErHta)dCg9vr!;;_;88m9j7gw)Mm1(uj&JfK zrrk`P$hnLR>hUFng=tjs$T&^P21j46hS=L9Ncj?maF7_(CV5f(ld6(oAYc%Q)0f&B z-iodAk)#!#C$Krs+1Qo^m}{`mQ3+v*KJ?__73S5ynzgy}vNo07qz0l zIO?}>^hcesj4e$MV0%kU=vhr0`o5J^gCmUJGoS*<8#zhPB93iZYKD zMMZ=KkVQbOh}S#2W=~)m>z44;>+Xkq%cLp!TJ2AS_pax4KN}w>+dZ{f-FccvR@}|=8Gw{ zGWL7kbcfgM3|OiGLK?RA_br9)saFqr_z2Q{-9nTAOpw%H3W+&lW$$MWRc6~g&b4Z zFobdB6;WgE9_b9n{Xs@Ai;OhlAUL*X+3N4NmX?IdXCioaz` zZYIov7CgcMqj{{*ig=$rS(3-U2lP=8g0JyDC`<}a$V%1#9?R2`&UilHdeii&zfT8^ zXPmFTmM9QDNAUPsCBwKI`S%=dHh|E| zY2^dMDGfkGzt9Xr3HuXL3GzfvSCuWHJWcQ;@8gSs?`wM1N6NUZW%5B#pelZPJ>r8` zCG|65V+W-#RozM@Fdx*hvXEPE3@xnR65w1NVGx`KXTOe&)NsAna2K9L)r8HLLuMQV zuPRPkGvtWivHWXbhRUd|_1qQvi*7c-D}pcbdPXD=q`dUG!a?kA(AemBW?}hh`DP^% zigdz(RyOIY0p&>tzTNmx=1N)~v~-pov0di!_n;k{#haIg1 zEC}#3m0P}0I!I2HyxDLR3fpMc`Xt%ms>DeEX_rTYJhLb-R?~ANX`_O3{5P*i5Z>k!X1 zPJZV$8?vUe5-1xXC*OF;z@Sc%jGMQSMB*P1(#U}eY^WAfEEC|T`Z#md3Go40N`}#u zt6hBqnSBpnL~Xyrgd9#S3VH4&u!mfEWacMmswXRTIl{Rc@zs0oXNiA&m&T{5THJd8 z7LYM2X7&Ya8J2S$?6Og#Ecw9I z|KPCD_C#USENNhb@;iMdciNF&T`j=J$Z)@NoTO+vPG6jOru^W8U#b;HR}3>ki#0x8 z6482e6qBHuwJ z5;n=O-r!45{Gv`s~)naW@q4>X+C#4Z4fuRWw4a9aY+k^ZP#!d2+~k=UPMJ z-yFXNcy&bjDj>z`4W7fXfQ-TGxOmNwyg`o`fZnN%6F9wRs7i6ZrS8RDTdPtVVC$$^ zUDo7D8UwxN{p%b)-NkixjTAV+z5y+rF-8L$q)EX0K4ypq3T&z|RgeV|?bnN-=A?Gr&%zF;MvHyr?W%_V zJpZJ@T6KLP2vSlunzz#Z(;g~fO4k-udDTP?zbM+sp0b{E&;?`No~luxPU#~K0X=qq z#k=oD?I}0vFrg#x#=A1()E)ljdbWgTxL)+iGd5)@j#kTXH|TU?2u>Rgw37*p*%=_W z@!Lsec}e*By-vZQ3O}`CY=S^5U&>4C8^4VS3t2wde(P<13?}rQca?kQh*Cx)Q_ls{ zA_)m;g$N05+Vu5B(ybbSd>VfGm{kfz%FC9R>kl`M4GV{GeNGwb?;@?qb?6ZRkD6~M zkQ07cHxpn286spDx)mW?zyJhqiMWo@ESxh*3=S*kAD#Xb#0m45*cPrK10}17Gf7!^ zkq|`Ee9n^Cx`N&Oj=`tBF&+5Ucrvz!S3ef#dVpQ5Sg|jpR0#Ikg`aubn3aOGpt4h5 z9U|RNp|o3b)MOla@=k|`ffj&fBAv49jV(OGY(5_o**~*@zuxaRBtklOdgsN7l)4mE6{FV&5@?@F+1)D8p=N&CLv;J!7mBF_y8I*6)hEcqaAsl_J zir&}YyW}=yi*|eks*g+A_YE;ea~#el@bF5ZW#ZGLHo2bgw9zBkUbmBAj2^%DI&v*o zywVVXHdko|?$RzHI1rif69#Ypc3IJJYyt;Hyni6SoYdtYNb*eedLwr(I$p}?+Z_?N zu!D$jrcU0yZHB+dF|y3|69{xf&Ce}=+lZv`w8HyclK4sq>}uT<$k-9>`8EGqI_`5o zaH5gpEA$zqgA8pbcRRpKPhq3evePIYK=2?2F{_>BlLNe$NMEnShK_(Y_rZ5pni1uZ zuP>d+?bBz?en#wxANK#rSq7X*n^ve**x)N8oN_Y_^E-isZZr?P=)VD>|r<>(+0 zr=XJyfd+pCmcj`n3c(tG-^d3mm!?ls*V+B7Vd*qu>k-277PP!L_Skqa%^;qM^F-DF z(KiW)J5^11DWqo7T1aQJXF$KqCWb8q+W?#_9MgC8(Rc0CPTvHBMfM8oB3wk@%=WR_ zc12uO7?j<~;Vcla91oqpPs#4U6~2kq(XjlaDn^z8lKl22+Op6t05gll< z7!$yOAeEv`-Z^)9ZDQ_HV@TYKns#Ct_!AtN|G1E=9yX|JlsW9KuEZzgSK7V?@*LKn zmoi!hw92n`2!IIfxC@m88S!+;BvkhJCa8DO9+>-Rg=_KKT(FK3g{&RJ;;@lq{;4l) zW}spHJ4fi!A*5BrGL{aVSWGlI67mC83xssw-%PFb-#ot979iZMaOT*h%NN)k=3kCG zql0}5u&;O(K{KA?%A`1{pi1pCC9-uI3OQKsz|MA2wZIqSB3Ek3*owLZVKpRd zwPqbxqKF@L!UPWceOoI#d@INdqZ?%8d7!kH=cu=3zF| z)^D6Ef`F}#9S452SLb-{y97Zkw%0K-pfV0dCB?h$$MQ#aOQOqwvG3_GS zfdYMee5US{@a^r>pLM``AkT^*{6geCQ;Sia#u+QuuyD^G12Usp+IfZf532 z?%#J<2-B4JOy5XW1<0K_+A$_t*}7iTdcRs}2R`6@HdI9;BHsICjEz;rI^xGZfx*wW z(SGip0+NJ1inrQ!!IogNE6dEluob6tT@{NbBUcr@bR#SBr4ZNX8xFW}EpDgCYoqDT zC7OBR=GJrk$D7Jiki2**gp8ZYEn9#g*8<4zvj@_|z$}oi{7U1?%VTKBt#Dp2i4dpxtL{R78s5Z=OxqRBd1udIh5;uCeU$J5@CY$q&0n-xX4!zw* zXld{rOkqv{ar}T5XIrH}2G^Cciyv zTk7h>ho8*q2xieC&tOdEfU%wkx3lJJ*&2{3u!to#&IYQOdL(PrwV3#%xqY+sGKr)d z)evQE-w8@Iv$q(k6amAP@|B~X>H>oZPCAAk`P zIC&t5RVMP)g&0{;+t=HFlcY#4_yCS^cqEJzfbpkiC+m4=jdo)F!`}7tGz{$2>_msi zgNe)LiFxJ;Dw|bn0A@`fI0Kpmy~%?l6~dP3byt}0{PN^owu}dB@oMoW)c#^6Iu%1h zTrT#zqyI;Fb#)-!B=CW1U)8^6ev3BV|EG1yA(R;2qn@z}l;mPBod1g@@Z|>=s6G&! zsHyuoz%x$rq_vXmS33!*Y%o|pI3_Lxi)yIb56$&4XZ-e7i%r z6VkM)w;!!-9dx{lK1$m4K2*C$OYOmpnpu z**^WvSsr-h9tk;&POiI+_n935ZM&J+)tf zGQw<;z|#LWLTq}CN#d22-HjTT=pfh z=g{zOs7l&ggRdmT%842@MFbyUCOV?gJhw9aawdioe}@PIgWMR1hQ>9JcPv?|uz1A! z`q(Q+hEK(Rkx6pyR*`h3>YBHL+_x=sp7CTyKDto1dG9t@=MoC56pPh7{DMB@6xp1k za@TI{xa){<5Ck8hD6o(FBTi6TbBk{welzxU^ak(nAY(+Jj#aV7Lx3k>9nOo(hF!El zHI%`9vFftZ7YpZyk&zE@o3yHBJ5$#`5;hS_?2kIx%$PucKZYiIX-rB7b-UOBpB%M| zyI2)zpMqrc$T{t$I3Bhf7QE894~Zh?_pYMEtdJM{Xh#&vd1gc{H|!wQ0Hv!~s-V#g zw@{ML#-KlQ@?9@UwLec_LPpxFa?TJDH{;oIv3rnAk)^}bJYU~|*31;r@kzMq*qJJt zkkp`UGe0vi&z8`xQ!Q_m8LDC<`!Px6!k(lX^>7GTW}pC!>ccNpfS0^V(g(?}MIkEx z6y=BUkCE4c#<*_8_qPw7Zs(9ti85yfB$k}kUw+i7w11Y%;Ti4D@8}wpGPTy zyzcw9hFoR}+7K%8z8QPz=5jRomtd7Y2{8XiTB(VT3b4S?Ldv*Hm0l%7*^Vha2S_V5 z7G;-mRPCGrpT07OTl{Jp-q=`51|@;=I&ekFV>>PrOvW0i4yvwWYvVZRXJ zsVhj%Bcro`zh5Rb;htU7GGc><_%np89}VxJ`m;Z!L?vG=h_D_wf=TU`GA~n71a)=$ zyUQNyzar7S>I^{R31K{fG%jd#h%1D4klMB&`J}q%T-S+&-nrt5;mJL^0$x&y}CIwaMAP3zeV9KXA^~Ol1DxK?oAi^F-8d+<*O{>{79VoXszp2N z$lgu|Xj@f;;zp)qY2Q6+H|r1L2dvC^j*MxZ*$+?zta z@chrEb_#?CuqQ8uD?JNjGG%4gAU%F`@CfKGpz@aCN!Skp6Un`wePR7l|Yzugs z(LHs)DwP^~G3zyYr+64UE;*Ji?4PtZ+>Fqp#x1OE8a?zdI>1g4%jT?qadK$m;L;;_ z*t&BxX>Cj#J~4T_kh-wAHzay~7w{O)nw&7dXR<6z0M1YD)q>0-72i7W9<&(6A@&6AG73VF@^1|Jff z5TAffFLMGcY25mtZSEcivo0erQKEhXjd95#v4mDSJTfBi7Rja^iuU2cs#k6>6HE+g z%B5GBqMm9V8+*RZ(klrgVf5NK9WIPrsQF3#3F4H>)HidzY=_7}!0W5K?|wE|F5A?{>Y9Ed>5zzcx2k-Bnn>fXd} z?g^=%ONfKH1`uZy%J+oL;P`+~0i9p)VtTHXwneJ7>)7K!Z&1dBZ6Bc5kP`qI{!3>1 z2jDLOOLQw#P1|!Ppi5BHv%xas@OUOsCZcfbsBwSt$dNEtP%7BCOUfXIEk#T0B(!ud zMvSdYTlElZs3S>(QmiHfuyhJ%I#%MUT<`T7prZZ=fpCE!C>1btMD+^Z0x@$}Z*aSf z?y6d~KQ?ZxCJMF{C0MfOOtz@eytBV3NR@g@JW5$HBx9 z$?qhBZSQRabb%ENLr{dhJHbx0((PemQ5Up}ufVV5jl0}u;Ra_9pSD^!v9%e|DPSR_ zBnhs7ETK;4#n=`s7;i2Z07cSSxN*eLVHx8WkmO+EM2NH=LIMcDsmL+^lq-E$ie2!f z<5fz#+M=xE`q69-xf9-QalX1M-hkY#Wu5AvIwhkRl+E2|xI0jN2%-grKtaj{Di5Ig z;Paz~>)%P5Zi5$K89OL6QC|^KWs<83xjE8c1ZDAPAPhzQ3Ku*I0+xK@!2abqdCpd> z>kfXp7ov>*0)C78`!ZDY@2o`)-uvZB2zvPYrRbh2u~NNAWLe?H)WF`<1~EzD2>Em_ zcImZkB9D*xOP$EA~|`~y&1sRKmhL<@O#T$bH|LJ$&Z&Y*)%a`w_e~P;jLuw<=rxs57%nwl)AaSw7yhf zl$)KZ2z4{77^UQhiaGCE{b-yop)Jq%#bRd$aihtEn?}fj?iwq!j}48m_1Pa}8Ip=z zemh;XAvx$hJfV!(3=x5$bVY1EJQQ%mtTV3Yee${EaP!3kz=E-k0%!qtOCC%+~x&OpXVZ}#RedCVTipWwFE>jS(kJ&q6(VMf;t53-pa#PmK`d;^xQ zHXDCi=-Kzk0?XMTkhWh)fBDzqLEAjpX(J8TiOi?=WkU%QA?V8I!h-p_tAUA>TL&Oj z(Z?f;YNFh}QRn!^jWZn83mQq)a$y9^N5Kqs#vwNM{E0737&w$lui_dtxlrpMr%nu^ zh+q2=A8Kc#3610E&1yNP6GmAp_<8?noV0gY$+{DObGz%)EH%@hu4CSKeDad)LS0_) z2pS@(1Nyru8&)6@DpQ16+g?6cGZS_V9^cGZBqBCZN@vlliZOyxAr7C+ixdCiBG9_E zZ4fV>aj!1k8b&J~ROQkUqqa~do=CeI>V;Wts}*0zNEuE}{q}<)xu%Qw0f&Kt#vt1? zdI^a>7v5Xh=p3H5Qc)}e+6m6>IH#RmHY9(N1o$f;CvfRN3AI%MN!D5=S1olU2O9sl z%h`ir?NRwWxBmrm-xY$Ln=x%U-xkN ztay0CTsk?Wb3+7Z+{g*hyz};kK4Ap6fG2H^%Yc1aIb_EPBM@lDW0-NKI;?oZk;BN~j3dKC70X9mEM0i8uIZO_AxTA@y zKzREy>PJl9A7+TBx5#g&bmyT*dm<4YnFv+VZ+>ixi8$IxfOT7t2a-Hv6 z2!!$gVoZuHE3Nh|WH@o_>~AHiXcu`14vqPwJ5j-fyOqqp_C6Sp+PyZ@ zYuLAvO@)xIgBk)+TmC6Nz2W2smp78VIQKxeTM0C>!Q(Bfg>9$5ER~q#0%j~Ym}c~1 z4Pmvnsk$&?v2S3E?u8QBkU0rG!+gRX3shqOr(-R{5eJlYVOsNVXx*gH)o^;IW8_Mb z*omETnl=wD7h&u8l!jL>5sG&D3xz{(_r-k7*BFAd&fgH7yYpL0XsJ$!luWY&^U5zi z<%hr-UDs9Ifac&53dz1Nuz$(i|BIgdO5*$%lDtTg{g2<_O)2=x#{A`X8g_Fk|Miu3 zT#B7<{N*JvaT3pSSW}g_0N{zUd67VB>3Qra{^yN*zGLoV4&U_^DT|iNACU*D7Ui8C z$(KygH3Qrk2?7u5*{ECbz+}9?Y>$h$W1t$XR*t9(la+1jV&Ydb=k}xL%eo z5~VdmrV&~rGmg-b?0BU(xYN1(E>Ci*WF-Y7ZI$jiN_vGg=MvzYZ$`xC7@WXKmAMTp zwwC&-{o~}ebQ$XmxG7DGyAIu-K6PnR0KUg7cM5Axls6(D9m8fXOwqS{3)+8nbgo(|b~AAfm)Qg(XNm%u?3Tp2LsN9jS;bR^v~w^glaNv95)tj79Mkq)anPu zn<4Gh=5bnoMe_9KP+;*Enak1z;ZhKL1DAxxoLSxt1-Is;y)9kM^FRS)q+a;Rt`%i$ z;4v+i86KJ67gZDR!Qe{FST7ZhF?)h}N@oXm*jG*WLPHNi$fmuZ;S+%#`8J6hOJ+uS z!&kHewYZqbA}-QnfCSQ-7@Jr-DTr?zf;p@V8N&s8n=217jSvEO|l?V+CTebG+fZV6JEL@o+( zO|Ip&)5Ev3Xt8)b2Kr#27^V2wtl%K3g@LY~^c$fIov#7_HMI2fa3}Bl2WxIZ>CHox zP#E2|ODy!Lx)*9|$23O1hf{4IrUbsHj4BJoNL#{$%wWlkf@mB-9}c0caWHe7s?SkI z3=EhLt_|YYduuEYOI}Mw?LY)CQ5z2QqOE=G<{jmiYHNvn52aN0{&JLbq|FYd-?VPG z*o(b?ySfZPuTS6)ND^@p)g(=`P*PITns5xHk%pEfRyReSuAr;Dk)bM!NT9j_#4Gbb z`sg4Y2LX~1^AO`sT{d`DzOJkHPi`9%fcPz`UizC=ZZ@=Sjmy^OC3C+COcg7rDp($5 zb5OA~gd+XfkZIGB0|RMT0&$eS0Lo})8Yn?ojyzGHwhdJ7JW)AQ1%?l6F8>U2Jwmv% z#lOZIPVzquaQXN-(hjo{@m4m+G;*TVRYWzMdb;1*s}I8|-YEaGLm>ZmI>D+1_SV2( z&TkbYk*EwmQK%F=k*M_U-!&JbEC}M?QFb-)e=Bld&GWyBoDE$K!T;67n^gWAWj1g8 zm)Ggt@%azle*GFU%LE1jqW?DvgcyV-wTBNtkXX^l1hiG0SHk+ds%U z9GxnLipu08V5=x8x=gR%b!$z+C2Vekc9`N%Q~=6q;21>xCGPF@dSH0-LmV4+RtzPMQIvG4*52Bn3zAR(7z-4*0){FyV4_mUpD2(==9_gY-gLZRlehq1^jlLY zCN@J(2#^hzY4oLEUS-onK;7cw^wG#;)D9@;vCr5)7@?TVO;MAk0D$k*oi3zv_l~XN zk9DygBR=Z3Ck{*5!=uGsA8av|jxZXht zcU<)?hL`TH>E$~W#IELq$HFi8E(A~T{v6dGyy(! zjaGCtAs>sG)=fX|c`Rdf{4{G-Xeovtxj63ryi57rCU3LS5#04LB0Zg5+E9ke@t_tSJ_fiASgU5}z%06%V04+w~TE z_SNBW#Y8;cRVCz8JL9#}QW!=r5En_VSFLz6<|vEyvzE`TW2Vuoi6Re+IM;-k|xQgblqC0e%0)+VgTA3O!dhY-0JNUjH0QmpT%uJl^Xa2WkAqOb` zdy{!k1oGdS`#8&gwdx6C=zoCTc?6c0v%me11W06DB5n9uAo=eThW z`ECr-zqO}Z$bW0~_Zl@UT@8tibZ z9M<{fhGLr3W8t%VR_Z^$=AIWNA62yQC*!qq1ZjgG!CuebLdG53xuM=5RtQt+Kmo+S zSkjtZV~d{O5`IsdM#6<+ATS#My&ny$$FwPtgrF!p za?L%}Wa$rFLAR3-)U#sND?QZEm>^q|Z3;rQ19Vc_{KJ~436{Ojo)d)0w`y8)AksZ- zCK4sZIBoSe-f~k7N`b8>Pi3+*&>F{C`Q?Pv&kI z8jHi<|KADIA_xXR{`a=EsDT6gp#GUMsY~Ag|IV3~Z*Ty9z&|&U>5(Nv@~|WsG4ZN(BCGM*{7(HTG>3+E7o@Smp#$3Kh~D<<=N4} zL{*}Eb%M#Y@1)@)B6`V0h^SVL5<|%{e||wcZ*{y4{GM@nwr4>0D2qEKVuI=5_7(sh zyH8DaFJX7`aJwpIz1zH>x;hmtprKP=Yo+8=d6E`M_j)JNfntm~O>Vk%F#k0?&L?p+|F(AC%p1pgY zri)@VyD<601=|K`hI!BX+1*C+T4mLokyb{b6H4Ik{6fNMR@9cF3`ktjTY^_nhgK#6^1D8^vOA$v@SE= zBkgSRvXw_Z(qU3H>N_p>Wn=|@x510|e5!*kF6vcH%$L(H2yc+}HP22DGV=1ckNro& zNjvJasSZL@s0O%`EqlJvH~`>3INJpH!kzqiZ_vKARVrU*ZC=V2=ZWhe>0{iE{posI)m+5c zF!H-Uj5@@z%SMK}aKA9gcw$h>7W;SA&I^KL2#A@<(V3L5cptAEAyr8g0BjY7hrQd= z5ksoSzwOVT`M`Qt+ZQFGQgG&kaf^bHZ&S|jtgyh*bt}))uil4b0iz5_BmMY#iAK1= z#w}&1s;zHU7$l}31XKu^azYud4N;As+%X(EyPDRHn`sWK^p3}|LTl$q$Ml(wsb+VL z#%M65=*=7TS9^SjUx_yuDwSQ|7*v9!81Qrl?Wdj3nd}@rLo!VyycSvaH=yq*jW^kS z%o~9Xa32w1x{WTb@+GoTI?TSrjolH(Nty<$((-DzQ5@P1J5p!{s|Z5bNuqj;Ug;s~ z5p98{>Nopk1fsBOpmp=hHdvqUU%%)G`+xEo!htRI9@Ce9H=&;HG%gP$wqpF=TF?vj z&fpQ5!lI$kjq7>U9qGJ#KvagcPatoX`>MC)yY(N z*Qf?u7aYq1C3CF?C$CI`9xFILbMRImrCbZnc{2zvdr!!ybLR!;hhi2h!E(|%>x2O4 z$OWe{1YID(TeL;4dx5ozC%o*>EuR20K_n{k_5GxbZlh&v1sr}!`bHj?b{?piY76%3kR*BK+JpaBq||P{b?H&mBd3XQz)fh<%x1cnSbiJ-GtADl3n+| z)@HLEaKLo4yB%AX05L3u-b1-gopdn1{(n20cc~ANnZKKo8<12bbO2Rqo(urIg&Pe3 z^Y4*F+x#h#P_iy~}*GDK|i0D?8J!BV07q9Qx+uWQ`IvqeOle<{1 z+rgFn%Do4DkAh!5eyT(kW9SSWhXKgGHcEoTt6B}<^R9O&qlq!SI$_&3x zeb(iT)5&IqS>U5`oOzD1XL`o2*5kNWes(_tX=vco+kU!kfA26r788=ekAsN|TE#bI zrPX%n4SogKQ_KK2vn`8Yym0BH@7{L3`Ha8|Dd?_cX*+JSX zfO`YDMREtJ{N7HHSxyDLH_>cR%UT{JF=AEva7Nq9evabUS89vig~M@_`9E1gOQ3B} z0dYba_yqUU2n~DqqoRnjCF8<{DiOdZgC73}fS60Nb>0${ifj2vxg`i9 ziMqfU?DdRGTevrcn%c`(*@M))sr<%?s&eOtz7h zuUXS^4MUrA6FaH=9Q_=+{1`W$+W}`CmP#A@+1*`O{&^KYzK;*&6ZaPKjKo2yr~p#c zof;AP(0UCT4`ZoaOf|kVEU%&tz8YFk@N4M&QAj}5z$>B|s_;2V=k5pvdvUtfTFQS50lu z_;i4nP-T8IAPb;dZrxRKqCPqC^|+h=?T8=OVx|?evi8Q}77-vJkiwxvWo)Q?y<0s1 z#&dD_0Q!bC^LR?xu$P*rQfqEk%^UUO@gy8t(3hWMY&qP2YlQdt8$rKjXfKzNXu*7G+<~~?*AVF>;EfYIYIvj82Y~gwhCI8uUYv&0js0C?*9q= zN5SIlqb}@>%6tBgf_W$gLA~hTph46tsp5qvio|2g2O`@nj8q=PKQ!n=bj4!*DshY+ zx~k78uiNs0%FN4N;1r^s5Br)Bl~LA(Os-NRvIs7$B0ph)Ev}C;R!=?+Ot|6831(HAv%z#%;lwD8~n0HZ{oSwWWu=Q|Lk7h&*r|) ze$*kaHzOW413bNx>p?EXMf*V0_Zim-JwGPD?`B|Z6+`&s(z!Z{e6Wn+M3S8_IADiZ zo{nwXCwK&WU+T4zOtarl@x6h@aOPpNt(Be%4CK$!jCRJ8V6!Fz?g+Gsg1s5PueH%y zGD}yU_dV~C-hx#zQFgrQi*6oV3}p?iQmJ7tea~7gfnve|Q^W>bX&30mxat~hgD`2w zrUr$6#oKxf@t>wU)&B%xfr8fp$mR_T{N*9CtwJxlf{Xv3wyp&(s$z|w0VTyHAs^7P zxVx~husoNy$S%7)1O!xkP&W;fTls=3R^o#Sdq{fCQV#Zs6qSXKBt#1ziAIT6Go-GX zSHVJ4n5f%Hpmrcpa z+jUK$-&ptI+h;}Uz?^Db=f7TFxjKJBPb<>RYi{QSK7A_qk+$%=!t6D6r}e+vVvX1Ky9GUP zvHP7Bp+d>xDY&zgs&$Ct`kla}LK>*?LWQNFQNvFkyf%Y#sJc?#eEsH{=En1?;T_G} z@3h3v@%5SMHOA4)=dWH#NxKa7Q??#8SDx^#_T7EB=s%zDh;xdwe3iI<13wcv9(udx z#+KJ+jpyFISNmM=Ig`t@6}2U84Kqf1UoC&UeBqw!Rh6)9ZpGG|?Qiw0&&^r(Qg!(& z$GqHkZY(u_RarbYy8o1Q-pRG0Y1Idc%|9GjmiGGa=27QIZfuCC4xX#X^q$sLurjVh zz3J9dCqL_&SyJ|VpQX{VrDs+2^5dWWxO`g46ISc_nE$O>aB@>?M$zw<7gB39ZN1MY zKJ;CS*3)nLA2W@axdnx*4lHrdU5f8$xP9-nXw9GZtKVGkoIa=V;(mvg-&EVb9R7#$ z(wCi^D<5-MQT6h}Bb3_=0k3_OQ*qH?x-_XP#Sxz|c=U42?UY}Sb(!|$6)bgHo3%3E zZTjIk`BRq}F2>otHt662HCjvWfvbQ5_l<-bCZO>} zk^bk3C!NmkZ$}~Kj57lMbSIkpJv{?CjO7OYwH#jXMQQF_qm%E9-ge}Y6hmr>2<@1P zoF?P6wjeHZG{<#;$`2)YNcA_1^+n`sksh}BAqCM7KK4T?QeEvKT9+aJxSI|F^+-V) zklrK<$$Ato3B`6$A%^_?M|9ALg=hmUdZZlojyuOem_K^d$C=aMH5SJq&VyqrP7jVH zT}p5w2!8%3R4Z)2Nw0x43dfX8CW0Ix*yq9V-+CxvlRr{Onyi>bc^L9Pdw7qtx8}-l z*S=3-uOAwRegqVN43hY)g;bm&@8PQpu@~2eS4M9i#&JIQd3gY~2RT78dBK8_Hk}KTy)z0~C3Epbpj> zL{jN(Ri5^woq>eZ9a;^@RqA)gu!+R{40&~s4wQjx01bgi>9{76MbFKW z@r0Q;ewxW2-VH(uiRYo!lt)Bp3PL8rGjLM4Jx`%o;L-8*=3zs6tH&uyDIzQiMkX&{b}GY=FHO@!UMNx!T?Wp0wYQBWT_E#>RUtClgc;(B+n{eK!OqZOXh)Y${-@VWJIBK zr1#5aAYLI(w2Qc<}0lCRa|V1>9GLEO zgo~qMd!C3qhD-|y5jkB1UJQ|W9-Cws@-Hsb!@LL_++-puiohLN4jUrSqwYPEEyS-T z^h_c1QOnT;;cqw+fi$$+9YXDT=#M}FQug>&O{KQ>k=lswF7kogNTeXP9yq##BV{zKafbZpXMLa>(+uco%&FkG&P{vq`^GyfcZJFmqw}I9qI$7Aok}%Z zh*FRi#Z)hd!m+uzg5&?Jh=9f@nV*=h(GKVvsZ2){N~7HkjK(rowg@tzup(L(f{D&n z(w>M=9nEBZ5oF4$IliYl945xd+L>acG9tp<7?euFf8gN~jx%z(f`Ra*!6oW_fhUAK zZ!%=+9bZ5>8RCah;)3i`@4#-WeF$#b0d5n~qrwI(yc;Xi^)Ec-6%m?Zk&(pVx8;+M z8t{WKDTAiJBRd7I04W@neNHJvgzSmPNL<39VfWHT+__7*Xt}BQQ@Av^B*F(1QJCae z8?I6YhJ5QMhC%bnW3S$NryS461qyq%1$7+%&pPj5xu38V#}leVGJcGDd66H79-KSo z4%RrNh59%)`8CC1kI#qpI20}Q?ENGvEF$<%LM9UEW1K5ox^X|oA$whZ`3%QrX@eF5 zCd;h6Z!skj5x$v(Vu*?Emc;a|z@0jd5B|0_kp;BzG81)grVI@EmIH=B`|-b#m(wcb z&AqtTvT5L$obB`>%EpkdJz{_`lbC{SH`V3i=G_Qi#3MD7m}IMpTS^*|RktZAU)N}W zGnkCV)(`GrD=>M!NnKiNfKO|fV^nan-Y-HVb5{c zXGI=-Zu6KS19PvNi8vTTKA|}rf-OvalLd2JXl5LvVU0y*x`sR|%#dGvA{^Qz;a>z{ z)i;8$9|T!tf)~oDAVYrdH^xEkpi5Mj*WpvC4&nv4KZh3v2H6P&%UA` zlpY)RXXL0{any#`uLPa1O5`r^RI)7p$F8L<+uHpPzhJVO;a4B?bNOG*{rJU*&rm7qA9{gY ztfe6&BHY7_bgbi3@#J{T0SVjl?ogB}vrbtW6=DdB9gz->rm~1RBZ&4nQqh2rmGcV= zhDz)#d>KONFibNw4bzbIju84wR*yp5jW=HJ+z7UzZ%83-!xj;N2WbjgUZmhq=*=i+ zQN}*M9(wTawzJr>y}0POZ2T!)8eH~{g72mvPhk(+F1<|}o=nV`1m$IZl=&vd}(m`d92Vtq~x2rHz}Wp;F*E*udtSfIT=`=3!d^d@8NOyG3Hj|Y+{4I-39&csguAkJv zo-Cx6)Lb-%iirqUvyh%zN--5rb0fU5O3U!KA&1R-J{4vNo4k<^Y?#Udr%IqG^T8Bo a8XEd`0#lnIjMiaCQB6axPE9&&A@2V~xWRA$