diff --git a/Common.WebApi/Common.WebApi.csproj b/Common.WebApi/Common.WebApi.csproj new file mode 100644 index 0000000..9ceb292 --- /dev/null +++ b/Common.WebApi/Common.WebApi.csproj @@ -0,0 +1,13 @@ + + + net8.0 + enable + enable + + + + + + + + diff --git a/Common.WebApi/Middlewares/ExceptionMiddleware.cs b/Common.WebApi/Middlewares/ExceptionMiddleware.cs new file mode 100644 index 0000000..747d49f --- /dev/null +++ b/Common.WebApi/Middlewares/ExceptionMiddleware.cs @@ -0,0 +1,89 @@ +using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using MongoDB.Driver; +using Microsoft.AspNetCore.Mvc; + +namespace Common.WebApi.Middlewares; + +public class ExceptionMiddleware +{ + private readonly RequestDelegate _next; + private readonly IHostEnvironment _host; + private readonly ILogger _logger; + private readonly JsonSerializerOptions _serializerOptions; + + public ExceptionMiddleware(RequestDelegate next, IHostEnvironment host, ILogger logger) + { + _logger = logger; + _next = next; + _host = host; + _serializerOptions = new JsonSerializerOptions + { + Converters = { + new JsonStringEnumConverter() + }, + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull + }; + } + + public async Task InvokeAsync(HttpContext httpContext) + { + try + { + //if (httpContext.Request.Method == "POST") + //{ + // using var streamreader = new System.IO.StreamReader(httpContext.Request.Body); + // var body = await streamreader.ReadToEndAsync(); + //} + await _next(httpContext); + } + catch (Exception exc) + { + var title = exc.Message; + var detail = "Unexpected error occured"; + if (!_host.IsProduction()) detail = GetExceptionDetail(exc, false, true); + if (exc is MongoException dbUpdateException) + { + title = "Database error"; + if (!_host.IsProduction()) detail = GetExceptionDetail(dbUpdateException, true, true); + } + else if (exc.Source?.Contains("Mongo") == true) + { + title = "Database error"; + if (!_host.IsProduction()) detail = GetExceptionDetail(exc, true, true); + } + + var problemDetail = new ProblemDetails + { + Title = title, + Detail = detail, + Instance = httpContext.Request.Path, + Status = StatusCodes.Status400BadRequest + }; + + _logger.LogError("Необработанная ошибка: {Message}", exc.Message); + httpContext.Response.StatusCode = StatusCodes.Status400BadRequest; + httpContext.Response.ContentType = "application/problem+json"; + await httpContext.Response.WriteAsync(JsonSerializer.Serialize(problemDetail, _serializerOptions)); + } + } + + private string GetExceptionDetail(Exception exc, bool includeMessage, bool includeInner) + { + var sb = new StringBuilder(); + if (!string.IsNullOrWhiteSpace(exc.Message) && includeMessage) sb.Append(exc.Message); + if (!string.IsNullOrWhiteSpace(exc.InnerException?.Message) && includeInner) + { + if (sb.Length > 0) sb.AppendLine(); + sb.AppendLine("Inner:"); + sb.Append(exc.InnerException.Message); + } + if (sb.Length > 0) sb.AppendLine(); + sb.Append(exc.StackTrace); + return sb.ToString(); + } +} \ No newline at end of file diff --git a/Modules.Account.Api/Class1.cs b/Modules.Account.Api/Class1.cs new file mode 100644 index 0000000..f48a19e --- /dev/null +++ b/Modules.Account.Api/Class1.cs @@ -0,0 +1,7 @@ +namespace Modules.Account.Api +{ + public class Class1 + { + + } +} diff --git a/Modules.Account.Api/Modules.Account.Api.csproj b/Modules.Account.Api/Modules.Account.Api.csproj new file mode 100644 index 0000000..fa71b7a --- /dev/null +++ b/Modules.Account.Api/Modules.Account.Api.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/Modules.Account.Application/Commands/CreateAccountCommand.cs b/Modules.Account.Application/Commands/CreateAccountCommand.cs new file mode 100644 index 0000000..59e0988 --- /dev/null +++ b/Modules.Account.Application/Commands/CreateAccountCommand.cs @@ -0,0 +1,25 @@ +using MediatR; +using Modules.Account.Application.Gateways; +using Modules.Account.Domain.Gateways; + +namespace Modules.Account.Application.Commands; + +public class CreateAccountCommand : IRequest +{ + public string Email { get; set; } = default!; + public string Password { get; set; } = default!; +} + +public class CreateAccountCommandHandler(IAccountGateway gateway, IPasswordHasher passwordHasher) : IRequestHandler +{ + public async Task Handle(CreateAccountCommand request, CancellationToken cancellationToken) + { + if (await gateway.IsExists(request.Email)) throw new Exception("Account with the same eamil already exists"); + var newAccount = Domain.Entities.Account.Create(request.Email, request.Password, passwordHasher); + return await gateway.Create(new Models.Account + { + Email = newAccount.Email.Value, + HashedPassword = newAccount.HashedPassword, + }); + } +} \ No newline at end of file diff --git a/Modules.Account.Application/Gateways/IAccountGateway.cs b/Modules.Account.Application/Gateways/IAccountGateway.cs new file mode 100644 index 0000000..37aeed9 --- /dev/null +++ b/Modules.Account.Application/Gateways/IAccountGateway.cs @@ -0,0 +1,13 @@ +using MediatR; + +namespace Modules.Account.Application.Gateways; + +public interface IAccountGateway +{ + public Task TryGetByEmail(string email); + public Task GetByEmail(string email); + public Task Create(Models.Account account); + public Task Update(Guid id, Models.Account account); + public Task IsExists(string email); + public Task Delete(Guid id); +} \ No newline at end of file diff --git a/Modules.Account.Application/Models/Account.cs b/Modules.Account.Application/Models/Account.cs new file mode 100644 index 0000000..a363f32 --- /dev/null +++ b/Modules.Account.Application/Models/Account.cs @@ -0,0 +1,8 @@ +namespace Modules.Account.Application.Models; + +public class Account +{ + public Guid Id { get; set; } + public string Email { get; set; } = default!; + public string HashedPassword { get; set; } = default!; +} \ No newline at end of file diff --git a/Modules.Account.Application/Modules.Account.Application.csproj b/Modules.Account.Application/Modules.Account.Application.csproj new file mode 100644 index 0000000..97368f3 --- /dev/null +++ b/Modules.Account.Application/Modules.Account.Application.csproj @@ -0,0 +1,19 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + diff --git a/Modules.Account.Application/PasswordHasher.cs b/Modules.Account.Application/PasswordHasher.cs new file mode 100644 index 0000000..bbb6cec --- /dev/null +++ b/Modules.Account.Application/PasswordHasher.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNetCore.Identity; +using Modules.Account.Domain.Gateways; + +namespace Modules.Account.Application; + +public class PasswordHasher : IPasswordHasher +{ + private readonly PasswordHasher _hasher; + + public PasswordHasher() + { + _hasher = new(); + } + + public string HashPassword(Domain.Entities.Account account, string password) => + _hasher.HashPassword(account, password); + + public bool VerifyPassword(Domain.Entities.Account account, string password) => + _hasher.VerifyHashedPassword(account, password, account.HashedPassword) != PasswordVerificationResult.Failed; +} diff --git a/Modules.Account.Application/Queries/GetAccountQuery.cs b/Modules.Account.Application/Queries/GetAccountQuery.cs new file mode 100644 index 0000000..b7e0a30 --- /dev/null +++ b/Modules.Account.Application/Queries/GetAccountQuery.cs @@ -0,0 +1,24 @@ +using MediatR; +using Modules.Account.Application.Gateways; +using Modules.Account.Domain.Gateways; + +namespace Modules.Account.Application.Queries; + +public class GetAccountQuery : IRequest +{ + public string Email { get; set; } = default!; + public string Password { get; set; } = default!; +} + +public class GetAccountQueryHandler(IAccountGateway accountGateway, IPasswordHasher passwordHasher) : IRequestHandler +{ + const string error = "Invalid email or password"; + public async Task Handle(GetAccountQuery request, CancellationToken cancellationToken) + { + var account = await accountGateway.TryGetByEmail(request.Email); + if (account == null) throw new Exception(error); + if (passwordHasher.VerifyPassword(new Domain.Entities.Account(account.Id, account.Email, account.HashedPassword), request.Password)) + throw new Exception(error); + return account; + } +} \ No newline at end of file diff --git a/Modules.Account.Database/Class1.cs b/Modules.Account.Database/Class1.cs new file mode 100644 index 0000000..d10e24e --- /dev/null +++ b/Modules.Account.Database/Class1.cs @@ -0,0 +1,7 @@ +namespace Modules.Account.Database +{ + public class Class1 + { + + } +} diff --git a/Modules.Account.Database/Modules.Account.Database.csproj b/Modules.Account.Database/Modules.Account.Database.csproj new file mode 100644 index 0000000..fa71b7a --- /dev/null +++ b/Modules.Account.Database/Modules.Account.Database.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/Modules.Account.Domain/Entities/Account.cs b/Modules.Account.Domain/Entities/Account.cs new file mode 100644 index 0000000..79cc62a --- /dev/null +++ b/Modules.Account.Domain/Entities/Account.cs @@ -0,0 +1,45 @@ +using Modules.Account.Domain.Gateways; + +namespace Modules.Account.Domain.Entities; + +public class Account +{ + public Guid Id { get; set; } + public Email Email { get; private set; } + public string HashedPassword { get; private set; } + + public Account(Guid id, string email, string hashedPassword) + { + Id = id; + Email = new Email(email); + HashedPassword = hashedPassword; + } + + private Account(Email email) + { + Email = email; + HashedPassword = ""; + } + + public static Account Create(string email, string password, IPasswordHasher passwordHasher) + { + var account = new Account(new Email(email)); + var a = passwordHasher.HashPassword(account, password); + return account; + } + + public void SetPassword(string email) + { + //var newPasswordHash = passwordHasher.HashPassword(password); + //if (newPasswordHash != HashedPassword) throw new Exception("Password must not be aqual to previous"); + if (string.IsNullOrWhiteSpace(email)) throw new Exception("Email is empty"); + Email = new Email(email); + } + + public void SetPassword(string password, IPasswordHasher passwordHasher) + { + var newPasswordHash = passwordHasher.HashPassword(this, password); + if (newPasswordHash != HashedPassword) throw new Exception("Password must not be aqual to previous"); + HashedPassword = newPasswordHash; + } +} \ No newline at end of file diff --git a/Modules.Account.Domain/Entities/Email.cs b/Modules.Account.Domain/Entities/Email.cs new file mode 100644 index 0000000..84d2cdc --- /dev/null +++ b/Modules.Account.Domain/Entities/Email.cs @@ -0,0 +1,11 @@ +namespace Modules.Account.Domain.Entities; + +public class Email +{ + public string Value { get; private set; } + + public Email(string value) + { + Value = value; + } +} \ No newline at end of file diff --git a/Modules.Account.Domain/Gateways/IPasswordHasher.cs b/Modules.Account.Domain/Gateways/IPasswordHasher.cs new file mode 100644 index 0000000..0d31b2b --- /dev/null +++ b/Modules.Account.Domain/Gateways/IPasswordHasher.cs @@ -0,0 +1,7 @@ +namespace Modules.Account.Domain.Gateways; + +public interface IPasswordHasher +{ + public string HashPassword(Entities.Account account, string password); + public bool VerifyPassword(Entities.Account account, string password); +} diff --git a/Modules.Account.Domain/Modules.Account.Domain.csproj b/Modules.Account.Domain/Modules.Account.Domain.csproj new file mode 100644 index 0000000..fa71b7a --- /dev/null +++ b/Modules.Account.Domain/Modules.Account.Domain.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/Modules.Library.Application/Commands/Anime/Episode/Properties/Description/EditDescriptionCommand.cs b/Modules.Library.Application/Commands/Anime/Episode/Properties/Description/EditDescriptionCommand.cs index 19fd2de..01fd00e 100644 --- a/Modules.Library.Application/Commands/Anime/Episode/Properties/Description/EditDescriptionCommand.cs +++ b/Modules.Library.Application/Commands/Anime/Episode/Properties/Description/EditDescriptionCommand.cs @@ -12,8 +12,8 @@ public class EditDescriptionCommand : IRequest public Guid LanguageId { get; set; } public string Value { get; set; } = default!; public bool IsOriginal { get; set; } - public string NewValue { get; set; } = default!; - + public Guid? NewLanguageId { get; set; } + public string? NewValue { get; set; } } public class EditDescriptionCommandHandler(IAnimeTitleGateway titleGateway, ILanguageGateway languageGateway) : IRequestHandler @@ -27,7 +27,7 @@ public class EditDescriptionCommandHandler(IAnimeTitleGateway titleGateway, ILan var episode = season.Episodes.FirstOrDefault(q => q.Id == request.EpisodeId) ?? throw new Exception("Episode not found"); var description = new Domain.Entities.MediaContent.CommonProperties.Description(request.LanguageId, request.IsOriginal, request.Value); - episode.CommonProperties.SetDescriptionValue(description, request.NewValue); + episode.CommonProperties.SetDescriptionValue(description, request.NewLanguageId, request.NewValue); await titleGateway.Update(title); return Unit.Value; } diff --git a/Modules.Library.Application/Commands/Anime/Episode/Properties/Name/EditNameCommand.cs b/Modules.Library.Application/Commands/Anime/Episode/Properties/Name/EditNameCommand.cs index be036e5..60f92ca 100644 --- a/Modules.Library.Application/Commands/Anime/Episode/Properties/Name/EditNameCommand.cs +++ b/Modules.Library.Application/Commands/Anime/Episode/Properties/Name/EditNameCommand.cs @@ -13,20 +13,24 @@ public class EditNameCommand : IRequest public CommonModels.NameType NameType { get; set; } public Guid LanguageId { get; set; } public string Value { get; set; } = default!; - public string NewValue { get; set; } = default!; - + public string? NewValue { get; set; } + public Guid? NewLanguageId { get; set; } } public class EditNameCommandHandler(IAnimeTitleGateway titleGateway) : IRequestHandler { public async Task Handle(EditNameCommand request, CancellationToken cancellationToken) { + if (!request.NewLanguageId.HasValue && string.IsNullOrWhiteSpace(request.NewValue)) + { + throw new ArgumentNullException($"{nameof(EditNameCommand.NewLanguageId)}, {nameof(EditNameCommand.NewValue)}"); + } var title = await titleGateway.GetById(request.TitleId); var season = title.Items.OfType().FirstOrDefault(q => q.Id == request.SeasonId) ?? throw new Exception("Season not found"); var episode = season.Episodes.FirstOrDefault(q => q.Id == request.EpisodeId) ?? throw new Exception("Episode not found"); - episode.CommonProperties.SetNameValue(new NameItem((NameType)request.NameType, request.LanguageId, request.Value), request.NewValue); + episode.CommonProperties.SetNameValue(new NameItem((NameType)request.NameType, request.LanguageId, request.Value), request.NewLanguageId, request.NewValue); await titleGateway.Update(title); return Unit.Value; } diff --git a/Modules.Library.Application/Commands/Anime/Season/Properties/Description/EditDescriptionCommand.cs b/Modules.Library.Application/Commands/Anime/Season/Properties/Description/EditDescriptionCommand.cs index 12cd433..430d6aa 100644 --- a/Modules.Library.Application/Commands/Anime/Season/Properties/Description/EditDescriptionCommand.cs +++ b/Modules.Library.Application/Commands/Anime/Season/Properties/Description/EditDescriptionCommand.cs @@ -11,8 +11,8 @@ public class EditDescriptionCommand : IRequest public Guid LanguageId { get; set; } public string Value { get; set; } = default!; public bool IsOriginal { get; set; } - public string NewValue { get; set; } = default!; - + public string? NewValue { get; set; } + public Guid? NewLanguageId { get; set; } } public class EditDescriptionCommandHandler(IAnimeTitleGateway titleGateway, ILanguageGateway languageGateway) : IRequestHandler @@ -24,7 +24,7 @@ public class EditDescriptionCommandHandler(IAnimeTitleGateway titleGateway, ILan var description = new Domain.Entities.MediaContent.CommonProperties.Description(request.LanguageId, request.IsOriginal, request.Value); var season = title.Items.OfType().FirstOrDefault(q => q.Id == request.SeasonId) ?? throw new Exception("Season not found"); - season.CommonProperties.SetDescriptionValue(description, request.NewValue); + season.CommonProperties.SetDescriptionValue(description, request.NewLanguageId, request.NewValue); await titleGateway.Update(title); return Unit.Value; } diff --git a/Modules.Library.Application/Commands/Anime/Season/Properties/Name/EditNameCommand.cs b/Modules.Library.Application/Commands/Anime/Season/Properties/Name/EditNameCommand.cs index 0483692..85cb3b8 100644 --- a/Modules.Library.Application/Commands/Anime/Season/Properties/Name/EditNameCommand.cs +++ b/Modules.Library.Application/Commands/Anime/Season/Properties/Name/EditNameCommand.cs @@ -12,18 +12,22 @@ public class EditNameCommand : IRequest public CommonModels.NameType NameType { get; set; } public Guid LanguageId { get; set; } public string Value { get; set; } = default!; - public string NewValue { get; set; } = default!; - + public string? NewValue { get; set; } + public Guid? NewLanguageId { get; set; } } public class EditNameCommandHandler(IAnimeTitleGateway titleGateway) : IRequestHandler { public async Task Handle(EditNameCommand request, CancellationToken cancellationToken) { + if (!request.NewLanguageId.HasValue && string.IsNullOrWhiteSpace(request.NewValue)) + { + throw new ArgumentNullException($"{nameof(EditNameCommand.NewLanguageId)}, {nameof(EditNameCommand.NewValue)}"); + } var title = await titleGateway.GetById(request.TitleId); var season = title.Items.OfType().FirstOrDefault(q => q.Id == request.SeasonId) ?? throw new Exception("Season not found"); - season.CommonProperties.SetNameValue(new NameItem((NameType)request.NameType, request.LanguageId, request.Value), request.NewValue); + season.CommonProperties.SetNameValue(new NameItem((NameType)request.NameType, request.LanguageId, request.Value), request.NewLanguageId, request.NewValue); await titleGateway.Update(title); return Unit.Value; } diff --git a/Modules.Library.Application/Commands/Anime/Title/CreateAnimeTitleCommand.cs b/Modules.Library.Application/Commands/Anime/Title/CreateAnimeTitleCommand.cs index f53d7cf..96509de 100644 --- a/Modules.Library.Application/Commands/Anime/Title/CreateAnimeTitleCommand.cs +++ b/Modules.Library.Application/Commands/Anime/Title/CreateAnimeTitleCommand.cs @@ -1,5 +1,6 @@ using MediatR; using Modules.Library.Application.Gateways; +using Modules.Library.Application.Models; namespace Modules.Library.Application.Commands.Anime.Title; @@ -7,6 +8,7 @@ public class CreateAnimeTitleCommand : IRequest { public string NameOriginal { get; set; } = default!; public Guid NameOriginalLanguageId { get; set; } + public MediaInfo? Preview { get; set; } } public class CreateAnimtTitleCommandHandler(IAnimeTitleGateway titleGateway, ILanguageGateway languageGateway) : IRequestHandler @@ -15,6 +17,7 @@ public class CreateAnimtTitleCommandHandler(IAnimeTitleGateway titleGateway, ILa { var language = await languageGateway.GetLanguageById(request.NameOriginalLanguageId); var animeTitle = new Domain.Entities.MediaContent.Items.Anime.AnimeTitle(language.Id, request.NameOriginal); + if (request.Preview != null) animeTitle.CommonProperties.SetPreview(request.Preview.Url, (Domain.Entities.MediaInfoType)request.Preview.Type); return await titleGateway.Create(animeTitle); } } \ No newline at end of file diff --git a/Modules.Library.Application/Commands/Anime/Title/Properties/Description/EditDescriptionCommand.cs b/Modules.Library.Application/Commands/Anime/Title/Properties/Description/EditDescriptionCommand.cs index c583c38..365f36a 100644 --- a/Modules.Library.Application/Commands/Anime/Title/Properties/Description/EditDescriptionCommand.cs +++ b/Modules.Library.Application/Commands/Anime/Title/Properties/Description/EditDescriptionCommand.cs @@ -9,7 +9,8 @@ public class EditDescriptionCommand : IRequest public Guid LanguageId { get; set; } public string Value { get; set; } = default!; public bool IsOriginal { get; set; } - public string NewValue { get; set; } = default!; + public Guid? NewLanguageId { get; set; } + public string? NewValue { get; set; } } @@ -20,7 +21,7 @@ public class EditDescriptionCommandHandler(IAnimeTitleGateway titleGateway, ILan var title = await titleGateway.GetById(request.TitleId); if (!await languageGateway.IsLanguageExists(request.LanguageId)) throw new Exception(); var description = new Domain.Entities.MediaContent.CommonProperties.Description(request.LanguageId, request.IsOriginal, request.Value); - title.CommonProperties.SetDescriptionValue(description, request.NewValue); + title.CommonProperties.SetDescriptionValue(description, request.NewLanguageId, request.NewValue); await titleGateway.Update(title); return Unit.Value; } diff --git a/Modules.Library.Application/Commands/Anime/Title/Properties/Name/EditNameCommand.cs b/Modules.Library.Application/Commands/Anime/Title/Properties/Name/EditNameCommand.cs index 4dcecdc..5ec28a0 100644 --- a/Modules.Library.Application/Commands/Anime/Title/Properties/Name/EditNameCommand.cs +++ b/Modules.Library.Application/Commands/Anime/Title/Properties/Name/EditNameCommand.cs @@ -10,16 +10,20 @@ public class EditNameCommand : IRequest public CommonModels.NameType NameType { get; set; } public Guid LanguageId { get; set; } public string Value { get; set; } = default!; - public string NewValue { get; set; } = default!; - + public Guid? NewLanguageId { get; set; } + public string? NewValue { get; set; } = default!; } public class EditNameCommandHandler(IAnimeTitleGateway titleGateway) : IRequestHandler { public async Task Handle(EditNameCommand request, CancellationToken cancellationToken) { + if (!request.NewLanguageId.HasValue && string.IsNullOrWhiteSpace(request.NewValue)) + { + throw new ArgumentNullException($"{nameof(EditNameCommand.NewLanguageId)}, {nameof(EditNameCommand.NewValue)}"); + } var title = await titleGateway.GetById(request.TitleId); - title.CommonProperties.SetNameValue(new NameItem((NameType)request.NameType, request.LanguageId, request.Value), request.NewValue); + title.CommonProperties.SetNameValue(new NameItem((NameType)request.NameType, request.LanguageId, request.Value), request.NewLanguageId, request.NewValue); await titleGateway.Update(title); return Unit.Value; } diff --git a/Modules.Library.Application/Commands/Anime/Title/RateTitleCommand.cs b/Modules.Library.Application/Commands/Anime/Title/RateTitleCommand.cs new file mode 100644 index 0000000..907e459 --- /dev/null +++ b/Modules.Library.Application/Commands/Anime/Title/RateTitleCommand.cs @@ -0,0 +1,25 @@ +using MediatR; +using Modules.Library.Application.Gateways; +using Modules.Rating.Api.Commands; + +namespace Modules.Library.Application.Commands.Anime.Title; + +public class RateTitleCommand : IRequest +{ + public Guid TitleId { get; set; } + public ushort RatePercentage { get; set; } +} + +public class RateTitleCommandHandler(IAnimeTitleGateway titleGateway, IMediator mediator) : IRequestHandler +{ + public async Task Handle(RateTitleCommand request, CancellationToken cancellationToken) + { + var subjectId = new Guid("8393230f-78e3-473b-a5dc-3221917e0aeb"); //user + var title = await titleGateway.GetById(request.TitleId); + if (title != null && !title.Deleted) + { + await mediator.Send(new RateObjectCommand { ObjectId = title.Id, SubjectId = subjectId, RatePercentage = request.RatePercentage }); + } + return Unit.Value; + } +} \ No newline at end of file diff --git a/Modules.Library.Application/Commands/Anime/Title/UnrateTitleCommand.cs b/Modules.Library.Application/Commands/Anime/Title/UnrateTitleCommand.cs new file mode 100644 index 0000000..d377809 --- /dev/null +++ b/Modules.Library.Application/Commands/Anime/Title/UnrateTitleCommand.cs @@ -0,0 +1,24 @@ +using MediatR; +using Modules.Library.Application.Gateways; +using Modules.Rating.Api.Commands; + +namespace Modules.Library.Application.Commands.Anime.Title; + +public class UnrateTitleCommand : IRequest +{ + public Guid TitleId { get; set; } +} + +public class UnrateTitleCommandHandler(IAnimeTitleGateway titleGateway, IMediator mediator) : IRequestHandler +{ + public async Task Handle(UnrateTitleCommand request, CancellationToken cancellationToken) + { + var subjectId = new Guid("8393230f-78e3-473b-a5dc-3221917e0aeb"); //user + var title = await titleGateway.GetById(request.TitleId); + if (title != null && !title.Deleted) + { + await mediator.Send(new UnrateObjectCommand { ObjectId = title.Id, SubjectId = subjectId }); + } + return Unit.Value; + } +} \ No newline at end of file diff --git a/Modules.Library.Application/Models/MediaInfo.cs b/Modules.Library.Application/Models/MediaInfo.cs index ee7e8dc..193791b 100644 --- a/Modules.Library.Application/Models/MediaInfo.cs +++ b/Modules.Library.Application/Models/MediaInfo.cs @@ -3,4 +3,5 @@ public class MediaInfo { public MediaInfoType Type { get; set; } public string Url { get; set; } = default!; + public string ContentType { get; set; } = default!; } \ No newline at end of file diff --git a/Modules.Library.Application/Modules.Library.Application.csproj b/Modules.Library.Application/Modules.Library.Application.csproj index ee24d01..5270269 100644 --- a/Modules.Library.Application/Modules.Library.Application.csproj +++ b/Modules.Library.Application/Modules.Library.Application.csproj @@ -8,11 +8,12 @@ - + + diff --git a/Modules.Library.Application/Queries/Anime/AnimeTitle/AnimeTitleListQuery.cs b/Modules.Library.Application/Queries/Anime/AnimeTitle/AnimeTitleListQuery.cs index 7857e01..92124a7 100644 --- a/Modules.Library.Application/Queries/Anime/AnimeTitle/AnimeTitleListQuery.cs +++ b/Modules.Library.Application/Queries/Anime/AnimeTitle/AnimeTitleListQuery.cs @@ -1,17 +1,26 @@ using MediatR; using Modules.Library.Application.Gateways; +using Modules.Rating.Api.Querirs; namespace Modules.Library.Application.Queries.Anime.AnimeTitle; public class AnimeTitleListQuery : IRequest> { - + public Guid? UserId { get; set; } } -public class AnimeTitleListQueryHandler(IAnimeTitleGateway titleGateway) : IRequestHandler> +public class AnimeTitleListQueryHandler(IAnimeTitleGateway titleGateway, IMediator mediator) : IRequestHandler> { public async Task> Handle(AnimeTitleListQuery request, CancellationToken cancellationToken) { - return await titleGateway.GetList(); + var titles = await titleGateway.GetList(); + var rates = await mediator.Send(new ObjectRatingListQuery { ObjectIds = titles.Select(q => q.Id), SubjectId = request.UserId, }); + rates.ForEach(q => + { + var title = titles.First(x => x.Id == q.ObjectId); + title.Rate = q.ObjectRatePercentage; + title.MyRate = q.SubjectRatePercentage; + }); + return titles; } } \ No newline at end of file diff --git a/Modules.Library.Application/Queries/Anime/AnimeTitle/AnimeTitleQuery.cs b/Modules.Library.Application/Queries/Anime/AnimeTitle/AnimeTitleQuery.cs index 5a515ea..7eae125 100644 --- a/Modules.Library.Application/Queries/Anime/AnimeTitle/AnimeTitleQuery.cs +++ b/Modules.Library.Application/Queries/Anime/AnimeTitle/AnimeTitleQuery.cs @@ -1,5 +1,6 @@ using MediatR; using Modules.Library.Application.Gateways; +using Modules.Rating.Api.Querirs; namespace Modules.Library.Application.Queries.Anime.AnimeTitle; @@ -8,10 +9,15 @@ public class AnimeTitleQuery : IRequest public Guid Id { get; set; } } -public class AnimeTitleQueryHandler(IAnimeTitleGateway titleGateway) : IRequestHandler +public class AnimeTitleQueryHandler(IAnimeTitleGateway titleGateway, IMediator mediator) : IRequestHandler { public async Task Handle(AnimeTitleQuery request, CancellationToken cancellationToken) { - return await titleGateway.GetDetail(request.Id); + var title = await titleGateway.GetDetail(request.Id); + //var rate = await mediator.Send(new ObjectRatingQuery { ObjectId = request.Id, SubjectId = null, }); + var rate = await mediator.Send(new ObjectRatingQuery { ObjectId = request.Id, SubjectId = new Guid("8393230f-78e3-473b-a5dc-3221917e0aeb"), }); + title.Rate = rate?.ObjectRatePercentage; + title.MyRate = rate?.SubjectRatePercentage; + return title; } } \ No newline at end of file diff --git a/Modules.Library.Application/ServiceCollectionExtensions.cs b/Modules.Library.Application/ServiceCollectionExtensions.cs index 52a7223..1c67d46 100644 --- a/Modules.Library.Application/ServiceCollectionExtensions.cs +++ b/Modules.Library.Application/ServiceCollectionExtensions.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Modules.Rating.Api; namespace Modules.Library.Application; diff --git a/Modules.Library.Database/Database/Models/MediaInfo.cs b/Modules.Library.Database/Database/Models/MediaInfo.cs index ef7e74d..77fad0d 100644 --- a/Modules.Library.Database/Database/Models/MediaInfo.cs +++ b/Modules.Library.Database/Database/Models/MediaInfo.cs @@ -4,6 +4,7 @@ public class MediaInfo : Entity { public MediaInfoType Type { get; set; } = MediaInfoType.OtherFile; public string Url { get; set; } = default!; + //public string ContentType { get; set; } = default!; } public enum MediaInfoType diff --git a/Modules.Library.Database/GatewaysImplementations/Converters/CommonPropertiesConverter.cs b/Modules.Library.Database/GatewaysImplementations/Converters/CommonPropertiesConverter.cs index e837d90..6eea00c 100644 --- a/Modules.Library.Database/GatewaysImplementations/Converters/CommonPropertiesConverter.cs +++ b/Modules.Library.Database/GatewaysImplementations/Converters/CommonPropertiesConverter.cs @@ -14,8 +14,7 @@ internal class CommonPropertiesConverter(LanguageRepository languageRepository, commonPropertiesLanguageIds.AddRange(commonProperties.Descriptions.Select(q => q.LanguageId)); var languages = await languageRepository.GetWhere(q => commonPropertiesLanguageIds.Distinct().Contains(q.Id)); - var genres = await genreRepository.GetWhere(q => commonProperties.Genres.Select(q => q.Id).Distinct().Contains(q.Id)); - + var genres = await genreRepository.GetWhere(q => commonProperties.Genres.Select(x => x.GenreId).Distinct().Contains(q.Id)); return new Application.Models.CommonProperties { @@ -29,6 +28,9 @@ internal class CommonPropertiesConverter(LanguageRepository languageRepository, { Url = commonProperties.Preview.Url, Type = (Application.Models.MediaInfoType)commonProperties.Preview.Type, + //ContentType = commonProperties.Preview.ContentType, + ContentType = "image/png", + }, Descriptions = commonProperties.Descriptions.Select(q => new Application.Models.Description { @@ -90,6 +92,7 @@ internal class CommonPropertiesConverter(LanguageRepository languageRepository, Descriptions = commonProperties.Descriptions.Select(q => new DescriptionItem { IsOriginal = q.IsOriginal, + LanguageId = q.LanguageId, Value = q.Value, }).ToList(), Genres = commonProperties.Genres.Select(q => new GenreProportionItem diff --git a/Modules.Library.Database/GatewaysImplementations/GenreGateway.cs b/Modules.Library.Database/GatewaysImplementations/GenreGateway.cs index fc8307c..0412f08 100644 --- a/Modules.Library.Database/GatewaysImplementations/GenreGateway.cs +++ b/Modules.Library.Database/GatewaysImplementations/GenreGateway.cs @@ -62,5 +62,7 @@ public class GenreGateway(GenreRepository repository) : IGenreGateway public Task IsGenreExists(Guid id) => repository.AnyWhere(q => q.Id == id && !q.Deleted); public Task IsGenreExists(string name, Guid? selfId) => - repository.AnyWhere(q => q.Id != selfId && q.Name == name.Trim() && !q.Deleted); + repository.AnyWhere(q => q.Id != selfId + && q.Name.ToLower() == name.Trim().ToLower() + && !q.Deleted); } \ No newline at end of file diff --git a/Modules.Library.Database/Modules.Library.Database.csproj b/Modules.Library.Database/Modules.Library.Database.csproj index f6ad13d..98efd93 100644 --- a/Modules.Library.Database/Modules.Library.Database.csproj +++ b/Modules.Library.Database/Modules.Library.Database.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/Modules.Library.Domain/Entities/MediaContent/CommonProperties/CommonProperties.cs b/Modules.Library.Domain/Entities/MediaContent/CommonProperties/CommonProperties.cs index ea168bb..ee88bbe 100644 --- a/Modules.Library.Domain/Entities/MediaContent/CommonProperties/CommonProperties.cs +++ b/Modules.Library.Domain/Entities/MediaContent/CommonProperties/CommonProperties.cs @@ -100,13 +100,17 @@ public class CommonProperties : ValueObject _names.Remove(name); } - public void SetNameValue(NameItem nameItem, string value) + public void SetNameValue(NameItem nameItem, Guid? languageId, string? value) { var name = GetName(nameItem); - if (string.IsNullOrWhiteSpace(value)) throw new ArgumentNullException(nameof(value)); - if (nameItem.Type != NameType.Original && _names.Any(q => q.LanguageId == nameItem.LanguageId && q.Value == value)) - throw new Exception("Name item with in same language with same value is already exists"); - nameItem.SetValue(value); + var newValue = value?.Trim(); + if (string.IsNullOrWhiteSpace(newValue)) throw new ArgumentNullException(nameof(value)); + if (nameItem.Type != NameType.Original && _names.Any(q => q.LanguageId == (languageId ?? nameItem.LanguageId) && q.Value == (newValue ?? nameItem.Value))) + throw new Exception("Name item with same language and same value is already exists"); + else if (nameItem.Type == NameType.Original && languageId.HasValue && _names.Any(q => q.LanguageId == languageId && q.Type == NameType.OriginalInAnotherLanguage)) + throw new Exception("Could not change original name language to one of \"original in another language\" item's one"); + if (languageId.HasValue) name.SetLanguage(languageId.Value); + if (!string.IsNullOrWhiteSpace(newValue)) name.SetValue(newValue); } private NameItem GetName(NameItem name) => _names.FirstOrDefault(q => q == name) ?? @@ -144,13 +148,15 @@ public class CommonProperties : ValueObject //description.SetDeleted(); } - public void SetDescriptionValue(Description descriptionItem, string value) + public void SetDescriptionValue(Description descriptionItem, Guid? languageId, string? value) { var description = GetDescription(descriptionItem); - if (string.IsNullOrWhiteSpace(value)) throw new ArgumentNullException(nameof(value)); - if (!descriptionItem.IsOriginal && _descriptions.Any(q => q.LanguageId == descriptionItem.LanguageId && q.Value == value)) + var newValue = value?.Trim(); + if (string.IsNullOrWhiteSpace(newValue)) throw new ArgumentNullException(nameof(value)); + if (!descriptionItem.IsOriginal && _descriptions.Any(q => q.LanguageId == (languageId ?? descriptionItem.LanguageId) && q.Value == (newValue ?? descriptionItem.Value))) throw new Exception("Descriptoin item with with same value is already exists"); - descriptionItem.SetValue(value); + if (languageId.HasValue) descriptionItem.SetLanguage(languageId.Value); + if (!string.IsNullOrWhiteSpace(newValue)) descriptionItem.SetValue(newValue); } private Description GetDescription(Description description) @@ -240,14 +246,15 @@ public class CommonProperties : ValueObject public void SetEstimatedReleaseDate(DateTimeOffset? value) { - if (value == default) throw new ArgumentNullException(nameof(value)); + //if (value == default) throw new ArgumentNullException(nameof(value)); + if (value.HasValue && value.Value == default) throw new ArgumentOutOfRangeException(nameof(value)); if (AnnouncementDate.HasValue && value <= AnnouncementDate.Value) throw new Exception("Estimated release date can not be less or equal to announcement date"); EstimatedReleaseDate = value; } public void SetReleaseDate(DateTimeOffset? value) { - if (value == default) throw new ArgumentNullException(nameof(value)); + if (value.HasValue && value.Value == default) throw new ArgumentOutOfRangeException(nameof(value)); if (AnnouncementDate.HasValue && value <= AnnouncementDate.Value) throw new Exception("Release date can not be less or equal to announcement date"); ReleaseDate = value; diff --git a/Modules.Library.Domain/Entities/MediaContent/CommonProperties/Description.cs b/Modules.Library.Domain/Entities/MediaContent/CommonProperties/Description.cs index e8dd269..f8c814e 100644 --- a/Modules.Library.Domain/Entities/MediaContent/CommonProperties/Description.cs +++ b/Modules.Library.Domain/Entities/MediaContent/CommonProperties/Description.cs @@ -5,7 +5,7 @@ public class Description : ValueObject public string Value { get; private set; } = string.Empty; public bool IsOriginal { get; init; } [Required] - public Guid LanguageId { get; init; } = default!; + public Guid LanguageId { get; private set; } = default!; private Description() { } @@ -28,6 +28,11 @@ public class Description : ValueObject Value = value; } + public void SetLanguage(Guid languageId) + { + LanguageId = languageId; + } + protected override IEnumerable GetEqualityComponents() { yield return Value; diff --git a/Modules.Library.Domain/Entities/MediaContent/CommonProperties/NameItem.cs b/Modules.Library.Domain/Entities/MediaContent/CommonProperties/NameItem.cs index f5703c5..bf3487a 100644 --- a/Modules.Library.Domain/Entities/MediaContent/CommonProperties/NameItem.cs +++ b/Modules.Library.Domain/Entities/MediaContent/CommonProperties/NameItem.cs @@ -7,7 +7,7 @@ public class NameItem : ValueObject public string Value { get; private set; } = string.Empty; public NameType Type { get; private init; } [Required] - public Guid LanguageId { get; private init; } = default!; + public Guid LanguageId { get; private set; } = default!; private NameItem() { } @@ -37,6 +37,11 @@ public class NameItem : ValueObject Value = value; } + public void SetLanguage(Guid languageId) + { + LanguageId = languageId; + } + protected override IEnumerable GetEqualityComponents() { yield return Type; diff --git a/Modules.Library.WebApi/Automapper/AnimeTitleMapprigProfile.cs b/Modules.Library.WebApi/Automapper/AnimeTitleMapprigProfile.cs index ec7d862..d218a81 100644 --- a/Modules.Library.WebApi/Automapper/AnimeTitleMapprigProfile.cs +++ b/Modules.Library.WebApi/Automapper/AnimeTitleMapprigProfile.cs @@ -1,6 +1,8 @@ using AutoMapper; using Modules.Library.WebApi.Models; -using Modules.Library.WebApi.Models.Anime; +using Modules.Library.WebApi.Models.Views; +using Modules.Library.WebApi.Models.Views.Anime; +using System.Linq; namespace Modules.Library.WebApi.Automapper; @@ -32,6 +34,8 @@ public class AnimeTitleMapprigProfile : Profile CreateMap() .ForMember(q => q.ExpirationTimeTicks, opt => opt.MapFrom(q => q.ExpirationTime.Ticks)) - .ForMember(q => q.EpisodesInsideSeasonsCount, opt => opt.MapFrom(q => q.Seasons.SelectMany(q => q.Episodes).Count())); + .ForMember(q => q.EpisodesInsideSeasonsCount, opt => opt.MapFrom(q => q.Seasons + .SelectMany(q => q.Episodes).Count())); + //.SelectMany(q => q.Episodes.DefaultIfEmpty()).Count())); } } \ No newline at end of file diff --git a/Modules.Library.WebApi/Automapper/DictionariesMapprigProfiles.cs b/Modules.Library.WebApi/Automapper/DictionariesMapprigProfiles.cs index 92abc1d..5f788a6 100644 --- a/Modules.Library.WebApi/Automapper/DictionariesMapprigProfiles.cs +++ b/Modules.Library.WebApi/Automapper/DictionariesMapprigProfiles.cs @@ -1,6 +1,6 @@ using AutoMapper; using Modules.Library.WebApi.Models; -using Modules.Library.WebApi.Models.Dictionary; +using Modules.Library.WebApi.Models.Views.Dictionary; namespace Modules.Library.WebApi.Automapper; diff --git a/Modules.Library.WebApi/Controllers/AnimeTitleController.cs b/Modules.Library.WebApi/Controllers/AnimeTitleController.cs index cf6562c..1e7a467 100644 --- a/Modules.Library.WebApi/Controllers/AnimeTitleController.cs +++ b/Modules.Library.WebApi/Controllers/AnimeTitleController.cs @@ -1,9 +1,11 @@ -using Amazon.Runtime.Internal.Endpoints.StandardLibrary; using AutoMapper; using MediatR; +using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Mvc; using Modules.Library.WebApi.Models; using Modules.Library.WebApi.Models.Anime; +using Modules.Library.WebApi.Models.Anime.CommonProperties; +using Modules.Library.WebApi.Models.Views.Anime; namespace Modules.Library.WebApi.Controllers; @@ -23,20 +25,41 @@ public class TitleController : ControllerBase _mediator = mediator; _logger = logger; } + [HttpGet("List")] public async Task> List() => - _mapper.Map>(await _mediator.Send(new Application.Queries.Anime.AnimeTitle.AnimeTitleListQuery())); - + _mapper.Map>(await _mediator.Send(new Application.Queries.Anime.AnimeTitle.AnimeTitleListQuery { UserId = new Guid("8393230f-78e3-473b-a5dc-3221917e0aeb") })); + [HttpGet] public async Task ById(Guid TitleId) => _mapper.Map<Title>(await _mediator.Send(new Application.Queries.Anime.AnimeTitle.AnimeTitleQuery { Id = TitleId })); + [HttpPost("Rate")] + public async Task Rate(RateEdit model) => + await _mediator.Send(new Application.Commands.Anime.Title.RateTitleCommand + { + TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), + RatePercentage = model.RatePercentage ?? throw new ArgumentNullException(nameof(model.RatePercentage)), + }); + + [HttpPost("Unrate")] + public async Task Unrate(RateEdit model) => + await _mediator.Send(new Application.Commands.Anime.Title.UnrateTitleCommand + { + TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), + }); + [HttpPost("Create")] - public async Task<Guid> CreateTitle([FromQuery] Guid nameOriginalLanguageId, [FromQuery] string nameOriginal) => + public async Task<Guid> CreateTitle(TitleCreate model) => await _mediator.Send(new Application.Commands.Anime.Title.CreateAnimeTitleCommand { - NameOriginalLanguageId = nameOriginalLanguageId, - NameOriginal = nameOriginal, + NameOriginalLanguageId = model.OriginalName.LanguageId, + NameOriginal = model.OriginalName.Value, + Preview = model.Preview == null ? null : new Application.Models.MediaInfo + { + Url = model.Preview.Url, + Type = (Application.Models.MediaInfoType)model.Preview.Type, + } }); [HttpPost("AddSeason")] @@ -69,86 +92,85 @@ public class TitleController : ControllerBase [HttpPost("AddName")] - public async Task AddName([FromQuery] Guid titleId, [FromQuery] Guid languageId, [FromQuery] string name, - [FromQuery] NameType type) => + public async Task AddName(NameEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Name.AddNameCommand { - TitleId = titleId, - LanguageId = languageId, - NameType = (Application.Commands.CommonModels.NameType)type, - Value = name + TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), + LanguageId = model.LanguageId, + NameType = (Application.Commands.CommonModels.NameType)model.Type, + Value = model.Value }); [HttpPost("EditName")] - public async Task EditName([FromQuery] Guid titleId, [FromQuery] Guid languageId, [FromQuery] string name, - [FromQuery] NameType type) => + public async Task EditName(NameEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Name.EditNameCommand { - TitleId = titleId, - LanguageId = languageId, - NameType = (Application.Commands.CommonModels.NameType)type, - Value = name + TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), + LanguageId = model.LanguageId, + NameType = (Application.Commands.CommonModels.NameType)model.Type, + Value = model.Value, + NewLanguageId = model.NewLanguageId, + NewValue = model.NewValue, }); [HttpPost("DeleteName")] - public async Task DeleteName([FromQuery] Guid titleId, [FromQuery] Guid languageId, [FromQuery] string name, - [FromQuery] NameType type) => + public async Task DeleteName(NameEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Name.DeleteNameCommand { - TitleId = titleId, - LanguageId = languageId, - NameType = (Application.Commands.CommonModels.NameType)type, - Value = name, + TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), + LanguageId = model.LanguageId, + NameType = (Application.Commands.CommonModels.NameType)model.Type, + Value = model.Value, }); [HttpPost("SetPreview")] - public async Task SetPreview([FromQuery] Guid titleId, [FromQuery] MediaInfoType type, [FromQuery] string url) => + public async Task SetPreview(MediaInfoEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Preview.SetPreviewCommand { - TitleId = titleId, - Type = (Application.Commands.CommonModels.MediaInfoType)type, - Url = url, + TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), + Type = (Application.Commands.CommonModels.MediaInfoType)model.Type, + Url = model.Url, }); - [HttpPost("DeletePreview")] - public async Task DeletePreview([FromQuery] Guid titleId) => + [HttpPost("ClearPreview")] + public async Task ClearPreview(MediaInfoEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Preview.DeletePreviewCommand { - TitleId = titleId, + TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), }); [HttpPost("AddDescription")] - public async Task AddDescription([FromQuery] Guid titleId, [FromQuery] bool isOriginal, [FromQuery] Guid languageId, [FromQuery] string value) => + public async Task AddDescription(DescriptionEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Description.AddDescriptionCommand { - TitleId = titleId, - IsOriginal = isOriginal, - LanguageId = languageId, - Value = value, + TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), + IsOriginal = model.IsOriginal, + LanguageId = model.LanguageId, + Value = model.Value, }); [HttpPost("EditDescription")] - public async Task EditDescription([FromQuery] Guid titleId, bool isOriginal, [FromQuery] Guid languageId, [FromQuery] string value, - [FromQuery] string newValue) => + public async Task EditDescription(DescriptionEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Description.EditDescriptionCommand { - TitleId = titleId, - LanguageId = languageId, - IsOriginal = isOriginal, - Value = value, - NewValue = newValue, + TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), + LanguageId = model.LanguageId, + IsOriginal = model.IsOriginal, + Value = model.Value, + NewLanguageId = model.NewLanguageId, + NewValue = model.NewValue, }); [HttpPost("DeleteDescription")] - public async Task DeleteDescription([FromQuery] Guid titleId, bool isOriginal, [FromQuery] Guid languageId, [FromQuery] string value) => + public async Task DeleteDescription(DescriptionEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Description.DeleteDescriptionCommand { - TitleId = titleId, - LanguageId = languageId, - IsOriginal = isOriginal, - Value = value, + TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), + LanguageId = model.LanguageId, + IsOriginal = model.IsOriginal, + Value = model.Value, }); @@ -229,26 +251,26 @@ public class TitleController : ControllerBase }); [HttpPost("SetAnnouncementDate")] - public async Task SetAnnouncementDate([FromQuery] Guid titleId, [FromQuery] DateTimeOffset? value) => + public async Task SetAnnouncementDate(DateEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.SetAnnouncementDateCommand { - TitleId = titleId, - Value = value, + TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), + Value = model.Value.HasValue ? new DateTimeOffset(model.Value.Value.DateTime, TimeSpan.Zero) : null }); [HttpPost("SetEstimatedReleaseDate")] - public async Task SetEstimatedReleaseDate([FromQuery] Guid titleId, [FromQuery] DateTimeOffset? value) => + public async Task SetEstimatedReleaseDate(DateEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.SetEstimatedReleaseDateCommand { - TitleId = titleId, - Value = value, + TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), + Value = model.Value.HasValue ? new DateTimeOffset(model.Value.Value.DateTime, TimeSpan.Zero) : null }); [HttpPost("SetReleaseDate")] - public async Task SetReleaseDate([FromQuery] Guid titleId, [FromQuery] DateTimeOffset? value) => + public async Task SetReleaseDate(DateEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.SetReleaseDateCommand { - TitleId = titleId, - Value = value, + TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), + Value = model.Value.HasValue ? new DateTimeOffset(model.Value.Value.DateTime, TimeSpan.Zero) : null, }); } \ No newline at end of file diff --git a/Modules.Library.WebApi/Controllers/GenreController.cs b/Modules.Library.WebApi/Controllers/GenreController.cs index 70ec56c..70b513b 100644 --- a/Modules.Library.WebApi/Controllers/GenreController.cs +++ b/Modules.Library.WebApi/Controllers/GenreController.cs @@ -1,7 +1,9 @@ using AutoMapper; using MediatR; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using Modules.Library.WebApi.Models.Dictionary; +using Modules.Library.WebApi.Models.Views.Dictionary; +using System.Net; namespace Modules.Library.WebApi.Controllers; @@ -9,6 +11,11 @@ namespace Modules.Library.WebApi.Controllers; [ApiExplorerSettings(GroupName = "GenreV1")] [Route("Dictionaries/Genre")] //[Route("[controller]")] +[Produces("application/json")] +[ProducesResponseType(400, StatusCode = 400, Type = typeof(ProblemDetails))] +[ProducesResponseType(401, StatusCode = 401, Type = typeof(UnauthorizedResult))] +[Consumes("application/json")] +//[Authorize] public class GenreController : ControllerBase { private readonly IMapper _mapper; @@ -27,14 +34,17 @@ public class GenreController : ControllerBase _mapper.Map<List<Genre>>(await _mediator.Send(new Application.Queries.Dictionaries.Genre.GenreListQuery())); [HttpPost("CreateGenre")] - public async Task<Guid> CreateGenre([FromQuery]string genreName) => - await _mediator.Send(new Application.Commands.Dictionaries.Genre.CreateGenreCommand { Name = genreName }); + [ProducesResponseType(typeof(Guid), (int)HttpStatusCode.OK)] + public async Task<IActionResult> CreateGenre([FromQuery] string genreName) => + Ok(await _mediator.Send(new Application.Commands.Dictionaries.Genre.CreateGenreCommand { Name = genreName })); [HttpPost("EditGenre")] - public async Task EditGenre([FromQuery] Guid id, [FromQuery]string genreName) => - await _mediator.Send(new Application.Commands.Dictionaries.Genre.SetGenreNameCommand { Id = id, Name = genreName }); + [ProducesResponseType((int)HttpStatusCode.OK)] + public async Task<IActionResult> EditGenre([FromQuery] Guid id, [FromQuery]string genreName) => + Ok(await _mediator.Send(new Application.Commands.Dictionaries.Genre.SetGenreNameCommand { Id = id, Name = genreName })); [HttpPost("DeleteGenre")] - public async Task DeleteGenre([FromQuery] Guid id) => - await _mediator.Send(new Application.Commands.Dictionaries.Genre.DeleteGenreCommand { Id = id }); + [ProducesResponseType((int)HttpStatusCode.OK)] + public async Task<IActionResult> DeleteGenre([FromQuery] Guid id) => + Ok(await _mediator.Send(new Application.Commands.Dictionaries.Genre.DeleteGenreCommand { Id = id })); } diff --git a/Modules.Library.WebApi/Controllers/LanguageController.cs b/Modules.Library.WebApi/Controllers/LanguageController.cs index f0123e7..edeee65 100644 --- a/Modules.Library.WebApi/Controllers/LanguageController.cs +++ b/Modules.Library.WebApi/Controllers/LanguageController.cs @@ -1,7 +1,7 @@ using AutoMapper; using MediatR; using Microsoft.AspNetCore.Mvc; -using Modules.Library.WebApi.Models.Dictionary; +using Modules.Library.WebApi.Models.Views.Dictionary; namespace Modules.Library.WebApi.Controllers; @@ -27,19 +27,19 @@ public class LanguageController : ControllerBase _mapper.Map<List<Language>>(await _mediator.Send(new Application.Queries.Dictionaries.Language.LanguageListQuery())); [HttpPost("Create")] - public async Task<Guid> CreateLanguage([FromQuery] string codeIso2, [FromQuery] string name) => + public async Task<Guid> CreateLanguage([FromQuery] string codeIso3, [FromQuery] string name) => await _mediator.Send(new Application.Commands.Dictionaries.Language.CreateLanguageCommand { - Code = codeIso2, + Code = codeIso3, Name = name, }); [HttpPost("Edit")] - public async Task EditLanguage([FromQuery] Guid id, [FromQuery] string? codeIso2, [FromQuery]string? name) => + public async Task EditLanguage([FromQuery] Guid id, [FromQuery] string? codeIso3, [FromQuery]string? name) => await _mediator.Send(new Application.Commands.Dictionaries.Language.SetLanguageNameCommand { Id = id, - Code = codeIso2, + Code = codeIso3, Name = name, }); diff --git a/Modules.Library.WebApi/Models/Anime/CommonProperties/DateEdit.cs b/Modules.Library.WebApi/Models/Anime/CommonProperties/DateEdit.cs new file mode 100644 index 0000000..961a952 --- /dev/null +++ b/Modules.Library.WebApi/Models/Anime/CommonProperties/DateEdit.cs @@ -0,0 +1,9 @@ +namespace Modules.Library.WebApi.Models.Anime.CommonProperties; + +public class DateEdit +{ + public Guid? AnimeTitleId { get; set; } + public Guid? AnimeSeasonId { get; set; } + public Guid? AnimeEpisodeId { get; set; } + public DateTimeOffset? Value { get; set; } +} \ No newline at end of file diff --git a/Modules.Library.WebApi/Models/Anime/CommonProperties/DescriptionEdit.cs b/Modules.Library.WebApi/Models/Anime/CommonProperties/DescriptionEdit.cs new file mode 100644 index 0000000..0d5d24d --- /dev/null +++ b/Modules.Library.WebApi/Models/Anime/CommonProperties/DescriptionEdit.cs @@ -0,0 +1,13 @@ +namespace Modules.Library.WebApi.Models.Anime.CommonProperties; + +public class DescriptionEdit +{ + public Guid? AnimeTitleId { get; set; } + public Guid? AnimeSeasonId { get; set; } + public Guid? AnimeEpisodeId { get; set; } + public Guid LanguageId { get; set; } = default!; + public string Value { get; set; } = default!; + public bool IsOriginal { get; set; } + public string? NewValue { get; set; } + public Guid? NewLanguageId { get; set; } +} \ No newline at end of file diff --git a/Modules.Library.WebApi/Models/Anime/CommonProperties/MediaInfoEdit.cs b/Modules.Library.WebApi/Models/Anime/CommonProperties/MediaInfoEdit.cs new file mode 100644 index 0000000..4b6541d --- /dev/null +++ b/Modules.Library.WebApi/Models/Anime/CommonProperties/MediaInfoEdit.cs @@ -0,0 +1,14 @@ +namespace Modules.Library.WebApi.Models.Anime.CommonProperties; + +public class MediaInfoEdit +{ + public Guid? AnimeTitleId { get; set; } + public Guid? AnimeSeasonId { get; set; } + public Guid? AnimeEpisodeId { get; set; } + public MediaInfoType Type { get; set; } + public string Url { get; set; } = default!; + public string ContentType { get; set; } = default!; + public MediaInfoType? NewType { get; set; } + public string? NewUrl { get; set; } + public string? NewContentType { get; set; } +} \ No newline at end of file diff --git a/Modules.Library.WebApi/Models/Anime/CommonProperties/NameEdit.cs b/Modules.Library.WebApi/Models/Anime/CommonProperties/NameEdit.cs new file mode 100644 index 0000000..042f2d9 --- /dev/null +++ b/Modules.Library.WebApi/Models/Anime/CommonProperties/NameEdit.cs @@ -0,0 +1,13 @@ +namespace Modules.Library.WebApi.Models.Anime.CommonProperties; + +public class NameEdit +{ + public Guid? AnimeTitleId { get; set; } + public Guid? AnimeSeasonId { get; set; } + public Guid? AnimeEpisodeId { get; set; } + public Guid LanguageId { get; set; } = default!; + public string Value { get; set; } = default!; + public NameType Type { get; set; } = NameType.Original; + public string? NewValue { get; set; } + public Guid? NewLanguageId { get; set; } +} \ No newline at end of file diff --git a/Modules.Library.WebApi/Models/Anime/Language.cs b/Modules.Library.WebApi/Models/Anime/Language.cs new file mode 100644 index 0000000..070c70a --- /dev/null +++ b/Modules.Library.WebApi/Models/Anime/Language.cs @@ -0,0 +1,8 @@ +namespace Modules.Library.WebApi.Models.Anime; + +public class Name +{ + public Guid LanguageId { get; set; } + public string Value { get; set; } = default!; + public NameType Type { get; set; } = NameType.Original; +} \ No newline at end of file diff --git a/Modules.Library.WebApi/Models/Anime/RateEdit.cs b/Modules.Library.WebApi/Models/Anime/RateEdit.cs new file mode 100644 index 0000000..34e8c8c --- /dev/null +++ b/Modules.Library.WebApi/Models/Anime/RateEdit.cs @@ -0,0 +1,9 @@ +namespace Modules.Library.WebApi.Models.Anime; + +public class RateEdit +{ + public Guid? AnimeTitleId { get; set; } + public Guid? AnimeSeasonId { get; set; } + public Guid? AnimeEpisodeId { get; set; } + public ushort? RatePercentage { get; set; } +} \ No newline at end of file diff --git a/Modules.Library.WebApi/Models/Anime/TitleCreate.cs b/Modules.Library.WebApi/Models/Anime/TitleCreate.cs new file mode 100644 index 0000000..f3007d9 --- /dev/null +++ b/Modules.Library.WebApi/Models/Anime/TitleCreate.cs @@ -0,0 +1,9 @@ +namespace Modules.Library.WebApi.Models.Anime; + +public class TitleCreate +{ + public Name OriginalName { get; set; } = default!; + + public MediaInfo? Preview { get; set; } + +} \ No newline at end of file diff --git a/Modules.Library.WebApi/Models/MediaInfo.cs b/Modules.Library.WebApi/Models/MediaInfo.cs index 863fddb..bb57b68 100644 --- a/Modules.Library.WebApi/Models/MediaInfo.cs +++ b/Modules.Library.WebApi/Models/MediaInfo.cs @@ -3,4 +3,5 @@ public class MediaInfo { public MediaInfoType Type { get; set; } public string Url { get; set; } = default!; + public string ContentType { get; set; } = default!; } \ No newline at end of file diff --git a/Modules.Library.WebApi/Models/Anime/AnimeItem.cs b/Modules.Library.WebApi/Models/Views/Anime/AnimeItem.cs similarity index 86% rename from Modules.Library.WebApi/Models/Anime/AnimeItem.cs rename to Modules.Library.WebApi/Models/Views/Anime/AnimeItem.cs index 3ae6905..34fa1f3 100644 --- a/Modules.Library.WebApi/Models/Anime/AnimeItem.cs +++ b/Modules.Library.WebApi/Models/Views/Anime/AnimeItem.cs @@ -1,4 +1,4 @@ -namespace Modules.Library.WebApi.Models.Anime; +namespace Modules.Library.WebApi.Models.Views.Anime; public abstract class AnimeItem { diff --git a/Modules.Library.WebApi/Models/Anime/Episode.cs b/Modules.Library.WebApi/Models/Views/Anime/Episode.cs similarity index 75% rename from Modules.Library.WebApi/Models/Anime/Episode.cs rename to Modules.Library.WebApi/Models/Views/Anime/Episode.cs index 65c4a56..871c53f 100644 --- a/Modules.Library.WebApi/Models/Anime/Episode.cs +++ b/Modules.Library.WebApi/Models/Views/Anime/Episode.cs @@ -1,4 +1,4 @@ -namespace Modules.Library.WebApi.Models.Anime; +namespace Modules.Library.WebApi.Models.Views.Anime; public class Episode : AnimeItem { diff --git a/Modules.Library.WebApi/Models/Anime/Season.cs b/Modules.Library.WebApi/Models/Views/Anime/Season.cs similarity index 76% rename from Modules.Library.WebApi/Models/Anime/Season.cs rename to Modules.Library.WebApi/Models/Views/Anime/Season.cs index 839eb5a..189f2f0 100644 --- a/Modules.Library.WebApi/Models/Anime/Season.cs +++ b/Modules.Library.WebApi/Models/Views/Anime/Season.cs @@ -1,4 +1,4 @@ -namespace Modules.Library.WebApi.Models.Anime; +namespace Modules.Library.WebApi.Models.Views.Anime; public class Season : AnimeItem { diff --git a/Modules.Library.WebApi/Models/Anime/Title.cs b/Modules.Library.WebApi/Models/Views/Anime/Title.cs similarity index 89% rename from Modules.Library.WebApi/Models/Anime/Title.cs rename to Modules.Library.WebApi/Models/Views/Anime/Title.cs index 1928a5c..4ac939b 100644 --- a/Modules.Library.WebApi/Models/Anime/Title.cs +++ b/Modules.Library.WebApi/Models/Views/Anime/Title.cs @@ -1,4 +1,4 @@ -namespace Modules.Library.WebApi.Models.Anime; +namespace Modules.Library.WebApi.Models.Views.Anime; public class Title { diff --git a/Modules.Library.WebApi/Models/CommonProperties.cs b/Modules.Library.WebApi/Models/Views/CommonProperties.cs similarity index 91% rename from Modules.Library.WebApi/Models/CommonProperties.cs rename to Modules.Library.WebApi/Models/Views/CommonProperties.cs index 81aff08..53a316b 100644 --- a/Modules.Library.WebApi/Models/CommonProperties.cs +++ b/Modules.Library.WebApi/Models/Views/CommonProperties.cs @@ -1,4 +1,4 @@ -namespace Modules.Library.WebApi.Models; +namespace Modules.Library.WebApi.Models.Views; public class CommonProperties { diff --git a/Modules.Library.WebApi/Models/Description.cs b/Modules.Library.WebApi/Models/Views/Description.cs similarity index 71% rename from Modules.Library.WebApi/Models/Description.cs rename to Modules.Library.WebApi/Models/Views/Description.cs index 19d6da3..3c8eb48 100644 --- a/Modules.Library.WebApi/Models/Description.cs +++ b/Modules.Library.WebApi/Models/Views/Description.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; -using Modules.Library.WebApi.Models.Dictionary; +using Modules.Library.WebApi.Models.Views.Dictionary; -namespace Modules.Library.WebApi.Models; +namespace Modules.Library.WebApi.Models.Views; public class Description { [Required] diff --git a/Modules.Library.WebApi/Models/Dictionary/Genre.cs b/Modules.Library.WebApi/Models/Views/Dictionary/Genre.cs similarity index 78% rename from Modules.Library.WebApi/Models/Dictionary/Genre.cs rename to Modules.Library.WebApi/Models/Views/Dictionary/Genre.cs index c32e766..5d4c89a 100644 --- a/Modules.Library.WebApi/Models/Dictionary/Genre.cs +++ b/Modules.Library.WebApi/Models/Views/Dictionary/Genre.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Modules.Library.WebApi.Models.Dictionary; +namespace Modules.Library.WebApi.Models.Views.Dictionary; public class Genre { diff --git a/Modules.Library.WebApi/Models/Dictionary/Language.cs b/Modules.Library.WebApi/Models/Views/Dictionary/Language.cs similarity index 84% rename from Modules.Library.WebApi/Models/Dictionary/Language.cs rename to Modules.Library.WebApi/Models/Views/Dictionary/Language.cs index e7c3c78..6eb9b9b 100644 --- a/Modules.Library.WebApi/Models/Dictionary/Language.cs +++ b/Modules.Library.WebApi/Models/Views/Dictionary/Language.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Modules.Library.WebApi.Models.Dictionary; +namespace Modules.Library.WebApi.Models.Views.Dictionary; public class Language { diff --git a/Modules.Library.WebApi/Models/GenreProportion.cs b/Modules.Library.WebApi/Models/Views/GenreProportion.cs similarity index 64% rename from Modules.Library.WebApi/Models/GenreProportion.cs rename to Modules.Library.WebApi/Models/Views/GenreProportion.cs index 70a5d0c..6e516dd 100644 --- a/Modules.Library.WebApi/Models/GenreProportion.cs +++ b/Modules.Library.WebApi/Models/Views/GenreProportion.cs @@ -1,7 +1,7 @@ -using Modules.Library.WebApi.Models.Dictionary; +using Modules.Library.WebApi.Models.Views.Dictionary; using System.ComponentModel.DataAnnotations; -namespace Modules.Library.WebApi.Models; +namespace Modules.Library.WebApi.Models.Views; public class GenreProportion { diff --git a/Modules.Library.WebApi/Models/NameItem.cs b/Modules.Library.WebApi/Models/Views/NameItem.cs similarity index 71% rename from Modules.Library.WebApi/Models/NameItem.cs rename to Modules.Library.WebApi/Models/Views/NameItem.cs index 516fd17..cb3f777 100644 --- a/Modules.Library.WebApi/Models/NameItem.cs +++ b/Modules.Library.WebApi/Models/Views/NameItem.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; -using Modules.Library.WebApi.Models.Dictionary; +using Modules.Library.WebApi.Models.Views.Dictionary; -namespace Modules.Library.WebApi.Models; +namespace Modules.Library.WebApi.Models.Views; public class NameItem { diff --git a/Modules.Library.WebApi/Modules.Library.WebApi.csproj b/Modules.Library.WebApi/Modules.Library.WebApi.csproj index 9b688d9..eabf507 100644 --- a/Modules.Library.WebApi/Modules.Library.WebApi.csproj +++ b/Modules.Library.WebApi/Modules.Library.WebApi.csproj @@ -12,6 +12,7 @@ </ItemGroup> <ItemGroup> + <ProjectReference Include="..\Common.WebApi\Common.WebApi.csproj" /> <ProjectReference Include="..\Modules.Library.Application\Modules.Library.Application.csproj" /> <ProjectReference Include="..\Modules.Library.Database\Modules.Library.Database.csproj" /> <ProjectReference Include="..\MyBookmark.ServiceDefaults\MyBookmark.ServiceDefaults.csproj" /> diff --git a/Modules.Library.WebApi/Program.cs b/Modules.Library.WebApi/Program.cs index fa189c7..2fc89c9 100644 --- a/Modules.Library.WebApi/Program.cs +++ b/Modules.Library.WebApi/Program.cs @@ -1,7 +1,9 @@ +using Common.WebApi.Middlewares; using Microsoft.OpenApi.Models; using Modules.Library.Application; using Modules.Library.Database; -using Modules.Library.WebApi.Models.Anime; +using Modules.Library.WebApi.Models.Views.Anime; +using Modules.Rating.Api; using Swashbuckle.AspNetCore.SwaggerGen; using Swashbuckle.AspNetCore.SwaggerUI; @@ -11,6 +13,7 @@ builder.AddServiceDefaults(); // Add services to the container. builder.Services.AddDatabase("mongodb://localhost:27017", "MyBookmarkDb"); +builder.Services.AddRates("mongodb://localhost:27017", "MyBookmarkDb"); builder.Services.AddApplicationServices(); builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); @@ -134,8 +137,12 @@ builder.Services.Configure<SwaggerGenOptions>(options => var app = builder.Build(); +app.UseMiddleware<ExceptionMiddleware>(); + app.MapDefaultEndpoints(); +app.UseCors(q => q.AllowAnyHeader().AllowAnyOrigin().AllowAnyMethod()); //?? + // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { diff --git a/Modules.Rating.Api/Commands/RateObjectCommand.cs b/Modules.Rating.Api/Commands/RateObjectCommand.cs new file mode 100644 index 0000000..ce0f8bc --- /dev/null +++ b/Modules.Rating.Api/Commands/RateObjectCommand.cs @@ -0,0 +1,35 @@ +using MediatR; +using Modules.Rating.Api.Database.Entities; +using Modules.Rating.Api.Repositories; + +namespace Modules.Rating.Api.Commands; + +public class RateObjectCommand : IRequest<Unit> +{ + public Guid ObjectId { get; set; } + public Guid SubjectId { get; set; } + public ushort RatePercentage { get; set; } + +} + +public class RateObjectCommandHandler(RateRepository repository) : IRequestHandler<RateObjectCommand, Unit> +{ + public async Task<Unit> Handle(RateObjectCommand request, CancellationToken cancellationToken) + { + var key = new RateKey + { + ObjectId = request.ObjectId, + SubjectId = request.SubjectId, + }; + + if (!await repository.IsRateExists(key)) + { + await repository.AddAsync(new Rate { Key = key, RatePercentage = request.RatePercentage, }); + } + else + { + await repository.UpdateAsync(new Rate { Key = key, RatePercentage = request.RatePercentage, }); + } + return Unit.Value; + } +} \ No newline at end of file diff --git a/Modules.Rating.Api/Commands/UnrateObjectCommand.cs b/Modules.Rating.Api/Commands/UnrateObjectCommand.cs new file mode 100644 index 0000000..720ab0f --- /dev/null +++ b/Modules.Rating.Api/Commands/UnrateObjectCommand.cs @@ -0,0 +1,31 @@ +using MediatR; +using Modules.Rating.Api.Database.Entities; +using Modules.Rating.Api.Repositories; + +namespace Modules.Rating.Api.Commands; + +public class UnrateObjectCommand : IRequest<Unit> +{ + public Guid ObjectId { get; set; } + public Guid SubjectId { get; set; } + +} + +public class UnrateObjectCommandHandler(RateRepository repository) : IRequestHandler<UnrateObjectCommand, Unit> +{ + public async Task<Unit> Handle(UnrateObjectCommand request, CancellationToken cancellationToken) + { + //var key = new RateKey + //{ + // ObjectId = request.ObjectId, + // SubjectId = request.SubjectId, + //}; + //if (await repository.IsRateExists(key)) await repository.DeleteAsync(key); + await repository.DeleteAsync(new RateKey + { + ObjectId = request.ObjectId, + SubjectId = request.SubjectId, + }); + return Unit.Value; + } +} \ No newline at end of file diff --git a/Modules.Rating.Api/Database/Entities/Rate.cs b/Modules.Rating.Api/Database/Entities/Rate.cs new file mode 100644 index 0000000..0e1c647 --- /dev/null +++ b/Modules.Rating.Api/Database/Entities/Rate.cs @@ -0,0 +1,10 @@ +using MongoDB.Bson.Serialization.Attributes; + +namespace Modules.Rating.Api.Database.Entities; + +[BsonIgnoreExtraElements] +public class Rate +{ + public RateKey Key { get; set; } = default!; + public ushort RatePercentage { get; set; } +} diff --git a/Modules.Rating.Api/Database/Entities/RateKey.cs b/Modules.Rating.Api/Database/Entities/RateKey.cs new file mode 100644 index 0000000..b7b6939 --- /dev/null +++ b/Modules.Rating.Api/Database/Entities/RateKey.cs @@ -0,0 +1,7 @@ +namespace Modules.Rating.Api.Database.Entities; + +public class RateKey +{ + public Guid ObjectId { get; set; } = default!; + public Guid SubjectId { get; set; } = default!; +} \ No newline at end of file diff --git a/Modules.Rating.Api/Database/MongoDbContext.cs b/Modules.Rating.Api/Database/MongoDbContext.cs new file mode 100644 index 0000000..73e3198 --- /dev/null +++ b/Modules.Rating.Api/Database/MongoDbContext.cs @@ -0,0 +1,35 @@ +using Modules.Rating.Api.Database.Entities; +using MongoDB.Driver; + +namespace Modules.Rating.Api.Database; + +public class MongoDbContext(IMongoDatabase database) +{ + private bool _initialized; + public IMongoCollection<TDocument> GetCollection<TDocument>(string collectionName) + { + if (!_initialized) throw new Exception(string.Concat(nameof(MongoDbContext), " has not initialized yet")); + return database.GetCollection<TDocument>(collectionName); + } + + public IMongoCollection<Rate> Rates => GetCollection<Rate>(nameof(Rate)); + + public void Initialize() + { + /* + BsonClassMap.RegisterClassMap<AnimeTitle>(q => + { + q.AutoMap(); + q.MapIdMember(c => c.Id).SetIdGenerator(CombGuidGenerator.Instance); + //q.MapCreator(q => AnimeTitleBuilder.FromAnimeTitle(q).Build()); + //q.MapIdMember(c => c.Id).SetIdGenerator(StringObjectIdGenerator.Instance); + }); + */ + _initialized = true; + } + + + //private IntSequence _paymentProviderIdSequence = new("PaymentProviderId"); + + //public Task<int> GetNextPaymentProviderId() => _paymentProviderIdSequence.GetNextSequenceValue(context); +} diff --git a/Modules.Rating.Api/Models/Rate.cs b/Modules.Rating.Api/Models/Rate.cs new file mode 100644 index 0000000..bd06fc3 --- /dev/null +++ b/Modules.Rating.Api/Models/Rate.cs @@ -0,0 +1,9 @@ +namespace Modules.Rating.Api.Models; + +public class Rate +{ + public Guid ObjectId { get; set; } + //public Guid SubjectId { get; set; } + public ushort? ObjectRatePercentage { get; set; } + public ushort? SubjectRatePercentage { get; set; } +} diff --git a/Modules.Rating.Api/Modules.Rating.Api.csproj b/Modules.Rating.Api/Modules.Rating.Api.csproj new file mode 100644 index 0000000..ef4c2bb --- /dev/null +++ b/Modules.Rating.Api/Modules.Rating.Api.csproj @@ -0,0 +1,15 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="MediatR" Version="12.4.1" /> + <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" /> + <PackageReference Include="MongoDB.Driver" Version="2.30.0" /> + </ItemGroup> + +</Project> diff --git a/Modules.Rating.Api/Querirs/ObjectRatingListQuery.cs b/Modules.Rating.Api/Querirs/ObjectRatingListQuery.cs new file mode 100644 index 0000000..77eaa0c --- /dev/null +++ b/Modules.Rating.Api/Querirs/ObjectRatingListQuery.cs @@ -0,0 +1,27 @@ +using MediatR; +using Modules.Rating.Api.Database.Entities; +using Modules.Rating.Api.Models; +using Modules.Rating.Api.Repositories; + +namespace Modules.Rating.Api.Querirs; + +public class ObjectRatingListQuery : IRequest<List<Models.Rate>> +{ + public Guid? SubjectId { get; set; } + public IEnumerable<Guid> ObjectIds { get; set; } = []; +} + +public class ObjectRatingListQueryHandler(RateRepository repository) : IRequestHandler<ObjectRatingListQuery, List<Models.Rate>> +{ + public async Task<List<Models.Rate>> Handle(ObjectRatingListQuery request, CancellationToken cancellationToken) + { + if (request.ObjectIds.Count() == 0) return []; + var rates = await repository.GetRates(request.ObjectIds, request.SubjectId); + return rates.Select(q => new Models.Rate + { + ObjectId = q.ObjectId, + ObjectRatePercentage = (ushort)Math.Round((decimal)q.Rate, 0), + SubjectRatePercentage = q.SubjectRate.HasValue ? Convert.ToUInt16(q.SubjectRate) : null, + }).ToList(); + } +} \ No newline at end of file diff --git a/Modules.Rating.Api/Querirs/ObjectRatingQuery.cs b/Modules.Rating.Api/Querirs/ObjectRatingQuery.cs new file mode 100644 index 0000000..f33ca5c --- /dev/null +++ b/Modules.Rating.Api/Querirs/ObjectRatingQuery.cs @@ -0,0 +1,37 @@ +using MediatR; +using Modules.Rating.Api.Database.Entities; +using Modules.Rating.Api.Repositories; + +namespace Modules.Rating.Api.Querirs; + +public class ObjectRatingQuery : IRequest<Models.Rate?> +{ + public Guid ObjectId { get; set; } = default!; + public Guid? SubjectId { get; set; } +} + +public class ObjectRatingQueryHandler(RateRepository repository) : IRequestHandler<ObjectRatingQuery, Models.Rate?> +{ + public async Task<Models.Rate?> Handle(ObjectRatingQuery request, CancellationToken cancellationToken) + { + var rate = await repository.GetAverageObjectRate(request.ObjectId); + + var subjectRate = request.SubjectId.HasValue + ? await repository.GetFirstOrDefaultWhere(q => q.Key == new RateKey + { + ObjectId = request.ObjectId, + SubjectId = request.SubjectId.HasValue ? request.SubjectId.Value : q.Key.SubjectId, + }) + : null; + + return rate.HasValue + ? new Models.Rate + { + ObjectId = request.ObjectId, + //SubjectId = request.SubjectId, + ObjectRatePercentage = (ushort)Math.Round((decimal)rate, 0), + SubjectRatePercentage = subjectRate?.RatePercentage, + } + : null; + } +} \ No newline at end of file diff --git a/Modules.Rating.Api/Repositories/RateRepository.cs b/Modules.Rating.Api/Repositories/RateRepository.cs new file mode 100644 index 0000000..73c368a --- /dev/null +++ b/Modules.Rating.Api/Repositories/RateRepository.cs @@ -0,0 +1,145 @@ +using Modules.Rating.Api.Database; +using Modules.Rating.Api.Database.Entities; +using MongoDB.Bson; +using MongoDB.Driver; +using MongoDB.Driver.Linq; +using System.Linq; +using System.Linq.Expressions; + +namespace Modules.Rating.Api.Repositories; + +public class RateRepository(MongoDbContext context) +{ + private readonly IMongoCollection<Rate> _collection = context.GetCollection<Rate>(nameof(Rate)); + + public async Task AddAsync(Rate entity) + { + if (await IsRateExists(entity.Key)) throw new Exception("Object is already rated by subject"); + await _collection.InsertOneAsync(entity); + } + + public async Task<bool> UpdateAsync(Rate entity) + { + if (!await IsRateExists(entity.Key)) throw new Exception("Rate not found"); + var document = await _collection.FindOneAndReplaceAsync(q => q.Key == entity.Key, entity); + return document != null; + } + + public async Task<bool> DeleteAsync(RateKey key) + { + if (!await IsRateExists(key)) throw new Exception("Rate not found"); + var document = await _collection.FindOneAndDeleteAsync(q => q.Key == key); + return document != null; + } + + public async Task<Rate> GetFirstOrDefaultWhere(Expression<Func<Rate, bool>> predicate) => + await _collection.Find(predicate).SingleOrDefaultAsync(); + + public async Task<List<Rate>> GetWhere(Expression<Func<Rate, bool>> predicate) => + await _collection.Find(predicate).ToListAsync(); + + //internal async Task<List<RateItem>> GetRates(IEnumerable<Guid> objectIds, Guid? subjectId) + //{ + // //var query = _collection.AsQueryable(); + // //return await query + // // .Where(q => objectIds.Contains(q.Key.ObjectId)) + // // .GroupBy(q => q.Key.ObjectId, (o, r) => new { ObjectId = o, Rate = r.Average(q => q.RatePercentage) }) + // // .GroupJoin(query.Where(q => q.Key.SubjectId == subjectId), + // // q => q.ObjectId, + // // q => q.Key.ObjectId, + // // (g, r) => new { g.ObjectId, g.Rate, SubjecrRates = r }) + // // .SelectMany(q => q.SubjecrRates.DefaultIfEmpty(), (r, s) => + // // new RateItem { ObjectId = r.ObjectId, Rate = r.Rate, SubjectRate = s != null ? s.RatePercentage : null }) + // // .ToListAsync().ConfigureAwait(false); + + // var builder = Builders<BsonDocument>.SetFields + + // await _collection + // .Aggregate() + // .Match(q => objectIds.Contains(q.Key.ObjectId)) + // .Group(q => q.Key.ObjectId, q => new { ObjectId = q.Key, Rate = q.Average(q => q.RatePercentage) }) + // .Lookup<Rate, RateItem>(nameof(Rate), q => q.ObjectId, q) + // .FirstOrDefaultAsync().ConfigureAwait(false); + //} + + internal async Task<List<RateItem>> GetRates(IEnumerable<Guid> objectIds, Guid? subjectId) + { + var matchStage = new BsonDocument("$match", new BsonDocument("Key.ObjectId", new BsonDocument("$in", new BsonArray(objectIds)))); + + var groupStage = new BsonDocument("$group", new BsonDocument + { + { "_id", "$Key.ObjectId" }, + { "AverageRate", new BsonDocument("$avg", "$RatePercentage") } + }); + + var lookupStage = new BsonDocument("$lookup", new BsonDocument + { + { "from", _collection.CollectionNamespace.CollectionName }, + { "let", new BsonDocument("objectId", "$_id") }, + { "pipeline", new BsonArray + { + new BsonDocument("$match", new BsonDocument("$expr", new BsonDocument("$and", new BsonArray + { + new BsonDocument("$eq", new BsonArray { "$Key.ObjectId", "$$objectId" }), + //new BsonDocument("$eq", new BsonArray { "$Key.SubjectId", subjectId.ToString() ?? "" }) + new BsonDocument("$eq", new BsonArray { "$Key.SubjectId", subjectId.ToString() ?? "" }) + }))) + } + }, + { "as", "SubjectRates" } + }); + + var projectStage = new BsonDocument("$project", new BsonDocument + { + { "ObjectId", "$_id" }, + { "Rate", "$AverageRate" }, + { "SubjectRate", new BsonDocument("$arrayElemAt", new BsonArray { "$SubjectRates.RatePercentage", 0 }) } + }); + + var pipeline = new[] { matchStage, groupStage, lookupStage, projectStage }; + + var result = await _collection.AggregateAsync<BsonDocument>(pipeline).ConfigureAwait(false); + + var rateItems = new List<RateItem>(); + + //await result.ForEachAsync(doc => + //{ + // rateItems.Add(new RateItem + // { + // ObjectId = doc["ObjectId"].AsGuid, + // Rate = doc["Rate"].AsDouble, + // SubjectRate = doc["SubjectRate"].IsBsonNull ? (ushort?)null : doc["SubjectRate"].AsNullableInt32 + // }); + //}).ConfigureAwait(false); + + await result.ForEachAsync(doc => + { + var subjectRate = doc.GetValue("SubjectRate", BsonNull.Value); + rateItems.Add(new RateItem + { + ObjectId = doc.GetValue("ObjectId").AsGuid, + Rate = doc.GetValue("Rate").AsDouble, + SubjectRate = subjectRate.IsBsonNull ? null : subjectRate.AsNullableInt32 + }); + }).ConfigureAwait(false); + + return rateItems; + + } + + internal class RateItem + { + internal Guid ObjectId { get; set; } = default!; + internal double Rate { get; set; } + internal int? SubjectRate { get; set; } + } + + public async Task<double?> GetAverageObjectRate(Guid objectId) => + await _collection + .Aggregate() + .Match(q => q.Key.ObjectId == objectId) + .Group(q => q.Key.ObjectId, q => q.Average(q => q.RatePercentage)) + .FirstOrDefaultAsync().ConfigureAwait(false); + + public async Task<bool> IsRateExists(RateKey key) => await _collection.Find(q => q.Key == key).AnyAsync(); +} \ No newline at end of file diff --git a/Modules.Rating.Api/ServiceCollectionExtensions.cs b/Modules.Rating.Api/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..8ee6f4e --- /dev/null +++ b/Modules.Rating.Api/ServiceCollectionExtensions.cs @@ -0,0 +1,59 @@ +using Microsoft.Extensions.DependencyInjection; +using Modules.Rating.Api.Database; +using Modules.Rating.Api.Repositories; +using MongoDB.Driver; + +namespace Modules.Rating.Api +{ + public static class ServiceCollectionExtensions + { + public static IServiceCollection AddRates(this IServiceCollection services, string connectionString) + { + AddMongoDb(services, connectionString); + services.AddScoped(q => + { + var context = new MongoDbContext(q.GetRequiredService<IMongoDatabase>()); + context.Initialize(); + return context; + }); + AddRepositories(services); + return services; + } + + public static IServiceCollection AddRates(this IServiceCollection services, string connectionString, string? databaseName) + { + AddMongoDb(services, connectionString, databaseName); + //services.AddScoped<MongoDbContext>(); + services.AddScoped(q => + { + var context = new MongoDbContext(q.GetRequiredService<IMongoDatabase>()); + context.Initialize(); + return context; + }); + AddRepositories(services); + + + + //AddGateways(services); + return services; + } + + private static void AddRepositories(IServiceCollection services) + { + services.AddScoped<RateRepository>(); + } + + private static void AddMongoDb(this IServiceCollection services, string? connectionString) + { + if (string.IsNullOrWhiteSpace(connectionString)) throw new ArgumentNullException(nameof(connectionString)); + services.AddSingleton(new MongoClient(connectionString)); + } + + private static void AddMongoDb(IServiceCollection services, string? connectionString, string? databaseName) + { + if (string.IsNullOrWhiteSpace(connectionString)) throw new ArgumentNullException(nameof(connectionString)); + if (string.IsNullOrWhiteSpace(databaseName)) throw new ArgumentNullException(nameof(databaseName)); + services.AddSingleton(new MongoClient(connectionString).GetDatabase(databaseName)); + } + } +} diff --git a/Modules.Rating.Application/Gateways/RatingGateway.cs b/Modules.Rating.Application/Gateways/RatingGateway.cs new file mode 100644 index 0000000..3a88010 --- /dev/null +++ b/Modules.Rating.Application/Gateways/RatingGateway.cs @@ -0,0 +1,6 @@ +namespace Modules.Rating.Application.Gateways; + +public interface IRatingGateway +{ + public +} diff --git a/Modules.Rating.Application/Modules.Rating.Application.csproj b/Modules.Rating.Application/Modules.Rating.Application.csproj new file mode 100644 index 0000000..1613b69 --- /dev/null +++ b/Modules.Rating.Application/Modules.Rating.Application.csproj @@ -0,0 +1,18 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + <ItemGroup> + <Folder Include="Commands\" /> + <Folder Include="Querirs\" /> + </ItemGroup> + + <ItemGroup> + <PackageReference Include="MediatR" Version="12.4.1" /> + </ItemGroup> + +</Project> diff --git a/Modules.Rating.Application/Querirs/ObjectRatingQuery.cs b/Modules.Rating.Application/Querirs/ObjectRatingQuery.cs new file mode 100644 index 0000000..2ad7923 --- /dev/null +++ b/Modules.Rating.Application/Querirs/ObjectRatingQuery.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Modules.Rating.Application.Querirs +{ + internal class ObjectRatingQuery + { + } +} diff --git a/Modules.Rating.Application/ServiceCollectionExtensions.cs b/Modules.Rating.Application/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..d725676 --- /dev/null +++ b/Modules.Rating.Application/ServiceCollectionExtensions.cs @@ -0,0 +1,6 @@ +namespace Modules.Rating.Application; + +public static class ServiceCollectionExtensions +{ + +} diff --git a/Modules.Rating.Application/Services/RatingService.cs b/Modules.Rating.Application/Services/RatingService.cs new file mode 100644 index 0000000..c6a4ef3 --- /dev/null +++ b/Modules.Rating.Application/Services/RatingService.cs @@ -0,0 +1,5 @@ +namespace Modules.Rating.Application.Services; + +public class RatingService +{ +} diff --git a/Modules.Rating.Database/Class1.cs b/Modules.Rating.Database/Class1.cs new file mode 100644 index 0000000..d3846c2 --- /dev/null +++ b/Modules.Rating.Database/Class1.cs @@ -0,0 +1,7 @@ +namespace Modules.Rating.Database +{ + public class Class1 + { + + } +} diff --git a/Modules.Rating.Database/Modules.Rating.Database.csproj b/Modules.Rating.Database/Modules.Rating.Database.csproj new file mode 100644 index 0000000..fa71b7a --- /dev/null +++ b/Modules.Rating.Database/Modules.Rating.Database.csproj @@ -0,0 +1,9 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + +</Project> diff --git a/Modules.Rating.Domain/Modules.Rating.Domain.csproj b/Modules.Rating.Domain/Modules.Rating.Domain.csproj new file mode 100644 index 0000000..fa71b7a --- /dev/null +++ b/Modules.Rating.Domain/Modules.Rating.Domain.csproj @@ -0,0 +1,9 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + +</Project> diff --git a/Modules.Rating.Domain/Rate.cs b/Modules.Rating.Domain/Rate.cs new file mode 100644 index 0000000..3c02696 --- /dev/null +++ b/Modules.Rating.Domain/Rate.cs @@ -0,0 +1,8 @@ +namespace Modules.Rating.Domain; + +public class Rate +{ + public Guid ObjectId { get; set; } + public Guid SubjectId { get; set; } + public ushort RatePercentage { get; set; } +} diff --git a/Modules.User.Api/Modules.User.Api.csproj b/Modules.User.Api/Modules.User.Api.csproj new file mode 100644 index 0000000..fa71b7a --- /dev/null +++ b/Modules.User.Api/Modules.User.Api.csproj @@ -0,0 +1,9 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + +</Project> diff --git a/Modules.User.Api/UserMiddleware.cs b/Modules.User.Api/UserMiddleware.cs new file mode 100644 index 0000000..e177612 --- /dev/null +++ b/Modules.User.Api/UserMiddleware.cs @@ -0,0 +1,6 @@ +namespace Modules.User.Api; + +public class UserMiddleware +{ + +} \ No newline at end of file diff --git a/Modules.User.Api/UserService.cs b/Modules.User.Api/UserService.cs new file mode 100644 index 0000000..1b0535e --- /dev/null +++ b/Modules.User.Api/UserService.cs @@ -0,0 +1,15 @@ +namespace Modules.User.Api; + +public class UserService +{ + private string? _user; + + public async Task<string?> GetUser() + { + if (_user == null) + { + await Task.Delay(5000); + } + return _user; + } +} \ No newline at end of file diff --git a/MyBookmark.sln b/MyBookmark.sln index 0fd58ba..913e236 100644 --- a/MyBookmark.sln +++ b/MyBookmark.sln @@ -21,7 +21,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Views", "Views", "{A1136847 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Search", "Search", "{5BC05B7D-F17B-4776-91CA-A7552FD294EA}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Rates", "Rates", "{C3D36A31-0F02-4E15-A57D-895E714FE8A7}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Rating", "Rating", "{C3D36A31-0F02-4E15-A57D-895E714FE8A7}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UserNotes", "UserNotes", "{1A6524E9-DA15-4044-B29F-BFB337F490EE}" EndProject @@ -55,6 +55,24 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UI", "UI", "{30DDC74A-7529- EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyBookmark.UI.RazorPages", "MyBookmark.UI.RazorPages\MyBookmark.UI.RazorPages.csproj", "{37A4BCD2-73B9-4CB3-B12A-58B1298FE02C}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.WebApi", "Common.WebApi\Common.WebApi.csproj", "{332B1C89-06C2-4ED9-845C-DE41F53D15E8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Modules.Rating.Api", "Modules.Rating.Api\Modules.Rating.Api.csproj", "{16F6D8C7-78EE-4800-82E2-951737221958}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{86794C28-E42B-4899-B6FD-0AFA51E204B8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Infrastructure", "Infrastructure", "{C72E692E-B96D-4512-BB2E-CA0C9C9E2B28}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Modules.Account.Api", "Modules.Account.Api\Modules.Account.Api.csproj", "{1EFD5236-7F81-4AB8-8838-08C3DA7A5306}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Modules.Account.Domain", "Modules.Account.Domain\Modules.Account.Domain.csproj", "{5EFDE6FF-BE77-458C-ACD1-0D33346F2245}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Modules.Account.Database", "Modules.Account.Database\Modules.Account.Database.csproj", "{BFEBE295-1923-48C5-A922-D9FD997E150C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Modules.Account.Application", "Modules.Account.Application\Modules.Account.Application.csproj", "{A18E14C1-422E-44F2-A140-397B1F918F45}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Modules.User.Api", "Modules.User.Api\Modules.User.Api.csproj", "{4EE10B8F-EF6C-40A2-A9EB-4FC2D4CF8107}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -107,6 +125,34 @@ Global {37A4BCD2-73B9-4CB3-B12A-58B1298FE02C}.Debug|Any CPU.Build.0 = Debug|Any CPU {37A4BCD2-73B9-4CB3-B12A-58B1298FE02C}.Release|Any CPU.ActiveCfg = Release|Any CPU {37A4BCD2-73B9-4CB3-B12A-58B1298FE02C}.Release|Any CPU.Build.0 = Release|Any CPU + {332B1C89-06C2-4ED9-845C-DE41F53D15E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {332B1C89-06C2-4ED9-845C-DE41F53D15E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {332B1C89-06C2-4ED9-845C-DE41F53D15E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {332B1C89-06C2-4ED9-845C-DE41F53D15E8}.Release|Any CPU.Build.0 = Release|Any CPU + {16F6D8C7-78EE-4800-82E2-951737221958}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {16F6D8C7-78EE-4800-82E2-951737221958}.Debug|Any CPU.Build.0 = Debug|Any CPU + {16F6D8C7-78EE-4800-82E2-951737221958}.Release|Any CPU.ActiveCfg = Release|Any CPU + {16F6D8C7-78EE-4800-82E2-951737221958}.Release|Any CPU.Build.0 = Release|Any CPU + {1EFD5236-7F81-4AB8-8838-08C3DA7A5306}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1EFD5236-7F81-4AB8-8838-08C3DA7A5306}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1EFD5236-7F81-4AB8-8838-08C3DA7A5306}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1EFD5236-7F81-4AB8-8838-08C3DA7A5306}.Release|Any CPU.Build.0 = Release|Any CPU + {5EFDE6FF-BE77-458C-ACD1-0D33346F2245}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5EFDE6FF-BE77-458C-ACD1-0D33346F2245}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5EFDE6FF-BE77-458C-ACD1-0D33346F2245}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5EFDE6FF-BE77-458C-ACD1-0D33346F2245}.Release|Any CPU.Build.0 = Release|Any CPU + {BFEBE295-1923-48C5-A922-D9FD997E150C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BFEBE295-1923-48C5-A922-D9FD997E150C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BFEBE295-1923-48C5-A922-D9FD997E150C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BFEBE295-1923-48C5-A922-D9FD997E150C}.Release|Any CPU.Build.0 = Release|Any CPU + {A18E14C1-422E-44F2-A140-397B1F918F45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A18E14C1-422E-44F2-A140-397B1F918F45}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A18E14C1-422E-44F2-A140-397B1F918F45}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A18E14C1-422E-44F2-A140-397B1F918F45}.Release|Any CPU.Build.0 = Release|Any CPU + {4EE10B8F-EF6C-40A2-A9EB-4FC2D4CF8107}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4EE10B8F-EF6C-40A2-A9EB-4FC2D4CF8107}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4EE10B8F-EF6C-40A2-A9EB-4FC2D4CF8107}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4EE10B8F-EF6C-40A2-A9EB-4FC2D4CF8107}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -131,6 +177,15 @@ Global {43731C43-2BA9-4F2F-8A0F-2F157F05D5A7} = {D034BC31-002F-4F3D-B2C1-9E81B990C51A} {6DC1B759-12F6-415D-BCAC-60E9E15B1074} = {036DC6C2-18A3-49DB-92D3-6DFCDCE3D5F8} {37A4BCD2-73B9-4CB3-B12A-58B1298FE02C} = {30DDC74A-7529-4462-94CB-4AB77792BCCD} + {332B1C89-06C2-4ED9-845C-DE41F53D15E8} = {BACBF195-FD74-4F57-AF8B-D8752C1EBBF0} + {16F6D8C7-78EE-4800-82E2-951737221958} = {C3D36A31-0F02-4E15-A57D-895E714FE8A7} + {86794C28-E42B-4899-B6FD-0AFA51E204B8} = {9B8DB13A-9595-419D-83F3-7C537B903D9F} + {C72E692E-B96D-4512-BB2E-CA0C9C9E2B28} = {9B8DB13A-9595-419D-83F3-7C537B903D9F} + {1EFD5236-7F81-4AB8-8838-08C3DA7A5306} = {9B8DB13A-9595-419D-83F3-7C537B903D9F} + {5EFDE6FF-BE77-458C-ACD1-0D33346F2245} = {86794C28-E42B-4899-B6FD-0AFA51E204B8} + {BFEBE295-1923-48C5-A922-D9FD997E150C} = {C72E692E-B96D-4512-BB2E-CA0C9C9E2B28} + {A18E14C1-422E-44F2-A140-397B1F918F45} = {86794C28-E42B-4899-B6FD-0AFA51E204B8} + {4EE10B8F-EF6C-40A2-A9EB-4FC2D4CF8107} = {A006C232-0F12-4B56-9EA0-D8771ABE49AA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4D16F124-695A-4782-BEFB-AAAFA0953732} diff --git a/mybookmark.ui/index.html b/mybookmark.ui/index.html index 459841c..e6fd883 100644 --- a/mybookmark.ui/index.html +++ b/mybookmark.ui/index.html @@ -1,13 +1,26 @@ <!doctype html> <html lang="en"> - <head> - <meta charset="UTF-8" /> - <!--<link rel="icon" type="image/svg+xml" href="/vite.svg" />--> - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <title>My bookmark - - -
- - + + + + + My bookmark + + + + + + + + + + + + + + + +
+ + diff --git a/mybookmark.ui/package-lock.json b/mybookmark.ui/package-lock.json index 5802167..f40856f 100644 --- a/mybookmark.ui/package-lock.json +++ b/mybookmark.ui/package-lock.json @@ -8,8 +8,15 @@ "name": "mybookmark.ui", "version": "0.0.0", "dependencies": { + "axios": "^1.7.7", + "bootstrap": "^5.3.3", + "jotai": "^2.10.0", + "npm": "^10.8.3", "react": "^18.3.1", - "react-dom": "^18.3.1" + "react-dom": "^18.3.1", + "react-icons": "^5.3.0", + "react-query": "^3.39.3", + "react-router-dom": "^6.26.2" }, "devDependencies": { "@eslint/js": "^9.9.0", @@ -30,6 +37,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -43,6 +51,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -56,6 +65,7 @@ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -65,6 +75,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", @@ -95,6 +106,7 @@ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.25.6", "@jridgewell/gen-mapping": "^0.3.5", @@ -110,6 +122,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.25.2", "@babel/helper-validator-option": "^7.24.8", @@ -126,6 +139,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -139,6 +153,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", @@ -157,6 +172,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -166,6 +182,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -179,6 +196,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -188,6 +206,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -197,6 +216,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -206,6 +226,7 @@ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.25.0", "@babel/types": "^7.25.6" @@ -219,6 +240,7 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -234,6 +256,7 @@ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.25.6" }, @@ -249,6 +272,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -264,6 +288,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -274,11 +299,24 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.25.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/parser": "^7.25.0", @@ -293,6 +331,7 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/generator": "^7.25.6", @@ -311,6 +350,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -320,6 +360,7 @@ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", @@ -337,6 +378,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -353,6 +395,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -369,6 +412,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -385,6 +429,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -401,6 +446,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -417,6 +463,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -433,6 +480,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -449,6 +497,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -465,6 +514,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -481,6 +531,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -497,6 +548,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -513,6 +565,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -529,6 +582,7 @@ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -545,6 +599,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -561,6 +616,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -577,6 +633,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -593,6 +650,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -609,6 +667,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -625,6 +684,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -641,6 +701,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -657,6 +718,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -673,6 +735,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -689,6 +752,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -702,6 +766,7 @@ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -717,6 +782,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -729,6 +795,7 @@ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -738,6 +805,7 @@ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.4", "debug": "^4.3.1", @@ -747,11 +815,22 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -775,6 +854,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -783,10 +863,11 @@ } }, "node_modules/@eslint/js": { - "version": "9.11.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.0.tgz", - "integrity": "sha512-LPkkenkDqyzTFauZLLAPhIb48fj6drrfMvRGSL9tS3AcZBSVTllemLSNyCvHNNL2t797S/6DJNSIwRwXgMO/eQ==", + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.1.tgz", + "integrity": "sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -796,6 +877,7 @@ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -805,6 +887,7 @@ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", "dev": true, + "license": "Apache-2.0", "dependencies": { "levn": "^0.4.1" }, @@ -817,6 +900,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -830,6 +914,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -843,6 +928,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -857,6 +943,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -866,6 +953,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -874,13 +962,15 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -891,6 +981,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -904,6 +995,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -913,6 +1005,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -921,209 +1014,245 @@ "node": ">= 8" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@remix-run/router": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz", + "integrity": "sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.23.0.tgz", + "integrity": "sha512-8OR+Ok3SGEMsAZispLx8jruuXw0HVF16k+ub2eNXKHDmdxL4cf9NlNpAzhlOhNyXzKDEJuFeq0nZm+XlNb1IFw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.23.0.tgz", + "integrity": "sha512-rEFtX1nP8gqmLmPZsXRMoLVNB5JBwOzIAk/XAcEPuKrPa2nPJ+DuGGpfQUR0XjRm8KjHfTZLpWbKXkA5BoFL3w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.23.0.tgz", + "integrity": "sha512-ZbqlMkJRMMPeapfaU4drYHns7Q5MIxjM/QeOO62qQZGPh9XWziap+NF9fsqPHT0KzEL6HaPspC7sOwpgyA3J9g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.23.0.tgz", + "integrity": "sha512-PfmgQp78xx5rBCgn2oYPQ1rQTtOaQCna0kRaBlc5w7RlA3TDGGo7m3XaptgitUZ54US9915i7KeVPHoy3/W8tA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.23.0.tgz", + "integrity": "sha512-WAeZfAAPus56eQgBioezXRRzArAjWJGjNo/M+BHZygUcs9EePIuGI1Wfc6U/Ki+tMW17FFGvhCfYnfcKPh18SA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.23.0.tgz", + "integrity": "sha512-v7PGcp1O5XKZxKX8phTXtmJDVpE20Ub1eF6w9iMmI3qrrPak6yR9/5eeq7ziLMrMTjppkkskXyxnmm00HdtXjA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.23.0.tgz", + "integrity": "sha512-nAbWsDZ9UkU6xQiXEyXBNHAKbzSAi95H3gTStJq9UGiS1v+YVXwRHcQOQEF/3CHuhX5BVhShKoeOf6Q/1M+Zhg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.23.0.tgz", + "integrity": "sha512-5QT/Di5FbGNPaVw8hHO1wETunwkPuZBIu6W+5GNArlKHD9fkMHy7vS8zGHJk38oObXfWdsuLMogD4sBySLJ54g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.23.0.tgz", + "integrity": "sha512-Sefl6vPyn5axzCsO13r1sHLcmPuiSOrKIImnq34CBurntcJ+lkQgAaTt/9JkgGmaZJ+OkaHmAJl4Bfd0DmdtOQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.23.0.tgz", + "integrity": "sha512-o4QI2KU/QbP7ZExMse6ULotdV3oJUYMrdx3rBZCgUF3ur3gJPfe8Fuasn6tia16c5kZBBw0aTmaUygad6VB/hQ==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.23.0.tgz", + "integrity": "sha512-+bxqx+V/D4FGrpXzPGKp/SEZIZ8cIW3K7wOtcJAoCrmXvzRtmdUhYNbgd+RztLzfDEfA2WtKj5F4tcbNPuqgeg==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.23.0.tgz", + "integrity": "sha512-I/eXsdVoCKtSgK9OwyQKPAfricWKUMNCwJKtatRYMmDo5N859tbO3UsBw5kT3dU1n6ZcM1JDzPRSGhAUkxfLxw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", - "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.23.0.tgz", + "integrity": "sha512-4ZoDZy5ShLbbe1KPSafbFh1vbl0asTVfkABC7eWqIs01+66ncM82YJxV2VtV3YVJTqq2P8HMx3DCoRSWB/N3rw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.23.0.tgz", + "integrity": "sha512-+5Ky8dhft4STaOEbZu3/NU4QIyYssKO+r1cD3FzuusA0vO5gso15on7qGzKdNXnc1gOrsgCqZjRw1w+zL4y4hQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.23.0.tgz", + "integrity": "sha512-0SPJk4cPZQhq9qA1UhIRumSE3+JJIBBjtlGl5PNC///BoaByckNZd53rOYD0glpTkYFBQSt7AkMeLVPfx65+BQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.23.0.tgz", + "integrity": "sha512-lqCK5GQC8fNo0+JvTSxcG7YB1UKYp8yrNLhsArlvPWN+16ovSZgoehlVHg6X0sSWPUkpjRBR5TuR12ZugowZ4g==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1134,6 +1263,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -1147,6 +1277,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } @@ -1156,6 +1287,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -1166,27 +1298,38 @@ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/prop-types": { "version": "15.7.13", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", - "dev": true + "devOptional": true, + "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.8.tgz", - "integrity": "sha512-syBUrW3/XpnW4WJ41Pft+I+aPoDVbrBVQGEnbD7NijDGlVC+8gV/XKRY+7vMDlfPpbwYt0l1vd/Sj8bJGMbs9Q==", - "dev": true, + "version": "18.3.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.10.tgz", + "integrity": "sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg==", + "devOptional": true, + "license": "MIT", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -1197,21 +1340,23 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dev": true, + "license": "MIT", "dependencies": { "@types/react": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.7.0.tgz", - "integrity": "sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.0.tgz", + "integrity": "sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.7.0", - "@typescript-eslint/type-utils": "8.7.0", - "@typescript-eslint/utils": "8.7.0", - "@typescript-eslint/visitor-keys": "8.7.0", + "@typescript-eslint/scope-manager": "8.8.0", + "@typescript-eslint/type-utils": "8.8.0", + "@typescript-eslint/utils": "8.8.0", + "@typescript-eslint/visitor-keys": "8.8.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -1235,15 +1380,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.7.0.tgz", - "integrity": "sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.0.tgz", + "integrity": "sha512-uEFUsgR+tl8GmzmLjRqz+VrDv4eoaMqMXW7ruXfgThaAShO9JTciKpEsB+TvnfFfbg5IpujgMXVV36gOJRLtZg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.7.0", - "@typescript-eslint/types": "8.7.0", - "@typescript-eslint/typescript-estree": "8.7.0", - "@typescript-eslint/visitor-keys": "8.7.0", + "@typescript-eslint/scope-manager": "8.8.0", + "@typescript-eslint/types": "8.8.0", + "@typescript-eslint/typescript-estree": "8.8.0", + "@typescript-eslint/visitor-keys": "8.8.0", "debug": "^4.3.4" }, "engines": { @@ -1263,13 +1409,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.7.0.tgz", - "integrity": "sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.0.tgz", + "integrity": "sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.7.0", - "@typescript-eslint/visitor-keys": "8.7.0" + "@typescript-eslint/types": "8.8.0", + "@typescript-eslint/visitor-keys": "8.8.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1280,13 +1427,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.7.0.tgz", - "integrity": "sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.0.tgz", + "integrity": "sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.7.0", - "@typescript-eslint/utils": "8.7.0", + "@typescript-eslint/typescript-estree": "8.8.0", + "@typescript-eslint/utils": "8.8.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -1304,10 +1452,11 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.7.0.tgz", - "integrity": "sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", + "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1317,13 +1466,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.7.0.tgz", - "integrity": "sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz", + "integrity": "sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.7.0", - "@typescript-eslint/visitor-keys": "8.7.0", + "@typescript-eslint/types": "8.8.0", + "@typescript-eslint/visitor-keys": "8.8.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -1349,6 +1499,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -1358,6 +1509,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1373,6 +1525,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -1381,15 +1534,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.7.0.tgz", - "integrity": "sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.0.tgz", + "integrity": "sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.7.0", - "@typescript-eslint/types": "8.7.0", - "@typescript-eslint/typescript-estree": "8.7.0" + "@typescript-eslint/scope-manager": "8.8.0", + "@typescript-eslint/types": "8.8.0", + "@typescript-eslint/typescript-estree": "8.8.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1403,12 +1557,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz", - "integrity": "sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.0.tgz", + "integrity": "sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/types": "8.8.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -1424,6 +1579,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -1432,14 +1588,15 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", - "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.2.tgz", + "integrity": "sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.24.5", - "@babel/plugin-transform-react-jsx-self": "^7.24.5", - "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@babel/core": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.2" }, @@ -1455,6 +1612,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1467,6 +1625,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -1476,6 +1635,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1492,6 +1652,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1501,6 +1662,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -1512,19 +1674,65 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bootstrap": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1535,6 +1743,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -1542,10 +1751,26 @@ "node": ">=8" } }, + "node_modules/broadcast-channel": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", + "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "dev": true, "funding": [ { @@ -1561,9 +1786,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", "node-releases": "^2.0.18", "update-browserslist-db": "^1.1.0" }, @@ -1579,14 +1805,15 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001663", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz", - "integrity": "sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==", + "version": "1.0.30001664", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz", + "integrity": "sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==", "dev": true, "funding": [ { @@ -1601,13 +1828,15 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1622,6 +1851,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -1630,25 +1860,40 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "license": "MIT" }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1662,13 +1907,15 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "devOptional": true, + "license": "MIT" }, "node_modules/debug": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -1685,13 +1932,30 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.27", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.27.tgz", - "integrity": "sha512-o37j1vZqCoEgBuWWXLHQgTN/KDKe7zwpiY5CPeq2RvUqOyJw9xnrULzZAEVQ5p4h+zjMk7hgtOoPdnLxr7m/jw==", - "dev": true + "version": "1.5.30", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.30.tgz", + "integrity": "sha512-sXI35EBN4lYxzc/pIGorlymYNzDBOqkSlVRe6MkgBsW/hW1tpC/HDJ2fjG7XnjakzfLEuvdmux0Mjs6jHq4UOA==", + "dev": true, + "license": "ISC" }, "node_modules/esbuild": { "version": "0.21.5", @@ -1699,6 +1963,7 @@ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -1736,6 +2001,7 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1745,25 +2011,30 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/eslint": { - "version": "9.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.0.tgz", - "integrity": "sha512-yVS6XODx+tMFMDFcG4+Hlh+qG7RM6cCJXtQhCKLSsr3XkLvWggHjCqjfh0XsPPnt1c56oaT6PMgW9XWQQjdHXA==", + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.1.tgz", + "integrity": "sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.11.0", + "@eslint/js": "9.11.1", "@eslint/plugin-kit": "^0.2.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -1813,6 +2084,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz", "integrity": "sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1825,15 +2097,17 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.12.tgz", "integrity": "sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg==", "dev": true, + "license": "MIT", "peerDependencies": { "eslint": ">=7" } }, "node_modules/eslint-scope": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", - "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -1846,10 +2120,11 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1862,6 +2137,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1877,6 +2153,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1893,6 +2170,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1904,13 +2182,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1923,6 +2203,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1932,6 +2213,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1940,14 +2222,15 @@ } }, "node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" + "eslint-visitor-keys": "^4.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1961,6 +2244,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -1973,6 +2257,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -1985,6 +2270,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -1994,6 +2280,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -2002,13 +2289,15 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2025,6 +2314,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -2036,19 +2326,22 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -2058,6 +2351,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" }, @@ -2070,6 +2364,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2082,6 +2377,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2098,6 +2394,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -2110,7 +2407,48 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", @@ -2118,6 +2456,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2131,15 +2470,38 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -2148,10 +2510,11 @@ } }, "node_modules/globals": { - "version": "15.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", - "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", + "version": "15.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.10.0.tgz", + "integrity": "sha512-tqFIbz83w4Y5TCbtgjZjApohbuh7K9BxGYFm7ifwDR240tvdb7P9x+/9VvUKlmkPoiknoJtanI8UOrqxS3a7lQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -2163,13 +2526,15 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -2179,6 +2544,7 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -2188,6 +2554,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2204,15 +2571,34 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2222,6 +2608,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -2234,6 +2621,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -2243,6 +2631,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2251,18 +2640,48 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/jotai": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.10.0.tgz", + "integrity": "sha512-8W4u0aRlOIwGlLQ0sqfl/c6+eExl5D8lZgAUolirZLktyaj4WnxO/8a0HEPmtriQAB6X5LMhXzZVmw02X0P0qQ==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=17.0.0", + "react": ">=17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -2275,6 +2694,7 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -2286,25 +2706,29 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -2317,6 +2741,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -2326,6 +2751,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -2339,6 +2765,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -2353,12 +2780,14 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -2371,15 +2800,27 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, + "node_modules/match-sorter": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz", + "integrity": "sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.8", + "remove-accents": "0.5.0" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -2389,6 +2830,7 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -2397,11 +2839,38 @@ "node": ">=8.6" } }, + "node_modules/microseconds": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==", + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2413,7 +2882,17 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", + "license": "ISC", + "dependencies": { + "big-integer": "^1.6.16" + } }, "node_modules/nanoid": { "version": "3.3.7", @@ -2426,6 +2905,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2437,19 +2917,2378 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/npm": { + "version": "10.8.3", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.8.3.tgz", + "integrity": "sha512-0IQlyAYvVtQ7uOhDFYZCGK8kkut2nh8cpAdA9E6FvRSJaTgtZRZgNjlC5ZCct//L73ygrpY93CxXpRJDtNqPVg==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/promise-spawn", + "@npmcli/redact", + "@npmcli/run-script", + "@sigstore/tuf", + "abbrev", + "archy", + "cacache", + "chalk", + "ci-info", + "cli-columns", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "ms", + "node-gyp", + "nopt", + "normalize-package-data", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "semver", + "spdx-expression-parse", + "ssri", + "supports-color", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "license": "Artistic-2.0", + "workspaces": [ + "docs", + "smoke-tests", + "mock-globals", + "mock-registry", + "workspaces/*" + ], + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^7.5.4", + "@npmcli/config": "^8.3.4", + "@npmcli/fs": "^3.1.1", + "@npmcli/map-workspaces": "^3.0.6", + "@npmcli/package-json": "^5.2.0", + "@npmcli/promise-spawn": "^7.0.2", + "@npmcli/redact": "^2.0.1", + "@npmcli/run-script": "^8.1.0", + "@sigstore/tuf": "^2.3.4", + "abbrev": "^2.0.0", + "archy": "~1.0.0", + "cacache": "^18.0.4", + "chalk": "^5.3.0", + "ci-info": "^4.0.0", + "cli-columns": "^4.0.0", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.3", + "glob": "^10.4.5", + "graceful-fs": "^4.2.11", + "hosted-git-info": "^7.0.2", + "ini": "^4.1.3", + "init-package-json": "^6.0.3", + "is-cidr": "^5.1.0", + "json-parse-even-better-errors": "^3.0.2", + "libnpmaccess": "^8.0.6", + "libnpmdiff": "^6.1.4", + "libnpmexec": "^8.1.4", + "libnpmfund": "^5.0.12", + "libnpmhook": "^10.0.5", + "libnpmorg": "^6.0.6", + "libnpmpack": "^7.0.4", + "libnpmpublish": "^9.0.9", + "libnpmsearch": "^7.0.6", + "libnpmteam": "^6.0.5", + "libnpmversion": "^6.0.3", + "make-fetch-happen": "^13.0.1", + "minimatch": "^9.0.5", + "minipass": "^7.1.1", + "minipass-pipeline": "^1.2.4", + "ms": "^2.1.2", + "node-gyp": "^10.2.0", + "nopt": "^7.2.1", + "normalize-package-data": "^6.0.2", + "npm-audit-report": "^5.0.0", + "npm-install-checks": "^6.3.0", + "npm-package-arg": "^11.0.3", + "npm-pick-manifest": "^9.1.0", + "npm-profile": "^10.0.0", + "npm-registry-fetch": "^17.1.0", + "npm-user-validate": "^2.0.1", + "p-map": "^4.0.0", + "pacote": "^18.0.6", + "parse-conflict-json": "^3.0.1", + "proc-log": "^4.2.0", + "qrcode-terminal": "^0.12.0", + "read": "^3.0.1", + "semver": "^7.6.3", + "spdx-expression-parse": "^4.0.0", + "ssri": "^10.0.6", + "supports-color": "^9.4.0", + "tar": "^6.2.1", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^5.0.1", + "which": "^4.0.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/agent": { + "version": "2.2.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "7.5.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.1", + "@npmcli/installed-package-contents": "^2.1.0", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^7.1.1", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.1.0", + "@npmcli/query": "^3.1.0", + "@npmcli/redact": "^2.0.0", + "@npmcli/run-script": "^8.1.0", + "bin-links": "^4.0.4", + "cacache": "^18.0.3", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^7.0.2", + "json-parse-even-better-errors": "^3.0.2", + "json-stringify-nice": "^1.1.4", + "lru-cache": "^10.2.2", + "minimatch": "^9.0.4", + "nopt": "^7.2.1", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^11.0.2", + "npm-pick-manifest": "^9.0.1", + "npm-registry-fetch": "^17.0.1", + "pacote": "^18.0.6", + "parse-conflict-json": "^3.0.0", + "proc-log": "^4.2.0", + "proggy": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^3.0.1", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.6", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/config": { + "version": "8.3.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/package-json": "^5.1.1", + "ci-info": "^4.0.0", + "ini": "^4.1.2", + "nopt": "^7.2.1", + "proc-log": "^4.2.0", + "semver": "^7.3.5", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/git": { + "version": "5.0.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^4.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "3.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "7.1.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^18.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^18.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "5.2.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^4.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "7.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "3.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/redact": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "8.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "proc-log": "^4.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "2.3.2", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/core": { + "version": "1.1.0", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.3.2", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "2.3.2", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^13.0.1", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/tuf": { + "version": "2.3.4", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^2.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/verify": { + "version": "1.2.1", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/models": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/abbrev": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/agent-base": { + "version": "7.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-styles": { + "version": "6.2.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/bin-links": { + "version": "4.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/binary-extensions": { + "version": "2.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/cacache": { + "version": "18.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/chalk": { + "version": "5.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ci-info": { + "version": "4.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cidr-regex": { + "version": "4.1.1", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^5.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "6.0.3", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/cross-spawn": { + "version": "7.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/debug": { + "version": "4.3.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/diff": { + "version": "5.2.0", + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/npm/node_modules/eastasianwidth": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/exponential-backoff": { + "version": "3.1.1", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/npm/node_modules/foreground-child": { + "version": "3.3.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/glob": { + "version": "10.4.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.11", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "7.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "7.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "7.0.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/ignore-walk": { + "version": "6.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ini": { + "version": "4.1.3", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "6.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/package-json": "^5.0.0", + "npm-package-arg": "^11.0.0", + "promzard": "^1.0.0", + "read": "^3.0.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/ip-address": { + "version": "9.0.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/npm/node_modules/ip-regex": { + "version": "5.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/is-cidr": { + "version": "5.1.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "^4.1.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/jackspeak": { + "version": "3.4.3", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/npm/node_modules/jsbn": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "6.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "8.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^11.0.2", + "npm-registry-fetch": "^17.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmdiff": { + "version": "6.1.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.5.4", + "@npmcli/installed-package-contents": "^2.1.0", + "binary-extensions": "^2.3.0", + "diff": "^5.1.0", + "minimatch": "^9.0.4", + "npm-package-arg": "^11.0.2", + "pacote": "^18.0.6", + "tar": "^6.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmexec": { + "version": "8.1.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.5.4", + "@npmcli/run-script": "^8.1.0", + "ci-info": "^4.0.0", + "npm-package-arg": "^11.0.2", + "pacote": "^18.0.6", + "proc-log": "^4.2.0", + "read": "^3.0.1", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmfund": { + "version": "5.0.12", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.5.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmhook": { + "version": "10.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^17.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmorg": { + "version": "6.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^17.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpack": { + "version": "7.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.5.4", + "@npmcli/run-script": "^8.1.0", + "npm-package-arg": "^11.0.2", + "pacote": "^18.0.6" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpublish": { + "version": "9.0.9", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ci-info": "^4.0.0", + "normalize-package-data": "^6.0.1", + "npm-package-arg": "^11.0.2", + "npm-registry-fetch": "^17.0.1", + "proc-log": "^4.2.0", + "semver": "^7.3.7", + "sigstore": "^2.2.0", + "ssri": "^10.0.6" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "7.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^17.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmteam": { + "version": "6.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^17.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "6.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.7", + "@npmcli/run-script": "^8.1.0", + "json-parse-even-better-errors": "^3.0.2", + "proc-log": "^4.2.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "10.4.3", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "13.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/minimatch": { + "version": "9.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/minipass": { + "version": "7.1.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-collect": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-fetch": { + "version": "3.0.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "10.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "7.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "6.0.2", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-bundled": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "6.3.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "11.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-packlist": { + "version": "8.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "9.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-profile": { + "version": "10.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^17.0.1", + "proc-log": "^4.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "17.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "2.0.1", + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/package-json-from-dist": { + "version": "1.0.0", + "inBundle": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/npm/node_modules/pacote": { + "version": "18.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^8.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/path-key": { + "version": "3.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/path-scurry": { + "version": "1.11.1", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/proc-log": { + "version": "4.2.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/proggy": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-call-limit": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/promzard": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "^3.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json-fast": { + "version": "3.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/npm/node_modules/semver": { + "version": "7.6.3", + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/shebang-command": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/shebang-regex": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/signal-exit": { + "version": "4.1.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/sigstore": { + "version": "2.3.1", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^2.3.2", + "@sigstore/tuf": "^2.3.4", + "@sigstore/verify": "^1.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks": { + "version": "2.8.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "8.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/spdx-correct": { + "version": "3.2.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.5.0", + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.18", + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/sprintf-js": { + "version": "1.1.3", + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/npm/node_modules/ssri": { + "version": "10.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/supports-color": { + "version": "9.4.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/npm/node_modules/tar": { + "version": "6.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js": { + "version": "2.2.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "2.0.1", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-filename": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-slug": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/walk-up-path": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/which": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/which/node_modules/isexe": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/npm/node_modules/wrap-ansi": { + "version": "8.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/oblivious-set": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==", + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -2467,6 +5306,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -2482,6 +5322,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -2497,6 +5338,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -2509,15 +5351,26 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2526,13 +5379,15 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -2559,6 +5414,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.0", @@ -2573,15 +5429,23 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2604,12 +5468,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -2621,6 +5487,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -2629,20 +5496,101 @@ "react": "^18.3.1" } }, + "node_modules/react-icons": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.3.0.tgz", + "integrity": "sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-query": { + "version": "3.39.3", + "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", + "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.2.tgz", + "integrity": "sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.19.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz", + "integrity": "sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.19.2", + "react-router": "6.26.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", + "license": "MIT" + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -2652,18 +5600,36 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/rollup": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", - "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", - "dev": true, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", "dependencies": { - "@types/estree": "1.0.5" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.23.0.tgz", + "integrity": "sha512-vXB4IT9/KLDrS2WRXmY22sVB2wTsTwkpxjB8Q3mnakTENcYw3FRmfdYDy/acNmls+lHmDazgrRjK/yQ6hQAtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -2673,22 +5639,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.4", - "@rollup/rollup-android-arm64": "4.22.4", - "@rollup/rollup-darwin-arm64": "4.22.4", - "@rollup/rollup-darwin-x64": "4.22.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", - "@rollup/rollup-linux-arm-musleabihf": "4.22.4", - "@rollup/rollup-linux-arm64-gnu": "4.22.4", - "@rollup/rollup-linux-arm64-musl": "4.22.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", - "@rollup/rollup-linux-riscv64-gnu": "4.22.4", - "@rollup/rollup-linux-s390x-gnu": "4.22.4", - "@rollup/rollup-linux-x64-gnu": "4.22.4", - "@rollup/rollup-linux-x64-musl": "4.22.4", - "@rollup/rollup-win32-arm64-msvc": "4.22.4", - "@rollup/rollup-win32-ia32-msvc": "4.22.4", - "@rollup/rollup-win32-x64-msvc": "4.22.4", + "@rollup/rollup-android-arm-eabi": "4.23.0", + "@rollup/rollup-android-arm64": "4.23.0", + "@rollup/rollup-darwin-arm64": "4.23.0", + "@rollup/rollup-darwin-x64": "4.23.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.23.0", + "@rollup/rollup-linux-arm-musleabihf": "4.23.0", + "@rollup/rollup-linux-arm64-gnu": "4.23.0", + "@rollup/rollup-linux-arm64-musl": "4.23.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.23.0", + "@rollup/rollup-linux-riscv64-gnu": "4.23.0", + "@rollup/rollup-linux-s390x-gnu": "4.23.0", + "@rollup/rollup-linux-x64-gnu": "4.23.0", + "@rollup/rollup-linux-x64-musl": "4.23.0", + "@rollup/rollup-win32-arm64-msvc": "4.23.0", + "@rollup/rollup-win32-ia32-msvc": "4.23.0", + "@rollup/rollup-win32-x64-msvc": "4.23.0", "fsevents": "~2.3.2" } }, @@ -2711,6 +5677,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -2719,6 +5686,7 @@ "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } @@ -2728,6 +5696,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -2737,6 +5706,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -2749,6 +5719,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2758,6 +5729,7 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -2767,6 +5739,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2779,6 +5752,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -2791,6 +5765,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -2802,13 +5777,15 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -2818,6 +5795,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -2830,6 +5808,7 @@ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -2842,6 +5821,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -2854,6 +5834,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2863,14 +5844,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.7.0.tgz", - "integrity": "sha512-nEHbEYJyHwsuf7c3V3RS7Saq+1+la3i0ieR3qP0yjqWSzVmh8Drp47uOl9LjbPANac4S7EFSqvcYIKXUUwIfIQ==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.8.0.tgz", + "integrity": "sha512-BjIT/VwJ8+0rVO01ZQ2ZVnjE1svFBiRczcpr1t1Yxt7sT25VSbPfrJtDsQ8uQTy2pilX5nI9gwxhUyLULNentw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.7.0", - "@typescript-eslint/parser": "8.7.0", - "@typescript-eslint/utils": "8.7.0" + "@typescript-eslint/eslint-plugin": "8.8.0", + "@typescript-eslint/parser": "8.8.0", + "@typescript-eslint/utils": "8.8.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2885,10 +5867,20 @@ } } }, + "node_modules/unload": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", + "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -2904,9 +5896,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -2920,15 +5913,17 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/vite": { - "version": "5.4.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.7.tgz", - "integrity": "sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==", + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", + "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -2988,6 +5983,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -3003,21 +5999,30 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, diff --git a/mybookmark.ui/package.json b/mybookmark.ui/package.json index 4369f6c..6659e45 100644 --- a/mybookmark.ui/package.json +++ b/mybookmark.ui/package.json @@ -10,8 +10,15 @@ "preview": "vite preview" }, "dependencies": { + "axios": "^1.7.7", + "bootstrap": "^5.3.3", + "jotai": "^2.10.0", + "npm": "^10.8.3", "react": "^18.3.1", - "react-dom": "^18.3.1" + "react-dom": "^18.3.1", + "react-icons": "^5.3.0", + "react-query": "^3.39.3", + "react-router-dom": "^6.26.2" }, "devDependencies": { "@eslint/js": "^9.9.0", diff --git a/mybookmark.ui/scss/custom.scss b/mybookmark.ui/scss/custom.scss new file mode 100644 index 0000000..74636a1 --- /dev/null +++ b/mybookmark.ui/scss/custom.scss @@ -0,0 +1,32 @@ +// @import "../node_modules/bootstrap/scss/functions"; + +// // // 2. Include any default variable overrides here + +@import "./themes/Cosmo/variables"; + +@import "../node_modules/bootstrap/scss/bootstrap"; +// @import "../node_modules/bootstrap/scss/variables"; +// @import "../node_modules/bootstrap/scss/variables-dark"; + +// @import "../node_modules/bootstrap/scss/mixins"; + +@import "./themes/Cosmo/bootswatch"; +// @import "../node_modules/bootstrap/scss/maps"; +// @import "../node_modules/bootstrap/scss/root"; + + + + +// @import "variables"; +// Then have Bootstrap do it's magic with these new values + +// $tertiary-bg-rgb: rgba(102, 102, 153, 1); +// $tertiary-bg-rgb: rgb(102 102 153 / 1); + +// $body-tertiary-color: rgba($body-color, .5) !default; +// $body-tertiary-bg: $gray-100 !default; + +// $body-tertiary-color: rgba(102, 102, 0, 1) !default; +// $body-tertiary-bg: rgba(0, 102, 153, 1) !default; + +// $white: #0000 !default; \ No newline at end of file diff --git a/mybookmark.ui/scss/themes/Cosmo/_bootswatch.scss b/mybookmark.ui/scss/themes/Cosmo/_bootswatch.scss new file mode 100644 index 0000000..ffea3d5 --- /dev/null +++ b/mybookmark.ui/scss/themes/Cosmo/_bootswatch.scss @@ -0,0 +1,35 @@ +// Cosmo 5.3.3 +// Bootswatch + + +// Variables + +$web-font-path: "https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;700&display=swap" !default; +@if $web-font-path { + @import url("#{$web-font-path}"); +} + +// Typography + +body { + -webkit-font-smoothing: antialiased; +} + +// Indicators + +.badge { + &.bg-light { + color: $dark; + } +} + +// Progress bars + +.progress { + @include box-shadow(none); + + .progress-bar { + font-size: 8px; + line-height: 8px; + } +} diff --git a/mybookmark.ui/scss/themes/Cosmo/_variables.scss b/mybookmark.ui/scss/themes/Cosmo/_variables.scss new file mode 100644 index 0000000..514e480 --- /dev/null +++ b/mybookmark.ui/scss/themes/Cosmo/_variables.scss @@ -0,0 +1,69 @@ +// Cosmo 5.3.3 +// Bootswatch + +$theme: "cosmo" !default; + +// +// Color system +// + +$white: #fff !default; +$gray-100: #f8f9fa !default; +$gray-200: #e9ecef !default; +$gray-300: #dee2e6 !default; +$gray-400: #ced4da !default; +$gray-500: #adb5bd !default; +$gray-600: #868e96 !default; +$gray-700: #495057 !default; +$gray-800: #373a3c !default; +$gray-900: #212529 !default; +$black: #000 !default; + +$blue: #2780e3 !default; +$indigo: #6610f2 !default; +$purple: #613d7c !default; +$pink: #e83e8c !default; +$red: #ff0039 !default; +$orange: #f0ad4e !default; +$yellow: #ff7518 !default; +$green: #3fb618 !default; +$teal: #20c997 !default; +$cyan: #9954bb !default; + +$primary: $blue !default; +$secondary: $gray-800 !default; +$success: $green !default; +$info: $cyan !default; +$warning: $yellow !default; +$danger: $red !default; +$light: $gray-100 !default; +$dark: $gray-800 !default; + +$min-contrast-ratio: 2.6 !default; + +// Options + +$enable-rounded: false !default; + +// Body + +$body-color: $gray-800 !default; + +// Fonts + +// stylelint-disable-next-line value-keyword-case +$font-family-sans-serif: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default; +$headings-font-weight: 400 !default; + +// Navbar + +$navbar-dark-hover-color: rgba($white, 1) !default; +$navbar-light-hover-color: rgba($black, .9) !default; + +// Alerts + +$alert-border-width: 0 !default; + +// Progress bars + +$progress-height: .5rem !default; diff --git a/mybookmark.ui/src/App.css b/mybookmark.ui/src/App.css index b9d355d..4f14531 100644 --- a/mybookmark.ui/src/App.css +++ b/mybookmark.ui/src/App.css @@ -1,8 +1,12 @@ +/*var*/ + + #root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; + /* max-width: 1280px; */ + /* margin: 0 auto; */ + /* padding: 2rem; */ + /* text-align: center; */ + --navbar-height: 3.5rem; } .logo { @@ -40,3 +44,64 @@ .read-the-docs { color: #888; } + +/* .menu{ + position: sticky; + display: inline-block; + vertical-align: top; + max-height: 100vh; + overflow-y: auto; + border-right: thick double red; + box-shadow: .5rem, 0, 0, DarkSlateGray; + height: 100%; + position: sticky important!; +} */ + +.fixed-navbar{ + position: sticky; + height: var(--navbar-height); + z-index: 1200; +} + +.fixed-sidebar{ + position: sticky; + top: var(--navbar-height); + /* left: 0; */ + /* width: 300px; */ + height: 100%; + /* background: #042331; */ + + /* overflow-x: hidden; */ + /* overflow-y: scroll; */ + /* border-right: thick double red; */ + /* box-shadow: .5rem, 0, 0, DarkSlateGray; */ + } + + .content { + /* position: sticky; */ + /* padding-top: var(--navbar-height); */ + /* height: calc(100% - var(--navbar-height)); */ + height: calc(100vh - var(--navbar-height)); + /* min-height: calc(100% - var(--navbar-height)); */ + min-height: calc(100vh - var(--navbar-height)); + display:inline-block; +} + +.progress-container:before { + content: attr(data-text); + position: absolute; + left: 0; + right: 0; + top: 0; + line-height:1rem; +} + +.progress-container { + text-align: center; + position: relative; + width: 100%; +} + +.rateStar { + /* background-image: url(./assets/thumbs_up_0i8ids3f6gah.svg); */ +} \ No newline at end of file diff --git a/mybookmark.ui/src/App.tsx b/mybookmark.ui/src/App.tsx index afe48ac..c39c9ea 100644 --- a/mybookmark.ui/src/App.tsx +++ b/mybookmark.ui/src/App.tsx @@ -1,35 +1,62 @@ -import { useState } from 'react' -import reactLogo from './assets/react.svg' -import viteLogo from '/vite.svg' +// import { useState } from 'react' +// import reactLogo from './assets/react.svg' +// import viteLogo from '/vite.svg' import './App.css' -function App() { - const [count, setCount] = useState(0) +// import 'bootstrap/dist/css/bootstrap.min.css' +// import './assets/css/custom.css' +// import './assets/scss/custom.scss' +// import 'bootstrap/dist/css/bootstrap.css'; +// import 'bootstrap/dist/js/bootstrap.js'; +// import './assets/css/custom.css' - return ( - <> - -

Vite + React

-
- -

- Edit src/App.tsx and save to test HMR -

-
-

- Click on the Vite and React logos to learn more -

- - ) +import HomePage from './pages/HomePage'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import Layout from './common/Layout'; +import { BrowserRouter, Route, Routes } from 'react-router-dom'; +import Dictionaries from './pages/library/edit/Dictionaries'; +import AdminLayout from './common/AdminLayout'; +import CreateAnimeTitle from './pages/library/edit/CreateAnimeTitle'; +import AnimeTitleDetail from './pages/library/anime/AnimeTitleDetail'; +import AnimeTitleEdit from './pages/library/edit/AnimeTitleEdit'; + +function App() { + //const [count, setCount] = useState(0) + return ( + + + + + + + + }> + } /> + + } /> + + {/* } /> */} + {/* } /> */} + + + + + + + }> + } /> + } /> + } /> + {/* } /> */} + {/* } /> */} + + {/* } /> */} + {/* } /> */} + + + ) } export default App diff --git a/mybookmark.ui/src/api/AnimeTitleApi.tsx b/mybookmark.ui/src/api/AnimeTitleApi.tsx new file mode 100644 index 0000000..639e611 --- /dev/null +++ b/mybookmark.ui/src/api/AnimeTitleApi.tsx @@ -0,0 +1,392 @@ +import axios from "axios"; +import { AnimeTitle, CreateDescriptionModel, CreateMediaInfoModel, CreateNameModel, DeleteDescriptionModel, DeleteMediaInfoModel, DeleteNameModel, EditDateModel, EditDescriptionModel, EditNameModel, RateDeleteModel, RateEditModel, TitleCreateModel } from "./models/Types"; +import { CatchError } from "./common"; + +const controllerUrl = 'https://localhost:7057/MediaContent/Anime/Title/'; + +export async function GetAnimeTitleList() { + try { + // const { data, status } = await axios.get>(`${controllerUrl}List`, + const { data } = await axios.get>(`${controllerUrl}List`, + { + headers: { + Accept: 'text/plain', + }, + }, + ); + + //console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + // console.log('response status is: ', status); + + return data; + } + catch (error) + { + CatchError(error); + } +} + +export async function GetAnimeTitleDetail(id: string) { + try { + // const { data, status } = await axios.get>(`${controllerUrl}List`, + const { data } = await axios.get(`${controllerUrl}?TitleId=${id}`, + { + headers: { + Accept: 'text/plain', + }, + }, + ); + + //console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + // console.log('response status is: ', status); + + return data; + } + catch (error) + { + CatchError(error); + } +} + + +export async function RateAnimeTitle(model: RateEditModel) { + try { + const axiosConfig = { + headers:{ + Accept: 'text/plain', + ContentType: 'application/json' + } + } + const { data, status } = await axios.post(`${controllerUrl}Rate`, model, axiosConfig); + return data; + } + catch (error) + { + CatchError(error); + } +} + +export async function UnrateAnimeTitle(model: RateDeleteModel) { + try { + const axiosConfig = { + headers:{ + Accept: 'text/plain', + ContentType: 'application/json' + } + } + const { data, status } = await axios.post(`${controllerUrl}Unrate`, model, axiosConfig); + return data; + } + catch (error) + { + CatchError(error); + } +} + + +export async function CreateAnimeTitle(model: TitleCreateModel) { + try { + // 👇️ const data: GetUsersResponse + // const { data, status } = await axios.post(`${controllerUrl}Create`, + // { + // // headers: { + // // // Accept: 'text/plain', + // // }, + // // body: model + // }, + // ); + const axiosConfig = { + headers:{ + Accept: 'text/plain', + ContentType: 'application/json' + } + } + const { data, status } = await axios.post(`${controllerUrl}Create`, model, axiosConfig); + + // console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + // console.log('response status is: ', status); + + return data; + } + catch (error) + { + CatchError(error); + } +} + + +//- - - - - - - - - - COMMON PROPERTIES - - - - - - - - - - +export async function CreateAnimeTitleName(model: CreateNameModel) { + try { + const axiosConfig = { + headers:{ + Accept: 'text/plain', + ContentType: 'application/json' + } + } + const { data, status } = await axios.post(`${controllerUrl}AddName`, model, axiosConfig); + + // console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + // console.log('response status is: ', status); + + return data; + } + catch (error) + { + CatchError(error); + } +} + +export async function EditAnimeTitleName(model: EditNameModel) { + try { + const axiosConfig = { + headers:{ + Accept: 'text/plain', + ContentType: 'application/json' + } + } + const { data, status } = await axios.post(`${controllerUrl}EditName`, model, axiosConfig); + + // console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + // console.log('response status is: ', status); + + return data; + } + catch (error) + { + CatchError(error); + } +} + +export async function DeleteAnimeTitleName(model: DeleteNameModel) { + try { + const axiosConfig = { + headers:{ + Accept: 'text/plain', + ContentType: 'application/json' + } + } + const { data, status } = await axios.post(`${controllerUrl}DeleteName`, model, axiosConfig); + + // console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + // console.log('response status is: ', status); + + return data; + } + catch (error) + { + CatchError(error); + } +} + + +export async function SetAnimeTitlePreview(model: CreateMediaInfoModel) { + try { + const axiosConfig = { + headers:{ + Accept: 'text/plain', + ContentType: 'application/json' + } + } + const { data, status } = await axios.post(`${controllerUrl}SetPreview`, model, axiosConfig); + + // console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + // console.log('response status is: ', status); + + return data; + } + catch (error) + { + CatchError(error); + } +} + +export async function ClearAnimeTitlePreview(model: DeleteMediaInfoModel) { + try { + const axiosConfig = { + headers:{ + Accept: 'text/plain', + ContentType: 'application/json' + } + } + const { data, status } = await axios.post(`${controllerUrl}ClearPreview`, model, axiosConfig); + + // console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + // console.log('response status is: ', status); + + return data; + } + catch (error) + { + CatchError(error); + } +} + + +export async function CreateAnimeTitleDescription(model: CreateDescriptionModel) { + try { + const axiosConfig = { + headers:{ + Accept: 'text/plain', + ContentType: 'application/json' + } + } + const { data, status } = await axios.post(`${controllerUrl}AddDescription`, model, axiosConfig); + + // console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + // console.log('response status is: ', status); + + return data; + } + catch (error) + { + CatchError(error); + } +} + +export async function EditAnimeTitleDescription(model: EditDescriptionModel) { + try { + const axiosConfig = { + headers:{ + Accept: 'text/plain', + ContentType: 'application/json' + } + } + const { data, status } = await axios.post(`${controllerUrl}EditDescription`, model, axiosConfig); + + // console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + // console.log('response status is: ', status); + + return data; + } + catch (error) + { + CatchError(error); + } +} + +export async function DeleteAnimeTitleDescription(model: DeleteDescriptionModel) { + try { + const axiosConfig = { + headers:{ + Accept: 'text/plain', + ContentType: 'application/json' + } + } + const { data, status } = await axios.post(`${controllerUrl}DeleteDescription`, model, axiosConfig); + + // console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + // console.log('response status is: ', status); + + return data; + } + catch (error) + { + CatchError(error); + } +} + + +export async function SetAnimeTitleAnnouncementDate(model: EditDateModel) { + try { + const axiosConfig = { + headers:{ + Accept: 'text/plain', + ContentType: 'application/json' + } + } + const { data, status } = await axios.post(`${controllerUrl}SetAnnouncementDate`, model, axiosConfig); + return data; + } + catch (error) + { + CatchError(error); + } +} + +export async function SetAnimeTitleEstimatedReleaseDate(model: EditDateModel) { + try { + const axiosConfig = { + headers:{ + Accept: 'text/plain', + ContentType: 'application/json' + } + } + const { data, status } = await axios.post(`${controllerUrl}SetEstimatedReleaseDate`, model, axiosConfig); + return data; + } + catch (error) + { + CatchError(error); + } +} + +export async function SetAnimeTitleReleaseDate(model: EditDateModel) { + try { + const axiosConfig = { + headers:{ + Accept: 'text/plain', + ContentType: 'application/json' + } + } + const { data, status } = await axios.post(`${controllerUrl}SetReleaseDate`, model, axiosConfig); + return data; + } + catch (error) + { + CatchError(error); + } +} + +// export async function EditGenre(id : string, value: string) { +// try { +// // 👇️ const data: GetUsersResponse +// const { data, status } = await axios.post>(`${controllerUrl}EditGenre?id=${id}&genreName=${value}`, +// { +// headers: { +// // Accept: 'text/plain', +// }, +// // body: {} +// }, +// ); + +// console.log(JSON.stringify(data, null, 4)); + +// // 👇️ "response status is: 200" +// console.log('response status is: ', status); + +// // return data; +// } catch (error) { +// if (axios.isAxiosError(error)) { +// console.log('error message: ', error.message); +// // return []; +// //return error.message; +// } else { +// console.log('unexpected error: ', error); +// // return []; +// //return 'An unexpected error occurred'; +// } +// } +// } diff --git a/mybookmark.ui/src/api/GenreApi.tsx b/mybookmark.ui/src/api/GenreApi.tsx new file mode 100644 index 0000000..f42c7be --- /dev/null +++ b/mybookmark.ui/src/api/GenreApi.tsx @@ -0,0 +1,108 @@ +import axios from "axios"; +import { Genre } from "./models/Types"; +import { CatchError } from "./common"; + +const controllerUrl = 'https://localhost:7057/Dictionaries/Genre/'; + +export async function GetGenreList() { + try { + // 👇️ const data: GetUsersResponse + // const { data, status } = await axios.get>(`${controllerUrl}GenreList`, + const { data, } = await axios.get>(`${controllerUrl}GenreList`, + { + headers: { + Accept: 'text/plain', + }, + }, + ); + + // console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + // console.log('response status is: ', status); + + return data; + } + catch (error) + { + CatchError(error); + } +} + +export async function CreateGenre(value: string) { + try { + // 👇️ const data: GetUsersResponse + // const { data, status } = await axios.post>(`${controllerUrl}CreateGenre?genreName=${value}`, + await axios.post(`${controllerUrl}CreateGenre?genreName=${value}`, + { + headers: { + // Accept: 'text/plain', + }, + // body: {} + }, + ); + + // console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + // console.log('response status is: ', status); + + // return data; + } + catch (error) + { + CatchError(error); + } +} + +export async function EditGenre(id : string, value: string) { + try { + // 👇️ const data: GetUsersResponse + const { status } = await axios.post(`${controllerUrl}EditGenre?id=${id}&genreName=${value}`, + { + headers: { + // Accept: 'text/plain', + }, + // body: {} + }, + ); + + //console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + console.log('response status is: ', status); + + // return Promise.resolve(); + // Promise.resolve(); + } + catch (error) + { + CatchError(error); + } +} + +export async function DeleteGenre(id : string) { + try { + // 👇️ const data: GetUsersResponse + const { status } = await axios.post(`${controllerUrl}DeleteGenre?id=${id}`, + { + headers: { + // Accept: 'text/plain', + }, + // body: {} + }, + ); + + //console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + console.log('response status is: ', status); + + // return Promise.resolve(); + // Promise.resolve(); + } + catch (error) + { + CatchError(error); + } +} \ No newline at end of file diff --git a/mybookmark.ui/src/api/LanguageApi.tsx b/mybookmark.ui/src/api/LanguageApi.tsx new file mode 100644 index 0000000..e128ad1 --- /dev/null +++ b/mybookmark.ui/src/api/LanguageApi.tsx @@ -0,0 +1,109 @@ +import axios from "axios"; +import { Language } from "./models/Types"; +import { CatchError } from "./common"; + +const controllerUrl = 'https://localhost:7057/Dictionaries/Language/'; + +export async function GetLanguageList() { + try { + // 👇️ const data: GetUsersResponse + // const { data, status } = await axios.get>(`${controllerUrl}List`, + const { data} = await axios.get>(`${controllerUrl}List`, + { + headers: { + Accept: 'text/plain', + }, + }, + ); + + // console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + // console.log('response status is: ', status); + + return data; + } + catch (error) + { + CatchError(error); + } +} + +export async function CreateLanguage(codeIso3: string, name: string) { + try { + // 👇️ const data: GetUsersResponse + // const { data, status } = await axios.post>(`${controllerUrl}CreateGenre?genreName=${value}`, + await axios.post(`${controllerUrl}Create?codeIso3=${codeIso3}&name=${name}`, + { + headers: { + // Accept: 'text/plain', + }, + // body: {} + }, + ); + + // console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + // console.log('response status is: ', status); + + // return data; + } + catch (error) + { + CatchError(error); + } +} + +export async function EditLanguage(id : string, codeIso3: string, name: string) { + try { + // 👇️ const data: GetUsersResponse + // const { status } = await axios.post(`${controllerUrl}Edit?id=${id}&codeIso3=${codeIso3}&name=${name}`, + await axios.post(`${controllerUrl}Edit?id=${id}&codeIso3=${codeIso3}&name=${name}`, + { + headers: { + // Accept: 'text/plain', + }, + // body: {} + }, + ); + + //console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + // console.log('response status is: ', status); + + // return Promise.resolve(); + // Promise.resolve(); + } + catch (error) + { + CatchError(error); + } +} + +export async function DeleteLanguage(id : string) { + try { + // 👇️ const data: GetUsersResponse + const { status } = await axios.post(`${controllerUrl}Delete?id=${id}`, + { + headers: { + // Accept: 'text/plain', + }, + // body: {} + }, + ); + + //console.log(JSON.stringify(data, null, 4)); + + // 👇️ "response status is: 200" + console.log('response status is: ', status); + + // return Promise.resolve(); + // Promise.resolve(); + } + catch (error) + { + CatchError(error); + } +} \ No newline at end of file diff --git a/mybookmark.ui/src/api/common.tsx b/mybookmark.ui/src/api/common.tsx new file mode 100644 index 0000000..0f7e9ae --- /dev/null +++ b/mybookmark.ui/src/api/common.tsx @@ -0,0 +1,14 @@ +import axios, { AxiosError } from "axios"; +import { ProblemDetails } from "./models/Types"; + +export function CatchError(error: unknown){ + if (axios.isAxiosError(error)) { + console.error('error message: ', error.message); + const problemDetails = (error as AxiosError)?.response?.data as ProblemDetails; + if (problemDetails?.title) throw new Error(problemDetails.title); + } + console.error('unexpected error: ', error); + // return []; + //return 'An unexpected error occurred'; + throw new Error(`unexpected error: ${(error as Error)?.message ?? JSON.stringify(error, null, 4)}`); +} \ No newline at end of file diff --git a/mybookmark.ui/src/api/models/Types.tsx b/mybookmark.ui/src/api/models/Types.tsx new file mode 100644 index 0000000..eca96c6 --- /dev/null +++ b/mybookmark.ui/src/api/models/Types.tsx @@ -0,0 +1,193 @@ +export type Entity = { + id : string, + deleted: boolean, +}; + +export enum MediaInfoType +{ + Image, + Video, + Link, + OtherFile +} + +export type MediaInfo = { + type: MediaInfoType, + contentType: string, + url: string, +} + +export type Language = { + codeIso3: string, + name: string, + icon?: MediaInfo, +} & Entity + +export type Genre = { + name: string, +} & Entity + +export enum NameType +{ + Original, + OriginalInAnotherLanguage, + Translation, + Abbreviation, +} + +export type NameItem = { + value: string, + type: NameType, + language: Language, +} + +export type Description = { + value: string, + isOriginal: boolean, + language: Language, +} + +export type GenreProportion = { + proportion: number, + genre: Genre, +} + +export type CommonProperties = { + names: Array, + preview?: MediaInfo, + descriptions: Array, + genres: Array, + relatedContent: Array, + // announcementDate?: string | Date | null, + announcementDate?: string | null, + // estimatedReleaseDate?: Date | null, + estimatedReleaseDate?: string | null, + // releaseDate?: Date | null, + releaseDate?: string | null, +} + +export type AnimeItem = { + completed: boolean, + commonProperties: CommonProperties, + number?: number, + order: number, + expirationTime: Date, +} & Entity + +export enum AnimeEpisodeType +{ + Regilar, + FullLength, + Ova, +} + +export type Episode = { + variant: number, + type: AnimeEpisodeType, + duration: Date, +} & AnimeItem + +export type Season = { + episodes: Array, + director?: string, + originCountry?: string, +} & AnimeItem + +export type AnimeTitle = { + commonProperties: CommonProperties, + rate?: number, + myRate?: number, + seasons: Array, + episodes: Array, + completed: boolean, + episodesInsideSeasonsCount: number, + expirationTime: Date, +} & Entity + +export type ProblemDetails = { + type?: string, + title?: string, + status?: number, + detail?: string, + instance?: string, + extensions: Map +} + +/* POST Models */ + +export type TitleCreateModel = { + originalName: CreateNameModel, + preview?: MediaInfo | null +} + +export type CreateNameModel = { + animeTitleId?: string | null, + animeSeasonId?: string | null, + animeEpisodeId?: string | null, + languageId: string, + value: string, + type: NameType +} + +export type EditNameModel = { + newLanguageId?: string | null, + newValue?: string | null, +} & CreateNameModel + +export type DeleteNameModel = { } & CreateNameModel + + + +export type CreateDescriptionModel = { + animeTitleId?: string | null, + animeSeasonId?: string | null, + animeEpisodeId?: string | null, + languageId: string, + value: string, + isOriginal: boolean +} + +export type EditDescriptionModel = { + newLanguageId?: string | null, + newValue?: string | null, +} & CreateDescriptionModel + +export type DeleteDescriptionModel = { } & CreateDescriptionModel + +export type CreateMediaInfoModel = { + animeTitleId?: string | null, + animeSeasonId?: string | null, + animeEpisodeId?: string | null, + type: MediaInfoType, + url: string, + contentType: string +} + +export type EditMediaInfoModel = { + type?: MediaInfoType | null, + url?: string | null, + contentType?: string | null, +} & CreateMediaInfoModel + +export type DeleteMediaInfoModel = { } & CreateMediaInfoModel + + +export type EditDateModel = { + animeTitleId?: string | null, + animeSeasonId?: string | null, + animeEpisodeId?: string | null, + value?: Date | null, +} + +export type RateEditModel = { + animeTitleId?: string | null, + animeSeasonId?: string | null, + animeEpisodeId?: string | null, + ratePercentage: number, +} + +export type RateDeleteModel = { + animeTitleId?: string | null, + animeSeasonId?: string | null, + animeEpisodeId?: string | null, +} \ No newline at end of file diff --git a/mybookmark.ui/src/routes.tsx b/mybookmark.ui/src/api/routes.tsx similarity index 87% rename from mybookmark.ui/src/routes.tsx rename to mybookmark.ui/src/api/routes.tsx index b92a486..a395197 100644 --- a/mybookmark.ui/src/routes.tsx +++ b/mybookmark.ui/src/api/routes.tsx @@ -1,5 +1,7 @@ //API Urls +export const baseUrl = 'https://localhost:7057'; + export const apiUrls = { auth: "/auth/v1/", product: "/customerapi/v1/Product", diff --git a/mybookmark.ui/src/assets/css/custom.css b/mybookmark.ui/src/assets/css/custom.css new file mode 100644 index 0000000..89075e2 --- /dev/null +++ b/mybookmark.ui/src/assets/css/custom.css @@ -0,0 +1,11584 @@ +@charset "UTF-8"; +/*! + * Bootstrap v5.3.3 (https://getbootstrap.com/) + * Copyright 2011-2024 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +@import url("https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;700&display=swap"); +:root, +[data-bs-theme=light] { + --bs-blue: #2780e3; + --bs-indigo: #6610f2; + --bs-purple: #613d7c; + --bs-pink: #e83e8c; + --bs-red: #ff0039; + --bs-orange: #f0ad4e; + --bs-yellow: #ff7518; + --bs-green: #3fb618; + --bs-teal: #20c997; + --bs-cyan: #9954bb; + --bs-black: #000; + --bs-white: #fff; + --bs-gray: #868e96; + --bs-gray-dark: #373a3c; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #e9ecef; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #868e96; + --bs-gray-700: #495057; + --bs-gray-800: #373a3c; + --bs-gray-900: #212529; + --bs-primary: #2780e3; + --bs-secondary: #373a3c; + --bs-success: #3fb618; + --bs-info: #9954bb; + --bs-warning: #ff7518; + --bs-danger: #ff0039; + --bs-light: #f8f9fa; + --bs-dark: #373a3c; + --bs-primary-rgb: 39, 128, 227; + --bs-secondary-rgb: 55, 58, 60; + --bs-success-rgb: 63, 182, 24; + --bs-info-rgb: 153, 84, 187; + --bs-warning-rgb: 255, 117, 24; + --bs-danger-rgb: 255, 0, 57; + --bs-light-rgb: 248, 249, 250; + --bs-dark-rgb: 55, 58, 60; + --bs-primary-text-emphasis: rgb(15.6, 51.2, 90.8); + --bs-secondary-text-emphasis: rgb(22, 23.2, 24); + --bs-success-text-emphasis: rgb(25.2, 72.8, 9.6); + --bs-info-text-emphasis: rgb(61.2, 33.6, 74.8); + --bs-warning-text-emphasis: rgb(102, 46.8, 9.6); + --bs-danger-text-emphasis: rgb(102, 0, 22.8); + --bs-light-text-emphasis: #495057; + --bs-dark-text-emphasis: #495057; + --bs-primary-bg-subtle: rgb(211.8, 229.6, 249.4); + --bs-secondary-bg-subtle: rgb(215, 215.6, 216); + --bs-success-bg-subtle: rgb(216.6, 240.4, 208.8); + --bs-info-bg-subtle: rgb(234.6, 220.8, 241.4); + --bs-warning-bg-subtle: rgb(255, 227.4, 208.8); + --bs-danger-bg-subtle: rgb(255, 204, 215.4); + --bs-light-bg-subtle: rgb(251.5, 252, 252.5); + --bs-dark-bg-subtle: #ced4da; + --bs-primary-border-subtle: rgb(168.6, 204.2, 243.8); + --bs-secondary-border-subtle: rgb(175, 176.2, 177); + --bs-success-border-subtle: rgb(178.2, 225.8, 162.6); + --bs-info-border-subtle: rgb(214.2, 186.6, 227.8); + --bs-warning-border-subtle: rgb(255, 199.8, 162.6); + --bs-danger-border-subtle: rgb(255, 153, 175.8); + --bs-light-border-subtle: #e9ecef; + --bs-dark-border-subtle: #adb5bd; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-font-sans-serif: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); + --bs-body-font-family: var(--bs-font-sans-serif); + --bs-body-font-size: 1rem; + --bs-body-font-weight: 400; + --bs-body-line-height: 1.5; + --bs-body-color: #373a3c; + --bs-body-color-rgb: 55, 58, 60; + --bs-body-bg: #fff; + --bs-body-bg-rgb: 255, 255, 255; + --bs-emphasis-color: #000; + --bs-emphasis-color-rgb: 0, 0, 0; + --bs-secondary-color: rgba(55, 58, 60, 0.75); + --bs-secondary-color-rgb: 55, 58, 60; + --bs-secondary-bg: #e9ecef; + --bs-secondary-bg-rgb: 233, 236, 239; + --bs-tertiary-color: rgba(55, 58, 60, 0.5); + --bs-tertiary-color-rgb: 55, 58, 60; + --bs-tertiary-bg: #f8f9fa; + --bs-tertiary-bg-rgb: 248, 249, 250; + --bs-heading-color: inherit; + --bs-link-color: #2780e3; + --bs-link-color-rgb: 39, 128, 227; + --bs-link-decoration: underline; + --bs-link-hover-color: rgb(31.2, 102.4, 181.6); + --bs-link-hover-color-rgb: 31, 102, 182; + --bs-code-color: #e83e8c; + --bs-highlight-color: #373a3c; + --bs-highlight-bg: rgb(255, 227.4, 208.8); + --bs-border-width: 1px; + --bs-border-style: solid; + --bs-border-color: #dee2e6; + --bs-border-color-translucent: rgba(0, 0, 0, 0.175); + --bs-border-radius: 0.375rem; + --bs-border-radius-sm: 0.25rem; + --bs-border-radius-lg: 0.5rem; + --bs-border-radius-xl: 1rem; + --bs-border-radius-xxl: 2rem; + --bs-border-radius-2xl: var(--bs-border-radius-xxl); + --bs-border-radius-pill: 50rem; + --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); + --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075); + --bs-focus-ring-width: 0.25rem; + --bs-focus-ring-opacity: 0.25; + --bs-focus-ring-color: rgba(39, 128, 227, 0.25); + --bs-form-valid-color: #3fb618; + --bs-form-valid-border-color: #3fb618; + --bs-form-invalid-color: #ff0039; + --bs-form-invalid-border-color: #ff0039; +} + +[data-bs-theme=dark] { + color-scheme: dark; + --bs-body-color: #dee2e6; + --bs-body-color-rgb: 222, 226, 230; + --bs-body-bg: #212529; + --bs-body-bg-rgb: 33, 37, 41; + --bs-emphasis-color: #fff; + --bs-emphasis-color-rgb: 255, 255, 255; + --bs-secondary-color: rgba(222, 226, 230, 0.75); + --bs-secondary-color-rgb: 222, 226, 230; + --bs-secondary-bg: #373a3c; + --bs-secondary-bg-rgb: 55, 58, 60; + --bs-tertiary-color: rgba(222, 226, 230, 0.5); + --bs-tertiary-color-rgb: 222, 226, 230; + --bs-tertiary-bg: rgb(44, 47.5, 50.5); + --bs-tertiary-bg-rgb: 44, 48, 51; + --bs-primary-text-emphasis: rgb(125.4, 178.8, 238.2); + --bs-secondary-text-emphasis: rgb(135, 136.8, 138); + --bs-success-text-emphasis: rgb(139.8, 211.2, 116.4); + --bs-info-text-emphasis: rgb(193.8, 152.4, 214.2); + --bs-warning-text-emphasis: rgb(255, 172.2, 116.4); + --bs-danger-text-emphasis: rgb(255, 102, 136.2); + --bs-light-text-emphasis: #f8f9fa; + --bs-dark-text-emphasis: #dee2e6; + --bs-primary-bg-subtle: rgb(7.8, 25.6, 45.4); + --bs-secondary-bg-subtle: rgb(11, 11.6, 12); + --bs-success-bg-subtle: rgb(12.6, 36.4, 4.8); + --bs-info-bg-subtle: rgb(30.6, 16.8, 37.4); + --bs-warning-bg-subtle: rgb(51, 23.4, 4.8); + --bs-danger-bg-subtle: rgb(51, 0, 11.4); + --bs-light-bg-subtle: #373a3c; + --bs-dark-bg-subtle: rgb(27.5, 29, 30); + --bs-primary-border-subtle: rgb(23.4, 76.8, 136.2); + --bs-secondary-border-subtle: rgb(33, 34.8, 36); + --bs-success-border-subtle: rgb(37.8, 109.2, 14.4); + --bs-info-border-subtle: rgb(91.8, 50.4, 112.2); + --bs-warning-border-subtle: rgb(153, 70.2, 14.4); + --bs-danger-border-subtle: rgb(153, 0, 34.2); + --bs-light-border-subtle: #495057; + --bs-dark-border-subtle: #373a3c; + --bs-heading-color: inherit; + --bs-link-color: rgb(125.4, 178.8, 238.2); + --bs-link-hover-color: rgb(151.32, 194.04, 241.56); + --bs-link-color-rgb: 125, 179, 238; + --bs-link-hover-color-rgb: 151, 194, 242; + --bs-code-color: rgb(241.2, 139.2, 186); + --bs-highlight-color: #dee2e6; + --bs-highlight-bg: rgb(102, 46.8, 9.6); + --bs-border-color: #495057; + --bs-border-color-translucent: rgba(255, 255, 255, 0.15); + --bs-form-valid-color: rgb(139.8, 211.2, 116.4); + --bs-form-valid-border-color: rgb(139.8, 211.2, 116.4); + --bs-form-invalid-color: rgb(255, 102, 136.2); + --bs-form-invalid-border-color: rgb(255, 102, 136.2); +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +@media (prefers-reduced-motion: no-preference) { + :root { + scroll-behavior: smooth; + } +} + +body { + margin: 0; + font-family: var(--bs-body-font-family); + font-size: var(--bs-body-font-size); + font-weight: var(--bs-body-font-weight); + line-height: var(--bs-body-line-height); + color: var(--bs-body-color); + text-align: var(--bs-body-text-align); + background-color: var(--bs-body-bg); + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +hr { + margin: 1rem 0; + color: inherit; + border: 0; + border-top: var(--bs-border-width) solid; + opacity: 0.25; +} + +h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 { + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 400; + line-height: 1.2; + color: var(--bs-heading-color); +} + +h1, .h1 { + font-size: calc(1.375rem + 1.5vw); +} +@media (min-width: 1200px) { + h1, .h1 { + font-size: 2.5rem; + } +} + +h2, .h2 { + font-size: calc(1.325rem + 0.9vw); +} +@media (min-width: 1200px) { + h2, .h2 { + font-size: 2rem; + } +} + +h3, .h3 { + font-size: calc(1.3rem + 0.6vw); +} +@media (min-width: 1200px) { + h3, .h3 { + font-size: 1.75rem; + } +} + +h4, .h4 { + font-size: calc(1.275rem + 0.3vw); +} +@media (min-width: 1200px) { + h4, .h4 { + font-size: 1.5rem; + } +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title] { + text-decoration: underline dotted; + cursor: help; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul { + padding-left: 2rem; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: 0.5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small, .small { + font-size: 0.875em; +} + +mark, .mark { + padding: 0.1875em; + color: var(--bs-highlight-color); + background-color: var(--bs-highlight-bg); +} + +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +a { + color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); + text-decoration: underline; +} +a:hover { + --bs-link-color-rgb: var(--bs-link-hover-color-rgb); +} + +a:not([href]):not([class]), a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} + +pre, +code, +kbd, +samp { + font-family: var(--bs-font-monospace); + font-size: 1em; +} + +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: 0.875em; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +code { + font-size: 0.875em; + color: var(--bs-code-color); + word-wrap: break-word; +} +a > code { + color: inherit; +} + +kbd { + padding: 0.1875rem 0.375rem; + font-size: 0.875em; + color: var(--bs-body-bg); + background-color: var(--bs-body-color); +} +kbd kbd { + padding: 0; + font-size: 1em; +} + +figure { + margin: 0 0 1rem; +} + +img, +svg { + vertical-align: middle; +} + +table { + caption-side: bottom; + border-collapse: collapse; +} + +caption { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: var(--bs-secondary-color); + text-align: left; +} + +th { + text-align: inherit; + text-align: -webkit-match-parent; +} + +thead, +tbody, +tfoot, +tr, +td, +th { + border-color: inherit; + border-style: solid; + border-width: 0; +} + +label { + display: inline-block; +} + +button { + border-radius: 0; +} + +button:focus:not(:focus-visible) { + outline: 0; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +select { + text-transform: none; +} + +[role=button] { + cursor: pointer; +} + +select { + word-wrap: normal; +} +select:disabled { + opacity: 1; +} + +[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator { + display: none !important; +} + +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} +button:not(:disabled), +[type=button]:not(:disabled), +[type=reset]:not(:disabled), +[type=submit]:not(:disabled) { + cursor: pointer; +} + +::-moz-focus-inner { + padding: 0; + border-style: none; +} + +textarea { + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + float: left; + width: 100%; + padding: 0; + margin-bottom: 0.5rem; + font-size: calc(1.275rem + 0.3vw); + line-height: inherit; +} +@media (min-width: 1200px) { + legend { + font-size: 1.5rem; + } +} +legend + * { + clear: left; +} + +::-webkit-datetime-edit-fields-wrapper, +::-webkit-datetime-edit-text, +::-webkit-datetime-edit-minute, +::-webkit-datetime-edit-hour-field, +::-webkit-datetime-edit-day-field, +::-webkit-datetime-edit-month-field, +::-webkit-datetime-edit-year-field { + padding: 0; +} + +::-webkit-inner-spin-button { + height: auto; +} + +[type=search] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +/* rtl:raw: +[type="tel"], +[type="url"], +[type="email"], +[type="number"] { + direction: ltr; +} +*/ +::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-color-swatch-wrapper { + padding: 0; +} + +::file-selector-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +iframe { + border: 0; +} + +summary { + display: list-item; + cursor: pointer; +} + +progress { + vertical-align: baseline; +} + +[hidden] { + display: none !important; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: calc(1.625rem + 4.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-1 { + font-size: 5rem; + } +} + +.display-2 { + font-size: calc(1.575rem + 3.9vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-2 { + font-size: 4.5rem; + } +} + +.display-3 { + font-size: calc(1.525rem + 3.3vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-3 { + font-size: 4rem; + } +} + +.display-4 { + font-size: calc(1.475rem + 2.7vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-4 { + font-size: 3.5rem; + } +} + +.display-5 { + font-size: calc(1.425rem + 2.1vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-5 { + font-size: 3rem; + } +} + +.display-6 { + font-size: calc(1.375rem + 1.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-6 { + font-size: 2.5rem; + } +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 0.875em; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} +.blockquote > :last-child { + margin-bottom: 0; +} + +.blockquote-footer { + margin-top: -1rem; + margin-bottom: 1rem; + font-size: 0.875em; + color: #868e96; +} +.blockquote-footer::before { + content: "— "; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: var(--bs-body-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 0.875em; + color: var(--bs-secondary-color); +} + +.container, +.container-fluid, +.container-xxl, +.container-xl, +.container-lg, +.container-md, +.container-sm { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container-sm, .container { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container-md, .container-sm, .container { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container-lg, .container-md, .container-sm, .container { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1140px; + } +} +@media (min-width: 1400px) { + .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1320px; + } +} +:root { + --bs-breakpoint-xs: 0; + --bs-breakpoint-sm: 576px; + --bs-breakpoint-md: 768px; + --bs-breakpoint-lg: 992px; + --bs-breakpoint-xl: 1200px; + --bs-breakpoint-xxl: 1400px; +} + +.row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(-1 * var(--bs-gutter-y)); + margin-right: calc(-0.5 * var(--bs-gutter-x)); + margin-left: calc(-0.5 * var(--bs-gutter-x)); +} +.row > * { + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-top: var(--bs-gutter-y); +} + +.col { + flex: 1 0 0%; +} + +.row-cols-auto > * { + flex: 0 0 auto; + width: auto; +} + +.row-cols-1 > * { + flex: 0 0 auto; + width: 100%; +} + +.row-cols-2 > * { + flex: 0 0 auto; + width: 50%; +} + +.row-cols-3 > * { + flex: 0 0 auto; + width: 33.33333333%; +} + +.row-cols-4 > * { + flex: 0 0 auto; + width: 25%; +} + +.row-cols-5 > * { + flex: 0 0 auto; + width: 20%; +} + +.row-cols-6 > * { + flex: 0 0 auto; + width: 16.66666667%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; +} + +.col-1 { + flex: 0 0 auto; + width: 8.33333333%; +} + +.col-2 { + flex: 0 0 auto; + width: 16.66666667%; +} + +.col-3 { + flex: 0 0 auto; + width: 25%; +} + +.col-4 { + flex: 0 0 auto; + width: 33.33333333%; +} + +.col-5 { + flex: 0 0 auto; + width: 41.66666667%; +} + +.col-6 { + flex: 0 0 auto; + width: 50%; +} + +.col-7 { + flex: 0 0 auto; + width: 58.33333333%; +} + +.col-8 { + flex: 0 0 auto; + width: 66.66666667%; +} + +.col-9 { + flex: 0 0 auto; + width: 75%; +} + +.col-10 { + flex: 0 0 auto; + width: 83.33333333%; +} + +.col-11 { + flex: 0 0 auto; + width: 91.66666667%; +} + +.col-12 { + flex: 0 0 auto; + width: 100%; +} + +.offset-1 { + margin-left: 8.33333333%; +} + +.offset-2 { + margin-left: 16.66666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.33333333%; +} + +.offset-5 { + margin-left: 41.66666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.33333333%; +} + +.offset-8 { + margin-left: 66.66666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.33333333%; +} + +.offset-11 { + margin-left: 91.66666667%; +} + +.g-0, +.gx-0 { + --bs-gutter-x: 0; +} + +.g-0, +.gy-0 { + --bs-gutter-y: 0; +} + +.g-1, +.gx-1 { + --bs-gutter-x: 0.25rem; +} + +.g-1, +.gy-1 { + --bs-gutter-y: 0.25rem; +} + +.g-2, +.gx-2 { + --bs-gutter-x: 0.5rem; +} + +.g-2, +.gy-2 { + --bs-gutter-y: 0.5rem; +} + +.g-3, +.gx-3 { + --bs-gutter-x: 1rem; +} + +.g-3, +.gy-3 { + --bs-gutter-y: 1rem; +} + +.g-4, +.gx-4 { + --bs-gutter-x: 1.5rem; +} + +.g-4, +.gy-4 { + --bs-gutter-y: 1.5rem; +} + +.g-5, +.gx-5 { + --bs-gutter-x: 3rem; +} + +.g-5, +.gy-5 { + --bs-gutter-y: 3rem; +} + +@media (min-width: 576px) { + .col-sm { + flex: 1 0 0%; + } + .row-cols-sm-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-sm-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-sm-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-sm-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-sm-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-sm-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-sm-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-sm-auto { + flex: 0 0 auto; + width: auto; + } + .col-sm-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-sm-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-sm-3 { + flex: 0 0 auto; + width: 25%; + } + .col-sm-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-sm-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-sm-6 { + flex: 0 0 auto; + width: 50%; + } + .col-sm-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-sm-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-sm-9 { + flex: 0 0 auto; + width: 75%; + } + .col-sm-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-sm-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-sm-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.33333333%; + } + .offset-sm-2 { + margin-left: 16.66666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.33333333%; + } + .offset-sm-5 { + margin-left: 41.66666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.33333333%; + } + .offset-sm-8 { + margin-left: 66.66666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.33333333%; + } + .offset-sm-11 { + margin-left: 91.66666667%; + } + .g-sm-0, + .gx-sm-0 { + --bs-gutter-x: 0; + } + .g-sm-0, + .gy-sm-0 { + --bs-gutter-y: 0; + } + .g-sm-1, + .gx-sm-1 { + --bs-gutter-x: 0.25rem; + } + .g-sm-1, + .gy-sm-1 { + --bs-gutter-y: 0.25rem; + } + .g-sm-2, + .gx-sm-2 { + --bs-gutter-x: 0.5rem; + } + .g-sm-2, + .gy-sm-2 { + --bs-gutter-y: 0.5rem; + } + .g-sm-3, + .gx-sm-3 { + --bs-gutter-x: 1rem; + } + .g-sm-3, + .gy-sm-3 { + --bs-gutter-y: 1rem; + } + .g-sm-4, + .gx-sm-4 { + --bs-gutter-x: 1.5rem; + } + .g-sm-4, + .gy-sm-4 { + --bs-gutter-y: 1.5rem; + } + .g-sm-5, + .gx-sm-5 { + --bs-gutter-x: 3rem; + } + .g-sm-5, + .gy-sm-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 768px) { + .col-md { + flex: 1 0 0%; + } + .row-cols-md-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-md-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-md-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-md-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-md-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-md-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-md-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-md-auto { + flex: 0 0 auto; + width: auto; + } + .col-md-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-md-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-md-3 { + flex: 0 0 auto; + width: 25%; + } + .col-md-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-md-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-md-6 { + flex: 0 0 auto; + width: 50%; + } + .col-md-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-md-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-md-9 { + flex: 0 0 auto; + width: 75%; + } + .col-md-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-md-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-md-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.33333333%; + } + .offset-md-2 { + margin-left: 16.66666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.33333333%; + } + .offset-md-5 { + margin-left: 41.66666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.33333333%; + } + .offset-md-8 { + margin-left: 66.66666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.33333333%; + } + .offset-md-11 { + margin-left: 91.66666667%; + } + .g-md-0, + .gx-md-0 { + --bs-gutter-x: 0; + } + .g-md-0, + .gy-md-0 { + --bs-gutter-y: 0; + } + .g-md-1, + .gx-md-1 { + --bs-gutter-x: 0.25rem; + } + .g-md-1, + .gy-md-1 { + --bs-gutter-y: 0.25rem; + } + .g-md-2, + .gx-md-2 { + --bs-gutter-x: 0.5rem; + } + .g-md-2, + .gy-md-2 { + --bs-gutter-y: 0.5rem; + } + .g-md-3, + .gx-md-3 { + --bs-gutter-x: 1rem; + } + .g-md-3, + .gy-md-3 { + --bs-gutter-y: 1rem; + } + .g-md-4, + .gx-md-4 { + --bs-gutter-x: 1.5rem; + } + .g-md-4, + .gy-md-4 { + --bs-gutter-y: 1.5rem; + } + .g-md-5, + .gx-md-5 { + --bs-gutter-x: 3rem; + } + .g-md-5, + .gy-md-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 992px) { + .col-lg { + flex: 1 0 0%; + } + .row-cols-lg-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-lg-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-lg-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-lg-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-lg-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-lg-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-lg-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-lg-auto { + flex: 0 0 auto; + width: auto; + } + .col-lg-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-lg-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-lg-3 { + flex: 0 0 auto; + width: 25%; + } + .col-lg-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-lg-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-lg-6 { + flex: 0 0 auto; + width: 50%; + } + .col-lg-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-lg-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-lg-9 { + flex: 0 0 auto; + width: 75%; + } + .col-lg-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-lg-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-lg-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.33333333%; + } + .offset-lg-2 { + margin-left: 16.66666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.33333333%; + } + .offset-lg-5 { + margin-left: 41.66666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.33333333%; + } + .offset-lg-8 { + margin-left: 66.66666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.33333333%; + } + .offset-lg-11 { + margin-left: 91.66666667%; + } + .g-lg-0, + .gx-lg-0 { + --bs-gutter-x: 0; + } + .g-lg-0, + .gy-lg-0 { + --bs-gutter-y: 0; + } + .g-lg-1, + .gx-lg-1 { + --bs-gutter-x: 0.25rem; + } + .g-lg-1, + .gy-lg-1 { + --bs-gutter-y: 0.25rem; + } + .g-lg-2, + .gx-lg-2 { + --bs-gutter-x: 0.5rem; + } + .g-lg-2, + .gy-lg-2 { + --bs-gutter-y: 0.5rem; + } + .g-lg-3, + .gx-lg-3 { + --bs-gutter-x: 1rem; + } + .g-lg-3, + .gy-lg-3 { + --bs-gutter-y: 1rem; + } + .g-lg-4, + .gx-lg-4 { + --bs-gutter-x: 1.5rem; + } + .g-lg-4, + .gy-lg-4 { + --bs-gutter-y: 1.5rem; + } + .g-lg-5, + .gx-lg-5 { + --bs-gutter-x: 3rem; + } + .g-lg-5, + .gy-lg-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1200px) { + .col-xl { + flex: 1 0 0%; + } + .row-cols-xl-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-xl-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-xl-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-xl-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-xl-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-xl-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-xl-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xl-auto { + flex: 0 0 auto; + width: auto; + } + .col-xl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-xl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xl-3 { + flex: 0 0 auto; + width: 25%; + } + .col-xl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-xl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-xl-6 { + flex: 0 0 auto; + width: 50%; + } + .col-xl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-xl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-xl-9 { + flex: 0 0 auto; + width: 75%; + } + .col-xl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-xl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-xl-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.33333333%; + } + .offset-xl-2 { + margin-left: 16.66666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.33333333%; + } + .offset-xl-5 { + margin-left: 41.66666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.33333333%; + } + .offset-xl-8 { + margin-left: 66.66666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.33333333%; + } + .offset-xl-11 { + margin-left: 91.66666667%; + } + .g-xl-0, + .gx-xl-0 { + --bs-gutter-x: 0; + } + .g-xl-0, + .gy-xl-0 { + --bs-gutter-y: 0; + } + .g-xl-1, + .gx-xl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xl-1, + .gy-xl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xl-2, + .gx-xl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xl-2, + .gy-xl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xl-3, + .gx-xl-3 { + --bs-gutter-x: 1rem; + } + .g-xl-3, + .gy-xl-3 { + --bs-gutter-y: 1rem; + } + .g-xl-4, + .gx-xl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xl-4, + .gy-xl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xl-5, + .gx-xl-5 { + --bs-gutter-x: 3rem; + } + .g-xl-5, + .gy-xl-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1400px) { + .col-xxl { + flex: 1 0 0%; + } + .row-cols-xxl-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-xxl-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-xxl-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-xxl-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-xxl-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-xxl-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-xxl-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xxl-auto { + flex: 0 0 auto; + width: auto; + } + .col-xxl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-xxl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xxl-3 { + flex: 0 0 auto; + width: 25%; + } + .col-xxl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-xxl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-xxl-6 { + flex: 0 0 auto; + width: 50%; + } + .col-xxl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-xxl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-xxl-9 { + flex: 0 0 auto; + width: 75%; + } + .col-xxl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-xxl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-xxl-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-xxl-0 { + margin-left: 0; + } + .offset-xxl-1 { + margin-left: 8.33333333%; + } + .offset-xxl-2 { + margin-left: 16.66666667%; + } + .offset-xxl-3 { + margin-left: 25%; + } + .offset-xxl-4 { + margin-left: 33.33333333%; + } + .offset-xxl-5 { + margin-left: 41.66666667%; + } + .offset-xxl-6 { + margin-left: 50%; + } + .offset-xxl-7 { + margin-left: 58.33333333%; + } + .offset-xxl-8 { + margin-left: 66.66666667%; + } + .offset-xxl-9 { + margin-left: 75%; + } + .offset-xxl-10 { + margin-left: 83.33333333%; + } + .offset-xxl-11 { + margin-left: 91.66666667%; + } + .g-xxl-0, + .gx-xxl-0 { + --bs-gutter-x: 0; + } + .g-xxl-0, + .gy-xxl-0 { + --bs-gutter-y: 0; + } + .g-xxl-1, + .gx-xxl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xxl-1, + .gy-xxl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xxl-2, + .gx-xxl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xxl-2, + .gy-xxl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xxl-3, + .gx-xxl-3 { + --bs-gutter-x: 1rem; + } + .g-xxl-3, + .gy-xxl-3 { + --bs-gutter-y: 1rem; + } + .g-xxl-4, + .gx-xxl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xxl-4, + .gy-xxl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xxl-5, + .gx-xxl-5 { + --bs-gutter-x: 3rem; + } + .g-xxl-5, + .gy-xxl-5 { + --bs-gutter-y: 3rem; + } +} +.table { + --bs-table-color-type: initial; + --bs-table-bg-type: initial; + --bs-table-color-state: initial; + --bs-table-bg-state: initial; + --bs-table-color: var(--bs-emphasis-color); + --bs-table-bg: var(--bs-body-bg); + --bs-table-border-color: var(--bs-border-color); + --bs-table-accent-bg: transparent; + --bs-table-striped-color: var(--bs-emphasis-color); + --bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05); + --bs-table-active-color: var(--bs-emphasis-color); + --bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1); + --bs-table-hover-color: var(--bs-emphasis-color); + --bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075); + width: 100%; + margin-bottom: 1rem; + vertical-align: top; + border-color: var(--bs-table-border-color); +} +.table > :not(caption) > * > * { + padding: 0.5rem 0.5rem; + color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color))); + background-color: var(--bs-table-bg); + border-bottom-width: var(--bs-border-width); + box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg))); +} +.table > tbody { + vertical-align: inherit; +} +.table > thead { + vertical-align: bottom; +} + +.table-group-divider { + border-top: calc(var(--bs-border-width) * 2) solid currentcolor; +} + +.caption-top { + caption-side: top; +} + +.table-sm > :not(caption) > * > * { + padding: 0.25rem 0.25rem; +} + +.table-bordered > :not(caption) > * { + border-width: var(--bs-border-width) 0; +} +.table-bordered > :not(caption) > * > * { + border-width: 0 var(--bs-border-width); +} + +.table-borderless > :not(caption) > * > * { + border-bottom-width: 0; +} +.table-borderless > :not(:first-child) { + border-top-width: 0; +} + +.table-striped > tbody > tr:nth-of-type(odd) > * { + --bs-table-color-type: var(--bs-table-striped-color); + --bs-table-bg-type: var(--bs-table-striped-bg); +} + +.table-striped-columns > :not(caption) > tr > :nth-child(even) { + --bs-table-color-type: var(--bs-table-striped-color); + --bs-table-bg-type: var(--bs-table-striped-bg); +} + +.table-active { + --bs-table-color-state: var(--bs-table-active-color); + --bs-table-bg-state: var(--bs-table-active-bg); +} + +.table-hover > tbody > tr:hover > * { + --bs-table-color-state: var(--bs-table-hover-color); + --bs-table-bg-state: var(--bs-table-hover-bg); +} + +.table-primary { + --bs-table-color: #000; + --bs-table-bg: rgb(211.8, 229.6, 249.4); + --bs-table-border-color: rgb(169.44, 183.68, 199.52); + --bs-table-striped-bg: rgb(201.21, 218.12, 236.93); + --bs-table-striped-color: #000; + --bs-table-active-bg: rgb(190.62, 206.64, 224.46); + --bs-table-active-color: #000; + --bs-table-hover-bg: rgb(195.915, 212.38, 230.695); + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-secondary { + --bs-table-color: #000; + --bs-table-bg: rgb(215, 215.6, 216); + --bs-table-border-color: rgb(172, 172.48, 172.8); + --bs-table-striped-bg: rgb(204.25, 204.82, 205.2); + --bs-table-striped-color: #000; + --bs-table-active-bg: rgb(193.5, 194.04, 194.4); + --bs-table-active-color: #000; + --bs-table-hover-bg: rgb(198.875, 199.43, 199.8); + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-success { + --bs-table-color: #000; + --bs-table-bg: rgb(216.6, 240.4, 208.8); + --bs-table-border-color: rgb(173.28, 192.32, 167.04); + --bs-table-striped-bg: rgb(205.77, 228.38, 198.36); + --bs-table-striped-color: #000; + --bs-table-active-bg: rgb(194.94, 216.36, 187.92); + --bs-table-active-color: #000; + --bs-table-hover-bg: rgb(200.355, 222.37, 193.14); + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-info { + --bs-table-color: #000; + --bs-table-bg: rgb(234.6, 220.8, 241.4); + --bs-table-border-color: rgb(187.68, 176.64, 193.12); + --bs-table-striped-bg: rgb(222.87, 209.76, 229.33); + --bs-table-striped-color: #000; + --bs-table-active-bg: rgb(211.14, 198.72, 217.26); + --bs-table-active-color: #000; + --bs-table-hover-bg: rgb(217.005, 204.24, 223.295); + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-warning { + --bs-table-color: #000; + --bs-table-bg: rgb(255, 227.4, 208.8); + --bs-table-border-color: rgb(204, 181.92, 167.04); + --bs-table-striped-bg: rgb(242.25, 216.03, 198.36); + --bs-table-striped-color: #000; + --bs-table-active-bg: rgb(229.5, 204.66, 187.92); + --bs-table-active-color: #000; + --bs-table-hover-bg: rgb(235.875, 210.345, 193.14); + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-danger { + --bs-table-color: #000; + --bs-table-bg: rgb(255, 204, 215.4); + --bs-table-border-color: rgb(204, 163.2, 172.32); + --bs-table-striped-bg: rgb(242.25, 193.8, 204.63); + --bs-table-striped-color: #000; + --bs-table-active-bg: rgb(229.5, 183.6, 193.86); + --bs-table-active-color: #000; + --bs-table-hover-bg: rgb(235.875, 188.7, 199.245); + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-light { + --bs-table-color: #000; + --bs-table-bg: #f8f9fa; + --bs-table-border-color: rgb(198.4, 199.2, 200); + --bs-table-striped-bg: rgb(235.6, 236.55, 237.5); + --bs-table-striped-color: #000; + --bs-table-active-bg: rgb(223.2, 224.1, 225); + --bs-table-active-color: #000; + --bs-table-hover-bg: rgb(229.4, 230.325, 231.25); + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-dark { + --bs-table-color: #fff; + --bs-table-bg: #373a3c; + --bs-table-border-color: rgb(95, 97.4, 99); + --bs-table-striped-bg: rgb(65, 67.85, 69.75); + --bs-table-striped-color: #fff; + --bs-table-active-bg: rgb(75, 77.7, 79.5); + --bs-table-active-color: #fff; + --bs-table-hover-bg: rgb(70, 72.775, 74.625); + --bs-table-hover-color: #fff; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-responsive { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1399.98px) { + .table-responsive-xxl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +.form-label { + margin-bottom: 0.5rem; +} + +.col-form-label { + padding-top: calc(0.375rem + var(--bs-border-width)); + padding-bottom: calc(0.375rem + var(--bs-border-width)); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + var(--bs-border-width)); + padding-bottom: calc(0.5rem + var(--bs-border-width)); + font-size: 1.25rem; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + var(--bs-border-width)); + padding-bottom: calc(0.25rem + var(--bs-border-width)); + font-size: 0.875rem; +} + +.form-text { + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-secondary-color); +} + +.form-control { + display: block; + width: 100%; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + appearance: none; + background-color: var(--bs-body-bg); + background-clip: padding-box; + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: 0; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} +.form-control[type=file] { + overflow: hidden; +} +.form-control[type=file]:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control:focus { + color: var(--bs-body-color); + background-color: var(--bs-body-bg); + border-color: rgb(147, 191.5, 241); + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25); +} +.form-control::-webkit-date-and-time-value { + min-width: 85px; + height: 1.5em; + margin: 0; +} +.form-control::-webkit-datetime-edit { + display: block; + padding: 0; +} +.form-control::placeholder { + color: var(--bs-secondary-color); + opacity: 1; +} +.form-control:disabled { + background-color: var(--bs-secondary-bg); + opacity: 1; +} +.form-control::file-selector-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + margin-inline-end: 0.75rem; + color: var(--bs-body-color); + background-color: var(--bs-tertiary-bg); + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: var(--bs-border-width); + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::file-selector-button { + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: var(--bs-secondary-bg); +} + +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + line-height: 1.5; + color: var(--bs-body-color); + background-color: transparent; + border: solid transparent; + border-width: var(--bs-border-width) 0; +} +.form-control-plaintext:focus { + outline: 0; +} +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; +} +.form-control-sm::file-selector-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + margin-inline-end: 0.5rem; +} + +.form-control-lg { + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); + padding: 0.5rem 1rem; + font-size: 1.25rem; +} +.form-control-lg::file-selector-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + margin-inline-end: 1rem; +} + +textarea.form-control { + min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); +} +textarea.form-control-sm { + min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); +} +textarea.form-control-lg { + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); +} + +.form-control-color { + width: 3rem; + height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); + padding: 0.375rem; +} +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control-color::-moz-color-swatch { + border: 0 !important; +} +.form-control-color::-webkit-color-swatch { + border: 0 !important; +} +.form-control-color.form-control-sm { + height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); +} +.form-control-color.form-control-lg { + height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); +} + +.form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23373a3c' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); + display: block; + width: 100%; + padding: 0.375rem 2.25rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + appearance: none; + background-color: var(--bs-body-bg); + background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: 0; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-select { + transition: none; + } +} +.form-select:focus { + border-color: rgb(147, 191.5, 241); + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25); +} +.form-select[multiple], .form-select[size]:not([size="1"]) { + padding-right: 0.75rem; + background-image: none; +} +.form-select:disabled { + background-color: var(--bs-secondary-bg); +} +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 var(--bs-body-color); +} + +.form-select-sm { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; +} + +.form-select-lg { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; +} + +[data-bs-theme=dark] .form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); +} + +.form-check { + display: block; + min-height: 1.5rem; + padding-left: 1.5em; + margin-bottom: 0.125rem; +} +.form-check .form-check-input { + float: left; + margin-left: -1.5em; +} + +.form-check-reverse { + padding-right: 1.5em; + padding-left: 0; + text-align: right; +} +.form-check-reverse .form-check-input { + float: right; + margin-right: -1.5em; + margin-left: 0; +} + +.form-check-input { + --bs-form-check-bg: var(--bs-body-bg); + flex-shrink: 0; + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + appearance: none; + background-color: var(--bs-form-check-bg); + background-image: var(--bs-form-check-bg-image); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: var(--bs-border-width) solid var(--bs-border-color); + print-color-adjust: exact; +} +.form-check-input[type=radio] { + border-radius: 50%; +} +.form-check-input:active { + filter: brightness(90%); +} +.form-check-input:focus { + border-color: rgb(147, 191.5, 241); + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25); +} +.form-check-input:checked { + background-color: #2780e3; + border-color: #2780e3; +} +.form-check-input:checked[type=checkbox] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); +} +.form-check-input:checked[type=radio] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-check-input[type=checkbox]:indeterminate { + background-color: #2780e3; + border-color: #2780e3; + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); +} +.form-check-input:disabled { + pointer-events: none; + filter: none; + opacity: 0.5; +} +.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { + cursor: default; + opacity: 0.5; +} + +.form-switch { + padding-left: 2.5em; +} +.form-switch .form-check-input { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + width: 2em; + margin-left: -2.5em; + background-image: var(--bs-form-switch-bg); + background-position: left center; + border-radius: 0; + transition: background-position 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + transition: none; + } +} +.form-switch .form-check-input:focus { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgb%28147, 191.5, 241%29'/%3e%3c/svg%3e"); +} +.form-switch .form-check-input:checked { + background-position: right center; + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-switch.form-check-reverse { + padding-right: 2.5em; + padding-left: 0; +} +.form-switch.form-check-reverse .form-check-input { + margin-right: -2.5em; + margin-left: 0; +} + +.form-check-inline { + display: inline-block; + margin-right: 1rem; +} + +.btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.btn-check[disabled] + .btn, .btn-check:disabled + .btn { + pointer-events: none; + filter: none; + opacity: 0.65; +} + +[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus) { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e"); +} + +.form-range { + width: 100%; + height: 1.5rem; + padding: 0; + appearance: none; + background-color: transparent; +} +.form-range:focus { + outline: 0; +} +.form-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(39, 128, 227, 0.25); +} +.form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(39, 128, 227, 0.25); +} +.form-range::-moz-focus-outer { + border: 0; +} +.form-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + appearance: none; + background-color: #2780e3; + border: 0; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-webkit-slider-thumb { + transition: none; + } +} +.form-range::-webkit-slider-thumb:active { + background-color: rgb(190.2, 216.9, 246.6); +} +.form-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: var(--bs-secondary-bg); + border-color: transparent; +} +.form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + appearance: none; + background-color: #2780e3; + border: 0; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-moz-range-thumb { + transition: none; + } +} +.form-range::-moz-range-thumb:active { + background-color: rgb(190.2, 216.9, 246.6); +} +.form-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: var(--bs-secondary-bg); + border-color: transparent; +} +.form-range:disabled { + pointer-events: none; +} +.form-range:disabled::-webkit-slider-thumb { + background-color: var(--bs-secondary-color); +} +.form-range:disabled::-moz-range-thumb { + background-color: var(--bs-secondary-color); +} + +.form-floating { + position: relative; +} +.form-floating > .form-control, +.form-floating > .form-control-plaintext, +.form-floating > .form-select { + height: calc(3.5rem + calc(var(--bs-border-width) * 2)); + min-height: calc(3.5rem + calc(var(--bs-border-width) * 2)); + line-height: 1.25; +} +.form-floating > label { + position: absolute; + top: 0; + left: 0; + z-index: 2; + height: 100%; + padding: 1rem 0.75rem; + overflow: hidden; + text-align: start; + text-overflow: ellipsis; + white-space: nowrap; + pointer-events: none; + border: var(--bs-border-width) solid transparent; + transform-origin: 0 0; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-floating > label { + transition: none; + } +} +.form-floating > .form-control, +.form-floating > .form-control-plaintext { + padding: 1rem 0.75rem; +} +.form-floating > .form-control::placeholder, +.form-floating > .form-control-plaintext::placeholder { + color: transparent; +} +.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown), +.form-floating > .form-control-plaintext:focus, +.form-floating > .form-control-plaintext:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:-webkit-autofill, +.form-floating > .form-control-plaintext:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-select { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:focus ~ label, +.form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .form-control-plaintext ~ label, +.form-floating > .form-select ~ label { + color: rgba(var(--bs-body-color-rgb), 0.65); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:focus ~ label::after, +.form-floating > .form-control:not(:placeholder-shown) ~ label::after, +.form-floating > .form-control-plaintext ~ label::after, +.form-floating > .form-select ~ label::after { + position: absolute; + inset: 1rem 0.375rem; + z-index: -1; + height: 1.5em; + content: ""; + background-color: var(--bs-body-bg); +} +.form-floating > .form-control:-webkit-autofill ~ label { + color: rgba(var(--bs-body-color-rgb), 0.65); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control-plaintext ~ label { + border-width: var(--bs-border-width) 0; +} +.form-floating > :disabled ~ label, +.form-floating > .form-control:disabled ~ label { + color: #868e96; +} +.form-floating > :disabled ~ label::after, +.form-floating > .form-control:disabled ~ label::after { + background-color: var(--bs-secondary-bg); +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-select, +.input-group > .form-floating { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; +} +.input-group > .form-control:focus, +.input-group > .form-select:focus, +.input-group > .form-floating:focus-within { + z-index: 5; +} +.input-group .btn { + position: relative; + z-index: 2; +} +.input-group .btn:focus { + z-index: 5; +} + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-tertiary-bg); + border: var(--bs-border-width) solid var(--bs-border-color); +} + +.input-group-lg > .form-control, +.input-group-lg > .form-select, +.input-group-lg > .input-group-text, +.input-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; +} + +.input-group-sm > .form-control, +.input-group-sm > .form-select, +.input-group-sm > .input-group-text, +.input-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; +} + +.input-group-lg > .form-select, +.input-group-sm > .form-select { + padding-right: 3rem; +} + +.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { + margin-left: calc(var(--bs-border-width) * -1); +} +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-form-valid-color); +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: var(--bs-success); +} + +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip, +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: var(--bs-form-valid-border-color); + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:valid, .form-select.is-valid { + border-color: var(--bs-form-valid-border-color); +} +.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] { + --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + padding-right: 4.125rem; + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:valid:focus, .form-select.is-valid:focus { + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} + +.was-validated .form-control-color:valid, .form-control-color.is-valid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} + +.was-validated .form-check-input:valid, .form-check-input.is-valid { + border-color: var(--bs-form-valid-border-color); +} +.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked { + background-color: var(--bs-form-valid-color); +} +.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus { + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: var(--bs-form-valid-color); +} + +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid, +.was-validated .input-group > .form-select:not(:focus):valid, +.input-group > .form-select:not(:focus).is-valid, +.was-validated .input-group > .form-floating:not(:focus-within):valid, +.input-group > .form-floating:not(:focus-within).is-valid { + z-index: 3; +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-form-invalid-color); +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: var(--bs-danger); +} + +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip, +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: var(--bs-form-invalid-border-color); + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:invalid, .form-select.is-invalid { + border-color: var(--bs-form-invalid-border-color); +} +.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] { + --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e"); + padding-right: 4.125rem; + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus { + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} + +.was-validated .form-control-color:invalid, .form-control-color.is-invalid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} + +.was-validated .form-check-input:invalid, .form-check-input.is-invalid { + border-color: var(--bs-form-invalid-border-color); +} +.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked { + background-color: var(--bs-form-invalid-color); +} +.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus { + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: var(--bs-form-invalid-color); +} + +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid, +.was-validated .input-group > .form-select:not(:focus):invalid, +.input-group > .form-select:not(:focus).is-invalid, +.was-validated .input-group > .form-floating:not(:focus-within):invalid, +.input-group > .form-floating:not(:focus-within).is-invalid { + z-index: 4; +} + +.btn { + --bs-btn-padding-x: 0.75rem; + --bs-btn-padding-y: 0.375rem; + --bs-btn-font-family: ; + --bs-btn-font-size: 1rem; + --bs-btn-font-weight: 400; + --bs-btn-line-height: 1.5; + --bs-btn-color: var(--bs-body-color); + --bs-btn-bg: transparent; + --bs-btn-border-width: var(--bs-border-width); + --bs-btn-border-color: transparent; + --bs-btn-border-radius: var(--bs-border-radius); + --bs-btn-hover-border-color: transparent; + --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + --bs-btn-disabled-opacity: 0.65; + --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5); + display: inline-block; + padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); + font-family: var(--bs-btn-font-family); + font-size: var(--bs-btn-font-size); + font-weight: var(--bs-btn-font-weight); + line-height: var(--bs-btn-line-height); + color: var(--bs-btn-color); + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + user-select: none; + border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); + background-color: var(--bs-btn-bg); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); +} +.btn-check + .btn:hover { + color: var(--bs-btn-color); + background-color: var(--bs-btn-bg); + border-color: var(--bs-btn-border-color); +} +.btn:focus-visible { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:focus-visible + .btn { + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show { + color: var(--bs-btn-active-color); + background-color: var(--bs-btn-active-bg); + border-color: var(--bs-btn-active-border-color); +} +.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible { + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:checked:focus-visible + .btn { + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn:disabled, .btn.disabled, fieldset:disabled .btn { + color: var(--bs-btn-disabled-color); + pointer-events: none; + background-color: var(--bs-btn-disabled-bg); + border-color: var(--bs-btn-disabled-border-color); + opacity: var(--bs-btn-disabled-opacity); +} + +.btn-primary { + --bs-btn-color: #fff; + --bs-btn-bg: #2780e3; + --bs-btn-border-color: #2780e3; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: rgb(33.15, 108.8, 192.95); + --bs-btn-hover-border-color: rgb(31.2, 102.4, 181.6); + --bs-btn-focus-shadow-rgb: 71, 147, 231; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: rgb(31.2, 102.4, 181.6); + --bs-btn-active-border-color: rgb(29.25, 96, 170.25); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #2780e3; + --bs-btn-disabled-border-color: #2780e3; +} + +.btn-secondary { + --bs-btn-color: #fff; + --bs-btn-bg: #373a3c; + --bs-btn-border-color: #373a3c; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: rgb(46.75, 49.3, 51); + --bs-btn-hover-border-color: rgb(44, 46.4, 48); + --bs-btn-focus-shadow-rgb: 85, 88, 89; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: rgb(44, 46.4, 48); + --bs-btn-active-border-color: rgb(41.25, 43.5, 45); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #373a3c; + --bs-btn-disabled-border-color: #373a3c; +} + +.btn-success { + --bs-btn-color: #fff; + --bs-btn-bg: #3fb618; + --bs-btn-border-color: #3fb618; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: rgb(53.55, 154.7, 20.4); + --bs-btn-hover-border-color: rgb(50.4, 145.6, 19.2); + --bs-btn-focus-shadow-rgb: 92, 193, 59; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: rgb(50.4, 145.6, 19.2); + --bs-btn-active-border-color: rgb(47.25, 136.5, 18); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #3fb618; + --bs-btn-disabled-border-color: #3fb618; +} + +.btn-info { + --bs-btn-color: #fff; + --bs-btn-bg: #9954bb; + --bs-btn-border-color: #9954bb; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: rgb(130.05, 71.4, 158.95); + --bs-btn-hover-border-color: rgb(122.4, 67.2, 149.6); + --bs-btn-focus-shadow-rgb: 168, 110, 197; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: rgb(122.4, 67.2, 149.6); + --bs-btn-active-border-color: rgb(114.75, 63, 140.25); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #9954bb; + --bs-btn-disabled-border-color: #9954bb; +} + +.btn-warning { + --bs-btn-color: #fff; + --bs-btn-bg: #ff7518; + --bs-btn-border-color: #ff7518; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: rgb(216.75, 99.45, 20.4); + --bs-btn-hover-border-color: rgb(204, 93.6, 19.2); + --bs-btn-focus-shadow-rgb: 255, 138, 59; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: rgb(204, 93.6, 19.2); + --bs-btn-active-border-color: rgb(191.25, 87.75, 18); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #ff7518; + --bs-btn-disabled-border-color: #ff7518; +} + +.btn-danger { + --bs-btn-color: #fff; + --bs-btn-bg: #ff0039; + --bs-btn-border-color: #ff0039; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: rgb(216.75, 0, 48.45); + --bs-btn-hover-border-color: rgb(204, 0, 45.6); + --bs-btn-focus-shadow-rgb: 255, 38, 87; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: rgb(204, 0, 45.6); + --bs-btn-active-border-color: rgb(191.25, 0, 42.75); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #ff0039; + --bs-btn-disabled-border-color: #ff0039; +} + +.btn-light { + --bs-btn-color: #000; + --bs-btn-bg: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: rgb(210.8, 211.65, 212.5); + --bs-btn-hover-border-color: rgb(198.4, 199.2, 200); + --bs-btn-focus-shadow-rgb: 211, 212, 213; + --bs-btn-active-color: #000; + --bs-btn-active-bg: rgb(198.4, 199.2, 200); + --bs-btn-active-border-color: rgb(186, 186.75, 187.5); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #f8f9fa; + --bs-btn-disabled-border-color: #f8f9fa; +} + +.btn-dark { + --bs-btn-color: #fff; + --bs-btn-bg: #373a3c; + --bs-btn-border-color: #373a3c; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: rgb(85, 87.55, 89.25); + --bs-btn-hover-border-color: rgb(75, 77.7, 79.5); + --bs-btn-focus-shadow-rgb: 85, 88, 89; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: rgb(95, 97.4, 99); + --bs-btn-active-border-color: rgb(75, 77.7, 79.5); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #373a3c; + --bs-btn-disabled-border-color: #373a3c; +} + +.btn-outline-primary { + --bs-btn-color: #2780e3; + --bs-btn-border-color: #2780e3; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #2780e3; + --bs-btn-hover-border-color: #2780e3; + --bs-btn-focus-shadow-rgb: 39, 128, 227; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #2780e3; + --bs-btn-active-border-color: #2780e3; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #2780e3; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #2780e3; + --bs-gradient: none; +} + +.btn-outline-secondary { + --bs-btn-color: #373a3c; + --bs-btn-border-color: #373a3c; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #373a3c; + --bs-btn-hover-border-color: #373a3c; + --bs-btn-focus-shadow-rgb: 55, 58, 60; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #373a3c; + --bs-btn-active-border-color: #373a3c; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #373a3c; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #373a3c; + --bs-gradient: none; +} + +.btn-outline-success { + --bs-btn-color: #3fb618; + --bs-btn-border-color: #3fb618; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #3fb618; + --bs-btn-hover-border-color: #3fb618; + --bs-btn-focus-shadow-rgb: 63, 182, 24; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #3fb618; + --bs-btn-active-border-color: #3fb618; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #3fb618; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #3fb618; + --bs-gradient: none; +} + +.btn-outline-info { + --bs-btn-color: #9954bb; + --bs-btn-border-color: #9954bb; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #9954bb; + --bs-btn-hover-border-color: #9954bb; + --bs-btn-focus-shadow-rgb: 153, 84, 187; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #9954bb; + --bs-btn-active-border-color: #9954bb; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #9954bb; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #9954bb; + --bs-gradient: none; +} + +.btn-outline-warning { + --bs-btn-color: #ff7518; + --bs-btn-border-color: #ff7518; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #ff7518; + --bs-btn-hover-border-color: #ff7518; + --bs-btn-focus-shadow-rgb: 255, 117, 24; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #ff7518; + --bs-btn-active-border-color: #ff7518; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #ff7518; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #ff7518; + --bs-gradient: none; +} + +.btn-outline-danger { + --bs-btn-color: #ff0039; + --bs-btn-border-color: #ff0039; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #ff0039; + --bs-btn-hover-border-color: #ff0039; + --bs-btn-focus-shadow-rgb: 255, 0, 57; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #ff0039; + --bs-btn-active-border-color: #ff0039; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #ff0039; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #ff0039; + --bs-gradient: none; +} + +.btn-outline-light { + --bs-btn-color: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #f8f9fa; + --bs-btn-hover-border-color: #f8f9fa; + --bs-btn-focus-shadow-rgb: 248, 249, 250; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #f8f9fa; + --bs-btn-active-border-color: #f8f9fa; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #f8f9fa; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #f8f9fa; + --bs-gradient: none; +} + +.btn-outline-dark { + --bs-btn-color: #373a3c; + --bs-btn-border-color: #373a3c; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #373a3c; + --bs-btn-hover-border-color: #373a3c; + --bs-btn-focus-shadow-rgb: 55, 58, 60; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #373a3c; + --bs-btn-active-border-color: #373a3c; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #373a3c; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #373a3c; + --bs-gradient: none; +} + +.btn-link { + --bs-btn-font-weight: 400; + --bs-btn-color: var(--bs-link-color); + --bs-btn-bg: transparent; + --bs-btn-border-color: transparent; + --bs-btn-hover-color: var(--bs-link-hover-color); + --bs-btn-hover-border-color: transparent; + --bs-btn-active-color: var(--bs-link-hover-color); + --bs-btn-active-border-color: transparent; + --bs-btn-disabled-color: #868e96; + --bs-btn-disabled-border-color: transparent; + --bs-btn-box-shadow: 0 0 0 #000; + --bs-btn-focus-shadow-rgb: 71, 147, 231; + text-decoration: underline; +} +.btn-link:focus-visible { + color: var(--bs-btn-color); +} +.btn-link:hover { + color: var(--bs-btn-hover-color); +} + +.btn-lg, .btn-group-lg > .btn { + --bs-btn-padding-y: 0.5rem; + --bs-btn-padding-x: 1rem; + --bs-btn-font-size: 1.25rem; + --bs-btn-border-radius: var(--bs-border-radius-lg); +} + +.btn-sm, .btn-group-sm > .btn { + --bs-btn-padding-y: 0.25rem; + --bs-btn-padding-x: 0.5rem; + --bs-btn-font-size: 0.875rem; + --bs-btn-border-radius: var(--bs-border-radius-sm); +} + +.fade { + transition: opacity 0.15s linear; +} +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} +.collapsing.collapse-horizontal { + width: 0; + height: auto; + transition: width 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing.collapse-horizontal { + transition: none; + } +} + +.dropup, +.dropend, +.dropdown, +.dropstart, +.dropup-center, +.dropdown-center { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; +} +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + --bs-dropdown-zindex: 1000; + --bs-dropdown-min-width: 10rem; + --bs-dropdown-padding-x: 0; + --bs-dropdown-padding-y: 0.5rem; + --bs-dropdown-spacer: 0.125rem; + --bs-dropdown-font-size: 1rem; + --bs-dropdown-color: var(--bs-body-color); + --bs-dropdown-bg: var(--bs-body-bg); + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-border-radius: var(--bs-border-radius); + --bs-dropdown-border-width: var(--bs-border-width); + --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width)); + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-divider-margin-y: 0.5rem; + --bs-dropdown-box-shadow: var(--bs-box-shadow); + --bs-dropdown-link-color: var(--bs-body-color); + --bs-dropdown-link-hover-color: var(--bs-body-color); + --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #2780e3; + --bs-dropdown-link-disabled-color: var(--bs-tertiary-color); + --bs-dropdown-item-padding-x: 1rem; + --bs-dropdown-item-padding-y: 0.25rem; + --bs-dropdown-header-color: #868e96; + --bs-dropdown-header-padding-x: 1rem; + --bs-dropdown-header-padding-y: 0.5rem; + position: absolute; + z-index: var(--bs-dropdown-zindex); + display: none; + min-width: var(--bs-dropdown-min-width); + padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); + margin: 0; + font-size: var(--bs-dropdown-font-size); + color: var(--bs-dropdown-color); + text-align: left; + list-style: none; + background-color: var(--bs-dropdown-bg); + background-clip: padding-box; + border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color); +} +.dropdown-menu[data-bs-popper] { + top: 100%; + left: 0; + margin-top: var(--bs-dropdown-spacer); +} + +.dropdown-menu-start { + --bs-position: start; +} +.dropdown-menu-start[data-bs-popper] { + right: auto; + left: 0; +} + +.dropdown-menu-end { + --bs-position: end; +} +.dropdown-menu-end[data-bs-popper] { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-start { + --bs-position: start; + } + .dropdown-menu-sm-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-sm-end { + --bs-position: end; + } + .dropdown-menu-sm-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-start { + --bs-position: start; + } + .dropdown-menu-md-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-md-end { + --bs-position: end; + } + .dropdown-menu-md-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-start { + --bs-position: start; + } + .dropdown-menu-lg-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-lg-end { + --bs-position: end; + } + .dropdown-menu-lg-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-start { + --bs-position: start; + } + .dropdown-menu-xl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xl-end { + --bs-position: end; + } + .dropdown-menu-xl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1400px) { + .dropdown-menu-xxl-start { + --bs-position: start; + } + .dropdown-menu-xxl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xxl-end { + --bs-position: end; + } + .dropdown-menu-xxl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +.dropup .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: var(--bs-dropdown-spacer); +} +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropend .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: var(--bs-dropdown-spacer); +} +.dropend .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} +.dropend .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropend .dropdown-toggle::after { + vertical-align: 0; +} + +.dropstart .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: var(--bs-dropdown-spacer); +} +.dropstart .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} +.dropstart .dropdown-toggle::after { + display: none; +} +.dropstart .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropstart .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropstart .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-divider { + height: 0; + margin: var(--bs-dropdown-divider-margin-y) 0; + overflow: hidden; + border-top: 1px solid var(--bs-dropdown-divider-bg); + opacity: 1; +} + +.dropdown-item { + display: block; + width: 100%; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + clear: both; + font-weight: 400; + color: var(--bs-dropdown-link-color); + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0; +} +.dropdown-item:hover, .dropdown-item:focus { + color: var(--bs-dropdown-link-hover-color); + background-color: var(--bs-dropdown-link-hover-bg); +} +.dropdown-item.active, .dropdown-item:active { + color: var(--bs-dropdown-link-active-color); + text-decoration: none; + background-color: var(--bs-dropdown-link-active-bg); +} +.dropdown-item.disabled, .dropdown-item:disabled { + color: var(--bs-dropdown-link-disabled-color); + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x); + margin-bottom: 0; + font-size: 0.875rem; + color: var(--bs-dropdown-header-color); + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + color: var(--bs-dropdown-link-color); +} + +.dropdown-menu-dark { + --bs-dropdown-color: #dee2e6; + --bs-dropdown-bg: #373a3c; + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-box-shadow: ; + --bs-dropdown-link-color: #dee2e6; + --bs-dropdown-link-hover-color: #fff; + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #2780e3; + --bs-dropdown-link-disabled-color: #adb5bd; + --bs-dropdown-header-color: #adb5bd; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; +} +.btn-group > .btn-check:checked + .btn, +.btn-group > .btn-check:focus + .btn, +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn-check:checked + .btn, +.btn-group-vertical > .btn-check:focus + .btn, +.btn-group-vertical > .btn:hover, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > :not(.btn-check:first-child) + .btn, +.btn-group > .btn-group:not(:first-child) { + margin-left: calc(var(--bs-border-width) * -1); +} +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} +.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after { + margin-left: 0; +} +.dropstart .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: calc(var(--bs-border-width) * -1); +} +.nav { + --bs-nav-link-padding-x: 1rem; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-link-color); + --bs-nav-link-hover-color: var(--bs-link-hover-color); + --bs-nav-link-disabled-color: var(--bs-secondary-color); + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); + font-size: var(--bs-nav-link-font-size); + font-weight: var(--bs-nav-link-font-weight); + color: var(--bs-nav-link-color); + text-decoration: none; + background: none; + border: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .nav-link { + transition: none; + } +} +.nav-link:hover, .nav-link:focus { + color: var(--bs-nav-link-hover-color); +} +.nav-link:focus-visible { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25); +} +.nav-link.disabled, .nav-link:disabled { + color: var(--bs-nav-link-disabled-color); + pointer-events: none; + cursor: default; +} + +.nav-tabs { + --bs-nav-tabs-border-width: var(--bs-border-width); + --bs-nav-tabs-border-color: var(--bs-border-color); + --bs-nav-tabs-border-radius: var(--bs-border-radius); + --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color); + --bs-nav-tabs-link-active-color: var(--bs-emphasis-color); + --bs-nav-tabs-link-active-bg: var(--bs-body-bg); + --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg); + border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color); +} +.nav-tabs .nav-link { + margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); + border: var(--bs-nav-tabs-border-width) solid transparent; +} +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + isolation: isolate; + border-color: var(--bs-nav-tabs-link-hover-border-color); +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: var(--bs-nav-tabs-link-active-color); + background-color: var(--bs-nav-tabs-link-active-bg); + border-color: var(--bs-nav-tabs-link-active-border-color); +} +.nav-tabs .dropdown-menu { + margin-top: calc(-1 * var(--bs-nav-tabs-border-width)); +} + +.nav-pills { + --bs-nav-pills-border-radius: var(--bs-border-radius); + --bs-nav-pills-link-active-color: #fff; + --bs-nav-pills-link-active-bg: #2780e3; +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: var(--bs-nav-pills-link-active-color); + background-color: var(--bs-nav-pills-link-active-bg); +} + +.nav-underline { + --bs-nav-underline-gap: 1rem; + --bs-nav-underline-border-width: 0.125rem; + --bs-nav-underline-link-active-color: var(--bs-emphasis-color); + gap: var(--bs-nav-underline-gap); +} +.nav-underline .nav-link { + padding-right: 0; + padding-left: 0; + border-bottom: var(--bs-nav-underline-border-width) solid transparent; +} +.nav-underline .nav-link:hover, .nav-underline .nav-link:focus { + border-bottom-color: currentcolor; +} +.nav-underline .nav-link.active, +.nav-underline .show > .nav-link { + font-weight: 700; + color: var(--bs-nav-underline-link-active-color); + border-bottom-color: currentcolor; +} + +.nav-fill > .nav-link, +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; +} + +.nav-justified > .nav-link, +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; +} + +.nav-fill .nav-item .nav-link, +.nav-justified .nav-item .nav-link { + width: 100%; +} + +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} + +.navbar { + --bs-navbar-padding-x: 0; + --bs-navbar-padding-y: 0.5rem; + --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65); + --bs-navbar-hover-color: rgba(0, 0, 0, 0.9); + --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3); + --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-brand-padding-y: 0.3125rem; + --bs-navbar-brand-margin-end: 1rem; + --bs-navbar-brand-font-size: 1.25rem; + --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-nav-link-padding-x: 0.5rem; + --bs-navbar-toggler-padding-y: 0.25rem; + --bs-navbar-toggler-padding-x: 0.75rem; + --bs-navbar-toggler-font-size: 1.25rem; + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2855, 58, 60, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15); + --bs-navbar-toggler-border-radius: var(--bs-border-radius); + --bs-navbar-toggler-focus-width: 0.25rem; + --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x); +} +.navbar > .container, +.navbar > .container-fluid, +.navbar > .container-sm, +.navbar > .container-md, +.navbar > .container-lg, +.navbar > .container-xl, +.navbar > .container-xxl { + display: flex; + flex-wrap: inherit; + align-items: center; + justify-content: space-between; +} +.navbar-brand { + padding-top: var(--bs-navbar-brand-padding-y); + padding-bottom: var(--bs-navbar-brand-padding-y); + margin-right: var(--bs-navbar-brand-margin-end); + font-size: var(--bs-navbar-brand-font-size); + color: var(--bs-navbar-brand-color); + text-decoration: none; + white-space: nowrap; +} +.navbar-brand:hover, .navbar-brand:focus { + color: var(--bs-navbar-brand-hover-color); +} + +.navbar-nav { + --bs-nav-link-padding-x: 0; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-navbar-color); + --bs-nav-link-hover-color: var(--bs-navbar-hover-color); + --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .nav-link.active, .navbar-nav .nav-link.show { + color: var(--bs-navbar-active-color); +} +.navbar-nav .dropdown-menu { + position: static; +} + +.navbar-text { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: var(--bs-navbar-color); +} +.navbar-text a, +.navbar-text a:hover, +.navbar-text a:focus { + color: var(--bs-navbar-active-color); +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; +} + +.navbar-toggler { + padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x); + font-size: var(--bs-navbar-toggler-font-size); + line-height: 1; + color: var(--bs-navbar-color); + background-color: transparent; + border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color); + transition: var(--bs-navbar-toggler-transition); +} +@media (prefers-reduced-motion: reduce) { + .navbar-toggler { + transition: none; + } +} +.navbar-toggler:hover { + text-decoration: none; +} +.navbar-toggler:focus { + text-decoration: none; + outline: 0; + box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width); +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + background-image: var(--bs-navbar-toggler-icon-bg); + background-repeat: no-repeat; + background-position: center; + background-size: 100%; +} + +.navbar-nav-scroll { + max-height: var(--bs-scroll-height, 75vh); + overflow-y: auto; +} + +@media (min-width: 576px) { + .navbar-expand-sm { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } + .navbar-expand-sm .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-sm .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-sm .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 768px) { + .navbar-expand-md { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-md .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } + .navbar-expand-md .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-md .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-md .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 992px) { + .navbar-expand-lg { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } + .navbar-expand-lg .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-lg .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-lg .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } + .navbar-expand-xl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1400px) { + .navbar-expand-xxl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xxl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xxl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xxl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-xxl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xxl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xxl .navbar-toggler { + display: none; + } + .navbar-expand-xxl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +.navbar-expand { + flex-wrap: nowrap; + justify-content: flex-start; +} +.navbar-expand .navbar-nav { + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); +} +.navbar-expand .navbar-nav-scroll { + overflow: visible; +} +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} +.navbar-expand .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; +} +.navbar-expand .offcanvas .offcanvas-header { + display: none; +} +.navbar-expand .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; +} + +.navbar-dark, +.navbar[data-bs-theme=dark] { + --bs-navbar-color: rgba(255, 255, 255, 0.55); + --bs-navbar-hover-color: white; + --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); + --bs-navbar-active-color: #fff; + --bs-navbar-brand-color: #fff; + --bs-navbar-brand-hover-color: #fff; + --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +[data-bs-theme=dark] .navbar-toggler-icon { + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.card { + --bs-card-spacer-y: 1rem; + --bs-card-spacer-x: 1rem; + --bs-card-title-spacer-y: 0.5rem; + --bs-card-title-color: ; + --bs-card-subtitle-color: ; + --bs-card-border-width: var(--bs-border-width); + --bs-card-border-color: var(--bs-border-color-translucent); + --bs-card-border-radius: var(--bs-border-radius); + --bs-card-box-shadow: ; + --bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); + --bs-card-cap-padding-y: 0.5rem; + --bs-card-cap-padding-x: 1rem; + --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03); + --bs-card-cap-color: ; + --bs-card-height: ; + --bs-card-color: ; + --bs-card-bg: var(--bs-body-bg); + --bs-card-img-overlay-padding: 1rem; + --bs-card-group-margin: 0.75rem; + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + height: var(--bs-card-height); + color: var(--bs-body-color); + word-wrap: break-word; + background-color: var(--bs-card-bg); + background-clip: border-box; + border: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group { + border-top: inherit; + border-bottom: inherit; +} +.card > .list-group:first-child { + border-top-width: 0; +} +.card > .list-group:last-child { + border-bottom-width: 0; +} +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} + +.card-body { + flex: 1 1 auto; + padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x); + color: var(--bs-card-color); +} + +.card-title { + margin-bottom: var(--bs-card-title-spacer-y); + color: var(--bs-card-title-color); +} + +.card-subtitle { + margin-top: calc(-0.5 * var(--bs-card-title-spacer-y)); + margin-bottom: 0; + color: var(--bs-card-subtitle-color); +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link + .card-link { + margin-left: var(--bs-card-spacer-x); +} + +.card-header { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + margin-bottom: 0; + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card-footer { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-top: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card-header-tabs { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-bottom: calc(-1 * var(--bs-card-cap-padding-y)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); + border-bottom: 0; +} +.card-header-tabs .nav-link.active { + background-color: var(--bs-card-bg); + border-bottom-color: var(--bs-card-bg); +} + +.card-header-pills { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--bs-card-img-overlay-padding); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; +} + +.card-group > .card { + margin-bottom: var(--bs-card-group-margin); +} +@media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } +} + +.accordion { + --bs-accordion-color: var(--bs-body-color); + --bs-accordion-bg: var(--bs-body-bg); + --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; + --bs-accordion-border-color: var(--bs-border-color); + --bs-accordion-border-width: var(--bs-border-width); + --bs-accordion-border-radius: var(--bs-border-radius); + --bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); + --bs-accordion-btn-padding-x: 1.25rem; + --bs-accordion-btn-padding-y: 1rem; + --bs-accordion-btn-color: var(--bs-body-color); + --bs-accordion-btn-bg: var(--bs-accordion-bg); + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23373a3c' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e"); + --bs-accordion-btn-icon-width: 1.25rem; + --bs-accordion-btn-icon-transform: rotate(-180deg); + --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out; + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='rgb%2815.6, 51.2, 90.8%29' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e"); + --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25); + --bs-accordion-body-padding-x: 1.25rem; + --bs-accordion-body-padding-y: 1rem; + --bs-accordion-active-color: var(--bs-primary-text-emphasis); + --bs-accordion-active-bg: var(--bs-primary-bg-subtle); +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x); + font-size: 1rem; + color: var(--bs-accordion-btn-color); + text-align: left; + background-color: var(--bs-accordion-btn-bg); + border: 0; + overflow-anchor: none; + transition: var(--bs-accordion-transition); +} +@media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none; + } +} +.accordion-button:not(.collapsed) { + color: var(--bs-accordion-active-color); + background-color: var(--bs-accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color); +} +.accordion-button:not(.collapsed)::after { + background-image: var(--bs-accordion-btn-active-icon); + transform: var(--bs-accordion-btn-icon-transform); +} +.accordion-button::after { + flex-shrink: 0; + width: var(--bs-accordion-btn-icon-width); + height: var(--bs-accordion-btn-icon-width); + margin-left: auto; + content: ""; + background-image: var(--bs-accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--bs-accordion-btn-icon-width); + transition: var(--bs-accordion-btn-icon-transition); +} +@media (prefers-reduced-motion: reduce) { + .accordion-button::after { + transition: none; + } +} +.accordion-button:hover { + z-index: 2; +} +.accordion-button:focus { + z-index: 3; + outline: 0; + box-shadow: var(--bs-accordion-btn-focus-box-shadow); +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + color: var(--bs-accordion-color); + background-color: var(--bs-accordion-bg); + border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color); +} +.accordion-item:not(:first-of-type) { + border-top: 0; +} +.accordion-body { + padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x); +} + +.accordion-flush > .accordion-item { + border-right: 0; + border-left: 0; +} +.accordion-flush > .accordion-item:first-child { + border-top: 0; +} +.accordion-flush > .accordion-item:last-child { + border-bottom: 0; +} +[data-bs-theme=dark] .accordion-button::after { + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28125.4, 178.8, 238.2%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28125.4, 178.8, 238.2%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); +} + +.breadcrumb { + --bs-breadcrumb-padding-x: 0; + --bs-breadcrumb-padding-y: 0; + --bs-breadcrumb-margin-bottom: 1rem; + --bs-breadcrumb-bg: ; + --bs-breadcrumb-border-radius: ; + --bs-breadcrumb-divider-color: var(--bs-secondary-color); + --bs-breadcrumb-item-padding-x: 0.5rem; + --bs-breadcrumb-item-active-color: var(--bs-secondary-color); + display: flex; + flex-wrap: wrap; + padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x); + margin-bottom: var(--bs-breadcrumb-margin-bottom); + font-size: var(--bs-breadcrumb-font-size); + list-style: none; + background-color: var(--bs-breadcrumb-bg); +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: var(--bs-breadcrumb-item-padding-x); +} +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: var(--bs-breadcrumb-item-padding-x); + color: var(--bs-breadcrumb-divider-color); + content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */; +} +.breadcrumb-item.active { + color: var(--bs-breadcrumb-item-active-color); +} + +.pagination { + --bs-pagination-padding-x: 0.75rem; + --bs-pagination-padding-y: 0.375rem; + --bs-pagination-font-size: 1rem; + --bs-pagination-color: var(--bs-link-color); + --bs-pagination-bg: var(--bs-body-bg); + --bs-pagination-border-width: var(--bs-border-width); + --bs-pagination-border-color: var(--bs-border-color); + --bs-pagination-border-radius: var(--bs-border-radius); + --bs-pagination-hover-color: var(--bs-link-hover-color); + --bs-pagination-hover-bg: var(--bs-tertiary-bg); + --bs-pagination-hover-border-color: var(--bs-border-color); + --bs-pagination-focus-color: var(--bs-link-hover-color); + --bs-pagination-focus-bg: var(--bs-secondary-bg); + --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25); + --bs-pagination-active-color: #fff; + --bs-pagination-active-bg: #2780e3; + --bs-pagination-active-border-color: #2780e3; + --bs-pagination-disabled-color: var(--bs-secondary-color); + --bs-pagination-disabled-bg: var(--bs-secondary-bg); + --bs-pagination-disabled-border-color: var(--bs-border-color); + display: flex; + padding-left: 0; + list-style: none; +} + +.page-link { + position: relative; + display: block; + padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); + font-size: var(--bs-pagination-font-size); + color: var(--bs-pagination-color); + text-decoration: none; + background-color: var(--bs-pagination-bg); + border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .page-link { + transition: none; + } +} +.page-link:hover { + z-index: 2; + color: var(--bs-pagination-hover-color); + background-color: var(--bs-pagination-hover-bg); + border-color: var(--bs-pagination-hover-border-color); +} +.page-link:focus { + z-index: 3; + color: var(--bs-pagination-focus-color); + background-color: var(--bs-pagination-focus-bg); + outline: 0; + box-shadow: var(--bs-pagination-focus-box-shadow); +} +.page-link.active, .active > .page-link { + z-index: 3; + color: var(--bs-pagination-active-color); + background-color: var(--bs-pagination-active-bg); + border-color: var(--bs-pagination-active-border-color); +} +.page-link.disabled, .disabled > .page-link { + color: var(--bs-pagination-disabled-color); + pointer-events: none; + background-color: var(--bs-pagination-disabled-bg); + border-color: var(--bs-pagination-disabled-border-color); +} + +.page-item:not(:first-child) .page-link { + margin-left: calc(var(--bs-border-width) * -1); +} +.pagination-lg { + --bs-pagination-padding-x: 1.5rem; + --bs-pagination-padding-y: 0.75rem; + --bs-pagination-font-size: 1.25rem; + --bs-pagination-border-radius: var(--bs-border-radius-lg); +} + +.pagination-sm { + --bs-pagination-padding-x: 0.5rem; + --bs-pagination-padding-y: 0.25rem; + --bs-pagination-font-size: 0.875rem; + --bs-pagination-border-radius: var(--bs-border-radius-sm); +} + +.badge { + --bs-badge-padding-x: 0.65em; + --bs-badge-padding-y: 0.35em; + --bs-badge-font-size: 0.75em; + --bs-badge-font-weight: 700; + --bs-badge-color: #fff; + --bs-badge-border-radius: var(--bs-border-radius); + display: inline-block; + padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x); + font-size: var(--bs-badge-font-size); + font-weight: var(--bs-badge-font-weight); + line-height: 1; + color: var(--bs-badge-color); + text-align: center; + white-space: nowrap; + vertical-align: baseline; +} +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.alert { + --bs-alert-bg: transparent; + --bs-alert-padding-x: 1rem; + --bs-alert-padding-y: 1rem; + --bs-alert-margin-bottom: 1rem; + --bs-alert-color: inherit; + --bs-alert-border-color: transparent; + --bs-alert-border: 0 solid var(--bs-alert-border-color); + --bs-alert-border-radius: var(--bs-border-radius); + --bs-alert-link-color: inherit; + position: relative; + padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); + margin-bottom: var(--bs-alert-margin-bottom); + color: var(--bs-alert-color); + background-color: var(--bs-alert-bg); + border: var(--bs-alert-border); +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; + color: var(--bs-alert-link-color); +} + +.alert-dismissible { + padding-right: 3rem; +} +.alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem; +} + +.alert-primary { + --bs-alert-color: var(--bs-primary-text-emphasis); + --bs-alert-bg: var(--bs-primary-bg-subtle); + --bs-alert-border-color: var(--bs-primary-border-subtle); + --bs-alert-link-color: var(--bs-primary-text-emphasis); +} + +.alert-secondary { + --bs-alert-color: var(--bs-secondary-text-emphasis); + --bs-alert-bg: var(--bs-secondary-bg-subtle); + --bs-alert-border-color: var(--bs-secondary-border-subtle); + --bs-alert-link-color: var(--bs-secondary-text-emphasis); +} + +.alert-success { + --bs-alert-color: var(--bs-success-text-emphasis); + --bs-alert-bg: var(--bs-success-bg-subtle); + --bs-alert-border-color: var(--bs-success-border-subtle); + --bs-alert-link-color: var(--bs-success-text-emphasis); +} + +.alert-info { + --bs-alert-color: var(--bs-info-text-emphasis); + --bs-alert-bg: var(--bs-info-bg-subtle); + --bs-alert-border-color: var(--bs-info-border-subtle); + --bs-alert-link-color: var(--bs-info-text-emphasis); +} + +.alert-warning { + --bs-alert-color: var(--bs-warning-text-emphasis); + --bs-alert-bg: var(--bs-warning-bg-subtle); + --bs-alert-border-color: var(--bs-warning-border-subtle); + --bs-alert-link-color: var(--bs-warning-text-emphasis); +} + +.alert-danger { + --bs-alert-color: var(--bs-danger-text-emphasis); + --bs-alert-bg: var(--bs-danger-bg-subtle); + --bs-alert-border-color: var(--bs-danger-border-subtle); + --bs-alert-link-color: var(--bs-danger-text-emphasis); +} + +.alert-light { + --bs-alert-color: var(--bs-light-text-emphasis); + --bs-alert-bg: var(--bs-light-bg-subtle); + --bs-alert-border-color: var(--bs-light-border-subtle); + --bs-alert-link-color: var(--bs-light-text-emphasis); +} + +.alert-dark { + --bs-alert-color: var(--bs-dark-text-emphasis); + --bs-alert-bg: var(--bs-dark-bg-subtle); + --bs-alert-border-color: var(--bs-dark-border-subtle); + --bs-alert-link-color: var(--bs-dark-text-emphasis); +} + +@keyframes progress-bar-stripes { + 0% { + background-position-x: 0.5rem; + } +} +.progress, +.progress-stacked { + --bs-progress-height: 0.5rem; + --bs-progress-font-size: 0.75rem; + --bs-progress-bg: var(--bs-secondary-bg); + --bs-progress-border-radius: var(--bs-border-radius); + --bs-progress-box-shadow: var(--bs-box-shadow-inset); + --bs-progress-bar-color: #fff; + --bs-progress-bar-bg: #2780e3; + --bs-progress-bar-transition: width 0.6s ease; + display: flex; + height: var(--bs-progress-height); + overflow: hidden; + font-size: var(--bs-progress-font-size); + background-color: var(--bs-progress-bg); +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: var(--bs-progress-bar-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-progress-bar-bg); + transition: var(--bs-progress-bar-transition); +} +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: var(--bs-progress-height) var(--bs-progress-height); +} + +.progress-stacked > .progress { + overflow: visible; +} + +.progress-stacked > .progress > .progress-bar { + width: 100%; +} + +.progress-bar-animated { + animation: 1s linear infinite progress-bar-stripes; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + animation: none; + } +} + +.list-group { + --bs-list-group-color: var(--bs-body-color); + --bs-list-group-bg: var(--bs-body-bg); + --bs-list-group-border-color: var(--bs-border-color); + --bs-list-group-border-width: var(--bs-border-width); + --bs-list-group-border-radius: var(--bs-border-radius); + --bs-list-group-item-padding-x: 1rem; + --bs-list-group-item-padding-y: 0.5rem; + --bs-list-group-action-color: var(--bs-secondary-color); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-tertiary-bg); + --bs-list-group-action-active-color: var(--bs-body-color); + --bs-list-group-action-active-bg: var(--bs-secondary-bg); + --bs-list-group-disabled-color: var(--bs-secondary-color); + --bs-list-group-disabled-bg: var(--bs-body-bg); + --bs-list-group-active-color: #fff; + --bs-list-group-active-bg: #2780e3; + --bs-list-group-active-border-color: #2780e3; + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; +} + +.list-group-numbered { + list-style-type: none; + counter-reset: section; +} +.list-group-numbered > .list-group-item::before { + content: counters(section, ".") ". "; + counter-increment: section; +} + +.list-group-item-action { + width: 100%; + color: var(--bs-list-group-action-color); + text-align: inherit; +} +.list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: var(--bs-list-group-action-hover-color); + text-decoration: none; + background-color: var(--bs-list-group-action-hover-bg); +} +.list-group-item-action:active { + color: var(--bs-list-group-action-active-color); + background-color: var(--bs-list-group-action-active-bg); +} + +.list-group-item { + position: relative; + display: block; + padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x); + color: var(--bs-list-group-color); + text-decoration: none; + background-color: var(--bs-list-group-bg); + border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color); +} +.list-group-item.disabled, .list-group-item:disabled { + color: var(--bs-list-group-disabled-color); + pointer-events: none; + background-color: var(--bs-list-group-disabled-bg); +} +.list-group-item.active { + z-index: 2; + color: var(--bs-list-group-active-color); + background-color: var(--bs-list-group-active-bg); + border-color: var(--bs-list-group-active-border-color); +} +.list-group-item + .list-group-item { + border-top-width: 0; +} +.list-group-item + .list-group-item.active { + margin-top: calc(-1 * var(--bs-list-group-border-width)); + border-top-width: var(--bs-list-group-border-width); +} + +.list-group-horizontal { + flex-direction: row; +} +.list-group-horizontal > .list-group-item.active { + margin-top: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + flex-direction: row; + } + .list-group-horizontal-xxl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +.list-group-flush > .list-group-item { + border-width: 0 0 var(--bs-list-group-border-width); +} +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} + +.list-group-item-primary { + --bs-list-group-color: var(--bs-primary-text-emphasis); + --bs-list-group-bg: var(--bs-primary-bg-subtle); + --bs-list-group-border-color: var(--bs-primary-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-primary-border-subtle); + --bs-list-group-active-color: var(--bs-primary-bg-subtle); + --bs-list-group-active-bg: var(--bs-primary-text-emphasis); + --bs-list-group-active-border-color: var(--bs-primary-text-emphasis); +} + +.list-group-item-secondary { + --bs-list-group-color: var(--bs-secondary-text-emphasis); + --bs-list-group-bg: var(--bs-secondary-bg-subtle); + --bs-list-group-border-color: var(--bs-secondary-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle); + --bs-list-group-active-color: var(--bs-secondary-bg-subtle); + --bs-list-group-active-bg: var(--bs-secondary-text-emphasis); + --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis); +} + +.list-group-item-success { + --bs-list-group-color: var(--bs-success-text-emphasis); + --bs-list-group-bg: var(--bs-success-bg-subtle); + --bs-list-group-border-color: var(--bs-success-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-success-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-success-border-subtle); + --bs-list-group-active-color: var(--bs-success-bg-subtle); + --bs-list-group-active-bg: var(--bs-success-text-emphasis); + --bs-list-group-active-border-color: var(--bs-success-text-emphasis); +} + +.list-group-item-info { + --bs-list-group-color: var(--bs-info-text-emphasis); + --bs-list-group-bg: var(--bs-info-bg-subtle); + --bs-list-group-border-color: var(--bs-info-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-info-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-info-border-subtle); + --bs-list-group-active-color: var(--bs-info-bg-subtle); + --bs-list-group-active-bg: var(--bs-info-text-emphasis); + --bs-list-group-active-border-color: var(--bs-info-text-emphasis); +} + +.list-group-item-warning { + --bs-list-group-color: var(--bs-warning-text-emphasis); + --bs-list-group-bg: var(--bs-warning-bg-subtle); + --bs-list-group-border-color: var(--bs-warning-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-warning-border-subtle); + --bs-list-group-active-color: var(--bs-warning-bg-subtle); + --bs-list-group-active-bg: var(--bs-warning-text-emphasis); + --bs-list-group-active-border-color: var(--bs-warning-text-emphasis); +} + +.list-group-item-danger { + --bs-list-group-color: var(--bs-danger-text-emphasis); + --bs-list-group-bg: var(--bs-danger-bg-subtle); + --bs-list-group-border-color: var(--bs-danger-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-danger-border-subtle); + --bs-list-group-active-color: var(--bs-danger-bg-subtle); + --bs-list-group-active-bg: var(--bs-danger-text-emphasis); + --bs-list-group-active-border-color: var(--bs-danger-text-emphasis); +} + +.list-group-item-light { + --bs-list-group-color: var(--bs-light-text-emphasis); + --bs-list-group-bg: var(--bs-light-bg-subtle); + --bs-list-group-border-color: var(--bs-light-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-light-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-light-border-subtle); + --bs-list-group-active-color: var(--bs-light-bg-subtle); + --bs-list-group-active-bg: var(--bs-light-text-emphasis); + --bs-list-group-active-border-color: var(--bs-light-text-emphasis); +} + +.list-group-item-dark { + --bs-list-group-color: var(--bs-dark-text-emphasis); + --bs-list-group-bg: var(--bs-dark-bg-subtle); + --bs-list-group-border-color: var(--bs-dark-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-dark-border-subtle); + --bs-list-group-active-color: var(--bs-dark-bg-subtle); + --bs-list-group-active-bg: var(--bs-dark-text-emphasis); + --bs-list-group-active-border-color: var(--bs-dark-text-emphasis); +} + +.btn-close { + --bs-btn-close-color: #000; + --bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e"); + --bs-btn-close-opacity: 0.5; + --bs-btn-close-hover-opacity: 0.75; + --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25); + --bs-btn-close-focus-opacity: 1; + --bs-btn-close-disabled-opacity: 0.25; + --bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%); + box-sizing: content-box; + width: 1em; + height: 1em; + padding: 0.25em 0.25em; + color: var(--bs-btn-close-color); + background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat; + border: 0; + opacity: var(--bs-btn-close-opacity); +} +.btn-close:hover { + color: var(--bs-btn-close-color); + text-decoration: none; + opacity: var(--bs-btn-close-hover-opacity); +} +.btn-close:focus { + outline: 0; + box-shadow: var(--bs-btn-close-focus-shadow); + opacity: var(--bs-btn-close-focus-opacity); +} +.btn-close:disabled, .btn-close.disabled { + pointer-events: none; + user-select: none; + opacity: var(--bs-btn-close-disabled-opacity); +} + +.btn-close-white { + filter: var(--bs-btn-close-white-filter); +} + +[data-bs-theme=dark] .btn-close { + filter: var(--bs-btn-close-white-filter); +} + +.toast { + --bs-toast-zindex: 1090; + --bs-toast-padding-x: 0.75rem; + --bs-toast-padding-y: 0.5rem; + --bs-toast-spacing: 1.5rem; + --bs-toast-max-width: 350px; + --bs-toast-font-size: 0.875rem; + --bs-toast-color: ; + --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85); + --bs-toast-border-width: var(--bs-border-width); + --bs-toast-border-color: var(--bs-border-color-translucent); + --bs-toast-border-radius: var(--bs-border-radius); + --bs-toast-box-shadow: var(--bs-box-shadow); + --bs-toast-header-color: var(--bs-secondary-color); + --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85); + --bs-toast-header-border-color: var(--bs-border-color-translucent); + width: var(--bs-toast-max-width); + max-width: 100%; + font-size: var(--bs-toast-font-size); + color: var(--bs-toast-color); + pointer-events: auto; + background-color: var(--bs-toast-bg); + background-clip: padding-box; + border: var(--bs-toast-border-width) solid var(--bs-toast-border-color); + box-shadow: var(--bs-toast-box-shadow); +} +.toast.showing { + opacity: 0; +} +.toast:not(.show) { + display: none; +} + +.toast-container { + --bs-toast-zindex: 1090; + position: absolute; + z-index: var(--bs-toast-zindex); + width: max-content; + max-width: 100%; + pointer-events: none; +} +.toast-container > :not(:last-child) { + margin-bottom: var(--bs-toast-spacing); +} + +.toast-header { + display: flex; + align-items: center; + padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x); + color: var(--bs-toast-header-color); + background-color: var(--bs-toast-header-bg); + background-clip: padding-box; + border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color); +} +.toast-header .btn-close { + margin-right: calc(-0.5 * var(--bs-toast-padding-x)); + margin-left: var(--bs-toast-padding-x); +} + +.toast-body { + padding: var(--bs-toast-padding-x); + word-wrap: break-word; +} + +.modal { + --bs-modal-zindex: 1055; + --bs-modal-width: 500px; + --bs-modal-padding: 1rem; + --bs-modal-margin: 0.5rem; + --bs-modal-color: ; + --bs-modal-bg: var(--bs-body-bg); + --bs-modal-border-color: var(--bs-border-color-translucent); + --bs-modal-border-width: var(--bs-border-width); + --bs-modal-border-radius: var(--bs-border-radius-lg); + --bs-modal-box-shadow: var(--bs-box-shadow-sm); + --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width))); + --bs-modal-header-padding-x: 1rem; + --bs-modal-header-padding-y: 1rem; + --bs-modal-header-padding: 1rem 1rem; + --bs-modal-header-border-color: var(--bs-border-color); + --bs-modal-header-border-width: var(--bs-border-width); + --bs-modal-title-line-height: 1.5; + --bs-modal-footer-gap: 0.5rem; + --bs-modal-footer-bg: ; + --bs-modal-footer-border-color: var(--bs-border-color); + --bs-modal-footer-border-width: var(--bs-border-width); + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-modal-zindex); + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: var(--bs-modal-margin); + pointer-events: none; +} +.modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); +} +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} +.modal.show .modal-dialog { + transform: none; +} +.modal.modal-static .modal-dialog { + transform: scale(1.02); +} + +.modal-dialog-scrollable { + height: calc(100% - var(--bs-modal-margin) * 2); +} +.modal-dialog-scrollable .modal-content { + max-height: 100%; + overflow: hidden; +} +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - var(--bs-modal-margin) * 2); +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + color: var(--bs-modal-color); + pointer-events: auto; + background-color: var(--bs-modal-bg); + background-clip: padding-box; + border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); + outline: 0; +} + +.modal-backdrop { + --bs-backdrop-zindex: 1050; + --bs-backdrop-bg: #000; + --bs-backdrop-opacity: 0.5; + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-backdrop-zindex); + width: 100vw; + height: 100vh; + background-color: var(--bs-backdrop-bg); +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: var(--bs-backdrop-opacity); +} + +.modal-header { + display: flex; + flex-shrink: 0; + align-items: center; + padding: var(--bs-modal-header-padding); + border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color); +} +.modal-header .btn-close { + padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5); + margin: calc(-0.5 * var(--bs-modal-header-padding-y)) calc(-0.5 * var(--bs-modal-header-padding-x)) calc(-0.5 * var(--bs-modal-header-padding-y)) auto; +} + +.modal-title { + margin-bottom: 0; + line-height: var(--bs-modal-title-line-height); +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: var(--bs-modal-padding); +} + +.modal-footer { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5); + background-color: var(--bs-modal-footer-bg); + border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color); +} +.modal-footer > * { + margin: calc(var(--bs-modal-footer-gap) * 0.5); +} + +@media (min-width: 576px) { + .modal { + --bs-modal-margin: 1.75rem; + --bs-modal-box-shadow: var(--bs-box-shadow); + } + .modal-dialog { + max-width: var(--bs-modal-width); + margin-right: auto; + margin-left: auto; + } + .modal-sm { + --bs-modal-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + --bs-modal-width: 800px; + } +} +@media (min-width: 1200px) { + .modal-xl { + --bs-modal-width: 1140px; + } +} +.modal-fullscreen { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; +} +.modal-fullscreen .modal-content { + height: 100%; + border: 0; +} +.modal-fullscreen .modal-body { + overflow-y: auto; +} + +@media (max-width: 575.98px) { + .modal-fullscreen-sm-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-sm-down .modal-content { + height: 100%; + border: 0; + } + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 767.98px) { + .modal-fullscreen-md-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-md-down .modal-content { + height: 100%; + border: 0; + } + .modal-fullscreen-md-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 991.98px) { + .modal-fullscreen-lg-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-lg-down .modal-content { + height: 100%; + border: 0; + } + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 1199.98px) { + .modal-fullscreen-xl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xl-down .modal-content { + height: 100%; + border: 0; + } + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 1399.98px) { + .modal-fullscreen-xxl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xxl-down .modal-content { + height: 100%; + border: 0; + } + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto; + } +} +.tooltip { + --bs-tooltip-zindex: 1080; + --bs-tooltip-max-width: 200px; + --bs-tooltip-padding-x: 0.5rem; + --bs-tooltip-padding-y: 0.25rem; + --bs-tooltip-margin: ; + --bs-tooltip-font-size: 0.875rem; + --bs-tooltip-color: var(--bs-body-bg); + --bs-tooltip-bg: var(--bs-emphasis-color); + --bs-tooltip-border-radius: var(--bs-border-radius); + --bs-tooltip-opacity: 0.9; + --bs-tooltip-arrow-width: 0.8rem; + --bs-tooltip-arrow-height: 0.4rem; + z-index: var(--bs-tooltip-zindex); + display: block; + margin: var(--bs-tooltip-margin); + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-tooltip-font-size); + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: var(--bs-tooltip-opacity); +} +.tooltip .tooltip-arrow { + display: block; + width: var(--bs-tooltip-arrow-width); + height: var(--bs-tooltip-arrow-height); +} +.tooltip .tooltip-arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow { + bottom: calc(-1 * var(--bs-tooltip-arrow-height)); +} +.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before { + top: -1px; + border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-top-color: var(--bs-tooltip-bg); +} + +/* rtl:begin:ignore */ +.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow { + left: calc(-1 * var(--bs-tooltip-arrow-height)); + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); +} +.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before { + right: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-right-color: var(--bs-tooltip-bg); +} + +/* rtl:end:ignore */ +.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow { + top: calc(-1 * var(--bs-tooltip-arrow-height)); +} +.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before { + bottom: -1px; + border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-bottom-color: var(--bs-tooltip-bg); +} + +/* rtl:begin:ignore */ +.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow { + right: calc(-1 * var(--bs-tooltip-arrow-height)); + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); +} +.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before { + left: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-left-color: var(--bs-tooltip-bg); +} + +/* rtl:end:ignore */ +.tooltip-inner { + max-width: var(--bs-tooltip-max-width); + padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x); + color: var(--bs-tooltip-color); + text-align: center; + background-color: var(--bs-tooltip-bg); +} + +.popover { + --bs-popover-zindex: 1070; + --bs-popover-max-width: 276px; + --bs-popover-font-size: 0.875rem; + --bs-popover-bg: var(--bs-body-bg); + --bs-popover-border-width: var(--bs-border-width); + --bs-popover-border-color: var(--bs-border-color-translucent); + --bs-popover-border-radius: var(--bs-border-radius-lg); + --bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width)); + --bs-popover-box-shadow: var(--bs-box-shadow); + --bs-popover-header-padding-x: 1rem; + --bs-popover-header-padding-y: 0.5rem; + --bs-popover-header-font-size: 1rem; + --bs-popover-header-color: inherit; + --bs-popover-header-bg: var(--bs-secondary-bg); + --bs-popover-body-padding-x: 1rem; + --bs-popover-body-padding-y: 1rem; + --bs-popover-body-color: var(--bs-body-color); + --bs-popover-arrow-width: 1rem; + --bs-popover-arrow-height: 0.5rem; + --bs-popover-arrow-border: var(--bs-popover-border-color); + z-index: var(--bs-popover-zindex); + display: block; + max-width: var(--bs-popover-max-width); + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-popover-font-size); + word-wrap: break-word; + background-color: var(--bs-popover-bg); + background-clip: padding-box; + border: var(--bs-popover-border-width) solid var(--bs-popover-border-color); +} +.popover .popover-arrow { + display: block; + width: var(--bs-popover-arrow-width); + height: var(--bs-popover-arrow-height); +} +.popover .popover-arrow::before, .popover .popover-arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; + border-width: 0; +} + +.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow { + bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); +} +.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { + border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; +} +.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before { + bottom: 0; + border-top-color: var(--bs-popover-arrow-border); +} +.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { + bottom: var(--bs-popover-border-width); + border-top-color: var(--bs-popover-bg); +} + +/* rtl:begin:ignore */ +.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow { + left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; +} +.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before { + left: 0; + border-right-color: var(--bs-popover-arrow-border); +} +.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { + left: var(--bs-popover-border-width); + border-right-color: var(--bs-popover-bg); +} + +/* rtl:end:ignore */ +.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow { + top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); +} +.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { + border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); +} +.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before { + top: 0; + border-bottom-color: var(--bs-popover-arrow-border); +} +.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { + top: var(--bs-popover-border-width); + border-bottom-color: var(--bs-popover-bg); +} +.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: var(--bs-popover-arrow-width); + margin-left: calc(-0.5 * var(--bs-popover-arrow-width)); + content: ""; + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg); +} + +/* rtl:begin:ignore */ +.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow { + right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); +} +.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before { + right: 0; + border-left-color: var(--bs-popover-arrow-border); +} +.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { + right: var(--bs-popover-border-width); + border-left-color: var(--bs-popover-bg); +} + +/* rtl:end:ignore */ +.popover-header { + padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x); + margin-bottom: 0; + font-size: var(--bs-popover-header-font-size); + color: var(--bs-popover-header-color); + background-color: var(--bs-popover-header-bg); + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color); +} +.popover-header:empty { + display: none; +} + +.popover-body { + padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x); + color: var(--bs-popover-body-color); +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-start), +.active.carousel-item-end { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end), +.active.carousel-item-start { + transform: translateX(-100%); +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; +} +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-start, +.carousel-fade .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; +} +.carousel-fade .active.carousel-item-start, +.carousel-fade .active.carousel-item-end { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; +} +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-start, + .carousel-fade .active.carousel-item-end { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + padding: 0; + color: #fff; + text-align: center; + background: none; + border: 0; + opacity: 0.5; + transition: opacity 0.15s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; + } +} +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 2rem; + height: 2rem; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")*/; +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")*/; +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + margin-right: 15%; + margin-bottom: 1rem; + margin-left: 15%; +} +.carousel-indicators [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + padding: 0; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: 0.5; + transition: opacity 0.6s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-indicators [data-bs-target] { + transition: none; + } +} +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 1.25rem; + left: 15%; + padding-top: 1.25rem; + padding-bottom: 1.25rem; + color: #fff; + text-align: center; +} + +.carousel-dark .carousel-control-prev-icon, +.carousel-dark .carousel-control-next-icon { + filter: invert(1) grayscale(100); +} +.carousel-dark .carousel-indicators [data-bs-target] { + background-color: #000; +} +.carousel-dark .carousel-caption { + color: #000; +} + +[data-bs-theme=dark] .carousel .carousel-control-prev-icon, +[data-bs-theme=dark] .carousel .carousel-control-next-icon, [data-bs-theme=dark].carousel .carousel-control-prev-icon, +[data-bs-theme=dark].carousel .carousel-control-next-icon { + filter: invert(1) grayscale(100); +} +[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target], [data-bs-theme=dark].carousel .carousel-indicators [data-bs-target] { + background-color: #000; +} +[data-bs-theme=dark] .carousel .carousel-caption, [data-bs-theme=dark].carousel .carousel-caption { + color: #000; +} + +.spinner-grow, +.spinner-border { + display: inline-block; + width: var(--bs-spinner-width); + height: var(--bs-spinner-height); + vertical-align: var(--bs-spinner-vertical-align); + border-radius: 50%; + animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name); +} + +@keyframes spinner-border { + to { + transform: rotate(360deg) /* rtl:ignore */; + } +} +.spinner-border { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-border-width: 0.25em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-border; + border: var(--bs-spinner-border-width) solid currentcolor; + border-right-color: transparent; +} + +.spinner-border-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; + --bs-spinner-border-width: 0.2em; +} + +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } +} +.spinner-grow { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-grow; + background-color: currentcolor; + opacity: 0; +} + +.spinner-grow-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; +} + +@media (prefers-reduced-motion: reduce) { + .spinner-border, + .spinner-grow { + --bs-spinner-animation-speed: 1.5s; + } +} +.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm { + --bs-offcanvas-zindex: 1045; + --bs-offcanvas-width: 400px; + --bs-offcanvas-height: 30vh; + --bs-offcanvas-padding-x: 1rem; + --bs-offcanvas-padding-y: 1rem; + --bs-offcanvas-color: var(--bs-body-color); + --bs-offcanvas-bg: var(--bs-body-bg); + --bs-offcanvas-border-width: var(--bs-border-width); + --bs-offcanvas-border-color: var(--bs-border-color-translucent); + --bs-offcanvas-box-shadow: var(--bs-box-shadow-sm); + --bs-offcanvas-transition: transform 0.3s ease-in-out; + --bs-offcanvas-title-line-height: 1.5; +} + +@media (max-width: 575.98px) { + .offcanvas-sm { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-sm { + transition: none; + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-sm.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-sm.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-sm.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) { + transform: none; + } + .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show { + visibility: visible; + } +} +@media (min-width: 576px) { + .offcanvas-sm { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-sm .offcanvas-header { + display: none; + } + .offcanvas-sm .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 767.98px) { + .offcanvas-md { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-md { + transition: none; + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-md.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-md.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-md.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) { + transform: none; + } + .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show { + visibility: visible; + } +} +@media (min-width: 768px) { + .offcanvas-md { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-md .offcanvas-header { + display: none; + } + .offcanvas-md .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 991.98px) { + .offcanvas-lg { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-lg { + transition: none; + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-lg.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-lg.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-lg.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) { + transform: none; + } + .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show { + visibility: visible; + } +} +@media (min-width: 992px) { + .offcanvas-lg { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-lg .offcanvas-header { + display: none; + } + .offcanvas-lg .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 1199.98px) { + .offcanvas-xl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xl { + transition: none; + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-xl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-xl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-xl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) { + transform: none; + } + .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show { + visibility: visible; + } +} +@media (min-width: 1200px) { + .offcanvas-xl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xl .offcanvas-header { + display: none; + } + .offcanvas-xl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 1399.98px) { + .offcanvas-xxl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xxl { + transition: none; + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-xxl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-xxl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-xxl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) { + transform: none; + } + .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show { + visibility: visible; + } +} +@media (min-width: 1400px) { + .offcanvas-xxl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xxl .offcanvas-header { + display: none; + } + .offcanvas-xxl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +.offcanvas { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); +} +@media (prefers-reduced-motion: reduce) { + .offcanvas { + transition: none; + } +} +.offcanvas.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); +} +.offcanvas.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); +} +.offcanvas.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); +} +.offcanvas.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); +} +.offcanvas.showing, .offcanvas.show:not(.hiding) { + transform: none; +} +.offcanvas.showing, .offcanvas.hiding, .offcanvas.show { + visibility: visible; +} + +.offcanvas-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} +.offcanvas-backdrop.fade { + opacity: 0; +} +.offcanvas-backdrop.show { + opacity: 0.5; +} + +.offcanvas-header { + display: flex; + align-items: center; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); +} +.offcanvas-header .btn-close { + padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5); + margin: calc(-0.5 * var(--bs-offcanvas-padding-y)) calc(-0.5 * var(--bs-offcanvas-padding-x)) calc(-0.5 * var(--bs-offcanvas-padding-y)) auto; +} + +.offcanvas-title { + margin-bottom: 0; + line-height: var(--bs-offcanvas-title-line-height); +} + +.offcanvas-body { + flex-grow: 1; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); + overflow-y: auto; +} + +.placeholder { + display: inline-block; + min-height: 1em; + vertical-align: middle; + cursor: wait; + background-color: currentcolor; + opacity: 0.5; +} +.placeholder.btn::before { + display: inline-block; + content: ""; +} + +.placeholder-xs { + min-height: 0.6em; +} + +.placeholder-sm { + min-height: 0.8em; +} + +.placeholder-lg { + min-height: 1.2em; +} + +.placeholder-glow .placeholder { + animation: placeholder-glow 2s ease-in-out infinite; +} + +@keyframes placeholder-glow { + 50% { + opacity: 0.2; + } +} +.placeholder-wave { + mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + mask-size: 200% 100%; + animation: placeholder-wave 2s linear infinite; +} + +@keyframes placeholder-wave { + 100% { + mask-position: -200% 0%; + } +} +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.text-bg-primary { + color: #fff !important; + background-color: RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-secondary { + color: #fff !important; + background-color: RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-success { + color: #fff !important; + background-color: RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-info { + color: #fff !important; + background-color: RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-warning { + color: #fff !important; + background-color: RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-danger { + color: #fff !important; + background-color: RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-light { + color: #000 !important; + background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-dark { + color: #fff !important; + background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.link-primary { + color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-primary:hover, .link-primary:focus { + color: RGBA(31, 102, 182, var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(31, 102, 182, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-secondary { + color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-secondary:hover, .link-secondary:focus { + color: RGBA(44, 46, 48, var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(44, 46, 48, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-success { + color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-success:hover, .link-success:focus { + color: RGBA(50, 146, 19, var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(50, 146, 19, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-info { + color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-info:hover, .link-info:focus { + color: RGBA(122, 67, 150, var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(122, 67, 150, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-warning { + color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-warning:hover, .link-warning:focus { + color: RGBA(204, 94, 19, var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(204, 94, 19, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-danger { + color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-danger:hover, .link-danger:focus { + color: RGBA(204, 0, 46, var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(204, 0, 46, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-light { + color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-light:hover, .link-light:focus { + color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-dark { + color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-dark:hover, .link-dark:focus { + color: RGBA(44, 46, 48, var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(44, 46, 48, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-body-emphasis { + color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-body-emphasis:hover, .link-body-emphasis:focus { + color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important; + text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important; +} + +.focus-ring:focus { + outline: 0; + box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color); +} + +.icon-link { + display: inline-flex; + gap: 0.375rem; + align-items: center; + text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5)); + text-underline-offset: 0.25em; + backface-visibility: hidden; +} +.icon-link > .bi { + flex-shrink: 0; + width: 1em; + height: 1em; + fill: currentcolor; + transition: 0.2s ease-in-out transform; +} +@media (prefers-reduced-motion: reduce) { + .icon-link > .bi { + transition: none; + } +} + +.icon-link-hover:hover > .bi, .icon-link-hover:focus-visible > .bi { + transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0)); +} + +.ratio { + position: relative; + width: 100%; +} +.ratio::before { + display: block; + padding-top: var(--bs-aspect-ratio); + content: ""; +} +.ratio > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.ratio-1x1 { + --bs-aspect-ratio: 100%; +} + +.ratio-4x3 { + --bs-aspect-ratio: 75%; +} + +.ratio-16x9 { + --bs-aspect-ratio: 56.25%; +} + +.ratio-21x9 { + --bs-aspect-ratio: 42.8571428571%; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +.sticky-top { + position: sticky; + top: 0; + z-index: 1020; +} + +.sticky-bottom { + position: sticky; + bottom: 0; + z-index: 1020; +} + +@media (min-width: 576px) { + .sticky-sm-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-sm-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 768px) { + .sticky-md-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-md-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 992px) { + .sticky-lg-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-lg-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 1200px) { + .sticky-xl-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xl-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 1400px) { + .sticky-xxl-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xxl-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +.hstack { + display: flex; + flex-direction: row; + align-items: center; + align-self: stretch; +} + +.vstack { + display: flex; + flex: 1 1 auto; + flex-direction: column; + align-self: stretch; +} + +.visually-hidden, +.visually-hidden-focusable:not(:focus):not(:focus-within) { + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; +} +.visually-hidden:not(caption), +.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption) { + position: absolute !important; +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + content: ""; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.vr { + display: inline-block; + align-self: stretch; + width: var(--bs-border-width); + min-height: 1em; + background-color: currentcolor; + opacity: 0.25; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.float-start { + float: left !important; +} + +.float-end { + float: right !important; +} + +.float-none { + float: none !important; +} + +.object-fit-contain { + object-fit: contain !important; +} + +.object-fit-cover { + object-fit: cover !important; +} + +.object-fit-fill { + object-fit: fill !important; +} + +.object-fit-scale { + object-fit: scale-down !important; +} + +.object-fit-none { + object-fit: none !important; +} + +.opacity-0 { + opacity: 0 !important; +} + +.opacity-25 { + opacity: 0.25 !important; +} + +.opacity-50 { + opacity: 0.5 !important; +} + +.opacity-75 { + opacity: 0.75 !important; +} + +.opacity-100 { + opacity: 1 !important; +} + +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.overflow-visible { + overflow: visible !important; +} + +.overflow-scroll { + overflow: scroll !important; +} + +.overflow-x-auto { + overflow-x: auto !important; +} + +.overflow-x-hidden { + overflow-x: hidden !important; +} + +.overflow-x-visible { + overflow-x: visible !important; +} + +.overflow-x-scroll { + overflow-x: scroll !important; +} + +.overflow-y-auto { + overflow-y: auto !important; +} + +.overflow-y-hidden { + overflow-y: hidden !important; +} + +.overflow-y-visible { + overflow-y: visible !important; +} + +.overflow-y-scroll { + overflow-y: scroll !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-grid { + display: grid !important; +} + +.d-inline-grid { + display: inline-grid !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +.d-none { + display: none !important; +} + +.shadow { + box-shadow: var(--bs-box-shadow) !important; +} + +.shadow-sm { + box-shadow: var(--bs-box-shadow-sm) !important; +} + +.shadow-lg { + box-shadow: var(--bs-box-shadow-lg) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.focus-ring-primary { + --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-secondary { + --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-success { + --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-info { + --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-warning { + --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-danger { + --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-light { + --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-dark { + --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity)); +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: sticky !important; +} + +.top-0 { + top: 0 !important; +} + +.top-50 { + top: 50% !important; +} + +.top-100 { + top: 100% !important; +} + +.bottom-0 { + bottom: 0 !important; +} + +.bottom-50 { + bottom: 50% !important; +} + +.bottom-100 { + bottom: 100% !important; +} + +.start-0 { + left: 0 !important; +} + +.start-50 { + left: 50% !important; +} + +.start-100 { + left: 100% !important; +} + +.end-0 { + right: 0 !important; +} + +.end-50 { + right: 50% !important; +} + +.end-100 { + right: 100% !important; +} + +.translate-middle { + transform: translate(-50%, -50%) !important; +} + +.translate-middle-x { + transform: translateX(-50%) !important; +} + +.translate-middle-y { + transform: translateY(-50%) !important; +} + +.border { + border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top { + border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-end { + border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-end-0 { + border-right: 0 !important; +} + +.border-bottom { + border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-start { + border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-start-0 { + border-left: 0 !important; +} + +.border-primary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important; +} + +.border-secondary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important; +} + +.border-success { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important; +} + +.border-info { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important; +} + +.border-warning { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important; +} + +.border-danger { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important; +} + +.border-light { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important; +} + +.border-dark { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important; +} + +.border-black { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important; +} + +.border-white { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important; +} + +.border-primary-subtle { + border-color: var(--bs-primary-border-subtle) !important; +} + +.border-secondary-subtle { + border-color: var(--bs-secondary-border-subtle) !important; +} + +.border-success-subtle { + border-color: var(--bs-success-border-subtle) !important; +} + +.border-info-subtle { + border-color: var(--bs-info-border-subtle) !important; +} + +.border-warning-subtle { + border-color: var(--bs-warning-border-subtle) !important; +} + +.border-danger-subtle { + border-color: var(--bs-danger-border-subtle) !important; +} + +.border-light-subtle { + border-color: var(--bs-light-border-subtle) !important; +} + +.border-dark-subtle { + border-color: var(--bs-dark-border-subtle) !important; +} + +.border-1 { + border-width: 1px !important; +} + +.border-2 { + border-width: 2px !important; +} + +.border-3 { + border-width: 3px !important; +} + +.border-4 { + border-width: 4px !important; +} + +.border-5 { + border-width: 5px !important; +} + +.border-opacity-10 { + --bs-border-opacity: 0.1; +} + +.border-opacity-25 { + --bs-border-opacity: 0.25; +} + +.border-opacity-50 { + --bs-border-opacity: 0.5; +} + +.border-opacity-75 { + --bs-border-opacity: 0.75; +} + +.border-opacity-100 { + --bs-border-opacity: 1; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.vw-100 { + width: 100vw !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.vh-100 { + height: 100vh !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.justify-content-start { + justify-content: flex-start !important; +} + +.justify-content-end { + justify-content: flex-end !important; +} + +.justify-content-center { + justify-content: center !important; +} + +.justify-content-between { + justify-content: space-between !important; +} + +.justify-content-around { + justify-content: space-around !important; +} + +.justify-content-evenly { + justify-content: space-evenly !important; +} + +.align-items-start { + align-items: flex-start !important; +} + +.align-items-end { + align-items: flex-end !important; +} + +.align-items-center { + align-items: center !important; +} + +.align-items-baseline { + align-items: baseline !important; +} + +.align-items-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-between { + align-content: space-between !important; +} + +.align-content-around { + align-content: space-around !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +.order-first { + order: -1 !important; +} + +.order-0 { + order: 0 !important; +} + +.order-1 { + order: 1 !important; +} + +.order-2 { + order: 2 !important; +} + +.order-3 { + order: 3 !important; +} + +.order-4 { + order: 4 !important; +} + +.order-5 { + order: 5 !important; +} + +.order-last { + order: 6 !important; +} + +.m-0 { + margin: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} + +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} + +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} + +.mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} + +.mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} + +.mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mt-2 { + margin-top: 0.5rem !important; +} + +.mt-3 { + margin-top: 1rem !important; +} + +.mt-4 { + margin-top: 1.5rem !important; +} + +.mt-5 { + margin-top: 3rem !important; +} + +.mt-auto { + margin-top: auto !important; +} + +.me-0 { + margin-right: 0 !important; +} + +.me-1 { + margin-right: 0.25rem !important; +} + +.me-2 { + margin-right: 0.5rem !important; +} + +.me-3 { + margin-right: 1rem !important; +} + +.me-4 { + margin-right: 1.5rem !important; +} + +.me-5 { + margin-right: 3rem !important; +} + +.me-auto { + margin-right: auto !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.mb-3 { + margin-bottom: 1rem !important; +} + +.mb-4 { + margin-bottom: 1.5rem !important; +} + +.mb-5 { + margin-bottom: 3rem !important; +} + +.mb-auto { + margin-bottom: auto !important; +} + +.ms-0 { + margin-left: 0 !important; +} + +.ms-1 { + margin-left: 0.25rem !important; +} + +.ms-2 { + margin-left: 0.5rem !important; +} + +.ms-3 { + margin-left: 1rem !important; +} + +.ms-4 { + margin-left: 1.5rem !important; +} + +.ms-5 { + margin-left: 3rem !important; +} + +.ms-auto { + margin-left: auto !important; +} + +.p-0 { + padding: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} + +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} + +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} + +.px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} + +.px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} + +.px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.pt-0 { + padding-top: 0 !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pt-3 { + padding-top: 1rem !important; +} + +.pt-4 { + padding-top: 1.5rem !important; +} + +.pt-5 { + padding-top: 3rem !important; +} + +.pe-0 { + padding-right: 0 !important; +} + +.pe-1 { + padding-right: 0.25rem !important; +} + +.pe-2 { + padding-right: 0.5rem !important; +} + +.pe-3 { + padding-right: 1rem !important; +} + +.pe-4 { + padding-right: 1.5rem !important; +} + +.pe-5 { + padding-right: 3rem !important; +} + +.pb-0 { + padding-bottom: 0 !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pb-3 { + padding-bottom: 1rem !important; +} + +.pb-4 { + padding-bottom: 1.5rem !important; +} + +.pb-5 { + padding-bottom: 3rem !important; +} + +.ps-0 { + padding-left: 0 !important; +} + +.ps-1 { + padding-left: 0.25rem !important; +} + +.ps-2 { + padding-left: 0.5rem !important; +} + +.ps-3 { + padding-left: 1rem !important; +} + +.ps-4 { + padding-left: 1.5rem !important; +} + +.ps-5 { + padding-left: 3rem !important; +} + +.gap-0 { + gap: 0 !important; +} + +.gap-1 { + gap: 0.25rem !important; +} + +.gap-2 { + gap: 0.5rem !important; +} + +.gap-3 { + gap: 1rem !important; +} + +.gap-4 { + gap: 1.5rem !important; +} + +.gap-5 { + gap: 3rem !important; +} + +.row-gap-0 { + row-gap: 0 !important; +} + +.row-gap-1 { + row-gap: 0.25rem !important; +} + +.row-gap-2 { + row-gap: 0.5rem !important; +} + +.row-gap-3 { + row-gap: 1rem !important; +} + +.row-gap-4 { + row-gap: 1.5rem !important; +} + +.row-gap-5 { + row-gap: 3rem !important; +} + +.column-gap-0 { + column-gap: 0 !important; +} + +.column-gap-1 { + column-gap: 0.25rem !important; +} + +.column-gap-2 { + column-gap: 0.5rem !important; +} + +.column-gap-3 { + column-gap: 1rem !important; +} + +.column-gap-4 { + column-gap: 1.5rem !important; +} + +.column-gap-5 { + column-gap: 3rem !important; +} + +.font-monospace { + font-family: var(--bs-font-monospace) !important; +} + +.fs-1 { + font-size: calc(1.375rem + 1.5vw) !important; +} + +.fs-2 { + font-size: calc(1.325rem + 0.9vw) !important; +} + +.fs-3 { + font-size: calc(1.3rem + 0.6vw) !important; +} + +.fs-4 { + font-size: calc(1.275rem + 0.3vw) !important; +} + +.fs-5 { + font-size: 1.25rem !important; +} + +.fs-6 { + font-size: 1rem !important; +} + +.fst-italic { + font-style: italic !important; +} + +.fst-normal { + font-style: normal !important; +} + +.fw-lighter { + font-weight: lighter !important; +} + +.fw-light { + font-weight: 300 !important; +} + +.fw-normal { + font-weight: 400 !important; +} + +.fw-medium { + font-weight: 500 !important; +} + +.fw-semibold { + font-weight: 600 !important; +} + +.fw-bold { + font-weight: 700 !important; +} + +.fw-bolder { + font-weight: bolder !important; +} + +.lh-1 { + line-height: 1 !important; +} + +.lh-sm { + line-height: 1.25 !important; +} + +.lh-base { + line-height: 1.5 !important; +} + +.lh-lg { + line-height: 2 !important; +} + +.text-start { + text-align: left !important; +} + +.text-end { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-decoration-underline { + text-decoration: underline !important; +} + +.text-decoration-line-through { + text-decoration: line-through !important; +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +/* rtl:begin:remove */ +.text-break { + word-wrap: break-word !important; + word-break: break-word !important; +} + +/* rtl:end:remove */ +.text-primary { + --bs-text-opacity: 1; + color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; +} + +.text-secondary { + --bs-text-opacity: 1; + color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; +} + +.text-success { + --bs-text-opacity: 1; + color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; +} + +.text-info { + --bs-text-opacity: 1; + color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; +} + +.text-warning { + --bs-text-opacity: 1; + color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; +} + +.text-danger { + --bs-text-opacity: 1; + color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; +} + +.text-light { + --bs-text-opacity: 1; + color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; +} + +.text-dark { + --bs-text-opacity: 1; + color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; +} + +.text-black { + --bs-text-opacity: 1; + color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; +} + +.text-white { + --bs-text-opacity: 1; + color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; +} + +.text-body { + --bs-text-opacity: 1; + color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; +} + +.text-muted { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important; +} + +.text-black-50 { + --bs-text-opacity: 1; + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + --bs-text-opacity: 1; + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-body-secondary { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important; +} + +.text-body-tertiary { + --bs-text-opacity: 1; + color: var(--bs-tertiary-color) !important; +} + +.text-body-emphasis { + --bs-text-opacity: 1; + color: var(--bs-emphasis-color) !important; +} + +.text-reset { + --bs-text-opacity: 1; + color: inherit !important; +} + +.text-opacity-25 { + --bs-text-opacity: 0.25; +} + +.text-opacity-50 { + --bs-text-opacity: 0.5; +} + +.text-opacity-75 { + --bs-text-opacity: 0.75; +} + +.text-opacity-100 { + --bs-text-opacity: 1; +} + +.text-primary-emphasis { + color: var(--bs-primary-text-emphasis) !important; +} + +.text-secondary-emphasis { + color: var(--bs-secondary-text-emphasis) !important; +} + +.text-success-emphasis { + color: var(--bs-success-text-emphasis) !important; +} + +.text-info-emphasis { + color: var(--bs-info-text-emphasis) !important; +} + +.text-warning-emphasis { + color: var(--bs-warning-text-emphasis) !important; +} + +.text-danger-emphasis { + color: var(--bs-danger-text-emphasis) !important; +} + +.text-light-emphasis { + color: var(--bs-light-text-emphasis) !important; +} + +.text-dark-emphasis { + color: var(--bs-dark-text-emphasis) !important; +} + +.link-opacity-10 { + --bs-link-opacity: 0.1; +} + +.link-opacity-10-hover:hover { + --bs-link-opacity: 0.1; +} + +.link-opacity-25 { + --bs-link-opacity: 0.25; +} + +.link-opacity-25-hover:hover { + --bs-link-opacity: 0.25; +} + +.link-opacity-50 { + --bs-link-opacity: 0.5; +} + +.link-opacity-50-hover:hover { + --bs-link-opacity: 0.5; +} + +.link-opacity-75 { + --bs-link-opacity: 0.75; +} + +.link-opacity-75-hover:hover { + --bs-link-opacity: 0.75; +} + +.link-opacity-100 { + --bs-link-opacity: 1; +} + +.link-opacity-100-hover:hover { + --bs-link-opacity: 1; +} + +.link-offset-1 { + text-underline-offset: 0.125em !important; +} + +.link-offset-1-hover:hover { + text-underline-offset: 0.125em !important; +} + +.link-offset-2 { + text-underline-offset: 0.25em !important; +} + +.link-offset-2-hover:hover { + text-underline-offset: 0.25em !important; +} + +.link-offset-3 { + text-underline-offset: 0.375em !important; +} + +.link-offset-3-hover:hover { + text-underline-offset: 0.375em !important; +} + +.link-underline-primary { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-secondary { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-success { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-info { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-warning { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-danger { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-light { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-dark { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important; +} + +.link-underline-opacity-0 { + --bs-link-underline-opacity: 0; +} + +.link-underline-opacity-0-hover:hover { + --bs-link-underline-opacity: 0; +} + +.link-underline-opacity-10 { + --bs-link-underline-opacity: 0.1; +} + +.link-underline-opacity-10-hover:hover { + --bs-link-underline-opacity: 0.1; +} + +.link-underline-opacity-25 { + --bs-link-underline-opacity: 0.25; +} + +.link-underline-opacity-25-hover:hover { + --bs-link-underline-opacity: 0.25; +} + +.link-underline-opacity-50 { + --bs-link-underline-opacity: 0.5; +} + +.link-underline-opacity-50-hover:hover { + --bs-link-underline-opacity: 0.5; +} + +.link-underline-opacity-75 { + --bs-link-underline-opacity: 0.75; +} + +.link-underline-opacity-75-hover:hover { + --bs-link-underline-opacity: 0.75; +} + +.link-underline-opacity-100 { + --bs-link-underline-opacity: 1; +} + +.link-underline-opacity-100-hover:hover { + --bs-link-underline-opacity: 1; +} + +.bg-primary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-success { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-info { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-warning { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-danger { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-light { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-dark { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-black { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-white { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-body { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-transparent { + --bs-bg-opacity: 1; + background-color: transparent !important; +} + +.bg-body-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-body-tertiary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-opacity-10 { + --bs-bg-opacity: 0.1; +} + +.bg-opacity-25 { + --bs-bg-opacity: 0.25; +} + +.bg-opacity-50 { + --bs-bg-opacity: 0.5; +} + +.bg-opacity-75 { + --bs-bg-opacity: 0.75; +} + +.bg-opacity-100 { + --bs-bg-opacity: 1; +} + +.bg-primary-subtle { + background-color: var(--bs-primary-bg-subtle) !important; +} + +.bg-secondary-subtle { + background-color: var(--bs-secondary-bg-subtle) !important; +} + +.bg-success-subtle { + background-color: var(--bs-success-bg-subtle) !important; +} + +.bg-info-subtle { + background-color: var(--bs-info-bg-subtle) !important; +} + +.bg-warning-subtle { + background-color: var(--bs-warning-bg-subtle) !important; +} + +.bg-danger-subtle { + background-color: var(--bs-danger-bg-subtle) !important; +} + +.bg-light-subtle { + background-color: var(--bs-light-bg-subtle) !important; +} + +.bg-dark-subtle { + background-color: var(--bs-dark-bg-subtle) !important; +} + +.bg-gradient { + background-image: var(--bs-gradient) !important; +} + +.user-select-all { + user-select: all !important; +} + +.user-select-auto { + user-select: auto !important; +} + +.user-select-none { + user-select: none !important; +} + +.pe-none { + pointer-events: none !important; +} + +.pe-auto { + pointer-events: auto !important; +} + +.rounded { + border-radius: var(--bs-border-radius) !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.rounded-1 { + border-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-2 { + border-radius: var(--bs-border-radius) !important; +} + +.rounded-3 { + border-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-4 { + border-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-5 { + border-radius: var(--bs-border-radius-xxl) !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: var(--bs-border-radius-pill) !important; +} + +.rounded-top { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} + +.rounded-top-0 { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} + +.rounded-top-1 { + border-top-left-radius: var(--bs-border-radius-sm) !important; + border-top-right-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-top-2 { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} + +.rounded-top-3 { + border-top-left-radius: var(--bs-border-radius-lg) !important; + border-top-right-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-top-4 { + border-top-left-radius: var(--bs-border-radius-xl) !important; + border-top-right-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-top-5 { + border-top-left-radius: var(--bs-border-radius-xxl) !important; + border-top-right-radius: var(--bs-border-radius-xxl) !important; +} + +.rounded-top-circle { + border-top-left-radius: 50% !important; + border-top-right-radius: 50% !important; +} + +.rounded-top-pill { + border-top-left-radius: var(--bs-border-radius-pill) !important; + border-top-right-radius: var(--bs-border-radius-pill) !important; +} + +.rounded-end { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} + +.rounded-end-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +.rounded-end-1 { + border-top-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-right-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-end-2 { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} + +.rounded-end-3 { + border-top-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-right-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-end-4 { + border-top-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-right-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-end-5 { + border-top-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; +} + +.rounded-end-circle { + border-top-right-radius: 50% !important; + border-bottom-right-radius: 50% !important; +} + +.rounded-end-pill { + border-top-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-right-radius: var(--bs-border-radius-pill) !important; +} + +.rounded-bottom { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} + +.rounded-bottom-0 { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} + +.rounded-bottom-1 { + border-bottom-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-left-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-bottom-2 { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} + +.rounded-bottom-3 { + border-bottom-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-left-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-bottom-4 { + border-bottom-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-left-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-bottom-5 { + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; +} + +.rounded-bottom-circle { + border-bottom-right-radius: 50% !important; + border-bottom-left-radius: 50% !important; +} + +.rounded-bottom-pill { + border-bottom-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-left-radius: var(--bs-border-radius-pill) !important; +} + +.rounded-start { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} + +.rounded-start-0 { + border-bottom-left-radius: 0 !important; + border-top-left-radius: 0 !important; +} + +.rounded-start-1 { + border-bottom-left-radius: var(--bs-border-radius-sm) !important; + border-top-left-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-start-2 { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} + +.rounded-start-3 { + border-bottom-left-radius: var(--bs-border-radius-lg) !important; + border-top-left-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-start-4 { + border-bottom-left-radius: var(--bs-border-radius-xl) !important; + border-top-left-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-start-5 { + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; + border-top-left-radius: var(--bs-border-radius-xxl) !important; +} + +.rounded-start-circle { + border-bottom-left-radius: 50% !important; + border-top-left-radius: 50% !important; +} + +.rounded-start-pill { + border-bottom-left-radius: var(--bs-border-radius-pill) !important; + border-top-left-radius: var(--bs-border-radius-pill) !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +.z-n1 { + z-index: -1 !important; +} + +.z-0 { + z-index: 0 !important; +} + +.z-1 { + z-index: 1 !important; +} + +.z-2 { + z-index: 2 !important; +} + +.z-3 { + z-index: 3 !important; +} + +@media (min-width: 576px) { + .float-sm-start { + float: left !important; + } + .float-sm-end { + float: right !important; + } + .float-sm-none { + float: none !important; + } + .object-fit-sm-contain { + object-fit: contain !important; + } + .object-fit-sm-cover { + object-fit: cover !important; + } + .object-fit-sm-fill { + object-fit: fill !important; + } + .object-fit-sm-scale { + object-fit: scale-down !important; + } + .object-fit-sm-none { + object-fit: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-grid { + display: grid !important; + } + .d-sm-inline-grid { + display: inline-grid !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline-flex { + display: inline-flex !important; + } + .d-sm-none { + display: none !important; + } + .flex-sm-fill { + flex: 1 1 auto !important; + } + .flex-sm-row { + flex-direction: row !important; + } + .flex-sm-column { + flex-direction: column !important; + } + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + .flex-sm-wrap { + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-sm-start { + justify-content: flex-start !important; + } + .justify-content-sm-end { + justify-content: flex-end !important; + } + .justify-content-sm-center { + justify-content: center !important; + } + .justify-content-sm-between { + justify-content: space-between !important; + } + .justify-content-sm-around { + justify-content: space-around !important; + } + .justify-content-sm-evenly { + justify-content: space-evenly !important; + } + .align-items-sm-start { + align-items: flex-start !important; + } + .align-items-sm-end { + align-items: flex-end !important; + } + .align-items-sm-center { + align-items: center !important; + } + .align-items-sm-baseline { + align-items: baseline !important; + } + .align-items-sm-stretch { + align-items: stretch !important; + } + .align-content-sm-start { + align-content: flex-start !important; + } + .align-content-sm-end { + align-content: flex-end !important; + } + .align-content-sm-center { + align-content: center !important; + } + .align-content-sm-between { + align-content: space-between !important; + } + .align-content-sm-around { + align-content: space-around !important; + } + .align-content-sm-stretch { + align-content: stretch !important; + } + .align-self-sm-auto { + align-self: auto !important; + } + .align-self-sm-start { + align-self: flex-start !important; + } + .align-self-sm-end { + align-self: flex-end !important; + } + .align-self-sm-center { + align-self: center !important; + } + .align-self-sm-baseline { + align-self: baseline !important; + } + .align-self-sm-stretch { + align-self: stretch !important; + } + .order-sm-first { + order: -1 !important; + } + .order-sm-0 { + order: 0 !important; + } + .order-sm-1 { + order: 1 !important; + } + .order-sm-2 { + order: 2 !important; + } + .order-sm-3 { + order: 3 !important; + } + .order-sm-4 { + order: 4 !important; + } + .order-sm-5 { + order: 5 !important; + } + .order-sm-last { + order: 6 !important; + } + .m-sm-0 { + margin: 0 !important; + } + .m-sm-1 { + margin: 0.25rem !important; + } + .m-sm-2 { + margin: 0.5rem !important; + } + .m-sm-3 { + margin: 1rem !important; + } + .m-sm-4 { + margin: 1.5rem !important; + } + .m-sm-5 { + margin: 3rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-sm-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-sm-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-sm-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-sm-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-sm-0 { + margin-top: 0 !important; + } + .mt-sm-1 { + margin-top: 0.25rem !important; + } + .mt-sm-2 { + margin-top: 0.5rem !important; + } + .mt-sm-3 { + margin-top: 1rem !important; + } + .mt-sm-4 { + margin-top: 1.5rem !important; + } + .mt-sm-5 { + margin-top: 3rem !important; + } + .mt-sm-auto { + margin-top: auto !important; + } + .me-sm-0 { + margin-right: 0 !important; + } + .me-sm-1 { + margin-right: 0.25rem !important; + } + .me-sm-2 { + margin-right: 0.5rem !important; + } + .me-sm-3 { + margin-right: 1rem !important; + } + .me-sm-4 { + margin-right: 1.5rem !important; + } + .me-sm-5 { + margin-right: 3rem !important; + } + .me-sm-auto { + margin-right: auto !important; + } + .mb-sm-0 { + margin-bottom: 0 !important; + } + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + .mb-sm-3 { + margin-bottom: 1rem !important; + } + .mb-sm-4 { + margin-bottom: 1.5rem !important; + } + .mb-sm-5 { + margin-bottom: 3rem !important; + } + .mb-sm-auto { + margin-bottom: auto !important; + } + .ms-sm-0 { + margin-left: 0 !important; + } + .ms-sm-1 { + margin-left: 0.25rem !important; + } + .ms-sm-2 { + margin-left: 0.5rem !important; + } + .ms-sm-3 { + margin-left: 1rem !important; + } + .ms-sm-4 { + margin-left: 1.5rem !important; + } + .ms-sm-5 { + margin-left: 3rem !important; + } + .ms-sm-auto { + margin-left: auto !important; + } + .p-sm-0 { + padding: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .p-sm-3 { + padding: 1rem !important; + } + .p-sm-4 { + padding: 1.5rem !important; + } + .p-sm-5 { + padding: 3rem !important; + } + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-sm-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-sm-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-sm-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-sm-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-sm-0 { + padding-top: 0 !important; + } + .pt-sm-1 { + padding-top: 0.25rem !important; + } + .pt-sm-2 { + padding-top: 0.5rem !important; + } + .pt-sm-3 { + padding-top: 1rem !important; + } + .pt-sm-4 { + padding-top: 1.5rem !important; + } + .pt-sm-5 { + padding-top: 3rem !important; + } + .pe-sm-0 { + padding-right: 0 !important; + } + .pe-sm-1 { + padding-right: 0.25rem !important; + } + .pe-sm-2 { + padding-right: 0.5rem !important; + } + .pe-sm-3 { + padding-right: 1rem !important; + } + .pe-sm-4 { + padding-right: 1.5rem !important; + } + .pe-sm-5 { + padding-right: 3rem !important; + } + .pb-sm-0 { + padding-bottom: 0 !important; + } + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + .pb-sm-3 { + padding-bottom: 1rem !important; + } + .pb-sm-4 { + padding-bottom: 1.5rem !important; + } + .pb-sm-5 { + padding-bottom: 3rem !important; + } + .ps-sm-0 { + padding-left: 0 !important; + } + .ps-sm-1 { + padding-left: 0.25rem !important; + } + .ps-sm-2 { + padding-left: 0.5rem !important; + } + .ps-sm-3 { + padding-left: 1rem !important; + } + .ps-sm-4 { + padding-left: 1.5rem !important; + } + .ps-sm-5 { + padding-left: 3rem !important; + } + .gap-sm-0 { + gap: 0 !important; + } + .gap-sm-1 { + gap: 0.25rem !important; + } + .gap-sm-2 { + gap: 0.5rem !important; + } + .gap-sm-3 { + gap: 1rem !important; + } + .gap-sm-4 { + gap: 1.5rem !important; + } + .gap-sm-5 { + gap: 3rem !important; + } + .row-gap-sm-0 { + row-gap: 0 !important; + } + .row-gap-sm-1 { + row-gap: 0.25rem !important; + } + .row-gap-sm-2 { + row-gap: 0.5rem !important; + } + .row-gap-sm-3 { + row-gap: 1rem !important; + } + .row-gap-sm-4 { + row-gap: 1.5rem !important; + } + .row-gap-sm-5 { + row-gap: 3rem !important; + } + .column-gap-sm-0 { + column-gap: 0 !important; + } + .column-gap-sm-1 { + column-gap: 0.25rem !important; + } + .column-gap-sm-2 { + column-gap: 0.5rem !important; + } + .column-gap-sm-3 { + column-gap: 1rem !important; + } + .column-gap-sm-4 { + column-gap: 1.5rem !important; + } + .column-gap-sm-5 { + column-gap: 3rem !important; + } + .text-sm-start { + text-align: left !important; + } + .text-sm-end { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .float-md-start { + float: left !important; + } + .float-md-end { + float: right !important; + } + .float-md-none { + float: none !important; + } + .object-fit-md-contain { + object-fit: contain !important; + } + .object-fit-md-cover { + object-fit: cover !important; + } + .object-fit-md-fill { + object-fit: fill !important; + } + .object-fit-md-scale { + object-fit: scale-down !important; + } + .object-fit-md-none { + object-fit: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-grid { + display: grid !important; + } + .d-md-inline-grid { + display: inline-grid !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline-flex { + display: inline-flex !important; + } + .d-md-none { + display: none !important; + } + .flex-md-fill { + flex: 1 1 auto !important; + } + .flex-md-row { + flex-direction: row !important; + } + .flex-md-column { + flex-direction: column !important; + } + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + .flex-md-grow-0 { + flex-grow: 0 !important; + } + .flex-md-grow-1 { + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + .flex-md-wrap { + flex-wrap: wrap !important; + } + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-md-start { + justify-content: flex-start !important; + } + .justify-content-md-end { + justify-content: flex-end !important; + } + .justify-content-md-center { + justify-content: center !important; + } + .justify-content-md-between { + justify-content: space-between !important; + } + .justify-content-md-around { + justify-content: space-around !important; + } + .justify-content-md-evenly { + justify-content: space-evenly !important; + } + .align-items-md-start { + align-items: flex-start !important; + } + .align-items-md-end { + align-items: flex-end !important; + } + .align-items-md-center { + align-items: center !important; + } + .align-items-md-baseline { + align-items: baseline !important; + } + .align-items-md-stretch { + align-items: stretch !important; + } + .align-content-md-start { + align-content: flex-start !important; + } + .align-content-md-end { + align-content: flex-end !important; + } + .align-content-md-center { + align-content: center !important; + } + .align-content-md-between { + align-content: space-between !important; + } + .align-content-md-around { + align-content: space-around !important; + } + .align-content-md-stretch { + align-content: stretch !important; + } + .align-self-md-auto { + align-self: auto !important; + } + .align-self-md-start { + align-self: flex-start !important; + } + .align-self-md-end { + align-self: flex-end !important; + } + .align-self-md-center { + align-self: center !important; + } + .align-self-md-baseline { + align-self: baseline !important; + } + .align-self-md-stretch { + align-self: stretch !important; + } + .order-md-first { + order: -1 !important; + } + .order-md-0 { + order: 0 !important; + } + .order-md-1 { + order: 1 !important; + } + .order-md-2 { + order: 2 !important; + } + .order-md-3 { + order: 3 !important; + } + .order-md-4 { + order: 4 !important; + } + .order-md-5 { + order: 5 !important; + } + .order-md-last { + order: 6 !important; + } + .m-md-0 { + margin: 0 !important; + } + .m-md-1 { + margin: 0.25rem !important; + } + .m-md-2 { + margin: 0.5rem !important; + } + .m-md-3 { + margin: 1rem !important; + } + .m-md-4 { + margin: 1.5rem !important; + } + .m-md-5 { + margin: 3rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-md-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-md-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-md-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-md-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-md-0 { + margin-top: 0 !important; + } + .mt-md-1 { + margin-top: 0.25rem !important; + } + .mt-md-2 { + margin-top: 0.5rem !important; + } + .mt-md-3 { + margin-top: 1rem !important; + } + .mt-md-4 { + margin-top: 1.5rem !important; + } + .mt-md-5 { + margin-top: 3rem !important; + } + .mt-md-auto { + margin-top: auto !important; + } + .me-md-0 { + margin-right: 0 !important; + } + .me-md-1 { + margin-right: 0.25rem !important; + } + .me-md-2 { + margin-right: 0.5rem !important; + } + .me-md-3 { + margin-right: 1rem !important; + } + .me-md-4 { + margin-right: 1.5rem !important; + } + .me-md-5 { + margin-right: 3rem !important; + } + .me-md-auto { + margin-right: auto !important; + } + .mb-md-0 { + margin-bottom: 0 !important; + } + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + .mb-md-3 { + margin-bottom: 1rem !important; + } + .mb-md-4 { + margin-bottom: 1.5rem !important; + } + .mb-md-5 { + margin-bottom: 3rem !important; + } + .mb-md-auto { + margin-bottom: auto !important; + } + .ms-md-0 { + margin-left: 0 !important; + } + .ms-md-1 { + margin-left: 0.25rem !important; + } + .ms-md-2 { + margin-left: 0.5rem !important; + } + .ms-md-3 { + margin-left: 1rem !important; + } + .ms-md-4 { + margin-left: 1.5rem !important; + } + .ms-md-5 { + margin-left: 3rem !important; + } + .ms-md-auto { + margin-left: auto !important; + } + .p-md-0 { + padding: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .p-md-3 { + padding: 1rem !important; + } + .p-md-4 { + padding: 1.5rem !important; + } + .p-md-5 { + padding: 3rem !important; + } + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-md-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-md-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-md-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-md-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-md-0 { + padding-top: 0 !important; + } + .pt-md-1 { + padding-top: 0.25rem !important; + } + .pt-md-2 { + padding-top: 0.5rem !important; + } + .pt-md-3 { + padding-top: 1rem !important; + } + .pt-md-4 { + padding-top: 1.5rem !important; + } + .pt-md-5 { + padding-top: 3rem !important; + } + .pe-md-0 { + padding-right: 0 !important; + } + .pe-md-1 { + padding-right: 0.25rem !important; + } + .pe-md-2 { + padding-right: 0.5rem !important; + } + .pe-md-3 { + padding-right: 1rem !important; + } + .pe-md-4 { + padding-right: 1.5rem !important; + } + .pe-md-5 { + padding-right: 3rem !important; + } + .pb-md-0 { + padding-bottom: 0 !important; + } + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + .pb-md-3 { + padding-bottom: 1rem !important; + } + .pb-md-4 { + padding-bottom: 1.5rem !important; + } + .pb-md-5 { + padding-bottom: 3rem !important; + } + .ps-md-0 { + padding-left: 0 !important; + } + .ps-md-1 { + padding-left: 0.25rem !important; + } + .ps-md-2 { + padding-left: 0.5rem !important; + } + .ps-md-3 { + padding-left: 1rem !important; + } + .ps-md-4 { + padding-left: 1.5rem !important; + } + .ps-md-5 { + padding-left: 3rem !important; + } + .gap-md-0 { + gap: 0 !important; + } + .gap-md-1 { + gap: 0.25rem !important; + } + .gap-md-2 { + gap: 0.5rem !important; + } + .gap-md-3 { + gap: 1rem !important; + } + .gap-md-4 { + gap: 1.5rem !important; + } + .gap-md-5 { + gap: 3rem !important; + } + .row-gap-md-0 { + row-gap: 0 !important; + } + .row-gap-md-1 { + row-gap: 0.25rem !important; + } + .row-gap-md-2 { + row-gap: 0.5rem !important; + } + .row-gap-md-3 { + row-gap: 1rem !important; + } + .row-gap-md-4 { + row-gap: 1.5rem !important; + } + .row-gap-md-5 { + row-gap: 3rem !important; + } + .column-gap-md-0 { + column-gap: 0 !important; + } + .column-gap-md-1 { + column-gap: 0.25rem !important; + } + .column-gap-md-2 { + column-gap: 0.5rem !important; + } + .column-gap-md-3 { + column-gap: 1rem !important; + } + .column-gap-md-4 { + column-gap: 1.5rem !important; + } + .column-gap-md-5 { + column-gap: 3rem !important; + } + .text-md-start { + text-align: left !important; + } + .text-md-end { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .float-lg-start { + float: left !important; + } + .float-lg-end { + float: right !important; + } + .float-lg-none { + float: none !important; + } + .object-fit-lg-contain { + object-fit: contain !important; + } + .object-fit-lg-cover { + object-fit: cover !important; + } + .object-fit-lg-fill { + object-fit: fill !important; + } + .object-fit-lg-scale { + object-fit: scale-down !important; + } + .object-fit-lg-none { + object-fit: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-grid { + display: grid !important; + } + .d-lg-inline-grid { + display: inline-grid !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline-flex { + display: inline-flex !important; + } + .d-lg-none { + display: none !important; + } + .flex-lg-fill { + flex: 1 1 auto !important; + } + .flex-lg-row { + flex-direction: row !important; + } + .flex-lg-column { + flex-direction: column !important; + } + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + .flex-lg-wrap { + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-lg-start { + justify-content: flex-start !important; + } + .justify-content-lg-end { + justify-content: flex-end !important; + } + .justify-content-lg-center { + justify-content: center !important; + } + .justify-content-lg-between { + justify-content: space-between !important; + } + .justify-content-lg-around { + justify-content: space-around !important; + } + .justify-content-lg-evenly { + justify-content: space-evenly !important; + } + .align-items-lg-start { + align-items: flex-start !important; + } + .align-items-lg-end { + align-items: flex-end !important; + } + .align-items-lg-center { + align-items: center !important; + } + .align-items-lg-baseline { + align-items: baseline !important; + } + .align-items-lg-stretch { + align-items: stretch !important; + } + .align-content-lg-start { + align-content: flex-start !important; + } + .align-content-lg-end { + align-content: flex-end !important; + } + .align-content-lg-center { + align-content: center !important; + } + .align-content-lg-between { + align-content: space-between !important; + } + .align-content-lg-around { + align-content: space-around !important; + } + .align-content-lg-stretch { + align-content: stretch !important; + } + .align-self-lg-auto { + align-self: auto !important; + } + .align-self-lg-start { + align-self: flex-start !important; + } + .align-self-lg-end { + align-self: flex-end !important; + } + .align-self-lg-center { + align-self: center !important; + } + .align-self-lg-baseline { + align-self: baseline !important; + } + .align-self-lg-stretch { + align-self: stretch !important; + } + .order-lg-first { + order: -1 !important; + } + .order-lg-0 { + order: 0 !important; + } + .order-lg-1 { + order: 1 !important; + } + .order-lg-2 { + order: 2 !important; + } + .order-lg-3 { + order: 3 !important; + } + .order-lg-4 { + order: 4 !important; + } + .order-lg-5 { + order: 5 !important; + } + .order-lg-last { + order: 6 !important; + } + .m-lg-0 { + margin: 0 !important; + } + .m-lg-1 { + margin: 0.25rem !important; + } + .m-lg-2 { + margin: 0.5rem !important; + } + .m-lg-3 { + margin: 1rem !important; + } + .m-lg-4 { + margin: 1.5rem !important; + } + .m-lg-5 { + margin: 3rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-lg-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-lg-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-lg-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-lg-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-lg-0 { + margin-top: 0 !important; + } + .mt-lg-1 { + margin-top: 0.25rem !important; + } + .mt-lg-2 { + margin-top: 0.5rem !important; + } + .mt-lg-3 { + margin-top: 1rem !important; + } + .mt-lg-4 { + margin-top: 1.5rem !important; + } + .mt-lg-5 { + margin-top: 3rem !important; + } + .mt-lg-auto { + margin-top: auto !important; + } + .me-lg-0 { + margin-right: 0 !important; + } + .me-lg-1 { + margin-right: 0.25rem !important; + } + .me-lg-2 { + margin-right: 0.5rem !important; + } + .me-lg-3 { + margin-right: 1rem !important; + } + .me-lg-4 { + margin-right: 1.5rem !important; + } + .me-lg-5 { + margin-right: 3rem !important; + } + .me-lg-auto { + margin-right: auto !important; + } + .mb-lg-0 { + margin-bottom: 0 !important; + } + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + .mb-lg-3 { + margin-bottom: 1rem !important; + } + .mb-lg-4 { + margin-bottom: 1.5rem !important; + } + .mb-lg-5 { + margin-bottom: 3rem !important; + } + .mb-lg-auto { + margin-bottom: auto !important; + } + .ms-lg-0 { + margin-left: 0 !important; + } + .ms-lg-1 { + margin-left: 0.25rem !important; + } + .ms-lg-2 { + margin-left: 0.5rem !important; + } + .ms-lg-3 { + margin-left: 1rem !important; + } + .ms-lg-4 { + margin-left: 1.5rem !important; + } + .ms-lg-5 { + margin-left: 3rem !important; + } + .ms-lg-auto { + margin-left: auto !important; + } + .p-lg-0 { + padding: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .p-lg-3 { + padding: 1rem !important; + } + .p-lg-4 { + padding: 1.5rem !important; + } + .p-lg-5 { + padding: 3rem !important; + } + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-lg-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-lg-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-lg-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-lg-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-lg-0 { + padding-top: 0 !important; + } + .pt-lg-1 { + padding-top: 0.25rem !important; + } + .pt-lg-2 { + padding-top: 0.5rem !important; + } + .pt-lg-3 { + padding-top: 1rem !important; + } + .pt-lg-4 { + padding-top: 1.5rem !important; + } + .pt-lg-5 { + padding-top: 3rem !important; + } + .pe-lg-0 { + padding-right: 0 !important; + } + .pe-lg-1 { + padding-right: 0.25rem !important; + } + .pe-lg-2 { + padding-right: 0.5rem !important; + } + .pe-lg-3 { + padding-right: 1rem !important; + } + .pe-lg-4 { + padding-right: 1.5rem !important; + } + .pe-lg-5 { + padding-right: 3rem !important; + } + .pb-lg-0 { + padding-bottom: 0 !important; + } + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + .pb-lg-3 { + padding-bottom: 1rem !important; + } + .pb-lg-4 { + padding-bottom: 1.5rem !important; + } + .pb-lg-5 { + padding-bottom: 3rem !important; + } + .ps-lg-0 { + padding-left: 0 !important; + } + .ps-lg-1 { + padding-left: 0.25rem !important; + } + .ps-lg-2 { + padding-left: 0.5rem !important; + } + .ps-lg-3 { + padding-left: 1rem !important; + } + .ps-lg-4 { + padding-left: 1.5rem !important; + } + .ps-lg-5 { + padding-left: 3rem !important; + } + .gap-lg-0 { + gap: 0 !important; + } + .gap-lg-1 { + gap: 0.25rem !important; + } + .gap-lg-2 { + gap: 0.5rem !important; + } + .gap-lg-3 { + gap: 1rem !important; + } + .gap-lg-4 { + gap: 1.5rem !important; + } + .gap-lg-5 { + gap: 3rem !important; + } + .row-gap-lg-0 { + row-gap: 0 !important; + } + .row-gap-lg-1 { + row-gap: 0.25rem !important; + } + .row-gap-lg-2 { + row-gap: 0.5rem !important; + } + .row-gap-lg-3 { + row-gap: 1rem !important; + } + .row-gap-lg-4 { + row-gap: 1.5rem !important; + } + .row-gap-lg-5 { + row-gap: 3rem !important; + } + .column-gap-lg-0 { + column-gap: 0 !important; + } + .column-gap-lg-1 { + column-gap: 0.25rem !important; + } + .column-gap-lg-2 { + column-gap: 0.5rem !important; + } + .column-gap-lg-3 { + column-gap: 1rem !important; + } + .column-gap-lg-4 { + column-gap: 1.5rem !important; + } + .column-gap-lg-5 { + column-gap: 3rem !important; + } + .text-lg-start { + text-align: left !important; + } + .text-lg-end { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .float-xl-start { + float: left !important; + } + .float-xl-end { + float: right !important; + } + .float-xl-none { + float: none !important; + } + .object-fit-xl-contain { + object-fit: contain !important; + } + .object-fit-xl-cover { + object-fit: cover !important; + } + .object-fit-xl-fill { + object-fit: fill !important; + } + .object-fit-xl-scale { + object-fit: scale-down !important; + } + .object-fit-xl-none { + object-fit: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-grid { + display: grid !important; + } + .d-xl-inline-grid { + display: inline-grid !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline-flex { + display: inline-flex !important; + } + .d-xl-none { + display: none !important; + } + .flex-xl-fill { + flex: 1 1 auto !important; + } + .flex-xl-row { + flex-direction: row !important; + } + .flex-xl-column { + flex-direction: column !important; + } + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xl-wrap { + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-xl-start { + justify-content: flex-start !important; + } + .justify-content-xl-end { + justify-content: flex-end !important; + } + .justify-content-xl-center { + justify-content: center !important; + } + .justify-content-xl-between { + justify-content: space-between !important; + } + .justify-content-xl-around { + justify-content: space-around !important; + } + .justify-content-xl-evenly { + justify-content: space-evenly !important; + } + .align-items-xl-start { + align-items: flex-start !important; + } + .align-items-xl-end { + align-items: flex-end !important; + } + .align-items-xl-center { + align-items: center !important; + } + .align-items-xl-baseline { + align-items: baseline !important; + } + .align-items-xl-stretch { + align-items: stretch !important; + } + .align-content-xl-start { + align-content: flex-start !important; + } + .align-content-xl-end { + align-content: flex-end !important; + } + .align-content-xl-center { + align-content: center !important; + } + .align-content-xl-between { + align-content: space-between !important; + } + .align-content-xl-around { + align-content: space-around !important; + } + .align-content-xl-stretch { + align-content: stretch !important; + } + .align-self-xl-auto { + align-self: auto !important; + } + .align-self-xl-start { + align-self: flex-start !important; + } + .align-self-xl-end { + align-self: flex-end !important; + } + .align-self-xl-center { + align-self: center !important; + } + .align-self-xl-baseline { + align-self: baseline !important; + } + .align-self-xl-stretch { + align-self: stretch !important; + } + .order-xl-first { + order: -1 !important; + } + .order-xl-0 { + order: 0 !important; + } + .order-xl-1 { + order: 1 !important; + } + .order-xl-2 { + order: 2 !important; + } + .order-xl-3 { + order: 3 !important; + } + .order-xl-4 { + order: 4 !important; + } + .order-xl-5 { + order: 5 !important; + } + .order-xl-last { + order: 6 !important; + } + .m-xl-0 { + margin: 0 !important; + } + .m-xl-1 { + margin: 0.25rem !important; + } + .m-xl-2 { + margin: 0.5rem !important; + } + .m-xl-3 { + margin: 1rem !important; + } + .m-xl-4 { + margin: 1.5rem !important; + } + .m-xl-5 { + margin: 3rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xl-0 { + margin-top: 0 !important; + } + .mt-xl-1 { + margin-top: 0.25rem !important; + } + .mt-xl-2 { + margin-top: 0.5rem !important; + } + .mt-xl-3 { + margin-top: 1rem !important; + } + .mt-xl-4 { + margin-top: 1.5rem !important; + } + .mt-xl-5 { + margin-top: 3rem !important; + } + .mt-xl-auto { + margin-top: auto !important; + } + .me-xl-0 { + margin-right: 0 !important; + } + .me-xl-1 { + margin-right: 0.25rem !important; + } + .me-xl-2 { + margin-right: 0.5rem !important; + } + .me-xl-3 { + margin-right: 1rem !important; + } + .me-xl-4 { + margin-right: 1.5rem !important; + } + .me-xl-5 { + margin-right: 3rem !important; + } + .me-xl-auto { + margin-right: auto !important; + } + .mb-xl-0 { + margin-bottom: 0 !important; + } + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xl-3 { + margin-bottom: 1rem !important; + } + .mb-xl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xl-5 { + margin-bottom: 3rem !important; + } + .mb-xl-auto { + margin-bottom: auto !important; + } + .ms-xl-0 { + margin-left: 0 !important; + } + .ms-xl-1 { + margin-left: 0.25rem !important; + } + .ms-xl-2 { + margin-left: 0.5rem !important; + } + .ms-xl-3 { + margin-left: 1rem !important; + } + .ms-xl-4 { + margin-left: 1.5rem !important; + } + .ms-xl-5 { + margin-left: 3rem !important; + } + .ms-xl-auto { + margin-left: auto !important; + } + .p-xl-0 { + padding: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .p-xl-3 { + padding: 1rem !important; + } + .p-xl-4 { + padding: 1.5rem !important; + } + .p-xl-5 { + padding: 3rem !important; + } + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xl-0 { + padding-top: 0 !important; + } + .pt-xl-1 { + padding-top: 0.25rem !important; + } + .pt-xl-2 { + padding-top: 0.5rem !important; + } + .pt-xl-3 { + padding-top: 1rem !important; + } + .pt-xl-4 { + padding-top: 1.5rem !important; + } + .pt-xl-5 { + padding-top: 3rem !important; + } + .pe-xl-0 { + padding-right: 0 !important; + } + .pe-xl-1 { + padding-right: 0.25rem !important; + } + .pe-xl-2 { + padding-right: 0.5rem !important; + } + .pe-xl-3 { + padding-right: 1rem !important; + } + .pe-xl-4 { + padding-right: 1.5rem !important; + } + .pe-xl-5 { + padding-right: 3rem !important; + } + .pb-xl-0 { + padding-bottom: 0 !important; + } + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xl-3 { + padding-bottom: 1rem !important; + } + .pb-xl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xl-5 { + padding-bottom: 3rem !important; + } + .ps-xl-0 { + padding-left: 0 !important; + } + .ps-xl-1 { + padding-left: 0.25rem !important; + } + .ps-xl-2 { + padding-left: 0.5rem !important; + } + .ps-xl-3 { + padding-left: 1rem !important; + } + .ps-xl-4 { + padding-left: 1.5rem !important; + } + .ps-xl-5 { + padding-left: 3rem !important; + } + .gap-xl-0 { + gap: 0 !important; + } + .gap-xl-1 { + gap: 0.25rem !important; + } + .gap-xl-2 { + gap: 0.5rem !important; + } + .gap-xl-3 { + gap: 1rem !important; + } + .gap-xl-4 { + gap: 1.5rem !important; + } + .gap-xl-5 { + gap: 3rem !important; + } + .row-gap-xl-0 { + row-gap: 0 !important; + } + .row-gap-xl-1 { + row-gap: 0.25rem !important; + } + .row-gap-xl-2 { + row-gap: 0.5rem !important; + } + .row-gap-xl-3 { + row-gap: 1rem !important; + } + .row-gap-xl-4 { + row-gap: 1.5rem !important; + } + .row-gap-xl-5 { + row-gap: 3rem !important; + } + .column-gap-xl-0 { + column-gap: 0 !important; + } + .column-gap-xl-1 { + column-gap: 0.25rem !important; + } + .column-gap-xl-2 { + column-gap: 0.5rem !important; + } + .column-gap-xl-3 { + column-gap: 1rem !important; + } + .column-gap-xl-4 { + column-gap: 1.5rem !important; + } + .column-gap-xl-5 { + column-gap: 3rem !important; + } + .text-xl-start { + text-align: left !important; + } + .text-xl-end { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } +} +@media (min-width: 1400px) { + .float-xxl-start { + float: left !important; + } + .float-xxl-end { + float: right !important; + } + .float-xxl-none { + float: none !important; + } + .object-fit-xxl-contain { + object-fit: contain !important; + } + .object-fit-xxl-cover { + object-fit: cover !important; + } + .object-fit-xxl-fill { + object-fit: fill !important; + } + .object-fit-xxl-scale { + object-fit: scale-down !important; + } + .object-fit-xxl-none { + object-fit: none !important; + } + .d-xxl-inline { + display: inline !important; + } + .d-xxl-inline-block { + display: inline-block !important; + } + .d-xxl-block { + display: block !important; + } + .d-xxl-grid { + display: grid !important; + } + .d-xxl-inline-grid { + display: inline-grid !important; + } + .d-xxl-table { + display: table !important; + } + .d-xxl-table-row { + display: table-row !important; + } + .d-xxl-table-cell { + display: table-cell !important; + } + .d-xxl-flex { + display: flex !important; + } + .d-xxl-inline-flex { + display: inline-flex !important; + } + .d-xxl-none { + display: none !important; + } + .flex-xxl-fill { + flex: 1 1 auto !important; + } + .flex-xxl-row { + flex-direction: row !important; + } + .flex-xxl-column { + flex-direction: column !important; + } + .flex-xxl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xxl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xxl-grow-0 { + flex-grow: 0 !important; + } + .flex-xxl-grow-1 { + flex-grow: 1 !important; + } + .flex-xxl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xxl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xxl-wrap { + flex-wrap: wrap !important; + } + .flex-xxl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-xxl-start { + justify-content: flex-start !important; + } + .justify-content-xxl-end { + justify-content: flex-end !important; + } + .justify-content-xxl-center { + justify-content: center !important; + } + .justify-content-xxl-between { + justify-content: space-between !important; + } + .justify-content-xxl-around { + justify-content: space-around !important; + } + .justify-content-xxl-evenly { + justify-content: space-evenly !important; + } + .align-items-xxl-start { + align-items: flex-start !important; + } + .align-items-xxl-end { + align-items: flex-end !important; + } + .align-items-xxl-center { + align-items: center !important; + } + .align-items-xxl-baseline { + align-items: baseline !important; + } + .align-items-xxl-stretch { + align-items: stretch !important; + } + .align-content-xxl-start { + align-content: flex-start !important; + } + .align-content-xxl-end { + align-content: flex-end !important; + } + .align-content-xxl-center { + align-content: center !important; + } + .align-content-xxl-between { + align-content: space-between !important; + } + .align-content-xxl-around { + align-content: space-around !important; + } + .align-content-xxl-stretch { + align-content: stretch !important; + } + .align-self-xxl-auto { + align-self: auto !important; + } + .align-self-xxl-start { + align-self: flex-start !important; + } + .align-self-xxl-end { + align-self: flex-end !important; + } + .align-self-xxl-center { + align-self: center !important; + } + .align-self-xxl-baseline { + align-self: baseline !important; + } + .align-self-xxl-stretch { + align-self: stretch !important; + } + .order-xxl-first { + order: -1 !important; + } + .order-xxl-0 { + order: 0 !important; + } + .order-xxl-1 { + order: 1 !important; + } + .order-xxl-2 { + order: 2 !important; + } + .order-xxl-3 { + order: 3 !important; + } + .order-xxl-4 { + order: 4 !important; + } + .order-xxl-5 { + order: 5 !important; + } + .order-xxl-last { + order: 6 !important; + } + .m-xxl-0 { + margin: 0 !important; + } + .m-xxl-1 { + margin: 0.25rem !important; + } + .m-xxl-2 { + margin: 0.5rem !important; + } + .m-xxl-3 { + margin: 1rem !important; + } + .m-xxl-4 { + margin: 1.5rem !important; + } + .m-xxl-5 { + margin: 3rem !important; + } + .m-xxl-auto { + margin: auto !important; + } + .mx-xxl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xxl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xxl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xxl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xxl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xxl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xxl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xxl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xxl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xxl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xxl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xxl-0 { + margin-top: 0 !important; + } + .mt-xxl-1 { + margin-top: 0.25rem !important; + } + .mt-xxl-2 { + margin-top: 0.5rem !important; + } + .mt-xxl-3 { + margin-top: 1rem !important; + } + .mt-xxl-4 { + margin-top: 1.5rem !important; + } + .mt-xxl-5 { + margin-top: 3rem !important; + } + .mt-xxl-auto { + margin-top: auto !important; + } + .me-xxl-0 { + margin-right: 0 !important; + } + .me-xxl-1 { + margin-right: 0.25rem !important; + } + .me-xxl-2 { + margin-right: 0.5rem !important; + } + .me-xxl-3 { + margin-right: 1rem !important; + } + .me-xxl-4 { + margin-right: 1.5rem !important; + } + .me-xxl-5 { + margin-right: 3rem !important; + } + .me-xxl-auto { + margin-right: auto !important; + } + .mb-xxl-0 { + margin-bottom: 0 !important; + } + .mb-xxl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xxl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xxl-3 { + margin-bottom: 1rem !important; + } + .mb-xxl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xxl-5 { + margin-bottom: 3rem !important; + } + .mb-xxl-auto { + margin-bottom: auto !important; + } + .ms-xxl-0 { + margin-left: 0 !important; + } + .ms-xxl-1 { + margin-left: 0.25rem !important; + } + .ms-xxl-2 { + margin-left: 0.5rem !important; + } + .ms-xxl-3 { + margin-left: 1rem !important; + } + .ms-xxl-4 { + margin-left: 1.5rem !important; + } + .ms-xxl-5 { + margin-left: 3rem !important; + } + .ms-xxl-auto { + margin-left: auto !important; + } + .p-xxl-0 { + padding: 0 !important; + } + .p-xxl-1 { + padding: 0.25rem !important; + } + .p-xxl-2 { + padding: 0.5rem !important; + } + .p-xxl-3 { + padding: 1rem !important; + } + .p-xxl-4 { + padding: 1.5rem !important; + } + .p-xxl-5 { + padding: 3rem !important; + } + .px-xxl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xxl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xxl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xxl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xxl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xxl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xxl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xxl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xxl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xxl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xxl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xxl-0 { + padding-top: 0 !important; + } + .pt-xxl-1 { + padding-top: 0.25rem !important; + } + .pt-xxl-2 { + padding-top: 0.5rem !important; + } + .pt-xxl-3 { + padding-top: 1rem !important; + } + .pt-xxl-4 { + padding-top: 1.5rem !important; + } + .pt-xxl-5 { + padding-top: 3rem !important; + } + .pe-xxl-0 { + padding-right: 0 !important; + } + .pe-xxl-1 { + padding-right: 0.25rem !important; + } + .pe-xxl-2 { + padding-right: 0.5rem !important; + } + .pe-xxl-3 { + padding-right: 1rem !important; + } + .pe-xxl-4 { + padding-right: 1.5rem !important; + } + .pe-xxl-5 { + padding-right: 3rem !important; + } + .pb-xxl-0 { + padding-bottom: 0 !important; + } + .pb-xxl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xxl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xxl-3 { + padding-bottom: 1rem !important; + } + .pb-xxl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xxl-5 { + padding-bottom: 3rem !important; + } + .ps-xxl-0 { + padding-left: 0 !important; + } + .ps-xxl-1 { + padding-left: 0.25rem !important; + } + .ps-xxl-2 { + padding-left: 0.5rem !important; + } + .ps-xxl-3 { + padding-left: 1rem !important; + } + .ps-xxl-4 { + padding-left: 1.5rem !important; + } + .ps-xxl-5 { + padding-left: 3rem !important; + } + .gap-xxl-0 { + gap: 0 !important; + } + .gap-xxl-1 { + gap: 0.25rem !important; + } + .gap-xxl-2 { + gap: 0.5rem !important; + } + .gap-xxl-3 { + gap: 1rem !important; + } + .gap-xxl-4 { + gap: 1.5rem !important; + } + .gap-xxl-5 { + gap: 3rem !important; + } + .row-gap-xxl-0 { + row-gap: 0 !important; + } + .row-gap-xxl-1 { + row-gap: 0.25rem !important; + } + .row-gap-xxl-2 { + row-gap: 0.5rem !important; + } + .row-gap-xxl-3 { + row-gap: 1rem !important; + } + .row-gap-xxl-4 { + row-gap: 1.5rem !important; + } + .row-gap-xxl-5 { + row-gap: 3rem !important; + } + .column-gap-xxl-0 { + column-gap: 0 !important; + } + .column-gap-xxl-1 { + column-gap: 0.25rem !important; + } + .column-gap-xxl-2 { + column-gap: 0.5rem !important; + } + .column-gap-xxl-3 { + column-gap: 1rem !important; + } + .column-gap-xxl-4 { + column-gap: 1.5rem !important; + } + .column-gap-xxl-5 { + column-gap: 3rem !important; + } + .text-xxl-start { + text-align: left !important; + } + .text-xxl-end { + text-align: right !important; + } + .text-xxl-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .fs-1 { + font-size: 2.5rem !important; + } + .fs-2 { + font-size: 2rem !important; + } + .fs-3 { + font-size: 1.75rem !important; + } + .fs-4 { + font-size: 1.5rem !important; + } +} +@media print { + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-grid { + display: grid !important; + } + .d-print-inline-grid { + display: inline-grid !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: flex !important; + } + .d-print-inline-flex { + display: inline-flex !important; + } + .d-print-none { + display: none !important; + } +} +body { + -webkit-font-smoothing: antialiased; +} + +.badge.bg-light { + color: #373a3c; +} + +.progress .progress-bar { + font-size: 8px; + line-height: 8px; +} + +/*# sourceMappingURL=custom.css.map */ diff --git a/mybookmark.ui/src/assets/css/custom.css.map b/mybookmark.ui/src/assets/css/custom.css.map new file mode 100644 index 0000000..5c75ca4 --- /dev/null +++ b/mybookmark.ui/src/assets/css/custom.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../../node_modules/bootstrap/scss/mixins/_banner.scss","../../../scss/themes/Cosmo/_bootswatch.scss","../../../node_modules/bootstrap/scss/_root.scss","../../../node_modules/bootstrap/scss/vendor/_rfs.scss","../../../node_modules/bootstrap/scss/mixins/_color-mode.scss","../../../node_modules/bootstrap/scss/_reboot.scss","../../../node_modules/bootstrap/scss/_variables.scss","../../../scss/themes/Cosmo/_variables.scss","../../../node_modules/bootstrap/scss/_type.scss","../../../node_modules/bootstrap/scss/mixins/_lists.scss","../../../node_modules/bootstrap/scss/_images.scss","../../../node_modules/bootstrap/scss/mixins/_image.scss","../../../node_modules/bootstrap/scss/_containers.scss","../../../node_modules/bootstrap/scss/mixins/_container.scss","../../../node_modules/bootstrap/scss/mixins/_breakpoints.scss","../../../node_modules/bootstrap/scss/_grid.scss","../../../node_modules/bootstrap/scss/mixins/_grid.scss","../../../node_modules/bootstrap/scss/_tables.scss","../../../node_modules/bootstrap/scss/mixins/_table-variants.scss","../../../node_modules/bootstrap/scss/forms/_labels.scss","../../../node_modules/bootstrap/scss/forms/_form-text.scss","../../../node_modules/bootstrap/scss/forms/_form-control.scss","../../../node_modules/bootstrap/scss/mixins/_border-radius.scss","../../../node_modules/bootstrap/scss/mixins/_transition.scss","../../../node_modules/bootstrap/scss/mixins/_gradients.scss","../../../node_modules/bootstrap/scss/forms/_form-select.scss","../../../node_modules/bootstrap/scss/forms/_form-check.scss","../../../node_modules/bootstrap/scss/forms/_form-range.scss","../../../node_modules/bootstrap/scss/forms/_floating-labels.scss","../../../node_modules/bootstrap/scss/forms/_input-group.scss","../../../node_modules/bootstrap/scss/mixins/_forms.scss","../../../node_modules/bootstrap/scss/_buttons.scss","../../../node_modules/bootstrap/scss/mixins/_buttons.scss","../../../node_modules/bootstrap/scss/_transitions.scss","../../../node_modules/bootstrap/scss/_dropdown.scss","../../../node_modules/bootstrap/scss/mixins/_caret.scss","../../../node_modules/bootstrap/scss/_button-group.scss","../../../node_modules/bootstrap/scss/_nav.scss","../../../node_modules/bootstrap/scss/_navbar.scss","../../../node_modules/bootstrap/scss/_card.scss","../../../node_modules/bootstrap/scss/_accordion.scss","../../../node_modules/bootstrap/scss/_breadcrumb.scss","../../../node_modules/bootstrap/scss/_pagination.scss","../../../node_modules/bootstrap/scss/mixins/_pagination.scss","../../../node_modules/bootstrap/scss/_badge.scss","../../../node_modules/bootstrap/scss/_alert.scss","../../../node_modules/bootstrap/scss/_progress.scss","../../../node_modules/bootstrap/scss/_list-group.scss","../../../node_modules/bootstrap/scss/_close.scss","../../../node_modules/bootstrap/scss/_toasts.scss","../../../node_modules/bootstrap/scss/_modal.scss","../../../node_modules/bootstrap/scss/mixins/_backdrop.scss","../../../node_modules/bootstrap/scss/_tooltip.scss","../../../node_modules/bootstrap/scss/mixins/_reset-text.scss","../../../node_modules/bootstrap/scss/_popover.scss","../../../node_modules/bootstrap/scss/_carousel.scss","../../../node_modules/bootstrap/scss/mixins/_clearfix.scss","../../../node_modules/bootstrap/scss/_spinners.scss","../../../node_modules/bootstrap/scss/_offcanvas.scss","../../../node_modules/bootstrap/scss/_placeholders.scss","../../../node_modules/bootstrap/scss/helpers/_color-bg.scss","../../../node_modules/bootstrap/scss/helpers/_colored-links.scss","../../../node_modules/bootstrap/scss/helpers/_focus-ring.scss","../../../node_modules/bootstrap/scss/helpers/_icon-link.scss","../../../node_modules/bootstrap/scss/helpers/_ratio.scss","../../../node_modules/bootstrap/scss/helpers/_position.scss","../../../node_modules/bootstrap/scss/helpers/_stacks.scss","../../../node_modules/bootstrap/scss/helpers/_visually-hidden.scss","../../../node_modules/bootstrap/scss/mixins/_visually-hidden.scss","../../../node_modules/bootstrap/scss/helpers/_stretched-link.scss","../../../node_modules/bootstrap/scss/helpers/_text-truncation.scss","../../../node_modules/bootstrap/scss/mixins/_text-truncate.scss","../../../node_modules/bootstrap/scss/helpers/_vr.scss","../../../node_modules/bootstrap/scss/mixins/_utilities.scss","../../../node_modules/bootstrap/scss/utilities/_api.scss"],"names":[],"mappings":";AACE;AAAA;AAAA;AAAA;AAAA;ACOQ;ACRV;AAAA;EASI;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAIA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAIA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAIA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAIA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAIA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAIA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAGF;EACA;EAMA;EACA;EACA;EAOA;EC2OI,qBALI;EDpOR;EACA;EAKA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAGA;EAEA;EACA;EACA;EAEA;EACA;EAMA;EACA;EACA;EAGA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EAIA;EACA;EACA;EAIA;EACA;EACA;EACA;;;AEhHE;EFsHA;EAGA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAGE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAIA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAIA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAGF;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;;;AGxKJ;AAAA;AAAA;EAGE;;;AAeE;EANJ;IAOM;;;;AAcN;EACE;EACA;EF6OI,WALI;EEtOR;EACA;EACA;EACA;EACA;EACA;EACA;;;AASF;EACE;EACA,OCmnB4B;EDlnB5B;EACA;EACA,SCynB4B;;;AD/mB9B;EACE;EACA,eCwjB4B;EDrjB5B,aEhC0B;EFiC1B,aCwjB4B;EDvjB5B;;;AAGF;EFuMQ;;AA5JJ;EE3CJ;IF8MQ;;;;AEzMR;EFkMQ;;AA5JJ;EEtCJ;IFyMQ;;;;AEpMR;EF6LQ;;AA5JJ;EEjCJ;IFoMQ;;;;AE/LR;EFwLQ;;AA5JJ;EE5BJ;IF+LQ;;;;AE1LR;EF+KM,WALI;;;AErKV;EF0KM,WALI;;;AE1JV;EACE;EACA,eCwV0B;;;AD9U5B;EACE;EACA;EACA;;;AAMF;EACE;EACA;EACA;;;AAMF;AAAA;EAEE;;;AAGF;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;;;AAGF;EACE,aC6b4B;;;ADxb9B;EACE;EACA;;;AAMF;EACE;;;AAQF;AAAA;EAEE,aCsa4B;;;AD9Z9B;EF6EM,WALI;;;AEjEV;EACE,SCqf4B;EDpf5B;EACA;;;AASF;AAAA;EAEE;EFwDI,WALI;EEjDR;EACA;;;AAGF;EAAM;;;AACN;EAAM;;;AAKN;EACE;EACA,iBCgNwC;;AD9MxC;EACE;;;AAWF;EAEE;EACA;;;AAOJ;AAAA;AAAA;AAAA;EAIE,aCgV4B;EHlUxB,WALI;;;AEDV;EACE;EACA;EACA;EACA;EFEI,WALI;;AEQR;EFHI,WALI;EEUN;EACA;;;AAIJ;EFVM,WALI;EEiBR;EACA;;AAGA;EACE;;;AAIJ;EACE;EFtBI,WALI;EE6BR,OCy5CkC;EDx5ClC,kBCy5CkC;;ADt5ClC;EACE;EF7BE,WALI;;;AE6CV;EACE;;;AAMF;AAAA;EAEE;;;AAQF;EACE;EACA;;;AAGF;EACE,aC4X4B;ED3X5B,gBC2X4B;ED1X5B,OC4Z4B;ED3Z5B;;;AAOF;EAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;EACA;EACA;;;AAQF;EACE;;;AAMF;EAEE;;;AAQF;EACE;;;AAKF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EF5HI,WALI;EEmIR;;;AAIF;AAAA;EAEE;;;AAKF;EACE;;;AAGF;EAGE;;AAGA;EACE;;;AAOJ;EACE;;;AAQF;AAAA;AAAA;AAAA;EAIE;;AAGE;AAAA;AAAA;AAAA;EACE;;;AAON;EACE;EACA;;;AAKF;EACE;;;AAUF;EACE;EACA;EACA;EACA;;;AAQF;EACE;EACA;EACA;EACA,eCmN4B;EHpatB;EEoNN;;AFhXE;EEyWJ;IFtMQ;;;AE+MN;EACE;;;AAOJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;;AAGF;EACE;;;AASF;EACE;EACA;;;AAQF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA;EACE;;;AAKF;EACE;;;AAOF;EACE;EACA;;;AAKF;EACE;;;AAKF;EACE;;;AAOF;EACE;EACA;;;AAQF;EACE;;;AAQF;EACE;;;AGrkBF;ELmQM,WALI;EK5PR,aFwoB4B;;;AEnoB5B;ELgQM;EK5PJ,aFynBkB;EExnBlB,aFwmB0B;;AHzgB1B;EKpGF;ILuQM;;;;AKvQN;ELgQM;EK5PJ,aFynBkB;EExnBlB,aFwmB0B;;AHzgB1B;EKpGF;ILuQM;;;;AKvQN;ELgQM;EK5PJ,aFynBkB;EExnBlB,aFwmB0B;;AHzgB1B;EKpGF;ILuQM;;;;AKvQN;ELgQM;EK5PJ,aFynBkB;EExnBlB,aFwmB0B;;AHzgB1B;EKpGF;ILuQM;;;;AKvQN;ELgQM;EK5PJ,aFynBkB;EExnBlB,aFwmB0B;;AHzgB1B;EKpGF;ILuQM;;;;AKvQN;ELgQM;EK5PJ,aFynBkB;EExnBlB,aFwmB0B;;AHzgB1B;EKpGF;ILuQM;;;;AK/OR;ECvDE;EACA;;;AD2DF;EC5DE;EACA;;;AD8DF;EACE;;AAEA;EACE,cFsoB0B;;;AE5nB9B;EL8MM,WALI;EKvMR;;;AAIF;EACE,eFiUO;EH1HH,WALI;;AK/LR;EACE;;;AAIJ;EACE;EACA,eFuTO;EH1HH,WALI;EKtLR,ODrFS;;ACuFT;EACE;;;AEhGJ;ECIE;EAGA;;;ADDF;EACE,SJ+jDkC;EI9jDlC,kBJ+jDkC;EI9jDlC;ECLA;EAGA;;;ADcF;EAEE;;;AAGF;EACE;EACA;;;AAGF;EPyPM,WALI;EOlPR,OJkjDkC;;;AMplDlC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ECHA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACsDE;EF5CE;IACE,WNkee;;;AQvbnB;EF5CE;IACE,WNkee;;;AQvbnB;EF5CE;IACE,WNkee;;;AQvbnB;EF5CE;IACE,WNkee;;;AQvbnB;EF5CE;IACE,WNkee;;;ASlfvB;EAEI;EAAA;EAAA;EAAA;EAAA;EAAA;;;AAKF;ECNA;EACA;EACA;EACA;EAEA;EACA;EACA;;ADEE;ECOF;EACA;EACA;EACA;EACA;EACA;;;AA+CI;EACE;;;AAGF;EApCJ;EACA;;;AAcA;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AA+BE;EAhDJ;EACA;;;AAqDQ;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AA+DM;EAhEN;EACA;;;AAuEQ;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAwDU;EAxDV;;;AAmEM;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAPF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAPF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAPF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAPF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAPF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AF1DN;EEUE;IACE;;EAGF;IApCJ;IACA;;EAcA;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EA+BE;IAhDJ;IACA;;EAqDQ;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EAuEQ;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAmEM;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;;AF1DN;EEUE;IACE;;EAGF;IApCJ;IACA;;EAcA;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EA+BE;IAhDJ;IACA;;EAqDQ;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EAuEQ;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAmEM;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;;AF1DN;EEUE;IACE;;EAGF;IApCJ;IACA;;EAcA;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EA+BE;IAhDJ;IACA;;EAqDQ;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EAuEQ;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAmEM;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;;AF1DN;EEUE;IACE;;EAGF;IApCJ;IACA;;EAcA;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EA+BE;IAhDJ;IACA;;EAqDQ;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EAuEQ;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAmEM;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;;AF1DN;EEUE;IACE;;EAGF;IApCJ;IACA;;EAcA;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EAFF;IACE;IACA;;EA+BE;IAhDJ;IACA;;EAqDQ;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EA+DM;IAhEN;IACA;;EAuEQ;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAwDU;IAxDV;;EAmEM;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;EAPF;AAAA;IAEE;;EAGF;AAAA;IAEE;;;ACrHV;EAEE;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA,eXkYO;EWjYP,gBXusB4B;EWtsB5B;;AAOA;EACE;EAEA;EACA;EACA,qBX+sB0B;EW9sB1B;;AAGF;EACE;;AAGF;EACE;;;AAIJ;EACE;;;AAOF;EACE;;;AAUA;EACE;;;AAeF;EACE;;AAGA;EACE;;;AAOJ;EACE;;AAGF;EACE;;;AAUF;EACE;EACA;;;AAMF;EACE;EACA;;;AAQJ;EACE;EACA;;;AAQA;EACE;EACA;;;AC5IF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAlBF;EAOE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;ADiJA;EACE;EACA;;;AH3FF;EGyFA;IACE;IACA;;;AH3FF;EGyFA;IACE;IACA;;;AH3FF;EGyFA;IACE;IACA;;;AH3FF;EGyFA;IACE;IACA;;;AH3FF;EGyFA;IACE;IACA;;;AEnKN;EACE,ebu2BsC;;;Aa91BxC;EACE;EACA;EACA;EhB8QI,WALI;EgBrQR,ab+lB4B;;;Aa3lB9B;EACE;EACA;EhBoQI,WALI;;;AgB3PV;EACE;EACA;EhB8PI,WALI;;;AiBtRV;EACE,Yd+1BsC;EHrkBlC,WALI;EiBjRR,Od+1BsC;;;Aep2BxC;EACE;EACA;EACA;ElBwRI,WALI;EkBhRR,afkmB4B;EejmB5B,afymB4B;EexmB5B,Of43BsC;Ee33BtC;EACA,kBfq3BsC;Eep3BtC;EACA;ECME,eDH2C;EEHzC,YFMJ;;AEFI;EFhBN;IEiBQ;;;AFGN;EACE;;AAEA;EACE;;AAKJ;EACE,Ofs2BoC;Eer2BpC,kBfg2BoC;Ee/1BpC,cf82BoC;Ee72BpC;EAKE,YfkhBkB;;Ae9gBtB;EAME;EAMA;EAKA;;AAKF;EACE;EACA;;AAIF;EACE,Of40BoC;Ee10BpC;;AAQF;EAEE,kBf8yBoC;Ee3yBpC;;AAIF;EACE;EACA;EACA,mBforB0B;EenrB1B,OfsyBoC;EkBp4BtC,kBlBqiCgC;Eer8B9B;EACA;EACA;EACA;EACA,yBfgsB0B;Ee/rB1B;EEzFE,YF0FF;;AEtFE;EF0EJ;IEzEM;;;AFwFN;EACE,kBf47B8B;;;Aen7BlC;EACE;EACA;EACA;EACA;EACA,afwf4B;Eevf5B,Of2xBsC;Ee1xBtC;EACA;EACA;;AAEA;EACE;;AAGF;EAEE;EACA;;;AAWJ;EACE,Yf4wBsC;Ee3wBtC;ElByII,WALI;;AkBhIR;EACE;EACA;EACA,mBfooB0B;;;AehoB9B;EACE,YfgwBsC;Ee/vBtC;ElB4HI,WALI;;AkBnHR;EACE;EACA;EACA,mBf2nB0B;;;AennB5B;EACE,Yf6uBoC;;Ae1uBtC;EACE,Yf0uBoC;;AevuBtC;EACE,YfuuBoC;;;AeluBxC;EACE,OfquBsC;EepuBtC,Qf8tBsC;Ee7tBtC,SfilB4B;;Ae/kB5B;EACE;;AAGF;EACE;;AAIF;EACE;;AAIF;EAAoB,Qf8sBkB;;Ae7sBtC;EAAoB,Qf8sBkB;;;AmB75BxC;EACE;EAEA;EACA;EACA;EtBqRI,WALI;EsB7QR,anB+lB4B;EmB9lB5B,anBsmB4B;EmBrmB5B,OnBy3BsC;EmBx3BtC;EACA,kBnBk3BsC;EmBj3BtC;EACA;EACA,qBnB+9BkC;EmB99BlC,iBnB+9BkC;EmB99BlC;EHAE,eGCiD;EFP/C,YESJ;;AFLI;EEfN;IFgBQ;;;AEMN;EACE,cnBs3BoC;EmBr3BpC;EAKE,YnBi+B4B;;AmB79BhC;EAEE,enB6uB0B;EmB5uB1B;;AAGF;EAEE,kBnBu1BoC;;AmBl1BtC;EACE;EACA;;;AAIJ;EACE,anBsuB4B;EmBruB5B,gBnBquB4B;EmBpuB5B,cnBquB4B;EHlgBxB,WALI;;;AsBzNV;EACE,anBkuB4B;EmBjuB5B,gBnBiuB4B;EmBhuB5B,cnBiuB4B;EHtgBxB,WALI;;;AsB/MN;EACE;;;ACxEN;EACE;EACA,YpBq6BwC;EoBp6BxC,cpBq6BwC;EoBp6BxC,epBq6BwC;;AoBn6BxC;EACE;EACA;;;AAIJ;EACE,epB25BwC;EoB15BxC;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;EAEA;EACA,OpB04BwC;EoBz4BxC,QpBy4BwC;EoBx4BxC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QpB24BwC;EoB14BxC;;AAOA;EAEE,epBm4BsC;;AoBh4BxC;EACE,QpB03BsC;;AoBv3BxC;EACE,cpBs1BoC;EoBr1BpC;EACA,YpB8foB;;AoB3ftB;EACE,kBnB7CM;EmB8CN,cnB9CM;;AmBgDN;EAII;;AAIJ;EAII;;AAKN;EACE,kBnBlEM;EmBmEN,cnBnEM;EmBwEJ;;AAIJ;EACE;EACA;EACA,SpBk2BuC;;AoB31BvC;EACE;EACA,SpBy1BqC;;;AoB30B3C;EACE,cpBo1BgC;;AoBl1BhC;EACE;EAEA,OpB80B8B;EoB70B9B;EACA;EACA;EJ9GA,eI+GmD;EHrHjD,YGsHF;;AHlHE;EG0GJ;IHzGM;;;AGmHJ;EACE;;AAGF;EACE,qBpB60B4B;EoBx0B1B;;AAKN;EACE,epBwzB8B;EoBvzB9B;;AAEA;EACE;EACA;;;AAKN;EACE;EACA,cpBsyBgC;;;AoBnyBlC;EACE;EACA;EACA;;AAIE;EACE;EACA;EACA,SpBspBwB;;;AoB/oB1B;EACE;;;ACnLN;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAIA;EAA0B,YrB8gCa;;AqB7gCvC;EAA0B,YrB6gCa;;AqB1gCzC;EACE;;AAGF;EACE,OrB+/BuC;EqB9/BvC,QrB8/BuC;EqB7/BvC;EACA;EH1BF,kBjBiBQ;EoBWN,QrB6/BuC;EiB7gCrC,YImBF;;AJfE;EIMJ;IJLM;;;AIgBJ;EHjCF,kBlB8hCyC;;AqBx/BzC;EACE,OrBw+B8B;EqBv+B9B,QrBw+B8B;EqBv+B9B;EACA,QrBu+B8B;EqBt+B9B,kBrBu+B8B;EqBt+B9B;;AAKF;EACE,OrBo+BuC;EqBn+BvC,QrBm+BuC;EqBl+BvC;EHpDF,kBjBiBQ;EoBqCN,QrBm+BuC;EiB7gCrC,YI6CF;;AJzCE;EIiCJ;IJhCM;;;AI0CJ;EH3DF,kBlB8hCyC;;AqB99BzC;EACE,OrB88B8B;EqB78B9B,QrB88B8B;EqB78B9B;EACA,QrB68B8B;EqB58B9B,kBrB68B8B;EqB58B9B;;AAKF;EACE;;AAEA;EACE,kBrBg9BqC;;AqB78BvC;EACE,kBrB48BqC;;;AsBniC3C;EACE;;AAEA;AAAA;AAAA;EAGE,QtBwiCoC;EsBviCpC,YtBuiCoC;EsBtiCpC,atBuiCoC;;AsBpiCtC;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;ELRE,YKSF;;ALLE;EKTJ;ILUM;;;AKON;AAAA;EAEE;;AAEA;AAAA;EACE;;AAGF;AAAA;AAAA;EAEE,atB4gCkC;EsB3gClC,gBtB4gCkC;;AsBzgCpC;AAAA;EACE,atBugCkC;EsBtgClC,gBtBugCkC;;AsBngCtC;EACE,atBigCoC;EsBhgCpC,gBtBigCoC;;AsB1/BpC;AAAA;AAAA;AAAA;EACE;EACA,WtB2/BkC;;AsBz/BlC;AAAA;AAAA;AAAA;EACE;EACA;EACA;EACA,QtBm/BgC;EsBl/BhC;EACA,kBtBg0BgC;;AsBzzBpC;EACE;EACA,WtB0+BkC;;AsBr+BpC;EACE;;AAIJ;AAAA;EAEE,OrBzEO;;AqB2EP;AAAA;EACE,kBtB0yBkC;;;AuBj4BxC;EACE;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;EAGE;EACA;EACA;EACA;;AAIF;AAAA;AAAA;EAGE;;AAMF;EACE;EACA;;AAEA;EACE;;;AAWN;EACE;EACA;EACA;E1B8OI,WALI;E0BvOR,avByjB4B;EuBxjB5B,avBgkB4B;EuB/jB5B,OvBm1BsC;EuBl1BtC;EACA;EACA,kBvB06BsC;EuBz6BtC;;;AAUF;AAAA;AAAA;AAAA;EAIE;E1BwNI,WALI;;;A0B9MV;AAAA;AAAA;AAAA;EAIE;E1B+MI,WALI;;;A0BrMV;AAAA;EAEE;;;AAmCA;EACE;;ACjGF;EACE;EACA;EACA,YxBu0BoC;EHrkBlC,WALI;E2B1PN,OxBkjCqB;;;AwB/iCvB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;E3BqPE,WALI;E2B7ON,OxBqiCqB;EwBpiCrB,kBxBoiCqB;;;AwB/hCrB;AAAA;AAAA;AAAA;EAEE;;;AA/CF;EAqDE,cxBuhCmB;EwBphCjB,exB81BgC;EwB71BhC;EACA;EACA;EACA;;AAGF;EACE,cxB4gCiB;EwBvgCf,YxBugCe;;;AwB5kCrB;EA+EI,exBu0BgC;EwBt0BhC;;;AAhFJ;EAuFE,cxBq/BmB;;AwBl/BjB;EAEE;EACA,exBq5B8B;EwBp5B9B;EACA;;AAIJ;EACE,cxBw+BiB;EwBn+Bf,YxBm+Be;;;AwB5kCrB;EAkHI;;;AAlHJ;EAyHE,cxBm9BmB;;AwBj9BnB;EACE,kBxBg9BiB;;AwB78BnB;EACE,YxB48BiB;;AwBz8BnB;EACE,OxBw8BiB;;;AwBn8BrB;EACE;;;AA1IF;AAAA;AAAA;AAAA;AAAA;EAoJM;;;AAhIR;EACE;EACA;EACA,YxBu0BoC;EHrkBlC,WALI;E2B1PN,OxBkjCqB;;;AwB/iCvB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;E3BqPE,WALI;E2B7ON,OxBqiCqB;EwBpiCrB,kBxBoiCqB;;;AwB/hCrB;AAAA;AAAA;AAAA;EAEE;;;AA/CF;EAqDE,cxBuhCmB;EwBphCjB,exB81BgC;EwB71BhC;EACA;EACA;EACA;;AAGF;EACE,cxB4gCiB;EwBvgCf,YxBugCe;;;AwB5kCrB;EA+EI,exBu0BgC;EwBt0BhC;;;AAhFJ;EAuFE,cxBq/BmB;;AwBl/BjB;EAEE;EACA,exBq5B8B;EwBp5B9B;EACA;;AAIJ;EACE,cxBw+BiB;EwBn+Bf,YxBm+Be;;;AwB5kCrB;EAkHI;;;AAlHJ;EAyHE,cxBm9BmB;;AwBj9BnB;EACE,kBxBg9BiB;;AwB78BnB;EACE,YxB48BiB;;AwBz8BnB;EACE,OxBw8BiB;;;AwBn8BrB;EACE;;;AA1IF;AAAA;AAAA;AAAA;AAAA;EAsJM;;;ACxJV;EAEE;EACA;EACA;E5BuRI,oBALI;E4BhRR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;E5BsQI,WALI;E4B/PR;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EPhCA,kBOkCqB;ERtBjB,YQwBJ;;ARpBI;EQhBN;IRiBQ;;;AQqBN;EACE;EAEA;EACA;;AAGF;EAEE;EACA;EACA;;AAGF;EACE;EPrDF,kBOsDuB;EACrB;EACA;EAKE;;AAIJ;EACE;EACA;EAKE;;AAIJ;EAKE;EACA;EAGA;;AAGA;EAKI;;AAKN;EAKI;;AAIJ;EAGE;EACA;EACA;EAEA;EACA;;;AAYF;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADkGA;EC/GA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AD4HA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADmGA;EChHA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AD+GF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA,iBzB8QwC;;AyBpQxC;EACE;;AAGF;EACE;;;AAWJ;ECjJE;EACA;E7B8NI,oBALI;E6BvNR;;;ADkJF;ECrJE;EACA;E7B8NI,oBALI;E6BvNR;;;ACnEF;EVgBM,YUfJ;;AVmBI;EUpBN;IVqBQ;;;AUlBN;EACE;;;AAMF;EACE;;;AAIJ;EACE;EACA;EVDI,YUEJ;;AVEI;EULN;IVMQ;;;AUDN;EACE;EACA;EVNE,YUOF;;AVHE;EUAJ;IVCM;;;;AWpBR;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;;;AAGF;EACE;;ACwBE;EACE;EACA,a7B6hBwB;E6B5hBxB,gB7B2hBwB;E6B1hBxB;EArCJ;EACA;EACA;EACA;;AA0DE;EACE;;;AD9CN;EAEE;EACA;EACA;EACA;EACA;E/BuQI,yBALI;E+BhQR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;E/B0OI,WALI;E+BnOR;EACA;EACA;EACA;EACA;EACA;;AAIA;EACE;EACA;EACA;;;AAwBA;EACE;;AAEA;EACE;EACA;;;AAIJ;EACE;;AAEA;EACE;EACA;;;ApB1CJ;EoB4BA;IACE;;EAEA;IACE;IACA;;EAIJ;IACE;;EAEA;IACE;IACA;;;ApB1CJ;EoB4BA;IACE;;EAEA;IACE;IACA;;EAIJ;IACE;;EAEA;IACE;IACA;;;ApB1CJ;EoB4BA;IACE;;EAEA;IACE;IACA;;EAIJ;IACE;;EAEA;IACE;IACA;;;ApB1CJ;EoB4BA;IACE;;EAEA;IACE;IACA;;EAIJ;IACE;;EAEA;IACE;IACA;;;ApB1CJ;EoB4BA;IACE;;EAEA;IACE;IACA;;EAIJ;IACE;;EAEA;IACE;IACA;;;AAUN;EACE;EACA;EACA;EACA;;ACpFA;EACE;EACA,a7B6hBwB;E6B5hBxB,gB7B2hBwB;E6B1hBxB;EA9BJ;EACA;EACA;EACA;;AAmDE;EACE;;;ADgEJ;EACE;EACA;EACA;EACA;EACA;;AClGA;EACE;EACA,a7B6hBwB;E6B5hBxB,gB7B2hBwB;E6B1hBxB;EAvBJ;EACA;EACA;EACA;;AA4CE;EACE;;AD0EF;EACE;;;AAMJ;EACE;EACA;EACA;EACA;EACA;;ACnHA;EACE;EACA,a7B6hBwB;E6B5hBxB,gB7B2hBwB;E6B1hBxB;;AAWA;EACE;;AAGF;EACE;EACA,c7B0gBsB;E6BzgBtB,gB7BwgBsB;E6BvgBtB;EAnCN;EACA;EACA;;AAsCE;EACE;;AD2FF;EACE;;;AAON;EACE;EACA;EACA;EACA;EACA;;;AAMF;EACE;EACA;EACA;EACA;EACA,a5Byb4B;E4Bxb5B;EACA;EACA;EACA;EACA;EACA;;AAGA;EAEE;EV1LF,kBU4LuB;;AAGvB;EAEE;EACA;EVlMF,kBUmMuB;;AAGvB;EAEE;EACA;EACA;;;AAMJ;EACE;;;AAIF;EACE;EACA;EACA;E/BmEI,WALI;E+B5DR;EACA;;;AAIF;EACE;EACA;EACA;;;AAIF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AEtPF;AAAA;EAEE;EACA;EACA;;AAEA;AAAA;EACE;EACA;;AAKF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;;;AAQF;AAAA;EAEE;;AAiCJ;EACE;EACA;;AAEA;EAGE;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;;;AAoBF;EACE;EACA;EACA;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AC3HJ;EAEE;EACA;EAEA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;ElCsQI,WALI;EkC/PR;EACA;EACA;EACA;EACA;EdfI,YcgBJ;;AdZI;EcGN;IdFQ;;;AcaN;EAEE;;AAIF;EACE;EACA,Y/BkhBoB;;A+B9gBtB;EAEE;EACA;EACA;;;AAQJ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;;AAEA;EACE;EACA;;AAGA;EAGE;EACA;;AAIJ;AAAA;EAEE;EACA;EACA;;AAGF;EAEE;;;AAWJ;EAEE;EACA;EACA;;AAOA;AAAA;EAEE;EbjHF,kBakHuB;;;AASzB;EAEE;EACA;EACA;EAGA;;AAEA;EACE;EACA;EACA;;AAEA;EAEE;;AAIJ;AAAA;EAEE,a/B0d0B;E+Bzd1B;EACA;;;AAUF;AAAA;EAEE;EACA;;;AAKF;AAAA;EAEE;EACA;EACA;;;AAMF;AAAA;EACE;;;AAUF;EACE;;AAEF;EACE;;;AC7LJ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAoBJ;EACE;EACA;EACA;EnC4NI,WALI;EmCrNR;EACA;EACA;;AAEA;EAEE;;;AAUJ;EAEE;EACA;EAEA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;;AAGE;EAEE;;AAIJ;EACE;;;AASJ;EACE,ahC8gCkC;EgC7gClC,gBhC6gCkC;EgC5gClC;;AAEA;AAAA;AAAA;EAGE;;;AAaJ;EACE;EACA;EAGA;;;AAIF;EACE;EnCyII,WALI;EmClIR;EACA;EACA;EACA;Ef3II,Ye6IJ;;AfzII;EeiIN;IfhIQ;;;Ae0IN;EACE;;AAGF;EACE;EACA;EACA;;;AAMJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AxB1HE;EwBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AxB5LR;EwBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AxB5LR;EwBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AxB5LR;EwBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AxB5LR;EwBsIA;IAEI;IACA;;EAEA;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAIJ;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;If9NJ,YegOI;;EAGA;IACE;;EAGF;IACE;IACA;IACA;IACA;;;AAtDR;EAEI;EACA;;AAEA;EACE;;AAEA;EACE;;AAGF;EACE;EACA;;AAIJ;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;AAGF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;Ef9NJ,YegOI;;AAGA;EACE;;AAGF;EACE;EACA;EACA;EACA;;;AAiBZ;AAAA;EAGE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAME;EACE;;;ACzRN;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIA;EACE;EACA;;AAGF;EACE;EACA;;AAEA;EACE;;AAIF;EACE;;AAOJ;AAAA;EAEE;;;AAIJ;EAGE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAQA;EACE;;;AAQJ;EACE;EACA;EACA;EACA;EACA;;AAOF;EACE;EACA;EACA;EACA;;AAYF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAIJ;EACE;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAIF;AAAA;AAAA;EAGE;;;AAqBA;EACE;;AzB3HA;EyBuHJ;IAQI;IACA;;EAGA;IAEE;IACA;;EAEA;IACE;IACA;;;;ACrMR;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;ErC4PI,WALI;EqCrPR;EACA;EACA;EACA;EAEA;EjB1BI,YiB2BJ;;AjBvBI;EiBUN;IjBTQ;;;AiBwBN;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EjBjDE,YiBkDF;;AjB9CE;EiBqCJ;IjBpCM;;;AiBgDN;EACE;;AAGF;EACE;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;;AAUA;EACE;;AAmBJ;EACE;;;AASA;EACE;EACA;;AAGA;EAAgB;;AAChB;EAAe;;AAmBf;EACE;EACA;;;AC1JN;EAEE;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EtC+QI,WALI;EsCxQR;EACA;;;AAMA;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAIJ;EACE;;;ACrCJ;EAEE;EACA;EvC4RI,2BALI;EuCrRR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EjCpBA;EACA;;;AiCuBF;EACE;EACA;EACA;EvCgQI,WALI;EuCzPR;EACA;EACA;EACA;EnBpBI,YmBqBJ;;AnBjBI;EmBQN;InBPQ;;;AmBkBN;EACE;EACA;EAEA;EACA;;AAGF;EACE;EACA;EACA;EACA,SpC2uCgC;EoC1uChC;;AAGF;EAEE;EACA;ElBtDF,kBkBuDuB;EACrB;;AAGF;EAEE;EACA;EACA;EACA;;;AAKF;EACE,apC8sCgC;;AoClrCpC;EClGE;EACA;ExC0RI,2BALI;EwCnRR;;;ADmGF;ECtGE;EACA;ExC0RI,2BALI;EwCnRR;;;ACFF;EAEE;EACA;EzCuRI,sBALI;EyChRR;EACA;EACA;EAGA;EACA;EzC+QI,WALI;EyCxQR;EACA;EACA;EACA;EACA;EACA;;AAKA;EACE;;;AAKJ;EACE;EACA;;;AChCF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;;;AAKF;EAEE;;;AAIF;EACE,avC6kB4B;EuC5kB5B;;;AAQF;EACE,evCs+C8B;;AuCn+C9B;EACE;EACA;EACA;EACA;EACA;;;AAQF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AAJF;EACE;EACA;EACA;EACA;;;AC5DF;EACE;IAAK,uBvC+DuB;;;AuC1DhC;AAAA;EAGE;E3CkRI,yBALI;E2C3QR;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;E3CsQI,WALI;E2C/PR;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EvBxBI,YuByBJ;;AvBrBI;EuBYN;IvBXQ;;;;AuBuBR;EtBAE;EsBEA;;;AAGF;EACE;;;AAGF;EACE;;;AAIA;EACE;;AAGE;EAJJ;IAKM;;;;AC3DR;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EAGA;EACA;;;AAIF;EACE;EACA;;AAEA;EAEE;EACA;;;AASJ;EACE;EACA;EACA;;AAGA;EAEE;EACA;EACA;EACA;;AAGF;EACE;EACA;;;AAQJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAUA;EAEE;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAIF;EACE;;AAEA;EACE;EACA;;;AAaF;EACE;;AAaE;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;;AjCtFR;EiC8DA;IACE;;EAaE;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AjCtFR;EiC8DA;IACE;;EAaE;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AjCtFR;EiC8DA;IACE;;EAaE;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AjCtFR;EiC8DA;IACE;;EAaE;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AjCtFR;EiC8DA;IACE;;EAaE;IACE;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;AAiBV;EACE;;AAEA;EACE;;;AAaJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAVF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AC5LJ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA,O1CqpD2B;E0CppD3B,Q1CopD2B;E0CnpD3B;EACA;EACA;EACA;EAEA;;AAGA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EAEE;EACA;EACA;;;AAQJ;EAHE;;;AASE;EATF;;;ACjDF;EAEE;EACA;EACA;EACA;EACA;E9CyRI,sBALI;E8ClRR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;E9C2QI,WALI;E8CpQR;EACA;EACA;EACA;EACA;EACA;;AAGA;EACE;;AAGF;EACE;;;AAIJ;EACE;EAEA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;;;AAIJ;EACE;EACA;;;AC9DF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;;;AAOF;EACE;EACA;EACA;EAEA;;AAGA;E3B5CI,Y2B6CF;EACA,W5Ck8CgC;;AiB5+C9B;E2BwCJ;I3BvCM;;;A2B2CN;EACE,W5Cg8CgC;;A4C57ClC;EACE,W5C67CgC;;;A4Cz7CpC;EACE;;AAEA;EACE;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAIA;;;AAIF;EAEE;EACA;EACA;EClHA;EACA;EACA;EACA,SDkH0B;ECjH1B;EACA;EACA,kBD+G4D;;AC5G5D;EAAS;;AACT;EAAS,SD2GiF;;;AAK5F;EACE;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;;;AAKJ;EACE;EACA;;;AAKF;EACE;EAGA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAMA;EACE;;;ApC3GA;EoCiHF;IACE;IACA;;EAIF;IACE;IACA;IACA;;EAGF;IACE;;;ApC9HA;EoCmIF;AAAA;IAEE;;;ApCrIA;EoC0IF;IACE;;;AAUA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AASF;EACE;;;ApC1JJ;EoCwIA;IACE;IACA;IACA;IACA;;EAEA;IACE;IACA;;EASF;IACE;;;ApC1JJ;EoCwIA;IACE;IACA;IACA;IACA;;EAEA;IACE;IACA;;EASF;IACE;;;ApC1JJ;EoCwIA;IACE;IACA;IACA;IACA;;EAEA;IACE;IACA;;EASF;IACE;;;ApC1JJ;EoCwIA;IACE;IACA;IACA;IACA;;EAEA;IACE;IACA;;EASF;IACE;;;ApC1JJ;EoCwIA;IACE;IACA;IACA;IACA;;EAEA;IACE;IACA;;EASF;IACE;;;AErOR;EAEE;EACA;EACA;EACA;EACA;EjDwRI,wBALI;EiDjRR;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EClBA,a/C+lB4B;E+C7lB5B;EACA,a/CwmB4B;E+CvmB5B,a/C+mB4B;E+C9mB5B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;ElDgRI,WALI;EiDhQR;EACA;;AAEA;EAAS;;AAET;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;;AAKN;EACE;;AAEA;EACE;EACA;EACA;;;AAIJ;AACA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;AAEA;EACE;;AAEA;EACE;EACA;EACA;;;AAIJ;AACA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;AAkBA;EACE;EACA;EACA;EACA;EACA;;;AEpHF;EAEE;EACA;EnD4RI,wBALI;EmDrRR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EnDmRI,+BALI;EmD5QR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EDzBA,a/C+lB4B;E+C7lB5B;EACA,a/CwmB4B;E+CvmB5B,a/C+mB4B;E+C9mB5B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;ElDgRI,WALI;EmD1PR;EACA;EACA;EACA;;AAIA;EACE;EACA;EACA;;AAEA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAMJ;EACE;;AAEA;EAEE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;;AAKN;AAEE;EACE;EACA;EACA;;AAEA;EAEE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;;AAKN;AAGE;EACE;;AAEA;EAEE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;AAEE;EACE;EACA;EACA;;AAEA;EAEE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;;AAKN;AAkBA;EACE;EACA;EnD2GI,WALI;EmDpGR;EACA;EACA;;AAGA;EACE;;;AAIJ;EACE;EACA;;;ACrLF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;ACtBA;EACE;EACA;EACA;;;ADuBJ;EACE;EACA;EACA;EACA;EACA;EACA;EhClBI,YgCmBJ;;AhCfI;EgCQN;IhCPQ;;;;AgCiBR;AAAA;AAAA;EAGE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AASA;EACE;EACA;EACA;;AAGF;AAAA;AAAA;EAGE;EACA;;AAGF;AAAA;EAEE;EACA;EhC5DE,YgC6DF;;AhCzDE;EgCqDJ;AAAA;IhCpDM;;;;AgCiER;AAAA;EAEE;EACA;EACA;EACA;EAEA;EACA;EACA;EACA,OjDkhDmC;EiDjhDnC;EACA,OhDzFS;EgD0FT;EACA;EACA;EACA,SjD6gDmC;EiBnmD/B,YgCuFJ;;AhCnFI;EgCkEN;AAAA;IhCjEQ;;;AgCqFN;AAAA;AAAA;EAEE,OhDnGO;EgDoGP;EACA;EACA,SjDqgDiC;;;AiDlgDrC;EACE;;;AAGF;EACE;;;AAKF;AAAA;EAEE;EACA,OjDsgDmC;EiDrgDnC,QjDqgDmC;EiDpgDnC;EACA;EACA;;;AAGF;EACE;;;AAEF;EACE;;;AAQF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA,cjDs9CmC;EiDr9CnC;EACA,ajDo9CmC;;AiDl9CnC;EACE;EACA;EACA,OjDo9CiC;EiDn9CjC,QjDo9CiC;EiDn9CjC;EACA,cjDo9CiC;EiDn9CjC,ajDm9CiC;EiDl9CjC;EACA;EACA,kBhDjKO;EgDkKP;EACA;EAEA;EACA;EACA,SjD28CiC;EiB3mD/B,YgCiKF;;AhC7JE;EgC4IJ;IhC3IM;;;AgC+JN;EACE,SjDw8CiC;;;AiD/7CrC;EACE;EACA;EACA,QjDk8CmC;EiDj8CnC;EACA,ajD+7CmC;EiD97CnC,gBjD87CmC;EiD77CnC,OhD5LS;EgD6LT;;;AAMA;AAAA;EAEE,QjDm8CiC;;AiDh8CnC;EACE,kBhD/LO;;AgDkMT;EACE,OhDnMO;;;AgDyLT;AAAA;AAAA;EAEE,QjDm8CiC;;AiDh8CnC;EACE,kBhD/LO;;AgDkMT;EACE,OhDnMO;;;AkDfX;AAAA;EAEE;EACA;EACA;EACA;EAEA;EACA;;;AAIF;EACE;IAAK;;;AAIP;EAEE;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;;;AAGF;EAEE;EACA;EACA;;;AASF;EACE;IACE;;EAEF;IACE;IACA;;;AAKJ;EAEE;EACA;EACA;EACA;EACA;EAGA;EACA;;;AAGF;EACE;EACA;;;AAIA;EACE;AAAA;IAEE;;;AC/EN;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;A5C6DE;E4C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ATuDJ;E4C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A5C5BJ;E4C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;A5CnCN;E4C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ATuDJ;E4C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A5C5BJ;E4C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;A5CnCN;E4C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ATuDJ;E4C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A5C5BJ;E4C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;A5CnCN;E4C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ATuDJ;E4C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A5C5BJ;E4C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;A5CnCN;E4C5CF;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;InC5BA,YmC8BA;;;AnC1BA;EmCYJ;InCXM;;;ATuDJ;E4C5BE;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IAEE;;EAGF;IAGE;;;A5C5BJ;E4C/BF;IAiEM;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;;;;AA/ER;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EnC5BA,YmC8BA;;AnC1BA;EmCYJ;InCXM;;;AmC2BF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EAEE;;AAGF;EAGE;;;AA2BR;EPpHE;EACA;EACA;EACA,S7C0mCkC;E6CzmClC;EACA;EACA,kB5CWS;;A4CRT;EAAS;;AACT;EAAS,S7Cm+CyB;;;AoDr3CpC;EACE;EACA;EACA;;AAEA;EACE;EACA;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AC7IF;EACE;EACA;EACA;EACA;EACA;EACA,SrDgzCkC;;AqD9yClC;EACE;EACA;;;AAKJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKA;EACE;;;AAIJ;EACE;IACE,SrDmxCgC;;;AqD/wCpC;EACE;EACA;EACA;;;AAGF;EACE;IACE;;;AH9CF;EACE;EACA;EACA;;;AIHF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;AAFF;EACE;EACA;;;ACFF;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AATN;EACE;EACA;;AAGE;EAGE;EACA;;;AAOR;EACE;EACA;;AAGE;EAEE;EACA;;;AC1BN;EACE;EAEA;;;ACHF;EACE;EACA,KzD6c4B;EyD5c5B;EACA;EACA,uBzD2c4B;EyD1c5B;;AAEA;EACE;EACA,OzDuc0B;EyDtc1B,QzDsc0B;EyDrc1B;ExCIE,YwCHF;;AxCOE;EwCZJ;IxCaM;;;;AwCDJ;EACE;;;ACnBN;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;ACrBJ;EACE;EACA;EACA;EACA;EACA,S3DumCkC;;;A2DpmCpC;EACE;EACA;EACA;EACA;EACA,S3D+lCkC;;;A2DvlChC;EACE;EACA;EACA,S3DmlC8B;;;A2DhlChC;EACE;EACA;EACA,S3D6kC8B;;;AQ9iChC;EmDxCA;IACE;IACA;IACA,S3DmlC8B;;E2DhlChC;IACE;IACA;IACA,S3D6kC8B;;;AQ9iChC;EmDxCA;IACE;IACA;IACA,S3DmlC8B;;E2DhlChC;IACE;IACA;IACA,S3D6kC8B;;;AQ9iChC;EmDxCA;IACE;IACA;IACA,S3DmlC8B;;E2DhlChC;IACE;IACA;IACA,S3D6kC8B;;;AQ9iChC;EmDxCA;IACE;IACA;IACA,S3DmlC8B;;E2DhlChC;IACE;IACA;IACA,S3D6kC8B;;;AQ9iChC;EmDxCA;IACE;IACA;IACA,S3DmlC8B;;E2DhlChC;IACE;IACA;IACA,S3D6kC8B;;;A4D5mCpC;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;ACRF;AAAA;ECIE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGA;AAAA;EACE;;;ACdF;EACE;EACA;EACA;EACA;EACA;EACA,S/DgcsC;E+D/btC;;;ACRJ;ECAE;EACA;EACA;;;ACNF;EACE;EACA;EACA,OlEisB4B;EkEhsB5B;EACA;EACA,SlE2rB4B;;;AmE/nBtB;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAjBJ;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AASF;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAjBJ;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AASF;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AArBJ;AAcA;EAOI;EAAA;;;AAmBJ;AA1BA;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAjBJ;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AASF;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAjBJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AAIJ;EAOI;;;AAKF;EAOI;;;AAnBN;EAOI;;;AAKF;EAOI;;;AAnBN;EAOI;;;AAKF;EAOI;;;AAnBN;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAjBJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AANJ;EACE;;;AAIA;EACE;;;AAIJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAPJ;EAIQ;EAGJ;;;AAjBJ;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AASF;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;EAAA;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;AAPJ;EAOI;;;A3DVR;E2DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;A3DVR;E2DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;A3DVR;E2DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;A3DVR;E2DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;A3DVR;E2DGI;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;IAAA;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;ACtDZ;ED+CQ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;ACnCZ;ED4BQ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;EAPJ;IAOI;;;AxE5DZ;EACE;;;AAMA;EACE,OMJO;;;ANaT;EACE;EACA","file":"custom.css"} \ No newline at end of file diff --git a/mybookmark.ui/src/assets/thumbs_up_0i8ids3f6gah.svg b/mybookmark.ui/src/assets/thumbs_up_0i8ids3f6gah.svg new file mode 100644 index 0000000..d4b7dbd --- /dev/null +++ b/mybookmark.ui/src/assets/thumbs_up_0i8ids3f6gah.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mybookmark.ui/src/assets/thumbs_up_hpr13jlpx4z2.svg b/mybookmark.ui/src/assets/thumbs_up_hpr13jlpx4z2.svg new file mode 100644 index 0000000..cb59ba8 --- /dev/null +++ b/mybookmark.ui/src/assets/thumbs_up_hpr13jlpx4z2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mybookmark.ui/src/common/AdminLayout.tsx b/mybookmark.ui/src/common/AdminLayout.tsx new file mode 100644 index 0000000..3ec372f --- /dev/null +++ b/mybookmark.ui/src/common/AdminLayout.tsx @@ -0,0 +1,18 @@ +import React from 'react' +import Content from './Content' +import Navbar from './Navbar' +import Sidebar from './Sidebar' +import { Outlet } from 'react-router-dom' + +export default function Layout() { + return ( + <> +
+ +
+
+ +
+ + ) +} diff --git a/mybookmark.ui/src/common/Footer.tsx b/mybookmark.ui/src/common/Footer.tsx new file mode 100644 index 0000000..b8970c6 --- /dev/null +++ b/mybookmark.ui/src/common/Footer.tsx @@ -0,0 +1,9 @@ +import React from 'react' + +export default function Footer() { + return ( +
+ +
+ ) +} diff --git a/mybookmark.ui/src/common/Helper.tsx b/mybookmark.ui/src/common/Helper.tsx new file mode 100644 index 0000000..de68545 --- /dev/null +++ b/mybookmark.ui/src/common/Helper.tsx @@ -0,0 +1,64 @@ +export function GetCombinedClassesArray(childClasses: Array, externalErrorClasses?: string | null){ + const classes = externalErrorClasses?.trim(); + if (classes == null || classes.length <= 0) return childClasses; + return childClasses + ' ' + classes.trim().replace(/\s\s+/g, ' ').split(' ').join(' '); +} + +// export function GetCombinedClassesstring(childClasses: string | null | undefined, externalErrorClasses?: string | null){ +// const classes = externalErrorClasses?.trim() ?? ''; +// if (classes == null || classes.length <= 0) return childClasses; +// return childClasses + ' ' + classes.trim().replace(/\s\s+/g, ' '); +// } + +export function GetElementId(prefix: string, itemId: string){ + return prefix + '_' + itemId; +} + +export function TruncateString(str: string, length: number) { + if (str.length <= length) { + return str + } + return str.slice(0, length) + '...' +} + +export function SetFlag(flagItem: number, flag: number): number{ + return flagItem | flag; +} + +export function RemoveFlag(flagItem: number, flag: number): number{ + return flagItem & ~flag; +} + +export function IsFlagSet(actual: number, expected: number): boolean{ + const flag = actual & expected; + return flag === expected; +}; + +export function DeepEqual(object1: object | null | undefined, object2: object | null | undefined) { + if(object1 == null || object2 == null) return false; + + const keys1 = Object.keys(object1); + const keys2 = Object.keys(object2); + + if (keys1.length !== keys2.length) { + return false; + } + + for (const key of keys1) { + const val1 = (object1 as keyof typeof object1)[key]; + const val2 = (object2 as keyof typeof object2)[key]; + const areObjects = isObject(val1) && isObject(val2); + if ( + areObjects && !DeepEqual(val1, val2) || + !areObjects && val1 !== val2 + ) { + return false; + } + } + + return true; + } + + function isObject(object: object) { + return object != null && typeof object === 'object'; + } \ No newline at end of file diff --git a/mybookmark.ui/src/common/Layout.tsx b/mybookmark.ui/src/common/Layout.tsx new file mode 100644 index 0000000..b944b55 --- /dev/null +++ b/mybookmark.ui/src/common/Layout.tsx @@ -0,0 +1,50 @@ +import Navbar from './Navbar' +import Sidebar from './Sidebar' +import { Outlet } from 'react-router-dom' + +export default function Layout() { + return ( + <> + +
+ +
+ +
+
+ +
+
+
+ + + ) + + // return ( + // <> + //
+ //
+ // + // {/*
*/} + //
+ // {/*
*/} + //
+ // + //
+ //
+ //
+ + // {/*
*/} + // {/*
*/} + //
+ // + // {/*
*/} + //
+ // {/*
*/} + //
+ // + //
+ //
+ // + // ) +} diff --git a/mybookmark.ui/src/common/Navbar.tsx b/mybookmark.ui/src/common/Navbar.tsx new file mode 100644 index 0000000..5cef723 --- /dev/null +++ b/mybookmark.ui/src/common/Navbar.tsx @@ -0,0 +1,61 @@ +import { useState } from 'react' +import { Link } from 'react-router-dom' + +export default function Navbar() { + const [activeDropdown, setActiveDropdown] = useState(); + const toggleDropdown = (id: string) => setActiveDropdown(activeDropdown != id ? id : null); + + return ( + <> + + + ) +} diff --git a/mybookmark.ui/src/common/Sidebar.tsx b/mybookmark.ui/src/common/Sidebar.tsx new file mode 100644 index 0000000..550257a --- /dev/null +++ b/mybookmark.ui/src/common/Sidebar.tsx @@ -0,0 +1,71 @@ +import React from 'react' +import { TfiPlus, TfiSearch } from 'react-icons/tfi'; +import GenreListEditComponent from '../components/library/edit/genre/GenreListEditComponent'; +import { Link } from 'react-router-dom'; + +export default function Sidebar() { + return ( + <> + + {/* */} + + {/* + +

Боковая панель

+ + +

Группа списка

+
*/} + + + + {/*
+

Меню

+ +
+
+
Search
+ + +
+
+ +
*/} + + ) +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/MediaContent/AnimeTitleCreateComponent.tsx b/mybookmark.ui/src/components/MediaContent/AnimeTitleCreateComponent.tsx new file mode 100644 index 0000000..3684c87 --- /dev/null +++ b/mybookmark.ui/src/components/MediaContent/AnimeTitleCreateComponent.tsx @@ -0,0 +1,180 @@ +import React, { ChangeEvent, useState } from 'react' +// import ErrorField from '../common/ErrorField'; +import { useQuery } from 'react-query'; +import { languageQueryKey } from '../library/edit/language/LanguageListEditComponent'; +import { GetLanguageList } from '../../api/LanguageApi'; +import { CreateAnimeTitle } from '../../api/AnimeTitleApi'; +import MediaInfoEditComponent from '../common/edit/MediaInfoEditComponent'; +import { MediaInfo, TitleCreateModel, TitleCreateNameModel } from '../../api/models/Types'; +import ErrorInput from '../common/error/ErrorInput'; +import ErrorField from '../common/error/ErrorField'; + +export default function AnimeTitleCreateComponent() { + //languageQueryKey + const { data, isError, isLoading } = useQuery(languageQueryKey, GetLanguageList); + // const queryClient = useQueryClient(); + const [createNewAnimeTitleError, setCreateNewAnimeTitleError] = useState(null); + // const [createNewAnimeTitleError, setCreateNewAnimeTitleError] = useState('null'); + const [languageIdNamePreview, selectLanguageIdNamePreview] = useState<[languageId: string | null, name: string | null, mediaInfo: MediaInfo | null]>(); + const selectLanguage = (id?: string | null) => { + selectLanguageIdNamePreview( + [ + (id == languageIdNamePreview?.[0] ? null : id) ?? null, + languageIdNamePreview?.[1] ?? null, + languageIdNamePreview?.[2] ?? null + ] + ); + }; + + const onNameChange = (event : ChangeEvent) => { + selectLanguageIdNamePreview( + [ + languageIdNamePreview?.[0] ?? null, + event.target.value ?? null, + languageIdNamePreview?.[2] ?? null + ] + ); + } + const onMediaInfoChangeChange = (mediaInfo: MediaInfo | null | undefined) => { + selectLanguageIdNamePreview( + [ + languageIdNamePreview?.[0] ?? null, + languageIdNamePreview?.[1] ?? null, + mediaInfo ?? null + ] + ); + } + + return ( + <> +
+
+ +
+
+ {/*
*/} + + + +
+ {/*
+
+ +
+
+ +
+
+ +
+ +
*/} + + + + {/*
+ + +
*/} + + + + + + {/* +
+
+
+
+
+ + + // + //
+ //

+ // + // + // + //

+ //

+ // + // + // + //

+ //

+ // + // + // + //

+ //
+ //
+ ) +} + +function IsLanguageValid(languageId: string | null | undefined){ + return languageId != null && languageId != undefined && languageId.length > 0; +} + +function IsNameValid(name: string | null | undefined){ + return name != null && name != undefined && name.length > 0; +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/MediaContent/edit/Descriptions/DescriptionItemEditComponent.tsx b/mybookmark.ui/src/components/MediaContent/edit/Descriptions/DescriptionItemEditComponent.tsx new file mode 100644 index 0000000..47c0010 --- /dev/null +++ b/mybookmark.ui/src/components/MediaContent/edit/Descriptions/DescriptionItemEditComponent.tsx @@ -0,0 +1,193 @@ +import { ChangeEvent, useState } from 'react' +import { TfiCheck, TfiClose, TfiPencil, TfiTrash } from 'react-icons/tfi'; +import { NameItem, Language, Description } from '../../../../api/models/Types'; +import ErrorField from '../../../common/error/ErrorField'; +import ErrorInput from '../../../common/error/ErrorInput'; +import React from 'react'; + +export interface IDescriptionItemEditComponentProps{ + // name: NameItem | null | undefined, + description: Description, + languages: Array, + enabled: boolean, + + setDeleting: (description: Description, value: boolean) => void, + isDeleting: boolean, + deleteDescription: (description: Description) => Promise, + + setEditing: (description: Description, value: boolean) => void, + isEditing: boolean, + editDescription: (description: Description, newValue: string | null, newLanguageId: string | null) => Promise, + + forceRefresh: () => void, +} + +export function IsGenreNameValid(value: string | undefined){ + return !(value == undefined || value.trim().length == 0) +} + +export default function DescriptionItemEditComponent(props : IDescriptionItemEditComponentProps) { + const [editDescriptionError, SetEditDescriptionError] = useState(); + const [descriptionLanguageIdValue, selectDescriptionLanguageIdValue] = useState<[languageId: string | null, name: string | null]>(); + const selectLanguage = (id?: string | null) => selectDescriptionLanguageIdValue( [ (id == descriptionLanguageIdValue?.[0] ? null : id) ?? null, descriptionLanguageIdValue?.[1] ?? null, ] ); + const onDescriptionChange = (event : ChangeEvent) => selectDescriptionLanguageIdValue( [ descriptionLanguageIdValue?.[0] ?? null, event.target.value ?? null, ] ); + React.useEffect(() => selectDescriptionLanguageIdValue([ props.description.language.id, props.description.value, ]), [props]); + + return( + +
+ {!props.isEditing && +
+
+
+ {descriptionLanguageIdValue?.[1]} +
+
+
+ } + {props.isEditing && +
+ + {/* + {/* */} + +
+ } +
+ +
+ + + + + { ShowButtons(props, descriptionLanguageIdValue?.[1], descriptionLanguageIdValue?.[0], editDescriptionError == undefined ? null : editDescriptionError, SetEditDescriptionError) } +
+
+
+
+
+ ) +} + +function ShowButtons(props: IDescriptionItemEditComponentProps, newDescriptionValue: string | null | undefined, languageSelectedId: string | null | undefined, editDescriptionError: string | null, setEditDescriptionError: (error: string | null) => void){ + const isError = !IsLanguageValid(languageSelectedId) || !IsDescriptionValid(newDescriptionValue); + if (props.isEditing){ + return ( + <> + + {/* + + + + {/* + + + ); + } + else if (props.isDeleting){ + return ( + <> + + {/* + + + + {/* + + + ); + } + else{ + return ( + <> + + + {/* + + + + {/* + + + ); + } +} + +export function IsLanguageValid(languageId: string | null | undefined){ + return languageId != null && languageId != undefined && languageId.length > 0; +} + +export function IsDescriptionValid(name: string | null | undefined){ + return name != null && name != undefined && name.length > 0; +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/MediaContent/edit/Descriptions/DescriptionsEditComponent.tsx b/mybookmark.ui/src/components/MediaContent/edit/Descriptions/DescriptionsEditComponent.tsx new file mode 100644 index 0000000..446a129 --- /dev/null +++ b/mybookmark.ui/src/components/MediaContent/edit/Descriptions/DescriptionsEditComponent.tsx @@ -0,0 +1,255 @@ +import React, { ChangeEvent, useState } from 'react' +import { TfiPlus } from 'react-icons/tfi'; +import { Description, Language } from '../../../../api/models/Types'; +import { useQuery } from 'react-query'; +import ErrorField from '../../../common/error/ErrorField'; +import ErrorInput from '../../../common/error/ErrorInput'; +import { languageQueryKey } from '../../../library/edit/language/LanguageListEditComponent'; +import { GetLanguageList } from '../../../../api/LanguageApi'; +import { DeepEqual } from '../../../../common/Helper'; +import DescriptionItemEditComponent, { IsDescriptionValid, IsLanguageValid } from './DescriptionItemEditComponent'; + +export interface IDescriptionsEditComponentProps{ + descriptions: Array | null | undefined + createDescription: (description: Description) => Promise, + editDescription: (description: Description, newValue: string | null, newLanguageId: string | null) => Promise, + deleteDescription: (description: Description) => Promise, + forceRefresh: () => void, +} + +export default function DescriptionsEditComponent(props: IDescriptionsEditComponentProps) { + const { data: languagesData, isLoading: languagesIsLoading, isError: languagesIsError, error: languagesError } = useQuery(languageQueryKey, GetLanguageList); + + const [createNewDescriptionError, setCreateNewDescriptionError] = useState(); + + const [descriptions, setDescription] = useState>([]); + const [originalDescriptionSelected, setOriginalDescriptionSelected] = useState(true); + const [descriptionLanguageIdValue, selectDescriptionLanguageIdValue] = useState<[languageId: string | null, description: string | null]>(); + + const selectLanguage = (id?: string | null) => { + selectDescriptionLanguageIdValue( + [ + (id == descriptionLanguageIdValue?.[0] ? null : id) ?? null, + descriptionLanguageIdValue?.[1] ?? null, + ] + ); + }; + + const onDescriptionChange = (event : ChangeEvent) => { + selectDescriptionLanguageIdValue( + [ + descriptionLanguageIdValue?.[0] ?? null, + event.target.value ?? null, + ] + ); + } + + const [editingDescription, SetEditingDescription] = useState(null); + const SetEditing = (description: Description, value: boolean) => { + if (DeepEqual(description, editingDescription) || !value){ + SetEditingDescription(null); + } + else{ + SetEditingDescription(description); + } + }; + + const [deletingDescription, SetDeletingDescription] = useState(null); + const SetDeleting = (description: Description, value: boolean) => { + if (DeepEqual(description, deletingDescription) || !value){ + SetDeletingDescription(null); + } + else{ + SetDeletingDescription(description); + } + }; + + React.useEffect(() => { + selectDescriptionLanguageIdValue( [ null, null, ] ); + setDescription( props.descriptions ?? [] ); + }, [props]); + + return ( +
+
+ +
+
+ {(!isTypeSingle(originalDescriptionSelected) || (isTypeSingle(originalDescriptionSelected) && !containsItems(descriptions, originalDescriptionSelected))) && + +
+
+ + {/* */} + + {/* */} + + +
+
+ +
+ + + + + + {/* + +
+
+
+
+
+ } + + {!isTypeSingle(originalDescriptionSelected) && +
+ } + + {(!isTypeSingle(originalDescriptionSelected) || (isTypeSingle(originalDescriptionSelected) && containsItems(descriptions, originalDescriptionSelected))) && + <> +
    + { + ShowNames( + { + descriptions: descriptions?.filter(q => q.isOriginal == originalDescriptionSelected) ?? [], + languages: languagesData ?? [], + isLoading: languagesIsLoading, + isError: languagesIsError, + error: languagesError as Error, + setDeleting: SetDeleting, + isDeleting: (description: Description | null) => DeepEqual(deletingDescription, description), + deleteDescription: props.deleteDescription, + setEditing: SetEditing, + isEdited: (description: Description | null) => DeepEqual(editingDescription, description), + editDescription: props.editDescription, + forceRefresh: props.forceRefresh + }, languagesData) + } +
+ + } + +
+
+ ) +} + +type ShowGenresProps = { + descriptions: Array, + languages: Array, + isLoading: boolean, + isError: boolean, + error: Error | undefined, + setDeleting: (description: Description, value: boolean) => void, + isDeleting: (description: Description | null) => boolean, + deleteDescription: (description: Description) => Promise, + + setEditing: (description: Description, value: boolean) => void, + isEdited: (description: Description | null) => boolean, + editDescription: (description: Description, newValue: string | null, newLanguageId: string | null) => Promise, + forceRefresh: () => void, +} + +function ShowNames(props: ShowGenresProps, languages: Array | undefined){ + if (props.isLoading){ + return ( + <> +
1. SomeDescription
+
2. SomeDescription
+
3. SomeDescription
+ + ) + } + else if (props.isError){ + // else if (true){ + return ( +
  • +
    +

    {props.error?.name ?? 'Unknown error'}

    +
    +
    + {/* Error occured during fetching items: */} + {props.error?.message ?? 'unknown'} +
    +
  • + ) + } + else{ + return React.Children.toArray( + props.descriptions.map((description: Description) => { + return ( + + + ); + }) + ) + } +} + +function isTypeSingle(isOriginal: boolean){ + return isOriginal; +} + +function containsItems(names: Array, isOriginal: boolean){ + return names.filter(q => q.isOriginal == isOriginal).length > 0; +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/MediaContent/edit/Names/NameItemEditComponent.tsx b/mybookmark.ui/src/components/MediaContent/edit/Names/NameItemEditComponent.tsx new file mode 100644 index 0000000..fb519d5 --- /dev/null +++ b/mybookmark.ui/src/components/MediaContent/edit/Names/NameItemEditComponent.tsx @@ -0,0 +1,207 @@ +import { ChangeEvent, useState } from 'react' +import { TfiCheck, TfiClose, TfiPencil, TfiTrash } from 'react-icons/tfi'; +import { NameItem, Language } from '../../../../api/models/Types'; +import ErrorField from '../../../common/error/ErrorField'; +import ErrorInput from '../../../common/error/ErrorInput'; +import React from 'react'; + +export interface INameItemEditComponentProps{ + // name: NameItem | null | undefined, + name: NameItem, + languages: Array, + enabled: boolean, + + setEditing: (nameItem: NameItem, value: boolean) => void, + isEditing: boolean, + editName: (name: NameItem, newValue: string | null, newLanguageId: string | null) => Promise, + + setDeleting: (nameItem: NameItem, value: boolean) => void, + isDeleting: boolean, + deleteName: (name: NameItem) => Promise, + + forceRefresh: () => void, +} + +export default function NameItemEditComponent(props : INameItemEditComponentProps) { + const [editNameError, SetEditNameError] = useState(); + const [nameLanguageIdValue, setNameLanguageIdValue] = useState<[languageId: string | null, name: string | null]>(); + const selectLanguage = (id?: string | null) => setNameLanguageIdValue( [ (id == nameLanguageIdValue?.[0] ? null : id) ?? null, nameLanguageIdValue?.[1] ?? null, ] ); + const onNameChange = (event : ChangeEvent) => setNameLanguageIdValue( [ nameLanguageIdValue?.[0] ?? null, event.target.value ?? null, ] ); + React.useEffect(() => setNameLanguageIdValue([ props.name.language.id, props.name.value, ]), [props]); + + return( + + +
    + + + + + + + + + + {/* + + */} + { ShowButtons(props, nameLanguageIdValue?.[1], nameLanguageIdValue?.[0], editNameError == undefined ? null : editNameError, SetEditNameError) } +
    + {/*
    + + + + + { ShowItem(props, inputValue, editGenreError == undefined ? null : editGenreError, SetEditGenreError) } +
    */} +
    +
    + ) +} + +function ShowButtons(props: INameItemEditComponentProps, newNameValue: string | null | undefined, languageSelectedId: string | null | undefined, editNameError: string | null, setEditNameError: (error: string | null) => void){ + const isError = !IsLanguageValid(languageSelectedId) || !IsNameValid(newNameValue); + if (props.isEditing){ + return ( + <> + + {/* + + + + {/* + + + ); + } + else if (props.isDeleting){ + return ( + <> + + {/* + + + + {/* + + + ); + } + else{ + return ( + <> + + + {/* + + + + {/* + + + ); + } +} + +export function IsLanguageValid(languageId: string | null | undefined){ + return languageId != null && languageId != undefined && languageId.length > 0; +} + +export function IsNameValid(name: string | null | undefined){ + return name != null && name != undefined && name.length > 0; +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/MediaContent/edit/Names/NamesEditComponent.tsx b/mybookmark.ui/src/components/MediaContent/edit/Names/NamesEditComponent.tsx new file mode 100644 index 0000000..9ba68e2 --- /dev/null +++ b/mybookmark.ui/src/components/MediaContent/edit/Names/NamesEditComponent.tsx @@ -0,0 +1,252 @@ +import React, { ChangeEvent, useState } from 'react' +import { TfiPlus } from 'react-icons/tfi'; +import { Language, NameItem, NameType } from '../../../../api/models/Types'; +import { useQuery } from 'react-query'; +import ErrorField from '../../../common/error/ErrorField'; +import ErrorInput from '../../../common/error/ErrorInput'; +import { languageQueryKey } from '../../../library/edit/language/LanguageListEditComponent'; +import { GetLanguageList } from '../../../../api/LanguageApi'; +import { DeepEqual } from '../../../../common/Helper'; +import NameItemEditComponent, { IsLanguageValid, IsNameValid } from './NameItemEditComponent'; + +export interface INamesEditComponentProps{ + names: Array | null | undefined + createName: (name: NameItem) => Promise, + editName: (name: NameItem, newValue: string | null, newLanguageId: string | null) => Promise, + deleteName: (name: NameItem) => Promise, + forceRefresh: () => void, +} + +export default function NamesEditComponent(props: INamesEditComponentProps) { + const { data: languagesData, isLoading: languagesIsLoading, isError: languagesIsError, error: languagesError } = useQuery(languageQueryKey, GetLanguageList); + + const [createNewNameError, setCreateNewNameError] = useState(); + + const [names, setNames] = useState>([]); + const [nameTypeSelected, selectNameTypeSelected] = useState(NameType.Original); + const [nameLanguageIdValue, setNameLanguageIdValue] = useState<[languageId: string | null, name: string | null]>(); + + const selectLanguage = (id?: string | null) => { + setNameLanguageIdValue( + [ + (id == nameLanguageIdValue?.[0] ? null : id) ?? null, + nameLanguageIdValue?.[1] ?? null, + ] + ); + }; + + const onNameChange = (event : ChangeEvent) => { + setNameLanguageIdValue( + [ + nameLanguageIdValue?.[0] ?? null, + event.target.value ?? null, + ] + ); + } + + const [editingName, SetEditingName] = useState(null); + const SetEditing = (nameItem: NameItem, value: boolean) => { + if (DeepEqual(nameItem, editingName) || !value){ + SetEditingName(null); + } + else{ + SetEditingName(nameItem); + } + }; + + const [deletingName, SetDeletingName] = useState(null); + const SetDeleting = (nameItem: NameItem, value: boolean) => { + if (DeepEqual(nameItem, deletingName) || !value){ + SetDeletingName(null); + } + else{ + SetDeletingName(nameItem); + } + }; + + React.useEffect(() => { + setNameLanguageIdValue( [ null, null, ] ); + setNames( props.names ?? [] ); + }, [props]); + + return ( +
    +
    +
      + { + React.Children.toArray( + [ + { type:NameType.Original, name: 'Оригинальное название' }, + { type:NameType.OriginalInAnotherLanguage, name: 'Оригинальные на других языках' }, + { type:NameType.Translation, name: 'Переведённые название' }, + { type:NameType.Abbreviation, name: 'Аббревиатуры' }, + ].map((tab) => +
    • + selectNameTypeSelected(tab.type)}>{tab.name} +
    • + ) + ) + } +
    +
    +
    + {(!isTypeSingle(nameTypeSelected) || (isTypeSingle(nameTypeSelected) && !containsItems(names, nameTypeSelected))) && + + +
    + + + + + + + + {/* + +
    +
    +
    + } + + {!isTypeSingle(nameTypeSelected) && +
    + } + + {(!isTypeSingle(nameTypeSelected) || (isTypeSingle(nameTypeSelected) && containsItems(names, nameTypeSelected))) && + <> +
      + { + ShowNames( + { + names: names?.filter(q => q.type == nameTypeSelected) ?? [], + languages: languagesData ?? [], + isLoading: languagesIsLoading, + isError: languagesIsError, + error: languagesError as Error, + setDeleting: SetDeleting, + isDeleting: (nameItem: NameItem | null) => DeepEqual(deletingName, nameItem), + deleteName: props.deleteName, + setEditing: SetEditing, + isEdited: (nameItem: NameItem | null) => DeepEqual(editingName, nameItem), + editName: props.editName, + forceRefresh: props.forceRefresh + }, languagesData) + } +
    + + } + +
    +
    + ) +} + +type ShowGenresProps = { + names: Array, + languages: Array, + isLoading: boolean, + isError: boolean, + error: Error | undefined, + setDeleting: (nameItem: NameItem, value: boolean) => void, + isDeleting: (nameItem: NameItem | null) => boolean, + deleteName: (name: NameItem) => Promise, + + setEditing: (nameItem: NameItem, value: boolean) => void, + isEdited: (nameItem: NameItem | null) => boolean, + editName: (name: NameItem, newValue: string | null, newLanguageId: string | null) => Promise, + forceRefresh: () => void, +} + +function ShowNames(props: ShowGenresProps, languages: Array | undefined){ + if (props.isLoading){ + return ( + <> +
    1. SomeName
    +
    2. SomeName
    +
    3. SomeName
    + + ) + } + else if (props.isError){ + // else if (true){ + return ( +
  • +
    +

    {props.error?.name ?? 'Unknown error'}

    +
    +
    + {/* Error occured during fetching items: */} + {props.error?.message ?? 'unknown'} +
    +
  • + ) + } + else{ + return React.Children.toArray( + props.names.map((name: NameItem) => { + return ( + + + ); + }) + ) + } +} + +function isTypeSingle(type: NameType){ + return type === NameType.Original; +} + +function containsItems(names: Array, type: NameType){ + return names.filter(q => q.type == type).length > 0; +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/MediaContent/view/AnimeTitleDetailComponent.tsx b/mybookmark.ui/src/components/MediaContent/view/AnimeTitleDetailComponent.tsx new file mode 100644 index 0000000..d0b420a --- /dev/null +++ b/mybookmark.ui/src/components/MediaContent/view/AnimeTitleDetailComponent.tsx @@ -0,0 +1,176 @@ +import { GetTitleNames } from '../../common/view/NameComponent'; +import MediaInfoComponent from '../../common/view/MediaInfoComponent'; +import NamesViewComponent from '../../common/view/NamesViewComponent'; +import DescriptionViewComponent from '../../common/view/DescriptionViewComponent'; +import GenreListView from '../../library/view/GenreListView'; +import { AnimeTitle } from '../../../api/models/Types'; +import RateComponent from '../../common/view/RateComponent'; +import { TfiPencil } from 'react-icons/tfi'; +import { useNavigate } from 'react-router-dom'; + +export interface IAnimeTitleDetailComponentProps{ + animeTitle: AnimeTitle, + userLanguageId?: string | null | undefined, + setRate: (value: number | null) => Promise, + deleteRate: () => Promise, + forceRefresh?: () => void, +} + +export default function AnimeTitleDetailComponent(props: IAnimeTitleDetailComponentProps) { + const titleNames = GetTitleNames(props.animeTitle.commonProperties.names, props.userLanguageId); + const navigate = useNavigate(); + const goToEditPage = () => navigate(`/admin/library/anime/anime/title/${props.animeTitle.id}/edit`); + const canUserEdit = true; + // const canUserEdit = false; + return ( +
    + {!canUserEdit && +

    {titleNames?.titleElement}

    + } + {canUserEdit && +
    +
    +

    {titleNames?.titleElement}

    +
    +
    +
    + +
    +
    +
    + } + +
    +
    + + +
    + {/*
    +

    Жанры

    +
    */} +
    + {/* {data.commonProperties.genres.length > 0 && + + } + {data.commonProperties.genres.length == 0 && + — — // — — + } */} +
    + {/* */} +
    + {/* + + + + + + + */} + + + {/* + */} + + + + + {/* + */} + + + + +
    #FirstLastHandle
    Дата анонса{data.commonProperties.announcementDate?.toString() ?? '—//—'}Дата анонса{props.animeTitle.commonProperties.announcementDate?.toString() ?? '—//—'}
    Предполагаемая дата выхода{data.commonProperties.estimatedReleaseDate?.toString() ?? '—//—'}Предполагаемая дата выхода{props.animeTitle.commonProperties.estimatedReleaseDate?.toString() ?? '—//—'}
    +
    +
    +
    + +
    +
    +
    + {/*
    +

    Оценка

    +
    */} + | null | undefined, + userRatePercentage={props.animeTitle.myRate} + setRate={props.setRate} + deleteRate={props.deleteRate} + forceRefresh={props.forceRefresh} + /> + {/*
    +
    +
    Оценка
    +
    +
    + {data.commonProperties.genres.length > 0 && + + } + {data.commonProperties.genres.length == 0 && + — — // — — + } +
    +
    */} +
    + + + + +
    +
    +

    Жанры

    +
    +
    + {props.animeTitle.commonProperties.genres.length > 0 && + + } + {props.animeTitle.commonProperties.genres.length == 0 && + — — // — — + } +
    +
    + +
    +
    +
    +
    +

    Заметка

    +
    +
    + {props.animeTitle.commonProperties.genres.length > 0 && + + } + {props.animeTitle.commonProperties.genres.length == 0 && + — — // — — + } +
    +
    +
    +
    +
    +

    Ссылки

    +
    +
    + {props.animeTitle.commonProperties.genres.length > 0 && + + } + {props.animeTitle.commonProperties.genres.length == 0 && + — — // — — + } +
    +
    +
    +
    +
    +
    +
    Содержимое
    +
    сезоны
    +
    эпизоды
    +
    +
    + ) +} diff --git a/mybookmark.ui/src/components/MediaContent/view/AnimeTitleListComponent.tsx b/mybookmark.ui/src/components/MediaContent/view/AnimeTitleListComponent.tsx new file mode 100644 index 0000000..c0f8982 --- /dev/null +++ b/mybookmark.ui/src/components/MediaContent/view/AnimeTitleListComponent.tsx @@ -0,0 +1,116 @@ +import React from 'react' +import AnimeTitleShortComponent from './AnimeTitleShortComponent'; +import { QueryClient, useQuery, useQueryClient } from 'react-query'; +import { GetAnimeTitleList, RateAnimeTitle, UnrateAnimeTitle } from '../../../api/AnimeTitleApi'; +import { AnimeTitle, RateDeleteModel, RateEditModel } from '../../../api/models/Types'; + +const queryKey = 'anime_titles'; + +export default function AnimeTitleListComponent() { + const { data, isLoading, isError } = useQuery(queryKey, GetAnimeTitleList); + const queryClient = useQueryClient(); + // const [expandedRate, SetRateExpanded] = useState(); + return ( +
    + {isLoading && +
    Загрузка...
    + } + {isError && +
    Ошибка загрузки данных
    + } + {!isLoading && !isError && + ShowAnimeTitles(data, queryClient) + } +
    + ) +} + +function ShowAnimeTitles(data: Array | undefined, queryClient: QueryClient){ + // if (data) return React.Children.toArray( + // data.map((item: AnimeTitle) => + //
    + // + //
    + // ) + // ); + if (data) return React.Children.toArray( + data.map((item: AnimeTitle) => + <> +
    + InvalidateTitles(queryClient)} + userLanguageId={'2c16c758-bd85-42e9-9e0e-3bc4e382aa47'} + // item={TestRating(item)} /> + setRate={(value) => { + // console.log(`Set rate (${value == null ? 'null' : value}) of [${rateObjectId}]`); + if (value != null){ + return RateAnimeTitle({ + animeTitleId: item.id, + animeSeasonId: null, + animeEpisodeId: null, + ratePercentage: value + } as RateEditModel); + } + else{ + return UnrateAnimeTitle({ + animeTitleId: item.id, + animeSeasonId: null, + animeEpisodeId: null, + } as RateDeleteModel); + } + }} + deleteRate={() => { + // console.log(`Delete rate of [${rateObjectId}]`); + return UnrateAnimeTitle({ + animeTitleId: item.id, + animeSeasonId: null, + animeEpisodeId: null, + } as RateDeleteModel); + }} + item={item} /> +
    +
    + InvalidateTitles(queryClient)} + setRate={(value) => { + // console.log(`Set rate (${value == null ? 'null' : value}) of [${rateObjectId}]`); + if (value != null){ + return RateAnimeTitle({ + animeTitleId: item.id, + animeSeasonId: null, + animeEpisodeId: null, + ratePercentage: value + } as RateEditModel); + } + else{ + return UnrateAnimeTitle({ + animeTitleId: item.id, + animeSeasonId: null, + animeEpisodeId: null, + } as RateDeleteModel); + } + }} + deleteRate={() => { + // console.log(`Delete rate of [${rateObjectId}]`); + return UnrateAnimeTitle({ + animeTitleId: item.id, + animeSeasonId: null, + animeEpisodeId: null, + } as RateDeleteModel); + }} + item={item} /> +
    + + ) + ); + else return (
    Нет элементов
    ); +} + +// function TestRating(item: AnimeTitle){ +// const clone = structuredClone(item); +// clone.rate = 70; +// clone.myRate = 80; +// return clone; +// } + +function InvalidateTitles(queryClient: QueryClient) { queryClient.invalidateQueries({ queryKey: [queryKey] }); } \ No newline at end of file diff --git a/mybookmark.ui/src/components/MediaContent/view/AnimeTitleShortComponent.tsx b/mybookmark.ui/src/components/MediaContent/view/AnimeTitleShortComponent.tsx new file mode 100644 index 0000000..7d339e7 --- /dev/null +++ b/mybookmark.ui/src/components/MediaContent/view/AnimeTitleShortComponent.tsx @@ -0,0 +1,156 @@ +import React from 'react' +import { AnimeTitle, Language, NameItem, NameType } from '../../../api/models/Types' +import MediaInfoComponent from '../../common/view/MediaInfoComponent' +import RateComponent from '../../common/view/RateComponent'; + +import { atom, useAtom } from 'jotai'; +import { useNavigate } from 'react-router-dom'; +import GenreListView from '../../library/view/GenreListView'; +import { GetTitleNames } from '../../common/view/NameComponent'; + +// const expandedRatingAtom = atom() + +export interface IAnimeTitleShortComponentProps{ + item: AnimeTitle, + userLanguageId?: string | null | undefined, + setRate: (value: number | null) => Promise, + deleteRate: () => Promise, + forceRefresh: () => void, +} + +export default function AnimeTitleShortComponent(props: IAnimeTitleShortComponentProps) { + // console.log(props.item.commonProperties.releaseDate); + //const name = GetNameString(props.item.commonProperties.names, 'rus'); + // const [expandedRating, setExpandedRating] = useAtom(expandedRatingAtom); + // const name = GetNameString(props.item.commonProperties.names, props.userLanguageId); + + const name = GetTitleNames(props.item.commonProperties.names, props.userLanguageId)?.titleElement; + const navigate = useNavigate(); + const viewDetail = () => navigate(`/library/anime/${props.item.id}`); + return ( +
    +
    + {/*

    {name}

    */} +

    {name}

    +
    + + {/*
    */} +
    + {/*
    */} +
    + +
    +
    + {/*
    +
    + setExpandedRating(expanded && expandedRating != props.item.id ? props.item.id : null)} + forceRefresh={props.forceRefresh} + progressBarTextShowOption={ProgressBarTextOption.Fraction}/> +
    +
    */} + +
    +
    + | null | undefined, + userRatePercentage={props.item.myRate} + setRate={props.setRate} + deleteRate={props.deleteRate} + forceRefresh={props.forceRefresh} /> +
    +
    + +
    +
    + Дата выхода: +
    +
    + {props.item.commonProperties.releaseDate == null + ? '——//——' + : new Date(props.item.commonProperties.releaseDate).toLocaleDateString('ru-RU', { year: 'numeric', month: '2-digit', day: '2-digit',}) } +
    +
    +
    +
    + Страна: +
    +
    + {/* {props.item.originCountry == null ?? 'Япония'} */} + {'Япония'} +
    +
    +
    +
    + Сезоны: +
    +
    + {props.item.episodes.length} +
    +
    +
    +
    + Эпизоды: +
    +
    + {props.item.episodesInsideSeasonsCount + (props.item.episodes.length > 0 ? (' + ' + props.item.episodes.length) : '')} +
    +
    +
    +
    + +
    + { + React.Children.toArray( + ['Жанр1', 'Жанр2', 'Жанр3', 'Жанр4', 'Жанр5', 'Жанр6', 'Жанр7' + ,'Жанр1', 'Жанр2', 'Жанр3', 'Жанр4', 'Жанр5', 'Жанр6', 'Жанр7' + ,'Жанр1', 'Жанр2', 'Жанр3', 'Жанр4', 'Жанр5', 'Жанр6', 'Жанр7' + ,'Жанр1', 'Жанр2', 'Жанр3Жанр3Жанр3', 'Жанр4', 'Жанр5', 'Жанр6', 'Жанр7' + ,'Жанр1', 'Жанр2', 'Жанр3', 'Жанр4', 'Жанр5', 'Жанр6', 'Жанр7' + ,'Жанр1', 'Жанр2', 'Жанр3', 'Жанр4', 'Жанр5', 'Жанр6', 'Жанр7' + ,'Жанр1', 'Жанр2', 'Жанр3', 'Жанр4', 'Жанр5', 'Жанр6 Жанр3 adsdadsa', 'Жанр7' + ,'Жанр1', 'Жанр2', 'Жанр3', 'Жанр4', 'Жанр5', 'Жанр6', 'Жанр7' + ,'Жанр1', 'Жанр2', 'Жанр3', 'Жанр4', 'Жанр5', 'Жанр6', 'Жанр7' + ].map((item) => +
    {item}
    + ) + ) + } +
    +
    + {/*
    +
    + +
    +
    + {'Жанр1, Жанр2, Жанр3, Жанр4, Жанр5, Жанр6, Жанр7'} +
    +
    */} +
    +
    + + {/*
    +
    + +
    +
    + + +
    +
    */} + +
    + ) +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/Menu.tsx b/mybookmark.ui/src/components/Menu.tsx new file mode 100644 index 0000000..28afde0 --- /dev/null +++ b/mybookmark.ui/src/components/Menu.tsx @@ -0,0 +1,9 @@ +import React from 'react' + +export default function Menu() { + return ( +
    + +
    + ) +} diff --git a/mybookmark.ui/src/components/common/Types.tsx b/mybookmark.ui/src/components/common/Types.tsx new file mode 100644 index 0000000..b4d454f --- /dev/null +++ b/mybookmark.ui/src/components/common/Types.tsx @@ -0,0 +1,5 @@ +export enum ProgressBarTextOption{ + None, + Percentage, + Fraction, +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/common/edit/DateEditComponent.tsx b/mybookmark.ui/src/components/common/edit/DateEditComponent.tsx new file mode 100644 index 0000000..c3febd8 --- /dev/null +++ b/mybookmark.ui/src/components/common/edit/DateEditComponent.tsx @@ -0,0 +1,124 @@ +import { ChangeEvent, useEffect, useState } from 'react' +import ErrorField from '../error/ErrorField'; +import ErrorInput from '../error/ErrorInput'; +import { TfiCheck, TfiPencil } from 'react-icons/tfi'; + +export interface IDateEditComponent{ + elementId: string, + // componentName: string, + placeholder?: string | undefined | null, + required?: boolean | undefined | null, + isEditing?: boolean | undefined | null, + enabled?: boolean | undefined | null, + date: Date | undefined | null, + editDate: (value: Date | null) => Promise, + setEditing: (value: boolean) => void, + // setDeleting: (genreId: string, value: boolean) => void, + forceRefresh: () => void, +} + +export default function DateEditComponent(props: IDateEditComponent) { + const [editDateError, SetEditDateError] = useState(); + const [inputValue, SetInputValue] = useState(null); + const OnValueChanged = (event : ChangeEvent) => { + const value = event.target.value; + if (value == undefined || value == null){ + SetInputValue(null); + } + else{ + SetInputValue(value); + } + }; + + useEffect(() => { + const v = DateToString(props.date); + console.log(`date type: ${typeof(props.date)}; ${props.date} | ${v}`) + // SetInputValue(DateToString(props.date)); + SetInputValue(v); + }, [props]) + + //SetInputValue(props.genre.name); + return( + + + +
    + + + + + { ShowItem(props, inputValue, editDateError == undefined ? null : editDateError, SetEditDateError) } +
    +
    +
    + ) +} + +function ShowItem(props: IDateEditComponent, newDateValue: string | null | undefined, editGenreError: string | null, setEditGenreError: (error: string | null) => void){ + // const isError = !IsGenreNameValid(newDateValue); + const isError = false; + if (props.isEditing){ + return ( + <> + + {/* + + + ); + } + else{ + return ( + <> + + {/* + + + ); + } +} + +function DateToString(date: Date | undefined | null): string { + if (date == undefined || date == null){ + return ''; + } + else{ + // const d = new Date(date); + // const year = new Date(date).getFullYear(); + // const month = new Date(date).getMonth(); + // const day = new Date(date).getDay(); + const year = date.getFullYear(); + const month = date.getMonth(); + const day = date.getDate(); + return `${year}-${(month + 1).toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`; + // return `${day.toString().padStart(2, '0')}-${(month + 1).toString().padStart(2, '0')}-${year}`; + } +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/common/edit/MediaInfoEditComponent.tsx b/mybookmark.ui/src/components/common/edit/MediaInfoEditComponent.tsx new file mode 100644 index 0000000..0f3874c --- /dev/null +++ b/mybookmark.ui/src/components/common/edit/MediaInfoEditComponent.tsx @@ -0,0 +1,193 @@ +import React, { ChangeEvent, useState } from 'react' +import { MediaInfo, MediaInfoType } from '../../../api/models/Types' +import MediaInfoComponent from '../view/MediaInfoComponent' +import { TfiCheck, TfiClose, TfiEraser, TfiPencil, TfiTrash } from 'react-icons/tfi' +import ErrorInput from '../error/ErrorInput' + +export interface IMediaInfoComponentProps{ + mediaInfo?: MediaInfo | null + //mediaInfoType?: MediaInfo | null + classes?: string | null + + setEditing: (mediaInfo: MediaInfo | null, value: boolean) => void, + isEditing: boolean, + editMediaInfo: (mediaInfo: MediaInfo | null, newContentType: string | null, newUrl: string | null) => Promise + + setDeleting: (mediaInfo: MediaInfo, value: boolean) => void, + isDeleting: boolean, + deleteMediaInfo: (mediaInfo: MediaInfo) => Promise + + forceRefresh: () => void, +} + +export default function MediaInfoEditComponent(props: IMediaInfoComponentProps) { + // const [url, setUrlValue] = useState(GetUrl(props.mediaInfo?.url)); + const [editMediaInfoError, SetEditMediaInfoError] = useState(); + const [urlContentTypeValue, setUrlContentTypeValue] = useState<[url: string | null, contentType: string | null]>(); + const setUrl = (url?: string | null) => { + if (url != null && url == urlContentTypeValue?.[0]){ + return; + } + else{ + setUrlContentTypeValue( [ url != null && url.length > 0 ? url : null, url != null ? 'image/png' : null, ] ); + } + }; + + React.useEffect(() => { + const url = GetUrl(props.mediaInfo?.url); + setUrlContentTypeValue([ url, url != null ? 'image/png' : null, ]); + }, [props]); + + // const [mediaInfo, setMediaInfoValue] = useState(props.mediaInfo) + const onUrlChanged = (event : ChangeEvent) => setUrl(event.target.value ?? null); + + return( + <> + {/*

    mediaInfo.url: {mediaInfo?.url}

    */} +
    + +
    +
    + {/* */} + {/* */} + + + + {ShowButtons(props, urlContentTypeValue?.[1], urlContentTypeValue?.[0], editMediaInfoError == undefined ? null : editMediaInfoError, SetEditMediaInfoError)} + {/* */} +
    + + ) +} + +function CreateMediaInfo(mediaInfo: MediaInfo | null | undefined, value: string | null | undefined){ + if (value != undefined && value != null && value.length){ + const isMediaInfoDefined = mediaInfo != undefined && mediaInfo != null; + return { + type: isMediaInfoDefined ? mediaInfo.type : MediaInfoType.Image, + contentType: isMediaInfoDefined ? mediaInfo.contentType : 'image/png', //??? + url: value + } as MediaInfo; + } + return null; +} + +function GetUrl(url: string | undefined | null){ + return url == undefined || url == null ? '' : url; +} + +function ShowButtons(props: IMediaInfoComponentProps, newContentType: string | null | undefined, newUrl: string | null | undefined, editMediInfoError: string | null, setEditMediInfoError: (error: string | null) => void){ + const isError = !IsContentTypeValid(newContentType) || !IsUrlValud(newUrl); + if (props.isEditing){ + return ( + <> + + {/* + + + + {/* + + + ); + } + else if (props.isDeleting){ + return ( + <> + + {/* + + + + {/* + + + ); + } + else{ + return ( + <> + + + {/* + + + + {/* + + + ); + } +} + +export function IsContentTypeValid(contentType: string | null | undefined){ + return contentType != null && contentType != undefined && contentType.length > 0; +} + +export function IsUrlValud(url: string | null | undefined){ + return url != null && url != undefined && url.length > 0; +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/common/error/ErrorField.tsx b/mybookmark.ui/src/components/common/error/ErrorField.tsx new file mode 100644 index 0000000..cc72708 --- /dev/null +++ b/mybookmark.ui/src/components/common/error/ErrorField.tsx @@ -0,0 +1,24 @@ +import React, { ReactElement } from 'react' +import { HasError } from './ErrorInput' + +export interface IErrorFieldProps extends React.PropsWithChildren{ + error: string | undefined | null, + children: ReactElement +} + +export default function ErrorField(props: React.PropsWithChildren) { + return ( + //
    + //

    + // {props.children} + //

    + // {HasError(props.error) && + //

    {props.error}

    + // } + //
    + <> + {props.children} +
    {props.error}
    + + ) +} diff --git a/mybookmark.ui/src/components/common/error/ErrorInput.tsx b/mybookmark.ui/src/components/common/error/ErrorInput.tsx new file mode 100644 index 0000000..b2abc5d --- /dev/null +++ b/mybookmark.ui/src/components/common/error/ErrorInput.tsx @@ -0,0 +1,52 @@ +import { Children, cloneElement, PropsWithChildren, ReactElement } from 'react' +import { GetCombinedClassesArray } from '../../../common/Helper'; + +export interface IErrorInputProps extends PropsWithChildren{ + error: string | null | undefined, + errorClassses?: string | null + children: ReactElement +} + +export default function ErrorInput(props: PropsWithChildren) { + return (props.children && + Children.map( + props.children, + (child: ReactElement) => + cloneElement(child, { className: CombineClasse(child.props.className, HasError(props.error), props.errorClassses)}) + // child + ) + ) + + // try{ + // return ( + // Children.map( + // props.children, + // (child: ReactElement) => + // // React.cloneElement(child, { className: CombineClasse(child.props.className, HasError(props.error ?? ''), props.errorClassses)}) + // child + // ) + // ) + // } catch (ex) { + // console.log('exception'); + // console.log(ex); + // return ( + // <> + //

    exception

    + //

    {JSON.stringify(ex)}

    + // + // ) + // } +} + +function CombineClasse(childClasses: Array, hasError: boolean, externalErrorClasses?: string | null){ + if (!hasError) return childClasses; + // GetCombinedClassesArray(child.props.className, (props.errorClassses ?? '') + HasError(props.error) ? (' is-danger') + const externalErrorClassesTrimed = externalErrorClasses?.trim() ?? ''; + // const classesWithError = externalErrorClassesTrimed + (!hasError ? '' : ((externalErrorClassesTrimed.length > 0 ? ' ' : '') + 'is-danger')); + const classesWithError = externalErrorClassesTrimed + (!hasError ? '' : ((externalErrorClassesTrimed.length > 0 ? ' ' : '') + 'is-invalid')); + return GetCombinedClassesArray(childClasses, classesWithError); +} + +export function HasError(error: string | undefined | null) { + return error != undefined && error != null && error.length > 0; +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/common/view/DescriptionViewComponent.tsx b/mybookmark.ui/src/components/common/view/DescriptionViewComponent.tsx new file mode 100644 index 0000000..158c7a7 --- /dev/null +++ b/mybookmark.ui/src/components/common/view/DescriptionViewComponent.tsx @@ -0,0 +1,148 @@ +import React, { useEffect, useState } from 'react' +import { Description } from '../../../api/models/Types' +import { TruncateString } from '../../../common/Helper'; + +export interface IDescriptionViewComponentProps{ + descriptions: Array, + userLanguageId?: string | null | undefined, +} + +type DescriptionTab = { + tabName: string, + enabled: boolean, + descriptions: Array + +} + +type DescriptionItem = { + order: number | null, + shortName: string, + description: Description +} + +export default function DescriptionViewComponent(props: IDescriptionViewComponentProps) { + //language + const [tabs, updateTabs] = useState>([]); + const [selectedTab, setSelectedTab] = useState(null); + const [selectedDescription, setSelectedDescription] = useState(null); + + useEffect(() => { + const descriptionInUserLanguage = props.descriptions.find(q => q.language.id == props.userLanguageId && q.isOriginal) ?? + props.descriptions.find(q => q.language.id == props.userLanguageId); + const mainTabDescription = descriptionInUserLanguage ?? props.descriptions.find(q => q.isOriginal) ?? props.descriptions?.[0]; + const anotherDescriptions = props.descriptions.filter(q => q != mainTabDescription); + const tabs = [ + { + tabName: 'Описание', + enabled: mainTabDescription != null, + descriptions: mainTabDescription != undefined && mainTabDescription != null + ? [ { order: null, shortName: '', description: mainTabDescription, } as DescriptionItem ] + : [], + } as DescriptionTab, + { + tabName: 'Другие описания', + enabled: anotherDescriptions.length > 0, + descriptions: anotherDescriptions.map((item, index) => ( + { + order: index, + shortName: `${index + 1}. [${item.language.codeIso3}] ${TruncateString(item.value, 20)}`, + description: item, + } as DescriptionItem + )), + } as DescriptionTab, + ]; + + if (!tabs.some(q => q.enabled)) setSelectedTab(null); + else setSelectedTab(!tabs[0].enabled ? tabs[1].tabName : tabs[0].tabName); + setSelectedDescription(0); + updateTabs(tabs); + }, [props]); + + + const OnTabSelected = (tabName: string) =>{ + if (selectedTab == tabName) return; + else{ + setSelectedTab(tabName); + setSelectedDescription(0); + } + }; + + const OnDescriptionSelected = (descriptionOrder: number) =>{ + if (selectedDescription == descriptionOrder) return; + else setSelectedDescription(descriptionOrder); + }; + + return ( +
    + + {selectedTab != undefined && selectedTab != null && + +
    + + {selectedTab == 'Описание' && ContainsAnyDescriptions(tabs, 'Описание') && +
    + { + ShowDescription(tabs.find(q => q.tabName == selectedTab)?.descriptions[0]) + } +
    + } + + {selectedTab == 'Другие описания' && ContainsAnyDescriptions(tabs, 'Другие описания') && +
    +
    +
    + {props.descriptions && + React.Children.toArray( + tabs.find(q => q.tabName == selectedTab)?.descriptions.sort((a, b) => Number(a.description.isOriginal) - Number(b.description.isOriginal)) + .map((item) => + OnDescriptionSelected(item.order ?? 0)}> + {(item.order ?? 0) + 1}. [{item.description.language.codeIso3}] {TruncateString(item.description.value, 20)} + + ) + ) + } +
    +
    +
    + { ShowDescription(tabs.find(q => q.tabName == selectedTab)?.descriptions.find(q => q.order == selectedDescription)) } +
    +
    + } + +
    + + } +
    + ) +} + +function ShowDescription(item: DescriptionItem | undefined){ + if (item == undefined) return (<>); + return ( + <> + {item.order != null && +

    Описание {item.order + 1}

    + } + {item.description.value} + + ); +} + +function ContainsAnyDescriptions(tabs: Array, selectedTab: string | null){ + return tabs.find(q => q.tabName == selectedTab && q.descriptions.length > 0) != null; +} + +function NavLinkClasses(tabs: Array, selectedTab: string | null, tabName: string | null){ + return 'nav-link' + (selectedTab == tabName ? ' active' : '') + (!ContainsAnyDescriptions(tabs, tabName) ? ' disabled' : ''); +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/common/view/MediaInfoComponent.tsx b/mybookmark.ui/src/components/common/view/MediaInfoComponent.tsx new file mode 100644 index 0000000..6ede4a7 --- /dev/null +++ b/mybookmark.ui/src/components/common/view/MediaInfoComponent.tsx @@ -0,0 +1,45 @@ +import React, { CSSProperties, useState } from 'react' +import { MediaInfo, MediaInfoType } from '../../../api/models/Types' + +export interface IMediaInfoComponentProps{ + mediaInfo?: MediaInfo | null + classes?: string | null, + onClick?: () => void +} + +export default function MediaInfoComponent(props: IMediaInfoComponentProps) { + const noImage = 'https://soneil.com/wp-content/uploads/2018/08/No-Image-Available-01-e1534180482174.jpg'; + const errorImage = 'https://i.pinimg.com/originals/fe/df/71/fedf7125acf620e856b6d09ef44eee51.gif'; + const [imgSrc, setImgSrc] = useState('') + React.useEffect(() => setImgSrc(props.mediaInfo?.url), [props]); + const style: CSSProperties = { + width: '100%', + aspectRatio: 1,//1 / 1, + objectFit: 'cover' + }; + const role = props.onClick != undefined && props.onClick != null ? 'button' : ''; + const onClick = () => props.onClick?.(); + if (props.mediaInfo == null) return ( ); + switch (props.mediaInfo.type) { + case MediaInfoType.Image: + return ( + setImgSrc(errorImage)} + role={role} + onClick={onClick} + style={style} + /> + ) + case MediaInfoType.Video: + + break; + case MediaInfoType.Link: + + break; + case MediaInfoType.OtherFile: + + break; + default: + throw new Error('Not implementet media type'); + //break; + } +} diff --git a/mybookmark.ui/src/components/common/view/NameComponent.tsx b/mybookmark.ui/src/components/common/view/NameComponent.tsx new file mode 100644 index 0000000..9fe5671 --- /dev/null +++ b/mybookmark.ui/src/components/common/view/NameComponent.tsx @@ -0,0 +1,83 @@ +import { ReactNode } from "react"; +import { NameItem, NameType } from "../../../api/models/Types"; + +export type TitleNames = { + titleElement: ReactNode | null + // titleString: string + namesUsed: Array, +}; + +export function GetTitleNames(names: Array | null | undefined, primaryLanguageId?: string | null | undefined){ + const titleNames = names == undefined || names == null + ? null + : { + titleElement: NameComponent(null, null), + namesUsed: [], + } as TitleNames; + if (titleNames != null){ + const nameOriginal = names!.find(q => q.type == NameType.Original) + if ((primaryLanguageId == undefined || primaryLanguageId == null) || nameOriginal?.language.id == primaryLanguageId){ + if (nameOriginal != null){ + titleNames.namesUsed.push(nameOriginal); + // titleNames.titleString = `${nameOriginal.value} [${nameOriginal.language.codeIso3}]`; + titleNames.titleElement = NameComponent(null, nameOriginal); + } + } + else{ + if (nameOriginal != null){ + titleNames.namesUsed.push(nameOriginal); + // titleNames.titleString = `${nameOriginal.value} [${nameOriginal.language.codeIso3}]`; + titleNames.titleElement = NameComponent(null, nameOriginal); + } + const originalNameInAnotherLanguage = names!.find(q => q.type == NameType.OriginalInAnotherLanguage && q.language.id == primaryLanguageId); + if (originalNameInAnotherLanguage != null){ + titleNames.namesUsed.push(originalNameInAnotherLanguage); + // titleNames.titleString = `${originalNameInAnotherLanguage.value}${nameOriginal != null ? ` / ${titleNames.titleString}` : ''}`; + titleNames.titleElement = NameComponent(originalNameInAnotherLanguage, nameOriginal ?? null); + } + else{ + const translatedName = names!.find(q => q.type == NameType.Translation && q.language.id == primaryLanguageId); + if (translatedName != null) { + titleNames.namesUsed.push(translatedName); + titleNames.titleElement = NameComponent(translatedName, nameOriginal ?? null); + } + } + } + } + return titleNames == null + ? null + : titleNames.namesUsed.length == 0 + ? null + : titleNames; +} + +function NameComponent(nameInUserLanguage?: NameItem | null, nameOriginal?: NameItem | null) : ReactNode { + if (nameInUserLanguage != null){ + if (nameOriginal != null){ + return ( + <> + {nameInUserLanguage.value} / {nameOriginal.value} [{nameOriginal!.language.codeIso3}] + + ) + } + else{ + return ( + <> + {nameInUserLanguage.value} + + ) + } + } + else if (nameOriginal != null){ + return ( + <> + {nameOriginal.value} [{nameOriginal!.language.codeIso3}] + + ) + } + else{ + return ( + NO NAME + ) + } + } \ No newline at end of file diff --git a/mybookmark.ui/src/components/common/view/NamesViewComponent.tsx b/mybookmark.ui/src/components/common/view/NamesViewComponent.tsx new file mode 100644 index 0000000..9f76f04 --- /dev/null +++ b/mybookmark.ui/src/components/common/view/NamesViewComponent.tsx @@ -0,0 +1,89 @@ +import React, { useEffect, useState } from 'react' +import { Description, NameItem, NameType } from '../../../api/models/Types' +import { TruncateString } from '../../../common/Helper'; + +export interface INamesViewComponentProps{ + excludeNames: Array, + names: Array, + userLanguageId?: string | null | undefined, +} + +type NameTab = { + tabName: string, + enabled: boolean, + names: Array +} + +export default function NamesViewComponent(props: INamesViewComponentProps) { + //language + const [tabs, updateTabs] = useState>([]); + const [selectedTab, setSelectedTab] = useState(null); + + useEffect(() => { + const names = props.names.filter(q => !props.excludeNames.includes(q) && q.type != NameType.Abbreviation); + const abbreviations = props.names.filter(q => !props.excludeNames.includes(q) && q.type == NameType.Abbreviation); + const tabs = [ + { + tabName: 'Другие названия', + enabled: names.length > 0, + names: names + } as NameTab, + { + tabName: 'Аббривеатуры', + enabled: abbreviations.length > 0, + names:abbreviations + } as NameTab, + ]; + + if (!tabs.some(q => q.enabled)) setSelectedTab(null); + else setSelectedTab(!tabs[0].enabled ? tabs[1].tabName : tabs[0].tabName); + updateTabs(tabs); + }, [props]); + + const OnTabSelected = (tabName: string) =>{ + if (selectedTab == tabName) return; + else setSelectedTab(tabName); + }; + + return ( +
    +
    + + +
    + + {selectedTab != undefined && selectedTab != null && +
    + { + React.Children.toArray( + tabs.filter(q => q.tabName == selectedTab).map((tab) => + React.Children.toArray( + tab.names.map((item) => ShowName(item)) + ) + ) + ) + } +
    + } + +
    + ) +} + +function ShowName(name: NameItem){ + return ( +
    + {[{name.language.codeIso3}]} {name.value} +
    + ) +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/common/view/ProgressBarWithText.tsx b/mybookmark.ui/src/components/common/view/ProgressBarWithText.tsx new file mode 100644 index 0000000..d377cd7 --- /dev/null +++ b/mybookmark.ui/src/components/common/view/ProgressBarWithText.tsx @@ -0,0 +1,53 @@ +import { ProgressBarTextOption } from '../Types'; + +export interface IProgressBarWithTextProps{ + value?: number | undefined | null + valuePercentage?: number | undefined | null + valueMax?: number | null + textShowOption?: ProgressBarTextOption | null +} + +export default function ProgressBarWithText(props: IProgressBarWithTextProps) { + // if (props.textShowOption == null || props.textShowOption == ProgressBarTextOption.None){ + // return ShowProgressBar(props.value, props.valueMax); + // } + // return ( + //
    {ShowProgressBar(props.value, props.valueMax)}
    + // ) + const valueMax = props.valueMax ?? 100; + // if (props.textShowOption == null || props.textShowOption == ProgressBarTextOption.None){ + + // } + return ( +
    + {/*
    {GetValue(props.value, props.valueMax, props.textShowOption ?? ProgressBarTextOption.None)}
    */} +
    {GetValue(props.value, props.valueMax, props.textShowOption ?? ProgressBarTextOption.None)}
    +
    + ) + // return ( + //
    {ShowProgressBar(props.value, props.valueMax)}
    + // ) +} + +function HasValue(value: number | undefined | null){ + return value != undefined && value != null; +} + +function GetValue(value: number | undefined | null, valueMax: number | undefined | null, textShowOption: ProgressBarTextOption | null){ + valueMax ??= 100; + const noValue = '——//——'; + switch (textShowOption) { + case ProgressBarTextOption.Percentage: + // return ((HasValue(value) ? value : 0) / valueMax) + '%'; + return HasValue(value) ? (value / valueMax * 100) + '%' : noValue; + case ProgressBarTextOption.Fraction: + return HasValue(value) ? (value ?? valueMax) + '/' + valueMax : noValue; + // case None: + + // break; + + default: + return ''; + // break; + } +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/common/view/RateComponent.tsx b/mybookmark.ui/src/components/common/view/RateComponent.tsx new file mode 100644 index 0000000..f2aa0db --- /dev/null +++ b/mybookmark.ui/src/components/common/view/RateComponent.tsx @@ -0,0 +1,257 @@ +import React, { useEffect, useState } from 'react' +import { IconContext } from 'react-icons' +import { FaRegStar, FaStar } from 'react-icons/fa6' +import { IsFlagSet, SetFlag } from '../../../common/Helper'; +import { TfiPencil, TfiTrash } from 'react-icons/tfi'; +import ProgressBarWithText from './ProgressBarWithText'; +import { ProgressBarTextOption } from '../Types'; +import { atom, useAtom } from 'jotai'; + +const expandedRatingAtom = atom(); + +export interface IRateComponentProps{ + rateObjectId: string, + ratePercentage?: number | null | undefined, + // rates?: Array | null | undefined, + userRatePercentage?: number | null | undefined, + progressBarTextShowOption?: ProgressBarTextOption, + // isExpanded: boolean | undefined + setRate: (value: number | null) => Promise, + deleteRate: () => Promise, + forceRefresh?: () => void | null | undefined, +} + +export default function RateComponent(props: IRateComponentProps) { + const [ratePercentage, setRatePercentage] = useState(null); + const [userRatePercentage, setUserRatePercentage] = useState(null); + const [rateEditId, setRateEditId] = useAtom(expandedRatingAtom); + const setRateEdit = (value: string | null) => { + // console.log('value: ' + value) + if (rateEditId != undefined && rateEditId == props.rateObjectId) setRateEditId(null); + else setRateEditId(value); + }; + + const [rateHovered, setRateHovered] = useState(null); + const OnPointerLeaveOrEnter = (rate: number, entered: boolean) => { + // console.log(`Entered: ${entered ? 'true' : 'false'}`) + if (entered) setRateHovered(rate); + else setRateHovered(null); + }; + const valueMax = 10; + // const [ratePercentSelected, setRatePercentSelected] = useState(60); + const OnSelectRate = (rate: number) => { + const ratePercentage = GetPercentage(rate, valueMax); + if (rate != null && props.ratePercentage != ratePercentage) { + // await props.setRate(props.rateObjectId, ratePercentage); + props.setRate(ratePercentage) + .then(() => { + setRateEditId(null); + setRateHovered(null); + if (props.forceRefresh != null) props.forceRefresh(); + }); + } + else{ + // await props.deleteRate(props.rateObjectId); + props.deleteRate() + .then(() => { + setRateEditId(null); + setRateHovered(null); + if (props.forceRefresh != null) props.forceRefresh(); + }); + } + }; + + useEffect(() => { + // setRatePercentage(GetPercentage(props.ratePercentage, valueMax)); + setRatePercentage(props.ratePercentage ?? null); + setUserRatePercentage(props.userRatePercentage ?? null); + }, [props]); + + // const isEditing = false; + // const isDeleting = false; + return ( + //
    +
    + {!IsEditing(props.rateObjectId, rateEditId) && +
    + { + // + + // + } +
    + } + {IsEditing(props.rateObjectId, rateEditId) && +
    + { + // RateEditElements(props.userRatePercentage, rateHovered, OnPointerLeaveOrEnter, OnSelectRate, 10) + RateEditElements(userRatePercentage, rateHovered, OnPointerLeaveOrEnter, OnSelectRate, 10) + } +
    + } + + {/* {GetRateValue(10, valueMax)} / {valueMax} */} + { + if (!IsEditing(props.rateObjectId, rateEditId)) return; + setRateEdit(null); + }} + > + {GetRateValue(ratePercentage, valueMax)} + + + + {/* { ShowItem(props, inputValue, editGenreError == undefined ? null : editGenreError, SetEditGenreError) } */} + { ShowButton({ + rateObjectId: props.rateObjectId, + rateEditId: rateEditId, + userRate: userRatePercentage, + valueMax: valueMax, + setRateEdit: setRateEdit, + deleteRate: props.deleteRate, + forceRefresh: props.forceRefresh + } as ButtonProps) } +
    + ) +} + +type ButtonProps = { + rateObjectId: string, + rateEditId: string | undefined | null, + userRate: number | undefined | null, + valueMax: number, + // isEditing: boolean, + deleteRate: (value: string) => Promise, + setRateEdit: (value: string | null) => void, + forceRefresh?: () => void | null, +} + +function ShowButton(props: ButtonProps){ + if (!IsEditing(props.rateObjectId, props.rateEditId)){ + return ( + <> + + {/* + + ); + } + else{ + return ( + <> + {/* + + ); + } +} + + +function RateEditElements(userRatePercentage: number | undefined | null, rateHovered: number | null, onhover: (rate: number, entered: boolean) => void, onselect: (rate: number) => void, steps?: number | null) { + const rateSequence = [...Array(steps ?? 10).keys()] + return ( + React.Children.toArray( + rateSequence.map((item) => + { + const value = item + 1; + return ( +
    onhover(value, true)} + onMouseLeave={() => onhover(value, false)} + onClick={() => onselect(value)} + > + { + RateEditElement(value, userRatePercentage != null ? userRatePercentage / 10 : null, rateHovered) + } +
    + {/* {value} */} +
    + ); + } + ) + ) + ) +} + +function RateEditElement(elementValue: number, valueSelected: number | null, valueHovered: number | null) { + const flag = GetElementFlag(elementValue, valueSelected, valueHovered); + const icon = IsFlagSet(flag, RateElementFlag.IsSelected) || IsFlagSet(flag, RateElementFlag.IsHovered) + ? + : ; + + const opacity = IsFlagSet(flag, RateElementFlag.IsSelected) + ? 1 + : IsFlagSet(flag, RateElementFlag.IsHovered) + ? 0.5 + : 0.3; + + const color = IsFlagSet(flag, RateElementFlag.IsHovered) && IsFlagSet(flag, RateElementFlag.IsGraterThenSelected) + ? 'greenyellow' + : !IsFlagSet(flag, RateElementFlag.IsHovered) && IsFlagSet(flag, RateElementFlag.IsLessThenSelected) + ? 'darkorange' + : 'gold'; + return ( + + { icon } + + ) +} + + +function GetRateValue(percentage: number | null | undefined, valueMax: number){ + // if (!IsRateDefined(percentage)) return valueMax; + if (!IsRateDefined(percentage)) return undefined; + else return percentage! / (100 / valueMax); +} + +function GetPercentage(value: number | undefined | null, valueMax: number){ + return (IsRateDefined(value) ? value! : valueMax) / valueMax * 100; +} + + +function IsRateDefined(percentage: number | null | undefined){ + return percentage != undefined && percentage != null && percentage > 0; +} + +function IsEditing(rateObjectId: string | undefined | null, rateEditId: string | undefined | null){ + return rateObjectId != undefined && rateObjectId == rateEditId; +} + + +function GetElementFlag(elementValue: number, valueSelected: number | null, valueHovered: number | null): RateElementFlag{ + let type = RateElementFlag.None; + if (valueHovered != null && elementValue <= valueHovered) type = SetFlag(type, RateElementFlag.IsHovered); + + if (valueSelected != null && elementValue <= valueSelected) type = SetFlag(type, RateElementFlag.IsSelected); + + if (valueSelected != null && valueHovered != null){ + if (valueHovered > valueSelected && elementValue > valueSelected && elementValue <= valueHovered){ + type = SetFlag(type, RateElementFlag.IsGraterThenSelected); + } + else if (valueHovered < valueSelected && elementValue <= valueSelected && elementValue > valueHovered){ + type = SetFlag(type, RateElementFlag.IsLessThenSelected); + } + } + + return type; +} + +enum RateElementFlag{ + None = 0, + IsSelected = 1, + IsHovered = 2, + IsGraterThenSelected = 4, + IsLessThenSelected = 8, +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/library/edit/genre/GenreItemEditComponent.tsx b/mybookmark.ui/src/components/library/edit/genre/GenreItemEditComponent.tsx new file mode 100644 index 0000000..0f2e51a --- /dev/null +++ b/mybookmark.ui/src/components/library/edit/genre/GenreItemEditComponent.tsx @@ -0,0 +1,139 @@ +import { ChangeEvent, useState } from 'react' +import { TfiCheck, TfiClose, TfiPencil, TfiTrash } from 'react-icons/tfi'; +import { Genre } from '../../../../api/models/Types'; +import { EditGenre, DeleteGenre } from '../../../../api/GenreApi'; +import ErrorInput from '../../../common/error/ErrorInput'; +import ErrorField from '../../../common/error/ErrorField'; +import { GetElementId } from '../../../../common/Helper'; + +export interface IListItem{ + genre: Genre, + isDeleting: boolean, + isEditing: boolean, + enabled: boolean, + setEditing: (genreId: string, value: boolean) => void, + setDeleting: (genreId: string, value: boolean) => void, + forceRefresh: () => void, +} + +export function IsGenreNameValid(value: string | undefined){ + return !(value == undefined || value.trim().length == 0) +} + +export default function GenreItemEditComponent(props : IListItem) { + const [editGenreError, SetEditGenreError] = useState(); + + const [inputValue, SetInputValue] = useState(props.genre.name); + const OnGenreNameChange = (event : ChangeEvent) => SetInputValue(event.target.value); + if (!props.isEditing && inputValue != props.genre.name) SetInputValue(props.genre.name); + //let inputValue = props.genre.name; + //const OnGenreNameChange = (event : ChangeEvent) => inputValue = event.target.value; + // const OnGenreNameChange = (event : ChangeEvent) => { + // console.log('Onchange: ' + event.target.value) + // inputValue = event.target.value + // }; + + //SetInputValue(props.genre.name); + return( + + + +
    + + + + + { ShowItem(props, inputValue, editGenreError == undefined ? null : editGenreError, SetEditGenreError) } +
    +
    +
    + ) +} + +function ShowItem(props: IListItem, newGenreValue: string, editGenreError: string | null, setEditGenreError: (error: string | null) => void){ + const isError = !IsGenreNameValid(newGenreValue); + if (props.isEditing){ + return ( + <> + + + + + + + + + ); + } + else if (props.isDeleting){ + return ( + <> + + + + + + + + + ); + } + else{ + return ( + <> + + + + + + + + + + ); + } +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/library/edit/genre/GenreListEditComponent.tsx b/mybookmark.ui/src/components/library/edit/genre/GenreListEditComponent.tsx new file mode 100644 index 0000000..ad2c423 --- /dev/null +++ b/mybookmark.ui/src/components/library/edit/genre/GenreListEditComponent.tsx @@ -0,0 +1,156 @@ +import React, { ChangeEvent, useState } from 'react' +import { TfiPlus } from 'react-icons/tfi'; +import { Genre } from '../../../../api/models/Types'; +import { GetGenreList, CreateGenre } from '../../../../api/GenreApi'; +import { QueryClient, useQuery, useQueryClient } from 'react-query'; +import GenreItemEditComponent, { IsGenreNameValid } from './GenreItemEditComponent'; +import ErrorInput from '../../../common/error/ErrorInput'; +import ErrorField from '../../../common/error/ErrorField'; + +export const genresQueryKey = 'genres'; + +export default function GenreListEditComponent() { + const [newGenreName, SetNewGenreName] = useState(); + const OnNewGenreNameChange = (event : ChangeEvent) => SetNewGenreName(event.target.value); + const [createNewGenreError, SetCreateNewGenreError] = useState(); + + const [editingGenreId, SetEditingGenreId] = useState(); + //const SetEdited = (genreId: string, value: boolean) => SetEditedGenreId(value ? genreId : null); + const SetEditing = (genreId: string, value: boolean) => { + // console.log(`editing [${genreId}]: ${value ? 'true' : 'false'}`) + SetEditingGenreId(value ? genreId : null) + }; + + const [deletingGenreId, SetDeletingGenreId] = useState(); + //const SetEdited = (genreId: string, value: boolean) => SetEditedGenreId(value ? genreId : null); + const SetDeleting = (genreId: string, value: boolean) => { + // console.log(`deleting [${genreId}]: ${value ? 'true' : 'false'}`) + SetDeletingGenreId(value ? genreId : null) + }; + + // const selectedGenreIds = new Set(); + // // const [selectedGenreIds, SetSelectedGenreId] = useState>(); + // const SetSelected = (genreId: string, value: boolean) => { + // if (value) selectedGenreIds?.add(genreId); + // else selectedGenreIds?.delete(genreId); + // } + + const { data, isLoading, isError, error } = useQuery(genresQueryKey, GetGenreList); + const queryClient = useQueryClient(); + + return ( +
    +
    +

    Жанры

    +
    +
    + + + +
    + + + + + + + +
    +
    +
    + +
    +
      + { + ShowGenres( + { + data: data ?? [], + isLoading: isLoading, + isError: isError, + error: error as Error, + queryClient: queryClient, + setDeleting: SetDeleting, + isDeleting: (genreId: string) => deletingGenreId == genreId, + setEdited: SetEditing, + isEdited: (genreId: string) => editingGenreId == genreId, + }) + } +
    + +
    +
    + ) +} + +type ShowGenresProps = { + data: Array, + isLoading: boolean, + isError: boolean, + error: Error | undefined, + queryClient: QueryClient, + setDeleting: (genreId: string, value: boolean) => void, + isDeleting: (genreId: string) => boolean, + setEdited: (genreId: string, value: boolean) => void, + isEdited: (genreId: string) => boolean, +} + +function ShowGenres(props: ShowGenresProps){ + if (props.isLoading){ + return ( + <> +
  • 1. SomeGenre
  • +
  • 2. SomeGenre
  • +
  • 3. SomeGenre
  • + + ) + } + else if (props.isError){ + // else if (true){ + return ( +
  • +
    +

    {props.error?.name ?? 'Unknown error'}

    +
    +
    + {/* Error occured during fetching items: */} + {props.error?.message ?? 'unknown'} +
    +
  • + ) + } + else{ + return React.Children.toArray( + props.data.map((item: Genre) => { + return ( + InvalidateGenres(props.queryClient)} + /> + + ); + }) + ) + } +} + +function InvalidateGenres(queryClient: QueryClient) { queryClient.invalidateQueries({ queryKey: [genresQueryKey] }); } \ No newline at end of file diff --git a/mybookmark.ui/src/components/library/edit/language/LanguageItemEditComponent.tsx b/mybookmark.ui/src/components/library/edit/language/LanguageItemEditComponent.tsx new file mode 100644 index 0000000..cae410d --- /dev/null +++ b/mybookmark.ui/src/components/library/edit/language/LanguageItemEditComponent.tsx @@ -0,0 +1,171 @@ +import { ChangeEvent, useState } from 'react' +import { TfiCheck, TfiClose, TfiPencil, TfiTrash } from 'react-icons/tfi'; +import { Language } from '../../../../api/models/Types'; +import ErrorInput from '../../../common/error/ErrorInput'; +import ErrorField from '../../../common/error/ErrorField'; +import { DeleteLanguage, EditLanguage } from '../../../../api/LanguageApi'; +import { GetElementId } from '../../../../common/Helper'; + +export interface IListItem{ + language: Language, + isDeleting: boolean, + isEditing: boolean, + enabled: boolean, + setEditing: (languageId: string, value: boolean) => void, + setDeleting: (languageId: string, value: boolean) => void, + forceRefresh: () => void, +} + +export function IsLanguageNameValid(value: string | undefined){ + return !(value == undefined || value.trim().length == 0) +} + +export function IsLanguageCodeValid(value: string | undefined){ + return (value != undefined && value.trim().length == 3) +} + +export default function LanguageItemEditComponent(props : IListItem) { + const [editLanguageError, SetEditLanguageError] = useState(); + + const [newCodeNameValue, SetCodeNameValue] = useState<[code: string, name: string]>([props.language.codeIso3, props.language.name]); + // const OnLanguageCodeChange = (event : ChangeEvent) => SetCodeNameValue([event.target.value, newCodeNameValue[1]]); + const OnLanguageNameChange = (event : ChangeEvent) => SetCodeNameValue([newCodeNameValue[0], event.target.value]); + if (!props.isEditing && (newCodeNameValue[0] != props.language.codeIso3 || newCodeNameValue[1] != props.language.name)){ + SetCodeNameValue([props.language.codeIso3, props.language.name]); + } + return( + + +
    + + + value={newCodeNameValue[0]} readOnly={true} disabled={!props.enabled} /> + + + + + + + { ShowItem(props, newCodeNameValue[1], editLanguageError == undefined ? null : editLanguageError, SetEditLanguageError) } +
    +
    +
    + ) + + // return( + //
    + + + + + //
    + // + //
    + //

    + // + // {/* */} + // + // + //

    + //

    + // + // + // + //

    + // { ShowItem(props, newCodeNameValue[1], editLanguageError == undefined ? null : editLanguageError, SetEditLanguageError) } + //
    + //
    + //
    + + //
    + // ) +} + +function ShowItem(props: IListItem, newNameValue: string, editLanguageError: string | null, setEditLanguageError: (error: string | null) => void){ + // const isError = editLanguageError != null && editLanguageError.length > 0; + const isError = !IsLanguageCodeValid(props.language.codeIso3) || !IsLanguageNameValid(newNameValue); + if (props.isEditing){ + return ( + <> + + + + + + + + + ); + } + else if (props.isDeleting){ + return ( + <> + + + + + + + + + ); + } + else{ + return ( + <> + + + + + + + + + ); + } +} \ No newline at end of file diff --git a/mybookmark.ui/src/components/library/edit/language/LanguageListEditComponent.tsx b/mybookmark.ui/src/components/library/edit/language/LanguageListEditComponent.tsx new file mode 100644 index 0000000..2a31d29 --- /dev/null +++ b/mybookmark.ui/src/components/library/edit/language/LanguageListEditComponent.tsx @@ -0,0 +1,158 @@ +import React, { ChangeEvent, useState } from 'react' +import { TfiPlus } from 'react-icons/tfi'; +import { Language } from '../../../../api/models/Types'; +import { QueryClient, useQuery, useQueryClient } from 'react-query'; +import LanguageItemEditComponent, { IsLanguageCodeValid, IsLanguageNameValid } from './LanguageItemEditComponent'; +import ErrorInput from '../../../common/error/ErrorInput'; +import ErrorField from '../../../common/error/ErrorField'; +import { CreateLanguage, GetLanguageList } from '../../../../api/LanguageApi'; + +export const languageQueryKey = 'languages'; + +export default function LanguageListEditComponent() { + const [newLanguageCode, SetNewLanguageCode] = useState(''); + const OnNewLanguageCodeChange = (event : ChangeEvent) => SetNewLanguageCode(event.target.value); + const [newLanguageName, SetNewLanguageName] = useState(''); + const OnNewLanguageNameChange = (event : ChangeEvent) => SetNewLanguageName(event.target.value); + const [createNewLanguageError, SetCreateNewLanguageError] = useState(null); + + const [editingLanguageId, SetEditingLanguageId] = useState(null); + //const SetEdited = (genreId: string, value: boolean) => SetEditedGenreId(value ? genreId : null); + const SetEditing = (genreId: string, value: boolean) => { + // console.log(`editing [${genreId}]: ${value ? 'true' : 'false'}`) + SetEditingLanguageId(value ? genreId : null) + }; + + const [deletingLanguageId, SetDeletingLanguageId] = useState(null); + const SetDeleting = (genreId: string, value: boolean) => { + // console.log(`deleting [${genreId}]: ${value ? 'true' : 'false'}`) + SetDeletingLanguageId(value ? genreId : null) + }; + + const { data, isLoading, isError, error } = useQuery(languageQueryKey, GetLanguageList); + const queryClient = useQueryClient(); + + + return ( +
    +
    +

    Языки

    +
    +
    + + + +
    + + + + + + + + + {/* */} + + + +
    +
    +
    + +
    +
      + { + ShowLanguages( + { + data: data ?? [], + isLoading: isLoading, + isError: isError, + error: error as Error, + queryClient: queryClient, + setDeleting: SetDeleting, + isDeleting: (languageId: string) => deletingLanguageId == languageId, + setEdited: SetEditing, + isEdited: (languageId: string) => editingLanguageId == languageId, + }) + } +
    + +
    + +
    + ) +} + +type ShowLanguagesProps = { + data: Array, + isLoading: boolean, + isError: boolean, + error: Error | undefined, + queryClient: QueryClient, + setDeleting: (genreId: string, value: boolean) => void, + isDeleting: (genreId: string) => boolean, + setEdited: (genreId: string, value: boolean) => void, + isEdited: (genreId: string) => boolean, +} + +function ShowLanguages(props: ShowLanguagesProps){ + if (props.isLoading){ + return ( + <> +
  • 1. SomeLanguage
  • +
  • 2. SomeLanguage
  • +
  • 3. SomeLanguage
  • + + ) + } + else if (props.isError){ + return ( +
  • +
    +

    {props.error?.name ?? 'Unknown error'}

    +
    +
    + {/* Error occured during fetching items: */} + {props.error?.message ?? 'unknown'} +
    +
  • + ) + } + else{ + return React.Children.toArray( + props.data.map((item: Language) => { + return ( +
  • + InvalidateLanguages(props.queryClient)} + /> +
  • + ); + }) + ) + } +} + +function InvalidateLanguages(queryClient: QueryClient) { queryClient.invalidateQueries({ queryKey: [languageQueryKey] }); } \ No newline at end of file diff --git a/mybookmark.ui/src/components/library/view/GenreListProportionalView.tsx b/mybookmark.ui/src/components/library/view/GenreListProportionalView.tsx new file mode 100644 index 0000000..5b37304 --- /dev/null +++ b/mybookmark.ui/src/components/library/view/GenreListProportionalView.tsx @@ -0,0 +1,9 @@ +import React from 'react' + +export default function GenreListProportionalView() { + return ( +
    + +
    + ) +} diff --git a/mybookmark.ui/src/components/library/view/GenreListView.tsx b/mybookmark.ui/src/components/library/view/GenreListView.tsx new file mode 100644 index 0000000..62fa77a --- /dev/null +++ b/mybookmark.ui/src/components/library/view/GenreListView.tsx @@ -0,0 +1,24 @@ +import React from 'react' +import { GenreProportion } from '../../../api/models/Types' + +export interface IGenreListViewProps{ + items: Array + // userLanguageId?: string | null | undefined + // forceRefresh: () => void, +} + +export default function GenreListView(props: IGenreListViewProps) { + return ( +
    + { + React.Children.toArray( + props.items.map((item) => +
    + {item.genre.name} +
    + ) + ) + } +
    + ) +} diff --git a/mybookmark.ui/src/components/titleShort.tsx b/mybookmark.ui/src/components/titleShort.tsx new file mode 100644 index 0000000..ddec4d4 --- /dev/null +++ b/mybookmark.ui/src/components/titleShort.tsx @@ -0,0 +1,11 @@ +import React from 'react' + +function titleShort() { + return ( +
    + +
    + ) +} + +export default titleShort diff --git a/mybookmark.ui/src/context/userContext.tsx b/mybookmark.ui/src/context/userContext.tsx deleted file mode 100644 index 475619d..0000000 --- a/mybookmark.ui/src/context/userContext.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import PageLoader from "@/components/PageLoader"; -import useAxios from "axios-hooks"; -import { userInfo } from "os"; -import React, { createContext, useEffect } from "react"; -import apiUrls from "@/routes" - -const idClaimType = "userid"; -const roleClaimType = "role"; -const nameClaimType = "email"; - -interface UserClaim { - type: string; - value: any; -} - -export interface User { - id: number; - name: string; - role: string; -} - -export interface AuthContextProps { - user: User | null; - loginUrl: string; - logoutUrl: string; -} - -export const AuthContext = createContext({ - user: null, - loginUrl: "", - logoutUrl: "", -}); - -interface AuthProviderProps { - children: React.ReactNode; -} - -const loginUrl = "/bff/login"; -const logoutUrl = "/bff/logout"; - -export default function AuthProvider({ children }: AuthProviderProps) { - const [{ data: userInfo }] = useAxios({ - url: "/bff/user", - headers: { - "X-CSRF": "1", - }, - }); - - const user = userInfo - ? { - id: userInfo.find(x => x.type === idClaimType)?.value ?? 0, - name: userInfo.find(x => x.type === nameClaimType)?.value ?? "", - role: userInfo.find(x => x.type === roleClaimType)?.value ?? "", - } - : null; - - // const user = { - // id: 4, - // name: "Dima", - // role: "customer", - // }; - - return ( - - {children} - - ); -} diff --git a/mybookmark.ui/src/index.css b/mybookmark.ui/src/index.css index 6119ad9..ed66081 100644 --- a/mybookmark.ui/src/index.css +++ b/mybookmark.ui/src/index.css @@ -22,13 +22,13 @@ a:hover { color: #535bf2; } -body { +/* body { margin: 0; display: flex; place-items: center; min-width: 320px; min-height: 100vh; -} +} */ h1 { font-size: 3.2em; diff --git a/mybookmark.ui/src/main.tsx b/mybookmark.ui/src/main.tsx index 6f4ac9b..e17fb3b 100644 --- a/mybookmark.ui/src/main.tsx +++ b/mybookmark.ui/src/main.tsx @@ -1,10 +1,12 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' import App from './App.tsx' -import './index.css' +// import 'bootstrap/dist/css/bootstrap.css'; + +// import './index.css' createRoot(document.getElementById('root')!).render( - - - , + + + ) diff --git a/mybookmark.ui/src/pages/HomePage.tsx b/mybookmark.ui/src/pages/HomePage.tsx index 105b922..9beb616 100644 --- a/mybookmark.ui/src/pages/HomePage.tsx +++ b/mybookmark.ui/src/pages/HomePage.tsx @@ -1,45 +1,33 @@ -import logo from '../logo.svg'; -import { useSelector } from "react-redux" -import { Link } from "react-router-dom"; +import React from 'react'; +import AnimeTitleListComponent from '../components/MediaContent/view/AnimeTitleListComponent'; -export interface IGreetingsComponentProps{ - name: string; -} +export default function HomePage() { + return ( + <> -export default function GreetingsComponent(){ - const backgroundBootstrapClasses = "bg-secondary bg-gradient p-2 border border-5 border-start-0 border-end-0 border-light rounded-4"; - const navLinkBootstrapClasses="nav-link bg-dark rounded-pill p-3 py-0 bg-opacity-50 border border-1 border-primary"; - const greetText = 'Приветствую тебя'; - const user = useSelector((x: any) => x.user); - return( -
    -
    - { logo } -
    -
    -
    - {user === null && - - {greetText}, некто - - } - {user !== null && - - {greetText}, {user.firstName} - - } -
    -
    -
    -
    - -
    -
    - ); + {/*
    +
    +
    +
    + post-thumb +
    +
    +

    Elements That You Can Use To Create A New + Post On This Template.

    + +

    Heading example Here is example of hedings. You can use this heading by following markdownify rules. For example: use # for heading 1 and use ###### for heading 6. Heading 1 Heading 2 Heading 3 …

    Continue Reading +
    +
    +
    +
    */} + + + + ) } \ No newline at end of file diff --git a/mybookmark.ui/src/pages/library/anime/AnimeTitleDetail.tsx b/mybookmark.ui/src/pages/library/anime/AnimeTitleDetail.tsx new file mode 100644 index 0000000..09a82fd --- /dev/null +++ b/mybookmark.ui/src/pages/library/anime/AnimeTitleDetail.tsx @@ -0,0 +1,60 @@ +import React from 'react' +import { useParams } from 'react-router-dom' +import { GetAnimeTitleDetail, RateAnimeTitle, UnrateAnimeTitle } from '../../../api/AnimeTitleApi'; +import { QueryClient, useQuery, useQueryClient } from 'react-query'; +import AnimeTitleDetailComponent from '../../../components/MediaContent/view/AnimeTitleDetailComponent'; +import { RateDeleteModel, RateEditModel } from '../../../api/models/Types'; + + +// let queryKey; +const queryKey = 'anime_title_detail'; + +export default function AnimeTitleDetail() { + const { id } = useParams(); + const { data, isLoading, isError } = useQuery(queryKey, () => GetAnimeTitleDetail(id ?? '')); + const queryClient = useQueryClient(); + if (id == undefined) return (

    Писюн (404)

    ); + return ( + <> + {!isLoading && !isError && data && + { + // console.log(`Set rate (${value == null ? 'null' : value}) of [${rateObjectId}]`); + if (value != null){ + return RateAnimeTitle({ + animeTitleId: data.id, + animeSeasonId: null, + animeEpisodeId: null, + ratePercentage: value + } as RateEditModel); + } + else{ + return UnrateAnimeTitle({ + animeTitleId: data.id, + animeSeasonId: null, + animeEpisodeId: null, + } as RateDeleteModel); + } + }} + deleteRate={() => { + // console.log(`Delete rate of [${rateObjectId}]`); + return UnrateAnimeTitle({ + animeTitleId: data.id, + animeSeasonId: null, + animeEpisodeId: null, + } as RateDeleteModel); + }} + forceRefresh={() => InvalidateGenres(queryClient)} + /> + } + + ) +} + + +function InvalidateGenres(queryClient: QueryClient) { queryClient.invalidateQueries({ queryKey: [queryKey] }); } \ No newline at end of file diff --git a/mybookmark.ui/src/pages/library/edit/AnimeTitleCreateOrEdit.tsx b/mybookmark.ui/src/pages/library/edit/AnimeTitleCreateOrEdit.tsx new file mode 100644 index 0000000..06f264d --- /dev/null +++ b/mybookmark.ui/src/pages/library/edit/AnimeTitleCreateOrEdit.tsx @@ -0,0 +1,161 @@ +import React, { useEffect, useState } from 'react' +import { useParams } from 'react-router-dom' +import { GetAnimeTitleDetail } from '../../../api/AnimeTitleApi'; +import { useQuery } from 'react-query'; +import AnimeTitleDetailComponent from '../../../components/MediaContent/view/AnimeTitleDetailComponent'; +import { AnimeTitle, MediaInfo } from '../../../api/models/Types'; +import MediaInfoEditComponent from '../../../components/common/edit/MediaInfoEditComponent'; +import NamesEditComponent from '../../../components/MediaContent/edit/Names/NamesEditComponent'; + +export default function AnimeTitleEditComponent() { + const { id } = useParams(); + const [ data, setData ] = useState(null); + useEffect(() => { + GetAnimeTitleDetail(id ?? '') + .then((data) => setData(data ?? null)) + .catch(() => setData(null)); + }, [ id ]); + + const setPreview = (mediaInfo: MediaInfo | null | undefined) => { + // setAnimeTitlePreview( + // [ + // languageIdNamePreview?.[0] ?? null, + // languageIdNamePreview?.[1] ?? null, + // mediaInfo ?? null + // ] + // ); + }; + + if ((id != undefined && id != null) && data == null) return (

    Не загрузилось чота"

    ); + return ( + <> + {data && + { + console.log(`Set rate (${value == null ? 'null' : value}) of [${rateObjectId}]`); + return Promise.resolve(); + }} + deleteRate={async (rateObjectId: string) => { + console.log(`Delete rate of [${rateObjectId}]`); + return Promise.resolve(); + }} + forceRefresh={() => console.log(`Refresh title detail [${data.id}]`)} + /> + } + {data && +
    +
    +
    + + +
    + {/*
    +

    Жанры

    +
    */} +
    + {/* {data.commonProperties.genres.length > 0 && + + } + {data.commonProperties.genres.length == 0 && + — — // — — + } */} +
    + {/* */} +
    + {/* + + + + + + + */} + + + {/* + */} + + + + + {/* + */} + + + + +
    #FirstLastHandle
    Дата анонса{data.commonProperties.announcementDate?.toString() ?? '—//—'}Дата анонса{props.animeTitle.commonProperties.announcementDate?.toString() ?? '—//—'}
    Предполагаемая дата выхода{data.commonProperties.estimatedReleaseDate?.toString() ?? '—//—'}Предполагаемая дата выхода{props.animeTitle.commonProperties.estimatedReleaseDate?.toString() ?? '—//—'}
    +
    +
    +
    + +
    +
    + + + +
    +
    +

    Жанры

    +
    +
    + +
    +
    + +
    + {/*
    +

    Жанры

    +
    */} +
    +
    + {/* */} +
    + {/* + + + + + + + */} + + + {/* + */} + + + + + {/* + */} + + + + +
    #FirstLastHandle
    Дата анонса{data.commonProperties.announcementDate?.toString() ?? '—//—'}Дата анонса{props.animeTitle.commonProperties.announcementDate?.toString() ?? '—//—'}
    Предполагаемая дата выхода{data.commonProperties.estimatedReleaseDate?.toString() ?? '—//—'}Предполагаемая дата выхода{props.animeTitle.commonProperties.estimatedReleaseDate?.toString() ?? '—//—'}
    +
    +
    +
    + +
    +
    +
    +
    Содержимое
    +
    сезоны
    +
    эпизоды
    +
    +
    + } + + ) +} \ No newline at end of file diff --git a/mybookmark.ui/src/pages/library/edit/AnimeTitleEdit.tsx b/mybookmark.ui/src/pages/library/edit/AnimeTitleEdit.tsx new file mode 100644 index 0000000..73d8787 --- /dev/null +++ b/mybookmark.ui/src/pages/library/edit/AnimeTitleEdit.tsx @@ -0,0 +1,342 @@ +import React, { useEffect, useState } from 'react' +import { useParams } from 'react-router-dom' +import { ClearAnimeTitlePreview, CreateAnimeTitleDescription, CreateAnimeTitleName, DeleteAnimeTitleDescription, DeleteAnimeTitleName, EditAnimeTitleDescription, EditAnimeTitleName, GetAnimeTitleDetail, SetAnimeTitleAnnouncementDate, SetAnimeTitleEstimatedReleaseDate, SetAnimeTitlePreview, SetAnimeTitleReleaseDate } from '../../../api/AnimeTitleApi'; +// import AnimeTitleDetailComponent from '../../../components/MediaContent/view/AnimeTitleDetailComponent'; +import { AnimeTitle, CreateDescriptionModel, CreateMediaInfoModel, CreateNameModel, DeleteDescriptionModel, DeleteMediaInfoModel, DeleteNameModel, EditDateModel, EditDescriptionModel, EditNameModel, MediaInfo, MediaInfoType, NameItem } from '../../../api/models/Types'; +import MediaInfoEditComponent from '../../../components/common/edit/MediaInfoEditComponent'; +// import NamesEditComponent from '../../../components/MediaContent/edit/NamesEditComponent'; +import DateEditComponent from '../../../components/common/edit/DateEditComponent'; +import NamesEditComponent from '../../../components/MediaContent/edit/Names/NamesEditComponent'; +import DescriptionsEditComponent from '../../../components/MediaContent/edit/Descriptions/DescriptionsEditComponent'; + +export default function AnimeTitleEdit() { + const { id } = useParams(); + const [ data, setData ] = useState(null); + const [ isEditing, setIsEditingValue ] = useState>([]); + const setEditing = (elementName: string, value: boolean) => { + const alreadyEditing = isEditing.find(q => q == elementName) != null; + if (value){ + if (!alreadyEditing){ + setIsEditingValue(isEditing.concat([elementName])) + } + } + else{ + if (alreadyEditing){ + setIsEditingValue(isEditing.filter(q => q != elementName)) + } + } + } + + const [ isDeleting, setIsDeletingValue ] = useState>([]); + const setDeleting = (elementName: string, value: boolean) => { + const alreadyDeleting = isDeleting.find(q => q == elementName) != null; + if (value){ + if (!alreadyDeleting){ + setIsDeletingValue(isDeleting.concat([elementName])) + } + } + else{ + if (alreadyDeleting){ + setIsDeletingValue(isDeleting.filter(q => q != elementName)) + } + } + } + + const fetchData = () => { + GetAnimeTitleDetail(id ?? '') + .then((data) => setData(data ?? null)) + .catch(() => setData(null)); + } + + useEffect(fetchData, [ id ]); + + // const setPreview = (mediaInfo: MediaInfo | null | undefined) => { + // // setAnimeTitlePreview( + // // [ + // // languageIdNamePreview?.[0] ?? null, + // // languageIdNamePreview?.[1] ?? null, + // // mediaInfo ?? null + // // ] + // // ); + // }; + + if ((id != undefined && id != null) && data == null) return (

    Не загрузилось чота"

    ); + return ( + <> + {/* {data && + { + console.log(`Set rate (${value == null ? 'null' : value}) of [${rateObjectId}]`); + return Promise.resolve(); + }} + deleteRate={async (rateObjectId: string) => { + console.log(`Delete rate of [${rateObjectId}]`); + return Promise.resolve(); + }} + forceRefresh={() => console.log(`Refresh title detail [${data.id}]`)} + /> + } */} + {data && + <> +
    +
    + q == 'preview') != null} + setEditing={(mediaInfo, value) => setEditing('preview', value)} + editMediaInfo={(mediaInfo, newContentType, newUrl) => SetAnimeTitlePreview({ + animeTitleId: data.id, + animeSeasonId: null, + animeEpisodeId: null, + type: mediaInfo?.type, + url: newUrl, + contentType: newContentType + + } as CreateMediaInfoModel)} + + isDeleting={isDeleting.find(q => q == 'preview') != null} + setDeleting={(mediaInfo, value) => setDeleting('preview', value)} + + deleteMediaInfo={(mediaInfo) => ClearAnimeTitlePreview({ + animeTitleId: data.id, + animeSeasonId: null, + animeEpisodeId: null, + type: mediaInfo?.type, + url: mediaInfo?.url, + contentType: mediaInfo?.contentType + + } as DeleteMediaInfoModel)} + forceRefresh={fetchData} + /> + +
    + {/*
    +

    Жанры

    +
    */} +
    + {/* {data.commonProperties.genres.length > 0 && + + } + {data.commonProperties.genres.length == 0 && + — — // — — + } */} +
    + {/* */} +
    + {/* + + + + + + + */} + + + {/* + */} + + + + + {/* + */} + + + + + {/* + */} + + + + +
    #FirstLastHandle
    Дата анонса{data.commonProperties.announcementDate?.toString() ?? '—//—'}Дата анонса + q == 'announcementDate') != null} + enabled={true} + date={GetDate(data.commonProperties.announcementDate)} + editDate={(value: Date | null) => { + return SetAnimeTitleAnnouncementDate({ + animeTitleId: data.id, + animeSeasonId: null, + animeEpisodeId: null, + value: value + } as EditDateModel); + }} + setEditing={(value: boolean) => setEditing('announcementDate', value)} + // setDeleting: (genreId: string, value: boolean) => void, + forceRefresh={fetchData} + /> + {/* {props.animeTitle.commonProperties.announcementDate?.toString() ?? '—//—'} */} +
    Предполагаемая дата выхода{data.commonProperties.estimatedReleaseDate?.toString() ?? '—//—'}Предполагаемая дата выхода + q == 'estimatedReleaseDate') != null} + enabled={true} + + date={data.commonProperties.estimatedReleaseDate != null ? new Date(data.commonProperties.estimatedReleaseDate) : null} + editDate={(value: Date | null) => { + return SetAnimeTitleEstimatedReleaseDate({ + animeTitleId: data.id, + animeSeasonId: null, + animeEpisodeId: null, + value: value + } as EditDateModel); + }} + setEditing={(value: boolean) => setEditing('estimatedReleaseDate', value)} + // setDeleting: (genreId: string, value: boolean) => void, + forceRefresh={fetchData} + /> + {/* {props.animeTitle.commonProperties.estimatedReleaseDate?.toString() ?? '—//—'} */} +
    Предполагаемая дата выхода{data.commonProperties.estimatedReleaseDate?.toString() ?? '—//—'}Дата выхода + q == 'releaseDate') != null} + enabled={true} + date={data.commonProperties.releaseDate != null ? new Date(data.commonProperties.releaseDate) : null} + editDate={(value: Date | null) => { + return SetAnimeTitleReleaseDate({ + animeTitleId: data.id, + animeSeasonId: null, + animeEpisodeId: null, + value: value + } as EditDateModel); + }} + setEditing={(value: boolean) => setEditing('releaseDate', value)} + // setDeleting: (genreId: string, value: boolean) => void, + forceRefresh={fetchData} + /> + {/* {props.animeTitle.commonProperties.estimatedReleaseDate?.toString() ?? '—//—'} */} +
    +
    +
    +
    + +
    +
    + CreateAnimeTitleName({ + animeTitleId: data.id, + animeSeasonId: null, + animeEpisodeId: null, + languageId:name.language.id, + value: name.value, + type: name.type + } as CreateNameModel)} + + editName={(name, newValue, newLanguageId) => { + return EditAnimeTitleName({ + animeTitleId: data.id, + animeSeasonId: null, + animeEpisodeId: null, + + languageId: name.language.id, + value: name.value, + type: name.type, + + newLanguageId: newLanguageId, + newValue: newValue, + } as EditNameModel); + }} + + deleteName={(name) => DeleteAnimeTitleName({ + animeTitleId: data.id, + animeSeasonId: null, + animeEpisodeId: null, + + languageId: name.language.id, + value: name.value, + type: name.type, + } as DeleteNameModel)} + forceRefresh={fetchData} + /> + {/* */} + CreateAnimeTitleDescription({ + animeTitleId: data.id, + animeSeasonId: null, + animeEpisodeId: null, + languageId:description.language.id, + value: description.value, + isOriginal: description.isOriginal + } as CreateDescriptionModel)} + + editDescription={(description, newValue, newLanguageId) => { + return EditAnimeTitleDescription({ + animeTitleId: data.id, + animeSeasonId: null, + animeEpisodeId: null, + + languageId: description.language.id, + value: description.value, + isOriginal: description.isOriginal, + + newLanguageId: newLanguageId, + newValue: newValue, + } as EditDescriptionModel); + }} + + deleteDescription={(description) => DeleteAnimeTitleDescription({ + animeTitleId: data.id, + animeSeasonId: null, + animeEpisodeId: null, + + languageId: description.language.id, + value: description.value, + isOriginal: description.isOriginal, + } as DeleteDescriptionModel)} + forceRefresh={fetchData} + /> + +
    +
    +

    Жанры

    +
    +
    + genrep + {/* */} +
    +
    + + +
    +
    +
    +
    Содержимое
    +
    сезоны
    +
    эпизоды
    +
    + + } + + ) +} + +function GetDate(dateString: string | null | undefined){ + if (dateString == undefined || dateString == null){ + return null; + } + else{ + return new Date(dateString); + } +} \ No newline at end of file diff --git a/mybookmark.ui/src/pages/library/edit/AnimeTitleEditComponent.tsx b/mybookmark.ui/src/pages/library/edit/AnimeTitleEditComponent.tsx new file mode 100644 index 0000000..71525e5 --- /dev/null +++ b/mybookmark.ui/src/pages/library/edit/AnimeTitleEditComponent.tsx @@ -0,0 +1,241 @@ +import React, { useEffect, useState } from 'react' +import { useParams } from 'react-router-dom' +import { GetAnimeTitleDetail } from '../../../api/AnimeTitleApi'; +import { useQuery } from 'react-query'; +import AnimeTitleDetailComponent from '../../../components/MediaContent/view/AnimeTitleDetailComponent'; +import { AnimeTitle, MediaInfo } from '../../../api/models/Types'; +import MediaInfoEditComponent from '../../../components/common/edit/MediaInfoEditComponent'; +import NamesEditComponent from '../../../components/MediaContent/edit/Names/NamesEditComponent'; +import DateEditComponent from '../../../components/common/edit/DateEditComponent'; + +export default function AnimeTitleEditComponent() { + const { id } = useParams(); + const [ data, setData ] = useState(null); + const [ isEditing, setIsEditingValue ] = useState>([]); + const setEditing = (elementName: string, value: boolean) => { + const alreadyEditing = isEditing.find(q => q == elementName) != null; + if (value){ + if (!alreadyEditing){ + setIsEditingValue(isEditing.concat([elementName])) + } + } + else{ + if (alreadyEditing){ + setIsEditingValue(isEditing.filter(q => q != elementName)) + } + } + } + + const fetchData = () => { + GetAnimeTitleDetail(id ?? '') + .then((data) => setData(data ?? null)) + .catch(() => setData(null)); + } + + useEffect(fetchData, [ id ]); + + const setPreview = (mediaInfo: MediaInfo | null | undefined) => { + // setAnimeTitlePreview( + // [ + // languageIdNamePreview?.[0] ?? null, + // languageIdNamePreview?.[1] ?? null, + // mediaInfo ?? null + // ] + // ); + }; + + if ((id != undefined && id != null) && data == null) return (

    Не загрузилось чота"

    ); + return ( + <> + {/* {data && + { + console.log(`Set rate (${value == null ? 'null' : value}) of [${rateObjectId}]`); + return Promise.resolve(); + }} + deleteRate={async (rateObjectId: string) => { + console.log(`Delete rate of [${rateObjectId}]`); + return Promise.resolve(); + }} + forceRefresh={() => console.log(`Refresh title detail [${data.id}]`)} + /> + } */} + {data && +
    +
    +
    + + +
    + {/*
    +

    Жанры

    +
    */} +
    + {/* {data.commonProperties.genres.length > 0 && + + } + {data.commonProperties.genres.length == 0 && + — — // — — + } */} +
    + {/* */} +
    + {/* + + + + + + + */} + + + {/* + */} + + + + + {/* + */} + + + + +
    #FirstLastHandle
    Дата анонса{data.commonProperties.announcementDate?.toString() ?? '—//—'}Дата анонса + q == 'announcementDate') != null} + enabled={true} + date={data.commonProperties.announcementDate} + editDate={(value: Date | null) => { console.log(value); return Promise.resolve();}} + setEditing={(value: boolean) => setEditing('announcementDate', value)} + // setDeleting: (genreId: string, value: boolean) => void, + forceRefresh={fetchData} + /> + {/* {props.animeTitle.commonProperties.announcementDate?.toString() ?? '—//—'} */} +
    Предполагаемая дата выхода{data.commonProperties.estimatedReleaseDate?.toString() ?? '—//—'}Предполагаемая дата выхода + q == 'estimatedReleaseDate') != null} + enabled={true} + date={data.commonProperties.estimatedReleaseDate} + editDate={(value: Date | null) => { console.log(value); return Promise.resolve();}} + setEditing={(value: boolean) => setEditing('estimatedReleaseDate', value)} + // setDeleting: (genreId: string, value: boolean) => void, + forceRefresh={fetchData} + /> + {/* {props.animeTitle.commonProperties.estimatedReleaseDate?.toString() ?? '—//—'} */} +
    +
    +
    +
    + +
    +
    + + {/* */} + desc + +
    +
    +

    Жанры

    +
    +
    + genrep + {/* */} +
    +
    + +
    + {/*
    +

    Жанры

    +
    */} +
    +
    + {/* */} +
    + {/* + + + + + + + */} + + + {/* + */} + + + + + {/* + */} + + + + +
    #FirstLastHandle
    Дата анонса{data.commonProperties.announcementDate?.toString() ?? '—//—'}Дата анонса + q == 'announcementDate') != null} + enabled={true} + date={data.commonProperties.announcementDate} + editDate={(value: Date | null) => { console.log(value); return Promise.resolve();}} + setEditing={(value: boolean) => setEditing('announcementDate', value)} + // setDeleting: (genreId: string, value: boolean) => void, + forceRefresh={fetchData} + /> + {/* {props.animeTitle.commonProperties.announcementDate?.toString() ?? '—//—'} */} +
    Предполагаемая дата выхода{data.commonProperties.estimatedReleaseDate?.toString() ?? '—//—'}Предполагаемая дата выхода + q == 'estimatedReleaseDate') != null} + enabled={true} + date={data.commonProperties.estimatedReleaseDate} + editDate={(value: Date | null) => { console.log(value); return Promise.resolve();}} + setEditing={(value: boolean) => setEditing('estimatedReleaseDate', value)} + // setDeleting: (genreId: string, value: boolean) => void, + forceRefresh={fetchData} + /> + {/* {props.animeTitle.commonProperties.estimatedReleaseDate?.toString() ?? '—//—'} */} +
    +
    +
    +
    + +
    +
    +
    +
    Содержимое
    +
    сезоны
    +
    эпизоды
    +
    +
    + } + + ) +} \ No newline at end of file diff --git a/mybookmark.ui/src/pages/library/edit/CreateAnimeTitle.tsx b/mybookmark.ui/src/pages/library/edit/CreateAnimeTitle.tsx new file mode 100644 index 0000000..aa9b078 --- /dev/null +++ b/mybookmark.ui/src/pages/library/edit/CreateAnimeTitle.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import AnimeTitleCreateComponent from '../../../components/MediaContent/AnimeTitleCreateComponent' + +export default function CreateAnimeTitle() { + return ( +
    + +
    + ) +} diff --git a/mybookmark.ui/src/pages/library/edit/Dictionaries.tsx b/mybookmark.ui/src/pages/library/edit/Dictionaries.tsx new file mode 100644 index 0000000..c51784e --- /dev/null +++ b/mybookmark.ui/src/pages/library/edit/Dictionaries.tsx @@ -0,0 +1,17 @@ +import React from 'react' +import GenreListEditComponent from '../../../components/library/edit/genre/GenreListEditComponent' +import LanguageListEditComponent from '../../../components/library/edit/language/LanguageListEditComponent' + +export default function Dictionaries() { + + return ( +
    +
    + { } +
    +
    + { } +
    +
    + ) +} diff --git a/mybookmark.ui/src/pages/library/layout.tsx b/mybookmark.ui/src/pages/library/layout.tsx deleted file mode 100644 index 105b922..0000000 --- a/mybookmark.ui/src/pages/library/layout.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import logo from '../logo.svg'; -import { useSelector } from "react-redux" -import { Link } from "react-router-dom"; - -export interface IGreetingsComponentProps{ - name: string; -} - -export default function GreetingsComponent(){ - const backgroundBootstrapClasses = "bg-secondary bg-gradient p-2 border border-5 border-start-0 border-end-0 border-light rounded-4"; - const navLinkBootstrapClasses="nav-link bg-dark rounded-pill p-3 py-0 bg-opacity-50 border border-1 border-primary"; - const greetText = 'Приветствую тебя'; - const user = useSelector((x: any) => x.user); - return( -
    -
    - { logo } -
    -
    -
    - {user === null && - - {greetText}, некто - - } - {user !== null && - - {greetText}, {user.firstName} - - } -
    -
    -
    -
    - -
    -
    - ); -} \ No newline at end of file diff --git a/mybookmark.ui/tsconfig.app.tsbuildinfo b/mybookmark.ui/tsconfig.app.tsbuildinfo new file mode 100644 index 0000000..67d1ead --- /dev/null +++ b/mybookmark.ui/tsconfig.app.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/api/animetitleapi.tsx","./src/api/genreapi.tsx","./src/api/languageapi.tsx","./src/api/common.tsx","./src/api/routes.tsx","./src/api/models/types.tsx","./src/common/adminlayout.tsx","./src/common/footer.tsx","./src/common/layout.tsx","./src/common/navbar.tsx","./src/common/sidebar.tsx","./src/components/app.tsx","./src/components/menu.tsx","./src/components/titleshort.tsx","./src/components/mediacontent/animetitlelistcomponent.tsx","./src/components/mediacontent/animetitleshortcomponent.tsx","./src/components/common/errorfield.tsx","./src/components/common/errorinput.tsx","./src/components/common/mediainfocomponent.tsx","./src/components/common/progressbarwithtext.tsx","./src/components/common/ratecomponent.tsx","./src/components/common/types.tsx","./src/components/library/edit/genre/genreitemeditcomponent.tsx","./src/components/library/edit/genre/genrelisteditcomponent.tsx","./src/components/library/edit/language/languageitemeditcomponent.tsx","./src/components/library/edit/language/languagelisteditcomponent.tsx","./src/context/usercontext.tsx","./src/pages/homepage.tsx","./src/pages/notfoundpage.tsx","./src/pages/auth/loginlayout.tsx","./src/pages/auth/loginpage.tsx","./src/pages/auth/registerpage.tsx","./src/pages/library/layout.tsx","./src/pages/library/anime/listlatest.tsx","./src/pages/library/edit/dictionaries.tsx","./src/statemanagement/useractions.tsx","./src/statemanagement/userreducer.tsx","./src/statemanagement/userstorageactions.tsx","./src/statemanagement/usersstoragereducer.tsx","./src/statemanagement/store.tsx"],"errors":true,"version":"5.6.2"} \ No newline at end of file diff --git a/mybookmark.ui/tsconfig.node.tsbuildinfo b/mybookmark.ui/tsconfig.node.tsbuildinfo new file mode 100644 index 0000000..98ef2f9 --- /dev/null +++ b/mybookmark.ui/tsconfig.node.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./vite.config.ts"],"version":"5.6.2"} \ No newline at end of file diff --git a/mybookmark.ui/vite.config.ts b/mybookmark.ui/vite.config.ts index 5a33944..1b285e8 100644 --- a/mybookmark.ui/vite.config.ts +++ b/mybookmark.ui/vite.config.ts @@ -3,5 +3,12 @@ import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [react()], + css: { + preprocessorOptions: { + scss: { + additionalData: `@import "@/assets/scss/custom.scss";` + } + } + }, })