Skip to content

Commit

Permalink
Merge branch 'main' into 5bfa/CQ-PreviewHandlerVanaraRemoval
Browse files Browse the repository at this point in the history
  • Loading branch information
0x5bfa authored Sep 12, 2024
2 parents fa4adc3 + 2a95708 commit d71f66d
Show file tree
Hide file tree
Showing 94 changed files with 2,714 additions and 8,245 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/cd-preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -114,13 +114,13 @@ jobs:
$fileContent | Set-Content $localFilePath
- name: Sign Files with Azure Trusted Signing
uses: azure/trusted-signing-action@v0.3.20
uses: azure/trusted-signing-action@v0.4.0
with:
azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }}
azure-client-id: ${{ secrets.AZURE_CLIENT_ID }}
azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
endpoint: https://eus.codesigning.azure.net/
code-signing-account-name: ${{ secrets.SIGNING_ACCOUNT_NAME }}
trusted-signing-account-name: ${{ secrets.SIGNING_ACCOUNT_NAME }}
certificate-profile-name: ${{ secrets.SIGNING_PROFILE_NAME }}
files-folder: ${{ env.APPX_PACKAGE_DIR }}
files-folder-filter: msixbundle
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/cd-stable.yml
Original file line number Diff line number Diff line change
Expand Up @@ -114,13 +114,13 @@ jobs:
$fileContent | Set-Content $localFilePath
- name: Sign Files with Azure Trusted Signing
uses: azure/trusted-signing-action@v0.3.20
uses: azure/trusted-signing-action@v0.4.0
with:
azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }}
azure-client-id: ${{ secrets.AZURE_CLIENT_ID }}
azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
endpoint: https://eus.codesigning.azure.net/
code-signing-account-name: ${{ secrets.SIGNING_ACCOUNT_NAME }}
trusted-signing-account-name: ${{ secrets.SIGNING_ACCOUNT_NAME }}
certificate-profile-name: ${{ secrets.SIGNING_PROFILE_NAME }}
files-folder: ${{ env.APPX_PACKAGE_DIR }}
files-folder-filter: msixbundle
Expand Down
2 changes: 1 addition & 1 deletion Files.sln
Original file line number Diff line number Diff line change
Expand Up @@ -626,4 +626,4 @@ Global
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0E62043C-A7A1-4982-9EC9-4CDB2939B776}
EndGlobalSection
EndGlobal
EndGlobal
2 changes: 1 addition & 1 deletion builds/azure-pipelines-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ jobs:
- task: UseDotNet@2
inputs:
packageType: sdk
version: 8.0.x
version: 8.0.303
includePreviewVersions: false

- task: CmdLine@2
Expand Down
2 changes: 1 addition & 1 deletion src/Files.App (Package)/Files.Package.wapproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<DisableXbfLineInfo>False</DisableXbfLineInfo>
<GenerateTestArtifacts>True</GenerateTestArtifacts>
<AppxBundleAutoResourcePackageQualifiers>Scale|DXFeatureLevel</AppxBundleAutoResourcePackageQualifiers>
<AppxDefaultResourceQualifiers>Language=en-US;af;ar;be-BY;bg;ca;cs-CZ;da;de-DE;el;en-GB;es-ES;es-419;fa-IR;fi-FI;fil-PH;fr-FR;he-IL;hi-IN;hr-HR;hu-HU;id-ID;it-IT;ja-JP;ka;km-KH;ko-KR;ku-Arab;lt-LT;lv-LV;ms-MY;nb-NO;nl-NL;or-IN;pl-PL;pt-BR;pt-PT;ro-RO;ru-RU;sk-SK;sq-AL;sr-Cyrl;sv-SE;ta;th-TH;tr-TR;uk-UA;vi;zh-Hans;zh-Hant</AppxDefaultResourceQualifiers>
<AppxDefaultResourceQualifiers>Language=en-US;af;ar;be-BY;bg;ca;cs-CZ;da;de-DE;el;en-GB;es-ES;es-419;fa-IR;fi-FI;fil-PH;fr-FR;he-IL;hi-IN;hr-HR;hu-HU;id-ID;it-IT;ja-JP;ka;km-KH;ko-KR;lt-LT;lv-LV;ms-MY;nb-NO;nl-NL;pl-PL;pt-BR;pt-PT;ro-RO;ru-RU;sk-SK;sq-AL;sr-Cyrl;sv-SE;ta;th-TH;tr-TR;uk-UA;vi;zh-Hans;zh-Hant</AppxDefaultResourceQualifiers>
<UapAppxPackageBuildMode>StoreUpload</UapAppxPackageBuildMode>
<HoursBetweenUpdateChecks>255</HoursBetweenUpdateChecks>
<EntryPointProjectUniqueName>..\Files.App\Files.App.csproj</EntryPointProjectUniqueName>
Expand Down
4 changes: 1 addition & 3 deletions src/Files.App (Package)/Package.appxmanifest
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<Identity
Name="FilesDev"
Publisher="CN=Files"
Version="3.6.17.0" />
Version="3.7.5.0" />

<Properties>
<DisplayName>Files - Dev</DisplayName>
Expand Down Expand Up @@ -57,13 +57,11 @@
<Resource Language="ka" />
<Resource Language="km-KH" />
<Resource Language="ko-KR" />
<Resource Language="ku-Arab" />
<Resource Language="lt-LT" />
<Resource Language="lv-LV" />
<Resource Language="ms-MY" />
<Resource Language="nb-NO" />
<Resource Language="nl-NL" />
<Resource Language="or-IN" />
<Resource Language="pl-PL" />
<Resource Language="pt-BR" />
<Resource Language="pt-PT" />
Expand Down
46 changes: 26 additions & 20 deletions src/Files.App.CsWin32/Windows.Win32.ComPtr.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) 2024 Files Community
// Copyright (c) 2024 Files Community
// Licensed under the MIT License. See the LICENSE.

using System;
Expand All @@ -8,38 +8,44 @@

namespace Windows.Win32
{
/// <summary>
/// Contains a COM pointer and a set of methods to work with the pointer safely.
/// </summary>
public unsafe struct ComPtr<T> : IDisposable where T : unmanaged
{
private T* ptr;
private T* _ptr;

public T* Value
=> this.ptr;
public bool IsNull
=> _ptr == default;

public T** Address
=> (T**)Unsafe.AsPointer(ref Unsafe.AsRef(in this));
public ComPtr(T* ptr)
{
_ptr = ptr;

public bool IsNull
=> ptr == default;
if (ptr is not null)
((IUnknown*)ptr)->AddRef();
}

public ComPtr(T* other)
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public readonly T* Get()
{
this.ptr = other;
return _ptr;
}

if (other is not null)
{
_ = ((IUnknown*)other)->AddRef();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public readonly T** GetAddressOf()
{
return (T**)Unsafe.AsPointer(ref Unsafe.AsRef(in this));
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Dispose()
{
T* pointer = this.ptr;

if (pointer is not null)
T* ptr = _ptr;
if (ptr is not null)
{
this.ptr = null;

_ = ((IUnknown*)pointer)->Release();
_ptr = null;
((IUnknown*)ptr)->Release();
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/Files.App.Server/Files.App.Server.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<OutputType>WinExe</OutputType>
<DefaultLanguage>en-US</DefaultLanguage>
<AppxBundleAutoResourcePackageQualifiers>Scale|DXFeatureLevel</AppxBundleAutoResourcePackageQualifiers>
<AppxDefaultResourceQualifiers>Language=en-US;af;ar;be-BY;bg;ca;cs-CZ;da;de-DE;el;en-GB;es-ES;es-419;fa-IR;fi-FI;fil-PH;fr-FR;he-IL;hi-IN;hr-HR;hu-HU;id-ID;it-IT;ja-JP;ka;km-KH;ko-KR;ku-Arab;lt-LT;lv-LV;ms-MY;nb-NO;nl-NL;or-IN;pl-PL;pt-BR;pt-PT;ro-RO;ru-RU;sk-SK;sq-AL;sr-Cyrl;sv-SE;ta;th-TH;tr-TR;uk-UA;vi;zh-Hans;zh-Hant</AppxDefaultResourceQualifiers>
<AppxDefaultResourceQualifiers>Language=en-US;af;ar;be-BY;bg;ca;cs-CZ;da;de-DE;el;en-GB;es-ES;es-419;fa-IR;fi-FI;fil-PH;fr-FR;he-IL;hi-IN;hr-HR;hu-HU;id-ID;it-IT;ja-JP;ka;km-KH;ko-KR;lt-LT;lv-LV;ms-MY;nb-NO;nl-NL;pl-PL;pt-BR;pt-PT;ro-RO;ru-RU;sk-SK;sq-AL;sr-Cyrl;sv-SE;ta;th-TH;tr-TR;uk-UA;vi;zh-Hans;zh-Hant</AppxDefaultResourceQualifiers>
<TargetFramework>net8.0-windows10.0.22621.0</TargetFramework>
<TargetPlatformMinVersion>10.0.19041.0</TargetPlatformMinVersion>
<ImplicitUsings>enable</ImplicitUsings>
Expand Down
2 changes: 0 additions & 2 deletions src/Files.App/Actions/FileSystem/OpenItemAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,9 @@ public RichGlyph Glyph
public HotKey HotKey
=> new(Keys.Enter);

private const int MaxOpenCount = 10;

public bool IsExecutable =>
context.HasSelection &&
context.SelectedItems.Count <= MaxOpenCount &&
!(context.ShellPage is ColumnShellPage &&
context.SelectedItem?.PrimaryItemAttribute == StorageItemTypes.Folder);

Expand Down
2 changes: 0 additions & 2 deletions src/Files.App/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -159,8 +159,6 @@ async Task ActivateAsync()
}

await AppLifecycleHelper.InitializeAppComponentsAsync();

AppLifecycleHelper.IsLaunchInitialized = true;
}
}

Expand Down
3 changes: 2 additions & 1 deletion src/Files.App/Data/Commands/ActionCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,8 @@ public Task ExecuteAsync(object? parameter = null)
{
if (IsExecutable)
{
SentrySdk.Metrics.Increment("actions", tags: new Dictionary<string, string> { { "command", Code.ToString() } });
// Re-enable when Metris feature is available again
// SentrySdk.Metrics.Increment("actions", tags: new Dictionary<string, string> { { "command", Code.ToString() } });
return Action.ExecuteAsync(parameter);
}

Expand Down
8 changes: 0 additions & 8 deletions src/Files.App/Data/Items/WindowEx.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,6 @@ public unsafe WindowEx(int minWidth = 400, int minHeight = 300)
_oldWndProc = Marshal.GetDelegateForFunctionPointer<WNDPROC>(pOldWndProc);

Closed += WindowEx_Closed;
Activated += WindowEx_Activated; ;
}

private unsafe void StoreWindowPlacementData()
Expand Down Expand Up @@ -298,16 +297,9 @@ private void WindowEx_Closed(object sender, WindowEventArgs args)
StoreWindowPlacementData();
}

private void WindowEx_Activated(object sender, WindowActivatedEventArgs args)
{
if (AppLifecycleHelper.IsLaunchInitialized && SystemBackdrop is AppSystemBackdrop appSystemBackdrop)
appSystemBackdrop.SystemBackdropConfiguration.IsInputActive = args.WindowActivationState is not WindowActivationState.Deactivated;
}

public void Dispose()
{
Closed -= WindowEx_Closed;
Activated -= WindowEx_Activated;
}
}
}
4 changes: 2 additions & 2 deletions src/Files.App/Data/Models/SelectedItemsPropertiesViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,8 @@ public bool IsUncompressedItemSizeVisibile
set => SetProperty(ref isUncompressedItemSizeVisibile, value);
}

private long itemSizeBytes;
public long ItemSizeBytes
private decimal itemSizeBytes;
public decimal ItemSizeBytes
{
get => itemSizeBytes;
set => SetProperty(ref itemSizeBytes, value);
Expand Down
1 change: 1 addition & 0 deletions src/Files.App/Extensions/StringExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ public static string ConvertSizeAbbreviation(this string value)
public static string ToSizeString(this double size) => ByteSize.FromBytes(size).ToSizeString();
public static string ToSizeString(this long size) => ByteSize.FromBytes(size).ToSizeString();
public static string ToSizeString(this ulong size) => ByteSize.FromBytes(size).ToSizeString();
public static string ToSizeString(this decimal size) => ByteSize.FromBytes((double)size).ToSizeString();
public static string ToSizeString(this ByteSize size) => size.ToBinaryString().ConvertSizeAbbreviation();

public static string ToLongSizeString(this long size) => ByteSize.FromBytes(size).ToLongSizeString();
Expand Down
10 changes: 7 additions & 3 deletions src/Files.App/Files.App.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<AssemblyName>Files</AssemblyName>
<DefaultLanguage>en-US</DefaultLanguage>
<AppxBundleAutoResourcePackageQualifiers>Scale|DXFeatureLevel</AppxBundleAutoResourcePackageQualifiers>
<AppxDefaultResourceQualifiers>Language=en-US;af;ar;be-BY;bg;ca;cs-CZ;da;de-DE;el;en-GB;es-ES;es-419;fa-IR;fi-FI;fil-PH;fr-FR;he-IL;hi-IN;hr-HR;hu-HU;id-ID;it-IT;ja-JP;ka;km-KH;ko-KR;ku-Arab;lt-LT;lv-LV;ms-MY;nb-NO;nl-NL;or-IN;pl-PL;pt-BR;pt-PT;ro-RO;ru-RU;sk-SK;sq-AL;sr-Cyrl;sv-SE;ta;th-TH;tr-TR;uk-UA;vi;zh-Hans;zh-Hant</AppxDefaultResourceQualifiers>
<AppxDefaultResourceQualifiers>Language=en-US;af;ar;be-BY;bg;ca;cs-CZ;da;de-DE;el;en-GB;es-ES;es-419;fa-IR;fi-FI;fil-PH;fr-FR;he-IL;hi-IN;hr-HR;hu-HU;id-ID;it-IT;ja-JP;ka;km-KH;ko-KR;lt-LT;lv-LV;ms-MY;nb-NO;nl-NL;pl-PL;pt-BR;pt-PT;ro-RO;ru-RU;sk-SK;sq-AL;sr-Cyrl;sv-SE;ta;th-TH;tr-TR;uk-UA;vi;zh-Hans;zh-Hant</AppxDefaultResourceQualifiers>
<TargetPlatformMinVersion>10.0.19041.0</TargetPlatformMinVersion>
<GenerateAppInstallerFile>False</GenerateAppInstallerFile>
<AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm>
Expand Down Expand Up @@ -71,12 +71,12 @@
<PackageReference Include="FluentFTP" Version="43.0.1" />
<PackageReference Include="LibGit2Sharp" Version="0.30.0" />
<PackageReference Include="MessageFormat" Version="7.1.0" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.7" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.8" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.3233" />
<PackageReference Include="Sentry" Version="4.9.0" />
<PackageReference Include="Sentry" Version="4.10.2" />
<PackageReference Include="SevenZipSharp" Version="1.0.2" />
<PackageReference Include="SQLitePCLRaw.bundle_green" Version="2.1.8" />
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.5.240627000" />
Expand Down Expand Up @@ -133,5 +133,9 @@
<TrimmerRootAssembly Include="CommunityToolkit.WinUI.UI.Controls.Media" />
<TrimmerRootAssembly Include="CommunityToolkit.WinUI.UI.Controls.Primitives" />
</ItemGroup>

<ItemGroup>
<AdditionalFiles Include="Strings\en-US\Resources.resw" />
</ItemGroup>

</Project>
10 changes: 3 additions & 7 deletions src/Files.App/Helpers/Application/AppLifecycleHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
using CommunityToolkit.WinUI.Helpers;
using Files.App.Helpers.Application;
using Files.App.Services.SizeProvider;
using Files.App.Storage.Storables;
using Files.App.Utils.Logger;
using Files.App.ViewModels.Settings;
using Microsoft.Extensions.DependencyInjection;
Expand Down Expand Up @@ -58,12 +57,6 @@ public static class AppLifecycleHelper
_ => Constants.AssetPaths.StableLogo
});

/// <summary>
/// Gets or sets a value that indicates whether the application is ready to be interacted with.
/// This is primarily used for DI container initialization check.
/// </summary>
public static bool IsLaunchInitialized { get; set; }

/// <summary>
/// Initializes the app components.
/// </summary>
Expand Down Expand Up @@ -147,6 +140,9 @@ public static IHost ConfigureHost()
return Host.CreateDefaultBuilder()
.UseEnvironment(AppLifecycleHelper.AppEnvironment.ToString())
.ConfigureLogging(builder => builder
.ClearProviders()
.AddConsole()
.AddDebug()
.AddProvider(new FileLoggerProvider(Path.Combine(ApplicationData.Current.LocalFolder.Path, "debug.log")))
.AddProvider(new SentryLoggerProvider())
.SetMinimumLevel(LogLevel.Information))
Expand Down
12 changes: 12 additions & 0 deletions src/Files.App/Helpers/StringsHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Files.App.Helpers
{
public sealed partial class Strings
{
}
}
22 changes: 10 additions & 12 deletions src/Files.App/Helpers/UI/AppSystemBackdrop.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ internal sealed class AppSystemBackdrop : SystemBackdrop
private XamlRoot root;
private SystemBackdropTheme? prevTheme = null;

public SystemBackdropConfiguration SystemBackdropConfiguration { get; set; }

public AppSystemBackdrop(bool isSecondaryWindow = false)
{
this.isSecondaryWindow = isSecondaryWindow;
Expand All @@ -34,21 +32,21 @@ protected override void OnTargetConnected(ICompositionSupportsSystemBackdrop con
base.OnTargetConnected(connectedTarget, xamlRoot);
this.target = connectedTarget;
this.root = xamlRoot;
SystemBackdropConfiguration = GetDefaultSystemBackdropConfiguration(connectedTarget, xamlRoot);
controller = GetSystemBackdropController(userSettingsService.AppearanceSettingsService.AppThemeBackdropMaterial, SystemBackdropConfiguration.Theme);
controller?.SetSystemBackdropConfiguration(SystemBackdropConfiguration);
var configuration = GetDefaultSystemBackdropConfiguration(connectedTarget, xamlRoot);
controller = GetSystemBackdropController(userSettingsService.AppearanceSettingsService.AppThemeBackdropMaterial, configuration.Theme);
controller?.SetSystemBackdropConfiguration(configuration);
controller?.AddSystemBackdropTarget(connectedTarget);
}

protected override void OnDefaultSystemBackdropConfigurationChanged(ICompositionSupportsSystemBackdrop target, XamlRoot xamlRoot)
{
base.OnDefaultSystemBackdropConfigurationChanged(target, xamlRoot);
SystemBackdropConfiguration = GetDefaultSystemBackdropConfiguration(target, xamlRoot);
if (controller is not DesktopAcrylicController acrylicController || acrylicController.Kind != DesktopAcrylicKind.Thin || SystemBackdropConfiguration.Theme == prevTheme)
var configuration = GetDefaultSystemBackdropConfiguration(target, xamlRoot);
if (controller is not DesktopAcrylicController acrylicController || acrylicController.Kind != DesktopAcrylicKind.Thin || configuration.Theme == prevTheme)
return;

prevTheme = SystemBackdropConfiguration.Theme;
SetThinAcrylicBackdropProperties(acrylicController, SystemBackdropConfiguration.Theme);
prevTheme = configuration.Theme;
SetThinAcrylicBackdropProperties(acrylicController, configuration.Theme);
}

protected override void OnTargetDisconnected(ICompositionSupportsSystemBackdrop disconnectedTarget)
Expand Down Expand Up @@ -81,9 +79,9 @@ private void OnSettingChanged(object? sender, SettingChangedEventArgs e)
case nameof(IAppearanceSettingsService.AppThemeBackdropMaterial):
controller?.RemoveAllSystemBackdropTargets();
controller?.Dispose();
SystemBackdropConfiguration = GetDefaultSystemBackdropConfiguration(target, root);
var newController = GetSystemBackdropController((BackdropMaterialType)e.NewValue!, SystemBackdropConfiguration.Theme);
newController?.SetSystemBackdropConfiguration(SystemBackdropConfiguration);
var configuration = GetDefaultSystemBackdropConfiguration(target, root);
var newController = GetSystemBackdropController((BackdropMaterialType)e.NewValue!, configuration.Theme);
newController?.SetSystemBackdropConfiguration(configuration);
newController?.AddSystemBackdropTarget(target);
controller = newController;
break;
Expand Down
3 changes: 1 addition & 2 deletions src/Files.App/Services/App/AppUpdateSideloadService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,7 @@ public async Task CheckForUpdatesAsync()
}
catch (Exception e)
{
// It seems that the logger may throw an exception, so we need to ignore it. (#15688)
SafetyExtensions.IgnoreExceptions(() => Logger?.LogError(e, e.Message));
Logger?.LogError(e, e.Message);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.IO;
using System.IO.Pipes;
using System.Security.Principal;
using System.Text;

namespace Files.App.Services.PreviewPopupProviders
{
Expand All @@ -30,13 +31,14 @@ public async Task SwitchPreviewAsync(string path)
private async Task DoPreviewAsync(string path, string message)
{
string pipeName = $"QuickLook.App.Pipe.{WindowsIdentity.GetCurrent().User?.Value}";
var encoding = Encoding.GetEncoding("UTF-8", new EncoderReplacementFallback("?"), new DecoderExceptionFallback());

await using var client = new NamedPipeClientStream(".", pipeName, PipeDirection.Out);
try
{
await client.ConnectAsync(TIMEOUT);

await using var writer = new StreamWriter(client);
await using var writer = new StreamWriter(client, encoding);
await writer.WriteLineAsync($"{message}|{path}");
await writer.FlushAsync();
}
Expand Down
Loading

0 comments on commit d71f66d

Please sign in to comment.