Skip to content

Commit ddd0aa6

Browse files
committed
Refactor | net8
1 parent 25fcd3c commit ddd0aa6

10 files changed

+27
-143
lines changed

ShadowViewer.sln

-57
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Controls", "Controls", "{6D
2121
EndProject
2222
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ShadowViewer.Controls.Notification", "ShadowViewer.Controls\ShadowViewer.Controls.Notification\ShadowViewer.Controls.Notification.csproj", "{145947B0-E1D3-49A0-AFAE-3CE418B0FC67}"
2323
EndProject
24-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ShadowViewer.Controls.TitleBorder", "ShadowViewer.Controls\ShadowViewer.Controls.TitleBorder\ShadowViewer.Controls.TitleBorder.csproj", "{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}"
25-
EndProject
2624
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{8106056D-3642-4C93-8A13-4EFE0B093AA0}"
2725
EndProject
28-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ShadowViewer.Controls.PluginLogo", "ShadowViewer.Controls\ShadowViewer.Controls.PluginLogo\ShadowViewer.Controls.PluginLogo.csproj", "{07F04295-975D-4CC8-BA6B-73EFAD49FE40}"
29-
EndProject
3026
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Test", "ShadowViewer.Controls\Test\Test.csproj", "{EDF8472E-5E9E-4D89-8CC2-81CEFBD2D53B}"
3127
EndProject
32-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ShadowViewer.Controls.ShadowSettingHeader", "ShadowViewer.Controls\ShadowViewer.Controls.ShadowSettingHeader\ShadowViewer.Controls.ShadowSettingHeader.csproj", "{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}"
33-
EndProject
3428
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{EAE9742A-82CC-4341-8C09-CD621774D64B}"
3529
EndProject
3630
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ShadowViewer.Plugin.Example", "ShadowViewer.Plugin.Example\ShadowViewer.Plugin.Example\ShadowViewer.Plugin.Example.csproj", "{D65CE14D-3982-4B9F-BA88-7FC650B63833}"
@@ -185,38 +179,6 @@ Global
185179
{145947B0-E1D3-49A0-AFAE-3CE418B0FC67}.Release|x64.Build.0 = Release|Any CPU
186180
{145947B0-E1D3-49A0-AFAE-3CE418B0FC67}.Release|x86.ActiveCfg = Release|Any CPU
187181
{145947B0-E1D3-49A0-AFAE-3CE418B0FC67}.Release|x86.Build.0 = Release|Any CPU
188-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
189-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
190-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}.Debug|ARM64.ActiveCfg = Debug|Any CPU
191-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}.Debug|ARM64.Build.0 = Debug|Any CPU
192-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}.Debug|x64.ActiveCfg = Debug|Any CPU
193-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}.Debug|x64.Build.0 = Debug|Any CPU
194-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}.Debug|x86.ActiveCfg = Debug|Any CPU
195-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}.Debug|x86.Build.0 = Debug|Any CPU
196-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
197-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}.Release|Any CPU.Build.0 = Release|Any CPU
198-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}.Release|ARM64.ActiveCfg = Release|Any CPU
199-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}.Release|ARM64.Build.0 = Release|Any CPU
200-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}.Release|x64.ActiveCfg = Release|Any CPU
201-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}.Release|x64.Build.0 = Release|Any CPU
202-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}.Release|x86.ActiveCfg = Release|Any CPU
203-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD}.Release|x86.Build.0 = Release|Any CPU
204-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
205-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40}.Debug|Any CPU.Build.0 = Debug|Any CPU
206-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40}.Debug|ARM64.ActiveCfg = Debug|Any CPU
207-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40}.Debug|ARM64.Build.0 = Debug|Any CPU
208-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40}.Debug|x64.ActiveCfg = Debug|Any CPU
209-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40}.Debug|x64.Build.0 = Debug|Any CPU
210-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40}.Debug|x86.ActiveCfg = Debug|Any CPU
211-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40}.Debug|x86.Build.0 = Debug|Any CPU
212-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40}.Release|Any CPU.ActiveCfg = Release|Any CPU
213-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40}.Release|Any CPU.Build.0 = Release|Any CPU
214-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40}.Release|ARM64.ActiveCfg = Release|Any CPU
215-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40}.Release|ARM64.Build.0 = Release|Any CPU
216-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40}.Release|x64.ActiveCfg = Release|Any CPU
217-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40}.Release|x64.Build.0 = Release|Any CPU
218-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40}.Release|x86.ActiveCfg = Release|Any CPU
219-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40}.Release|x86.Build.0 = Release|Any CPU
220182
{EDF8472E-5E9E-4D89-8CC2-81CEFBD2D53B}.Debug|Any CPU.ActiveCfg = Debug|x64
221183
{EDF8472E-5E9E-4D89-8CC2-81CEFBD2D53B}.Debug|Any CPU.Build.0 = Debug|x64
222184
{EDF8472E-5E9E-4D89-8CC2-81CEFBD2D53B}.Debug|Any CPU.Deploy.0 = Debug|x64
@@ -241,22 +203,6 @@ Global
241203
{EDF8472E-5E9E-4D89-8CC2-81CEFBD2D53B}.Release|x86.ActiveCfg = Release|x86
242204
{EDF8472E-5E9E-4D89-8CC2-81CEFBD2D53B}.Release|x86.Build.0 = Release|x86
243205
{EDF8472E-5E9E-4D89-8CC2-81CEFBD2D53B}.Release|x86.Deploy.0 = Release|x86
244-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
245-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
246-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}.Debug|ARM64.ActiveCfg = Debug|Any CPU
247-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}.Debug|ARM64.Build.0 = Debug|Any CPU
248-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}.Debug|x64.ActiveCfg = Debug|Any CPU
249-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}.Debug|x64.Build.0 = Debug|Any CPU
250-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}.Debug|x86.ActiveCfg = Debug|Any CPU
251-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}.Debug|x86.Build.0 = Debug|Any CPU
252-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
253-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}.Release|Any CPU.Build.0 = Release|Any CPU
254-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}.Release|ARM64.ActiveCfg = Release|Any CPU
255-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}.Release|ARM64.Build.0 = Release|Any CPU
256-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}.Release|x64.ActiveCfg = Release|Any CPU
257-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}.Release|x64.Build.0 = Release|Any CPU
258-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}.Release|x86.ActiveCfg = Release|Any CPU
259-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1}.Release|x86.Build.0 = Release|Any CPU
260206
{D65CE14D-3982-4B9F-BA88-7FC650B63833}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
261207
{D65CE14D-3982-4B9F-BA88-7FC650B63833}.Debug|Any CPU.Build.0 = Debug|Any CPU
262208
{D65CE14D-3982-4B9F-BA88-7FC650B63833}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -301,10 +247,7 @@ Global
301247
{9862CB95-AAF0-4360-A10C-B5ED92E81C4F} = {8106056D-3642-4C93-8A13-4EFE0B093AA0}
302248
{F5ABEF04-FB85-4C0E-8E99-B4565D977E46} = {8106056D-3642-4C93-8A13-4EFE0B093AA0}
303249
{145947B0-E1D3-49A0-AFAE-3CE418B0FC67} = {6D06848F-89FF-4030-BEEE-3AE0EB85DC22}
304-
{1F4A4C0C-C41F-449A-B47B-BF1A5ED4D7CD} = {6D06848F-89FF-4030-BEEE-3AE0EB85DC22}
305-
{07F04295-975D-4CC8-BA6B-73EFAD49FE40} = {6D06848F-89FF-4030-BEEE-3AE0EB85DC22}
306250
{EDF8472E-5E9E-4D89-8CC2-81CEFBD2D53B} = {6D06848F-89FF-4030-BEEE-3AE0EB85DC22}
307-
{F6E2D4AC-272D-4227-A7E7-EE0B334925A1} = {6D06848F-89FF-4030-BEEE-3AE0EB85DC22}
308251
{D65CE14D-3982-4B9F-BA88-7FC650B63833} = {8106056D-3642-4C93-8A13-4EFE0B093AA0}
309252
{B69BD0EF-9E4B-059F-FD27-7808E7DD3DD1} = {6D06848F-89FF-4030-BEEE-3AE0EB85DC22}
310253
EndGlobalSection

ShadowViewer/MainWindow.xaml.cs

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Diagnostics;
4+
using System.IO;
45
using ShadowViewer.Core.Services;
56
using DryIoc;
67
using Microsoft.UI.Xaml;
@@ -93,12 +94,14 @@ private async Task OnLoading(IProgress<string>? loadingProgress)
9394
loadingProgress?.Report("加载插件...");
9495
try
9596
{
96-
pluginServices.Import(typeof(LocalPlugin));
97-
pluginServices.Import(typeof(PluginManagerPlugin));
98-
if (PluginManagerPlugin.Setting.PluginSecurityStatement)
97+
pluginServices.Import<LocalPlugin>();
98+
pluginServices.Import<PluginManagerPlugin>();
99+
if (PluginManagerPlugin.Settings.PluginSecurityStatement)
99100
{
100-
await pluginServices.ImportFromDirAsync(CoreSettings.PluginsPath);
101+
pluginServices.Import(new DirectoryInfo(CoreSettings.PluginsPath));
101102
}
103+
104+
await pluginServices.Load();
102105
#if DEBUG
103106
// 这里是测试插件用的, ImportFromPathAsync里填入你Debug出来的插件dll的文件夹位置
104107
// await pluginServices.ImportFromPathAsync(@"C:\Users\15854\Documents\GitHub\ShadowViewer.Plugin.Bika\ShadowViewer.Plugin.Bika\bin\Debug\");

ShadowViewer/Pages/NavigationPage.xaml.cs

-33
Original file line numberDiff line numberDiff line change
@@ -60,39 +60,6 @@ private void CallerOnPluginEnabledEvent(object? sender, PluginEventArgs e)
6060
}
6161

6262

63-
/// <summary>
64-
/// 顶部窗体事件
65-
/// </summary>
66-
private async void Caller_TopGridEvent(object sender, TopGridEventArg e)
67-
{
68-
try
69-
{
70-
switch (e.Mode)
71-
{
72-
case TopGridMode.ContentDialog:
73-
if (e.Element is ContentDialog dialog)
74-
{
75-
await dialog.ShowAsync();
76-
}
77-
78-
break;
79-
case TopGridMode.Dialog:
80-
TopGrid.Children.Clear();
81-
if (e.Element != null)
82-
{
83-
TopGrid.Children.Add(e.Element);
84-
}
85-
86-
break;
87-
}
88-
}
89-
catch (Exception ex)
90-
{
91-
Logger.Error("顶部窗体事件报错:{E}", ex);
92-
}
93-
}
94-
95-
9663
/// <summary>
9764
/// 左侧点击导航栏
9865
/// </summary>

ShadowViewer/Properties/launchSettings.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"profiles": {
33
"ShadowViewer (Package)": {
44
"commandName": "MsixPackage",
5-
"nativeDebugging": false
5+
"nativeDebugging": true
66
},
77
"ShadowViewer (Unpackaged)": {
88
"commandName": "Project"

ShadowViewer/Services/CallableService.cs

+1-31
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.IO;
44
using Microsoft.UI.Windowing;
@@ -27,16 +27,6 @@ internal partial class CallableService(ILogger logger) : ICallableService
2727
/// <inheritdoc />
2828
public event EventHandler? ThemeChangedEvent;
2929

30-
/// <summary>
31-
/// <inheritdoc/>
32-
/// </summary>
33-
public event EventHandler<TopGridEventArg>? TopGridEvent;
34-
35-
/// <summary>
36-
/// <inheritdoc/>
37-
/// </summary>
38-
public event EventHandler<ImportPluginEventArg>? ImportPluginEvent;
39-
4030
/// <summary>
4131
/// <inheritdoc/>
4232
/// </summary>
@@ -59,26 +49,6 @@ public void ThemeChanged()
5949
Logger.Debug("触发事件{EventName}",nameof(ThemeChangedEvent));
6050
}
6151

62-
63-
/// <summary>
64-
/// <inheritdoc/>
65-
/// </summary>
66-
public void TopGrid(object sender, UIElement element, TopGridMode mode)
67-
{
68-
Logger.Debug("{Sender}触发事件{Event}", sender.GetType().FullName,
69-
nameof(TopGridEvent));
70-
TopGridEvent?.Invoke(sender, new TopGridEventArg(element, mode));
71-
}
72-
73-
/// <summary>
74-
/// <inheritdoc/>
75-
/// </summary>
76-
public void ImportPlugin(object sender, IReadOnlyList<IStorageItem> items)
77-
{
78-
ImportPluginEvent?.Invoke(sender, new ImportPluginEventArg(items));
79-
Logger.Debug("触发事件{Event}", nameof(ImportPluginEvent));
80-
}
81-
8252
/// <summary>
8353
/// <inheritdoc/>
8454
/// </summary>

ShadowViewer/Services/NavigateService.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
using System;
1+
using System;
22
using Microsoft.UI.Xaml.Controls;
33
using Microsoft.UI.Xaml.Media.Animation;
4-
using ShadowPluginLoader.MetaAttributes;
4+
using ShadowPluginLoader.Attributes;
55
using ShadowViewer.Core.Helpers;
66
using ShadowViewer.Core.Responders;
77
using ShadowViewer.Core.Services;

ShadowViewer/ShadowViewer.csproj

+13-12
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<OutputType>WinExe</OutputType>
4-
<TargetFramework>net6.0-windows10.0.22621</TargetFramework>
4+
<TargetFramework>net8.0-windows10.0.22621</TargetFramework>
55
<TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
66
<RootNamespace>ShadowViewer</RootNamespace>
77
<ApplicationManifest>app.manifest</ApplicationManifest>
88
<Platforms>x86;x64;ARM64</Platforms>
9-
<RuntimeIdentifiers>win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers>
10-
<PublishProfile>win10-$(Platform).pubxml</PublishProfile>
9+
<RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers>
10+
<PublishProfile>win-$(Platform).pubxml</PublishProfile>
1111
<UseWinUI>true</UseWinUI>
1212
<EnableMsixTooling>true</EnableMsixTooling>
1313
<DefaultLanguage>zh-CN</DefaultLanguage>
1414
<GenerateAppInstallerFile>False</GenerateAppInstallerFile>
1515
<AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>
16-
<PackageCertificateThumbprint>B6C9305EB6489529C724543D90C55EFFDF6DE08B</PackageCertificateThumbprint>
1716
<AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm>
1817
<AppxAutoIncrementPackageRevision>False</AppxAutoIncrementPackageRevision>
1918
<AppxSymbolPackageEnabled>False</AppxSymbolPackageEnabled>
@@ -27,6 +26,7 @@
2726
<LangVersion>12</LangVersion>
2827
<PublishReadyToRun>false</PublishReadyToRun>
2928
<DefineConstants>DISABLE_XAML_GENERATED_MAIN</DefineConstants>
29+
<PackageCertificateKeyFile>ShadowViewer_TemporaryKey.pfx</PackageCertificateKeyFile>
3030
</PropertyGroup>
3131
<ItemGroup>
3232
<Compile Remove="Extensions\**" />
@@ -99,28 +99,29 @@
9999
<PackageReference Include="Microsoft.Windows.CsWinRT" Version="2.2.0" />
100100
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.1742" />
101101
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.6.250205002" />
102-
<PackageReference Include="ShadowViewer.Controls.TitleBar" Version="1.0.3" />
102+
<PackageReference Include="ShadowViewer.Controls.TitleBar" Version="1.1.1" />
103103
<PackageReference Include="WinUIEx" Version="2.5.1" />
104104

105105
</ItemGroup>
106106
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
107+
<ProjectReference Include="..\ShadowViewer.Core\ShadowViewer.Core\ShadowViewer.Core.csproj" />
107108
<!-- <ProjectReference Include="..\ShadowViewer.Controls\ShadowViewer.Controls.TitleBar\ShadowViewer.Controls.TitleBar.csproj" /> -->
108-
<ProjectReference Include="..\ShadowViewer.Plugin.Local\ShadowViewer.Plugin.Local\ShadowViewer.Plugin.Local.csproj" />
109-
<ProjectReference Include="..\ShadowViewer.Plugin.PluginManager\ShadowViewer.Plugin.PluginManager.csproj" />
109+
<!-- <ProjectReference Include="..\ShadowViewer.Plugin.Local\ShadowViewer.Plugin.Local\ShadowViewer.Plugin.Local.csproj" /> -->
110+
<!-- <ProjectReference Include="..\ShadowViewer.Plugin.PluginManager\ShadowViewer.Plugin.PluginManager.csproj" /> -->
111+
<PackageReference Include="ShadowViewer.Plugin.Local" Version="1.3.6" />
112+
<PackageReference Include="ShadowViewer.Plugin.PluginManager" Version="1.3.6" />
110113
</ItemGroup>
111114
<ItemGroup Condition="'$(Configuration)' == 'Release'">
112-
<PackageReference Include="ShadowViewer.Plugin.Local" Version="1.3.1" />
113-
<PackageReference Include="ShadowViewer.Plugin.PluginManager" Version="1.3.1" />
115+
<ProjectReference Include="..\ShadowViewer.Core\ShadowViewer.Core\ShadowViewer.Core.csproj" />
116+
<PackageReference Include="ShadowViewer.Plugin.Local" Version="1.3.6" />
117+
<PackageReference Include="ShadowViewer.Plugin.PluginManager" Version="1.3.6" />
114118
</ItemGroup>
115119
<ItemGroup>
116120
<PRIResource Remove="Extensions\**" />
117121
</ItemGroup>
118122
<ItemGroup>
119123
<None Remove="Pages\ShadowTitleBar.xaml" />
120124
</ItemGroup>
121-
<ItemGroup>
122-
<ProjectReference Include="..\ShadowViewer.Core\ShadowViewer.Core\ShadowViewer.Core.csproj" />
123-
</ItemGroup>
124125
<ItemGroup>
125126
<Page Update="Pages\ShadowTitleBar.xaml">
126127
<Generator>MSBuild:Compile</Generator>

ShadowViewer/ViewModels/TitleBarViewModel.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
using Microsoft.UI.Xaml;
77
using Microsoft.UI.Xaml.Controls;
88
using Microsoft.UI.Xaml.Controls.Primitives;
9-
using ShadowPluginLoader.MetaAttributes;
9+
using ShadowPluginLoader.Attributes;
1010
using ShadowViewer.Core;
1111
using ShadowViewer.Core.Extensions;
1212
using ShadowViewer.Core.Helpers;

0 commit comments

Comments
 (0)