Merge branch 'release/rc-v1.2.0' of github.com:ONLYOFFICE/DocSpace into release/rc-v1.2.0

This commit is contained in:
Akmal Isomadinov 2023-01-25 14:05:01 +05:00
commit 2dd7ffe703
1142 changed files with 13451 additions and 5518 deletions

View File

@ -41,8 +41,13 @@ KAFKA_HOST = os.environ["KAFKA_HOST"] if environ.get("KAFKA_HOST") else "kafka:9
RUN_FILE = sys.argv[1] if sys.argv[1] else "none"
LOG_FILE = sys.argv[2] if sys.argv[2] else "none"
REDIS_HOST=os.environ["REDIS_HOST"] if environ.get("REDIS_HOST") else "onlyoffice-redis"
RABBIT_HOST=os.environ["RABBIT_HOST"] if environ.get("RABBIT_HOST") else "onlyoffice-rabbitmq"
REDIS_HOST = os.environ["REDIS_HOST"] if environ.get("REDIS_HOST") else "onlyoffice-redis"
REDIS_PORT = os.environ["REDIS_PORT"] if environ.get("REDIS_PORT") else "6379"
RABBIT_HOST = os.environ["RABBIT_HOST"] if environ.get("RABBIT_HOST") else "onlyoffice-rabbitmq"
RABBIT_USER_NAME = os.environ["RABBIT_USER_NAME"] if environ.get("RABBIT_USER_NAME") else "guest"
RABBIT_PASSWORD = os.environ["RABBIT_PASSWORD"] if environ.get("RABBIT_PASSWORD") else "guest"
RABBIT_PORT = os.environ["RABBIT_PORT"] if environ.get("RABBIT_PORT") else "5672"
class RunServices:
def __init__(self, SERVICE_PORT, PATH_TO_CONF):
@ -160,11 +165,15 @@ writeJsonFile(filePath, jsonData)
filePath = "/app/onlyoffice/config/rabbitmq.json"
jsonData = openJsonFile(filePath)
updateJsonData(jsonData,"$.RabbitMQ.Hostname", RABBIT_HOST)
updateJsonData(jsonData,"$.RabbitMQ.UserName", RABBIT_USER_NAME)
updateJsonData(jsonData, "$.RabbitMQ.Password", RABBIT_PASSWORD)
updateJsonData(jsonData, "$.RabbitMQ.Port", RABBIT_PORT)
writeJsonFile(filePath, jsonData)
filePath = "/app/onlyoffice/config/redis.json"
jsonData = openJsonFile(filePath)
updateJsonData(jsonData,"$.Redis.Hosts.[0].Host", REDIS_HOST)
updateJsonData(jsonData,"$.Redis.Hosts.[0].Port", REDIS_PORT)
writeJsonFile(filePath, jsonData)
run = RunServices(SERVICE_PORT, PATH_TO_CONF)

View File

@ -74,7 +74,7 @@ public class RegisterInstanceWorkerService<T> : BackgroundService where T : IHos
{
try
{
using var scope = _serviceProvider.CreateScope();
await using var scope = _serviceProvider.CreateAsyncScope();
var registerInstanceService = scope.ServiceProvider.GetService<IRegisterInstanceManager<T>>();
@ -96,7 +96,7 @@ public class RegisterInstanceWorkerService<T> : BackgroundService where T : IHos
{
try
{
using var scope = _serviceProvider.CreateScope();
await using var scope = _serviceProvider.CreateAsyncScope();
var registerInstanceService = scope.ServiceProvider.GetService<IRegisterInstanceManager<T>>();

View File

@ -48,7 +48,7 @@ public class EmailSenderSink : Sink
var responce = new SendResponse(message, _senderName, default(SendResult));
try
{
using var scope = _serviceProvider.CreateScope();
await using var scope = _serviceProvider.CreateAsyncScope();
var m = scope.ServiceProvider.GetRequiredService<EmailSenderSinkMessageCreator>().CreateNotifyMessage(message, _senderName);
var result = await _sender.Send(m);

View File

@ -194,7 +194,7 @@ public class NotifyEngine : INotifyEngine, IDisposable
}
if (request != null)
{
using var scope = _serviceScopeFactory.CreateScope();
await using var scope = _serviceScopeFactory.CreateAsyncScope();
foreach (var action in Actions)
{
((INotifyEngineAction)scope.ServiceProvider.GetRequiredService(action)).AfterTransferRequest(request);

View File

@ -44,7 +44,7 @@ class JabberSenderSink : Sink
try
{
var result = SendResult.OK;
using var scope = _serviceProvider.CreateScope();
await using var scope = _serviceProvider.CreateAsyncScope();
var m = scope.ServiceProvider.GetRequiredService<JabberSenderSinkMessageCreator>().CreateNotifyMessage(message, _senderName);
if (string.IsNullOrEmpty(m.Reciever))

View File

@ -49,7 +49,7 @@ class PushSenderSink : Sink
{
var result = SendResult.OK;
using var scope = _serviceProvider.CreateScope();
await using var scope = _serviceProvider.CreateAsyncScope();
var m = scope.ServiceProvider.GetRequiredService<PushSenderSinkMessageCreator>().CreateNotifyMessage(message, _senderName);
if (string.IsNullOrEmpty(m.Reciever))

View File

@ -64,7 +64,7 @@ public class AWSSender : SmtpSender, IDisposable
try
{
_logger.DebugSendTo(m.TenantId, m.Reciever);
using var scope = _serviceProvider.CreateScope();
await using var scope = _serviceProvider.CreateAsyncScope();
var tenantManager = scope.ServiceProvider.GetService<TenantManager>();
tenantManager.SetCurrentTenant(m.TenantId);

View File

@ -41,7 +41,7 @@ public class TelegramSender : INotifySender
public void Init(IDictionary<string, string> properties) { }
public Task<NoticeSendResult> Send(NotifyMessage m)
public async Task<NoticeSendResult> Send(NotifyMessage m)
{
if (!string.IsNullOrEmpty(m.Content))
{
@ -50,7 +50,7 @@ public class TelegramSender : INotifySender
}
try
{
using var scope = _serviceProvider.CreateScope();
await using var scope = _serviceProvider.CreateAsyncScope();
var TelegramHelper = scope.ServiceProvider.GetService<TelegramHelper>();
TelegramHelper.SendMessage(m);
}
@ -59,6 +59,6 @@ public class TelegramSender : INotifySender
_logger.ErrorUnexpected(e);
}
return Task.FromResult(NoticeSendResult.OK);
return await Task.FromResult(NoticeSendResult.OK);
}
}

View File

@ -45,7 +45,7 @@ class TelegramSenderSink : Sink
{
const SendResult result = SendResult.OK;
using var scope = _serviceProvider.CreateScope();
await using var scope = _serviceProvider.CreateAsyncScope();
var m = scope.ServiceProvider.GetRequiredService<TelegramSenderSinkMessageCreator>().CreateNotifyMessage(message, _senderName);
await _sender.Send(m);

View File

@ -116,7 +116,7 @@ public class BackupProgressItem : BaseBackupProgressItem
Thread.CurrentThread.Priority = ThreadPriority.BelowNormal;
}
using var scope = _serviceScopeProvider.CreateScope();
await using var scope = _serviceScopeProvider.CreateAsyncScope();
_tenantManager = scope.ServiceProvider.GetService<TenantManager>();
_backupStorageFactory = scope.ServiceProvider.GetService<BackupStorageFactory>();

View File

@ -111,7 +111,7 @@ public class RestoreProgressItem : BaseBackupProgressItem
try
{
using var scope = _serviceScopeProvider.CreateScope();
await using var scope = _serviceScopeProvider.CreateAsyncScope();
_tenantManager = scope.ServiceProvider.GetService<TenantManager>();
_backupStorageFactory = scope.ServiceProvider.GetService<BackupStorageFactory>();

View File

@ -102,7 +102,7 @@ public class TransferProgressItem : BaseBackupProgressItem
try
{
using var scope = _serviceScopeProvider.CreateScope();
await using var scope = _serviceScopeProvider.CreateAsyncScope();
_tenantManager = scope.ServiceProvider.GetService<TenantManager>();
_transferPortalTask = scope.ServiceProvider.GetService<TransferPortalTask>();

View File

@ -70,7 +70,7 @@ public class ReassignProgressItem : DistributedTaskProgress
protected override async Task DoJob()
{
using var scope = _serviceScopeFactory.CreateScope();
await using var scope = _serviceScopeFactory.CreateAsyncScope();
var scopeClass = scope.ServiceProvider.GetService<ReassignProgressItemScope>();
var queueWorkerRemove = scope.ServiceProvider.GetService<QueueWorkerRemove>();
var (tenantManager, coreBaseSettings, messageService, studioNotifyService, securityContext, userManager, userPhotoManager, displayUserSettingsHelper, messageTarget, options) = scopeClass;

View File

@ -67,7 +67,7 @@ public class RemoveProgressItem : DistributedTaskProgress
protected override async Task DoJob()
{
using var scope = _serviceScopeFactory.CreateScope();
await using var scope = _serviceScopeFactory.CreateAsyncScope();
var scopeClass = scope.ServiceProvider.GetService<RemoveProgressItemScope>();
var (tenantManager, coreBaseSettings, messageService, studioNotifyService, securityContext, userManager, messageTarget, webItemManagerSecurity, storageFactory, userFormatter, options) = scopeClass;
var logger = options.CreateLogger("ASC.Web");

View File

@ -57,7 +57,7 @@ public class EncryptionOperation : DistributedTaskProgress
protected override async Task DoJob()
{
using var scope = _serviceScopeFactory.CreateScope();
await using var scope = _serviceScopeFactory.CreateAsyncScope();
var scopeClass = scope.ServiceProvider.GetService<EncryptionOperationScope>();
var (log, encryptionSettingsHelper, tenantManager, notifyHelper, coreBaseSettings, storageFactoryConfig, storageFactory, configuration) = scopeClass;
notifyHelper.Init(_serverRootPath);

View File

@ -255,7 +255,7 @@ public class UploadOperationProgress : DistributedTaskProgress
protected override async Task DoJob()
{
using var scope = _serviceProvider.CreateScope();
await using var scope = _serviceProvider.CreateAsyncScope();
var tenantManager = scope.ServiceProvider.GetService<TenantManager>();
var staticUploader = scope.ServiceProvider.GetService<StaticUploader>();
var tenant = tenantManager.GetTenant(TenantId);

View File

@ -148,7 +148,7 @@ public class MigrateOperation : DistributedTaskProgress
_logger.DebugTenant(_tenantId);
Status = DistributedTaskStatus.Running;
using var scope = _serviceProvider.CreateScope();
await using var scope = _serviceProvider.CreateAsyncScope();
var tempPath = scope.ServiceProvider.GetService<TempPath>();
var scopeClass = scope.ServiceProvider.GetService<MigrateOperationScope>();
var (tenantManager, securityContext, storageFactory, options, storageSettingsHelper, settingsManager) = scopeClass;

View File

@ -16,6 +16,11 @@
res.end();
});
router.post("/create-folder", (req, res) => {
files.createFolder(req.body);
res.end();
});
router.post("/update-file", (req, res) => {
files.updateFile(req.body);
res.end();

View File

@ -138,6 +138,11 @@
modifyFolder(room, "create", fileId, "file", data);
}
function createFolder({ folderId, room, data } = {}) {
logger.info(`create new folder ${folderId} in room ${room}`);
modifyFolder(room, "create", folderId, "folder", data);
}
function updateFile({ fileId, room, data } = {}) {
logger.info(`update file ${fileId} in room ${room}`);
modifyFolder(room, "update", fileId, "file", data);
@ -158,5 +163,5 @@
filesIO.to(room).emit("s:markasnew-folder", { folderId, count });
}
return { startEdit, stopEdit, createFile, deleteFile, updateFile, markAsNewFile, markAsNewFolder };
return { startEdit, stopEdit, createFile, createFolder, deleteFile, updateFile, markAsNewFile, markAsNewFolder };
};

View File

@ -6,6 +6,7 @@
<IsPackable>false</IsPackable>
<Configurations>Debug;Release;SORT</Configurations>
<RootNamespace>Frontend.Tests</RootNamespace>
</PropertyGroup>
<ItemGroup>

View File

@ -0,0 +1,857 @@
// (c) Copyright Ascensio System SIA 2010-2022
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using Frontend.Tests;
using Frontend.Tests.Models;
using Microsoft.VisualBasic;
using NUnit.Framework;
namespace Frontend.Tests;
public class ImagesTest
{
public static string BasePath
{
get
{
return Environment.GetEnvironmentVariable("BASE_DIR") ?? Path.GetFullPath(Utils.ConvertPathToOS("../../../../../../"));
}
}
public List<string> Workspaces { get; set; }
public List<ImageFile> ImageFiles { get; set; }
public List<SourceImageFile> SourceImageFiles { get; set; }
public Dictionary<string, string> HashErrorFiles { get; set; }
private static Dictionary<ModuleTypes, string> Modules
{
get
{
return new Dictionary<ModuleTypes, string>() {
{ ModuleTypes.PUBLIC, Path.Combine(BasePath,Utils.ConvertPathToOS("public")) },
{ ModuleTypes.COMMON, Path.Combine(BasePath,Utils.ConvertPathToOS("packages/common")) },
{ ModuleTypes.COMPONENTS, Path.Combine(BasePath,Utils.ConvertPathToOS("packages/components")) },
{ ModuleTypes.CLIENT, Path.Combine(BasePath,Utils.ConvertPathToOS("packages/client")) },
{ ModuleTypes.EDITOR, Path.Combine(BasePath,Utils.ConvertPathToOS("packages/editor")) },
{ ModuleTypes.LOGIN, Path.Combine(BasePath,Utils.ConvertPathToOS("packages/login")) }
};
}
}
private static ModuleTypes GetModuleType(string path)
{
var mType = Modules.First(m => path.Contains(m.Value)).Key;
return mType;
}
[OneTimeSetUp]
public void Setup()
{
TestContext.Progress.WriteLine($"Base path = {BasePath}");
HashErrorFiles = new Dictionary<string, string>();
Workspaces = Modules.Values.ToList();
TestContext.Progress.WriteLine($"Workspaces: {string.Join("\r\n", Workspaces)}");
//var searchPaterns = new string[] { "*.svg", "*.png", "*.jpg", "*.ico", "*.jpeg" };
var imageSearchPatern = @"\.svg|\.png|\.jpg|\.ico|\.jpeg";
var imageFiles = from wsPath in Workspaces
from filePath in Utils.GetFiles(wsPath, imageSearchPatern, SearchOption.AllDirectories)
where !filePath.Contains(Utils.ConvertPathToOS("dist/")) && !filePath.Contains(Utils.ConvertPathToOS("tests/"))
//where filePath.Contains(Utils.ConvertPathToOS("public/images/"))
select Path.GetFullPath(filePath);
//TestContext.Progress.WriteLine($"Found imageFiles by filter '{imageSearchPatern}' count={imageFiles.Count()}. First path is '{imageFiles.FirstOrDefault()}'");
ImageFiles = new List<ImageFile>();
foreach (var path in imageFiles)
{
try
{
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(path))
{
var hash = md5.ComputeHash(stream);
var md5hash = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
ImageFiles.Add(new ImageFile(path, GetModuleType(path), md5hash));
}
}
}
catch (Exception ex)
{
HashErrorFiles.Add(path, ex.Message);
TestContext.Progress.WriteLine($"File path = {path} failed to parse with error: {ex.Message}");
}
}
TestContext.Progress.WriteLine($"Found ImageFiles by filter '{imageSearchPatern}' count={ImageFiles.Count}. First path is '{ImageFiles.FirstOrDefault()?.FilePath}'");
var sourceSearchPatern = @"(\.js|\.jsx|\.ts|\.tsx|\.html|\.css|\.scss|\.sass)$";
var sourceFiles = (from wsPath in Workspaces
from filePath in Utils.GetFiles(wsPath, sourceSearchPatern, SearchOption.AllDirectories)
where !filePath.Contains(Utils.ConvertPathToOS("dist/"))
&& !filePath.Contains(Utils.ConvertPathToOS("tests/"))
&& !filePath.Contains(".test.js")
&& !filePath.Contains(".stories.js")
&& !filePath.Contains(".test.ts")
&& !filePath.Contains(".stories.ts")
&& !filePath.Contains(".test.tsx")
&& !filePath.Contains(".stories.tsx")
select Utils.ConvertPathToOS(filePath))
.ToList();
//TestContext.Progress.WriteLine($"Found sourceFiles by '{searchPatern}' filter = {sourceFiles.Count()}. First path is '{sourceFiles.FirstOrDefault()}'");
SourceImageFiles = new List<SourceImageFile>();
var pattern = $"\"([a-zA-Z0-9_.:/-]+({imageSearchPatern}))\"";
var regexp = new Regex(pattern, RegexOptions.Multiline | RegexOptions.ECMAScript);
foreach (var path in sourceFiles)
{
var sourceText = File.ReadAllText(path);
var mType = GetModuleType(path);
var matches = regexp.Matches(sourceText);
var images = matches
.Select(m => m.Groups[1].Success
? m.Groups[1].Value
: null)
.Where(m => m != null)
.Distinct()
.Select(p => new ImageFile(p, mType))
.ToList();
if (!images.Any())
continue;
var sourceImageFile = new SourceImageFile(path, mType);
sourceImageFile.Images = images;
SourceImageFiles.Add(sourceImageFile);
}
TestContext.Progress.WriteLine($"Found SourceImageFiles by filter '{sourceSearchPatern}' " +
$"count={SourceImageFiles.Count}. First path is '{SourceImageFiles.FirstOrDefault()?.Path}'");
}
[Test]
[Category("FastRunning")]
public void ParseMd5Test()
{
Assert.AreEqual(0, HashErrorFiles.Count, string.Join("\r\n",
HashErrorFiles.Select(e => $"File path = '{e.Key}' failed to parse with error: '{e.Value}'")));
}
[Test]
[Category("FastRunning")]
public void DublicatesFilesByMD5HashTest()
{
var duplicatesByMD5 = ImageFiles
.GroupBy(t => t.Md5Hash)
.Where(grp => grp.Count() > 1)
.Select(grp => new { Key = grp.Key, Count = grp.Count(), Paths = grp.ToList().Select(f => f.FilePath) })
.OrderByDescending(itm => itm.Count)
.ToList();
Assert.AreEqual(0, duplicatesByMD5.Count, "Dublicates by MD5 hash:\r\n" +
string.Join("\r\n", duplicatesByMD5.Select(d => $"\r\nMD5='{d.Key}':\r\n" +
$"{string.Join("\r\n", d.Paths.Select(p => p))}'")));
}
[Test]
[Category("FastRunning")]
public void DublicatesFilesByFileNameButDifferentByMD5HashTest()
{
var duplicatesByNameWithDifMD5 = ImageFiles
.Where(i => !i.FilePath.Contains(Utils.ConvertPathToOS("public/images/icons/")))
.GroupBy(t => t.FileName)
.Where(grp => grp.Count() > 1)
.Select(grp => new { Key = grp.Key, Count = grp.Count(), Images = grp.ToList() })
.Where(g => g.Images.Any(i => i.Md5Hash != g.Images[0].Md5Hash))
.ToList();
Assert.AreEqual(0, duplicatesByNameWithDifMD5.Count, "Dublicates by Name but different by MD5 hashs:\r\n" +
string.Join("\r\n", duplicatesByNameWithDifMD5.Select(d => $"\r\nFileName='{d.Key}':\r\n" +
$"{string.Join("\r\n", d.Images.Select(p => $"MD5='{p.Md5Hash}' Path='{p.FilePath}'"))}")));
}
[Test]
[Category("FastRunning")]
public void UselessImagesTest()
{
var usedImages = SourceImageFiles
.SelectMany(item => item.Images.Select(p => p.FileName))
.Distinct()
.ToList();
var existingImages = ImageFiles
.Select(j => j.FileName)
.Distinct()
.ToList();
var notFoundInSourceImages = existingImages.Except(usedImages).ToList();
var notFoundPaths = ImageFiles
.Where(i => notFoundInSourceImages.Contains(i.FileName))
.Select(i => i.FilePath)
.ToList();
Assert.AreEqual(0, notFoundPaths.Count,
"Some images are not used in source files by name:\r\n{0}",
string.Join("\r\n", notFoundPaths));
}
private static string Capitalize(string str)
{
if (str.Length == 0)
return str;
if (str.Length == 1)
return char.ToUpper(str[0]) + "";
return char.ToUpper(str[0]) + str.Substring(1);
}
private static string GetVariableByName(string name)
{
var split = name.Split(new char[] { '.', '_', '-' });
return (split.Length == 1
? Capitalize(split[0])
: string.Join("", split.Select(s => Capitalize(s)))
) + "Url";
}
[Test]
[Ignore("Ignore a fixture")]
public void FixStaticTest()
{
var onlyJsFiles = SourceImageFiles
.Where(f => f.ModuleType == ModuleTypes.CLIENT && f.Path.EndsWith(".js"))
.ToList();
foreach (var f in onlyJsFiles)
{
var dictionary = new Dictionary<string, string>();
foreach (var i in f.Images.Where(i => i.FilePath.StartsWith("/static/images")))
{
dictionary.TryAdd(i.FilePath, GetVariableByName(i.FileName));
}
if (!dictionary.Any())
continue;
var content = File.ReadAllText(f.Path);
var sb = new StringBuilder();
foreach (var item in dictionary)
{
content = content.Replace($"=\"{item.Key}\"", "={" + item.Value + "}");
content = content.Replace($"\"{item.Key}\"", item.Value);
var query = item.Key.EndsWith(".svg") ? "?url" : "";
sb.AppendLine($"import {item.Value} from \"{item.Key.Replace("/static/images", "PUBLIC_DIR/images")}{query}\";");
}
content = sb.ToString() + content;
File.WriteAllText(f.Path, content, Encoding.UTF8);
}
foreach (var f in onlyJsFiles)
{
var dictionary = new Dictionary<string, string>();
foreach (var i in f.Images.Where(i => i.FilePath.StartsWith("static/images")))
{
dictionary.TryAdd(i.FilePath, GetVariableByName(i.FileName));
}
if (!dictionary.Any())
continue;
var content = File.ReadAllText(f.Path);
var sb = new StringBuilder();
foreach (var item in dictionary)
{
content = content.Replace($"=\"{item.Key}\"", "={" + item.Value + "}");
content = content.Replace($"\"{item.Key}\"", item.Value);
var query = item.Key.EndsWith(".svg") ? "?url" : "";
sb.AppendLine($"import {item.Value} from \"{item.Key.Replace("static/images", "PUBLIC_DIR/images")}{query}\";");
}
content = sb.ToString() + content;
File.WriteAllText(f.Path, content, Encoding.UTF8);
}
foreach (var f in onlyJsFiles)
{
var dictionary = new Dictionary<string, string>();
foreach (var i in f.Images.Where(i => i.FilePath.StartsWith("images/")))
{
dictionary.TryAdd(i.FilePath, GetVariableByName(i.FileName));
}
if (!dictionary.Any())
continue;
var content = File.ReadAllText(f.Path);
var sb = new StringBuilder();
foreach (var item in dictionary)
{
content = content.Replace($"=\"{item.Key}\"", "={" + item.Value + "}");
content = content.Replace($"\"{item.Key}\"", item.Value);
var query = item.Key.EndsWith(".svg") ? "?url" : "";
sb.AppendLine($"import {item.Value} from \"{item.Key.Replace("images", "ASSETS_DIR/images")}{query}\";");
}
content = sb.ToString() + content;
File.WriteAllText(f.Path, content, Encoding.UTF8);
}
Assert.AreEqual(0, 0);
}
/*[Test]
[Category("FastRunning")]
public void NotTranslatedKeysTest()
{
var message = $"Next languages are not equal 'en' by translated keys count:\r\n\r\n";
var exists = false;
var i = 0;
foreach (var module in ModuleFolders)
{
if (module.AvailableLanguages == null)
continue;
var enLanguages = module.AvailableLanguages.Where(l => l.Language == "en").ToList();
var otherLanguages = module.AvailableLanguages.Where(l => l.Language != "en").ToList();
foreach (var lng in otherLanguages)
{
var lngKeys = lng.Translations.Select(f => f.Key).ToList();
var enKeys = enLanguages.Where(l => l.Path == lng.Path.Replace(Utils.ConvertPathToOS($"/{lng.Language}/"), Utils.ConvertPathToOS("/en/")))
.SelectMany(l => l.Translations.Select(f => f.Key))
.ToList();
var notFoundKeys = enKeys.Except(lngKeys).ToList();
if (!notFoundKeys.Any())
continue;
exists = true;
message += $"{++i}. Language ('{lng.Language}'={notFoundKeys.Count}/'en'={enKeys.Count}). Path '{lng.Path}' " +
$"Not found keys:\r\n\r\n";
message += string.Join("\r\n", notFoundKeys) + "\r\n\r\n";
// Save empty not found keys
//SaveNotFoundKeys(lng.Path, notFoundKeys);
}
}
Assert.AreEqual(false, exists, message);
}
[Test]
[Category("FastRunning")]
public void NotFoundKeysTest()
{
var allEnKeys = TranslationFiles
.Where(file => file.Language == "en")
.SelectMany(item => item.Translations)
.Select(item => item.Key);
var allJsTranslationKeys = JavaScriptFiles
.Where(f => !f.Path.Contains("Banner.js")) // skip Banner.js (translations from firebase)
.SelectMany(j => j.TranslationKeys)
.Select(k => k.Substring(k.IndexOf(":") + 1))
.Distinct();
var notFoundJsKeys = allJsTranslationKeys.Except(allEnKeys);
Assert.AreEqual(0, notFoundJsKeys.Count(),
"Some i18n-keys are not exist in translations in 'en' language: Keys:\r\n{0}",
string.Join("\r\n", notFoundJsKeys));
}
[Test]
[Category("FastRunning")]
public void UselessTranslationKeysTest()
{
var allEnKeys = TranslationFiles
.Where(file => file.Language == "en")
.SelectMany(item => item.Translations)
.Select(item => item.Key)
.Where(k => !k.StartsWith("Culture_"))
.OrderBy(t => t);
var allJsTranslationKeys = JavaScriptFiles
.SelectMany(j => j.TranslationKeys)
.Select(k => k.Substring(k.IndexOf(":") + 1))
.Where(k => !k.StartsWith("Culture_"))
.Distinct()
.OrderBy(t => t);
var notFoundi18nKeys = allEnKeys.Except(allJsTranslationKeys);
Assert.AreEqual(0, notFoundi18nKeys.Count(),
"Some i18n-keys are not found in js keys:\r\n{0}",
string.Join("\r\n", notFoundi18nKeys));
}
[Test]
[Category("FastRunning")]
public void UselessModuleTranslationKeysTest()
{
var notFoundi18nKeys = new List<KeyValuePair<string, List<string>>>();
var message = $"Some i18n-keys are not found in Module or Common translations: \r\nKeys: \r\n\r\n";
var index = 0;
for (int i = 0; i < ModuleFolders.Count; i++)
{
var module = ModuleFolders[i];
if (module.AppliedJsTranslationKeys == null && module.AvailableLanguages != null)
{
message += $"{++index}. 'ANY LANGUAGES' '{module.Path}' NOT USED\r\n";
var list = module.AvailableLanguages
.SelectMany(l => l.Translations.Select(t => t.Key).ToList())
.ToList();
notFoundi18nKeys.Add(new KeyValuePair<string, List<string>>("ANY LANGUAGES", list));
continue;
}
var notCommonKeys = module.AppliedJsTranslationKeys
.Where(k => !k.StartsWith("Common:"))
.OrderBy(t => t)
.ToList();
var onlyCommonKeys = module.AppliedJsTranslationKeys
.Except(notCommonKeys)
.Select(k => k.Replace("Common:", ""))
.OrderBy(t => t)
.ToList();
notCommonKeys = notCommonKeys.Select(k => k.Substring(k.IndexOf(":") + 1)).ToList();
if (onlyCommonKeys.Any())
{
foreach (var lng in CommonTranslations)
{
var list = onlyCommonKeys
.Except(lng.Translations.Select(t => t.Key))
.ToList();
if (!list.Any())
continue;
message += $"{++index}. '{lng.Language}' '{module.Path}' \r\n {string.Join("\r\n", list)} \r\n";
notFoundi18nKeys.Add(new KeyValuePair<string, List<string>>(lng.Language, list));
}
}
if (module.AvailableLanguages == null)
{
if (notCommonKeys.Any())
{
message += $"{++index}. 'ANY LANGUAGES' '{module.Path}' \r\n {string.Join("\r\n", notCommonKeys)} \r\n";
notFoundi18nKeys.Add(new KeyValuePair<string, List<string>>("ANY LANGUAGES", notCommonKeys));
}
continue;
}
foreach (var lng in module.AvailableLanguages)
{
var list = lng.Translations
.Select(t => t.Key)
.Except(notCommonKeys)
.ToList();
if (!list.Any())
continue;
message += $"{++index}. '{lng.Language}' '{module.Path}' \r\n {string.Join("\r\n", list)} \r\n";
notFoundi18nKeys.Add(new KeyValuePair<string, List<string>>(lng.Language, list));
}
}
Assert.AreEqual(0, notFoundi18nKeys.Count, message);
}
[Test]
[Category("FastRunning")]
public void NotTranslatedCommonKeysTest()
{
var message = $"Some i18n-keys are not found in COMMON translations: \r\nKeys: \r\n\r\n";
var enLanguageKeys = CommonTranslations
.Where(l => l.Language == "en")
.FirstOrDefault()
.Translations
.Select(k => k.Key)
.ToList();
var otherCommonLanguages = CommonTranslations.Where(l => l.Language != "en");
var exists = false;
var i = 0;
foreach (var lng in otherCommonLanguages)
{
var list = enLanguageKeys
.Except(lng.Translations.Select(t => t.Key))
.ToList();
if (!list.Any())
continue;
message += $"{++i}. '{lng.Language}' Keys: \r\n {string.Join("\r\n", list)} \r\n";
exists = true;
// Save empty not found keys
//SaveNotFoundKeys(lng.Path, list);
}
Assert.AreEqual(false, exists, message);
}
public static void UpdateKeys(string pathToJson, List<TranslationItem> newKeys)
{
if (!File.Exists(pathToJson) || !newKeys.Any())
return;
var jsonTranslation = JObject.Parse(File.ReadAllText(pathToJson));
var keys = newKeys.Select(k => k.Key).ToList();
var properties = jsonTranslation.Properties().ToList();
properties.ForEach(p =>
{
var newKey = newKeys.Where(k => k.Key == p.Name).FirstOrDefault();
if (newKey != null)
p.Value = newKey.Value;
});
var result = new JObject(properties);
var sortedJsonString = JsonConvert.SerializeObject(result, Formatting.Indented);
File.WriteAllText(pathToJson, sortedJsonString, Encoding.UTF8);
}
public static void RemoveEmptyKeys(string pathToJson, List<string> emptyKeys)
{
if (!File.Exists(pathToJson) || !emptyKeys.Any())
return;
var jsonTranslation = JObject.Parse(File.ReadAllText(pathToJson));
var properties = jsonTranslation.Properties().Where(p => !emptyKeys.Contains(p.Name)).ToList();
var result = new JObject(properties);
var sortedJsonString = JsonConvert.SerializeObject(result, Formatting.Indented);
File.WriteAllText(pathToJson, sortedJsonString, Encoding.UTF8);
}
public string GetWorkspace(string path)
{
var folderName = Directory.GetParent(Path.GetDirectoryName(path)).Name;
switch (folderName)
{
case "Client":
return Workspaces.Find(w => w.Contains("client"));
case "Editor":
return Workspaces.Find(w => w.Contains("editor"));
case "Login":
return Workspaces.Find(w => w.Contains("login"));
default:
return Path.Combine(BasePath, Utils.ConvertPathToOS("public\\locales"));
}
}
[Test]
[Category("FastRunning")]
public void EmptyValueKeysTest()
{
var message = $"Next files have empty keys:\r\n\r\n";
var exists = false;
var i = 0;
foreach (var module in ModuleFolders)
{
if (module.AvailableLanguages == null)
continue;
foreach (var lng in module.AvailableLanguages)
{
var emptyTranslationItems = lng.Translations.Where(f => string.IsNullOrEmpty(f.Value)).ToList();
if (!emptyTranslationItems.Any())
continue;
exists = true;
message += $"{++i}. Language '{lng.Language}' (Count: {emptyTranslationItems.Count}). Path '{lng.Path}' " +
$"Empty keys:\r\n\r\n";
var emptyKeys = emptyTranslationItems.Select(t => t.Key).ToList();
message += string.Join("\r\n", emptyKeys) + "\r\n\r\n";
}
}
foreach (var lng in CommonTranslations)
{
var emptyTranslationItems = lng.Translations.Where(f => string.IsNullOrEmpty(f.Value)).ToList();
if (!emptyTranslationItems.Any())
continue;
exists = true;
message += $"{++i}. Language '{lng.Language}' (Count: {emptyTranslationItems.Count}). Path '{lng.Path}' " +
$"Empty keys:\r\n\r\n";
var emptyKeys = emptyTranslationItems.Select(t => t.Key).ToList();
message += string.Join("\r\n", emptyKeys) + "\r\n\r\n";
}
Assert.AreEqual(false, exists, message);
}
[Test]
[Category("FastRunning")]
public void LanguageTranslatedPercentTest()
{
var message = $"Next languages translated less then 100%:\r\n\r\n";
var groupedByLng = TranslationFiles
.GroupBy(t => t.Language)
.Select(g => new
{
Language = g.Key,
AllTranslated = g.ToList()
.SelectMany(t => t.Translations)
.ToList()
})
.Select(t => new
{
t.Language,
TotalKeysCount = t.AllTranslated.LongCount(),
EmptyKeysCount = t.AllTranslated
.Where(t => string.IsNullOrEmpty(t.Value))
.LongCount()
})
.ToList();
var i = 0;
var exists = false;
var expectedTotalKeysCount = groupedByLng.Where(t => t.Language == "en").Single().TotalKeysCount;
foreach (var lng in groupedByLng)
{
if (lng.EmptyKeysCount == 0 && lng.TotalKeysCount == expectedTotalKeysCount)
continue;
exists = true;
var translated = lng.TotalKeysCount == expectedTotalKeysCount
? Math.Round(100f - (lng.EmptyKeysCount * 100f / expectedTotalKeysCount), 1)
: Math.Round(lng.TotalKeysCount * 100f / expectedTotalKeysCount, 1);
message += $"{++i}. Language '{lng.Language}' translated by '{translated}%'\r\n";
}
Assert.AreEqual(false, exists, message);
}
[Test]
[Category("FastRunning")]
public void NotTranslatedToastsTest()
{
var message = $"Next text not translated in toasts:\r\n\r\n";
var i = 0;
NotTranslatedToasts.GroupBy(t => t.Key)
.Select(g => new
{
FilePath = g.Key,
Values = g.ToList()
})
.ToList()
.ForEach(t =>
{
message += $"{++i}. Path='{t.FilePath}'\r\n\r\n{string.Join("\r\n", t.Values.Select(v => v.Value))}\r\n\r\n";
});
Assert.AreEqual(0, NotTranslatedToasts.Count, message);
}
[Test]
[Category("FastRunning")]
public void WrongTranslationVariablesTest()
{
var message = $"Next keys have wrong variables:\r\n\r\n";
var regVariables = new Regex("\\{\\{([^\\{].?[^\\}]+)\\}\\}", RegexOptions.Compiled | RegexOptions.Multiline);
var groupedByLng = TranslationFiles
.GroupBy(t => t.Language)
.Select(g => new
{
Language = g.Key,
TranslationsWithVariables = g.ToList()
.SelectMany(t => t.Translations)
.Where(k => k.Value.IndexOf("{{") != -1)
.Select(t => new
{
t.Key,
t.Value,
Variables = regVariables.Matches(t.Value)
.Select(m => m.Groups[1]?.Value?.Trim().Replace(", lowercase", ""))
.ToList()
})
.ToList()
})
.ToList();
var enWithVariables = groupedByLng
.Where(t => t.Language == "en")
.SelectMany(t => t.TranslationsWithVariables)
.ToList();
var otherLanguagesWithVariables = groupedByLng
.Where(t => t.Language != "en")
.ToList();
var i = 0;
var errorsCount = 0;
foreach (var lng in otherLanguagesWithVariables)
{
foreach (var t in lng.TranslationsWithVariables)
{
var enKey = enWithVariables
.Where(en => en.Key == t.Key)
.FirstOrDefault();
if (enKey == null)
{
// wrong
message += $"{++i}. lng='{lng.Language}' key='{t.Key}' has no 'en' language variant (!!!useless key!!!)\r\n\r\n";
errorsCount++;
continue;
}
if (enKey.Variables.Count != t.Variables.Count)
{
// wrong
message += $"{++i}. lng='{lng.Language}' key='{t.Key}' has less variables then 'en' language have " +
$"(en={enKey.Variables.Count}|{lng.Language}={t.Variables.Count})\r\n" +
$"'en': '{enKey.Value}'\r\n'{lng.Language}': '{t.Value}'\r\n\r\n";
errorsCount++;
}
if (!t.Variables.All(v => enKey.Variables.Contains(v)))
{
// wrong
errorsCount++;
message += $"{++i}. lng='{lng.Language}' key='{t.Key}' has not equals variables of 'en' language have\r\n\r\n" +
$"Have to be:\r\n'{enKey.Value}'\r\n\r\n{string.Join("\r\n", enKey.Variables)}\r\n\r\n" +
$"But in real:\r\n'{t.Value}'\r\n\r\n{string.Join("\r\n", t.Variables)} \r\n\r\n";
}
}
}
Assert.AreEqual(0, errorsCount, message);
}*/
}

View File

@ -32,8 +32,11 @@ using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Text.RegularExpressions;
using Frontend.Tests;
using Frontend.Tests.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
@ -41,9 +44,9 @@ using NUnit.Framework;
using WeCantSpell.Hunspell;
namespace Frontend.Translations.Tests;
namespace Frontend.Tests;
public class Tests
public class LocalesTest
{
public static string BasePath
{
@ -165,31 +168,21 @@ public class Tests
TestContext.Progress.WriteLine($"Found TranslationFiles = {TranslationFiles.Count()}. First path is '{TranslationFiles.FirstOrDefault()?.FilePath}'");
var searchPatern = @"\.js|\.jsx|\.ts|\.tsx";
var javascriptFiles = (from wsPath in Workspaces
let clientDir = Path.Combine(BasePath, wsPath)
from filePath in Directory.EnumerateFiles(clientDir, "*.js", SearchOption.AllDirectories)
where !filePath.Contains(Utils.ConvertPathToOS("dist/")) && !filePath.Contains(".test.js") && !filePath.Contains(".stories.js")
from filePath in Utils.GetFiles(clientDir, searchPatern, SearchOption.AllDirectories)
where !filePath.Contains(Utils.ConvertPathToOS("dist/"))
&& !filePath.Contains(".test.js")
&& !filePath.Contains(".stories.js")
&& !filePath.Contains(".test.ts")
&& !filePath.Contains(".stories.ts")
&& !filePath.Contains(".test.tsx")
&& !filePath.Contains(".stories.tsx")
select Utils.ConvertPathToOS(filePath))
.ToList();
javascriptFiles.AddRange(from wsPath in Workspaces
let clientDir = Path.Combine(BasePath, wsPath)
from filePath in Directory.EnumerateFiles(clientDir, "*.jsx", SearchOption.AllDirectories)
where !filePath.Contains(Utils.ConvertPathToOS("dist/")) && !filePath.Contains(".test.jsx") && !filePath.Contains(".stories.jsx")
select Utils.ConvertPathToOS(filePath));
javascriptFiles.AddRange(from wsPath in Workspaces
let clientDir = Path.Combine(BasePath, wsPath)
from filePath in Directory.EnumerateFiles(clientDir, "*.ts", SearchOption.AllDirectories)
where !filePath.Contains(Utils.ConvertPathToOS("dist/")) && !filePath.Contains(".test.ts") && !filePath.Contains(".stories.ts")
select Utils.ConvertPathToOS(filePath));
javascriptFiles.AddRange(from wsPath in Workspaces
let clientDir = Path.Combine(BasePath, wsPath)
from filePath in Directory.EnumerateFiles(clientDir, "*.tsx", SearchOption.AllDirectories)
where !filePath.Contains(Utils.ConvertPathToOS("dist/")) && !filePath.Contains(".test.tsx") && !filePath.Contains(".stories.tsx")
select Utils.ConvertPathToOS(filePath));
TestContext.Progress.WriteLine($"Found javascriptFiles by *.js(x) filter = {javascriptFiles.Count()}. First path is '{javascriptFiles.FirstOrDefault()}'");
JavaScriptFiles = new List<JavaScriptFile>();

View File

@ -0,0 +1,55 @@
// (c) Copyright Ascensio System SIA 2010-2022
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using System.IO;
namespace Frontend.Tests.Models;
public class ImageFile
{
public ImageFile(string path, ModuleTypes moduleType, string md5hash = null)
{
FilePath = Utils.ConvertPathToOS(path);
FileName = Path.GetFileName(FilePath);
FileExt = Path.GetExtension(FilePath);
ModuleType = moduleType;
Md5Hash = md5hash;
}
public string FilePath { get; }
public string FileName { get; }
public string FileExt { get; }
public ModuleTypes ModuleType { get; }
public string Md5Hash { get; }
}

View File

@ -24,9 +24,11 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using System.Collections.Generic;
namespace Frontend.Translations.Tests;
using System.Collections.Generic;
using Frontend.Tests;
namespace Frontend.Tests;
public class JavaScriptFile
{

View File

@ -26,7 +26,7 @@
using UtfUnknown;
namespace Frontend.Translations.Tests;
namespace Frontend.Tests;
public class JsonEncodingError
{

View File

@ -26,7 +26,7 @@
using System.Collections.Generic;
namespace Frontend.Translations.Tests;
namespace Frontend.Tests;
public class LanguageItem
{

View File

@ -26,7 +26,7 @@
using System.Collections.Generic;
namespace Frontend.Translations.Tests;
namespace Frontend.Tests;
public class ModuleFolder
{

View File

@ -0,0 +1,14 @@
using System;
namespace Frontend.Tests.Models
{
public enum ModuleTypes
{
PUBLIC = 0,
COMMON,
COMPONENTS,
CLIENT,
EDITOR,
LOGIN
}
}

View File

@ -26,7 +26,7 @@
using System;
namespace Frontend.Translations.Tests;
namespace Frontend.Tests;
public class ParseJsonError
{

View File

@ -0,0 +1,48 @@
// (c) Copyright Ascensio System SIA 2010-2022
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using System.Collections.Generic;
using Frontend.Tests;
using Frontend.Tests.Models;
namespace Frontend.Tests;
public class SourceImageFile
{
public SourceImageFile(string path, ModuleTypes moduleType)
{
Path = Utils.ConvertPathToOS(path);
ModuleType = moduleType;
}
public string Path { get; }
public ModuleTypes ModuleType { get; }
public List<ImageFile> Images { get; set; }
}

View File

@ -26,7 +26,7 @@
using System.Collections.Generic;
namespace Frontend.Translations.Tests.Models;
namespace Frontend.Tests.Models;
public class SpellCheckExclude
{

View File

@ -31,7 +31,7 @@ using System.Text.RegularExpressions;
using Newtonsoft.Json;
namespace Frontend.Translations.Tests.Models;
namespace Frontend.Tests.Models;
public class SpellCheckResult
{

View File

@ -26,7 +26,7 @@
using System.Collections.Generic;
namespace Frontend.Translations.Tests.Models;
namespace Frontend.Tests.Models;
public class SpellIssue
{

View File

@ -25,9 +25,11 @@
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using System.Collections.Generic;
using System.IO;
namespace Frontend.Translations.Tests;
using System.IO;
using Frontend.Tests;
namespace Frontend.Tests.Models;
public class TranslationFile
{

View File

@ -24,7 +24,7 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
namespace Frontend.Translations.Tests;
namespace Frontend.Tests;
public class TranslationItem
{

View File

@ -29,7 +29,7 @@ using System.IO;
using WeCantSpell.Hunspell;
namespace Frontend.Translations.Tests;
namespace Frontend.Tests;
public static class SpellCheck
{

View File

@ -1,14 +1,37 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
namespace Frontend.Translations.Tests
namespace Frontend.Tests;
public static class Utils
{
public static class Utils
public static string ConvertPathToOS(string path)
{
public static string ConvertPathToOS(string path)
{
return Path.DirectorySeparatorChar == '/' ? path.Replace("\\", "/") : path.Replace("/", "\\");
}
return Path.DirectorySeparatorChar == '/' ? path.Replace("\\", "/") : path.Replace("/", "\\");
}
// Regex version
public static IEnumerable<string> GetFiles(string path,
string searchPatternExpression = "",
SearchOption searchOption = SearchOption.TopDirectoryOnly)
{
var reSearchPattern = new Regex(searchPatternExpression, RegexOptions.IgnoreCase);
return Directory.EnumerateFiles(path, "*", searchOption)
.Where(file =>
reSearchPattern.IsMatch(Path.GetExtension(file)));
}
// Takes same patterns, and executes in parallel
public static IEnumerable<string> GetFiles(string path,
string[] searchPatterns,
SearchOption searchOption = SearchOption.TopDirectoryOnly)
{
return searchPatterns.AsParallel()
.SelectMany(searchPattern =>
Directory.EnumerateFiles(path, searchPattern, searchOption));
}
}

1
common/Tests/images-tests/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
result

View File

@ -0,0 +1,13 @@
{
"name": "DocSpace-scripts",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"scripts": {
"start": "node src/index.js"
},
"dependencies": {
"crypto": "^1.0.1",
"crypto-js": "^4.1.1"
}
}

View File

@ -0,0 +1,53 @@
const path = require("path");
const docSpacePath = "../../../../";
const imagesPattern = /\.(gif|jpe|jpeg|tiff?|png|webp|bmp|svg)$/i;
const filesPattern = /\.(js|jsx|ts|tsx|html|css|scss|saas|json)$/i;
const excludeFilesPattern = /\.(stories|test)$/i;
const excludePath = [
"C:",
"GitHub",
"DocSpace",
"public",
"packages",
"client",
"common",
"components",
];
const modules = ["public", "client", "components", "common", "login", "editor"];
// const modules = ["public"];
const publicPath = path.join(__dirname, docSpacePath, "/public");
const clientPath = path.join(__dirname, docSpacePath, "/packages/client");
const componentsPath = path.join(
__dirname,
docSpacePath,
"/packages/components"
);
const commonPath = path.join(__dirname, docSpacePath, "/packages/common");
const loginPath = path.join(__dirname, docSpacePath, "/packages/login");
const editorPath = path.join(__dirname, docSpacePath, "/packages/editor");
const paths = {
public: publicPath,
client: clientPath,
components: componentsPath,
common: commonPath,
login: loginPath,
editor: editorPath,
};
const imageHelperPath = path.join(commonPath, "/utils/image-helpers.js");
module.exports = {
imagesPattern,
filesPattern,
excludeFilesPattern,
modules,
paths,
imageHelperPath,
excludePath,
};

View File

@ -0,0 +1,45 @@
const fs = require("fs");
const path = require("path");
const pathToResultFile = path.join(
__dirname,
"..",
"result",
"DifferentMD5EqualName"
);
const findImagesWithDifferentMD5ButEqualName = (images) => {
const uniqueImg = new Map();
images.forEach((i) => {
const oldImg = uniqueImg.get(i.fileName);
if (oldImg) {
let skip = false;
oldImg.forEach((oi) => (skip = skip || oi.md5Hash === i.md5Hash));
if (!skip) {
const newImg = [...oldImg, i];
uniqueImg.set(i.fileName, newImg);
}
} else {
uniqueImg.set(i.fileName, [i]);
}
});
fs.writeFileSync(pathToResultFile, "");
uniqueImg.forEach((value, key) => {
if (value.length > 1) {
let content = `${key}:\n`;
value.forEach((v) => (content += `${v.path}\n`));
fs.appendFileSync(pathToResultFile, content + `\n`);
}
});
};
module.exports = { findImagesWithDifferentMD5ButEqualName };

View File

@ -0,0 +1,45 @@
const fs = require("fs");
const path = require("path");
const pathToResultFile = path.join(
__dirname,
"..",
"result",
"DifferentNameEqualMD5"
);
const findImagesWithDifferentNameButEqualMD5 = (images) => {
const uniqueImg = new Map();
images.forEach((i) => {
const oldImg = uniqueImg.get(i.md5Hash);
if (oldImg) {
let skip = false;
oldImg.forEach((oi) => (skip = skip || oi.fileName === i.fileName));
if (!skip) {
const newImg = [...oldImg, i];
uniqueImg.set(i.md5Hash, newImg);
}
} else {
uniqueImg.set(i.md5Hash, [i]);
}
});
fs.writeFileSync(pathToResultFile, "");
uniqueImg.forEach((value, key) => {
if (value.length > 1) {
let content = `${key}:\n`;
value.forEach((v) => (content += `${v.path}\n`));
fs.appendFileSync(pathToResultFile, content + `\n`);
}
});
};
module.exports = { findImagesWithDifferentNameButEqualMD5 };

View File

@ -0,0 +1,48 @@
const fs = require("fs");
const path = require("path");
const pathToResultFile = path.join(
__dirname,
"..",
"result",
"EqualMD5EqualName"
);
const findImagesWithEqualMD5AndEqualName = (images) => {
const uniqueImg = new Map();
images.forEach((i) => {
const oldImg = uniqueImg.get(i.fileName);
if (oldImg) {
let skip = false;
oldImg.forEach(
(oi) =>
(skip = skip || oi.md5Hash !== i.md5Hash || oi.fileName != i.fileName)
);
if (!skip) {
const newImg = [...oldImg, i];
uniqueImg.set(i.fileName, newImg);
}
} else {
uniqueImg.set(i.fileName, [i]);
}
});
fs.writeFileSync(pathToResultFile, "");
uniqueImg.forEach((value, key) => {
if (value.length > 1) {
let content = `${key}:\n`;
value.forEach((v) => (content += `${v.path} - ${v.md5Hash}\n`));
fs.appendFileSync(pathToResultFile, content + `\n`);
}
});
};
module.exports = { findImagesWithEqualMD5AndEqualName };

View File

@ -0,0 +1,60 @@
const fs = require("fs");
const { imageHelperPath } = require("./constants");
const {
getImagesByDir,
generateImgImport,
changeImgName,
changeImgPath,
generateImgCollection,
} = require("./utils");
const importImgToImageHelper = async (dir) => {
const images = await getImagesByDir(dir);
let importContent = "";
let collectionContent = "";
const imgCollection = new Map();
images.forEach((i) => {
const { imgPath, size } = changeImgPath(i.path);
const imgName = changeImgName(i.fileName, size);
const importString = generateImgImport(i.fileName, imgName, imgPath, false);
importContent += `${importString}\n`;
if (!!imgCollection.get(size)) {
imgCollection.set(size, [
...imgCollection.get(size),
{ varName: imgName, imgName: i.fileName },
]);
} else {
imgCollection.set(size, [{ varName: imgName, imgName: i.fileName }]);
}
});
imgCollection.forEach((collection, key) => {
const collectionString = generateImgCollection(key, collection);
collectionContent += `${collectionString}\n`;
});
fs.readFile(imageHelperPath, function (err, result) {
if (err) return console.log(err);
const newContent = importContent + "\n" + result + "\n" + collectionContent;
// console.log(newContent);
fs.writeFile(imageHelperPath, newContent, "utf8", function (err) {
if (err) return console.log(err);
console.log("The file has been saved!");
});
});
};
module.exports = { importImgToImageHelper };

View File

@ -0,0 +1,74 @@
const fs = require("fs");
const path = require("path");
const { modules, paths } = require("./constants");
const { getFilesByDir, getImagesByDir } = require("./utils");
const { findUselessImages } = require("./uselessImages");
const {
findImagesWithDifferentMD5ButEqualName,
} = require("./differentMD5EqualName");
const {
findImagesWithDifferentNameButEqualMD5,
} = require("./differentNameEqualMD5");
const { findImagesWithEqualMD5AndEqualName } = require("./equalMD5EqualName");
const { importImgToImageHelper } = require("./importImgToImageHelper");
const runAllTests = async () => {
const actions = [];
const images = {};
modules.forEach((module) => {
const callback = async () => {
images[module] = await getImagesByDir(paths[module]);
};
actions.push(callback());
});
await Promise.all(actions);
const allImgs = [];
modules.forEach((module) => {
allImgs.push(...images[module]);
});
const filesActions = [];
const files = {};
modules.forEach((module) => {
const callback = async () => {
files[module] = await getFilesByDir(paths[module]);
};
filesActions.push(callback());
});
await Promise.all(filesActions);
const allFiles = [];
modules.forEach((module) => {
allFiles.push(...files[module]);
});
const resultDir = path.resolve(__dirname, "..", "result");
if (!fs.existsSync(resultDir)) {
fs.mkdirSync(resultDir);
}
findUselessImages(allImgs, allFiles);
findImagesWithDifferentMD5ButEqualName(allImgs);
findImagesWithDifferentNameButEqualMD5(allImgs);
findImagesWithEqualMD5AndEqualName(allImgs);
};
runAllTests();
// Add images to img helper from path
// importImgToImageHelper(paths.public + "/images/flags");

View File

@ -0,0 +1,35 @@
const fs = require("fs");
const path = require("path");
const { findImagesIntoFiles } = require("./utils");
const pathToResultFile = path.join(__dirname, "..", "result", "UselessImages");
const findUselessImages = async (images, files) => {
const usedImages = findImagesIntoFiles(files, images);
const uselessImages = images.filter((img) => {
if (usedImages.indexOf(img.fileName) === -1) {
return true;
}
return false;
});
fs.writeFileSync(pathToResultFile, "");
uselessImages.forEach((value) => {
// deleteUselessImages(value.path);
fs.appendFileSync(pathToResultFile, `${value.path}\n`);
});
};
deleteUselessImages = (dir) => {
// console.log(
// path.resolve(__dirname, "..", "..", dir.replace("C:\\GitHub\\", ""))
// );
fs.unlink(dir, () => {});
};
module.exports = { findUselessImages };

View File

@ -0,0 +1,220 @@
const fs = require("fs");
const { readdir } = require("fs").promises;
const { resolve } = require("path");
const crypto = require("crypto");
const {
imagesPattern,
filesPattern,
excludeFilesPattern,
excludePath,
} = require("./constants");
const validatePath = (dirname) => {
return (
dirname.indexOf("tests") === -1 &&
dirname.indexOf("node_modules") === -1 &&
dirname.indexOf("dist") === -1
);
};
const validateImage = (fileName) => {
return imagesPattern.test(fileName);
};
const validateFile = (fileName) => {
return filesPattern.test(fileName) && !excludeFilesPattern.test(fileName);
};
async function* getImages(dir) {
const dirents = await readdir(dir, { withFileTypes: true });
for (const dirent of dirents) {
const res = resolve(dir, dirent.name);
if (dirent.isDirectory()) {
yield* getImages(res);
} else {
const isValidPath = validatePath(res);
const isImg = validateImage(dirent.name);
if (isImg && isValidPath) {
const data = fs.readFileSync(res);
const buf = new Buffer.from(data);
const md5Hash = crypto.createHash("md5").update(buf).digest("hex");
const img = { path: res, fileName: dirent.name, md5Hash };
yield img;
}
yield null;
}
}
}
async function* getFiles(dir) {
const dirents = await readdir(dir, { withFileTypes: true });
for (const dirent of dirents) {
const res = resolve(dir, dirent.name);
if (dirent.isDirectory()) {
yield* getFiles(res);
} else {
const isValidPath = validatePath(res);
const isFile = validateFile(dirent.name);
if (isFile && isValidPath) {
yield { path: res, fileName: dirent.name };
}
yield null;
}
}
}
const getImagesByDir = async (dir) => {
const images = [];
for await (const f of getImages(dir)) {
if (f) images.push(f);
}
return images;
};
const getFilesByDir = async (dir) => {
const files = [];
for await (const f of getFiles(dir)) {
if (f) files.push(f);
}
return files;
};
const generateImgImport = (imgPathName, imgName, imgPath, isAssetsDir) => {
const prefix = isAssetsDir ? "ASSETS_DIR/" : "PUBLIC_DIR/";
const dir = prefix + imgPath + "/" + imgPathName + "?url";
const importString = `import ${imgName} from "${dir}";`;
return importString;
};
const changeImgPath = (imgPath) => {
const splitPath = imgPath.split("\\");
const newSplitPath = [];
splitPath.forEach((p, index) => {
if (excludePath.includes(p) || index === splitPath.length - 1) {
return null;
}
newSplitPath.push(p);
});
return { imgPath: newSplitPath.join("/"), size: newSplitPath[2] };
};
const changeImgName = (imgName, size) => {
const splitImgName = imgName.split(".");
const newImgName = [];
splitImgName.forEach((img) => {
const temp = img.replace(img[0], img[0].toUpperCase());
newImgName.push(temp);
});
// newImgName.push(size);
newImgName.push("Url");
return newImgName.join("");
};
const generateImgCollection = (key, itemCollection) => {
let string = `export const flagsIcons = new Map([`;
itemCollection.forEach((c, index) => {
string += `["${c.imgName}", ${c.varName}]`;
if (index !== itemCollection.length - 1) string += `,`;
});
string += `]);`;
return string;
};
const compareImages = (img) => {
const uniqueImg = new Map();
img.forEach((i) => {
const oldImg = uniqueImg.get(i.md5Hash);
if (oldImg) {
const newImg = [...oldImg, i.path];
uniqueImg.set(i.md5Hash, newImg);
} else {
uniqueImg.set(i.md5Hash, [i.path]);
}
});
return uniqueImg;
};
const findImagesIntoFiles = (fileList, imageList) => {
const imgCollection = [];
const usedImages = [];
imageList.forEach((i) => {
if (i.path.indexOf("flags") > -1 || i.path.indexOf("thirdparties") > -1)
return usedImages.push(i.fileName);
imgCollection.push(i.fileName);
});
fileList.forEach(({ path: filePath }) => {
const data = fs.readFileSync(filePath, "utf8");
imgCollection.forEach((i) => {
const contentImg = `/${i}`;
const idx = data.indexOf(contentImg);
const idx2 = data.indexOf(`${i}`);
if (idx > -1 || idx2 > -1) {
usedImages.push(i);
}
});
});
return usedImages.filter(
(i, index) => usedImages.findIndex((usedImg) => usedImg === i) === index
);
};
module.exports = {
getFilesByDir,
getImagesByDir,
getFiles,
getImages,
validateFile,
validateImage,
validatePath,
generateImgImport,
changeImgName,
changeImgPath,
generateImgCollection,
compareImages,
findImagesIntoFiles,
};

View File

@ -0,0 +1,29 @@
# This file is generated by running "yarn install" inside your project.
# Manual changes might be lost - proceed with caution!
__metadata:
version: 6
cacheKey: 8
"DocSpace-scripts@workspace:.":
version: 0.0.0-use.local
resolution: "DocSpace-scripts@workspace:."
dependencies:
crypto: ^1.0.1
crypto-js: ^4.1.1
languageName: unknown
linkType: soft
"crypto-js@npm:^4.1.1":
version: 4.1.1
resolution: "crypto-js@npm:4.1.1"
checksum: b3747c12ee3a7632fab3b3e171ea50f78b182545f0714f6d3e7e2858385f0f4101a15f2517e033802ce9d12ba50a391575ff4638c9de3dd9b2c4bc47768d5425
languageName: node
linkType: hard
"crypto@npm:^1.0.1":
version: 1.0.1
resolution: "crypto@npm:1.0.1"
checksum: 087fe3165bd94c333a49e6ed66a0193911f63eac38a24f379b3001a5fe260a59c413646e53a0f67875ba13902b2686d81dc703cb2c147a4ec727dcdc04e5645e
languageName: node
linkType: hard

View File

@ -53,7 +53,7 @@ internal sealed class BackupCleanerService : BackgroundService
{
_logger.DebugBackupCleanerServiceDoingWork();
using var serviceScope = _scopeFactory.CreateScope();
await using var serviceScope = _scopeFactory.CreateAsyncScope();
var registerInstanceService = serviceScope.ServiceProvider.GetService<IRegisterInstanceManager<BackupCleanerService>>();
@ -76,7 +76,7 @@ internal sealed class BackupCleanerService : BackgroundService
private async Task ExecuteBackupCleaner(CancellationToken stoppingToken)
{
using var serviceScope = _scopeFactory.CreateScope();
await using var serviceScope = _scopeFactory.CreateAsyncScope();
var backupRepository = serviceScope.ServiceProvider.GetRequiredService<BackupRepository>();
var backupStorageFactory = serviceScope.ServiceProvider.GetRequiredService<BackupStorageFactory>();

View File

@ -58,7 +58,7 @@ public sealed class BackupSchedulerService : BackgroundService
while (!stoppingToken.IsCancellationRequested)
{
using var serviceScope = _scopeFactory.CreateScope();
await using var serviceScope = _scopeFactory.CreateAsyncScope();
var registerInstanceService = serviceScope.ServiceProvider.GetService<IRegisterInstanceManager<BackupSchedulerService>>();

View File

@ -69,7 +69,7 @@ public class ElasticSearchIndexService : BackgroundService
_logger.ErrorSubscribeOnStart(e);
}
using var scope = _serviceScopeFactory.CreateScope();
await using var scope = _serviceScopeFactory.CreateAsyncScope();
var factoryIndexer = scope.ServiceProvider.GetService<FactoryIndexer>();
while (!factoryIndexer.CheckState(false))
@ -138,14 +138,14 @@ public class ElasticSearchIndexService : BackgroundService
IEnumerable<Type> wrappers;
using (var scope = _serviceScopeFactory.CreateScope())
await using (var scope = _serviceScopeFactory.CreateAsyncScope())
{
wrappers = scope.ServiceProvider.GetService<IEnumerable<IFactoryIndexer>>().Select(r => r.GetType()).ToList();
}
await Parallel.ForEachAsync(wrappers, async (wrapper, token) =>
{
using (var scope = _serviceScopeFactory.CreateScope())
await using (var scope = _serviceScopeFactory.CreateAsyncScope())
{
await IndexProduct((IFactoryIndexer)scope.ServiceProvider.GetRequiredService(wrapper), reindex);
}

View File

@ -92,7 +92,7 @@ public class FeedAggregatorService : FeedBaseService
try
{
var cfg = _feedSettings;
using var scope = _serviceScopeFactory.CreateScope();
await using var scope = _serviceScopeFactory.CreateAsyncScope();
var cache = scope.ServiceProvider.GetService<ICache>();
var baseCommonLinkUtility = scope.ServiceProvider.GetService<BaseCommonLinkUtility>();
baseCommonLinkUtility.Initialize(cfg.ServerRoot);

View File

@ -49,7 +49,7 @@ public class NotifyCleanerService : BackgroundService
while (!stoppingToken.IsCancellationRequested)
{
using var serviceScope = _scopeFactory.CreateScope();
await using var serviceScope = _scopeFactory.CreateAsyncScope();
var registerInstanceService = serviceScope.ServiceProvider.GetService<IRegisterInstanceManager<NotifyCleanerService>>();

View File

@ -62,7 +62,7 @@ public class NotifySenderService : BackgroundService
while (!stoppingToken.IsCancellationRequested)
{
using var serviceScope = _scopeFactory.CreateScope();
await using var serviceScope = _scopeFactory.CreateAsyncScope();
var registerInstanceService = serviceScope.ServiceProvider.GetService<IRegisterInstanceManager<NotifySenderService>>();

View File

@ -67,6 +67,7 @@
"css-loader": "^6.2.0",
"external-remotes-plugin": "^1.0.0",
"file-loader": "^6.2.0",
"html-loader": "^4.2.0",
"html-webpack-plugin": "5.3.2",
"json-loader": "^0.5.7",
"playwright": "^1.18.1",

View File

@ -1,3 +0,0 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M18 18V6.16176L13.8382 2H12V5C12 5.55228 11.5523 6 11 6H5C4.44772 6 4 5.55228 4 5V2H2V18H4V13C4 12.4477 4.44772 12 5 12H15C15.5523 12 16 12.4477 16 13V18H18ZM15 20H19C19.5523 20 20 19.5523 20 19V5.74755C20 5.48233 19.8946 5.22798 19.7071 5.04044L14.9596 0.292893C14.772 0.105357 14.5177 0 14.2525 0H11H5H1C0.447715 0 0 0.447716 0 1V19C0 19.5523 0.447716 20 1 20H5H15ZM14 18V14H6V18H14ZM6 2H10V4H6V2Z" fill="#657077"/>
</svg>

Before

Width:  |  Height:  |  Size: 570 B

View File

@ -1,74 +0,0 @@
<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M9 13C6.23858 13 4 15.2113 4 17.939V88.061C4 90.7887 6.23858 93 9 93H91C93.7614 93 96 90.7887 96 88.061V17.939C96 15.2113 93.7614 13 91 13H9Z" fill="white"/>
<path d="M5 17C5 14.0412 7.74005 13 9 13L91 13C93.9843 13 95.0002 15.0847 95.0002 17V29H5V17Z" fill="#CCE9FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M62.991 12.0001H35.9915V13.0001H62.991V12.0001ZM74.0036 13L91 13.0001C93.2091 13.0001 95 14.7909 95 17.0001V89C95 91.2092 93.2091 93 91 93H9C6.79086 93 5 91.2092 5 89V17.0001C5 14.7909 6.79086 13.0001 9 13.0001H25.0159V12.0001H9C6.23858 12.0001 4 14.2386 4 17.0001V89C4 91.7615 6.23858 94 9 94H91C93.7614 94 96 91.7615 96 89V17.0001C96 14.2386 93.7614 12.0001 91 12.0001L74.0036 12V13Z" fill="#333333"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M67 6.54135C67 6.24237 66.7761 6 66.5 6C66.2239 6 66 6.24237 66 6.54135V12V17.4586C66 17.7576 66.2239 18 66.5 18C66.7761 18 67 17.7576 67 17.4586V6.54135ZM71 6.54135C71 6.24237 70.7761 6 70.5 6C70.2239 6 70 6.24237 70 6.54135V12V17.4586C70 17.7576 70.2239 18 70.5 18C70.7761 18 71 17.7576 71 17.4586V6.54135Z" fill="#333333"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M29 6.54135C29 6.24237 28.7761 6 28.5 6C28.2239 6 28 6.24237 28 6.54135V12V17.4586C28 17.7576 28.2239 18 28.5 18C28.7761 18 29 17.7576 29 17.4586V6.54135ZM33 6.54135C33 6.24237 32.7761 6 32.5 6C32.2239 6 32 6.24237 32 6.54135V12V17.4586C32 17.7576 32.2239 18 32.5 18C32.7761 18 33 17.7576 33 17.4586V6.54135Z" fill="#333333"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.0001 24.5C12.0001 24.2239 12 24 12 24H88.0002V25H12.0002C12.0002 25 12.0001 24.7761 12.0001 24.5Z" fill="#333333"/>
<path d="M49.9995 49.0001C48.3427 49.0001 46.9995 50.3433 46.9995 52.0001C46.9995 53.657 48.3427 55.0001 49.9995 55.0001C51.6564 55.0001 52.9995 53.657 52.9995 52.0001C52.9995 50.3433 51.6564 49.0001 49.9995 49.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M49.9995 50.0001C48.8949 50.0001 47.9995 50.8956 47.9995 52.0001C47.9995 53.1047 48.8949 54.0001 49.9995 54.0001C51.1041 54.0001 51.9995 53.1047 51.9995 52.0001C51.9995 50.8956 51.1041 50.0001 49.9995 50.0001ZM46.9995 52.0001C46.9995 50.3433 48.3427 49.0001 49.9995 49.0001C51.6564 49.0001 52.9995 50.3433 52.9995 52.0001C52.9995 53.657 51.6564 55.0001 49.9995 55.0001C48.3427 55.0001 46.9995 53.657 46.9995 52.0001Z" fill="#333333"/>
<path d="M59.9985 49.0001C58.3417 49.0001 56.9985 50.3433 56.9985 52.0001C56.9985 53.657 58.3417 55.0001 59.9985 55.0001C61.6554 55.0001 62.9985 53.657 62.9985 52.0001C62.9985 50.3433 61.6554 49.0001 59.9985 49.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M59.9985 50.0001C58.894 50.0001 57.9985 50.8956 57.9985 52.0001C57.9985 53.1047 58.894 54.0001 59.9985 54.0001C61.1031 54.0001 61.9985 53.1047 61.9985 52.0001C61.9985 50.8956 61.1031 50.0001 59.9985 50.0001ZM56.9985 52.0001C56.9985 50.3433 58.3417 49.0001 59.9985 49.0001C61.6554 49.0001 62.9985 50.3433 62.9985 52.0001C62.9985 53.657 61.6554 55.0001 59.9985 55.0001C58.3417 55.0001 56.9985 53.657 56.9985 52.0001Z" fill="#333333"/>
<path d="M19.9995 49.0001C18.3427 49.0001 16.9995 50.3433 16.9995 52.0001C16.9995 53.657 18.3427 55.0001 19.9995 55.0001C21.6564 55.0001 22.9995 53.657 22.9995 52.0001C22.9995 50.3433 21.6564 49.0001 19.9995 49.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.9995 50.0001C18.8949 50.0001 17.9995 50.8956 17.9995 52.0001C17.9995 53.1047 18.8949 54.0001 19.9995 54.0001C21.1041 54.0001 21.9995 53.1047 21.9995 52.0001C21.9995 50.8956 21.1041 50.0001 19.9995 50.0001ZM16.9995 52.0001C16.9995 50.3433 18.3427 49.0001 19.9995 49.0001C21.6564 49.0001 22.9995 50.3433 22.9995 52.0001C22.9995 53.657 21.6564 55.0001 19.9995 55.0001C18.3427 55.0001 16.9995 53.657 16.9995 52.0001Z" fill="#333333"/>
<path d="M29.9985 49.0001C28.3417 49.0001 26.9985 50.3433 26.9985 52.0001C26.9985 53.657 28.3417 55.0001 29.9985 55.0001C31.6554 55.0001 32.9985 53.657 32.9985 52.0001C32.9985 50.3433 31.6554 49.0001 29.9985 49.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.9985 50.0001C28.894 50.0001 27.9985 50.8956 27.9985 52.0001C27.9985 53.1047 28.894 54.0001 29.9985 54.0001C31.1031 54.0001 31.9985 53.1047 31.9985 52.0001C31.9985 50.8956 31.1031 50.0001 29.9985 50.0001ZM26.9985 52.0001C26.9985 50.3433 28.3417 49.0001 29.9985 49.0001C31.6554 49.0001 32.9985 50.3433 32.9985 52.0001C32.9985 53.657 31.6554 55.0001 29.9985 55.0001C28.3417 55.0001 26.9985 53.657 26.9985 52.0001Z" fill="#333333"/>
<path d="M69.9976 49.0001C68.3407 49.0001 66.9976 50.3433 66.9976 52.0001C66.9976 53.657 68.3407 55.0001 69.9976 55.0001C71.6544 55.0001 72.9976 53.657 72.9976 52.0001C72.9976 50.3433 71.6544 49.0001 69.9976 49.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M69.9976 50.0001C68.893 50.0001 67.9976 50.8956 67.9976 52.0001C67.9976 53.1047 68.893 54.0001 69.9976 54.0001C71.1021 54.0001 71.9976 53.1047 71.9976 52.0001C71.9976 50.8956 71.1021 50.0001 69.9976 50.0001ZM66.9976 52.0001C66.9976 50.3433 68.3407 49.0001 69.9976 49.0001C71.6544 49.0001 72.9976 50.3433 72.9976 52.0001C72.9976 53.657 71.6544 55.0001 69.9976 55.0001C68.3407 55.0001 66.9976 53.657 66.9976 52.0001Z" fill="#333333"/>
<path d="M80.0005 49.0001C78.3436 49.0001 77.0005 50.3433 77.0005 52.0001C77.0005 53.657 78.3436 55.0001 80.0005 55.0001C81.6573 55.0001 83.0005 53.657 83.0005 52.0001C83.0005 50.3433 81.6573 49.0001 80.0005 49.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M80.0005 50.0001C78.8959 50.0001 78.0005 50.8956 78.0005 52.0001C78.0005 53.1047 78.8959 54.0001 80.0005 54.0001C81.1051 54.0001 82.0005 53.1047 82.0005 52.0001C82.0005 50.8956 81.1051 50.0001 80.0005 50.0001ZM77.0005 52.0001C77.0005 50.3433 78.3436 49.0001 80.0005 49.0001C81.6573 49.0001 83.0005 50.3433 83.0005 52.0001C83.0005 53.657 81.6573 55.0001 80.0005 55.0001C78.3436 55.0001 77.0005 53.657 77.0005 52.0001Z" fill="#333333"/>
<path d="M49.9995 39.0001C48.3427 39.0001 46.9995 40.3433 46.9995 42.0001C46.9995 43.657 48.3427 45.0001 49.9995 45.0001C51.6564 45.0001 52.9995 43.657 52.9995 42.0001C52.9995 40.3433 51.6564 39.0001 49.9995 39.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M49.9995 40.0001C48.8949 40.0001 47.9995 40.8956 47.9995 42.0001C47.9995 43.1047 48.8949 44.0001 49.9995 44.0001C51.1041 44.0001 51.9995 43.1047 51.9995 42.0001C51.9995 40.8956 51.1041 40.0001 49.9995 40.0001ZM46.9995 42.0001C46.9995 40.3433 48.3427 39.0001 49.9995 39.0001C51.6564 39.0001 52.9995 40.3433 52.9995 42.0001C52.9995 43.657 51.6564 45.0001 49.9995 45.0001C48.3427 45.0001 46.9995 43.657 46.9995 42.0001Z" fill="#333333"/>
<path d="M59.9985 39.0001C58.3417 39.0001 56.9985 40.3433 56.9985 42.0001C56.9985 43.657 58.3417 45.0001 59.9985 45.0001C61.6554 45.0001 62.9985 43.657 62.9985 42.0001C62.9985 40.3433 61.6554 39.0001 59.9985 39.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M59.9985 40.0001C58.894 40.0001 57.9985 40.8956 57.9985 42.0001C57.9985 43.1047 58.894 44.0001 59.9985 44.0001C61.1031 44.0001 61.9985 43.1047 61.9985 42.0001C61.9985 40.8956 61.1031 40.0001 59.9985 40.0001ZM56.9985 42.0001C56.9985 40.3433 58.3417 39.0001 59.9985 39.0001C61.6554 39.0001 62.9985 40.3433 62.9985 42.0001C62.9985 43.657 61.6554 45.0001 59.9985 45.0001C58.3417 45.0001 56.9985 43.657 56.9985 42.0001Z" fill="#333333"/>
<path d="M69.9976 39.0001C68.3407 39.0001 66.9976 40.3433 66.9976 42.0001C66.9976 43.657 68.3407 45.0001 69.9976 45.0001C71.6544 45.0001 72.9976 43.657 72.9976 42.0001C72.9976 40.3433 71.6544 39.0001 69.9976 39.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M69.9976 40.0001C68.893 40.0001 67.9976 40.8956 67.9976 42.0001C67.9976 43.1047 68.893 44.0001 69.9976 44.0001C71.1021 44.0001 71.9976 43.1047 71.9976 42.0001C71.9976 40.8956 71.1021 40.0001 69.9976 40.0001ZM66.9976 42.0001C66.9976 40.3433 68.3407 39.0001 69.9976 39.0001C71.6544 39.0001 72.9976 40.3433 72.9976 42.0001C72.9976 43.657 71.6544 45.0001 69.9976 45.0001C68.3407 45.0001 66.9976 43.657 66.9976 42.0001Z" fill="#333333"/>
<path d="M80.0005 39.0001C78.3436 39.0001 77.0005 40.3433 77.0005 42.0001C77.0005 43.657 78.3436 45.0001 80.0005 45.0001C81.6573 45.0001 83.0005 43.657 83.0005 42.0001C83.0005 40.3433 81.6573 39.0001 80.0005 39.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M80.0005 40.0001C78.8959 40.0001 78.0005 40.8956 78.0005 42.0001C78.0005 43.1047 78.8959 44.0001 80.0005 44.0001C81.1051 44.0001 82.0005 43.1047 82.0005 42.0001C82.0005 40.8956 81.1051 40.0001 80.0005 40.0001ZM77.0005 42.0001C77.0005 40.3433 78.3436 39.0001 80.0005 39.0001C81.6573 39.0001 83.0005 40.3433 83.0005 42.0001C83.0005 43.657 81.6573 45.0001 80.0005 45.0001C78.3436 45.0001 77.0005 43.657 77.0005 42.0001Z" fill="#333333"/>
<path d="M49.9995 58.0001C48.3427 58.0001 46.9995 59.3433 46.9995 61.0001C46.9995 62.657 48.3427 64.0001 49.9995 64.0001C51.6564 64.0001 52.9995 62.657 52.9995 61.0001C52.9995 59.3433 51.6564 58.0001 49.9995 58.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M49.9995 59.0001C48.8949 59.0001 47.9995 59.8956 47.9995 61.0001C47.9995 62.1047 48.8949 63.0001 49.9995 63.0001C51.1041 63.0001 51.9995 62.1047 51.9995 61.0001C51.9995 59.8956 51.1041 59.0001 49.9995 59.0001ZM46.9995 61.0001C46.9995 59.3433 48.3427 58.0001 49.9995 58.0001C51.6564 58.0001 52.9995 59.3433 52.9995 61.0001C52.9995 62.657 51.6564 64.0001 49.9995 64.0001C48.3427 64.0001 46.9995 62.657 46.9995 61.0001Z" fill="#333333"/>
<path d="M59.9985 58.0001C58.3417 58.0001 56.9985 59.3433 56.9985 61.0001C56.9985 62.657 58.3417 64.0001 59.9985 64.0001C61.6554 64.0001 62.9985 62.657 62.9985 61.0001C62.9985 59.3433 61.6554 58.0001 59.9985 58.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M59.9985 59.0001C58.894 59.0001 57.9985 59.8956 57.9985 61.0001C57.9985 62.1047 58.894 63.0001 59.9985 63.0001C61.1031 63.0001 61.9985 62.1047 61.9985 61.0001C61.9985 59.8956 61.1031 59.0001 59.9985 59.0001ZM56.9985 61.0001C56.9985 59.3433 58.3417 58.0001 59.9985 58.0001C61.6554 58.0001 62.9985 59.3433 62.9985 61.0001C62.9985 62.657 61.6554 64.0001 59.9985 64.0001C58.3417 64.0001 56.9985 62.657 56.9985 61.0001Z" fill="#333333"/>
<path d="M69.9976 58.0001C68.3407 58.0001 66.9976 59.3433 66.9976 61.0001C66.9976 62.657 68.3407 64.0001 69.9976 64.0001C71.6544 64.0001 72.9976 62.657 72.9976 61.0001C72.9976 59.3433 71.6544 58.0001 69.9976 58.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M69.9976 59.0001C68.893 59.0001 67.9976 59.8956 67.9976 61.0001C67.9976 62.1047 68.893 63.0001 69.9976 63.0001C71.1021 63.0001 71.9976 62.1047 71.9976 61.0001C71.9976 59.8956 71.1021 59.0001 69.9976 59.0001ZM66.9976 61.0001C66.9976 59.3433 68.3407 58.0001 69.9976 58.0001C71.6544 58.0001 72.9976 59.3433 72.9976 61.0001C72.9976 62.657 71.6544 64.0001 69.9976 64.0001C68.3407 64.0001 66.9976 62.657 66.9976 61.0001Z" fill="#333333"/>
<path d="M80.0005 58.0001C78.3436 58.0001 77.0005 59.3433 77.0005 61.0001C77.0005 62.657 78.3436 64.0001 80.0005 64.0001C81.6573 64.0001 83.0005 62.657 83.0005 61.0001C83.0005 59.3433 81.6573 58.0001 80.0005 58.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M80.0005 59.0001C78.8959 59.0001 78.0005 59.8956 78.0005 61.0001C78.0005 62.1047 78.8959 63.0001 80.0005 63.0001C81.1051 63.0001 82.0005 62.1047 82.0005 61.0001C82.0005 59.8956 81.1051 59.0001 80.0005 59.0001ZM77.0005 61.0001C77.0005 59.3433 78.3436 58.0001 80.0005 58.0001C81.6573 58.0001 83.0005 59.3433 83.0005 61.0001C83.0005 62.657 81.6573 64.0001 80.0005 64.0001C78.3436 64.0001 77.0005 62.657 77.0005 61.0001Z" fill="#333333"/>
<path d="M49.9995 67.0001C48.3427 67.0001 46.9995 68.3433 46.9995 70.0001C46.9995 71.657 48.3427 73.0001 49.9995 73.0001C51.6564 73.0001 52.9995 71.657 52.9995 70.0001C52.9995 68.3433 51.6564 67.0001 49.9995 67.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M49.9995 68.0001C48.8949 68.0001 47.9995 68.8956 47.9995 70.0001C47.9995 71.1047 48.8949 72.0001 49.9995 72.0001C51.1041 72.0001 51.9995 71.1047 51.9995 70.0001C51.9995 68.8956 51.1041 68.0001 49.9995 68.0001ZM46.9995 70.0001C46.9995 68.3433 48.3427 67.0001 49.9995 67.0001C51.6564 67.0001 52.9995 68.3433 52.9995 70.0001C52.9995 71.657 51.6564 73.0001 49.9995 73.0001C48.3427 73.0001 46.9995 71.657 46.9995 70.0001Z" fill="#333333"/>
<path d="M59.9985 67.0001C58.3417 67.0001 56.9985 68.3433 56.9985 70.0001C56.9985 71.657 58.3417 73.0001 59.9985 73.0001C61.6554 73.0001 62.9985 71.657 62.9985 70.0001C62.9985 68.3433 61.6554 67.0001 59.9985 67.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M59.9985 68.0001C58.894 68.0001 57.9985 68.8956 57.9985 70.0001C57.9985 71.1047 58.894 72.0001 59.9985 72.0001C61.1031 72.0001 61.9985 71.1047 61.9985 70.0001C61.9985 68.8956 61.1031 68.0001 59.9985 68.0001ZM56.9985 70.0001C56.9985 68.3433 58.3417 67.0001 59.9985 67.0001C61.6554 67.0001 62.9985 68.3433 62.9985 70.0001C62.9985 71.657 61.6554 73.0001 59.9985 73.0001C58.3417 73.0001 56.9985 71.657 56.9985 70.0001Z" fill="#333333"/>
<path d="M69.9976 67.0001C68.3407 67.0001 66.9976 68.3433 66.9976 70.0001C66.9976 71.657 68.3407 73.0001 69.9976 73.0001C71.6544 73.0001 72.9976 71.657 72.9976 70.0001C72.9976 68.3433 71.6544 67.0001 69.9976 67.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M69.9976 68.0001C68.893 68.0001 67.9976 68.8956 67.9976 70.0001C67.9976 71.1047 68.893 72.0001 69.9976 72.0001C71.1021 72.0001 71.9976 71.1047 71.9976 70.0001C71.9976 68.8956 71.1021 68.0001 69.9976 68.0001ZM66.9976 70.0001C66.9976 68.3433 68.3407 67.0001 69.9976 67.0001C71.6544 67.0001 72.9976 68.3433 72.9976 70.0001C72.9976 71.657 71.6544 73.0001 69.9976 73.0001C68.3407 73.0001 66.9976 71.657 66.9976 70.0001Z" fill="#333333"/>
<path d="M80.0005 67.0001C78.3436 67.0001 77.0005 68.3433 77.0005 70.0001C77.0005 71.657 78.3436 73.0001 80.0005 73.0001C81.6573 73.0001 83.0005 71.657 83.0005 70.0001C83.0005 68.3433 81.6573 67.0001 80.0005 67.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M80.0005 68.0001C78.8959 68.0001 78.0005 68.8956 78.0005 70.0001C78.0005 71.1047 78.8959 72.0001 80.0005 72.0001C81.1051 72.0001 82.0005 71.1047 82.0005 70.0001C82.0005 68.8956 81.1051 68.0001 80.0005 68.0001ZM77.0005 70.0001C77.0005 68.3433 78.3436 67.0001 80.0005 67.0001C81.6573 67.0001 83.0005 68.3433 83.0005 70.0001C83.0005 71.657 81.6573 73.0001 80.0005 73.0001C78.3436 73.0001 77.0005 71.657 77.0005 70.0001Z" fill="#333333"/>
<path d="M49.9995 76.0001C48.3427 76.0001 46.9995 77.3433 46.9995 79.0001C46.9995 80.657 48.3427 82.0001 49.9995 82.0001C51.6564 82.0001 52.9995 80.657 52.9995 79.0001C52.9995 77.3433 51.6564 76.0001 49.9995 76.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M49.9995 77.0001C48.8949 77.0001 47.9995 77.8956 47.9995 79.0001C47.9995 80.1047 48.8949 81.0001 49.9995 81.0001C51.1041 81.0001 51.9995 80.1047 51.9995 79.0001C51.9995 77.8956 51.1041 77.0001 49.9995 77.0001ZM46.9995 79.0001C46.9995 77.3433 48.3427 76.0001 49.9995 76.0001C51.6564 76.0001 52.9995 77.3433 52.9995 79.0001C52.9995 80.657 51.6564 82.0001 49.9995 82.0001C48.3427 82.0001 46.9995 80.657 46.9995 79.0001Z" fill="#333333"/>
<path d="M59.9985 76.0001C58.3417 76.0001 56.9985 77.3433 56.9985 79.0001C56.9985 80.657 58.3417 82.0001 59.9985 82.0001C61.6554 82.0001 62.9985 80.657 62.9985 79.0001C62.9985 77.3433 61.6554 76.0001 59.9985 76.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M59.9985 77.0001C58.894 77.0001 57.9985 77.8956 57.9985 79.0001C57.9985 80.1047 58.894 81.0001 59.9985 81.0001C61.1031 81.0001 61.9985 80.1047 61.9985 79.0001C61.9985 77.8956 61.1031 77.0001 59.9985 77.0001ZM56.9985 79.0001C56.9985 77.3433 58.3417 76.0001 59.9985 76.0001C61.6554 76.0001 62.9985 77.3433 62.9985 79.0001C62.9985 80.657 61.6554 82.0001 59.9985 82.0001C58.3417 82.0001 56.9985 80.657 56.9985 79.0001Z" fill="#333333"/>
<path d="M19.9995 58.0001C18.3427 58.0001 16.9995 59.3433 16.9995 61.0001C16.9995 62.657 18.3427 64.0001 19.9995 64.0001C21.6564 64.0001 22.9995 62.657 22.9995 61.0001C22.9995 59.3433 21.6564 58.0001 19.9995 58.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.9995 59.0001C18.8949 59.0001 17.9995 59.8956 17.9995 61.0001C17.9995 62.1047 18.8949 63.0001 19.9995 63.0001C21.1041 63.0001 21.9995 62.1047 21.9995 61.0001C21.9995 59.8956 21.1041 59.0001 19.9995 59.0001ZM16.9995 61.0001C16.9995 59.3433 18.3427 58.0001 19.9995 58.0001C21.6564 58.0001 22.9995 59.3433 22.9995 61.0001C22.9995 62.657 21.6564 64.0001 19.9995 64.0001C18.3427 64.0001 16.9995 62.657 16.9995 61.0001Z" fill="#333333"/>
<path d="M29.9985 58.0001C28.3417 58.0001 26.9985 59.3433 26.9985 61.0001C26.9985 62.657 28.3417 64.0001 29.9985 64.0001C31.6554 64.0001 32.9985 62.657 32.9985 61.0001C32.9985 59.3433 31.6554 58.0001 29.9985 58.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.9985 59.0001C28.894 59.0001 27.9985 59.8956 27.9985 61.0001C27.9985 62.1047 28.894 63.0001 29.9985 63.0001C31.1031 63.0001 31.9985 62.1047 31.9985 61.0001C31.9985 59.8956 31.1031 59.0001 29.9985 59.0001ZM26.9985 61.0001C26.9985 59.3433 28.3417 58.0001 29.9985 58.0001C31.6554 58.0001 32.9985 59.3433 32.9985 61.0001C32.9985 62.657 31.6554 64.0001 29.9985 64.0001C28.3417 64.0001 26.9985 62.657 26.9985 61.0001Z" fill="#333333"/>
<path d="M39.9976 58.0001C38.3407 58.0001 36.9976 59.3433 36.9976 61.0001C36.9976 62.657 38.3407 64.0001 39.9976 64.0001C41.6544 64.0001 42.9976 62.657 42.9976 61.0001C42.9976 59.3433 41.6544 58.0001 39.9976 58.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M39.9976 59.0001C38.893 59.0001 37.9976 59.8956 37.9976 61.0001C37.9976 62.1047 38.893 63.0001 39.9976 63.0001C41.1021 63.0001 41.9976 62.1047 41.9976 61.0001C41.9976 59.8956 41.1021 59.0001 39.9976 59.0001ZM36.9976 61.0001C36.9976 59.3433 38.3407 58.0001 39.9976 58.0001C41.6544 58.0001 42.9976 59.3433 42.9976 61.0001C42.9976 62.657 41.6544 64.0001 39.9976 64.0001C38.3407 64.0001 36.9976 62.657 36.9976 61.0001Z" fill="#333333"/>
<path d="M19.9995 67.0001C18.3427 67.0001 16.9995 68.3433 16.9995 70.0001C16.9995 71.657 18.3427 73.0001 19.9995 73.0001C21.6564 73.0001 22.9995 71.657 22.9995 70.0001C22.9995 68.3433 21.6564 67.0001 19.9995 67.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.9995 68.0001C18.8949 68.0001 17.9995 68.8956 17.9995 70.0001C17.9995 71.1047 18.8949 72.0001 19.9995 72.0001C21.1041 72.0001 21.9995 71.1047 21.9995 70.0001C21.9995 68.8956 21.1041 68.0001 19.9995 68.0001ZM16.9995 70.0001C16.9995 68.3433 18.3427 67.0001 19.9995 67.0001C21.6564 67.0001 22.9995 68.3433 22.9995 70.0001C22.9995 71.657 21.6564 73.0001 19.9995 73.0001C18.3427 73.0001 16.9995 71.657 16.9995 70.0001Z" fill="#333333"/>
<path d="M29.9985 67.0001C28.3417 67.0001 26.9985 68.3433 26.9985 70.0001C26.9985 71.657 28.3417 73.0001 29.9985 73.0001C31.6554 73.0001 32.9985 71.657 32.9985 70.0001C32.9985 68.3433 31.6554 67.0001 29.9985 67.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.9985 68.0001C28.894 68.0001 27.9985 68.8956 27.9985 70.0001C27.9985 71.1047 28.894 72.0001 29.9985 72.0001C31.1031 72.0001 31.9985 71.1047 31.9985 70.0001C31.9985 68.8956 31.1031 68.0001 29.9985 68.0001ZM26.9985 70.0001C26.9985 68.3433 28.3417 67.0001 29.9985 67.0001C31.6554 67.0001 32.9985 68.3433 32.9985 70.0001C32.9985 71.657 31.6554 73.0001 29.9985 73.0001C28.3417 73.0001 26.9985 71.657 26.9985 70.0001Z" fill="#333333"/>
<path d="M39.9976 67.0001C38.3407 67.0001 36.9976 68.3433 36.9976 70.0001C36.9976 71.657 38.3407 73.0001 39.9976 73.0001C41.6544 73.0001 42.9976 71.657 42.9976 70.0001C42.9976 68.3433 41.6544 67.0001 39.9976 67.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M39.9976 68.0001C38.893 68.0001 37.9976 68.8956 37.9976 70.0001C37.9976 71.1047 38.893 72.0001 39.9976 72.0001C41.1021 72.0001 41.9976 71.1047 41.9976 70.0001C41.9976 68.8956 41.1021 68.0001 39.9976 68.0001ZM36.9976 70.0001C36.9976 68.3433 38.3407 67.0001 39.9976 67.0001C41.6544 67.0001 42.9976 68.3433 42.9976 70.0001C42.9976 71.657 41.6544 73.0001 39.9976 73.0001C38.3407 73.0001 36.9976 71.657 36.9976 70.0001Z" fill="#333333"/>
<path d="M19.9995 76.0001C18.3427 76.0001 16.9995 77.3433 16.9995 79.0001C16.9995 80.657 18.3427 82.0001 19.9995 82.0001C21.6564 82.0001 22.9995 80.657 22.9995 79.0001C22.9995 77.3433 21.6564 76.0001 19.9995 76.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.9995 77.0001C18.8949 77.0001 17.9995 77.8956 17.9995 79.0001C17.9995 80.1047 18.8949 81.0001 19.9995 81.0001C21.1041 81.0001 21.9995 80.1047 21.9995 79.0001C21.9995 77.8956 21.1041 77.0001 19.9995 77.0001ZM16.9995 79.0001C16.9995 77.3433 18.3427 76.0001 19.9995 76.0001C21.6564 76.0001 22.9995 77.3433 22.9995 79.0001C22.9995 80.657 21.6564 82.0001 19.9995 82.0001C18.3427 82.0001 16.9995 80.657 16.9995 79.0001Z" fill="#333333"/>
<path d="M29.9985 76.0001C28.3417 76.0001 26.9985 77.3433 26.9985 79.0001C26.9985 80.657 28.3417 82.0001 29.9985 82.0001C31.6554 82.0001 32.9985 80.657 32.9985 79.0001C32.9985 77.3433 31.6554 76.0001 29.9985 76.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.9985 77.0001C28.894 77.0001 27.9985 77.8956 27.9985 79.0001C27.9985 80.1047 28.894 81.0001 29.9985 81.0001C31.1031 81.0001 31.9985 80.1047 31.9985 79.0001C31.9985 77.8956 31.1031 77.0001 29.9985 77.0001ZM26.9985 79.0001C26.9985 77.3433 28.3417 76.0001 29.9985 76.0001C31.6554 76.0001 32.9985 77.3433 32.9985 79.0001C32.9985 80.657 31.6554 82.0001 29.9985 82.0001C28.3417 82.0001 26.9985 80.657 26.9985 79.0001Z" fill="#333333"/>
<path d="M39.9985 76.0001C38.3417 76.0001 36.9985 77.3433 36.9985 79.0001C36.9985 80.657 38.3417 82.0001 39.9985 82.0001C41.6554 82.0001 42.9985 80.657 42.9985 79.0001C42.9985 77.3433 41.6554 76.0001 39.9985 76.0001Z" fill="#EFEFEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M39.9985 77.0001C38.894 77.0001 37.9985 77.8956 37.9985 79.0001C37.9985 80.1047 38.894 81.0001 39.9985 81.0001C41.1031 81.0001 41.9985 80.1047 41.9985 79.0001C41.9985 77.8956 41.1031 77.0001 39.9985 77.0001ZM36.9985 79.0001C36.9985 77.3433 38.3417 76.0001 39.9985 76.0001C41.6554 76.0001 42.9985 77.3433 42.9985 79.0001C42.9985 80.657 41.6554 82.0001 39.9985 82.0001C38.3417 82.0001 36.9985 80.657 36.9985 79.0001Z" fill="#333333"/>
<path d="M37.0005 52C37.0005 50.3431 38.3436 49 40.0005 49C41.6573 49 43.0005 50.3431 43.0005 52C43.0005 53.6569 41.6573 55 40.0005 55C38.3436 55 37.0005 53.6569 37.0005 52Z" fill="url(#paint0_linear)"/>
<defs>
<linearGradient id="paint0_linear" x1="37.0005" y1="48.7656" x2="43.0005" y2="55" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC671"/>
<stop offset="0.59375" stop-color="#FF7541"/>
<stop offset="1" stop-color="#FF6F3D"/>
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,10 +0,0 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_26566_87235)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.00397432 3.00531C0.00100911 1.89884 0.89718 1 2.00397 1H5.96626L8.36394 3.00003H14.0008C15.1054 3.00003 16.0008 3.89546 16.0008 5.00003V12C16.0008 13.1046 15.1054 14 14.0008 14H2.0471C1.00059 14 0.00453657 13.1588 7.56979e-06 12.0039L0 11.9996L0.00397432 3.00531ZM5.24161 3H2.00397L2.00398 3.00436L2.00001 11.9752L2.00285 11.978C2.01068 11.9854 2.02062 11.9918 2.03054 11.9958C2.03996 11.9997 2.0471 12 2.0471 12H14.0008V5.00003H7.63929L5.24161 3Z" fill="#333333"/>
</g>
<defs>
<clipPath id="clip0_26566_87235">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 771 B

View File

@ -1,3 +0,0 @@
<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.0918 0C10.2005 0 11.91 1.65314 11.91 3.6923C11.91 5.73162 10.2005 7.3846 8.0918 7.3846C5.98311 7.3846 4.27361 5.73147 4.27361 3.6923C4.27361 1.65314 5.98311 0 8.0918 0ZM13.2951 16H2.8884C1.89617 16 1.0918 15.2493 1.0918 14.3349C1.0918 10.1384 3.13902 8.5 5.31618 8.55393C6.07104 9.03774 6.9876 9.32204 7.97664 9.32204C9.00192 9.32204 9.94933 9.01658 10.7193 8.5C13.1437 8.5 15.0918 10.1384 15.0918 14.3349C15.0918 15.2493 14.2874 16 13.2951 16Z" fill="#333333"/>
</svg>

Before

Width:  |  Height:  |  Size: 618 B

View File

@ -1,3 +0,0 @@
<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.0918 8.5C15.0918 12.6421 11.7339 16 7.5918 16C3.44966 16 0.0917969 12.6421 0.0917969 8.5C0.0917969 4.35786 3.44966 1 7.5918 1C11.7339 1 15.0918 4.35786 15.0918 8.5ZM12.0918 7H3.0918V10H12.0918V7Z" fill="#657077"/>
</svg>

Before

Width:  |  Height:  |  Size: 370 B

View File

@ -1,3 +0,0 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M2 2C0.89543 2 0 2.89543 0 4V12C0 13.1046 0.895431 14 2 14H14C15.1046 14 16 13.1046 16 12V4C16 2.89543 15.1046 2 14 2H2ZM12.2967 4L3.70326 4L8 7.68292L12.2967 4ZM2 5.17422V12H14V5.17422L9.30158 9.20144C8.5526 9.84342 7.4474 9.84342 6.69842 9.20144L2 5.17422Z" fill="#333333"/>
</svg>

Before

Width:  |  Height:  |  Size: 429 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View File

@ -1,10 +0,0 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_20597_65864)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.84646 0.979492L5.22299 14.5025L7.15485 15.0201L10.7783 1.49713L8.84646 0.979492ZM2.41419 7.99916L5.20702 5.20614L3.79276 3.79197L0.292868 7.2921C-0.0976332 7.68263 -0.0976212 8.31578 0.292895 8.7063L3.79278 12.2062L5.20699 10.7919L2.41419 7.99916ZM13.5857 8.00004L10.7928 5.20714L12.207 3.79292L15.707 7.29293C15.8945 7.48047 15.9999 7.73482 15.9999 8.00004C15.9999 8.26526 15.8945 8.51961 15.707 8.70715L12.2065 12.2076L10.7923 10.7934L13.5857 8.00004Z" fill="#333333"/>
</g>
<defs>
<clipPath id="clip0_20597_65864">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 777 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

View File

@ -1,3 +0,0 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.14502 -1.07443e-06L14.8481 -2.59613e-06C15.4812 -2.70681e-06 15.9962 0.515037 15.9962 1.14808L15.9962 9.85224C15.9962 10.4853 15.4812 11.0004 14.8481 11.0004L11.9896 11.0004L11.9896 6.03888C11.9896 4.82791 11.242 4.00369 10.031 4.00369L4.99694 4.00369L4.99694 1.14809C4.99693 0.515038 5.51194 -9.63738e-07 6.14502 -1.07443e-06ZM1.12973 4.99872L9.87024 4.99872C10.4932 4.99872 11 5.50551 11 6.12845L11 14.8703C11 15.4932 10.4932 16 9.87028 16L1.12973 16C0.50679 16 3.70837e-05 15.4932 2.6e-06 14.8703L1.07154e-06 6.12845C9.62618e-07 5.50551 0.506823 4.99872 1.12973 4.99872Z" fill="#A3A9AE"/>
</svg>

Before

Width:  |  Height:  |  Size: 747 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -1,3 +0,0 @@
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.76288 6.35869C7.56764 6.16343 7.56764 5.84687 7.76288 5.65161L10.9493 2.46498C11.1445 2.26973 11.1445 1.95316 10.9493 1.75791L10.2422 1.05077C10.0469 0.855489 9.73031 0.855489 9.53504 1.05077L6.34878 4.23729C6.15352 4.43257 5.83691 4.43257 5.64165 4.23729L2.46017 1.05556C2.26491 0.860275 1.9483 0.860275 1.75304 1.05556L1.04596 1.76269C0.850716 1.95795 0.850716 2.27451 1.04596 2.46977L4.22755 5.65161C4.42279 5.84687 4.42279 6.16343 4.22755 6.35869L1.0501 9.53639C0.854858 9.73165 0.854858 10.0482 1.0501 10.2435L1.75718 10.9506C1.95245 11.1459 2.26905 11.1459 2.46432 10.9506L5.64165 7.77302C5.83691 7.57774 6.15352 7.57774 6.34878 7.77302L9.5309 10.9554C9.72616 11.1507 10.0428 11.1507 10.238 10.9554L10.9451 10.2483C11.1404 10.053 11.1404 9.73644 10.9451 9.54118L7.76288 6.35869Z" fill="#657077"/>
</svg>

Before

Width:  |  Height:  |  Size: 958 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

View File

@ -1,3 +0,0 @@
<svg width="16" height="15" viewBox="0 0 16 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M11 4.05692C11 6.06254 9.68753 8 8.00003 8C6.31247 8 5 6.06254 5 4.05692V3.42859C5 1.42297 6.31247 0 8.00003 0C9.68753 0 11 1.42305 11 3.42859V4.05692ZM3.99684 6.89387C3.99684 7.97353 2.89941 8.49386 2.49839 8.49386C2.11871 8.49386 1 7.97353 1 6.89387V6.09385C1 5.01414 1.81506 4.4938 2.49839 4.4938C3.20518 4.4938 3.99684 5.01414 3.99684 6.09385V6.89387ZM12.9783 10.538C12.9778 10.533 12.9768 10.5281 12.9759 10.5233L12.9759 10.5232C12.9749 10.5184 12.9739 10.5136 12.9734 10.5087C12.9588 10.3888 12.9363 10.2715 12.9051 10.1567C12.9051 10.1556 12.9051 10.1547 12.9041 10.1537C12.8386 9.90959 12.7282 9.67443 12.5633 9.44275V9.44176C12.2927 9.06046 11.8846 8.67156 11.2215 8.29233L11.1924 8.27572C10.8622 8.08679 10.7105 8 10.4998 8C10.1551 8 9.85434 8.27292 9.34759 8.74673H9.34655L8.88562 9.17822C8.88396 9.17982 8.87753 9.18836 8.86692 9.20245L8.86689 9.20249C8.77104 9.3298 8.33489 9.90909 7.99994 9.90909C7.66516 9.90909 7.22925 9.33036 7.13307 9.20268C7.12235 9.18845 7.11585 9.17982 7.11419 9.17822L6.65326 8.74673H6.65228C6.14554 8.27292 5.84475 8 5.50003 8C5.28326 8 5.08981 8.09187 4.7784 8.29233C4.13547 8.70555 3.70702 9.05997 3.43759 9.44069L3.43654 9.44119C3.43605 9.44169 3.4358 9.44233 3.43557 9.44296C3.43533 9.44358 3.4351 9.44418 3.43465 9.4446C3.27151 9.67436 3.16215 9.90802 3.09678 10.1507C3.09587 10.1526 3.09475 10.1551 3.09399 10.1575C3.06361 10.2715 3.04112 10.3872 3.02652 10.5061C3.02602 10.5117 3.02502 10.5171 3.02401 10.5226L3.02401 10.5226C3.02304 10.5278 3.02208 10.5331 3.02156 10.5384C3.00788 10.6647 3.00012 10.7935 3.00012 10.9272L3.00012 10.9643C3.00009 11.2949 2.99986 13.7152 3.00012 13.7273C3.00012 14.6321 3.33507 15 4.25008 15H11.7499C12.6728 15 12.9999 14.6519 12.9999 13.7273C13.0002 13.7153 12.9999 11.3331 12.9998 10.9726L12.9998 10.9272C12.9998 10.7936 12.9919 10.6648 12.9783 10.538ZM14.9969 6.89387C14.9969 7.97353 13.8994 8.49386 13.4984 8.49386C13.1187 8.49386 12 7.97353 12 6.89387V6.09385C12 5.01414 12.8151 4.4938 13.4984 4.4938C14.2053 4.4938 14.9969 5.01414 14.9969 6.09385V6.89387ZM0.758501 9.11697C0.138217 9.77624 0.000231735 10.8273 0.000231735 11.5109L0.000222208 11.5363C0.000153736 11.7128 -0.000247212 12.7465 0.000231735 12.7554C0.000231735 13.6587 0.162723 14 0.666809 14H2V10.2662L1.66671 9.64398C1.31409 9.0635 1.01682 8.8428 0.758501 9.11697ZM15.2415 9.11697C15.8617 9.77615 15.9998 10.8272 15.9998 11.5108L15.9998 11.5364C15.9998 11.7134 16.0002 12.7465 15.9998 12.7554C15.9998 13.6587 15.8373 14 15.3332 14H14V10.2663L14.3333 9.64404C14.6859 9.0635 14.9832 8.8428 15.2415 9.11697Z" fill="#657077"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -1,3 +0,0 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M2 8C2 4.68629 4.68629 2 8 2C11.3137 2 14 4.68629 14 8C14 11.3137 11.3137 14 8 14C4.68629 14 2 11.3137 2 8ZM8 0C3.58172 0 0 3.58172 0 8C0 12.4183 3.58172 16 8 16C12.4183 16 16 12.4183 16 8C16 3.58172 12.4183 0 8 0ZM11.7074 10.2938L9.41412 8.00086L11.7075 5.70749L10.2933 4.29328L7.9998 6.58677L5.70588 4.29322L4.29178 5.70755L6.58558 8.00098L4.29328 10.2933L5.7075 11.7075L7.99991 9.41508L10.2933 11.7081L11.7074 10.2938Z" fill="#333333"/>
</svg>

Before

Width:  |  Height:  |  Size: 592 B

View File

@ -1,32 +0,0 @@
<svg width="280" height="280" viewBox="0 0 280 280" fill="none" xmlns="http://www.w3.org/2000/svg">
<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="280" height="280">
<rect width="280" height="280" fill="white"/>
</mask>
<g mask="url(#mask0)">
<path opacity="0.6" d="M113.891 13.0947C128.78 -2.17495 153.292 -2.2868 168.32 12.8464L265.205 110.408C280.311 125.62 279.936 150.285 264.373 165.029L167.779 256.547C153.646 269.937 131.701 270.549 116.843 257.967L15.7021 172.313C-1.19362 158.004 -2.41626 132.371 13.0409 116.519L113.891 13.0947Z" fill="#F1F9FE"/>
</g>
<rect x="82.0244" y="111.186" width="121.375" height="68.7691" rx="4.8951" fill="#0F4071"/>
<g filter="url(#filter0_d)">
<path d="M94.5661 57.7622C94.5661 55.0587 96.7577 52.8671 99.4612 52.8671H161.381L192.004 87.1897V172.654C192.004 175.357 189.813 177.549 187.109 177.549H99.4612C96.7577 177.549 94.5661 175.357 94.5661 172.654V57.7622Z" fill="white"/>
<path d="M96.5241 57.7622C96.5241 56.1401 97.8391 54.8252 99.4612 54.8252H160.504L190.046 87.9362V172.654C190.046 174.276 188.731 175.591 187.109 175.591H99.4612C97.8391 175.591 96.5241 174.276 96.5241 172.654V57.7622Z" stroke="white" stroke-width="3.91608"/>
</g>
<path d="M191.969 86.2635L161.721 53.8561V82.3474C161.721 84.5102 163.474 86.2635 165.637 86.2635H191.969Z" fill="#8BB3EA"/>
<line x1="113.228" y1="72.9048" x2="148.287" y2="72.9048" stroke="#586C8F" stroke-width="3.91608" stroke-linecap="round"/>
<line x1="113.228" y1="103.725" x2="132.975" y2="103.725" stroke="#586C8F" stroke-width="3.91608" stroke-linecap="round"/>
<line x1="145.243" y1="103.725" x2="174.734" y2="103.725" stroke="#586C8F" stroke-width="3.91608" stroke-linecap="round"/>
<line x1="113.228" y1="119.135" x2="142.719" y2="119.135" stroke="#586C8F" stroke-width="3.91608" stroke-linecap="round"/>
<line x1="113.228" y1="84.1123" x2="126.016" y2="84.1123" stroke="#586C8F" stroke-width="3.91608" stroke-linecap="round"/>
<path d="M192.921 207.552H91.3495C86.7309 207.552 82.7405 204.325 81.7754 199.808L72.0396 154.246C70.7377 148.153 75.3832 142.41 81.6137 142.41H131.037C133.116 142.41 135.142 141.748 136.82 140.52L154.622 127.489C156.3 126.261 158.326 125.599 160.405 125.599H204.575C210.702 125.599 215.324 131.164 214.199 137.187L202.545 199.56C201.679 204.194 197.635 207.552 192.921 207.552Z" fill="#FFD064"/>
<path d="M192.848 207.552H91.2909C86.6989 207.552 82.724 204.361 81.7319 199.878L80.4389 194.034C79.0864 187.922 83.7381 182.129 89.9978 182.129H123.231C125.31 182.129 127.336 181.467 129.013 180.239L146.816 167.208C148.494 165.98 150.52 165.318 152.599 165.318H196.874C202.966 165.318 207.579 170.823 206.513 176.821L202.487 199.475C201.657 204.148 197.594 207.552 192.848 207.552Z" fill="#FFD064"/>
<defs>
<filter id="filter0_d" x="72.0486" y="29.3706" width="144.431" height="171.675" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
<feOffset dx="0.979021"/>
<feGaussianBlur stdDeviation="11.7483"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.305882 0 0 0 0 0.768627 0 0 0 0 0.976471 0 0 0 0.16 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
</filter>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

View File

@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M3 2.5C3 1.67157 3.67157 1 4.5 1H16L21 6.00587V22.5C21 23.3284 20.3284 24 19.5 24H4.5C3.67157 24 3 23.3284 3 22.5V2.5ZM6 4H14V6H6V4ZM18 9H6V11H18V9ZM6 14H18V16H6V14ZM18 19H6V21H18V19Z" fill="#7A95B0"/>
</svg>

Before

Width:  |  Height:  |  Size: 354 B

View File

@ -1,10 +0,0 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_24347_72303)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.00095 6.58749V1H9.00095V6.58409L11.2915 4.29342L12.7057 5.70759L8.70662 9.70693C8.31614 10.0974 7.68302 10.0975 7.29248 9.70704L3.29238 5.70792L4.70642 4.29353L7.00095 6.58749ZM2 8V12H13.9355V8H15.9355V12C15.9355 13.1046 15.0401 14 13.9355 14H2C0.895429 14 0 13.1046 0 12V8H2Z" fill="#333333"/>
</g>
<defs>
<clipPath id="clip0_24347_72303">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 600 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

View File

@ -1,3 +0,0 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8 0C10.1087 0 11.8182 1.65314 11.8182 3.6923C11.8182 5.73162 10.1087 7.3846 8 7.3846C5.89131 7.3846 4.18182 5.73147 4.18182 3.6923C4.18182 1.65314 5.89131 0 8 0ZM13.2033 16H2.7966C1.80438 16 1 15.2493 1 14.3349C1 10.1384 3.04722 8.5 5.22439 8.55393C5.97924 9.03774 6.8958 9.32204 7.88484 9.32204C8.91013 9.32204 9.85753 9.01658 10.6275 8.5C13.0519 8.5 15 10.1384 15 14.3349C15 15.2493 14.1956 16 13.2033 16Z" fill="#657077"/>
</svg>

Before

Width:  |  Height:  |  Size: 579 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View File

@ -1,3 +0,0 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M2 8.00029C2 4.6863 4.68608 2 7.99857 2C11.3139 2 14 4.68685 14 8.00029C14 11.3126 11.3139 14 7.99857 14C6.28313 14 4.73839 13.2822 3.64247 12.1249C2.62256 11.0478 2 9.59875 2 8.00029ZM7.99857 0C3.58105 0 0 3.58219 0 8.00029C0 10.1304 0.83265 12.0663 2.19023 13.5C3.64805 15.0395 5.71117 16 7.99857 16C12.4184 16 16 12.4172 16 8.00029C16 3.58219 12.4184 0 7.99857 0ZM7.42453 11.2527L7.5358 11.3632L7.64758 11.2527L12.4849 6.41401L11.0705 5L7.53622 8.53504L5.41533 6.41473L4 7.82841L7.42453 11.2527Z" fill="#333333"/>
</svg>

Before

Width:  |  Height:  |  Size: 669 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

View File

@ -1,3 +0,0 @@
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.97925 0H1.50001C1.08685 0 0.733487 0.146708 0.44007 0.44007C0.146708 0.733487 0 1.08683 0 1.50001V8.50006C0 8.91321 0.146708 9.26659 0.44007 9.56C0.733487 9.85342 1.08685 10.0001 1.50001 10.0001H8.50006C8.91322 10.0001 9.26659 9.85342 9.55988 9.56C9.85329 9.26659 10 8.91322 10 8.50006V5.02092L9.99479 5.01571H9V7.87507C9 8.18495 8.88997 8.44997 8.66991 8.67003C8.44994 8.8901 8.18492 9.00013 7.87505 9.00013H2.12501C1.81514 9.00013 1.55012 8.8901 1.33005 8.67003C1.11003 8.44997 1 8.18493 1 7.87507V2.12501C1 1.81513 1.11003 1.55012 1.33005 1.33005C1.55012 1.11003 1.81514 1 2.12501 1H4.99579V0.0165411L4.97925 0ZM9.67929 3.04609C9.7193 3.04609 9.76121 3.03774 9.80457 3.02105C9.93476 2.96423 9.99998 2.86575 10 2.72547V0.320688C10 0.233844 9.96827 0.158668 9.90487 0.0952501C9.84131 0.0317617 9.76614 0 9.67931 0H7.2746C7.13432 0 7.03573 0.0651905 6.97898 0.195414C6.92223 0.33241 6.94559 0.449244 7.04916 0.546109L7.77061 1.26754L4.09521 4.94297C4.03174 5.00638 4 5.08158 4 5.16833C4 5.25513 4.03174 5.33042 4.09521 5.39377L4.60623 5.90487C4.66968 5.96829 4.74484 6.00007 4.83174 6.00007C4.9186 6.00007 4.99369 5.96829 5.05723 5.90487L8.73246 2.22948L9.45386 2.95091C9.51403 3.01431 9.5892 3.04609 9.67929 3.04609Z" fill="#333333"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -1,3 +0,0 @@
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M1 0C0.447715 0 0 0.447715 0 1V5C0 5.55228 0.447715 6 1 6H11C11.5523 6 12 5.55228 12 5V1C12 0.447715 11.5523 0 11 0H1ZM1 7C0.447715 7 0 7.44772 0 8C0 8.55229 0.447715 9 1 9H11C11.5523 9 12 8.55229 12 8C12 7.44772 11.5523 7 11 7H1ZM4 11C4 10.4477 4.44772 10 5 10H11C11.5523 10 12 10.4477 12 11C12 11.5523 11.5523 12 11 12H5C4.44772 12 4 11.5523 4 11ZM2.5 2C2.22386 2 2 2.22386 2 2.5V3.5C2 3.77614 2.22386 4 2.5 4H9.5C9.77614 4 10 3.77614 10 3.5V2.5C10 2.22386 9.77614 2 9.5 2H2.5Z" fill="#A3A9AE"/>
</svg>

Before

Width:  |  Height:  |  Size: 650 B

View File

@ -1,3 +0,0 @@
<svg width="16" height="20" viewBox="0 0 16 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M2 0C0.895431 0 0 0.895431 0 2V18C0 19.1046 0.895431 20 2 20H14C15.1046 20 16 19.1046 16 18V4.41421C16 4.149 15.8946 3.89464 15.7071 3.70711L12.2929 0.292893C12.1054 0.105357 11.851 0 11.5858 0H2ZM3 5H10V3H3V5ZM3 9H13V7H3V9ZM3 13H13V11H3V13ZM3 17H13V15H3V17Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 427 B

View File

@ -1,37 +0,0 @@
<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M22 55V34H17C14 34 12 36.827 12 39V55H22Z" fill="#CCE9FF"/>
<path d="M22 9.00012H66.5L76 19.5001V54.0001H22V9.00012Z" fill="white"/>
<path d="M65.5 8.5L76 19.5H65.5V8.5Z" fill="url(#paint0_linear)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M22 8.00012H66L76 19V48.7858H75.0182L75 19L66 9.00012H23L22.9818 55.0001H40.885V56.0001H22V8.00012Z" fill="#333333"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M65.3197 8.03366C65.5124 7.95917 65.731 8.01084 65.87 8.16368L75.87 19.1637C76.0031 19.3101 76.0373 19.5213 75.9573 19.7023C75.8772 19.8833 75.6979 20 75.5 20H65.5C65.2239 20 65 19.7761 65 19.5V8.50002C65 8.29345 65.127 8.10815 65.3197 8.03366ZM66 9.79332V19H74.3697L66 9.79332Z" fill="#333333"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.7098 35.3949C14.783 34.4517 16.389 34 18 34H23.0006V56H12V39.5455C12 37.752 12.6275 36.3462 13.7098 35.3949ZM14.3701 36.146C13.532 36.8826 13.0001 37.9996 13.0001 39.5455V55H22.0005V35H18C16.5673 35 15.2173 35.4013 14.3701 36.146Z" fill="#333333"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M76 34V48H86V38.5604C86 35.2337 84.0124 34 81.1139 34H76Z" fill="#CCE9FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M75 34H81C83.7221 34 86 36.2016 86 39V49H75V34ZM76 35V48H85V39C85 36.9162 83.2021 35 81 35H76Z" fill="#333333"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M47.487 48.467L42.3431 54.1906H12.583C10.125 54.1906 7.74837 55.9138 8.02148 57.7026L13.2106 87.6979C13.4837 89.4866 15.2589 91.0001 17.7169 91.0001H83.5368C85.9949 91.0001 87.9066 89.4866 88.0432 87.6979L91.9724 49.6966C92.1954 48.573 91.0526 47.0001 89.0463 47.0001H50.9859C49.6483 47.0001 48.4429 47.5039 47.487 48.467Z" fill="url(#paint1_linear)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M42.8762 55.0178H12.6036C10.4475 55.0178 8.66779 56.3477 9.08741 58.962L14.0985 88.4654L14.0999 88.475C14.2885 89.7359 15.5736 91 17.6246 91H83.5758C85.6936 91 87.0065 89.6944 87.0922 88.5482L87.0932 88.5355L91.0167 49.5672C91.0167 49.5672 91.0167 48 89.0232 48H50.9599C49.9045 48 48.96 48.3953 48.1892 49.1799L42.8762 55.0178ZM47.4541 48.5002L42.4231 54.0178H12.6036C10.1407 54.0178 7.39939 55.4389 8.11581 59.0233L13.1092 88.6227C13.3829 90.4521 15.1617 92 17.6246 92H83.5758C86.0387 92 87.9543 90.4521 88.0911 88.6227L92 49.7577C92 49.7577 92 47 89.0232 47H50.9599C49.6197 47 48.4119 47.5152 47.4541 48.5002Z" fill="#333333"/>
<path d="M48 14.9523H29V33.0475H48V14.9523Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M29 33.0477L35.5 26.8573L39 30.1906L44.2927 23.5239L48 29.0377V33.0477" fill="#E0E0E0"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M28 15C28 14.474 28.4477 14 29 14H48C48.5523 14 49 14.474 49 15V33C49 33.526 48.5523 34 48 34H29C28.4477 34 28 33.526 28 33V15ZM48 15.0312V33H29V15L48 15.0312Z" fill="#333333"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.0096 32.995H48V29.0375L44.3252 23.5238L39.1951 30.78L35.3456 27.2282L29.0096 32.995ZM39.0329 29.3043L36.0415 26.5442C35.6545 26.1872 35.0401 26.1863 34.652 26.5422L28.3064 32.3616C27.9085 32.7264 27.8966 33.3293 28.2797 33.7082C28.6627 34.0871 29.2958 34.0985 29.6936 33.7336L29.9224 33.5238H47.1338C47.3067 33.8084 47.6299 34 48 34C48.5523 34 49 33.5736 49 33.0476V29.0375C49 28.8568 48.946 28.6798 48.8443 28.5272L45.1695 23.0134C44.9886 22.742 44.6762 22.5758 44.3387 22.5715C44.0012 22.5672 43.6842 22.7252 43.4957 22.9919L39.0329 29.3043Z" fill="#333333"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M28 39.5067C28 39.2449 28.2239 39.0326 28.5 39.0326H70.5C70.7761 39.0326 71 39.2449 71 39.5067C71 39.7686 70.7761 39.9809 70.5 39.9809H28.5C28.2239 39.9809 28 39.7686 28 39.5067Z" fill="#333333"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M53.5 18.5C53.5 18.2239 53.7239 18 54 18H60C60.2761 18 60.5 18.2239 60.5 18.5C60.5 18.7761 60.2761 19 60 19H54C53.7239 19 53.5 18.7761 53.5 18.5Z" fill="#333333"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M53.5 23.5C53.5 23.2239 53.7239 23 54 23H70C70.2761 23 70.5 23.2239 70.5 23.5C70.5 23.7761 70.2761 24 70 24H62H54C53.7239 24 53.5 23.7761 53.5 23.5Z" fill="#333333"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M53.5 28.5C53.5 28.2239 53.7239 28 54 28H70C70.2761 28 70.5 28.2239 70.5 28.5C70.5 28.7761 70.2761 29 70 29H54C53.7239 29 53.5 28.7761 53.5 28.5Z" fill="#333333"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M28.2183 44.5037C28.2183 44.2275 28.4421 44.0037 28.7183 44.0037H40.7183C40.9944 44.0037 41.2183 44.2275 41.2183 44.5037C41.2183 44.7798 40.9944 45.0037 40.7183 45.0037H28.7183C28.4421 45.0037 28.2183 44.7798 28.2183 44.5037Z" fill="#333333"/>
<path d="M36 19.557C36 20.6616 35.1046 21.557 34 21.557C32.8954 21.557 32 20.6616 32 19.557C32 18.4524 32.8954 17.557 34 17.557C35.1046 17.557 36 18.4524 36 19.557Z" fill="url(#paint2_linear)"/>
<defs>
<linearGradient id="paint0_linear" x1="65.5" y1="8.07031" x2="76.5077" y2="18.9881" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC671"/>
<stop offset="0.59375" stop-color="#FF7541"/>
<stop offset="1" stop-color="#FF6F3D"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="8.12453" y1="55.5389" x2="48.0634" y2="118.763" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC671"/>
<stop offset="0.652615" stop-color="#FF8657"/>
</linearGradient>
<linearGradient id="paint2_linear" x1="34" y1="17.557" x2="34" y2="21.557" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF8E3D"/>
<stop offset="1" stop-color="#FF6F3D"/>
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 5.5 KiB

View File

@ -1,3 +0,0 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M3 1C1.89543 1 1 1.89543 1 3V13C1 14.1046 1.89543 15 3 15H13C14.1046 15 15 14.1046 15 13V3C15 1.89543 14.1046 1 13 1H3ZM3 3L13 3V13H3V3ZM4 6H12V4H4V6ZM4 9H12V7H4V9ZM8 12H12V10H8V12Z" fill="#333333"/>
</svg>

Before

Width:  |  Height:  |  Size: 352 B

View File

@ -1,3 +0,0 @@
<svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.5 0C7.67157 0 7 0.671573 7 1.5V7H1.5C0.671573 7 0 7.67157 0 8.5C0 9.32843 0.671573 10 1.5 10H7V15.5C7 16.3284 7.67157 17 8.5 17C9.32843 17 10 16.3284 10 15.5V10H15.5C16.3284 10 17 9.32843 17 8.5C17 7.67157 16.3284 7 15.5 7H10V1.5C10 0.671573 9.32843 0 8.5 0Z" fill="#A3A9AE"/>
</svg>

Before

Width:  |  Height:  |  Size: 432 B

View File

@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.74 7.56916C15.74 9.82801 14.1037 12.0101 12 12.0101C9.89609 12.0101 8.25985 9.82801 8.25985 7.56916V6.86149C8.25985 4.60264 9.89609 3 12 3C14.1037 3 15.74 4.60273 15.74 6.86149V7.56916ZM6.75451 10.3407C6.75451 11.9601 5.10837 12.7406 4.50684 12.7406C3.93731 12.7406 2.25925 11.9601 2.25925 10.3407V9.14063C2.25925 7.52106 3.48185 6.74056 4.50684 6.74056C5.56702 6.74056 6.75451 7.52106 6.75451 9.14063V10.3407ZM17.9739 15.7413C17.9733 15.7354 17.9721 15.7296 17.971 15.7239C17.9698 15.7182 17.9686 15.7125 17.968 15.7067C17.9504 15.5654 17.9235 15.4272 17.886 15.2919C17.886 15.2906 17.886 15.2896 17.8848 15.2884C17.8063 15.0007 17.6738 14.7235 17.4759 14.4505V14.4493C17.1512 13.9999 16.6615 13.5416 15.8658 13.0946L15.8309 13.0751C15.4346 12.8524 15.2526 12.7501 14.9998 12.7501C14.5862 12.7501 14.2253 13.0718 13.6172 13.6302H13.6159L13.0628 14.1387C13.0608 14.1406 13.0531 14.1507 13.0404 14.1673L13.0403 14.1673C12.9253 14.3174 12.402 15.0001 12 15.0001C11.5983 15.0001 11.0753 14.318 10.9598 14.1675L10.9598 14.1675L10.9598 14.1675L10.9597 14.1674C10.9469 14.1507 10.9392 14.1406 10.9372 14.1387L10.3841 13.6302H10.3829C9.77483 13.0718 9.4139 12.7501 9.00025 12.7501C8.74012 12.7501 8.50799 12.8584 8.13431 13.0946C7.36283 13.5816 6.8487 13.9993 6.52539 14.448L6.52413 14.4486C6.52354 14.4492 6.52325 14.45 6.52296 14.4507C6.52268 14.4515 6.52241 14.4522 6.52187 14.4527C6.32611 14.7234 6.19487 14.9988 6.11643 15.2848C6.11534 15.2871 6.114 15.2901 6.11308 15.2929C6.07663 15.4272 6.04964 15.5636 6.03213 15.7036C6.03153 15.7103 6.03032 15.7167 6.02911 15.7231C6.02795 15.7293 6.02679 15.7355 6.02618 15.7418C6.00975 15.8906 6.00045 16.0424 6.00045 16.2L6.00045 16.2438C6.00041 16.6333 6.00014 19.4858 6.00045 19.5C6.00045 20.5664 6.40237 21 7.50035 21H16.4999C17.6074 21 17.9998 20.5898 17.9998 19.5C18.0001 19.4859 17.9998 16.6785 17.9997 16.2535L17.9997 16.2C17.9996 16.0425 17.9902 15.8907 17.9739 15.7413ZM21.754 10.3407C21.754 11.9601 20.1077 12.7406 19.5062 12.7406C18.9366 12.7406 17.2586 11.9601 17.2586 10.3407V9.14063C17.2586 7.52106 18.4812 6.74056 19.5062 6.74056C20.5665 6.74056 21.754 7.52106 21.754 9.14063V10.3407ZM1.70674 14.3649C0.31101 15.1595 0.000521438 16.4263 0.000521438 17.2501L0.000500001 17.2808C0.000345928 17.4935 -0.000556263 18.7394 0.000521438 18.7501C0.000521438 19.8388 0.366152 20.2502 1.50042 20.2502H4.5003V15.7501L3.75035 15.0001C2.95691 14.3005 2.288 14.0345 1.70674 14.3649ZM22.2933 14.3649C23.6889 15.1594 23.9995 16.4262 23.9995 17.2501L23.9995 17.281C23.9997 17.4942 24.0006 18.7394 23.9995 18.7502C23.9995 19.8389 23.6338 20.2503 22.4996 20.2503H19.4997V15.7502L20.2496 15.0002C21.0431 14.3005 21.712 14.0345 22.2933 14.3649Z" fill="#7A95B0"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -1,3 +0,0 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8 2C4.68629 2 2 4.68629 2 8C2 11.3137 4.68629 14 8 14C11.3137 14 14 11.3137 14 8C14 4.68629 11.3137 2 8 2ZM0 8C0 3.58172 3.58172 0 8 0C12.4183 0 16 3.58172 16 8C16 12.4183 12.4183 16 8 16C3.58172 16 0 12.4183 0 8ZM9 5C9 5.55228 8.55228 6 8 6C7.44772 6 7 5.55228 7 5C7 4.44772 7.44772 4 8 4C8.55228 4 9 4.44772 9 5ZM8 7C7.44772 7 7 7.44772 7 8L7 11C7 11.5523 7.44772 12 8 12C8.55228 12 9 11.5523 9 11V8C9 7.44772 8.55228 7 8 7Z" fill="#333333"/>
</svg>

Before

Width:  |  Height:  |  Size: 598 B

View File

@ -1,5 +0,0 @@
<svg width="56" height="54" viewBox="0 0 56 54" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.5775 52.6067L1.47594 41.7982C-0.491979 40.8546 -0.491979 39.3964 1.47594 38.5385L9.51872 34.7642L24.492 41.7982C26.4599 42.7418 29.6257 42.7418 31.508 41.7982L46.4813 34.7642L54.5241 38.5385C56.492 39.4821 56.492 40.9404 54.5241 41.7982L31.4225 52.6067C29.6257 53.4645 26.4599 53.4645 24.5775 52.6067Z" fill="#FF6F3D"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.5027 39.2315L1.47144 28.4105C-0.49048 27.4658 -0.49048 26.0058 1.47144 25.147L9.31912 21.4541L24.5027 28.5822C26.4646 29.5269 29.6207 29.5269 31.4973 28.5822L46.6809 21.4541L54.5286 25.147C56.4905 26.0917 56.4905 27.5517 54.5286 28.4105L31.4973 39.2315C29.5354 40.1762 26.3793 40.1762 24.5027 39.2315Z" fill="#95C038"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.5027 25.9954L1.47144 15.3301C-0.49048 14.399 -0.49048 12.9601 1.47144 12.1136L24.5027 1.44832C26.4646 0.517226 29.6207 0.517226 31.4973 1.44832L54.5286 12.1136C56.4905 13.0447 56.4905 14.4837 54.5286 15.3301L31.4973 25.9954C29.5354 26.8419 26.3793 26.8419 24.5027 25.9954Z" fill="#5DC0E8"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -1,34 +0,0 @@
<svg width="142" height="23" viewBox="0 0 142 23" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M31 12.0026C31 9.62504 31.6829 7.83068 33.0943 6.66435C34.4602 5.45316 36.0993 4.87 37.966 4.87C39.8326 4.87 41.4262 5.45316 42.792 6.66435C44.1579 7.87554 44.8409 9.62504 44.8409 12.0474C44.8409 14.4249 44.1579 16.2193 42.792 17.3856C41.4262 18.5968 39.7871 19.18 37.966 19.18C36.0993 19.18 34.5057 18.5968 33.0943 17.3856C31.6829 16.1744 31 14.3801 31 12.0026ZM34.0049 12.0026C34.0049 13.6623 34.3236 14.8287 34.9155 15.5913C35.5529 16.3539 36.2358 16.8473 36.9643 17.0268C37.1464 17.0716 37.283 17.1165 37.4651 17.1165C37.6017 17.1165 37.7838 17.1613 37.9204 17.1613C38.1025 17.1613 38.2391 17.1613 38.4212 17.1165C38.6034 17.1165 38.74 17.0716 38.9221 17.0268C39.6505 16.8473 40.3335 16.3539 40.9253 15.5913C41.5172 14.8287 41.8359 13.6175 41.8359 12.0474C41.8359 10.4774 41.5172 9.26617 40.9253 8.50357C40.3335 7.74097 39.6505 7.24752 38.9221 7.06808C38.74 7.02322 38.5578 6.97836 38.4212 6.97836C38.2391 6.97836 38.1025 6.93351 37.9204 6.93351C37.7383 6.93351 37.6017 6.9335 37.4651 6.97836C37.3285 6.97836 37.1464 7.02322 36.9643 7.06808C36.2358 7.24752 35.5529 7.74097 34.9155 8.50357C34.3236 9.22131 34.0049 10.3876 34.0049 12.0026Z" fill="white"/>
<path d="M46.3433 5.00449H50.0767L54.9938 13.8417L55.7223 15.7258H55.7678L55.7223 13.2585V5.00449H58.5906V19.0005H54.8573L49.9401 9.84925L49.2116 8.27919H49.1661L49.2116 10.7464V19.0005H46.3433V5.00449Z" fill="white"/>
<path d="M61.0948 5.00449H63.9631V16.6229H69.6087V19.0005H61.0948V5.00449Z" fill="white"/>
<path d="M67.8331 5.00449H71.1567L74.0705 9.93897L74.5258 10.881H74.6169L75.0722 9.93897L78.0316 5.00449H81.082L75.9372 13.3034V19.0005H73.0689V13.3034L67.8331 5.00449Z" fill="white"/>
<path d="M81.1731 12.0026C81.1731 9.62504 81.856 7.83068 83.2674 6.66435C84.6333 5.45316 86.2723 4.87 88.139 4.87C90.0057 4.87 91.5993 5.45316 92.9651 6.66435C94.331 7.87554 95.0139 9.62504 95.0139 12.0474C95.0139 14.4249 94.331 16.2193 92.9651 17.3856C91.5993 18.5968 89.9602 19.18 88.139 19.18C86.2723 19.18 84.6788 18.5968 83.2674 17.3856C81.9016 16.1744 81.1731 14.3801 81.1731 12.0026ZM84.178 12.0026C84.178 13.6623 84.4967 14.8287 85.0886 15.5913C85.726 16.3539 86.3634 16.8473 87.1374 17.0268C87.3195 17.0716 87.5016 17.1165 87.6382 17.1165C87.7748 17.1165 87.9569 17.1613 88.0935 17.1613C88.2756 17.1613 88.4122 17.1613 88.5943 17.1165C88.7764 17.1165 88.913 17.0716 89.0952 17.0268C89.8236 16.8473 90.5066 16.3539 91.0984 15.5913C91.6903 14.8287 92.009 13.6175 92.009 12.0474C92.009 10.4774 91.6903 9.26617 91.0984 8.50357C90.5066 7.74097 89.8236 7.24752 89.0952 7.06808C88.913 7.02322 88.7309 6.97836 88.5943 6.97836C88.4122 6.97836 88.2756 6.93351 88.0935 6.93351C87.9114 6.93351 87.7748 6.9335 87.6382 6.97836C87.5016 6.97836 87.3195 7.02322 87.1374 7.06808C86.4089 7.24752 85.726 7.74097 85.0886 8.50357C84.4967 9.22131 84.178 10.3876 84.178 12.0026Z" fill="#D7E4EA"/>
<path d="M96.5619 5.00449H104.484V7.38201H99.4303V10.7464H104.256V13.1239H99.4303V19.0005H96.5619V5.00449Z" fill="#D7E4EA"/>
<path d="M106.169 5.00449H114.091V7.38201H109.037V10.7464H113.863V13.1239H109.037V19.0005H106.169V5.00449Z" fill="#D7E4EA"/>
<path d="M115.775 19.0005V5.00449H118.644V19.0005H115.775Z" fill="#D7E4EA"/>
<path d="M131.665 5.3185V7.74088C131.164 7.56144 130.663 7.42687 130.117 7.33715C129.571 7.24743 128.979 7.20257 128.341 7.20257C126.839 7.20257 125.701 7.65116 124.881 8.5932C124.062 9.49038 123.652 10.6567 123.652 12.0473C123.652 13.3931 124.016 14.5146 124.79 15.4118C125.564 16.3089 126.657 16.8024 128.068 16.8024C128.569 16.8024 129.07 16.7575 129.662 16.7127C130.253 16.6229 130.845 16.4884 131.483 16.2192L131.665 18.5967C131.574 18.6416 131.437 18.6865 131.301 18.7313C131.119 18.7762 130.936 18.821 130.709 18.8659C130.345 18.9556 129.889 19.0005 129.343 19.0902C128.797 19.135 128.25 19.1799 127.658 19.1799C127.567 19.1799 127.476 19.1799 127.431 19.1799C127.34 19.1799 127.249 19.1799 127.203 19.1799C125.564 19.0902 124.062 18.4622 122.696 17.3855C121.33 16.2641 120.647 14.5146 120.647 12.1819C120.647 9.89411 121.33 8.09975 122.65 6.8437C123.97 5.58765 125.792 4.95963 128.023 4.95963C128.614 4.95963 129.161 4.95963 129.616 5.00448C130.117 5.04934 130.572 5.13906 131.073 5.22878C131.164 5.27364 131.301 5.27364 131.392 5.3185C131.437 5.27364 131.528 5.3185 131.665 5.3185Z" fill="#D7E4EA"/>
<path d="M133.486 5.00449H142V7.20257H136.4V10.7016H141.454V12.8997H136.4V16.8024H142V19.0005H133.486V5.00449Z" fill="#D7E4EA"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.9389 22.718L0.657327 17.9809C-0.218514 17.5673 -0.218514 16.9282 0.657327 16.5522L4.23685 14.898L10.9009 17.9809C11.7767 18.3944 13.1857 18.3944 14.0234 17.9809L20.6874 14.898L24.267 16.5522C25.1428 16.9658 25.1428 17.6049 24.267 17.9809L13.9853 22.718C13.1857 23.094 11.7767 23.094 10.9389 22.718Z" fill="url(#paint0_linear)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.9389 16.8906L0.657327 12.1535C-0.218514 11.7399 -0.218514 11.1008 0.657327 10.7248L4.16069 9.10815L10.9389 12.2287C11.8148 12.6422 13.2237 12.6422 14.0615 12.2287L20.8398 9.10815L24.3431 10.7248C25.219 11.1384 25.219 11.7775 24.3431 12.1535L14.0615 16.8906C13.1857 17.3042 11.7767 17.3042 10.9389 16.8906Z" fill="url(#paint1_linear)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.9385 11.2131L0.656881 6.47597C-0.21896 6.06241 -0.21896 5.42327 0.656881 5.04731L10.9385 0.31017C11.8143 -0.10339 13.2233 -0.10339 14.0611 0.31017L24.3427 5.04731C25.2185 5.46087 25.2185 6.10001 24.3427 6.47597L14.0611 11.2131C13.1852 11.5891 11.7763 11.5891 10.9385 11.2131Z" fill="url(#paint2_linear)"/>
</g>
<defs>
<linearGradient id="paint0_linear" x1="12.4914" y1="27.2083" x2="12.4914" y2="9.91349" gradientUnits="userSpaceOnUse">
<stop stop-color="#FCC2B1"/>
<stop offset="0.8848" stop-color="#D9420B"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="12.4914" y1="19.7202" x2="12.4914" y2="8.34589" gradientUnits="userSpaceOnUse">
<stop stop-color="#DEEDC9"/>
<stop offset="0.6606" stop-color="#8BBA25"/>
</linearGradient>
<linearGradient id="paint2_linear" x1="12.4909" y1="15.114" x2="12.4909" y2="-0.363895" gradientUnits="userSpaceOnUse">
<stop stop-color="#C2EBFA"/>
<stop offset="1" stop-color="#26A8DE"/>
</linearGradient>
<clipPath id="clip0">
<rect width="142" height="23" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 411 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 9.5 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 9.4 KiB

View File

@ -1,5 +0,0 @@
<svg width="26" height="24" viewBox="0 0 26 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.411 23.7059L0.685256 18.7649C-0.228419 18.3335 -0.228419 17.6669 0.685256 17.2748L4.4194 15.5493L11.3713 18.7649C12.285 19.1963 13.7548 19.1963 14.6287 18.7649L21.5806 15.5493L25.3147 17.2748C26.2284 17.7061 26.2284 18.3728 25.3147 18.7649L14.589 23.7059C13.7548 24.0981 12.285 24.0981 11.411 23.7059Z" fill="#FF6F3D"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.3762 17.5917L0.683168 12.6449C-0.227723 12.213 -0.227723 11.5456 0.683168 11.153L4.32673 9.46484L11.3762 12.7234C12.2871 13.1553 13.7525 13.1553 14.6238 12.7234L21.6733 9.46484L25.3168 11.153C26.2277 11.5849 26.2277 12.2523 25.3168 12.6449L14.6238 17.5917C13.7129 18.0235 12.2475 18.0235 11.3762 17.5917Z" fill="#95C038"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.3762 11.5408L0.683168 6.66521C-0.227723 6.23956 -0.227723 5.58175 0.683168 5.1948L11.3762 0.319234C12.2871 -0.106411 13.7525 -0.106411 14.6238 0.319234L25.3168 5.1948C26.2277 5.62044 26.2277 6.27826 25.3168 6.66521L14.6238 11.5408C13.7129 11.9277 12.2475 11.9277 11.3762 11.5408Z" fill="#5DC0E8"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

Some files were not shown because too many files have changed in this diff Show More