diff --git a/Light_Shop.sln.DotSettings.user b/Light_Shop.sln.DotSettings.user index bf2d00f..131f911 100644 --- a/Light_Shop.sln.DotSettings.user +++ b/Light_Shop.sln.DotSettings.user @@ -1,2 +1,5 @@  - ForceIncluded \ No newline at end of file + ForceIncluded + ForceIncluded + ForceIncluded + ForceIncluded \ No newline at end of file diff --git a/Light_Shp.API/Controllers/AccountController.cs b/Light_Shp.API/Controllers/AccountController.cs index fafcdfb..70059a9 100644 --- a/Light_Shp.API/Controllers/AccountController.cs +++ b/Light_Shp.API/Controllers/AccountController.cs @@ -40,27 +40,70 @@ public async Task Register([FromBody] RegisterRequest registerReq if (result.Succeeded) { - var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Emails", "welcomeMessage.html"); - string welcomeMessage = await System.IO.File.ReadAllTextAsync(filePath); - await emailSender.SendEmailAsync(applicationUser.Email, "Welcome "+applicationUser.FirstName, welcomeMessage); await userManager.AddToRoleAsync(applicationUser, StaticData.Customer); - - await signInManager.SignInAsync(applicationUser, false); + + var token = await userManager.GenerateEmailConfirmationTokenAsync(applicationUser); + var emailConfirmUrl = Url.Action( nameof(ConfirmEmail), "Account" ,new {token, userId = applicationUser.Id}, + protocol: Request.Scheme, + host: Request.Host.Value + ); + + await emailSender.SendEmailAsync( + applicationUser.Email, + "Confirm Email", + $@" + + +

Hello, {applicationUser.UserName}

+

Welcome to Light Shop — please confirm your email:

+

+ + Confirm Email + +

+ + + " + ); return NoContent(); } return BadRequest(result.Errors); } + [HttpGet("ConfirmEmail")] + public async Task ConfirmEmail(string token, string userId) + { + var user = await userManager.FindByIdAsync(userId); + + if (user is not null) + { + var result = await userManager.ConfirmEmailAsync(user, token); + if (result.Succeeded) + { + return Ok(new { message = "Email confirmed" }); + } + else + { + return BadRequest(result.Errors); + } + } + return NotFound(); + } + [HttpPost("login")] public async Task Login([FromBody] LoginRequest loginRequest) { var applicationUser = await userManager.FindByEmailAsync(loginRequest.Email); if (applicationUser != null) { - bool result = await userManager.CheckPasswordAsync(applicationUser, loginRequest.Password); + var result = await signInManager.PasswordSignInAsync(applicationUser, loginRequest.Password, loginRequest.RememberMe, false); + + + List claims = new(); claims.Add(new(ClaimTypes.Name,applicationUser.UserName)); var userRoles = await userManager.GetRolesAsync(applicationUser); @@ -73,10 +116,10 @@ public async Task Login([FromBody] LoginRequest loginRequest) } } - if (result) + if (result.Succeeded) { SymmetricSecurityKey symmetricSecurityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("tstNdVvKmZmOQlahHTbWaSSoBKfSTfds")); - SigningCredentials signingCredentials = new SigningCredentials(symmetricSecurityKey,SecurityAlgorithms.HmacSha256); + SigningCredentials signingCredentials = new SigningCredentials(symmetricSecurityKey, SecurityAlgorithms.HmacSha256); var JwtToken = new JwtSecurityToken( expires: DateTime.Now.AddDays(1), claims: claims, @@ -86,8 +129,21 @@ public async Task Login([FromBody] LoginRequest loginRequest) string token = new JwtSecurityTokenHandler().WriteToken(JwtToken); return Ok(new { token }); } + else + { + if (result.IsLockedOut) + { + return BadRequest(new { message = "Your Account is Locked, Please Try Again later" }); + } + else if (result.IsNotAllowed) { + { + return BadRequest(new { message = "Email Not confirm Please Confirm Your Email" }); + } + } + } + } - return BadRequest(new {message = "Invalid Email or Password"}); + return BadRequest(new { message = "invalid email or password" }); } [HttpGet("logout")] diff --git a/Light_Shp.API/Controllers/UsersController.cs b/Light_Shp.API/Controllers/UsersController.cs index 4a44f48..2270292 100644 --- a/Light_Shp.API/Controllers/UsersController.cs +++ b/Light_Shp.API/Controllers/UsersController.cs @@ -45,5 +45,17 @@ public async Task ChangeRole([FromRoute] string userId, [FromQuer return Ok(result); } + [HttpPatch("LockUnlock/{userId}")] + public async Task LockUnLock(string userId) + { + var result = await usersService.LockUnLock(userId); + + if(result == true ) + { + return Ok(result); + } + return BadRequest(); + } + } } diff --git a/Light_Shp.API/Light_Shp.API.sln b/Light_Shp.API/Light_Shp.API.sln new file mode 100644 index 0000000..0828961 --- /dev/null +++ b/Light_Shp.API/Light_Shp.API.sln @@ -0,0 +1,24 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.2.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Light_Shop.API", "Light_Shop.API.csproj", "{EEF1FFE0-0578-CC6B-323C-3D61D1A5596C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EEF1FFE0-0578-CC6B-323C-3D61D1A5596C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EEF1FFE0-0578-CC6B-323C-3D61D1A5596C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EEF1FFE0-0578-CC6B-323C-3D61D1A5596C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EEF1FFE0-0578-CC6B-323C-3D61D1A5596C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {171984C9-326D-4B37-9997-CFFE8838F258} + EndGlobalSection +EndGlobal diff --git a/Light_Shp.API/Program.cs b/Light_Shp.API/Program.cs index 0adc361..f151b7c 100644 --- a/Light_Shp.API/Program.cs +++ b/Light_Shp.API/Program.cs @@ -19,11 +19,7 @@ public class Program public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); - - // Add services to the container. - builder.Services.AddControllers(); - // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi builder.Services.AddOpenApi(); @@ -43,6 +39,7 @@ public static void Main(string[] args) builder.Services.AddIdentity(options => { options.User.RequireUniqueEmail = false; + options.SignIn.RequireConfirmedEmail = true; }) .AddEntityFrameworkStores() .AddDefaultTokenProviders(); diff --git a/Light_Shp.API/Services/Implementations/UsersService .cs b/Light_Shp.API/Services/Implementations/UsersService .cs index 9ac1110..ac81274 100644 --- a/Light_Shp.API/Services/Implementations/UsersService .cs +++ b/Light_Shp.API/Services/Implementations/UsersService .cs @@ -18,8 +18,8 @@ public class UsersService : Service, IUsersService public UsersService( ApplicationDbContext context, UserManager userManager - - ):base(context) + + ) : base(context) { this._context = context; this.userManager = userManager; @@ -40,11 +40,36 @@ public async Task ChangeRole(string userId, string roleName) { return true; } - + } return false; } + + public async Task LockUnLock(string userId) + { + var user = await userManager.FindByIdAsync(userId); + + if (user is null) return null; + + var isLockedNow = user.LockoutEnabled && user.LockoutEnd > DateTime.Now; + + if (isLockedNow) + { + // remove block from user + user.LockoutEnabled = false; + user.LockoutEnd = null; + } + else + { + user.LockoutEnabled = true; + user.LockoutEnd = DateTime.Now.AddMinutes(1); + } + await userManager.UpdateAsync(user); + return !isLockedNow; + + + } } } diff --git a/Light_Shp.API/Services/Interfaces/IUsersService.cs b/Light_Shp.API/Services/Interfaces/IUsersService.cs index 7d1d1eb..b78058c 100644 --- a/Light_Shp.API/Services/Interfaces/IUsersService.cs +++ b/Light_Shp.API/Services/Interfaces/IUsersService.cs @@ -6,6 +6,7 @@ namespace Light_Shop.API.Services.Interfaces public interface IUsersService : IService { Task ChangeRole(string userId, string roleName); + Task LockUnLock(string userId); } } diff --git a/Light_Shp.API/bin/Debug/net9.0/Light_Shop.API.dll b/Light_Shp.API/bin/Debug/net9.0/Light_Shop.API.dll index 06e1584..f454fc0 100644 Binary files a/Light_Shp.API/bin/Debug/net9.0/Light_Shop.API.dll and b/Light_Shp.API/bin/Debug/net9.0/Light_Shop.API.dll differ diff --git a/Light_Shp.API/bin/Debug/net9.0/Light_Shop.API.pdb b/Light_Shp.API/bin/Debug/net9.0/Light_Shop.API.pdb index f2b84fa..264f96f 100644 Binary files a/Light_Shp.API/bin/Debug/net9.0/Light_Shop.API.pdb and b/Light_Shp.API/bin/Debug/net9.0/Light_Shop.API.pdb differ diff --git a/Light_Shp.API/obj/Debug/net9.0/ApiEndpoints.json b/Light_Shp.API/obj/Debug/net9.0/ApiEndpoints.json index 5e48396..9a99a6e 100644 --- a/Light_Shp.API/obj/Debug/net9.0/ApiEndpoints.json +++ b/Light_Shp.API/obj/Debug/net9.0/ApiEndpoints.json @@ -15,6 +15,27 @@ ], "ReturnTypes": [] }, + { + "ContainingType": "Light_Shop.API.Controllers.AccountController", + "Method": "ConfirmEmail", + "RelativePath": "api/Account/ConfirmEmail", + "HttpMethod": "GET", + "IsController": true, + "Order": 0, + "Parameters": [ + { + "Name": "token", + "Type": "System.String", + "IsRequired": false + }, + { + "Name": "userId", + "Type": "System.String", + "IsRequired": false + } + ], + "ReturnTypes": [] + }, { "ContainingType": "Light_Shop.API.Controllers.AccountController", "Method": "Login", @@ -467,5 +488,21 @@ } ], "ReturnTypes": [] + }, + { + "ContainingType": "Light_Shop.API.Controllers.UsersController", + "Method": "LockUnLock", + "RelativePath": "api/Users/LockUnlock/{userId}", + "HttpMethod": "PATCH", + "IsController": true, + "Order": 0, + "Parameters": [ + { + "Name": "userId", + "Type": "System.String", + "IsRequired": true + } + ], + "ReturnTypes": [] } ] \ No newline at end of file diff --git a/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.AssemblyInfo.cs b/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.AssemblyInfo.cs index 849cbf5..a5d5a67 100644 --- a/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.AssemblyInfo.cs +++ b/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.AssemblyInfo.cs @@ -1,7 +1,6 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -14,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("Light_Shop.API")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+5e306d32f45147443318898a8463aaa52b371567")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1147e89f50fc580f1484c95e0ce8d6b005050c64")] [assembly: System.Reflection.AssemblyProductAttribute("Light_Shop.API")] [assembly: System.Reflection.AssemblyTitleAttribute("Light_Shop.API")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.AssemblyInfoInputs.cache b/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.AssemblyInfoInputs.cache index 47d788e..2ffedf5 100644 --- a/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.AssemblyInfoInputs.cache +++ b/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.AssemblyInfoInputs.cache @@ -1 +1 @@ -0c015f011126fa62066c4a267adc8f7404e1a8b8b17c9cc0e141053faf64c162 +459818d04383db78fd5839511e7518cd3bb189961344743d4c0875bf9e292189 diff --git a/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.MvcApplicationPartsAssemblyInfo.cs b/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.MvcApplicationPartsAssemblyInfo.cs index f9ccf61..7a8df11 100644 --- a/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.MvcApplicationPartsAssemblyInfo.cs +++ b/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.MvcApplicationPartsAssemblyInfo.cs @@ -1,7 +1,6 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.csproj.FileListAbsolute.txt b/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.csproj.FileListAbsolute.txt index d67cc3d..ae49a89 100644 --- a/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.csproj.FileListAbsolute.txt +++ b/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.csproj.FileListAbsolute.txt @@ -172,5 +172,5 @@ D:\Projects\Light_Shop\Light_Shp.API\bin\Debug\net9.0\Microsoft.AspNetCore.Crypt D:\Projects\Light_Shop\Light_Shp.API\bin\Debug\net9.0\Microsoft.AspNetCore.Identity.EntityFrameworkCore.dll D:\Projects\Light_Shop\Light_Shp.API\bin\Debug\net9.0\Microsoft.Extensions.Identity.Core.dll D:\Projects\Light_Shop\Light_Shp.API\bin\Debug\net9.0\Microsoft.Extensions.Identity.Stores.dll -D:\Projects\Light_Shop\Light_Shp.API\obj\Debug\net9.0\staticwebassets.upToDateCheck.txt D:\Projects\Light_Shop\Light_Shp.API\bin\Debug\net9.0\Microsoft.AspNetCore.Authentication.JwtBearer.dll +D:\Projects\Light_Shop\Light_Shp.API\obj\Debug\net9.0\staticwebassets.upToDateCheck.txt diff --git a/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.dll b/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.dll index 06e1584..f454fc0 100644 Binary files a/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.dll and b/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.dll differ diff --git a/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.pdb b/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.pdb index f2b84fa..264f96f 100644 Binary files a/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.pdb and b/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.pdb differ diff --git a/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.sourcelink.json b/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.sourcelink.json index 1a54c22..54dde0d 100644 --- a/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.sourcelink.json +++ b/Light_Shp.API/obj/Debug/net9.0/Light_Shop.API.sourcelink.json @@ -1 +1 @@ -{"documents":{"D:\\Projects\\Light_Shop\\*":"https://raw.githubusercontent.com/shareefmwafy/Light-Shop/5e306d32f45147443318898a8463aaa52b371567/*"}} \ No newline at end of file +{"documents":{"D:\\Projects\\Light_Shop\\*":"https://raw.githubusercontent.com/shareefmwafy/Light-Shop/1147e89f50fc580f1484c95e0ce8d6b005050c64/*"}} \ No newline at end of file diff --git a/Light_Shp.API/obj/Debug/net9.0/ref/Light_Shop.API.dll b/Light_Shp.API/obj/Debug/net9.0/ref/Light_Shop.API.dll index eba2b2a..a18c9d2 100644 Binary files a/Light_Shp.API/obj/Debug/net9.0/ref/Light_Shop.API.dll and b/Light_Shp.API/obj/Debug/net9.0/ref/Light_Shop.API.dll differ diff --git a/Light_Shp.API/obj/Debug/net9.0/refint/Light_Shop.API.dll b/Light_Shp.API/obj/Debug/net9.0/refint/Light_Shop.API.dll index eba2b2a..a18c9d2 100644 Binary files a/Light_Shp.API/obj/Debug/net9.0/refint/Light_Shop.API.dll and b/Light_Shp.API/obj/Debug/net9.0/refint/Light_Shop.API.dll differ diff --git a/Light_Shp.API/obj/Light_Shop.API.csproj.nuget.g.props b/Light_Shp.API/obj/Light_Shop.API.csproj.nuget.g.props index 5e9b8c3..358f600 100644 --- a/Light_Shp.API/obj/Light_Shop.API.csproj.nuget.g.props +++ b/Light_Shp.API/obj/Light_Shop.API.csproj.nuget.g.props @@ -7,7 +7,7 @@ $(UserProfile)\.nuget\packages\ C:\Users\Gamers zone\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages PackageReference - 6.13.2 + 6.12.2 diff --git a/Light_Shp.API/obj/project.packagespec.json b/Light_Shp.API/obj/project.packagespec.json index b414edf..f482d84 100644 --- a/Light_Shp.API/obj/project.packagespec.json +++ b/Light_Shp.API/obj/project.packagespec.json @@ -1 +1 @@ -"restore":{"projectUniqueName":"D:\\Projects\\Light_Shop\\Light_Shp.API\\Light_Shop.API.csproj","projectName":"Light_Shop.API","projectPath":"D:\\Projects\\Light_Shop\\Light_Shp.API\\Light_Shop.API.csproj","outputPath":"D:\\Projects\\Light_Shop\\Light_Shp.API\\obj\\","projectStyle":"PackageReference","fallbackFolders":["C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"],"originalTargetFrameworks":["net9.0"],"sources":{"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\":{},"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net9.0":{"targetAlias":"net9.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"9.0.200"}"frameworks":{"net9.0":{"targetAlias":"net9.0","dependencies":{"Mapster":{"target":"Package","version":"[7.4.0, )"},"Microsoft.AspNetCore.Identity.EntityFrameworkCore":{"target":"Package","version":"[9.0.4, )"},"Microsoft.AspNetCore.OpenApi":{"target":"Package","version":"[9.0.3, )"},"Microsoft.EntityFrameworkCore.SqlServer":{"target":"Package","version":"[9.0.3, )"},"Microsoft.EntityFrameworkCore.Tools":{"include":"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive","suppressParent":"All","target":"Package","version":"[9.0.3, )"},"Scalar.AspNetCore":{"target":"Package","version":"[2.1.3, )"},"Swashbuckle.AspNetCore":{"target":"Package","version":"[6.6.2, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.AspNetCore.App":{"privateAssets":"none"},"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Program Files\\dotnet\\sdk\\9.0.201/PortableRuntimeIdentifierGraph.json"}} \ No newline at end of file +"restore":{"projectUniqueName":"D:\\Projects\\Light_Shop\\Light_Shp.API\\Light_Shop.API.csproj","projectName":"Light_Shop.API","projectPath":"D:\\Projects\\Light_Shop\\Light_Shp.API\\Light_Shop.API.csproj","outputPath":"D:\\Projects\\Light_Shop\\Light_Shp.API\\obj\\","projectStyle":"PackageReference","fallbackFolders":["C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"],"originalTargetFrameworks":["net9.0"],"sources":{"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\":{},"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net9.0":{"targetAlias":"net9.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"9.0.200"}"frameworks":{"net9.0":{"targetAlias":"net9.0","dependencies":{"Mapster":{"target":"Package","version":"[7.4.0, )"},"Microsoft.AspNetCore.Authentication.JwtBearer":{"target":"Package","version":"[9.0.5, )"},"Microsoft.AspNetCore.Identity.EntityFrameworkCore":{"target":"Package","version":"[9.0.4, )"},"Microsoft.AspNetCore.OpenApi":{"target":"Package","version":"[9.0.3, )"},"Microsoft.EntityFrameworkCore.SqlServer":{"target":"Package","version":"[9.0.3, )"},"Microsoft.EntityFrameworkCore.Tools":{"include":"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive","suppressParent":"All","target":"Package","version":"[9.0.3, )"},"Scalar.AspNetCore":{"target":"Package","version":"[2.1.3, )"},"Swashbuckle.AspNetCore":{"target":"Package","version":"[6.6.2, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.AspNetCore.App":{"privateAssets":"none"},"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Program Files\\dotnet\\sdk\\9.0.201/PortableRuntimeIdentifierGraph.json"}} \ No newline at end of file diff --git a/Light_Shp.API/obj/rider.project.model.nuget.info b/Light_Shp.API/obj/rider.project.model.nuget.info index d139747..9d71245 100644 --- a/Light_Shp.API/obj/rider.project.model.nuget.info +++ b/Light_Shp.API/obj/rider.project.model.nuget.info @@ -1 +1 @@ -17441656314703536 \ No newline at end of file +17488970852461020 \ No newline at end of file diff --git a/Light_Shp.API/obj/rider.project.restore.info b/Light_Shp.API/obj/rider.project.restore.info index a108918..9d71245 100644 --- a/Light_Shp.API/obj/rider.project.restore.info +++ b/Light_Shp.API/obj/rider.project.restore.info @@ -1 +1 @@ -17444319473774255 \ No newline at end of file +17488970852461020 \ No newline at end of file