From 35ebc530c44c3bd37139e1b7ab74d3e3e16c68aa Mon Sep 17 00:00:00 2001 From: sanjoy Date: Fri, 5 Aug 2022 11:19:02 +0530 Subject: [PATCH] Create Boiler Template project --- .gitattributes | 2 + .gitignore | 9 + LICENSE | 21 + README.md | 37 + _screenshots/ui-home.png | Bin 0 -> 102875 bytes _screenshots/ui-login.png | Bin 0 -> 34494 bytes _screenshots/ui-user-create-modal.png | Bin 0 -> 71885 bytes angular/.browserslistrc | 12 + angular/.editorconfig | 12 + angular/.gitignore | 43 + angular/.vscode/launch.json | 16 + angular/Dockerfile | 3 + angular/MeetingSchedule.AngularUI.csproj | 24 + angular/MeetingSchedule.AngularUI.sln | 33 + angular/Properties/launchSettings.json | 27 + angular/README.md | 27 + angular/angular.json | 205 + angular/app.config | 5 + angular/e2e/app.e2e-spec.ts | 14 + angular/e2e/app.po.ts | 11 + angular/e2e/tsconfig.json | 29 + angular/karma.conf.js | 41 + angular/nswag/refresh.bat | 1 + angular/nswag/service.config.nswag | 209 + angular/package.json | 70 + angular/protractor.conf.js | 32 + angular/src/account/account-routing.module.ts | 24 + angular/src/account/account.component.html | 15 + angular/src/account/account.component.ts | 26 + angular/src/account/account.module.ts | 50 + .../layout/account-footer.component.html | 9 + .../layout/account-footer.component.ts | 23 + .../layout/account-header.component.html | 3 + .../layout/account-header.component.ts | 8 + .../layout/account-languages.component.html | 18 + .../layout/account-languages.component.ts | 42 + .../src/account/login/login.component.html | 83 + angular/src/account/login/login.component.ts | 38 + .../account/register/register.component.html | 147 + .../account/register/register.component.ts | 55 + .../tenant-change-dialog.component.html | 37 + .../tenant/tenant-change-dialog.component.ts | 60 + .../tenant/tenant-change.component.html | 12 + .../account/tenant/tenant-change.component.ts | 35 + angular/src/app-initializer.ts | 170 + angular/src/app/about/about.component.html | 136 + angular/src/app/about/about.component.ts | 14 + angular/src/app/app-routing.module.ts | 31 + angular/src/app/app.component.html | 9 + angular/src/app/app.component.spec.ts | 97 + angular/src/app/app.component.ts | 48 + angular/src/app/app.module.ts | 101 + angular/src/app/home/home.component.html | 296 + angular/src/app/home/home.component.ts | 14 + angular/src/app/layout/footer.component.html | 9 + angular/src/app/layout/footer.component.ts | 23 + .../header-language-menu.component.html | 21 + .../layout/header-language-menu.component.ts | 51 + .../layout/header-left-navbar.component.html | 17 + .../layout/header-left-navbar.component.ts | 23 + .../layout/header-user-menu.component.html | 17 + .../app/layout/header-user-menu.component.ts | 15 + angular/src/app/layout/header.component.html | 7 + angular/src/app/layout/header.component.ts | 8 + .../app/layout/sidebar-logo.component.html | 9 + .../src/app/layout/sidebar-logo.component.ts | 8 + .../app/layout/sidebar-menu.component.html | 71 + .../src/app/layout/sidebar-menu.component.ts | 186 + .../layout/sidebar-user-panel.component.html | 12 + .../layout/sidebar-user-panel.component.ts | 25 + angular/src/app/layout/sidebar.component.html | 7 + angular/src/app/layout/sidebar.component.ts | 47 + .../create-role-dialog.component.html | 103 + .../create-role-dialog.component.ts | 97 + .../edit-role/edit-role-dialog.component.html | 104 + .../edit-role/edit-role-dialog.component.ts | 97 + angular/src/app/roles/roles.component.html | 112 + angular/src/app/roles/roles.component.ts | 110 + .../create-tenant-dialog.component.html | 121 + .../create-tenant-dialog.component.ts | 51 + .../edit-tenant-dialog.component.html | 80 + .../edit-tenant-dialog.component.ts | 54 + .../src/app/tenants/tenants.component.html | 224 + angular/src/app/tenants/tenants.component.ts | 125 + .../change-password.component.html | 115 + .../change-password.component.ts | 58 + .../create-user-dialog.component.html | 200 + .../create-user-dialog.component.ts | 105 + .../edit-user/edit-user-dialog.component.html | 149 + .../edit-user/edit-user-dialog.component.ts | 91 + .../reset-password.component.html | 68 + .../reset-password.component.ts | 49 + angular/src/app/users/users.component.html | 234 + angular/src/app/users/users.component.ts | 134 + angular/src/assets/.gitkeep | 0 .../assets/abp-web-resources/abp.freeze-ui.js | 24 + .../abp-web-resources/abp.sweet-alert.js | 128 + angular/src/assets/appconfig.json | 18 + angular/src/assets/appconfig.production.json | 18 + angular/src/assets/freeze-ui/freeze-ui.css | 56 + angular/src/assets/freeze-ui/freeze-ui.js | 86 + angular/src/assets/img/logo.png | Bin 0 -> 4327 bytes angular/src/assets/img/user.png | Bin 0 -> 8007 bytes angular/src/environments/environment.hmr.ts | 7 + angular/src/environments/environment.prod.ts | 7 + angular/src/environments/environment.ts | 10 + angular/src/favicon.ico | Bin 0 -> 1150 bytes angular/src/hmr.ts | 15 + angular/src/index.html | 17 + angular/src/main.ts | 31 + angular/src/polyfills.ts | 19 + angular/src/root-routing.module.ts | 23 + angular/src/root.component.ts | 9 + angular/src/root.module.ts | 61 + angular/src/shared/AppConsts.ts | 20 + angular/src/shared/AppEnums.ts | 8 + .../src/shared/animations/routerTransition.ts | 29 + angular/src/shared/app-component-base.ts | 59 + angular/src/shared/auth/app-auth.service.ts | 107 + angular/src/shared/auth/auth-route-guard.ts | 54 + .../modal/abp-modal-footer.component.html | 13 + .../modal/abp-modal-footer.component.ts | 27 + .../modal/abp-modal-header.component.html | 11 + .../modal/abp-modal-header.component.ts | 24 + .../abp-pagination-controls.component.html | 59 + .../abp-pagination-controls.component.ts | 35 + .../validation/abp-validation.api.ts | 5 + .../abp-validation.summary.component.html | 11 + .../abp-validation.summary.component.ts | 90 + angular/src/shared/core.less | 69 + .../src/shared/directives/busy.directive.ts | 25 + .../directives/equal-validator.directive.ts | 58 + .../shared/helpers/SignalRAspNetCoreHelper.ts | 27 + angular/src/shared/helpers/UrlHelper.ts | 13 + angular/src/shared/layout/layout-config.ts | 3 + .../src/shared/layout/layout-store.service.ts | 31 + angular/src/shared/layout/menu-item.ts | 25 + angular/src/shared/nav/app-url.service.ts | 63 + .../shared/paged-listing-component-base.ts | 61 + angular/src/shared/pipes/localize.pipe.ts | 16 + .../shared/service-proxies/service-proxies.ts | 3822 ++++++++ .../service-proxies/service-proxy.module.ts | 19 + .../src/shared/session/app-session.service.ts | 85 + angular/src/shared/shared.module.ts | 59 + angular/src/test.ts | 32 + angular/src/tsconfig.json | 33 + angular/src/tsconfig.spec.json | 17 + angular/src/typings.d.ts | 17 + angular/tslint.json | 127 + angular/web.config | 25 + angular/yarn.lock | 8567 +++++++++++++++++ aspnet-core/.gitattributes | 63 + aspnet-core/.gitignore | 256 + aspnet-core/MeetingSchedule.sln | 74 + aspnet-core/build/build-with-ng.ps1 | 57 + aspnet-core/docker/ng/docker-compose.yml | 17 + aspnet-core/docker/ng/down.ps1 | 1 + aspnet-core/docker/ng/up.ps1 | 1 + .../Authorization/AbpLoginResultTypeHelper.cs | 64 + .../Accounts/AccountAppService.cs | 57 + .../Accounts/Dto/IsTenantAvailableInput.cs | 12 + .../Accounts/Dto/IsTenantAvailableOutput.cs | 19 + .../Accounts/Dto/RegisterInput.cs | 48 + .../Accounts/Dto/RegisterOutput.cs | 7 + .../Accounts/Dto/TenantAvailabilityState.cs | 9 + .../Accounts/IAccountAppService.cs | 13 + .../Configuration/ConfigurationAppService.cs | 16 + .../Configuration/Dto/ChangeUiThemeInput.cs | 11 + .../Configuration/IConfigurationAppService.cs | 10 + .../Configuration/Ui/UiThemeInfo.cs | 14 + .../Configuration/Ui/UiThemes.cs | 36 + .../MeetingSchedule.Application.csproj | 17 + .../MeetingScheduleAppServiceBase.cs | 47 + .../MeetingScheduleApplicationModule.cs | 30 + .../MultiTenancy/Dto/CreateTenantDto.cs | 29 + .../Dto/PagedTenantResultRequestDto.cs | 11 + .../MultiTenancy/Dto/TenantDto.cs | 22 + .../MultiTenancy/ITenantAppService.cs | 10 + .../MultiTenancy/TenantAppService.cs | 123 + .../Net/MimeTypes/MimeTypeNames.cs | 311 + .../Properties/AssemblyInfo.cs | 18 + .../Roles/Dto/CreateRoleDto.cs | 30 + .../Roles/Dto/FlatPermissionDto.cs | 11 + .../Roles/Dto/GetRoleForEditOutput.cs | 13 + .../Roles/Dto/GetRolesInput.cs | 7 + .../Roles/Dto/PagedRoleResultRequestDto.cs | 10 + .../Roles/Dto/PermissionDto.cs | 16 + .../Roles/Dto/RoleDto.cs | 27 + .../Roles/Dto/RoleEditDto.cs | 23 + .../Roles/Dto/RoleListDto.cs | 19 + .../Roles/Dto/RoleMapProfile.cs | 29 + .../Roles/IRoleAppService.cs | 16 + .../Roles/RoleAppService.cs | 148 + .../Sessions/Dto/ApplicationInfoDto.cs | 14 + .../Dto/GetCurrentLoginInformationsOutput.cs | 11 + .../Sessions/Dto/TenantLoginInfoDto.cs | 14 + .../Sessions/Dto/UserLoginInfoDto.cs | 18 + .../Sessions/ISessionAppService.cs | 11 + .../Sessions/SessionAppService.cs | 36 + .../Users/Dto/ChangePasswordDto.cs | 13 + .../Users/Dto/ChangeUserLanguageDto.cs | 10 + .../Users/Dto/CreateUserDto.cs | 47 + .../Users/Dto/PagedUserResultRequestDto.cs | 12 + .../Users/Dto/ResetPasswordDto.cs | 16 + .../Users/Dto/UserDto.cs | 40 + .../Users/Dto/UserMapProfile.cs | 19 + .../Users/IUserAppService.cs | 18 + .../Users/UserAppService.cs | 251 + .../MeetingSchedule.Core/AppVersionHelper.cs | 26 + .../Authorization/LoginManager.cs | 45 + .../MeetingScheduleAuthorizationProvider.cs | 22 + .../Authorization/PermissionChecker.cs | 14 + .../Authorization/PermissionNames.cs | 12 + .../Authorization/Roles/AppRoleConfig.cs | 29 + .../Authorization/Roles/Role.cs | 28 + .../Authorization/Roles/RoleManager.cs | 43 + .../Authorization/Roles/RoleStore.cs | 21 + .../Authorization/Roles/StaticRoleNames.cs | 15 + .../Authorization/Users/User.cs | 34 + .../Users/UserClaimsPrincipalFactory.cs | 24 + .../Authorization/Users/UserManager.cs | 61 + .../Users/UserRegistrationManager.cs | 112 + .../Authorization/Users/UserStore.cs | 35 + .../Configuration/AppConfigurations.cs | 47 + .../Configuration/AppSettingNames.cs | 7 + .../Configuration/AppSettingProvider.cs | 16 + .../Debugging/DebugHelper.cs | 18 + .../Editions/EditionManager.cs | 20 + .../Features/FeatureValueStore.cs | 30 + .../Identity/IdentityRegistrar.cs | 32 + .../Identity/SecurityStampValidator.cs | 25 + .../Identity/SignInManager.cs | 32 + .../MeetingScheduleLocalizationConfigurer.cs | 22 + .../SourceFiles/MeetingSchedule-es.xml | 120 + .../SourceFiles/MeetingSchedule-fa.xml | 121 + .../SourceFiles/MeetingSchedule-fr.xml | 47 + .../SourceFiles/MeetingSchedule-it.xml | 58 + .../SourceFiles/MeetingSchedule-ja.xml | 57 + .../SourceFiles/MeetingSchedule-lt.xml | 109 + .../SourceFiles/MeetingSchedule-nl.xml | 88 + .../SourceFiles/MeetingSchedule-pt-BR.xml | 110 + .../SourceFiles/MeetingSchedule-tr.xml | 121 + .../SourceFiles/MeetingSchedule-zh-Hans.xml | 104 + .../SourceFiles/MeetingSchedule.xml | 121 + .../MeetingSchedule.Core.csproj | 22 + .../MeetingScheduleConsts.cs | 20 + .../MeetingScheduleCoreModule.cs | 55 + .../MultiTenancy/Tenant.cs | 17 + .../MultiTenancy/TenantManager.cs | 24 + .../Properties/AssemblyInfo.cs | 18 + .../MeetingSchedule.Core/Timing/AppTimes.cs | 13 + .../Validation/ValidationHelper.cs | 21 + .../Web/WebContentFolderHelper.cs | 53 + .../EntityFrameworkCore/AbpZeroDbMigrator.cs | 21 + .../MeetingScheduleDbContext.cs | 18 + .../MeetingScheduleDbContextConfigurer.cs | 18 + .../MeetingScheduleDbContextFactory.cs | 29 + .../MeetingScheduleEntityFrameworkModule.cs | 50 + .../MeetingScheduleRepositoryBase.cs | 39 + .../Seed/Host/DefaultEditionCreator.cs | 52 + .../Seed/Host/DefaultLanguagesCreator.cs | 65 + .../Seed/Host/DefaultSettingsCreator.cs | 47 + .../Seed/Host/HostRoleAndUserCreator.cs | 98 + .../Seed/Host/InitialHostDbBuilder.cs | 22 + .../EntityFrameworkCore/Seed/SeedHelper.cs | 48 + .../Seed/Tenants/DefaultTenantBuilder.cs | 43 + .../Seed/Tenants/TenantRoleAndUserBuilder.cs | 89 + ...MeetingSchedule.EntityFrameworkCore.csproj | 29 + ...70424115119_Initial_Migrations.Designer.cs | 1355 +++ .../20170424115119_Initial_Migrations.cs | 996 ++ ...08053244_Upgraded_To_Abp_2_1_0.Designer.cs | 1354 +++ .../20170608053244_Upgraded_To_Abp_2_1_0.cs | 65 + ...scription_And_IsActive_To_Role.Designer.cs | 1361 +++ ..._Added_Description_And_IsActive_To_Role.cs | 33 + ...4115_Remove_IsActive_From_Role.Designer.cs | 1358 +++ ...0170703134115_Remove_IsActive_From_Role.cs | 23 + ...4083601_Upgraded_To_Abp_v2.2.2.Designer.cs | 1361 +++ .../20170804083601_Upgraded_To_Abp_v2.2.2.cs | 23 + ...1051646_Upgraded_To_Abp_v3.4.0.Designer.cs | 1513 +++ .../20180201051646_Upgraded_To_Abp_v3.4.0.cs | 189 + ...0131229_Upgraded_To_Abp_v3_5_0.Designer.cs | 1520 +++ .../20180320131229_Upgraded_To_Abp_v3_5_0.cs | 127 + ...9121141_Upgraded_To_Abp_v3_6_1.Designer.cs | 1520 +++ .../20180509121141_Upgraded_To_Abp_v3_6_1.cs | 69 + ...180726102703_Upgrade_ABP_3.8.0.Designer.cs | 1538 +++ .../20180726102703_Upgrade_ABP_3.8.0.cs | 63 + ...180731132139_Upgrade_ABP_3.8.1.Designer.cs | 1538 +++ .../20180731132139_Upgrade_ABP_3.8.1.cs | 31 + ...180927062608_Upgrade_ABP_3.8.3.Designer.cs | 1541 +++ .../20180927062608_Upgrade_ABP_3.8.3.cs | 23 + ...3103914_Upgraded_To_Abp_v3_9_0.Designer.cs | 1541 +++ .../20181013103914_Upgraded_To_Abp_v3_9_0.cs | 45 + ...190208051931_Upgrade_ABP_4_2_0.Designer.cs | 1571 +++ .../20190208051931_Upgrade_ABP_4_2_0.cs | 73 + ...03062215_Upgraded_To_Abp_4_7_0.Designer.cs | 1572 +++ .../20190703062215_Upgraded_To_Abp_4_7_0.cs | 32 + ...19143908_Upgraded_To_Abp_4_8_0.Designer.cs | 1284 +++ .../20190719143908_Upgraded_To_Abp_4_8_0.cs | 45 + ...16011543_Upgraded_To_Abp_5_1_0.Designer.cs | 1581 +++ .../20191216011543_Upgraded_To_Abp_5_1_0.cs | 47 + ...20110527_Upgraded_To_Abp_5_2_0.Designer.cs | 1691 ++++ .../20200220110527_Upgraded_To_Abp_5_2_0.cs | 88 + ...20114152_Upgraded_To_Abp_5_4_0.Designer.cs | 1826 ++++ .../20200320114152_Upgraded_To_Abp_5_4_0.cs | 154 + ...0604091046_Upgraded_To_Abp_5_9.Designer.cs | 1824 ++++ .../20200604091046_Upgraded_To_Abp_5_9.cs | 33 + ...8141743_Upgraded_To_ABP_5_13_0.Designer.cs | 1824 ++++ .../20200928141743_Upgraded_To_ABP_5_13_0.cs | 255 + ...1112121732_Upgraded_To_ABP_6_0.Designer.cs | 1907 ++++ .../20201112121732_Upgraded_To_ABP_6_0.cs | 43 + ...217144556_Upgrade_To_ABP_6_1_1.Designer.cs | 1907 ++++ .../20201217144556_Upgrade_To_ABP_6_1_1.cs | 63 + ...10324090321_Upgrade_To_ABP_6_3.Designer.cs | 1913 ++++ .../20210324090321_Upgrade_To_ABP_6_3.cs | 64 + ...8103231_Upgrade_To_ABP_6_4_rc1.Designer.cs | 1917 ++++ .../20210628103231_Upgrade_To_ABP_6_4_rc1.cs | 24 + ...20622074714_Upgrade_To_ABP_7.3.Designer.cs | 1954 ++++ .../20220622074714_Upgrade_To_ABP_7.3.cs | 35 + .../MeetingScheduleDbContextModelSnapshot.cs | 1952 ++++ .../ServiceCollectionRegistrar.cs | 19 + .../src/MeetingSchedule.Migrator/Log.cs | 23 + .../MeetingSchedule.Migrator.csproj | 24 + .../MeetingScheduleMigratorModule.cs | 47 + .../MultiTenantMigrateExecuter.cs | 131 + .../src/MeetingSchedule.Migrator/Program.cs | 64 + .../Properties/AssemblyInfo.cs | 18 + .../MeetingSchedule.Migrator/appsettings.json | 5 + .../MeetingSchedule.Migrator/log4net.config | 19 + .../External/ExternalAuthConfiguration.cs | 15 + .../External/ExternalAuthManager.cs | 48 + .../External/ExternalAuthProviderApiBase.cs | 23 + .../External/ExternalAuthUserInfo.cs | 15 + .../External/ExternalLoginProviderInfo.cs | 23 + .../External/IExternalAuthConfiguration.cs | 9 + .../External/IExternalAuthManager.cs | 11 + .../External/IExternalAuthProviderApi.cs | 15 + .../JwtBearer/JwtTokenMiddleware.cs | 26 + .../JwtBearer/TokenAuthConfiguration.cs | 18 + .../HostingEnvironmentExtensions.cs | 14 + .../MeetingScheduleControllerBase.cs | 19 + .../Controllers/TokenAuthController.cs | 236 + .../Identity/ExternalLoginInfoHelper.cs | 52 + .../MeetingSchedule.Web.Core.csproj | 32 + .../MeetingScheduleWebCoreModule.cs | 76 + .../Models/TokenAuth/AuthenticateModel.cs | 20 + .../TokenAuth/AuthenticateResultModel.cs | 13 + .../TokenAuth/ExternalAuthenticateModel.cs | 19 + .../ExternalAuthenticateResultModel.cs | 13 + .../ExternalLoginProviderInfoModel.cs | 13 + .../Properties/AssemblyInfo.cs | 35 + .../Controllers/AntiForgeryController.cs | 30 + .../Controllers/HomeController.cs | 52 + .../src/MeetingSchedule.Web.Host/Dockerfile | 6 + .../MeetingSchedule.Web.Host.csproj | 46 + .../Properties/launchSettings.json | 28 + .../Startup/AuthConfigurer.cs | 78 + .../Startup/MeetingScheduleWebHostModule.cs | 27 + .../Startup/Program.cs | 23 + .../Startup/Startup.cs | 181 + .../src/MeetingSchedule.Web.Host/app.config | 8 + .../appsettings.Staging.json | 9 + .../MeetingSchedule.Web.Host/appsettings.json | 28 + .../log4net.Production.config | 19 + .../MeetingSchedule.Web.Host/log4net.config | 19 + .../wwwroot/swagger/ui/abp.js | 117 + .../wwwroot/swagger/ui/abp.swagger.js | 214 + .../wwwroot/swagger/ui/index.html | 146 + .../ServiceCollectionRegistrar.cs | 35 + .../MeetingSchedule.Tests.csproj | 39 + .../MeetingScheduleTestBase.cs | 210 + .../MeetingScheduleTestModule.cs | 62 + .../MultiTenantFactAttribute.cs | 15 + .../Properties/AssemblyInfo.cs | 18 + .../Sessions/SessionAppService_Tests.cs | 52 + .../Users/UserAppService_Tests.cs | 52 + .../Controllers/HomeController_Tests.cs | 29 + .../MeetingSchedule.Web.Tests.csproj | 30 + .../MeetingScheduleWebTestBase.cs | 216 + .../MeetingScheduleWebTestModule.cs | 38 + .../test/MeetingSchedule.Web.Tests/Startup.cs | 86 + rename.ps1 | 81 + 381 files changed, 72770 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 _screenshots/ui-home.png create mode 100644 _screenshots/ui-login.png create mode 100644 _screenshots/ui-user-create-modal.png create mode 100644 angular/.browserslistrc create mode 100644 angular/.editorconfig create mode 100644 angular/.gitignore create mode 100644 angular/.vscode/launch.json create mode 100644 angular/Dockerfile create mode 100644 angular/MeetingSchedule.AngularUI.csproj create mode 100644 angular/MeetingSchedule.AngularUI.sln create mode 100644 angular/Properties/launchSettings.json create mode 100644 angular/README.md create mode 100644 angular/angular.json create mode 100644 angular/app.config create mode 100644 angular/e2e/app.e2e-spec.ts create mode 100644 angular/e2e/app.po.ts create mode 100644 angular/e2e/tsconfig.json create mode 100644 angular/karma.conf.js create mode 100644 angular/nswag/refresh.bat create mode 100644 angular/nswag/service.config.nswag create mode 100644 angular/package.json create mode 100644 angular/protractor.conf.js create mode 100644 angular/src/account/account-routing.module.ts create mode 100644 angular/src/account/account.component.html create mode 100644 angular/src/account/account.component.ts create mode 100644 angular/src/account/account.module.ts create mode 100644 angular/src/account/layout/account-footer.component.html create mode 100644 angular/src/account/layout/account-footer.component.ts create mode 100644 angular/src/account/layout/account-header.component.html create mode 100644 angular/src/account/layout/account-header.component.ts create mode 100644 angular/src/account/layout/account-languages.component.html create mode 100644 angular/src/account/layout/account-languages.component.ts create mode 100644 angular/src/account/login/login.component.html create mode 100644 angular/src/account/login/login.component.ts create mode 100644 angular/src/account/register/register.component.html create mode 100644 angular/src/account/register/register.component.ts create mode 100644 angular/src/account/tenant/tenant-change-dialog.component.html create mode 100644 angular/src/account/tenant/tenant-change-dialog.component.ts create mode 100644 angular/src/account/tenant/tenant-change.component.html create mode 100644 angular/src/account/tenant/tenant-change.component.ts create mode 100644 angular/src/app-initializer.ts create mode 100644 angular/src/app/about/about.component.html create mode 100644 angular/src/app/about/about.component.ts create mode 100644 angular/src/app/app-routing.module.ts create mode 100644 angular/src/app/app.component.html create mode 100644 angular/src/app/app.component.spec.ts create mode 100644 angular/src/app/app.component.ts create mode 100644 angular/src/app/app.module.ts create mode 100644 angular/src/app/home/home.component.html create mode 100644 angular/src/app/home/home.component.ts create mode 100644 angular/src/app/layout/footer.component.html create mode 100644 angular/src/app/layout/footer.component.ts create mode 100644 angular/src/app/layout/header-language-menu.component.html create mode 100644 angular/src/app/layout/header-language-menu.component.ts create mode 100644 angular/src/app/layout/header-left-navbar.component.html create mode 100644 angular/src/app/layout/header-left-navbar.component.ts create mode 100644 angular/src/app/layout/header-user-menu.component.html create mode 100644 angular/src/app/layout/header-user-menu.component.ts create mode 100644 angular/src/app/layout/header.component.html create mode 100644 angular/src/app/layout/header.component.ts create mode 100644 angular/src/app/layout/sidebar-logo.component.html create mode 100644 angular/src/app/layout/sidebar-logo.component.ts create mode 100644 angular/src/app/layout/sidebar-menu.component.html create mode 100644 angular/src/app/layout/sidebar-menu.component.ts create mode 100644 angular/src/app/layout/sidebar-user-panel.component.html create mode 100644 angular/src/app/layout/sidebar-user-panel.component.ts create mode 100644 angular/src/app/layout/sidebar.component.html create mode 100644 angular/src/app/layout/sidebar.component.ts create mode 100644 angular/src/app/roles/create-role/create-role-dialog.component.html create mode 100644 angular/src/app/roles/create-role/create-role-dialog.component.ts create mode 100644 angular/src/app/roles/edit-role/edit-role-dialog.component.html create mode 100644 angular/src/app/roles/edit-role/edit-role-dialog.component.ts create mode 100644 angular/src/app/roles/roles.component.html create mode 100644 angular/src/app/roles/roles.component.ts create mode 100644 angular/src/app/tenants/create-tenant/create-tenant-dialog.component.html create mode 100644 angular/src/app/tenants/create-tenant/create-tenant-dialog.component.ts create mode 100644 angular/src/app/tenants/edit-tenant/edit-tenant-dialog.component.html create mode 100644 angular/src/app/tenants/edit-tenant/edit-tenant-dialog.component.ts create mode 100644 angular/src/app/tenants/tenants.component.html create mode 100644 angular/src/app/tenants/tenants.component.ts create mode 100644 angular/src/app/users/change-password/change-password.component.html create mode 100644 angular/src/app/users/change-password/change-password.component.ts create mode 100644 angular/src/app/users/create-user/create-user-dialog.component.html create mode 100644 angular/src/app/users/create-user/create-user-dialog.component.ts create mode 100644 angular/src/app/users/edit-user/edit-user-dialog.component.html create mode 100644 angular/src/app/users/edit-user/edit-user-dialog.component.ts create mode 100644 angular/src/app/users/reset-password/reset-password.component.html create mode 100644 angular/src/app/users/reset-password/reset-password.component.ts create mode 100644 angular/src/app/users/users.component.html create mode 100644 angular/src/app/users/users.component.ts create mode 100644 angular/src/assets/.gitkeep create mode 100644 angular/src/assets/abp-web-resources/abp.freeze-ui.js create mode 100644 angular/src/assets/abp-web-resources/abp.sweet-alert.js create mode 100644 angular/src/assets/appconfig.json create mode 100644 angular/src/assets/appconfig.production.json create mode 100644 angular/src/assets/freeze-ui/freeze-ui.css create mode 100644 angular/src/assets/freeze-ui/freeze-ui.js create mode 100644 angular/src/assets/img/logo.png create mode 100644 angular/src/assets/img/user.png create mode 100644 angular/src/environments/environment.hmr.ts create mode 100644 angular/src/environments/environment.prod.ts create mode 100644 angular/src/environments/environment.ts create mode 100644 angular/src/favicon.ico create mode 100644 angular/src/hmr.ts create mode 100644 angular/src/index.html create mode 100644 angular/src/main.ts create mode 100644 angular/src/polyfills.ts create mode 100644 angular/src/root-routing.module.ts create mode 100644 angular/src/root.component.ts create mode 100644 angular/src/root.module.ts create mode 100644 angular/src/shared/AppConsts.ts create mode 100644 angular/src/shared/AppEnums.ts create mode 100644 angular/src/shared/animations/routerTransition.ts create mode 100644 angular/src/shared/app-component-base.ts create mode 100644 angular/src/shared/auth/app-auth.service.ts create mode 100644 angular/src/shared/auth/auth-route-guard.ts create mode 100644 angular/src/shared/components/modal/abp-modal-footer.component.html create mode 100644 angular/src/shared/components/modal/abp-modal-footer.component.ts create mode 100644 angular/src/shared/components/modal/abp-modal-header.component.html create mode 100644 angular/src/shared/components/modal/abp-modal-header.component.ts create mode 100644 angular/src/shared/components/pagination/abp-pagination-controls.component.html create mode 100644 angular/src/shared/components/pagination/abp-pagination-controls.component.ts create mode 100644 angular/src/shared/components/validation/abp-validation.api.ts create mode 100644 angular/src/shared/components/validation/abp-validation.summary.component.html create mode 100644 angular/src/shared/components/validation/abp-validation.summary.component.ts create mode 100644 angular/src/shared/core.less create mode 100644 angular/src/shared/directives/busy.directive.ts create mode 100644 angular/src/shared/directives/equal-validator.directive.ts create mode 100644 angular/src/shared/helpers/SignalRAspNetCoreHelper.ts create mode 100644 angular/src/shared/helpers/UrlHelper.ts create mode 100644 angular/src/shared/layout/layout-config.ts create mode 100644 angular/src/shared/layout/layout-store.service.ts create mode 100644 angular/src/shared/layout/menu-item.ts create mode 100644 angular/src/shared/nav/app-url.service.ts create mode 100644 angular/src/shared/paged-listing-component-base.ts create mode 100644 angular/src/shared/pipes/localize.pipe.ts create mode 100644 angular/src/shared/service-proxies/service-proxies.ts create mode 100644 angular/src/shared/service-proxies/service-proxy.module.ts create mode 100644 angular/src/shared/session/app-session.service.ts create mode 100644 angular/src/shared/shared.module.ts create mode 100644 angular/src/test.ts create mode 100644 angular/src/tsconfig.json create mode 100644 angular/src/tsconfig.spec.json create mode 100644 angular/src/typings.d.ts create mode 100644 angular/tslint.json create mode 100644 angular/web.config create mode 100644 angular/yarn.lock create mode 100644 aspnet-core/.gitattributes create mode 100644 aspnet-core/.gitignore create mode 100644 aspnet-core/MeetingSchedule.sln create mode 100644 aspnet-core/build/build-with-ng.ps1 create mode 100644 aspnet-core/docker/ng/docker-compose.yml create mode 100644 aspnet-core/docker/ng/down.ps1 create mode 100644 aspnet-core/docker/ng/up.ps1 create mode 100644 aspnet-core/src/MeetingSchedule.Application/Authorization/AbpLoginResultTypeHelper.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/AccountAppService.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/IsTenantAvailableInput.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/IsTenantAvailableOutput.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/RegisterInput.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/RegisterOutput.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/TenantAvailabilityState.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/IAccountAppService.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Configuration/ConfigurationAppService.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Configuration/Dto/ChangeUiThemeInput.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Configuration/IConfigurationAppService.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Configuration/Ui/UiThemeInfo.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Configuration/Ui/UiThemes.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/MeetingSchedule.Application.csproj create mode 100644 aspnet-core/src/MeetingSchedule.Application/MeetingScheduleAppServiceBase.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/MeetingScheduleApplicationModule.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/MultiTenancy/Dto/CreateTenantDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/MultiTenancy/Dto/PagedTenantResultRequestDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/MultiTenancy/Dto/TenantDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/MultiTenancy/ITenantAppService.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/MultiTenancy/TenantAppService.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Net/MimeTypes/MimeTypeNames.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Properties/AssemblyInfo.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Roles/Dto/CreateRoleDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Roles/Dto/FlatPermissionDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Roles/Dto/GetRoleForEditOutput.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Roles/Dto/GetRolesInput.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Roles/Dto/PagedRoleResultRequestDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Roles/Dto/PermissionDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Roles/Dto/RoleDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Roles/Dto/RoleEditDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Roles/Dto/RoleListDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Roles/Dto/RoleMapProfile.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Roles/IRoleAppService.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Roles/RoleAppService.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Sessions/Dto/ApplicationInfoDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Sessions/Dto/GetCurrentLoginInformationsOutput.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Sessions/Dto/TenantLoginInfoDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Sessions/Dto/UserLoginInfoDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Sessions/ISessionAppService.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Sessions/SessionAppService.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Users/Dto/ChangePasswordDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Users/Dto/ChangeUserLanguageDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Users/Dto/CreateUserDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Users/Dto/PagedUserResultRequestDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Users/Dto/ResetPasswordDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Users/Dto/UserDto.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Users/Dto/UserMapProfile.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Users/IUserAppService.cs create mode 100644 aspnet-core/src/MeetingSchedule.Application/Users/UserAppService.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/AppVersionHelper.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Authorization/LoginManager.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Authorization/MeetingScheduleAuthorizationProvider.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Authorization/PermissionChecker.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Authorization/PermissionNames.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Authorization/Roles/AppRoleConfig.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Authorization/Roles/Role.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Authorization/Roles/RoleManager.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Authorization/Roles/RoleStore.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Authorization/Roles/StaticRoleNames.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Authorization/Users/User.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Authorization/Users/UserClaimsPrincipalFactory.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Authorization/Users/UserManager.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Authorization/Users/UserRegistrationManager.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Authorization/Users/UserStore.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Configuration/AppConfigurations.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Configuration/AppSettingNames.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Configuration/AppSettingProvider.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Debugging/DebugHelper.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Editions/EditionManager.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Features/FeatureValueStore.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Identity/IdentityRegistrar.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Identity/SecurityStampValidator.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Identity/SignInManager.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Localization/MeetingScheduleLocalizationConfigurer.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Localization/SourceFiles/MeetingSchedule-es.xml create mode 100644 aspnet-core/src/MeetingSchedule.Core/Localization/SourceFiles/MeetingSchedule-fa.xml create mode 100644 aspnet-core/src/MeetingSchedule.Core/Localization/SourceFiles/MeetingSchedule-fr.xml create mode 100644 aspnet-core/src/MeetingSchedule.Core/Localization/SourceFiles/MeetingSchedule-it.xml create mode 100644 aspnet-core/src/MeetingSchedule.Core/Localization/SourceFiles/MeetingSchedule-ja.xml create mode 100644 aspnet-core/src/MeetingSchedule.Core/Localization/SourceFiles/MeetingSchedule-lt.xml create mode 100644 aspnet-core/src/MeetingSchedule.Core/Localization/SourceFiles/MeetingSchedule-nl.xml create mode 100644 aspnet-core/src/MeetingSchedule.Core/Localization/SourceFiles/MeetingSchedule-pt-BR.xml create mode 100644 aspnet-core/src/MeetingSchedule.Core/Localization/SourceFiles/MeetingSchedule-tr.xml create mode 100644 aspnet-core/src/MeetingSchedule.Core/Localization/SourceFiles/MeetingSchedule-zh-Hans.xml create mode 100644 aspnet-core/src/MeetingSchedule.Core/Localization/SourceFiles/MeetingSchedule.xml create mode 100644 aspnet-core/src/MeetingSchedule.Core/MeetingSchedule.Core.csproj create mode 100644 aspnet-core/src/MeetingSchedule.Core/MeetingScheduleConsts.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/MeetingScheduleCoreModule.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/MultiTenancy/Tenant.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/MultiTenancy/TenantManager.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Properties/AssemblyInfo.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Timing/AppTimes.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Validation/ValidationHelper.cs create mode 100644 aspnet-core/src/MeetingSchedule.Core/Web/WebContentFolderHelper.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/EntityFrameworkCore/AbpZeroDbMigrator.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/EntityFrameworkCore/MeetingScheduleDbContext.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/EntityFrameworkCore/MeetingScheduleDbContextConfigurer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/EntityFrameworkCore/MeetingScheduleDbContextFactory.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/EntityFrameworkCore/MeetingScheduleEntityFrameworkModule.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/EntityFrameworkCore/Repositories/MeetingScheduleRepositoryBase.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/DefaultEditionCreator.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/DefaultLanguagesCreator.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/DefaultSettingsCreator.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/HostRoleAndUserCreator.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/EntityFrameworkCore/Seed/Host/InitialHostDbBuilder.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/EntityFrameworkCore/Seed/SeedHelper.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/EntityFrameworkCore/Seed/Tenants/DefaultTenantBuilder.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/EntityFrameworkCore/Seed/Tenants/TenantRoleAndUserBuilder.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/MeetingSchedule.EntityFrameworkCore.csproj create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20170424115119_Initial_Migrations.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20170424115119_Initial_Migrations.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20170608053244_Upgraded_To_Abp_2_1_0.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20170608053244_Upgraded_To_Abp_2_1_0.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20170621153937_Added_Description_And_IsActive_To_Role.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20170621153937_Added_Description_And_IsActive_To_Role.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20170703134115_Remove_IsActive_From_Role.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20170703134115_Remove_IsActive_From_Role.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20170804083601_Upgraded_To_Abp_v2.2.2.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20170804083601_Upgraded_To_Abp_v2.2.2.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20180201051646_Upgraded_To_Abp_v3.4.0.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20180201051646_Upgraded_To_Abp_v3.4.0.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20180320131229_Upgraded_To_Abp_v3_5_0.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20180320131229_Upgraded_To_Abp_v3_5_0.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20180509121141_Upgraded_To_Abp_v3_6_1.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20180509121141_Upgraded_To_Abp_v3_6_1.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20180726102703_Upgrade_ABP_3.8.0.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20180726102703_Upgrade_ABP_3.8.0.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20180731132139_Upgrade_ABP_3.8.1.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20180731132139_Upgrade_ABP_3.8.1.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20180927062608_Upgrade_ABP_3.8.3.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20180927062608_Upgrade_ABP_3.8.3.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20181013103914_Upgraded_To_Abp_v3_9_0.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20181013103914_Upgraded_To_Abp_v3_9_0.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20190208051931_Upgrade_ABP_4_2_0.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20190208051931_Upgrade_ABP_4_2_0.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20190703062215_Upgraded_To_Abp_4_7_0.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20190703062215_Upgraded_To_Abp_4_7_0.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20190719143908_Upgraded_To_Abp_4_8_0.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20190719143908_Upgraded_To_Abp_4_8_0.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20191216011543_Upgraded_To_Abp_5_1_0.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20191216011543_Upgraded_To_Abp_5_1_0.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20200220110527_Upgraded_To_Abp_5_2_0.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20200220110527_Upgraded_To_Abp_5_2_0.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20200320114152_Upgraded_To_Abp_5_4_0.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20200320114152_Upgraded_To_Abp_5_4_0.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20200604091046_Upgraded_To_Abp_5_9.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20200604091046_Upgraded_To_Abp_5_9.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20200928141743_Upgraded_To_ABP_5_13_0.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20200928141743_Upgraded_To_ABP_5_13_0.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20201112121732_Upgraded_To_ABP_6_0.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20201112121732_Upgraded_To_ABP_6_0.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20201217144556_Upgrade_To_ABP_6_1_1.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20201217144556_Upgrade_To_ABP_6_1_1.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20210324090321_Upgrade_To_ABP_6_3.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20210324090321_Upgrade_To_ABP_6_3.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20210628103231_Upgrade_To_ABP_6_4_rc1.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20210628103231_Upgrade_To_ABP_6_4_rc1.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20220622074714_Upgrade_To_ABP_7.3.Designer.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/20220622074714_Upgrade_To_ABP_7.3.cs create mode 100644 aspnet-core/src/MeetingSchedule.EntityFrameworkCore/Migrations/MeetingScheduleDbContextModelSnapshot.cs create mode 100644 aspnet-core/src/MeetingSchedule.Migrator/DependencyInjection/ServiceCollectionRegistrar.cs create mode 100644 aspnet-core/src/MeetingSchedule.Migrator/Log.cs create mode 100644 aspnet-core/src/MeetingSchedule.Migrator/MeetingSchedule.Migrator.csproj create mode 100644 aspnet-core/src/MeetingSchedule.Migrator/MeetingScheduleMigratorModule.cs create mode 100644 aspnet-core/src/MeetingSchedule.Migrator/MultiTenantMigrateExecuter.cs create mode 100644 aspnet-core/src/MeetingSchedule.Migrator/Program.cs create mode 100644 aspnet-core/src/MeetingSchedule.Migrator/Properties/AssemblyInfo.cs create mode 100644 aspnet-core/src/MeetingSchedule.Migrator/appsettings.json create mode 100644 aspnet-core/src/MeetingSchedule.Migrator/log4net.config create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Authentication/External/ExternalAuthConfiguration.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Authentication/External/ExternalAuthManager.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Authentication/External/ExternalAuthProviderApiBase.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Authentication/External/ExternalAuthUserInfo.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Authentication/External/ExternalLoginProviderInfo.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Authentication/External/IExternalAuthConfiguration.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Authentication/External/IExternalAuthManager.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Authentication/External/IExternalAuthProviderApi.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Authentication/JwtBearer/JwtTokenMiddleware.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Authentication/JwtBearer/TokenAuthConfiguration.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Configuration/HostingEnvironmentExtensions.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Controllers/MeetingScheduleControllerBase.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Controllers/TokenAuthController.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Identity/ExternalLoginInfoHelper.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/MeetingSchedule.Web.Core.csproj create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/MeetingScheduleWebCoreModule.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Models/TokenAuth/AuthenticateModel.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Models/TokenAuth/AuthenticateResultModel.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Models/TokenAuth/ExternalAuthenticateModel.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Models/TokenAuth/ExternalAuthenticateResultModel.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Models/TokenAuth/ExternalLoginProviderInfoModel.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Core/Properties/AssemblyInfo.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/Controllers/AntiForgeryController.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/Controllers/HomeController.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/Dockerfile create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/MeetingSchedule.Web.Host.csproj create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/Properties/launchSettings.json create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/Startup/AuthConfigurer.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/Startup/MeetingScheduleWebHostModule.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/Startup/Program.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/Startup/Startup.cs create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/app.config create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/appsettings.Staging.json create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/appsettings.json create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/log4net.Production.config create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/log4net.config create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/wwwroot/swagger/ui/abp.js create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/wwwroot/swagger/ui/abp.swagger.js create mode 100644 aspnet-core/src/MeetingSchedule.Web.Host/wwwroot/swagger/ui/index.html create mode 100644 aspnet-core/test/MeetingSchedule.Tests/DependencyInjection/ServiceCollectionRegistrar.cs create mode 100644 aspnet-core/test/MeetingSchedule.Tests/MeetingSchedule.Tests.csproj create mode 100644 aspnet-core/test/MeetingSchedule.Tests/MeetingScheduleTestBase.cs create mode 100644 aspnet-core/test/MeetingSchedule.Tests/MeetingScheduleTestModule.cs create mode 100644 aspnet-core/test/MeetingSchedule.Tests/MultiTenantFactAttribute.cs create mode 100644 aspnet-core/test/MeetingSchedule.Tests/Properties/AssemblyInfo.cs create mode 100644 aspnet-core/test/MeetingSchedule.Tests/Sessions/SessionAppService_Tests.cs create mode 100644 aspnet-core/test/MeetingSchedule.Tests/Users/UserAppService_Tests.cs create mode 100644 aspnet-core/test/MeetingSchedule.Web.Tests/Controllers/HomeController_Tests.cs create mode 100644 aspnet-core/test/MeetingSchedule.Web.Tests/MeetingSchedule.Web.Tests.csproj create mode 100644 aspnet-core/test/MeetingSchedule.Web.Tests/MeetingScheduleWebTestBase.cs create mode 100644 aspnet-core/test/MeetingSchedule.Web.Tests/MeetingScheduleWebTestModule.cs create mode 100644 aspnet-core/test/MeetingSchedule.Web.Tests/Startup.cs create mode 100644 rename.ps1 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1d9079a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +**/wwwroot/lib/** linguist-vendored +**/wwwroot/css/** linguist-vendored diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f1d7b8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# IDEs and editors +.vs/ +obj/ +bin/ +aspnet-core/src/MeetingSchedule.Web.Host/App_Data/Logs/ +aspnet-core/src/MeetingSchedule.Web.Mvc/App_Data/Logs/ +aspnet-core/src/MeetingSchedule.Migrator/Logs/Logs.txt diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..36263a6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 ASP.NET Boilerplate + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..103bcee --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +# Important + +Issues of this repository are tracked on https://github.com/aspnetboilerplate/aspnetboilerplate. Please create your issues on https://github.com/aspnetboilerplate/aspnetboilerplate/issues. + +# Introduction + +This is a template to create **ASP.NET Core MVC / Angular** based startup projects for [ASP.NET Boilerplate](https://aspnetboilerplate.com/Pages/Documents). It has 2 different versions: + +1. [ASP.NET Core MVC & jQuery](https://aspnetboilerplate.com/Pages/Documents/Zero/Startup-Template-Core) (server rendered multi-page application). +2. [ASP.NET Core & Angular](https://aspnetboilerplate.com/Pages/Documents/Zero/Startup-Template-Angular) (single page application). + +User Interface is based on [AdminLTE theme](https://github.com/ColorlibHQ/AdminLTE). + +# Download + +Create & download your project from https://aspnetboilerplate.com/Templates + +# Screenshots + +#### Sample Dashboard Page +![](_screenshots/module-zero-core-template-ui-home.png) + +#### User Creation Modal +![](_screenshots/module-zero-core-template-ui-user-create-modal.png) + +#### Login Page + +![](_screenshots/module-zero-core-template-ui-login.png) + +# Documentation + +* [ASP.NET Core MVC & jQuery version.](https://aspnetboilerplate.com/Pages/Documents/Zero/Startup-Template-Core) +* [ASP.NET Core & Angular version.](https://aspnetboilerplate.com/Pages/Documents/Zero/Startup-Template-Angular) + +# License + +[MIT](LICENSE). diff --git a/_screenshots/ui-home.png b/_screenshots/ui-home.png new file mode 100644 index 0000000000000000000000000000000000000000..0e6c4ee618755c6cbfd7dfa4dda4f470436f8f23 GIT binary patch literal 102875 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 bz!pA_JF|J%U+`%C?4Lj9{A1}4SK|Kz6G-Ii literal 0 HcmV?d00001 diff --git a/_screenshots/ui-user-create-modal.png b/_screenshots/ui-user-create-modal.png new file mode 100644 index 0000000000000000000000000000000000000000..eb0804534619eebc70ef7e3ca7076f78de8272d0 GIT binary patch literal 71885 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 E0j3DqZvX%Q literal 0 HcmV?d00001 diff --git a/angular/.browserslistrc b/angular/.browserslistrc new file mode 100644 index 0000000..8084853 --- /dev/null +++ b/angular/.browserslistrc @@ -0,0 +1,12 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/angular/.editorconfig b/angular/.editorconfig new file mode 100644 index 0000000..8143244 --- /dev/null +++ b/angular/.editorconfig @@ -0,0 +1,12 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/angular/.gitignore b/angular/.gitignore new file mode 100644 index 0000000..213af88 --- /dev/null +++ b/angular/.gitignore @@ -0,0 +1,43 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +.vs/ +[Oo]bj/ +bin/ + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage/* +/libpeerconnection.log +npm-debug.log +testem.log +/typings + +# e2e +/e2e/*.js +/e2e/*.map + +#System Files +.DS_Store +Thumbs.db diff --git a/angular/.vscode/launch.json b/angular/.vscode/launch.json new file mode 100644 index 0000000..e820551 --- /dev/null +++ b/angular/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://localhost:4200", + "sourceMaps": true, + "webRoot": "${workspaceFolder}" + } + ] +} diff --git a/angular/Dockerfile b/angular/Dockerfile new file mode 100644 index 0000000..cc66541 --- /dev/null +++ b/angular/Dockerfile @@ -0,0 +1,3 @@ +FROM nginx + +COPY . /usr/share/nginx/html \ No newline at end of file diff --git a/angular/MeetingSchedule.AngularUI.csproj b/angular/MeetingSchedule.AngularUI.csproj new file mode 100644 index 0000000..d25a343 --- /dev/null +++ b/angular/MeetingSchedule.AngularUI.csproj @@ -0,0 +1,24 @@ + + + net6.0 + angular + angular + + + + + + + + + + + PreserveNewest + + + + + Always + + + \ No newline at end of file diff --git a/angular/MeetingSchedule.AngularUI.sln b/angular/MeetingSchedule.AngularUI.sln new file mode 100644 index 0000000..fdae947 --- /dev/null +++ b/angular/MeetingSchedule.AngularUI.sln @@ -0,0 +1,33 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26228.4 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MeetingSchedule.AngularUI", "MeetingSchedule.AngularUI.csproj", "{11BD8782-23F0-45A0-9A00-A213373B0F5D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {11BD8782-23F0-45A0-9A00-A213373B0F5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {11BD8782-23F0-45A0-9A00-A213373B0F5D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {11BD8782-23F0-45A0-9A00-A213373B0F5D}.Debug|x64.ActiveCfg = Debug|Any CPU + {11BD8782-23F0-45A0-9A00-A213373B0F5D}.Debug|x64.Build.0 = Debug|Any CPU + {11BD8782-23F0-45A0-9A00-A213373B0F5D}.Debug|x86.ActiveCfg = Debug|Any CPU + {11BD8782-23F0-45A0-9A00-A213373B0F5D}.Debug|x86.Build.0 = Debug|Any CPU + {11BD8782-23F0-45A0-9A00-A213373B0F5D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {11BD8782-23F0-45A0-9A00-A213373B0F5D}.Release|Any CPU.Build.0 = Release|Any CPU + {11BD8782-23F0-45A0-9A00-A213373B0F5D}.Release|x64.ActiveCfg = Release|Any CPU + {11BD8782-23F0-45A0-9A00-A213373B0F5D}.Release|x64.Build.0 = Release|Any CPU + {11BD8782-23F0-45A0-9A00-A213373B0F5D}.Release|x86.ActiveCfg = Release|Any CPU + {11BD8782-23F0-45A0-9A00-A213373B0F5D}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/angular/Properties/launchSettings.json b/angular/Properties/launchSettings.json new file mode 100644 index 0000000..c7c4125 --- /dev/null +++ b/angular/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:14424/", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "MeetingSchedule.AngularUI": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/angular/README.md b/angular/README.md new file mode 100644 index 0000000..a6639aa --- /dev/null +++ b/angular/README.md @@ -0,0 +1,27 @@ +# MeetingScheduleTemplate + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.0.0-beta.31. + +## Development server +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive/pipe/service/class/module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). +Before running the tests make sure you are serving the app via `ng serve`. + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/angular/angular.json b/angular/angular.json new file mode 100644 index 0000000..84ac19c --- /dev/null +++ b/angular/angular.json @@ -0,0 +1,205 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "MeetingSchedule": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "tsConfig": "src/tsconfig.json", + "polyfills": "src/polyfills.ts", + "assets": [ + "src/assets", + "src/favicon.ico", + { + "glob": "abp.signalr.js", + "input": "node_modules/abp-web-resources/Abp/Framework/scripts/libs", + "output": "/assets/abp" + }, + { + "glob": "abp.signalr-client.js", + "input": "node_modules/abp-web-resources/Abp/Framework/scripts/libs", + "output": "/assets/abp" + } + ], + "styles": [ + "node_modules/famfamfam-flags/dist/sprite/famfamfam-flags.css", + "node_modules/sweetalert2/dist/sweetalert2.css", + "src/assets/freeze-ui/freeze-ui.css", + "node_modules/@fortawesome/fontawesome-free/css/all.min.css", + "node_modules/admin-lte-css-only/css/adminlte.min.css", + "src/shared/core.less" + ], + "scripts": [ + "node_modules/moment/min/moment.min.js", + "node_modules/@aspnet/signalr/dist/browser/signalr.min.js", + "node_modules/sweetalert2/dist/sweetalert2.js", + "src/assets/freeze-ui/freeze-ui.js", + "node_modules/push.js/bin/push.min.js", + "node_modules/abp-web-resources/Abp/Framework/scripts/abp.js", + "src/assets/abp-web-resources/abp.sweet-alert.js", + "src/assets/abp-web-resources/abp.freeze-ui.js", + "node_modules/abp-web-resources/Abp/Framework/scripts/libs/abp.moment.js" + ], + "vendorChunk": true, + "extractLicenses": false, + "buildOptimizer": false, + "sourceMap": true, + "optimization": false, + "namedChunks": true + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "anyComponentStyle", + "maximumWarning": "6kb" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ] + }, + "hmr": { + "budgets": [ + { + "type": "anyComponentStyle", + "maximumWarning": "6kb" + } + ], + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.hmr.ts" + } + ] + } + }, + "defaultConfiguration": "" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "MeetingSchedule:build" + }, + "configurations": { + "production": { + "browserTarget": "MeetingSchedule:build:production" + }, + "hmr": { + "browserTarget": "MeetingSchedule:build:hmr" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "MeetingSchedule:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "karmaConfig": "./karma.conf.js", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.spec.json", + "assets": [ + "src/assets", + "src/favicon.ico", + { + "glob": "abp.signalr.js", + "input": "node_modules/abp-web-resources/Abp/Framework/scripts/libs", + "output": "/assets/abp" + }, + { + "glob": "abp.signalr-client.js", + "input": "node_modules/abp-web-resources/Abp/Framework/scripts/libs", + "output": "/assets/abp" + } + ], + "styles": [ + "node_modules/famfamfam-flags/dist/sprite/famfamfam-flags.css", + "node_modules/sweetalert2/dist/sweetalert2.css", + "src/assets/freeze-ui/freeze-ui.css", + "node_modules/@fortawesome/fontawesome-free/css/all.min.css", + "node_modules/admin-lte-css-only/css/adminlte.min.css", + "src/shared/core.less" + ], + "scripts": [ + "node_modules/moment/min/moment.min.js", + "node_modules/@aspnet/signalr/dist/browser/signalr.min.js", + "node_modules/sweetalert2/dist/sweetalert2.js", + "src/assets/freeze-ui/freeze-ui.js", + "node_modules/push.js/bin/push.min.js", + "node_modules/abp-web-resources/Abp/Framework/scripts/abp.js", + "src/assets/abp-web-resources/abp.sweet-alert.js", + "src/assets/abp-web-resources/abp.freeze-ui.js", + "node_modules/abp-web-resources/Abp/Framework/scripts/libs/abp.moment.js" + ] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "src/tsconfig.json" + ], + "exclude": [] + } + } + } + }, + "MeetingSchedule-e2e": { + "root": "", + "sourceRoot": "", + "projectType": "application", + "architect": { + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "./protractor.conf.js", + "devServerTarget": "MeetingSchedule:serve" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "e2e/tsconfig.json" + ], + "exclude": [] + } + } + } + } + }, + "defaultProject": "MeetingSchedule", + "schematics": { + "@schematics/angular:component": { + "prefix": "app", + "style": "css" + }, + "@schematics/angular:directive": { + "prefix": "app" + } + } +} diff --git a/angular/app.config b/angular/app.config new file mode 100644 index 0000000..49aadfa --- /dev/null +++ b/angular/app.config @@ -0,0 +1,5 @@ + + + + + diff --git a/angular/e2e/app.e2e-spec.ts b/angular/e2e/app.e2e-spec.ts new file mode 100644 index 0000000..813e3a8 --- /dev/null +++ b/angular/e2e/app.e2e-spec.ts @@ -0,0 +1,14 @@ +import { MeetingScheduleTemplatePage } from './app.po'; + +describe('MeetingSchedule App', function() { + let page: MeetingScheduleTemplatePage; + + beforeEach(() => { + page = new MeetingScheduleTemplatePage(); + }); + + it('should display message saying app works', () => { + page.navigateTo(); + expect(page.getParagraphText()).toEqual('app works!'); + }); +}); diff --git a/angular/e2e/app.po.ts b/angular/e2e/app.po.ts new file mode 100644 index 0000000..dcb94ef --- /dev/null +++ b/angular/e2e/app.po.ts @@ -0,0 +1,11 @@ +import { browser, element, by } from 'protractor'; + +export class MeetingScheduleTemplatePage { + navigateTo() { + return browser.get('/'); + } + + getParagraphText() { + return element(by.css('app-root h1')).getText(); + } +} diff --git a/angular/e2e/tsconfig.json b/angular/e2e/tsconfig.json new file mode 100644 index 0000000..904a991 --- /dev/null +++ b/angular/e2e/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "declaration": false, + "experimentalDecorators": true, + "lib": [ + "es2016" + ], + "module": "commonjs", + "moduleResolution": "node", + "outDir": "../dist/out-tsc-e2e", + "sourceMap": true, + "target": "es6", + "typeRoots": [ + "../node_modules/@types" + ], + "baseUrl": ".", + "paths": { + "@abp/*": [ "../node_modules/abp-ng2-module/dist/src/*" ], + "@app/*": [ "./app/*" ], + "@shared/*": [ "./shared/*" ], + "@node_modules/*": [ "../node_modules/*" ] + } + }, + "files": [ + "../src/polyfills.ts", + "../src/test.ts" + ], +} diff --git a/angular/karma.conf.js b/angular/karma.conf.js new file mode 100644 index 0000000..1a4c021 --- /dev/null +++ b/angular/karma.conf.js @@ -0,0 +1,41 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/0.13/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + files: [ + + ], + preprocessors: { + + }, + mime: { + 'text/x-typescript': ['ts','tsx'] + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ], + fixWebpackSourcePaths: true + }, + angularCli: { + config: './.angular-cli.json', + environment: 'dev' + }, + reporters: config.angularCli && config.angularCli.codeCoverage + ? ['progress', 'coverage-istanbul'] + : ['progress'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; diff --git a/angular/nswag/refresh.bat b/angular/nswag/refresh.bat new file mode 100644 index 0000000..02d2a59 --- /dev/null +++ b/angular/nswag/refresh.bat @@ -0,0 +1 @@ +"..\node_modules\.bin\nswag" run \ No newline at end of file diff --git a/angular/nswag/service.config.nswag b/angular/nswag/service.config.nswag new file mode 100644 index 0000000..bf7ad01 --- /dev/null +++ b/angular/nswag/service.config.nswag @@ -0,0 +1,209 @@ +{ + "runtime": "Default", + "defaultVariables": null, + "documentGenerator": { + "fromDocument": { + "url": "https://localhost:44311/swagger/v1/swagger.json", + "output": null + } + }, + "codeGenerators": { + "openApiToTypeScriptClient": { + "className": "{controller}ServiceProxy", + "moduleName": "", + "namespace": "", + "typeScriptVersion": 2.0, + "template": "Angular", + "promiseType": "Promise", + "httpClass": "HttpClient", + "useSingletonProvider": false, + "injectionTokenType": "InjectionToken", + "rxJsVersion": 6.0, + "dateTimeType": "MomentJS", + "nullValue": "Undefined", + "generateClientClasses": true, + "generateClientInterfaces": false, + "generateOptionalParameters": false, + "exportTypes": true, + "wrapDtoExceptions": false, + "exceptionClass": "ApiException", + "clientBaseClass": null, + "wrapResponses": false, + "wrapResponseMethods": [], + "generateResponseClasses": true, + "responseClass": "SwaggerResponse", + "protectedMethods": [], + "configurationClass": null, + "useTransformOptionsMethod": false, + "useTransformResultMethod": false, + "generateDtoTypes": true, + "operationGenerationMode": "MultipleClientsFromPathSegments", + "markOptionalProperties": false, + "generateCloneMethod": true, + "typeStyle": "Class", + "classTypes": [], + "extendedClasses": [], + "extensionCode": null, + "generateDefaultValues": true, + "excludedTypeNames": [], + "excludedParameterNames": [], + "handleReferences": false, + "generateConstructorInterface": true, + "convertConstructorInterfaceData": false, + "importRequiredTypes": true, + "useGetBaseUrlMethod": false, + "baseUrlTokenName": "API_BASE_URL", + "queryNullValue": "", + "inlineNamedDictionaries": false, + "inlineNamedAny": false, + "templateDirectory": null, + "typeNameGeneratorType": null, + "propertyNameGeneratorType": null, + "enumNameGeneratorType": null, + "serviceHost": null, + "serviceSchemes": null, + "output": "../src/shared/service-proxies/service-proxies.ts" + }, + "openApiToCSharpClient": { + "clientBaseClass": null, + "configurationClass": null, + "generateClientClasses": true, + "generateClientInterfaces": false, + "injectHttpClient": false, + "disposeHttpClient": true, + "protectedMethods": [], + "generateExceptionClasses": true, + "exceptionClass": "SwaggerException", + "wrapDtoExceptions": true, + "useHttpClientCreationMethod": false, + "httpClientType": "System.Net.Http.HttpClient", + "useHttpRequestMessageCreationMethod": false, + "useBaseUrl": true, + "generateBaseUrlProperty": true, + "generateSyncMethods": false, + "exposeJsonSerializerSettings": false, + "clientClassAccessModifier": "public", + "typeAccessModifier": "public", + "generateContractsOutput": false, + "contractsNamespace": null, + "contractsOutputFilePath": null, + "parameterDateTimeFormat": "s", + "generateUpdateJsonSerializerSettingsMethod": true, + "serializeTypeInformation": false, + "queryNullValue": "", + "className": "{controller}Client", + "operationGenerationMode": "MultipleClientsFromOperationId", + "additionalNamespaceUsages": [], + "additionalContractNamespaceUsages": [], + "generateOptionalParameters": false, + "generateJsonMethods": true, + "enforceFlagEnums": false, + "parameterArrayType": "System.Collections.Generic.IEnumerable", + "parameterDictionaryType": "System.Collections.Generic.IDictionary", + "responseArrayType": "System.Collections.ObjectModel.ObservableCollection", + "responseDictionaryType": "System.Collections.Generic.Dictionary", + "wrapResponses": false, + "wrapResponseMethods": [], + "generateResponseClasses": true, + "responseClass": "SwaggerResponse", + "namespace": "MyNamespace", + "requiredPropertiesMustBeDefined": true, + "dateType": "System.DateTime", + "jsonConverters": null, + "anyType": "object", + "dateTimeType": "System.DateTime", + "timeType": "System.TimeSpan", + "timeSpanType": "System.TimeSpan", + "arrayType": "System.Collections.ObjectModel.ObservableCollection", + "arrayInstanceType": "System.Collections.ObjectModel.Collection", + "dictionaryType": "System.Collections.Generic.Dictionary", + "dictionaryInstanceType": "System.Collections.Generic.Dictionary", + "arrayBaseType": "System.Collections.ObjectModel.ObservableCollection", + "dictionaryBaseType": "System.Collections.Generic.Dictionary", + "classStyle": "Inpc", + "generateDefaultValues": true, + "generateDataAnnotations": true, + "excludedTypeNames": [], + "excludedParameterNames": [], + "handleReferences": false, + "generateImmutableArrayProperties": false, + "generateImmutableDictionaryProperties": false, + "jsonSerializerSettingsTransformationMethod": null, + "inlineNamedArrays": false, + "inlineNamedDictionaries": false, + "inlineNamedTuples": true, + "inlineNamedAny": false, + "generateDtoTypes": true, + "generateOptionalPropertiesAsNullable": false, + "templateDirectory": null, + "typeNameGeneratorType": null, + "propertyNameGeneratorType": null, + "enumNameGeneratorType": null, + "serviceHost": null, + "serviceSchemes": null, + "output": null + }, + "openApiToCSharpController": { + "controllerBaseClass": null, + "controllerStyle": "Partial", + "controllerTarget": "AspNet", + "useCancellationToken": false, + "useActionResultType": false, + "generateModelValidationAttributes": false, + "routeNamingStrategy": "None", + "className": "{controller}", + "operationGenerationMode": "MultipleClientsFromOperationId", + "additionalNamespaceUsages": [ + "System.Web.Http" + ], + "additionalContractNamespaceUsages": [], + "generateOptionalParameters": false, + "generateJsonMethods": true, + "enforceFlagEnums": false, + "parameterArrayType": "System.Collections.Generic.IEnumerable", + "parameterDictionaryType": "System.Collections.Generic.IDictionary", + "responseArrayType": "System.Collections.ObjectModel.ObservableCollection", + "responseDictionaryType": "System.Collections.Generic.Dictionary", + "wrapResponses": false, + "wrapResponseMethods": [], + "generateResponseClasses": true, + "responseClass": "SwaggerResponse", + "namespace": "MyNamespace", + "requiredPropertiesMustBeDefined": true, + "dateType": "System.DateTime", + "jsonConverters": null, + "anyType": "object", + "dateTimeType": "System.DateTime", + "timeType": "System.TimeSpan", + "timeSpanType": "System.TimeSpan", + "arrayType": "System.Collections.Generic.IEnumerable", + "arrayInstanceType": "System.Collections.ObjectModel.Collection", + "dictionaryType": "System.Collections.Generic.Dictionary", + "dictionaryInstanceType": "System.Collections.Generic.Dictionary", + "arrayBaseType": "System.Collections.ObjectModel.ObservableCollection", + "dictionaryBaseType": "System.Collections.Generic.Dictionary", + "classStyle": "Inpc", + "generateDefaultValues": true, + "generateDataAnnotations": true, + "excludedTypeNames": [], + "excludedParameterNames": [], + "handleReferences": false, + "generateImmutableArrayProperties": false, + "generateImmutableDictionaryProperties": false, + "jsonSerializerSettingsTransformationMethod": null, + "inlineNamedArrays": false, + "inlineNamedDictionaries": false, + "inlineNamedTuples": true, + "inlineNamedAny": false, + "generateDtoTypes": true, + "generateOptionalPropertiesAsNullable": false, + "templateDirectory": null, + "typeNameGeneratorType": null, + "propertyNameGeneratorType": null, + "enumNameGeneratorType": null, + "serviceHost": null, + "serviceSchemes": null, + "output": null + } + } +} \ No newline at end of file diff --git a/angular/package.json b/angular/package.json new file mode 100644 index 0000000..1b63ae5 --- /dev/null +++ b/angular/package.json @@ -0,0 +1,70 @@ +{ + "name": "MeetingSchedule", + "version": "4.7.1", + "private": true, + "license": "MIT", + "scripts": { + "pree2e": "webdriver-manager update --standalone false --gecko false", + "e2e": "protractor", + "hmr": "ng serve --host 0.0.0.0 --port 4200 --hmr", + "lint": "tslint --force --project src/tsconfig.json src/**/*.ts -t verbose", + "ng": "ng", + "start": "ng serve --host 0.0.0.0 --port 4200", + "test": "ng test" + }, + "dependencies": { + "@angular/animations": "^12.0.5", + "@angular/common": "^12.0.5", + "@angular/compiler": "^12.0.5", + "@angular/core": "^12.0.5", + "@angular/forms": "^12.0.5", + "@angular/platform-browser": "^12.0.5", + "@angular/platform-browser-dynamic": "^12.0.5", + "@angular/router": "^12.0.5", + "@aspnet/signalr": "^1.1.4", + "@fortawesome/fontawesome-free": "^5.15.3", + "abp-ng2-module": "^6.2.0", + "abp-web-resources": "^5.3.0", + "admin-lte-css-only": "^3.1.0", + "core-js": "^3.2.1", + "famfamfam-flags": "^1.0.0", + "lodash-es": "^4.17.15", + "moment": "2.24.0", + "moment-timezone": "0.5.33", + "ngx-bootstrap": "^5.6.1", + "ngx-pagination": "^5.0.0", + "push.js": "1.0.12", + "rxjs": "^6.4.0", + "sweetalert2": "^10.15.6", + "ts-helpers": "^1.1.2", + "tslib": "^2.0.0", + "web-animations-js": "^2.3.2", + "zone.js": "~0.11.4" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~12.0.5", + "@angular/cli": "^12.0.5", + "@angular/compiler-cli": "^12.0.5", + "@angularclass/hmr": "^2.1.3", + "@types/jasmine": "~3.6.0", + "@types/lodash-es": "^4.17.3", + "@types/moment-timezone": "^0.5.30", + "@types/node": "^13.13.4", + "codelyzer": "^6.0.0", + "jasmine-core": "~3.6.0", + "jasmine-spec-reporter": "~5.0.0", + "karma": "~6.3.4", + "karma-chrome-launcher": "~3.1.0", + "karma-cli": "^2.0.0", + "karma-coverage-istanbul-reporter": "~3.0.2", + "karma-jasmine": "~4.0.0", + "karma-jasmine-html-reporter": "^1.5.0", + "nswag": "^13.4.2", + "protractor": "~7.0.0", + "ts-node": "^8.10.1", + "tslint": "~6.1.0", + "typescript": "4.2.4", + "webpack-bundle-analyzer": "^3.7.0" + }, + "angular-cli": {} +} diff --git a/angular/protractor.conf.js b/angular/protractor.conf.js new file mode 100644 index 0000000..ffded70 --- /dev/null +++ b/angular/protractor.conf.js @@ -0,0 +1,32 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +/*global jasmine */ +var SpecReporter = require('jasmine-spec-reporter'); + +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './e2e/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + useAllAngular2AppRoots: true, + beforeLaunch: function() { + require('ts-node').register({ + project: 'e2e' + }); + }, + onPrepare: function() { + jasmine.getEnv().addReporter(new SpecReporter()); + } +}; diff --git a/angular/src/account/account-routing.module.ts b/angular/src/account/account-routing.module.ts new file mode 100644 index 0000000..108f0f7 --- /dev/null +++ b/angular/src/account/account-routing.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { LoginComponent } from './login/login.component'; +import { RegisterComponent } from './register/register.component'; +import { AccountComponent } from './account.component'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { + path: '', + component: AccountComponent, + children: [ + { path: 'login', component: LoginComponent }, + { path: 'register', component: RegisterComponent } + ] + } + ]) + ], + exports: [ + RouterModule + ] +}) +export class AccountRoutingModule { } diff --git a/angular/src/account/account.component.html b/angular/src/account/account.component.html new file mode 100644 index 0000000..4f34cfe --- /dev/null +++ b/angular/src/account/account.component.html @@ -0,0 +1,15 @@ + diff --git a/angular/src/account/account.component.ts b/angular/src/account/account.component.ts new file mode 100644 index 0000000..855fa1b --- /dev/null +++ b/angular/src/account/account.component.ts @@ -0,0 +1,26 @@ +import { + Component, + OnInit, + ViewEncapsulation, + Injector, + Renderer2 +} from '@angular/core'; +import { AppComponentBase } from '@shared/app-component-base'; + +@Component({ + templateUrl: './account.component.html', + encapsulation: ViewEncapsulation.None +}) +export class AccountComponent extends AppComponentBase implements OnInit { + constructor(injector: Injector, private renderer: Renderer2) { + super(injector); + } + + showTenantChange(): boolean { + return abp.multiTenancy.isEnabled; + } + + ngOnInit(): void { + this.renderer.addClass(document.body, 'login-page'); + } +} diff --git a/angular/src/account/account.module.ts b/angular/src/account/account.module.ts new file mode 100644 index 0000000..478c284 --- /dev/null +++ b/angular/src/account/account.module.ts @@ -0,0 +1,50 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { HttpClientJsonpModule } from '@angular/common/http'; +import { HttpClientModule } from '@angular/common/http'; +import { ModalModule } from 'ngx-bootstrap/modal'; +import { AccountRoutingModule } from './account-routing.module'; +import { ServiceProxyModule } from '@shared/service-proxies/service-proxy.module'; +import { SharedModule } from '@shared/shared.module'; +import { AccountComponent } from './account.component'; +import { LoginComponent } from './login/login.component'; +import { RegisterComponent } from './register/register.component'; +import { AccountLanguagesComponent } from './layout/account-languages.component'; +import { AccountHeaderComponent } from './layout/account-header.component'; +import { AccountFooterComponent } from './layout/account-footer.component'; + +// tenants +import { TenantChangeComponent } from './tenant/tenant-change.component'; +import { TenantChangeDialogComponent } from './tenant/tenant-change-dialog.component'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + HttpClientModule, + HttpClientJsonpModule, + SharedModule, + ServiceProxyModule, + AccountRoutingModule, + ModalModule.forChild() + ], + declarations: [ + AccountComponent, + LoginComponent, + RegisterComponent, + AccountLanguagesComponent, + AccountHeaderComponent, + AccountFooterComponent, + // tenant + TenantChangeComponent, + TenantChangeDialogComponent, + ], + entryComponents: [ + // tenant + TenantChangeDialogComponent + ] +}) +export class AccountModule { + +} diff --git a/angular/src/account/layout/account-footer.component.html b/angular/src/account/layout/account-footer.component.html new file mode 100644 index 0000000..dc50596 --- /dev/null +++ b/angular/src/account/layout/account-footer.component.html @@ -0,0 +1,9 @@ +
+
+ + Copyright © {{ currentYear }} + {{ "Version" | localize }} + {{ versionText }} + +
+
diff --git a/angular/src/account/layout/account-footer.component.ts b/angular/src/account/layout/account-footer.component.ts new file mode 100644 index 0000000..a8ae963 --- /dev/null +++ b/angular/src/account/layout/account-footer.component.ts @@ -0,0 +1,23 @@ +import { Component, Injector, ChangeDetectionStrategy } from '@angular/core'; +import { AppComponentBase } from '@shared/app-component-base'; + +@Component({ + selector: 'account-footer', + templateUrl: './account-footer.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class AccountFooterComponent extends AppComponentBase { + currentYear: number; + versionText: string; + + constructor(injector: Injector) { + super(injector); + + this.currentYear = new Date().getFullYear(); + this.versionText = + this.appSession.application.version + + ' [' + + this.appSession.application.releaseDate.format('YYYYDDMM') + + ']'; + } +} diff --git a/angular/src/account/layout/account-header.component.html b/angular/src/account/layout/account-header.component.html new file mode 100644 index 0000000..de7616a --- /dev/null +++ b/angular/src/account/layout/account-header.component.html @@ -0,0 +1,3 @@ + diff --git a/angular/src/account/layout/account-header.component.ts b/angular/src/account/layout/account-header.component.ts new file mode 100644 index 0000000..ec46e2d --- /dev/null +++ b/angular/src/account/layout/account-header.component.ts @@ -0,0 +1,8 @@ +import { Component, ChangeDetectionStrategy } from '@angular/core'; + +@Component({ + selector: 'account-header', + templateUrl: './account-header.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class AccountHeaderComponent {} diff --git a/angular/src/account/layout/account-languages.component.html b/angular/src/account/layout/account-languages.component.html new file mode 100644 index 0000000..29901f1 --- /dev/null +++ b/angular/src/account/layout/account-languages.component.html @@ -0,0 +1,18 @@ +
+ + + + + + + +
diff --git a/angular/src/account/layout/account-languages.component.ts b/angular/src/account/layout/account-languages.component.ts new file mode 100644 index 0000000..6068cb2 --- /dev/null +++ b/angular/src/account/layout/account-languages.component.ts @@ -0,0 +1,42 @@ +import { + Component, + OnInit, + Injector, + ChangeDetectionStrategy +} from '@angular/core'; +import { AppComponentBase } from '@shared/app-component-base'; +import { filter as _filter } from 'lodash-es'; + +@Component({ + selector: 'account-languages', + templateUrl: './account-languages.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class AccountLanguagesComponent extends AppComponentBase + implements OnInit { + languages: abp.localization.ILanguageInfo[]; + currentLanguage: abp.localization.ILanguageInfo; + + constructor(injector: Injector) { + super(injector); + } + + ngOnInit() { + this.languages = _filter( + this.localization.languages, + (l) => !l.isDisabled + ); + this.currentLanguage = this.localization.currentLanguage; + } + + changeLanguage(languageName: string): void { + abp.utils.setCookieValue( + 'Abp.Localization.CultureName', + languageName, + new Date(new Date().getTime() + 5 * 365 * 86400000), // 5 year + abp.appPath + ); + + location.reload(); + } +} diff --git a/angular/src/account/login/login.component.html b/angular/src/account/login/login.component.html new file mode 100644 index 0000000..69f20ec --- /dev/null +++ b/angular/src/account/login/login.component.html @@ -0,0 +1,83 @@ +
+

{{ "LogIn" | localize }}

+
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+
+ + +
+
+
+ +
+
+
+

+ + {{ "Register" | localize }} + +

+
diff --git a/angular/src/account/login/login.component.ts b/angular/src/account/login/login.component.ts new file mode 100644 index 0000000..6638fc3 --- /dev/null +++ b/angular/src/account/login/login.component.ts @@ -0,0 +1,38 @@ +import { Component, Injector } from '@angular/core'; +import { AbpSessionService } from 'abp-ng2-module'; +import { AppComponentBase } from '@shared/app-component-base'; +import { accountModuleAnimation } from '@shared/animations/routerTransition'; +import { AppAuthService } from '@shared/auth/app-auth.service'; + +@Component({ + templateUrl: './login.component.html', + animations: [accountModuleAnimation()] +}) +export class LoginComponent extends AppComponentBase { + submitting = false; + + constructor( + injector: Injector, + public authService: AppAuthService, + private _sessionService: AbpSessionService + ) { + super(injector); + } + + get multiTenancySideIsTeanant(): boolean { + return this._sessionService.tenantId > 0; + } + + get isSelfRegistrationAllowed(): boolean { + if (!this._sessionService.tenantId) { + return false; + } + + return true; + } + + login(): void { + this.submitting = true; + this.authService.authenticate(() => (this.submitting = false)); + } +} diff --git a/angular/src/account/register/register.component.html b/angular/src/account/register/register.component.html new file mode 100644 index 0000000..b1fe1b0 --- /dev/null +++ b/angular/src/account/register/register.component.html @@ -0,0 +1,147 @@ +
+

{{ "Register" | localize }}

+
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+
diff --git a/angular/src/account/register/register.component.ts b/angular/src/account/register/register.component.ts new file mode 100644 index 0000000..0b30cf3 --- /dev/null +++ b/angular/src/account/register/register.component.ts @@ -0,0 +1,55 @@ +import { Component, Injector } from '@angular/core'; +import { Router } from '@angular/router'; +import { finalize } from 'rxjs/operators'; +import { AppComponentBase } from '@shared/app-component-base'; +import { + AccountServiceProxy, + RegisterInput, + RegisterOutput +} from '@shared/service-proxies/service-proxies'; +import { accountModuleAnimation } from '@shared/animations/routerTransition'; +import { AppAuthService } from '@shared/auth/app-auth.service'; + +@Component({ + templateUrl: './register.component.html', + animations: [accountModuleAnimation()] +}) +export class RegisterComponent extends AppComponentBase { + model: RegisterInput = new RegisterInput(); + saving = false; + + constructor( + injector: Injector, + private _accountService: AccountServiceProxy, + private _router: Router, + private authService: AppAuthService + ) { + super(injector); + } + + save(): void { + this.saving = true; + this._accountService + .register(this.model) + .pipe( + finalize(() => { + this.saving = false; + }) + ) + .subscribe((result: RegisterOutput) => { + if (!result.canLogin) { + this.notify.success(this.l('SuccessfullyRegistered')); + this._router.navigate(['/login']); + return; + } + + // Autheticate + this.saving = true; + this.authService.authenticateModel.userNameOrEmailAddress = this.model.userName; + this.authService.authenticateModel.password = this.model.password; + this.authService.authenticate(() => { + this.saving = false; + }); + }); + } +} diff --git a/angular/src/account/tenant/tenant-change-dialog.component.html b/angular/src/account/tenant/tenant-change-dialog.component.html new file mode 100644 index 0000000..e31d73b --- /dev/null +++ b/angular/src/account/tenant/tenant-change-dialog.component.html @@ -0,0 +1,37 @@ +
+ + + +
diff --git a/angular/src/account/tenant/tenant-change-dialog.component.ts b/angular/src/account/tenant/tenant-change-dialog.component.ts new file mode 100644 index 0000000..95a7d9f --- /dev/null +++ b/angular/src/account/tenant/tenant-change-dialog.component.ts @@ -0,0 +1,60 @@ +import { Component, Injector } from '@angular/core'; +import { BsModalRef } from 'ngx-bootstrap/modal'; +import { AppComponentBase } from '@shared/app-component-base'; +import { AccountServiceProxy } from '@shared/service-proxies/service-proxies'; +import { AppTenantAvailabilityState } from '@shared/AppEnums'; +import { + IsTenantAvailableInput, + IsTenantAvailableOutput +} from '@shared/service-proxies/service-proxies'; + +@Component({ + templateUrl: './tenant-change-dialog.component.html' +}) +export class TenantChangeDialogComponent extends AppComponentBase { + saving = false; + tenancyName = ''; + + constructor( + injector: Injector, + private _accountService: AccountServiceProxy, + public bsModalRef: BsModalRef + ) { + super(injector); + } + + save(): void { + if (!this.tenancyName) { + abp.multiTenancy.setTenantIdCookie(undefined); + this.bsModalRef.hide(); + location.reload(); + return; + } + + const input = new IsTenantAvailableInput(); + input.tenancyName = this.tenancyName; + + this.saving = true; + this._accountService.isTenantAvailable(input).subscribe( + (result: IsTenantAvailableOutput) => { + switch (result.state) { + case AppTenantAvailabilityState.Available: + abp.multiTenancy.setTenantIdCookie(result.tenantId); + location.reload(); + return; + case AppTenantAvailabilityState.InActive: + this.message.warn(this.l('TenantIsNotActive', this.tenancyName)); + break; + case AppTenantAvailabilityState.NotFound: + this.message.warn( + this.l('ThereIsNoTenantDefinedWithName{0}', this.tenancyName) + ); + break; + } + }, + () => { + this.saving = false; + } + ); + } +} diff --git a/angular/src/account/tenant/tenant-change.component.html b/angular/src/account/tenant/tenant-change.component.html new file mode 100644 index 0000000..d1da410 --- /dev/null +++ b/angular/src/account/tenant/tenant-change.component.html @@ -0,0 +1,12 @@ +
+ + {{ "CurrentTenant" | localize }}: + + {{ tenancyName }} + + {{ "NotSelected" | localize }} + ( + {{ "Change" | localize }} ) + +
diff --git a/angular/src/account/tenant/tenant-change.component.ts b/angular/src/account/tenant/tenant-change.component.ts new file mode 100644 index 0000000..e676c35 --- /dev/null +++ b/angular/src/account/tenant/tenant-change.component.ts @@ -0,0 +1,35 @@ +import { Component, OnInit, Injector } from '@angular/core'; +import { AppComponentBase } from '@shared/app-component-base'; +import { TenantChangeDialogComponent } from './tenant-change-dialog.component'; +import { BsModalService } from 'ngx-bootstrap/modal'; + +@Component({ + selector: 'tenant-change', + templateUrl: './tenant-change.component.html' +}) +export class TenantChangeComponent extends AppComponentBase implements OnInit { + tenancyName = ''; + name = ''; + + constructor(injector: Injector, private _modalService: BsModalService) { + super(injector); + } + + get isMultiTenancyEnabled(): boolean { + return abp.multiTenancy.isEnabled; + } + + ngOnInit() { + if (this.appSession.tenant) { + this.tenancyName = this.appSession.tenant.tenancyName; + this.name = this.appSession.tenant.name; + } + } + + showChangeModal(): void { + const modal = this._modalService.show(TenantChangeDialogComponent); + if (this.appSession.tenant) { + modal.content.tenancyName = this.appSession.tenant.tenancyName; + } + } +} diff --git a/angular/src/app-initializer.ts b/angular/src/app-initializer.ts new file mode 100644 index 0000000..5a9c8fc --- /dev/null +++ b/angular/src/app-initializer.ts @@ -0,0 +1,170 @@ +import { Injectable, Injector } from '@angular/core'; +import { PlatformLocation, registerLocaleData } from '@angular/common'; +import { HttpClient } from '@angular/common/http'; +import * as moment from 'moment-timezone'; +import { filter as _filter, merge as _merge } from 'lodash-es'; +import { AppConsts } from '@shared/AppConsts'; +import { AppSessionService } from '@shared/session/app-session.service'; +import { environment } from './environments/environment'; + +@Injectable({ + providedIn: 'root', +}) +export class AppInitializer { + constructor( + private _injector: Injector, + private _platformLocation: PlatformLocation, + private _httpClient: HttpClient + ) { } + + init(): () => Promise { + return () => { + abp.ui.setBusy(); + return new Promise((resolve, reject) => { + AppConsts.appBaseHref = this.getBaseHref(); + const appBaseUrl = this.getDocumentOrigin() + AppConsts.appBaseHref; + this.getApplicationConfig(appBaseUrl, () => { + this.getUserConfiguration(() => { + abp.event.trigger('abp.dynamicScriptsInitialized'); + // do not use constructor injection for AppSessionService + const appSessionService = this._injector.get(AppSessionService); + appSessionService.init().then( + (result) => { + abp.ui.clearBusy(); + if (this.shouldLoadLocale()) { + const angularLocale = this.convertAbpLocaleToAngularLocale( + abp.localization.currentLanguage.name + ); + import(`@angular/common/locales/${angularLocale}.js`).then( + (module) => { + registerLocaleData(module.default); + resolve(result); + }, + reject + ); + } else { + resolve(result); + } + }, + (err) => { + abp.ui.clearBusy(); + reject(err); + } + ); + }); + }); + }); + }; + } + + private getBaseHref(): string { + const baseUrl = this._platformLocation.getBaseHrefFromDOM(); + if (baseUrl) { + return baseUrl; + } + + return '/'; + } + + private getDocumentOrigin(): string { + if (!document.location.origin) { + const port = document.location.port ? ':' + document.location.port : ''; + return ( + document.location.protocol + '//' + document.location.hostname + port + ); + } + + return document.location.origin; + } + + private shouldLoadLocale(): boolean { + return ( + abp.localization.currentLanguage.name && + abp.localization.currentLanguage.name !== 'en-US' + ); + } + + private convertAbpLocaleToAngularLocale(locale: string): string { + if (!AppConsts.localeMappings) { + return locale; + } + + const localeMapings = _filter(AppConsts.localeMappings, { from: locale }); + if (localeMapings && localeMapings.length) { + return localeMapings[0]['to']; + } + + return locale; + } + + private getCurrentClockProvider( + currentProviderName: string + ): abp.timing.IClockProvider { + if (currentProviderName === 'unspecifiedClockProvider') { + return abp.timing.unspecifiedClockProvider; + } + + if (currentProviderName === 'utcClockProvider') { + return abp.timing.utcClockProvider; + } + + return abp.timing.localClockProvider; + } + + private getUserConfiguration(callback: () => void): void { + const cookieLangValue = abp.utils.getCookieValue( + 'Abp.Localization.CultureName' + ); + const token = abp.auth.getToken(); + + const requestHeaders = { + 'Abp.TenantId': `${abp.multiTenancy.getTenantIdCookie()}`, + '.AspNetCore.Culture': `c=${cookieLangValue}|uic=${cookieLangValue}`, + }; + + if (token) { + requestHeaders['Authorization'] = `Bearer ${token}`; + } + + this._httpClient + .get( + `${AppConsts.remoteServiceBaseUrl}/AbpUserConfiguration/GetAll`, + { + headers: requestHeaders, + } + ) + .subscribe((response) => { + const result = response.result; + + _merge(abp, result); + + abp.clock.provider = this.getCurrentClockProvider( + result.clock.provider + ); + + moment.locale(abp.localization.currentLanguage.name); + + if (abp.clock.provider.supportsMultipleTimezone) { + moment.tz.setDefault(abp.timing.timeZoneInfo.iana.timeZoneId); + } + + callback(); + }); + } + + private getApplicationConfig(appRootUrl: string, callback: () => void) { + this._httpClient + .get(`${appRootUrl}assets/${environment.appConfig}`, { + headers: { + 'Abp.TenantId': `${abp.multiTenancy.getTenantIdCookie()}`, + }, + }) + .subscribe((response) => { + AppConsts.appBaseUrl = response.appBaseUrl; + AppConsts.remoteServiceBaseUrl = response.remoteServiceBaseUrl; + AppConsts.localeMappings = response.localeMappings; + + callback(); + }); + } +} diff --git a/angular/src/app/about/about.component.html b/angular/src/app/about/about.component.html new file mode 100644 index 0000000..7e81af2 --- /dev/null +++ b/angular/src/app/about/about.component.html @@ -0,0 +1,136 @@ +
+
+
+
+
+

{{ "About" | localize }}

+
+
+
+
+
+
+
+
+

+ This is a simple startup template based on ASP.NET Boilerplate + framework and Module Zero. If you need an enterprise startup + project, check + + ASP.NET ZERO . +

+

What is ASP.NET Boilerplate?

+

+ ASP.NET Boilerplate is an application framework built on latest + ASP.NET Core framework. It makes easy to use + authorization, dependency injection, validation, exception handling, + localization, logging, caching, background jobs and so on. It's + built on already familiar tools like Entity Framework, AutoMapper, + Castle Windsor... +

+

+ ASP.NET Boilerplate implements + NLayer architecture (Domain, Application, + Infrastructure and Presentation Layers) and + Domain Driven Design (Entities, Repositories, + Domain/Application Services, DTO's...). Also implements and provides + a good infrastructure to implement common software development + best practices. +

+

What is Module Zero?

+

+ ASP.NET Boilerplate framework is designed to be independent of any + database schema and to be as generic as possible. Therefore, It + leaves some concepts + abstract and optional (like audit + logging, permission and setting stores) which requires some + data store. +

+

+ Module Zero implements all fundamental concepts of + ASP.NET Boilerplate framework such as + tenant management + (multi-tenancy), + + role management , + user management, + authorization + ( + permission management ), + setting management, + + language management , + audit logging + and so on. +

+

+ Module-Zero defines entities and implements + domain logic + (domain layer) and leaves application and presentation layers to + you. +

+

Based on Microsoft ASP.NET Core Identity

+

+ Module Zero is based on Microsoft's + ASP.NET Core Identity + library. It extends user and role managers and implements user and + role stores using generic repositories. +

+

Documentation

+ +

Source code

+

+ This template is developed open source on Github. You can contribute + to the template. + https://github.com/aspnetboilerplate/module-zero-core-template +

+
+
+
+
+
diff --git a/angular/src/app/about/about.component.ts b/angular/src/app/about/about.component.ts new file mode 100644 index 0000000..7deb0a4 --- /dev/null +++ b/angular/src/app/about/about.component.ts @@ -0,0 +1,14 @@ +import { Component, Injector, ChangeDetectionStrategy } from '@angular/core'; +import { AppComponentBase } from '@shared/app-component-base'; +import { appModuleAnimation } from '@shared/animations/routerTransition'; + +@Component({ + templateUrl: './about.component.html', + animations: [appModuleAnimation()], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class AboutComponent extends AppComponentBase { + constructor(injector: Injector) { + super(injector); + } +} diff --git a/angular/src/app/app-routing.module.ts b/angular/src/app/app-routing.module.ts new file mode 100644 index 0000000..33d94e2 --- /dev/null +++ b/angular/src/app/app-routing.module.ts @@ -0,0 +1,31 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { AppComponent } from './app.component'; +import { AppRouteGuard } from '@shared/auth/auth-route-guard'; +import { HomeComponent } from './home/home.component'; +import { AboutComponent } from './about/about.component'; +import { UsersComponent } from './users/users.component'; +import { TenantsComponent } from './tenants/tenants.component'; +import { RolesComponent } from 'app/roles/roles.component'; +import { ChangePasswordComponent } from './users/change-password/change-password.component'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { + path: '', + component: AppComponent, + children: [ + { path: 'home', component: HomeComponent, canActivate: [AppRouteGuard] }, + { path: 'users', component: UsersComponent, data: { permission: 'Pages.Users' }, canActivate: [AppRouteGuard] }, + { path: 'roles', component: RolesComponent, data: { permission: 'Pages.Roles' }, canActivate: [AppRouteGuard] }, + { path: 'tenants', component: TenantsComponent, data: { permission: 'Pages.Tenants' }, canActivate: [AppRouteGuard] }, + { path: 'about', component: AboutComponent, canActivate: [AppRouteGuard] }, + { path: 'update-password', component: ChangePasswordComponent, canActivate: [AppRouteGuard] } + ] + } + ]) + ], + exports: [RouterModule] +}) +export class AppRoutingModule { } diff --git a/angular/src/app/app.component.html b/angular/src/app/app.component.html new file mode 100644 index 0000000..27c778a --- /dev/null +++ b/angular/src/app/app.component.html @@ -0,0 +1,9 @@ +
+ + +
+ +
+ + +
diff --git a/angular/src/app/app.component.spec.ts b/angular/src/app/app.component.spec.ts new file mode 100644 index 0000000..20b5192 --- /dev/null +++ b/angular/src/app/app.component.spec.ts @@ -0,0 +1,97 @@ +import { TestBed, async } from "@angular/core/testing"; +import { AppComponent } from "./app.component"; +import { LayoutStoreService } from "../shared/layout/layout-store.service"; +import { AppSessionService } from "../shared/session/app-session.service"; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; + +import { CommonModule } from "@angular/common"; +import { FormsModule, ReactiveFormsModule } from "@angular/forms"; +import { HttpClientJsonpModule } from "@angular/common/http"; +import { HttpClientModule } from "@angular/common/http"; +import { ModalModule } from "ngx-bootstrap/modal"; +import { BsDropdownModule } from "ngx-bootstrap/dropdown"; +import { CollapseModule } from "ngx-bootstrap/collapse"; +import { TabsModule } from "ngx-bootstrap/tabs"; +import { NgxPaginationModule } from "ngx-pagination"; +import { RouterTestingModule } from "@angular/router/testing"; +import { ServiceProxyModule } from "../shared/service-proxies/service-proxy.module"; +import { SharedModule } from "../shared/shared.module"; +import { HomeComponent } from "../app/home/home.component"; +import { AboutComponent } from "../app/about/about.component"; + +// layout +import { HeaderComponent } from "./layout/header.component"; +import { HeaderLeftNavbarComponent } from "./layout/header-left-navbar.component"; +import { HeaderLanguageMenuComponent } from "./layout/header-language-menu.component"; +import { HeaderUserMenuComponent } from "./layout/header-user-menu.component"; +import { FooterComponent } from "./layout/footer.component"; +import { SidebarComponent } from "./layout/sidebar.component"; +import { SidebarLogoComponent } from "./layout/sidebar-logo.component"; +import { SidebarUserPanelComponent } from "./layout/sidebar-user-panel.component"; +import { SidebarMenuComponent } from "./layout/sidebar-menu.component"; + +describe("AppComponent", () => { + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [ + AppComponent, + HomeComponent, + AboutComponent, + + // layout + HeaderComponent, + HeaderLeftNavbarComponent, + HeaderLanguageMenuComponent, + HeaderUserMenuComponent, + FooterComponent, + SidebarComponent, + SidebarLogoComponent, + SidebarUserPanelComponent, + SidebarMenuComponent, + ], + imports: [ + BrowserAnimationsModule, + CommonModule, + FormsModule, + ReactiveFormsModule, + HttpClientModule, + HttpClientJsonpModule, + ModalModule.forChild(), + BsDropdownModule.forRoot(), + CollapseModule.forRoot(), + TabsModule.forRoot(), + RouterTestingModule, + ServiceProxyModule, + SharedModule.forRoot(), + NgxPaginationModule, + ], + providers: [ + LayoutStoreService, + { + provide: AppSessionService, + useValue: { + application: { + version: "", + releaseDate: { + format: function () { + return ""; + }, + }, + }, + getShownLoginName: function(){ + return 'admin'; + } + }, + }, + ], + }); + TestBed.compileComponents(); + }); + + it("should create the app", async(() => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + })); + +}); diff --git a/angular/src/app/app.component.ts b/angular/src/app/app.component.ts new file mode 100644 index 0000000..ce1543d --- /dev/null +++ b/angular/src/app/app.component.ts @@ -0,0 +1,48 @@ +import { Component, Injector, OnInit, Renderer2 } from '@angular/core'; +import { AppComponentBase } from '@shared/app-component-base'; +import { SignalRAspNetCoreHelper } from '@shared/helpers/SignalRAspNetCoreHelper'; +import { LayoutStoreService } from '@shared/layout/layout-store.service'; + +@Component({ + templateUrl: './app.component.html' +}) +export class AppComponent extends AppComponentBase implements OnInit { + sidebarExpanded: boolean; + + constructor( + injector: Injector, + private renderer: Renderer2, + private _layoutStore: LayoutStoreService + ) { + super(injector); + } + + ngOnInit(): void { + this.renderer.addClass(document.body, 'sidebar-mini'); + + SignalRAspNetCoreHelper.initSignalR(); + + abp.event.on('abp.notifications.received', (userNotification) => { + abp.notifications.showUiNotifyForUserNotification(userNotification); + + // Desktop notification + Push.create('AbpZeroTemplate', { + body: userNotification.notification.data.message, + icon: abp.appPath + 'assets/app-logo-small.png', + timeout: 6000, + onClick: function () { + window.focus(); + this.close(); + } + }); + }); + + this._layoutStore.sidebarExpanded.subscribe((value) => { + this.sidebarExpanded = value; + }); + } + + toggleSidebar(): void { + this._layoutStore.setSidebarExpanded(!this.sidebarExpanded); + } +} diff --git a/angular/src/app/app.module.ts b/angular/src/app/app.module.ts new file mode 100644 index 0000000..fcb33fb --- /dev/null +++ b/angular/src/app/app.module.ts @@ -0,0 +1,101 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { HttpClientJsonpModule } from '@angular/common/http'; +import { HttpClientModule } from '@angular/common/http'; +import { ModalModule } from 'ngx-bootstrap/modal'; +import { BsDropdownModule } from 'ngx-bootstrap/dropdown'; +import { CollapseModule } from 'ngx-bootstrap/collapse'; +import { TabsModule } from 'ngx-bootstrap/tabs'; +import { NgxPaginationModule } from 'ngx-pagination'; +import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; +import { ServiceProxyModule } from '@shared/service-proxies/service-proxy.module'; +import { SharedModule } from '@shared/shared.module'; +import { HomeComponent } from '@app/home/home.component'; +import { AboutComponent } from '@app/about/about.component'; +// tenants +import { TenantsComponent } from '@app/tenants/tenants.component'; +import { CreateTenantDialogComponent } from './tenants/create-tenant/create-tenant-dialog.component'; +import { EditTenantDialogComponent } from './tenants/edit-tenant/edit-tenant-dialog.component'; +// roles +import { RolesComponent } from '@app/roles/roles.component'; +import { CreateRoleDialogComponent } from './roles/create-role/create-role-dialog.component'; +import { EditRoleDialogComponent } from './roles/edit-role/edit-role-dialog.component'; +// users +import { UsersComponent } from '@app/users/users.component'; +import { CreateUserDialogComponent } from '@app/users/create-user/create-user-dialog.component'; +import { EditUserDialogComponent } from '@app/users/edit-user/edit-user-dialog.component'; +import { ChangePasswordComponent } from './users/change-password/change-password.component'; +import { ResetPasswordDialogComponent } from './users/reset-password/reset-password.component'; +// layout +import { HeaderComponent } from './layout/header.component'; +import { HeaderLeftNavbarComponent } from './layout/header-left-navbar.component'; +import { HeaderLanguageMenuComponent } from './layout/header-language-menu.component'; +import { HeaderUserMenuComponent } from './layout/header-user-menu.component'; +import { FooterComponent } from './layout/footer.component'; +import { SidebarComponent } from './layout/sidebar.component'; +import { SidebarLogoComponent } from './layout/sidebar-logo.component'; +import { SidebarUserPanelComponent } from './layout/sidebar-user-panel.component'; +import { SidebarMenuComponent } from './layout/sidebar-menu.component'; + +@NgModule({ + declarations: [ + AppComponent, + HomeComponent, + AboutComponent, + // tenants + TenantsComponent, + CreateTenantDialogComponent, + EditTenantDialogComponent, + // roles + RolesComponent, + CreateRoleDialogComponent, + EditRoleDialogComponent, + // users + UsersComponent, + CreateUserDialogComponent, + EditUserDialogComponent, + ChangePasswordComponent, + ResetPasswordDialogComponent, + // layout + HeaderComponent, + HeaderLeftNavbarComponent, + HeaderLanguageMenuComponent, + HeaderUserMenuComponent, + FooterComponent, + SidebarComponent, + SidebarLogoComponent, + SidebarUserPanelComponent, + SidebarMenuComponent + ], + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + HttpClientModule, + HttpClientJsonpModule, + ModalModule.forChild(), + BsDropdownModule, + CollapseModule, + TabsModule, + AppRoutingModule, + ServiceProxyModule, + SharedModule, + NgxPaginationModule, + ], + providers: [], + entryComponents: [ + // tenants + CreateTenantDialogComponent, + EditTenantDialogComponent, + // roles + CreateRoleDialogComponent, + EditRoleDialogComponent, + // users + CreateUserDialogComponent, + EditUserDialogComponent, + ResetPasswordDialogComponent, + ], +}) +export class AppModule {} diff --git a/angular/src/app/home/home.component.html b/angular/src/app/home/home.component.html new file mode 100644 index 0000000..77cc4f3 --- /dev/null +++ b/angular/src/app/home/home.component.html @@ -0,0 +1,296 @@ +
+
+
+
+
+

{{ "HomePage" | localize }}

+
+
+
+
+
+
+
+
+
+
This is a sample Dashboard which doesn't show any server side data. + However, you can develop your own dashboard inspired by this one and its source code.
+
+
+
+
+
+
+
+

8.2k+

+

Stargazers

+
+
+ +
+ + More info + + +
+
+
+
+
+

140+

+

Contributors

+
+
+ +
+ + More info + + +
+
+
+
+
+

1.6k+

+

Used / Dependents

+
+
+ +
+ + More info + + +
+
+
+
+
+

3.1k+

+

Forks

+
+
+ +
+ + More info + + +
+
+
+
+
+
+ + + +
+ Commits + + 6,350+ + +
+
+
+
+
+ + + +
+ Issues + + 170+ + +
+
+
+
+
+
+ + + +
+ Releases + + 200+ + +
+
+
+
+
+ + + +
+ Watching by + + 810+ + +
+
+
+
+
+
+
+
+

Open Issues

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdTitleLabelsDateOpened by
+ + 5452 + + Angular UI migration to AdminLTE 3 + + module-zero-core-template + + + feature + + 11 days agoiyilm4z
+ + 5391 + + + AbpCacheBase should lock the same object for sync and + async + + + bug + + + pull request candidate + + 26 days agoacjh
+ + 5390 + + AbpCache sliding/absolute expire time + + breaking-change + + enhancement + 27 days agoryancyq
+
+
+
+
+
+
+
+
+

Closed Pull Requests

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdTitleMilestoneDateMade by
+ + 5430 + + + Added Dynamic-Parameter-System doc to documentation menu + v5.618 days agomaliming
+ + 5362 + + + Dynamic Parameter Module + v5.425 days agodemirmusa
+ + 4924 + + + ASP.NET Core 3.0 Upgrade + v5.0Oct 15ismcagdas
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/angular/src/app/home/home.component.ts b/angular/src/app/home/home.component.ts new file mode 100644 index 0000000..b0dee43 --- /dev/null +++ b/angular/src/app/home/home.component.ts @@ -0,0 +1,14 @@ +import { Component, Injector, ChangeDetectionStrategy } from '@angular/core'; +import { AppComponentBase } from '@shared/app-component-base'; +import { appModuleAnimation } from '@shared/animations/routerTransition'; + +@Component({ + templateUrl: './home.component.html', + animations: [appModuleAnimation()], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class HomeComponent extends AppComponentBase { + constructor(injector: Injector) { + super(injector); + } +} diff --git a/angular/src/app/layout/footer.component.html b/angular/src/app/layout/footer.component.html new file mode 100644 index 0000000..1d9f36a --- /dev/null +++ b/angular/src/app/layout/footer.component.html @@ -0,0 +1,9 @@ +
+ + Copyright © {{ currentYear }} + MeetingSchedule. + +
+ {{ "Version" | localize }} {{ versionText }} +
+
diff --git a/angular/src/app/layout/footer.component.ts b/angular/src/app/layout/footer.component.ts new file mode 100644 index 0000000..86b3a44 --- /dev/null +++ b/angular/src/app/layout/footer.component.ts @@ -0,0 +1,23 @@ +import { Component, Injector, ChangeDetectionStrategy } from '@angular/core'; +import { AppComponentBase } from '@shared/app-component-base'; + +@Component({ + selector: 'app-footer', + templateUrl: './footer.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class FooterComponent extends AppComponentBase { + currentYear: number; + versionText: string; + + constructor(injector: Injector) { + super(injector); + + this.currentYear = new Date().getFullYear(); + this.versionText = + this.appSession.application.version + + ' [' + + this.appSession.application.releaseDate.format('YYYYDDMM') + + ']'; + } +} diff --git a/angular/src/app/layout/header-language-menu.component.html b/angular/src/app/layout/header-language-menu.component.html new file mode 100644 index 0000000..ad49014 --- /dev/null +++ b/angular/src/app/layout/header-language-menu.component.html @@ -0,0 +1,21 @@ + diff --git a/angular/src/app/layout/header-language-menu.component.ts b/angular/src/app/layout/header-language-menu.component.ts new file mode 100644 index 0000000..dfa416b --- /dev/null +++ b/angular/src/app/layout/header-language-menu.component.ts @@ -0,0 +1,51 @@ +import { + Component, + ChangeDetectionStrategy, + OnInit, + Injector +} from '@angular/core'; +import { AppComponentBase } from '@shared/app-component-base'; +import { + UserServiceProxy, + ChangeUserLanguageDto +} from '@shared/service-proxies/service-proxies'; +import { filter as _filter } from 'lodash-es'; + +@Component({ + selector: 'header-language-menu', + templateUrl: './header-language-menu.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class HeaderLanguageMenuComponent extends AppComponentBase + implements OnInit { + languages: abp.localization.ILanguageInfo[]; + currentLanguage: abp.localization.ILanguageInfo; + + constructor(injector: Injector, private _userService: UserServiceProxy) { + super(injector); + } + + ngOnInit() { + this.languages = _filter( + this.localization.languages, + (l) => !l.isDisabled + ); + this.currentLanguage = this.localization.currentLanguage; + } + + changeLanguage(languageName: string): void { + const input = new ChangeUserLanguageDto(); + input.languageName = languageName; + + this._userService.changeLanguage(input).subscribe(() => { + abp.utils.setCookieValue( + 'Abp.Localization.CultureName', + languageName, + new Date(new Date().getTime() + 5 * 365 * 86400000), // 5 year + abp.appPath + ); + + window.location.reload(); + }); + } +} diff --git a/angular/src/app/layout/header-left-navbar.component.html b/angular/src/app/layout/header-left-navbar.component.html new file mode 100644 index 0000000..86ad412 --- /dev/null +++ b/angular/src/app/layout/header-left-navbar.component.html @@ -0,0 +1,17 @@ + diff --git a/angular/src/app/layout/header-left-navbar.component.ts b/angular/src/app/layout/header-left-navbar.component.ts new file mode 100644 index 0000000..6dc904d --- /dev/null +++ b/angular/src/app/layout/header-left-navbar.component.ts @@ -0,0 +1,23 @@ +import { Component, ChangeDetectionStrategy, OnInit } from '@angular/core'; +import { LayoutStoreService } from '@shared/layout/layout-store.service'; + +@Component({ + selector: 'header-left-navbar', + templateUrl: './header-left-navbar.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class HeaderLeftNavbarComponent implements OnInit { + sidebarExpanded: boolean; + + constructor(private _layoutStore: LayoutStoreService) {} + + ngOnInit(): void { + this._layoutStore.sidebarExpanded.subscribe((value) => { + this.sidebarExpanded = value; + }); + } + + toggleSidebar(): void { + this._layoutStore.setSidebarExpanded(!this.sidebarExpanded); + } +} diff --git a/angular/src/app/layout/header-user-menu.component.html b/angular/src/app/layout/header-user-menu.component.html new file mode 100644 index 0000000..3fb223b --- /dev/null +++ b/angular/src/app/layout/header-user-menu.component.html @@ -0,0 +1,17 @@ + diff --git a/angular/src/app/layout/header-user-menu.component.ts b/angular/src/app/layout/header-user-menu.component.ts new file mode 100644 index 0000000..eab075a --- /dev/null +++ b/angular/src/app/layout/header-user-menu.component.ts @@ -0,0 +1,15 @@ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { AppAuthService } from '@shared/auth/app-auth.service'; + +@Component({ + selector: 'header-user-menu', + templateUrl: './header-user-menu.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class HeaderUserMenuComponent { + constructor(private _authService: AppAuthService) {} + + logout(): void { + this._authService.logout(); + } +} diff --git a/angular/src/app/layout/header.component.html b/angular/src/app/layout/header.component.html new file mode 100644 index 0000000..fb26732 --- /dev/null +++ b/angular/src/app/layout/header.component.html @@ -0,0 +1,7 @@ + diff --git a/angular/src/app/layout/header.component.ts b/angular/src/app/layout/header.component.ts new file mode 100644 index 0000000..4765623 --- /dev/null +++ b/angular/src/app/layout/header.component.ts @@ -0,0 +1,8 @@ +import { Component, ChangeDetectionStrategy } from '@angular/core'; + +@Component({ + selector: 'app-header', + templateUrl: './header.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class HeaderComponent {} diff --git a/angular/src/app/layout/sidebar-logo.component.html b/angular/src/app/layout/sidebar-logo.component.html new file mode 100644 index 0000000..b578f89 --- /dev/null +++ b/angular/src/app/layout/sidebar-logo.component.html @@ -0,0 +1,9 @@ + + Logo + MeetingSchedule + diff --git a/angular/src/app/layout/sidebar-logo.component.ts b/angular/src/app/layout/sidebar-logo.component.ts new file mode 100644 index 0000000..cea2552 --- /dev/null +++ b/angular/src/app/layout/sidebar-logo.component.ts @@ -0,0 +1,8 @@ +import { Component, ChangeDetectionStrategy } from '@angular/core'; + +@Component({ + selector: 'sidebar-logo', + templateUrl: './sidebar-logo.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class SidebarLogoComponent {} diff --git a/angular/src/app/layout/sidebar-menu.component.html b/angular/src/app/layout/sidebar-menu.component.html new file mode 100644 index 0000000..bff58f9 --- /dev/null +++ b/angular/src/app/layout/sidebar-menu.component.html @@ -0,0 +1,71 @@ + + + + + diff --git a/angular/src/app/layout/sidebar-menu.component.ts b/angular/src/app/layout/sidebar-menu.component.ts new file mode 100644 index 0000000..5006819 --- /dev/null +++ b/angular/src/app/layout/sidebar-menu.component.ts @@ -0,0 +1,186 @@ +import {Component, Injector, OnInit} from '@angular/core'; +import {AppComponentBase} from '@shared/app-component-base'; +import { + Router, + RouterEvent, + NavigationEnd, + PRIMARY_OUTLET +} from '@angular/router'; +import {BehaviorSubject} from 'rxjs'; +import {filter} from 'rxjs/operators'; +import {MenuItem} from '@shared/layout/menu-item'; + +@Component({ + selector: 'sidebar-menu', + templateUrl: './sidebar-menu.component.html' +}) +export class SidebarMenuComponent extends AppComponentBase implements OnInit { + menuItems: MenuItem[]; + menuItemsMap: { [key: number]: MenuItem } = {}; + activatedMenuItems: MenuItem[] = []; + routerEvents: BehaviorSubject = new BehaviorSubject(undefined); + homeRoute = '/app/about'; + + constructor(injector: Injector, private router: Router) { + super(injector); + this.router.events.subscribe(this.routerEvents); + } + + ngOnInit(): void { + this.menuItems = this.getMenuItems(); + this.patchMenuItems(this.menuItems); + this.routerEvents + .pipe(filter((event) => event instanceof NavigationEnd)) + .subscribe((event) => { + const currentUrl = event.url !== '/' ? event.url : this.homeRoute; + const primaryUrlSegmentGroup = this.router.parseUrl(currentUrl).root + .children[PRIMARY_OUTLET]; + if (primaryUrlSegmentGroup) { + this.activateMenuItems('/' + primaryUrlSegmentGroup.toString()); + } + }); + } + + getMenuItems(): MenuItem[] { + return [ + new MenuItem(this.l('About'), '/app/about', 'fas fa-info-circle'), + new MenuItem(this.l('HomePage'), '/app/home', 'fas fa-home'), + new MenuItem( + this.l('Roles'), + '/app/roles', + 'fas fa-theater-masks', + 'Pages.Roles' + ), + new MenuItem( + this.l('Tenants'), + '/app/tenants', + 'fas fa-building', + 'Pages.Tenants' + ), + new MenuItem( + this.l('Users'), + '/app/users', + 'fas fa-users', + 'Pages.Users' + ), + new MenuItem(this.l('MultiLevelMenu'), '', 'fas fa-circle', '', [ + new MenuItem('ASP.NET Boilerplate', '', 'fas fa-dot-circle', '', [ + new MenuItem( + 'Home', + 'https://aspnetboilerplate.com?ref=abptmpl', + 'far fa-circle' + ), + new MenuItem( + 'Templates', + 'https://aspnetboilerplate.com/Templates?ref=abptmpl', + 'far fa-circle' + ), + new MenuItem( + 'Samples', + 'https://aspnetboilerplate.com/Samples?ref=abptmpl', + 'far fa-circle' + ), + new MenuItem( + 'Documents', + 'https://aspnetboilerplate.com/Pages/Documents?ref=abptmpl', + 'far fa-circle' + ), + ]), + new MenuItem('ASP.NET Zero', '', 'fas fa-dot-circle', '', [ + new MenuItem( + 'Home', + 'https://aspnetzero.com?ref=abptmpl', + 'far fa-circle' + ), + new MenuItem( + 'Features', + 'https://aspnetzero.com/Features?ref=abptmpl', + 'far fa-circle' + ), + new MenuItem( + 'Pricing', + 'https://aspnetzero.com/Pricing?ref=abptmpl#pricing', + 'far fa-circle' + ), + new MenuItem( + 'Faq', + 'https://aspnetzero.com/Faq?ref=abptmpl', + 'far fa-circle' + ), + new MenuItem( + 'Documents', + 'https://aspnetzero.com/Documents?ref=abptmpl', + 'far fa-circle' + ) + ]) + ]) + ]; + } + + patchMenuItems(items: MenuItem[], parentId?: number): void { + items.forEach((item: MenuItem, index: number) => { + item.id = parentId ? Number(parentId + '' + (index + 1)) : index + 1; + if (parentId) { + item.parentId = parentId; + } + if (parentId || item.children) { + this.menuItemsMap[item.id] = item; + } + if (item.children) { + this.patchMenuItems(item.children, item.id); + } + }); + } + + activateMenuItems(url: string): void { + this.deactivateMenuItems(this.menuItems); + this.activatedMenuItems = []; + const foundedItems = this.findMenuItemsByUrl(url, this.menuItems); + foundedItems.forEach((item) => { + this.activateMenuItem(item); + }); + } + + deactivateMenuItems(items: MenuItem[]): void { + items.forEach((item: MenuItem) => { + item.isActive = false; + item.isCollapsed = true; + if (item.children) { + this.deactivateMenuItems(item.children); + } + }); + } + + findMenuItemsByUrl( + url: string, + items: MenuItem[], + foundedItems: MenuItem[] = [] + ): MenuItem[] { + items.forEach((item: MenuItem) => { + if (item.route === url) { + foundedItems.push(item); + } else if (item.children) { + this.findMenuItemsByUrl(url, item.children, foundedItems); + } + }); + return foundedItems; + } + + activateMenuItem(item: MenuItem): void { + item.isActive = true; + if (item.children) { + item.isCollapsed = false; + } + this.activatedMenuItems.push(item); + if (item.parentId) { + this.activateMenuItem(this.menuItemsMap[item.parentId]); + } + } + + isMenuItemVisible(item: MenuItem): boolean { + if (!item.permissionName) { + return true; + } + return this.permission.isGranted(item.permissionName); + } +} diff --git a/angular/src/app/layout/sidebar-user-panel.component.html b/angular/src/app/layout/sidebar-user-panel.component.html new file mode 100644 index 0000000..9d2d866 --- /dev/null +++ b/angular/src/app/layout/sidebar-user-panel.component.html @@ -0,0 +1,12 @@ +
+
+ User Image +
+ +
diff --git a/angular/src/app/layout/sidebar-user-panel.component.ts b/angular/src/app/layout/sidebar-user-panel.component.ts new file mode 100644 index 0000000..e906f15 --- /dev/null +++ b/angular/src/app/layout/sidebar-user-panel.component.ts @@ -0,0 +1,25 @@ +import { + Component, + ChangeDetectionStrategy, + Injector, + OnInit +} from '@angular/core'; +import { AppComponentBase } from '@shared/app-component-base'; + +@Component({ + selector: 'sidebar-user-panel', + templateUrl: './sidebar-user-panel.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class SidebarUserPanelComponent extends AppComponentBase + implements OnInit { + shownLoginName = ''; + + constructor(injector: Injector) { + super(injector); + } + + ngOnInit() { + this.shownLoginName = this.appSession.getShownLoginName(); + } +} diff --git a/angular/src/app/layout/sidebar.component.html b/angular/src/app/layout/sidebar.component.html new file mode 100644 index 0000000..8ce0da3 --- /dev/null +++ b/angular/src/app/layout/sidebar.component.html @@ -0,0 +1,7 @@ + diff --git a/angular/src/app/layout/sidebar.component.ts b/angular/src/app/layout/sidebar.component.ts new file mode 100644 index 0000000..12b3118 --- /dev/null +++ b/angular/src/app/layout/sidebar.component.ts @@ -0,0 +1,47 @@ +import { + Component, + ChangeDetectionStrategy, + Renderer2, + OnInit +} from '@angular/core'; +import { LayoutStoreService } from '@shared/layout/layout-store.service'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'sidebar', + templateUrl: './sidebar.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class SidebarComponent implements OnInit { + sidebarExpanded: boolean; + + constructor( + private renderer: Renderer2, + private _layoutStore: LayoutStoreService + ) {} + + ngOnInit(): void { + this._layoutStore.sidebarExpanded.subscribe((value) => { + this.sidebarExpanded = value; + this.toggleSidebar(); + }); + } + + toggleSidebar(): void { + if (this.sidebarExpanded) { + this.hideSidebar(); + } else { + this.showSidebar(); + } + } + + showSidebar(): void { + this.renderer.removeClass(document.body, 'sidebar-collapse'); + this.renderer.addClass(document.body, 'sidebar-open'); + } + + hideSidebar(): void { + this.renderer.removeClass(document.body, 'sidebar-open'); + this.renderer.addClass(document.body, 'sidebar-collapse'); + } +} diff --git a/angular/src/app/roles/create-role/create-role-dialog.component.html b/angular/src/app/roles/create-role/create-role-dialog.component.html new file mode 100644 index 0000000..a9180bb --- /dev/null +++ b/angular/src/app/roles/create-role/create-role-dialog.component.html @@ -0,0 +1,103 @@ +
+ + + +
diff --git a/angular/src/app/roles/create-role/create-role-dialog.component.ts b/angular/src/app/roles/create-role/create-role-dialog.component.ts new file mode 100644 index 0000000..ba74020 --- /dev/null +++ b/angular/src/app/roles/create-role/create-role-dialog.component.ts @@ -0,0 +1,97 @@ +import { + Component, + Injector, + OnInit, + EventEmitter, + Output, +} from '@angular/core'; +import { BsModalRef } from 'ngx-bootstrap/modal'; +import { AppComponentBase } from '@shared/app-component-base'; +import { + RoleServiceProxy, + RoleDto, + PermissionDto, + CreateRoleDto, + PermissionDtoListResultDto +} from '@shared/service-proxies/service-proxies'; +import { forEach as _forEach, map as _map } from 'lodash-es'; + +@Component({ + templateUrl: 'create-role-dialog.component.html' +}) +export class CreateRoleDialogComponent extends AppComponentBase + implements OnInit { + saving = false; + role = new RoleDto(); + permissions: PermissionDto[] = []; + checkedPermissionsMap: { [key: string]: boolean } = {}; + defaultPermissionCheckedStatus = true; + + @Output() onSave = new EventEmitter(); + + constructor( + injector: Injector, + private _roleService: RoleServiceProxy, + public bsModalRef: BsModalRef + ) { + super(injector); + } + + ngOnInit(): void { + this._roleService + .getAllPermissions() + .subscribe((result: PermissionDtoListResultDto) => { + this.permissions = result.items; + this.setInitialPermissionsStatus(); + }); + } + + setInitialPermissionsStatus(): void { + _map(this.permissions, (item) => { + this.checkedPermissionsMap[item.name] = this.isPermissionChecked( + item.name + ); + }); + } + + isPermissionChecked(permissionName: string): boolean { + // just return default permission checked status + // it's better to use a setting + return this.defaultPermissionCheckedStatus; + } + + onPermissionChange(permission: PermissionDto, $event) { + this.checkedPermissionsMap[permission.name] = $event.target.checked; + } + + getCheckedPermissions(): string[] { + const permissions: string[] = []; + _forEach(this.checkedPermissionsMap, function (value, key) { + if (value) { + permissions.push(key); + } + }); + return permissions; + } + + save(): void { + this.saving = true; + + const role = new CreateRoleDto(); + role.init(this.role); + role.grantedPermissions = this.getCheckedPermissions(); + + this._roleService + .create(role) + .subscribe( + () => { + this.notify.info(this.l('SavedSuccessfully')); + this.bsModalRef.hide(); + this.onSave.emit(); + }, + () => { + this.saving = false; + } + ); + } +} diff --git a/angular/src/app/roles/edit-role/edit-role-dialog.component.html b/angular/src/app/roles/edit-role/edit-role-dialog.component.html new file mode 100644 index 0000000..0b4d324 --- /dev/null +++ b/angular/src/app/roles/edit-role/edit-role-dialog.component.html @@ -0,0 +1,104 @@ +
+ + + +
diff --git a/angular/src/app/roles/edit-role/edit-role-dialog.component.ts b/angular/src/app/roles/edit-role/edit-role-dialog.component.ts new file mode 100644 index 0000000..dd0c984 --- /dev/null +++ b/angular/src/app/roles/edit-role/edit-role-dialog.component.ts @@ -0,0 +1,97 @@ +import { + Component, + Injector, + OnInit, + EventEmitter, + Output, +} from '@angular/core'; +import { BsModalRef } from 'ngx-bootstrap/modal'; +import { forEach as _forEach, includes as _includes, map as _map } from 'lodash-es'; +import { AppComponentBase } from '@shared/app-component-base'; +import { + RoleServiceProxy, + GetRoleForEditOutput, + RoleDto, + PermissionDto, + RoleEditDto, + FlatPermissionDto +} from '@shared/service-proxies/service-proxies'; + +@Component({ + templateUrl: 'edit-role-dialog.component.html' +}) +export class EditRoleDialogComponent extends AppComponentBase + implements OnInit { + saving = false; + id: number; + role = new RoleEditDto(); + permissions: FlatPermissionDto[]; + grantedPermissionNames: string[]; + checkedPermissionsMap: { [key: string]: boolean } = {}; + + @Output() onSave = new EventEmitter(); + + constructor( + injector: Injector, + private _roleService: RoleServiceProxy, + public bsModalRef: BsModalRef + ) { + super(injector); + } + + ngOnInit(): void { + this._roleService + .getRoleForEdit(this.id) + .subscribe((result: GetRoleForEditOutput) => { + this.role = result.role; + this.permissions = result.permissions; + this.grantedPermissionNames = result.grantedPermissionNames; + this.setInitialPermissionsStatus(); + }); + } + + setInitialPermissionsStatus(): void { + _map(this.permissions, (item) => { + this.checkedPermissionsMap[item.name] = this.isPermissionChecked( + item.name + ); + }); + } + + isPermissionChecked(permissionName: string): boolean { + return _includes(this.grantedPermissionNames, permissionName); + } + + onPermissionChange(permission: PermissionDto, $event) { + this.checkedPermissionsMap[permission.name] = $event.target.checked; + } + + getCheckedPermissions(): string[] { + const permissions: string[] = []; + _forEach(this.checkedPermissionsMap, function (value, key) { + if (value) { + permissions.push(key); + } + }); + return permissions; + } + + save(): void { + this.saving = true; + + const role = new RoleDto(); + role.init(this.role); + role.grantedPermissions = this.getCheckedPermissions(); + + this._roleService.update(role).subscribe( + () => { + this.notify.info(this.l('SavedSuccessfully')); + this.bsModalRef.hide(); + this.onSave.emit(); + }, + () => { + this.saving = false; + } + ); + } +} diff --git a/angular/src/app/roles/roles.component.html b/angular/src/app/roles/roles.component.html new file mode 100644 index 0000000..71d4fed --- /dev/null +++ b/angular/src/app/roles/roles.component.html @@ -0,0 +1,112 @@ +
+
+
+
+
+

{{ "Roles" | localize }}

+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+ + + + + + + + + + + + + + + +
{{ "RoleName" | localize }}{{ "DisplayName" | localize }}{{ "Actions" | localize }}
{{ role.name }}{{ role.displayName }} + + +
+
+
+ +
+
+
+
\ No newline at end of file diff --git a/angular/src/app/roles/roles.component.ts b/angular/src/app/roles/roles.component.ts new file mode 100644 index 0000000..33dcc19 --- /dev/null +++ b/angular/src/app/roles/roles.component.ts @@ -0,0 +1,110 @@ +import { Component, Injector } from '@angular/core'; +import { finalize } from 'rxjs/operators'; +import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal'; +import { appModuleAnimation } from '@shared/animations/routerTransition'; +import { + PagedListingComponentBase, + PagedRequestDto +} from '@shared/paged-listing-component-base'; +import { + RoleServiceProxy, + RoleDto, + RoleDtoPagedResultDto +} from '@shared/service-proxies/service-proxies'; +import { CreateRoleDialogComponent } from './create-role/create-role-dialog.component'; +import { EditRoleDialogComponent } from './edit-role/edit-role-dialog.component'; + +class PagedRolesRequestDto extends PagedRequestDto { + keyword: string; +} + +@Component({ + templateUrl: './roles.component.html', + animations: [appModuleAnimation()] +}) +export class RolesComponent extends PagedListingComponentBase { + roles: RoleDto[] = []; + keyword = ''; + + constructor( + injector: Injector, + private _rolesService: RoleServiceProxy, + private _modalService: BsModalService + ) { + super(injector); + } + + list( + request: PagedRolesRequestDto, + pageNumber: number, + finishedCallback: Function + ): void { + request.keyword = this.keyword; + + this._rolesService + .getAll(request.keyword, request.skipCount, request.maxResultCount) + .pipe( + finalize(() => { + finishedCallback(); + }) + ) + .subscribe((result: RoleDtoPagedResultDto) => { + this.roles = result.items; + this.showPaging(result, pageNumber); + }); + } + + delete(role: RoleDto): void { + abp.message.confirm( + this.l('RoleDeleteWarningMessage', role.displayName), + undefined, + (result: boolean) => { + if (result) { + this._rolesService + .delete(role.id) + .pipe( + finalize(() => { + abp.notify.success(this.l('SuccessfullyDeleted')); + this.refresh(); + }) + ) + .subscribe(() => {}); + } + } + ); + } + + createRole(): void { + this.showCreateOrEditRoleDialog(); + } + + editRole(role: RoleDto): void { + this.showCreateOrEditRoleDialog(role.id); + } + + showCreateOrEditRoleDialog(id?: number): void { + let createOrEditRoleDialog: BsModalRef; + if (!id) { + createOrEditRoleDialog = this._modalService.show( + CreateRoleDialogComponent, + { + class: 'modal-lg', + } + ); + } else { + createOrEditRoleDialog = this._modalService.show( + EditRoleDialogComponent, + { + class: 'modal-lg', + initialState: { + id: id, + }, + } + ); + } + + createOrEditRoleDialog.content.onSave.subscribe(() => { + this.refresh(); + }); + } +} diff --git a/angular/src/app/tenants/create-tenant/create-tenant-dialog.component.html b/angular/src/app/tenants/create-tenant/create-tenant-dialog.component.html new file mode 100644 index 0000000..a2d9a63 --- /dev/null +++ b/angular/src/app/tenants/create-tenant/create-tenant-dialog.component.html @@ -0,0 +1,121 @@ +
+ + + +
diff --git a/angular/src/app/tenants/create-tenant/create-tenant-dialog.component.ts b/angular/src/app/tenants/create-tenant/create-tenant-dialog.component.ts new file mode 100644 index 0000000..c492c74 --- /dev/null +++ b/angular/src/app/tenants/create-tenant/create-tenant-dialog.component.ts @@ -0,0 +1,51 @@ +import { + Component, + Injector, + OnInit, + Output, + EventEmitter +} from '@angular/core'; +import { BsModalRef } from 'ngx-bootstrap/modal'; +import { AppComponentBase } from '@shared/app-component-base'; +import { + CreateTenantDto, + TenantServiceProxy +} from '@shared/service-proxies/service-proxies'; + +@Component({ + templateUrl: 'create-tenant-dialog.component.html' +}) +export class CreateTenantDialogComponent extends AppComponentBase + implements OnInit { + saving = false; + tenant: CreateTenantDto = new CreateTenantDto(); + + @Output() onSave = new EventEmitter(); + + constructor( + injector: Injector, + public _tenantService: TenantServiceProxy, + public bsModalRef: BsModalRef + ) { + super(injector); + } + + ngOnInit(): void { + this.tenant.isActive = true; + } + + save(): void { + this.saving = true; + + this._tenantService.create(this.tenant).subscribe( + () => { + this.notify.info(this.l('SavedSuccessfully')); + this.bsModalRef.hide(); + this.onSave.emit(); + }, + () => { + this.saving = false; + } + ); + } +} diff --git a/angular/src/app/tenants/edit-tenant/edit-tenant-dialog.component.html b/angular/src/app/tenants/edit-tenant/edit-tenant-dialog.component.html new file mode 100644 index 0000000..8540ebd --- /dev/null +++ b/angular/src/app/tenants/edit-tenant/edit-tenant-dialog.component.html @@ -0,0 +1,80 @@ +
+ + + +
diff --git a/angular/src/app/tenants/edit-tenant/edit-tenant-dialog.component.ts b/angular/src/app/tenants/edit-tenant/edit-tenant-dialog.component.ts new file mode 100644 index 0000000..b31d1fa --- /dev/null +++ b/angular/src/app/tenants/edit-tenant/edit-tenant-dialog.component.ts @@ -0,0 +1,54 @@ +import { + Component, + Injector, + OnInit, + Output, + EventEmitter +} from '@angular/core'; +import { BsModalRef } from 'ngx-bootstrap/modal'; +import { AppComponentBase } from '@shared/app-component-base'; +import { + TenantServiceProxy, + TenantDto +} from '@shared/service-proxies/service-proxies'; + +@Component({ + templateUrl: 'edit-tenant-dialog.component.html' +}) +export class EditTenantDialogComponent extends AppComponentBase + implements OnInit { + saving = false; + tenant: TenantDto = new TenantDto(); + id: number; + + @Output() onSave = new EventEmitter(); + + constructor( + injector: Injector, + public _tenantService: TenantServiceProxy, + public bsModalRef: BsModalRef + ) { + super(injector); + } + + ngOnInit(): void { + this._tenantService.get(this.id).subscribe((result: TenantDto) => { + this.tenant = result; + }); + } + + save(): void { + this.saving = true; + + this._tenantService.update(this.tenant).subscribe( + () => { + this.notify.info(this.l('SavedSuccessfully')); + this.bsModalRef.hide(); + this.onSave.emit(); + }, + () => { + this.saving = false; + } + ); + } +} diff --git a/angular/src/app/tenants/tenants.component.html b/angular/src/app/tenants/tenants.component.html new file mode 100644 index 0000000..6a13c41 --- /dev/null +++ b/angular/src/app/tenants/tenants.component.html @@ -0,0 +1,224 @@ +
+
+
+
+
+

{{ "Tenants" | localize }}

+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + +
{{ "TenancyName" | localize }}{{ "Name" | localize }}{{ "IsActive" | localize }}{{ "Actions" | localize }}
{{ tenant.tenancyName }}{{ tenant.name }} +
+ + +
+
+ + +
+
+
+ +
+
+
+
diff --git a/angular/src/app/tenants/tenants.component.ts b/angular/src/app/tenants/tenants.component.ts new file mode 100644 index 0000000..e2627ca --- /dev/null +++ b/angular/src/app/tenants/tenants.component.ts @@ -0,0 +1,125 @@ +import { Component, Injector } from '@angular/core'; +import { finalize } from 'rxjs/operators'; +import { BsModalService, BsModalRef } from 'ngx-bootstrap/modal'; +import { appModuleAnimation } from '@shared/animations/routerTransition'; +import { + PagedListingComponentBase, + PagedRequestDto, +} from '@shared/paged-listing-component-base'; +import { + TenantServiceProxy, + TenantDto, + TenantDtoPagedResultDto, +} from '@shared/service-proxies/service-proxies'; +import { CreateTenantDialogComponent } from './create-tenant/create-tenant-dialog.component'; +import { EditTenantDialogComponent } from './edit-tenant/edit-tenant-dialog.component'; + +class PagedTenantsRequestDto extends PagedRequestDto { + keyword: string; + isActive: boolean | null; +} + +@Component({ + templateUrl: './tenants.component.html', + animations: [appModuleAnimation()] +}) +export class TenantsComponent extends PagedListingComponentBase { + tenants: TenantDto[] = []; + keyword = ''; + isActive: boolean | null; + advancedFiltersVisible = false; + + constructor( + injector: Injector, + private _tenantService: TenantServiceProxy, + private _modalService: BsModalService + ) { + super(injector); + } + + list( + request: PagedTenantsRequestDto, + pageNumber: number, + finishedCallback: Function + ): void { + request.keyword = this.keyword; + request.isActive = this.isActive; + + this._tenantService + .getAll( + request.keyword, + request.isActive, + request.skipCount, + request.maxResultCount + ) + .pipe( + finalize(() => { + finishedCallback(); + }) + ) + .subscribe((result: TenantDtoPagedResultDto) => { + this.tenants = result.items; + this.showPaging(result, pageNumber); + }); + } + + delete(tenant: TenantDto): void { + abp.message.confirm( + this.l('TenantDeleteWarningMessage', tenant.name), + undefined, + (result: boolean) => { + if (result) { + this._tenantService + .delete(tenant.id) + .pipe( + finalize(() => { + abp.notify.success(this.l('SuccessfullyDeleted')); + this.refresh(); + }) + ) + .subscribe(() => {}); + } + } + ); + } + + createTenant(): void { + this.showCreateOrEditTenantDialog(); + } + + editTenant(tenant: TenantDto): void { + this.showCreateOrEditTenantDialog(tenant.id); + } + + showCreateOrEditTenantDialog(id?: number): void { + let createOrEditTenantDialog: BsModalRef; + if (!id) { + createOrEditTenantDialog = this._modalService.show( + CreateTenantDialogComponent, + { + class: 'modal-lg', + } + ); + } else { + createOrEditTenantDialog = this._modalService.show( + EditTenantDialogComponent, + { + class: 'modal-lg', + initialState: { + id: id, + }, + } + ); + } + + createOrEditTenantDialog.content.onSave.subscribe(() => { + this.refresh(); + }); + } + + clearFilters(): void { + this.keyword = ''; + this.isActive = undefined; + this.getDataPage(1); + } +} diff --git a/angular/src/app/users/change-password/change-password.component.html b/angular/src/app/users/change-password/change-password.component.html new file mode 100644 index 0000000..5b1793a --- /dev/null +++ b/angular/src/app/users/change-password/change-password.component.html @@ -0,0 +1,115 @@ +
+
+
+
+
+

{{ "UpdatePassword" | localize }}

+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+
+
diff --git a/angular/src/app/users/change-password/change-password.component.ts b/angular/src/app/users/change-password/change-password.component.ts new file mode 100644 index 0000000..99ee438 --- /dev/null +++ b/angular/src/app/users/change-password/change-password.component.ts @@ -0,0 +1,58 @@ +import { Component, Injector } from '@angular/core'; +import { Router } from '@angular/router'; +import { finalize } from 'rxjs/operators'; +import { appModuleAnimation } from '@shared/animations/routerTransition'; +import { AppComponentBase } from '@shared/app-component-base'; +import { + ChangePasswordDto, + UserServiceProxy +} from '@shared/service-proxies/service-proxies'; +import { AbpValidationError } from '@shared/components/validation/abp-validation.api'; + +@Component({ + templateUrl: './change-password.component.html', + animations: [appModuleAnimation()] +}) +export class ChangePasswordComponent extends AppComponentBase { + saving = false; + changePasswordDto = new ChangePasswordDto(); + newPasswordValidationErrors: Partial[] = [ + { + name: 'pattern', + localizationKey: + 'PasswordsMustBeAtLeast8CharactersContainLowercaseUppercaseNumber', + }, + ]; + confirmNewPasswordValidationErrors: Partial[] = [ + { + name: 'validateEqual', + localizationKey: 'PasswordsDoNotMatch', + }, + ]; + + constructor( + injector: Injector, + private userServiceProxy: UserServiceProxy, + private router: Router + ) { + super(injector); + } + + changePassword() { + this.saving = true; + + this.userServiceProxy + .changePassword(this.changePasswordDto) + .pipe( + finalize(() => { + this.saving = false; + }) + ) + .subscribe((success) => { + if (success) { + abp.message.success('Password changed successfully', 'Success'); + this.router.navigate(['/']); + } + }); + } +} diff --git a/angular/src/app/users/create-user/create-user-dialog.component.html b/angular/src/app/users/create-user/create-user-dialog.component.html new file mode 100644 index 0000000..18bdaf8 --- /dev/null +++ b/angular/src/app/users/create-user/create-user-dialog.component.html @@ -0,0 +1,200 @@ +
+ + + +
diff --git a/angular/src/app/users/create-user/create-user-dialog.component.ts b/angular/src/app/users/create-user/create-user-dialog.component.ts new file mode 100644 index 0000000..461f09f --- /dev/null +++ b/angular/src/app/users/create-user/create-user-dialog.component.ts @@ -0,0 +1,105 @@ +import { + Component, + Injector, + OnInit, + EventEmitter, + Output +} from '@angular/core'; +import { BsModalRef } from 'ngx-bootstrap/modal'; +import { forEach as _forEach, map as _map } from 'lodash-es'; +import { AppComponentBase } from '@shared/app-component-base'; +import { + UserServiceProxy, + CreateUserDto, + RoleDto +} from '@shared/service-proxies/service-proxies'; +import { AbpValidationError } from '@shared/components/validation/abp-validation.api'; + +@Component({ + templateUrl: './create-user-dialog.component.html' +}) +export class CreateUserDialogComponent extends AppComponentBase + implements OnInit { + saving = false; + user = new CreateUserDto(); + roles: RoleDto[] = []; + checkedRolesMap: { [key: string]: boolean } = {}; + defaultRoleCheckedStatus = false; + passwordValidationErrors: Partial[] = [ + { + name: 'pattern', + localizationKey: + 'PasswordsMustBeAtLeast8CharactersContainLowercaseUppercaseNumber', + }, + ]; + confirmPasswordValidationErrors: Partial[] = [ + { + name: 'validateEqual', + localizationKey: 'PasswordsDoNotMatch', + }, + ]; + + @Output() onSave = new EventEmitter(); + + constructor( + injector: Injector, + public _userService: UserServiceProxy, + public bsModalRef: BsModalRef + ) { + super(injector); + } + + ngOnInit(): void { + this.user.isActive = true; + + this._userService.getRoles().subscribe((result) => { + this.roles = result.items; + this.setInitialRolesStatus(); + }); + } + + setInitialRolesStatus(): void { + _map(this.roles, (item) => { + this.checkedRolesMap[item.normalizedName] = this.isRoleChecked( + item.normalizedName + ); + }); + } + + isRoleChecked(normalizedName: string): boolean { + // just return default role checked status + // it's better to use a setting + return this.defaultRoleCheckedStatus; + } + + onRoleChange(role: RoleDto, $event) { + this.checkedRolesMap[role.normalizedName] = $event.target.checked; + } + + getCheckedRoles(): string[] { + const roles: string[] = []; + _forEach(this.checkedRolesMap, function (value, key) { + if (value) { + roles.push(key); + } + }); + return roles; + } + + save(): void { + this.saving = true; + + this.user.roleNames = this.getCheckedRoles(); + + this._userService.create(this.user).subscribe( + () => { + this.notify.info(this.l('SavedSuccessfully')); + this.bsModalRef.hide(); + this.onSave.emit(); + }, + () => { + this.saving = false; + } + ); + } +} diff --git a/angular/src/app/users/edit-user/edit-user-dialog.component.html b/angular/src/app/users/edit-user/edit-user-dialog.component.html new file mode 100644 index 0000000..29d7cad --- /dev/null +++ b/angular/src/app/users/edit-user/edit-user-dialog.component.html @@ -0,0 +1,149 @@ +
+ + + +
diff --git a/angular/src/app/users/edit-user/edit-user-dialog.component.ts b/angular/src/app/users/edit-user/edit-user-dialog.component.ts new file mode 100644 index 0000000..15037e5 --- /dev/null +++ b/angular/src/app/users/edit-user/edit-user-dialog.component.ts @@ -0,0 +1,91 @@ +import { + Component, + Injector, + OnInit, + EventEmitter, + Output +} from '@angular/core'; +import { BsModalRef } from 'ngx-bootstrap/modal'; +import { forEach as _forEach, includes as _includes, map as _map } from 'lodash-es'; +import { AppComponentBase } from '@shared/app-component-base'; +import { + UserServiceProxy, + UserDto, + RoleDto +} from '@shared/service-proxies/service-proxies'; + +@Component({ + templateUrl: './edit-user-dialog.component.html' +}) +export class EditUserDialogComponent extends AppComponentBase + implements OnInit { + saving = false; + user = new UserDto(); + roles: RoleDto[] = []; + checkedRolesMap: { [key: string]: boolean } = {}; + id: number; + + @Output() onSave = new EventEmitter(); + + constructor( + injector: Injector, + public _userService: UserServiceProxy, + public bsModalRef: BsModalRef + ) { + super(injector); + } + + ngOnInit(): void { + this._userService.get(this.id).subscribe((result) => { + this.user = result; + + this._userService.getRoles().subscribe((result2) => { + this.roles = result2.items; + this.setInitialRolesStatus(); + }); + }); + } + + setInitialRolesStatus(): void { + _map(this.roles, (item) => { + this.checkedRolesMap[item.normalizedName] = this.isRoleChecked( + item.normalizedName + ); + }); + } + + isRoleChecked(normalizedName: string): boolean { + return _includes(this.user.roleNames, normalizedName); + } + + onRoleChange(role: RoleDto, $event) { + this.checkedRolesMap[role.normalizedName] = $event.target.checked; + } + + getCheckedRoles(): string[] { + const roles: string[] = []; + _forEach(this.checkedRolesMap, function (value, key) { + if (value) { + roles.push(key); + } + }); + return roles; + } + + save(): void { + this.saving = true; + + this.user.roleNames = this.getCheckedRoles(); + + this._userService.update(this.user).subscribe( + () => { + this.notify.info(this.l('SavedSuccessfully')); + this.bsModalRef.hide(); + this.onSave.emit(); + }, + () => { + this.saving = false; + } + ); + } +} diff --git a/angular/src/app/users/reset-password/reset-password.component.html b/angular/src/app/users/reset-password/reset-password.component.html new file mode 100644 index 0000000..2146dca --- /dev/null +++ b/angular/src/app/users/reset-password/reset-password.component.html @@ -0,0 +1,68 @@ +
+ + + +
diff --git a/angular/src/app/users/reset-password/reset-password.component.ts b/angular/src/app/users/reset-password/reset-password.component.ts new file mode 100644 index 0000000..e7a74e8 --- /dev/null +++ b/angular/src/app/users/reset-password/reset-password.component.ts @@ -0,0 +1,49 @@ +import { Component, OnInit, Injector } from '@angular/core'; +import { AppComponentBase } from '@shared/app-component-base'; +import { + UserServiceProxy, + ResetPasswordDto +} from '@shared/service-proxies/service-proxies'; +import { BsModalRef } from 'ngx-bootstrap/modal'; + +@Component({ + selector: 'app-reset-password', + templateUrl: './reset-password.component.html' +}) +export class ResetPasswordDialogComponent extends AppComponentBase + implements OnInit { + public isLoading = false; + public resetPasswordDto: ResetPasswordDto; + id: number; + + constructor( + injector: Injector, + private _userService: UserServiceProxy, + public bsModalRef: BsModalRef + ) { + super(injector); + } + + ngOnInit() { + this.isLoading = true; + this.resetPasswordDto = new ResetPasswordDto(); + this.resetPasswordDto.userId = this.id; + this.resetPasswordDto.newPassword = Math.random() + .toString(36) + .substr(2, 10); + this.isLoading = false; + } + + public resetPassword(): void { + this.isLoading = true; + this._userService.resetPassword(this.resetPasswordDto).subscribe( + () => { + this.notify.info('Password Reset'); + this.bsModalRef.hide(); + }, + () => { + this.isLoading = false; + } + ); + } +} diff --git a/angular/src/app/users/users.component.html b/angular/src/app/users/users.component.html new file mode 100644 index 0000000..1c1e9b9 --- /dev/null +++ b/angular/src/app/users/users.component.html @@ -0,0 +1,234 @@ +
+
+
+
+
+

{{ "Users" | localize }}

+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + +
{{ "UserName" | localize }}{{ "FullName" | localize }}{{ "EmailAddress" | localize }}{{ "IsActive" | localize }}{{ "Actions" | localize }}
{{ user.userName }}{{ user.fullName }}{{ user.emailAddress }} +
+ + +
+
+ + + +
+
+
+ +
+
+
+
diff --git a/angular/src/app/users/users.component.ts b/angular/src/app/users/users.component.ts new file mode 100644 index 0000000..13ffea3 --- /dev/null +++ b/angular/src/app/users/users.component.ts @@ -0,0 +1,134 @@ +import { Component, Injector } from '@angular/core'; +import { finalize } from 'rxjs/operators'; +import { BsModalService, BsModalRef } from 'ngx-bootstrap/modal'; +import { appModuleAnimation } from '@shared/animations/routerTransition'; +import { + PagedListingComponentBase, + PagedRequestDto +} from 'shared/paged-listing-component-base'; +import { + UserServiceProxy, + UserDto, + UserDtoPagedResultDto +} from '@shared/service-proxies/service-proxies'; +import { CreateUserDialogComponent } from './create-user/create-user-dialog.component'; +import { EditUserDialogComponent } from './edit-user/edit-user-dialog.component'; +import { ResetPasswordDialogComponent } from './reset-password/reset-password.component'; + +class PagedUsersRequestDto extends PagedRequestDto { + keyword: string; + isActive: boolean | null; +} + +@Component({ + templateUrl: './users.component.html', + animations: [appModuleAnimation()] +}) +export class UsersComponent extends PagedListingComponentBase { + users: UserDto[] = []; + keyword = ''; + isActive: boolean | null; + advancedFiltersVisible = false; + + constructor( + injector: Injector, + private _userService: UserServiceProxy, + private _modalService: BsModalService + ) { + super(injector); + } + + createUser(): void { + this.showCreateOrEditUserDialog(); + } + + editUser(user: UserDto): void { + this.showCreateOrEditUserDialog(user.id); + } + + public resetPassword(user: UserDto): void { + this.showResetPasswordUserDialog(user.id); + } + + clearFilters(): void { + this.keyword = ''; + this.isActive = undefined; + this.getDataPage(1); + } + + protected list( + request: PagedUsersRequestDto, + pageNumber: number, + finishedCallback: Function + ): void { + request.keyword = this.keyword; + request.isActive = this.isActive; + + this._userService + .getAll( + request.keyword, + request.isActive, + request.skipCount, + request.maxResultCount + ) + .pipe( + finalize(() => { + finishedCallback(); + }) + ) + .subscribe((result: UserDtoPagedResultDto) => { + this.users = result.items; + this.showPaging(result, pageNumber); + }); + } + + protected delete(user: UserDto): void { + abp.message.confirm( + this.l('UserDeleteWarningMessage', user.fullName), + undefined, + (result: boolean) => { + if (result) { + this._userService.delete(user.id).subscribe(() => { + abp.notify.success(this.l('SuccessfullyDeleted')); + this.refresh(); + }); + } + } + ); + } + + private showResetPasswordUserDialog(id?: number): void { + this._modalService.show(ResetPasswordDialogComponent, { + class: 'modal-lg', + initialState: { + id: id, + }, + }); + } + + private showCreateOrEditUserDialog(id?: number): void { + let createOrEditUserDialog: BsModalRef; + if (!id) { + createOrEditUserDialog = this._modalService.show( + CreateUserDialogComponent, + { + class: 'modal-lg', + } + ); + } else { + createOrEditUserDialog = this._modalService.show( + EditUserDialogComponent, + { + class: 'modal-lg', + initialState: { + id: id, + }, + } + ); + } + + createOrEditUserDialog.content.onSave.subscribe(() => { + this.refresh(); + }); + } +} diff --git a/angular/src/assets/.gitkeep b/angular/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/angular/src/assets/abp-web-resources/abp.freeze-ui.js b/angular/src/assets/abp-web-resources/abp.freeze-ui.js new file mode 100644 index 0000000..d15dd79 --- /dev/null +++ b/angular/src/assets/abp-web-resources/abp.freeze-ui.js @@ -0,0 +1,24 @@ +"use strict"; + +var abp = abp || {}; + +(function () { + if (!FreezeUI || !UnFreezeUI) { + return; + } + + abp.ui.setBusy = function (elm, text, delay) { + FreezeUI({ + element: elm, + text: text ? text : " ", + delay: delay + }); + }; + + abp.ui.clearBusy = function (elm, delay) { + UnFreezeUI({ + element: elm, + delay: delay + }); + }; +})(); \ No newline at end of file diff --git a/angular/src/assets/abp-web-resources/abp.sweet-alert.js b/angular/src/assets/abp-web-resources/abp.sweet-alert.js new file mode 100644 index 0000000..d8f4eb8 --- /dev/null +++ b/angular/src/assets/abp-web-resources/abp.sweet-alert.js @@ -0,0 +1,128 @@ +var abp = abp || {}; + +(function () { + if (!Swal) { + return; + } + /* MESSAGE **************************************************/ + + + var showMessage = function showMessage(type, message, title, isHtml, options) { + if (!title) { + title = message; + message = undefined; + } + + options = options || {}; + options.title = title; + options.icon = type; + options.confirmButtonText = options.confirmButtonText || abp.localization.abpWeb("Ok"); + + if (isHtml) { + options.html = message; + } else { + options.text = message; + } + + return Swal.fire(options); + }; + + abp.message.info = function (message, title, isHtml, options) { + return showMessage("info", message, title, isHtml, options); + }; + + abp.message.success = function (message, title, isHtml, options) { + return showMessage("success", message, title, isHtml, options); + }; + + abp.message.warn = function (message, title, isHtml, options) { + return showMessage("warning", message, title, isHtml, options); + }; + + abp.message.error = function (message, title, isHtml, options) { + return showMessage("error", message, title, isHtml, options); + }; + + abp.message.confirm = function (message, titleOrCallback, callback, isHtml, options) { + var title = undefined; + + if (typeof titleOrCallback === "function") { + callback = titleOrCallback; + } else if (titleOrCallback) { + title = titleOrCallback; + } + + options = options || {}; + options.title = title ? title : abp.localization.abpWeb("AreYouSure"); + options.icon = "warning"; + options.confirmButtonText = options.confirmButtonText || abp.localization.abpWeb("Yes"); + options.cancelButtonText = options.cancelButtonText || abp.localization.abpWeb("Cancel"); + options.showCancelButton = true; + + if (isHtml) { + options.html = message; + } else { + options.text = message; + } + + return Swal.fire(options).then(function (result) { + callback && callback(result.value); + }); + }; + /* NOTIFICATION *********************************************/ + + + var Toast = Swal.mixin({ + toast: true, + position: "bottom-end", + showConfirmButton: false, + timer: 3000 + }); + + var showNotification = function showNotification(type, message, title, options) { + var icon = options.customClass.icon ? "") : ""; + + if (title) { + options.title = "".concat(icon, "").concat(title, ""); + } + + options.html = "".concat(title ? "" : icon, "\n ").concat(message, ""); + Toast.fire(options); + }; + + abp.notify.success = function (message, title, options) { + showNotification("success", message, title, Object.assign({ + background: "#34bfa3", + customClass: { + icon: "fas fa-check-circle" + } + }, options)); + }; + + abp.notify.info = function (message, title, options) { + showNotification("info", message, title, Object.assign({ + background: "#36a3f7", + customClass: { + icon: "fas fa-info-circle" + } + }, options)); + }; + + abp.notify.warn = function (message, title, options) { + showNotification("warning", message, title, Object.assign({ + background: "#ffb822", + customClass: { + icon: "fas fa-exclamation-triangle" + } + }, options)); + }; + + abp.notify.error = function (message, title, options) { + showNotification("error", message, title, Object.assign({ + background: "#f4516c", + customClass: { + icon: "fas fa-exclamation-circle" + } + }, options)); + }; +})(); \ No newline at end of file diff --git a/angular/src/assets/appconfig.json b/angular/src/assets/appconfig.json new file mode 100644 index 0000000..e9a1c20 --- /dev/null +++ b/angular/src/assets/appconfig.json @@ -0,0 +1,18 @@ +{ + "remoteServiceBaseUrl": "https://localhost:44311", + "appBaseUrl": "http://localhost:4200", + "localeMappings": [ + { + "from": "pt-BR", + "to": "pt" + }, + { + "from": "zh-CN", + "to": "zh" + }, + { + "from": "he-IL", + "to": "he" + } + ] +} diff --git a/angular/src/assets/appconfig.production.json b/angular/src/assets/appconfig.production.json new file mode 100644 index 0000000..e9a1c20 --- /dev/null +++ b/angular/src/assets/appconfig.production.json @@ -0,0 +1,18 @@ +{ + "remoteServiceBaseUrl": "https://localhost:44311", + "appBaseUrl": "http://localhost:4200", + "localeMappings": [ + { + "from": "pt-BR", + "to": "pt" + }, + { + "from": "zh-CN", + "to": "zh" + }, + { + "from": "he-IL", + "to": "he" + } + ] +} diff --git a/angular/src/assets/freeze-ui/freeze-ui.css b/angular/src/assets/freeze-ui/freeze-ui.css new file mode 100644 index 0000000..f59e67a --- /dev/null +++ b/angular/src/assets/freeze-ui/freeze-ui.css @@ -0,0 +1,56 @@ +@keyframes spin { + 0% { + transform: translateZ(0) rotate(0); + } + + 100% { + transform: translateZ(0) rotate(360deg); + } +} + +.freeze-ui { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 999999999; + background-color: #fff; + opacity: 0.8; + transition: opacity 0.25s; +} + +.freeze-ui.is-unfreezing { + opacity: 0; +} + +.freeze-ui:after { + content: attr(data-text); + display: block; + max-width: 125px; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 20px; + font-family: sans-serif; + color: #343a40; + text-align: center; + text-transform: uppercase; +} + +.freeze-ui:before { + content: ""; + display: block; + width: 75px; + height: 75px; + border-radius: 50%; + border-width: 2px; + border-style: solid; + border-color: transparent #228ae6 #228ae6; + position: absolute; + top: calc(50% - 75px); + left: calc(50% - 75px); + will-change: transform; + animation: spin 0.75s infinite ease-in-out; +} diff --git a/angular/src/assets/freeze-ui/freeze-ui.js b/angular/src/assets/freeze-ui/freeze-ui.js new file mode 100644 index 0000000..d66eb7f --- /dev/null +++ b/angular/src/assets/freeze-ui/freeze-ui.js @@ -0,0 +1,86 @@ +"use strict"; + +// taken from https://raw.githubusercontent.com/alexradulescu/FreezeUI, modified and converted to ES5 +(function () { + var freezeHtml = document.createElement("div"); + freezeHtml.classList.add("freeze-ui"); + var freezedItems = []; + + var getSelector = function getSelector(selector) { + return selector ? selector : "body"; + }; + + var normalizeFreezeDelay = function normalizeFreezeDelay(delay) { + return delay ? delay : 250; + }; + + var shouldFreezeItem = function shouldFreezeItem(selector) { + var itemSelector = getSelector(selector); + return freezedItems.indexOf(itemSelector) >= 0; + }; + + var addFreezedItem = function addFreezedItem(selector) { + var itemSelector = getSelector(selector); + freezedItems.push(itemSelector); + }; + + var removeFreezedItem = function removeFreezedItem(selector) { + var itemSelector = getSelector(selector); + + for (var i = 0; i < freezedItems.length; i++) { + if (freezedItems[i] === itemSelector) { + freezedItems.splice(i, 1); + } + } + }; + + window.FreezeUI = function () { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + addFreezedItem(options.selector); + var delay = normalizeFreezeDelay(options.delay); + setTimeout(function () { + if (!shouldFreezeItem(options.selector)) { + return; + } + + var parent; + + if (options.element) { + parent = options.element; + } else { + parent = document.querySelector(options.selector) || document.body; + } + + freezeHtml.setAttribute("data-text", options.text || "Loading"); + + if (document.querySelector(options.selector) || options.element) { + freezeHtml.style.position = "absolute"; + } + + parent.appendChild(freezeHtml); + }, delay); + }; + + window.UnFreezeUI = function () { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + removeFreezedItem(options.selector); + var delay = normalizeFreezeDelay(options.delay) + 250; + setTimeout(function () { + var freezeHtml; + + if (options.element) { + freezeHtml = options.element.querySelector(".freeze-ui"); + } else { + freezeHtml = document.querySelector(".freeze-ui"); + } + + if (freezeHtml) { + freezeHtml.classList.remove("is-unfreezing"); + + if (freezeHtml.parentElement) { + freezeHtml.parentElement.removeChild(freezeHtml); + } + } + }, delay); + }; +})(); \ No newline at end of file diff --git a/angular/src/assets/img/logo.png b/angular/src/assets/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c9b0fc88ef8525dfe998fe9614a2caec67828f64 GIT binary patch literal 4327 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 literal 0 HcmV?d00001 diff --git a/angular/src/assets/img/user.png b/angular/src/assets/img/user.png new file mode 100644 index 0000000000000000000000000000000000000000..49d4b9254d33508c9f709aafa136840d9ced90de GIT binary patch literal 8007 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 JPDHLkV1f&~Y-|7k literal 0 HcmV?d00001 diff --git a/angular/src/environments/environment.hmr.ts b/angular/src/environments/environment.hmr.ts new file mode 100644 index 0000000..4b383d3 --- /dev/null +++ b/angular/src/environments/environment.hmr.ts @@ -0,0 +1,7 @@ +// "Hot Module Replacement" enabled environment + +export const environment = { + production: false, + hmr: true, + appConfig: 'appconfig.json' +}; diff --git a/angular/src/environments/environment.prod.ts b/angular/src/environments/environment.prod.ts new file mode 100644 index 0000000..79ab349 --- /dev/null +++ b/angular/src/environments/environment.prod.ts @@ -0,0 +1,7 @@ +// "Production" enabled environment + +export const environment = { + production: true, + hmr: false, + appConfig: 'appconfig.production.json' +}; diff --git a/angular/src/environments/environment.ts b/angular/src/environments/environment.ts new file mode 100644 index 0000000..ab6e6fc --- /dev/null +++ b/angular/src/environments/environment.ts @@ -0,0 +1,10 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `angular-cli.json`. + +export const environment = { + production: false, + hmr: false, + appConfig: 'appconfig.json' +}; diff --git a/angular/src/favicon.ico b/angular/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..75a2aa12f7f0c71d7623dac5688635000ca68e01 GIT binary patch literal 1150 zcmds%&#Mwq6vuDSuFa!G>$mJ53!-gM&^EDUv{0W-jDu)7)8xwrHzOp4KXM^GN$|%L z6hpymz^9<-h@bA<#{}(OZxx-(IcLs~@4er-XBZ)F$aQoiq&*h*Zwhfo2ys`cOv%h; zUOFLU?e?upRk1YuM{+nESgls<_xrzktMz(Kx7(#qC{QYu*lu^f@dx=7>>Fqxp;v)4 z&1REKCPOS1BNBOvW|-)oe8!&amGv*J5vQl`aU6$gwMw~MW;7awa6HdrJRak^uEa-p z{l?;%^Umrm47xM3&2?>U(RMOgx{+2Z()yhw(Fvluo5mA)QX6X_~?{8V$8q zh+ixgDz+?(-OlILXSip8;k3|Ro~XMGu*qbSTrNj8n5zZ4 KDf|yy*Z%^uRk$<& literal 0 HcmV?d00001 diff --git a/angular/src/hmr.ts b/angular/src/hmr.ts new file mode 100644 index 0000000..29a02d8 --- /dev/null +++ b/angular/src/hmr.ts @@ -0,0 +1,15 @@ +import { NgModuleRef, ApplicationRef } from '@angular/core'; +import { createNewHosts } from '@angularclass/hmr'; + +export const hmrBootstrap = (module: any, bootstrap: () => Promise>) => { + let ngModule: NgModuleRef; + module.hot.accept(); + bootstrap().then(mod => ngModule = mod); + module.hot.dispose(() => { + const appRef: ApplicationRef = ngModule.injector.get(ApplicationRef); + const elements = appRef.components.map(c => c.location.nativeElement); + const makeVisible = createNewHosts(elements); + ngModule.destroy(); + makeVisible(); + }); +}; diff --git a/angular/src/index.html b/angular/src/index.html new file mode 100644 index 0000000..34a91c1 --- /dev/null +++ b/angular/src/index.html @@ -0,0 +1,17 @@ + + + + + MeetingSchedule + + + + + + + + + diff --git a/angular/src/main.ts b/angular/src/main.ts new file mode 100644 index 0000000..15cc4d2 --- /dev/null +++ b/angular/src/main.ts @@ -0,0 +1,31 @@ +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { enableProdMode } from '@angular/core'; +import { environment } from './environments/environment'; +import { RootModule } from './root.module'; +import { hmrBootstrap } from './hmr'; + +import 'moment/min/locales.min'; +import 'moment-timezone'; + +if (environment.production) { + enableProdMode(); +} + +const bootstrap = () => { + return platformBrowserDynamic().bootstrapModule(RootModule); +}; + +/* "Hot Module Replacement" is enabled as described on + * https://medium.com/@beeman/tutorial-enable-hrm-in-angular-cli-apps-1b0d13b80130#.sa87zkloh + */ + +if (environment.hmr) { + if (module['hot']) { + hmrBootstrap(module, bootstrap); // HMR enabled bootstrap + } else { + console.error('HMR is not enabled for webpack-dev-server!'); + console.log('Are you using the --hmr flag for ng serve?'); + } +} else { + bootstrap(); // Regular bootstrap +} diff --git a/angular/src/polyfills.ts b/angular/src/polyfills.ts new file mode 100644 index 0000000..360cf69 --- /dev/null +++ b/angular/src/polyfills.ts @@ -0,0 +1,19 @@ +// This file includes polyfills needed by Angular 2 and is loaded before +// the app. You can add your own extra polyfills to this file. +import 'core-js/es/array'; +import 'core-js/es/date'; +import 'core-js/es/function'; +import 'core-js/es/map'; +import 'core-js/es/math'; +import 'core-js/es/number'; +import 'core-js/es/object'; +import 'core-js/es/parse-float'; +import 'core-js/es/parse-int'; +import 'core-js/es/reflect'; +import 'core-js/es/regexp'; +import 'core-js/es/set'; +import 'core-js/es/string'; +import 'core-js/es/symbol'; +import 'core-js/es/reflect'; +import { finalize } from 'rxjs/operators'; +import 'zone.js'; \ No newline at end of file diff --git a/angular/src/root-routing.module.ts b/angular/src/root-routing.module.ts new file mode 100644 index 0000000..70e0301 --- /dev/null +++ b/angular/src/root-routing.module.ts @@ -0,0 +1,23 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +const routes: Routes = [ + { path: '', redirectTo: '/app/about', pathMatch: 'full' }, + { + path: 'account', + loadChildren: () => import('account/account.module').then(m => m.AccountModule), // Lazy load account module + data: { preload: true } + }, + { + path: 'app', + loadChildren: () => import('app/app.module').then(m => m.AppModule), // Lazy load account module + data: { preload: true } + } +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes, { relativeLinkResolution: 'legacy' })], + exports: [RouterModule], + providers: [] +}) +export class RootRoutingModule { } diff --git a/angular/src/root.component.ts b/angular/src/root.component.ts new file mode 100644 index 0000000..233f3af --- /dev/null +++ b/angular/src/root.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + template: `` +}) +export class RootComponent { + +} diff --git a/angular/src/root.module.ts b/angular/src/root.module.ts new file mode 100644 index 0000000..ff85cd8 --- /dev/null +++ b/angular/src/root.module.ts @@ -0,0 +1,61 @@ +import { NgModule, APP_INITIALIZER, LOCALE_ID } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; + +import { ModalModule } from 'ngx-bootstrap/modal'; +import { BsDropdownModule } from 'ngx-bootstrap/dropdown'; +import { CollapseModule } from 'ngx-bootstrap/collapse'; +import { TabsModule } from 'ngx-bootstrap/tabs'; + +import { AbpHttpInterceptor } from 'abp-ng2-module'; + +import { SharedModule } from '@shared/shared.module'; +import { ServiceProxyModule } from '@shared/service-proxies/service-proxy.module'; +import { RootRoutingModule } from './root-routing.module'; +import { AppConsts } from '@shared/AppConsts'; +import { API_BASE_URL } from '@shared/service-proxies/service-proxies'; + +import { RootComponent } from './root.component'; +import { AppInitializer } from './app-initializer'; + +export function getCurrentLanguage(): string { + if (abp.localization.currentLanguage.name) { + return abp.localization.currentLanguage.name; + } + + // todo: Waiting for https://github.com/angular/angular/issues/31465 to be fixed. + return 'en'; +} + +@NgModule({ + imports: [ + BrowserModule, + BrowserAnimationsModule, + HttpClientModule, + SharedModule.forRoot(), + ModalModule.forRoot(), + BsDropdownModule.forRoot(), + CollapseModule.forRoot(), + TabsModule.forRoot(), + ServiceProxyModule, + RootRoutingModule, + ], + declarations: [RootComponent], + providers: [ + { provide: HTTP_INTERCEPTORS, useClass: AbpHttpInterceptor, multi: true }, + { + provide: APP_INITIALIZER, + useFactory: (appInitializer: AppInitializer) => appInitializer.init(), + deps: [AppInitializer], + multi: true, + }, + { provide: API_BASE_URL, useFactory: () => AppConsts.remoteServiceBaseUrl }, + { + provide: LOCALE_ID, + useFactory: getCurrentLanguage, + }, + ], + bootstrap: [RootComponent], +}) +export class RootModule {} diff --git a/angular/src/shared/AppConsts.ts b/angular/src/shared/AppConsts.ts new file mode 100644 index 0000000..bf9146b --- /dev/null +++ b/angular/src/shared/AppConsts.ts @@ -0,0 +1,20 @@ +export class AppConsts { + + static remoteServiceBaseUrl: string; + static appBaseUrl: string; + static appBaseHref: string; // returns angular's base-href parameter value if used during the publish + + static localeMappings: any = []; + + static readonly userManagement = { + defaultAdminUserName: 'admin' + }; + + static readonly localization = { + defaultLocalizationSourceName: 'MeetingSchedule' + }; + + static readonly authorization = { + encryptedAuthTokenName: 'enc_auth_token' + }; +} diff --git a/angular/src/shared/AppEnums.ts b/angular/src/shared/AppEnums.ts new file mode 100644 index 0000000..c8e6162 --- /dev/null +++ b/angular/src/shared/AppEnums.ts @@ -0,0 +1,8 @@ +import { TenantAvailabilityState } from '@shared/service-proxies/service-proxies'; + + +export class AppTenantAvailabilityState { + static Available: number = TenantAvailabilityState._1; + static InActive: number = TenantAvailabilityState._2; + static NotFound: number = TenantAvailabilityState._3; +} diff --git a/angular/src/shared/animations/routerTransition.ts b/angular/src/shared/animations/routerTransition.ts new file mode 100644 index 0000000..81d082f --- /dev/null +++ b/angular/src/shared/animations/routerTransition.ts @@ -0,0 +1,29 @@ +import { trigger, state, animate, style, transition } from '@angular/animations'; + +export function appModuleAnimation() { + return slideFromBottom(); +} + +export function accountModuleAnimation() { + return slideFromUp(); +} + +export function slideFromBottom() { + return trigger('routerTransition', [ + state('void', style({ 'padding-top': '20px', opacity: '0' })), + state('*', style({ 'padding-top': '0px', opacity: '1' })), + transition(':enter', [ + animate('0.33s ease-out', style({ opacity: '1', 'padding-top': '0px' })) + ]) + ]); +} + +export function slideFromUp() { + return trigger('routerTransition', [ + state('void', style({ 'margin-top': '10px', opacity: '0' })), + state('*', style({ 'margin-top': '0px', opacity: '1' })), + transition(':enter', [ + animate('0.3s ease-out', style({ opacity: '1', 'margin-top': '0px' })) + ]) + ]); +} diff --git a/angular/src/shared/app-component-base.ts b/angular/src/shared/app-component-base.ts new file mode 100644 index 0000000..ebb8473 --- /dev/null +++ b/angular/src/shared/app-component-base.ts @@ -0,0 +1,59 @@ +import { Injector, ElementRef } from '@angular/core'; +import { AppConsts } from '@shared/AppConsts'; +import { + LocalizationService, + PermissionCheckerService, + FeatureCheckerService, + NotifyService, + SettingService, + MessageService, + AbpMultiTenancyService +} from 'abp-ng2-module'; + +import { AppSessionService } from '@shared/session/app-session.service'; + +export abstract class AppComponentBase { + + localizationSourceName = AppConsts.localization.defaultLocalizationSourceName; + + localization: LocalizationService; + permission: PermissionCheckerService; + feature: FeatureCheckerService; + notify: NotifyService; + setting: SettingService; + message: MessageService; + multiTenancy: AbpMultiTenancyService; + appSession: AppSessionService; + elementRef: ElementRef; + + constructor(injector: Injector) { + this.localization = injector.get(LocalizationService); + this.permission = injector.get(PermissionCheckerService); + this.feature = injector.get(FeatureCheckerService); + this.notify = injector.get(NotifyService); + this.setting = injector.get(SettingService); + this.message = injector.get(MessageService); + this.multiTenancy = injector.get(AbpMultiTenancyService); + this.appSession = injector.get(AppSessionService); + this.elementRef = injector.get(ElementRef); + } + + l(key: string, ...args: any[]): string { + let localizedText = this.localization.localize(key, this.localizationSourceName); + + if (!localizedText) { + localizedText = key; + } + + if (!args || !args.length) { + return localizedText; + } + + args.unshift(localizedText); + return abp.utils.formatString.apply(this, args); + } + + isGranted(permissionName: string): boolean { + return this.permission.isGranted(permissionName); + } +} diff --git a/angular/src/shared/auth/app-auth.service.ts b/angular/src/shared/auth/app-auth.service.ts new file mode 100644 index 0000000..a17590a --- /dev/null +++ b/angular/src/shared/auth/app-auth.service.ts @@ -0,0 +1,107 @@ +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; +import { finalize } from 'rxjs/operators'; +import { TokenService, LogService, UtilsService } from 'abp-ng2-module'; +import { AppConsts } from '@shared/AppConsts'; +import { UrlHelper } from '@shared/helpers/UrlHelper'; +import { + AuthenticateModel, + AuthenticateResultModel, + TokenAuthServiceProxy, +} from '@shared/service-proxies/service-proxies'; + +@Injectable() +export class AppAuthService { + authenticateModel: AuthenticateModel; + authenticateResult: AuthenticateResultModel; + rememberMe: boolean; + + constructor( + private _tokenAuthService: TokenAuthServiceProxy, + private _router: Router, + private _utilsService: UtilsService, + private _tokenService: TokenService, + private _logService: LogService + ) { + this.clear(); + } + + logout(reload?: boolean): void { + abp.auth.clearToken(); + abp.utils.deleteCookie(AppConsts.authorization.encryptedAuthTokenName); + + if (reload !== false) { + location.href = AppConsts.appBaseUrl; + } + } + + authenticate(finallyCallback?: () => void): void { + finallyCallback = finallyCallback || (() => { }); + + this._tokenAuthService + .authenticate(this.authenticateModel) + .pipe( + finalize(() => { + finallyCallback(); + }) + ) + .subscribe((result: AuthenticateResultModel) => { + this.processAuthenticateResult(result); + }); + } + + private processAuthenticateResult( + authenticateResult: AuthenticateResultModel + ) { + this.authenticateResult = authenticateResult; + + if (authenticateResult.accessToken) { + // Successfully logged in + this.login( + authenticateResult.accessToken, + authenticateResult.encryptedAccessToken, + authenticateResult.expireInSeconds, + this.rememberMe + ); + } else { + // Unexpected result! + + this._logService.warn('Unexpected authenticateResult!'); + this._router.navigate(['account/login']); + } + } + + private login( + accessToken: string, + encryptedAccessToken: string, + expireInSeconds: number, + rememberMe?: boolean + ): void { + const tokenExpireDate = rememberMe + ? new Date(new Date().getTime() + 1000 * expireInSeconds) + : undefined; + + this._tokenService.setToken(accessToken, tokenExpireDate); + + this._utilsService.setCookieValue( + AppConsts.authorization.encryptedAuthTokenName, + encryptedAccessToken, + tokenExpireDate, + abp.appPath + ); + + let initialUrl = UrlHelper.initialUrl; + if (initialUrl.indexOf('/login') > 0) { + initialUrl = AppConsts.appBaseUrl; + } + + location.href = initialUrl; + } + + private clear(): void { + this.authenticateModel = new AuthenticateModel(); + this.authenticateModel.rememberClient = false; + this.authenticateResult = null; + this.rememberMe = false; + } +} diff --git a/angular/src/shared/auth/auth-route-guard.ts b/angular/src/shared/auth/auth-route-guard.ts new file mode 100644 index 0000000..39708f6 --- /dev/null +++ b/angular/src/shared/auth/auth-route-guard.ts @@ -0,0 +1,54 @@ +import { Injectable } from '@angular/core'; +import { PermissionCheckerService } from 'abp-ng2-module'; +import { AppSessionService } from '../session/app-session.service'; + +import { + CanActivate, Router, + ActivatedRouteSnapshot, + RouterStateSnapshot, + CanActivateChild +} from '@angular/router'; + +@Injectable() +export class AppRouteGuard implements CanActivate, CanActivateChild { + + constructor( + private _permissionChecker: PermissionCheckerService, + private _router: Router, + private _sessionService: AppSessionService, + ) { } + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { + if (!this._sessionService.user) { + this._router.navigate(['/account/login']); + return false; + } + + if (!route.data || !route.data['permission']) { + return true; + } + + if (this._permissionChecker.isGranted(route.data['permission'])) { + return true; + } + + this._router.navigate([this.selectBestRoute()]); + return false; + } + + canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { + return this.canActivate(route, state); + } + + selectBestRoute(): string { + if (!this._sessionService.user) { + return '/account/login'; + } + + if (this._permissionChecker.isGranted('Pages.Users')) { + return '/app/admin/users'; + } + + return '/app/home'; + } +} diff --git a/angular/src/shared/components/modal/abp-modal-footer.component.html b/angular/src/shared/components/modal/abp-modal-footer.component.html new file mode 100644 index 0000000..5720ead --- /dev/null +++ b/angular/src/shared/components/modal/abp-modal-footer.component.html @@ -0,0 +1,13 @@ + diff --git a/angular/src/shared/components/modal/abp-modal-footer.component.ts b/angular/src/shared/components/modal/abp-modal-footer.component.ts new file mode 100644 index 0000000..12a1f84 --- /dev/null +++ b/angular/src/shared/components/modal/abp-modal-footer.component.ts @@ -0,0 +1,27 @@ +import { + Component, + Input, + Output, + EventEmitter, + ChangeDetectionStrategy, + Injector +} from '@angular/core'; +import { AppComponentBase } from '@shared/app-component-base'; + +@Component({ + selector: 'abp-modal-footer', + templateUrl: './abp-modal-footer.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class AbpModalFooterComponent extends AppComponentBase { + @Input() cancelLabel = this.l('Cancel'); + @Input() cancelDisabled: boolean; + @Input() saveLabel = this.l('Save'); + @Input() saveDisabled: boolean; + + @Output() onCancelClick = new EventEmitter(); + + constructor(injector: Injector) { + super(injector); + } +} diff --git a/angular/src/shared/components/modal/abp-modal-header.component.html b/angular/src/shared/components/modal/abp-modal-header.component.html new file mode 100644 index 0000000..f348b6c --- /dev/null +++ b/angular/src/shared/components/modal/abp-modal-header.component.html @@ -0,0 +1,11 @@ + diff --git a/angular/src/shared/components/modal/abp-modal-header.component.ts b/angular/src/shared/components/modal/abp-modal-header.component.ts new file mode 100644 index 0000000..1a2a27a --- /dev/null +++ b/angular/src/shared/components/modal/abp-modal-header.component.ts @@ -0,0 +1,24 @@ +import { + Component, + Input, + Output, + EventEmitter, + ChangeDetectionStrategy, + Injector +} from '@angular/core'; +import { AppComponentBase } from '@shared/app-component-base'; + +@Component({ + selector: 'abp-modal-header', + templateUrl: './abp-modal-header.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class AbpModalHeaderComponent extends AppComponentBase { + @Input() title: string; + + @Output() onCloseClick = new EventEmitter(); + + constructor(injector: Injector) { + super(injector); + } +} diff --git a/angular/src/shared/components/pagination/abp-pagination-controls.component.html b/angular/src/shared/components/pagination/abp-pagination-controls.component.html new file mode 100644 index 0000000..658223c --- /dev/null +++ b/angular/src/shared/components/pagination/abp-pagination-controls.component.html @@ -0,0 +1,59 @@ + + + diff --git a/angular/src/shared/components/pagination/abp-pagination-controls.component.ts b/angular/src/shared/components/pagination/abp-pagination-controls.component.ts new file mode 100644 index 0000000..35e6413 --- /dev/null +++ b/angular/src/shared/components/pagination/abp-pagination-controls.component.ts @@ -0,0 +1,35 @@ +import { Component, Input, Output, EventEmitter } from '@angular/core'; + +@Component({ + selector: 'abp-pagination-controls', + templateUrl: './abp-pagination-controls.component.html' +}) +export class AbpPaginationControlsComponent { + + @Input() id: string; + @Input() maxSize = 7; + @Input() previousLabel = 'Previous'; + @Input() nextLabel = 'Next'; + @Input() screenReaderPaginationLabel = 'Pagination'; + @Input() screenReaderPageLabel = 'page'; + @Input() screenReaderCurrentLabel = `You're on page`; + @Output() pageChange: EventEmitter = new EventEmitter(); + + private _directionLinks = true; + private _autoHide = false; + + @Input() + get directionLinks(): boolean { + return this._directionLinks; + } + set directionLinks(value: boolean) { + this._directionLinks = !!value && value !== 'false'; + } + @Input() + get autoHide(): boolean { + return this._autoHide; + } + set autoHide(value: boolean) { + this._autoHide = !!value && value !== 'false'; + } +} diff --git a/angular/src/shared/components/validation/abp-validation.api.ts b/angular/src/shared/components/validation/abp-validation.api.ts new file mode 100644 index 0000000..43b2284 --- /dev/null +++ b/angular/src/shared/components/validation/abp-validation.api.ts @@ -0,0 +1,5 @@ +export interface AbpValidationError { + name: string; + localizationKey: string; + propertyKey: string; +} diff --git a/angular/src/shared/components/validation/abp-validation.summary.component.html b/angular/src/shared/components/validation/abp-validation.summary.component.html new file mode 100644 index 0000000..2c5fa0d --- /dev/null +++ b/angular/src/shared/components/validation/abp-validation.summary.component.html @@ -0,0 +1,11 @@ + + + + {{ getValidationErrorMessage(validationError) }} + + + diff --git a/angular/src/shared/components/validation/abp-validation.summary.component.ts b/angular/src/shared/components/validation/abp-validation.summary.component.ts new file mode 100644 index 0000000..e7e79f9 --- /dev/null +++ b/angular/src/shared/components/validation/abp-validation.summary.component.ts @@ -0,0 +1,90 @@ +import { + Component, + Input, + Injector, + Renderer2, + ElementRef, + OnInit +} from '@angular/core'; +import { AbstractControl } from '@angular/forms'; +import { AppComponentBase } from '@shared/app-component-base'; +import { AbpValidationError } from './abp-validation.api'; + +@Component({ + selector: 'abp-validation-summary', + templateUrl: './abp-validation.summary.component.html' +}) +export class AbpValidationSummaryComponent extends AppComponentBase implements OnInit { + + defaultValidationErrors: Partial[] = [ + { name: 'required', localizationKey: 'ThisFieldIsRequired' }, + { + name: 'minlength', + localizationKey: 'PleaseEnterAtLeastNCharacter', + propertyKey: 'requiredLength', + }, + { + name: 'maxlength', + localizationKey: 'PleaseEnterNoMoreThanNCharacter', + propertyKey: 'requiredLength', + }, + { + name: 'email', + localizationKey: 'InvalidEmailAddress', + }, + { + name: 'pattern', + localizationKey: 'InvalidPattern', + propertyKey: 'requiredPattern', + }, + { + name: 'validateEqual', + localizationKey: 'PairsDoNotMatch', + }, + ]; + validationErrors = this.defaultValidationErrors; + + @Input() control: AbstractControl; + @Input() controlEl: ElementRef; + + constructor(injector: Injector, public _renderer: Renderer2) { + super(injector); + } + + @Input() set customValidationErrors(val: AbpValidationError[]) { + if (val && val.length > 0) { + const defaults = this.defaultValidationErrors.filter( + (defaultValidationError) => + !val.find( + (customValidationError) => + customValidationError.name === defaultValidationError.name + ) + ); + this.validationErrors = [...defaults, ...val]; + } + } + + ngOnInit() { + if (this.controlEl) { + this.control.valueChanges.subscribe(() => { + if ( + this.control.valid && + (this.control.dirty || this.control.touched) + ) { + this._renderer.removeClass(this.controlEl, 'is-invalid'); + } + }); + } + } + + getValidationErrorMessage(error: AbpValidationError): string { + if (this.controlEl) { + this._renderer.addClass(this.controlEl, 'is-invalid'); + } + + const propertyValue = this.control.errors[error.name][error.propertyKey]; + return !!propertyValue + ? this.l(error.localizationKey, propertyValue) + : this.l(error.localizationKey); + } +} diff --git a/angular/src/shared/core.less b/angular/src/shared/core.less new file mode 100644 index 0000000..e92f564 --- /dev/null +++ b/angular/src/shared/core.less @@ -0,0 +1,69 @@ +@media (min-width: 576px) { + .nav-user-menu .user-image { + float: none; + line-height: 10px; + margin-top: -8px; + } +} + +.nav-user-menu .user-image { + border-radius: 50%; + float: left; + height: 2rem; + margin-top: -4px; + width: 2rem; +} + +.form-group.required .col-form-label:after { + color: #d00; + content: "*"; + position: absolute; + margin-left: 3px; +} + +/* Sweet alert */ +.swal2-title { + display: inline-block !important; +} + +body.swal2-height-auto { + height: inherit !important; +} + +.swal2-popup.swal2-toast { + padding: 10px 12px !important; + display: block !important; +} + +.swal2-popup.swal2-toast .swal2-header, +.swal2-popup.swal2-toast .swal2-title, +.swal2-popup.swal2-toast .swal2-content { + text-align: left !important; + margin: 0 !important; +} + +.swal2-popup.swal2-toast .swal2-title { + margin-bottom: 4px !important; +} + +div.wrapper, +div.content-wrapper, +div.sidebar { + min-height: 100vh; +} + +table.table { + * { + font-size: 14px !important; + } + + th, + td { + padding: 8px; + vertical-align: middle; + } +} + +table-card-footer * { + font-size: 14px; +} diff --git a/angular/src/shared/directives/busy.directive.ts b/angular/src/shared/directives/busy.directive.ts new file mode 100644 index 0000000..efcfcc4 --- /dev/null +++ b/angular/src/shared/directives/busy.directive.ts @@ -0,0 +1,25 @@ +import { Directive, ElementRef, Input } from '@angular/core'; + +@Directive({ + selector: '[busy]', +}) +export class BusyDirective { + + constructor(private _element: ElementRef) { } + + @Input() set busy(isBusy: boolean) { + this.refreshState(isBusy); + } + + refreshState(isBusy: boolean): void { + if (isBusy === undefined) { + return; + } + + if (isBusy) { + abp.ui.setBusy(this._element.nativeElement); + } else { + abp.ui.clearBusy(this._element.nativeElement); + } + } +} diff --git a/angular/src/shared/directives/equal-validator.directive.ts b/angular/src/shared/directives/equal-validator.directive.ts new file mode 100644 index 0000000..6c33958 --- /dev/null +++ b/angular/src/shared/directives/equal-validator.directive.ts @@ -0,0 +1,58 @@ +import { Directive, forwardRef, Attribute } from '@angular/core'; +import { Validator, AbstractControl, NG_VALIDATORS } from '@angular/forms'; + +@Directive({ + selector: + // tslint:disable-next-line:directive-selector + '[validateEqual][formControlName],[validateEqual][formControl],[validateEqual][ngModel]', + providers: [ + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => EqualValidator), + multi: true + } + ] +}) +export class EqualValidator implements Validator { + constructor( + @Attribute('validateEqual') public validateEqual: string, + @Attribute('reverse') public reverse: string + ) {} + + private get isReverse() { + if (!this.reverse) { + return false; + } + return this.reverse === 'true' ? true : false; + } + + validate(control: AbstractControl): { [key: string]: any } { + // self value + const value = control.value; + + // second control + const control2 = control.root.get(this.validateEqual); + + // value not equal + if (control2 && value !== control2.value && !this.isReverse) { + return { + validateEqual: true + }; + } + + // value equal and reverse + if (control2 && value === control2.value && this.isReverse) { + delete control2.errors['validateEqual']; + if (!Object.keys(control2.errors).length) { + control2.setErrors(null); + } + } + + // value not equal and reverse + if (control2 && value !== control2.value && this.isReverse) { + control2.setErrors({ validateEqual: true }); + } + + return null; + } +} diff --git a/angular/src/shared/helpers/SignalRAspNetCoreHelper.ts b/angular/src/shared/helpers/SignalRAspNetCoreHelper.ts new file mode 100644 index 0000000..98ceb7a --- /dev/null +++ b/angular/src/shared/helpers/SignalRAspNetCoreHelper.ts @@ -0,0 +1,27 @@ +import { AppConsts } from '@shared/AppConsts'; +import { UtilsService } from 'abp-ng2-module'; + +export class SignalRAspNetCoreHelper { + static initSignalR(callback?: () => void): void { + const encryptedAuthToken = new UtilsService().getCookieValue(AppConsts.authorization.encryptedAuthTokenName); + + abp.signalr = { + autoConnect: true, + connect: undefined, + hubs: undefined, + qs: AppConsts.authorization.encryptedAuthTokenName + '=' + encodeURIComponent(encryptedAuthToken), + remoteServiceBaseUrl: AppConsts.remoteServiceBaseUrl, + startConnection: undefined, + url: '/signalr' + }; + + const script = document.createElement('script'); + if (callback) { + script.onload = () => { + callback(); + }; + } + script.src = AppConsts.appBaseUrl + '/assets/abp/abp.signalr-client.js'; + document.head.appendChild(script); + } +} diff --git a/angular/src/shared/helpers/UrlHelper.ts b/angular/src/shared/helpers/UrlHelper.ts new file mode 100644 index 0000000..53bfe5d --- /dev/null +++ b/angular/src/shared/helpers/UrlHelper.ts @@ -0,0 +1,13 @@ +export class UrlHelper { + /** + * The URL requested, before initial routing. + */ + static readonly initialUrl = location.href; + + static getQueryParameters(): any { + return document.location.search + .replace(/(^\?)/, '') + .split('&') + .map(function (n) { return n = n.split('='), this[n[0]] = n[1], this; }.bind({}))[0]; + } +} diff --git a/angular/src/shared/layout/layout-config.ts b/angular/src/shared/layout/layout-config.ts new file mode 100644 index 0000000..cb75e63 --- /dev/null +++ b/angular/src/shared/layout/layout-config.ts @@ -0,0 +1,3 @@ +export class LayoutConfig { + sidebarExpanded?: boolean; +} diff --git a/angular/src/shared/layout/layout-store.service.ts b/angular/src/shared/layout/layout-store.service.ts new file mode 100644 index 0000000..50576c7 --- /dev/null +++ b/angular/src/shared/layout/layout-store.service.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { distinctUntilChanged, pluck } from 'rxjs/operators'; +import { LayoutConfig } from './layout-config'; + +@Injectable() +export class LayoutStoreService { + public readonly config$: Observable; + private readonly initialLayoutConfig: LayoutConfig = { + sidebarExpanded: false + }; + private configSource: BehaviorSubject; + + constructor() { + this.configSource = new BehaviorSubject(this.initialLayoutConfig); + this.config$ = this.configSource.asObservable(); + } + + get sidebarExpanded(): Observable { + return this.config$.pipe( + pluck('sidebarExpanded'), + distinctUntilChanged() + ) as Observable; + } + + public setSidebarExpanded(value: boolean): void { + this.configSource.next( + Object.assign(this.configSource.value, { sidebarExpanded: value }) + ); + } +} diff --git a/angular/src/shared/layout/menu-item.ts b/angular/src/shared/layout/menu-item.ts new file mode 100644 index 0000000..ab7dff0 --- /dev/null +++ b/angular/src/shared/layout/menu-item.ts @@ -0,0 +1,25 @@ +export class MenuItem { + id: number; + parentId: number; + label: string; + route: string; + icon: string; + permissionName: string; + isActive?: boolean; + isCollapsed?: boolean; + children: MenuItem[]; + + constructor( + label: string, + route: string, + icon: string, + permissionName: string = null, + children: MenuItem[] = null + ) { + this.label = label; + this.route = route; + this.icon = icon; + this.permissionName = permissionName; + this.children = children; + } +} diff --git a/angular/src/shared/nav/app-url.service.ts b/angular/src/shared/nav/app-url.service.ts new file mode 100644 index 0000000..2c07611 --- /dev/null +++ b/angular/src/shared/nav/app-url.service.ts @@ -0,0 +1,63 @@ +import { Injectable } from '@angular/core'; +import { AppConsts } from '@shared/AppConsts'; +import { AppSessionService } from '../session/app-session.service'; + +@Injectable() +export class AppUrlService { + + static tenancyNamePlaceHolder = '{TENANCY_NAME}'; + + constructor( + private readonly _appSessionService: AppSessionService + ) { + + } + + get appRootUrl(): string { + if (this._appSessionService.tenant) { + return this.getAppRootUrlOfTenant(this._appSessionService.tenant.tenancyName); + } else { + return this.getAppRootUrlOfTenant(null); + } + } + + /** + * Returning url ends with '/'. + */ + getAppRootUrlOfTenant(tenancyName?: string): string { + let baseUrl = this.ensureEndsWith(AppConsts.appBaseUrl, '/'); + + if (baseUrl.indexOf(AppUrlService.tenancyNamePlaceHolder) < 0) { + return baseUrl; + } + + if (baseUrl.indexOf(AppUrlService.tenancyNamePlaceHolder + '.') >= 0) { + baseUrl = baseUrl.replace(AppUrlService.tenancyNamePlaceHolder + '.', AppUrlService.tenancyNamePlaceHolder); + if (tenancyName) { + tenancyName = tenancyName + '.'; + } + } + + if (!tenancyName) { + return baseUrl.replace(AppUrlService.tenancyNamePlaceHolder, ''); + } + + return baseUrl.replace(AppUrlService.tenancyNamePlaceHolder, tenancyName); + } + + private ensureEndsWith(str: string, c: string) { + if (str.charAt(str.length - 1) !== c) { + str = str + c; + } + + return str; + } + + private removeFromEnd(str: string, c: string) { + if (str.charAt(str.length - 1) === c) { + str = str.substr(0, str.length - 1); + } + + return str; + } +} diff --git a/angular/src/shared/paged-listing-component-base.ts b/angular/src/shared/paged-listing-component-base.ts new file mode 100644 index 0000000..5bb3132 --- /dev/null +++ b/angular/src/shared/paged-listing-component-base.ts @@ -0,0 +1,61 @@ +import { AppComponentBase } from 'shared/app-component-base'; +import { Component, Injector, OnInit } from '@angular/core'; + +export class PagedResultDto { + items: any[]; + totalCount: number; +} + +export class EntityDto { + id: number; +} + +export class PagedRequestDto { + skipCount: number; + maxResultCount: number; +} + +@Component({ + template: '' +}) +export abstract class PagedListingComponentBase extends AppComponentBase implements OnInit { + + public pageSize = 10; + public pageNumber = 1; + public totalPages = 1; + public totalItems: number; + public isTableLoading = false; + + constructor(injector: Injector) { + super(injector); + } + + ngOnInit(): void { + this.refresh(); + } + + refresh(): void { + this.getDataPage(this.pageNumber); + } + + public showPaging(result: PagedResultDto, pageNumber: number): void { + this.totalPages = ((result.totalCount - (result.totalCount % this.pageSize)) / this.pageSize) + 1; + + this.totalItems = result.totalCount; + this.pageNumber = pageNumber; + } + + public getDataPage(page: number): void { + const req = new PagedRequestDto(); + req.maxResultCount = this.pageSize; + req.skipCount = (page - 1) * this.pageSize; + + this.isTableLoading = true; + this.list(req, page, () => { + this.isTableLoading = false; + }); + } + + protected abstract list(request: PagedRequestDto, pageNumber: number, finishedCallback: Function): void; + protected abstract delete(entity: TEntityDto): void; +} diff --git a/angular/src/shared/pipes/localize.pipe.ts b/angular/src/shared/pipes/localize.pipe.ts new file mode 100644 index 0000000..dce6224 --- /dev/null +++ b/angular/src/shared/pipes/localize.pipe.ts @@ -0,0 +1,16 @@ +import { Injector, Pipe, PipeTransform } from '@angular/core'; +import { AppComponentBase } from '@shared/app-component-base'; + +@Pipe({ + name: 'localize' +}) +export class LocalizePipe extends AppComponentBase implements PipeTransform { + + constructor(injector: Injector) { + super(injector); + } + + transform(key: string, ...args: any[]): string { + return this.l(key, ...args); + } +} diff --git a/angular/src/shared/service-proxies/service-proxies.ts b/angular/src/shared/service-proxies/service-proxies.ts new file mode 100644 index 0000000..43de62e --- /dev/null +++ b/angular/src/shared/service-proxies/service-proxies.ts @@ -0,0 +1,3822 @@ +/* tslint:disable */ +/* eslint-disable */ +//---------------------- +// +// Generated using the NSwag toolchain v13.11.3.0 (NJsonSchema v10.4.4.0 (Newtonsoft.Json v11.0.0.0)) (http://NSwag.org) +// +//---------------------- +// ReSharper disable InconsistentNaming + +import { mergeMap as _observableMergeMap, catchError as _observableCatch } from 'rxjs/operators'; +import { Observable, throwError as _observableThrow, of as _observableOf } from 'rxjs'; +import { Injectable, Inject, Optional, InjectionToken } from '@angular/core'; +import { HttpClient, HttpHeaders, HttpResponse, HttpResponseBase } from '@angular/common/http'; + +import * as moment from 'moment'; + +export const API_BASE_URL = new InjectionToken('API_BASE_URL'); + +@Injectable() +export class AccountServiceProxy { + private http: HttpClient; + private baseUrl: string; + protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined; + + constructor(@Inject(HttpClient) http: HttpClient, @Optional() @Inject(API_BASE_URL) baseUrl?: string) { + this.http = http; + this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : ""; + } + + /** + * @param body (optional) + * @return Success + */ + isTenantAvailable(body: IsTenantAvailableInput | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/Account/IsTenantAvailable"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ : any = { + body: content_, + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Content-Type": "application/json-patch+json", + "Accept": "text/plain" + }) + }; + + return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processIsTenantAvailable(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processIsTenantAvailable(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processIsTenantAvailable(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = IsTenantAvailableOutput.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param body (optional) + * @return Success + */ + register(body: RegisterInput | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/Account/Register"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ : any = { + body: content_, + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Content-Type": "application/json-patch+json", + "Accept": "text/plain" + }) + }; + + return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processRegister(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processRegister(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processRegister(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = RegisterOutput.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } +} + +@Injectable() +export class ConfigurationServiceProxy { + private http: HttpClient; + private baseUrl: string; + protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined; + + constructor(@Inject(HttpClient) http: HttpClient, @Optional() @Inject(API_BASE_URL) baseUrl?: string) { + this.http = http; + this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : ""; + } + + /** + * @param body (optional) + * @return Success + */ + changeUiTheme(body: ChangeUiThemeInput | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/Configuration/ChangeUiTheme"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ : any = { + body: content_, + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Content-Type": "application/json-patch+json", + }) + }; + + return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processChangeUiTheme(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processChangeUiTheme(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processChangeUiTheme(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return _observableOf(null); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } +} + +@Injectable() +export class RoleServiceProxy { + private http: HttpClient; + private baseUrl: string; + protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined; + + constructor(@Inject(HttpClient) http: HttpClient, @Optional() @Inject(API_BASE_URL) baseUrl?: string) { + this.http = http; + this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : ""; + } + + /** + * @param body (optional) + * @return Success + */ + create(body: CreateRoleDto | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/Role/Create"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ : any = { + body: content_, + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Content-Type": "application/json-patch+json", + "Accept": "text/plain" + }) + }; + + return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processCreate(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processCreate(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processCreate(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = RoleDto.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param permission (optional) + * @return Success + */ + getRoles(permission: string | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/Role/GetRoles?"; + if (permission === null) + throw new Error("The parameter 'permission' cannot be null."); + else if (permission !== undefined) + url_ += "Permission=" + encodeURIComponent("" + permission) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_ : any = { + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Accept": "text/plain" + }) + }; + + return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processGetRoles(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processGetRoles(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processGetRoles(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = RoleListDtoListResultDto.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param body (optional) + * @return Success + */ + update(body: RoleDto | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/Role/Update"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ : any = { + body: content_, + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Content-Type": "application/json-patch+json", + "Accept": "text/plain" + }) + }; + + return this.http.request("put", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processUpdate(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processUpdate(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processUpdate(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = RoleDto.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param id (optional) + * @return Success + */ + delete(id: number | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/Role/Delete?"; + if (id === null) + throw new Error("The parameter 'id' cannot be null."); + else if (id !== undefined) + url_ += "Id=" + encodeURIComponent("" + id) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_ : any = { + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + }) + }; + + return this.http.request("delete", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processDelete(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processDelete(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processDelete(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return _observableOf(null); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @return Success + */ + getAllPermissions(): Observable { + let url_ = this.baseUrl + "/api/services/app/Role/GetAllPermissions"; + url_ = url_.replace(/[?&]$/, ""); + + let options_ : any = { + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Accept": "text/plain" + }) + }; + + return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processGetAllPermissions(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processGetAllPermissions(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processGetAllPermissions(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = PermissionDtoListResultDto.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param id (optional) + * @return Success + */ + getRoleForEdit(id: number | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/Role/GetRoleForEdit?"; + if (id === null) + throw new Error("The parameter 'id' cannot be null."); + else if (id !== undefined) + url_ += "Id=" + encodeURIComponent("" + id) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_ : any = { + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Accept": "text/plain" + }) + }; + + return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processGetRoleForEdit(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processGetRoleForEdit(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processGetRoleForEdit(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = GetRoleForEditOutput.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param id (optional) + * @return Success + */ + get(id: number | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/Role/Get?"; + if (id === null) + throw new Error("The parameter 'id' cannot be null."); + else if (id !== undefined) + url_ += "Id=" + encodeURIComponent("" + id) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_ : any = { + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Accept": "text/plain" + }) + }; + + return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processGet(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processGet(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processGet(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = RoleDto.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param keyword (optional) + * @param skipCount (optional) + * @param maxResultCount (optional) + * @return Success + */ + getAll(keyword: string | undefined, skipCount: number | undefined, maxResultCount: number | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/Role/GetAll?"; + if (keyword === null) + throw new Error("The parameter 'keyword' cannot be null."); + else if (keyword !== undefined) + url_ += "Keyword=" + encodeURIComponent("" + keyword) + "&"; + if (skipCount === null) + throw new Error("The parameter 'skipCount' cannot be null."); + else if (skipCount !== undefined) + url_ += "SkipCount=" + encodeURIComponent("" + skipCount) + "&"; + if (maxResultCount === null) + throw new Error("The parameter 'maxResultCount' cannot be null."); + else if (maxResultCount !== undefined) + url_ += "MaxResultCount=" + encodeURIComponent("" + maxResultCount) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_ : any = { + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Accept": "text/plain" + }) + }; + + return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processGetAll(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processGetAll(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processGetAll(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = RoleDtoPagedResultDto.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } +} + +@Injectable() +export class SessionServiceProxy { + private http: HttpClient; + private baseUrl: string; + protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined; + + constructor(@Inject(HttpClient) http: HttpClient, @Optional() @Inject(API_BASE_URL) baseUrl?: string) { + this.http = http; + this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : ""; + } + + /** + * @return Success + */ + getCurrentLoginInformations(): Observable { + let url_ = this.baseUrl + "/api/services/app/Session/GetCurrentLoginInformations"; + url_ = url_.replace(/[?&]$/, ""); + + let options_ : any = { + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Accept": "text/plain" + }) + }; + + return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processGetCurrentLoginInformations(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processGetCurrentLoginInformations(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processGetCurrentLoginInformations(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = GetCurrentLoginInformationsOutput.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } +} + +@Injectable() +export class TenantServiceProxy { + private http: HttpClient; + private baseUrl: string; + protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined; + + constructor(@Inject(HttpClient) http: HttpClient, @Optional() @Inject(API_BASE_URL) baseUrl?: string) { + this.http = http; + this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : ""; + } + + /** + * @param body (optional) + * @return Success + */ + create(body: CreateTenantDto | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/Tenant/Create"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ : any = { + body: content_, + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Content-Type": "application/json-patch+json", + "Accept": "text/plain" + }) + }; + + return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processCreate(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processCreate(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processCreate(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = TenantDto.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param id (optional) + * @return Success + */ + delete(id: number | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/Tenant/Delete?"; + if (id === null) + throw new Error("The parameter 'id' cannot be null."); + else if (id !== undefined) + url_ += "Id=" + encodeURIComponent("" + id) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_ : any = { + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + }) + }; + + return this.http.request("delete", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processDelete(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processDelete(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processDelete(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return _observableOf(null); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param id (optional) + * @return Success + */ + get(id: number | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/Tenant/Get?"; + if (id === null) + throw new Error("The parameter 'id' cannot be null."); + else if (id !== undefined) + url_ += "Id=" + encodeURIComponent("" + id) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_ : any = { + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Accept": "text/plain" + }) + }; + + return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processGet(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processGet(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processGet(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = TenantDto.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param keyword (optional) + * @param isActive (optional) + * @param skipCount (optional) + * @param maxResultCount (optional) + * @return Success + */ + getAll(keyword: string | undefined, isActive: boolean | undefined, skipCount: number | undefined, maxResultCount: number | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/Tenant/GetAll?"; + if (keyword === null) + throw new Error("The parameter 'keyword' cannot be null."); + else if (keyword !== undefined) + url_ += "Keyword=" + encodeURIComponent("" + keyword) + "&"; + if (isActive === null) + throw new Error("The parameter 'isActive' cannot be null."); + else if (isActive !== undefined) + url_ += "IsActive=" + encodeURIComponent("" + isActive) + "&"; + if (skipCount === null) + throw new Error("The parameter 'skipCount' cannot be null."); + else if (skipCount !== undefined) + url_ += "SkipCount=" + encodeURIComponent("" + skipCount) + "&"; + if (maxResultCount === null) + throw new Error("The parameter 'maxResultCount' cannot be null."); + else if (maxResultCount !== undefined) + url_ += "MaxResultCount=" + encodeURIComponent("" + maxResultCount) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_ : any = { + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Accept": "text/plain" + }) + }; + + return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processGetAll(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processGetAll(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processGetAll(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = TenantDtoPagedResultDto.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param body (optional) + * @return Success + */ + update(body: TenantDto | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/Tenant/Update"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ : any = { + body: content_, + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Content-Type": "application/json-patch+json", + "Accept": "text/plain" + }) + }; + + return this.http.request("put", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processUpdate(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processUpdate(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processUpdate(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = TenantDto.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } +} + +@Injectable() +export class TokenAuthServiceProxy { + private http: HttpClient; + private baseUrl: string; + protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined; + + constructor(@Inject(HttpClient) http: HttpClient, @Optional() @Inject(API_BASE_URL) baseUrl?: string) { + this.http = http; + this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : ""; + } + + /** + * @param body (optional) + * @return Success + */ + authenticate(body: AuthenticateModel | undefined): Observable { + let url_ = this.baseUrl + "/api/TokenAuth/Authenticate"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ : any = { + body: content_, + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Content-Type": "application/json-patch+json", + "Accept": "text/plain" + }) + }; + + return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processAuthenticate(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processAuthenticate(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processAuthenticate(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = AuthenticateResultModel.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @return Success + */ + getExternalAuthenticationProviders(): Observable { + let url_ = this.baseUrl + "/api/TokenAuth/GetExternalAuthenticationProviders"; + url_ = url_.replace(/[?&]$/, ""); + + let options_ : any = { + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Accept": "text/plain" + }) + }; + + return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processGetExternalAuthenticationProviders(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processGetExternalAuthenticationProviders(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processGetExternalAuthenticationProviders(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + if (Array.isArray(resultData200)) { + result200 = [] as any; + for (let item of resultData200) + result200.push(ExternalLoginProviderInfoModel.fromJS(item)); + } + else { + result200 = null; + } + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param body (optional) + * @return Success + */ + externalAuthenticate(body: ExternalAuthenticateModel | undefined): Observable { + let url_ = this.baseUrl + "/api/TokenAuth/ExternalAuthenticate"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ : any = { + body: content_, + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Content-Type": "application/json-patch+json", + "Accept": "text/plain" + }) + }; + + return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processExternalAuthenticate(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processExternalAuthenticate(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processExternalAuthenticate(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = ExternalAuthenticateResultModel.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } +} + +@Injectable() +export class UserServiceProxy { + private http: HttpClient; + private baseUrl: string; + protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined; + + constructor(@Inject(HttpClient) http: HttpClient, @Optional() @Inject(API_BASE_URL) baseUrl?: string) { + this.http = http; + this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : ""; + } + + /** + * @param body (optional) + * @return Success + */ + create(body: CreateUserDto | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/User/Create"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ : any = { + body: content_, + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Content-Type": "application/json-patch+json", + "Accept": "text/plain" + }) + }; + + return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processCreate(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processCreate(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processCreate(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = UserDto.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param body (optional) + * @return Success + */ + update(body: UserDto | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/User/Update"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ : any = { + body: content_, + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Content-Type": "application/json-patch+json", + "Accept": "text/plain" + }) + }; + + return this.http.request("put", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processUpdate(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processUpdate(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processUpdate(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = UserDto.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param id (optional) + * @return Success + */ + delete(id: number | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/User/Delete?"; + if (id === null) + throw new Error("The parameter 'id' cannot be null."); + else if (id !== undefined) + url_ += "Id=" + encodeURIComponent("" + id) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_ : any = { + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + }) + }; + + return this.http.request("delete", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processDelete(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processDelete(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processDelete(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return _observableOf(null); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param body (optional) + * @return Success + */ + activate(body: Int64EntityDto | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/User/Activate"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ : any = { + body: content_, + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Content-Type": "application/json-patch+json", + }) + }; + + return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processActivate(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processActivate(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processActivate(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return _observableOf(null); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param body (optional) + * @return Success + */ + deActivate(body: Int64EntityDto | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/User/DeActivate"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ : any = { + body: content_, + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Content-Type": "application/json-patch+json", + }) + }; + + return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processDeActivate(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processDeActivate(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processDeActivate(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return _observableOf(null); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @return Success + */ + getRoles(): Observable { + let url_ = this.baseUrl + "/api/services/app/User/GetRoles"; + url_ = url_.replace(/[?&]$/, ""); + + let options_ : any = { + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Accept": "text/plain" + }) + }; + + return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processGetRoles(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processGetRoles(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processGetRoles(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = RoleDtoListResultDto.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param body (optional) + * @return Success + */ + changeLanguage(body: ChangeUserLanguageDto | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/User/ChangeLanguage"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ : any = { + body: content_, + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Content-Type": "application/json-patch+json", + }) + }; + + return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processChangeLanguage(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processChangeLanguage(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processChangeLanguage(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return _observableOf(null); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param body (optional) + * @return Success + */ + changePassword(body: ChangePasswordDto | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/User/ChangePassword"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ : any = { + body: content_, + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Content-Type": "application/json-patch+json", + "Accept": "text/plain" + }) + }; + + return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processChangePassword(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processChangePassword(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processChangePassword(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param body (optional) + * @return Success + */ + resetPassword(body: ResetPasswordDto | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/User/ResetPassword"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ : any = { + body: content_, + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Content-Type": "application/json-patch+json", + "Accept": "text/plain" + }) + }; + + return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processResetPassword(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processResetPassword(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processResetPassword(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param id (optional) + * @return Success + */ + get(id: number | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/User/Get?"; + if (id === null) + throw new Error("The parameter 'id' cannot be null."); + else if (id !== undefined) + url_ += "Id=" + encodeURIComponent("" + id) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_ : any = { + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Accept": "text/plain" + }) + }; + + return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processGet(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processGet(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processGet(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = UserDto.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } + + /** + * @param keyword (optional) + * @param isActive (optional) + * @param skipCount (optional) + * @param maxResultCount (optional) + * @return Success + */ + getAll(keyword: string | undefined, isActive: boolean | undefined, skipCount: number | undefined, maxResultCount: number | undefined): Observable { + let url_ = this.baseUrl + "/api/services/app/User/GetAll?"; + if (keyword === null) + throw new Error("The parameter 'keyword' cannot be null."); + else if (keyword !== undefined) + url_ += "Keyword=" + encodeURIComponent("" + keyword) + "&"; + if (isActive === null) + throw new Error("The parameter 'isActive' cannot be null."); + else if (isActive !== undefined) + url_ += "IsActive=" + encodeURIComponent("" + isActive) + "&"; + if (skipCount === null) + throw new Error("The parameter 'skipCount' cannot be null."); + else if (skipCount !== undefined) + url_ += "SkipCount=" + encodeURIComponent("" + skipCount) + "&"; + if (maxResultCount === null) + throw new Error("The parameter 'maxResultCount' cannot be null."); + else if (maxResultCount !== undefined) + url_ += "MaxResultCount=" + encodeURIComponent("" + maxResultCount) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_ : any = { + observe: "response", + responseType: "blob", + headers: new HttpHeaders({ + "Accept": "text/plain" + }) + }; + + return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_ : any) => { + return this.processGetAll(response_); + })).pipe(_observableCatch((response_: any) => { + if (response_ instanceof HttpResponseBase) { + try { + return this.processGetAll(response_); + } catch (e) { + return >_observableThrow(e); + } + } else + return >_observableThrow(response_); + })); + } + + protected processGetAll(response: HttpResponseBase): Observable { + const status = response.status; + const responseBlob = + response instanceof HttpResponse ? response.body : + (response).error instanceof Blob ? (response).error : undefined; + + let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }} + if (status === 200) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = UserDtoPagedResultDto.fromJS(resultData200); + return _observableOf(result200); + })); + } else if (status !== 200 && status !== 204) { + return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + })); + } + return _observableOf(null); + } +} + +export class ApplicationInfoDto implements IApplicationInfoDto { + version: string | undefined; + releaseDate: moment.Moment; + features: { [key: string]: boolean; } | undefined; + + constructor(data?: IApplicationInfoDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.version = _data["version"]; + this.releaseDate = _data["releaseDate"] ? moment(_data["releaseDate"].toString()) : undefined; + if (_data["features"]) { + this.features = {} as any; + for (let key in _data["features"]) { + if (_data["features"].hasOwnProperty(key)) + (this.features)[key] = _data["features"][key]; + } + } + } + } + + static fromJS(data: any): ApplicationInfoDto { + data = typeof data === 'object' ? data : {}; + let result = new ApplicationInfoDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["version"] = this.version; + data["releaseDate"] = this.releaseDate ? this.releaseDate.toISOString() : undefined; + if (this.features) { + data["features"] = {}; + for (let key in this.features) { + if (this.features.hasOwnProperty(key)) + (data["features"])[key] = this.features[key]; + } + } + return data; + } + + clone(): ApplicationInfoDto { + const json = this.toJSON(); + let result = new ApplicationInfoDto(); + result.init(json); + return result; + } +} + +export interface IApplicationInfoDto { + version: string | undefined; + releaseDate: moment.Moment; + features: { [key: string]: boolean; } | undefined; +} + +export class AuthenticateModel implements IAuthenticateModel { + userNameOrEmailAddress: string; + password: string; + rememberClient: boolean; + + constructor(data?: IAuthenticateModel) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.userNameOrEmailAddress = _data["userNameOrEmailAddress"]; + this.password = _data["password"]; + this.rememberClient = _data["rememberClient"]; + } + } + + static fromJS(data: any): AuthenticateModel { + data = typeof data === 'object' ? data : {}; + let result = new AuthenticateModel(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["userNameOrEmailAddress"] = this.userNameOrEmailAddress; + data["password"] = this.password; + data["rememberClient"] = this.rememberClient; + return data; + } + + clone(): AuthenticateModel { + const json = this.toJSON(); + let result = new AuthenticateModel(); + result.init(json); + return result; + } +} + +export interface IAuthenticateModel { + userNameOrEmailAddress: string; + password: string; + rememberClient: boolean; +} + +export class AuthenticateResultModel implements IAuthenticateResultModel { + accessToken: string | undefined; + encryptedAccessToken: string | undefined; + expireInSeconds: number; + userId: number; + + constructor(data?: IAuthenticateResultModel) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.accessToken = _data["accessToken"]; + this.encryptedAccessToken = _data["encryptedAccessToken"]; + this.expireInSeconds = _data["expireInSeconds"]; + this.userId = _data["userId"]; + } + } + + static fromJS(data: any): AuthenticateResultModel { + data = typeof data === 'object' ? data : {}; + let result = new AuthenticateResultModel(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["accessToken"] = this.accessToken; + data["encryptedAccessToken"] = this.encryptedAccessToken; + data["expireInSeconds"] = this.expireInSeconds; + data["userId"] = this.userId; + return data; + } + + clone(): AuthenticateResultModel { + const json = this.toJSON(); + let result = new AuthenticateResultModel(); + result.init(json); + return result; + } +} + +export interface IAuthenticateResultModel { + accessToken: string | undefined; + encryptedAccessToken: string | undefined; + expireInSeconds: number; + userId: number; +} + +export class ChangePasswordDto implements IChangePasswordDto { + currentPassword: string; + newPassword: string; + + constructor(data?: IChangePasswordDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.currentPassword = _data["currentPassword"]; + this.newPassword = _data["newPassword"]; + } + } + + static fromJS(data: any): ChangePasswordDto { + data = typeof data === 'object' ? data : {}; + let result = new ChangePasswordDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["currentPassword"] = this.currentPassword; + data["newPassword"] = this.newPassword; + return data; + } + + clone(): ChangePasswordDto { + const json = this.toJSON(); + let result = new ChangePasswordDto(); + result.init(json); + return result; + } +} + +export interface IChangePasswordDto { + currentPassword: string; + newPassword: string; +} + +export class ChangeUiThemeInput implements IChangeUiThemeInput { + theme: string; + + constructor(data?: IChangeUiThemeInput) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.theme = _data["theme"]; + } + } + + static fromJS(data: any): ChangeUiThemeInput { + data = typeof data === 'object' ? data : {}; + let result = new ChangeUiThemeInput(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["theme"] = this.theme; + return data; + } + + clone(): ChangeUiThemeInput { + const json = this.toJSON(); + let result = new ChangeUiThemeInput(); + result.init(json); + return result; + } +} + +export interface IChangeUiThemeInput { + theme: string; +} + +export class ChangeUserLanguageDto implements IChangeUserLanguageDto { + languageName: string; + + constructor(data?: IChangeUserLanguageDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.languageName = _data["languageName"]; + } + } + + static fromJS(data: any): ChangeUserLanguageDto { + data = typeof data === 'object' ? data : {}; + let result = new ChangeUserLanguageDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["languageName"] = this.languageName; + return data; + } + + clone(): ChangeUserLanguageDto { + const json = this.toJSON(); + let result = new ChangeUserLanguageDto(); + result.init(json); + return result; + } +} + +export interface IChangeUserLanguageDto { + languageName: string; +} + +export class CreateRoleDto implements ICreateRoleDto { + name: string; + displayName: string; + normalizedName: string | undefined; + description: string | undefined; + grantedPermissions: string[] | undefined; + + constructor(data?: ICreateRoleDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.name = _data["name"]; + this.displayName = _data["displayName"]; + this.normalizedName = _data["normalizedName"]; + this.description = _data["description"]; + if (Array.isArray(_data["grantedPermissions"])) { + this.grantedPermissions = [] as any; + for (let item of _data["grantedPermissions"]) + this.grantedPermissions.push(item); + } + } + } + + static fromJS(data: any): CreateRoleDto { + data = typeof data === 'object' ? data : {}; + let result = new CreateRoleDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["name"] = this.name; + data["displayName"] = this.displayName; + data["normalizedName"] = this.normalizedName; + data["description"] = this.description; + if (Array.isArray(this.grantedPermissions)) { + data["grantedPermissions"] = []; + for (let item of this.grantedPermissions) + data["grantedPermissions"].push(item); + } + return data; + } + + clone(): CreateRoleDto { + const json = this.toJSON(); + let result = new CreateRoleDto(); + result.init(json); + return result; + } +} + +export interface ICreateRoleDto { + name: string; + displayName: string; + normalizedName: string | undefined; + description: string | undefined; + grantedPermissions: string[] | undefined; +} + +export class CreateTenantDto implements ICreateTenantDto { + tenancyName: string; + name: string; + adminEmailAddress: string; + connectionString: string | undefined; + isActive: boolean; + + constructor(data?: ICreateTenantDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.tenancyName = _data["tenancyName"]; + this.name = _data["name"]; + this.adminEmailAddress = _data["adminEmailAddress"]; + this.connectionString = _data["connectionString"]; + this.isActive = _data["isActive"]; + } + } + + static fromJS(data: any): CreateTenantDto { + data = typeof data === 'object' ? data : {}; + let result = new CreateTenantDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["tenancyName"] = this.tenancyName; + data["name"] = this.name; + data["adminEmailAddress"] = this.adminEmailAddress; + data["connectionString"] = this.connectionString; + data["isActive"] = this.isActive; + return data; + } + + clone(): CreateTenantDto { + const json = this.toJSON(); + let result = new CreateTenantDto(); + result.init(json); + return result; + } +} + +export interface ICreateTenantDto { + tenancyName: string; + name: string; + adminEmailAddress: string; + connectionString: string | undefined; + isActive: boolean; +} + +export class CreateUserDto implements ICreateUserDto { + userName: string; + name: string; + surname: string; + emailAddress: string; + isActive: boolean; + roleNames: string[] | undefined; + password: string; + + constructor(data?: ICreateUserDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.userName = _data["userName"]; + this.name = _data["name"]; + this.surname = _data["surname"]; + this.emailAddress = _data["emailAddress"]; + this.isActive = _data["isActive"]; + if (Array.isArray(_data["roleNames"])) { + this.roleNames = [] as any; + for (let item of _data["roleNames"]) + this.roleNames.push(item); + } + this.password = _data["password"]; + } + } + + static fromJS(data: any): CreateUserDto { + data = typeof data === 'object' ? data : {}; + let result = new CreateUserDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["userName"] = this.userName; + data["name"] = this.name; + data["surname"] = this.surname; + data["emailAddress"] = this.emailAddress; + data["isActive"] = this.isActive; + if (Array.isArray(this.roleNames)) { + data["roleNames"] = []; + for (let item of this.roleNames) + data["roleNames"].push(item); + } + data["password"] = this.password; + return data; + } + + clone(): CreateUserDto { + const json = this.toJSON(); + let result = new CreateUserDto(); + result.init(json); + return result; + } +} + +export interface ICreateUserDto { + userName: string; + name: string; + surname: string; + emailAddress: string; + isActive: boolean; + roleNames: string[] | undefined; + password: string; +} + +export class ExternalAuthenticateModel implements IExternalAuthenticateModel { + authProvider: string; + providerKey: string; + providerAccessCode: string; + + constructor(data?: IExternalAuthenticateModel) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.authProvider = _data["authProvider"]; + this.providerKey = _data["providerKey"]; + this.providerAccessCode = _data["providerAccessCode"]; + } + } + + static fromJS(data: any): ExternalAuthenticateModel { + data = typeof data === 'object' ? data : {}; + let result = new ExternalAuthenticateModel(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["authProvider"] = this.authProvider; + data["providerKey"] = this.providerKey; + data["providerAccessCode"] = this.providerAccessCode; + return data; + } + + clone(): ExternalAuthenticateModel { + const json = this.toJSON(); + let result = new ExternalAuthenticateModel(); + result.init(json); + return result; + } +} + +export interface IExternalAuthenticateModel { + authProvider: string; + providerKey: string; + providerAccessCode: string; +} + +export class ExternalAuthenticateResultModel implements IExternalAuthenticateResultModel { + accessToken: string | undefined; + encryptedAccessToken: string | undefined; + expireInSeconds: number; + waitingForActivation: boolean; + + constructor(data?: IExternalAuthenticateResultModel) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.accessToken = _data["accessToken"]; + this.encryptedAccessToken = _data["encryptedAccessToken"]; + this.expireInSeconds = _data["expireInSeconds"]; + this.waitingForActivation = _data["waitingForActivation"]; + } + } + + static fromJS(data: any): ExternalAuthenticateResultModel { + data = typeof data === 'object' ? data : {}; + let result = new ExternalAuthenticateResultModel(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["accessToken"] = this.accessToken; + data["encryptedAccessToken"] = this.encryptedAccessToken; + data["expireInSeconds"] = this.expireInSeconds; + data["waitingForActivation"] = this.waitingForActivation; + return data; + } + + clone(): ExternalAuthenticateResultModel { + const json = this.toJSON(); + let result = new ExternalAuthenticateResultModel(); + result.init(json); + return result; + } +} + +export interface IExternalAuthenticateResultModel { + accessToken: string | undefined; + encryptedAccessToken: string | undefined; + expireInSeconds: number; + waitingForActivation: boolean; +} + +export class ExternalLoginProviderInfoModel implements IExternalLoginProviderInfoModel { + name: string | undefined; + clientId: string | undefined; + + constructor(data?: IExternalLoginProviderInfoModel) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.name = _data["name"]; + this.clientId = _data["clientId"]; + } + } + + static fromJS(data: any): ExternalLoginProviderInfoModel { + data = typeof data === 'object' ? data : {}; + let result = new ExternalLoginProviderInfoModel(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["name"] = this.name; + data["clientId"] = this.clientId; + return data; + } + + clone(): ExternalLoginProviderInfoModel { + const json = this.toJSON(); + let result = new ExternalLoginProviderInfoModel(); + result.init(json); + return result; + } +} + +export interface IExternalLoginProviderInfoModel { + name: string | undefined; + clientId: string | undefined; +} + +export class FlatPermissionDto implements IFlatPermissionDto { + name: string | undefined; + displayName: string | undefined; + description: string | undefined; + + constructor(data?: IFlatPermissionDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.name = _data["name"]; + this.displayName = _data["displayName"]; + this.description = _data["description"]; + } + } + + static fromJS(data: any): FlatPermissionDto { + data = typeof data === 'object' ? data : {}; + let result = new FlatPermissionDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["name"] = this.name; + data["displayName"] = this.displayName; + data["description"] = this.description; + return data; + } + + clone(): FlatPermissionDto { + const json = this.toJSON(); + let result = new FlatPermissionDto(); + result.init(json); + return result; + } +} + +export interface IFlatPermissionDto { + name: string | undefined; + displayName: string | undefined; + description: string | undefined; +} + +export class GetCurrentLoginInformationsOutput implements IGetCurrentLoginInformationsOutput { + application: ApplicationInfoDto; + user: UserLoginInfoDto; + tenant: TenantLoginInfoDto; + + constructor(data?: IGetCurrentLoginInformationsOutput) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.application = _data["application"] ? ApplicationInfoDto.fromJS(_data["application"]) : undefined; + this.user = _data["user"] ? UserLoginInfoDto.fromJS(_data["user"]) : undefined; + this.tenant = _data["tenant"] ? TenantLoginInfoDto.fromJS(_data["tenant"]) : undefined; + } + } + + static fromJS(data: any): GetCurrentLoginInformationsOutput { + data = typeof data === 'object' ? data : {}; + let result = new GetCurrentLoginInformationsOutput(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["application"] = this.application ? this.application.toJSON() : undefined; + data["user"] = this.user ? this.user.toJSON() : undefined; + data["tenant"] = this.tenant ? this.tenant.toJSON() : undefined; + return data; + } + + clone(): GetCurrentLoginInformationsOutput { + const json = this.toJSON(); + let result = new GetCurrentLoginInformationsOutput(); + result.init(json); + return result; + } +} + +export interface IGetCurrentLoginInformationsOutput { + application: ApplicationInfoDto; + user: UserLoginInfoDto; + tenant: TenantLoginInfoDto; +} + +export class GetRoleForEditOutput implements IGetRoleForEditOutput { + role: RoleEditDto; + permissions: FlatPermissionDto[] | undefined; + grantedPermissionNames: string[] | undefined; + + constructor(data?: IGetRoleForEditOutput) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.role = _data["role"] ? RoleEditDto.fromJS(_data["role"]) : undefined; + if (Array.isArray(_data["permissions"])) { + this.permissions = [] as any; + for (let item of _data["permissions"]) + this.permissions.push(FlatPermissionDto.fromJS(item)); + } + if (Array.isArray(_data["grantedPermissionNames"])) { + this.grantedPermissionNames = [] as any; + for (let item of _data["grantedPermissionNames"]) + this.grantedPermissionNames.push(item); + } + } + } + + static fromJS(data: any): GetRoleForEditOutput { + data = typeof data === 'object' ? data : {}; + let result = new GetRoleForEditOutput(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["role"] = this.role ? this.role.toJSON() : undefined; + if (Array.isArray(this.permissions)) { + data["permissions"] = []; + for (let item of this.permissions) + data["permissions"].push(item.toJSON()); + } + if (Array.isArray(this.grantedPermissionNames)) { + data["grantedPermissionNames"] = []; + for (let item of this.grantedPermissionNames) + data["grantedPermissionNames"].push(item); + } + return data; + } + + clone(): GetRoleForEditOutput { + const json = this.toJSON(); + let result = new GetRoleForEditOutput(); + result.init(json); + return result; + } +} + +export interface IGetRoleForEditOutput { + role: RoleEditDto; + permissions: FlatPermissionDto[] | undefined; + grantedPermissionNames: string[] | undefined; +} + +export class Int64EntityDto implements IInt64EntityDto { + id: number; + + constructor(data?: IInt64EntityDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.id = _data["id"]; + } + } + + static fromJS(data: any): Int64EntityDto { + data = typeof data === 'object' ? data : {}; + let result = new Int64EntityDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["id"] = this.id; + return data; + } + + clone(): Int64EntityDto { + const json = this.toJSON(); + let result = new Int64EntityDto(); + result.init(json); + return result; + } +} + +export interface IInt64EntityDto { + id: number; +} + +export class IsTenantAvailableInput implements IIsTenantAvailableInput { + tenancyName: string; + + constructor(data?: IIsTenantAvailableInput) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.tenancyName = _data["tenancyName"]; + } + } + + static fromJS(data: any): IsTenantAvailableInput { + data = typeof data === 'object' ? data : {}; + let result = new IsTenantAvailableInput(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["tenancyName"] = this.tenancyName; + return data; + } + + clone(): IsTenantAvailableInput { + const json = this.toJSON(); + let result = new IsTenantAvailableInput(); + result.init(json); + return result; + } +} + +export interface IIsTenantAvailableInput { + tenancyName: string; +} + +export class IsTenantAvailableOutput implements IIsTenantAvailableOutput { + state: TenantAvailabilityState; + tenantId: number | undefined; + + constructor(data?: IIsTenantAvailableOutput) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.state = _data["state"]; + this.tenantId = _data["tenantId"]; + } + } + + static fromJS(data: any): IsTenantAvailableOutput { + data = typeof data === 'object' ? data : {}; + let result = new IsTenantAvailableOutput(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["state"] = this.state; + data["tenantId"] = this.tenantId; + return data; + } + + clone(): IsTenantAvailableOutput { + const json = this.toJSON(); + let result = new IsTenantAvailableOutput(); + result.init(json); + return result; + } +} + +export interface IIsTenantAvailableOutput { + state: TenantAvailabilityState; + tenantId: number | undefined; +} + +export class PermissionDto implements IPermissionDto { + id: number; + name: string | undefined; + displayName: string | undefined; + description: string | undefined; + + constructor(data?: IPermissionDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.id = _data["id"]; + this.name = _data["name"]; + this.displayName = _data["displayName"]; + this.description = _data["description"]; + } + } + + static fromJS(data: any): PermissionDto { + data = typeof data === 'object' ? data : {}; + let result = new PermissionDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["id"] = this.id; + data["name"] = this.name; + data["displayName"] = this.displayName; + data["description"] = this.description; + return data; + } + + clone(): PermissionDto { + const json = this.toJSON(); + let result = new PermissionDto(); + result.init(json); + return result; + } +} + +export interface IPermissionDto { + id: number; + name: string | undefined; + displayName: string | undefined; + description: string | undefined; +} + +export class PermissionDtoListResultDto implements IPermissionDtoListResultDto { + items: PermissionDto[] | undefined; + + constructor(data?: IPermissionDtoListResultDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + if (Array.isArray(_data["items"])) { + this.items = [] as any; + for (let item of _data["items"]) + this.items.push(PermissionDto.fromJS(item)); + } + } + } + + static fromJS(data: any): PermissionDtoListResultDto { + data = typeof data === 'object' ? data : {}; + let result = new PermissionDtoListResultDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + if (Array.isArray(this.items)) { + data["items"] = []; + for (let item of this.items) + data["items"].push(item.toJSON()); + } + return data; + } + + clone(): PermissionDtoListResultDto { + const json = this.toJSON(); + let result = new PermissionDtoListResultDto(); + result.init(json); + return result; + } +} + +export interface IPermissionDtoListResultDto { + items: PermissionDto[] | undefined; +} + +export class RegisterInput implements IRegisterInput { + name: string; + surname: string; + userName: string; + emailAddress: string; + password: string; + captchaResponse: string | undefined; + + constructor(data?: IRegisterInput) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.name = _data["name"]; + this.surname = _data["surname"]; + this.userName = _data["userName"]; + this.emailAddress = _data["emailAddress"]; + this.password = _data["password"]; + this.captchaResponse = _data["captchaResponse"]; + } + } + + static fromJS(data: any): RegisterInput { + data = typeof data === 'object' ? data : {}; + let result = new RegisterInput(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["name"] = this.name; + data["surname"] = this.surname; + data["userName"] = this.userName; + data["emailAddress"] = this.emailAddress; + data["password"] = this.password; + data["captchaResponse"] = this.captchaResponse; + return data; + } + + clone(): RegisterInput { + const json = this.toJSON(); + let result = new RegisterInput(); + result.init(json); + return result; + } +} + +export interface IRegisterInput { + name: string; + surname: string; + userName: string; + emailAddress: string; + password: string; + captchaResponse: string | undefined; +} + +export class RegisterOutput implements IRegisterOutput { + canLogin: boolean; + + constructor(data?: IRegisterOutput) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.canLogin = _data["canLogin"]; + } + } + + static fromJS(data: any): RegisterOutput { + data = typeof data === 'object' ? data : {}; + let result = new RegisterOutput(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["canLogin"] = this.canLogin; + return data; + } + + clone(): RegisterOutput { + const json = this.toJSON(); + let result = new RegisterOutput(); + result.init(json); + return result; + } +} + +export interface IRegisterOutput { + canLogin: boolean; +} + +export class ResetPasswordDto implements IResetPasswordDto { + adminPassword: string; + userId: number; + newPassword: string; + + constructor(data?: IResetPasswordDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.adminPassword = _data["adminPassword"]; + this.userId = _data["userId"]; + this.newPassword = _data["newPassword"]; + } + } + + static fromJS(data: any): ResetPasswordDto { + data = typeof data === 'object' ? data : {}; + let result = new ResetPasswordDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["adminPassword"] = this.adminPassword; + data["userId"] = this.userId; + data["newPassword"] = this.newPassword; + return data; + } + + clone(): ResetPasswordDto { + const json = this.toJSON(); + let result = new ResetPasswordDto(); + result.init(json); + return result; + } +} + +export interface IResetPasswordDto { + adminPassword: string; + userId: number; + newPassword: string; +} + +export class RoleDto implements IRoleDto { + id: number; + name: string; + displayName: string; + normalizedName: string | undefined; + description: string | undefined; + grantedPermissions: string[] | undefined; + + constructor(data?: IRoleDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.id = _data["id"]; + this.name = _data["name"]; + this.displayName = _data["displayName"]; + this.normalizedName = _data["normalizedName"]; + this.description = _data["description"]; + if (Array.isArray(_data["grantedPermissions"])) { + this.grantedPermissions = [] as any; + for (let item of _data["grantedPermissions"]) + this.grantedPermissions.push(item); + } + } + } + + static fromJS(data: any): RoleDto { + data = typeof data === 'object' ? data : {}; + let result = new RoleDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["id"] = this.id; + data["name"] = this.name; + data["displayName"] = this.displayName; + data["normalizedName"] = this.normalizedName; + data["description"] = this.description; + if (Array.isArray(this.grantedPermissions)) { + data["grantedPermissions"] = []; + for (let item of this.grantedPermissions) + data["grantedPermissions"].push(item); + } + return data; + } + + clone(): RoleDto { + const json = this.toJSON(); + let result = new RoleDto(); + result.init(json); + return result; + } +} + +export interface IRoleDto { + id: number; + name: string; + displayName: string; + normalizedName: string | undefined; + description: string | undefined; + grantedPermissions: string[] | undefined; +} + +export class RoleDtoListResultDto implements IRoleDtoListResultDto { + items: RoleDto[] | undefined; + + constructor(data?: IRoleDtoListResultDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + if (Array.isArray(_data["items"])) { + this.items = [] as any; + for (let item of _data["items"]) + this.items.push(RoleDto.fromJS(item)); + } + } + } + + static fromJS(data: any): RoleDtoListResultDto { + data = typeof data === 'object' ? data : {}; + let result = new RoleDtoListResultDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + if (Array.isArray(this.items)) { + data["items"] = []; + for (let item of this.items) + data["items"].push(item.toJSON()); + } + return data; + } + + clone(): RoleDtoListResultDto { + const json = this.toJSON(); + let result = new RoleDtoListResultDto(); + result.init(json); + return result; + } +} + +export interface IRoleDtoListResultDto { + items: RoleDto[] | undefined; +} + +export class RoleDtoPagedResultDto implements IRoleDtoPagedResultDto { + items: RoleDto[] | undefined; + totalCount: number; + + constructor(data?: IRoleDtoPagedResultDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + if (Array.isArray(_data["items"])) { + this.items = [] as any; + for (let item of _data["items"]) + this.items.push(RoleDto.fromJS(item)); + } + this.totalCount = _data["totalCount"]; + } + } + + static fromJS(data: any): RoleDtoPagedResultDto { + data = typeof data === 'object' ? data : {}; + let result = new RoleDtoPagedResultDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + if (Array.isArray(this.items)) { + data["items"] = []; + for (let item of this.items) + data["items"].push(item.toJSON()); + } + data["totalCount"] = this.totalCount; + return data; + } + + clone(): RoleDtoPagedResultDto { + const json = this.toJSON(); + let result = new RoleDtoPagedResultDto(); + result.init(json); + return result; + } +} + +export interface IRoleDtoPagedResultDto { + items: RoleDto[] | undefined; + totalCount: number; +} + +export class RoleEditDto implements IRoleEditDto { + id: number; + name: string; + displayName: string; + description: string | undefined; + isStatic: boolean; + + constructor(data?: IRoleEditDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.id = _data["id"]; + this.name = _data["name"]; + this.displayName = _data["displayName"]; + this.description = _data["description"]; + this.isStatic = _data["isStatic"]; + } + } + + static fromJS(data: any): RoleEditDto { + data = typeof data === 'object' ? data : {}; + let result = new RoleEditDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["id"] = this.id; + data["name"] = this.name; + data["displayName"] = this.displayName; + data["description"] = this.description; + data["isStatic"] = this.isStatic; + return data; + } + + clone(): RoleEditDto { + const json = this.toJSON(); + let result = new RoleEditDto(); + result.init(json); + return result; + } +} + +export interface IRoleEditDto { + id: number; + name: string; + displayName: string; + description: string | undefined; + isStatic: boolean; +} + +export class RoleListDto implements IRoleListDto { + id: number; + name: string | undefined; + displayName: string | undefined; + isStatic: boolean; + isDefault: boolean; + creationTime: moment.Moment; + + constructor(data?: IRoleListDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.id = _data["id"]; + this.name = _data["name"]; + this.displayName = _data["displayName"]; + this.isStatic = _data["isStatic"]; + this.isDefault = _data["isDefault"]; + this.creationTime = _data["creationTime"] ? moment(_data["creationTime"].toString()) : undefined; + } + } + + static fromJS(data: any): RoleListDto { + data = typeof data === 'object' ? data : {}; + let result = new RoleListDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["id"] = this.id; + data["name"] = this.name; + data["displayName"] = this.displayName; + data["isStatic"] = this.isStatic; + data["isDefault"] = this.isDefault; + data["creationTime"] = this.creationTime ? this.creationTime.toISOString() : undefined; + return data; + } + + clone(): RoleListDto { + const json = this.toJSON(); + let result = new RoleListDto(); + result.init(json); + return result; + } +} + +export interface IRoleListDto { + id: number; + name: string | undefined; + displayName: string | undefined; + isStatic: boolean; + isDefault: boolean; + creationTime: moment.Moment; +} + +export class RoleListDtoListResultDto implements IRoleListDtoListResultDto { + items: RoleListDto[] | undefined; + + constructor(data?: IRoleListDtoListResultDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + if (Array.isArray(_data["items"])) { + this.items = [] as any; + for (let item of _data["items"]) + this.items.push(RoleListDto.fromJS(item)); + } + } + } + + static fromJS(data: any): RoleListDtoListResultDto { + data = typeof data === 'object' ? data : {}; + let result = new RoleListDtoListResultDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + if (Array.isArray(this.items)) { + data["items"] = []; + for (let item of this.items) + data["items"].push(item.toJSON()); + } + return data; + } + + clone(): RoleListDtoListResultDto { + const json = this.toJSON(); + let result = new RoleListDtoListResultDto(); + result.init(json); + return result; + } +} + +export interface IRoleListDtoListResultDto { + items: RoleListDto[] | undefined; +} + +export enum TenantAvailabilityState { + _1 = 1, + _2 = 2, + _3 = 3, +} + +export class TenantDto implements ITenantDto { + id: number; + tenancyName: string; + name: string; + isActive: boolean; + + constructor(data?: ITenantDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.id = _data["id"]; + this.tenancyName = _data["tenancyName"]; + this.name = _data["name"]; + this.isActive = _data["isActive"]; + } + } + + static fromJS(data: any): TenantDto { + data = typeof data === 'object' ? data : {}; + let result = new TenantDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["id"] = this.id; + data["tenancyName"] = this.tenancyName; + data["name"] = this.name; + data["isActive"] = this.isActive; + return data; + } + + clone(): TenantDto { + const json = this.toJSON(); + let result = new TenantDto(); + result.init(json); + return result; + } +} + +export interface ITenantDto { + id: number; + tenancyName: string; + name: string; + isActive: boolean; +} + +export class TenantDtoPagedResultDto implements ITenantDtoPagedResultDto { + items: TenantDto[] | undefined; + totalCount: number; + + constructor(data?: ITenantDtoPagedResultDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + if (Array.isArray(_data["items"])) { + this.items = [] as any; + for (let item of _data["items"]) + this.items.push(TenantDto.fromJS(item)); + } + this.totalCount = _data["totalCount"]; + } + } + + static fromJS(data: any): TenantDtoPagedResultDto { + data = typeof data === 'object' ? data : {}; + let result = new TenantDtoPagedResultDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + if (Array.isArray(this.items)) { + data["items"] = []; + for (let item of this.items) + data["items"].push(item.toJSON()); + } + data["totalCount"] = this.totalCount; + return data; + } + + clone(): TenantDtoPagedResultDto { + const json = this.toJSON(); + let result = new TenantDtoPagedResultDto(); + result.init(json); + return result; + } +} + +export interface ITenantDtoPagedResultDto { + items: TenantDto[] | undefined; + totalCount: number; +} + +export class TenantLoginInfoDto implements ITenantLoginInfoDto { + id: number; + tenancyName: string | undefined; + name: string | undefined; + + constructor(data?: ITenantLoginInfoDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.id = _data["id"]; + this.tenancyName = _data["tenancyName"]; + this.name = _data["name"]; + } + } + + static fromJS(data: any): TenantLoginInfoDto { + data = typeof data === 'object' ? data : {}; + let result = new TenantLoginInfoDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["id"] = this.id; + data["tenancyName"] = this.tenancyName; + data["name"] = this.name; + return data; + } + + clone(): TenantLoginInfoDto { + const json = this.toJSON(); + let result = new TenantLoginInfoDto(); + result.init(json); + return result; + } +} + +export interface ITenantLoginInfoDto { + id: number; + tenancyName: string | undefined; + name: string | undefined; +} + +export class UserDto implements IUserDto { + id: number; + userName: string; + name: string; + surname: string; + emailAddress: string; + isActive: boolean; + fullName: string | undefined; + lastLoginTime: moment.Moment | undefined; + creationTime: moment.Moment; + roleNames: string[] | undefined; + + constructor(data?: IUserDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.id = _data["id"]; + this.userName = _data["userName"]; + this.name = _data["name"]; + this.surname = _data["surname"]; + this.emailAddress = _data["emailAddress"]; + this.isActive = _data["isActive"]; + this.fullName = _data["fullName"]; + this.lastLoginTime = _data["lastLoginTime"] ? moment(_data["lastLoginTime"].toString()) : undefined; + this.creationTime = _data["creationTime"] ? moment(_data["creationTime"].toString()) : undefined; + if (Array.isArray(_data["roleNames"])) { + this.roleNames = [] as any; + for (let item of _data["roleNames"]) + this.roleNames.push(item); + } + } + } + + static fromJS(data: any): UserDto { + data = typeof data === 'object' ? data : {}; + let result = new UserDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["id"] = this.id; + data["userName"] = this.userName; + data["name"] = this.name; + data["surname"] = this.surname; + data["emailAddress"] = this.emailAddress; + data["isActive"] = this.isActive; + data["fullName"] = this.fullName; + data["lastLoginTime"] = this.lastLoginTime ? this.lastLoginTime.toISOString() : undefined; + data["creationTime"] = this.creationTime ? this.creationTime.toISOString() : undefined; + if (Array.isArray(this.roleNames)) { + data["roleNames"] = []; + for (let item of this.roleNames) + data["roleNames"].push(item); + } + return data; + } + + clone(): UserDto { + const json = this.toJSON(); + let result = new UserDto(); + result.init(json); + return result; + } +} + +export interface IUserDto { + id: number; + userName: string; + name: string; + surname: string; + emailAddress: string; + isActive: boolean; + fullName: string | undefined; + lastLoginTime: moment.Moment | undefined; + creationTime: moment.Moment; + roleNames: string[] | undefined; +} + +export class UserDtoPagedResultDto implements IUserDtoPagedResultDto { + items: UserDto[] | undefined; + totalCount: number; + + constructor(data?: IUserDtoPagedResultDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + if (Array.isArray(_data["items"])) { + this.items = [] as any; + for (let item of _data["items"]) + this.items.push(UserDto.fromJS(item)); + } + this.totalCount = _data["totalCount"]; + } + } + + static fromJS(data: any): UserDtoPagedResultDto { + data = typeof data === 'object' ? data : {}; + let result = new UserDtoPagedResultDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + if (Array.isArray(this.items)) { + data["items"] = []; + for (let item of this.items) + data["items"].push(item.toJSON()); + } + data["totalCount"] = this.totalCount; + return data; + } + + clone(): UserDtoPagedResultDto { + const json = this.toJSON(); + let result = new UserDtoPagedResultDto(); + result.init(json); + return result; + } +} + +export interface IUserDtoPagedResultDto { + items: UserDto[] | undefined; + totalCount: number; +} + +export class UserLoginInfoDto implements IUserLoginInfoDto { + id: number; + name: string | undefined; + surname: string | undefined; + userName: string | undefined; + emailAddress: string | undefined; + + constructor(data?: IUserLoginInfoDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.id = _data["id"]; + this.name = _data["name"]; + this.surname = _data["surname"]; + this.userName = _data["userName"]; + this.emailAddress = _data["emailAddress"]; + } + } + + static fromJS(data: any): UserLoginInfoDto { + data = typeof data === 'object' ? data : {}; + let result = new UserLoginInfoDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["id"] = this.id; + data["name"] = this.name; + data["surname"] = this.surname; + data["userName"] = this.userName; + data["emailAddress"] = this.emailAddress; + return data; + } + + clone(): UserLoginInfoDto { + const json = this.toJSON(); + let result = new UserLoginInfoDto(); + result.init(json); + return result; + } +} + +export interface IUserLoginInfoDto { + id: number; + name: string | undefined; + surname: string | undefined; + userName: string | undefined; + emailAddress: string | undefined; +} + +export class ApiException extends Error { + message: string; + status: number; + response: string; + headers: { [key: string]: any; }; + result: any; + + constructor(message: string, status: number, response: string, headers: { [key: string]: any; }, result: any) { + super(); + + this.message = message; + this.status = status; + this.response = response; + this.headers = headers; + this.result = result; + } + + protected isApiException = true; + + static isApiException(obj: any): obj is ApiException { + return obj.isApiException === true; + } +} + +function throwException(message: string, status: number, response: string, headers: { [key: string]: any; }, result?: any): Observable { + if (result !== null && result !== undefined) + return _observableThrow(result); + else + return _observableThrow(new ApiException(message, status, response, headers, null)); +} + +function blobToText(blob: any): Observable { + return new Observable((observer: any) => { + if (!blob) { + observer.next(""); + observer.complete(); + } else { + let reader = new FileReader(); + reader.onload = event => { + observer.next((event.target).result); + observer.complete(); + }; + reader.readAsText(blob); + } + }); +} \ No newline at end of file diff --git a/angular/src/shared/service-proxies/service-proxy.module.ts b/angular/src/shared/service-proxies/service-proxy.module.ts new file mode 100644 index 0000000..b747d7f --- /dev/null +++ b/angular/src/shared/service-proxies/service-proxy.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { HTTP_INTERCEPTORS } from '@angular/common/http'; +import { AbpHttpInterceptor } from 'abp-ng2-module'; + +import * as ApiServiceProxies from './service-proxies'; + +@NgModule({ + providers: [ + ApiServiceProxies.RoleServiceProxy, + ApiServiceProxies.SessionServiceProxy, + ApiServiceProxies.TenantServiceProxy, + ApiServiceProxies.UserServiceProxy, + ApiServiceProxies.TokenAuthServiceProxy, + ApiServiceProxies.AccountServiceProxy, + ApiServiceProxies.ConfigurationServiceProxy, + { provide: HTTP_INTERCEPTORS, useClass: AbpHttpInterceptor, multi: true } + ] +}) +export class ServiceProxyModule { } diff --git a/angular/src/shared/session/app-session.service.ts b/angular/src/shared/session/app-session.service.ts new file mode 100644 index 0000000..81fd259 --- /dev/null +++ b/angular/src/shared/session/app-session.service.ts @@ -0,0 +1,85 @@ +import { AbpMultiTenancyService } from 'abp-ng2-module'; +import { Injectable } from '@angular/core'; +import { + ApplicationInfoDto, + GetCurrentLoginInformationsOutput, + SessionServiceProxy, + TenantLoginInfoDto, + UserLoginInfoDto +} from '@shared/service-proxies/service-proxies'; + +@Injectable() +export class AppSessionService { + + private _user: UserLoginInfoDto; + private _tenant: TenantLoginInfoDto; + private _application: ApplicationInfoDto; + + constructor( + private _sessionService: SessionServiceProxy, + private _abpMultiTenancyService: AbpMultiTenancyService) { + } + + get application(): ApplicationInfoDto { + return this._application; + } + + get user(): UserLoginInfoDto { + return this._user; + } + + get userId(): number { + return this.user ? this.user.id : null; + } + + get tenant(): TenantLoginInfoDto { + return this._tenant; + } + + get tenantId(): number { + return this.tenant ? this.tenant.id : null; + } + + getShownLoginName(): string { + const userName = this._user.userName; + if (!this._abpMultiTenancyService.isEnabled) { + return userName; + } + + return (this._tenant ? this._tenant.tenancyName : '.') + '\\' + userName; + } + + init(): Promise { + return new Promise((resolve, reject) => { + this._sessionService.getCurrentLoginInformations().toPromise().then((result: GetCurrentLoginInformationsOutput) => { + this._application = result.application; + this._user = result.user; + this._tenant = result.tenant; + + resolve(true); + }, (err) => { + reject(err); + }); + }); + } + + changeTenantIfNeeded(tenantId?: number): boolean { + if (this.isCurrentTenant(tenantId)) { + return false; + } + + abp.multiTenancy.setTenantIdCookie(tenantId); + location.reload(); + return true; + } + + private isCurrentTenant(tenantId?: number) { + if (!tenantId && this.tenant) { + return false; + } else if (tenantId && (!this.tenant || this.tenant.id !== tenantId)) { + return false; + } + + return true; + } +} diff --git a/angular/src/shared/shared.module.ts b/angular/src/shared/shared.module.ts new file mode 100644 index 0000000..26544d2 --- /dev/null +++ b/angular/src/shared/shared.module.ts @@ -0,0 +1,59 @@ +import { CommonModule } from '@angular/common'; +import { NgModule, ModuleWithProviders } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { NgxPaginationModule } from 'ngx-pagination'; + +import { AppSessionService } from './session/app-session.service'; +import { AppUrlService } from './nav/app-url.service'; +import { AppAuthService } from './auth/app-auth.service'; +import { AppRouteGuard } from './auth/auth-route-guard'; +import { LocalizePipe } from '@shared/pipes/localize.pipe'; + +import { AbpPaginationControlsComponent } from './components/pagination/abp-pagination-controls.component'; +import { AbpValidationSummaryComponent } from './components/validation/abp-validation.summary.component'; +import { AbpModalHeaderComponent } from './components/modal/abp-modal-header.component'; +import { AbpModalFooterComponent } from './components/modal/abp-modal-footer.component'; +import { LayoutStoreService } from './layout/layout-store.service'; + +import { BusyDirective } from './directives/busy.directive'; +import { EqualValidator } from './directives/equal-validator.directive'; + +@NgModule({ + imports: [ + CommonModule, + RouterModule, + NgxPaginationModule + ], + declarations: [ + AbpPaginationControlsComponent, + AbpValidationSummaryComponent, + AbpModalHeaderComponent, + AbpModalFooterComponent, + LocalizePipe, + BusyDirective, + EqualValidator + ], + exports: [ + AbpPaginationControlsComponent, + AbpValidationSummaryComponent, + AbpModalHeaderComponent, + AbpModalFooterComponent, + LocalizePipe, + BusyDirective, + EqualValidator + ] +}) +export class SharedModule { + static forRoot(): ModuleWithProviders { + return { + ngModule: SharedModule, + providers: [ + AppSessionService, + AppUrlService, + AppAuthService, + AppRouteGuard, + LayoutStoreService + ] + }; + } +} diff --git a/angular/src/test.ts b/angular/src/test.ts new file mode 100644 index 0000000..9bf7226 --- /dev/null +++ b/angular/src/test.ts @@ -0,0 +1,32 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/long-stack-trace-zone'; +import 'zone.js/dist/proxy.js'; +import 'zone.js/dist/sync-test'; +import 'zone.js/dist/jasmine-patch'; +import 'zone.js/dist/async-test'; +import 'zone.js/dist/fake-async-test'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. +declare var __karma__: any; +declare var require: any; + +// Prevent Karma from running prematurely. +__karma__.loaded = function () {}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); +// Finally, start Karma to run the tests. +__karma__.start(); diff --git a/angular/src/tsconfig.json b/angular/src/tsconfig.json new file mode 100644 index 0000000..2e65ab3 --- /dev/null +++ b/angular/src/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "lib": [ "es6", "dom" ], + "mapRoot": "./", + "module": "es2020", + "skipLibCheck": true, + "moduleResolution": "node", + "outDir": "../dist/out-tsc", + "sourceMap": true, + "target": "es5", + "typeRoots": [ + "../node_modules/@types" + ], + "baseUrl": ".", + "paths": { + "@abp/*": [ "../node_modules/abp-ng2-module/dist/src/*" ], + "@app/*": [ "./app/*" ], + "@shared/*": [ "./shared/*" ], + "@node_modules/*": [ "../node_modules/*" ] + } + }, + "files": [ + "main.ts", + "polyfills.ts" + ], + "include": [ + "src/**/*.d.ts", + "typings.d.ts" + ] +} diff --git a/angular/src/tsconfig.spec.json b/angular/src/tsconfig.spec.json new file mode 100644 index 0000000..481f94a --- /dev/null +++ b/angular/src/tsconfig.spec.json @@ -0,0 +1,17 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "files": [ + "test.ts", + "polyfills.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] + } \ No newline at end of file diff --git a/angular/src/typings.d.ts b/angular/src/typings.d.ts new file mode 100644 index 0000000..46cf49d --- /dev/null +++ b/angular/src/typings.d.ts @@ -0,0 +1,17 @@ +/// +/// +/// + +// Typings reference file, see links for more information +// https://github.com/typings/typings +// https://www.typescriptlang.org/docs/handbook/writing-declaration-files.html + +declare var System: any; +declare var Push: any; + +declare namespace abp { + namespace ui { + function setBusy(elm?: any, text?: any, delay?: any): void; + function clearBusy(elm?: any, delay?: any): void; + } +} diff --git a/angular/tslint.json b/angular/tslint.json new file mode 100644 index 0000000..4a3e487 --- /dev/null +++ b/angular/tslint.json @@ -0,0 +1,127 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "callable-types": true, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "eofline": true, + "forin": true, + "deprecation": { + "severity": "warning" + }, + "import-blacklist": [ + true + ], + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": "statics-first" + } + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-variable": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unused-expression": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ], + "directive-selector": [ + true, + "attribute", + "", + "camelCase" + ], + "component-selector": [ + true, + "element", + "", + "kebab-case" + ], + "no-inputs-metadata-property": true, + "no-outputs-metadata-property": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-output-rename": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true + } +} diff --git a/angular/web.config b/angular/web.config new file mode 100644 index 0000000..5b6b112 --- /dev/null +++ b/angular/web.config @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/angular/yarn.lock b/angular/yarn.lock new file mode 100644 index 0000000..c08c74a --- /dev/null +++ b/angular/yarn.lock @@ -0,0 +1,8567 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@angular-devkit/architect@0.1200.5": + version "0.1200.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1200.5.tgz#db20520c1beff0c206197652c5c46a7755caa2a0" + integrity sha512-222VZ4OeaDK3vON8V5m+w15SRWfUs5uOb4H9ij/H9/6tyHD83uWfCDoOGg+ax4wJVdWEFJIS+Vn4ijGcZCq9WQ== + dependencies: + "@angular-devkit/core" "12.0.5" + rxjs "6.6.7" + +"@angular-devkit/build-angular@~12.0.5": + version "12.0.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-12.0.5.tgz#053616eac6315562e0261130ae37c59c4a2b192b" + integrity sha512-rFbaAQPeuWM9KE9lK3J0sF6GB9nKF/s2Z7rtzKux7whGTF3Tlj8NHrcSxZTf4eBm3cnEpaiod1uPBQg8fUWD4w== + dependencies: + "@angular-devkit/architect" "0.1200.5" + "@angular-devkit/build-optimizer" "0.1200.5" + "@angular-devkit/build-webpack" "0.1200.5" + "@angular-devkit/core" "12.0.5" + "@babel/core" "7.14.3" + "@babel/generator" "7.14.3" + "@babel/plugin-transform-async-to-generator" "7.13.0" + "@babel/plugin-transform-runtime" "7.14.3" + "@babel/preset-env" "7.14.2" + "@babel/runtime" "7.14.0" + "@babel/template" "7.12.13" + "@discoveryjs/json-ext" "0.5.2" + "@jsdevtools/coverage-istanbul-loader" "3.0.5" + "@ngtools/webpack" "12.0.5" + ansi-colors "4.1.1" + babel-loader "8.2.2" + browserslist "^4.9.1" + cacache "15.0.6" + caniuse-lite "^1.0.30001032" + circular-dependency-plugin "5.2.2" + copy-webpack-plugin "8.1.1" + core-js "3.12.0" + critters "0.0.10" + css-loader "5.2.4" + css-minimizer-webpack-plugin "3.0.0" + find-cache-dir "3.3.1" + glob "7.1.7" + https-proxy-agent "5.0.0" + inquirer "8.0.0" + jest-worker "26.6.2" + karma-source-map-support "1.4.0" + less "4.1.1" + less-loader "8.1.1" + license-webpack-plugin "2.3.19" + loader-utils "2.0.0" + mini-css-extract-plugin "1.5.1" + minimatch "3.0.4" + open "8.0.2" + ora "5.4.0" + parse5-html-rewriting-stream "6.0.1" + postcss "8.3.0" + postcss-import "14.0.1" + postcss-loader "5.2.0" + postcss-preset-env "6.7.0" + raw-loader "4.0.2" + regenerator-runtime "0.13.7" + resolve-url-loader "4.0.0" + rimraf "3.0.2" + rxjs "6.6.7" + sass "1.32.12" + sass-loader "11.0.1" + semver "7.3.5" + source-map "0.7.3" + source-map-loader "2.0.1" + source-map-support "0.5.19" + style-loader "2.0.0" + stylus "0.54.8" + stylus-loader "5.0.0" + terser "5.7.0" + terser-webpack-plugin "5.1.2" + text-table "0.2.0" + tree-kill "1.2.2" + webpack "5.39.1" + webpack-dev-middleware "4.1.0" + webpack-dev-server "3.11.2" + webpack-merge "5.7.3" + webpack-subresource-integrity "1.5.2" + +"@angular-devkit/build-optimizer@0.1200.5": + version "0.1200.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.1200.5.tgz#bbefa4bf65345a21777dbe0fe812546209b84556" + integrity sha512-3XlDVVak3CfIgUjDZMoON7sxnI1vxhzEm2LvVg5yN98Q7ijnfykXiIzryEcplzTMTZwGNkem0361HDs1EX8zNg== + dependencies: + source-map "0.7.3" + tslib "2.2.0" + typescript "4.2.4" + +"@angular-devkit/build-webpack@0.1200.5": + version "0.1200.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1200.5.tgz#4024b3cafee14be67213b2f7aaee9c9faa18441a" + integrity sha512-cx8DVwOmogzeHS1dsZGWummwA3T1zqsJ6q9NIL0S0ZiOScZuz0j9zAOLjBkyCj5XexOFzHv3TcAVQyzJsi1tIw== + dependencies: + "@angular-devkit/architect" "0.1200.5" + rxjs "6.6.7" + +"@angular-devkit/core@12.0.5": + version "12.0.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-12.0.5.tgz#3d02abd97684434f6e1ffee470b7a9c63987ae51" + integrity sha512-zVSQV+8/vjUjsUKGlj8Kf5LioA6AXJTGI0yhHW9q1dFX4dPpbW63k0R1UoIB2wJ0F/AbYVgpnPGPe9BBm2fvZA== + dependencies: + ajv "8.2.0" + ajv-formats "2.0.2" + fast-json-stable-stringify "2.1.0" + magic-string "0.25.7" + rxjs "6.6.7" + source-map "0.7.3" + +"@angular-devkit/schematics@12.0.5": + version "12.0.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-12.0.5.tgz#db099b6cba1cadf064b87fd675857f6eba167b2a" + integrity sha512-iW3XuDHScr3TXuunlEjF5O01zBpwpLgfr1oEny8PvseFGDlHK4Nj8zNIoIn3Yg936aiFO4GJAC/UXsT8g5vKxQ== + dependencies: + "@angular-devkit/core" "12.0.5" + ora "5.4.0" + rxjs "6.6.7" + +"@angular/animations@^12.0.5": + version "12.0.5" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-12.0.5.tgz#216930a7a2868734ad34f835b4bf2df40243bc30" + integrity sha512-BPdTCtgDJ9zNzHpuA6X3NmtzDiIt5SHZk840j0q3HCq6rP6C/oo2UnPT6w8YDOGMejDpWdHvTgXH4jVKDN1wCQ== + dependencies: + tslib "^2.1.0" + +"@angular/cli@^12.0.5": + version "12.0.5" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-12.0.5.tgz#0b1c77fd1516743f2609ebe8036d3da7379607b2" + integrity sha512-MdgJ9DY3bWYsMFr9Xa+60gtVaYErhAE8ULGnUyI8zLMhWqrV1ZpJJ1WfP8pMQYx4HaKJIgx7wd8az7ZXAcF8hg== + dependencies: + "@angular-devkit/architect" "0.1200.5" + "@angular-devkit/core" "12.0.5" + "@angular-devkit/schematics" "12.0.5" + "@schematics/angular" "12.0.5" + "@yarnpkg/lockfile" "1.1.0" + ansi-colors "4.1.1" + debug "4.3.1" + ini "2.0.0" + inquirer "8.0.0" + jsonc-parser "3.0.0" + npm-package-arg "8.1.2" + npm-pick-manifest "6.1.1" + open "8.0.2" + ora "5.4.0" + pacote "11.3.2" + resolve "1.20.0" + rimraf "3.0.2" + semver "7.3.5" + symbol-observable "4.0.0" + uuid "8.3.2" + +"@angular/common@^12.0.5": + version "12.0.5" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-12.0.5.tgz#05cd8fc14a0378dedcd84a6fc3024c4d0a897c0d" + integrity sha512-jKiPjWVL3jXVKgXwINlsF5O0r9gX/mAoa5UVy57O8jcg+ENbH9LLSOikgiF/0HPxk2uvRV5OYmbBgOY1xT41kQ== + dependencies: + tslib "^2.1.0" + +"@angular/compiler-cli@^12.0.5": + version "12.0.5" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-12.0.5.tgz#c890d815da95b9b84ad8cb8be7b89baeab67f971" + integrity sha512-XBZWU2S7N2kvQJK0H5KyLHiLVhYJrjh3NtbVBv67sCY9Ft8fv2jjbozTgXqeoYZ1xAxcZ2ZAB0n5SkhmY75Mow== + dependencies: + "@babel/core" "^7.8.6" + "@babel/types" "^7.8.6" + canonical-path "1.0.0" + chokidar "^3.0.0" + convert-source-map "^1.5.1" + dependency-graph "^0.11.0" + magic-string "^0.25.0" + minimist "^1.2.0" + reflect-metadata "^0.1.2" + semver "^7.0.0" + source-map "^0.6.1" + sourcemap-codec "^1.4.8" + tslib "^2.1.0" + yargs "^16.2.0" + +"@angular/compiler@9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.0.0.tgz#87e0bef4c369b6cadae07e3a4295778fc93799d5" + integrity sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ== + +"@angular/compiler@^12.0.5": + version "12.0.5" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-12.0.5.tgz#b69a1927253b18dcaf4bac2c1107b8552ee6649e" + integrity sha512-G255aP4hhQ04hSQ1/JgiKNeTzRCuLgK220lJXkHubpu+f67os5LArhFNxZaUC/EVa/sloOT7Fo5tn8C5gy7iLA== + dependencies: + tslib "^2.1.0" + +"@angular/core@9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.0.0.tgz#227dc53e1ac81824f998c6e76000b7efc522641e" + integrity sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w== + +"@angular/core@^12.0.5": + version "12.0.5" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-12.0.5.tgz#a91751a13f575fd893abbdee257f60d0747038e7" + integrity sha512-uVYsZa1VqVw8vNcjUYgfjXBc1M3WaxLXoLnCsDvutJiln4csa8Yw8p7RqQSrZ6AgQ8o2LHD2JJ5kus3EDMwfcA== + dependencies: + tslib "^2.1.0" + +"@angular/forms@^12.0.5": + version "12.0.5" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-12.0.5.tgz#17e888667d644b03f4d67928f47bbf227fc6b4ee" + integrity sha512-Ew/fGPTsywoYnm6DFPA/DyLl4Sb+1/uzpledrbxUHzaSKIrnXFrjQiUTmsbbq+8qono3JzbUIblqH1DrNThYiA== + dependencies: + tslib "^2.1.0" + +"@angular/platform-browser-dynamic@^12.0.5": + version "12.0.5" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.0.5.tgz#b55f6c739c15270902ae7b7f8a6ff56b8ae16b01" + integrity sha512-sYkOJxXj4vEZICT2oODkQF9wNaKoScSkiw2ooBYN0UX02mFKlWKa9vkzp6JmN1EF8YOWF0JnRqBPAi1WbOnAMw== + dependencies: + tslib "^2.1.0" + +"@angular/platform-browser@^12.0.5": + version "12.0.5" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-12.0.5.tgz#133c831acd00384651b2544a1c3df4d091c2218e" + integrity sha512-MLioK9gcdZOKINE8OmIHZICRnFySaWyCBeVbHS4Z4Vxgr+E2S2eO1IxBmGyQpJq1wDPBP9A/9LVLMUNbHu4Cdw== + dependencies: + tslib "^2.1.0" + +"@angular/router@^12.0.5": + version "12.0.5" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-12.0.5.tgz#c75dbbb1542e95d2922434f21097285927056f54" + integrity sha512-2jiaT+OxCmJbeJ0MTPmIHBsTFLysenvPZteozYsjcmUo9mOzJHAjqHLJvTC+Ri+E9xvnplh+8BPETRleV1pAFw== + dependencies: + tslib "^2.1.0" + +"@angularclass/hmr@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@angularclass/hmr/-/hmr-2.1.3.tgz#34e658ed3da37f23b0a200e2da5a89be92bb209f" + integrity sha1-NOZY7T2jfyOwogDi2lqJvpK7IJ8= + +"@aspnet/signalr@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@aspnet/signalr/-/signalr-1.1.4.tgz#417cf808f4074a8aec45d27f03c4b8df9d96bb0b" + integrity sha512-Jp9nPc8hmmhbG9OKiHe2fOKskBHfg+3Y9foSKHxjgGtyI743hXjGFv3uFlUg503K9f8Ilu63gQt3fDkLICBRyg== + dependencies: + eventsource "^1.0.7" + request "^2.88.0" + ws "^6.0.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" + integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== + dependencies: + "@babel/highlight" "^7.14.5" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.0", "@babel/compat-data@^7.14.5", "@babel/compat-data@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" + integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== + +"@babel/core@7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" + integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.14.3" + "@babel/helper-compilation-targets" "^7.13.16" + "@babel/helper-module-transforms" "^7.14.2" + "@babel/helpers" "^7.14.0" + "@babel/parser" "^7.14.3" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/core@^7.7.5", "@babel/core@^7.8.6": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.6.tgz#e0814ec1a950032ff16c13a2721de39a8416fcab" + integrity sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.14.5" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helpers" "^7.14.6" + "@babel/parser" "^7.14.6" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" + integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== + dependencies: + "@babel/types" "^7.14.2" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.14.3", "@babel/generator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.5.tgz#848d7b9f031caca9d0cd0af01b063f226f52d785" + integrity sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA== + dependencies: + "@babel/types" "^7.14.5" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" + integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz#b939b43f8c37765443a19ae74ad8b15978e0a191" + integrity sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz#7a99c5d0967911e972fe2c3411f7d5b498498ecf" + integrity sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw== + dependencies: + "@babel/compat-data" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.14.5": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz#f114469b6c06f8b5c59c6c4e74621f5085362542" + integrity sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-member-expression-to-functions" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + +"@babel/helper-create-regexp-features-plugin@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" + integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + regexpu-core "^4.7.1" + +"@babel/helper-define-polyfill-provider@^0.2.2": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" + integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-explode-assignable-expression@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz#8aa72e708205c7bb643e45c73b4386cdf2a1f645" + integrity sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" + integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== + dependencies: + "@babel/helper-get-function-arity" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-get-function-arity@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" + integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-hoist-variables@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" + integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-member-expression-to-functions@^7.14.5": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz#97e56244beb94211fe277bd818e3a329c66f7970" + integrity sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12", "@babel/helper-module-imports@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" + integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-module-transforms@^7.14.2", "@babel/helper-module-transforms@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e" + integrity sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-simple-access" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-optimise-call-expression@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" + integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-remap-async-to-generator@^7.13.0", "@babel/helper-remap-async-to-generator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz#51439c913612958f54a987a4ffc9ee587a2045d6" + integrity sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-wrap-function" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-replace-supers@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" + integrity sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-simple-access@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" + integrity sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4" + integrity sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-split-export-declaration@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" + integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-validator-identifier@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" + integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== + +"@babel/helper-validator-option@^7.12.17", "@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helper-wrap-function@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz#5919d115bf0fe328b8a5d63bcb610f51601f2bff" + integrity sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ== + dependencies: + "@babel/helper-function-name" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helpers@^7.14.0", "@babel/helpers@^7.14.6": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.6.tgz#5b58306b95f1b47e2a0199434fa8658fa6c21635" + integrity sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA== + dependencies: + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.13", "@babel/parser@^7.14.3", "@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" + integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA== + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz#4b467302e1548ed3b1be43beae2cc9cf45e0bb7e" + integrity sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + +"@babel/plugin-proposal-async-generator-functions@^7.14.2": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz#784a48c3d8ed073f65adcf30b57bcbf6c8119ace" + integrity sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.13.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" + integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-class-static-block@^7.13.11": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz#158e9e10d449c3849ef3ecde94a03d9f1841b681" + integrity sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.14.2": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" + integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.14.2": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" + integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.14.2": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" + integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.14.2": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" + integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.2": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" + integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.14.2": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" + integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.14.2": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz#5920a2b3df7f7901df0205974c0641b13fd9d363" + integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g== + dependencies: + "@babel/compat-data" "^7.14.7" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.14.5" + +"@babel/plugin-proposal-optional-catch-binding@^7.14.2": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" + integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.14.2", "@babel/plugin-proposal-optional-chaining@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" + integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.13.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" + integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-private-property-in-object@^7.14.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz#9f65a4d0493a940b4c01f8aa9d3f1894a587f636" + integrity sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" + integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.12.13", "@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.0", "@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.13.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" + integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-async-to-generator@7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" + integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-remap-async-to-generator" "^7.13.0" + +"@babel/plugin-transform-async-to-generator@^7.13.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" + integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" + +"@babel/plugin-transform-block-scoped-functions@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" + integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-block-scoping@^7.14.2": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz#8cc63e61e50f42e078e6f09be775a75f23ef9939" + integrity sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-classes@^7.14.2": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz#0e98e82097b38550b03b483f9b51a78de0acb2cf" + integrity sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.13.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" + integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-destructuring@^7.13.17": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" + integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" + integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-duplicate-keys@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" + integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-exponentiation-operator@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" + integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-for-of@^7.13.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz#dae384613de8f77c196a8869cbf602a44f7fc0eb" + integrity sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-function-name@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" + integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== + dependencies: + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-literals@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" + integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-member-expression-literals@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" + integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-modules-amd@^7.14.2": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" + integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.14.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz#7aaee0ea98283de94da98b28f8c35701429dad97" + integrity sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A== + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.13.8": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz#c75342ef8b30dcde4295d3401aae24e65638ed29" + integrity sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA== + dependencies: + "@babel/helper-hoist-variables" "^7.14.5" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.14.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" + integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz#60c06892acf9df231e256c24464bfecb0908fd4e" + integrity sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + +"@babel/plugin-transform-new-target@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" + integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-object-super@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" + integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + +"@babel/plugin-transform-parameters@^7.14.2", "@babel/plugin-transform-parameters@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz#49662e86a1f3ddccac6363a7dfb1ff0a158afeb3" + integrity sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" + integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-regenerator@^7.13.15": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" + integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" + integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-runtime@7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.3.tgz#1fd885a2d0de1d3c223795a4e9be72c2db4515cf" + integrity sha512-t960xbi8wpTFE623ef7sd+UpEC5T6EEguQlTBJDEO05+XwnIWVfuqLw/vdLWY6IdFmtZE+65CZAfByT39zRpkg== + dependencies: + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-plugin-utils" "^7.13.0" + babel-plugin-polyfill-corejs2 "^0.2.0" + babel-plugin-polyfill-corejs3 "^0.2.0" + babel-plugin-polyfill-regenerator "^0.2.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" + integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-spread@^7.13.0": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144" + integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + +"@babel/plugin-transform-sticky-regex@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" + integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-template-literals@^7.13.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" + integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typeof-symbol@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" + integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-escapes@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" + integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-regex@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" + integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/preset-env@7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.2.tgz#e80612965da73579c84ad2f963c2359c71524ed5" + integrity sha512-7dD7lVT8GMrE73v4lvDEb85cgcQhdES91BSD7jS/xjC6QY8PnRhux35ac+GCpbiRhp8crexBvZZqnaL6VrY8TQ== + dependencies: + "@babel/compat-data" "^7.14.0" + "@babel/helper-compilation-targets" "^7.13.16" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-validator-option" "^7.12.17" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-async-generator-functions" "^7.14.2" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-class-static-block" "^7.13.11" + "@babel/plugin-proposal-dynamic-import" "^7.14.2" + "@babel/plugin-proposal-export-namespace-from" "^7.14.2" + "@babel/plugin-proposal-json-strings" "^7.14.2" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.2" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.2" + "@babel/plugin-proposal-numeric-separator" "^7.14.2" + "@babel/plugin-proposal-object-rest-spread" "^7.14.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.14.2" + "@babel/plugin-proposal-optional-chaining" "^7.14.2" + "@babel/plugin-proposal-private-methods" "^7.13.0" + "@babel/plugin-proposal-private-property-in-object" "^7.14.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.0" + "@babel/plugin-syntax-top-level-await" "^7.12.13" + "@babel/plugin-transform-arrow-functions" "^7.13.0" + "@babel/plugin-transform-async-to-generator" "^7.13.0" + "@babel/plugin-transform-block-scoped-functions" "^7.12.13" + "@babel/plugin-transform-block-scoping" "^7.14.2" + "@babel/plugin-transform-classes" "^7.14.2" + "@babel/plugin-transform-computed-properties" "^7.13.0" + "@babel/plugin-transform-destructuring" "^7.13.17" + "@babel/plugin-transform-dotall-regex" "^7.12.13" + "@babel/plugin-transform-duplicate-keys" "^7.12.13" + "@babel/plugin-transform-exponentiation-operator" "^7.12.13" + "@babel/plugin-transform-for-of" "^7.13.0" + "@babel/plugin-transform-function-name" "^7.12.13" + "@babel/plugin-transform-literals" "^7.12.13" + "@babel/plugin-transform-member-expression-literals" "^7.12.13" + "@babel/plugin-transform-modules-amd" "^7.14.2" + "@babel/plugin-transform-modules-commonjs" "^7.14.0" + "@babel/plugin-transform-modules-systemjs" "^7.13.8" + "@babel/plugin-transform-modules-umd" "^7.14.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" + "@babel/plugin-transform-new-target" "^7.12.13" + "@babel/plugin-transform-object-super" "^7.12.13" + "@babel/plugin-transform-parameters" "^7.14.2" + "@babel/plugin-transform-property-literals" "^7.12.13" + "@babel/plugin-transform-regenerator" "^7.13.15" + "@babel/plugin-transform-reserved-words" "^7.12.13" + "@babel/plugin-transform-shorthand-properties" "^7.12.13" + "@babel/plugin-transform-spread" "^7.13.0" + "@babel/plugin-transform-sticky-regex" "^7.12.13" + "@babel/plugin-transform-template-literals" "^7.13.0" + "@babel/plugin-transform-typeof-symbol" "^7.12.13" + "@babel/plugin-transform-unicode-escapes" "^7.12.13" + "@babel/plugin-transform-unicode-regex" "^7.12.13" + "@babel/preset-modules" "^0.1.4" + "@babel/types" "^7.14.2" + babel-plugin-polyfill-corejs2 "^0.2.0" + babel-plugin-polyfill-corejs3 "^0.2.0" + babel-plugin-polyfill-regenerator "^0.2.0" + core-js-compat "^3.9.0" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime@7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" + integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.8.4": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.6.tgz#535203bc0892efc7dec60bdc27b2ecf6e409062d" + integrity sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/template@^7.12.13", "@babel/template@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" + integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.2", "@babel/traverse@^7.14.5": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.7.tgz#64007c9774cfdc3abd23b0780bc18a3ce3631753" + integrity sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-hoist-variables" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/parser" "^7.14.7" + "@babel/types" "^7.14.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.12.13", "@babel/types@^7.14.2", "@babel/types@^7.14.5", "@babel/types@^7.4.4", "@babel/types@^7.8.6": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" + integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + to-fast-properties "^2.0.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@discoveryjs/json-ext@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752" + integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg== + +"@fortawesome/fontawesome-free@^5.15.3": + version "5.15.3" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.3.tgz#c36ffa64a2a239bf948541a97b6ae8d729e09a9a" + integrity sha512-rFnSUN/QOtnOAgqFRooTA3H57JLDm0QEG/jPdk+tLQNL/eWd+Aok8g3qCI+Q1xuDPWpGW/i9JySpJVsq8Q0s9w== + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jsdevtools/coverage-istanbul-loader@3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz#2a4bc65d0271df8d4435982db4af35d81754ee26" + integrity sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA== + dependencies: + convert-source-map "^1.7.0" + istanbul-lib-instrument "^4.0.3" + loader-utils "^2.0.0" + merge-source-map "^1.1.0" + schema-utils "^2.7.0" + +"@ngtools/webpack@12.0.5": + version "12.0.5" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-12.0.5.tgz#3d858c1df3a4f5a13450fb0cffe0d5db8e61d0e1" + integrity sha512-yoKK6qhEm1iWnniz50xzOBqa3U1iUrjZs+SpLOXRZFonpwObz8j4zraR231K4uV4kXcX40qorYk9iOf+ljG4JQ== + dependencies: + enhanced-resolve "5.7.0" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz#94c23db18ee4653e129abd26fb06f870ac9e1ee2" + integrity sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@npmcli/git@^2.0.1": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.1.0.tgz#2fbd77e147530247d37f325930d457b3ebe894f6" + integrity sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw== + dependencies: + "@npmcli/promise-spawn" "^1.3.2" + lru-cache "^6.0.0" + mkdirp "^1.0.4" + npm-pick-manifest "^6.1.1" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^2.0.2" + +"@npmcli/installed-package-contents@^1.0.6": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" + integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== + dependencies: + npm-bundled "^1.1.1" + npm-normalize-package-bin "^1.0.1" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@npmcli/node-gyp@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.2.tgz#3cdc1f30e9736dbc417373ed803b42b1a0a29ede" + integrity sha512-yrJUe6reVMpktcvagumoqD9r08fH1iRo01gn1u0zoCApa9lnZGEigVKUd2hzsCId4gdtkZZIVscLhNxMECKgRg== + +"@npmcli/promise-spawn@^1.2.0", "@npmcli/promise-spawn@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz#42d4e56a8e9274fba180dabc0aea6e38f29274f5" + integrity sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg== + dependencies: + infer-owner "^1.0.4" + +"@npmcli/run-script@^1.8.2": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-1.8.5.tgz#f250a0c5e1a08a792d775a315d0ff42fc3a51e1d" + integrity sha512-NQspusBCpTjNwNRFMtz2C5MxoxyzlbuJ4YEhxAKrIonTiirKDtatsZictx9RgamQIx6+QuHMNmPl0wQdoESs9A== + dependencies: + "@npmcli/node-gyp" "^1.0.2" + "@npmcli/promise-spawn" "^1.3.2" + infer-owner "^1.0.4" + node-gyp "^7.1.0" + read-package-json-fast "^2.0.1" + +"@schematics/angular@12.0.5": + version "12.0.5" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-12.0.5.tgz#a5d30c7420dca31306adab62faed1083c28536b5" + integrity sha512-gMT66T33az+uGLDSc7UkJVg+vloPeTpQNgWddBVGnW/Lkl1tGaWUxyqUJAp8AvusPNU+NCP+ZFB3qUm+pc7tCg== + dependencies: + "@angular-devkit/core" "12.0.5" + "@angular-devkit/schematics" "12.0.5" + jsonc-parser "3.0.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@trysound/sax@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.1.1.tgz#3348564048e7a2d7398c935d466c0414ebb6a669" + integrity sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow== + +"@types/component-emitter@^1.2.10": + version "1.2.10" + resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.10.tgz#ef5b1589b9f16544642e473db5ea5639107ef3ea" + integrity sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg== + +"@types/cookie@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.0.tgz#14f854c0f93d326e39da6e3b6f34f7d37513d108" + integrity sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg== + +"@types/cors@^2.8.8": + version "2.8.10" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.10.tgz#61cc8469849e5bcdd0c7044122265c39cec10cf4" + integrity sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ== + +"@types/eslint-scope@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86" + integrity sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "7.2.13" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.13.tgz#e0ca7219ba5ded402062ad6f926d491ebb29dd53" + integrity sha512-LKmQCWAlnVHvvXq4oasNUMTJJb2GwSyTY8+1C7OH5ILR8mPLaljv1jxL1bXW3xB3jFbQxTKxJAvI8PyjB09aBg== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "0.0.48" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.48.tgz#18dc8091b285df90db2f25aa7d906cfc394b7f74" + integrity sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew== + +"@types/estree@^0.0.47": + version "0.0.47" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4" + integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg== + +"@types/glob@^7.1.1": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/jasmine@~3.6.0": + version "3.6.11" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.6.11.tgz#4b1d77aa9dfc757407cb9e277216d8e83553f09d" + integrity sha512-S6pvzQDvMZHrkBz2Mcn/8Du7cpr76PlRJBAoHnSDNbulULsH5dp0Gns+WRyNX5LHejz/ljxK4/vIHK/caHt6SQ== + +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + +"@types/lodash-es@^4.17.3": + version "4.17.4" + resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.4.tgz#b2e440d2bf8a93584a9fd798452ec497986c9b97" + integrity sha512-BBz79DCJbD2CVYZH67MBeHZRX++HF+5p8Mo5MzjZi64Wac39S3diedJYHZtScbRVf4DjZyN6LzA0SB0zy+HSSQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.170" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.170.tgz#0d67711d4bf7f4ca5147e9091b847479b87925d6" + integrity sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q== + +"@types/minimatch@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" + integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== + +"@types/moment-timezone@^0.5.30": + version "0.5.30" + resolved "https://registry.yarnpkg.com/@types/moment-timezone/-/moment-timezone-0.5.30.tgz#340ed45fe3e715f4a011f5cfceb7cb52aad46fc7" + integrity sha512-aDVfCsjYnAQaV/E9Qc24C5Njx1CoDjXsEgkxtp9NyXDpYu4CCbmclb6QhWloS9UTU/8YROUEEdEkWI0D7DxnKg== + dependencies: + moment-timezone "*" + +"@types/node@*", "@types/node@>=10.0.0": + version "15.12.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.4.tgz#e1cf817d70a1e118e81922c4ff6683ce9d422e26" + integrity sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA== + +"@types/node@^13.13.4": + version "13.13.52" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.52.tgz#03c13be70b9031baaed79481c0c0cfb0045e53f7" + integrity sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/q@^0.0.32": + version "0.0.32" + resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5" + integrity sha1-vShOV8hPEyXacCur/IKlMoGQwMU= + +"@types/selenium-webdriver@^3.0.0": + version "3.0.17" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz#50bea0c3c2acc31c959c5b1e747798b3b3d06d4b" + integrity sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw== + +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + +"@types/webpack-sources@^0.1.5": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.8.tgz#078d75410435993ec8a0a2855e88706f3f751f81" + integrity sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.6.1" + +"@webassemblyjs/ast@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.0.tgz#a5aa679efdc9e51707a4207139da57920555961f" + integrity sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.0" + "@webassemblyjs/helper-wasm-bytecode" "1.11.0" + +"@webassemblyjs/floating-point-hex-parser@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz#34d62052f453cd43101d72eab4966a022587947c" + integrity sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA== + +"@webassemblyjs/helper-api-error@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz#aaea8fb3b923f4aaa9b512ff541b013ffb68d2d4" + integrity sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w== + +"@webassemblyjs/helper-buffer@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz#d026c25d175e388a7dbda9694e91e743cbe9b642" + integrity sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA== + +"@webassemblyjs/helper-numbers@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz#7ab04172d54e312cc6ea4286d7d9fa27c88cd4f9" + integrity sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.0" + "@webassemblyjs/helper-api-error" "1.11.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz#85fdcda4129902fe86f81abf7e7236953ec5a4e1" + integrity sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA== + +"@webassemblyjs/helper-wasm-section@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz#9ce2cc89300262509c801b4af113d1ca25c1a75b" + integrity sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew== + dependencies: + "@webassemblyjs/ast" "1.11.0" + "@webassemblyjs/helper-buffer" "1.11.0" + "@webassemblyjs/helper-wasm-bytecode" "1.11.0" + "@webassemblyjs/wasm-gen" "1.11.0" + +"@webassemblyjs/ieee754@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz#46975d583f9828f5d094ac210e219441c4e6f5cf" + integrity sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.0.tgz#f7353de1df38aa201cba9fb88b43f41f75ff403b" + integrity sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.0.tgz#86e48f959cf49e0e5091f069a709b862f5a2cadf" + integrity sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw== + +"@webassemblyjs/wasm-edit@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz#ee4a5c9f677046a210542ae63897094c2027cb78" + integrity sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ== + dependencies: + "@webassemblyjs/ast" "1.11.0" + "@webassemblyjs/helper-buffer" "1.11.0" + "@webassemblyjs/helper-wasm-bytecode" "1.11.0" + "@webassemblyjs/helper-wasm-section" "1.11.0" + "@webassemblyjs/wasm-gen" "1.11.0" + "@webassemblyjs/wasm-opt" "1.11.0" + "@webassemblyjs/wasm-parser" "1.11.0" + "@webassemblyjs/wast-printer" "1.11.0" + +"@webassemblyjs/wasm-gen@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz#3cdb35e70082d42a35166988dda64f24ceb97abe" + integrity sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ== + dependencies: + "@webassemblyjs/ast" "1.11.0" + "@webassemblyjs/helper-wasm-bytecode" "1.11.0" + "@webassemblyjs/ieee754" "1.11.0" + "@webassemblyjs/leb128" "1.11.0" + "@webassemblyjs/utf8" "1.11.0" + +"@webassemblyjs/wasm-opt@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz#1638ae188137f4bb031f568a413cd24d32f92978" + integrity sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg== + dependencies: + "@webassemblyjs/ast" "1.11.0" + "@webassemblyjs/helper-buffer" "1.11.0" + "@webassemblyjs/wasm-gen" "1.11.0" + "@webassemblyjs/wasm-parser" "1.11.0" + +"@webassemblyjs/wasm-parser@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz#3e680b8830d5b13d1ec86cc42f38f3d4a7700754" + integrity sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw== + dependencies: + "@webassemblyjs/ast" "1.11.0" + "@webassemblyjs/helper-api-error" "1.11.0" + "@webassemblyjs/helper-wasm-bytecode" "1.11.0" + "@webassemblyjs/ieee754" "1.11.0" + "@webassemblyjs/leb128" "1.11.0" + "@webassemblyjs/utf8" "1.11.0" + +"@webassemblyjs/wast-printer@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz#680d1f6a5365d6d401974a8e949e05474e1fab7e" + integrity sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ== + dependencies: + "@webassemblyjs/ast" "1.11.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +"@yarnpkg/lockfile@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +abab@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abp-ng2-module@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/abp-ng2-module/-/abp-ng2-module-6.3.0.tgz#92794dcb290166f609de20c6121839d4855f0d93" + integrity sha512-L/K+dCFYrcGJ60DKQA2dBFC6eyhZZ9FXyfVBAFMEvMaPxos4VNNtczRuq4IGLEuwozLHNiUO28KFCqMzqQlrTA== + dependencies: + tslib "^2.0.3" + +abp-web-resources@^5.3.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/abp-web-resources/-/abp-web-resources-5.4.0.tgz#ea09f1702da52269b63020257dcfc8fe726c2b61" + integrity sha512-wzxvd3kQWmzIzkPhhhlWu4EVrLfvd9BQGlqLGfc1mBh3flKuzUFGGffwhq4iUAUC4DyPZudqOmtL98jpq1GQZQ== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.2.1: + version "8.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" + integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== + +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + +adm-zip@^0.4.9: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +admin-lte-css-only@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/admin-lte-css-only/-/admin-lte-css-only-3.1.0.tgz#0f3aa486948726250bf75409c0a16e8b818ae1aa" + integrity sha512-aQ7V01lFs1VrWRsDhGmB3G9gXCmzEsAal18GS/sRPFqAM/oKnaDe4kdWXyB9BtxDoSIT9/U8VjQ4yxSs2faxQw== + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== + dependencies: + es6-promisify "^5.0.0" + +agentkeepalive@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.4.tgz#d928028a4862cb11718e55227872e842a44c945b" + integrity sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ== + dependencies: + debug "^4.1.0" + depd "^1.1.2" + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-formats@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.0.2.tgz#69875cb99d76c74be46e9c7a4444bc232354eba0" + integrity sha512-Brah4Uo5/U8v76c6euTwtjVFFaVishwnJrQBYpev1JRh4vjA1F4HY3UzQez41YUCszUCXKagG8v6eVRBHV1gkw== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.1.0, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.2.0.tgz#c89d3380a784ce81b2085f48811c4c101df4c602" + integrity sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^6.1.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.0.tgz#60cc45d9c46a477d80d92c48076d972c342e5720" + integrity sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-root-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" + integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +aria-query@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types-flow@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^9.6.1: + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +axobject-query@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" + integrity sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww== + dependencies: + ast-types-flow "0.0.7" + +babel-loader@8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" + integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-polyfill-corejs2@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" + integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.2" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz#72add68cf08a8bf139ba6e6dfc0b1d504098e57b" + integrity sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.2" + core-js-compat "^3.14.0" + +babel-plugin-polyfill-regenerator@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" + integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.2" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-arraybuffer@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" + integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bfj@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" + integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw== + dependencies: + bluebird "^3.5.5" + check-types "^8.0.3" + hoopy "^0.1.4" + tryer "^1.0.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blocking-proxy@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-1.0.1.tgz#81d6fd1fe13a4c0d6957df7f91b75e98dac40cb2" + integrity sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA== + dependencies: + minimist "^1.2.0" + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +body-parser@1.19.0, body-parser@^1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4.16.6, browserslist@^4.6.4, browserslist@^4.9.1: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + dependencies: + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" + +browserstack@^1.5.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.6.1.tgz#e051f9733ec3b507659f395c7a4765a1b1e358b3" + integrity sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw== + dependencies: + https-proxy-agent "^2.2.1" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@15.0.6: + version "15.0.6" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.6.tgz#65a8c580fda15b59150fb76bf3f3a8e45d583099" + integrity sha512-g1WYDMct/jzW+JdWEyjaX2zoBkZ6ZT9VpOyp2I/VMtDsNLffNat3kqPFfi1eDRSK9/SuKGyORDHcQMcPF8sQ/w== + dependencies: + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +cacache@^15.0.5: + version "15.2.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389" + integrity sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw== + dependencies: + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219: + version "1.0.30001239" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001239.tgz#66e8669985bb2cb84ccb10f68c25ce6dd3e4d2b8" + integrity sha512-cyBkXJDMeI4wthy8xJ2FvDU6+0dtcZSJW3voUF8+e9f1bBeuvyZfc3PNbkOETyhbR+dGCPzn9E7MA3iwzusOhQ== + +canonical-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" + integrity sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-types@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" + integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== + +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +circular-dependency-plugin@5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz#39e836079db1d3cf2f988dc48c5188a44058b600" + integrity sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" + integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +codelyzer@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-6.0.2.tgz#25d72eae641e8ff13ffd7d99b27c9c7ad5d7e135" + integrity sha512-v3+E0Ucu2xWJMOJ2fA/q9pDT/hlxHftHGPUay1/1cTgyPV5JTHFdO9hqo837Sx2s9vKBMTt5gO+lhF95PO6J+g== + dependencies: + "@angular/compiler" "9.0.0" + "@angular/core" "9.0.0" + app-root-path "^3.0.0" + aria-query "^3.0.0" + axobject-query "2.0.2" + css-selector-tokenizer "^0.7.1" + cssauron "^1.4.0" + damerau-levenshtein "^1.0.4" + rxjs "^6.5.3" + semver-dsl "^1.0.1" + source-map "^0.5.7" + sprintf-js "^1.1.2" + tslib "^1.10.0" + zone.js "~0.10.3" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colord@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.0.1.tgz#1e7fb1f9fa1cf74f42c58cb9c20320bab8435aa0" + integrity sha512-vm5YpaWamD0Ov6TSG0GGmUIwstrWcfKQV/h2CmbR7PbNu41+qdB5PW9lpzhjedrpm08uuYvcXi0Oel1RLZIJuA== + +colorette@^1.2.1, colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + +colors@1.4.0, colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.11.0, commander@^2.12.1, commander@^2.18.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1, component-emitter@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.5.1, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +cookie@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +copy-anything@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.3.tgz#842407ba02466b0df844819bbe3baebbe5d45d87" + integrity sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ== + dependencies: + is-what "^3.12.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-webpack-plugin@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-8.1.1.tgz#3f697e162764925c2f0d235f380676125508fd26" + integrity sha512-rYM2uzRxrLRpcyPqGceRBDpxxUV8vcDqIKxAUKfcnFpcrPxT5+XvhTxv7XLjo5AvEJFPdAE3zCogG2JVahqgSQ== + dependencies: + fast-glob "^3.2.5" + glob-parent "^5.1.1" + globby "^11.0.3" + normalize-path "^3.0.0" + p-limit "^3.1.0" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + +core-js-compat@^3.14.0, core-js-compat@^3.9.0: + version "3.15.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.1.tgz#1afe233716d37ee021956ef097594071b2b585a7" + integrity sha512-xGhzYMX6y7oEGQGAJmP2TmtBLvR4nZmRGEcFa3ubHOq5YEp51gGN9AovVa0AoujGZIq+Wm6dISiYyGNfdflYww== + dependencies: + browserslist "^4.16.6" + semver "7.0.0" + +core-js@3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.12.0.tgz#62bac86f7d7f087d40dba3e90a211c2c3c8559ea" + integrity sha512-SaMnchL//WwU2Ot1hhkPflE8gzo7uq1FGvUJ8GKmi3TOU7rGTHIU+eir1WGf6qOtTyxdfdcp10yPdGZ59sQ3hw== + +core-js@^3.2.1: + version "3.15.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.15.1.tgz#6c08ab88abdf56545045ccf5fd81f47f407e7f1a" + integrity sha512-h8VbZYnc9pDzueiS2610IULDkpFFPunHwIpl8yRwFahAEEdSpHlTy3h3z3rKq5h11CaUdBEeRViu9AYvbxiMeg== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +critters@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.10.tgz#edd0e962fc5af6c4adb6dbf1a71bae2d3f917000" + integrity sha512-p5VKhP1803+f+0Jq5P03w1SbiHtpAKm+1EpJHkiPxQPq0Vu9QLZHviJ02GRrWi0dlcJqrmzMWInbwp4d22RsGw== + dependencies: + chalk "^4.1.0" + css "^3.0.0" + parse5 "^6.0.1" + parse5-htmlparser2-tree-adapter "^6.0.1" + pretty-bytes "^5.3.0" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-color-names@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-1.0.1.tgz#6ff7ee81a823ad46e020fa2fd6ab40a887e2ba67" + integrity sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA== + +css-declaration-sorter@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.0.3.tgz#9dfd8ea0df4cc7846827876fafb52314890c21a9" + integrity sha512-52P95mvW1SMzuRZegvpluT6yEv0FqQusydKQPZsNN5Q7hh8EwQvN8E2nwuJ16BBvNN6LcoIZXu/Bk58DAhrrxw== + dependencies: + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-loader@5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.4.tgz#e985dcbce339812cb6104ef3670f08f9893a1536" + integrity sha512-OFYGyINCKkdQsTrSYxzGSFnGS4gNjcXkKkQgWxK138jgnPt+lepxdjSZNc8sHAl5vP3DhsJUxufWIjOwI8PMMw== + dependencies: + camelcase "^6.2.0" + icss-utils "^5.1.0" + loader-utils "^2.0.0" + postcss "^8.2.10" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^3.0.0" + semver "^7.3.5" + +css-minimizer-webpack-plugin@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.0.tgz#5b1edbffe1a3e6450d8cb53fb4f4c5013b7af313" + integrity sha512-yIrqG0pPphR1RoNx2wDxYmxRf2ubRChLDXxv7ccipEm5bRKsZRYp8n+2peeXehtTF5s3yNxlqsdz3WQOsAgUkw== + dependencies: + cssnano "^5.0.0" + jest-worker "^26.3.0" + p-limit "^3.0.2" + postcss "^8.2.9" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + source-map "^0.6.1" + +css-parse@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" + integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q= + dependencies: + css "^2.0.0" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-3.1.2.tgz#d52cbdc6fee379fba97fb0d3925abbd18af2d9d8" + integrity sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA== + dependencies: + boolbase "^1.0.0" + css-what "^4.0.0" + domhandler "^4.0.0" + domutils "^2.4.3" + nth-check "^2.0.0" + +css-selector-tokenizer@^0.7.1: + version "0.7.3" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" + integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg== + dependencies: + cssesc "^3.0.0" + fastparse "^1.1.2" + +css-tree@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-4.0.0.tgz#35e73761cab2eeb3d3661126b23d7aa0e8432233" + integrity sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A== + +css@^2.0.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +css@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== + dependencies: + inherits "^2.0.4" + source-map "^0.6.1" + source-map-resolve "^0.6.0" + +cssauron@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssauron/-/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8" + integrity sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg= + dependencies: + through X.X.X + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.3.tgz#caa54183a8c8df03124a9e23f374ab89df5a9a99" + integrity sha512-qo9tX+t4yAAZ/yagVV3b+QBKeLklQbmgR3wI7mccrDcR+bEk9iHgZN1E7doX68y9ThznLya3RDmR+nc7l6/2WQ== + dependencies: + css-declaration-sorter "^6.0.3" + cssnano-utils "^2.0.1" + postcss-calc "^8.0.0" + postcss-colormin "^5.2.0" + postcss-convert-values "^5.0.1" + postcss-discard-comments "^5.0.1" + postcss-discard-duplicates "^5.0.1" + postcss-discard-empty "^5.0.1" + postcss-discard-overridden "^5.0.1" + postcss-merge-longhand "^5.0.2" + postcss-merge-rules "^5.0.2" + postcss-minify-font-values "^5.0.1" + postcss-minify-gradients "^5.0.1" + postcss-minify-params "^5.0.1" + postcss-minify-selectors "^5.1.0" + postcss-normalize-charset "^5.0.1" + postcss-normalize-display-values "^5.0.1" + postcss-normalize-positions "^5.0.1" + postcss-normalize-repeat-style "^5.0.1" + postcss-normalize-string "^5.0.1" + postcss-normalize-timing-functions "^5.0.1" + postcss-normalize-unicode "^5.0.1" + postcss-normalize-url "^5.0.2" + postcss-normalize-whitespace "^5.0.1" + postcss-ordered-values "^5.0.2" + postcss-reduce-initial "^5.0.1" + postcss-reduce-transforms "^5.0.1" + postcss-svgo "^5.0.2" + postcss-unique-selectors "^5.0.1" + +cssnano-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-2.0.1.tgz#8660aa2b37ed869d2e2f22918196a9a8b6498ce2" + integrity sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ== + +cssnano@^5.0.0: + version "5.0.6" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.6.tgz#2a91ad34c6521ae31eab3da9c90108ea3093535d" + integrity sha512-NiaLH/7yqGksFGsFNvSRe2IV/qmEBAeDE64dYeD8OBrgp6lE8YoMeQJMtsv5ijo6MPyhuoOvFhI94reahBRDkw== + dependencies: + cosmiconfig "^7.0.0" + cssnano-preset-default "^5.1.3" + is-resolvable "^1.1.0" + +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= + +damerau-levenshtein@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz#64368003512a1a6992593741a09a9d31a836f55d" + integrity sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +date-format@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" + integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== + +date-format@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-3.0.0.tgz#eb8780365c7d2b1511078fb491e6479780f3ad95" + integrity sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@4.3.1, debug@^4.1.0, debug@^4.1.1, debug@~4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +debug@^3.1.0, debug@^3.1.1, debug@^3.2.6: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@^1.1.2, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +dependency-graph@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" + integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +dom-serialize@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + +domhandler@^4.0.0, domhandler@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" + integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA== + dependencies: + domelementtype "^2.2.0" + +domutils@^2.4.3: + version "2.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442" + integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +duplexer@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== + +electron-to-chromium@^1.3.723: + version "1.3.756" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.756.tgz#942cee59cd64d19f576d8d5804eef09cb423740c" + integrity sha512-WsmJym1TMeHVndjPjczTFbnRR/c4sbzg8fBFtuhlb2Sru3i/S1VGpzDSrv/It8ctMU2bj8G7g7/O3FzYMGw6eA== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +engine.io-parser@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-4.0.2.tgz#e41d0b3fb66f7bf4a3671d2038a154024edb501e" + integrity sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg== + dependencies: + base64-arraybuffer "0.1.4" + +engine.io@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-4.1.1.tgz#9a8f8a5ac5a5ea316183c489bf7f5b6cf91ace5b" + integrity sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w== + dependencies: + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~4.0.0" + ws "~7.4.2" + +enhanced-resolve@5.7.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz#525c5d856680fbd5052de453ac83e32049958b5c" + integrity sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +enhanced-resolve@^5.8.0: + version "5.8.2" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz#15ddc779345cbb73e97c611cd00c01c1e7bf4d8b" + integrity sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +errno@^0.1.1, errno@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-module-lexer@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.4.1.tgz#dda8c6a14d8f340a24e34331e0fab0cb50438e0e" + integrity sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA== + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +eventsource@^1.0.7: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" + integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== + dependencies: + original "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +express@^4.16.3, express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +famfamfam-flags@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/famfamfam-flags/-/famfamfam-flags-1.0.0.tgz#cd78f776173a2c5962713310dd70c1b141d1103c" + integrity sha1-zXj3dhc6LFlicTMQ3XDBsUHREDw= + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1, fast-glob@^3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastparse@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + +fastq@^1.6.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" + integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2, finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@3.3.1, find-cache-dir@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flatted@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +follow-redirects@^1.0.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" + integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^2.0.0, fs-minipass@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.1.7, glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +gzip-size@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hosted-git-info@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" + integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== + dependencies: + lru-cache "^6.0.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-entities@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-cache-semantics@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" + integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0, http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-proxy-agent@5.0.0, https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +https-proxy-agent@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= + dependencies: + ms "^2.0.0" + +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-walk@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" + integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== + dependencies: + minimatch "^3.0.4" + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= + +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.0.0.tgz#957a46db1abcf0fdd2ab82deb7470e90afc7d0ac" + integrity sha512-ON8pEJPPCdyjxj+cxsYRe6XfCJepTxANdNnTebsTuQgXpRyZRRT9t4dJwjRubgmvn20CLSEnozRUayXyM9VTXA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.6" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" + integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + dependencies: + call-bind "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-color-stop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" + integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + dependencies: + is-path-inside "^1.0.0" + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.2" + +is-resolvable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-what@^3.12.0: + version "3.14.1" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isbinaryfile@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" + integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + +istanbul-lib-instrument@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jasmine-core@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.7.1.tgz#0401327f6249eac993d47bbfa18d4e8efacfb561" + integrity sha512-DH3oYDS/AUvvr22+xUBW62m1Xoy7tUlY1tsxKEJvl5JeJ7q8zd1K5bUwiOxdH+erj6l2vAMM3hV25Xs9/WrmuQ== + +jasmine-core@~2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" + integrity sha1-vMl5rh+f0FcB5F5S5l06XWPxok4= + +jasmine-core@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.6.0.tgz#491f3bb23941799c353ceb7a45b38a950ebc5a20" + integrity sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw== + +jasmine-spec-reporter@~5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz#b61288ab074ad440dc2477c4d42840b0e74a6b95" + integrity sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g== + dependencies: + colors "1.4.0" + +jasmine@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e" + integrity sha1-awicChFXax8W3xG4AUbZHU6Lij4= + dependencies: + exit "^0.1.2" + glob "^7.0.6" + jasmine-core "~2.8.0" + +jasminewd2@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e" + integrity sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4= + +jest-worker@26.6.2, jest-worker@^26.3.0, jest-worker@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^27.0.2: + version "27.0.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.2.tgz#4ebeb56cef48b3e7514552f80d0d80c0129f0b05" + integrity sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonc-parser@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" + integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jszip@^3.1.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.6.0.tgz#839b72812e3f97819cc13ac4134ffced95dd6af9" + integrity sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + set-immediate-shim "~1.0.1" + +karma-chrome-launcher@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" + integrity sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg== + dependencies: + which "^1.2.1" + +karma-cli@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/karma-cli/-/karma-cli-2.0.0.tgz#481548d28661af4cc68f3d8e09708f17d2cba931" + integrity sha512-1Kb28UILg1ZsfqQmeELbPzuEb5C6GZJfVIk0qOr8LNYQuYWmAaqP16WpbpKEjhejDrDYyYOwwJXSZO6u7q5Pvw== + dependencies: + resolve "^1.3.3" + +karma-coverage-istanbul-reporter@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz#f3b5303553aadc8e681d40d360dfdc19bc7e9fe9" + integrity sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw== + dependencies: + istanbul-lib-coverage "^3.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^3.0.6" + istanbul-reports "^3.0.2" + minimatch "^3.0.4" + +karma-jasmine-html-reporter@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.6.0.tgz#586e17025a1b4128e9fba55d5f1e8921bfc3bc1e" + integrity sha512-ELO9yf0cNqpzaNLsfFgXd/wxZVYkE2+ECUwhMHUD4PZ17kcsPsYsVyjquiRqyMn2jkd2sHt0IeMyAyq1MC23Fw== + +karma-jasmine@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-4.0.1.tgz#b99e073b6d99a5196fc4bffc121b89313b0abd82" + integrity sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw== + dependencies: + jasmine-core "^3.6.0" + +karma-source-map-support@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz#58526ceccf7e8730e56effd97a4de8d712ac0d6b" + integrity sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A== + dependencies: + source-map-support "^0.5.5" + +karma@~6.3.4: + version "6.3.4" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.3.4.tgz#359899d3aab3d6b918ea0f57046fd2a6b68565e6" + integrity sha512-hbhRogUYIulfkBTZT7xoPrCYhRBnBoqbbL4fszWD0ReFGUxU+LYBr3dwKdAluaDQ/ynT9/7C+Lf7pPNW4gSx4Q== + dependencies: + body-parser "^1.19.0" + braces "^3.0.2" + chokidar "^3.5.1" + colors "^1.4.0" + connect "^3.7.0" + di "^0.0.1" + dom-serialize "^2.2.1" + glob "^7.1.7" + graceful-fs "^4.2.6" + http-proxy "^1.18.1" + isbinaryfile "^4.0.8" + lodash "^4.17.21" + log4js "^6.3.0" + mime "^2.5.2" + minimatch "^3.0.4" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^3.1.0" + source-map "^0.6.1" + tmp "^0.2.1" + ua-parser-js "^0.7.28" + yargs "^16.1.1" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klona@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" + integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== + +less-loader@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-8.1.1.tgz#ababe912580457ad00a4318146aac5b53e023f42" + integrity sha512-K93jJU7fi3n6rxVvzp8Cb88Uy9tcQKfHlkoezHwKILXhlNYiRQl4yowLIkQqmBXOH/5I8yoKiYeIf781HGkW9g== + dependencies: + klona "^2.0.4" + +less@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/less/-/less-4.1.1.tgz#15bf253a9939791dc690888c3ff424f3e6c7edba" + integrity sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw== + dependencies: + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^1.10.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^2.5.2" + source-map "~0.6.0" + +license-webpack-plugin@2.3.19: + version "2.3.19" + resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.3.19.tgz#f02720b2b0bcd9ae27fb63f0bd908d9ac9335d6c" + integrity sha512-z/izhwFRYHs1sCrDgrTUsNJpd+Xsd06OcFWSwHz/TiZygm5ucweVZi1Hu14Rf6tOj/XAl1Ebyc7GW6ZyyINyWA== + dependencies: + "@types/webpack-sources" "^0.1.5" + webpack-sources "^1.2.0" + +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +loader-runner@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" + integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + +loader-utils@2.0.0, loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash-es@^4.17.15: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log4js@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.3.0.tgz#10dfafbb434351a3e30277a00b9879446f715bcb" + integrity sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw== + dependencies: + date-format "^3.0.0" + debug "^4.1.1" + flatted "^2.0.1" + rfdc "^1.1.4" + streamroller "^2.2.4" + +loglevel@^1.6.8: + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@0.25.7, magic-string@^0.25.0: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +make-fetch-happen@^8.0.9: + version "8.0.14" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222" + integrity sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.0.5" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + promise-retry "^2.0.1" + socks-proxy-agent "^5.0.0" + ssri "^8.0.0" + +map-age-cleaner@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-8.1.1.tgz#cf118b357c65ab7b7e0817bdf00c8062297c0122" + integrity sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^3.1.0" + +memfs@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.2.2.tgz#5de461389d596e3f23d48bb7c2afb6161f4df40e" + integrity sha512-RE0CwmIM3CEvpcdK3rZ19BC4E6hv9kADkMN5rPduRak58cNArWLi/9jFLsa4rhsjfVxMP3v0jO7FHXq7SvFY5Q== + dependencies: + fs-monkey "1.0.3" + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + dependencies: + source-map "^0.6.1" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mime-db@1.48.0, "mime-db@>= 1.43.0 < 2": + version "1.48.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" + integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.28, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.31" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" + integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== + dependencies: + mime-db "1.48.0" + +mime@1.6.0, mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4, mime@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== + +mini-css-extract-plugin@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.5.1.tgz#c0ac557c48a7de47de3df0768fe037c9cf961f69" + integrity sha512-wEpr0XooH6rw/Mlf+9KTJoMBLT3HujzdTrmohPjAzF47N4Q6yAeczQLpRD/WxvAtXvskcXbily7TAdCfi2M4Dg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.3.3.tgz#34c7cea038c817a8658461bf35174551dce17a0a" + integrity sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-json-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" + integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== + dependencies: + jsonparse "^1.3.1" + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +moment-timezone@*, moment-timezone@0.5.33: + version "0.5.33" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.33.tgz#b252fd6bb57f341c9b59a5ab61a8e51a73bbd22c" + integrity sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w== + dependencies: + moment ">= 2.9.0" + +moment@2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" + integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + +"moment@>= 2.9.0": + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.0.0, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + +nanoid@^3.1.23: + version "3.1.23" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" + integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +needle@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.6.0.tgz#24dbb55f2509e2324b4a99d61f413982013ccdbe" + integrity sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +ngx-bootstrap@^5.6.1: + version "5.6.2" + resolved "https://registry.yarnpkg.com/ngx-bootstrap/-/ngx-bootstrap-5.6.2.tgz#e648f826d303c29255c16772676efd30695740d1" + integrity sha512-6YHXtdXkGH3w0NQoaUgNYAcrj064Lv5RTO284ha/hvpNTrh55yQz2cVh0VvwBk3MjyY2tdmLH4SuCJDszYdYiw== + +ngx-pagination@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/ngx-pagination/-/ngx-pagination-5.1.1.tgz#f8494da1e5eb0665382349a4d926c13a491bed21" + integrity sha512-KxHES+Dn6pbetytO9ng2GAdclmo4UcwzFmQyVPWh2xRPbAlv5/ezL2xnDVBFMqCoJQaZagvdQ+ZZFbqGWqAvCQ== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-gyp@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" + integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.3" + nopt "^5.0.0" + npmlog "^4.1.2" + request "^2.88.2" + rimraf "^3.0.2" + semver "^7.3.2" + tar "^6.0.2" + which "^2.0.2" + +node-releases@^1.1.71: + version "1.1.73" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" + integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-bundled@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" + integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-install-checks@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4" + integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w== + dependencies: + semver "^7.1.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-package-arg@8.1.2: + version "8.1.2" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.2.tgz#b868016ae7de5619e729993fbd8d11dc3c52ab62" + integrity sha512-6Eem455JsSMJY6Kpd3EyWE+n5hC+g9bSyHr9K9U2zqZb7+02+hObQ2c0+8iDk/mNF+8r1MhY44WypKJAkySIYA== + dependencies: + hosted-git-info "^4.0.1" + semver "^7.3.4" + validate-npm-package-name "^3.0.0" + +npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.2: + version "8.1.5" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44" + integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== + dependencies: + hosted-git-info "^4.0.1" + semver "^7.3.4" + validate-npm-package-name "^3.0.0" + +npm-packlist@^2.1.4: + version "2.2.2" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8" + integrity sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg== + dependencies: + glob "^7.1.6" + ignore-walk "^3.0.3" + npm-bundled "^1.1.1" + npm-normalize-package-bin "^1.0.1" + +npm-pick-manifest@6.1.1, npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz#7b5484ca2c908565f43b7f27644f36bb816f5148" + integrity sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA== + dependencies: + npm-install-checks "^4.0.0" + npm-normalize-package-bin "^1.0.1" + npm-package-arg "^8.1.2" + semver "^7.3.4" + +npm-registry-fetch@^10.0.0: + version "10.1.2" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-10.1.2.tgz#11ffe03d813c653e768bdf762cfc5f1afe91b8bd" + integrity sha512-KsM/TdPmntqgBFlfsbkOLkkE9ovZo7VpVcd+/eTdYszCrgy5zFl5JzWm+OxavFaEWlbkirpkou+ZYI00RmOBFA== + dependencies: + lru-cache "^6.0.0" + make-fetch-happen "^8.0.9" + minipass "^3.1.3" + minipass-fetch "^1.3.0" + minipass-json-stream "^1.0.1" + minizlib "^2.0.0" + npm-package-arg "^8.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npmlog@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nswag@^13.4.2: + version "13.11.3" + resolved "https://registry.yarnpkg.com/nswag/-/nswag-13.11.3.tgz#622fcc481d30ff972df7dfcd47a35fc4ae92be4c" + integrity sha512-QKQlOm6098fqm1i2xBBq8AMKY2lbN6cFG14ZOLRNGFs23kV/QPwJdSmkT0IpweoPSTI2LH2ztFa5zTH3/l8Lgg== + +nth-check@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125" + integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q== + dependencies: + boolbase "^1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.0.2.tgz#8c3e95cce93ba2fc8d99968ee8bfefecdb50b84f" + integrity sha512-NV5QmWJrTaNBLHABJyrb+nd5dXI5zfea/suWawBhkHzAbVhLLiJdrqMgxMypGK9Eznp2Ltoh7SAVkQ3XAucX7Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opener@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +ora@5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.0.tgz#42eda4855835b9cd14d33864c97a3c95a3f56bf4" + integrity sha512-1StwyXQGoU6gdjYkyVcqOLnVlbKj+6yPNNOxJVgpt9t4eksKjiriiHuxktLYkgllwk+D6MbC4ihH84L1udRXPg== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pacote@11.3.2: + version "11.3.2" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.3.2.tgz#2bef04f6ec6bafceb5eb2f5b3965f0d00aee4d7e" + integrity sha512-lMO7V9aMhyE5gfaSFxKfW3OTdXuFBNQJfuNuet3NPzWWhOYIW90t85vHcHLDjdhgmfAdAHyh9q1HAap96ea0XA== + dependencies: + "@npmcli/git" "^2.0.1" + "@npmcli/installed-package-contents" "^1.0.6" + "@npmcli/promise-spawn" "^1.2.0" + "@npmcli/run-script" "^1.8.2" + cacache "^15.0.5" + chownr "^2.0.0" + fs-minipass "^2.1.0" + infer-owner "^1.0.4" + minipass "^3.1.3" + mkdirp "^1.0.3" + npm-package-arg "^8.0.1" + npm-packlist "^2.1.4" + npm-pick-manifest "^6.0.0" + npm-registry-fetch "^10.0.0" + promise-retry "^2.0.1" + read-package-json-fast "^2.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.1.0" + +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse5-html-rewriting-stream@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz#de1820559317ab4e451ea72dba05fddfd914480b" + integrity sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg== + dependencies: + parse5 "^6.0.1" + parse5-sax-parser "^6.0.1" + +parse5-htmlparser2-tree-adapter@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + +parse5-sax-parser@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz#98b4d366b5b266a7cd90b4b58906667af882daba" + integrity sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg== + dependencies: + parse5 "^6.0.1" + +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +portfinder@^1.0.26: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^6.0.2" + +postcss-calc@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a" + integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g== + dependencies: + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.0.tgz#2b620b88c0ff19683f3349f4cf9e24ebdafb2c88" + integrity sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-convert-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.1.tgz#4ec19d6016534e30e3102fdf414e753398645232" + integrity sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz#9eae4b747cf760d31f2447c27f0619d5718901fe" + integrity sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg== + +postcss-discard-duplicates@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz#68f7cc6458fe6bab2e46c9f55ae52869f680e66d" + integrity sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA== + +postcss-discard-empty@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz#ee136c39e27d5d2ed4da0ee5ed02bc8a9f8bf6d8" + integrity sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw== + +postcss-discard-overridden@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz#454b41f707300b98109a75005ca4ab0ff2743ac6" + integrity sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q== + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" + integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-import@14.0.1: + version "14.0.1" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.0.1.tgz#6a3f8f2ce74a95fc7c72ecfe3eddfa0e9124e677" + integrity sha512-Xn2+z++vWObbEPhiiKO1a78JiyhqipyrXHBb3AHpv0ks7Cdg+GxQQJ24ODNMTanldf7197gSP3axppO9yaG0lA== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-initial@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" + integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== + dependencies: + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-loader@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-5.2.0.tgz#ccd6668a778902d653602289c765a8bc481986dc" + integrity sha512-uSuCkENFeUaOYsKrXm0eNNgVIxc71z8RcckLMbVw473rGojFnrUeqEz6zBgXsH2q1EIzXnO/4pEz9RhALjlITA== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.4" + semver "^7.3.4" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-longhand@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz#277ada51d9a7958e8ef8cf263103c9384b322a41" + integrity sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw== + dependencies: + css-color-names "^1.0.1" + postcss-value-parser "^4.1.0" + stylehacks "^5.0.1" + +postcss-merge-rules@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz#d6e4d65018badbdb7dcc789c4f39b941305d410a" + integrity sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + cssnano-utils "^2.0.1" + postcss-selector-parser "^6.0.5" + vendors "^1.0.3" + +postcss-minify-font-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz#a90cefbfdaa075bd3dbaa1b33588bb4dc268addf" + integrity sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-minify-gradients@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.1.tgz#2dc79fd1a1afcb72a9e727bc549ce860f93565d2" + integrity sha512-odOwBFAIn2wIv+XYRpoN2hUV3pPQlgbJ10XeXPq8UY2N+9ZG42xu45lTn/g9zZ+d70NKSQD6EOi6UiCMu3FN7g== + dependencies: + cssnano-utils "^2.0.1" + is-color-stop "^1.1.0" + postcss-value-parser "^4.1.0" + +postcss-minify-params@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz#371153ba164b9d8562842fdcd929c98abd9e5b6c" + integrity sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw== + dependencies: + alphanum-sort "^1.0.2" + browserslist "^4.16.0" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz#4385c845d3979ff160291774523ffa54eafd5a54" + integrity sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og== + dependencies: + alphanum-sort "^1.0.2" + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz#121559d1bebc55ac8d24af37f67bd4da9efd91d0" + integrity sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg== + +postcss-normalize-display-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz#62650b965981a955dffee83363453db82f6ad1fd" + integrity sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-positions@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz#868f6af1795fdfa86fbbe960dceb47e5f9492fe5" + integrity sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-normalize-repeat-style@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz#cbc0de1383b57f5bb61ddd6a84653b5e8665b2b5" + integrity sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-string@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz#d9eafaa4df78c7a3b973ae346ef0e47c554985b0" + integrity sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-normalize-timing-functions@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz#8ee41103b9130429c6cbba736932b75c5e2cb08c" + integrity sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-unicode@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz#82d672d648a411814aa5bf3ae565379ccd9f5e37" + integrity sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA== + dependencies: + browserslist "^4.16.0" + postcss-value-parser "^4.1.0" + +postcss-normalize-url@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz#ddcdfb7cede1270740cf3e4dfc6008bd96abc763" + integrity sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ== + dependencies: + is-absolute-url "^3.0.3" + normalize-url "^6.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-whitespace@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz#b0b40b5bcac83585ff07ead2daf2dcfbeeef8e9a" + integrity sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-ordered-values@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz#1f351426977be00e0f765b3164ad753dac8ed044" + integrity sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-initial@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz#9d6369865b0f6f6f6b165a0ef5dc1a4856c7e946" + integrity sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw== + dependencies: + browserslist "^4.16.0" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz#93c12f6a159474aa711d5269923e2383cedcf640" + integrity sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" + integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.2.tgz#bc73c4ea4c5a80fbd4b45e29042c34ceffb9257f" + integrity sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A== + dependencies: + postcss-value-parser "^4.1.0" + svgo "^2.3.0" + +postcss-unique-selectors@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz#3be5c1d7363352eff838bd62b0b07a0abad43bfc" + integrity sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w== + dependencies: + alphanum-sort "^1.0.2" + postcss-selector-parser "^6.0.5" + uniqs "^2.0.0" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.0.tgz#b1a713f6172ca427e3f05ef1303de8b65683325f" + integrity sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ== + dependencies: + colorette "^1.2.2" + nanoid "^3.1.23" + source-map-js "^0.6.2" + +postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.36" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" + integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^8.2.10, postcss@^8.2.9: + version "8.3.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.5.tgz#982216b113412bc20a86289e91eb994952a5b709" + integrity sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA== + dependencies: + colorette "^1.2.2" + nanoid "^3.1.23" + source-map-js "^0.6.2" + +pretty-bytes@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +protractor@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/protractor/-/protractor-7.0.0.tgz#c3e263608bd72e2c2dc802b11a772711a4792d03" + integrity sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw== + dependencies: + "@types/q" "^0.0.32" + "@types/selenium-webdriver" "^3.0.0" + blocking-proxy "^1.0.0" + browserstack "^1.5.1" + chalk "^1.1.3" + glob "^7.0.3" + jasmine "2.8.0" + jasminewd2 "^2.1.0" + q "1.4.1" + saucelabs "^1.5.0" + selenium-webdriver "3.6.0" + source-map-support "~0.4.0" + webdriver-js-extender "2.1.0" + webdriver-manager "^12.1.7" + yargs "^15.3.1" + +proxy-addr@~2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +push.js@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/push.js/-/push.js-1.0.12.tgz#5703a03f5d286cd46d58564cb27bc079898d26b1" + integrity sha512-Mo/zkrPD58hcbMvC/9WveUPGz0PJ4T5UwQJP6DnMYbyxe7b1xM/9qqmJTMmDcprbZjCtLzf9wWtek7gA8O9QBw== + +q@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + integrity sha1-VXBbzZPF82c1MMLCy8DCs63cKG4= + +q@^1.4.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qjobs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-loader@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" + integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= + dependencies: + pify "^2.3.0" + +read-package-json-fast@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.2.tgz#2dcb24d9e8dd50fb322042c8c35a954e6cc7ac9e" + integrity sha512-5fyFUyO9B799foVk4n6ylcoAktG/FbE3jwRKxvwaeSrIunaoMc0u81dzXxjeAFKOce7O5KncdfwpGvvs6r5PsQ== + dependencies: + json-parse-even-better-errors "^2.3.0" + npm-normalize-package-bin "^1.0.1" + +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reflect-metadata@^0.1.2: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@0.13.7, regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regex-parser@^2.2.11: + version "2.2.11" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" + integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== + +regexp.prototype.flags@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.6.4: + version "0.6.9" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" + integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request@^2.87.0, request@^2.88.0, request@^2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url-loader@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57" + integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^7.0.35" + source-map "0.6.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.20.0, resolve@^1.1.7, resolve@^1.14.2, resolve@^1.3.2, resolve@^1.3.3: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.1.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@6.6.7, rxjs@^6.4.0, rxjs@^6.5.3, rxjs@^6.6.6: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass-loader@11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-11.0.1.tgz#8672f896593466573b904f47693e0695368e38c9" + integrity sha512-Vp1LcP4slTsTNLEiDkTcm8zGN/XYYrZz2BZybQbliWA8eXveqA/AxsEjllQTpJbg2MzCsx/qNO48sHdZtOaxTw== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + +sass@1.32.12: + version "1.32.12" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.12.tgz#a2a47ad0f1c168222db5206444a30c12457abb9f" + integrity sha512-zmXn03k3hN0KaiVTjohgkg98C3UowhL1/VSGdj4/VAAiMKGQOE80PFPxFP2Kyq0OUskPKcY5lImkhBKEHlypJA== + dependencies: + chokidar ">=3.0.0 <4.0.0" + +saucelabs@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.5.0.tgz#9405a73c360d449b232839919a86c396d379fd9d" + integrity sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ== + dependencies: + https-proxy-agent "^2.2.1" + +sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.5, schema-utils@^2.7.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" + integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== + dependencies: + "@types/json-schema" "^7.0.6" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz#2ba87a1662c020b8988c981ae62cb2a01298eafc" + integrity sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q== + dependencies: + jszip "^3.1.3" + rimraf "^2.5.4" + tmp "0.0.30" + xml2js "^0.4.17" + +selfsigned@^1.10.8: + version "1.10.11" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" + integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== + dependencies: + node-forge "^0.10.0" + +semver-dsl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/semver-dsl/-/semver-dsl-1.0.1.tgz#d3678de5555e8a61f629eed025366ae5f27340a0" + integrity sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA= + dependencies: + semver "^5.3.0" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@7.3.5, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-immediate-shim@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +smart-buffer@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" + integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +socket.io-adapter@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz#edc5dc36602f2985918d631c1399215e97a1b527" + integrity sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg== + +socket.io-parser@~4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" + integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== + dependencies: + "@types/component-emitter" "^1.2.10" + component-emitter "~1.3.0" + debug "~4.3.1" + +socket.io@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-3.1.2.tgz#06e27caa1c4fc9617547acfbb5da9bc1747da39a" + integrity sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw== + dependencies: + "@types/cookie" "^0.4.0" + "@types/cors" "^2.8.8" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "~2.0.0" + debug "~4.3.1" + engine.io "~4.1.0" + socket.io-adapter "~2.1.0" + socket.io-parser "~4.0.3" + +sockjs-client@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.1.tgz#256908f6d5adfb94dabbdbd02c66362cca0f9ea6" + integrity sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ== + dependencies: + debug "^3.2.6" + eventsource "^1.0.7" + faye-websocket "^0.11.3" + inherits "^2.0.4" + json3 "^3.3.3" + url-parse "^1.5.1" + +sockjs@^0.3.21: + version "0.3.21" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" + integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw== + dependencies: + faye-websocket "^0.11.3" + uuid "^3.4.0" + websocket-driver "^0.7.4" + +socks-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" + integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== + dependencies: + agent-base "^6.0.2" + debug "4" + socks "^2.3.3" + +socks@^2.3.3: + version "2.6.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" + integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== + dependencies: + ip "^1.1.5" + smart-buffer "^4.1.0" + +source-list-map@^2.0.0, source-list-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" + integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== + +source-map-loader@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-2.0.1.tgz#b4fd0ae7fa7e7d3954300f383f2d6fcc230a4261" + integrity sha512-UzOTTQhoNPeTNzOxwFw220RSRzdGSyH4lpNyWjR7Qm34P4/N0W669YSUFdH07+YNeN75h765XLHmNsF/bm97RQ== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.2" + source-map-js "^0.6.2" + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-resolve@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + +source-map-support@0.5.19, source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@~0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@~0.4.0: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@0.7.3, source-map@^0.7.3, source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +streamroller@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-2.2.4.tgz#c198ced42db94086a6193608187ce80a5f2b0e53" + integrity sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ== + dependencies: + date-format "^2.1.0" + debug "^4.1.1" + fs-extra "^8.1.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +style-loader@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" + integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +stylehacks@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.1.tgz#323ec554198520986806388c7fdaebc38d2c06fb" + integrity sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA== + dependencies: + browserslist "^4.16.0" + postcss-selector-parser "^6.0.4" + +stylus-loader@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-5.0.0.tgz#d3f548887ab67808cc40d320079c44f8ffa3d9b8" + integrity sha512-1OaGgixTgC8IAaMCodZXg7XYsfP1qU0UzTHDyPaWACUh34j9geJL4iA583tFJDOtfNUOfDLaBpUywc5MicQ1aA== + dependencies: + fast-glob "^3.2.5" + klona "^2.0.4" + normalize-path "^3.0.0" + +stylus@0.54.8: + version "0.54.8" + resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.8.tgz#3da3e65966bc567a7b044bfe0eece653e099d147" + integrity sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg== + dependencies: + css-parse "~2.0.0" + debug "~3.1.0" + glob "^7.1.6" + mkdirp "~1.0.4" + safer-buffer "^2.1.2" + sax "~1.2.4" + semver "^6.3.0" + source-map "^0.7.3" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +svgo@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.3.0.tgz#6b3af81d0cbd1e19c83f5f63cec2cb98c70b5373" + integrity sha512-fz4IKjNO6HDPgIQxu4IxwtubtbSfGEAJUq/IXyTPIkGhWck/faiiwfkvsB8LnBkKLvSoyNNIY6d13lZprJMc9Q== + dependencies: + "@trysound/sax" "0.1.1" + chalk "^4.1.0" + commander "^7.1.0" + css-select "^3.1.2" + css-tree "^1.1.2" + csso "^4.2.0" + stable "^0.1.8" + +sweetalert2@^10.15.6: + version "10.16.9" + resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-10.16.9.tgz#8ed86f2fa811a136667a48357e204348705be8c9" + integrity sha512-oNe+md5tmmS3fGfVHa7gVPlun7Td2oANSacnZCeghnrr3OHBi6UPVPU+GFrymwaDqwQspACilLRmRnM7aTjNPA== + +symbol-observable@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" + integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== + +tar@^6.0.2, tar@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" + integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +terser-webpack-plugin@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.2.tgz#51d295eb7cc56785a67a372575fdc46e42d5c20c" + integrity sha512-6QhDaAiVHIQr5Ab3XUWZyDmrIPCHMiqJVljMF91YKyqwKkL5QHnYMkrMBy96v9Z7ev1hGhSEw1HQZc2p/s5Z8Q== + dependencies: + jest-worker "^26.6.2" + p-limit "^3.1.0" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + source-map "^0.6.1" + terser "^5.7.0" + +terser-webpack-plugin@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.3.tgz#30033e955ca28b55664f1e4b30a1347e61aa23af" + integrity sha512-cxGbMqr6+A2hrIB5ehFIF+F/iST5ZOxvOmy9zih9ySbP1C2oEWQSOUS+2SNBTjzx5xLKO4xnod9eywdfq1Nb9A== + dependencies: + jest-worker "^27.0.2" + p-limit "^3.1.0" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + source-map "^0.6.1" + terser "^5.7.0" + +terser@5.7.0, terser@^5.7.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693" + integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +text-table@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through@X.X.X, through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tmp@0.0.30: + version "0.0.30" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" + integrity sha1-ckGdSovn1s51FI/YsyTlk6cRwu0= + dependencies: + os-tmpdir "~1.0.1" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tree-kill@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +ts-helpers@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ts-helpers/-/ts-helpers-1.1.2.tgz#fc69be9f1f3baed01fb1a0ef8d4cfe748814d835" + integrity sha1-/Gm+nx87rtAfsaDvjUz+dIgU2DU= + +ts-node@^8.10.1: + version "8.10.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" + integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + +tslib@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" + integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== + +tslib@^1.10.0, tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" + integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== + +tslint@~6.1.0: + version "6.1.3" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" + integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== + dependencies: + "@babel/code-frame" "^7.0.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^4.0.1" + glob "^7.1.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + mkdirp "^0.5.3" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.13.0" + tsutils "^2.29.0" + +tsutils@^2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== + dependencies: + tslib "^1.8.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" + integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== + +ua-parser-js@^0.7.28: + version "0.7.28" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" + integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse@^1.4.3, url-parse@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b" + integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + dependencies: + builtins "^1.0.3" + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= + +watchpack@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.2.0.tgz#47d78f5415fe550ecd740f99fe2882323a58b1ce" + integrity sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +web-animations-js@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/web-animations-js/-/web-animations-js-2.3.2.tgz#a51963a359c543f97b47c7d4bc2d811f9fc9e153" + integrity sha512-TOMFWtQdxzjWp8qx4DAraTWTsdhxVSiWa6NkPFSaPtZ1diKUxTn4yTix73A1euG1WbSOMMPcY51cnjTIHrGtDA== + +webdriver-js-extender@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz#57d7a93c00db4cc8d556e4d3db4b5db0a80c3bb7" + integrity sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ== + dependencies: + "@types/selenium-webdriver" "^3.0.0" + selenium-webdriver "^3.0.1" + +webdriver-manager@^12.1.7: + version "12.1.8" + resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.8.tgz#5e70e73eaaf53a0767d5745270addafbc5905fd4" + integrity sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg== + dependencies: + adm-zip "^0.4.9" + chalk "^1.1.1" + del "^2.2.0" + glob "^7.0.3" + ini "^1.3.4" + minimist "^1.2.0" + q "^1.4.1" + request "^2.87.0" + rimraf "^2.5.2" + semver "^5.3.0" + xml2js "^0.4.17" + +webpack-bundle-analyzer@^3.7.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz#f6f94db108fb574e415ad313de41a2707d33ef3c" + integrity sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.19" + mkdirp "^0.5.1" + opener "^1.5.1" + ws "^6.0.0" + +webpack-dev-middleware@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-4.1.0.tgz#f0c1f12ff4cd855b3b5eec89ee0f69bcc5336364" + integrity sha512-mpa/FY+DiBu5+r5JUIyTCYWRfkWgyA3/OOE9lwfzV9S70A4vJYLsVRKj5rMFEsezBroy2FmPyQ8oBRVW8QmK1A== + dependencies: + colorette "^1.2.1" + mem "^8.0.0" + memfs "^3.2.0" + mime-types "^2.1.28" + range-parser "^1.2.1" + schema-utils "^3.0.0" + +webpack-dev-middleware@^3.7.2: + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@3.11.2: + version "3.11.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708" + integrity sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.3.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.8" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.26" + schema-utils "^1.0.0" + selfsigned "^1.10.8" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "^0.3.21" + sockjs-client "^1.5.0" + spdy "^4.0.2" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "^13.3.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@5.7.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.7.3.tgz#2a0754e1877a25a8bbab3d2475ca70a052708213" + integrity sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.3.0: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.3.0.tgz#9ed2de69b25143a4c18847586ad9eccb19278cfa" + integrity sha512-WyOdtwSvOML1kbgtXbTDnEW0jkJ7hZr/bDByIwszhWd/4XX1A3XMkrbFMsuH4+/MfLlZCUzlAdg4r7jaGKEIgQ== + dependencies: + source-list-map "^2.0.1" + source-map "^0.6.1" + +webpack-subresource-integrity@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz#e40b6578d3072e2d24104975249c52c66e9a743e" + integrity sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw== + dependencies: + webpack-sources "^1.3.0" + +webpack@5.39.1: + version "5.39.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.39.1.tgz#d1e014b6d71e1aef385316ad528f21cd5b1f9784" + integrity sha512-ulOvoNCh2PvTUa+zbpRuEb1VPeQnhxpnHleMPVVCq3QqnaFogjsLyps+o42OviQFoaGtTQYrUqDXu1QNkvUPzw== + dependencies: + "@types/eslint-scope" "^3.7.0" + "@types/estree" "^0.0.47" + "@webassemblyjs/ast" "1.11.0" + "@webassemblyjs/wasm-edit" "1.11.0" + "@webassemblyjs/wasm-parser" "1.11.0" + acorn "^8.2.1" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.8.0" + es-module-lexer "^0.4.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.4" + json-parse-better-errors "^1.0.2" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.0.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.1" + watchpack "^2.2.0" + webpack-sources "^2.3.0" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.1, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^6.0.0, ws@^6.2.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + +ws@~7.4.2: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +xml2js@^0.4.17: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^16.1.1, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zone.js@~0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.10.3.tgz#3e5e4da03c607c9dcd92e37dd35687a14a140c16" + integrity sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg== + +zone.js@~0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.11.4.tgz#0f70dcf6aba80f698af5735cbb257969396e8025" + integrity sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw== + dependencies: + tslib "^2.0.0" diff --git a/aspnet-core/.gitattributes b/aspnet-core/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/aspnet-core/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/aspnet-core/.gitignore b/aspnet-core/.gitignore new file mode 100644 index 0000000..2826563 --- /dev/null +++ b/aspnet-core/.gitignore @@ -0,0 +1,256 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +src/MeetingSchedule.Web.Mvc/secrets.json +src/MeetingSchedule.Web.Host/secrets.json +src/MeetingSchedule.Migrator/secrets.json diff --git a/aspnet-core/MeetingSchedule.sln b/aspnet-core/MeetingSchedule.sln new file mode 100644 index 0000000..b299a28 --- /dev/null +++ b/aspnet-core/MeetingSchedule.sln @@ -0,0 +1,74 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30709.64 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F10AA149-2626-486E-85BB-9CD5365F3016}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MeetingSchedule.Core", "src\MeetingSchedule.Core\MeetingSchedule.Core.csproj", "{0FA75A5B-AB83-4FD0-B545-279774C01E87}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MeetingSchedule.Application", "src\MeetingSchedule.Application\MeetingSchedule.Application.csproj", "{3870C648-4AEA-4B85-BA3F-F2F63B96136A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MeetingSchedule.Tests", "test\MeetingSchedule.Tests\MeetingSchedule.Tests.csproj", "{0D4C5D00-C144-4213-A007-4B8944113AB1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MeetingSchedule.Migrator", "src\MeetingSchedule.Migrator\MeetingSchedule.Migrator.csproj", "{880B3591-E057-46FE-B525-10BD83828B93}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MeetingSchedule.Web.Host", "src\MeetingSchedule.Web.Host\MeetingSchedule.Web.Host.csproj", "{38E184BD-E874-4633-A947-AED4FDB73F40}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MeetingSchedule.Web.Core", "src\MeetingSchedule.Web.Core\MeetingSchedule.Web.Core.csproj", "{22CFE0D2-8DCA-42D7-AD7D-784C3862493F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MeetingSchedule.EntityFrameworkCore", "src\MeetingSchedule.EntityFrameworkCore\MeetingSchedule.EntityFrameworkCore.csproj", "{E0580562-F8F2-4EBB-B07A-ABFC6F2C314F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0FA75A5B-AB83-4FD0-B545-279774C01E87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0FA75A5B-AB83-4FD0-B545-279774C01E87}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0FA75A5B-AB83-4FD0-B545-279774C01E87}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0FA75A5B-AB83-4FD0-B545-279774C01E87}.Release|Any CPU.Build.0 = Release|Any CPU + {3870C648-4AEA-4B85-BA3F-F2F63B96136A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3870C648-4AEA-4B85-BA3F-F2F63B96136A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3870C648-4AEA-4B85-BA3F-F2F63B96136A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3870C648-4AEA-4B85-BA3F-F2F63B96136A}.Release|Any CPU.Build.0 = Release|Any CPU + {0D4C5D00-C144-4213-A007-4B8944113AB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D4C5D00-C144-4213-A007-4B8944113AB1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D4C5D00-C144-4213-A007-4B8944113AB1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D4C5D00-C144-4213-A007-4B8944113AB1}.Release|Any CPU.Build.0 = Release|Any CPU + {880B3591-E057-46FE-B525-10BD83828B93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {880B3591-E057-46FE-B525-10BD83828B93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {880B3591-E057-46FE-B525-10BD83828B93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {880B3591-E057-46FE-B525-10BD83828B93}.Release|Any CPU.Build.0 = Release|Any CPU + {38E184BD-E874-4633-A947-AED4FDB73F40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {38E184BD-E874-4633-A947-AED4FDB73F40}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38E184BD-E874-4633-A947-AED4FDB73F40}.Release|Any CPU.ActiveCfg = Release|Any CPU + {38E184BD-E874-4633-A947-AED4FDB73F40}.Release|Any CPU.Build.0 = Release|Any CPU + {22CFE0D2-8DCA-42D7-AD7D-784C3862493F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {22CFE0D2-8DCA-42D7-AD7D-784C3862493F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {22CFE0D2-8DCA-42D7-AD7D-784C3862493F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {22CFE0D2-8DCA-42D7-AD7D-784C3862493F}.Release|Any CPU.Build.0 = Release|Any CPU + {E0580562-F8F2-4EBB-B07A-ABFC6F2C314F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E0580562-F8F2-4EBB-B07A-ABFC6F2C314F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E0580562-F8F2-4EBB-B07A-ABFC6F2C314F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E0580562-F8F2-4EBB-B07A-ABFC6F2C314F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {0FA75A5B-AB83-4FD0-B545-279774C01E87} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC} + {3870C648-4AEA-4B85-BA3F-F2F63B96136A} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC} + {0D4C5D00-C144-4213-A007-4B8944113AB1} = {F10AA149-2626-486E-85BB-9CD5365F3016} + {880B3591-E057-46FE-B525-10BD83828B93} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC} + {38E184BD-E874-4633-A947-AED4FDB73F40} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC} + {22CFE0D2-8DCA-42D7-AD7D-784C3862493F} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC} + {E0580562-F8F2-4EBB-B07A-ABFC6F2C314F} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {9A55C749-0BFF-4EFD-8499-12A2CB3B5B07} + EndGlobalSection +EndGlobal diff --git a/aspnet-core/build/build-with-ng.ps1 b/aspnet-core/build/build-with-ng.ps1 new file mode 100644 index 0000000..9105e4f --- /dev/null +++ b/aspnet-core/build/build-with-ng.ps1 @@ -0,0 +1,57 @@ +# COMMON PATHS + +$buildFolder = (Get-Item -Path "./" -Verbose).FullName +$slnFolder = Join-Path $buildFolder "../" +$outputFolder = Join-Path $buildFolder "outputs" +$webHostFolder = Join-Path $slnFolder "src/MeetingSchedule.Web.Host" +$ngFolder = Join-Path $buildFolder "../../angular" + +## CLEAR ###################################################################### + +Remove-Item $outputFolder -Force -Recurse -ErrorAction Ignore +New-Item -Path $outputFolder -ItemType Directory + +## RESTORE NUGET PACKAGES ##################################################### + +Set-Location $slnFolder +dotnet restore + +## PUBLISH WEB HOST PROJECT ################################################### + +Set-Location $webHostFolder +dotnet publish --output (Join-Path $outputFolder "Host") + +## PUBLISH ANGULAR UI PROJECT ################################################# + +Set-Location $ngFolder +& yarn +& ng build --prod +Copy-Item (Join-Path $ngFolder "dist") (Join-Path $outputFolder "ng") -Recurse +Copy-Item (Join-Path $ngFolder "Dockerfile") (Join-Path $outputFolder "ng") + +# Change UI configuration +$ngConfigPath = Join-Path $outputFolder "ng/assets/appconfig.json" +(Get-Content $ngConfigPath) -replace "44311", "9901" | Set-Content $ngConfigPath +(Get-Content $ngConfigPath) -replace "4200", "9902" | Set-Content $ngConfigPath + +## CREATE DOCKER IMAGES ####################################################### + +# Host +Set-Location (Join-Path $outputFolder "Host") + +docker rmi abp/host -f +docker build -t abp/host . + +# Angular UI +Set-Location (Join-Path $outputFolder "ng") + +docker rmi abp/ng -f +docker build -t abp/ng . + +## DOCKER COMPOSE FILES ####################################################### + +Copy-Item (Join-Path $slnFolder "docker/ng/*.*") $outputFolder + +## FINALIZE ################################################################### + +Set-Location $outputFolder diff --git a/aspnet-core/docker/ng/docker-compose.yml b/aspnet-core/docker/ng/docker-compose.yml new file mode 100644 index 0000000..4eaba31 --- /dev/null +++ b/aspnet-core/docker/ng/docker-compose.yml @@ -0,0 +1,17 @@ +version: '2' + +services: + + abp_host: + image: abp/host + environment: + - ASPNETCORE_ENVIRONMENT=Staging + ports: + - "9901:80" + volumes: + - "./Host-Logs:/app/App_Data/Logs" + + abp_ng: + image: abp/ng + ports: + - "9902:80" \ No newline at end of file diff --git a/aspnet-core/docker/ng/down.ps1 b/aspnet-core/docker/ng/down.ps1 new file mode 100644 index 0000000..508a7c4 --- /dev/null +++ b/aspnet-core/docker/ng/down.ps1 @@ -0,0 +1 @@ +docker-compose down -v --rmi local \ No newline at end of file diff --git a/aspnet-core/docker/ng/up.ps1 b/aspnet-core/docker/ng/up.ps1 new file mode 100644 index 0000000..5177d11 --- /dev/null +++ b/aspnet-core/docker/ng/up.ps1 @@ -0,0 +1 @@ +docker-compose up -d \ No newline at end of file diff --git a/aspnet-core/src/MeetingSchedule.Application/Authorization/AbpLoginResultTypeHelper.cs b/aspnet-core/src/MeetingSchedule.Application/Authorization/AbpLoginResultTypeHelper.cs new file mode 100644 index 0000000..fd10788 --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/Authorization/AbpLoginResultTypeHelper.cs @@ -0,0 +1,64 @@ +using System; +using Abp; +using Abp.Authorization; +using Abp.Dependency; +using Abp.UI; + +namespace MeetingSchedule.Authorization +{ + public class AbpLoginResultTypeHelper : AbpServiceBase, ITransientDependency + { + public AbpLoginResultTypeHelper() + { + LocalizationSourceName = MeetingScheduleConsts.LocalizationSourceName; + } + + public Exception CreateExceptionForFailedLoginAttempt(AbpLoginResultType result, string usernameOrEmailAddress, string tenancyName) + { + switch (result) + { + case AbpLoginResultType.Success: + return new Exception("Don't call this method with a success result!"); + case AbpLoginResultType.InvalidUserNameOrEmailAddress: + case AbpLoginResultType.InvalidPassword: + return new UserFriendlyException(L("LoginFailed"), L("InvalidUserNameOrPassword")); + case AbpLoginResultType.InvalidTenancyName: + return new UserFriendlyException(L("LoginFailed"), L("ThereIsNoTenantDefinedWithName{0}", tenancyName)); + case AbpLoginResultType.TenantIsNotActive: + return new UserFriendlyException(L("LoginFailed"), L("TenantIsNotActive", tenancyName)); + case AbpLoginResultType.UserIsNotActive: + return new UserFriendlyException(L("LoginFailed"), L("UserIsNotActiveAndCanNotLogin", usernameOrEmailAddress)); + case AbpLoginResultType.UserEmailIsNotConfirmed: + return new UserFriendlyException(L("LoginFailed"), L("UserEmailIsNotConfirmedAndCanNotLogin")); + case AbpLoginResultType.LockedOut: + return new UserFriendlyException(L("LoginFailed"), L("UserLockedOutMessage")); + default: // Can not fall to default actually. But other result types can be added in the future and we may forget to handle it + Logger.Warn("Unhandled login fail reason: " + result); + return new UserFriendlyException(L("LoginFailed")); + } + } + + public string CreateLocalizedMessageForFailedLoginAttempt(AbpLoginResultType result, string usernameOrEmailAddress, string tenancyName) + { + switch (result) + { + case AbpLoginResultType.Success: + throw new Exception("Don't call this method with a success result!"); + case AbpLoginResultType.InvalidUserNameOrEmailAddress: + case AbpLoginResultType.InvalidPassword: + return L("InvalidUserNameOrPassword"); + case AbpLoginResultType.InvalidTenancyName: + return L("ThereIsNoTenantDefinedWithName{0}", tenancyName); + case AbpLoginResultType.TenantIsNotActive: + return L("TenantIsNotActive", tenancyName); + case AbpLoginResultType.UserIsNotActive: + return L("UserIsNotActiveAndCanNotLogin", usernameOrEmailAddress); + case AbpLoginResultType.UserEmailIsNotConfirmed: + return L("UserEmailIsNotConfirmedAndCanNotLogin"); + default: // Can not fall to default actually. But other result types can be added in the future and we may forget to handle it + Logger.Warn("Unhandled login fail reason: " + result); + return L("LoginFailed"); + } + } + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/AccountAppService.cs b/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/AccountAppService.cs new file mode 100644 index 0000000..c73ead3 --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/AccountAppService.cs @@ -0,0 +1,57 @@ +using System.Threading.Tasks; +using Abp.Configuration; +using Abp.Zero.Configuration; +using MeetingSchedule.Authorization.Accounts.Dto; +using MeetingSchedule.Authorization.Users; + +namespace MeetingSchedule.Authorization.Accounts +{ + public class AccountAppService : MeetingScheduleAppServiceBase, IAccountAppService + { + // from: http://regexlib.com/REDetails.aspx?regexp_id=1923 + public const string PasswordRegex = "(?=^.{8,}$)(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\\s)[0-9a-zA-Z!@#$%^&*()]*$"; + + private readonly UserRegistrationManager _userRegistrationManager; + + public AccountAppService( + UserRegistrationManager userRegistrationManager) + { + _userRegistrationManager = userRegistrationManager; + } + + public async Task IsTenantAvailable(IsTenantAvailableInput input) + { + var tenant = await TenantManager.FindByTenancyNameAsync(input.TenancyName); + if (tenant == null) + { + return new IsTenantAvailableOutput(TenantAvailabilityState.NotFound); + } + + if (!tenant.IsActive) + { + return new IsTenantAvailableOutput(TenantAvailabilityState.InActive); + } + + return new IsTenantAvailableOutput(TenantAvailabilityState.Available, tenant.Id); + } + + public async Task Register(RegisterInput input) + { + var user = await _userRegistrationManager.RegisterAsync( + input.Name, + input.Surname, + input.EmailAddress, + input.UserName, + input.Password, + true // Assumed email address is always confirmed. Change this if you want to implement email confirmation. + ); + + var isEmailConfirmationRequiredForLogin = await SettingManager.GetSettingValueAsync(AbpZeroSettingNames.UserManagement.IsEmailConfirmationRequiredForLogin); + + return new RegisterOutput + { + CanLogin = user.IsActive && (user.IsEmailConfirmed || !isEmailConfirmationRequiredForLogin) + }; + } + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/IsTenantAvailableInput.cs b/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/IsTenantAvailableInput.cs new file mode 100644 index 0000000..311e808 --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/IsTenantAvailableInput.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; +using Abp.MultiTenancy; + +namespace MeetingSchedule.Authorization.Accounts.Dto +{ + public class IsTenantAvailableInput + { + [Required] + [StringLength(AbpTenantBase.MaxTenancyNameLength)] + public string TenancyName { get; set; } + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/IsTenantAvailableOutput.cs b/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/IsTenantAvailableOutput.cs new file mode 100644 index 0000000..ea6ac70 --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/IsTenantAvailableOutput.cs @@ -0,0 +1,19 @@ +namespace MeetingSchedule.Authorization.Accounts.Dto +{ + public class IsTenantAvailableOutput + { + public TenantAvailabilityState State { get; set; } + + public int? TenantId { get; set; } + + public IsTenantAvailableOutput() + { + } + + public IsTenantAvailableOutput(TenantAvailabilityState state, int? tenantId = null) + { + State = state; + TenantId = tenantId; + } + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/RegisterInput.cs b/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/RegisterInput.cs new file mode 100644 index 0000000..5a691bb --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/RegisterInput.cs @@ -0,0 +1,48 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using Abp.Auditing; +using Abp.Authorization.Users; +using Abp.Extensions; +using MeetingSchedule.Validation; + +namespace MeetingSchedule.Authorization.Accounts.Dto +{ + public class RegisterInput : IValidatableObject + { + [Required] + [StringLength(AbpUserBase.MaxNameLength)] + public string Name { get; set; } + + [Required] + [StringLength(AbpUserBase.MaxSurnameLength)] + public string Surname { get; set; } + + [Required] + [StringLength(AbpUserBase.MaxUserNameLength)] + public string UserName { get; set; } + + [Required] + [EmailAddress] + [StringLength(AbpUserBase.MaxEmailAddressLength)] + public string EmailAddress { get; set; } + + [Required] + [StringLength(AbpUserBase.MaxPlainPasswordLength)] + [DisableAuditing] + public string Password { get; set; } + + [DisableAuditing] + public string CaptchaResponse { get; set; } + + public IEnumerable Validate(ValidationContext validationContext) + { + if (!UserName.IsNullOrEmpty()) + { + if (!UserName.Equals(EmailAddress) && ValidationHelper.IsEmail(UserName)) + { + yield return new ValidationResult("Username cannot be an email address unless it's the same as your email address!"); + } + } + } + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/RegisterOutput.cs b/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/RegisterOutput.cs new file mode 100644 index 0000000..d0e4b7a --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/RegisterOutput.cs @@ -0,0 +1,7 @@ +namespace MeetingSchedule.Authorization.Accounts.Dto +{ + public class RegisterOutput + { + public bool CanLogin { get; set; } + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/TenantAvailabilityState.cs b/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/TenantAvailabilityState.cs new file mode 100644 index 0000000..9ad5caf --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/Dto/TenantAvailabilityState.cs @@ -0,0 +1,9 @@ +namespace MeetingSchedule.Authorization.Accounts.Dto +{ + public enum TenantAvailabilityState + { + Available = 1, + InActive, + NotFound + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/IAccountAppService.cs b/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/IAccountAppService.cs new file mode 100644 index 0000000..c75fc7d --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/Authorization/Accounts/IAccountAppService.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; +using Abp.Application.Services; +using MeetingSchedule.Authorization.Accounts.Dto; + +namespace MeetingSchedule.Authorization.Accounts +{ + public interface IAccountAppService : IApplicationService + { + Task IsTenantAvailable(IsTenantAvailableInput input); + + Task Register(RegisterInput input); + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/Configuration/ConfigurationAppService.cs b/aspnet-core/src/MeetingSchedule.Application/Configuration/ConfigurationAppService.cs new file mode 100644 index 0000000..d3b5bc0 --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/Configuration/ConfigurationAppService.cs @@ -0,0 +1,16 @@ +using System.Threading.Tasks; +using Abp.Authorization; +using Abp.Runtime.Session; +using MeetingSchedule.Configuration.Dto; + +namespace MeetingSchedule.Configuration +{ + [AbpAuthorize] + public class ConfigurationAppService : MeetingScheduleAppServiceBase, IConfigurationAppService + { + public async Task ChangeUiTheme(ChangeUiThemeInput input) + { + await SettingManager.ChangeSettingForUserAsync(AbpSession.ToUserIdentifier(), AppSettingNames.UiTheme, input.Theme); + } + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/Configuration/Dto/ChangeUiThemeInput.cs b/aspnet-core/src/MeetingSchedule.Application/Configuration/Dto/ChangeUiThemeInput.cs new file mode 100644 index 0000000..a5080e4 --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/Configuration/Dto/ChangeUiThemeInput.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; + +namespace MeetingSchedule.Configuration.Dto +{ + public class ChangeUiThemeInput + { + [Required] + [StringLength(32)] + public string Theme { get; set; } + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/Configuration/IConfigurationAppService.cs b/aspnet-core/src/MeetingSchedule.Application/Configuration/IConfigurationAppService.cs new file mode 100644 index 0000000..b529426 --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/Configuration/IConfigurationAppService.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using MeetingSchedule.Configuration.Dto; + +namespace MeetingSchedule.Configuration +{ + public interface IConfigurationAppService + { + Task ChangeUiTheme(ChangeUiThemeInput input); + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/Configuration/Ui/UiThemeInfo.cs b/aspnet-core/src/MeetingSchedule.Application/Configuration/Ui/UiThemeInfo.cs new file mode 100644 index 0000000..01d18f5 --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/Configuration/Ui/UiThemeInfo.cs @@ -0,0 +1,14 @@ +namespace MeetingSchedule.Configuration.Ui +{ + public class UiThemeInfo + { + public string Name { get; } + public string CssClass { get; } + + public UiThemeInfo(string name, string cssClass) + { + Name = name; + CssClass = cssClass; + } + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/Configuration/Ui/UiThemes.cs b/aspnet-core/src/MeetingSchedule.Application/Configuration/Ui/UiThemes.cs new file mode 100644 index 0000000..bd8138a --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/Configuration/Ui/UiThemes.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; + +namespace MeetingSchedule.Configuration.Ui +{ + public static class UiThemes + { + public static List All { get; } + + static UiThemes() + { + All = new List + { + new UiThemeInfo("Red", "red"), + new UiThemeInfo("Pink", "pink"), + new UiThemeInfo("Purple", "purple"), + new UiThemeInfo("Deep Purple", "deep-purple"), + new UiThemeInfo("Indigo", "indigo"), + new UiThemeInfo("Blue", "blue"), + new UiThemeInfo("Light Blue", "light-blue"), + new UiThemeInfo("Cyan", "cyan"), + new UiThemeInfo("Teal", "teal"), + new UiThemeInfo("Green", "green"), + new UiThemeInfo("Light Green", "light-green"), + new UiThemeInfo("Lime", "lime"), + new UiThemeInfo("Yellow", "yellow"), + new UiThemeInfo("Amber", "amber"), + new UiThemeInfo("Orange", "orange"), + new UiThemeInfo("Deep Orange", "deep-orange"), + new UiThemeInfo("Brown", "brown"), + new UiThemeInfo("Grey", "grey"), + new UiThemeInfo("Blue Grey", "blue-grey"), + new UiThemeInfo("Black", "black") + }; + } + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/MeetingSchedule.Application.csproj b/aspnet-core/src/MeetingSchedule.Application/MeetingSchedule.Application.csproj new file mode 100644 index 0000000..4b66f66 --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/MeetingSchedule.Application.csproj @@ -0,0 +1,17 @@ + + + 1.0.0.0 + net6.0 + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + MeetingSchedule.Application + MeetingSchedule.Application + false + false + false + MeetingSchedule + true + + + + + \ No newline at end of file diff --git a/aspnet-core/src/MeetingSchedule.Application/MeetingScheduleAppServiceBase.cs b/aspnet-core/src/MeetingSchedule.Application/MeetingScheduleAppServiceBase.cs new file mode 100644 index 0000000..8618fb7 --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/MeetingScheduleAppServiceBase.cs @@ -0,0 +1,47 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Identity; +using Abp.Application.Services; +using Abp.IdentityFramework; +using Abp.Runtime.Session; +using MeetingSchedule.Authorization.Users; +using MeetingSchedule.MultiTenancy; + +namespace MeetingSchedule +{ + /// + /// Derive your application services from this class. + /// + public abstract class MeetingScheduleAppServiceBase : ApplicationService + { + public TenantManager TenantManager { get; set; } + + public UserManager UserManager { get; set; } + + protected MeetingScheduleAppServiceBase() + { + LocalizationSourceName = MeetingScheduleConsts.LocalizationSourceName; + } + + protected virtual async Task GetCurrentUserAsync() + { + var user = await UserManager.FindByIdAsync(AbpSession.GetUserId().ToString()); + if (user == null) + { + throw new Exception("There is no current user!"); + } + + return user; + } + + protected virtual Task GetCurrentTenantAsync() + { + return TenantManager.GetByIdAsync(AbpSession.GetTenantId()); + } + + protected virtual void CheckErrors(IdentityResult identityResult) + { + identityResult.CheckErrors(LocalizationManager); + } + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/MeetingScheduleApplicationModule.cs b/aspnet-core/src/MeetingSchedule.Application/MeetingScheduleApplicationModule.cs new file mode 100644 index 0000000..4dc3a4f --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/MeetingScheduleApplicationModule.cs @@ -0,0 +1,30 @@ +using Abp.AutoMapper; +using Abp.Modules; +using Abp.Reflection.Extensions; +using MeetingSchedule.Authorization; + +namespace MeetingSchedule +{ + [DependsOn( + typeof(MeetingScheduleCoreModule), + typeof(AbpAutoMapperModule))] + public class MeetingScheduleApplicationModule : AbpModule + { + public override void PreInitialize() + { + Configuration.Authorization.Providers.Add(); + } + + public override void Initialize() + { + var thisAssembly = typeof(MeetingScheduleApplicationModule).GetAssembly(); + + IocManager.RegisterAssemblyByConvention(thisAssembly); + + Configuration.Modules.AbpAutoMapper().Configurators.Add( + // Scan the assembly for classes which inherit from AutoMapper.Profile + cfg => cfg.AddMaps(thisAssembly) + ); + } + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/MultiTenancy/Dto/CreateTenantDto.cs b/aspnet-core/src/MeetingSchedule.Application/MultiTenancy/Dto/CreateTenantDto.cs new file mode 100644 index 0000000..4cf84f9 --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/MultiTenancy/Dto/CreateTenantDto.cs @@ -0,0 +1,29 @@ +using System.ComponentModel.DataAnnotations; +using Abp.Authorization.Users; +using Abp.AutoMapper; +using Abp.MultiTenancy; + +namespace MeetingSchedule.MultiTenancy.Dto +{ + [AutoMapTo(typeof(Tenant))] + public class CreateTenantDto + { + [Required] + [StringLength(AbpTenantBase.MaxTenancyNameLength)] + [RegularExpression(AbpTenantBase.TenancyNameRegex)] + public string TenancyName { get; set; } + + [Required] + [StringLength(AbpTenantBase.MaxNameLength)] + public string Name { get; set; } + + [Required] + [StringLength(AbpUserBase.MaxEmailAddressLength)] + public string AdminEmailAddress { get; set; } + + [StringLength(AbpTenantBase.MaxConnectionStringLength)] + public string ConnectionString { get; set; } + + public bool IsActive {get; set;} + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/MultiTenancy/Dto/PagedTenantResultRequestDto.cs b/aspnet-core/src/MeetingSchedule.Application/MultiTenancy/Dto/PagedTenantResultRequestDto.cs new file mode 100644 index 0000000..dab72dd --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/MultiTenancy/Dto/PagedTenantResultRequestDto.cs @@ -0,0 +1,11 @@ +using Abp.Application.Services.Dto; + +namespace MeetingSchedule.MultiTenancy.Dto +{ + public class PagedTenantResultRequestDto : PagedResultRequestDto + { + public string Keyword { get; set; } + public bool? IsActive { get; set; } + } +} + diff --git a/aspnet-core/src/MeetingSchedule.Application/MultiTenancy/Dto/TenantDto.cs b/aspnet-core/src/MeetingSchedule.Application/MultiTenancy/Dto/TenantDto.cs new file mode 100644 index 0000000..cb5ce1d --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/MultiTenancy/Dto/TenantDto.cs @@ -0,0 +1,22 @@ +using System.ComponentModel.DataAnnotations; +using Abp.Application.Services.Dto; +using Abp.AutoMapper; +using Abp.MultiTenancy; + +namespace MeetingSchedule.MultiTenancy.Dto +{ + [AutoMapFrom(typeof(Tenant))] + public class TenantDto : EntityDto + { + [Required] + [StringLength(AbpTenantBase.MaxTenancyNameLength)] + [RegularExpression(AbpTenantBase.TenancyNameRegex)] + public string TenancyName { get; set; } + + [Required] + [StringLength(AbpTenantBase.MaxNameLength)] + public string Name { get; set; } + + public bool IsActive {get; set;} + } +} diff --git a/aspnet-core/src/MeetingSchedule.Application/MultiTenancy/ITenantAppService.cs b/aspnet-core/src/MeetingSchedule.Application/MultiTenancy/ITenantAppService.cs new file mode 100644 index 0000000..db9d30d --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/MultiTenancy/ITenantAppService.cs @@ -0,0 +1,10 @@ +using Abp.Application.Services; +using MeetingSchedule.MultiTenancy.Dto; + +namespace MeetingSchedule.MultiTenancy +{ + public interface ITenantAppService : IAsyncCrudAppService + { + } +} + diff --git a/aspnet-core/src/MeetingSchedule.Application/MultiTenancy/TenantAppService.cs b/aspnet-core/src/MeetingSchedule.Application/MultiTenancy/TenantAppService.cs new file mode 100644 index 0000000..87e6a25 --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/MultiTenancy/TenantAppService.cs @@ -0,0 +1,123 @@ +using System.Linq; +using System.Threading.Tasks; +using Abp.Application.Services; +using Abp.Application.Services.Dto; +using Abp.Authorization; +using Abp.Domain.Repositories; +using Abp.Extensions; +using Abp.IdentityFramework; +using Abp.Linq.Extensions; +using Abp.MultiTenancy; +using Abp.Runtime.Security; +using MeetingSchedule.Authorization; +using MeetingSchedule.Authorization.Roles; +using MeetingSchedule.Authorization.Users; +using MeetingSchedule.Editions; +using MeetingSchedule.MultiTenancy.Dto; +using Microsoft.AspNetCore.Identity; + +namespace MeetingSchedule.MultiTenancy +{ + [AbpAuthorize(PermissionNames.Pages_Tenants)] + public class TenantAppService : AsyncCrudAppService, ITenantAppService + { + private readonly TenantManager _tenantManager; + private readonly EditionManager _editionManager; + private readonly UserManager _userManager; + private readonly RoleManager _roleManager; + private readonly IAbpZeroDbMigrator _abpZeroDbMigrator; + + public TenantAppService( + IRepository repository, + TenantManager tenantManager, + EditionManager editionManager, + UserManager userManager, + RoleManager roleManager, + IAbpZeroDbMigrator abpZeroDbMigrator) + : base(repository) + { + _tenantManager = tenantManager; + _editionManager = editionManager; + _userManager = userManager; + _roleManager = roleManager; + _abpZeroDbMigrator = abpZeroDbMigrator; + } + + public override async Task CreateAsync(CreateTenantDto input) + { + CheckCreatePermission(); + + // Create tenant + var tenant = ObjectMapper.Map(input); + tenant.ConnectionString = input.ConnectionString.IsNullOrEmpty() + ? null + : SimpleStringCipher.Instance.Encrypt(input.ConnectionString); + + var defaultEdition = await _editionManager.FindByNameAsync(EditionManager.DefaultEditionName); + if (defaultEdition != null) + { + tenant.EditionId = defaultEdition.Id; + } + + await _tenantManager.CreateAsync(tenant); + await CurrentUnitOfWork.SaveChangesAsync(); // To get new tenant's id. + + // Create tenant database + _abpZeroDbMigrator.CreateOrMigrateForTenant(tenant); + + // We are working entities of new tenant, so changing tenant filter + using (CurrentUnitOfWork.SetTenantId(tenant.Id)) + { + // Create static roles for new tenant + CheckErrors(await _roleManager.CreateStaticRoles(tenant.Id)); + + await CurrentUnitOfWork.SaveChangesAsync(); // To get static role ids + + // Grant all permissions to admin role + var adminRole = _roleManager.Roles.Single(r => r.Name == StaticRoleNames.Tenants.Admin); + await _roleManager.GrantAllPermissionsAsync(adminRole); + + // Create admin user for the tenant + var adminUser = User.CreateTenantAdminUser(tenant.Id, input.AdminEmailAddress); + await _userManager.InitializeOptionsAsync(tenant.Id); + CheckErrors(await _userManager.CreateAsync(adminUser, User.DefaultPassword)); + await CurrentUnitOfWork.SaveChangesAsync(); // To get admin user's id + + // Assign admin user to role! + CheckErrors(await _userManager.AddToRoleAsync(adminUser, adminRole.Name)); + await CurrentUnitOfWork.SaveChangesAsync(); + } + + return MapToEntityDto(tenant); + } + + protected override IQueryable CreateFilteredQuery(PagedTenantResultRequestDto input) + { + return Repository.GetAll() + .WhereIf(!input.Keyword.IsNullOrWhiteSpace(), x => x.TenancyName.Contains(input.Keyword) || x.Name.Contains(input.Keyword)) + .WhereIf(input.IsActive.HasValue, x => x.IsActive == input.IsActive); + } + + protected override void MapToEntity(TenantDto updateInput, Tenant entity) + { + // Manually mapped since TenantDto contains non-editable properties too. + entity.Name = updateInput.Name; + entity.TenancyName = updateInput.TenancyName; + entity.IsActive = updateInput.IsActive; + } + + public override async Task DeleteAsync(EntityDto input) + { + CheckDeletePermission(); + + var tenant = await _tenantManager.GetByIdAsync(input.Id); + await _tenantManager.DeleteAsync(tenant); + } + + private void CheckErrors(IdentityResult identityResult) + { + identityResult.CheckErrors(LocalizationManager); + } + } +} + diff --git a/aspnet-core/src/MeetingSchedule.Application/Net/MimeTypes/MimeTypeNames.cs b/aspnet-core/src/MeetingSchedule.Application/Net/MimeTypes/MimeTypeNames.cs new file mode 100644 index 0000000..53fe7d7 --- /dev/null +++ b/aspnet-core/src/MeetingSchedule.Application/Net/MimeTypes/MimeTypeNames.cs @@ -0,0 +1,311 @@ +using System; + +namespace MeetingSchedule.Net.MimeTypes +{ + /* Copied from: + * http://stackoverflow.com/questions/10362140/asp-mvc-are-there-any-constants-for-the-default-content-types */ + + /// + /// Common mime types. + /// + public static class MimeTypeNames + { + ///Used to denote the encoding necessary for files containing JavaScript source code. The alternative MIME type for this file type is text/javascript. + public const string ApplicationXJavascript = "application/x-javascript"; + + ///24bit Linear PCM audio at 8-48kHz, 1-N channels; Defined in RFC 3190 + public const string AudioL24 = "audio/L24"; + + ///Adobe Flash files for example with the extension .swf + public const string ApplicationXShockwaveFlash = "application/x-shockwave-flash"; + + ///Arbitrary binary data.[5] Generally speaking this type identifies files that are not associated with a specific application. Contrary to past assumptions by software packages such as Apache this is not a type that should be applied to unknown files. In such a case, a server or application should not indicate a content type, as it may be incorrect, but rather, should omit the type in order to allow the recipient to guess the type.[6] + public const string ApplicationOctetStream = "application/octet-stream"; + + ///Atom feeds + public const string ApplicationAtomXml = "application/atom+xml"; + + ///Cascading Style Sheets; Defined in RFC 2318 + public const string TextCss = "text/css"; + + ///commands; subtype resident in Gecko browsers like Firefox 3.5 + public const string TextCmd = "text/cmd"; + + ///Comma-separated values; Defined in RFC 4180 + public const string TextCsv = "text/csv"; + + ///deb (file format), a software package format used by the Debian project + public const string ApplicationXDeb = "application/x-deb"; + + ///Defined in RFC 1847 + public const string MultipartEncrypted = "multipart/encrypted"; + + ///Defined in RFC 1847 + public const string MultipartSigned = "multipart/signed"; + + ///Defined in RFC 2616 + public const string MessageHttp = "message/http"; + + ///Defined in RFC 4735 + public const string ModelExample = "model/example"; + + ///device-independent document in DVI format + public const string ApplicationXDvi = "application/x-dvi"; + + ///DTD files; Defined by RFC 3023 + public const string ApplicationXmlDtd = "application/xml-dtd"; + + ///ECMAScript/JavaScript; Defined in RFC 4329 (equivalent to application/ecmascript but with looser processing rules) It is not accepted in IE 8 or earlier - text/javascript is accepted but it is defined as obsolete in RFC 4329. The "type" attribute of the + + + + + + + + diff --git a/aspnet-core/test/MeetingSchedule.Tests/DependencyInjection/ServiceCollectionRegistrar.cs b/aspnet-core/test/MeetingSchedule.Tests/DependencyInjection/ServiceCollectionRegistrar.cs new file mode 100644 index 0000000..5f22717 --- /dev/null +++ b/aspnet-core/test/MeetingSchedule.Tests/DependencyInjection/ServiceCollectionRegistrar.cs @@ -0,0 +1,35 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Castle.MicroKernel.Registration; +using Castle.Windsor.MsDependencyInjection; +using Abp.Dependency; +using MeetingSchedule.EntityFrameworkCore; +using MeetingSchedule.Identity; + +namespace MeetingSchedule.Tests.DependencyInjection +{ + public static class ServiceCollectionRegistrar + { + public static void Register(IIocManager iocManager) + { + var services = new ServiceCollection(); + + IdentityRegistrar.Register(services); + + services.AddEntityFrameworkInMemoryDatabase(); + + var serviceProvider = WindsorRegistrationHelper.CreateServiceProvider(iocManager.IocContainer, services); + + var builder = new DbContextOptionsBuilder(); + builder.UseInMemoryDatabase(Guid.NewGuid().ToString()).UseInternalServiceProvider(serviceProvider); + + iocManager.IocContainer.Register( + Component + .For>() + .Instance(builder.Options) + .LifestyleSingleton() + ); + } + } +} diff --git a/aspnet-core/test/MeetingSchedule.Tests/MeetingSchedule.Tests.csproj b/aspnet-core/test/MeetingSchedule.Tests/MeetingSchedule.Tests.csproj new file mode 100644 index 0000000..ea54213 --- /dev/null +++ b/aspnet-core/test/MeetingSchedule.Tests/MeetingSchedule.Tests.csproj @@ -0,0 +1,39 @@ + + + 1.0.0.0 + net6.0 + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + MeetingSchedule.Tests + MeetingSchedule.Tests + true + false + false + false + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + + + + Always + + + + + + \ No newline at end of file diff --git a/aspnet-core/test/MeetingSchedule.Tests/MeetingScheduleTestBase.cs b/aspnet-core/test/MeetingSchedule.Tests/MeetingScheduleTestBase.cs new file mode 100644 index 0000000..86a2608 --- /dev/null +++ b/aspnet-core/test/MeetingSchedule.Tests/MeetingScheduleTestBase.cs @@ -0,0 +1,210 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Abp; +using Abp.Authorization.Users; +using Abp.Events.Bus; +using Abp.Events.Bus.Entities; +using Abp.MultiTenancy; +using Abp.Runtime.Session; +using Abp.TestBase; +using MeetingSchedule.Authorization.Users; +using MeetingSchedule.EntityFrameworkCore; +using MeetingSchedule.EntityFrameworkCore.Seed.Host; +using MeetingSchedule.EntityFrameworkCore.Seed.Tenants; +using MeetingSchedule.MultiTenancy; + +namespace MeetingSchedule.Tests +{ + public abstract class MeetingScheduleTestBase : AbpIntegratedTestBase + { + protected MeetingScheduleTestBase() + { + void NormalizeDbContext(MeetingScheduleDbContext context) + { + context.EntityChangeEventHelper = NullEntityChangeEventHelper.Instance; + context.EventBus = NullEventBus.Instance; + context.SuppressAutoSetTenantId = true; + } + + // Seed initial data for host + AbpSession.TenantId = null; + UsingDbContext(context => + { + NormalizeDbContext(context); + new InitialHostDbBuilder(context).Create(); + new DefaultTenantBuilder(context).Create(); + }); + + // Seed initial data for default tenant + AbpSession.TenantId = 1; + UsingDbContext(context => + { + NormalizeDbContext(context); + new TenantRoleAndUserBuilder(context, 1).Create(); + }); + + LoginAsDefaultTenantAdmin(); + } + + #region UsingDbContext + + protected IDisposable UsingTenantId(int? tenantId) + { + var previousTenantId = AbpSession.TenantId; + AbpSession.TenantId = tenantId; + return new DisposeAction(() => AbpSession.TenantId = previousTenantId); + } + + protected void UsingDbContext(Action action) + { + UsingDbContext(AbpSession.TenantId, action); + } + + protected Task UsingDbContextAsync(Func action) + { + return UsingDbContextAsync(AbpSession.TenantId, action); + } + + protected T UsingDbContext(Func func) + { + return UsingDbContext(AbpSession.TenantId, func); + } + + protected Task UsingDbContextAsync(Func> func) + { + return UsingDbContextAsync(AbpSession.TenantId, func); + } + + protected void UsingDbContext(int? tenantId, Action action) + { + using (UsingTenantId(tenantId)) + { + using (var context = LocalIocManager.Resolve()) + { + action(context); + context.SaveChanges(); + } + } + } + + protected async Task UsingDbContextAsync(int? tenantId, Func action) + { + using (UsingTenantId(tenantId)) + { + using (var context = LocalIocManager.Resolve()) + { + await action(context); + await context.SaveChangesAsync(); + } + } + } + + protected T UsingDbContext(int? tenantId, Func func) + { + T result; + + using (UsingTenantId(tenantId)) + { + using (var context = LocalIocManager.Resolve()) + { + result = func(context); + context.SaveChanges(); + } + } + + return result; + } + + protected async Task UsingDbContextAsync(int? tenantId, Func> func) + { + T result; + + using (UsingTenantId(tenantId)) + { + using (var context = LocalIocManager.Resolve()) + { + result = await func(context); + await context.SaveChangesAsync(); + } + } + + return result; + } + + #endregion + + #region Login + + protected void LoginAsHostAdmin() + { + LoginAsHost(AbpUserBase.AdminUserName); + } + + protected void LoginAsDefaultTenantAdmin() + { + LoginAsTenant(AbpTenantBase.DefaultTenantName, AbpUserBase.AdminUserName); + } + + protected void LoginAsHost(string userName) + { + AbpSession.TenantId = null; + + var user = + UsingDbContext( + context => + context.Users.FirstOrDefault(u => u.TenantId == AbpSession.TenantId && u.UserName == userName)); + if (user == null) + { + throw new Exception("There is no user: " + userName + " for host."); + } + + AbpSession.UserId = user.Id; + } + + protected void LoginAsTenant(string tenancyName, string userName) + { + var tenant = UsingDbContext(context => context.Tenants.FirstOrDefault(t => t.TenancyName == tenancyName)); + if (tenant == null) + { + throw new Exception("There is no tenant: " + tenancyName); + } + + AbpSession.TenantId = tenant.Id; + + var user = + UsingDbContext( + context => + context.Users.FirstOrDefault(u => u.TenantId == AbpSession.TenantId && u.UserName == userName)); + if (user == null) + { + throw new Exception("There is no user: " + userName + " for tenant: " + tenancyName); + } + + AbpSession.UserId = user.Id; + } + + #endregion + + /// + /// Gets current user if is not null. + /// Throws exception if it's null. + /// + protected async Task GetCurrentUserAsync() + { + var userId = AbpSession.GetUserId(); + return await UsingDbContext(context => context.Users.SingleAsync(u => u.Id == userId)); + } + + /// + /// Gets current tenant if is not null. + /// Throws exception if there is no current tenant. + /// + protected async Task GetCurrentTenantAsync() + { + var tenantId = AbpSession.GetTenantId(); + return await UsingDbContext(context => context.Tenants.SingleAsync(t => t.Id == tenantId)); + } + } +} diff --git a/aspnet-core/test/MeetingSchedule.Tests/MeetingScheduleTestModule.cs b/aspnet-core/test/MeetingSchedule.Tests/MeetingScheduleTestModule.cs new file mode 100644 index 0000000..9592388 --- /dev/null +++ b/aspnet-core/test/MeetingSchedule.Tests/MeetingScheduleTestModule.cs @@ -0,0 +1,62 @@ +using System; +using Castle.MicroKernel.Registration; +using NSubstitute; +using Abp.AutoMapper; +using Abp.Dependency; +using Abp.Modules; +using Abp.Configuration.Startup; +using Abp.Net.Mail; +using Abp.TestBase; +using Abp.Zero.Configuration; +using Abp.Zero.EntityFrameworkCore; +using MeetingSchedule.EntityFrameworkCore; +using MeetingSchedule.Tests.DependencyInjection; + +namespace MeetingSchedule.Tests +{ + [DependsOn( + typeof(MeetingScheduleApplicationModule), + typeof(MeetingScheduleEntityFrameworkModule), + typeof(AbpTestBaseModule) + )] + public class MeetingScheduleTestModule : AbpModule + { + public MeetingScheduleTestModule(MeetingScheduleEntityFrameworkModule abpProjectNameEntityFrameworkModule) + { + abpProjectNameEntityFrameworkModule.SkipDbContextRegistration = true; + abpProjectNameEntityFrameworkModule.SkipDbSeed = true; + } + + public override void PreInitialize() + { + Configuration.UnitOfWork.Timeout = TimeSpan.FromMinutes(30); + Configuration.UnitOfWork.IsTransactional = false; + + // Disable static mapper usage since it breaks unit tests (see https://github.com/aspnetboilerplate/aspnetboilerplate/issues/2052) + Configuration.Modules.AbpAutoMapper().UseStaticMapper = false; + + Configuration.BackgroundJobs.IsJobExecutionEnabled = false; + + // Use database for language management + Configuration.Modules.Zero().LanguageManagement.EnableDbLocalization(); + + RegisterFakeService>(); + + Configuration.ReplaceService(DependencyLifeStyle.Transient); + } + + public override void Initialize() + { + ServiceCollectionRegistrar.Register(IocManager); + } + + private void RegisterFakeService() where TService : class + { + IocManager.IocContainer.Register( + Component.For() + .UsingFactoryMethod(() => Substitute.For()) + .LifestyleSingleton() + ); + } + } +} diff --git a/aspnet-core/test/MeetingSchedule.Tests/MultiTenantFactAttribute.cs b/aspnet-core/test/MeetingSchedule.Tests/MultiTenantFactAttribute.cs new file mode 100644 index 0000000..79c348a --- /dev/null +++ b/aspnet-core/test/MeetingSchedule.Tests/MultiTenantFactAttribute.cs @@ -0,0 +1,15 @@ +using Xunit; + +namespace MeetingSchedule.Tests +{ + public sealed class MultiTenantFactAttribute : FactAttribute + { + public MultiTenantFactAttribute() + { + if (!MeetingScheduleConsts.MultiTenancyEnabled) + { + Skip = "MultiTenancy is disabled."; + } + } + } +} diff --git a/aspnet-core/test/MeetingSchedule.Tests/Properties/AssemblyInfo.cs b/aspnet-core/test/MeetingSchedule.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9773d21 --- /dev/null +++ b/aspnet-core/test/MeetingSchedule.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,18 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MeetingSchedule.Tests")] +[assembly: AssemblyTrademark("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("0d4c5d00-c144-4213-a007-4b8944113ab1")] diff --git a/aspnet-core/test/MeetingSchedule.Tests/Sessions/SessionAppService_Tests.cs b/aspnet-core/test/MeetingSchedule.Tests/Sessions/SessionAppService_Tests.cs new file mode 100644 index 0000000..e5eab68 --- /dev/null +++ b/aspnet-core/test/MeetingSchedule.Tests/Sessions/SessionAppService_Tests.cs @@ -0,0 +1,52 @@ +using System.Threading.Tasks; +using Shouldly; +using Xunit; +using MeetingSchedule.Sessions; + +namespace MeetingSchedule.Tests.Sessions +{ + public class SessionAppService_Tests : MeetingScheduleTestBase + { + private readonly ISessionAppService _sessionAppService; + + public SessionAppService_Tests() + { + _sessionAppService = Resolve(); + } + + [MultiTenantFact] + public async Task Should_Get_Current_User_When_Logged_In_As_Host() + { + // Arrange + LoginAsHostAdmin(); + + // Act + var output = await _sessionAppService.GetCurrentLoginInformations(); + + // Assert + var currentUser = await GetCurrentUserAsync(); + output.User.ShouldNotBe(null); + output.User.Name.ShouldBe(currentUser.Name); + output.User.Surname.ShouldBe(currentUser.Surname); + + output.Tenant.ShouldBe(null); + } + + [Fact] + public async Task Should_Get_Current_User_And_Tenant_When_Logged_In_As_Tenant() + { + // Act + var output = await _sessionAppService.GetCurrentLoginInformations(); + + // Assert + var currentUser = await GetCurrentUserAsync(); + var currentTenant = await GetCurrentTenantAsync(); + + output.User.ShouldNotBe(null); + output.User.Name.ShouldBe(currentUser.Name); + + output.Tenant.ShouldNotBe(null); + output.Tenant.Name.ShouldBe(currentTenant.Name); + } + } +} diff --git a/aspnet-core/test/MeetingSchedule.Tests/Users/UserAppService_Tests.cs b/aspnet-core/test/MeetingSchedule.Tests/Users/UserAppService_Tests.cs new file mode 100644 index 0000000..769ff0e --- /dev/null +++ b/aspnet-core/test/MeetingSchedule.Tests/Users/UserAppService_Tests.cs @@ -0,0 +1,52 @@ +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Shouldly; +using Xunit; +using Abp.Application.Services.Dto; +using MeetingSchedule.Users; +using MeetingSchedule.Users.Dto; + +namespace MeetingSchedule.Tests.Users +{ + public class UserAppService_Tests : MeetingScheduleTestBase + { + private readonly IUserAppService _userAppService; + + public UserAppService_Tests() + { + _userAppService = Resolve(); + } + + [Fact] + public async Task GetUsers_Test() + { + // Act + var output = await _userAppService.GetAllAsync(new PagedUserResultRequestDto{MaxResultCount=20, SkipCount=0} ); + + // Assert + output.Items.Count.ShouldBeGreaterThan(0); + } + + [Fact] + public async Task CreateUser_Test() + { + // Act + await _userAppService.CreateAsync( + new CreateUserDto + { + EmailAddress = "john@volosoft.com", + IsActive = true, + Name = "John", + Surname = "Nash", + Password = "123qwe", + UserName = "john.nash" + }); + + await UsingDbContextAsync(async context => + { + var johnNashUser = await context.Users.FirstOrDefaultAsync(u => u.UserName == "john.nash"); + johnNashUser.ShouldNotBeNull(); + }); + } + } +} diff --git a/aspnet-core/test/MeetingSchedule.Web.Tests/Controllers/HomeController_Tests.cs b/aspnet-core/test/MeetingSchedule.Web.Tests/Controllers/HomeController_Tests.cs new file mode 100644 index 0000000..fda2314 --- /dev/null +++ b/aspnet-core/test/MeetingSchedule.Web.Tests/Controllers/HomeController_Tests.cs @@ -0,0 +1,29 @@ +using System.Threading.Tasks; +using MeetingSchedule.Models.TokenAuth; +using MeetingSchedule.Web.Controllers; +using Shouldly; +using Xunit; + +namespace MeetingSchedule.Web.Tests.Controllers +{ + public class HomeController_Tests: MeetingScheduleWebTestBase + { + [Fact] + public async Task Index_Test() + { + await AuthenticateAsync(null, new AuthenticateModel + { + UserNameOrEmailAddress = "admin", + Password = "123qwe" + }); + + //Act + var response = await GetResponseAsStringAsync( + GetUrl(nameof(HomeController.Index)) + ); + + //Assert + response.ShouldNotBeNullOrEmpty(); + } + } +} \ No newline at end of file diff --git a/aspnet-core/test/MeetingSchedule.Web.Tests/MeetingSchedule.Web.Tests.csproj b/aspnet-core/test/MeetingSchedule.Web.Tests/MeetingSchedule.Web.Tests.csproj new file mode 100644 index 0000000..b706960 --- /dev/null +++ b/aspnet-core/test/MeetingSchedule.Web.Tests/MeetingSchedule.Web.Tests.csproj @@ -0,0 +1,30 @@ + + + 1.0.0.0 + net6.0 + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + MeetingSchedule.Web.Tests + MeetingSchedule.Web.Tests + true + false + false + false + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + \ No newline at end of file diff --git a/aspnet-core/test/MeetingSchedule.Web.Tests/MeetingScheduleWebTestBase.cs b/aspnet-core/test/MeetingSchedule.Web.Tests/MeetingScheduleWebTestBase.cs new file mode 100644 index 0000000..70c92ac --- /dev/null +++ b/aspnet-core/test/MeetingSchedule.Web.Tests/MeetingScheduleWebTestBase.cs @@ -0,0 +1,216 @@ +using System; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Threading.Tasks; +using Abp.AspNetCore.TestBase; +using Abp.Authorization.Users; +using Abp.Extensions; +using Abp.Json; +using Abp.MultiTenancy; +using Abp.Web.Models; +using MeetingSchedule.EntityFrameworkCore; +using MeetingSchedule.Models.TokenAuth; +using MeetingSchedule.Web.Startup; +using AngleSharp.Html.Dom; +using AngleSharp.Html.Parser; +using Microsoft.AspNetCore.Hosting; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using Shouldly; + +namespace MeetingSchedule.Web.Tests +{ + public abstract class MeetingScheduleWebTestBase : AbpAspNetCoreIntegratedTestBase + { + protected static readonly Lazy ContentRootFolder; + + static MeetingScheduleWebTestBase() + { + ContentRootFolder = new Lazy(WebContentDirectoryFinder.CalculateContentRootFolder, true); + } + + protected override IWebHostBuilder CreateWebHostBuilder() + { + return base + .CreateWebHostBuilder() + .UseContentRoot(ContentRootFolder.Value) + .UseSetting(WebHostDefaults.ApplicationKey, typeof(MeetingScheduleWebMvcModule).Assembly.FullName); + } + + #region Get response + + protected async Task GetResponseAsObjectAsync(string url, + HttpStatusCode expectedStatusCode = HttpStatusCode.OK) + { + var strResponse = await GetResponseAsStringAsync(url, expectedStatusCode); + return JsonConvert.DeserializeObject(strResponse, new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver() + }); + } + + protected async Task GetResponseAsStringAsync(string url, + HttpStatusCode expectedStatusCode = HttpStatusCode.OK) + { + var response = await GetResponseAsync(url, expectedStatusCode); + return await response.Content.ReadAsStringAsync(); + } + + protected async Task GetResponseAsync(string url, + HttpStatusCode expectedStatusCode = HttpStatusCode.OK) + { + var response = await Client.GetAsync(url); + response.StatusCode.ShouldBe(expectedStatusCode); + return response; + } + + #endregion + + #region Authenticate + + /// + /// /api/TokenAuth/Authenticate + /// TokenAuthController + /// + /// + /// + /// + protected async Task AuthenticateAsync(string tenancyName, AuthenticateModel input) + { + if (tenancyName.IsNullOrWhiteSpace()) + { + var tenant = UsingDbContext(context => context.Tenants.FirstOrDefault(t => t.TenancyName == tenancyName)); + if (tenant != null) + { + AbpSession.TenantId = tenant.Id; + Client.DefaultRequestHeaders.Add("Abp.TenantId", tenant.Id.ToString()); //Set TenantId + } + } + + var response = await Client.PostAsync("/api/TokenAuth/Authenticate", + new StringContent(input.ToJsonString(), Encoding.UTF8, "application/json")); + response.StatusCode.ShouldBe(HttpStatusCode.OK); + var result = + JsonConvert.DeserializeObject>( + await response.Content.ReadAsStringAsync()); + Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.Result.AccessToken); + + AbpSession.UserId = result.Result.UserId; + } + + #endregion + + #region Login + + protected void LoginAsHostAdmin() + { + LoginAsHost(AbpUserBase.AdminUserName); + } + + protected void LoginAsDefaultTenantAdmin() + { + LoginAsTenant(AbpTenantBase.DefaultTenantName, AbpUserBase.AdminUserName); + } + + protected void LoginAsHost(string userName) + { + AbpSession.TenantId = null; + + var user = + UsingDbContext( + context => + context.Users.FirstOrDefault(u => u.TenantId == AbpSession.TenantId && u.UserName == userName)); + if (user == null) + { + throw new Exception("There is no user: " + userName + " for host."); + } + + AbpSession.UserId = user.Id; + } + + protected void LoginAsTenant(string tenancyName, string userName) + { + var tenant = UsingDbContext(context => context.Tenants.FirstOrDefault(t => t.TenancyName == tenancyName)); + if (tenant == null) + { + throw new Exception("There is no tenant: " + tenancyName); + } + + AbpSession.TenantId = tenant.Id; + + var user = + UsingDbContext( + context => + context.Users.FirstOrDefault(u => u.TenantId == AbpSession.TenantId && u.UserName == userName)); + if (user == null) + { + throw new Exception("There is no user: " + userName + " for tenant: " + tenancyName); + } + + AbpSession.UserId = user.Id; + } + + #endregion + + + #region UsingDbContext + + protected void UsingDbContext(Action action) + { + using (var context = IocManager.Resolve()) + { + action(context); + context.SaveChanges(); + } + } + + protected T UsingDbContext(Func func) + { + T result; + + using (var context = IocManager.Resolve()) + { + result = func(context); + context.SaveChanges(); + } + + return result; + } + + protected async Task UsingDbContextAsync(Func action) + { + using (var context = IocManager.Resolve()) + { + await action(context); + await context.SaveChangesAsync(true); + } + } + + protected async Task UsingDbContextAsync(Func> func) + { + T result; + + using (var context = IocManager.Resolve()) + { + result = await func(context); + await context.SaveChangesAsync(true); + } + + return result; + } + + #endregion + + #region ParseHtml + + protected IHtmlDocument ParseHtml(string htmlString) + { + return new HtmlParser().ParseDocument(htmlString); + } + + #endregion + } +} \ No newline at end of file diff --git a/aspnet-core/test/MeetingSchedule.Web.Tests/MeetingScheduleWebTestModule.cs b/aspnet-core/test/MeetingSchedule.Web.Tests/MeetingScheduleWebTestModule.cs new file mode 100644 index 0000000..eea0fc0 --- /dev/null +++ b/aspnet-core/test/MeetingSchedule.Web.Tests/MeetingScheduleWebTestModule.cs @@ -0,0 +1,38 @@ +using Abp.AspNetCore; +using Abp.AspNetCore.TestBase; +using Abp.Modules; +using Abp.Reflection.Extensions; +using MeetingSchedule.EntityFrameworkCore; +using MeetingSchedule.Web.Startup; +using Microsoft.AspNetCore.Mvc.ApplicationParts; + +namespace MeetingSchedule.Web.Tests +{ + [DependsOn( + typeof(MeetingScheduleWebMvcModule), + typeof(AbpAspNetCoreTestBaseModule) + )] + public class MeetingScheduleWebTestModule : AbpModule + { + public MeetingScheduleWebTestModule(MeetingScheduleEntityFrameworkModule abpProjectNameEntityFrameworkModule) + { + abpProjectNameEntityFrameworkModule.SkipDbContextRegistration = true; + } + + public override void PreInitialize() + { + Configuration.UnitOfWork.IsTransactional = false; //EF Core InMemory DB does not support transactions. + } + + public override void Initialize() + { + IocManager.RegisterAssemblyByConvention(typeof(MeetingScheduleWebTestModule).GetAssembly()); + } + + public override void PostInitialize() + { + IocManager.Resolve() + .AddApplicationPartsIfNotAddedBefore(typeof(MeetingScheduleWebMvcModule).Assembly); + } + } +} \ No newline at end of file diff --git a/aspnet-core/test/MeetingSchedule.Web.Tests/Startup.cs b/aspnet-core/test/MeetingSchedule.Web.Tests/Startup.cs new file mode 100644 index 0000000..eb5a01a --- /dev/null +++ b/aspnet-core/test/MeetingSchedule.Web.Tests/Startup.cs @@ -0,0 +1,86 @@ +using System; +using Abp.AspNetCore; +using Abp.AspNetCore.TestBase; +using Abp.Dependency; +using MeetingSchedule.Authentication.JwtBearer; +using MeetingSchedule.Configuration; +using MeetingSchedule.EntityFrameworkCore; +using MeetingSchedule.Identity; +using MeetingSchedule.Web.Resources; +using MeetingSchedule.Web.Startup; +using Castle.MicroKernel.Registration; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace MeetingSchedule.Web.Tests +{ + public class Startup + { + private readonly IConfigurationRoot _appConfiguration; + + public Startup(IWebHostEnvironment env) + { + _appConfiguration = env.GetAppConfiguration(); + } + + public IServiceProvider ConfigureServices(IServiceCollection services) + { + services.AddEntityFrameworkInMemoryDatabase(); + + services.AddMvc(); + + IdentityRegistrar.Register(services); + AuthConfigurer.Configure(services, _appConfiguration); + + services.AddScoped(); + + //Configure Abp and Dependency Injection + return services.AddAbp(options => + { + options.SetupTest(); + }); + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) + { + UseInMemoryDb(app.ApplicationServices); + + app.UseAbp(); //Initializes ABP framework. + + app.UseExceptionHandler("/Error"); + + app.UseStaticFiles(); + app.UseRouting(); + + app.UseAuthentication(); + + app.UseJwtTokenMiddleware(); + + app.UseAuthorization(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}"); + }); + } + + private void UseInMemoryDb(IServiceProvider serviceProvider) + { + var builder = new DbContextOptionsBuilder(); + builder.UseInMemoryDatabase(Guid.NewGuid().ToString()).UseInternalServiceProvider(serviceProvider); + var options = builder.Options; + + var iocManager = serviceProvider.GetRequiredService(); + iocManager.IocContainer + .Register( + Component.For>() + .Instance(options) + .LifestyleSingleton() + ); + } + } +} \ No newline at end of file diff --git a/rename.ps1 b/rename.ps1 new file mode 100644 index 0000000..0fc7926 --- /dev/null +++ b/rename.ps1 @@ -0,0 +1,81 @@ +# set output encoding +$OutputEncoding = [Text.UTF8Encoding]::UTF8 + +# company name placeholder +$oldCompanyName="AbpCompanyName" +# your company name +$newCompanyName="YourCompanyName" + +# project name placeholder +$oldProjectName="MeetingSchedule" +# your project name +$newProjectName="YourProjectName" + +# file type +$fileType="FileInfo" + +# directory type +$dirType="DirectoryInfo" + +# copy +Write-Host 'Start copy folders...' +$newRoot=$newCompanyName+"."+$newProjectName +mkdir $newRoot +Copy-Item -Recurse .\aspnet-core\ .\$newRoot\ +Copy-Item -Recurse .\vue\ .\$newRoot\ +Copy-Item .gitignore .\$newRoot\ +Copy-Item LICENSE .\$newRoot\ +Copy-Item README.md .\$newRoot\ + +# folders to deal with +$slnFolder = (Get-Item -Path "./$newRoot/aspnet-core/" -Verbose).FullName +$vueFolder = (Get-Item -Path "./$newRoot/vue/" -Verbose).FullName + +function Rename { + param ( + $TargetFolder, + $PlaceHolderCompanyName, + $PlaceHolderProjectName, + $NewCompanyName, + $NewProjectName + ) + # file extensions to deal with + $include=@("*.cs","*.cshtml","*.asax","*.ps1","*.ts","*.csproj","*.sln","*.xaml","*.json","*.js","*.xml","*.config","Dockerfile") + + $elapsed = [System.Diagnostics.Stopwatch]::StartNew() + + Write-Host "[$TargetFolder]Start rename folder..." + # rename folder + Ls $TargetFolder -Recurse | Where { $_.GetType().Name -eq $dirType -and ($_.Name.Contains($PlaceHolderCompanyName) -or $_.Name.Contains($PlaceHolderProjectName)) } | ForEach-Object{ + Write-Host 'directory ' $_.FullName + $newDirectoryName=$_.Name.Replace($PlaceHolderCompanyName,$NewCompanyName).Replace($PlaceHolderProjectName,$NewProjectName) + Rename-Item $_.FullName $newDirectoryName + } + Write-Host "[$TargetFolder]End rename folder." + Write-Host '-------------------------------------------------------------' + + + # replace file content and rename file name + Write-Host "[$TargetFolder]Start replace file content and rename file name..." + Ls $TargetFolder -Include $include -Recurse | Where { $_.GetType().Name -eq $fileType} | ForEach-Object{ + $fileText = Get-Content $_ -Raw -Encoding UTF8 + if($fileText.Length -gt 0 -and ($fileText.contains($PlaceHolderCompanyName) -or $fileText.contains($PlaceHolderProjectName))){ + $fileText.Replace($PlaceHolderCompanyName,$NewCompanyName).Replace($PlaceHolderProjectName,$NewProjectName) | Set-Content $_ -Encoding UTF8 + Write-Host 'file(change text) ' $_.FullName + } + If($_.Name.contains($PlaceHolderCompanyName) -or $_.Name.contains($PlaceHolderProjectName)){ + $newFileName=$_.Name.Replace($PlaceHolderCompanyName,$NewCompanyName).Replace($PlaceHolderProjectName,$NewProjectName) + Rename-Item $_.FullName $newFileName + Write-Host 'file(change name) ' $_.FullName + } + } + Write-Host "[$TargetFolder]End replace file content and rename file name." + Write-Host '-------------------------------------------------------------' + + $elapsed.stop() + write-host "[$TargetFolder]Total Time Cost: $($elapsed.Elapsed.ToString())" +} + +Rename -TargetFolder $slnFolder -PlaceHolderCompanyName $oldCompanyName -PlaceHolderProjectName $oldProjectName -NewCompanyName $newCompanyName -NewProjectName $newProjectName +Rename -TargetFolder $vueFolder -PlaceHolderCompanyName $oldCompanyName -PlaceHolderProjectName $oldProjectName -NewCompanyName $newCompanyName -NewProjectName $newProjectName +