From 1bb980f070f76bcb4db4d4f765d650dca9e25fc1 Mon Sep 17 00:00:00 2001 From: Thom Lamb Date: Tue, 23 Jun 2026 11:18:54 -0500 Subject: [PATCH] feat: initial commit --- .dockerignore | 10 + .gitignore | 303 +- Dockerfile.api | 114 + Dockerfile.dashboard | 55 + Dockerfile.hangfire | 56 + Dockerfile.web | 25 + README.md | 60 +- Strata.Analytics.sln | 69 + Strata.Analytics.sln.DotSettings | 3 + cypress/cypress.env.json | 10 + cypress/cypress.json | 45 + cypress/cypress/cypress.development.json | 13 + cypress/cypress/cypress.local.json | 13 + .../advanceAnalyticsDataMartSecurityTests.ts | 42 + .../advanceAnalyticsDataSourceSmokeTests.ts | 87 + .../advanceAnalyticsExtractTests.ts | 111 + .../advanceAnalyticsFilterTests.ts | 433 + .../advanceAnalyticsSearchTests.ts | 42 + .../integration/advanceAnalyticsSmokeTests.ts | 68 + .../advanceAnalyticsWidgetTests.ts | 463 + .../advanceAnalyticsWorkbookSecurityTests.ts | 82 + .../advanceAnalyticsWorkbookTests.ts | 31 + .../advancedAnalyticsDataSourcePageObject.ts | 89 + .../advancedAnalyticsExtractPageObject.ts | 100 + .../advancedAnalyticsPageObject.ts | 511 + cypress/cypress/plugins/index.ts | 43 + cypress/cypress/support/IUserData.ts | 6 + cypress/cypress/support/commands.ts | 401 + cypress/cypress/support/index.ts | 29 + cypress/cypress/tsconfig.json | 22 + cypress/package-lock.json | 9229 ++++ cypress/package.json | 45 + docker-compose.yml | 47 + loadTest/docker/Dockerfile | 10 + loadTest/docker/Dockerfile.grafana | 19 + loadTest/docker/Dockerfile.influxdb | 6 + .../docker/dashboards/grafana-dashboard.yaml | 8 + .../docker/dashboards/grafana-datasource.yaml | 9 + loadTest/docker/dashboards/http.json | 1607 + loadTest/docker/dashboards/ws.json | 5175 ++ loadTest/docker/docker-compose.yml | 45 + .../grafana/alerting/1/__default__.tmpl | 53 + loadTest/docker/grafana/grafana.db | Bin 0 -> 3883008 bytes .../grafana/plugins/datadog/.gitattributes | 3 + .../docker/grafana/plugins/datadog/.gitignore | 1 + .../docker/grafana/plugins/datadog/.jscs.json | 14 + .../docker/grafana/plugins/datadog/.jshintrc | 42 + .../grafana/plugins/datadog/.travis.yml | 4 + .../grafana/plugins/datadog/Gruntfile.js | 144 + .../docker/grafana/plugins/datadog/LICENSE | 21 + .../docker/grafana/plugins/datadog/README.md | 30 + .../grafana/plugins/datadog/dist/README.md | 30 + .../plugins/datadog/dist/add_datadog_func.js | 116 + .../datadog/dist/add_datadog_func.js.map | 1 + .../plugins/datadog/dist/datasource.js | 433 + .../plugins/datadog/dist/datasource.js.map | 1 + .../grafana/plugins/datadog/dist/dfunc.js | 293 + .../grafana/plugins/datadog/dist/dfunc.js.map | 1 + .../plugins/datadog/dist/func_editor.js | 251 + .../plugins/datadog/dist/func_editor.js.map | 1 + .../plugins/datadog/dist/img/datadog.png | Bin 0 -> 1550 bytes .../grafana/plugins/datadog/dist/module.js | 51 + .../plugins/datadog/dist/module.js.map | 1 + .../dist/partials/annotations.editor.html | 29 + .../plugins/datadog/dist/partials/config.html | 35 + .../datadog/dist/partials/query.editor.html | 72 + .../datadog/dist/partials/query.options.html | 2 + .../grafana/plugins/datadog/dist/plugin.json | 34 + .../plugins/datadog/dist/query_builder.js | 85 + .../plugins/datadog/dist/query_builder.js.map | 1 + .../plugins/datadog/dist/query_ctrl.js | 264 + .../plugins/datadog/dist/query_ctrl.js.map | 1 + .../plugins/datadog/dist/showdown.min.js | 5 + .../datadog/dist/test/add_datadog_func.js | 115 + .../datadog/dist/test/add_datadog_func.js.map | 1 + .../plugins/datadog/dist/test/datasource.js | 422 + .../datadog/dist/test/datasource.js.map | 1 + .../plugins/datadog/dist/test/dfunc.js | 295 + .../plugins/datadog/dist/test/dfunc.js.map | 1 + .../plugins/datadog/dist/test/func_editor.js | 247 + .../datadog/dist/test/func_editor.js.map | 1 + .../plugins/datadog/dist/test/module.js | 37 + .../plugins/datadog/dist/test/module.js.map | 1 + .../datadog/dist/test/query_builder.js | 84 + .../datadog/dist/test/query_builder.js.map | 1 + .../plugins/datadog/dist/test/query_ctrl.js | 230 + .../datadog/dist/test/query_ctrl.js.map | 1 + .../plugins/datadog/dist/test/showdown.min.js | 5 + .../datadog/dist/test/spec/datasource_spec.js | 79 + .../dist/test/spec/datasource_spec.js.map | 1 + .../datadog/dist/test/spec/dfunc_spec.js | 84 + .../datadog/dist/test/spec/dfunc_spec.js.map | 1 + .../datadog/dist/test/spec/query_ctrl_soon.js | 194 + .../dist/test/spec/query_ctrl_soon.js.map | 1 + .../datadog/dist/test/spec/test-main.js | 64 + .../datadog/dist/test/spec/test-main.js.map | 1 + .../plugins/datadog/docker-compose.yml | 7 + .../grafana/plugins/datadog/package.json | 49 + .../plugins/datadog/spec/datasource_spec.js | 66 + .../plugins/datadog/spec/dfunc_spec.js | 79 + .../plugins/datadog/spec/query_ctrl_soon.js | 184 + .../grafana/plugins/datadog/spec/test-main.js | 50 + .../plugins/datadog/src/add_datadog_func.js | 103 + .../grafana/plugins/datadog/src/datasource.js | 374 + .../grafana/plugins/datadog/src/dfunc.js | 316 + .../plugins/datadog/src/func_editor.js | 243 + .../plugins/datadog/src/img/datadog.png | Bin 0 -> 1550 bytes .../grafana/plugins/datadog/src/module.js | 19 + .../src/partials/annotations.editor.html | 29 + .../plugins/datadog/src/partials/config.html | 35 + .../datadog/src/partials/query.editor.html | 72 + .../datadog/src/partials/query.options.html | 2 + .../grafana/plugins/datadog/src/plugin.json | 34 + .../plugins/datadog/src/query_builder.js | 65 + .../grafana/plugins/datadog/src/query_ctrl.js | 185 + .../plugins/datadog/vendor/showdown.min.js | 5 + loadTest/docker/results/.gitkeep | 0 .../docker/testRunner/runBestPractice.ps1 | 1 + loadTest/docker/testRunner/runDummyTest.sh | 1 + loadTest/docker/testRunner/runTests.sh | 1 + loadTest/docker/testRunner/runTestsBU.sh | 1 + .../docker/testRunner/scripts/dummyTest.mjs | 7 + .../docker/testRunner/scripts/runTests.js | 92 + loadTest/docker/testRunner/scripts/utils.js | 67 + .../BestPracticeWorkbook.mjs | 66 + .../CasesByServiceLineAndCM.json | 188 + .../GrossRevenueByServiceLine.json | 303 + .../BestPracticeWorkbook/OrthopedicCosts.json | 141 + .../OverviewDashboard/CasesByServiceLine.json | 62 + .../ChargesByServiceLine.json | 114 + .../FixedDirectCostByYear.json | 88 + .../ServiceLineActualVsExpected.json | 79 + .../OverviewDashboard/YOYCM.json | 131 + .../OverviewDashboard/YOYNetRevenue.json | 125 + .../OverviewDashboard/YOYTotalCosts.json | 125 + .../PatientTypeValidation.json | 107 + .../BestPracticeWorkbook/ServiceLineYOY.json | 329 + .../BestPracticeWorkbook/YOYPatientType.json | 329 + .../docker/testRunner/tests/PivotERN.json | 1 + nuget.config | 10 + sonarsuppressions.xml | 151 + .../Authorization/AuthorizationOptions.cs | 9 + .../AuthorizedDbMinimumRoleHandler.cs | 38 + .../AuthorizedDbMinimumRoleRequirement.cs | 8 + .../CustomSQLStrataOnlyRoleHandler.cs | 52 + .../DataSourceMinimumRoleHandler.cs | 92 + .../DataSourceMinimumRoleRequirement.cs | 16 + ...tractCustomSQLStrataOnlyRoleRequirement.cs | 10 + .../ExtractMinimumRoleHandler.cs | 47 + .../ExtractMinimumRoleRequirement.cs | 16 + .../Authorization/Policies.cs | 16 + .../WorkbookMinimumRoleHandler.cs | 42 + .../WorkbookMinimumRoleRequirement.cs | 16 + .../Controllers/ContentMigrationController.cs | 122 + .../Controllers/DataSourcesController.cs | 241 + .../Controllers/DatabasesController.cs | 27 + .../Controllers/EncountersController.cs | 32 + .../Controllers/ExtractsController.cs | 236 + .../Controllers/FeatureContoller.cs | 31 + .../Controllers/SavedFiltersController.cs | 55 + .../StandardDataSourcesController.cs | 279 + .../Controllers/UserGroupsController.cs | 31 + .../Controllers/UsersController.cs | 29 + .../Controllers/WorkbooksController.cs | 109 + .../Models/EncounterInfo.cs | 7 + .../Models/PublicationEvent.cs | 13 + .../Models/PublishConfig.cs | 10 + src/Strata.Analytics.Api/Program.cs | 71 + .../Properties/launchSettings.json | 16 + src/Strata.Analytics.Api/Startup.cs | 139 + .../Strata.Analytics.Api.csproj | 35 + .../appsettings.Development.json | 30 + src/Strata.Analytics.Api/appsettings.json | 17 + .../AnalyticsServiceCollectionExtensions.cs | 185 + .../ContentMigrationAutoMapperProfile.cs | 15 + .../Helpers/ContentMigrationHelpers.cs | 203 + .../Models/AdhocMigrationResult.cs | 14 + .../Calculations/AggregateCalculation.cs | 53 + .../Models/Calculations/CalculationBase.cs | 102 + .../ColumnArithmeticCalculation.cs | 46 + .../Calculations/ColumnDivisionCalculation.cs | 51 + .../Calculations/ColumnVarianceCalculation.cs | 68 + .../Models/Calculations/DataColumnInfo.cs | 10 + .../Models/Calculations/LegacyCalculation.cs | 31 + .../Models/Calculations/MeasureInfo.cs | 28 + .../Calculations/PercentOfTotalCalculation.cs | 46 + .../ContentMigration/Models/DataMapping.cs | 14 + .../Models/DateFilterValue.cs | 31 + .../Models/DsCubeSearchParameterValue.cs | 36 + .../Models/ExtractMigrationResult.cs | 13 + .../Models/ISearchCondition.cs | 52 + .../ContentMigration/Models/LegacyRow.cs | 24 + .../ContentMigration/Models/LegacyValue.cs | 17 + .../ContentMigration/Models/Migration.cs | 8 + .../MigrationPlan/CalculationMapping.cs | 27 + .../MigrationPlan/ColumnGroupMapping.cs | 21 + .../Models/MigrationPlan/Mapping.cs | 37 + .../Models/MigrationPlan/Plan.cs | 17 + .../Models/MigrationResult.cs | 18 + .../Models/ReDsCubeReportParameter.cs | 22 + .../ContentMigration/Models/ReReport.cs | 17 + .../Models/ReReportDisplay.cs | 14 + .../Services/ContentMigrationService.cs | 474 + .../Services/DataMappingService.cs | 115 + .../Services/IContentMigrationService.cs | 23 + .../Services/IDataMappingService.cs | 21 + .../DataQuery/DataQueryService.cs | 78 + .../DataQuery/IDataQueryService.cs | 21 + .../DataSourceAutoMapperProfile.cs | 14 + .../DataSources/Models/DataSource.cs | 32 + .../DataSources/Models/DataSourceRole.cs | 21 + .../Models/DataSourceRoleAssignment.cs | 30 + .../DataSourceRoleAssignmentSaveInfo.cs | 24 + .../DataSources/Models/DataSourceSaveInfo.cs | 19 + .../DataSources/Models/DataSourceTable.cs | 11 + .../DataSources/Services/DataSourceService.cs | 305 + .../Services/IDataSourceService.cs | 31 + src/Strata.Analytics.Biz/Database/Database.cs | 17 + .../Database/DatabaseService.cs | 51 + .../Database/IDatabaseService.cs | 13 + .../DbContexts/AnalyticsDbContext.cs | 156 + .../Factories/AnalyticsDbContextFactory.cs | 19 + .../DbContexts/Jazz/JazzDbContext.cs | 27 + .../DbContexts/Jazz/JazzDbExtensions.cs | 139 + .../Snowflake/ISnowflakeDatabaseContext.cs | 13 + .../ISnowflakeDatabaseContextFactory.cs | 7 + .../Snowflake/ISnowflakeQueryService.cs | 10 + .../Snowflake/SnowflakeDatabaseContext.cs | 59 + .../SnowflakeDatabaseContextFactory.cs | 18 + .../Snowflake/SnowflakeQueryService.cs | 33 + .../Encounters/EncounterService.cs | 27 + .../Encounters/IEncounterService.cs | 10 + .../Export/Models/ExportColumnFormat.cs | 82 + .../Export/Models/ExportColumnOptions.cs | 12 + .../Export/Models/ExportDataSheetRequest.cs | 19 + .../Export/Models/ExportFileType.cs | 8 + .../Export/Services/CsvService.cs | 64 + .../Export/Services/ExcelService.cs | 69 + .../Export/Services/ExportService.cs | 39 + .../Export/Services/ICsvService.cs | 15 + .../Export/Services/IExcelService.cs | 14 + .../Export/Services/IExportService.cs | 12 + .../Export/Utils/ExcelPackageExtensions.cs | 49 + .../Export/Utils/ExportDataUtills.cs | 37 + .../ConcurrentExtractExportException.cs | 11 + .../Extracts/Export/ExportRouterHelper.cs | 26 + .../Extracts/Export/ExtractSqlHelper.cs | 52 + .../Extracts/Export/IS3BucketService.cs | 21 + .../Extracts/Export/ISftpService.cs | 16 + .../Export/MissingExtractException.cs | 11 + .../Extracts/Export/S3BucketService.cs | 152 + .../Extracts/Export/SftpService.cs | 250 + .../Extracts/Export/SftpSettings.cs | 11 + .../Extracts/ExtractAutoMapperProfile.cs | 17 + .../Extracts/ExtractConfiguration.cs | 12 + .../Extracts/Jobs/ExtractExportJob.cs | 344 + .../Extracts/Jobs/ExtractScheduleLoader.cs | 46 + .../Extracts/Jobs/IExtractExportJob.cs | 17 + .../Extracts/Jobs/IExtractScheduleLoader.cs | 15 + .../Extracts/Models/ExportExtractRequest.cs | 25 + .../Extracts/Models/ExportFileInfo.cs | 12 + .../Extracts/Models/ExportRoute.cs | 14 + .../Extracts/Models/ExportRouteConfig.cs | 16 + .../Extracts/Models/ExternalStageUrlTokens.cs | 8 + .../Extracts/Models/Extract.cs | 54 + .../Models/ExtractContent/ExtractConfig.cs | 26 + .../Extracts/Models/ExtractCreateInfo.cs | 16 + .../Extracts/Models/ExtractExportHistory.cs | 41 + .../Models/ExtractExportHistorySaveInfo.cs | 29 + .../Extracts/Models/ExtractExportStatus.cs | 12 + .../Extracts/Models/ExtractQueryConfig.cs | 12 + .../Extracts/Models/ExtractRole.cs | 13 + .../Extracts/Models/ExtractRoleAssignment.cs | 28 + .../Models/ExtractRoleAssignmentSaveInfo.cs | 22 + .../Extracts/Models/ExtractSaveInfo.cs | 24 + .../Extracts/Models/ExtractSchedule.cs | 39 + .../Models/ExtractScheduleSaveInfo.cs | 25 + .../Extracts/Models/ExtractSqlRequest.cs | 13 + .../Extracts/Models/ExtractType.cs | 8 + .../Extracts/Models/OutboundFileInfo.cs | 10 + .../Extracts/Models/ScheduleRepeaterType.cs | 8 + .../Services/ExtractExportHistoryService.cs | 107 + .../Services/ExtractScheduleService.cs | 184 + .../Extracts/Services/ExtractService.cs | 224 + .../Services/IExtractExportHistoryService.cs | 25 + .../Services/IExtractScheduleService.cs | 32 + .../Extracts/Services/IExtractService.cs | 32 + .../Hangfire/CaptureJobParameterAttribute.cs | 120 + .../Hangfire/DeleteOnSuccessAttribute.cs | 16 + .../Hangfire/IRecurringJobService.cs | 17 + .../Hangfire/RecurringJobBootstrapper.cs | 76 + .../Hangfire/RecurringJobService.cs | 59 + .../20221111202405_InitialCreate.Designer.cs | 67 + .../20221111202405_InitialCreate.cs | 37 + .../20221111210026_DataColumn.Designer.cs | 127 + .../Migrations/20221111210026_DataColumn.cs | 50 + .../20221111231015_DataMart.Designer.cs | 273 + .../Migrations/20221111231015_DataMart.cs | 80 + .../20221112014754_DataMartTable.Designer.cs | 273 + .../20221112014754_DataMartTable.cs | 75 + ...221114194528_DataColumn_Modify.Designer.cs | 277 + .../20221114194528_DataColumn_Modify.cs | 36 + ...0911_DataColumn_Drop_SqlSchema.Designer.cs | 273 + ...0221114200911_DataColumn_Drop_SqlSchema.cs | 25 + ...115141133_DataMartTable_Modify.Designer.cs | 233 + .../20221115141133_DataMartTable_Modify.cs | 122 + ...rtTable_Add_WorkbookUsageCount.Designer.cs | 237 + ...08_DataMartTable_Add_WorkbookUsageCount.cs | 26 + .../20221115210142_Workbook_Add.Designer.cs | 343 + .../Migrations/20221115210142_Workbook_Add.cs | 71 + ...418_Workbook_DefaultDataMartId.Designer.cs | 347 + ...221116142418_Workbook_DefaultDataMartId.cs | 26 + ...221117140430_Worksheet_Content.Designer.cs | 352 + .../20221117140430_Worksheet_Content.cs | 26 + ...21117212537_DataTable_SqlAlias.Designer.cs | 356 + .../20221117212537_DataTable_SqlAlias.cs | 25 + ...6224218_DataColumn_Calculation.Designer.cs | 364 + .../20221216224218_DataColumn_Calculation.cs | 35 + ...2157_DataColumn_Add_PrimaryKey.Designer.cs | 368 + ...0221227152157_DataColumn_Add_PrimaryKey.cs | 26 + ...45_DataColumn_Add_NumberFormat.Designer.cs | 372 + ...21228023445_DataColumn_Add_NumberFormat.cs | 26 + ...DataColumn_Update_NumberFormat.Designer.cs | 372 + ...28024630_DataColumn_Update_NumberFormat.cs | 25 + ...230123142622_DataSchema_Remove.Designer.cs | 248 + .../20230123142622_DataSchema_Remove.cs | 76 + ...taMartRoleAssignment_Add_Table.Designer.cs | 286 + ...143756_DataMartRoleAssignment_Add_Table.cs | 40 + ...oleAssignment_Add_IdentityType.Designer.cs | 290 + ...DataMartRoleAssignment_Add_IdentityType.cs | 26 + ...181120_WorkbookRoleAssignments.Designer.cs | 332 + .../20230206181120_WorkbookRoleAssignments.cs | 41 + ...08221322_AddWorksheetSortOrder.Designer.cs | 336 + .../20230208221322_AddWorksheetSortOrder.cs | 26 + ...5048_AddDataMartTemplatesTable.Designer.cs | 338 + ...0230209065048_AddDataMartTemplatesTable.cs | 66 + ...51224_AddWorksheetUpdateFields.Designer.cs | 392 + ...20230217151224_AddWorksheetUpdateFields.cs | 38 + ...230309150722_Extracts_AddTable.Designer.cs | 443 + .../20230309150722_Extracts_AddTable.cs | 41 + ...20230316194409_AddExtractRoles.Designer.cs | 485 + .../20230316194409_AddExtractRoles.cs | 41 + ...170305_AddExtractExportHistory.Designer.cs | 532 + .../20230321170305_AddExtractExportHistory.cs | 55 + ...0323172256_ExtractDateDefaults.Designer.cs | 536 + .../20230323172256_ExtractDateDefaults.cs | 52 + ...4152623_Extract_AddLastRunCols.Designer.cs | 544 + .../20230324152623_Extract_AddLastRunCols.cs | 36 + ...211147_ExportHistory_AddStatus.Designer.cs | 548 + .../20230324211147_ExportHistory_AddStatus.cs | 45 + ...RemoveUnnecessaryExtractFields.Designer.cs | 520 + ...29190846_RemoveUnnecessaryExtractFields.cs | 58 + ...330195524_AddExtract_DataModel.Designer.cs | 524 + .../20230330195524_AddExtract_DataModel.cs | 25 + ...30403194847_AddOutboundFileSql.Designer.cs | 566 + .../20230403194847_AddOutboundFileSql.cs | 25 + ...teExtract_DataModel_To_Content.Designer.cs | 566 + ...0925_UpdateExtract_DataModel_To_Content.cs | 25 + ...141349_SavedFilter_CreateTable.Designer.cs | 603 + .../20230417141349_SavedFilter_CreateTable.cs | 37 + ...30418190430_AddExtractSchedule.Designer.cs | 645 + .../20230418190430_AddExtractSchedule.cs | 55 + ...ExtractSchedules-date-datatype.Designer.cs | 682 + ...09173427_ExtractSchedules-date-datatype.cs | 61 + ...184201_ExtractHistory-AddJobId.Designer.cs | 686 + .../20230510184201_ExtractHistory-AddJobId.cs | 25 + ...30601190111_RenameMartToSource.Designer.cs | 686 + .../20230601190111_RenameMartToSource.cs | 183 + ...13234901_AddStandardDataSource.Designer.cs | 741 + .../20230613234901_AddStandardDataSource.cs | 131 + ..._AddStandardDataRoleAssignment.Designer.cs | 775 + ...620154838_AddStandardDataRoleAssignment.cs | 39 + ...20205158_RenameTableLinkColumn.Designer.cs | 741 + .../20230620205158_RenameTableLinkColumn.cs | 25 + ...andardDataSourcePublishSupport.Designer.cs | 818 + ...110_AddStandardDataSourcePublishSupport.cs | 57 + ...629152028_StandardDataMappings.Designer.cs | 717 + .../20230629152028_StandardDataMappings.cs | 35 + ...PublicationCorrelationAsString.Designer.cs | 818 + ...ataSourcePublicationCorrelationAsString.cs | 34 + ...20230710172648_CascadeDeletion.Designer.cs | 819 + .../20230710172648_CascadeDeletion.cs | 38 + .../AnalyticsDbContextModelSnapshot.cs | 848 + .../Jobs/IPublishStandardDataSourcesJob.cs | 11 + ...PublishStandardDataSourcesAllClientsJob.cs | 38 + .../Jobs/PublishStandardDataSourcesJob.cs | 156 + .../Models/StandardDataSource.cs | 25 + .../Models/StandardDataSourcePublication.cs | 18 + .../StandardDataSourceRoleAssignment.cs | 30 + ...tandardDataSourceRoleAssignmentSaveInfo.cs | 25 + .../Models/StandardDataSourceSaveInfo.cs | 17 + .../Models/StandardDataSourceTable.cs | 12 + .../IStandardDataSourcePublishService.cs | 14 + .../Services/IStandardDataSourceService.cs | 22 + .../StandardDataSourcePublishService.cs | 36 + .../Services/StandardDataSourceService.cs | 245 + .../StandardDataSourceAutoMapperProfile.cs | 14 + .../Strata.Analytics.Biz.csproj | 45 + .../SystemSettings/ISystemSettingService.cs | 13 + .../SystemSettings/SystemSettingService.cs | 29 + .../Utils/DataContractUtils.cs | 20 + .../Utils/DateTimeJsonConverters.cs | 37 + .../Utils/DictionaryExtensions.cs | 15 + .../Utils/LinqExtensions.cs | 11 + .../Utils/SchedulerExtensions.cs | 50 + .../Utils/StreamExtensions.cs | 88 + .../Utils/StringExtensions.cs | 18 + .../Workbooks/Services/ISavedFilterService.cs | 13 + .../Workbooks/Services/IWorkbookService.cs | 85 + .../Workbooks/Services/SavedFilterService.cs | 56 + .../Workbooks/Services/WorkbookService.cs | 257 + .../Workbooks/WorkbookAutoMapperProfile.cs | 16 + .../AnalyticsService.cs | 47 + .../AnalyticsServiceCollectionExtensions.cs | 37 + .../IAnalyticsService.cs | 15 + .../Strata.Analytics.Client.csproj | 16 + .../Program.cs | 24 + .../Properties/launchSettings.json | 14 + .../Startup.cs | 46 + ...Strata.Analytics.Hangfire.Dashboard.csproj | 17 + .../appsettings.Development.json | 15 + .../appsettings.json | 15 + src/Strata.Analytics.Hangfire/Program.cs | 53 + .../Properties/launchSettings.json | 14 + .../Strata.Analytics.Hangfire.csproj | 18 + .../appsettings.Development.json | 37 + .../appsettings.json | 14 + .../ContentMigration/AggregateType.cs | 13 + .../ContentMigration/SortOrder.cs | 9 + .../Security/IdentityType.cs | 8 + .../Strata.Analytics.Models.csproj | 12 + src/Strata.Analytics.Models/Utils/Batch.cs | 15 + src/Strata.Analytics.Models/Utils/IdHelper.cs | 13 + .../Workbooks/SavedFilter.cs | 21 + .../Workbooks/SavedFilterInfo.cs | 9 + .../Workbooks/Workbook.cs | 43 + .../Workbooks/WorkbookCreateInfo.cs | 17 + .../Workbooks/WorkbookRole.cs | 13 + .../Workbooks/WorkbookRoleAssignment.cs | 28 + .../WorkbookRoleAssignmentSaveInfo.cs | 22 + .../Workbooks/WorkbookSaveInfo.cs | 17 + .../Workbooks/Worksheet.cs | 37 + .../Workbooks/WorksheetContent/Adhoc.cs | 15 + .../Workbooks/WorksheetContent/ColumnGroup.cs | 32 + .../Workbooks/WorksheetContent/Field.cs | 13 + .../Workbooks/WorksheetContent/Filter.cs | 67 + .../Workbooks/WorksheetContent/FilterGroup.cs | 26 + .../Workbooks/WorksheetContent/Pivot.cs | 28 + .../Workbooks/WorksheetContent/Row.cs | 35 + .../Workbooks/WorksheetContent/Value.cs | 79 + .../Workbooks/WorksheetSaveInfo.cs | 17 + .../Workbooks/WorksheetType.cs | 9 + src/Strata.Analytics.Web/.gitignore | 270 + src/Strata.Analytics.Web/.vscode/launch.json | 48 + .../Strata.Analytics.Web.csproj | 7 + src/Strata.Analytics.Web/analytics/.gitignore | 28 + src/Strata.Analytics.Web/analytics/README.md | 70 + .../analytics/jest.config.js | 29 + .../analytics/package-lock.json | 24335 ++++++++++ .../analytics/package.json | 121 + .../analytics/public/config.js | 14 + .../analytics/public/favicon.ico | Bin 0 -> 1048 bytes .../analytics/public/index.html | 41 + .../analytics/public/manifest.json | 15 + .../analytics/public/robots.txt | 0 .../analytics/src/App.tsx | 35 + .../analytics/src/adhoc/Adhoc.tsx | 665 + .../src/adhoc/components/AdhocFlatGrid.tsx | 146 + .../src/adhoc/components/AdhocGrid.css | 39523 ++++++++++++++++ .../src/adhoc/components/AdhocGrid.scss | 63 + .../src/adhoc/components/AdhocGrid.tsx | 53 + .../src/adhoc/components/AdhocGridUtils.tsx | 137 + .../src/adhoc/components/AdhocTreeGrid.tsx | 167 + .../adhoc/components/DownloadAdhocModal.tsx | 82 + .../src/adhoc/data/IAdhocConfig.test.ts | 29 + .../analytics/src/adhoc/data/IAdhocConfig.ts | 103 + .../src/adhoc/data/IColumnDisplayInfo.ts | 32 + .../src/adhoc/data/ITreeGridDataUtils.test.ts | 21 + .../src/adhoc/data/ITreeGridDataUtils.ts | 149 + .../components/LegacyReportModal.tsx | 362 + .../components/MigrationResultModal.tsx | 92 + .../content-migration/data/ILegacyReports.ts | 7 + .../src/content-migration/data/IMigration.ts | 4 + .../data/IMigrationResult.ts | 51 + .../data/contentMigrationService.ts | 39 + .../data/legacyReportTreeGridHelper.tsx | 77 + .../analytics/src/dashboard/Dashboard.tsx | 324 + .../analytics/src/dashboard/Widget.tsx | 26 + .../components/designers/DataVizDesigner.tsx | 472 + .../components/designers/TextDesigner.tsx | 80 + .../components/designers/WidgetDesigner.tsx | 29 + .../widgets/data-viz/DataVizContent.tsx | 63 + .../widgets/data-viz/DataVizDesignOptions.tsx | 46 + .../data-viz/DataVizSubTypeDropDown.tsx | 36 + .../widgets/data-viz/DataVizWidget.tsx | 88 + .../AxisDesignOptions.tsx | 122 + .../LegendDesignOptions.tsx | 39 + .../TooltipDesignOptions.tsx | 19 + .../ValueLabelDesignOptions.tsx | 41 + .../data/IAxisDesignOptions.ts | 20 + .../data/ILegendDesignOptions.ts | 7 + .../data/ITooltipDesignOptions.ts | 3 + .../data/IValueLabelDesignOptions.ts | 18 + .../data-viz/data-viz-design-options/index.ts | 8 + .../data-viz-types/DataVizBaseService.ts | 96 + .../data-viz/data-viz-types/bar/Bar.tsx | 258 + .../data-viz-types/bar/BarOptions.tsx | 23 + .../data-viz/data-viz-types/bar/BarSubType.ts | 3 + .../data-viz/data-viz-types/bar/IBarWidget.ts | 12 + .../data-viz/data-viz-types/bar/barService.ts | 64 + .../data-viz/data-viz-types/bubble/Bubble.tsx | 258 + .../data-viz-types/bubble/BubbleOptions.tsx | 23 + .../data-viz-types/bubble/IBubbleWidget.ts | 10 + .../data-viz-types/bubble/bubbleService.ts | 64 + .../data-viz-types/calendar/Calendar.tsx | 75 + .../calendar/CalendarOptions.tsx | 27 + .../calendar/ICalendarWidget.ts | 6 + .../calendar/calendarService.ts | 33 + .../options/CalenderMinMaxValueOptions.tsx | 33 + .../data-viz/data-viz-types/column/Column.tsx | 254 + .../data-viz-types/column/ColumnOptions.tsx | 23 + .../data-viz-types/column/ColumnSubType.ts | 3 + .../data-viz-types/column/IColumnWidget.ts | 10 + .../data-viz-types/column/columnService.ts | 64 + .../data-viz-types/line/ILineWidget.ts | 10 + .../data-viz/data-viz-types/line/Line.tsx | 238 + .../data-viz-types/line/LineOptions.tsx | 23 + .../data-viz-types/line/lineService.ts | 59 + .../data-viz/data-viz-types/metric/Metric.tsx | 47 + .../data-viz-types/metric/metricService.ts | 35 + .../data-viz/data-viz-types/pie/IPieWidget.ts | 12 + .../data-viz/data-viz-types/pie/Pie.tsx | 140 + .../data-viz-types/pie/PieOptions.tsx | 23 + .../data-viz/data-viz-types/pie/PieSubType.ts | 3 + .../pie/options/IOthersSliceDesignOptions.ts | 6 + .../pie/options/IPieLabelDesignOptions.ts | 10 + .../pie/options/OthersSliceDesignOptions.tsx | 65 + .../pie/options/PieLabelDesignOptions.tsx | 73 + .../data-viz/data-viz-types/pie/pieService.ts | 58 + .../data-viz-types/scatter/IScatterWidget.ts | 10 + .../data-viz-types/scatter/Scatter.tsx | 248 + .../data-viz-types/scatter/ScatterOptions.tsx | 23 + .../data-viz-types/scatter/scatterService.ts | 63 + .../components/widgets/text/TextContent.tsx | 28 + .../components/widgets/text/TextWidget.tsx | 43 + .../src/dashboard/data/IDashboard.test.ts | 24 + .../src/dashboard/data/IDashboard.ts | 77 + .../src/dashboard/data/IWidget.test.ts | 50 + .../analytics/src/dashboard/data/IWidget.ts | 69 + .../src/dashboard/data/data-viz/ChartUtils.ts | 297 + .../dashboard/data/data-viz/DataVizType.ts | 28 + .../dashboard/data/data-viz/IAmChartData.ts | 29 + .../data/data-viz/IDataVizWidget.test.ts | 33 + .../dashboard/data/data-viz/IDataVizWidget.ts | 64 + .../src/dashboard/data/text/ITextWidget.ts | 28 + .../src/data-query/data/AggregationType.ts | 1 + .../src/data-query/data/DatePart.test.ts | 39 + .../analytics/src/data-query/data/DatePart.ts | 66 + .../src/data-query/data/IColumnQueryConfig.ts | 20 + .../analytics/src/data-query/data/IDataRow.ts | 5 + .../src/data-query/data/IQueryConfig.ts | 57 + .../data-query/data/IQueryFilterCondition.ts | 9 + .../src/data-query/data/IQueryResult.ts | 17 + .../data-query/data/QueryFilterOperator.ts | 1 + .../src/data-query/data/QueryFilterType.ts | 1 + .../src/data-query/data/dataQueryService.ts | 87 + .../analytics/src/data-query/data/index.ts | 9 + .../components/DataTablesModal.tsx | 41 + .../src/data-schema/data/DataColumnType.ts | 1 + .../src/data-schema/data/DataSecurityType.ts | 1 + .../src/data-schema/data/DataTableType.ts | 18 + .../data/IBaseCalculatedMeasure.ts | 14 + .../src/data-schema/data/IBaseDataColumn.ts | 17 + .../src/data-schema/data/IBaseDataTable.ts | 9 + .../data-schema/data/ICalculatedMeasure.ts | 29 + .../src/data-schema/data/IDataColumn.ts | 40 + .../src/data-schema/data/IDataTable.ts | 42 + .../src/data-schema/data/IDataTableInfo.ts | 5 + .../data/IStandardCalculatedMeasure.ts | 10 + .../src/data-schema/data/IStandardCategory.ts | 14 + .../data-schema/data/IStandardDataColumn.ts | 29 + .../data-schema/data/IStandardDataTable.ts | 40 + .../data/IStandardDataTableInfo.ts | 5 + .../data/calculatedMeasuresService.ts | 20 + .../data-schema/data/dataTableLinksService.ts | 11 + .../src/data-schema/data/dataTableService.ts | 62 + .../analytics/src/data-schema/data/index.ts | 8 + .../data/standardCalculatedMeasuresService.ts | 21 + .../data/standardCategoryService.ts | 16 + .../data/standardDataTableService.ts | 70 + .../analytics/src/databases/IDatabase.ts | 6 + .../src/databases/databaseService.ts | 10 + .../src/datasource/DataSourceDetail.tsx | 334 + .../analytics/src/datasource/DataSources.tsx | 106 + .../components/DataSourceTree.test.tsx | 95 + .../datasource/components/DataSourceTree.tsx | 114 + .../datasource/components/FieldTreeNode.tsx | 33 + .../datasource/data/DataSourceConfigHelper.ts | 224 + .../src/datasource/data/DataSourceRole.ts | 16 + .../datasource/data/DataSourcesContext.tsx | 39 + .../src/datasource/data/IDataSource.ts | 14 + .../data/IDataSourceRoleAssignment.ts | 11 + .../src/datasource/data/IDataSourceTable.ts | 18 + .../src/datasource/data/IDataSourceTables.ts | 94 + .../src/datasource/data/dataSourceService.ts | 115 + .../datasource/data/dataSourceTreeProvider.ts | 127 + .../analytics/src/datasource/data/index.ts | 9 + .../src/encounters/data/encounterService.ts | 9 + .../analytics/src/extract/ExtractDetail.tsx | 277 + .../analytics/src/extract/Extracts.tsx | 181 + .../extract/components/CustomSqlExtract.tsx | 39 + .../extract/components/DataSourceExtract.tsx | 438 + .../extract/components/EditScheduleModal.tsx | 128 + .../components/ExportExtractHistoryModal.tsx | 104 + .../extract/components/ExportExtractModal.tsx | 51 + .../extract/components/ExtractPreviewGrid.tsx | 70 + .../extract/components/ExtractSaveModal.tsx | 61 + .../components/ExtractScheduleModal.tsx | 162 + .../data/ExtractExportHistoryStatus.ts | 6 + .../analytics/src/extract/data/ExtractRole.ts | 16 + .../analytics/src/extract/data/ExtractType.ts | 1 + .../src/extract/data/IExportExtractRequest.ts | 6 + .../analytics/src/extract/data/IExtract.ts | 53 + .../src/extract/data/IExtractConfig.ts | 133 + .../src/extract/data/IExtractCreateInfo.ts | 18 + .../src/extract/data/IExtractExportHistory.ts | 15 + .../extract/data/IExtractRoleAssignment.ts | 11 + .../src/extract/data/IExtractSaveInfo.ts | 27 + .../src/extract/data/IExtractSchedule.ts | 17 + .../extract/data/IExtractScheduleSaveInfo.ts | 28 + .../src/extract/data/ISchedule.test.tsx | 34 + .../analytics/src/extract/data/ISchedule.ts | 62 + .../src/extract/data/extractService.ts | 88 + .../analytics/src/extract/data/index.ts | 11 + .../fields/components/CalculationEditor.tsx | 253 + .../src/fields/components/ColumnGroup.tsx | 250 + .../components/DataSourceFilterPicker.tsx | 86 + .../fields/components/DataSourcePicker.tsx | 131 + .../fields/components/DatePartEditModal.tsx | 39 + .../src/fields/components/Pivots.tsx | 82 + .../src/fields/components/RowEditModal.tsx | 119 + .../analytics/src/fields/components/Rows.tsx | 97 + .../src/fields/components/RowsSortPopover.tsx | 100 + .../src/fields/components/ValueEditModal.tsx | 214 + .../src/fields/components/Values.tsx | 136 + .../fields/components/componentActions.tsx | 23 + .../analytics/src/fields/components/index.ts | 5 + .../src/fields/data/CalculationLanguage.ts | 66 + .../src/fields/data/CalculationUtils.ts | 149 + .../src/fields/data/DragDropUtils.ts | 10 + .../analytics/src/fields/data/IColumnGroup.ts | 55 + .../src/fields/data/IDraggableItem.ts | 10 + .../analytics/src/fields/data/IField.ts | 35 + .../analytics/src/fields/data/IPivot.ts | 37 + .../analytics/src/fields/data/IRow.ts | 47 + .../analytics/src/fields/data/IValue.ts | 94 + .../src/fields/data/SortDirection.ts | 1 + .../src/fields/data/actions/Action.ts | 6 + .../src/fields/data/actions/IActionService.ts | 10 + .../actions/PatientViewerActionService.ts | 34 + .../data/actions/WorkbookLinkActionService.ts | 44 + .../analytics/src/fields/data/index.ts | 7 + .../components/CalculationFiltersBar.tsx | 71 + .../filters/components/ConditionPicker.tsx | 116 + .../components/DashboardFiltersBar.tsx | 59 + .../components/DateFilterValuePicker.tsx | 129 + .../src/filters/components/FilterEditor.tsx | 39 + .../src/filters/components/FilterGroupBar.tsx | 251 + .../filters/components/FilterGroupEditor.tsx | 135 + .../src/filters/components/FilterPopover.tsx | 242 + .../filters/components/FilterTextModal.tsx | 58 + .../components/FilterValuePicker.test.tsx | 61 + .../filters/components/FilterValuePicker.tsx | 54 + .../src/filters/components/ListPicker.tsx | 148 + .../src/filters/components/SortableFilter.tsx | 64 + .../components/SortableFilterGroup.tsx | 76 + .../filters/components/TimeFramePicker.tsx | 124 + .../filters/components/UploadListPicker.tsx | 98 + .../analytics/src/filters/components/index.ts | 2 + .../filters/data/FilterDescriptionHelper.ts | 110 + .../src/filters/data/FilterToTextHelper.ts | 50 + .../src/filters/data/FilterUtils.test.ts | 125 + .../analytics/src/filters/data/FilterUtils.ts | 177 + .../src/filters/data/ICustomDateTimeFrame.ts | 131 + .../src/filters/data/IDateTimeFrame.ts | 49 + .../src/filters/data/IFilter.test.ts | 141 + .../analytics/src/filters/data/IFilter.ts | 80 + .../src/filters/data/IFilterCondition.test.ts | 30 + .../src/filters/data/IFilterCondition.ts | 22 + .../src/filters/data/IFilterGroup.ts | 17 + .../src/filters/data/LogicalOperator.ts | 6 + .../analytics/src/filters/data/TimeFrame.ts | 35 + .../analytics/src/filters/data/index.ts | 10 + .../analytics/src/index.scss | 582 + .../analytics/src/index.tsx | 18 + .../analytics/src/react-app-env.d.ts | 1 + .../components/RoleAssignmentsDrawer.tsx | 119 + .../src/security/components/UsersDrawer.tsx | 105 + .../src/security/data/IRoleAssignment.ts | 22 + .../analytics/src/security/data/IRoleInfo.ts | 5 + .../analytics/src/security/data/IUser.ts | 7 + .../analytics/src/security/data/IUserGroup.ts | 7 + .../src/security/data/IdentityType.ts | 1 + .../analytics/src/security/data/index.ts | 7 + .../src/security/data/userGroupService.ts | 19 + .../src/security/data/userService.ts | 21 + .../analytics/src/serviceWorker.ts | 127 + .../analytics/src/setupTests.js | 37 + .../analytics/src/shared/Navigation.tsx | 66 + .../src/shared/components/DraggableTab.tsx | 101 + .../src/shared/components/HoverActions.tsx | 30 + .../src/shared/components/ItemDropZone.tsx | 102 + .../components/NameDescriptionModal.tsx | 56 + .../src/shared/components/SortableItem.tsx | 58 + .../src/shared/components/SortableList.tsx | 76 + .../src/shared/components/SqlViewerModal.tsx | 65 + .../analytics/src/shared/data/ArrayUtils.ts | 81 + .../analytics/src/shared/data/FileUtils.ts | 3 + .../analytics/src/shared/data/IBatch.ts | 11 + .../src/shared/data/IDictionaryOfArray.ts | 3 + .../src/shared/data/INameDescription.ts | 4 + .../analytics/src/shared/data/ISqlResponse.ts | 4 + .../src/shared/data/SaveButtonState.ts | 1 + .../analytics/src/shared/data/UniqueId.ts | 6 + .../src/shared/data/featureService.ts | 9 + .../src/shared/tree/TreeUtils.test.ts | 153 + .../analytics/src/shared/tree/TreeUtils.ts | 69 + .../StandardDataSourceDetail.tsx | 346 + .../StandardDataSources.tsx | 153 + .../components/PublishHistoryModal.tsx | 46 + .../components/PublishModal.tsx | 83 + .../data/IPublicationEvent.ts | 8 + .../data/IPublishConfig.ts | 3 + .../data/IStandardDataSource.ts | 11 + .../data/IStandardDataSourceRoleAssignment.ts | 11 + .../data/IStandardDataSourceTable.ts | 16 + .../data/IStandardDataSourceTables.ts | 94 + .../data/standardDataSourceService.ts | 70 + .../analytics/src/workbook/WorkbookDetail.tsx | 558 + .../analytics/src/workbook/Workbooks.tsx | 165 + .../components/DuplicateWorkbookModal.tsx | 30 + .../workbook/components/WorkbookSaveModal.tsx | 56 + .../src/workbook/components/WorksheetIcon.tsx | 19 + .../src/workbook/components/WorksheetTabs.tsx | 50 + .../src/workbook/data/ExportColumnFormat.ts | 4 + .../src/workbook/data/ExportFileType.ts | 1 + .../src/workbook/data/IExportColumnOptions.ts | 15 + .../workbook/data/IExportDataSheetRequest.ts | 11 + .../src/workbook/data/ISavedFilterInfo.ts | 10 + .../src/workbook/data/IWorkbook.test.ts | 26 + .../analytics/src/workbook/data/IWorkbook.ts | 90 + .../src/workbook/data/IWorkbookCreateInfo.ts | 8 + .../src/workbook/data/IWorkbookInfo.ts | 13 + .../workbook/data/IWorkbookRoleAssignment.ts | 11 + .../src/workbook/data/IWorkbookSaveInfo.ts | 56 + .../analytics/src/workbook/data/IWorksheet.ts | 33 + .../src/workbook/data/IWorksheetSaveInfo.ts | 20 + .../src/workbook/data/WorkbookRole.ts | 16 + .../src/workbook/data/WorksheetType.ts | 1 + .../src/workbook/data/savedFiltersService.ts | 29 + .../src/workbook/data/workbookService.ts | 45 + .../analytics/tsconfig.json | 29 + src/Strata.Analytics.Web/nginx.conf | 26 + src/dependabot.sln | 61 + .../DataSourceMinimumRoleHandlerTest.cs | 158 + .../WorkbookMinimumRoleHandlerTest.cs | 111 + .../Biz/DataSources/DataSourceCreateTest.cs | 57 + .../DataSourceGetCurrentUserRoleTest.cs | 99 + .../DataSourceRoleAssignmentTest.cs | 110 + .../Biz/Extracts/ExtractCreateTest.cs | 63 + .../Biz/Extracts/ExtractCrudTests.cs | 133 + .../Biz/Extracts/ExtractExportJobTest.cs | 336 + .../Extracts/ExtractGetCurrentUserRoleTest.cs | 97 + .../Biz/Extracts/ExtractHistoryCrudTests.cs | 91 + .../Biz/Extracts/ExtractRoleAssignmentTest.cs | 108 + .../Biz/Extracts/ExtractScheduleTests.cs | 362 + .../Biz/Extracts/ExtractSqlHelperTest.cs | 97 + .../Biz/TestData/AnalyticsDbContextMock.cs | 53 + .../Biz/TestData/AutoMapperMock.cs | 25 + .../ExtractSaveInfoAutoMapperProfile.cs | 15 + .../Biz/TestData/ExtractTestData.cs | 178 + .../TestData/IClaimsPrincipalAccessorMock.cs | 39 + .../Biz/TestData/PerformanceContextMock.cs | 68 + .../WorkbookSaveInfoAutoMapperProfile.cs | 16 + .../Biz/TestData/WorkbookTestData.cs | 108 + .../Biz/Workbooks/WorkbookCrudTests.cs | 249 + .../WorkbookGetCurrentUserRoleTest.cs | 97 + .../Workbooks/WorkbookRoleAssignmentTest.cs | 108 + .../Biz/Workbooks/WorkbookSourceCreateTest.cs | 55 + .../Strata.Analytics.Test.Unit.csproj | 35 + 790 files changed, 149255 insertions(+), 218 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile.api create mode 100644 Dockerfile.dashboard create mode 100644 Dockerfile.hangfire create mode 100644 Dockerfile.web create mode 100644 Strata.Analytics.sln create mode 100644 Strata.Analytics.sln.DotSettings create mode 100644 cypress/cypress.env.json create mode 100644 cypress/cypress.json create mode 100644 cypress/cypress/cypress.development.json create mode 100644 cypress/cypress/cypress.local.json create mode 100644 cypress/cypress/integration/advanceAnalyticsDataMartSecurityTests.ts create mode 100644 cypress/cypress/integration/advanceAnalyticsDataSourceSmokeTests.ts create mode 100644 cypress/cypress/integration/advanceAnalyticsExtractTests.ts create mode 100644 cypress/cypress/integration/advanceAnalyticsFilterTests.ts create mode 100644 cypress/cypress/integration/advanceAnalyticsSearchTests.ts create mode 100644 cypress/cypress/integration/advanceAnalyticsSmokeTests.ts create mode 100644 cypress/cypress/integration/advanceAnalyticsWidgetTests.ts create mode 100644 cypress/cypress/integration/advanceAnalyticsWorkbookSecurityTests.ts create mode 100644 cypress/cypress/integration/advanceAnalyticsWorkbookTests.ts create mode 100644 cypress/cypress/pageObjects/advancedAnalyticsDataSourcePageObject.ts create mode 100644 cypress/cypress/pageObjects/advancedAnalyticsExtractPageObject.ts create mode 100644 cypress/cypress/pageObjects/advancedAnalyticsPageObject.ts create mode 100644 cypress/cypress/plugins/index.ts create mode 100644 cypress/cypress/support/IUserData.ts create mode 100644 cypress/cypress/support/commands.ts create mode 100644 cypress/cypress/support/index.ts create mode 100644 cypress/cypress/tsconfig.json create mode 100644 cypress/package-lock.json create mode 100644 cypress/package.json create mode 100644 docker-compose.yml create mode 100644 loadTest/docker/Dockerfile create mode 100644 loadTest/docker/Dockerfile.grafana create mode 100644 loadTest/docker/Dockerfile.influxdb create mode 100644 loadTest/docker/dashboards/grafana-dashboard.yaml create mode 100644 loadTest/docker/dashboards/grafana-datasource.yaml create mode 100644 loadTest/docker/dashboards/http.json create mode 100644 loadTest/docker/dashboards/ws.json create mode 100644 loadTest/docker/docker-compose.yml create mode 100644 loadTest/docker/grafana/alerting/1/__default__.tmpl create mode 100644 loadTest/docker/grafana/grafana.db create mode 100644 loadTest/docker/grafana/plugins/datadog/.gitattributes create mode 100644 loadTest/docker/grafana/plugins/datadog/.gitignore create mode 100644 loadTest/docker/grafana/plugins/datadog/.jscs.json create mode 100644 loadTest/docker/grafana/plugins/datadog/.jshintrc create mode 100644 loadTest/docker/grafana/plugins/datadog/.travis.yml create mode 100644 loadTest/docker/grafana/plugins/datadog/Gruntfile.js create mode 100644 loadTest/docker/grafana/plugins/datadog/LICENSE create mode 100644 loadTest/docker/grafana/plugins/datadog/README.md create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/README.md create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/add_datadog_func.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/add_datadog_func.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/datasource.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/datasource.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/dfunc.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/dfunc.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/func_editor.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/func_editor.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/img/datadog.png create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/module.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/module.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/partials/annotations.editor.html create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/partials/config.html create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/partials/query.editor.html create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/partials/query.options.html create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/plugin.json create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/query_builder.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/query_builder.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/query_ctrl.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/query_ctrl.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/showdown.min.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/add_datadog_func.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/add_datadog_func.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/datasource.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/datasource.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/dfunc.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/dfunc.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/func_editor.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/func_editor.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/module.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/module.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/query_builder.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/query_builder.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/query_ctrl.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/query_ctrl.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/showdown.min.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/spec/datasource_spec.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/spec/datasource_spec.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/spec/dfunc_spec.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/spec/dfunc_spec.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/spec/query_ctrl_soon.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/spec/query_ctrl_soon.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/spec/test-main.js create mode 100644 loadTest/docker/grafana/plugins/datadog/dist/test/spec/test-main.js.map create mode 100644 loadTest/docker/grafana/plugins/datadog/docker-compose.yml create mode 100644 loadTest/docker/grafana/plugins/datadog/package.json create mode 100644 loadTest/docker/grafana/plugins/datadog/spec/datasource_spec.js create mode 100644 loadTest/docker/grafana/plugins/datadog/spec/dfunc_spec.js create mode 100644 loadTest/docker/grafana/plugins/datadog/spec/query_ctrl_soon.js create mode 100644 loadTest/docker/grafana/plugins/datadog/spec/test-main.js create mode 100644 loadTest/docker/grafana/plugins/datadog/src/add_datadog_func.js create mode 100644 loadTest/docker/grafana/plugins/datadog/src/datasource.js create mode 100644 loadTest/docker/grafana/plugins/datadog/src/dfunc.js create mode 100644 loadTest/docker/grafana/plugins/datadog/src/func_editor.js create mode 100644 loadTest/docker/grafana/plugins/datadog/src/img/datadog.png create mode 100644 loadTest/docker/grafana/plugins/datadog/src/module.js create mode 100644 loadTest/docker/grafana/plugins/datadog/src/partials/annotations.editor.html create mode 100644 loadTest/docker/grafana/plugins/datadog/src/partials/config.html create mode 100644 loadTest/docker/grafana/plugins/datadog/src/partials/query.editor.html create mode 100644 loadTest/docker/grafana/plugins/datadog/src/partials/query.options.html create mode 100644 loadTest/docker/grafana/plugins/datadog/src/plugin.json create mode 100644 loadTest/docker/grafana/plugins/datadog/src/query_builder.js create mode 100644 loadTest/docker/grafana/plugins/datadog/src/query_ctrl.js create mode 100644 loadTest/docker/grafana/plugins/datadog/vendor/showdown.min.js create mode 100644 loadTest/docker/results/.gitkeep create mode 100644 loadTest/docker/testRunner/runBestPractice.ps1 create mode 100644 loadTest/docker/testRunner/runDummyTest.sh create mode 100644 loadTest/docker/testRunner/runTests.sh create mode 100644 loadTest/docker/testRunner/runTestsBU.sh create mode 100644 loadTest/docker/testRunner/scripts/dummyTest.mjs create mode 100644 loadTest/docker/testRunner/scripts/runTests.js create mode 100644 loadTest/docker/testRunner/scripts/utils.js create mode 100644 loadTest/docker/testRunner/tests/BestPracticeWorkbook/BestPracticeWorkbook.mjs create mode 100644 loadTest/docker/testRunner/tests/BestPracticeWorkbook/CasesByServiceLineAndCM.json create mode 100644 loadTest/docker/testRunner/tests/BestPracticeWorkbook/GrossRevenueByServiceLine.json create mode 100644 loadTest/docker/testRunner/tests/BestPracticeWorkbook/OrthopedicCosts.json create mode 100644 loadTest/docker/testRunner/tests/BestPracticeWorkbook/OverviewDashboard/CasesByServiceLine.json create mode 100644 loadTest/docker/testRunner/tests/BestPracticeWorkbook/OverviewDashboard/ChargesByServiceLine.json create mode 100644 loadTest/docker/testRunner/tests/BestPracticeWorkbook/OverviewDashboard/FixedDirectCostByYear.json create mode 100644 loadTest/docker/testRunner/tests/BestPracticeWorkbook/OverviewDashboard/ServiceLineActualVsExpected.json create mode 100644 loadTest/docker/testRunner/tests/BestPracticeWorkbook/OverviewDashboard/YOYCM.json create mode 100644 loadTest/docker/testRunner/tests/BestPracticeWorkbook/OverviewDashboard/YOYNetRevenue.json create mode 100644 loadTest/docker/testRunner/tests/BestPracticeWorkbook/OverviewDashboard/YOYTotalCosts.json create mode 100644 loadTest/docker/testRunner/tests/BestPracticeWorkbook/PatientTypeValidation.json create mode 100644 loadTest/docker/testRunner/tests/BestPracticeWorkbook/ServiceLineYOY.json create mode 100644 loadTest/docker/testRunner/tests/BestPracticeWorkbook/YOYPatientType.json create mode 100644 loadTest/docker/testRunner/tests/PivotERN.json create mode 100644 nuget.config create mode 100644 sonarsuppressions.xml create mode 100644 src/Strata.Analytics.Api/Authorization/AuthorizationOptions.cs create mode 100644 src/Strata.Analytics.Api/Authorization/AuthorizedDbMinimumRoleHandler.cs create mode 100644 src/Strata.Analytics.Api/Authorization/AuthorizedDbMinimumRoleRequirement.cs create mode 100644 src/Strata.Analytics.Api/Authorization/CustomSQLStrataOnlyRoleHandler.cs create mode 100644 src/Strata.Analytics.Api/Authorization/DataSourceMinimumRoleHandler.cs create mode 100644 src/Strata.Analytics.Api/Authorization/DataSourceMinimumRoleRequirement.cs create mode 100644 src/Strata.Analytics.Api/Authorization/ExtractCustomSQLStrataOnlyRoleRequirement.cs create mode 100644 src/Strata.Analytics.Api/Authorization/ExtractMinimumRoleHandler.cs create mode 100644 src/Strata.Analytics.Api/Authorization/ExtractMinimumRoleRequirement.cs create mode 100644 src/Strata.Analytics.Api/Authorization/Policies.cs create mode 100644 src/Strata.Analytics.Api/Authorization/WorkbookMinimumRoleHandler.cs create mode 100644 src/Strata.Analytics.Api/Authorization/WorkbookMinimumRoleRequirement.cs create mode 100644 src/Strata.Analytics.Api/Controllers/ContentMigrationController.cs create mode 100644 src/Strata.Analytics.Api/Controllers/DataSourcesController.cs create mode 100644 src/Strata.Analytics.Api/Controllers/DatabasesController.cs create mode 100644 src/Strata.Analytics.Api/Controllers/EncountersController.cs create mode 100644 src/Strata.Analytics.Api/Controllers/ExtractsController.cs create mode 100644 src/Strata.Analytics.Api/Controllers/FeatureContoller.cs create mode 100644 src/Strata.Analytics.Api/Controllers/SavedFiltersController.cs create mode 100644 src/Strata.Analytics.Api/Controllers/StandardDataSourcesController.cs create mode 100644 src/Strata.Analytics.Api/Controllers/UserGroupsController.cs create mode 100644 src/Strata.Analytics.Api/Controllers/UsersController.cs create mode 100644 src/Strata.Analytics.Api/Controllers/WorkbooksController.cs create mode 100644 src/Strata.Analytics.Api/Models/EncounterInfo.cs create mode 100644 src/Strata.Analytics.Api/Models/PublicationEvent.cs create mode 100644 src/Strata.Analytics.Api/Models/PublishConfig.cs create mode 100644 src/Strata.Analytics.Api/Program.cs create mode 100644 src/Strata.Analytics.Api/Properties/launchSettings.json create mode 100644 src/Strata.Analytics.Api/Startup.cs create mode 100644 src/Strata.Analytics.Api/Strata.Analytics.Api.csproj create mode 100644 src/Strata.Analytics.Api/appsettings.Development.json create mode 100644 src/Strata.Analytics.Api/appsettings.json create mode 100644 src/Strata.Analytics.Biz/AnalyticsServiceCollectionExtensions.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/ContentMigrationAutoMapperProfile.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Helpers/ContentMigrationHelpers.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/AdhocMigrationResult.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/Calculations/AggregateCalculation.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/Calculations/CalculationBase.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/Calculations/ColumnArithmeticCalculation.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/Calculations/ColumnDivisionCalculation.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/Calculations/ColumnVarianceCalculation.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/Calculations/DataColumnInfo.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/Calculations/LegacyCalculation.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/Calculations/MeasureInfo.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/Calculations/PercentOfTotalCalculation.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/DataMapping.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/DateFilterValue.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/DsCubeSearchParameterValue.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/ExtractMigrationResult.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/ISearchCondition.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/LegacyRow.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/LegacyValue.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/Migration.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/MigrationPlan/CalculationMapping.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/MigrationPlan/ColumnGroupMapping.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/MigrationPlan/Mapping.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/MigrationPlan/Plan.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/MigrationResult.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/ReDsCubeReportParameter.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/ReReport.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Models/ReReportDisplay.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Services/ContentMigrationService.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Services/DataMappingService.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Services/IContentMigrationService.cs create mode 100644 src/Strata.Analytics.Biz/ContentMigration/Services/IDataMappingService.cs create mode 100644 src/Strata.Analytics.Biz/DataQuery/DataQueryService.cs create mode 100644 src/Strata.Analytics.Biz/DataQuery/IDataQueryService.cs create mode 100644 src/Strata.Analytics.Biz/DataSources/DataSourceAutoMapperProfile.cs create mode 100644 src/Strata.Analytics.Biz/DataSources/Models/DataSource.cs create mode 100644 src/Strata.Analytics.Biz/DataSources/Models/DataSourceRole.cs create mode 100644 src/Strata.Analytics.Biz/DataSources/Models/DataSourceRoleAssignment.cs create mode 100644 src/Strata.Analytics.Biz/DataSources/Models/DataSourceRoleAssignmentSaveInfo.cs create mode 100644 src/Strata.Analytics.Biz/DataSources/Models/DataSourceSaveInfo.cs create mode 100644 src/Strata.Analytics.Biz/DataSources/Models/DataSourceTable.cs create mode 100644 src/Strata.Analytics.Biz/DataSources/Services/DataSourceService.cs create mode 100644 src/Strata.Analytics.Biz/DataSources/Services/IDataSourceService.cs create mode 100644 src/Strata.Analytics.Biz/Database/Database.cs create mode 100644 src/Strata.Analytics.Biz/Database/DatabaseService.cs create mode 100644 src/Strata.Analytics.Biz/Database/IDatabaseService.cs create mode 100644 src/Strata.Analytics.Biz/DbContexts/AnalyticsDbContext.cs create mode 100644 src/Strata.Analytics.Biz/DbContexts/Factories/AnalyticsDbContextFactory.cs create mode 100644 src/Strata.Analytics.Biz/DbContexts/Jazz/JazzDbContext.cs create mode 100644 src/Strata.Analytics.Biz/DbContexts/Jazz/JazzDbExtensions.cs create mode 100644 src/Strata.Analytics.Biz/DbContexts/Snowflake/ISnowflakeDatabaseContext.cs create mode 100644 src/Strata.Analytics.Biz/DbContexts/Snowflake/ISnowflakeDatabaseContextFactory.cs create mode 100644 src/Strata.Analytics.Biz/DbContexts/Snowflake/ISnowflakeQueryService.cs create mode 100644 src/Strata.Analytics.Biz/DbContexts/Snowflake/SnowflakeDatabaseContext.cs create mode 100644 src/Strata.Analytics.Biz/DbContexts/Snowflake/SnowflakeDatabaseContextFactory.cs create mode 100644 src/Strata.Analytics.Biz/DbContexts/Snowflake/SnowflakeQueryService.cs create mode 100644 src/Strata.Analytics.Biz/Encounters/EncounterService.cs create mode 100644 src/Strata.Analytics.Biz/Encounters/IEncounterService.cs create mode 100644 src/Strata.Analytics.Biz/Export/Models/ExportColumnFormat.cs create mode 100644 src/Strata.Analytics.Biz/Export/Models/ExportColumnOptions.cs create mode 100644 src/Strata.Analytics.Biz/Export/Models/ExportDataSheetRequest.cs create mode 100644 src/Strata.Analytics.Biz/Export/Models/ExportFileType.cs create mode 100644 src/Strata.Analytics.Biz/Export/Services/CsvService.cs create mode 100644 src/Strata.Analytics.Biz/Export/Services/ExcelService.cs create mode 100644 src/Strata.Analytics.Biz/Export/Services/ExportService.cs create mode 100644 src/Strata.Analytics.Biz/Export/Services/ICsvService.cs create mode 100644 src/Strata.Analytics.Biz/Export/Services/IExcelService.cs create mode 100644 src/Strata.Analytics.Biz/Export/Services/IExportService.cs create mode 100644 src/Strata.Analytics.Biz/Export/Utils/ExcelPackageExtensions.cs create mode 100644 src/Strata.Analytics.Biz/Export/Utils/ExportDataUtills.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Export/ConcurrentExtractExportException.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Export/ExportRouterHelper.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Export/ExtractSqlHelper.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Export/IS3BucketService.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Export/ISftpService.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Export/MissingExtractException.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Export/S3BucketService.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Export/SftpService.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Export/SftpSettings.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/ExtractAutoMapperProfile.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/ExtractConfiguration.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Jobs/ExtractExportJob.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Jobs/ExtractScheduleLoader.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Jobs/IExtractExportJob.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Jobs/IExtractScheduleLoader.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExportExtractRequest.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExportFileInfo.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExportRoute.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExportRouteConfig.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExternalStageUrlTokens.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/Extract.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExtractContent/ExtractConfig.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExtractCreateInfo.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExtractExportHistory.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExtractExportHistorySaveInfo.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExtractExportStatus.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExtractQueryConfig.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExtractRole.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExtractRoleAssignment.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExtractRoleAssignmentSaveInfo.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExtractSaveInfo.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExtractSchedule.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExtractScheduleSaveInfo.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExtractSqlRequest.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ExtractType.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/OutboundFileInfo.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Models/ScheduleRepeaterType.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Services/ExtractExportHistoryService.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Services/ExtractScheduleService.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Services/ExtractService.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Services/IExtractExportHistoryService.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Services/IExtractScheduleService.cs create mode 100644 src/Strata.Analytics.Biz/Extracts/Services/IExtractService.cs create mode 100644 src/Strata.Analytics.Biz/Hangfire/CaptureJobParameterAttribute.cs create mode 100644 src/Strata.Analytics.Biz/Hangfire/DeleteOnSuccessAttribute.cs create mode 100644 src/Strata.Analytics.Biz/Hangfire/IRecurringJobService.cs create mode 100644 src/Strata.Analytics.Biz/Hangfire/RecurringJobBootstrapper.cs create mode 100644 src/Strata.Analytics.Biz/Hangfire/RecurringJobService.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221111202405_InitialCreate.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221111202405_InitialCreate.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221111210026_DataColumn.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221111210026_DataColumn.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221111231015_DataMart.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221111231015_DataMart.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221112014754_DataMartTable.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221112014754_DataMartTable.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221114194528_DataColumn_Modify.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221114194528_DataColumn_Modify.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221114200911_DataColumn_Drop_SqlSchema.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221114200911_DataColumn_Drop_SqlSchema.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221115141133_DataMartTable_Modify.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221115141133_DataMartTable_Modify.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221115141308_DataMartTable_Add_WorkbookUsageCount.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221115141308_DataMartTable_Add_WorkbookUsageCount.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221115210142_Workbook_Add.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221115210142_Workbook_Add.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221116142418_Workbook_DefaultDataMartId.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221116142418_Workbook_DefaultDataMartId.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221117140430_Worksheet_Content.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221117140430_Worksheet_Content.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221117212537_DataTable_SqlAlias.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221117212537_DataTable_SqlAlias.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221216224218_DataColumn_Calculation.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221216224218_DataColumn_Calculation.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221227152157_DataColumn_Add_PrimaryKey.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221227152157_DataColumn_Add_PrimaryKey.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221228023445_DataColumn_Add_NumberFormat.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221228023445_DataColumn_Add_NumberFormat.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221228024630_DataColumn_Update_NumberFormat.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20221228024630_DataColumn_Update_NumberFormat.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230123142622_DataSchema_Remove.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230123142622_DataSchema_Remove.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230123143756_DataMartRoleAssignment_Add_Table.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230123143756_DataMartRoleAssignment_Add_Table.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230124032625_DataMartRoleAssignment_Add_IdentityType.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230124032625_DataMartRoleAssignment_Add_IdentityType.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230206181120_WorkbookRoleAssignments.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230206181120_WorkbookRoleAssignments.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230208221322_AddWorksheetSortOrder.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230208221322_AddWorksheetSortOrder.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230209065048_AddDataMartTemplatesTable.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230209065048_AddDataMartTemplatesTable.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230217151224_AddWorksheetUpdateFields.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230217151224_AddWorksheetUpdateFields.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230309150722_Extracts_AddTable.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230309150722_Extracts_AddTable.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230316194409_AddExtractRoles.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230316194409_AddExtractRoles.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230321170305_AddExtractExportHistory.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230321170305_AddExtractExportHistory.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230323172256_ExtractDateDefaults.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230323172256_ExtractDateDefaults.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230324152623_Extract_AddLastRunCols.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230324152623_Extract_AddLastRunCols.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230324211147_ExportHistory_AddStatus.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230324211147_ExportHistory_AddStatus.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230329190846_RemoveUnnecessaryExtractFields.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230329190846_RemoveUnnecessaryExtractFields.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230330195524_AddExtract_DataModel.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230330195524_AddExtract_DataModel.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230403194847_AddOutboundFileSql.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230403194847_AddOutboundFileSql.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230406150925_UpdateExtract_DataModel_To_Content.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230406150925_UpdateExtract_DataModel_To_Content.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230417141349_SavedFilter_CreateTable.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230417141349_SavedFilter_CreateTable.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230418190430_AddExtractSchedule.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230418190430_AddExtractSchedule.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230509173427_ExtractSchedules-date-datatype.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230509173427_ExtractSchedules-date-datatype.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230510184201_ExtractHistory-AddJobId.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230510184201_ExtractHistory-AddJobId.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230601190111_RenameMartToSource.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230601190111_RenameMartToSource.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230613234901_AddStandardDataSource.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230613234901_AddStandardDataSource.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230620154838_AddStandardDataRoleAssignment.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230620154838_AddStandardDataRoleAssignment.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230620205158_RenameTableLinkColumn.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230620205158_RenameTableLinkColumn.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230626180110_AddStandardDataSourcePublishSupport.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230626180110_AddStandardDataSourcePublishSupport.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230629152028_StandardDataMappings.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230629152028_StandardDataMappings.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230707165917_StandardDataSourcePublicationCorrelationAsString.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230707165917_StandardDataSourcePublicationCorrelationAsString.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230710172648_CascadeDeletion.Designer.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/20230710172648_CascadeDeletion.cs create mode 100644 src/Strata.Analytics.Biz/Migrations/AnalyticsDbContextModelSnapshot.cs create mode 100644 src/Strata.Analytics.Biz/StandardDataSources/Jobs/IPublishStandardDataSourcesJob.cs create mode 100644 src/Strata.Analytics.Biz/StandardDataSources/Jobs/PublishStandardDataSourcesAllClientsJob.cs create mode 100644 src/Strata.Analytics.Biz/StandardDataSources/Jobs/PublishStandardDataSourcesJob.cs create mode 100644 src/Strata.Analytics.Biz/StandardDataSources/Models/StandardDataSource.cs create mode 100644 src/Strata.Analytics.Biz/StandardDataSources/Models/StandardDataSourcePublication.cs create mode 100644 src/Strata.Analytics.Biz/StandardDataSources/Models/StandardDataSourceRoleAssignment.cs create mode 100644 src/Strata.Analytics.Biz/StandardDataSources/Models/StandardDataSourceRoleAssignmentSaveInfo.cs create mode 100644 src/Strata.Analytics.Biz/StandardDataSources/Models/StandardDataSourceSaveInfo.cs create mode 100644 src/Strata.Analytics.Biz/StandardDataSources/Models/StandardDataSourceTable.cs create mode 100644 src/Strata.Analytics.Biz/StandardDataSources/Services/IStandardDataSourcePublishService.cs create mode 100644 src/Strata.Analytics.Biz/StandardDataSources/Services/IStandardDataSourceService.cs create mode 100644 src/Strata.Analytics.Biz/StandardDataSources/Services/StandardDataSourcePublishService.cs create mode 100644 src/Strata.Analytics.Biz/StandardDataSources/Services/StandardDataSourceService.cs create mode 100644 src/Strata.Analytics.Biz/StandardDataSources/StandardDataSourceAutoMapperProfile.cs create mode 100644 src/Strata.Analytics.Biz/Strata.Analytics.Biz.csproj create mode 100644 src/Strata.Analytics.Biz/SystemSettings/ISystemSettingService.cs create mode 100644 src/Strata.Analytics.Biz/SystemSettings/SystemSettingService.cs create mode 100644 src/Strata.Analytics.Biz/Utils/DataContractUtils.cs create mode 100644 src/Strata.Analytics.Biz/Utils/DateTimeJsonConverters.cs create mode 100644 src/Strata.Analytics.Biz/Utils/DictionaryExtensions.cs create mode 100644 src/Strata.Analytics.Biz/Utils/LinqExtensions.cs create mode 100644 src/Strata.Analytics.Biz/Utils/SchedulerExtensions.cs create mode 100644 src/Strata.Analytics.Biz/Utils/StreamExtensions.cs create mode 100644 src/Strata.Analytics.Biz/Utils/StringExtensions.cs create mode 100644 src/Strata.Analytics.Biz/Workbooks/Services/ISavedFilterService.cs create mode 100644 src/Strata.Analytics.Biz/Workbooks/Services/IWorkbookService.cs create mode 100644 src/Strata.Analytics.Biz/Workbooks/Services/SavedFilterService.cs create mode 100644 src/Strata.Analytics.Biz/Workbooks/Services/WorkbookService.cs create mode 100644 src/Strata.Analytics.Biz/Workbooks/WorkbookAutoMapperProfile.cs create mode 100644 src/Strata.Analytics.Client/AnalyticsService.cs create mode 100644 src/Strata.Analytics.Client/AnalyticsServiceCollectionExtensions.cs create mode 100644 src/Strata.Analytics.Client/IAnalyticsService.cs create mode 100644 src/Strata.Analytics.Client/Strata.Analytics.Client.csproj create mode 100644 src/Strata.Analytics.Hangfire.Dashboard/Program.cs create mode 100644 src/Strata.Analytics.Hangfire.Dashboard/Properties/launchSettings.json create mode 100644 src/Strata.Analytics.Hangfire.Dashboard/Startup.cs create mode 100644 src/Strata.Analytics.Hangfire.Dashboard/Strata.Analytics.Hangfire.Dashboard.csproj create mode 100644 src/Strata.Analytics.Hangfire.Dashboard/appsettings.Development.json create mode 100644 src/Strata.Analytics.Hangfire.Dashboard/appsettings.json create mode 100644 src/Strata.Analytics.Hangfire/Program.cs create mode 100644 src/Strata.Analytics.Hangfire/Properties/launchSettings.json create mode 100644 src/Strata.Analytics.Hangfire/Strata.Analytics.Hangfire.csproj create mode 100644 src/Strata.Analytics.Hangfire/appsettings.Development.json create mode 100644 src/Strata.Analytics.Hangfire/appsettings.json create mode 100644 src/Strata.Analytics.Models/ContentMigration/AggregateType.cs create mode 100644 src/Strata.Analytics.Models/ContentMigration/SortOrder.cs create mode 100644 src/Strata.Analytics.Models/Security/IdentityType.cs create mode 100644 src/Strata.Analytics.Models/Strata.Analytics.Models.csproj create mode 100644 src/Strata.Analytics.Models/Utils/Batch.cs create mode 100644 src/Strata.Analytics.Models/Utils/IdHelper.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/SavedFilter.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/SavedFilterInfo.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/Workbook.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/WorkbookCreateInfo.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/WorkbookRole.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/WorkbookRoleAssignment.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/WorkbookRoleAssignmentSaveInfo.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/WorkbookSaveInfo.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/Worksheet.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/WorksheetContent/Adhoc.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/WorksheetContent/ColumnGroup.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/WorksheetContent/Field.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/WorksheetContent/Filter.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/WorksheetContent/FilterGroup.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/WorksheetContent/Pivot.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/WorksheetContent/Row.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/WorksheetContent/Value.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/WorksheetSaveInfo.cs create mode 100644 src/Strata.Analytics.Models/Workbooks/WorksheetType.cs create mode 100644 src/Strata.Analytics.Web/.gitignore create mode 100644 src/Strata.Analytics.Web/.vscode/launch.json create mode 100644 src/Strata.Analytics.Web/Strata.Analytics.Web.csproj create mode 100644 src/Strata.Analytics.Web/analytics/.gitignore create mode 100644 src/Strata.Analytics.Web/analytics/README.md create mode 100644 src/Strata.Analytics.Web/analytics/jest.config.js create mode 100644 src/Strata.Analytics.Web/analytics/package-lock.json create mode 100644 src/Strata.Analytics.Web/analytics/package.json create mode 100644 src/Strata.Analytics.Web/analytics/public/config.js create mode 100644 src/Strata.Analytics.Web/analytics/public/favicon.ico create mode 100644 src/Strata.Analytics.Web/analytics/public/index.html create mode 100644 src/Strata.Analytics.Web/analytics/public/manifest.json create mode 100644 src/Strata.Analytics.Web/analytics/public/robots.txt create mode 100644 src/Strata.Analytics.Web/analytics/src/App.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/adhoc/Adhoc.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/adhoc/components/AdhocFlatGrid.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/adhoc/components/AdhocGrid.css create mode 100644 src/Strata.Analytics.Web/analytics/src/adhoc/components/AdhocGrid.scss create mode 100644 src/Strata.Analytics.Web/analytics/src/adhoc/components/AdhocGrid.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/adhoc/components/AdhocGridUtils.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/adhoc/components/AdhocTreeGrid.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/adhoc/components/DownloadAdhocModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/adhoc/data/IAdhocConfig.test.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/adhoc/data/IAdhocConfig.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/adhoc/data/IColumnDisplayInfo.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/adhoc/data/ITreeGridDataUtils.test.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/adhoc/data/ITreeGridDataUtils.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/content-migration/components/LegacyReportModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/content-migration/components/MigrationResultModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/content-migration/data/ILegacyReports.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/content-migration/data/IMigration.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/content-migration/data/IMigrationResult.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/content-migration/data/contentMigrationService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/content-migration/data/legacyReportTreeGridHelper.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/Dashboard.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/Widget.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/designers/DataVizDesigner.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/designers/TextDesigner.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/designers/WidgetDesigner.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/DataVizContent.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/DataVizDesignOptions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/DataVizSubTypeDropDown.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/DataVizWidget.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-design-options/AxisDesignOptions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-design-options/LegendDesignOptions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-design-options/TooltipDesignOptions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-design-options/ValueLabelDesignOptions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-design-options/data/IAxisDesignOptions.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-design-options/data/ILegendDesignOptions.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-design-options/data/ITooltipDesignOptions.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-design-options/data/IValueLabelDesignOptions.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-design-options/index.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/DataVizBaseService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/bar/Bar.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/bar/BarOptions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/bar/BarSubType.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/bar/IBarWidget.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/bar/barService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/bubble/Bubble.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/bubble/BubbleOptions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/bubble/IBubbleWidget.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/bubble/bubbleService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/calendar/Calendar.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/calendar/CalendarOptions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/calendar/ICalendarWidget.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/calendar/calendarService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/calendar/options/CalenderMinMaxValueOptions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/column/Column.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/column/ColumnOptions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/column/ColumnSubType.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/column/IColumnWidget.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/column/columnService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/line/ILineWidget.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/line/Line.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/line/LineOptions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/line/lineService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/metric/Metric.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/metric/metricService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/pie/IPieWidget.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/pie/Pie.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/pie/PieOptions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/pie/PieSubType.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/pie/options/IOthersSliceDesignOptions.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/pie/options/IPieLabelDesignOptions.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/pie/options/OthersSliceDesignOptions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/pie/options/PieLabelDesignOptions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/pie/pieService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/scatter/IScatterWidget.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/scatter/Scatter.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/scatter/ScatterOptions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/data-viz/data-viz-types/scatter/scatterService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/text/TextContent.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/components/widgets/text/TextWidget.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/data/IDashboard.test.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/data/IDashboard.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/data/IWidget.test.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/data/IWidget.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/data/data-viz/ChartUtils.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/data/data-viz/DataVizType.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/data/data-viz/IAmChartData.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/data/data-viz/IDataVizWidget.test.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/data/data-viz/IDataVizWidget.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/dashboard/data/text/ITextWidget.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-query/data/AggregationType.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-query/data/DatePart.test.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-query/data/DatePart.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-query/data/IColumnQueryConfig.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-query/data/IDataRow.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-query/data/IQueryConfig.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-query/data/IQueryFilterCondition.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-query/data/IQueryResult.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-query/data/QueryFilterOperator.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-query/data/QueryFilterType.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-query/data/dataQueryService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-query/data/index.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/components/DataTablesModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/DataColumnType.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/DataSecurityType.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/DataTableType.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/IBaseCalculatedMeasure.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/IBaseDataColumn.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/IBaseDataTable.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/ICalculatedMeasure.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/IDataColumn.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/IDataTable.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/IDataTableInfo.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/IStandardCalculatedMeasure.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/IStandardCategory.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/IStandardDataColumn.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/IStandardDataTable.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/IStandardDataTableInfo.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/calculatedMeasuresService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/dataTableLinksService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/dataTableService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/index.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/standardCalculatedMeasuresService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/standardCategoryService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/data-schema/data/standardDataTableService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/databases/IDatabase.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/databases/databaseService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/datasource/DataSourceDetail.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/datasource/DataSources.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/datasource/components/DataSourceTree.test.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/datasource/components/DataSourceTree.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/datasource/components/FieldTreeNode.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/datasource/data/DataSourceConfigHelper.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/datasource/data/DataSourceRole.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/datasource/data/DataSourcesContext.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/datasource/data/IDataSource.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/datasource/data/IDataSourceRoleAssignment.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/datasource/data/IDataSourceTable.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/datasource/data/IDataSourceTables.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/datasource/data/dataSourceService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/datasource/data/dataSourceTreeProvider.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/datasource/data/index.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/encounters/data/encounterService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/ExtractDetail.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/Extracts.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/components/CustomSqlExtract.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/components/DataSourceExtract.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/components/EditScheduleModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/components/ExportExtractHistoryModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/components/ExportExtractModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/components/ExtractPreviewGrid.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/components/ExtractSaveModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/components/ExtractScheduleModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/data/ExtractExportHistoryStatus.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/data/ExtractRole.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/data/ExtractType.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/data/IExportExtractRequest.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/data/IExtract.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/data/IExtractConfig.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/data/IExtractCreateInfo.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/data/IExtractExportHistory.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/data/IExtractRoleAssignment.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/data/IExtractSaveInfo.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/data/IExtractSchedule.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/data/IExtractScheduleSaveInfo.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/data/ISchedule.test.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/data/ISchedule.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/data/extractService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/extract/data/index.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/components/CalculationEditor.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/components/ColumnGroup.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/components/DataSourceFilterPicker.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/components/DataSourcePicker.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/components/DatePartEditModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/components/Pivots.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/components/RowEditModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/components/Rows.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/components/RowsSortPopover.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/components/ValueEditModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/components/Values.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/components/componentActions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/components/index.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/data/CalculationLanguage.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/data/CalculationUtils.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/data/DragDropUtils.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/data/IColumnGroup.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/data/IDraggableItem.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/data/IField.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/data/IPivot.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/data/IRow.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/data/IValue.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/data/SortDirection.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/data/actions/Action.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/data/actions/IActionService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/data/actions/PatientViewerActionService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/data/actions/WorkbookLinkActionService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/fields/data/index.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/CalculationFiltersBar.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/ConditionPicker.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/DashboardFiltersBar.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/DateFilterValuePicker.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/FilterEditor.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/FilterGroupBar.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/FilterGroupEditor.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/FilterPopover.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/FilterTextModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/FilterValuePicker.test.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/FilterValuePicker.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/ListPicker.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/SortableFilter.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/SortableFilterGroup.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/TimeFramePicker.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/UploadListPicker.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/components/index.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/data/FilterDescriptionHelper.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/data/FilterToTextHelper.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/data/FilterUtils.test.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/data/FilterUtils.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/data/ICustomDateTimeFrame.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/data/IDateTimeFrame.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/data/IFilter.test.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/data/IFilter.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/data/IFilterCondition.test.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/data/IFilterCondition.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/data/IFilterGroup.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/data/LogicalOperator.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/data/TimeFrame.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/filters/data/index.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/index.scss create mode 100644 src/Strata.Analytics.Web/analytics/src/index.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/react-app-env.d.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/security/components/RoleAssignmentsDrawer.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/security/components/UsersDrawer.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/security/data/IRoleAssignment.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/security/data/IRoleInfo.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/security/data/IUser.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/security/data/IUserGroup.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/security/data/IdentityType.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/security/data/index.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/security/data/userGroupService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/security/data/userService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/serviceWorker.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/setupTests.js create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/Navigation.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/components/DraggableTab.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/components/HoverActions.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/components/ItemDropZone.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/components/NameDescriptionModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/components/SortableItem.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/components/SortableList.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/components/SqlViewerModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/data/ArrayUtils.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/data/FileUtils.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/data/IBatch.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/data/IDictionaryOfArray.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/data/INameDescription.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/data/ISqlResponse.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/data/SaveButtonState.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/data/UniqueId.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/data/featureService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/tree/TreeUtils.test.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/shared/tree/TreeUtils.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/standard-datasource/StandardDataSourceDetail.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/standard-datasource/StandardDataSources.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/standard-datasource/components/PublishHistoryModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/standard-datasource/components/PublishModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/standard-datasource/data/IPublicationEvent.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/standard-datasource/data/IPublishConfig.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/standard-datasource/data/IStandardDataSource.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/standard-datasource/data/IStandardDataSourceRoleAssignment.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/standard-datasource/data/IStandardDataSourceTable.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/standard-datasource/data/IStandardDataSourceTables.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/standard-datasource/data/standardDataSourceService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/WorkbookDetail.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/Workbooks.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/components/DuplicateWorkbookModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/components/WorkbookSaveModal.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/components/WorksheetIcon.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/components/WorksheetTabs.tsx create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/ExportColumnFormat.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/ExportFileType.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/IExportColumnOptions.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/IExportDataSheetRequest.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/ISavedFilterInfo.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/IWorkbook.test.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/IWorkbook.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/IWorkbookCreateInfo.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/IWorkbookInfo.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/IWorkbookRoleAssignment.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/IWorkbookSaveInfo.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/IWorksheet.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/IWorksheetSaveInfo.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/WorkbookRole.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/WorksheetType.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/savedFiltersService.ts create mode 100644 src/Strata.Analytics.Web/analytics/src/workbook/data/workbookService.ts create mode 100644 src/Strata.Analytics.Web/analytics/tsconfig.json create mode 100644 src/Strata.Analytics.Web/nginx.conf create mode 100644 src/dependabot.sln create mode 100644 tests/Strata.Analytics.Test.Unit/Api/Authorization/DataSourceMinimumRoleHandlerTest.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Api/Authorization/WorkbookMinimumRoleHandlerTest.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/DataSources/DataSourceCreateTest.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/DataSources/DataSourceGetCurrentUserRoleTest.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/DataSources/DataSourceRoleAssignmentTest.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/Extracts/ExtractCreateTest.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/Extracts/ExtractCrudTests.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/Extracts/ExtractExportJobTest.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/Extracts/ExtractGetCurrentUserRoleTest.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/Extracts/ExtractHistoryCrudTests.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/Extracts/ExtractRoleAssignmentTest.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/Extracts/ExtractScheduleTests.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/Extracts/ExtractSqlHelperTest.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/TestData/AnalyticsDbContextMock.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/TestData/AutoMapperMock.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/TestData/ExtractSaveInfoAutoMapperProfile.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/TestData/ExtractTestData.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/TestData/IClaimsPrincipalAccessorMock.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/TestData/PerformanceContextMock.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/TestData/WorkbookSaveInfoAutoMapperProfile.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/TestData/WorkbookTestData.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/Workbooks/WorkbookCrudTests.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/Workbooks/WorkbookGetCurrentUserRoleTest.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/Workbooks/WorkbookRoleAssignmentTest.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Biz/Workbooks/WorkbookSourceCreateTest.cs create mode 100644 tests/Strata.Analytics.Test.Unit/Strata.Analytics.Test.Unit.csproj diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..c834108 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +.dockerignore +Dockerfile +Dockerfile.local +.env +.gitignore +.vs +.vscode +**/bin +**/obj +**/.toolstarget \ No newline at end of file diff --git a/.gitignore b/.gitignore index ed6d1d2..0612d11 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,67 @@ -# ---> VisualStudio ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +################### +# compiled source # +################### +*.com +*.class +*.dll +*.exe +*.pdb +*.dll.config +*.cache +*.suo +# Include dlls if they’re in the NuGet packages directory +!/packages/*/lib/*.dll +# Include dlls if they're in the CommonReferences directory +!*CommonReferences/*.dll +#################### +# VS Upgrade stuff # +#################### +_UpgradeReport_Files/ +############### +# Directories # +############### +bin/ +obj/ +TestResults/ +################### +# Web publish log # +################### +*.Publish.xml +############# +# Resharper # +############# +/_ReSharper.* +*.ReSharper.* +############ +# Packages # +############ +# it’s better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip +###################### +# Logs and databases # +###################### +*.log +*.sqlite +# OS generated files # +###################### +.DS_Store +ehthumbs.db +Icon? +Thumbs.db + # User-specific files -*.rsuser -*.suo *.user *.userosscache *.sln.docstates @@ -14,9 +69,6 @@ # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs -# Mono auto generated files -mono_crash.* - # Build results [Dd]ebug/ [Dd]ebugPublic/ @@ -24,76 +76,47 @@ mono_crash.* [Rr]eleases/ x64/ x86/ -[Ww][Ii][Nn]32/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ +build/ bld/ [Bb]in/ [Oo]bj/ -[Ll]og/ -[Ll]ogs/ -# Visual Studio 2015/2017 cache/options directory +# Visual Studo 2015 cache/options directory .vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* -# NUnit +# NUNIT *.VisualState.xml TestResult.xml -nunit-*.xml # Build Results of an ATL Project [Dd]ebugPS/ [Rr]eleasePS/ dlldata.c -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core +# DNX project.lock.json -project.fragment.lock.json artifacts/ -# ASP.NET Scaffolding -ScaffoldingReadMe.txt - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio *_i.c *_p.c -*_h.h +*_i.h *.ilk *.meta *.obj -*.iobj *.pch -*.pdb -*.ipdb *.pgc *.pgd *.rsp -# but not Directory.Build.rsp, as it configures directory-level build defaults -!Directory.Build.rsp *.sbr *.tlb *.tli *.tlh *.tmp *.tmp_proj -*_wpftmp.csproj -*.log -*.tlog *.vspscc *.vssscc .builds @@ -108,21 +131,14 @@ _Chutzpah* ipch/ *.aps *.ncb -*.opendb *.opensdf *.sdf *.cachefile -*.VC.db -*.VC.VC.opendb # Visual Studio profiler *.psess *.vsp *.vspx -*.sap - -# Visual Studio Trace Files -*.e2e # TFS 2012 Local Workspace $tf/ @@ -135,29 +151,18 @@ _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 -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*.json -coverage*.xml -coverage*.info - -# Visual Studio code coverage results -*.coverage -*.coveragexml - # NCrunch _NCrunch_* .*crunch*.local.xml -nCrunchTemp_* # MightyMoose *.mm.* @@ -181,76 +186,50 @@ DocProject/Help/html # Click-Once directory publish/ +ClickOnce/ # Publish Web Output *.[Pp]ublish.xml *.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, +# 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 -# NuGet Symbol Packages -*.snupkg # The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* +**/packages/* # except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ +!**/packages/build/ # Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets +#!**/packages/repositories.config -# Microsoft Azure Build Output +# Windows Azure Build Output csx/ *.build.csdef -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files +# Windows Store app package directory AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload # Visual Studio cache files # files ending in .cache can be ignored *.[Cc]ache # but keep track of directories ending in .cache -!?*.[Cc]ache/ +!*.[Cc]ache/ # Others ClientBin/ +[Ss]tyle[Cc]op.* ~$* *~ *.dbmdl *.dbproj.schemaview -*.jfm *.pfx *.publishsettings +node_modules/ +bower_components/ orleans.codegen.cs -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# 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/ @@ -261,32 +240,21 @@ _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak # SQL Server files *.mdf *.ldf -*.ndf - +**/node_modules/* # Business Intelligence projects *.rdl.data *.bim.layout *.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl # Microsoft Fakes FakesAssemblies/ -# GhostDoc plugin setting file -*.GhostDoc.xml - # Node.js Tools for Visual Studio .ntvs_analysis.dat -node_modules/ # Visual Studio 6 build log *.plg @@ -294,109 +262,10 @@ node_modules/ # Visual Studio 6 workspace options file *.opt -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio 6 auto-generated project file (contains which files were open etc.) -*.vbp - -# Visual Studio 6 workspace and project file (working project files containing files to include in project) -*.dsw -*.dsp - -# Visual Studio 6 technical files -*.ncb -*.aps - -# 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/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# Visual Studio History (VSHistory) files -.vshistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - -# Fody - auto-generated XML schema -FodyWeavers.xsd - -# VS Code files for those working on multiple tools -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -# Local History for Visual Studio Code -.history/ - -# Windows Installer files from build outputs -*.cab -*.msi -*.msix -*.msm -*.msp - -# JetBrains Rider -*.sln.iml +# SonarQube files +sonarqube/ +.vs/ +*.orig +buildlogs/ +src/Strata.Analytics.Web/analytics/.env \ No newline at end of file diff --git a/Dockerfile.api b/Dockerfile.api new file mode 100644 index 0000000..a2b7384 --- /dev/null +++ b/Dockerfile.api @@ -0,0 +1,114 @@ +ARG PROJECT=Strata.Analytics +ARG VERSION=0.0.0 +ARG SONARURL='' +ARG SONARLOGIN='' +ARG SONARBRANCH='' + +############## +# Base image # +############## +FROM ecr.ops.stratanetwork.net/strata.microsoft.dotnet.aspnet:6.0 AS base + +############### +# Build image # +############### +FROM ecr.ops.stratanetwork.net/strata.microsoft.dotnet.sdk:6.0 AS build +ARG PROJECT +ARG VERSION +ARG SONARURL +ARG SONARLOGIN +ARG SONARBRANCH + +WORKDIR /src + +# Copy project files and restore +COPY ["${PROJECT}.sln", "${PROJECT}.sln"] +COPY src/**/*.csproj ./ +RUN for file in $(ls *.csproj); do mkdir -p src/${file%.*}/ && mv $file src/${file%.*}/; done +COPY tests/**/*.csproj ./ +RUN for file in $(ls *.csproj); do mkdir -p tests/${file%.*}/ && mv $file tests/${file%.*}/; done + +RUN dotnet restore "${PROJECT}.sln" \ + --source https://api.nuget.org/v3/index.json \ + --source https://proget.sdt.local/nuget/nuget/v3/index.json + + +# Copy files and build +COPY . . + +RUN if [ "${SONARLOGIN}" != "" ] ; then dotnet sonarscanner begin \ + /k:"${PROJECT}" \ + /d:sonar.scm.provider=git \ + /d:sonar.host.url="${SONARURL}" \ + ${SONARBRANCH} \ + /d:sonar.login="${SONARLOGIN}" \ + /d:sonar.cs.opencover.reportsPaths="/src/cover.xml" \ + /d:sonar.dependencyCheck.jsonReportPath=/src/buildlogs/dependency-check-report.json \ + /d:sonar.dependencyCheck.htmlReportPath=/src/buildlogs/dependency-check-report.html \ + /v:sonar.projectVersion="${VERSION}"; fi + + +RUN dotnet build "${PROJECT}.sln" \ + --configuration Release \ + --no-restore + +# Run unit tests +RUN dotnet test "${PROJECT}.sln" \ + --configuration Release \ + --no-restore \ + --no-build \ + --verbosity=normal \ + -p:CollectCoverage=true \ + -p:CoverletOutputFormat="opencover" \ + -p:CoverletOutput=/src/cover.xml + +# Publish project +RUN dotnet publish "src/${PROJECT}.Api/${PROJECT}.Api.csproj" \ + --configuration Release \ + --no-restore \ + --no-build \ + --output /app + +# Pack client projects +RUN dotnet pack "src/${PROJECT}.Client/${PROJECT}.Client.csproj" \ + --configuration Release \ + --no-restore \ + --no-build \ + --include-symbols \ + --include-source \ + --output /pack \ + -property:PackageVersion=${VERSION} + +RUN dotnet pack "src/${PROJECT}.Models/${PROJECT}.Models.csproj" \ + --configuration Release \ + --no-restore \ + --no-build \ + --include-symbols \ + --include-source \ + --output /pack \ + -property:PackageVersion=${VERSION} + +RUN if [ "${SONARLOGIN}" != "" ] ; then \ + /dc/dependency-check/bin/dependency-check.sh -f JSON -f HTML -s . -o ./buildlogs \ + --suppression ./sonarsuppressions.xml \ + --noupdate --nodeAuditSkipDevDependencies --disableNodeJS --ossIndexRemoteErrorWarnOnly true \ + --dbDriverName "com.microsoft.sqlserver.jdbc.SQLServerDriver" \ + --connectionString "jdbc:sqlserver://ddensqldevops01.sdt.local;Database=DependencyCheck;encrypt=true;trustServerCertificate=true;" \ + --dbUser "dcuser" --dbPassword "${SONARLOGIN}" && \ + dotnet sonarscanner end /d:sonar.login="${SONARLOGIN}"; \ + fi + +############### +# Final image # +############### +FROM base AS final +ARG PROJECT +WORKDIR /app +ARG PROJECT +ENV PROJECTDLL=${PROJECT}.Api.dll +ENV DOTNET_ENVIRONMENT=Development +ENV ASPNETCORE_ENVIRONMENT=Development + +COPY --from=build /app /app +COPY --from=build /pack /pack +ENTRYPOINT dotnet ${PROJECTDLL} diff --git a/Dockerfile.dashboard b/Dockerfile.dashboard new file mode 100644 index 0000000..2095213 --- /dev/null +++ b/Dockerfile.dashboard @@ -0,0 +1,55 @@ +ARG PROJECT=Strata.Analytics +ARG VERSION=0.0.0 + +############## +# Base image # +############## +FROM ecr.ops.stratanetwork.net/strata.microsoft.dotnet.aspnet:6.0 AS base + +############### +# Build image # +############### +FROM ecr.ops.stratanetwork.net/strata.microsoft.dotnet.sdk:6.0 AS build +ARG PROJECT +ARG VERSION + +WORKDIR /src + +# Copy project files and restore +COPY ["${PROJECT}.sln", "${PROJECT}.sln"] +COPY src/**/*.csproj ./ +RUN for file in $(ls *.csproj); do mkdir -p src/${file%.*}/ && mv $file src/${file%.*}/; done +COPY tests/**/*.csproj ./ +RUN for file in $(ls *.csproj); do mkdir -p tests/${file%.*}/ && mv $file tests/${file%.*}/; done + +RUN dotnet restore "${PROJECT}.sln" \ + --source https://api.nuget.org/v3/index.json \ + --source https://proget.sdt.local/nuget/nuget/v3/index.json + +# Copy files and build +COPY . . + +RUN dotnet build "${PROJECT}.sln" \ + --configuration Release \ + --no-restore + +# Publish project +RUN dotnet publish "src/${PROJECT}.Hangfire.Dashboard/${PROJECT}.Hangfire.Dashboard.csproj" \ + --configuration Release \ + --no-restore \ + --no-build \ + --output /app + +############### +# Final image # +############### +FROM base AS final +ARG PROJECT +WORKDIR /app +ARG PROJECT +ENV PROJECTDLL=${PROJECT}.Hangfire.Dashboard.dll +ENV DOTNET_ENVIRONMENT=Development +ENV ASPNETCORE_ENVIRONMENT=Development + +COPY --from=build /app /app +ENTRYPOINT dotnet ${PROJECTDLL} diff --git a/Dockerfile.hangfire b/Dockerfile.hangfire new file mode 100644 index 0000000..6904b88 --- /dev/null +++ b/Dockerfile.hangfire @@ -0,0 +1,56 @@ +ARG PROJECT=Strata.Analytics +ARG VERSION=0.0.0 + +############## +# Base image # +############## +FROM ecr.ops.stratanetwork.net/strata.microsoft.dotnet.aspnet:6.0 AS base + +############### +# Build image # +############### +FROM ecr.ops.stratanetwork.net/strata.microsoft.dotnet.sdk:6.0 AS build +ARG PROJECT +ARG VERSION + +WORKDIR /src + +# Copy project files and restore +COPY ["${PROJECT}.sln", "${PROJECT}.sln"] +COPY src/**/*.csproj ./ +RUN for file in $(ls *.csproj); do mkdir -p src/${file%.*}/ && mv $file src/${file%.*}/; done +COPY tests/**/*.csproj ./ +RUN for file in $(ls *.csproj); do mkdir -p tests/${file%.*}/ && mv $file tests/${file%.*}/; done + +RUN dotnet restore "${PROJECT}.sln" \ + --source https://api.nuget.org/v3/index.json \ + --source https://proget.sdt.local/nuget/nuget/v3/index.json + + +# Copy files and build +COPY . . + +RUN dotnet build "${PROJECT}.sln" \ + --configuration Release \ + --no-restore + +# Publish project +RUN dotnet publish "src/${PROJECT}.Hangfire/${PROJECT}.Hangfire.csproj" \ + --configuration Release \ + --no-restore \ + --no-build \ + --output /app + +############### +# Final image # +############### +FROM base AS final +ARG PROJECT +WORKDIR /app +ARG PROJECT +ENV PROJECTDLL=${PROJECT}.Hangfire.dll +ENV DOTNET_ENVIRONMENT=Development +ENV ASPNETCORE_ENVIRONMENT=Development + +COPY --from=build /app /app +ENTRYPOINT dotnet ${PROJECTDLL} diff --git a/Dockerfile.web b/Dockerfile.web new file mode 100644 index 0000000..7ca8b02 --- /dev/null +++ b/Dockerfile.web @@ -0,0 +1,25 @@ +FROM node:18.16.0 + +ENV CI=true + +# Set working directory +WORKDIR /app + +# Install dependencies +RUN npm config set @strata:registry http://proget.sdt.local/npm/npm +RUN npm config set strict-ssl false +COPY src/Strata.Analytics.Web/analytics/package*.json ./ +RUN npm ci --legacy-peer-deps + +# Activate Kendo UI License +RUN --mount=type=secret,id=KENDO_UI_LICENSE \ + KENDO_UI_LICENSE=$(cat /run/secrets/KENDO_UI_LICENSE) npx kendo-ui-license activate + +# Copy in rest of app and build +COPY src/Strata.Analytics.Web/analytics . +RUN npm run build + +# Build release container +FROM nginx:alpine +COPY --from=0 /app/build /usr/share/nginx/html +COPY src/Strata.Analytics.Web/nginx.conf /etc/nginx/conf.d/default.conf diff --git a/README.md b/README.md index b558da7..cf254f3 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,60 @@ -# analytics +# Strata.Analytics +[![build](https://github.com/stratadecision/analytics/actions/workflows/build.yaml/badge.svg)](https://github.com/stratadecision/analytics/actions/workflows/build.yaml) + +[![Strata.Analytics.Octopus](https://img.shields.io/badge/octopus-Strata.Analytics-004880?logo=OctopusDeploy)](https://octopus.sdt.local/app#/Spaces-1/projects/analytics) + +[![SonarQube](https://img.shields.io/badge/SonarQube-Strata.Analytics-004880?logo=sonarqube)](https://sonarqube.ops.stratanetwork.net/dashboard?id=Strata.Analytics) + +[![Strata.Analytics.Client](https://img.shields.io/badge/nuget-Strata.Analytics.Client-004880?logo=nuget&logoColor=004880)](https://proget.ops.stratanetwork.net/feeds/nuget/Strata.Analytics.Client/versions?HidePrerelease=True) + +[![Strata.Analytics.Api](https://img.shields.io/badge/api-Strata.Analytics-004880?logo=swagger&logoColor=00FF00)](https://analytics-api.dev.stratanetwork.net) + +[![Strata.Analytics.Web](https://img.shields.io/badge/web-Strata.Analytics-004880?logo=react&logoColor=61DBFB)](https://analytics.dev.stratanetwork.net) + +[![Strata.Analytics.Hangfire](https://img.shields.io/badge/hangfire-Strata.Analytics-004880?logo=MediaFire&logoColor=FF0000)](https://analytics-dashboard.dev.stratanetwork.net) + +## Branching and Versioning + +### Epic / Feature branches +For epics / features that have multiple stories or are a big chunk of work, use feature release branches. There should be a feature release `main` branch and all PRs for that feature will use that as the base. When the entire feature is ready to be deployed, merge the feature release `main` back into `main main`. + +For example, if the feature is for `Content Migration`, create the feature release main as `feature/[team]/release/content-migration/main`. For stories tied to that feature (for example, JAZZ-4231), branch off the feature release main and name it `feature/[team]/release/content-migration/JAZZ-4231-content-migration-mapping`. + +### Bugs / Small Changes +For bugs and small changes, use regular `feature/[team]/JAZZ-1234-description` and `fix/[team]/JAZZ-1234-description` branches that will be merged into main + + +## Usage + +### AWS Profile +``` +[profile sdt-analytics-service-role] +source_profile = 809820578507_SDT-Dev-Developers +role_arn = arn:aws:iam::809820578507:role/sdt-analytics-service-role +region=us-east-1 +``` + +### Build and Run + +``` +docker-compose up -d --build +``` + +- https://localhost:8443/index (swagger api) +- https://localhost:8443/hangfire (hangfire dashboard) +- http://localhost:8081 (redis commander) + +### Extracting nuget package + +``` +docker create --name throwaway strataanalytics_analytics-api +docker cp throwaway:/pack . +docker rm throwaway +``` + +### Cleanup + +``` +docker-compose down +``` diff --git a/Strata.Analytics.sln b/Strata.Analytics.sln new file mode 100644 index 0000000..ee62674 --- /dev/null +++ b/Strata.Analytics.sln @@ -0,0 +1,69 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32825.248 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Strata.Analytics.Api", "src\Strata.Analytics.Api\Strata.Analytics.Api.csproj", "{D624FD73-92D9-4653-9C73-AE975F03FF57}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Strata.Analytics.Test.Unit", "tests\Strata.Analytics.Test.Unit\Strata.Analytics.Test.Unit.csproj", "{AD44DB53-E521-4CAD-97F9-49C5AEF3E5E2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Strata.Analytics.Client", "src\Strata.Analytics.Client\Strata.Analytics.Client.csproj", "{F66B27E9-4414-45DC-87BC-E913E44B2F28}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Strata.Analytics.Biz", "src\Strata.Analytics.Biz\Strata.Analytics.Biz.csproj", "{1CE90323-6EBE-46E1-A7F2-3F53164B5D3D}" + ProjectSection(ProjectDependencies) = postProject + {7DC6DCA8-E235-422D-A312-82F52A7A88D1} = {7DC6DCA8-E235-422D-A312-82F52A7A88D1} + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Strata.Analytics.Hangfire", "src\Strata.Analytics.Hangfire\Strata.Analytics.Hangfire.csproj", "{88525DCB-DAFB-4EDE-8724-646E28AD2BFC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Strata.Analytics.Hangfire.Dashboard", "src\Strata.Analytics.Hangfire.Dashboard\Strata.Analytics.Hangfire.Dashboard.csproj", "{1D6CFA8D-A2F7-474B-B6B0-91CC3699942C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Strata.Analytics.Web", "src\Strata.Analytics.Web\Strata.Analytics.Web.csproj", "{F9C44292-B9B3-41A5-9BB3-50AE9CB2A663}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Strata.Analytics.Models", "src\Strata.Analytics.Models\Strata.Analytics.Models.csproj", "{7DC6DCA8-E235-422D-A312-82F52A7A88D1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D624FD73-92D9-4653-9C73-AE975F03FF57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D624FD73-92D9-4653-9C73-AE975F03FF57}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D624FD73-92D9-4653-9C73-AE975F03FF57}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D624FD73-92D9-4653-9C73-AE975F03FF57}.Release|Any CPU.Build.0 = Release|Any CPU + {AD44DB53-E521-4CAD-97F9-49C5AEF3E5E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AD44DB53-E521-4CAD-97F9-49C5AEF3E5E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AD44DB53-E521-4CAD-97F9-49C5AEF3E5E2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AD44DB53-E521-4CAD-97F9-49C5AEF3E5E2}.Release|Any CPU.Build.0 = Release|Any CPU + {F66B27E9-4414-45DC-87BC-E913E44B2F28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F66B27E9-4414-45DC-87BC-E913E44B2F28}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F66B27E9-4414-45DC-87BC-E913E44B2F28}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F66B27E9-4414-45DC-87BC-E913E44B2F28}.Release|Any CPU.Build.0 = Release|Any CPU + {1CE90323-6EBE-46E1-A7F2-3F53164B5D3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1CE90323-6EBE-46E1-A7F2-3F53164B5D3D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1CE90323-6EBE-46E1-A7F2-3F53164B5D3D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1CE90323-6EBE-46E1-A7F2-3F53164B5D3D}.Release|Any CPU.Build.0 = Release|Any CPU + {88525DCB-DAFB-4EDE-8724-646E28AD2BFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {88525DCB-DAFB-4EDE-8724-646E28AD2BFC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {88525DCB-DAFB-4EDE-8724-646E28AD2BFC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {88525DCB-DAFB-4EDE-8724-646E28AD2BFC}.Release|Any CPU.Build.0 = Release|Any CPU + {1D6CFA8D-A2F7-474B-B6B0-91CC3699942C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D6CFA8D-A2F7-474B-B6B0-91CC3699942C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D6CFA8D-A2F7-474B-B6B0-91CC3699942C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D6CFA8D-A2F7-474B-B6B0-91CC3699942C}.Release|Any CPU.Build.0 = Release|Any CPU + {F9C44292-B9B3-41A5-9BB3-50AE9CB2A663}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F9C44292-B9B3-41A5-9BB3-50AE9CB2A663}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F9C44292-B9B3-41A5-9BB3-50AE9CB2A663}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F9C44292-B9B3-41A5-9BB3-50AE9CB2A663}.Release|Any CPU.Build.0 = Release|Any CPU + {7DC6DCA8-E235-422D-A312-82F52A7A88D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7DC6DCA8-E235-422D-A312-82F52A7A88D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DC6DCA8-E235-422D-A312-82F52A7A88D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7DC6DCA8-E235-422D-A312-82F52A7A88D1}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {7329473D-7E3A-4729-A4EC-397E12FC3E74} + EndGlobalSection +EndGlobal diff --git a/Strata.Analytics.sln.DotSettings b/Strata.Analytics.sln.DotSettings new file mode 100644 index 0000000..3687137 --- /dev/null +++ b/Strata.Analytics.sln.DotSettings @@ -0,0 +1,3 @@ + + True + True \ No newline at end of file diff --git a/cypress/cypress.env.json b/cypress/cypress.env.json new file mode 100644 index 0000000..af05abd --- /dev/null +++ b/cypress/cypress.env.json @@ -0,0 +1,10 @@ +{ + "baseUrl": "https://analytics.dev.stratanetwork.net/workbooks/", + "userName": "dssadmin", + "basicUserName": "capbasic", + "userPassword": "Password1", + "dbguid": "102e1bc4-f789-4ee8-8810-828af508a8ab", + "orgPin": "0777", + "dbName": "QA Master", + "clientId": "StrataUI" +} \ No newline at end of file diff --git a/cypress/cypress.json b/cypress/cypress.json new file mode 100644 index 0000000..a273fd4 --- /dev/null +++ b/cypress/cypress.json @@ -0,0 +1,45 @@ +{ + "baseUrl": "https://analytics.dev.stratanetwork.net/workbooks/", + "requestTimeout": 8000, + "defaultCommandTimeout": 10000, + "trashAssetsBeforeRuns": true, + "downloadsFolder": "cypress/fixtures", + "viewportWidth": 1440, + "viewportHeight": 900, + "scrollBehavior": false, + "chromeWebSecurity": false, + "ignoreTestFiles": [ + "**/__snapshots__/*", + "**/__image_snapshots__/*" + ], + "cypress-plugin-snapshots": { + "autoCleanUp": false, + "autopassNewSnapshots": true, + "diffLines": 3, + "excludeFields": [], + "ignoreExtraArrayItems": false, + "ignoreExtraFields": false, + "normalizeJson": true, + "prettier": true, + "imageConfig": { + "createDiffImage": true, + "resizeDevicePixelRatio": true, + "threshold": 0.05, + "thresholdType": "percent" + }, + "screenshotConfig": { + "blackout": [], + "capture": "fullPage", + "clip": null, + "disableTimersAndAnimations": true, + "log": false, + "scale": false, + "timeout": 30000 + }, + "serverEnabled": true, + "serverHost": "localhost", + "serverPort": 2121, + "updateSnapshots": false, + "backgroundBlend": "difference" + } +} \ No newline at end of file diff --git a/cypress/cypress/cypress.development.json b/cypress/cypress/cypress.development.json new file mode 100644 index 0000000..44f1fde --- /dev/null +++ b/cypress/cypress/cypress.development.json @@ -0,0 +1,13 @@ +{ + "baseUrl": "https://analytics.dev.stratanetwork.net/analytics/", + "env": { + "basePageUrl": "https://analytics.dev.stratanetwork.net/analytics/", + "apiUrl": "https://analytics-api.dev.stratanetwork.net/api/", + "username": "username", + "password": "password", + "dbguid": "102e1bc4-f789-4ee8-8810-828af508a8ab", + "orgPin": "0777", + "dbName": "QA Master", + "clientId": "StrataUI" + } +} \ No newline at end of file diff --git a/cypress/cypress/cypress.local.json b/cypress/cypress/cypress.local.json new file mode 100644 index 0000000..bb517c5 --- /dev/null +++ b/cypress/cypress/cypress.local.json @@ -0,0 +1,13 @@ +{ + "baseUrl": "http://localhost:3000/analytics/", + "env": { + "basePageUrl": "http://localhost:3000/analytics/", + "apiUrl": "https://localhost:8443/api/", + "username": "username", + "password": "password", + "dbguid": "102e1bc4-f789-4ee8-8810-828af508a8ab", + "orgPin": "0777", + "dbName": "QA Master", + "clientId": "StrataUI" + } +} \ No newline at end of file diff --git a/cypress/cypress/integration/advanceAnalyticsDataMartSecurityTests.ts b/cypress/cypress/integration/advanceAnalyticsDataMartSecurityTests.ts new file mode 100644 index 0000000..2f1eace --- /dev/null +++ b/cypress/cypress/integration/advanceAnalyticsDataMartSecurityTests.ts @@ -0,0 +1,42 @@ +import * as dayjs from 'dayjs'; +import advancedAnalyticsDatamartPage from '../pageObjects/advancedAnalyticsDataSourcePageObject'; +const dataSourcePage = new advancedAnalyticsDatamartPage(); +const dataSourceName1 = `Cypress_Test_Datamart1_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const dataSourceName2 = `Cypress_Test_Datamart2_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const datamartDescription = 'Test datamart made in Cypress - datamart security test'; +const dssPatientEncounter = '55370'; + +before(() => { + cy.vaultLoginByUserTitle('IDTestUser'); + cy.createDataSource(dataSourceName1, datamartDescription); + cy.createDataSource(dataSourceName2, datamartDescription); + cy.addTableToDataSource(dssPatientEncounter, dataSourceName1); + cy.addTableToDataSource(dssPatientEncounter, dataSourceName2); +}); + +beforeEach(() => { + cy.wait(1); +}); + +after(() => { + cy.deleteDataSource(dataSourceName1); + cy.deleteDataSource(dataSourceName2); + cy.visit('/'); +}); + +describe('Advanced Analytics data mart tests', () => { + it('Data mart can be secured from users', () => { + cy.goToDataSource(dataSourceName2); + dataSourcePage.addUsersToDataSource(dataSourceName2, [{ userName: 'Capital Administrator' }]); + + cy.logout(); + cy.vaultLoginByUserTitle('Capital Administrator'); + cy.findByText('Add Workbook').click(); + cy.get('#defaultDataSourceId').click(); + cy.get('div').contains(dataSourceName1).should('not.exist'); + cy.get('div').contains(dataSourceName2).should('exist'); + + cy.logout(); + cy.vaultLoginByUserTitle('IDTestUser'); + }); +}); diff --git a/cypress/cypress/integration/advanceAnalyticsDataSourceSmokeTests.ts b/cypress/cypress/integration/advanceAnalyticsDataSourceSmokeTests.ts new file mode 100644 index 0000000..c1ac1a5 --- /dev/null +++ b/cypress/cypress/integration/advanceAnalyticsDataSourceSmokeTests.ts @@ -0,0 +1,87 @@ +import * as dayjs from 'dayjs'; +import advancedAnalyticsDatamartPage from '../pageObjects/advancedAnalyticsDataSourcePageObject'; +const dataSourcePage = new advancedAnalyticsDatamartPage(); +const dataSourceName = `Cypress_Test_Data_Source_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const dataSourceNameEdit = `Cypress_Test_Data_Source_Edit_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const dataSourceDescription = 'Test data source made in Cypress - smoke tests'; +const dataSourceDescriptionEdit = 'Edited test data source made in Cypress - smoke tests'; +const standardDataSourceName = `Cypress_Test_Standard_Data_Source_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const standardDataSourceNameEdit = `Cypress_Test_Standard_Data_Source_Edit_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const standardDataSourceDescription = 'Test standard data source made in Cypress - smoke tests'; +const standardDataSourceDescriptionEdit = 'Edited test standard data source made in Cypress - smoke tests'; + +before(() => { + cy.vaultLoginByUserTitle('IDTestUser'); +}); + +afterEach(() => { + cy.visit('/'); +}); + +after(() => { + cy.deleteDataSource(dataSourceName); + cy.deleteDataSource(dataSourceNameEdit); +}); + +describe('Advanced Analytics smoke tests', () => { + it('Create Data Source', () => { + dataSourcePage.addDataSource(dataSourceName, dataSourceDescription); + dataSourcePage.goToDataSources(); + cy.findByText(dataSourceName).should('exist'); + }); + + it('Edit Data Source', () => { + dataSourcePage.editDataSource(dataSourceName, dataSourceNameEdit, dataSourceDescriptionEdit); + cy.findByText('Save').click(); + cy.findByText('Saved', { timeout: 5000 }).should('exist'); + dataSourcePage.goToDataSources(); + cy.findByText(dataSourceNameEdit).should('exist'); + cy.findByText(dataSourceName).should('not.exist'); + }); + + it('Delete Data Source', () => { + dataSourcePage.goToDataSources(); + dataSourcePage.deleteDataSourceFromPage(dataSourceNameEdit); + dataSourcePage.goToDataSources(); + cy.get('main').find('span').contains(dataSourceNameEdit).should('not.exist'); + }); + + // Skipping until issue with IDTestUser not being a strata employee + it.skip('Create Standard Data Source', () => { + dataSourcePage.addStandardDataSource(standardDataSourceName, standardDataSourceDescription); + cy.findByText('Back to Standard Data Sources', { timeout: 5000 }).click(); + cy.findByText(standardDataSourceName).should('exist'); + }); + + // Skipping until issue with IDTestUser not being a strata employee + it.skip('Edit Standard Data Source', () => { + dataSourcePage.goToStandardDataSources(); + //Verify unsaved changes are not kept + cy.goToStandardDataSource(standardDataSourceName); + dataSourcePage.openDataSourceEditWindow(); + cy.get('#name').clear().type(standardDataSourceNameEdit); + cy.findByText('Apply').click(); + cy.findByText('Back to Standard Data Sources').click(); + cy.findByText('Discard your unsaved changes?').should('exist'); + cy.findByText('Discard Changes').click(); + cy.findByText('Standard Data Sources').should('exist'); + cy.findByText(standardDataSourceName).should('exist'); + cy.findByText(standardDataSourceNameEdit).should('not.exist'); + + //Verify changes are saved + dataSourcePage.editStandardDataSource(standardDataSourceName, standardDataSourceNameEdit, standardDataSourceDescriptionEdit); + cy.findByText('Save').click(); + cy.findByText('Saved', { timeout: 5000 }).should('exist'); + dataSourcePage.goToStandardDataSources(); + cy.findByText(standardDataSourceNameEdit).should('exist'); + cy.findByText(standardDataSourceName).should('not.exist'); + }); + + // Skipping until issue with IDTestUser not being a strata employee + it.skip('Delete Standard Data Source', () => { + dataSourcePage.goToStandardDataSources(); + dataSourcePage.deleteDataSourceFromPage(standardDataSourceNameEdit); + dataSourcePage.goToStandardDataSources(); + cy.get('main').find('span').contains(standardDataSourceNameEdit).should('not.exist'); + }); +}); diff --git a/cypress/cypress/integration/advanceAnalyticsExtractTests.ts b/cypress/cypress/integration/advanceAnalyticsExtractTests.ts new file mode 100644 index 0000000..4e7b740 --- /dev/null +++ b/cypress/cypress/integration/advanceAnalyticsExtractTests.ts @@ -0,0 +1,111 @@ +import * as dayjs from 'dayjs'; +import advancedAnalyticsExtractPage from '../pageObjects/advancedAnalyticsExtractPageObject'; +const extractPage = new advancedAnalyticsExtractPage(); +const extractAdminName = `Cypress_Test_Extract_Admin_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const extractNonAdminName = `Cypress_Test_Extract_Non_Aadmin_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const extractAdminEditName = `Cypress_Test_Extract_Admin_Edit_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const extractNonAdminEditName = `Cypress_Test_Extract_Non_Admin_Edit_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const extractShareName = `Cypress_Test_Extract_Share_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const extractShareNoAccessName = `Cypress_Test_Extract_Share_No_Access_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const extractScheduleName = `Cypress_Test_Extract_Shedulee_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const extractDescription = 'Test extract made in Cypress - CRUD'; +const extractEditDescription = 'Test extract made in Cypress - CRUD - edit'; +const extractShareDescription = 'Test extract made in Cypress - Share'; +const extractScheduleDescription = 'Test extract made in Cypress - Schedule'; + +before(() => { + cy.vaultLoginByUserTitle('obAdmin'); +}); + +beforeEach(() => { + cy.visit('/extracts'); +}); + +after(() => { + cy.switchUser('IDTestUser'); + cy.visit('/extracts'); + cy.deleteExtract(extractAdminName); + cy.deleteExtract(extractNonAdminName); + cy.deleteExtract(extractAdminEditName); + cy.deleteExtract(extractNonAdminEditName); + cy.deleteExtract(extractShareName); + cy.deleteExtract(extractShareNoAccessName); + cy.deleteExtract(extractScheduleName); +}); + +describe('Advanced Analytics extract CRUD tests', () => { + it('Non-admin users can create extracts', () => { + extractPage.addNewExtract(extractNonAdminName, 'Encounter Summary', extractDescription); + cy.visit('/extracts'); + cy.findByText(extractNonAdminName).should('exist'); + }); + + it('Non-admin users can edit extracts', () => { + extractPage.editExtract(extractNonAdminName, extractNonAdminEditName, extractEditDescription); + cy.findByText(extractNonAdminEditName).should('exist'); + cy.findByText(extractNonAdminName).should('not.exist'); + }); + + it('Non-admin users can delete extracts', () => { + extractPage.deleteExtract(extractNonAdminEditName); + cy.findByText('Extracts').should('be.visible'); + cy.findByText(extractNonAdminEditName).should('not.exist'); + }); + + it('Admin users can create extracts', () => { + cy.switchUser('IDTestUser'); + cy.visit('/extracts'); + extractPage.addNewCustomExtract(extractAdminName, extractDescription); + cy.findByText(extractAdminName).should('exist'); + }); + + it('Admin users can edit extracts', () => { + extractPage.editExtract(extractAdminName, extractAdminEditName, extractEditDescription); + cy.findByText(extractAdminEditName).should('exist'); + cy.findByText(extractAdminName).should('not.exist'); + }); + + it('Admin users can delete extracts', () => { + extractPage.deleteExtract(extractAdminEditName); + cy.findByText('Extracts').should('be.visible'); + cy.findByText(extractAdminEditName).should('not.exist'); + }); +}); + +describe('Advanced Analytics extract tests', () => { + it('Users can share extracts', () => { + extractPage.addNewCustomExtract(extractShareName, extractShareDescription); + cy.visit('/extracts'); + cy.findByText(extractShareName).should('exist'); + extractPage.shareExtract(extractShareName, 'Capital - System Administrator'); + cy.visit('/extracts'); + extractPage.addNewCustomExtract(extractShareNoAccessName, extractShareDescription); + cy.logout(); + cy.vaultLoginByUserTitle('Capital Administrator'); + cy.visit('/extracts'); + cy.findByText(extractShareName).should('exist'); + cy.findByText(extractShareNoAccessName).should('not.exist'); + }); + + // Waiting on Jon's fix + it.skip('Scheduling an extract will create an entry in the UI', () => { + cy.switchUser('IDTestUser'); + cy.visit('/extracts'); + cy.addExtract(extractScheduleName, extractScheduleDescription, 'Encounter Summary'); + extractPage.scheduleExtract(extractScheduleName, '2:35 A', 'Daily'); + cy.findByText('Daily at 2:35 AM').should('exist'); + }); + + // Waiting on Jon's fix + it.skip('User can enable and disable a schedule', () => { + cy.goToExtract(extractScheduleName); + extractPage.selectMenuOption('Schedule'); + cy.get('.ant-switch').click(); + cy.get('.ant-switch').invoke('attr', 'aria-checked').should('eq', 'true'); + cy.findByText('Daily at 2:35 AM').should('exist'); + + cy.get('.ant-switch').click(); + cy.get('.ant-switch').invoke('attr', 'aria-checked').should('eq', 'false'); + cy.findByText('Daily at 2:35 AM').should('exist'); + }); +}); diff --git a/cypress/cypress/integration/advanceAnalyticsFilterTests.ts b/cypress/cypress/integration/advanceAnalyticsFilterTests.ts new file mode 100644 index 0000000..e2acde1 --- /dev/null +++ b/cypress/cypress/integration/advanceAnalyticsFilterTests.ts @@ -0,0 +1,433 @@ +import * as dayjs from 'dayjs'; +import advancedAnalyticsPage from '../pageObjects/advancedAnalyticsPageObject'; +const advPage = new advancedAnalyticsPage(); +const workbookName = `Cypress_Test_Workbook_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const workbookDescription = 'Test workbook made in Cypress'; +const dataSourceName = `Cypress_Test_Data_Source_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const dataSourceName2 = `Cypress_Test_Data_Source2_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const dataSourceNameNoAccess = `Cypress_Test_Data_Source_NoAccess_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const datamartDescription = 'Test datamart made in Cypress'; +const dssPatientEncounter = '55370'; +const generalLedgerAndStaffing = '55426'; + +before(() => { + cy.vaultLoginByUserTitle('IDTestUser'); + cy.createDataSource(dataSourceName, datamartDescription); + cy.addTableToDataSource(dssPatientEncounter, dataSourceName); + cy.addUserToDataSource(dataSourceName, 'obadmin', 'viewer'); + cy.createDataSource(dataSourceName2, datamartDescription); + cy.addTableToDataSource(generalLedgerAndStaffing, dataSourceName2); + cy.addUserToDataSource(dataSourceName2, 'obadmin', 'viewer'); + cy.createDataSource(dataSourceNameNoAccess, datamartDescription); + cy.addTableToDataSource(dssPatientEncounter, dataSourceNameNoAccess); + + cy.logout(); + cy.vaultLogin(true); + cy.addWorkbook(workbookName, workbookDescription, 'Encounter Summary'); + cy.goToWorkbook(workbookName); + cy.wait(2000); + advPage.addDashboard(); + cy.findByText('Save').click(); + cy.wait(500); +}); + +beforeEach(() => { + cy.goToWorkbook(workbookName); +}); + +after(() => { + cy.logout(); + cy.vaultLoginByUserTitle('IDTestUser'); + cy.deleteDataSource(dataSourceName); + cy.deleteDataSource(dataSourceName2); + cy.deleteDataSource(dataSourceNameNoAccess); + + cy.logout(); + cy.vaultLogin(true); + cy.deleteWorkbook(workbookName); + cy.visit('/'); +}); + +describe('Advanced Analytics widget filter tests', () => { + it('Calendar Date Time options are correctly disabled', () => { + advPage.addVisualizationWidget(); + advPage.addwidgetFilter('Admit Date', 'Calendar Date Time'); + advPage.openEditFilter('Admit Date - Calendar Date Time'); + cy.wait(2000); + cy.get('.ant-popover-content').find('.ant-select-selector').click(); + cy.get('.rc-virtual-list-holder-inner').findByText('Fiscal Year').click(); + cy.findByText('Time Frame') + .prev() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).not.to.contains('disabled'); + }); + cy.findByText('Time Frame') + .parent() + .next() + .findByText('Calendar') + .prev() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).to.contains('disabled'); + }); + cy.findByText('List') + .prev() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).not.to.contains('disabled'); + }); + + cy.get('.ant-popover-content').find('.ant-select-selector').click(); + cy.get('.rc-virtual-list-holder-inner').findByText('Fiscal Quarter').click(); + cy.findByText('Time Frame') + .prev() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).not.to.contains('disabled'); + }); + cy.findByText('Time Frame') + .parent() + .next() + .findByText('Calendar') + .prev() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).to.contains('disabled'); + }); + cy.findByText('List') + .prev() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).not.to.contains('disabled'); + }); + + cy.get('.ant-popover-content').find('.ant-select-selector').click(); + cy.get('.rc-virtual-list-holder-inner').findByText('Calendar Year').click(); + cy.findByText('Time Frame') + .prev() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).not.to.contains('disabled'); + }); + cy.findByText('Time Frame') + .parent() + .next() + .findByText('Calendar') + .prev() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).not.to.contains('disabled'); + }); + cy.findByText('List') + .prev() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).not.to.contains('disabled'); + }); + + cy.get('.ant-popover-content').find('.ant-select-selector').click(); + cy.get('.rc-virtual-list-holder-inner').findByText('Month').click(); + cy.findByText('Time Frame') + .prev() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).not.to.contains('disabled'); + }); + cy.findByText('Time Frame') + .parent() + .next() + .findByText('Calendar') + .prev() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).not.to.contains('disabled'); + }); + cy.findByText('List') + .prev() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).not.to.contains('disabled'); + }); + + cy.get('.ant-popover-content').find('.ant-select-selector').click(); + cy.get('.rc-virtual-list-holder-inner').findByText('Day').click(); + cy.findByText('Time Frame') + .prev() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).not.to.contains('disabled'); + }); + cy.findByText('Time Frame') + .parent() + .next() + .findByText('Calendar') + .prev() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).not.to.contains('disabled'); + }); + cy.findByText('List') + .prev() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).to.contains('disabled'); + }); + + cy.get('.ant-popover-content').findByText('Cancel').click(); + cy.wait(500); + }); + + it('And/Or selection works correctly', () => { + advPage.addVisualizationWidget(); + advPage.addwidgetFilter('Age', 'Age'); + advPage.openEditFilter('Age - Age'); + cy.findByText('Conditions').click(); + cy.findByText('Add Condition').click(); + cy.findByText('And').click(); + cy.findByText('Add Condition').parent().parent().parent().siblings().last().contains('And').should('exist'); + cy.findByText('Add Condition').parent().parent().parent().siblings().last().contains('Or').should('not.exist'); + + cy.findByText('Or').click(); + cy.findByText('Add Condition').parent().parent().parent().siblings().last().contains('Or').should('exist'); + cy.findByText('Add Condition').parent().parent().parent().siblings().last().contains('And').should('not.exist'); + }); + + it('Not In shows up correctly', () => { + advPage.addVisualizationWidget(); + advPage.addwidgetFilter('Age', 'Rollup'); + advPage.openEditFilter('Age - Rollup'); + cy.get('.tempo-action-bar__filters').find('input[type="checkbox"]').click(); + cy.findByText('0-17').click(); + cy.findByText('Apply').click(); + + cy.get('.filters-bar__item').should('contain', 'Not In: 0-17'); + }); + + it('Filter can be renamed', () => { + advPage.addVisualizationWidget(); + advPage.addwidgetFilter('Age', 'Rollup'); + advPage.editFilterName('Age - Rollup', 'Updated Filter Name'); + cy.findByText('Updated Filter Name:').should('exist'); + }); + + it('Custom date filters', () => { + const filterAttribute = 'Calendar Date Time'; + advPage.addVisualizationWidget(); + advPage.addwidgetFilter('Admit Date', filterAttribute); + advPage.openEditFilter(`Admit Date - ${filterAttribute}`); + cy.get('.ant-popover-content').find('.ant-select-selector').click(); + cy.get('.rc-virtual-list-holder-inner').findByText('Fiscal Year').click(); + cy.findByText('Custom').click(); + cy.findByText('Custom').parentsUntil('.tempo-spacing.tempo-spacing--col').last().next().find('input').click(); + cy.findByText('This + Previous Fiscal Years').click(); + cy.findByText('This + Previous').parent().next().clear().type('3'); + cy.findByText('Apply').click(); + cy.get('.filters-bar__item').contains(`${filterAttribute}: Custom`).should('exist'); + advPage.openEditFilter(`Admit Date - ${filterAttribute}`); + cy.findByText('This + Previous').parent().next().should('have.value', '3'); + }); + + it('Fiscal Year/Quarter filters are filtered to -10 and +8 years in a visualization widget', () => { + const tooEarlyYear = parseInt(dayjs().format('YYYY')) - 11; + const earliestYear = parseInt(dayjs().format('YYYY')) - 10; + const latestYear = parseInt(dayjs().format('YYYY')) + 8; + const toolateYear = parseInt(dayjs().format('YYYY')) + 9; + + advPage.addVisualizationWidget(); + advPage.addwidgetFilter('Admit Date', 'Calendar Date Time'); + advPage.openEditFilter('Admit Date - Calendar Date Time'); + + cy.get('.ant-popover-content').find('.ant-select.ant-select-single.ant-select-show-arrow').click(); + cy.findByText('Fiscal Year').click(); + cy.findByText('List').click(); + cy.findByText('This Fiscal Year').should('not.exist'); + cy.get('.ant-spin.ant-spin-spinning', { timeout: 10000 }).should('exist'); + cy.get('.ant-spin.ant-spin-spinning', { timeout: 10000 }).should('not.exist'); + cy.get('.ant-popover-content').find('.p-datatable-scrollable-body-table').should('exist'); + + cy.get('.tempo-datacell').contains(`FY${earliestYear}`).should('exist'); + cy.get('.tempo-datacell').contains(`FY${tooEarlyYear}`).should('not.exist'); + //This is commented out until data past 2026 is available + //cy.get('.tempo-datacell').contains(`FY${latestYear}`).should('exist'); + cy.get('.tempo-datacell').contains(`FY${toolateYear}`).should('not.exist'); + + cy.get('.ant-popover-content').find('.ant-select.ant-select-single.ant-select-show-arrow').click(); + cy.findByText('Fiscal Quarter').click(); + + cy.get('.tempo-datacell').contains(`FY${earliestYear} Q1`).should('exist'); + cy.get('.tempo-datacell').contains(`FY${tooEarlyYear} Q4`).should('not.exist'); + //This is commented out until data past 2026 is available + //cy.get('.tempo-datacell').contains(`FY${latestYear} Q4`).should('exist'); + cy.get('.tempo-datacell').contains(`FY${toolateYear} Q1`).should('not.exist'); + }); + + it('Fiscal Year/Quarter filters are filtered to -10 and +8 years in a data sheet', () => { + const tooEarlyYear = parseInt(dayjs().format('YYYY')) - 11; + const earliestYear = parseInt(dayjs().format('YYYY')) - 10; + const latestYear = parseInt(dayjs().format('YYYY')) + 8; + const toolateYear = parseInt(dayjs().format('YYYY')) + 9; + + advPage.addDataAnlysisSheet(); + advPage.addwidgetFilter('Admit Date', 'Calendar Date Time'); + advPage.openEditFilter('Admit Date - Calendar Date Time'); + + cy.get('.ant-popover-content').find('.ant-select.ant-select-single.ant-select-show-arrow').click(); + cy.findByText('Fiscal Year').click(); + cy.findByText('List').click(); + cy.findByText('This Fiscal Year').should('not.exist'); + cy.get('.ant-spin.ant-spin-spinning', { timeout: 10000 }).should('exist'); + cy.get('.ant-spin.ant-spin-spinning', { timeout: 10000 }).should('not.exist'); + cy.get('.ant-popover-content').find('.p-datatable-scrollable-body-table').should('exist'); + + cy.get('.tempo-datacell').contains(`FY${earliestYear}`).should('exist'); + cy.get('.tempo-datacell').contains(`FY${tooEarlyYear}`).should('not.exist'); + //This is commented out until data past 2026 is available + //cy.get('.tempo-datacell').contains(`FY${latestYear}`).should('exist'); + cy.get('.tempo-datacell').contains(`FY${toolateYear}`).should('not.exist'); + + cy.get('.ant-popover-content').find('.ant-select.ant-select-single.ant-select-show-arrow').click(); + cy.findByText('Fiscal Quarter').click(); + + cy.get('.tempo-datacell').contains(`FY${earliestYear} Q1`).should('exist'); + cy.get('.tempo-datacell').contains(`FY${tooEarlyYear} Q4`).should('not.exist'); + //This is commented out until data past 2026 is available + //cy.get('.tempo-datacell').contains(`FY${latestYear} Q4`).should('exist'); + cy.get('.tempo-datacell').contains(`FY${toolateYear} Q1`).should('not.exist'); + }); + + // JAZZ-58142 + it.skip('Create filter by custom list option', () => { + advPage.addDataAnlysisSheet(); + advPage.addwidgetFilter('Admit Date', 'Calendar Month'); + advPage.openEditFilter('Admit Date - Calendar Month'); + cy.findByText('Custom List').click(); + cy.findByText('Upload List', { timeout: 5000 }).should('exist'); + cy.get('#list').type('5, 6, 7, 9, 10'); + cy.findByText('Apply').click(); + cy.findByText('Configure').should('not.exist'); + cy.wait(5000); + + advPage.dragAndDropArea('Admit Date', 'Calendar Month', 'Rows'); + advPage.dragAndDropArea('Measures', 'Account Balance', 'Columns'); + + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view', { timeout: 5000 }).find('.p-treetable-row.p-treetable-row--child').contains('5').should('exist'); + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view', { timeout: 5000 }).find('.p-treetable-row.p-treetable-row--child').contains('6').should('exist'); + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view', { timeout: 5000 }).find('.p-treetable-row.p-treetable-row--child').contains('7').should('exist'); + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view', { timeout: 5000 }).find('.p-treetable-row.p-treetable-row--child').contains('9').should('exist'); + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view', { timeout: 5000 }).find('.p-treetable-row.p-treetable-row--child').contains('10').should('exist'); + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view', { timeout: 5000 }).find('.p-treetable-row.p-treetable-row--child').contains('4').should('not.exist'); + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view', { timeout: 5000 }).find('.p-treetable-row.p-treetable-row--child').contains('8').should('not.exist'); + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view', { timeout: 5000 }).find('.p-treetable-row.p-treetable-row--child').contains('11').should('not.exist'); + }); + + // JAZZ-58142 + it.skip('New list filter option overwrites the old selection', () => { + advPage.addDataAnlysisSheet(); + advPage.addwidgetFilter('Admit Date', 'Calendar Month'); + advPage.openEditFilter('Admit Date - Calendar Month'); + cy.findByText('Custom List').click(); + cy.findByText('Upload List', { timeout: 5000 }).should('exist'); + cy.get('#list').type('5, 6, 7, 9, 10'); + cy.findByText('Apply').click(); + cy.findByText('Configure').should('not.exist'); + cy.wait(5000); + + advPage.setFilterValue('Admit Date - Calendar Month', '8'); + cy.wait(5000); + + advPage.dragAndDropArea('Admit Date', 'Calendar Month', 'Rows'); + advPage.dragAndDropArea('Measures', 'Account Balance', 'Columns'); + + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view').find('.p-treetable-row.p-treetable-row--child').contains('8').should('exist'); + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view').find('.p-treetable-row.p-treetable-row--child').contains('5').should('not.exist'); + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view').find('.p-treetable-row.p-treetable-row--child').contains('6').should('not.exist'); + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view').find('.p-treetable-row.p-treetable-row--child').contains('7').should('not.exist'); + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view').find('.p-treetable-row.p-treetable-row--child').contains('9').should('not.exist'); + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view').find('.p-treetable-row.p-treetable-row--child').contains('10').should('not.exist'); + + advPage.openEditFilter('Admit Date - Calendar Month'); + cy.findByText('Custom List').click(); + cy.findByText('Upload List', { timeout: 5000 }).should('exist'); + cy.get('#list').type('11\n12'); + cy.findByText('Apply').click(); + cy.findByText('Configure').should('not.exist'); + cy.wait(5000); + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view').find('.p-treetable-row.p-treetable-row--child').contains('11').should('exist'); + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view').find('.p-treetable-row.p-treetable-row--child').contains('12').should('exist'); + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view').find('.p-treetable-row.p-treetable-row--child').contains('8').should('not.exist'); + }); +}); + +describe('Advanced Analytics dashboard filter tests', () => { + it('Dashboard filter can have datamart changed', () => { + cy.findByText('Add Filter').click(); + cy.findByText('Admit Date').should('exist'); + cy.findByText('Charge Code').should('not.exist'); + + advPage.setCurrentDashboardFilterDataSource(dataSourceName2); + cy.findByText('Charge Code').should('exist'); + cy.findByText('Admit Date').should('not.exist'); + }); + + it('User cannot select a datamart they do not have access to', () => { + cy.findByText('Add Filter').click(); + cy.findByTitle('Dimensions').parent().find('.ant-tree-switcher.ant-tree-switcher_open', { timeout: 10000 }).should('exist'); + cy.findByText('Data Source').parent().next().click(); + cy.findByText(dataSourceName).should('exist'); + cy.findByText(dataSourceNameNoAccess).should('not.exist'); + }); + + it('User cannot add multiple filters of the same attribute', () => { + advPage.addDashboardFilter('Admit Date', 'Calendar Month'); + advPage.addDashboardFilter('Admit Date', 'Calendar Month'); + cy.wait(1000); + cy.get('.ant-popover-content').findByText('Add').should('exist'); + cy.get('.filters-bar__item').should('have.length', 1); + }); + + it('User can edit filters in present mode', () => { + advPage.addDashboardFilter('Admit Date', 'Calendar Month'); + advPage.setDashboardFilter('Admit Date - Calendar Month', '1'); + cy.findByText('Save').click(); + cy.findByText('Saved').should('exist'); + cy.findByText('Present').click(); + cy.findByText('Exit').should('exist'); + advPage.setDashboardFilter('Admit Date - Calendar Month', '2'); + cy.findByText('Exit').click(); + cy.findByText('Save').should('exist'); + }); + + it('Fiscal Year/Quarter filters are filtered to -10 and +8 years in dashboard filter', () => { + const tooEarlyYear = parseInt(dayjs().format('YYYY')) - 11; + const earliestYear = parseInt(dayjs().format('YYYY')) - 10; + const latestYear = parseInt(dayjs().format('YYYY')) + 8; + const toolateYear = parseInt(dayjs().format('YYYY')) + 9; + + advPage.addDashboardFilter('Admit Date', 'Calendar Date Time'); + cy.findByText('Admit Date - Calendar Date Time:').click(); + + cy.get('.ant-popover-content').find('.ant-select.ant-select-single.ant-select-show-arrow').click(); + cy.findByText('Fiscal Year').click(); + cy.findByText('List').click(); + cy.findByText('This Fiscal Year').should('not.exist'); + cy.get('.ant-spin.ant-spin-spinning', { timeout: 10000 }).should('exist'); + cy.get('.ant-spin.ant-spin-spinning', { timeout: 10000 }).should('not.exist'); + cy.get('.ant-popover-content').find('.p-datatable-scrollable-body-table').should('exist'); + + cy.get('.tempo-datacell').contains(`FY${earliestYear}`).should('exist'); + cy.get('.tempo-datacell').contains(`FY${tooEarlyYear}`).should('not.exist'); + //This is commented out until data past 2026 is available + //cy.get('.tempo-datacell').contains(`FY${latestYear}`).should('exist'); + cy.get('.tempo-datacell').contains(`FY${toolateYear}`).should('not.exist'); + + cy.get('.ant-popover-content').find('.ant-select.ant-select-single.ant-select-show-arrow').click(); + cy.findByText('Fiscal Quarter').click(); + + cy.get('.tempo-datacell').contains(`FY${earliestYear} Q1`).should('exist'); + cy.get('.tempo-datacell').contains(`FY${tooEarlyYear} Q4`).should('not.exist'); + //This is commented out until data past 2026 is available + //cy.get('.tempo-datacell').contains(`FY${latestYear} Q4`).should('exist'); + cy.get('.tempo-datacell').contains(`FY${toolateYear} Q1`).should('not.exist'); + }); +}); diff --git a/cypress/cypress/integration/advanceAnalyticsSearchTests.ts b/cypress/cypress/integration/advanceAnalyticsSearchTests.ts new file mode 100644 index 0000000..7b18f44 --- /dev/null +++ b/cypress/cypress/integration/advanceAnalyticsSearchTests.ts @@ -0,0 +1,42 @@ +import * as dayjs from 'dayjs'; +import advancedAnalyticsPage from '../pageObjects/advancedAnalyticsPageObject'; +const advPage = new advancedAnalyticsPage(); +const workbookName = `Cypress_Test_Workbook_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const workbookDescription = 'Test workbook made in Cypress - search tests'; + +before(() => { + cy.vaultLogin(true); + cy.wait(1000); + cy.addWorkbook(workbookName, workbookDescription, 'Encounter Summary'); + cy.visit('/'); + cy.goToWorkbook(workbookName); + advPage.addDashboard(); + cy.findByText('Add Widget').click(); + cy.findByText('Add Visual').click(); + cy.wait(2000); +}); + +after(() => { + cy.deleteWorkbook(workbookName); + cy.visit('/'); +}); + +describe('Advanced Analytics search tests', () => { + it('Clearing search will return to default state', () => { + advPage.expandNode('Account Class', 'open'); + cy.get('div').contains('Account Class Code').should('exist'); + cy.get('div').contains('Account Class Description').should('exist'); + advPage.searchForAttribute('Admit Date'); + advPage.expandNode('Admit Date', 'open'); + cy.wait(500); + cy.get('span[title="Admit Date"]').should('exist'); + cy.get('div').contains('Calendar Date Time').should('exist'); + cy.get('div').contains('Calendar Month').should('exist'); + advPage.clearSearch(); + cy.get('span[title="Admit Date"]').should('exist'); + cy.get('div').contains('Calendar Date Time').should('not.exist'); + cy.get('div').contains('Calendar Month').should('not.exist'); + cy.get('div').contains('Account Class Code').should('not.exist'); + cy.get('div').contains('Account Class Description').should('not.exist'); + }); +}); diff --git a/cypress/cypress/integration/advanceAnalyticsSmokeTests.ts b/cypress/cypress/integration/advanceAnalyticsSmokeTests.ts new file mode 100644 index 0000000..619a9ce --- /dev/null +++ b/cypress/cypress/integration/advanceAnalyticsSmokeTests.ts @@ -0,0 +1,68 @@ +import * as dayjs from 'dayjs'; +import advancedAnalyticsPage from '../pageObjects/advancedAnalyticsPageObject'; +const advPage = new advancedAnalyticsPage(); +const workbookName = `Cypress_Test_Workbook_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const deleteWorkbookName = `dummy_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const workbookDescription = 'Test workbook made in Cypress - smoke tests'; + +before(() => { + cy.vaultLogin(true); +}); + +afterEach(() => { + cy.visit('/'); +}); + +after(() => { + cy.logout(); + cy.vaultLogin(true); + cy.deleteWorkbook(workbookName); + cy.deleteWorkbook(deleteWorkbookName); +}); + +describe('Advanced Analytics smoke tests', () => { + it('Create workbook', () => { + advPage.createWorkbook(workbookName, 'Encounter Summary', workbookDescription); + advPage.addDashboard(); + advPage.addDashboardWidget( + 'Bar', + 'Clustered', + [{ dimensionGroup: 'Account Class', dimensionName: 'Account Class Code' }], + [{ measureGroup: 'Measures', mesureName: 'Account Balance' }], + [{ dimensionsOrMeasures: 'Dimensions', filterAttributeGroup: 'Age', filterAttributeName: 'Rollup', filterAttributeValue: '0-17' }] + ); + advPage.addDataAnalysis([{ dimensionGroup: 'Account Class', dimensionName: 'Account Class Code' }], [{ measureGroup: 'Measures', mesureName: 'Account Balance' }]); + cy.findByText('Save').click(); + cy.findByText('Saved').should('exist'); + }); + + it('Update workbook', () => { + advPage.selectWorkbookFromTable(workbookName); + advPage.openEditWidget('Untitled Visualization'); + advPage.deleteAttributeFromWidget('Account Class - Account Class Code', 'Categories'); + cy.wait(2000); + advPage.addAttributeToWidget('Account Class', 'Account Class Description', 'Dimensions', 'Categories'); + + //Commented out because of JAZZ-58105 + //advPage.setFilterValue('Rollup', '18-64'); + + advPage.saveWidget(); + cy.findByText('Save').click(); + cy.findByText('Saved').should('exist'); + }); + + it('Delete all dashboards', () => { + cy.goToWorkbook(workbookName); + advPage.deleteDashboard('Dashboard'); + advPage.deleteDashboard('Data Sheet'); + cy.findByText('New workbook content available from Add button.').should('exist'); + }); + + it('Delete workbook', () => { + cy.goToWorkbook(workbookName); + advPage.deleteWorkbookFromWorkbook(workbookName); + cy.addWorkbook(deleteWorkbookName, workbookDescription, 'Encounter Summary'); + cy.visit('/'); + advPage.deleteWorkbookFromTable(deleteWorkbookName); + }); +}); diff --git a/cypress/cypress/integration/advanceAnalyticsWidgetTests.ts b/cypress/cypress/integration/advanceAnalyticsWidgetTests.ts new file mode 100644 index 0000000..8597102 --- /dev/null +++ b/cypress/cypress/integration/advanceAnalyticsWidgetTests.ts @@ -0,0 +1,463 @@ +import * as dayjs from 'dayjs'; +import advancedAnalyticsPage from '../pageObjects/advancedAnalyticsPageObject'; +const advPage = new advancedAnalyticsPage(); +const workbookName = `Cypress_Test_Workbook_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const workbookName2 = `Cypress_Test_Workbook2_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const workbookName3 = `Cypress_Test_Workbook3_Crossout_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const dataSourceName = `Cypress_Test_Data_Source_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const dataSourceName2 = `Cypress_Test_Data_Source_For_Crossout_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const workbookDescription = 'Test workbook made in Cypress - widget tests'; +const workbookDescription2 = 'Test workbook made in Cypress - widget tests - crossout'; +const dataSourceDescription = 'Test data source made in Cypress - widget tests'; +const dataSourceDescription2 = 'Test data source made in Cypress - widget tests - crossout'; +const dssPatientEncounter = '55370'; +const generalLedgerAndStaffing = '55426'; +const formula = 'sum([Actual Dollars])*0+0.1234567'; + +before(() => { + cy.vaultLoginByUserTitle('IDTestUser'); + cy.createDataSource(dataSourceName, dataSourceDescription); + cy.createDataSource(dataSourceName2, dataSourceDescription2); + cy.addTableToDataSource(generalLedgerAndStaffing, dataSourceName); + cy.addTableToDataSource(generalLedgerAndStaffing, dataSourceName2); + cy.addTableToDataSource(dssPatientEncounter, dataSourceName2); + cy.addUserToDataSource(dataSourceName, 'obadmin', 'viewer'); + cy.addUserToDataSource(dataSourceName2, 'obadmin', 'viewer'); + cy.logout(); + + cy.vaultLogin(true); + cy.addWorkbook(workbookName, workbookDescription, 'Encounter Summary'); + cy.addWorkbook(workbookName2, workbookDescription, dataSourceName); + cy.addWorkbook(workbookName3, workbookDescription2, dataSourceName2); + cy.visit('/'); + cy.goToWorkbook(workbookName); + advPage.addDashboard(); + cy.findByText('Add Widget').click(); + cy.findByText('Add Text').click(); + cy.findByText('Ok').click(); + cy.findByText('Save').click(); + cy.findByText('Saved').should('exist'); +}); + +beforeEach(() => { + cy.goToWorkbook(workbookName); + cy.wait(1000); +}); + +after(() => { + cy.logout(); + cy.vaultLoginByUserTitle('IDTestUser'); + cy.deleteDataSource(dataSourceName); + cy.deleteDataSource(dataSourceName2); + cy.logout(); + cy.vaultLogin(true); + cy.deleteWorkbook(workbookName); + cy.deleteWorkbook(workbookName2); + cy.deleteWorkbook(workbookName3); + cy.logout(); + cy.vaultLoginByUserTitle('IDTestUser'); + cy.deleteDataSource(dataSourceName); +}); + +describe('Advanced Analytics text widget tests', () => { + it('Text widget - formatting options', () => { + advPage.editTextWidget(); + //Bold + cy.get('.ql-bold').click(); + cy.get('.ant-modal-content').find('.ql-editor').type('Bold Text\n'); + cy.get('.ql-bold').click(); + + //Italics + cy.get('.ql-italic').click(); + cy.get('.ant-modal-content').find('.ql-editor').type('Italic Text\n'); + cy.get('.ql-italic').click(); + + //Underline + cy.get('.ql-underline').click(); + cy.get('.ant-modal-content').find('.ql-editor').type('Underline Text\n'); + cy.get('.ql-underline').click(); + + //Strikeout + cy.get('.ql-strike').click(); + cy.get('.ant-modal-content').find('.ql-editor').type('Strikeout Text\n'); + cy.get('.ql-strike').click(); + + cy.get('strong').should(($p) => { + expect($p).to.contain('Bold Text'); + }); + cy.get('em').should(($p) => { + expect($p).to.contain('Italic Text'); + }); + cy.get('u').should(($p) => { + expect($p).to.contain('Underline Text'); + }); + cy.get('s').should(($p) => { + expect($p).to.contain('Strikeout Text'); + }); + }); + + it('Text widget - Hyperlink testing', () => { + advPage.editTextWidget(); + const text = 'Hyperlink Text'; + cy.get('.ant-modal-content').find('.ql-editor').type(`${text}\n`); + cy.get('.ant-modal-content').find('.ql-editor').type('{selectall}'); + cy.get('.ql-link').click(); + cy.get('div[class$="ql-editing"]').find('input').type('https://www.google.com'); + cy.get('.ql-action').click(); + cy.wait(1000); + cy.findByText('Ok').click(); + cy.wait(1000); + cy.get('a') + .contains(text) + .invoke('attr', 'href') + .then((classVal) => { + expect(classVal).to.be.equal('https://www.google.com'); + }); + cy.get('a').contains(text).click(); + cy.wait(5000); + cy.location('href').should((loc) => { + expect(loc).contains('https://www.google.com'); + }); + }); +}); + +describe('Advanced Analytics visualization widget tests', () => { + it('Visualization Widget - Each type has the correct options', () => { + cy.findByText('Add Widget').click(); + cy.findByText('Add Visual').click(); + + cy.findByText('Visualization Type').parent().next().click(); + cy.get('.ant-select-item-option-content').contains('Bar').click(); + cy.findByText('Visualization Type').parent().next().next().click(); + cy.get('div[aria-label="Clustered"]').should('exist'); + cy.get('div[aria-label="Stacked"]').should('exist'); + + cy.findByText('Visualization Type').parent().next().click(); + cy.get('.ant-select-item-option-content').contains('Column').click(); + cy.findByText('Visualization Type').parent().next().next().click(); + cy.get('div[aria-label="Clustered"]').should('exist'); + cy.get('div[aria-label="Stacked"]').should('exist'); + + cy.findByText('Visualization Type').parent().next().click(); + cy.get('.ant-select-item-option-content').contains('Line').click(); + cy.findByText('Visualization Type').parent().next().next().should('not.exist'); + + cy.findByText('Visualization Type').parent().next().click(); + cy.get('.ant-select-item-option-content').contains('Pie').click(); + cy.findByText('Visualization Type').parent().next().next().click(); + cy.get('div[aria-label="Donut"]').should('exist'); + cy.get('div[aria-label="Pie"]').should('exist'); + + cy.findByText('Visualization Type').parent().next().click(); + cy.get('.ant-select-item-option-content').contains('Calendar').click(); + cy.findByText('Visualization Type').parent().next().next().should('not.exist'); + + cy.findByText('Visualization Type').parent().next().click(); + cy.get('.ant-select-item-option-content').contains('Metric').click(); + cy.findByText('Visualization Type').parent().next().next().should('not.exist'); + }); + + it('Visualization Widget - create pie chart', () => { + advPage.addDashboardWidget('Pie', 'Pie', [{ dimensionGroup: 'Age', dimensionName: 'Rollup' }], [{ measureGroup: 'Measures', mesureName: 'Net Revenue' }]); + }); + + it('Switching around the legend', () => { + advPage.addDashboardWidgetWithPivots( + 'Bar', + [{ dimensionGroup: 'Age', dimensionName: 'Rollup' }], + [{ measureGroup: 'Measures', mesureName: 'Net Revenue' }], + [{ pivoteGroup: 'Admit Date', pivotName: 'Fiscal Year' }] + ); + advPage.openEditWidget('Untitled Visualization'); + cy.findByText('Design').click(); + + cy.findByText('Positioning').scrollIntoView(); + cy.wait(2000); + cy.findByText('Top').click({ force: true }); + cy.wait(2000); + cy.findByText('Right').click({ force: true }); + cy.wait(2000); + cy.findByText('Bottom').click({ force: true }); + cy.wait(2000); + cy.findByText('Left').click({ force: true }); + cy.wait(2000); + }); + + it('Switching data marts in a widget', () => { + cy.goToWorkbook(workbookName); + advPage.addVisualizationWidget(); + advPage.dragAndDropArea('Account Class', 'Account Class Code', 'Categories'); + advPage.dragAndDropArea('Measures', 'Account Balance', 'Values'); + advPage.clearSearch(); + + //Account Class is in the original data mart and Charge Code is in the one that will be changed to + cy.findByText('Account Class').should('exist'); + cy.findByText('Charge Code').should('not.exist'); + + advPage.switchDataSource(dataSourceName); + + cy.contains('Encounter Summary').should('not.exist'); + cy.contains(dataSourceName).should('exist'); + cy.get('.data-designer__fields').find('div').contains('Account Class Code').should('not.exist'); + cy.get('.data-designer__fields').find('div').contains('Account Balance').should('not.exist'); + + //Charge Code is in the new data mart and Account Class was in the original data mart + cy.findByText('Account Class').should('not.exist'); + cy.findByText('Charge Code').should('exist'); + }); + + // Cross out was taken out + it.skip('Cross out for dimensions and measures in data vizualization widget', () => { + cy.logout(); + cy.vaultLoginByUserTitle('IDTestUser'); + cy.addTableToDataSource(dssPatientEncounter, dataSourceName); + cy.logout(); + cy.vaultLogin(true); + + cy.goToWorkbook(workbookName2); + advPage.addDashboard(); + advPage.addVisualizationWidget(); + + //Categories + advPage.dragAndDropArea('Account Class', 'Account Class Code', 'Categories'); + advPage.searchForAttribute('Actual Dollars'); + cy.get('div') + .contains('Actual Dollars') + .parentsUntil('.ant-tree-treenode.ant-tree-treenode-disabled') + .last() + .parent() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).to.contain('ant-tree-treenode-disabled'); + }); + advPage.clearSearch(); + + //Values + advPage.deleteAttributeFromWidget('Account Class - Account Class Code', 'Categories'); + advPage.dragAndDropArea('Measures', 'Actual Dollars', 'Values'); + advPage.searchForAttribute('Account Class Code'); + cy.get('div') + .contains('Account Class Code') + .parentsUntil('.ant-tree-treenode.ant-tree-treenode-disabled') + .last() + .parent() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).to.contain('ant-tree-treenode-disabled'); + }); + advPage.clearSearch(); + + //Break By + advPage.deleteAttributeFromWidget('Actual Dollars', 'Values'); + advPage.dragAndDropArea('Account Class', 'Account Class Code', 'Break By'); + advPage.searchForAttribute('Actual Dollars'); + cy.get('div') + .contains('Actual Dollars') + .parentsUntil('.ant-tree-treenode.ant-tree-treenode-disabled') + .last() + .parent() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).to.contain('ant-tree-treenode-disabled'); + }); + advPage.clearSearch(); + + //Filters + advPage.deleteAttributeFromWidget('Account Class - Account Class Code', 'Break By'); + advPage.addwidgetFilter('Measures', 'Actual Dollars'); + advPage.searchForAttribute('Account Class Code'); + cy.get('div') + .contains('Account Class Code') + .parentsUntil('.ant-tree-treenode.ant-tree-treenode-disabled') + .last() + .parent() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).to.contain('ant-tree-treenode-disabled'); + }); + advPage.clearSearch(); + }); +}); + +describe('Advanced Analytics data analysis tests', () => { + // Cross out was taken out + it.skip('Cross out for dimensions and measures in data analysis', () => { + cy.goToWorkbook(workbookName3); + advPage.addDataAnlysisSheet(); + + //Rows + advPage.dragAndDropArea('Account Class', 'Account Class Code', 'Rows'); + advPage.searchForAttribute('Actual Dollars'); + cy.get('div') + .contains('Actual Dollars') + .parentsUntil('.ant-tree-treenode.ant-tree-treenode-disabled') + .last() + .parent() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).to.contain('ant-tree-treenode-disabled'); + }); + advPage.clearSearch(); + + //Values + advPage.deleteAttributeFromWidget('Account Class - Account Class Code', 'Rows'); + advPage.dragAndDropArea('Measures', 'Actual Dollars', 'Columns'); + advPage.searchForAttribute('Account Class Code'); + cy.get('div') + .contains('Account Class Code') + .parentsUntil('.ant-tree-treenode.ant-tree-treenode-disabled') + .last() + .parent() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).to.contain('ant-tree-treenode-disabled'); + }); + advPage.clearSearch(); + + //Filters + advPage.deleteAttributeFromWidget('Actual Dollars', 'Columns'); + advPage.addwidgetFilter('Account Class', 'Account Class Code'); + advPage.searchForAttribute('Actual Dollars'); + cy.get('div') + .contains('Actual Dollars') + .parentsUntil('.ant-tree-treenode.ant-tree-treenode-disabled') + .last() + .parent() + .invoke('attr', 'class') + .then((classVal) => { + expect(classVal).to.contain('ant-tree-treenode-disabled'); + }); + advPage.clearSearch(); + }); + + it('Duplicate values', () => { + cy.goToWorkbook(workbookName3); + advPage.addDataAnlysisSheet(); + advPage.dragAndDropArea('Measures', 'Account Balance', 'Columns'); + advPage.duplicateValue('Account Balance', 'Account Balance_1'); + + cy.findAllByText('Account Balance_1').should('exist'); + }); + + it('Test decimal places in data sheets', () => { + cy.goToWorkbook(workbookName3); + advPage.addDataAnlysisSheet(); + advPage.dragAndDropArea('Account Class', 'Account Class Code', 'Rows'); + + advPage.addDataSheetCustomCalculatedValue('test', null, formula); + advPage.addDataSheetCustomCalculatedValue('test 2', 'Number (2 Decimals)', formula); + advPage.addDataSheetCustomCalculatedValue('test 3', 'Number (4 Decimals)', formula); + + cy.findByText('0.12', { timeout: 10000 }).should('exist'); + cy.findByText('0.1235', { timeout: 10000 }).should('exist'); + }); + + it('Measures can be added to multiple groups when they exist', () => { + advPage.addDataAnlysisSheet(); + advPage.addNewDataSheetGroup(); + + advPage.addNewDataSheetGroup(); + + advPage.dragAndDropArea('Measures', 'Account Balance', 'Columns'); + advPage.dragAndDropArea('Measures', 'Birth Weight', 'Columns', 1); + + cy.get('.fields').eq(1).findByText('Account Balance').should('exist'); + cy.get('.fields').eq(2).findByText('Birth Weight').should('exist'); + + advPage.deleteNumberedDataSheetGroup(2); + + cy.get('.fields').eq(1).findByText('Account Balance').should('exist'); + cy.get('.fields').eq(2).findByText('Birth Weight').should('not.exist'); + }); + + it('Test disabling auto refresh', () => { + cy.goToWorkbook(workbookName); + advPage.addDataAnlysisSheet(); + //cy.findByText('Turn on Auto Refresh to see current data').should('not.exist'); + + cy.findByText('Auto Refresh').click(); + //cy.findByText('Turn on Auto Refresh to see current data').should('exist'); + + advPage.dragAndDropArea('Account Class', 'Account Class Code', 'Rows'); + advPage.dragAndDropArea('Measures', 'Account Balance', 'Columns'); + + cy.get('.p-treetable-scrollable-wrapper').children().eq(0).findByText('Auto Refresh Disabled').should('exist'); + cy.get('.p-treetable-scrollable-wrapper').children().eq(1).findByText('Auto Refresh Disabled').should('exist'); + cy.get('.p-treetable-scrollable-wrapper').children().eq(0).find('.p-treetable-scrollable-header').findByText('Account Class Code').should('not.exist'); + cy.get('.p-treetable-scrollable-wrapper').children().eq(1).find('.p-treetable-scrollable-header').findByText('Account Balance').should('exist'); + + cy.findByText('Auto Refresh').click(); + cy.get('ant-spin.ant-spin-spinning', { timeout: 10000 }).should('not.exist'); + cy.get('.p-treetable-scrollable-view.p-treetable-frozen-view').find('.p-treetable-tbody').findByText('0'); + cy.get('.p-treetable-scrollable-view.p-treetable-unfrozen-view').find('.p-treetable-tbody').findByText('28,375,615'); + }); + + it('Calculated values cannot be saved without all fields filled in', () => { + cy.goToWorkbook(workbookName3); + advPage.addDataAnlysisSheet(); + + cy.findByText('Columns').parentsUntil('.fields-column-header').last().next().click(); + cy.findByText('Add Calculation').click(); + cy.get('#name').should('be.visible'); + + cy.get('.calculated-value-editor').find('textarea').type(formula, { force: true }).wait(1000); + cy.findByText('Apply').click({ force: true }); + cy.findByTitle('Name').parent().next().findByText('Required').should('exist'); + cy.findByTitle('Calculation').parent().next().findByText('Required').should('not.exist'); + + cy.findByText('Cancel').click(); + cy.findByText('Cancel').should('not.exist'); + }); + + it('Creating a filter in a calculation with multiple tables', () => { + cy.goToWorkbook(workbookName2); + advPage.addDataAnlysisSheet(); + advPage.dragAndDropArea('Account', 'Account Code', 'Rows'); + + advPage.addDataSheetCustomCalculatedValue('test', null, formula); + advPage.editValue('test', null, null, 'sum([Net Revenue]) - sum([Fixed Direct Cost]) + sum([Account Balance])'); + advPage.openCalculatedValue('test'); + advPage.addCalculationFilter('Account Class', 'Account Class Code'); + + cy.findByText('Apply').click({ force: true }); + cy.get('.ant-modal-title').contains('test').should('not.exist'); + }); + + it('Target moving an attribute into a column and row', () => { + cy.goToWorkbook(workbookName); + advPage.addDataAnlysisSheet(); + cy.findByText('Auto Refresh').click(); + advPage.dragAndDropArea('Account Class', 'Account Class Code', 'Rows'); + advPage.dragAndDropArea('Measures', 'Account Balance', 'Columns'); + + advPage.dragAndDropAreaToPosition('Account Class', 'Account Class', 'Rows', 0); + advPage.dragAndDropAreaToPosition('Account Class', 'Account Class Description', 'Rows', 1); + advPage.dragAndDropAreaToPosition('Measures', 'Date Of Birth', 'Columns', 0); + + cy.wait(3000); + //Tests the Expand To dropdown + cy.findByText('Expand To').parent().parent().click(); + cy.get('.rc-virtual-list-holder-inner').children().first().invoke('attr', 'title').should('eq', 'Account Class - Account Class'); + cy.get('.rc-virtual-list-holder-inner').children().eq(1).invoke('attr', 'title').should('eq', 'Account Class - Account Class Description'); + cy.get('.rc-virtual-list-holder-inner').children().last().invoke('attr', 'title').should('eq', 'Account Class - Account Class Code'); + + //Checks the rows + cy.findAllByText('Rows').eq(0).parentsUntil('.fields').last().next().find('.sortable-list').children().first().findByText('Account Class - Account Class'); + cy.findAllByText('Rows').eq(0).parentsUntil('.fields').last().next().find('.sortable-list').children().eq(1).findByText('Account Class - Account Class Description'); + cy.findAllByText('Rows').eq(0).parentsUntil('.fields').last().next().find('.sortable-list').children().last().findByText('Account Class - Account Class Code'); + + //Checks the columns + cy.findAllByText('Columns').eq(0).parentsUntil('.fields').last().next().find('.sortable-list').children().first().findByText('Date Of Birth'); + cy.findAllByText('Columns').eq(0).parentsUntil('.fields').last().next().find('.sortable-list').children().last().findByText('Account Balance'); + }); + + it('Column groups can be duplicated', () => { + cy.goToWorkbook(workbookName); + advPage.addDataAnlysisSheet(); + advPage.dragAndDropArea('Measures', 'Account Balance', 'Columns'); + advPage.addDataSheetCustomCalculatedValueToNumberedGroup(1, 'test', null, 'sum([Net Revenue]) - sum([Fixed Direct Cost]) + sum([Account Balance])'); + + advPage.DuplicateGroup(1); + cy.findAllByText('Columns').should('have.length', 2); + }); +}); diff --git a/cypress/cypress/integration/advanceAnalyticsWorkbookSecurityTests.ts b/cypress/cypress/integration/advanceAnalyticsWorkbookSecurityTests.ts new file mode 100644 index 0000000..41e8338 --- /dev/null +++ b/cypress/cypress/integration/advanceAnalyticsWorkbookSecurityTests.ts @@ -0,0 +1,82 @@ +import * as dayjs from 'dayjs'; +import advancedAnalyticsPage from '../pageObjects/advancedAnalyticsPageObject'; +const advPage = new advancedAnalyticsPage(); +const workbookNameOb = `Cypress_Test_OB_Workbook_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const workbookNameObShareViewer = `Cypress_Test_OB_Share_Viewer_Workbook_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const workbookNameObShareEditor = `Cypress_Test_OB_Share_Editor_Workbook_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const workbookNameCap = `Cypress_Test_Cap_Workbook_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const workbookDescription = 'Test workbook made in Cypress - workbook security tests'; + +before(() => { + cy.vaultLogin(true); + cy.addWorkbook(workbookNameOb, workbookDescription, 'Encounter Summary'); + cy.addWorkbook(workbookNameObShareViewer, workbookDescription, 'Encounter Summary'); + cy.addUserToWorkbook(workbookNameObShareViewer, 'capadmin', 'viewer'); + cy.addWorkbook(workbookNameObShareEditor, workbookDescription, 'Encounter Summary'); + cy.addUserToWorkbook(workbookNameObShareEditor, 'capadmin', 'editor'); +}); + +after(() => { + cy.logout(); + cy.vaultLogin(true); + cy.deleteWorkbook(workbookNameOb); + cy.deleteWorkbook(workbookNameObShareViewer); + cy.deleteWorkbook(workbookNameObShareEditor); + cy.logout(); + cy.vaultLoginByUserTitle('Capital Administrator'); + cy.deleteWorkbook(workbookNameCap); +}); + +describe('Advanced Analytics workbook security tests', () => { + it('Users see the correct workbooks', () => { + cy.logout(); + cy.vaultLoginByUserTitle('Capital Administrator'); + cy.addWorkbook(workbookNameCap, workbookDescription, 'Encounter Summary'); + cy.visit('/'); + cy.findByText('Created by Me').click(); + + cy.get('main').find('span').contains(workbookNameCap).should('exist'); + cy.get('main').find('span').contains(workbookNameOb).should('not.exist'); + cy.get('main').find('span').contains(workbookNameObShareViewer).should('not.exist'); + cy.get('main').find('span').contains(workbookNameObShareEditor).should('not.exist'); + + cy.findByText('Shared with Me').click(); + + cy.get('main').find('span').contains(workbookNameCap).should('not.exist'); + cy.get('main').find('span').contains(workbookNameOb).should('not.exist'); + cy.get('main').find('span').contains(workbookNameObShareViewer).should('exist'); + cy.get('main').find('span').contains(workbookNameObShareEditor).should('exist'); + + cy.goToWorkbook(workbookNameObShareEditor); + cy.findByText('Add').should('exist'); + advPage.openWorkbookKabob(workbookNameObShareEditor); + cy.findByText('Edit').should('exist'); + cy.findByText('Open in a New Tab').should('exist'); + cy.findByText('Share').should('exist'); + cy.findByText('Delete').should('exist'); + + cy.goToWorkbook(workbookNameObShareViewer); + cy.findByText('Add').should('not.exist'); + advPage.openWorkbookKabobOneButton(workbookNameObShareViewer); + cy.findByText('Edit').should('not.be.visible'); + cy.findByText('Open in a New Tab').should('exist'); + cy.findByText('Share').should('not.be.visible'); + cy.findByText('Delete').should('not.be.visible'); + + cy.logout(); + cy.vaultLogin(true); + cy.findByText('Created by Me').click(); + + cy.get('main').find('span').contains(workbookNameCap).should('not.exist'); + cy.get('main').find('span').contains(workbookNameOb).should('exist'); + cy.get('main').find('span').contains(workbookNameObShareViewer).should('exist'); + cy.get('main').find('span').contains(workbookNameObShareEditor).should('exist'); + + cy.findByText('Shared with Me').click(); + + cy.get('main').find('span').contains(workbookNameCap).should('not.exist'); + cy.get('main').find('span').contains(workbookNameOb).should('not.exist'); + cy.get('main').find('span').contains(workbookNameObShareViewer).should('not.exist'); + cy.get('main').find('span').contains(workbookNameObShareEditor).should('not.exist'); + }); +}); diff --git a/cypress/cypress/integration/advanceAnalyticsWorkbookTests.ts b/cypress/cypress/integration/advanceAnalyticsWorkbookTests.ts new file mode 100644 index 0000000..f232383 --- /dev/null +++ b/cypress/cypress/integration/advanceAnalyticsWorkbookTests.ts @@ -0,0 +1,31 @@ +import * as dayjs from 'dayjs'; +import advancedAnalyticsPage from '../pageObjects/advancedAnalyticsPageObject'; +const advPage = new advancedAnalyticsPage(); +const workbookName = `Cypress_Test_Workbook_migrate_adhoc_${dayjs().format('YYYY-MM-DD_HHmmss')}`; +const workbookDescription = 'Test workbook made in Cypress - migrate from ad-hoc'; + +before(() => { + cy.vaultLoginByUserTitle('IDTestUser'); + cy.addWorkbook(workbookName, workbookDescription, 'Encounter Summary'); +}); + +beforeEach(() => { + cy.goToWorkbook(workbookName); +}); + +afterEach(() => { + cy.visit('/'); +}); + +after(() => { + cy.deleteWorkbook(workbookName); +}); + +describe('Advanced Analytics smoke tests', () => { + it('Add from ad-hoc with multiple columns', () => { + advPage.addFromAdHoc('BK Test Migrate'); + + cy.get('.fields').eq(0).findByText('Admit Date - Fiscal Year').should('exist'); + cy.get('.fields').eq(1).findByText('Cases').should('exist'); + }); +}); diff --git a/cypress/cypress/pageObjects/advancedAnalyticsDataSourcePageObject.ts b/cypress/cypress/pageObjects/advancedAnalyticsDataSourcePageObject.ts new file mode 100644 index 0000000..df63519 --- /dev/null +++ b/cypress/cypress/pageObjects/advancedAnalyticsDataSourcePageObject.ts @@ -0,0 +1,89 @@ +export default class advancedAnalyticsPage { + addDataSource = (dataSourceName: string, dataSourceDescription?: string | undefined): void => { + this.goToDataSources(); + cy.findByText('Add Data Source').click(); + this.fillOutDataSourceDetailsForm(dataSourceName, dataSourceDescription); + }; + + addStandardDataSource = (dataSourceName: string, dataSourceDescription?: string | undefined): void => { + this.goToStandardDataSources(); + cy.findByText('Add Standard Data Source').click(); + this.fillOutDataSourceDetailsForm(dataSourceName, dataSourceDescription); + }; + + editDataSource = (oldDataSourceName: string, dataSourceName: string, dataSourceDescription?: string | undefined): void => { + cy.goToDataSource(oldDataSourceName); + cy.get('h1').contains(oldDataSourceName, { timeout: 5000 }).should('exist'); + this.editCurrentDataSource(dataSourceName, dataSourceDescription); + }; + + editStandardDataSource = (oldDataSourceName: string, dataSourceName: string, dataSourceDescription?: string | undefined): void => { + cy.goToStandardDataSource(oldDataSourceName); + cy.get('h1').contains(oldDataSourceName, { timeout: 5000 }).should('exist'); + this.editCurrentDataSource(dataSourceName, dataSourceDescription); + }; + + deleteDataSourceFromPage = (dataSourceName: string): void => { + cy.findByText(dataSourceName).parentsUntil('tr').last().siblings().last().find('span[aria-label="delete"]').click({ force: true }); + cy.get('span').contains(`Permanently delete ${dataSourceName}?`).parentsUntil('.ant-modal-confirm-body-wrapper').last().next().findByText('Delete Data Source').click(); + }; + + deleteStandardDataSourceFromPage = (dataSourceName: string): void => { + cy.findByText(dataSourceName).parentsUntil('tr').last().siblings().last().find('span[aria-label="delete"]').click({ force: true }); + cy.get('span').contains(`Permanently delete ${dataSourceName}?`).parentsUntil('.ant-modal-confirm-body-wrapper').last().next().findByText('Delete Data Source').click(); + }; + + goToDataSources = (): void => { + cy.visit('/datasources'); + }; + + goToStandardDataSources = (): void => { + cy.visit('/standard-datasources'); + }; + + fillOutDataSourceDetailsForm = (dataSourceName: string, dataSourceDescription?: string | undefined): void => { + cy.get('#name').clear(); + cy.get('#name').type(dataSourceName); + if (dataSourceDescription !== undefined) { + cy.get('#description').clear().type(dataSourceDescription); + } + cy.findByText('Apply').click(); + cy.get('#name', { timeout: 5000 }).should('not.exist'); + }; + + openDataSourceEditWindow = (): void => { + cy.get('.tempo-header--extra-wrapper').find('button').first().click(); + cy.findByText('Edit').click(); + }; + + editCurrentDataSource = (dataSourceName: string, dataSourceDescription?: string | undefined): void => { + this.openDataSourceEditWindow(); + this.fillOutDataSourceDetailsForm(dataSourceName, dataSourceDescription); + }; + + addDataTable = (dataTableName: string): void => { + cy.findByText('Add Data Table').click(); + cy.wait(500); + cy.get('.ant-modal-body').find('input').type(dataTableName); + cy.wait(500); + cy.findByText(dataTableName).click(); + cy.findByText('Apply').click(); + }; + + addUsersToDataSource = (dataSourceName: string, userNames: { userName: string }[]): void => { + cy.goToDataSource(dataSourceName); + cy.findByText(dataSourceName).should('exist'); + cy.findByText(dataSourceName).parentsUntil('.tempo-header').next().find('button').first().click(); + cy.findByText('Security').click(); + cy.findByText('Add Users').click(); + cy.wait(2000); + userNames.forEach((username) => { + cy.get('.ant-drawer-body').find('input[type="text"]').type(username.userName); + cy.get('span').contains(username.userName).click(); + cy.get('.ant-drawer-body').find('input[type="text"]').clear(); + }); + cy.findByText('Add').click(); + cy.findByText('Save').click(); + cy.wait(2000); + }; +} diff --git a/cypress/cypress/pageObjects/advancedAnalyticsExtractPageObject.ts b/cypress/cypress/pageObjects/advancedAnalyticsExtractPageObject.ts new file mode 100644 index 0000000..c80c1af --- /dev/null +++ b/cypress/cypress/pageObjects/advancedAnalyticsExtractPageObject.ts @@ -0,0 +1,100 @@ +export default class advancedAnalyticsPage { + addNewExtract = (extractName: string, extractDataSource: string, extractDescription?: string | undefined): void => { + cy.findByText('Add Extract').click(); + cy.get('.ant-dropdown-menu-title-content').contains('Extract').click(); + cy.get('#name').type(extractName); + + if (extractDescription !== undefined) { + cy.get('#description').type(extractDescription); + } + + cy.get('#dataSourceId').click(); + cy.findByText(extractDataSource).click(); + + cy.findByText('Save').click(); + cy.findByText(extractName).should('exist'); + }; + + addNewCustomExtract = (extractName: string, extractDescription?: string | undefined): void => { + cy.findByText('Add Extract').click(); + cy.findByText('Custom Sql Extract').click(); + cy.get('#name').type(extractName); + + if (extractDescription !== undefined) { + cy.get('#description').type(extractDescription); + } + + cy.findByText('Save').click(); + cy.findByText(extractName).should('exist'); + }; + + editExtract = (extractName: string, newExtractName: string, newExtractDescription?: string | undefined): void => { + this.goToExtract(extractName); + cy.findByText('Back to Extracts').should('exist'); + cy.findByText(extractName).should('exist'); + this.selectMenuOption('Edit'); + cy.findByText('Edit Extract').should('exist'); + + cy.get('#name').clear().type(newExtractName); + + if (newExtractDescription !== undefined) { + cy.get('#description').clear().type(newExtractDescription); + } + + cy.findByText('Apply').click(); + }; + + deleteExtract = (extractName: string): void => { + cy.get('.tempo-link__text').then((items) => { + const list = Array.from(items, (item) => item.innerText); + list.forEach((element) => { + if (element === extractName) { + cy.findByText(extractName).parentsUntil('.p-datatable-tbody').last().find('.anticon.anticon-delete').scrollIntoView(); + cy.findByText(extractName).parentsUntil('.p-datatable-tbody').last().find('.anticon.anticon-delete').click(); + cy.findByText('Delete Extract').click(); + cy.findByText(`Permanently delete ${extractName}?`).should('not.exist'); + } + }); + }); + }; + + goToExtract = (extractName: string): void => { + cy.findByText(extractName).click(); + cy.get('h1').contains(extractName).should('exist'); + }; + + shareExtract = (extractName: string, userGroupName: string): void => { + this.goToExtract(extractName); + this.selectMenuOption('Share'); + cy.findByText(`Share ${extractName}`).should('exist'); + cy.findByText('Add Groups').click(); + cy.findByText('User Groups').should('exist'); + cy.get('input[type="text"]').type(userGroupName); + cy.wait(500); + cy.get('span').contains(userGroupName).click(); + cy.get('.ant-drawer-title').contains('Add Groups').parentsUntil('.ant-drawer-wrapper-body').last().siblings().last().findByText('Add').click(); + cy.findByText(`Share ${extractName}`).should('exist'); + cy.findByText('Save').click(); + cy.findByText(`Share ${extractName}`).should('not.exist'); + }; + + scheduleExtract = (extractName: string, startTime: string, frequency: string): void => { + cy.goToExtract(extractName); + this.selectMenuOption('Schedule'); + cy.findByText('Schedule Extract', { timeout: 5000 }).should('exist'); + cy.wait(3000); + cy.findByText('Add Schedule').click(); + cy.get('#startTime', { timeout: 2000 }).should('exist'); + cy.get('#startTime').click(); + cy.get('#startTime').clear().type(startTime).type('{enter}'); + cy.findByText('Repeats').parent().next().click(); + cy.get('span').contains(frequency).click(); + cy.findByText('Save').click(); + cy.get('#startTime', { timeout: 2000 }).should('not.exist'); + }; + + selectMenuOption = (menuOption: string): void => { + cy.findByText('Export').parentsUntil('.tempo-spacing.tempo-spacing--row').last().next().click(); + cy.findByText(menuOption).click(); + }; +} diff --git a/cypress/cypress/pageObjects/advancedAnalyticsPageObject.ts b/cypress/cypress/pageObjects/advancedAnalyticsPageObject.ts new file mode 100644 index 0000000..5739b50 --- /dev/null +++ b/cypress/cypress/pageObjects/advancedAnalyticsPageObject.ts @@ -0,0 +1,511 @@ +export default class advancedAnalyticsPage { + createWorkbook = (workbookName: string, dataSourceName: string, workbookDescription?: string | undefined): void => { + cy.visit('/'); + cy.findByText('Add Workbook').click({ force: true }); + cy.get('#name').type(workbookName); + cy.get('#description').type(workbookDescription); + cy.get('#defaultDataSourceId').click(); + cy.findByText(dataSourceName).click(); + cy.findByText('Save').click(); + cy.wait(2000); + }; + + addDashboard = (): void => { + cy.findByText('Add').click(); + cy.findByText('Dashboard').click(); + }; + + addDashboardWidget = ( + widgetType: string, + widgetSubtype: string, + rowValues: { dimensionGroup: string; dimensionName: string }[], + valuesValues: { measureGroup: string; mesureName: string }[], + filters?: { dimensionsOrMeasures: string; filterAttributeGroup: string; filterAttributeName: string; filterAttributeValue: string }[] | undefined + ): void => { + this.addVisualizationWidget(); + this.setWidgetType(widgetType, widgetSubtype); + + rowValues.forEach((rowValue) => { + this.dragAndDropArea(rowValue.dimensionGroup, rowValue.dimensionName, 'Categories'); + }); + valuesValues.forEach((valuesValue) => { + this.dragAndDropArea(valuesValue.measureGroup, valuesValue.mesureName, 'Values'); + }); + + //Commented out because of JAZZ-58105 + //if (filters !== undefined) { + // filters.forEach((filter) => { + // this.addwidgetFilter(filter.filterAttributeGroup, filter.filterAttributeName, filter.filterAttributeValue); + // }); + //} + + cy.get('.ant-modal-content').findByText('Save').click(); + }; + + saveWidget = () => { + cy.get('.ant-modal-content').findByText('Save').click(); + }; + + setWidgetType = (widgetType: string, widgetSubType: string) => { + cy.findByText('Visualization Type').parent().next().click(); + cy.get('.ant-select-item-option-content').contains(widgetType).click(); + cy.findByText('Visualization Type').parent().next().next().click(); + cy.findAllByRole('listbox').last().next().findByText(widgetSubType).click(); + }; + + addVisualizationWidget = (): void => { + cy.findByText('Add Widget').click(); + cy.findByText('Add Visual').click(); + cy.findByTitle('Dimensions').parent().find('.ant-tree-switcher.ant-tree-switcher_open', { timeout: 10000 }).should('exist'); + }; + + addDataAnlysisSheet = (): void => { + cy.findByText('Add').click(); + cy.findByText('Data Sheet').click(); + cy.findByTitle('Dimensions').parent().find('.ant-tree-switcher.ant-tree-switcher_open', { timeout: 10000 }).should('exist'); + }; + + addAttributesToWidget = (attributes: { attributeGroup: string; attributeName: string; sectionName: string; attributeDestination: string }[]): void => { + attributes.forEach((attribute) => { + this.addAttributeToWidget(attribute.attributeGroup, attribute.attributeName, attribute.sectionName, attribute.attributeDestination); + }); + }; + + addAttributeToWidget = (attributeGroup: string, attributeName: string, attributeSection: string, attributeDestination: string): void => { + this.dragAndDropArea(attributeGroup, attributeName, attributeDestination); + }; + + addDashboardWidgetWithPivots = ( + widgetType: string, + rowValues: { dimensionGroup: string; dimensionName: string }[], + valuesValues: { measureGroup: string; mesureName: string }[], + pivotValues: { pivoteGroup: string; pivotName: string }[], + filters?: { filterAttributeGroup: string; filterAttributeName: string; filterAttributeValue: string }[] | undefined + ): void => { + this.addVisualizationWidget(); + + rowValues.forEach((rowValue) => { + this.dragAndDropArea(rowValue.dimensionGroup, rowValue.dimensionName, 'Categories'); + }); + valuesValues.forEach((valuesValue) => { + this.dragAndDropArea(valuesValue.measureGroup, valuesValue.mesureName, 'Values'); + }); + pivotValues.forEach((pivotValue) => { + this.dragAndDropArea(pivotValue.pivoteGroup, pivotValue.pivotName, 'Break By'); + }); + if (filters !== undefined) { + filters.forEach((filter) => { + this.addwidgetFilter(filter.filterAttributeGroup, filter.filterAttributeName, filter.filterAttributeValue); + }); + } + + cy.findByText('Save').click(); + }; + + expandNode = (nodeName: string, openOrClose: string): void => { + cy.findByTitle(nodeName) + .invoke('attr', 'class') + .then((classVal) => { + if (classVal.includes('ant-tree-node-content-wrapper-close') && openOrClose === 'open') { + cy.findByTitle(nodeName).siblings().last().click(); + } + if (classVal.includes('ant-tree-node-content-wrapper-open') && openOrClose === 'close') { + cy.findByTitle(nodeName).siblings().last().click(); + } + }); + cy.wait(500); + }; + + addDataAnalysis = ( + rowValues: { dimensionGroup: string; dimensionName: string }[], + valuesValues: { measureGroup: string; mesureName: string }[], + filters?: { dimensionsOrMeasures: string; filterAttributeGroup: string; filterAttributeName: string; filterAttributeValue: string }[] | undefined + ): void => { + this.addDataAnlysisSheet(); + rowValues.forEach((rowValue) => { + this.dragAndDropArea(rowValue.dimensionGroup, rowValue.dimensionName, 'Rows'); + }); + valuesValues.forEach((valuesValue) => { + this.dragAndDropArea(valuesValue.measureGroup, valuesValue.mesureName, 'Columns'); + }); + if (filters === undefined) return; + filters.forEach((filter) => { + this.addwidgetFilter(filter.filterAttributeGroup, filter.filterAttributeName); + }); + }; + + dragAndDropArea = (dimensionGroup: string, dimensionName: string, areaToDrop: string, whichSection = 0): void => { + const dataTransfer = new DataTransfer(); + this.searchForAttribute(dimensionName); + this.expandNode(dimensionGroup, 'open'); + cy.get(`span[title="${dimensionGroup}"]`).parent().next().findByText(dimensionName).trigger('dragstart', { + dataTransfer + }); + + cy.findAllByText(areaToDrop).then((elm) => { + const elementLength = elm.length; + + if (elementLength === 1) { + whichSection = 0; + cy.log(`There were not multiple ${areaToDrop} sections, defaulting to 0`); + cy.findAllByText(areaToDrop).eq(0).parentsUntil('.fields').last().next().trigger('drop', { + dataTransfer + }); + } else { + cy.findAllByText(areaToDrop).eq(whichSection).parentsUntil('.fields').last().next().trigger('drop', { + dataTransfer + }); + } + }); + + this.clearSearch(); + }; + + dragAndDropAreaToPosition = (dimensionGroup: string, dimensionName: string, areaToDrop: string, positionNumber: number, whichSection = 0): void => { + const dataTransfer = new DataTransfer(); + this.searchForAttribute(dimensionName); + this.expandNode(dimensionGroup, 'open'); + cy.get(`span[title="${dimensionGroup}"]`).parent().next().findByText(dimensionName).trigger('dragstart', { + dataTransfer + }); + + cy.findAllByText(areaToDrop).then((elm) => { + const numberOfSections = elm.length; + cy.log(`Number of elements is ${numberOfSections}`); + + if (numberOfSections === 1) { + whichSection = 0; + cy.log(`There were not multiple ${areaToDrop} sections, defaulting to 0`); + cy.findAllByText(areaToDrop).eq(0).parentsUntil('.fields').last().next().find(`#div-dropzone-${positionNumber}`).trigger('drop', { + dataTransfer + }); + } else { + cy.findAllByText(areaToDrop).eq(whichSection).parentsUntil('.fields').last().next().find(`#div-dropzone-${positionNumber}`).trigger('drop', { + dataTransfer + }); + } + }); + }; + + addwidgetFilter = (dimensionGroup: string, dimensionName: string, filterValue?: string | null): void => { + const dataTransfer = new DataTransfer(); + this.searchForAttribute(dimensionName); + this.expandNode(dimensionGroup, 'open'); + cy.get(`span[title="${dimensionGroup}"]`).parent().next().findByText(dimensionName).trigger('dragstart', { + dataTransfer + }); + + cy.get('.filters-bar').findByText('Filters').parent().parent().parent().next().trigger('drop', { + dataTransfer + }); + + if (filterValue != null) { + cy.findByText(filterValue).click(); + } + + cy.findByText('Apply').click(); + }; + + addCalculationFilter = (filterAttributeGroup: string, filterAttribute: string): void => { + cy.findByText('Add Filter').click(); + cy.get('.ant-modal-content').find('input').type(filterAttribute); + cy.findByTitle(filterAttributeGroup).parent().next().findByTitle(filterAttribute).click(); + cy.get('.ant-modal-content').findByText('Apply').click(); + cy.findByText('Filter').should('not.exist'); + }; + + searchForAttribute = (attributeName: string): void => { + cy.get('input[name="Search"]').clear().type(attributeName).wait(500); + }; + + setFilterValue = (filterAttribute: string, filterValue: string): void => { + cy.wait(1); + this.openEditFilter(filterAttribute); + cy.findByText('List').click(); + cy.get('.tempo-action-bar__filters').find('input[inputmode="text"]').clear().type(filterValue).wait(1000); + cy.findByText(filterValue).click(); + cy.findByText('Apply').click(); + }; + + openEditFilter = (filter: string): void => { + cy.get('.filters-bar').findByText(`${filter}:`).click(); + }; + + openEditWidget = (widgetName: string): void => { + cy.findByText(widgetName) + .parent() + .parent() + .parent() + .parent() + .then((widget) => { + cy.wrap(widget).trigger('mouseover'); + cy.wrap(widget).find('span[aria-label="edit"]').click(); + }); + }; + + selectWorkbookFromTable = (workbookName: string): void => { + cy.get('main').findByText(workbookName).click(); + }; + + selectWorkbookFromPane = (workbookName: string): void => { + cy.get('.ant-menu-item-group').findByText(workbookName).parent().click(); + }; + + deleteAttributesFromWidget = (attributes: { attributeName: string; sectionName: string }[]): void => { + attributes.forEach((attribute) => { + this.deleteAttributeFromWidget(attribute.attributeName, attribute.sectionName); + }); + }; + + deleteAttributeFromWidget = (attributeName: string, sectionName: string): void => { + if (sectionName === 'Values' || sectionName === 'Columns') { + this.deleteAttributeFromValues(attributeName, sectionName); + } else { + cy.get('.designer').findByText(sectionName).parentsUntil('.fields').last().next().findByText(attributeName).next().find('span[aria-label="delete"]').click(); + } + }; + + deleteAttributeFromValues = (attributeName: string, sectionName: string): void => { + cy.get('.designer').findByText(sectionName).parentsUntil('.fields').last().next().findByText(attributeName).next().click(); + cy.findByText('Delete').click(); + }; + + deleteWorkbookFromWorkbook = (workbookName: string): void => { + cy.goToWorkbook(workbookName); + this.openWorkbookKabob(workbookName); + cy.findByText('Delete').click().wait(1000); + cy.get('.ant-modal-confirm-btns').findByText('Delete Workbook').click(); + cy.findByText('Delete Workbook').should('not.exist'); + }; + + deleteWorkbookFromTable = (workbookName: string): void => { + cy.visit('/'); + cy.get('.p-datatable-tbody').findByText(workbookName).parent().parent().parent().find('span[class$="anticon-delete"]').click(); + cy.get('.ant-modal-confirm-btns').findByText('Delete Workbook').click(); + cy.findByText('Delete Workbook').should('not.exist'); + }; + + deleteDashboard = (dashboardName: string): void => { + cy.get('.worksheet-tab__title').contains(dashboardName).next().click(); + cy.findByText('Delete').click(); + cy.findByText(`Delete ${dashboardName}`).should('exist'); + cy.findByText('Cancel').parent().next().click(); + cy.findByText(`Delete ${dashboardName}`).should('not.exist'); + }; + + clearSearch = (): void => { + cy.get('input[name="Search"]').next().click(); + }; + + editTextWidget = (): void => { + cy.get('.text-widget--richtext').trigger('mouseover'); + cy.get('.ql-snow').parent().prev().find('span[class$="anticon-edit"]').click(); + }; + + addDataSource = (dataSourceName: string, dataSourceDescription?: string | undefined): void => { + this.goToDataSources(); + cy.findByText('Add Data Source').click(); + cy.get('#name').type(dataSourceName); + cy.get('#description').type(dataSourceDescription); + cy.findByText('Apply').click(); + }; + + goToDataSources = (): void => { + cy.visit('/datasources'); + }; + + shareWorkbook = (workbookName: string, userName: string): void => { + cy.goToWorkbook(workbookName); + this.openWorkbookKabob(workbookName); + cy.findByText('Share').click(); + cy.findByText('Add User').click(); + cy.findByText('Users').parentsUntil('.ant-drawer-body').last().find('.ant-tabs-content-holder').find('input[type="text"]').type(userName); + cy.get('span').contains(userName).click(); + cy.get('.ant-drawer-title').contains('Add User').parent().siblings().last().findByText('Add').click(); + cy.wait(2000); + cy.findByText('Save').click(); + cy.wait(2000); + }; + + openWorkbookKabobOneButton = (workbookName: string): void => { + cy.get('.ant-layout-content').findByText(workbookName).parentsUntil('.tempo-header').last().next().find('button').click(); + }; + + openWorkbookKabob = (workbookName: string): void => { + cy.get('.ant-layout-content').findByText(workbookName).parentsUntil('.tempo-header').last().next().findByText('Present').parentsUntil('.tempo-spacing.tempo-spacing--row').last().next().click(); + }; + + setRoleOfWorkbookSharedUser = (workbookName: string, userName: string, viewerOrEditor: string): void => { + cy.goToWorkbook(workbookName); + this.openWorkbookKabob(workbookName); + cy.findByText('Share').click(); + cy.get('div').contains(userName).parent().next().click(); + cy.get('.ant-select-item-option-content').contains(viewerOrEditor).click(); + cy.findByText('Save').click(); + cy.wait(2000); + }; + + switchDataSource = (newDataSourceName: string): void => { + cy.get('.designer__datasource-tree-selector').prev().find('button').click(); + cy.findByTitle('Data Source').parent().next().find('.ant-form-item-control-input').click(); + cy.findByText(newDataSourceName).click(); + cy.wait(2000); + cy.findByText('Change Data Source').parentsUntil('.ant-modal-content').last().parent().findByText('Save').click(); + //cy.get('.ant-modal-content').findByText('Save').click({ force: true }); + }; + + addDashboardFilter = (filterGroup: string, filterMember: string, dataSourceName?: string | undefined): void => { + cy.findByText('Add Filter').click(); + cy.findByTitle('Dimensions').parent().find('.ant-tree-switcher.ant-tree-switcher_open', { timeout: 10000 }).should('exist'); + this.searchForAttribute(filterMember); + cy.findByTitle(filterGroup).parent().next().findByTitle(filterMember).click(); + + if (dataSourceName !== undefined) { + this.setCurrentDashboardFilterDataSource(dataSourceName); + } + + cy.get('.ant-popover-content').findByText('Add').click(); + }; + + setDashboardFilterDataSource = (filterName: string, newDataSourceName: string): void => { + cy.findByText(`${filterName}:`).click(); + this.setCurrentDashboardFilterDataSource(newDataSourceName); + }; + + setCurrentDashboardFilterDataSource = (newDataSourceName: string): void => { + cy.findByText('Data Source').parent().next().click(); + cy.findByText(newDataSourceName).scrollIntoView().click(); + }; + + editFilterName = (filterName: string, newFilterName: string): void => { + cy.findByText(`${filterName}:`).click(); + cy.findByText('Configure').click(); + cy.get('#name').clear().type(newFilterName); + cy.findByText('Apply').click(); + }; + + setDashboardFilter = (filterName: string, filterValue: string): void => { + this.openDashboardFilter(filterName); + cy.get('.tempo-action-bar__filters').find('input[inputmode="text"]').clear().type(filterValue).wait(1000); + cy.findByText(filterValue).click(); + cy.findByText('Apply').click(); + }; + + openDashboardFilter = (filterName: string): void => { + cy.get('.filters-bar__item').findByText(`${filterName}:`).click(); + cy.findByText('Conditions').should('exist'); + }; + + duplicateValue = (valueToDuplicate: string, duplicatedValueName: string): void => { + cy.get('.sortable-list-item__content').contains(valueToDuplicate).next().click(); + cy.findByText('Duplicate').should('exist').click(); + + cy.get('#name', { timeout: 5000 }).should('exist'); + cy.get('#name').clear().type(duplicatedValueName).wait(1000); + cy.findByText('Apply').click(); + cy.get('#name', { timeout: 5000 }).should('not.exist'); + }; + + editValue = (valueToUpdate: string, updateName?: string, updateFormula?: string, updateCalculation?: string): void => { + this.openCalculatedValue(valueToUpdate); + this.editCurrentCalculatedValue(updateName, updateFormula, updateCalculation); + + cy.findByText('Apply').click({ force: true }); + cy.findByText('Apply').should('not.exist'); + }; + + openCalculatedValue = (valueToUpdate: string): void => { + cy.get('.sortable-list-item__content').contains(valueToUpdate).next().click(); + cy.findByText('Edit').click(); + cy.get('h3', { timeout: 5000 }).contains(valueToUpdate).should('exist'); + }; + + editCurrentCalculatedValue = (calcValName?: string, calcValFormula?: string, calcValCalculation?: string): void => { + if (calcValName !== null) { + cy.get('#name').clear().type(calcValName).wait(1000); + } + + if (calcValFormula !== null) { + cy.findByText('Format').parent().next().click(); + cy.findByText(calcValFormula).click(); + } + + if (calcValCalculation !== null) { + cy.get('.calculated-value-editor').find('textarea').clear({ force: true }).type(calcValCalculation, { force: true }).wait(1000); + } + }; + + addCustomCalculatedValue = (calcValName: string, updateFormula?: string, updateCalculation?: string): void => { + cy.findByText('Values').parentsUntil('.fields-header').last().next().click(); + cy.get('#name').should('be.visible'); + + this.editCurrentCalculatedValue(calcValName, updateFormula, updateCalculation); + + cy.findByText('Apply').click(); + cy.findByText('Apply').should('not.exist'); + }; + + addDataSheetCustomCalculatedValue = (calcValName: string, updateFormula?: string, updateCalculation?: string): void => { + cy.findByText('Columns').parentsUntil('.fields-column-header').last().next().click(); + cy.findByText('Add Calculation').click(); + cy.get('#name').should('be.visible'); + + this.editCurrentCalculatedValue(calcValName, updateFormula, updateCalculation); + + cy.findByText('Apply').click({ force: true }); + cy.findByText('Apply').should('not.exist'); + }; + + addDataSheetCustomCalculatedValueToNumberedGroup = (whichGroup: number, calcValName: string, calculationFormula?: string, calculationCalculation?: string): void => { + cy.findAllByText('Columns') + .eq(whichGroup - 1) + .parentsUntil('.fields-column-header') + .last() + .next() + .click(); + cy.findByText('Add Calculation').click(); + cy.get('#name').should('be.visible'); + + this.editCurrentCalculatedValue(calcValName, calculationFormula, calculationCalculation); + + cy.findByText('Apply').click(); + cy.findByText('Apply').should('not.exist'); + }; + + addNewDataSheetGroup = (): void => { + cy.findAllByText('Columns').first().parentsUntil('.fields-column-header').last().next().click(); + cy.findByText('Add Group').click(); + }; + + DuplicateGroup = (whichGroup: number): void => { + cy.findAllByText('Columns') + .eq(whichGroup - 1) + .parentsUntil('.fields-column-header') + .last() + .next() + .click(); + cy.findByText('Duplicate Group').click(); + }; + + deleteNumberedDataSheetGroup = (whichGroup: number): void => { + cy.findAllByText('Columns') + .eq(whichGroup - 1) + .parentsUntil('.fields-column-header') + .last() + .next() + .click(); + cy.findAllByText('Delete Group').last().click(); + }; + + addFromAdHoc = (adHocReport: string): void => { + cy.findByText('Add').click(); + cy.findByText('From Adhoc', { timeout: 5000 }).should('exist'); + cy.findByText('From Adhoc').click(); + cy.findByText('Create from Ad-hoc', { timeout: 10000 }).should('exist'); + + cy.get('.ant-input').type(adHocReport); + cy.findByText(adHocReport).click(); + cy.findByText('Create').click(); + cy.get('.worksheet-tab__title').contains(adHocReport, { timeout: 10000 }).should('exist'); + }; +} diff --git a/cypress/cypress/plugins/index.ts b/cypress/cypress/plugins/index.ts new file mode 100644 index 0000000..3a72a82 --- /dev/null +++ b/cypress/cypress/plugins/index.ts @@ -0,0 +1,43 @@ +import fs = require('fs'); +import path = require('path'); +import { spawnSync } from 'child_process'; +import fsExtra = require('fs-extra'); + +/// +/// +/// +// *********************************************************** +// This example plugins/index.js can be used to load plugins +// +// You can change the location of this file or turn off loading +// the plugins file with the 'pluginsFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/plugins-guide +// *********************************************************** + +// This function is called when a project is opened or re-opened (e.g. due to +// the project's config changing) + +/** + * @type {Cypress.PluginConfig} + */ +// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-var-requires +function getConfigurationByFile(file: any) { + const pathToConfigFile = path.resolve('..', 'cypress/cypress', `cypress.${file}.json`); + return fsExtra.readJson(pathToConfigFile); +} + +const sleep = (ms: number) => { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +}; + +module.exports = (on: any, config: any) => { + // `on` is used to hook into various events Cypress emits + // `config` is the resolved Cypress config + //initPlugin(on, config); + const configResolved = config.env.fileconfig != null ? getConfigurationByFile(config.env.fileconfig) : null; + return configResolved; +}; diff --git a/cypress/cypress/support/IUserData.ts b/cypress/cypress/support/IUserData.ts new file mode 100644 index 0000000..834be4f --- /dev/null +++ b/cypress/cypress/support/IUserData.ts @@ -0,0 +1,6 @@ +export interface IUserData { + Title: string; + UserName: string; + Password: string; + Description: string; +} diff --git a/cypress/cypress/support/commands.ts b/cypress/cypress/support/commands.ts new file mode 100644 index 0000000..2a0dff7 --- /dev/null +++ b/cypress/cypress/support/commands.ts @@ -0,0 +1,401 @@ +import '@testing-library/cypress/add-commands'; +import { IUserData } from './IUserData'; + +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) +import '@testing-library/cypress/add-commands'; + +declare global { + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace Cypress { + interface Chainable { + logout(): Chainable; + vaultLogin(admin?: boolean): Chainable; + vaultLoginByUserTitle(userTitle: string): Chainable; + switchUser(userTitle: string): Chainable; + deleteWorkbook(workbookName: string): Chainable; + addWorkbook(workbookName: string, workbookDescription: string, datamartName: string): Chainable; + goToWorkbook(workbookName: string): Chainable; + goToDataSource(dataMartName: string): Chainable; + goToStandardDataSource(dataMartName: string): Chainable; + verifyDataSourceExists(dataMartName: string): Chainable; + verifyDataSourceDoesNotExist(dataMartName: string): Chainable; + createDataSource(dataMartName: string, datamartDescription: string): Chainable; + deleteDataSource(dataMartName: string): Chainable; + addUserToDataSource(datamartName: string, userName: string, viewerOrEditor: string): Chainable; + addTableToDataSource(dataTableId: string, dataMartName: string): Chainable; + addUserToWorkbook(workbookName: string, userName: string, viewerOrEditor: string): Chainable; + addExtract(extractName: string, extractDescription: string, datamartName: string): Chainable; + goToExtract(extractName: string): Chainable; + deleteExtract(extractName: string): Chainable; + } + } +} + +Cypress.Commands.add('logout', () => { + cy.window().then((win) => { + win.sessionStorage.clear(); + }); + cy.visit('/'); +}); + +// USE THIS FOR ALL TEST LOGINS TO PULL FROM VAULT +Cypress.Commands.add('vaultLogin', (admin = true) => { + document.cookie = 'StrataIdentityServerLogin=true'; + const userTitle = admin ? 'obAdmin' : 'capBasic'; + + cy.request({ + method: 'GET', + url: `https://vault.sdt.local/api/searchpasswords/122?title=${userTitle}`, + headers: { + apiKey: 'a69d2e478c3f5b395b687ecdf34a3239' + } + }) + .then((response) => response.body[0]) + .then((user: IUserData) => { + // Test against your own test user + //cy.login(Cypress.env('username'), Cypress.env('password'), Cypress.env('dbguid'), Cypress.env('clientId'), '/'); + cy.login(user.UserName, user.Password, Cypress.env('dbguid'), Cypress.env('clientId'), '/'); + }); +}); + +Cypress.Commands.add('vaultLoginByUserTitle', (userTitle: string) => { + document.cookie = 'StrataIdentityServerLogin=true'; + + cy.request({ + method: 'GET', + url: `https://vault.sdt.local/api/searchpasswords/122?title=${userTitle}`, + headers: { + apiKey: 'a69d2e478c3f5b395b687ecdf34a3239' + } + }) + .then((response) => response.body[0]) + .then((user: IUserData) => { + // Test against your own test user + //cy.login(Cypress.env('username'), Cypress.env('password'), Cypress.env('dbguid'), Cypress.env('clientId'), '/'); + cy.login(user.UserName, user.Password, Cypress.env('dbguid'), Cypress.env('clientId'), '/'); + }); +}); + +Cypress.Commands.add('switchUser', (userTitle: string) => { + cy.logout(); + cy.vaultLoginByUserTitle(userTitle); +}); + +Cypress.Commands.add('deleteWorkbook', (workbookName: string) => { + const token = JSON.parse(window.sessionStorage.getItem('oidc.user:https://identity.dev.stratanetwork.net/:StrataUI')).access_token; + cy.request({ + method: 'GET', + url: `${Cypress.env('apiUrl')}v1/workbooks`, + headers: { Authorization: `Bearer ${token}` } + }).then((response) => { + const workbooks = response.body as { workbookId: string; name: string }[]; + const matchingWorkbooks = workbooks.find((r) => r.name === workbookName); + if (matchingWorkbooks === undefined) return; + const workbookId = matchingWorkbooks.workbookId; + cy.request({ + method: 'DELETE', + url: `${Cypress.env('apiUrl')}v1/workbooks/${workbookId}`, + headers: { Authorization: `Bearer ${token}` } + }); + }); +}); + +Cypress.Commands.add('addWorkbook', (workbookName: string, workbookDescription: string, dataSourceName: string) => { + const token = JSON.parse(window.sessionStorage.getItem('oidc.user:https://identity.dev.stratanetwork.net/:StrataUI')).access_token; + cy.request({ + method: 'GET', + url: `${Cypress.env('apiUrl')}v1/data-sources`, + headers: { Authorization: `Bearer ${token}` } + }).then((response) => { + const dataSources = response.body as { dataSourceId: string; name: string }[]; + const dataSourceId = dataSources.find((r) => r.name === dataSourceName).dataSourceId; + cy.request({ + method: 'POST', + url: `${Cypress.env('apiUrl')}v1/workbooks/`, + headers: { Authorization: `Bearer ${token}` }, + body: { + name: workbookName, + description: workbookDescription, + defaultDataSourceId: dataSourceId + } + }); + }); +}); + +Cypress.Commands.add('goToWorkbook', (workbookName: string) => { + const token = JSON.parse(window.sessionStorage.getItem('oidc.user:https://identity.dev.stratanetwork.net/:StrataUI')).access_token; + cy.request({ + method: 'GET', + url: `${Cypress.env('apiUrl')}v1/workbooks`, + headers: { Authorization: `Bearer ${token}` } + }).then((response) => { + const workbooks = response.body as { workbookId: string; name: string }[]; + const matchingWorkbooks = workbooks.find((r) => r.name === workbookName); + if (matchingWorkbooks === undefined) return; + const workbookId = matchingWorkbooks.workbookId; + cy.visit(`/workbooks/${workbookId}`); + }); + cy.get('h1').findByText(workbookName, { timeout: 25000 }).should('exist'); +}); + +Cypress.Commands.add('goToDataSource', (dataSourceName: string) => { + const token = JSON.parse(window.sessionStorage.getItem('oidc.user:https://identity.dev.stratanetwork.net/:StrataUI')).access_token; + cy.request({ + method: 'GET', + url: `${Cypress.env('apiUrl')}v1/data-sources`, + headers: { Authorization: `Bearer ${token}` } + }).then((response) => { + const dataSources = response.body as { dataSourceId: string; name: string }[]; + const dataSourceId = dataSources.find((r) => r.name === dataSourceName).dataSourceId; + cy.visit(`/datasources/${dataSourceId}`); + }); +}); + +Cypress.Commands.add('goToStandardDataSource', (dataSourceName: string) => { + const token = JSON.parse(window.sessionStorage.getItem('oidc.user:https://identity.dev.stratanetwork.net/:StrataUI')).access_token; + cy.request({ + method: 'GET', + url: `${Cypress.env('apiUrl')}v1/standard-data-sources`, + headers: { Authorization: `Bearer ${token}` } + }).then((response) => { + const dataSources = response.body as { standardDataSourceId: string; name: string }[]; + const dataSourceId = dataSources.find((r) => r.name === dataSourceName).standardDataSourceId; + cy.visit(`/standard-datasources/${dataSourceId}`); + }); +}); + +Cypress.Commands.add('verifyDataSourceExists', (dataSourceName: string) => { + const token = JSON.parse(window.sessionStorage.getItem('oidc.user:https://identity.dev.stratanetwork.net/:StrataUI')).access_token; + cy.request({ + method: 'GET', + url: `${Cypress.env('apiUrl')}v1/data-sources`, + headers: { Authorization: `Bearer ${token}` } + }).then((response) => { + const dataSources = response.body as { dataSourceId: string; name: string }[]; + const dataSource = dataSources.find((r) => r.name === dataSourceName); + expect(dataSource.name).to.eq(dataSourceName); + }); +}); + +Cypress.Commands.add('verifyDataSourceDoesNotExist', (dataSourceName: string) => { + const token = JSON.parse(window.sessionStorage.getItem('oidc.user:https://identity.dev.stratanetwork.net/:StrataUI')).access_token; + cy.request({ + method: 'GET', + url: `${Cypress.env('apiUrl')}v1/data-sources`, + headers: { Authorization: `Bearer ${token}` } + }).then((response) => { + const dataSources = response.body as { dataSourceId: string; name: string }[]; + const dataSource = dataSources.find((r) => r.name === dataSourceName); + expect(dataSource).to.be(null); + }); +}); + +Cypress.Commands.add('createDataSource', (dataSourceName: string, dataSourceDescription: string) => { + const token = JSON.parse(window.sessionStorage.getItem('oidc.user:https://identity.dev.stratanetwork.net/:StrataUI')).access_token; + cy.request({ + method: 'POST', + url: `${Cypress.env('apiUrl')}v1/data-sources`, + headers: { Authorization: `Bearer ${token}` }, + body: { + name: dataSourceName, + description: dataSourceDescription + } + }); +}); + +Cypress.Commands.add('deleteDataSource', (dataSourceName: string) => { + const token = JSON.parse(window.sessionStorage.getItem('oidc.user:https://identity.dev.stratanetwork.net/:StrataUI')).access_token; + cy.request({ + method: 'GET', + url: `${Cypress.env('apiUrl')}v1/data-sources`, + headers: { Authorization: `Bearer ${token}` } + }).then((response) => { + const dataSources = response.body as { dataSourceId: string; name: string }[]; + const matchingDataSources = dataSources.find((r) => r.name === dataSourceName); + if (matchingDataSources === undefined) return; + const dataSourceId = matchingDataSources.dataSourceId; + cy.request({ + method: 'DELETE', + url: `${Cypress.env('apiUrl')}v1/data-sources/${dataSourceId}`, + headers: { Authorization: `Bearer ${token}` } + }); + }); +}); + +Cypress.Commands.add('addUserToDataSource', (dataSourceName: string, userName: string, viewerOrEditor: string) => { + const token = JSON.parse(window.sessionStorage.getItem('oidc.user:https://identity.dev.stratanetwork.net/:StrataUI')).access_token; + cy.request({ + method: 'GET', + url: `${Cypress.env('apiUrl')}v1/users`, + headers: { Authorization: `Bearer ${token}` } + }).then((response) => { + const users = response.body as { userGuid: string; username: string }[]; + + const matchingUsers = users.find((r) => r.username === userName); + if (matchingUsers === undefined) return; + const userGuid = matchingUsers.userGuid; + cy.request({ + method: 'GET', + url: `${Cypress.env('apiUrl')}v1/data-sources`, + headers: { Authorization: `Bearer ${token}` } + }).then((response) => { + const dataSources = response.body as { dataSourceId: string; name: string }[]; + const matchingDataSources = dataSources.find((r) => r.name === dataSourceName); + if (matchingDataSources === undefined) return; + const dataSourceId = matchingDataSources.dataSourceId; + cy.request({ + method: 'POST', + url: `${Cypress.env('apiUrl')}v1/data-sources/${dataSourceId}/role-assignments/batch`, + headers: { Authorization: `Bearer ${token}` }, + body: { + updates: [ + { + identityGuid: userGuid, + identityName: userName, + identityType: 'user', + role: viewerOrEditor + } + ] + } + }); + }); + }); +}); + +Cypress.Commands.add('addTableToDataSource', (dataTableId: string, dataSourceName: string) => { + const token = JSON.parse(window.sessionStorage.getItem('oidc.user:https://identity.dev.stratanetwork.net/:StrataUI')).access_token; + cy.request({ + method: 'GET', + url: `${Cypress.env('apiUrl')}v1/data-sources`, + headers: { Authorization: `Bearer ${token}` } + }).then((response) => { + const dataSources = response.body as { dataSourceId: string; name: string }[]; + const dataSourceId = dataSources.find((r) => r.name === dataSourceName).dataSourceId; + cy.request({ + method: 'POST', + url: `${Cypress.env('apiUrl')}v1/data-sources/${dataSourceId}/tables/${dataTableId}`, + headers: { Authorization: `Bearer ${token}` } + }); + }); +}); + +Cypress.Commands.add('addUserToWorkbook', (workbookName: string, userName: string, viewerOrEditor: string) => { + const token = JSON.parse(window.sessionStorage.getItem('oidc.user:https://identity.dev.stratanetwork.net/:StrataUI')).access_token; + cy.request({ + method: 'GET', + url: `${Cypress.env('apiUrl')}v1/users`, + headers: { Authorization: `Bearer ${token}` } + }).then((response) => { + const users = response.body as { userGuid: string; username: string }[]; + + const matchingUsers = users.find((r) => r.username === userName); + if (matchingUsers === undefined) return; + const userGuid = matchingUsers.userGuid; + cy.request({ + method: 'GET', + url: `${Cypress.env('apiUrl')}v1/workbooks`, + headers: { Authorization: `Bearer ${token}` } + }).then((response) => { + const workbooks = response.body as { workbookId: string; name: string }[]; + const matchingWorkbooks = workbooks.find((r) => r.name === workbookName); + if (matchingWorkbooks === undefined) return; + const workbookId = matchingWorkbooks.workbookId; + cy.request({ + method: 'POST', + url: `${Cypress.env('apiUrl')}v1/workbooks/${workbookId}/role-assignments/batch`, + headers: { Authorization: `Bearer ${token}` }, + body: { + updates: [ + { + identityGuid: userGuid, + identityName: userName, + identityType: 'user', + role: viewerOrEditor + } + ] + } + }); + }); + }); +}); + +Cypress.Commands.add('addExtract', (extractName: string, extractDescription: string, dataMartName: string) => { + const token = JSON.parse(window.sessionStorage.getItem('oidc.user:https://identity.dev.stratanetwork.net/:StrataUI')).access_token; + cy.request({ + method: 'GET', + url: `${Cypress.env('apiUrl')}v1/data-sources`, + headers: { Authorization: `Bearer ${token}` } + }).then((response) => { + const datamarts = response.body as { dataSourceId: string; name: string }[]; + const dataSourceId = datamarts.find((r) => r.name === dataMartName).dataSourceId; + cy.request({ + method: 'POST', + url: `${Cypress.env('apiUrl')}v1/extracts/`, + headers: { Authorization: `Bearer ${token}` }, + body: { + name: extractName, + description: extractDescription, + defaultdataSourceId: dataSourceId + } + }); + }); +}); + +Cypress.Commands.add('goToExtract', (extractName: string) => { + const token = JSON.parse(window.sessionStorage.getItem('oidc.user:https://identity.dev.stratanetwork.net/:StrataUI')).access_token; + cy.request({ + method: 'GET', + url: `${Cypress.env('apiUrl')}v1/extracts`, + headers: { Authorization: `Bearer ${token}` } + }).then((response) => { + const extracts = response.body as { extractId: string; name: string }[]; + const matchingExtracts = extracts.find((r) => r.name === extractName); + if (matchingExtracts === undefined) return; + const extractId = matchingExtracts.extractId; + cy.visit(`/extracts/${extractId}`); + }); + cy.get('h1').findByText(extractName, { timeout: 25000 }).should('exist'); +}); + +Cypress.Commands.add('deleteExtract', (extractName: string) => { + const token = JSON.parse(window.sessionStorage.getItem('oidc.user:https://identity.dev.stratanetwork.net/:StrataUI')).access_token; + cy.request({ + method: 'GET', + url: `${Cypress.env('apiUrl')}v1/extracts`, + headers: { Authorization: `Bearer ${token}` } + }).then((response) => { + const extracts = response.body as { extractId: string; name: string }[]; + const matchingExtracts = extracts.find((r) => r.name === extractName); + if (matchingExtracts === undefined) return; + const extractId = matchingExtracts.extractId; + cy.request({ + method: 'DELETE', + url: `${Cypress.env('apiUrl')}v1/extracts/${extractId}`, + headers: { Authorization: `Bearer ${token}` } + }); + }); +}); diff --git a/cypress/cypress/support/index.ts b/cypress/cypress/support/index.ts new file mode 100644 index 0000000..144380f --- /dev/null +++ b/cypress/cypress/support/index.ts @@ -0,0 +1,29 @@ +// *********************************************************** +// This example support/index.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands'; +import 'cypress-file-upload'; +import { expandTreeCommand, selectTreeCommand, checkTreeCommand } from '@strata/cypress/lib/tree'; +import { loginCommand } from '@strata/cypress/lib/login'; + +loginCommand(); +expandTreeCommand(); +selectTreeCommand(); +checkTreeCommand(); + +// Alternatively you can use CommonJS syntax: +// require('./commands') +Cypress.on('uncaught:exception', (err) => !err.message.includes('ResizeObserver loop limit exceeded')); diff --git a/cypress/cypress/tsconfig.json b/cypress/cypress/tsconfig.json new file mode 100644 index 0000000..adfcd8a --- /dev/null +++ b/cypress/cypress/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "noEmit": true, + "target": "es5", + "lib": [ + "es5", + "dom" + ], + "types": [ + "cypress", + "@testing-library/cypress", + "node" + ] + }, + "include": [ + "../node_modules", + "**/*.ts", + "support/commands.js", + "cypress/plugins/index.ts", + "cypress/support/index.js" + ] +} \ No newline at end of file diff --git a/cypress/package-lock.json b/cypress/package-lock.json new file mode 100644 index 0000000..e5893a1 --- /dev/null +++ b/cypress/package-lock.json @@ -0,0 +1,9229 @@ +{ + "name": "advanced-analytics-e2e", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "advanced-analytics-e2e", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@strata/cypress": "^1.7.0", + "@strata/eslint-config": "^3.6.0", + "@typescript-eslint/eslint-plugin": "^4.28.0", + "dayjs": "^1.11.7", + "eslint": "^7.29.0", + "eslint-plugin-flowtype": "^5.7.2", + "eslint-plugin-import": "^2.23.4", + "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-react": "^7.24.0", + "eslint-plugin-react-hooks": "^4.2.0", + "prettier": "^2.3.1" + }, + "devDependencies": { + "@percy/cli": "^1.17.0", + "@percy/cypress": "^3.1.2", + "@testing-library/cypress": "^8.0.2", + "@types/node": "^16.11.6", + "cypress": "^9.5.3", + "cypress-file-upload": "^5.0.8", + "cypress-iframe": "^1.0.1", + "js-base64": "^2.5.2", + "node-xlsx": "^0.17.2", + "typescript": "^4.6.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dependencies": { + "@babel/highlight": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", + "dependencies": { + "@babel/types": "^7.19.0", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", + "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz", + "integrity": "sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g==", + "dependencies": { + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", + "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.19.1", + "@babel/types": "^7.19.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cypress/request": { + "version": "2.88.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", + "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "dev": true, + "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", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "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": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "node_modules/@jest/types": { + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.2.5.tgz", + "integrity": "sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@percy/cli": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli/-/cli-1.17.0.tgz", + "integrity": "sha512-uY755vWT+bx3IVvzZKTbX7UJclPXStp85M9LSaWff1K8nk47c+patB9ydLSZKQu+Qkj1L/5L46plaResn8SfsA==", + "dev": true, + "dependencies": { + "@percy/cli-app": "1.17.0", + "@percy/cli-build": "1.17.0", + "@percy/cli-command": "1.17.0", + "@percy/cli-config": "1.17.0", + "@percy/cli-exec": "1.17.0", + "@percy/cli-snapshot": "1.17.0", + "@percy/cli-upload": "1.17.0", + "@percy/client": "1.17.0", + "@percy/logger": "1.17.0" + }, + "bin": { + "percy": "bin/run.cjs" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/cli-app": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-app/-/cli-app-1.17.0.tgz", + "integrity": "sha512-8Vc/pfaKsubKXRaPNdB3Snd8h7NfGPNio5RtETgQpJHwE+hu4rbjN4WovkjntiUSsQwLGYpXmKqV9n+8Z4oskA==", + "dev": true, + "dependencies": { + "@percy/cli-command": "1.17.0", + "@percy/cli-exec": "1.17.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/cli-build": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-build/-/cli-build-1.17.0.tgz", + "integrity": "sha512-ES5Cwwa4n7/czOObqhG/o2Lr2l4VZFG2DEH/WGarCgsG42yiKqNWUHjFZj2AYfvv24f0b1KpL/Hz7gBauagGZA==", + "dev": true, + "dependencies": { + "@percy/cli-command": "1.17.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/cli-command": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-command/-/cli-command-1.17.0.tgz", + "integrity": "sha512-KmYorWxT+M+Ei/UVZiVx1WVJ4g87D+gvHX5tC4KS8C+oVy31Z01rJ4YChM0OSS92COMX0hCOacOxrFCNGbMgow==", + "dev": true, + "dependencies": { + "@percy/config": "1.17.0", + "@percy/core": "1.17.0", + "@percy/logger": "1.17.0" + }, + "bin": { + "percy-cli-readme": "bin/readme.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/cli-config": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-config/-/cli-config-1.17.0.tgz", + "integrity": "sha512-dpwCLyy9e1ubsZY3QaZj1A3KNHOQOjSuvNCZ01yM+VH5hSPsh9OD50Jhie/6W4BTMbn/THMo5KyHc76ahc0nYA==", + "dev": true, + "dependencies": { + "@percy/cli-command": "1.17.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/cli-exec": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-exec/-/cli-exec-1.17.0.tgz", + "integrity": "sha512-W3Mb3t8dZOaEdvRX7uPStpiBEWFnUGQ2S+2X5nk4aGdikIO1jVwZrXRyFRs/NU6gkDocREJ2MFEwAQGsuCB3qg==", + "dev": true, + "dependencies": { + "@percy/cli-command": "1.17.0", + "cross-spawn": "^7.0.3", + "which": "^2.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/cli-snapshot": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-snapshot/-/cli-snapshot-1.17.0.tgz", + "integrity": "sha512-QYKSqlC3bMjaz9k1ClOUCq6Jwz4FPf1q+x9IlYQsUUOQ68Sx7qBy8edw1iS09BsKkESFHqFIBi7j7laWU/al3g==", + "dev": true, + "dependencies": { + "@percy/cli-command": "1.17.0", + "yaml": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/cli-upload": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-upload/-/cli-upload-1.17.0.tgz", + "integrity": "sha512-vhfi4AXptDLKG2UdE94sI1FZLh6kR1YvDh7UlbxvJmRl6+vkkxEOHkZZ6B575b3Mzm+20LBfw4gU7maajs/16Q==", + "dev": true, + "dependencies": { + "@percy/cli-command": "1.17.0", + "fast-glob": "^3.2.11", + "image-size": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/client": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/client/-/client-1.17.0.tgz", + "integrity": "sha512-7ur4SN/FLf7wPDcJyOMquQT3oCRVZ9Up4Ux3zbRV8eaYgdmnkpYn1+F8uRqwwXLsVngWGqB0x+ckbQ2N0oXA4Q==", + "dev": true, + "dependencies": { + "@percy/env": "1.17.0", + "@percy/logger": "1.17.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/config": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/config/-/config-1.17.0.tgz", + "integrity": "sha512-azAdqWHC3Neb5HC4sThvobuHsawiBBoRO6taBIrB6gO66mzhG76p1avChmsgZTeuAGIUE9gnF3GYW6FJiqnXAQ==", + "dev": true, + "dependencies": { + "@percy/logger": "1.17.0", + "ajv": "^8.6.2", + "cosmiconfig": "^7.0.0", + "yaml": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/config/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@percy/config/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@percy/core": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/core/-/core-1.17.0.tgz", + "integrity": "sha512-kIzSxKNEjwl+Y+86XHZfEYBFyvPvuISwGzKhmL/03lJRggvmH+eThHvB+P8zX1v/9wHEKA/YwQU8uSggZMN2yA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@percy/client": "1.17.0", + "@percy/config": "1.17.0", + "@percy/dom": "1.17.0", + "@percy/logger": "1.17.0", + "content-disposition": "^0.5.4", + "cross-spawn": "^7.0.3", + "extract-zip": "^2.0.1", + "fast-glob": "^3.2.11", + "micromatch": "^4.0.4", + "mime-types": "^2.1.34", + "path-to-regexp": "^6.2.0", + "rimraf": "^3.0.2", + "ws": "^8.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/cypress": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@percy/cypress/-/cypress-3.1.2.tgz", + "integrity": "sha512-JXrGDZbqwkzQd2h5T5D7PvqoucNaiMh4ChPp8cLQiEtRuLHta9nf1lEuXH+jnatGL2j+3jJFIHJ0L7XrgVnvQA==", + "dev": true, + "dependencies": { + "@percy/sdk-utils": "^1.3.1" + }, + "peerDependencies": { + "cypress": ">=3" + } + }, + "node_modules/@percy/dom": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/dom/-/dom-1.17.0.tgz", + "integrity": "sha512-C6qaqOk4p8ax/gPruQtVy+Ml7Yb6nWpKYThk4afy4N0Jq9hZa0qBzlVE1vO4jtxHK8JaZ2lXGG4Gdxz4FOQuMA==", + "dev": true + }, + "node_modules/@percy/env": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/env/-/env-1.17.0.tgz", + "integrity": "sha512-z6O7VauoKXDq66hS8HhVmR2poJZLdM0xVAJ7XBmfdalVnnCSzub1Fjubd12eN12Gt9fZpX8WCeOI8+0PjAAspQ==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/logger": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.17.0.tgz", + "integrity": "sha512-UEzXcoxwDl8SfvJc4Gy0Ib8lYKDxM7WkgVsg/C5bniUyKuqpDnJdvqiV82vzOVI9nmlYikCG09ebZbNIjnXDWg==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@percy/sdk-utils": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/sdk-utils/-/sdk-utils-1.17.0.tgz", + "integrity": "sha512-qmNHetNW6GjoxWzKbo6mOngVhKL0ofTEIBBCsBdpdcJsBDrvT1xVoht6xqiRMRLNLaLmIb8RijgPPpUxaShK2w==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@strata/cypress": { + "version": "1.7.0", + "resolved": "https://proget.sdt.local/npm/npm/@strata/cypress/-/cypress-1.7.0.tgz", + "integrity": "sha512-o2BYymQc+ITq8UMyPGxDZU7yoND6kTzlOC8MA+KirPkmY1UO7JRdoIDaKmbqPeoYaCyWZ5ThrtuC3nJF5cyWsQ==", + "license": "ISC", + "dependencies": { + "jwt-decode": "^3.1.2" + } + }, + "node_modules/@strata/eslint-config": { + "version": "3.6.0", + "resolved": "https://proget.sdt.local/npm/npm/@strata/eslint-config/-/eslint-config-3.6.0.tgz", + "integrity": "sha512-soD6eIAlhxi20zM5I4rmzhbD/4XIYc/elSpdF+g6C7GVmfyhepJ8ty4CNMcY2HPYnfu/Uo4cjYRMrMaBFIDA1A==", + "license": "ISC", + "dependencies": { + "@typescript-eslint/parser": "^4.15.2", + "babel-eslint": "^10.1.0", + "eslint-config-prettier": "^7.1.0", + "eslint-config-react-app": "^6.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.15.2", + "eslint": "^7.20.0", + "eslint-plugin-flowtype": "^5.3.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-prettier": "^3.3.1", + "eslint-plugin-react": "^7.22.0", + "eslint-plugin-react-hooks": "^4.2.0", + "prettier": "^2.2.1", + "react": ">=16.13.1" + } + }, + "node_modules/@testing-library/cypress": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-8.0.2.tgz", + "integrity": "sha512-KVdm7n37sg/A4e3wKMD4zUl0NpzzVhx06V9Tf0hZHZ7nrZ4yFva6Zwg2EFF1VzHkEfN/ahUzRtT1qiW+vuWnJw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.14.6", + "@testing-library/dom": "^8.1.0" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "cypress": "^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.11.1.tgz", + "integrity": "sha512-3KQDyx9r0RKYailW2MiYrSSKEfH0GTkI51UGEvJenvcoDoeRYs0PZpi2SXqtnMClQvCqdtTTpOfFETDTVADpAg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.4.4", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", + "dev": true + }, + "node_modules/@types/cypress": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/cypress/-/cypress-1.1.3.tgz", + "integrity": "sha512-OXe0Gw8LeCflkG1oPgFpyrYWJmEKqYncBsD/J0r17r0ETx/TnIGDNLwXt/pFYSYuYTpzcq1q3g62M9DrfsBL4g==", + "deprecated": "This is a stub types definition for cypress (https://cypress.io). cypress provides its own type definitions, so you don't need @types/cypress installed!", + "dev": true, + "peer": true, + "dependencies": { + "cypress": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "node_modules/@types/node": { + "version": "16.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", + "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "node_modules/@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true + }, + "node_modules/@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", + "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", + "dependencies": { + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", + "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", + "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "dependencies": { + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "debug": "^4.3.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/adler-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz", + "integrity": "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==", + "dev": true, + "dependencies": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + }, + "bin": { + "adler32": "bin/adler32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", + "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/array-includes": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/axe-core": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", + "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" + }, + "node_modules/babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">= 4.12.1" + } + }, + "node_modules/babel-eslint/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/cfb": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.1.tgz", + "integrity": "sha512-wT2ScPAFGSVy7CY+aauMezZBnNrfnaLSrxHUHdea+Td/86vrk6ZquggV+ssBR88zNs0OnBkL2+lf9q0K+zVGzQ==", + "dev": true, + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0", + "printj": "~1.3.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cfb/node_modules/adler-32": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.0.tgz", + "integrity": "sha512-f5nltvjl+PRUh6YNfUstRaXwJxtfnKEWhAWWlmKvh+Y3J2+98a0KKVYDEhz6NdKGqswLhjNGznxfSsZGOvOd9g==", + "dev": true, + "dependencies": { + "printj": "~1.2.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cfb/node_modules/adler-32/node_modules/printj": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.2.3.tgz", + "integrity": "sha512-sanczS6xOJOg7IKDvi4sGOUOe7c1tsEzjwlLFH/zgwx/uyImVM9/rgBkc8AfiQa/Vg54nRd8mkm9yI7WV/O+WA==", + "dev": true, + "bin": { + "printj": "bin/printj.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cfb/node_modules/printj": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.3.0.tgz", + "integrity": "sha512-017o8YIaz8gLhaNxRB9eBv2mWXI2CtzhPJALnQTP+OPpuUfP0RMWqr/mHCzqVeu1AQxfzSfAtAq66vKB8y7Lzg==", + "dev": true, + "bin": { + "printj": "bin/printj.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/chalk/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/core-js-pure": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.2.tgz", + "integrity": "sha512-ItD7YpW1cUB4jaqFLZXe1AXkyqIxz6GqPnsDV4uF4hVcWh/WAGIqSqw5p0/WdsILM0Xht9s3Koyw05R3K6RtiA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "dev": true, + "dependencies": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + }, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cypress": { + "version": "9.5.3", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.5.3.tgz", + "integrity": "sha512-ItelIVmqMTnKYbo1JrErhsGgQGjWOxCpHT1TfMvwnIXKXN/OSlPjEK7rbCLYDZhejQL99PmUqul7XORI24Ik0A==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "eventemitter2": "^6.4.3", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.6", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.3.2", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/cypress-file-upload": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz", + "integrity": "sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g==", + "dev": true, + "engines": { + "node": ">=8.2.1" + }, + "peerDependencies": { + "cypress": ">3.0.0" + } + }, + "node_modules/cypress-iframe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cypress-iframe/-/cypress-iframe-1.0.1.tgz", + "integrity": "sha512-Ne+xkZmWMhfq3x6wbfzK/SzsVTCrJru3R3cLXsoSAZyfUtJDamXyaIieHXeea3pQDXF4wE2w4iUuvCYHhoD31g==", + "dev": true, + "peerDependencies": { + "@types/cypress": "^1.1.0" + } + }, + "node_modules/cypress/node_modules/@types/node": { + "version": "14.17.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.33.tgz", + "integrity": "sha512-noEeJ06zbn3lOh4gqe2v7NMGS33jrulfNqYFDjjEbhpDEHR5VTxgYNQSBqBlJIsBJW3uEYDgD6kvMnrrhGzq8g==", + "dev": true + }, + "node_modules/cypress/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cypress/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.10.tgz", + "integrity": "sha512-Xu9mD0UjrJisTmv7lmVSDMagQcU9R5hwAbxsaAE/35XPnPLJobbuREfV/rraiSaEj/UOvgrzQs66zyTWTlyd+g==", + "dev": true + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", + "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.2", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", + "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-config-react-app": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", + "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", + "dependencies": { + "confusing-browser-globals": "^1.0.10" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0", + "@typescript-eslint/parser": "^4.0.0", + "babel-eslint": "^10.0.0", + "eslint": "^7.5.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-jest": "^24.0.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.20.3", + "eslint-plugin-react-hooks": "^4.0.8", + "eslint-plugin-testing-library": "^3.9.0" + }, + "peerDependenciesMeta": { + "eslint-plugin-jest": { + "optional": true + }, + "eslint-plugin-testing-library": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.10.0.tgz", + "integrity": "sha512-vcz32f+7TP+kvTUyMXZmCnNujBQZDNmcqPImw8b9PZ+16w1Qdm6ryRuYZYVaG9xRqqmAPr2Cs9FAX5gN+x/bjw==", + "dependencies": { + "lodash": "^4.17.15", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", + "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", + "dependencies": { + "@babel/runtime": "^7.18.9", + "aria-query": "^4.2.2", + "array-includes": "^3.1.5", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.4.3", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.2", + "language-tags": "^1.0.5", + "minimatch": "^3.1.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dependencies": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=5.0.0", + "prettier": ">=1.13.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.31.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", + "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", + "dependencies": { + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.1", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.5.tgz", + "integrity": "sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw==", + "dev": true + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "dependencies": { + "async": "^3.2.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", + "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "dev": true, + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.6.tgz", + "integrity": "sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dependencies": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true, + "engines": { + "node": "> 0.8" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/listr2": { + "version": "3.13.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.13.4.tgz", + "integrity": "sha512-lZ1Rut1DSIRwbxQbI8qaUBfOWJ1jEYRgltIM97j6kKOCI2pHVWMyxZvkU/JKmRBWcIYgDS2PK+yDgVqm7u3crw==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "clone": "^2.1.2", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^7.4.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-update/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/node-xlsx": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/node-xlsx/-/node-xlsx-0.17.2.tgz", + "integrity": "sha512-j92dGS8KvGPi6YpYovHrR9zWiyDONx7DiGhl1SjM+vzxAh3do6hmerFCyN+hRuK7QhwHdwzfpYxZm+hKA/uErA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.15.4", + "buffer-from": "^1.1.2", + "xlsx": "^0.17.2" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-format": { + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.3.1.tgz", + "integrity": "sha512-DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.2.5", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", + "dev": true, + "bin": { + "printj": "bin/printj.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "dev": true, + "dependencies": { + "tslib": "~2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "dev": true, + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "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" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/table": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", + "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/table/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/table/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xlsx": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.17.4.tgz", + "integrity": "sha512-9aKt8g9ZLP0CUdBX8L5xnoMDFwSiLI997eQnDThCaqQMYB9AEBIRzblSSNN/ICMGLYIHUO3VKaItcedZJ3ijIg==", + "dev": true, + "dependencies": { + "adler-32": "~1.2.0", + "cfb": "^1.1.4", + "codepage": "~1.15.0", + "crc-32": "~1.2.0", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", + "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/generator": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", + "requires": { + "@babel/types": "^7.19.0", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==" + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/parser": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", + "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==" + }, + "@babel/runtime": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz", + "integrity": "sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g==", + "requires": { + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "requires": { + "@babel/highlight": "^7.18.6" + } + } + } + }, + "@babel/traverse": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", + "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.19.1", + "@babel/types": "^7.19.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "requires": { + "@babel/highlight": "^7.18.6" + } + } + } + }, + "@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "requires": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true + }, + "@cypress/request": { + "version": "2.88.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", + "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "dev": true, + "requires": { + "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", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "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": "^8.3.2" + } + }, + "@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "@jest/types": { + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.2.5.tgz", + "integrity": "sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@percy/cli": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli/-/cli-1.17.0.tgz", + "integrity": "sha512-uY755vWT+bx3IVvzZKTbX7UJclPXStp85M9LSaWff1K8nk47c+patB9ydLSZKQu+Qkj1L/5L46plaResn8SfsA==", + "dev": true, + "requires": { + "@percy/cli-app": "1.17.0", + "@percy/cli-build": "1.17.0", + "@percy/cli-command": "1.17.0", + "@percy/cli-config": "1.17.0", + "@percy/cli-exec": "1.17.0", + "@percy/cli-snapshot": "1.17.0", + "@percy/cli-upload": "1.17.0", + "@percy/client": "1.17.0", + "@percy/logger": "1.17.0" + } + }, + "@percy/cli-app": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-app/-/cli-app-1.17.0.tgz", + "integrity": "sha512-8Vc/pfaKsubKXRaPNdB3Snd8h7NfGPNio5RtETgQpJHwE+hu4rbjN4WovkjntiUSsQwLGYpXmKqV9n+8Z4oskA==", + "dev": true, + "requires": { + "@percy/cli-command": "1.17.0", + "@percy/cli-exec": "1.17.0" + } + }, + "@percy/cli-build": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-build/-/cli-build-1.17.0.tgz", + "integrity": "sha512-ES5Cwwa4n7/czOObqhG/o2Lr2l4VZFG2DEH/WGarCgsG42yiKqNWUHjFZj2AYfvv24f0b1KpL/Hz7gBauagGZA==", + "dev": true, + "requires": { + "@percy/cli-command": "1.17.0" + } + }, + "@percy/cli-command": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-command/-/cli-command-1.17.0.tgz", + "integrity": "sha512-KmYorWxT+M+Ei/UVZiVx1WVJ4g87D+gvHX5tC4KS8C+oVy31Z01rJ4YChM0OSS92COMX0hCOacOxrFCNGbMgow==", + "dev": true, + "requires": { + "@percy/config": "1.17.0", + "@percy/core": "1.17.0", + "@percy/logger": "1.17.0" + } + }, + "@percy/cli-config": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-config/-/cli-config-1.17.0.tgz", + "integrity": "sha512-dpwCLyy9e1ubsZY3QaZj1A3KNHOQOjSuvNCZ01yM+VH5hSPsh9OD50Jhie/6W4BTMbn/THMo5KyHc76ahc0nYA==", + "dev": true, + "requires": { + "@percy/cli-command": "1.17.0" + } + }, + "@percy/cli-exec": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-exec/-/cli-exec-1.17.0.tgz", + "integrity": "sha512-W3Mb3t8dZOaEdvRX7uPStpiBEWFnUGQ2S+2X5nk4aGdikIO1jVwZrXRyFRs/NU6gkDocREJ2MFEwAQGsuCB3qg==", + "dev": true, + "requires": { + "@percy/cli-command": "1.17.0", + "cross-spawn": "^7.0.3", + "which": "^2.0.2" + } + }, + "@percy/cli-snapshot": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-snapshot/-/cli-snapshot-1.17.0.tgz", + "integrity": "sha512-QYKSqlC3bMjaz9k1ClOUCq6Jwz4FPf1q+x9IlYQsUUOQ68Sx7qBy8edw1iS09BsKkESFHqFIBi7j7laWU/al3g==", + "dev": true, + "requires": { + "@percy/cli-command": "1.17.0", + "yaml": "^2.0.0" + } + }, + "@percy/cli-upload": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/cli-upload/-/cli-upload-1.17.0.tgz", + "integrity": "sha512-vhfi4AXptDLKG2UdE94sI1FZLh6kR1YvDh7UlbxvJmRl6+vkkxEOHkZZ6B575b3Mzm+20LBfw4gU7maajs/16Q==", + "dev": true, + "requires": { + "@percy/cli-command": "1.17.0", + "fast-glob": "^3.2.11", + "image-size": "^1.0.0" + } + }, + "@percy/client": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/client/-/client-1.17.0.tgz", + "integrity": "sha512-7ur4SN/FLf7wPDcJyOMquQT3oCRVZ9Up4Ux3zbRV8eaYgdmnkpYn1+F8uRqwwXLsVngWGqB0x+ckbQ2N0oXA4Q==", + "dev": true, + "requires": { + "@percy/env": "1.17.0", + "@percy/logger": "1.17.0" + } + }, + "@percy/config": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/config/-/config-1.17.0.tgz", + "integrity": "sha512-azAdqWHC3Neb5HC4sThvobuHsawiBBoRO6taBIrB6gO66mzhG76p1avChmsgZTeuAGIUE9gnF3GYW6FJiqnXAQ==", + "dev": true, + "requires": { + "@percy/logger": "1.17.0", + "ajv": "^8.6.2", + "cosmiconfig": "^7.0.0", + "yaml": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "@percy/core": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/core/-/core-1.17.0.tgz", + "integrity": "sha512-kIzSxKNEjwl+Y+86XHZfEYBFyvPvuISwGzKhmL/03lJRggvmH+eThHvB+P8zX1v/9wHEKA/YwQU8uSggZMN2yA==", + "dev": true, + "requires": { + "@percy/client": "1.17.0", + "@percy/config": "1.17.0", + "@percy/dom": "1.17.0", + "@percy/logger": "1.17.0", + "content-disposition": "^0.5.4", + "cross-spawn": "^7.0.3", + "extract-zip": "^2.0.1", + "fast-glob": "^3.2.11", + "micromatch": "^4.0.4", + "mime-types": "^2.1.34", + "path-to-regexp": "^6.2.0", + "rimraf": "^3.0.2", + "ws": "^8.0.0" + } + }, + "@percy/cypress": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@percy/cypress/-/cypress-3.1.2.tgz", + "integrity": "sha512-JXrGDZbqwkzQd2h5T5D7PvqoucNaiMh4ChPp8cLQiEtRuLHta9nf1lEuXH+jnatGL2j+3jJFIHJ0L7XrgVnvQA==", + "dev": true, + "requires": { + "@percy/sdk-utils": "^1.3.1" + } + }, + "@percy/dom": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/dom/-/dom-1.17.0.tgz", + "integrity": "sha512-C6qaqOk4p8ax/gPruQtVy+Ml7Yb6nWpKYThk4afy4N0Jq9hZa0qBzlVE1vO4jtxHK8JaZ2lXGG4Gdxz4FOQuMA==", + "dev": true + }, + "@percy/env": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/env/-/env-1.17.0.tgz", + "integrity": "sha512-z6O7VauoKXDq66hS8HhVmR2poJZLdM0xVAJ7XBmfdalVnnCSzub1Fjubd12eN12Gt9fZpX8WCeOI8+0PjAAspQ==", + "dev": true + }, + "@percy/logger": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.17.0.tgz", + "integrity": "sha512-UEzXcoxwDl8SfvJc4Gy0Ib8lYKDxM7WkgVsg/C5bniUyKuqpDnJdvqiV82vzOVI9nmlYikCG09ebZbNIjnXDWg==", + "dev": true + }, + "@percy/sdk-utils": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@percy/sdk-utils/-/sdk-utils-1.17.0.tgz", + "integrity": "sha512-qmNHetNW6GjoxWzKbo6mOngVhKL0ofTEIBBCsBdpdcJsBDrvT1xVoht6xqiRMRLNLaLmIb8RijgPPpUxaShK2w==", + "dev": true + }, + "@strata/cypress": { + "version": "1.7.0", + "resolved": "https://proget.sdt.local/npm/npm/@strata/cypress/-/cypress-1.7.0.tgz", + "integrity": "sha512-o2BYymQc+ITq8UMyPGxDZU7yoND6kTzlOC8MA+KirPkmY1UO7JRdoIDaKmbqPeoYaCyWZ5ThrtuC3nJF5cyWsQ==", + "requires": { + "jwt-decode": "^3.1.2" + } + }, + "@strata/eslint-config": { + "version": "3.6.0", + "resolved": "https://proget.sdt.local/npm/npm/@strata/eslint-config/-/eslint-config-3.6.0.tgz", + "integrity": "sha512-soD6eIAlhxi20zM5I4rmzhbD/4XIYc/elSpdF+g6C7GVmfyhepJ8ty4CNMcY2HPYnfu/Uo4cjYRMrMaBFIDA1A==", + "requires": { + "@typescript-eslint/parser": "^4.15.2", + "babel-eslint": "^10.1.0", + "eslint-config-prettier": "^7.1.0", + "eslint-config-react-app": "^6.0.0" + } + }, + "@testing-library/cypress": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-8.0.2.tgz", + "integrity": "sha512-KVdm7n37sg/A4e3wKMD4zUl0NpzzVhx06V9Tf0hZHZ7nrZ4yFva6Zwg2EFF1VzHkEfN/ahUzRtT1qiW+vuWnJw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.14.6", + "@testing-library/dom": "^8.1.0" + } + }, + "@testing-library/dom": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.11.1.tgz", + "integrity": "sha512-3KQDyx9r0RKYailW2MiYrSSKEfH0GTkI51UGEvJenvcoDoeRYs0PZpi2SXqtnMClQvCqdtTTpOfFETDTVADpAg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.4.4", + "pretty-format": "^27.0.2" + } + }, + "@types/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", + "dev": true + }, + "@types/cypress": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/cypress/-/cypress-1.1.3.tgz", + "integrity": "sha512-OXe0Gw8LeCflkG1oPgFpyrYWJmEKqYncBsD/J0r17r0ETx/TnIGDNLwXt/pFYSYuYTpzcq1q3g62M9DrfsBL4g==", + "dev": true, + "peer": true, + "requires": { + "cypress": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "@types/node": { + "version": "16.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", + "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true + }, + "@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", + "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", + "requires": { + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", + "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", + "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "requires": { + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "debug": "^4.3.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "requires": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" + } + }, + "@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==" + }, + "@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "requires": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "requires": { + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} + }, + "adler-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz", + "integrity": "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==", + "dev": true, + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", + "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", + "dev": true + }, + "array-includes": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "array.prototype.flat": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + } + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, + "async": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "axe-core": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", + "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==" + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "cfb": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.1.tgz", + "integrity": "sha512-wT2ScPAFGSVy7CY+aauMezZBnNrfnaLSrxHUHdea+Td/86vrk6ZquggV+ssBR88zNs0OnBkL2+lf9q0K+zVGzQ==", + "dev": true, + "requires": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0", + "printj": "~1.3.0" + }, + "dependencies": { + "adler-32": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.0.tgz", + "integrity": "sha512-f5nltvjl+PRUh6YNfUstRaXwJxtfnKEWhAWWlmKvh+Y3J2+98a0KKVYDEhz6NdKGqswLhjNGznxfSsZGOvOd9g==", + "dev": true, + "requires": { + "printj": "~1.2.2" + }, + "dependencies": { + "printj": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.2.3.tgz", + "integrity": "sha512-sanczS6xOJOg7IKDvi4sGOUOe7c1tsEzjwlLFH/zgwx/uyImVM9/rgBkc8AfiQa/Vg54nRd8mkm9yI7WV/O+WA==", + "dev": true + } + } + }, + "printj": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.3.0.tgz", + "integrity": "sha512-017o8YIaz8gLhaNxRB9eBv2mWXI2CtzhPJALnQTP+OPpuUfP0RMWqr/mHCzqVeu1AQxfzSfAtAq66vKB8y7Lzg==", + "dev": true + } + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true + }, + "ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + } + }, + "core-js-pure": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.2.tgz", + "integrity": "sha512-ItD7YpW1cUB4jaqFLZXe1AXkyqIxz6GqPnsDV4uF4hVcWh/WAGIqSqw5p0/WdsILM0Xht9s3Koyw05R3K6RtiA==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + } + } + }, + "crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "dev": true, + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cypress": { + "version": "9.5.3", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.5.3.tgz", + "integrity": "sha512-ItelIVmqMTnKYbo1JrErhsGgQGjWOxCpHT1TfMvwnIXKXN/OSlPjEK7rbCLYDZhejQL99PmUqul7XORI24Ik0A==", + "dev": true, + "requires": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "eventemitter2": "^6.4.3", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.6", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.3.2", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "@types/node": { + "version": "14.17.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.33.tgz", + "integrity": "sha512-noEeJ06zbn3lOh4gqe2v7NMGS33jrulfNqYFDjjEbhpDEHR5VTxgYNQSBqBlJIsBJW3uEYDgD6kvMnrrhGzq8g==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cypress-file-upload": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz", + "integrity": "sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g==", + "dev": true, + "requires": {} + }, + "cypress-iframe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cypress-iframe/-/cypress-iframe-1.0.1.tgz", + "integrity": "sha512-Ne+xkZmWMhfq3x6wbfzK/SzsVTCrJru3R3cLXsoSAZyfUtJDamXyaIieHXeea3pQDXF4wE2w4iUuvCYHhoD31g==", + "dev": true, + "requires": {} + }, + "damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-accessibility-api": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.10.tgz", + "integrity": "sha512-Xu9mD0UjrJisTmv7lmVSDMagQcU9R5hwAbxsaAE/35XPnPLJobbuREfV/rraiSaEj/UOvgrzQs66zyTWTlyd+g==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", + "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.2", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "eslint-config-prettier": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", + "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", + "requires": {} + }, + "eslint-config-react-app": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", + "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", + "requires": { + "confusing-browser-globals": "^1.0.10" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-flowtype": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.10.0.tgz", + "integrity": "sha512-vcz32f+7TP+kvTUyMXZmCnNujBQZDNmcqPImw8b9PZ+16w1Qdm6ryRuYZYVaG9xRqqmAPr2Cs9FAX5gN+x/bjw==", + "requires": { + "lodash": "^4.17.15", + "string-natural-compare": "^3.0.1" + } + }, + "eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", + "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", + "requires": { + "@babel/runtime": "^7.18.9", + "aria-query": "^4.2.2", + "array-includes": "^3.1.5", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.4.3", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.2", + "language-tags": "^1.0.5", + "minimatch": "^3.1.2", + "semver": "^6.3.0" + }, + "dependencies": { + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "eslint-plugin-prettier": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.31.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", + "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", + "requires": { + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.1", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.7" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "requires": {} + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + } + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "eventemitter2": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.5.tgz", + "integrity": "sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw==", + "dev": true + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + } + }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "dev": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "requires": { + "async": "^3.2.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "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" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "requires": { + "ini": "2.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + }, + "image-size": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", + "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "dev": true, + "requires": { + "queue": "6.0.2" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.6.tgz", + "integrity": "sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q==" + }, + "is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "requires": { + "ci-info": "^3.2.0" + } + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "requires": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + } + }, + "jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + }, + "language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, + "lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "listr2": { + "version": "3.13.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.13.4.tgz", + "integrity": "sha512-lZ1Rut1DSIRwbxQbI8qaUBfOWJ1jEYRgltIM97j6kKOCI2pHVWMyxZvkU/JKmRBWcIYgDS2PK+yDgVqm7u3crw==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "clone": "^2.1.2", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^7.4.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "requires": { + "mime-db": "1.51.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node-xlsx": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/node-xlsx/-/node-xlsx-0.17.2.tgz", + "integrity": "sha512-j92dGS8KvGPi6YpYovHrR9zWiyDONx7DiGhl1SjM+vzxAh3do6hmerFCyN+hRuK7QhwHdwzfpYxZm+hKA/uErA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.15.4", + "buffer-from": "^1.1.2", + "xlsx": "^0.17.2" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.hasown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@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" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==" + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, + "pretty-format": { + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.3.1.tgz", + "integrity": "sha512-DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA==", + "dev": true, + "requires": { + "@jest/types": "^27.2.5", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true + }, + "queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dev": true, + "requires": { + "inherits": "~2.0.3" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + }, + "request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "requires": { + "throttleit": "^1.0.0" + } + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rxjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "dev": true, + "requires": { + "tslib": "~2.1.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "dev": true, + "requires": { + "frac": "~1.1.2" + } + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "requires": { + "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" + } + }, + "string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "table": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", + "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "typescript": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==" + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "dev": true + }, + "word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "ws": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "dev": true, + "requires": {} + }, + "xlsx": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.17.4.tgz", + "integrity": "sha512-9aKt8g9ZLP0CUdBX8L5xnoMDFwSiLI997eQnDThCaqQMYB9AEBIRzblSSNN/ICMGLYIHUO3VKaItcedZJ3ijIg==", + "dev": true, + "requires": { + "adler-32": "~1.2.0", + "cfb": "^1.1.4", + "codepage": "~1.15.0", + "crc-32": "~1.2.0", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", + "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", + "dev": true + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/cypress/package.json b/cypress/package.json new file mode 100644 index 0000000..7615e2b --- /dev/null +++ b/cypress/package.json @@ -0,0 +1,45 @@ +{ + "name": "advanced-analytics-e2e", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "cypress open", + "test-local": "cypress open --env fileconfig=local", + "test-dev": "cypress open --env fileconfig=development" + }, + "eslintConfig": { + "extends": "@strata" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "@percy/cli": "^1.17.0", + "@percy/cypress": "^3.1.2", + "@testing-library/cypress": "^8.0.2", + "@types/node": "^16.11.6", + "cypress": "^9.5.3", + "cypress-file-upload": "^5.0.8", + "cypress-iframe": "^1.0.1", + "js-base64": "^2.5.2", + "node-xlsx": "^0.17.2", + "typescript": "^4.6.3" + }, + "dependencies": { + "@strata/cypress": "^1.7.0", + "@strata/eslint-config": "^3.6.0", + "@typescript-eslint/eslint-plugin": "^4.28.0", + "dayjs": "^1.11.7", + "eslint": "^7.29.0", + "eslint-plugin-flowtype": "^5.7.2", + "eslint-plugin-import": "^2.23.4", + "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-react": "^7.24.0", + "eslint-plugin-react-hooks": "^4.2.0", + "prettier": "^2.3.1" + }, + "volta": { + "node": "14.19.1" + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..245b631 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,47 @@ +version: "3" + +services: + analytics-api: + build: + context: . + dockerfile: Dockerfile.api + ports: + - "8080:80" + - "8443:443" + environment: - hangfire__redis__prefix=analytics + - hangfire__redis__configOptions=redis:6379 + analytics-hangfire: + build: + context: . + dockerfile: Dockerfile.hangfire + environment: + - hangfire__redis__prefix=analytics + - hangfire__redis__configOptions=redis:6379 + analytics-hangfire-dashboard: + build: + context: . + dockerfile: Dockerfile.dashboard + ports: + - 8082:80 + environment: + - hangfire__redis__prefix=analytics + - hangfire__redis__configOptions=redis:6379 + redis: + image: redis:alpine + ports: + - 6379:6379 + command: ["redis-server", "--appendonly", "yes"] + volumes: + - redis-data:/data + redis-commander: + image: rediscommander/redis-commander:latest + environment: + - REDIS_HOSTS=local:redis:6379 + - HTTP_USER=root + - HTTP_PASSWORD=pass + ports: + - 8081:8081 + depends_on: + - redis +volumes: + redis-data: diff --git a/loadTest/docker/Dockerfile b/loadTest/docker/Dockerfile new file mode 100644 index 0000000..6afe6a0 --- /dev/null +++ b/loadTest/docker/Dockerfile @@ -0,0 +1,10 @@ +FROM golang:1-alpine as builder +WORKDIR $GOPATH/src/github.com/loadimpact/k6 +ADD . . +RUN apk --no-cache add --virtual .build-deps git make build-base && \ + go get . && CGO_ENABLED=0 go install -a -ldflags '-s -w' + +FROM alpine:3.7 +RUN apk add --no-cache ca-certificates +COPY --from=builder /go/bin/k6 /usr/bin/k6 +ENTRYPOINT ["k6"] diff --git a/loadTest/docker/Dockerfile.grafana b/loadTest/docker/Dockerfile.grafana new file mode 100644 index 0000000..5a05c26 --- /dev/null +++ b/loadTest/docker/Dockerfile.grafana @@ -0,0 +1,19 @@ +FROM grafana/grafana:5.2.4 + +USER root + +RUN apt-get update && apt-get -y install curl + + +# Change the default data directory (otherwise grafana.db won't persist) +RUN mkdir /var/lib/grafanadb +ENV GF_PATHS_DATA /var/lib/grafanadb + +# Init Grafana sqlite db and preconfigure our data source to be our influxdb k6 db +RUN bash -c '/run.sh & sleep 15 && curl -s -H "Content-Type: application/json" -X POST \ + --data '"'"'{"name": "myinfluxdb", "type": "influxdb", "access": "proxy", "url": "http://influxdb:8086", "database": "k6", "isDefault": true}'"'"' \ + http://admin:admin@localhost:3000/api/datasources \ + && kill -SIGINT %%' + + +CMD ["/run.sh"] diff --git a/loadTest/docker/Dockerfile.influxdb b/loadTest/docker/Dockerfile.influxdb new file mode 100644 index 0000000..d260d72 --- /dev/null +++ b/loadTest/docker/Dockerfile.influxdb @@ -0,0 +1,6 @@ +FROM influxdb:1.8 + +# Create a k6 db +RUN /bin/bash -c "influxd run & sleep 5 && influx -execute 'CREATE DATABASE k6' && kill %1 && sleep 5" + +CMD ["influxd"] diff --git a/loadTest/docker/dashboards/grafana-dashboard.yaml b/loadTest/docker/dashboards/grafana-dashboard.yaml new file mode 100644 index 0000000..0e5b911 --- /dev/null +++ b/loadTest/docker/dashboards/grafana-dashboard.yaml @@ -0,0 +1,8 @@ +apiVersion: 1 +providers: + - name: 'default' + org_id: 1 + folder: '' + type: 'file' + options: + path: /var/lib/grafana/dashboards \ No newline at end of file diff --git a/loadTest/docker/dashboards/grafana-datasource.yaml b/loadTest/docker/dashboards/grafana-datasource.yaml new file mode 100644 index 0000000..7e5b4d8 --- /dev/null +++ b/loadTest/docker/dashboards/grafana-datasource.yaml @@ -0,0 +1,9 @@ +apiVersion: 1 + +datasources: + - name: k6influxdb + type: influxdb + access: proxy + database: k6 + url: http://influxdb:8086 + isDefault: true \ No newline at end of file diff --git a/loadTest/docker/dashboards/http.json b/loadTest/docker/dashboards/http.json new file mode 100644 index 0000000..f29295a --- /dev/null +++ b/loadTest/docker/dashboards/http.json @@ -0,0 +1,1607 @@ +{ + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "4.4.1" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, + { + "type": "panel", + "id": "heatmap", + "name": "Heatmap", + "version": "" + }, + { + "type": "datasource", + "id": "influxdb", + "name": "InfluxDB", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "singlestat", + "name": "Singlestat", + "version": "" + } + ], + "annotations": { + "list": [] + }, + "description": "http dash", + "editable": true, + "gnetId": 2588, + "graphTooltip": 2, + "hideControls": false, + "id": null, + "links": [], + "refresh": "5s", + "rows": [ + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "k6influxdb", + "fill": 1, + "id": 1, + "interval": ">1s", + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": false, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "Active VUs", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "vus", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Virtual Users", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "k6influxdb", + "fill": 1, + "id": 17, + "interval": "1s", + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": false, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 3, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "Requests per Second", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "http_reqs", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "sum" + } + ] + ], + "tags": [] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests per Second", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "k6influxdb", + "fill": 1, + "id": 7, + "interval": "1s", + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": false, + "min": false, + "show": true, + "total": true, + "values": true + }, + "lines": false, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "Num Errors", + "color": "#BF1B00" + } + ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "alias": "Num Errors", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "errors", + "orderByTime": "ASC", + "policy": "default", + "refId": "C", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "count" + } + ] + ], + "tags": [] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Errors Per Second", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "k6influxdb", + "fill": 1, + "id": 10, + "interval": ">1s", + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": false, + "min": false, + "show": true, + "total": true, + "values": true + }, + "lines": false, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "Num Errors", + "color": "#BF1B00" + } + ], + "spaceLength": 10, + "span": 3, + "stack": true, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_check", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "check" + ], + "type": "tag" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "checks", + "orderByTime": "ASC", + "policy": "default", + "refId": "C", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "sum" + } + ] + ], + "tags": [] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Checks Per Second", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": false, + "title": "Dashboard Row", + "titleSize": "h6" + }, + { + "collapse": false, + "height": "", + "panels": [ + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "50px", + "id": 11, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "span": 2, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT mean(\"value\") FROM $Measurement WHERE $timeFilter ", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (mean)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "50px", + "id": 14, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "span": 2, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT max(\"value\") FROM $Measurement WHERE $timeFilter", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (max)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "50px", + "id": 15, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "span": 2, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT median(\"value\") FROM $Measurement WHERE $timeFilter", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (med)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "50px", + "id": 16, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "span": 2, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT min(\"value\") FROM $Measurement WHERE $timeFilter and value > 0", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (min)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "50px", + "id": 12, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "span": 2, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 90) FROM $Measurement WHERE $timeFilter", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (p90)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "50px", + "id": 13, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "span": 2, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 95) FROM $Measurement WHERE $timeFilter ", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (p95)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "k6influxdb", + "description": "Grouped by 1 sec intervals", + "fill": 1, + "height": "250px", + "id": 5, + "interval": ">1s", + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "max", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT max(\"value\") FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY time($__interval) fill(none)", + "rawQuery": true, + "refId": "C", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "max" + } + ] + ], + "tags": [] + }, + { + "alias": "p95", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 95) FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY time($__interval) fill(none)", + "rawQuery": true, + "refId": "D", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [ + 95 + ], + "type": "percentile" + } + ] + ], + "tags": [] + }, + { + "alias": "p90", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 90) FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY time($__interval) fill(none)", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [ + "90" + ], + "type": "percentile" + } + ] + ], + "tags": [] + }, + { + "alias": "min", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT min(\"value\") FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY time($__interval) fill(none)", + "rawQuery": true, + "refId": "E", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "min" + } + ] + ], + "tags": [] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "$Measurement (over time)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": null, + "logBase": 2, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "rgb(0, 234, 255)", + "colorScale": "sqrt", + "colorScheme": "interpolateRdYlGn", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "timeseries", + "datasource": "k6influxdb", + "heatmap": {}, + "height": "250px", + "highlightCards": true, + "id": 8, + "interval": ">1s", + "links": [], + "span": 6, + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "http_req_duration", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT \"value\" FROM $Measurement WHERE $timeFilter and value > 0", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "title": "$Measurement (over time)", + "tooltip": { + "show": true, + "showHistogram": true + }, + "tooltipDecimals": null, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 2, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketNumber": null, + "yBucketSize": null + } + ], + "repeat": "Measurement", + "repeatIteration": null, + "repeatRowId": null, + "showTitle": true, + "title": "$Measurement", + "titleSize": "h6" + }, + { + "collapse": false, + "height": 250, + "panels": [], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": false, + "title": "Dashboard Row", + "titleSize": "h6" + } + ], + "schemaVersion": 14, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": { + "selected": true, + "tags": [], + "text": "http_req_duration + http_req_blocked", + "value": [ + "http_req_duration", + "http_req_blocked" + ] + }, + "hide": 0, + "includeAll": true, + "label": null, + "multi": true, + "name": "Measurement", + "options": [ + { + "selected": false, + "text": "All", + "value": "$__all" + }, + { + "selected": true, + "text": "http_req_duration", + "value": "http_req_duration" + }, + { + "selected": true, + "text": "http_req_blocked", + "value": "http_req_blocked" + }, + { + "selected": false, + "text": "http_req_connecting", + "value": "http_req_connecting" + }, + { + "selected": false, + "text": "http_req_looking_up", + "value": "http_req_looking_up" + }, + { + "selected": false, + "text": "http_req_receiving", + "value": "http_req_receiving" + }, + { + "selected": false, + "text": "http_req_sending", + "value": "http_req_sending" + }, + { + "selected": false, + "text": "http_req_waiting", + "value": "http_req_waiting" + } + ], + "query": "http_req_duration,http_req_blocked,http_req_connecting,http_req_looking_up,http_req_receiving,http_req_sending,http_req_waiting", + "type": "custom" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "browser", + "title": "http", + "version": 22 +} \ No newline at end of file diff --git a/loadTest/docker/dashboards/ws.json b/loadTest/docker/dashboards/ws.json new file mode 100644 index 0000000..70c4840 --- /dev/null +++ b/loadTest/docker/dashboards/ws.json @@ -0,0 +1,5175 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "ws dash", + "editable": true, + "gnetId": 2587, + "graphTooltip": 2, + "iteration": 1607537983601, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 18, + "panels": [], + "repeat": null, + "title": "Dashboard Row", + "type": "row" + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "k6influxdb", + "fill": 1, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 1 + }, + "id": 1, + "interval": ">1s", + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": false, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "Active VUs", + "color": "#3f2b5b" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "Active VUs", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "vus", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Virtual Users", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "k6influxdb", + "fill": 1, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 1 + }, + "id": 17, + "interval": "1s", + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": false, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "Requests per Second", + "color": "#ea6460" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "Requests per Second", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "iterations", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT sum(\"value\") FROM \"iterations\" WHERE $timeFilter GROUP BY time($__interval) fill(null)", + "rawQuery": false, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "sum" + } + ] + ], + "tags": [] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests per Second", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "reqps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "k6influxdb", + "fill": 1, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 1 + }, + "id": 7, + "interval": "1s", + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": false, + "min": false, + "show": true, + "sort": null, + "sortDesc": null, + "total": true, + "values": true + }, + "lines": false, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "Sessions", + "color": "#1f78c1" + } + ], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "alias": "Sessions", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "ws_sessions", + "orderByTime": "ASC", + "policy": "default", + "refId": "C", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "count" + } + ] + ], + "tags": [] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Sessions", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "k6influxdb", + "decimals": null, + "fill": 1, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 1 + }, + "id": 10, + "interval": ">1s", + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "show": true, + "sort": "total", + "sortDesc": false, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "data received", + "color": "#890f02" + }, + { + "alias": "data sent", + "color": "#508642" + } + ], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "alias": "data received", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "check" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "measurement": "data_received", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "sum" + } + ] + ], + "tags": [] + }, + { + "alias": "data sent", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "check" + ], + "type": "tag" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "hide": false, + "measurement": "data_sent", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT sum(\"value\") FROM \"ws_connecting\" WHERE $timeFilter GROUP BY time($__interval) fill(null)", + "rawQuery": false, + "refId": "C", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "sum" + } + ] + ], + "tags": [] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Data Sent", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 19, + "panels": [], + "repeat": "Measurement", + "scopedVars": { + "Measurement": { + "selected": true, + "text": "group_duration", + "value": "group_duration" + } + }, + "title": "$Measurement", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 0, + "y": 9 + }, + "height": "50px", + "id": 11, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "scopedVars": { + "Measurement": { + "selected": true, + "text": "group_duration", + "value": "group_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT mean(\"value\") FROM $Measurement WHERE $timeFilter ", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (mean)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 4, + "y": 9 + }, + "height": "50px", + "id": 14, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "scopedVars": { + "Measurement": { + "selected": true, + "text": "group_duration", + "value": "group_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT max(\"value\") FROM $Measurement WHERE $timeFilter", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (max)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 8, + "y": 9 + }, + "height": "50px", + "id": 15, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "scopedVars": { + "Measurement": { + "selected": true, + "text": "group_duration", + "value": "group_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT median(\"value\") FROM $Measurement WHERE $timeFilter", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (med)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 12, + "y": 9 + }, + "height": "50px", + "id": 16, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "scopedVars": { + "Measurement": { + "selected": true, + "text": "group_duration", + "value": "group_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT min(\"value\") FROM $Measurement WHERE $timeFilter and value > 0", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (min)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 16, + "y": 9 + }, + "height": "50px", + "id": 12, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "scopedVars": { + "Measurement": { + "selected": true, + "text": "group_duration", + "value": "group_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 75) FROM $Measurement WHERE $timeFilter", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (p75)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 20, + "y": 9 + }, + "height": "50px", + "id": 13, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "scopedVars": { + "Measurement": { + "selected": true, + "text": "group_duration", + "value": "group_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 95) FROM $Measurement WHERE $timeFilter ", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (p95)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "k6influxdb", + "description": "Grouped by 1 sec intervals", + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 12 + }, + "height": "250px", + "id": 5, + "interval": ">1s", + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "scopedVars": { + "Measurement": { + "selected": true, + "text": "group_duration", + "value": "group_duration" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "max$tag_group", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT max(\"value\") FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY \"group\", time($__interval) fill(none)", + "rawQuery": true, + "refId": "C", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "max" + } + ] + ], + "tags": [] + }, + { + "alias": "min$tag_group", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT min(\"value\") FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY \"group\", time($__interval) fill(none)", + "rawQuery": true, + "refId": "E", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "min" + } + ] + ], + "tags": [] + }, + { + "alias": "p95$tag_group", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 95) FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY \"group\", time($__interval) fill(none)", + "rawQuery": true, + "refId": "D", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [ + 95 + ], + "type": "percentile" + } + ] + ], + "tags": [] + }, + { + "alias": "p75$tag_group", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 75) FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY \"group\", time($__interval) fill(none)", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [ + "75" + ], + "type": "percentile" + } + ] + ], + "tags": [] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "$Measurement (over time)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": null, + "logBase": 2, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "rgb(0, 234, 255)", + "colorScale": "sqrt", + "colorScheme": "interpolateRdYlGn", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "timeseries", + "datasource": "k6influxdb", + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 12 + }, + "heatmap": {}, + "height": "250px", + "highlightCards": true, + "id": 8, + "interval": ">1s", + "legend": { + "show": false + }, + "links": [], + "scopedVars": { + "Measurement": { + "selected": true, + "text": "group_duration", + "value": "group_duration" + } + }, + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "ws_session_duration", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT \"value\" FROM $Measurement WHERE $timeFilter and value > 0", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "title": "$Measurement (over time)", + "tooltip": { + "show": true, + "showHistogram": true + }, + "tooltipDecimals": null, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 2, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 19 + }, + "id": 21, + "panels": [], + "repeat": null, + "repeatIteration": 1607537983601, + "repeatPanelId": 19, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "iteration_duration", + "value": "iteration_duration" + } + }, + "title": "$Measurement", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 0, + "y": 20 + }, + "height": "50px", + "id": 22, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 11, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "iteration_duration", + "value": "iteration_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT mean(\"value\") FROM $Measurement WHERE $timeFilter ", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (mean)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 4, + "y": 20 + }, + "height": "50px", + "id": 23, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 14, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "iteration_duration", + "value": "iteration_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT max(\"value\") FROM $Measurement WHERE $timeFilter", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (max)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 8, + "y": 20 + }, + "height": "50px", + "id": 24, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 15, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "iteration_duration", + "value": "iteration_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT median(\"value\") FROM $Measurement WHERE $timeFilter", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (med)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 12, + "y": 20 + }, + "height": "50px", + "id": 25, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 16, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "iteration_duration", + "value": "iteration_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT min(\"value\") FROM $Measurement WHERE $timeFilter and value > 0", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (min)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 16, + "y": 20 + }, + "height": "50px", + "id": 26, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 12, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "iteration_duration", + "value": "iteration_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 75) FROM $Measurement WHERE $timeFilter", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (p75)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 20, + "y": 20 + }, + "height": "50px", + "id": 27, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 13, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "iteration_duration", + "value": "iteration_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 95) FROM $Measurement WHERE $timeFilter ", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (p95)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "k6influxdb", + "description": "Grouped by 1 sec intervals", + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 23 + }, + "height": "250px", + "id": 28, + "interval": ">1s", + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatIteration": 1607537983601, + "repeatPanelId": 5, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "iteration_duration", + "value": "iteration_duration" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "max$tag_group", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT max(\"value\") FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY \"group\", time($__interval) fill(none)", + "rawQuery": true, + "refId": "C", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "max" + } + ] + ], + "tags": [] + }, + { + "alias": "min$tag_group", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT min(\"value\") FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY \"group\", time($__interval) fill(none)", + "rawQuery": true, + "refId": "E", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "min" + } + ] + ], + "tags": [] + }, + { + "alias": "p95$tag_group", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 95) FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY \"group\", time($__interval) fill(none)", + "rawQuery": true, + "refId": "D", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [ + 95 + ], + "type": "percentile" + } + ] + ], + "tags": [] + }, + { + "alias": "p75$tag_group", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 75) FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY \"group\", time($__interval) fill(none)", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [ + "75" + ], + "type": "percentile" + } + ] + ], + "tags": [] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "$Measurement (over time)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": null, + "logBase": 2, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "rgb(0, 234, 255)", + "colorScale": "sqrt", + "colorScheme": "interpolateRdYlGn", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "timeseries", + "datasource": "k6influxdb", + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 23 + }, + "heatmap": {}, + "height": "250px", + "highlightCards": true, + "id": 29, + "interval": ">1s", + "legend": { + "show": false + }, + "links": [], + "repeatIteration": 1607537983601, + "repeatPanelId": 8, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "iteration_duration", + "value": "iteration_duration" + } + }, + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "ws_session_duration", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT \"value\" FROM $Measurement WHERE $timeFilter and value > 0", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "title": "$Measurement (over time)", + "tooltip": { + "show": true, + "showHistogram": true + }, + "tooltipDecimals": null, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 2, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 30 + }, + "id": 30, + "panels": [], + "repeat": null, + "repeatIteration": 1607537983601, + "repeatPanelId": 19, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_session_duration", + "value": "ws_session_duration" + } + }, + "title": "$Measurement", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 0, + "y": 31 + }, + "height": "50px", + "id": 31, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 11, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_session_duration", + "value": "ws_session_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT mean(\"value\") FROM $Measurement WHERE $timeFilter ", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (mean)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 4, + "y": 31 + }, + "height": "50px", + "id": 32, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 14, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_session_duration", + "value": "ws_session_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT max(\"value\") FROM $Measurement WHERE $timeFilter", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (max)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 8, + "y": 31 + }, + "height": "50px", + "id": 33, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 15, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_session_duration", + "value": "ws_session_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT median(\"value\") FROM $Measurement WHERE $timeFilter", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (med)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 12, + "y": 31 + }, + "height": "50px", + "id": 34, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 16, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_session_duration", + "value": "ws_session_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT min(\"value\") FROM $Measurement WHERE $timeFilter and value > 0", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (min)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 16, + "y": 31 + }, + "height": "50px", + "id": 35, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 12, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_session_duration", + "value": "ws_session_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 75) FROM $Measurement WHERE $timeFilter", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (p75)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 20, + "y": 31 + }, + "height": "50px", + "id": 36, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 13, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_session_duration", + "value": "ws_session_duration" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 95) FROM $Measurement WHERE $timeFilter ", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (p95)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "k6influxdb", + "description": "Grouped by 1 sec intervals", + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 34 + }, + "height": "250px", + "id": 37, + "interval": ">1s", + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatIteration": 1607537983601, + "repeatPanelId": 5, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_session_duration", + "value": "ws_session_duration" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "max$tag_group", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT max(\"value\") FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY \"group\", time($__interval) fill(none)", + "rawQuery": true, + "refId": "C", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "max" + } + ] + ], + "tags": [] + }, + { + "alias": "min$tag_group", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT min(\"value\") FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY \"group\", time($__interval) fill(none)", + "rawQuery": true, + "refId": "E", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "min" + } + ] + ], + "tags": [] + }, + { + "alias": "p95$tag_group", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 95) FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY \"group\", time($__interval) fill(none)", + "rawQuery": true, + "refId": "D", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [ + 95 + ], + "type": "percentile" + } + ] + ], + "tags": [] + }, + { + "alias": "p75$tag_group", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 75) FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY \"group\", time($__interval) fill(none)", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [ + "75" + ], + "type": "percentile" + } + ] + ], + "tags": [] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "$Measurement (over time)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": null, + "logBase": 2, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "rgb(0, 234, 255)", + "colorScale": "sqrt", + "colorScheme": "interpolateRdYlGn", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "timeseries", + "datasource": "k6influxdb", + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 34 + }, + "heatmap": {}, + "height": "250px", + "highlightCards": true, + "id": 38, + "interval": ">1s", + "legend": { + "show": false + }, + "links": [], + "repeatIteration": 1607537983601, + "repeatPanelId": 8, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_session_duration", + "value": "ws_session_duration" + } + }, + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "ws_session_duration", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT \"value\" FROM $Measurement WHERE $timeFilter and value > 0", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "title": "$Measurement (over time)", + "tooltip": { + "show": true, + "showHistogram": true + }, + "tooltipDecimals": null, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 2, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 41 + }, + "id": 39, + "panels": [], + "repeat": null, + "repeatIteration": 1607537983601, + "repeatPanelId": 19, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_connecting", + "value": "ws_connecting" + } + }, + "title": "$Measurement", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 0, + "y": 42 + }, + "height": "50px", + "id": 40, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 11, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_connecting", + "value": "ws_connecting" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT mean(\"value\") FROM $Measurement WHERE $timeFilter ", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (mean)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 4, + "y": 42 + }, + "height": "50px", + "id": 41, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 14, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_connecting", + "value": "ws_connecting" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT max(\"value\") FROM $Measurement WHERE $timeFilter", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (max)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 8, + "y": 42 + }, + "height": "50px", + "id": 42, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 15, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_connecting", + "value": "ws_connecting" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT median(\"value\") FROM $Measurement WHERE $timeFilter", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (med)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 12, + "y": 42 + }, + "height": "50px", + "id": 43, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 16, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_connecting", + "value": "ws_connecting" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT min(\"value\") FROM $Measurement WHERE $timeFilter and value > 0", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (min)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 16, + "y": 42 + }, + "height": "50px", + "id": 44, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 12, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_connecting", + "value": "ws_connecting" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 75) FROM $Measurement WHERE $timeFilter", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (p75)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "k6influxdb", + "decimals": 2, + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 20, + "y": 42 + }, + "height": "50px", + "id": 45, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeatIteration": 1607537983601, + "repeatPanelId": 13, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_connecting", + "value": "ws_connecting" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 95) FROM $Measurement WHERE $timeFilter ", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "thresholds": "", + "title": "$Measurement (p95)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "k6influxdb", + "description": "Grouped by 1 sec intervals", + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 45 + }, + "height": "250px", + "id": 46, + "interval": ">1s", + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatIteration": 1607537983601, + "repeatPanelId": 5, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_connecting", + "value": "ws_connecting" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "max$tag_group", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT max(\"value\") FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY \"group\", time($__interval) fill(none)", + "rawQuery": true, + "refId": "C", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "max" + } + ] + ], + "tags": [] + }, + { + "alias": "min$tag_group", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT min(\"value\") FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY \"group\", time($__interval) fill(none)", + "rawQuery": true, + "refId": "E", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "min" + } + ] + ], + "tags": [] + }, + { + "alias": "p95$tag_group", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 95) FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY \"group\", time($__interval) fill(none)", + "rawQuery": true, + "refId": "D", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [ + 95 + ], + "type": "percentile" + } + ] + ], + "tags": [] + }, + { + "alias": "p75$tag_group", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "none" + ], + "type": "fill" + } + ], + "measurement": "/^$Measurement$/", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT percentile(\"value\", 75) FROM /^$Measurement$/ WHERE $timeFilter and value > 0 GROUP BY \"group\", time($__interval) fill(none)", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [ + "75" + ], + "type": "percentile" + } + ] + ], + "tags": [] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "$Measurement (over time)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": null, + "logBase": 2, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "rgb(0, 234, 255)", + "colorScale": "sqrt", + "colorScheme": "interpolateRdYlGn", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "timeseries", + "datasource": "k6influxdb", + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 45 + }, + "heatmap": {}, + "height": "250px", + "highlightCards": true, + "id": 47, + "interval": ">1s", + "legend": { + "show": false + }, + "links": [], + "repeatIteration": 1607537983601, + "repeatPanelId": 8, + "repeatedByRow": true, + "scopedVars": { + "Measurement": { + "selected": true, + "text": "ws_connecting", + "value": "ws_connecting" + } + }, + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "ws_session_duration", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT \"value\" FROM $Measurement WHERE $timeFilter and value > 0", + "rawQuery": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [] + } + ], + "title": "$Measurement (over time)", + "tooltip": { + "show": true, + "showHistogram": true + }, + "tooltipDecimals": null, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 2, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 52 + }, + "id": 20, + "panels": [], + "repeat": null, + "title": "Dashboard Row", + "type": "row" + } + ], + "refresh": "5s", + "schemaVersion": 16, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": { + "text": "group_duration + iteration_duration + ws_session_duration + ws_connecting", + "value": [ + "group_duration", + "iteration_duration", + "ws_session_duration", + "ws_connecting" + ] + }, + "hide": 0, + "includeAll": true, + "label": null, + "multi": true, + "name": "Measurement", + "options": [ + { + "selected": false, + "text": "All", + "value": "$__all" + }, + { + "selected": true, + "text": "group_duration", + "value": "group_duration" + }, + { + "selected": true, + "text": "iteration_duration", + "value": "iteration_duration" + }, + { + "selected": true, + "text": "ws_session_duration", + "value": "ws_session_duration" + }, + { + "selected": true, + "text": "ws_connecting", + "value": "ws_connecting" + } + ], + "query": "ws_session_duration,ws_connecting,http_req_connecting,http_req_looking_up,http_req_receiving,http_req_sending,http_req_waiting", + "type": "custom" + } + ] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "browser", + "title": "WS", + "uid": "GgeWVU0Mk", + "version": 1 +} \ No newline at end of file diff --git a/loadTest/docker/docker-compose.yml b/loadTest/docker/docker-compose.yml new file mode 100644 index 0000000..61b9bc9 --- /dev/null +++ b/loadTest/docker/docker-compose.yml @@ -0,0 +1,45 @@ +version: "3.4" +networks: + k6: + grafana: + influxdb: +services: + influxdb: + container_name: influxdb + image: influxdb:1.8 + networks: + - k6 + - grafana + ports: + - "8086:8086" + environment: + - INFLUXDB_DB=k6 + grafana: + container_name: grafana + image: grafana/grafana:7.5.5 + networks: + - grafana + ports: + - "3000:3000" + environment: + - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin + - GF_AUTH_ANONYMOUS_ENABLED=true + - GF_AUTH_BASIC_ENABLED=false + - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=grafana-datadog-datasource + - GF_INSTALL_PLUGINS=https://github.com/sirkjohannsen/grafana-datasource-datadog/archive/refs/heads/master.zip;datadog + + volumes: + - ./grafana:/var/lib/grafana + k6: + container_name: k6 + networks: + - k6 + image: grafana/k6:latest + environment: + - K6_OUT=influxdb=http://influxdb:8086/k6 + ports: + - "6565:6565" + volumes: + - ./testRunner:/testRunner + + diff --git a/loadTest/docker/grafana/alerting/1/__default__.tmpl b/loadTest/docker/grafana/alerting/1/__default__.tmpl new file mode 100644 index 0000000..5cae8cc --- /dev/null +++ b/loadTest/docker/grafana/alerting/1/__default__.tmpl @@ -0,0 +1,53 @@ + +{{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ if gt (.Alerts.Resolved | len) 0 }}, RESOLVED:{{ .Alerts.Resolved | len }}{{ end }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join " " }} {{ if gt (len .CommonLabels) (len .GroupLabels) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join " " }}{{ end }}){{ end }}{{ end }} + +{{ define "__text_values_list" }}{{ $len := len .Values }}{{ if $len }}{{ $first := gt $len 1 }}{{ range $refID, $value := .Values -}} +{{ $refID }}={{ $value }}{{ if $first }}, {{ end }}{{ $first = false }}{{ end -}} +{{ else }}[no value]{{ end }}{{ end }} + +{{ define "__text_alert_list" }}{{ range . }} +Value: {{ template "__text_values_list" . }} +Labels: +{{ range .Labels.SortedPairs }} - {{ .Name }} = {{ .Value }} +{{ end }}Annotations: +{{ range .Annotations.SortedPairs }} - {{ .Name }} = {{ .Value }} +{{ end }}{{ if gt (len .GeneratorURL) 0 }}Source: {{ .GeneratorURL }} +{{ end }}{{ if gt (len .SilenceURL) 0 }}Silence: {{ .SilenceURL }} +{{ end }}{{ if gt (len .DashboardURL) 0 }}Dashboard: {{ .DashboardURL }} +{{ end }}{{ if gt (len .PanelURL) 0 }}Panel: {{ .PanelURL }} +{{ end }}{{ end }}{{ end }} + +{{ define "default.title" }}{{ template "__subject" . }}{{ end }} + +{{ define "default.message" }}{{ if gt (len .Alerts.Firing) 0 }}**Firing** +{{ template "__text_alert_list" .Alerts.Firing }}{{ if gt (len .Alerts.Resolved) 0 }} + +{{ end }}{{ end }}{{ if gt (len .Alerts.Resolved) 0 }}**Resolved** +{{ template "__text_alert_list" .Alerts.Resolved }}{{ end }}{{ end }} + + +{{ define "__teams_text_alert_list" }}{{ range . }} +Value: {{ template "__text_values_list" . }} +Labels: +{{ range .Labels.SortedPairs }} - {{ .Name }} = {{ .Value }} +{{ end }} +Annotations: +{{ range .Annotations.SortedPairs }} - {{ .Name }} = {{ .Value }} +{{ end }} +{{ if gt (len .GeneratorURL) 0 }}Source: [{{ .GeneratorURL }}]({{ .GeneratorURL }}) + +{{ end }}{{ if gt (len .SilenceURL) 0 }}Silence: [{{ .SilenceURL }}]({{ .SilenceURL }}) + +{{ end }}{{ if gt (len .DashboardURL) 0 }}Dashboard: [{{ .DashboardURL }}]({{ .DashboardURL }}) + +{{ end }}{{ if gt (len .PanelURL) 0 }}Panel: [{{ .PanelURL }}]({{ .PanelURL }}) + +{{ end }} +{{ end }}{{ end }} + + +{{ define "teams.default.message" }}{{ if gt (len .Alerts.Firing) 0 }}**Firing** +{{ template "__teams_text_alert_list" .Alerts.Firing }}{{ if gt (len .Alerts.Resolved) 0 }} + +{{ end }}{{ end }}{{ if gt (len .Alerts.Resolved) 0 }}**Resolved** +{{ template "__teams_text_alert_list" .Alerts.Resolved }}{{ end }}{{ end }} diff --git a/loadTest/docker/grafana/grafana.db b/loadTest/docker/grafana/grafana.db new file mode 100644 index 0000000000000000000000000000000000000000..8788f64a7db94be3401e168d889d85ddfdd1e8d0 GIT binary patch literal 3883008 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ɐ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 UXpA|QiqzYmDgEPrYup0=2ZPdRTL1t6 literal 0 HcmV?d00001 diff --git a/loadTest/docker/grafana/plugins/datadog/.gitattributes b/loadTest/docker/grafana/plugins/datadog/.gitattributes new file mode 100644 index 0000000..7ad0b88 --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/.gitattributes @@ -0,0 +1,3 @@ +# Don't diff files in dist/ +*.map binary +dist/** binary diff --git a/loadTest/docker/grafana/plugins/datadog/.gitignore b/loadTest/docker/grafana/plugins/datadog/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/loadTest/docker/grafana/plugins/datadog/.jscs.json b/loadTest/docker/grafana/plugins/datadog/.jscs.json new file mode 100644 index 0000000..a51ef66 --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/.jscs.json @@ -0,0 +1,14 @@ +{ + "esnext": true, + "disallowImplicitTypeConversion": ["string"], + "disallowKeywords": ["with"], + "disallowMultipleLineBreaks": true, + "disallowMixedSpacesAndTabs": true, + "disallowTrailingWhitespace": true, + "requireSpacesInFunctionExpression": { + "beforeOpeningCurlyBrace": true + }, + "disallowSpacesInsideArrayBrackets": true, + "disallowSpacesInsideParentheses": true, + "validateIndentation": 2 +} diff --git a/loadTest/docker/grafana/plugins/datadog/.jshintrc b/loadTest/docker/grafana/plugins/datadog/.jshintrc new file mode 100644 index 0000000..5105f35 --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/.jshintrc @@ -0,0 +1,42 @@ +{ + "browser": true, + "esnext": true, + "bitwise":false, + "curly": true, + "eqnull": true, + "strict": false, + "devel": true, + "eqeqeq": true, + "forin": false, + "immed": true, + "supernew": true, + "expr": true, + "indent": 2, + "latedef": false, + "newcap": true, + "noarg": true, + "noempty": true, + "undef": true, + "boss": true, + "trailing": true, + "laxbreak": true, + "laxcomma": true, + "sub": true, + "unused": true, + "maxdepth": 6, + "maxlen": 140, + + "globals": { + "System": true, + "Promise": true, + "define": true, + "require": true, + "Chromath": false, + "setImmediate": true, + "describe": true, + "beforeEach": true, + "it": true, + "expect": true, + "EventSource": true + } +} diff --git a/loadTest/docker/grafana/plugins/datadog/.travis.yml b/loadTest/docker/grafana/plugins/datadog/.travis.yml new file mode 100644 index 0000000..91baf28 --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +before_script: + - npm install -g grunt +script: grunt diff --git a/loadTest/docker/grafana/plugins/datadog/Gruntfile.js b/loadTest/docker/grafana/plugins/datadog/Gruntfile.js new file mode 100644 index 0000000..f7ae189 --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/Gruntfile.js @@ -0,0 +1,144 @@ +module.exports = function(grunt) { + + require('load-grunt-tasks')(grunt); + + grunt.loadNpmTasks('grunt-execute'); + grunt.loadNpmTasks('grunt-contrib-clean'); + grunt.loadNpmTasks('grunt-contrib-watch'); + + grunt.initConfig({ + + clean: ["dist"], + + copy: { + src_to_dist: { + cwd: 'src', + expand: true, + src: ['**/*', '!**/*.js', '!**/*.scss'], + dest: 'dist' + }, + vendor_to_dist: { + cwd: 'vendor', + expand: true, + src: ['**/*'], + dest: 'dist' + }, + vendor_to_test: { + cwd: 'vendor', + expand: true, + src: ['**/*'], + dest: 'dist/test' + }, + pluginDef: { + expand: true, + src: ['README.md'], + dest: 'dist' + } + }, + + watch: { + rebuild_all: { + files: ['src/**/*'], + tasks: ['watchTask'], + options: {spawn: false} + } + }, + + babel: { + options: { + sourceMap: true, + presets: ['es2015'] + }, + dist: { + options: { + plugins: ['transform-es2015-modules-systemjs', 'transform-es2015-for-of'] + }, + files: [{ + cwd: 'src', + expand: true, + src: ['**/*.js'], + dest: 'dist', + ext:'.js' + }] + }, + distTestNoSystemJs: { + files: [{ + cwd: 'src', + expand: true, + src: ['**/*.js'], + dest: 'dist/test', + ext:'.js' + }] + }, + distTestsSpecsNoSystemJs: { + files: [{ + expand: true, + cwd: 'spec', + src: ['**/*.js'], + dest: 'dist/test/spec', + ext:'.js' + }] + } + }, + + jshint: { + source: { + files: { + src: ['src/**/*.js'], + } + }, + options: { + jshintrc: true, + reporter: require('jshint-stylish'), + ignores: [ + 'node_modules/*', + 'dist/*', + ] + } + }, + + jscs: { + src: ['src/**/*.js'], + options: { + config: ".jscs.json", + }, + }, + + mochaTest: { + test: { + options: { + reporter: 'spec' + }, + src: [ + 'dist/test/spec/test-main.js', + 'dist/test/spec/*_spec.js' + ] + } + } + + }); + + grunt.registerTask('default', [ + 'clean', + 'copy:src_to_dist', + 'copy:pluginDef', + 'jshint', + 'jscs', + 'babel', + 'copy:vendor_to_dist', + 'copy:vendor_to_test', + 'mochaTest' + ]); + + grunt.registerTask('dev', ['default', 'watch']); + + grunt.registerTask('watchTask', [ + // 'clean', + 'copy:src_to_dist', + 'copy:pluginDef', + 'babel', + 'copy:vendor_to_dist', + 'jshint', + 'jscs' + ]); +}; diff --git a/loadTest/docker/grafana/plugins/datadog/LICENSE b/loadTest/docker/grafana/plugins/datadog/LICENSE new file mode 100644 index 0000000..4644c8c --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Grafana + +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/loadTest/docker/grafana/plugins/datadog/README.md b/loadTest/docker/grafana/plugins/datadog/README.md new file mode 100644 index 0000000..0d149cd --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/README.md @@ -0,0 +1,30 @@ +# Datadog Grafana Datasource Plugin + +![Build Passing](https://travis-ci.org/voidfiles/grafana-datasource-datadog.svg?branch=master) + +Datadog has a nice dashboard system, but I was having trouble creating a dashboard that combined multiple datasources and grafana was the easiest way to bring it all together. + +## To Contribute + +Fork, make your change, and submit a Pull Request. Make sure you add tests where approprate, and don't break exisisting tests. + +## Usage + +### Query Editor +![query editor](https://cloud.githubusercontent.com/assets/4932851/22584216/337c26aa-ea02-11e6-84a8-20207bedd15b.png) + +It's easy - select aggregation and metric. If you want to filter result, select one or more tags. + +DataDog datasource supports advanced functions. Select it from dropdown and arrange by clicking function name. + +### Annotations +![annotations editor](https://cloud.githubusercontent.com/assets/4932851/22584362/1705598c-ea03-11e6-94a0-b51435d74420.png) + +Annotations allows to get events from DataDog and display it on graph. You can filter events by sources, tags and priority. + +### Templating +There are two options for getting values of tempate variable - metrics and tags. For fetching list of available metrics leave _Query_ field blank or specify `*`. For tags type `tag`. Filter results by using _Regex_ field. Multi-value variables are supported for using in tags (selected values will be converted into comma separated list of tags). + +#### Ad-hoc filters +There's new special type of template variable in Grafana called _Ad-hoc filters_. This variable will apply to _all_ DataDog queries on dashboard (all with specified datasource). This alollows to use it like a quick filter. Ad-hoc variable for DataDog fetches all key-value pairs from tags, for example, `region:east, region:west`, and use it as queries tags. To create this variable, select _Ad-hoc filters_ type and choose your DataDog datasource. You can set any name to this variable. + diff --git a/loadTest/docker/grafana/plugins/datadog/dist/README.md b/loadTest/docker/grafana/plugins/datadog/dist/README.md new file mode 100644 index 0000000..0d149cd --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/README.md @@ -0,0 +1,30 @@ +# Datadog Grafana Datasource Plugin + +![Build Passing](https://travis-ci.org/voidfiles/grafana-datasource-datadog.svg?branch=master) + +Datadog has a nice dashboard system, but I was having trouble creating a dashboard that combined multiple datasources and grafana was the easiest way to bring it all together. + +## To Contribute + +Fork, make your change, and submit a Pull Request. Make sure you add tests where approprate, and don't break exisisting tests. + +## Usage + +### Query Editor +![query editor](https://cloud.githubusercontent.com/assets/4932851/22584216/337c26aa-ea02-11e6-84a8-20207bedd15b.png) + +It's easy - select aggregation and metric. If you want to filter result, select one or more tags. + +DataDog datasource supports advanced functions. Select it from dropdown and arrange by clicking function name. + +### Annotations +![annotations editor](https://cloud.githubusercontent.com/assets/4932851/22584362/1705598c-ea03-11e6-94a0-b51435d74420.png) + +Annotations allows to get events from DataDog and display it on graph. You can filter events by sources, tags and priority. + +### Templating +There are two options for getting values of tempate variable - metrics and tags. For fetching list of available metrics leave _Query_ field blank or specify `*`. For tags type `tag`. Filter results by using _Regex_ field. Multi-value variables are supported for using in tags (selected values will be converted into comma separated list of tags). + +#### Ad-hoc filters +There's new special type of template variable in Grafana called _Ad-hoc filters_. This variable will apply to _all_ DataDog queries on dashboard (all with specified datasource). This alollows to use it like a quick filter. Ad-hoc variable for DataDog fetches all key-value pairs from tags, for example, `region:east, region:west`, and use it as queries tags. To create this variable, select _Ad-hoc filters_ type and choose your DataDog datasource. You can set any name to this variable. + diff --git a/loadTest/docker/grafana/plugins/datadog/dist/add_datadog_func.js b/loadTest/docker/grafana/plugins/datadog/dist/add_datadog_func.js new file mode 100644 index 0000000..6cb24cd --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/add_datadog_func.js @@ -0,0 +1,116 @@ +'use strict'; + +System.register(['angular', 'lodash', 'jquery', './dfunc'], function (_export, _context) { + "use strict"; + + var angular, _, $, dfunc; + + function getAllFunctionNames(categories) { + return _.reduce(categories, function (list, category) { + _.each(category, function (func) { + list.push(func.name); + }); + return list; + }, []); + } + + function createFunctionDropDownMenu(categories) { + return _.map(categories, function (list, category) { + return { + text: category, + submenu: _.map(list, function (value) { + return { + text: value.name, + click: "ctrl.addFunction('" + value.name + "')" + }; + }) + }; + }); + } + return { + setters: [function (_angular) { + angular = _angular.default; + }, function (_lodash) { + _ = _lodash.default; + }, function (_jquery) { + $ = _jquery.default; + }, function (_dfunc) { + dfunc = _dfunc.default; + }], + execute: function () { + + angular.module('grafana.directives').directive('datadogAddFunc', function ($compile) { + var inputTemplate = ''; + + var buttonTemplate = '' + ''; + + return { + link: function link($scope, elem) { + var categories = dfunc.getCategories(); + var allFunctions = getAllFunctionNames(categories); + var ctrl = $scope.ctrl; + + $scope.functionMenu = createFunctionDropDownMenu(categories); + + var $input = $(inputTemplate); + var $button = $(buttonTemplate); + $input.appendTo(elem); + $button.appendTo(elem); + + $input.attr('data-provide', 'typeahead'); + $input.typeahead({ + source: allFunctions, + minLength: 1, + items: 10, + updater: function updater(value) { + var funcDef = dfunc.getFuncDef(value); + if (!funcDef) { + // try find close match + value = value.toLowerCase(); + funcDef = _.find(allFunctions, function (funcName) { + return funcName.toLowerCase().indexOf(value) === 0; + }); + + if (!funcDef) { + return; + } + } + + $scope.$apply(function () { + ctrl.addFunction(funcDef); + }); + + $input.trigger('blur'); + return ''; + } + }); + + $button.click(function () { + $button.hide(); + $input.show(); + $input.focus(); + }); + + $input.keyup(function () { + elem.toggleClass('open', $input.val() === ''); + }); + + $input.blur(function () { + // clicking the function dropdown menu wont + // work if you remove class at once + setTimeout(function () { + $input.val(''); + $input.hide(); + $button.show(); + elem.removeClass('open'); + }, 200); + }); + + $compile(elem.contents())($scope); + } + }; + }); + } + }; +}); +//# sourceMappingURL=add_datadog_func.js.map diff --git a/loadTest/docker/grafana/plugins/datadog/dist/add_datadog_func.js.map b/loadTest/docker/grafana/plugins/datadog/dist/add_datadog_func.js.map new file mode 100644 index 0000000..6e1bd29 --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/add_datadog_func.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/add_datadog_func.js"],"names":["getAllFunctionNames","categories","_","reduce","list","category","each","func","push","name","createFunctionDropDownMenu","map","text","submenu","value","click","angular","$","dfunc","module","directive","$compile","inputTemplate","buttonTemplate","link","$scope","elem","getCategories","allFunctions","ctrl","functionMenu","$input","$button","appendTo","attr","typeahead","source","minLength","items","updater","funcDef","getFuncDef","toLowerCase","find","funcName","indexOf","$apply","addFunction","trigger","hide","show","focus","keyup","toggleClass","val","blur","setTimeout","removeClass","contents"],"mappings":";;;;;;;AAiFA,WAASA,mBAAT,CAA6BC,UAA7B,EAAyC;AACvC,WAAOC,EAAEC,MAAF,CAASF,UAAT,EAAqB,UAASG,IAAT,EAAeC,QAAf,EAAyB;AACnDH,QAAEI,IAAF,CAAOD,QAAP,EAAiB,UAASE,IAAT,EAAe;AAC9BH,aAAKI,IAAL,CAAUD,KAAKE,IAAf;AACD,OAFD;AAGA,aAAOL,IAAP;AACD,KALM,EAKJ,EALI,CAAP;AAMD;;AAED,WAASM,0BAAT,CAAoCT,UAApC,EAAgD;AAC9C,WAAOC,EAAES,GAAF,CAAMV,UAAN,EAAkB,UAASG,IAAT,EAAeC,QAAf,EAAyB;AAChD,aAAO;AACLO,cAAMP,QADD;AAELQ,iBAASX,EAAES,GAAF,CAAMP,IAAN,EAAY,UAASU,KAAT,EAAgB;AACnC,iBAAO;AACLF,kBAAME,MAAML,IADP;AAELM,mBAAO,uBAAuBD,MAAML,IAA7B,GAAoC;AAFtC,WAAP;AAID,SALQ;AAFJ,OAAP;AASD,KAVM,CAAP;AAWD;;;AAtGMO,a;;AACAd,O;;AACAe,O;;AACAC,W;;;;AAEPF,cACGG,MADH,CACU,oBADV,EAEGC,SAFH,CAEa,gBAFb,EAE+B,UAASC,QAAT,EAAmB;AAC9C,YAAIC,gBAAgB,uBACE,wBADF,GAEE,mDAFtB;;AAIA,YAAIC,iBAAiB,yDACG,kEADH,GAEG,gCAFxB;;AAIA,eAAO;AACLC,gBAAM,cAASC,MAAT,EAAiBC,IAAjB,EAAuB;AAC3B,gBAAIzB,aAAaiB,MAAMS,aAAN,EAAjB;AACA,gBAAIC,eAAe5B,oBAAoBC,UAApB,CAAnB;AACA,gBAAI4B,OAAOJ,OAAOI,IAAlB;;AAEAJ,mBAAOK,YAAP,GAAsBpB,2BAA2BT,UAA3B,CAAtB;;AAEA,gBAAI8B,SAASd,EAAEK,aAAF,CAAb;AACA,gBAAIU,UAAUf,EAAEM,cAAF,CAAd;AACAQ,mBAAOE,QAAP,CAAgBP,IAAhB;AACAM,oBAAQC,QAAR,CAAiBP,IAAjB;;AAEAK,mBAAOG,IAAP,CAAY,cAAZ,EAA4B,WAA5B;AACAH,mBAAOI,SAAP,CAAiB;AACfC,sBAAQR,YADO;AAEfS,yBAAW,CAFI;AAGfC,qBAAO,EAHQ;AAIfC,uBAAS,iBAAUzB,KAAV,EAAiB;AACxB,oBAAI0B,UAAUtB,MAAMuB,UAAN,CAAiB3B,KAAjB,CAAd;AACA,oBAAI,CAAC0B,OAAL,EAAc;AACZ;AACA1B,0BAAQA,MAAM4B,WAAN,EAAR;AACAF,4BAAUtC,EAAEyC,IAAF,CAAOf,YAAP,EAAqB,UAASgB,QAAT,EAAmB;AAChD,2BAAOA,SAASF,WAAT,GAAuBG,OAAvB,CAA+B/B,KAA/B,MAA0C,CAAjD;AACD,mBAFS,CAAV;;AAIA,sBAAI,CAAC0B,OAAL,EAAc;AAAE;AAAS;AAC1B;;AAEDf,uBAAOqB,MAAP,CAAc,YAAW;AACvBjB,uBAAKkB,WAAL,CAAiBP,OAAjB;AACD,iBAFD;;AAIAT,uBAAOiB,OAAP,CAAe,MAAf;AACA,uBAAO,EAAP;AACD;AAtBc,aAAjB;;AAyBAhB,oBAAQjB,KAAR,CAAc,YAAW;AACvBiB,sBAAQiB,IAAR;AACAlB,qBAAOmB,IAAP;AACAnB,qBAAOoB,KAAP;AACD,aAJD;;AAMApB,mBAAOqB,KAAP,CAAa,YAAW;AACtB1B,mBAAK2B,WAAL,CAAiB,MAAjB,EAAyBtB,OAAOuB,GAAP,OAAiB,EAA1C;AACD,aAFD;;AAIAvB,mBAAOwB,IAAP,CAAY,YAAW;AACrB;AACA;AACAC,yBAAW,YAAW;AACpBzB,uBAAOuB,GAAP,CAAW,EAAX;AACAvB,uBAAOkB,IAAP;AACAjB,wBAAQkB,IAAR;AACAxB,qBAAK+B,WAAL,CAAiB,MAAjB;AACD,eALD,EAKG,GALH;AAMD,aATD;;AAWApC,qBAASK,KAAKgC,QAAL,EAAT,EAA0BjC,MAA1B;AACD;AA7DI,SAAP;AA+DD,OA1EH","file":"add_datadog_func.js","sourcesContent":["import angular from 'angular';\nimport _ from 'lodash';\nimport $ from 'jquery';\nimport dfunc from './dfunc';\n\nangular\n .module('grafana.directives')\n .directive('datadogAddFunc', function($compile) {\n var inputTemplate = '';\n\n var buttonTemplate = '' +\n '';\n\n return {\n link: function($scope, elem) {\n var categories = dfunc.getCategories();\n var allFunctions = getAllFunctionNames(categories);\n var ctrl = $scope.ctrl;\n\n $scope.functionMenu = createFunctionDropDownMenu(categories);\n\n var $input = $(inputTemplate);\n var $button = $(buttonTemplate);\n $input.appendTo(elem);\n $button.appendTo(elem);\n\n $input.attr('data-provide', 'typeahead');\n $input.typeahead({\n source: allFunctions,\n minLength: 1,\n items: 10,\n updater: function (value) {\n var funcDef = dfunc.getFuncDef(value);\n if (!funcDef) {\n // try find close match\n value = value.toLowerCase();\n funcDef = _.find(allFunctions, function(funcName) {\n return funcName.toLowerCase().indexOf(value) === 0;\n });\n\n if (!funcDef) { return; }\n }\n\n $scope.$apply(function() {\n ctrl.addFunction(funcDef);\n });\n\n $input.trigger('blur');\n return '';\n }\n });\n\n $button.click(function() {\n $button.hide();\n $input.show();\n $input.focus();\n });\n\n $input.keyup(function() {\n elem.toggleClass('open', $input.val() === '');\n });\n\n $input.blur(function() {\n // clicking the function dropdown menu wont\n // work if you remove class at once\n setTimeout(function() {\n $input.val('');\n $input.hide();\n $button.show();\n elem.removeClass('open');\n }, 200);\n });\n\n $compile(elem.contents())($scope);\n }\n };\n });\n\nfunction getAllFunctionNames(categories) {\n return _.reduce(categories, function(list, category) {\n _.each(category, function(func) {\n list.push(func.name);\n });\n return list;\n }, []);\n}\n\nfunction createFunctionDropDownMenu(categories) {\n return _.map(categories, function(list, category) {\n return {\n text: category,\n submenu: _.map(list, function(value) {\n return {\n text: value.name,\n click: \"ctrl.addFunction('\" + value.name + \"')\",\n };\n })\n };\n });\n}\n"]} \ No newline at end of file diff --git a/loadTest/docker/grafana/plugins/datadog/dist/datasource.js b/loadTest/docker/grafana/plugins/datadog/dist/datasource.js new file mode 100644 index 0000000..ee1dfbf --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/datasource.js @@ -0,0 +1,433 @@ +'use strict'; + +System.register(['lodash', './showdown.min.js', './query_builder'], function (_export, _context) { + "use strict"; + + var _, showdown, queryBuilder, _createClass, DataDogDatasource; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + /* + * Convert tags to key-value pairs + * [region:east, region:nw] => {region: [east, nw]} + */ + function mapTagsToKVPairs(tags) { + var kv_tags = _.filter(tags, function (tag) { + return tag.indexOf(':') !== -1; + }); + + var kv_pairs = kv_tags.map(function (tag) { + return tag.split(':', 2); // Limit to 2 + }); + + var kv_object = {}; + kv_pairs.forEach(function (pair) { + var key = pair[0]; + var val = pair[1]; + + if (kv_object[key]) { + kv_object[key].push(val); + } else { + kv_object[key] = [val]; + } + }); + + return kv_object; + } + + /* + * Convert DataDog event text from markdown to pure HTML + * http://docs.datadoghq.com/guides/markdown/ + */ + function convertDataDogMdToHtml(str) { + var MD_START = '%%%\n'; + var MD_END = '\n%%%'; + + var md_start_index = str.indexOf(MD_START) + MD_START.length; + var md_end_index = str.indexOf(MD_END); + var md = str.substring(md_start_index, md_end_index); + md = removeImagesFromDataDogMarkdown(md); + + var converter = new showdown.Converter(); + return converter.makeHtml(md); + } + + function isDataDogMarkdown(str) { + var MD_START = '%%%\n'; + return str.indexOf(MD_START) >= 0; + } + + function removeImagesFromDataDogMarkdown(str) { + var dataDogImagePattern = /\[{0,1}\!\[.*\]\(https{0,1}\:\/\/p\.datadoghq\.com\/snapshot.+\)/g; + return str.replace(dataDogImagePattern, ''); + } + + function dataDogTagFormat(value) { + if (_.isArray(value)) { + return value.join(','); + } + return value; + } + return { + setters: [function (_lodash) { + _ = _lodash.default; + }, function (_showdownMinJs) { + showdown = _showdownMinJs.default; + }, function (_query_builder) { + queryBuilder = _query_builder; + }], + execute: function () { + _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + _export('DataDogDatasource', DataDogDatasource = function () { + function DataDogDatasource(instanceSettings, backendSrv, templateSrv) { + _classCallCheck(this, DataDogDatasource); + + this.type = instanceSettings.type; + this.url = instanceSettings.url; + this.name = instanceSettings.name; + this.api_key = instanceSettings.jsonData.api_key; + this.application_key = instanceSettings.jsonData.app_key; + this.supportMetrics = true; + this.backendSrv = backendSrv; + this.templateSrv = templateSrv; + this._cached_metrics = false; + } + + // Function to check Datasource health + + + _createClass(DataDogDatasource, [{ + key: 'testDatasource', + value: function testDatasource() { + return this.invokeDataDogApiRequest('/downtime').then(function () { + return { + status: "success", + title: "Success", + message: "Data source is working" + }; + }).catch(function (error) { + var message = "Connection error"; + if (error && error.message) { + message = error.message; + } + + return { + status: "error", + title: "Error", + message: message + }; + }); + } + }, { + key: 'tagFindQuery', + value: function tagFindQuery() { + return this.getTagsFromCache().then(function (tags) { + return _.map(tags, function (hosts, tag) { + return { + text: tag, + value: tag + }; + }); + }); + } + }, { + key: 'metricFindQuery', + value: function metricFindQuery(query) { + var _this = this; + + if (query === 'tag') { + return this.tagFindQuery(); + } + + if (this._cached_metrics) { + return Promise.resolve(this._cached_metrics); + } + + if (this.fetching) { + return this.fetching; + } + + var d = new Date(); + d.setDate(d.getDate() - 1); + var from = Math.floor(d.getTime() / 1000); + + this.fetching = this.getMetrics(from).then(function (metrics) { + _this._cached_metrics = _.map(metrics, function (metric) { + return { + text: metric, + value: metric + }; + }); + + return _this._cached_metrics; + }); + + return this.fetching; + } + }, { + key: 'getTagKeys', + value: function getTagKeys() { + return this.getTagsFromCache().then(function (tagsHosts) { + var tags = Object.keys(tagsHosts); + var kv = mapTagsToKVPairs(tags); + var grafanaTags = Object.keys(kv); + + return grafanaTags.map(function (tag) { + return { + text: tag, + value: tag + }; + }); + }); + } + }, { + key: 'getTagValues', + value: function getTagValues(options) { + return this.getTagsFromCache().then(function (tagsHosts) { + var tags = Object.keys(tagsHosts); + var kv = mapTagsToKVPairs(tags); + var grafanaValues = kv[options.key]; + return grafanaValues.map(function (val) { + return { + text: val, + value: val + }; + }); + }); + } + }, { + key: 'query', + value: function query(options) { + var from = Math.floor(options.range.from.valueOf() / 1000); + var to = Math.floor(options.range.to.valueOf() / 1000); + + var targets = options.targets.filter(function (t) { + return !t.hide; + }); + + if (targets.length <= 0) { + return Promise.resolve({ data: [] }); + } + + // add global adhoc filters + var adhocFilters = this.templateSrv.getAdhocFilters(this.name); + + var queries = _.map(targets, function (target) { + var query = void 0; + if (target.rawQuery) { + query = target.query; + } else { + query = queryBuilder.buildQuery(target, adhocFilters); + } + return query; + }); + + var queryString = queries.join(','); + queryString = this.templateSrv.replace(queryString, options.scopedVars, dataDogTagFormat); + + var params = { + from: from, + to: to, + query: queryString + }; + + return this.invokeDataDogApiRequest('/query', params).then(function (result) { + var dataResponse = _.map(result.series, function (series, i) { + var target = targets[i]; + return { + 'target': target.alias || series.expression, + 'datapoints': _.map(series.pointlist, function (point) { + return [point[1], point[0]]; + }) + }; + }); + + return { data: dataResponse }; + }); + } + }, { + key: 'annotationQuery', + value: function annotationQuery(options) { + var timeFrom = Math.floor(options.range.from.valueOf() / 1000); + var timeTo = Math.floor(options.range.to.valueOf() / 1000); + var _options$annotation = options.annotation, + priority = _options$annotation.priority, + sources = _options$annotation.sources, + tags = _options$annotation.tags; + + + return this.getEventStream(timeFrom, timeTo, priority, sources, tags).then(function (eventStreams) { + var eventAnnotations = eventStreams.map(function (eventStream) { + var allEvents = eventStream.children; + var filteredEvents = _.filter(allEvents, function (event) { + return event.alert_type !== 'success'; + }); + + return _.map(filteredEvents, function (event) { + var renderedText = eventStream.text; + if (isDataDogMarkdown(eventStream.text)) { + renderedText = convertDataDogMdToHtml(eventStream.text); + } + + return { + annotation: options.annotation, + time: event.date_happened * 1000, + title: eventStream.title, + text: renderedText, + tags: eventStream.tags + }; + }); + }); + + return _.flatten(eventAnnotations); + }); + } + }, { + key: 'getHosts', + value: function getHosts() { + return this.searchEntities('hosts'); + } + }, { + key: 'searchEntities', + value: function searchEntities(entity) { + var params = { q: '' }; + if (entity) { + params.q = entity + ':'; + } + + return this.invokeDataDogApiRequest('/search', params).then(function (result) { + if (result && result.results) { + return result.results[entity]; + } + }); + } + }, { + key: 'getMetrics', + value: function getMetrics(timeFrom) { + var params = {}; + + if (timeFrom) { + params.from = timeFrom; + } + + return this.invokeDataDogApiRequest('/metrics', params).then(function (result) { + if (result.metrics) { + return result.metrics; + } else { + return []; + } + }); + } + }, { + key: 'getTagsHosts', + value: function getTagsHosts() { + return this.invokeDataDogApiRequest('/tags/hosts').then(function (result) { + if (result && result.tags) { + return result.tags; + } + }); + } + }, { + key: 'getTagsFromCache', + value: function getTagsFromCache() { + var _this2 = this; + + var getTags = void 0; + if (this._cached_tags && this._cached_tags.length) { + getTags = Promise.resolve(this._cached_tags); + } else { + getTags = this.getTagsHosts().then(function (tags) { + _this2._cached_tags = tags; + return tags; + }); + } + + return getTags; + } + }, { + key: 'getEventStream', + value: function getEventStream(timeFrom, timeTo, priority, sources, tags) { + var params = { + start: timeFrom, + end: timeTo + }; + if (priority) { + params.priority = priority; + } + if (sources) { + params.sources = sources; + } + if (tags) { + params.tags = tags; + } + + return this.invokeDataDogApiRequest('/events', params).then(function (result) { + if (result.events) { + return result.events; + } else { + return []; + } + }); + } + }, { + key: 'invokeDataDogApiRequest', + value: function invokeDataDogApiRequest(url) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + // Set auth params + params.api_key = this.api_key; + params.application_key = this.application_key; + + return this.backendSrv.datasourceRequest({ + method: 'GET', + url: this.url + url, + params: params + }).then(function (response) { + if (response.data) { + return response.data; + } else { + throw { message: 'DataDog API request error' }; + } + }).catch(function (error) { + var message = 'DataDog API request error'; + if (error.statusText) { + message = error.status + ' ' + error.statusText; + throw { message: message }; + } else if (error.err.statusText) { + throw { message: error.err.statusText }; + } else { + throw { message: message }; + } + }); + } + }]); + + return DataDogDatasource; + }()); + + _export('DataDogDatasource', DataDogDatasource); + } + }; +}); +//# sourceMappingURL=datasource.js.map diff --git a/loadTest/docker/grafana/plugins/datadog/dist/datasource.js.map b/loadTest/docker/grafana/plugins/datadog/dist/datasource.js.map new file mode 100644 index 0000000..c96e58f --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/datasource.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/datasource.js"],"names":["mapTagsToKVPairs","tags","kv_tags","_","filter","tag","indexOf","kv_pairs","map","split","kv_object","forEach","key","pair","val","push","convertDataDogMdToHtml","str","MD_START","MD_END","md_start_index","length","md_end_index","md","substring","removeImagesFromDataDogMarkdown","converter","showdown","Converter","makeHtml","isDataDogMarkdown","dataDogImagePattern","replace","dataDogTagFormat","value","isArray","join","queryBuilder","DataDogDatasource","instanceSettings","backendSrv","templateSrv","type","url","name","api_key","jsonData","application_key","app_key","supportMetrics","_cached_metrics","invokeDataDogApiRequest","then","status","title","message","catch","error","getTagsFromCache","hosts","text","query","tagFindQuery","Promise","resolve","fetching","d","Date","setDate","getDate","from","Math","floor","getTime","getMetrics","metrics","metric","Object","keys","tagsHosts","kv","grafanaTags","options","grafanaValues","range","valueOf","to","targets","t","hide","data","adhocFilters","getAdhocFilters","queries","target","rawQuery","buildQuery","queryString","scopedVars","params","dataResponse","result","series","i","alias","expression","pointlist","point","timeFrom","timeTo","annotation","priority","sources","getEventStream","eventAnnotations","eventStreams","allEvents","eventStream","children","filteredEvents","event","alert_type","renderedText","time","date_happened","flatten","searchEntities","entity","q","results","getTags","_cached_tags","getTagsHosts","start","end","events","datasourceRequest","method","response","statusText","err"],"mappings":"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","file":"datasource.js","sourcesContent":["import _ from 'lodash';\nimport showdown from './showdown.min.js';\nimport * as queryBuilder from './query_builder';\n\nexport class DataDogDatasource {\n\n constructor (instanceSettings, backendSrv, templateSrv) {\n this.type = instanceSettings.type;\n this.url = instanceSettings.url;\n this.name = instanceSettings.name;\n this.api_key = instanceSettings.jsonData.api_key;\n this.application_key = instanceSettings.jsonData.app_key;\n this.supportMetrics = true;\n this.backendSrv = backendSrv;\n this.templateSrv = templateSrv;\n this._cached_metrics = false;\n }\n\n // Function to check Datasource health\n testDatasource() {\n return this.invokeDataDogApiRequest('/downtime')\n .then(() => {\n return {\n status: \"success\",\n title: \"Success\",\n message: \"Data source is working\"\n };\n })\n .catch(error => {\n var message = \"Connection error\";\n if (error && error.message) {\n message = error.message;\n }\n\n return {\n status: \"error\",\n title: \"Error\",\n message: message\n };\n });\n }\n\n tagFindQuery() {\n return this.getTagsFromCache()\n .then(tags => {\n return _.map(tags, (hosts, tag) => {\n return {\n text: tag,\n value: tag,\n };\n });\n });\n }\n\n metricFindQuery(query) {\n if (query === 'tag') {\n return this.tagFindQuery();\n }\n\n if (this._cached_metrics) {\n return Promise.resolve(this._cached_metrics);\n }\n\n if (this.fetching) {\n return this.fetching;\n }\n\n var d = new Date();\n d.setDate(d.getDate() - 1);\n var from = Math.floor(d.getTime() / 1000);\n\n this.fetching = this.getMetrics(from).then(metrics => {\n this._cached_metrics = _.map(metrics, metric => {\n return {\n text: metric,\n value: metric,\n };\n });\n\n return this._cached_metrics;\n });\n\n return this.fetching;\n }\n\n getTagKeys() {\n return this.getTagsFromCache()\n .then(tagsHosts => {\n let tags = Object.keys(tagsHosts);\n let kv = mapTagsToKVPairs(tags);\n let grafanaTags = Object.keys(kv);\n\n return grafanaTags.map(tag => {\n return {\n text: tag,\n value: tag,\n };\n });\n });\n }\n\n getTagValues(options) {\n return this.getTagsFromCache()\n .then(tagsHosts => {\n let tags = Object.keys(tagsHosts);\n let kv = mapTagsToKVPairs(tags);\n let grafanaValues = kv[options.key];\n return grafanaValues.map(val => {\n return {\n text: val,\n value: val,\n };\n });\n });\n }\n\n query(options) {\n var from = Math.floor(options.range.from.valueOf() / 1000);\n var to = Math.floor(options.range.to.valueOf() / 1000);\n\n var targets = options.targets.filter(function (t) { return !t.hide; });\n\n if (targets.length <= 0) {\n return Promise.resolve({data: []});\n }\n\n // add global adhoc filters\n let adhocFilters = this.templateSrv.getAdhocFilters(this.name);\n\n var queries = _.map(targets, target => {\n let query;\n if (target.rawQuery) {\n query = target.query;\n } else {\n query = queryBuilder.buildQuery(target, adhocFilters);\n }\n return query;\n });\n\n var queryString = queries.join(',');\n queryString = this.templateSrv.replace(queryString, options.scopedVars, dataDogTagFormat);\n\n var params = {\n from: from,\n to: to,\n query: queryString,\n };\n\n return this.invokeDataDogApiRequest('/query', params)\n .then(result => {\n var dataResponse = _.map(result.series, (series, i) => {\n var target = targets[i];\n return {\n 'target': target.alias || series.expression,\n 'datapoints': _.map(series.pointlist, point => {\n return [point[1], point[0]];\n })\n };\n });\n\n return {data: dataResponse};\n });\n }\n\n annotationQuery(options) {\n let timeFrom = Math.floor(options.range.from.valueOf() / 1000);\n let timeTo = Math.floor(options.range.to.valueOf() / 1000);\n let {priority, sources, tags} = options.annotation;\n\n return this.getEventStream(timeFrom, timeTo, priority, sources, tags)\n .then(eventStreams => {\n let eventAnnotations = eventStreams.map(eventStream => {\n let allEvents = eventStream.children;\n let filteredEvents = _.filter(allEvents, event => {\n return event.alert_type !== 'success';\n });\n\n return _.map(filteredEvents, event => {\n let renderedText = eventStream.text;\n if (isDataDogMarkdown(eventStream.text)) {\n renderedText = convertDataDogMdToHtml(eventStream.text);\n }\n\n return {\n annotation: options.annotation,\n time: event.date_happened * 1000,\n title: eventStream.title,\n text: renderedText,\n tags: eventStream.tags\n };\n });\n });\n\n return _.flatten(eventAnnotations);\n });\n }\n\n getHosts() {\n return this.searchEntities('hosts');\n }\n\n // entity should be 'hosts' or 'metrics'\n // http://docs.datadoghq.com/api/?lang=console#search\n searchEntities(entity) {\n let params = {q: ''};\n if (entity) {\n params.q = `${entity}:`;\n }\n\n return this.invokeDataDogApiRequest('/search', params)\n .then(result => {\n if (result && result.results) {\n return result.results[entity];\n }\n });\n }\n\n getMetrics(timeFrom) {\n let params = {};\n\n if (timeFrom) {\n params.from = timeFrom;\n }\n\n return this.invokeDataDogApiRequest('/metrics', params)\n .then(result => {\n if (result.metrics) {\n return result.metrics;\n } else {\n return [];\n }\n });\n }\n\n getTagsHosts() {\n return this.invokeDataDogApiRequest('/tags/hosts')\n .then(result => {\n if (result && result.tags) {\n return result.tags;\n }\n });\n }\n\n getTagsFromCache() {\n let getTags;\n if (this._cached_tags && this._cached_tags.length) {\n getTags = Promise.resolve(this._cached_tags);\n } else {\n getTags = this.getTagsHosts().then(tags => {\n this._cached_tags = tags;\n return tags;\n });\n }\n\n return getTags;\n }\n\n getEventStream(timeFrom, timeTo, priority, sources, tags) {\n let params = {\n start: timeFrom,\n end: timeTo\n };\n if (priority) {\n params.priority = priority;\n }\n if (sources) {\n params.sources = sources;\n }\n if (tags) {\n params.tags = tags;\n }\n\n return this.invokeDataDogApiRequest('/events', params)\n .then(result => {\n if (result.events) {\n return result.events;\n } else {\n return [];\n }\n });\n }\n\n invokeDataDogApiRequest(url, params = {}) {\n // Set auth params\n params.api_key = this.api_key;\n params.application_key = this.application_key;\n\n return this.backendSrv.datasourceRequest({\n method: 'GET',\n url: this.url + url,\n params: params\n })\n .then(response => {\n if (response.data) {\n return response.data;\n } else {\n throw {message: 'DataDog API request error'};\n }\n })\n .catch(error => {\n var message = 'DataDog API request error';\n if (error.statusText) {\n message = error.status + ' ' + error.statusText;\n throw {message: message};\n } else if (error.err.statusText) {\n throw {message: error.err.statusText};\n } else {\n throw {message: message};\n }\n });\n }\n}\n\n/*\n * Convert tags to key-value pairs\n * [region:east, region:nw] => {region: [east, nw]}\n */\nfunction mapTagsToKVPairs(tags) {\n let kv_tags = _.filter(tags, tag => {\n return (tag.indexOf(':') !== -1);\n });\n\n let kv_pairs = kv_tags.map(tag => {\n return tag.split(':', 2); // Limit to 2\n });\n\n let kv_object = {};\n kv_pairs.forEach(pair => {\n let key = pair[0];\n let val = pair[1];\n\n if (kv_object[key]) {\n kv_object[key].push(val);\n } else {\n kv_object[key] = [val];\n }\n });\n\n return kv_object;\n}\n\n/*\n * Convert DataDog event text from markdown to pure HTML\n * http://docs.datadoghq.com/guides/markdown/\n */\nfunction convertDataDogMdToHtml(str) {\n const MD_START = '%%%\\n';\n const MD_END = '\\n%%%';\n\n let md_start_index = str.indexOf(MD_START) + MD_START.length;\n let md_end_index = str.indexOf(MD_END);\n let md = str.substring(md_start_index, md_end_index);\n md = removeImagesFromDataDogMarkdown(md);\n\n let converter = new showdown.Converter();\n return converter.makeHtml(md);\n}\n\nfunction isDataDogMarkdown(str) {\n const MD_START = '%%%\\n';\n return str.indexOf(MD_START) >= 0;\n}\n\nfunction removeImagesFromDataDogMarkdown(str) {\n let dataDogImagePattern = /\\[{0,1}\\!\\[.*\\]\\(https{0,1}\\:\\/\\/p\\.datadoghq\\.com\\/snapshot.+\\)/g;\n return str.replace(dataDogImagePattern, '');\n}\n\nfunction dataDogTagFormat(value) {\n if (_.isArray(value)) {\n return value.join(',');\n }\n return value;\n}\n"]} \ No newline at end of file diff --git a/loadTest/docker/grafana/plugins/datadog/dist/dfunc.js b/loadTest/docker/grafana/plugins/datadog/dist/dfunc.js new file mode 100644 index 0000000..e41208f --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/dfunc.js @@ -0,0 +1,293 @@ +'use strict'; + +System.register(['lodash'], function (_export, _context) { + "use strict"; + + var _, index, categories, createFuncInstance, getFuncDef, getCategories, foo; + + function addFuncDef(funcDef) { + funcDef.params = funcDef.params || []; + funcDef.defaultParams = funcDef.defaultParams || []; + funcDef.append = funcDef.append || false; + if (funcDef.category) { + funcDef.category.push(funcDef); + } + index[funcDef.name] = funcDef; + index[funcDef.name] = funcDef; + } + + function FuncInstance(funcDef, options) { + this.def = funcDef; + this.params = []; + + if (options && options.withDefaultParams) { + this.params = funcDef.defaultParams.slice(0); + } + + this.updateText(); + } + + return { + setters: [function (_lodash) { + _ = _lodash.default; + }], + execute: function () { + index = []; + categories = { + Arithmatic: [], + Interpolation: [], + Timeshift: [], + Rate: [], + Smoothing: [], + Rollup: [], + Rank: [], + Count: [], + Regression: [], + Algorithms: [] + }; + addFuncDef({ + name: 'abs', + category: categories.Arithmatic + }); + + addFuncDef({ + name: 'log2', + category: categories.Arithmatic + }); + + addFuncDef({ + name: 'cumsum', + category: categories.Arithmatic + }); + + addFuncDef({ + name: 'integral', + category: categories.Arithmatic + }); + + addFuncDef({ + name: 'fill', + category: categories.Interpolation, + params: [{ name: "fill", type: 'string', options: ['null', 'zero', 'linear', 'last'] }, { name: "limit", type: 'int', optional: true }], + defaultParams: ['zero'], + append: true + }); + + addFuncDef({ + name: 'hour_before', + category: categories.Timeshift + }); + + addFuncDef({ + name: 'day_before', + category: categories.Timeshift + }); + + addFuncDef({ + name: 'week_before', + category: categories.Timeshift + }); + + addFuncDef({ + name: 'month_before', + category: categories.Timeshift + }); + + addFuncDef({ + name: 'per_second', + category: categories.Rate + }); + + addFuncDef({ + name: 'per_minute', + category: categories.Rate + }); + + addFuncDef({ + name: 'per_hour', + category: categories.Rate + }); + + addFuncDef({ + name: 'dt', + category: categories.Rate + }); + + addFuncDef({ + name: 'diff', + category: categories.Rate + }); + + addFuncDef({ + name: 'derivative', + category: categories.Rate + }); + + addFuncDef({ + name: 'ewma_3', + category: categories.Smoothing + }); + + addFuncDef({ + name: 'ewma_5', + category: categories.Smoothing + }); + + addFuncDef({ + name: 'ewma_10', + category: categories.Smoothing + }); + + addFuncDef({ + name: 'ewma_20', + category: categories.Smoothing + }); + + addFuncDef({ + name: 'median_3', + category: categories.Smoothing + }); + + addFuncDef({ + name: 'median_5', + category: categories.Smoothing + }); + + addFuncDef({ + name: 'median_7', + category: categories.Smoothing + }); + + addFuncDef({ + name: 'median_9', + category: categories.Smoothing + }); + + addFuncDef({ + name: 'rollup', + category: categories.Rollup, + params: [{ name: "rollup", type: 'string', options: ['sum', 'avg', 'min', 'max'] }, { name: "period", type: 'int' }], + defaultParams: ['sum', 600], + append: true + }); + + addFuncDef({ + name: 'count_nonzero', + category: categories.Count + }); + + addFuncDef({ + name: 'count_not_null', + category: categories.Count + }); + + addFuncDef({ + name: 'top', + category: categories.Rank, + params: [{ name: "top", type: 'int', options: [5, 10, 15] }, { name: "aggr", type: 'string', options: ['mean', 'min', 'max', 'area', 'l2norm', 'last'] }, { name: "dir", type: 'string', options: ['asc', 'desc'] }], + defaultParams: [5, 'mean', 'dir'] + }); + + addFuncDef({ + name: 'robust_trend', + category: categories.Regression + }); + + addFuncDef({ + name: 'piecewise_constant', + category: categories.Regression + }); + + addFuncDef({ + name: 'anomalies', + category: categories.Algorithms, + params: [{ name: "anomalies", type: 'string', options: ['basic', 'agile', 'robust', 'adaptive'] }, { name: "bonds", type: 'int', options: [1, 2, 3, 4, 5, 6] }], + defaultParams: ['basic', 2] + }); + + addFuncDef({ + name: 'anomalies', + category: categories.Algorithms, + params: [{ name: "anomalies", type: 'string', options: ['basic', 'agile', 'robust', 'adaptive'] }, { name: "bonds", type: 'int', options: [1, 2, 3, 4, 5, 6] }], + defaultParams: ['basic', 2] + }); + + addFuncDef({ + name: 'outliers', + category: categories.Algorithms, + params: [{ name: "outliers", type: 'string', options: ['DBSCAN', 'MAD', 'scaledDBSCAN', 'scaledMAD'] }, { name: "tolerance", type: 'int', options: [0.33, 0.5, 1, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0] }], + defaultParams: ['basic', 2] + }); + + _.each(categories, function (funcList, catName) { + categories[catName] = _.sortBy(funcList, 'name'); + });FuncInstance.prototype.render = function (metricExp) { + var str = this.def.name + '('; + var parameters = _.map(this.params, function (value) { + return value; + }); + if (metricExp && !this.def.append) { + parameters.unshift(metricExp); + } + + var funcRender = str + parameters.join(', ') + ')'; + console.log(funcRender, this.def.append); + if (this.def.append) { + return metricExp + '.' + funcRender; + } else { + return funcRender; + } + }; + + FuncInstance.prototype.updateParam = function (strValue, index) { + // handle optional parameters + // if string contains ',' and next param is optional, split and update both + + if (strValue === '' && this.def.params[index].optional) { + this.params.splice(index, 1); + } else { + this.params[index] = strValue; + } + + this.updateText(); + }; + + FuncInstance.prototype.updateText = function () { + if (this.params.length === 0) { + this.text = this.def.name + '()'; + return; + } + + var text = this.def.name + '('; + text += this.params.join(', '); + text += ')'; + this.text = text; + }; + + createFuncInstance = function createFuncInstance(funcDef, options) { + if (_.isString(funcDef)) { + if (!index[funcDef]) { + throw { message: 'Method not found ' + name }; + } + funcDef = index[funcDef]; + } + return new FuncInstance(funcDef, options); + }; + + getFuncDef = function getFuncDef(name) { + return index[name]; + }; + + getCategories = function getCategories() { + return categories; + }; + + _export('default', foo = { + createFuncInstance: createFuncInstance, + getFuncDef: getFuncDef, + getCategories: getCategories + }); + } + }; +}); +//# sourceMappingURL=dfunc.js.map diff --git a/loadTest/docker/grafana/plugins/datadog/dist/dfunc.js.map b/loadTest/docker/grafana/plugins/datadog/dist/dfunc.js.map new file mode 100644 index 0000000..27fe944 --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/dfunc.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/dfunc.js"],"names":["addFuncDef","funcDef","params","defaultParams","append","category","push","index","name","FuncInstance","options","def","withDefaultParams","slice","updateText","_","categories","Arithmatic","Interpolation","Timeshift","Rate","Smoothing","Rollup","Rank","Count","Regression","Algorithms","type","optional","each","funcList","catName","sortBy","prototype","render","metricExp","str","parameters","map","value","unshift","funcRender","join","console","log","updateParam","strValue","splice","length","text","createFuncInstance","isString","message","getFuncDef","getCategories","foo"],"mappings":";;;;;;;AAgBA,WAASA,UAAT,CAAoBC,OAApB,EAA6B;AAC3BA,YAAQC,MAAR,GAAiBD,QAAQC,MAAR,IAAkB,EAAnC;AACAD,YAAQE,aAAR,GAAwBF,QAAQE,aAAR,IAAyB,EAAjD;AACAF,YAAQG,MAAR,GAAiBH,QAAQG,MAAR,IAAkB,KAAnC;AACA,QAAIH,QAAQI,QAAZ,EAAsB;AACpBJ,cAAQI,QAAR,CAAiBC,IAAjB,CAAsBL,OAAtB;AACD;AACDM,UAAMN,QAAQO,IAAd,IAAsBP,OAAtB;AACAM,UAAMN,QAAQO,IAAd,IAAsBP,OAAtB;AACD;;AAkND,WAASQ,YAAT,CAAsBR,OAAtB,EAA+BS,OAA/B,EAAwC;AACtC,SAAKC,GAAL,GAAWV,OAAX;AACA,SAAKC,MAAL,GAAc,EAAd;;AAEA,QAAIQ,WAAWA,QAAQE,iBAAvB,EAA0C;AACxC,WAAKV,MAAL,GAAcD,QAAQE,aAAR,CAAsBU,KAAtB,CAA4B,CAA5B,CAAd;AACD;;AAED,SAAKC,UAAL;AACD;;;;AApPMC,O;;;AAEHR,W,GAAQ,E;AACRS,gB,GAAa;AACfC,oBAAY,EADG;AAEfC,uBAAe,EAFA;AAGfC,mBAAW,EAHI;AAIfC,cAAM,EAJS;AAKfC,mBAAW,EALI;AAMfC,gBAAQ,EANO;AAOfC,cAAM,EAPS;AAQfC,eAAO,EARQ;AASfC,oBAAY,EATG;AAUfC,oBAAY;AAVG,O;AAwBjB1B,iBAAW;AACTQ,cAAM,KADG;AAETH,kBAAUW,WAAWC;AAFZ,OAAX;;AAKAjB,iBAAW;AACTQ,cAAM,MADG;AAETH,kBAAUW,WAAWC;AAFZ,OAAX;;AAKAjB,iBAAW;AACTQ,cAAM,QADG;AAETH,kBAAUW,WAAWC;AAFZ,OAAX;;AAKAjB,iBAAW;AACTQ,cAAM,UADG;AAETH,kBAAUW,WAAWC;AAFZ,OAAX;;AAKAjB,iBAAW;AACTQ,cAAM,MADG;AAETH,kBAAUW,WAAWE,aAFZ;AAGThB,gBAAQ,CACN,EAAEM,MAAM,MAAR,EAAgBmB,MAAM,QAAtB,EAAgCjB,SAAS,CAAC,MAAD,EAAS,MAAT,EAAiB,QAAjB,EAA2B,MAA3B,CAAzC,EADM,EAEN,EAAEF,MAAM,OAAR,EAAiBmB,MAAM,KAAvB,EAA8BC,UAAU,IAAxC,EAFM,CAHC;AAOTzB,uBAAe,CAAC,MAAD,CAPN;AAQTC,gBAAQ;AARC,OAAX;;AAWAJ,iBAAW;AACTQ,cAAM,aADG;AAETH,kBAAUW,WAAWG;AAFZ,OAAX;;AAKAnB,iBAAW;AACTQ,cAAM,YADG;AAETH,kBAAUW,WAAWG;AAFZ,OAAX;;AAKAnB,iBAAW;AACTQ,cAAM,aADG;AAETH,kBAAUW,WAAWG;AAFZ,OAAX;;AAKAnB,iBAAW;AACTQ,cAAM,cADG;AAETH,kBAAUW,WAAWG;AAFZ,OAAX;;AAKAnB,iBAAW;AACTQ,cAAM,YADG;AAETH,kBAAUW,WAAWI;AAFZ,OAAX;;AAKApB,iBAAW;AACTQ,cAAM,YADG;AAETH,kBAAUW,WAAWI;AAFZ,OAAX;;AAKApB,iBAAW;AACTQ,cAAM,UADG;AAETH,kBAAUW,WAAWI;AAFZ,OAAX;;AAKApB,iBAAW;AACTQ,cAAM,IADG;AAETH,kBAAUW,WAAWI;AAFZ,OAAX;;AAKApB,iBAAW;AACTQ,cAAM,MADG;AAETH,kBAAUW,WAAWI;AAFZ,OAAX;;AAKApB,iBAAW;AACTQ,cAAM,YADG;AAETH,kBAAUW,WAAWI;AAFZ,OAAX;;AAKApB,iBAAW;AACTQ,cAAM,QADG;AAETH,kBAAUW,WAAWK;AAFZ,OAAX;;AAKArB,iBAAW;AACTQ,cAAM,QADG;AAETH,kBAAUW,WAAWK;AAFZ,OAAX;;AAKArB,iBAAW;AACTQ,cAAM,SADG;AAETH,kBAAUW,WAAWK;AAFZ,OAAX;;AAKArB,iBAAW;AACTQ,cAAM,SADG;AAETH,kBAAUW,WAAWK;AAFZ,OAAX;;AAKArB,iBAAW;AACTQ,cAAM,UADG;AAETH,kBAAUW,WAAWK;AAFZ,OAAX;;AAKArB,iBAAW;AACTQ,cAAM,UADG;AAETH,kBAAUW,WAAWK;AAFZ,OAAX;;AAKArB,iBAAW;AACTQ,cAAM,UADG;AAETH,kBAAUW,WAAWK;AAFZ,OAAX;;AAKArB,iBAAW;AACTQ,cAAM,UADG;AAETH,kBAAUW,WAAWK;AAFZ,OAAX;;AAKArB,iBAAW;AACTQ,cAAM,QADG;AAETH,kBAAUW,WAAWM,MAFZ;AAGTpB,gBAAQ,CACN,EAAEM,MAAM,QAAR,EAAkBmB,MAAM,QAAxB,EAAkCjB,SAAS,CAAC,KAAD,EAAQ,KAAR,EAAe,KAAf,EAAsB,KAAtB,CAA3C,EADM,EAEN,EAAEF,MAAM,QAAR,EAAkBmB,MAAM,KAAxB,EAFM,CAHC;AAOTxB,uBAAe,CAAC,KAAD,EAAQ,GAAR,CAPN;AAQTC,gBAAQ;AARC,OAAX;;AAWAJ,iBAAW;AACTQ,cAAM,eADG;AAETH,kBAAUW,WAAWQ;AAFZ,OAAX;;AAKAxB,iBAAW;AACTQ,cAAM,gBADG;AAETH,kBAAUW,WAAWQ;AAFZ,OAAX;;AAKAxB,iBAAW;AACTQ,cAAM,KADG;AAETH,kBAAUW,WAAWO,IAFZ;AAGTrB,gBAAQ,CACN,EAAEM,MAAM,KAAR,EAAemB,MAAM,KAArB,EAA4BjB,SAAS,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,CAArC,EADM,EAEN,EAAEF,MAAM,MAAR,EAAgBmB,MAAM,QAAtB,EAAgCjB,SAAS,CAAC,MAAD,EAAS,KAAT,EAAgB,KAAhB,EAAuB,MAAvB,EAA+B,QAA/B,EAAyC,MAAzC,CAAzC,EAFM,EAGN,EAAEF,MAAM,KAAR,EAAemB,MAAM,QAArB,EAA+BjB,SAAS,CAAC,KAAD,EAAQ,MAAR,CAAxC,EAHM,CAHC;AAQTP,uBAAe,CAAC,CAAD,EAAI,MAAJ,EAAY,KAAZ;AARN,OAAX;;AAWAH,iBAAW;AACTQ,cAAM,cADG;AAETH,kBAAUW,WAAWS;AAFZ,OAAX;;AAKAzB,iBAAW;AACTQ,cAAM,oBADG;AAETH,kBAAUW,WAAWS;AAFZ,OAAX;;AAKAzB,iBAAW;AACTQ,cAAM,WADG;AAETH,kBAAUW,WAAWU,UAFZ;AAGTxB,gBAAQ,CACN,EAAEM,MAAM,WAAR,EAAqBmB,MAAM,QAA3B,EAAqCjB,SAAS,CAAC,OAAD,EAAU,OAAV,EAAmB,QAAnB,EAA6B,UAA7B,CAA9C,EADM,EAEN,EAAEF,MAAM,OAAR,EAAiBmB,MAAM,KAAvB,EAA8BjB,SAAS,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,EAAa,CAAb,EAAgB,CAAhB,CAAvC,EAFM,CAHC;AAOTP,uBAAe,CAAC,OAAD,EAAU,CAAV;AAPN,OAAX;;AAUAH,iBAAW;AACTQ,cAAM,WADG;AAETH,kBAAUW,WAAWU,UAFZ;AAGTxB,gBAAQ,CACN,EAAEM,MAAM,WAAR,EAAqBmB,MAAM,QAA3B,EAAqCjB,SAAS,CAAC,OAAD,EAAU,OAAV,EAAmB,QAAnB,EAA6B,UAA7B,CAA9C,EADM,EAEN,EAAEF,MAAM,OAAR,EAAiBmB,MAAM,KAAvB,EAA8BjB,SAAS,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,EAAa,CAAb,EAAgB,CAAhB,CAAvC,EAFM,CAHC;AAOTP,uBAAe,CAAC,OAAD,EAAU,CAAV;AAPN,OAAX;;AAUAH,iBAAW;AACTQ,cAAM,UADG;AAETH,kBAAUW,WAAWU,UAFZ;AAGTxB,gBAAQ,CACN,EAAEM,MAAM,UAAR,EAAoBmB,MAAM,QAA1B,EAAoCjB,SAAS,CAAC,QAAD,EAAW,KAAX,EAAkB,cAAlB,EAAkC,WAAlC,CAA7C,EADM,EAEN,EAAEF,MAAM,WAAR,EAAqBmB,MAAM,KAA3B,EAAkCjB,SAAS,CACzC,IADyC,EAEzC,GAFyC,EAGzC,CAHyC,EAIzC,GAJyC,EAKzC,GALyC,EAMzC,GANyC,EAOzC,GAPyC,EAQzC,GARyC,EASzC,GATyC,EAUzC,GAVyC,EAWzC,GAXyC,CAA3C,EAFM,CAHC;AAkBTP,uBAAe,CAAC,OAAD,EAAU,CAAV;AAlBN,OAAX;;AAqBAY,QAAEc,IAAF,CAAOb,UAAP,EAAmB,UAASc,QAAT,EAAmBC,OAAnB,EAA4B;AAC7Cf,mBAAWe,OAAX,IAAsBhB,EAAEiB,MAAF,CAASF,QAAT,EAAmB,MAAnB,CAAtB;AACD,OAFD,EAeArB,aAAawB,SAAb,CAAuBC,MAAvB,GAAgC,UAASC,SAAT,EAAoB;AAClD,YAAIC,MAAM,KAAKzB,GAAL,CAASH,IAAT,GAAgB,GAA1B;AACA,YAAI6B,aAAatB,EAAEuB,GAAF,CAAM,KAAKpC,MAAX,EAAmB,UAASqC,KAAT,EAAgB;AAClD,iBAAOA,KAAP;AACD,SAFgB,CAAjB;AAGA,YAAIJ,aAAa,CAAC,KAAKxB,GAAL,CAASP,MAA3B,EAAmC;AACjCiC,qBAAWG,OAAX,CAAmBL,SAAnB;AACD;;AAED,YAAIM,aAAaL,MAAMC,WAAWK,IAAX,CAAgB,IAAhB,CAAN,GAA8B,GAA/C;AACAC,gBAAQC,GAAR,CAAYH,UAAZ,EAAwB,KAAK9B,GAAL,CAASP,MAAjC;AACA,YAAI,KAAKO,GAAL,CAASP,MAAb,EAAqB;AACnB,iBAAO+B,YAAY,GAAZ,GAAkBM,UAAzB;AACD,SAFD,MAEO;AACL,iBAAOA,UAAP;AACD;AACF,OAhBD;;AAkBAhC,mBAAawB,SAAb,CAAuBY,WAAvB,GAAqC,UAASC,QAAT,EAAmBvC,KAAnB,EAA0B;AAC7D;AACA;;AAEA,YAAIuC,aAAa,EAAb,IAAmB,KAAKnC,GAAL,CAAST,MAAT,CAAgBK,KAAhB,EAAuBqB,QAA9C,EAAwD;AACtD,eAAK1B,MAAL,CAAY6C,MAAZ,CAAmBxC,KAAnB,EAA0B,CAA1B;AACD,SAFD,MAGK;AACH,eAAKL,MAAL,CAAYK,KAAZ,IAAqBuC,QAArB;AACD;;AAED,aAAKhC,UAAL;AACD,OAZD;;AAcAL,mBAAawB,SAAb,CAAuBnB,UAAvB,GAAoC,YAAY;AAC9C,YAAI,KAAKZ,MAAL,CAAY8C,MAAZ,KAAuB,CAA3B,EAA8B;AAC5B,eAAKC,IAAL,GAAY,KAAKtC,GAAL,CAASH,IAAT,GAAgB,IAA5B;AACA;AACD;;AAED,YAAIyC,OAAO,KAAKtC,GAAL,CAASH,IAAT,GAAgB,GAA3B;AACAyC,gBAAQ,KAAK/C,MAAL,CAAYwC,IAAZ,CAAiB,IAAjB,CAAR;AACAO,gBAAQ,GAAR;AACA,aAAKA,IAAL,GAAYA,IAAZ;AACD,OAVD;;AAYIC,wB,GAAqB,SAArBA,kBAAqB,CAASjD,OAAT,EAAkBS,OAAlB,EAA2B;AAClD,YAAIK,EAAEoC,QAAF,CAAWlD,OAAX,CAAJ,EAAyB;AACvB,cAAI,CAACM,MAAMN,OAAN,CAAL,EAAqB;AACnB,kBAAM,EAAEmD,SAAS,sBAAsB5C,IAAjC,EAAN;AACD;AACDP,oBAAUM,MAAMN,OAAN,CAAV;AACD;AACD,eAAO,IAAIQ,YAAJ,CAAiBR,OAAjB,EAA0BS,OAA1B,CAAP;AACD,O;;AAEG2C,gB,GAAa,SAAbA,UAAa,CAAS7C,IAAT,EAAe;AAC9B,eAAOD,MAAMC,IAAN,CAAP;AACD,O;;AAEG8C,mB,GAAgB,SAAhBA,aAAgB,GAAW;AAC7B,eAAOtC,UAAP;AACD,O;;yBAIcuC,MAAM;AACnBL,4BAAoBA,kBADD;AAEnBG,oBAAYA,UAFO;AAGnBC,uBAAeA;AAHI,O","file":"dfunc.js","sourcesContent":["import _ from 'lodash';\n\nvar index = [];\nvar categories = {\n Arithmatic: [],\n Interpolation: [],\n Timeshift: [],\n Rate: [],\n Smoothing: [],\n Rollup: [],\n Rank: [],\n Count: [],\n Regression: [],\n Algorithms: []\n};\n\nfunction addFuncDef(funcDef) {\n funcDef.params = funcDef.params || [];\n funcDef.defaultParams = funcDef.defaultParams || [];\n funcDef.append = funcDef.append || false;\n if (funcDef.category) {\n funcDef.category.push(funcDef);\n }\n index[funcDef.name] = funcDef;\n index[funcDef.name] = funcDef;\n}\n\naddFuncDef({\n name: 'abs',\n category: categories.Arithmatic,\n});\n\naddFuncDef({\n name: 'log2',\n category: categories.Arithmatic,\n});\n\naddFuncDef({\n name: 'cumsum',\n category: categories.Arithmatic,\n});\n\naddFuncDef({\n name: 'integral',\n category: categories.Arithmatic,\n});\n\naddFuncDef({\n name: 'fill',\n category: categories.Interpolation,\n params: [\n { name: \"fill\", type: 'string', options: ['null', 'zero', 'linear', 'last'] },\n { name: \"limit\", type: 'int', optional: true},\n ],\n defaultParams: ['zero'],\n append: true,\n});\n\naddFuncDef({\n name: 'hour_before',\n category: categories.Timeshift,\n});\n\naddFuncDef({\n name: 'day_before',\n category: categories.Timeshift,\n});\n\naddFuncDef({\n name: 'week_before',\n category: categories.Timeshift,\n});\n\naddFuncDef({\n name: 'month_before',\n category: categories.Timeshift,\n});\n\naddFuncDef({\n name: 'per_second',\n category: categories.Rate,\n});\n\naddFuncDef({\n name: 'per_minute',\n category: categories.Rate,\n});\n\naddFuncDef({\n name: 'per_hour',\n category: categories.Rate,\n});\n\naddFuncDef({\n name: 'dt',\n category: categories.Rate,\n});\n\naddFuncDef({\n name: 'diff',\n category: categories.Rate,\n});\n\naddFuncDef({\n name: 'derivative',\n category: categories.Rate,\n});\n\naddFuncDef({\n name: 'ewma_3',\n category: categories.Smoothing,\n});\n\naddFuncDef({\n name: 'ewma_5',\n category: categories.Smoothing,\n});\n\naddFuncDef({\n name: 'ewma_10',\n category: categories.Smoothing,\n});\n\naddFuncDef({\n name: 'ewma_20',\n category: categories.Smoothing,\n});\n\naddFuncDef({\n name: 'median_3',\n category: categories.Smoothing,\n});\n\naddFuncDef({\n name: 'median_5',\n category: categories.Smoothing,\n});\n\naddFuncDef({\n name: 'median_7',\n category: categories.Smoothing,\n});\n\naddFuncDef({\n name: 'median_9',\n category: categories.Smoothing,\n});\n\naddFuncDef({\n name: 'rollup',\n category: categories.Rollup,\n params: [\n { name: \"rollup\", type: 'string', options: ['sum', 'avg', 'min', 'max'] },\n { name: \"period\", type: 'int'},\n ],\n defaultParams: ['sum', 600],\n append: true\n});\n\naddFuncDef({\n name: 'count_nonzero',\n category: categories.Count,\n});\n\naddFuncDef({\n name: 'count_not_null',\n category: categories.Count,\n});\n\naddFuncDef({\n name: 'top',\n category: categories.Rank,\n params: [\n { name: \"top\", type: 'int', options: [5, 10, 15]},\n { name: \"aggr\", type: 'string', options: ['mean', 'min', 'max', 'area', 'l2norm', 'last']},\n { name: \"dir\", type: 'string', options: ['asc', 'desc']},\n ],\n defaultParams: [5, 'mean', 'dir'],\n});\n\naddFuncDef({\n name: 'robust_trend',\n category: categories.Regression,\n});\n\naddFuncDef({\n name: 'piecewise_constant',\n category: categories.Regression,\n});\n\naddFuncDef({\n name: 'anomalies',\n category: categories.Algorithms,\n params: [\n { name: \"anomalies\", type: 'string', options: ['basic', 'agile', 'robust', 'adaptive']},\n { name: \"bonds\", type: 'int', options: [1, 2, 3, 4, 5, 6]},\n ],\n defaultParams: ['basic', 2],\n});\n\naddFuncDef({\n name: 'anomalies',\n category: categories.Algorithms,\n params: [\n { name: \"anomalies\", type: 'string', options: ['basic', 'agile', 'robust', 'adaptive']},\n { name: \"bonds\", type: 'int', options: [1, 2, 3, 4, 5, 6]},\n ],\n defaultParams: ['basic', 2],\n});\n\naddFuncDef({\n name: 'outliers',\n category: categories.Algorithms,\n params: [\n { name: \"outliers\", type: 'string', options: ['DBSCAN', 'MAD', 'scaledDBSCAN', 'scaledMAD']},\n { name: \"tolerance\", type: 'int', options: [\n 0.33,\n 0.5,\n 1,\n 1.5,\n 2.0,\n 2.5,\n 3.0,\n 3.5,\n 4.0,\n 4.5,\n 5.0]},\n ],\n defaultParams: ['basic', 2],\n});\n\n_.each(categories, function(funcList, catName) {\n categories[catName] = _.sortBy(funcList, 'name');\n});\n\nfunction FuncInstance(funcDef, options) {\n this.def = funcDef;\n this.params = [];\n\n if (options && options.withDefaultParams) {\n this.params = funcDef.defaultParams.slice(0);\n }\n\n this.updateText();\n}\n\nFuncInstance.prototype.render = function(metricExp) {\n var str = this.def.name + '(';\n var parameters = _.map(this.params, function(value) {\n return value;\n });\n if (metricExp && !this.def.append) {\n parameters.unshift(metricExp);\n }\n\n var funcRender = str + parameters.join(', ') + ')';\n console.log(funcRender, this.def.append);\n if (this.def.append) {\n return metricExp + '.' + funcRender;\n } else {\n return funcRender;\n }\n};\n\nFuncInstance.prototype.updateParam = function(strValue, index) {\n // handle optional parameters\n // if string contains ',' and next param is optional, split and update both\n\n if (strValue === '' && this.def.params[index].optional) {\n this.params.splice(index, 1);\n }\n else {\n this.params[index] = strValue;\n }\n\n this.updateText();\n};\n\nFuncInstance.prototype.updateText = function () {\n if (this.params.length === 0) {\n this.text = this.def.name + '()';\n return;\n }\n\n var text = this.def.name + '(';\n text += this.params.join(', ');\n text += ')';\n this.text = text;\n};\n\nvar createFuncInstance = function(funcDef, options) {\n if (_.isString(funcDef)) {\n if (!index[funcDef]) {\n throw { message: 'Method not found ' + name };\n }\n funcDef = index[funcDef];\n }\n return new FuncInstance(funcDef, options);\n};\n\nvar getFuncDef = function(name) {\n return index[name];\n};\n\nvar getCategories = function() {\n return categories;\n};\n\nvar foo;\n\nexport default foo = {\n createFuncInstance: createFuncInstance,\n getFuncDef: getFuncDef,\n getCategories: getCategories,\n};\n\n"]} \ No newline at end of file diff --git a/loadTest/docker/grafana/plugins/datadog/dist/func_editor.js b/loadTest/docker/grafana/plugins/datadog/dist/func_editor.js new file mode 100644 index 0000000..4bc1a63 --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/func_editor.js @@ -0,0 +1,251 @@ +'use strict'; + +System.register(['angular', 'lodash', 'jquery'], function (_export, _context) { + "use strict"; + + var angular, _, $; + + return { + setters: [function (_angular) { + angular = _angular.default; + }, function (_lodash) { + _ = _lodash.default; + }, function (_jquery) { + $ = _jquery.default; + }], + execute: function () { + + 'use strict'; + + angular.module('grafana.directives').directive('datadogFuncEditor', function ($compile, templateSrv) { + + var funcSpanTemplate = '{{func.def.name}}('; + var paramTemplate = ''; + + var funcControlsTemplate = '
' + '' + '' + '' + '' + '
'; + + return { + restrict: 'A', + link: function postLink($scope, elem) { + var $funcLink = $(funcSpanTemplate); + var $funcControls = $(funcControlsTemplate); + var ctrl = $scope.ctrl; + var func = $scope.func; + var funcDef = func.def; + var scheduledRelink = false; + var paramCountAtLink = 0; + + function clickFuncParam(paramIndex) { + /*jshint validthis:true */ + + var $link = $(this); + var $input = $link.next(); + + $input.val(func.params[paramIndex]); + $input.css('width', $link.width() + 16 + 'px'); + + $link.hide(); + $input.show(); + $input.focus(); + $input.select(); + + var typeahead = $input.data('typeahead'); + if (typeahead) { + $input.val(''); + typeahead.lookup(); + } + } + + function scheduledRelinkIfNeeded() { + if (paramCountAtLink === func.params.length) { + return; + } + + if (!scheduledRelink) { + scheduledRelink = true; + setTimeout(function () { + relink(); + scheduledRelink = false; + }, 200); + } + } + + function inputBlur(paramIndex) { + /*jshint validthis:true */ + var $input = $(this); + var $link = $input.prev(); + var newValue = $input.val(); + + if (newValue !== '' || func.def.params[paramIndex].optional) { + $link.html(templateSrv.highlightVariablesAsHtml(newValue)); + + func.updateParam($input.val(), paramIndex); + scheduledRelinkIfNeeded(); + + $scope.$apply(function () { + ctrl.targetChanged(); + }); + + $input.hide(); + $link.show(); + } + } + + function inputKeyPress(paramIndex, e) { + /*jshint validthis:true */ + if (e.which === 13) { + inputBlur.call(this, paramIndex); + } + } + + function inputKeyDown() { + /*jshint validthis:true */ + this.style.width = (3 + this.value.length) * 8 + 'px'; + } + + function addTypeahead($input, paramIndex) { + $input.attr('data-provide', 'typeahead'); + + var options = funcDef.params[paramIndex].options; + if (funcDef.params[paramIndex].type === 'int') { + options = _.map(options, function (val) { + return val.toString(); + }); + } + + $input.typeahead({ + source: options, + minLength: 0, + items: 20, + updater: function updater(value) { + setTimeout(function () { + inputBlur.call($input[0], paramIndex); + }, 0); + return value; + } + }); + + var typeahead = $input.data('typeahead'); + typeahead.lookup = function () { + this.query = this.$element.val() || ''; + return this.process(this.source); + }; + } + + function toggleFuncControls() { + var targetDiv = elem.closest('.tight-form'); + + if (elem.hasClass('show-function-controls')) { + elem.removeClass('show-function-controls'); + targetDiv.removeClass('has-open-function'); + $funcControls.hide(); + return; + } + + elem.addClass('show-function-controls'); + targetDiv.addClass('has-open-function'); + + $funcControls.show(); + } + + function addElementsAndCompile() { + $funcControls.appendTo(elem); + $funcLink.appendTo(elem); + + _.each(funcDef.params, function (param, index) { + if (param.optional && func.params.length <= index) { + return; + } + + if (index > 0) { + $(', ').appendTo(elem); + } + + var paramValue = templateSrv.highlightVariablesAsHtml(func.params[index]); + var $paramLink = $('' + paramValue + ''); + var $input = $(paramTemplate); + + paramCountAtLink++; + + $paramLink.appendTo(elem); + $input.appendTo(elem); + + $input.blur(_.partial(inputBlur, index)); + $input.keyup(inputKeyDown); + $input.keypress(_.partial(inputKeyPress, index)); + $paramLink.click(_.partial(clickFuncParam, index)); + + if (funcDef.params[index].options) { + addTypeahead($input, index); + } + }); + + $(')').appendTo(elem); + + $compile(elem.contents())($scope); + } + + function ifJustAddedFocusFistParam() { + if ($scope.func.added) { + $scope.func.added = false; + setTimeout(function () { + elem.find('.datadog-func-param-link').first().click(); + }, 10); + } + } + + function registerFuncControlsToggle() { + $funcLink.click(toggleFuncControls); + } + + function registerFuncControlsActions() { + $funcControls.click(function (e) { + var $target = $(e.target); + if ($target.hasClass('fa-remove')) { + toggleFuncControls(); + $scope.$apply(function () { + ctrl.removeFunction($scope.func); + }); + return; + } + + if ($target.hasClass('fa-arrow-left')) { + $scope.$apply(function () { + _.move(ctrl.functions, $scope.$index, $scope.$index - 1); + ctrl.targetChanged(); + }); + return; + } + + if ($target.hasClass('fa-arrow-right')) { + $scope.$apply(function () { + _.move(ctrl.functions, $scope.$index, $scope.$index + 1); + ctrl.targetChanged(); + }); + return; + } + + if ($target.hasClass('fa-question-circle')) { + window.open("http://docs.datadoghq.com/graphing/#apply-more-advanced-functions", '_blank'); + return; + } + }); + } + + function relink() { + elem.children().remove(); + + addElementsAndCompile(); + ifJustAddedFocusFistParam(); + registerFuncControlsToggle(); + registerFuncControlsActions(); + } + + relink(); + } + }; + }); + } + }; +}); +//# sourceMappingURL=func_editor.js.map diff --git a/loadTest/docker/grafana/plugins/datadog/dist/func_editor.js.map b/loadTest/docker/grafana/plugins/datadog/dist/func_editor.js.map new file mode 100644 index 0000000..57d754e --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/func_editor.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/func_editor.js"],"names":["angular","_","$","module","directive","$compile","templateSrv","funcSpanTemplate","paramTemplate","funcControlsTemplate","restrict","link","postLink","$scope","elem","$funcLink","$funcControls","ctrl","func","funcDef","def","scheduledRelink","paramCountAtLink","clickFuncParam","paramIndex","$link","$input","next","val","params","css","width","hide","show","focus","select","typeahead","data","lookup","scheduledRelinkIfNeeded","length","setTimeout","relink","inputBlur","prev","newValue","optional","html","highlightVariablesAsHtml","updateParam","$apply","targetChanged","inputKeyPress","e","which","call","inputKeyDown","style","value","addTypeahead","attr","options","type","map","toString","source","minLength","items","updater","query","$element","process","toggleFuncControls","targetDiv","closest","hasClass","removeClass","addClass","addElementsAndCompile","appendTo","each","param","index","paramValue","$paramLink","blur","partial","keyup","keypress","click","contents","ifJustAddedFocusFistParam","added","find","first","registerFuncControlsToggle","registerFuncControlsActions","$target","target","removeFunction","move","functions","$index","window","open","children","remove"],"mappings":"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","file":"func_editor.js","sourcesContent":["import angular from 'angular';\nimport _ from 'lodash';\nimport $ from 'jquery';\n\n'use strict';\n\nangular\n .module('grafana.directives')\n .directive('datadogFuncEditor', function($compile, templateSrv) {\n\n var funcSpanTemplate = '{{func.def.name}}(';\n var paramTemplate = '';\n\n var funcControlsTemplate =\n '
' +\n '' +\n '' +\n '' +\n '' +\n '
';\n\n return {\n restrict: 'A',\n link: function postLink($scope, elem) {\n var $funcLink = $(funcSpanTemplate);\n var $funcControls = $(funcControlsTemplate);\n var ctrl = $scope.ctrl;\n var func = $scope.func;\n var funcDef = func.def;\n var scheduledRelink = false;\n var paramCountAtLink = 0;\n\n function clickFuncParam(paramIndex) {\n /*jshint validthis:true */\n\n var $link = $(this);\n var $input = $link.next();\n\n $input.val(func.params[paramIndex]);\n $input.css('width', ($link.width() + 16) + 'px');\n\n $link.hide();\n $input.show();\n $input.focus();\n $input.select();\n\n var typeahead = $input.data('typeahead');\n if (typeahead) {\n $input.val('');\n typeahead.lookup();\n }\n }\n\n function scheduledRelinkIfNeeded() {\n if (paramCountAtLink === func.params.length) {\n return;\n }\n\n if (!scheduledRelink) {\n scheduledRelink = true;\n setTimeout(function() {\n relink();\n scheduledRelink = false;\n }, 200);\n }\n }\n\n function inputBlur(paramIndex) {\n /*jshint validthis:true */\n var $input = $(this);\n var $link = $input.prev();\n var newValue = $input.val();\n\n if (newValue !== '' || func.def.params[paramIndex].optional) {\n $link.html(templateSrv.highlightVariablesAsHtml(newValue));\n\n func.updateParam($input.val(), paramIndex);\n scheduledRelinkIfNeeded();\n\n $scope.$apply(function() {\n ctrl.targetChanged();\n });\n\n $input.hide();\n $link.show();\n }\n }\n\n function inputKeyPress(paramIndex, e) {\n /*jshint validthis:true */\n if(e.which === 13) {\n inputBlur.call(this, paramIndex);\n }\n }\n\n function inputKeyDown() {\n /*jshint validthis:true */\n this.style.width = (3 + this.value.length) * 8 + 'px';\n }\n\n function addTypeahead($input, paramIndex) {\n $input.attr('data-provide', 'typeahead');\n\n var options = funcDef.params[paramIndex].options;\n if (funcDef.params[paramIndex].type === 'int') {\n options = _.map(options, function(val) { return val.toString(); });\n }\n\n $input.typeahead({\n source: options,\n minLength: 0,\n items: 20,\n updater: function (value) {\n setTimeout(function() {\n inputBlur.call($input[0], paramIndex);\n }, 0);\n return value;\n }\n });\n\n var typeahead = $input.data('typeahead');\n typeahead.lookup = function () {\n this.query = this.$element.val() || '';\n return this.process(this.source);\n };\n }\n\n function toggleFuncControls() {\n var targetDiv = elem.closest('.tight-form');\n\n if (elem.hasClass('show-function-controls')) {\n elem.removeClass('show-function-controls');\n targetDiv.removeClass('has-open-function');\n $funcControls.hide();\n return;\n }\n\n elem.addClass('show-function-controls');\n targetDiv.addClass('has-open-function');\n\n $funcControls.show();\n }\n\n function addElementsAndCompile() {\n $funcControls.appendTo(elem);\n $funcLink.appendTo(elem);\n\n _.each(funcDef.params, function(param, index) {\n if (param.optional && func.params.length <= index) {\n return;\n }\n\n if (index > 0) {\n $(', ').appendTo(elem);\n }\n\n var paramValue = templateSrv.highlightVariablesAsHtml(func.params[index]);\n var $paramLink = $('' + paramValue + '');\n var $input = $(paramTemplate);\n\n paramCountAtLink++;\n\n $paramLink.appendTo(elem);\n $input.appendTo(elem);\n\n $input.blur(_.partial(inputBlur, index));\n $input.keyup(inputKeyDown);\n $input.keypress(_.partial(inputKeyPress, index));\n $paramLink.click(_.partial(clickFuncParam, index));\n\n if (funcDef.params[index].options) {\n addTypeahead($input, index);\n }\n\n });\n\n $(')').appendTo(elem);\n\n $compile(elem.contents())($scope);\n }\n\n function ifJustAddedFocusFistParam() {\n if ($scope.func.added) {\n $scope.func.added = false;\n setTimeout(function() {\n elem.find('.datadog-func-param-link').first().click();\n }, 10);\n }\n }\n\n function registerFuncControlsToggle() {\n $funcLink.click(toggleFuncControls);\n }\n\n function registerFuncControlsActions() {\n $funcControls.click(function(e) {\n var $target = $(e.target);\n if ($target.hasClass('fa-remove')) {\n toggleFuncControls();\n $scope.$apply(function() {\n ctrl.removeFunction($scope.func);\n });\n return;\n }\n\n if ($target.hasClass('fa-arrow-left')) {\n $scope.$apply(function() {\n _.move(ctrl.functions, $scope.$index, $scope.$index - 1);\n ctrl.targetChanged();\n });\n return;\n }\n\n if ($target.hasClass('fa-arrow-right')) {\n $scope.$apply(function() {\n _.move(ctrl.functions, $scope.$index, $scope.$index + 1);\n ctrl.targetChanged();\n });\n return;\n }\n\n if ($target.hasClass('fa-question-circle')) {\n window.open(\"http://docs.datadoghq.com/graphing/#apply-more-advanced-functions\", '_blank');\n return;\n }\n });\n }\n\n function relink() {\n elem.children().remove();\n\n addElementsAndCompile();\n ifJustAddedFocusFistParam();\n registerFuncControlsToggle();\n registerFuncControlsActions();\n }\n\n relink();\n }\n };\n\n });\n"]} \ No newline at end of file diff --git a/loadTest/docker/grafana/plugins/datadog/dist/img/datadog.png b/loadTest/docker/grafana/plugins/datadog/dist/img/datadog.png new file mode 100644 index 0000000000000000000000000000000000000000..0a5865ffcd6695b93630cdae85b4ef33e1ee3fc3 GIT binary patch literal 1550 zcmc(f`9Bj30LE9$F?Y_na=gwVUPGF^S!3pyaxRo3Uh-ui_i=!c1GglQ`4Ws>CvicWV>6tZQcRF5m z%Sgn)!et*np8r%W?@uh{mzuVwwusharl-9qzmVFGybdQK-+j)Ob>%1=%b|LIvE=K- zzlv>Rr;UOk+sa~&pS#dzI}?kkT1U+u2AaelcE->6Kha{IQ`X3Somys|G)cFLVQg!H8 zJxZW7p=}lv5PT4ONnsM5H%}=2`v7WM_x<&@T+?`gA7Sy?#-7jBWGst zuqayk@sk=Ihth%uhwmE+RehK_2=NNLz`jcsM^bs0F}6Y~e9i( zGEX&R*>WLqii2XO+c3z36rp5#pyC?(V3f14TNN0XvVG)?axqHSJ z-@i|CCTfUMsw8Y*j3^WXiF`mIFS~Q4Ixv1ox59j4s=)}mN?HH2b+i70TeTr#_K{-M zfh}yI(ncK$!IzBSl+YfZnH) zmAHX2o%jplpl%zhxB}OFKbxQ&z6V+i(o-!F=3wX|XrvsKJ83BYu|g~O>ovDXuY_x; znYVJN#FG;VxK57vm>`bfByt594`)P!E~ zYuz1}D@hp>eDQQZl3+j9#h#BEf`Id`s*yQhiI+bJsrf%S$&*tL_~MyUumfca;pl z%DsWIQiVJVG*Vql*s}Rz*kn(d2rkwz+^X*2?HdQUOJ~r}AxjQmBxi_m2wLUHDQIF= z`b6Yv=qjsTrlmoAb!bc<0-{%fkMxQI1Rg=gd8T$tuOF=ZZEo=|PjdRZaNzus07s$6 U)QC+o{_ITwC{r||4(=ZJA67u*CjbBd literal 0 HcmV?d00001 diff --git a/loadTest/docker/grafana/plugins/datadog/dist/module.js b/loadTest/docker/grafana/plugins/datadog/dist/module.js new file mode 100644 index 0000000..f5a4f01 --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/module.js @@ -0,0 +1,51 @@ +'use strict'; + +System.register(['./datasource', './query_ctrl'], function (_export, _context) { + "use strict"; + + var DataDogDatasource, DataDogQueryCtrl, DataDogConfigCtrl, DataDogQueryOptionsCtrl, DataDogAnnotationsQueryCtrl; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + return { + setters: [function (_datasource) { + DataDogDatasource = _datasource.DataDogDatasource; + }, function (_query_ctrl) { + DataDogQueryCtrl = _query_ctrl.DataDogQueryCtrl; + }], + execute: function () { + _export('ConfigCtrl', DataDogConfigCtrl = function DataDogConfigCtrl() { + _classCallCheck(this, DataDogConfigCtrl); + }); + + DataDogConfigCtrl.templateUrl = "partials/config.html"; + + _export('QueryOptionsCtrl', DataDogQueryOptionsCtrl = function DataDogQueryOptionsCtrl() { + _classCallCheck(this, DataDogQueryOptionsCtrl); + }); + + DataDogQueryOptionsCtrl.templateUrl = "partials/query.options.html"; + + _export('AnnotationsQueryCtrl', DataDogAnnotationsQueryCtrl = function DataDogAnnotationsQueryCtrl() { + _classCallCheck(this, DataDogAnnotationsQueryCtrl); + }); + + DataDogAnnotationsQueryCtrl.templateUrl = 'partials/annotations.editor.html'; + + _export('Datasource', DataDogDatasource); + + _export('QueryCtrl', DataDogQueryCtrl); + + _export('ConfigCtrl', DataDogConfigCtrl); + + _export('QueryOptionsCtrl', DataDogQueryOptionsCtrl); + + _export('AnnotationsQueryCtrl', DataDogAnnotationsQueryCtrl); + } + }; +}); +//# sourceMappingURL=module.js.map diff --git a/loadTest/docker/grafana/plugins/datadog/dist/module.js.map b/loadTest/docker/grafana/plugins/datadog/dist/module.js.map new file mode 100644 index 0000000..45611f8 --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/module.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/module.js"],"names":["DataDogDatasource","DataDogQueryCtrl","DataDogConfigCtrl","templateUrl","DataDogQueryOptionsCtrl","DataDogAnnotationsQueryCtrl"],"mappings":";;;;;;;;;;;;;;;AAAQA,uB,eAAAA,iB;;AACAC,sB,eAAAA,gB;;;4BAEFC,iB;;;;AACNA,wBAAkBC,WAAlB,GAAgC,sBAAhC;;kCAEMC,uB;;;;AACNA,8BAAwBD,WAAxB,GAAsC,6BAAtC;;sCAEME,2B;;;;AACNA,kCAA4BF,WAA5B,GAA0C,kCAA1C;;4BAGEH,iB;;2BACAC,gB;;4BACAC,iB;;kCACAE,uB;;sCACAC,2B","file":"module.js","sourcesContent":["import {DataDogDatasource} from './datasource';\nimport {DataDogQueryCtrl} from './query_ctrl';\n\nclass DataDogConfigCtrl {}\nDataDogConfigCtrl.templateUrl = \"partials/config.html\";\n\nclass DataDogQueryOptionsCtrl {}\nDataDogQueryOptionsCtrl.templateUrl = \"partials/query.options.html\";\n\nclass DataDogAnnotationsQueryCtrl {}\nDataDogAnnotationsQueryCtrl.templateUrl = 'partials/annotations.editor.html';\n\nexport {\n DataDogDatasource as Datasource,\n DataDogQueryCtrl as QueryCtrl,\n DataDogConfigCtrl as ConfigCtrl,\n DataDogQueryOptionsCtrl as QueryOptionsCtrl,\n DataDogAnnotationsQueryCtrl as AnnotationsQueryCtrl\n};\n"]} \ No newline at end of file diff --git a/loadTest/docker/grafana/plugins/datadog/dist/partials/annotations.editor.html b/loadTest/docker/grafana/plugins/datadog/dist/partials/annotations.editor.html new file mode 100644 index 0000000..5410b04 --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/partials/annotations.editor.html @@ -0,0 +1,29 @@ +
+
+ + + + + A comma separated string of sources + +
+
+ + + + + A comma separated string of tags + +
+
+ + +
+
diff --git a/loadTest/docker/grafana/plugins/datadog/dist/partials/config.html b/loadTest/docker/grafana/plugins/datadog/dist/partials/config.html new file mode 100644 index 0000000..edcc38e --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/partials/config.html @@ -0,0 +1,35 @@ + + + +
+

DataDog settings

+

You can manage your account's API and application keys here.

+
+
+
+ API Key + + +

Specify your datadog API Key

+
+
+
+ +
+
+ APP Key + + +

Specify your datadog APP Key

+
+
+
+
+
+ diff --git a/loadTest/docker/grafana/plugins/datadog/dist/partials/query.editor.html b/loadTest/docker/grafana/plugins/datadog/dist/partials/query.editor.html new file mode 100644 index 0000000..ab9998f --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/partials/query.editor.html @@ -0,0 +1,72 @@ + + +
+ +
+ +
+ +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+ +
+
+ +
+
+ +
+ +
+
+
+
+ +
+
+ +
+ +
+ +
+ + +
+
+
+ +
+ +
+
+ + +
+ +
+
+
+
+ +
+ +
diff --git a/loadTest/docker/grafana/plugins/datadog/dist/partials/query.options.html b/loadTest/docker/grafana/plugins/datadog/dist/partials/query.options.html new file mode 100644 index 0000000..99042d6 --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/partials/query.options.html @@ -0,0 +1,2 @@ +
+
diff --git a/loadTest/docker/grafana/plugins/datadog/dist/plugin.json b/loadTest/docker/grafana/plugins/datadog/dist/plugin.json new file mode 100644 index 0000000..912b71c --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/plugin.json @@ -0,0 +1,34 @@ +{ + "id": "grafana-datadog-datasource", + "name": "DataDog", + "type": "datasource", + + "metrics": true, + "annotations": true, + + "staticRoot": ".", + + "info": { + "description": "datasource plugin for DataDog", + "author": { + "name": "Alex Kessinger", + "url": "http://rumproarious.com" + }, + "keywords": ["datadog"], + "logos": { + "small": "img/datadog.png", + "large": "img/datadog.png" + }, + "links": [ + {"name": "GitHub", "url": "https://github.com/voidfiles/grafana-datasource-datagog"}, + {"name": "License", "url": "https://github.com/voidfiles/grafana-datasource-datagog/blob/master/LICENSE"} + ], + "version": "0.0.1", + "updated": "2016-12-18" + }, + + "dependencies": { + "grafanaVersion": "3.x.x", + "plugins": [ ] + } +} diff --git a/loadTest/docker/grafana/plugins/datadog/dist/query_builder.js b/loadTest/docker/grafana/plugins/datadog/dist/query_builder.js new file mode 100644 index 0000000..ba14f3a --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/query_builder.js @@ -0,0 +1,85 @@ +'use strict'; + +System.register(['lodash', './dfunc'], function (_export, _context) { + "use strict"; + + var _, dfunc; + + function buildQuery(target, adhocFilters) { + var aggregation = target.aggregation, + metric = target.metric, + tags = target.tags, + functions = target.functions; + + var query = aggregation + ':' + metric; + + var functionInstances = getFunctionInstances(functions); + + if (tags && tags.length || adhocFilters && adhocFilters.length) { + query += '{'; + + if (tags && tags.length) { + query += tags.join(','); + } + + if (adhocFilters && adhocFilters.length) { + var adhocTags = buildAdHocFilterString(adhocFilters); + if (tags && tags.length) { + query += ','; + } + query += adhocTags; + } + + query += '}'; + } else { + query += '{*}'; + } + + if (target.as) { + query += '.' + target.as + '()'; + } + + var groupedFuncs = _.groupBy(functionInstances, function (func) { + if (func.def.append) { + return 'appends'; + } else { + return 'wraps'; + } + }); + + _.each(groupedFuncs.appends, function (func) { + query += '.' + func.render(); + }); + + _.each(groupedFuncs.wraps, function (func) { + query = func.render(query); + }); + + return query; + } + + _export('buildQuery', buildQuery); + + function getFunctionInstances(functions) { + return _.map(functions, function (func) { + var f = dfunc.createFuncInstance(func.funcDef, { withDefaultParams: false }); + f.params = func.params.slice(); + return f; + }); + } + + function buildAdHocFilterString(adhocFilters) { + return adhocFilters.map(function (filter) { + return filter.key + ':' + filter.value; + }).join(','); + } + return { + setters: [function (_lodash) { + _ = _lodash.default; + }, function (_dfunc) { + dfunc = _dfunc.default; + }], + execute: function () {} + }; +}); +//# sourceMappingURL=query_builder.js.map diff --git a/loadTest/docker/grafana/plugins/datadog/dist/query_builder.js.map b/loadTest/docker/grafana/plugins/datadog/dist/query_builder.js.map new file mode 100644 index 0000000..38b9d03 --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/query_builder.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/query_builder.js"],"names":["buildQuery","target","adhocFilters","aggregation","metric","tags","functions","query","functionInstances","getFunctionInstances","length","join","adhocTags","buildAdHocFilterString","as","groupedFuncs","_","groupBy","func","def","append","each","appends","render","wraps","map","f","dfunc","createFuncInstance","funcDef","withDefaultParams","params","slice","filter","key","value"],"mappings":";;;;;;;AAGO,WAASA,UAAT,CAAoBC,MAApB,EAA4BC,YAA5B,EAA0C;AAAA,QAC1CC,WAD0C,GACFF,MADE,CAC1CE,WAD0C;AAAA,QAC7BC,MAD6B,GACFH,MADE,CAC7BG,MAD6B;AAAA,QACrBC,IADqB,GACFJ,MADE,CACrBI,IADqB;AAAA,QACfC,SADe,GACFL,MADE,CACfK,SADe;;AAE/C,QAAIC,QAAWJ,WAAX,SAA0BC,MAA9B;;AAEA,QAAII,oBAAqBC,qBAAqBH,SAArB,CAAzB;;AAEA,QAAKD,QAAQA,KAAKK,MAAd,IAA0BR,gBAAgBA,aAAaQ,MAA3D,EAAoE;AAClEH,eAAS,GAAT;;AAEA,UAAIF,QAAQA,KAAKK,MAAjB,EAAyB;AACvBH,iBAASF,KAAKM,IAAL,CAAU,GAAV,CAAT;AACD;;AAED,UAAIT,gBAAgBA,aAAaQ,MAAjC,EAAyC;AACvC,YAAIE,YAAYC,uBAAuBX,YAAvB,CAAhB;AACA,YAAIG,QAAQA,KAAKK,MAAjB,EAAyB;AACvBH,mBAAS,GAAT;AACD;AACDA,iBAASK,SAAT;AACD;;AAEDL,eAAS,GAAT;AACD,KAhBD,MAgBO;AACLA,eAAS,KAAT;AACD;;AAED,QAAIN,OAAOa,EAAX,EAAe;AACbP,eAAS,MAAMN,OAAOa,EAAb,GAAkB,IAA3B;AACD;;AAED,QAAIC,eAAeC,EAAEC,OAAF,CAAUT,iBAAV,EAA6B,gBAAQ;AACtD,UAAIU,KAAKC,GAAL,CAASC,MAAb,EAAqB;AACnB,eAAO,SAAP;AACD,OAFD,MAEO;AACL,eAAO,OAAP;AACD;AACF,KANkB,CAAnB;;AAQAJ,MAAEK,IAAF,CAAON,aAAaO,OAApB,EAA6B,gBAAQ;AACnCf,eAAS,MAAMW,KAAKK,MAAL,EAAf;AACD,KAFD;;AAIAP,MAAEK,IAAF,CAAON,aAAaS,KAApB,EAA2B,gBAAQ;AACjCjB,cAAQW,KAAKK,MAAL,CAAYhB,KAAZ,CAAR;AACD,KAFD;;AAIA,WAAOA,KAAP;AACD;;wBA/CeP,U;;AAiDhB,WAASS,oBAAT,CAA8BH,SAA9B,EAAyC;AACvC,WAAOU,EAAES,GAAF,CAAMnB,SAAN,EAAiB,gBAAQ;AAC9B,UAAIoB,IAAIC,MAAMC,kBAAN,CAAyBV,KAAKW,OAA9B,EAAuC,EAACC,mBAAmB,KAApB,EAAvC,CAAR;AACAJ,QAAEK,MAAF,GAAWb,KAAKa,MAAL,CAAYC,KAAZ,EAAX;AACA,aAAON,CAAP;AACD,KAJM,CAAP;AAKD;;AAED,WAASb,sBAAT,CAAgCX,YAAhC,EAA8C;AAC5C,WAAOA,aAAauB,GAAb,CAAiB,kBAAU;AAChC,aAAOQ,OAAOC,GAAP,GAAa,GAAb,GAAmBD,OAAOE,KAAjC;AACD,KAFM,EAEJxB,IAFI,CAEC,GAFD,CAAP;AAGD;;;AAhEMK,O;;AACAW,W","file":"query_builder.js","sourcesContent":["import _ from 'lodash';\nimport dfunc from './dfunc';\n\nexport function buildQuery(target, adhocFilters) {\n let {aggregation, metric, tags, functions} = target;\n let query = `${aggregation}:${metric}`;\n\n let functionInstances = getFunctionInstances(functions);\n\n if ((tags && tags.length) || (adhocFilters && adhocFilters.length)) {\n query += '{';\n\n if (tags && tags.length) {\n query += tags.join(',');\n }\n\n if (adhocFilters && adhocFilters.length) {\n let adhocTags = buildAdHocFilterString(adhocFilters);\n if (tags && tags.length) {\n query += ',';\n }\n query += adhocTags;\n }\n\n query += '}';\n } else {\n query += '{*}';\n }\n\n if (target.as) {\n query += '.' + target.as + '()';\n }\n\n var groupedFuncs = _.groupBy(functionInstances, func => {\n if (func.def.append) {\n return 'appends';\n } else {\n return 'wraps';\n }\n });\n\n _.each(groupedFuncs.appends, func => {\n query += '.' + func.render();\n });\n\n _.each(groupedFuncs.wraps, func => {\n query = func.render(query);\n });\n\n return query;\n}\n\nfunction getFunctionInstances(functions) {\n return _.map(functions, func => {\n var f = dfunc.createFuncInstance(func.funcDef, {withDefaultParams: false});\n f.params = func.params.slice();\n return f;\n });\n}\n\nfunction buildAdHocFilterString(adhocFilters) {\n return adhocFilters.map(filter => {\n return filter.key + ':' + filter.value;\n }).join(',');\n}\n"]} \ No newline at end of file diff --git a/loadTest/docker/grafana/plugins/datadog/dist/query_ctrl.js b/loadTest/docker/grafana/plugins/datadog/dist/query_ctrl.js new file mode 100644 index 0000000..052b4fd --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/query_ctrl.js @@ -0,0 +1,264 @@ +'use strict'; + +System.register(['lodash', './dfunc', 'app/plugins/sdk', './func_editor', './add_datadog_func', './query_builder'], function (_export, _context) { + "use strict"; + + var _, dfunc, QueryCtrl, queryBuilder, _createClass, DataDogQueryCtrl; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _possibleConstructorReturn(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + } + + return { + setters: [function (_lodash) { + _ = _lodash.default; + }, function (_dfunc) { + dfunc = _dfunc.default; + }, function (_appPluginsSdk) { + QueryCtrl = _appPluginsSdk.QueryCtrl; + }, function (_func_editor) {}, function (_add_datadog_func) {}, function (_query_builder) { + queryBuilder = _query_builder; + }], + execute: function () { + _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + _export('DataDogQueryCtrl', DataDogQueryCtrl = function (_QueryCtrl) { + _inherits(DataDogQueryCtrl, _QueryCtrl); + + function DataDogQueryCtrl($scope, $injector, uiSegmentSrv, templateSrv) { + _classCallCheck(this, DataDogQueryCtrl); + + var _this = _possibleConstructorReturn(this, (DataDogQueryCtrl.__proto__ || Object.getPrototypeOf(DataDogQueryCtrl)).call(this, $scope, $injector)); + + _this.removeText = '-- remove tag --'; + _this.uiSegmentSrv = uiSegmentSrv; + _this.templateSrv = templateSrv; + + if (_this.target.aggregation) { + _this.aggregationSegment = new uiSegmentSrv.newSegment(_this.target.aggregation); + } else { + _this.aggregationSegment = new uiSegmentSrv.newSegment({ + value: 'Select Aggregation', + fake: true, + custom: false + }); + } + + if (_this.target.metric) { + _this.metricSegment = new uiSegmentSrv.newSegment(_this.target.metric); + } else { + _this.metricSegment = new uiSegmentSrv.newSegment({ + value: 'Select Metric', + fake: true, + custom: false + }); + } + + _this.target.tags = _this.target.tags || []; + _this.tagSegments = _this.target.tags.map(uiSegmentSrv.newSegment); + _this.fixTagSegments(); + + _this.functions = []; + _this.target.functions = _this.target.functions || []; + _this.functions = _.map(_this.target.functions, function (func) { + var f = dfunc.createFuncInstance(func.funcDef, { withDefaultParams: false }); + f.params = func.params.slice(); + return f; + }); + + if (_this.target.as) { + _this.asSegment = uiSegmentSrv.newSegment(_this.target.as); + } else { + _this.asSegment = uiSegmentSrv.newSegment({ + value: 'Select As', + fake: true, + custom: false + }); + } + + return _this; + } + + _createClass(DataDogQueryCtrl, [{ + key: 'toggleEditorMode', + value: function toggleEditorMode() { + this.target.rawQuery = !this.target.rawQuery; + } + }, { + key: 'getMetrics', + value: function getMetrics() { + return this.datasource.metricFindQuery().then(this.uiSegmentSrv.transformToSegments(true)); + } + }, { + key: 'getAggregations', + value: function getAggregations() { + return Promise.resolve([{ text: 'avg by', value: 'avg' }, { text: 'max by', value: 'max' }, { text: 'min by', value: 'min' }, { text: 'sub by', value: 'sum' }]); + } + }, { + key: 'getAs', + value: function getAs() { + return Promise.resolve([{ text: 'None', value: 'None' }, { text: 'as_count', value: 'as_count' }, { text: 'as_rate', value: 'as_rate' }]); + } + }, { + key: 'getTags', + value: function getTags(segment) { + var _this2 = this; + + return this.datasource.tagFindQuery().then(this.uiSegmentSrv.transformToSegments(true)).then(function (results) { + if (segment.type !== 'plus-button') { + var removeSegment = _this2.uiSegmentSrv.newFake(_this2.removeText); + results.unshift(removeSegment); + } + + return results; + }); + } + }, { + key: 'aggregationChanged', + value: function aggregationChanged() { + this.target.aggregation = this.aggregationSegment.value; + this.panelCtrl.refresh(); + } + }, { + key: 'metricChanged', + value: function metricChanged() { + this.target.metric = this.metricSegment.value; + this.panelCtrl.refresh(); + } + }, { + key: 'asChanged', + value: function asChanged() { + if (this.asSegment.value === 'None') { + this.target.as = null; + } else { + this.target.as = this.asSegment.value; + } + this.panelCtrl.refresh(); + } + }, { + key: 'fixTagSegments', + value: function fixTagSegments() { + var count = this.tagSegments.length; + var lastSegment = this.tagSegments[Math.max(count - 1, 0)]; + + if (!lastSegment || lastSegment.type !== 'plus-button') { + this.tagSegments.push(this.uiSegmentSrv.newPlusButton()); + } + } + }, { + key: 'targetChanged', + value: function targetChanged() { + if (this.error) { + return; + } + + this.panelCtrl.refresh(); + } + }, { + key: 'persistFunctions', + value: function persistFunctions() { + this.target.functions = _.map(this.functions, function (func) { + return { + funcDef: func.def.name, + params: func.params.slice() + }; + }); + } + }, { + key: 'removeFunction', + value: function removeFunction(func) { + this.functions = _.without(this.functions, func); + this.persistFunctions(); + this.targetChanged(); + } + }, { + key: 'addFunction', + value: function addFunction(funcDef) { + var func = dfunc.createFuncInstance(funcDef, { withDefaultParams: true }); + func.added = true; + this.functions.push(func); + this.persistFunctions(); + this.targetChanged(); + } + }, { + key: 'tagSegmentUpdated', + value: function tagSegmentUpdated(segment, index) { + if (segment.value === this.removeText) { + this.tagSegments.splice(index, 1); + } + + var realSegments = _.filter(this.tagSegments, function (segment) { + return segment.value; + }); + this.target.tags = realSegments.map(function (segment) { + return segment.value; + }); + + this.tagSegments = _.map(this.target.tags, this.uiSegmentSrv.newSegment); + this.fixTagSegments(); + + this.panelCtrl.refresh(); + } + }, { + key: 'getCollapsedText', + value: function getCollapsedText() { + if (this.target.rawQuery) { + return this.target.query; + } else { + return queryBuilder.buildQuery(this.target); + } + } + }]); + + return DataDogQueryCtrl; + }(QueryCtrl)); + + _export('DataDogQueryCtrl', DataDogQueryCtrl); + + DataDogQueryCtrl.templateUrl = 'partials/query.editor.html'; + } + }; +}); +//# sourceMappingURL=query_ctrl.js.map diff --git a/loadTest/docker/grafana/plugins/datadog/dist/query_ctrl.js.map b/loadTest/docker/grafana/plugins/datadog/dist/query_ctrl.js.map new file mode 100644 index 0000000..c846ac0 --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/query_ctrl.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/query_ctrl.js"],"names":["_","dfunc","QueryCtrl","queryBuilder","DataDogQueryCtrl","$scope","$injector","uiSegmentSrv","templateSrv","removeText","target","aggregation","aggregationSegment","newSegment","value","fake","custom","metric","metricSegment","tags","tagSegments","map","fixTagSegments","functions","f","createFuncInstance","func","funcDef","withDefaultParams","params","slice","as","asSegment","rawQuery","datasource","metricFindQuery","then","transformToSegments","Promise","resolve","text","segment","tagFindQuery","type","removeSegment","newFake","results","unshift","panelCtrl","refresh","count","length","lastSegment","Math","max","push","newPlusButton","error","def","name","without","persistFunctions","targetChanged","added","index","splice","realSegments","filter","query","buildQuery","templateUrl"],"mappings":"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","file":"query_ctrl.js","sourcesContent":["import _ from 'lodash';\nimport dfunc from './dfunc';\nimport {QueryCtrl} from 'app/plugins/sdk';\nimport './func_editor';\nimport './add_datadog_func';\nimport * as queryBuilder from './query_builder';\n\nexport class DataDogQueryCtrl extends QueryCtrl {\n\n constructor($scope, $injector, uiSegmentSrv, templateSrv) {\n super($scope, $injector);\n this.removeText = '-- remove tag --';\n this.uiSegmentSrv = uiSegmentSrv;\n this.templateSrv = templateSrv;\n\n if (this.target.aggregation) {\n this.aggregationSegment = new uiSegmentSrv.newSegment(\n this.target.aggregation\n );\n } else {\n this.aggregationSegment = new uiSegmentSrv.newSegment({\n value: 'Select Aggregation',\n fake: true,\n custom: false,\n });\n }\n\n if (this.target.metric) {\n this.metricSegment = new uiSegmentSrv.newSegment(\n this.target.metric\n );\n } else {\n this.metricSegment = new uiSegmentSrv.newSegment({\n value: 'Select Metric',\n fake: true,\n custom: false,\n });\n }\n\n this.target.tags = this.target.tags || [];\n this.tagSegments = this.target.tags.map(uiSegmentSrv.newSegment);\n this.fixTagSegments();\n\n this.functions = [];\n this.target.functions = this.target.functions || [];\n this.functions = _.map(this.target.functions, func => {\n var f = dfunc.createFuncInstance(func.funcDef, {withDefaultParams: false});\n f.params = func.params.slice();\n return f;\n });\n\n if (this.target.as) {\n this.asSegment = uiSegmentSrv.newSegment(this.target.as);\n } else {\n this.asSegment = uiSegmentSrv.newSegment({\n value: 'Select As',\n fake: true,\n custom: false,\n });\n }\n\n }\n\n toggleEditorMode() {\n this.target.rawQuery = !this.target.rawQuery;\n }\n\n getMetrics() {\n return this.datasource.metricFindQuery()\n .then(this.uiSegmentSrv.transformToSegments(true));\n }\n\n getAggregations() {\n return Promise.resolve([\n {text: 'avg by', value: 'avg'},\n {text: 'max by', value: 'max'},\n {text: 'min by', value: 'min'},\n {text: 'sub by', value: 'sum'},\n ]);\n }\n\n getAs() {\n return Promise.resolve([\n {text: 'None', value: 'None'},\n {text: 'as_count', value: 'as_count'},\n {text: 'as_rate', value: 'as_rate'},\n ]);\n }\n\n getTags(segment) {\n return this.datasource.tagFindQuery()\n .then(this.uiSegmentSrv.transformToSegments(true))\n .then(results => {\n if (segment.type !== 'plus-button') {\n let removeSegment = this.uiSegmentSrv.newFake(this.removeText);\n results.unshift(removeSegment);\n }\n\n return results;\n });\n }\n\n aggregationChanged() {\n this.target.aggregation = this.aggregationSegment.value;\n this.panelCtrl.refresh();\n }\n\n metricChanged() {\n this.target.metric = this.metricSegment.value;\n this.panelCtrl.refresh();\n }\n\n asChanged() {\n if (this.asSegment.value === 'None') {\n this.target.as = null;\n } else {\n this.target.as = this.asSegment.value;\n }\n this.panelCtrl.refresh();\n }\n\n fixTagSegments() {\n var count = this.tagSegments.length;\n var lastSegment = this.tagSegments[Math.max(count-1, 0)];\n\n if (!lastSegment || lastSegment.type !== 'plus-button') {\n this.tagSegments.push(this.uiSegmentSrv.newPlusButton());\n }\n }\n\n targetChanged() {\n if (this.error) {\n return;\n }\n\n this.panelCtrl.refresh();\n }\n\n persistFunctions () {\n this.target.functions = _.map(this.functions, func => {\n return {\n funcDef: func.def.name,\n params: func.params.slice(),\n };\n });\n }\n\n removeFunction(func) {\n this.functions = _.without(this.functions, func);\n this.persistFunctions();\n this.targetChanged();\n }\n\n addFunction(funcDef) {\n var func = dfunc.createFuncInstance(funcDef, {withDefaultParams: true});\n func.added = true;\n this.functions.push(func);\n this.persistFunctions();\n this.targetChanged();\n }\n\n tagSegmentUpdated(segment, index) {\n if (segment.value === this.removeText) {\n this.tagSegments.splice(index, 1);\n }\n\n let realSegments = _.filter(this.tagSegments, segment => segment.value);\n this.target.tags = realSegments.map(segment => segment.value);\n\n this.tagSegments = _.map(this.target.tags, this.uiSegmentSrv.newSegment);\n this.fixTagSegments();\n\n this.panelCtrl.refresh();\n }\n\n getCollapsedText() {\n if (this.target.rawQuery) {\n return this.target.query;\n } else {\n return queryBuilder.buildQuery(this.target);\n }\n }\n}\n\nDataDogQueryCtrl.templateUrl = 'partials/query.editor.html';\n"]} \ No newline at end of file diff --git a/loadTest/docker/grafana/plugins/datadog/dist/showdown.min.js b/loadTest/docker/grafana/plugins/datadog/dist/showdown.min.js new file mode 100644 index 0000000..03e7446 --- /dev/null +++ b/loadTest/docker/grafana/plugins/datadog/dist/showdown.min.js @@ -0,0 +1,5 @@ +/*! showdown 29-01-2017 */ + +(function(){function a(a){"use strict";var b={omitExtraWLInCodeBlocks:{defaultValue:!1,describe:"Omit the default extra whiteline added to code blocks",type:"boolean"},noHeaderId:{defaultValue:!1,describe:"Turn on/off generated header id",type:"boolean"},prefixHeaderId:{defaultValue:!1,describe:"Specify a prefix to generated header ids",type:"string"},ghCompatibleHeaderId:{defaultValue:!1,describe:"Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)",type:"boolean"},headerLevelStart:{defaultValue:!1,describe:"The header blocks level start",type:"integer"},parseImgDimensions:{defaultValue:!1,describe:"Turn on/off image dimension parsing",type:"boolean"},simplifiedAutoLink:{defaultValue:!1,describe:"Turn on/off GFM autolink style",type:"boolean"},excludeTrailingPunctuationFromURLs:{defaultValue:!1,describe:"Excludes trailing punctuation from links generated with autoLinking",type:"boolean"},literalMidWordUnderscores:{defaultValue:!1,describe:"Parse midword underscores as literal underscores",type:"boolean"},strikethrough:{defaultValue:!1,describe:"Turn on/off strikethrough support",type:"boolean"},tables:{defaultValue:!1,describe:"Turn on/off tables support",type:"boolean"},tablesHeaderId:{defaultValue:!1,describe:"Add an id to table headers",type:"boolean"},ghCodeBlocks:{defaultValue:!0,describe:"Turn on/off GFM fenced code blocks support",type:"boolean"},tasklists:{defaultValue:!1,describe:"Turn on/off GFM tasklist support",type:"boolean"},smoothLivePreview:{defaultValue:!1,describe:"Prevents weird effects in live previews due to incomplete input",type:"boolean"},smartIndentationFix:{defaultValue:!1,description:"Tries to smartly fix indentation in es6 strings",type:"boolean"},disableForced4SpacesIndentedSublists:{defaultValue:!1,description:"Disables the requirement of indenting nested sublists by 4 spaces",type:"boolean"},simpleLineBreaks:{defaultValue:!1,description:"Parses simple line breaks as
(GFM Style)",type:"boolean"},requireSpaceBeforeHeadingText:{defaultValue:!1,description:"Makes adding a space between `#` and the header text mandatory (GFM Style)",type:"boolean"},ghMentions:{defaultValue:!1,description:"Enables github @mentions",type:"boolean"},ghMentionsLink:{defaultValue:"https://github.com/{u}",description:"Changes the link generated by @mentions. Only applies if ghMentions option is enabled.",type:"string"},encodeEmails:{defaultValue:!0,description:"Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities",type:"boolean"}};if(a===!1)return JSON.parse(JSON.stringify(b));var c={};for(var d in b)b.hasOwnProperty(d)&&(c[d]=b[d].defaultValue);return c}function b(){"use strict";var b=a(!0),c={};for(var d in b)b.hasOwnProperty(d)&&(c[d]=!0);return c}function c(a,b){"use strict";var c=b?"Error in "+b+" extension->":"Error in unnamed extension",d={valid:!0,error:""};e.helper.isArray(a)||(a=[a]);for(var f=0;f-1,l=new RegExp(b+"|"+c,"g"+j.replace(/g/g,"")),m=new RegExp(b,j.replace(/g/g,"")),n=[];do for(e=0;g=l.exec(a);)if(m.test(g[0]))e++||(f=l.lastIndex,h=f-g[0].length);else if(e&&!--e){i=g.index+g[0].length;var o={left:{start:h,end:f},match:{start:f,end:g.index},right:{start:g.index,end:i},wholeMatch:{start:h,end:i}};if(n.push(o),!k)return n}while(e&&(l.lastIndex=f));return n};e.helper.matchRecursiveRegExp=function(a,b,c,d){"use strict";for(var e=k(a,b,c,d),f=[],g=0;g0){var l=[];0!==h[0].wholeMatch.start&&l.push(a.slice(0,h[0].wholeMatch.start));for(var m=0;j>m;++m)l.push(b(a.slice(h[m].wholeMatch.start,h[m].wholeMatch.end),a.slice(h[m].match.start,h[m].match.end),a.slice(h[m].left.start,h[m].left.end),a.slice(h[m].right.start,h[m].right.end))),j-1>m&&l.push(a.slice(h[m].wholeMatch.end,h[m+1].wholeMatch.start));h[j-1].wholeMatch.end.9?b[2](a):c>.45?b[1](a):b[0](a)}return a})},"undefined"==typeof console&&(console={warn:function(a){"use strict";alert(a)},log:function(a){"use strict";alert(a)},error:function(a){"use strict";throw a}}),e.helper.regexes={asteriskAndDash:/([*_])/g},e.Converter=function(a){"use strict";function b(){a=a||{};for(var b in h)h.hasOwnProperty(b)&&(m[b]=h[b]);if("object"!=typeof a)throw Error("Converter expects the passed parameter to be an object, but "+typeof a+" was passed instead.");for(var c in a)a.hasOwnProperty(c)&&(m[c]=a[c]);m.extensions&&e.helper.forEach(m.extensions,d)}function d(a,b){if(b=b||null,e.helper.isString(a)){if(a=e.helper.stdExtName(a),b=a,e.extensions[a])return console.warn("DEPRECATION WARNING: "+a+" is an old extension that uses a deprecated loading method.Please inform the developer that the extension should be updated!"),void f(e.extensions[a],a);if(e.helper.isUndefined(g[a]))throw Error('Extension "'+a+'" could not be loaded. It was either not found or is not a valid extension.');a=g[a]}"function"==typeof a&&(a=a()),e.helper.isArray(a)||(a=[a]);var d=c(a,b);if(!d.valid)throw Error(d.error);for(var h=0;h-1))return a;m=""}else m=c.gUrls[l],e.helper.isUndefined(c.gTitles[l])||(n=c.gTitles[l]);m=m.replace(e.helper.regexes.asteriskAndDash,e.helper.escapeCharactersCallback);var o='"};return a=a.replace(/(\[((?:\[[^\]]*]|[^\[\]])*)][ ]?(?:\n[ ]*)?\[(.*?)])()()()()/g,d),a=a.replace(/(\[((?:\[[^\]]*]|[^\[\]])*)]\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,d),a=a.replace(/(\[([^\[\]]+)])()()()()()/g,d),b.ghMentions&&(a=a.replace(/(^|\s)(\\)?(@([a-z\d\-]+))(?=[.!?;,[\]()]|\s|$)/gim,function(a,c,d,f,g){if("\\"===d)return c+f;if(!e.helper.isString(b.ghMentionsLink))throw new Error("ghMentionsLink option must be a string");var h=b.ghMentionsLink.replace(/\{u}/g,g);return c+''+f+""})),a=c.converter._dispatch("anchors.after",a,b,c)}),e.subParser("autoLinks",function(a,b,c){"use strict";function d(a,c,d,e,f){var g=c,h="";return/^www\./i.test(c)&&(c=c.replace(/^www\./i,"http://www.")),b.excludeTrailingPunctuationFromURLs&&f&&(h=f),''+g+""+h}function f(a,c,d){var f="mailto:";return c=c||"",d=e.subParser("unescapeSpecialChars")(d),b.encodeEmails?(d=e.helper.encodeEmailAddress(d),f=e.helper.encodeEmailAddress(f+d)):f+=d,c+''+d+""}a=c.converter._dispatch("autoLinks.before",a,b,c);var g=/\b(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+)()(?=\s|$)(?!["<>])/gi,h=/\b(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+?)([.!?()]?)(?=\s|$)(?!["<>])/gi,i=/<(((https?|ftp|dict):\/\/|www\.)[^'">\s]+)>/gi,j=/(^|\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-\/=?^_`{|}~.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?=$|\s)/gim,k=/<()(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi;return a=a.replace(i,d),a=a.replace(k,f),b.simplifiedAutoLink&&(a=b.excludeTrailingPunctuationFromURLs?a.replace(h,d):a.replace(g,d),a=a.replace(j,f)),a=c.converter._dispatch("autoLinks.after",a,b,c)}),e.subParser("blockGamut",function(a,b,c){"use strict";return a=c.converter._dispatch("blockGamut.before",a,b,c),a=e.subParser("blockQuotes")(a,b,c),a=e.subParser("headers")(a,b,c),a=e.subParser("horizontalRule")(a,b,c),a=e.subParser("lists")(a,b,c),a=e.subParser("codeBlocks")(a,b,c),a=e.subParser("tables")(a,b,c),a=e.subParser("hashHTMLBlocks")(a,b,c),a=e.subParser("paragraphs")(a,b,c),a=c.converter._dispatch("blockGamut.after",a,b,c)}),e.subParser("blockQuotes",function(a,b,c){"use strict";return a=c.converter._dispatch("blockQuotes.before",a,b,c),a=a.replace(/((^ {0,3}>[ \t]?.+\n(.+\n)*\n*)+)/gm,function(a,d){var f=d;return f=f.replace(/^[ \t]*>[ \t]?/gm,"¨0"),f=f.replace(/¨0/g,""),f=f.replace(/^[ \t]+$/gm,""),f=e.subParser("githubCodeBlocks")(f,b,c),f=e.subParser("blockGamut")(f,b,c),f=f.replace(/(^|\n)/g,"$1 "),f=f.replace(/(\s*
[^\r]+?<\/pre>)/gm,function(a,b){var c=b;return c=c.replace(/^  /gm,"¨0"),c=c.replace(/¨0/g,"")}),e.subParser("hashBlock")("
\n"+f+"\n
",b,c)}),a=c.converter._dispatch("blockQuotes.after",a,b,c)}),e.subParser("codeBlocks",function(a,b,c){"use strict";a=c.converter._dispatch("codeBlocks.before",a,b,c),a+="¨0";var d=/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=¨0))/g;return a=a.replace(d,function(a,d,f){var g=d,h=f,i="\n";return g=e.subParser("outdent")(g),g=e.subParser("encodeCode")(g),g=e.subParser("detab")(g),g=g.replace(/^\n+/g,""),g=g.replace(/\n+$/g,""),b.omitExtraWLInCodeBlocks&&(i=""),g="
"+g+i+"
",e.subParser("hashBlock")(g,b,c)+h}),a=a.replace(/¨0/,""),a=c.converter._dispatch("codeBlocks.after",a,b,c)}),e.subParser("codeSpans",function(a,b,c){"use strict";return a=c.converter._dispatch("codeSpans.before",a,b,c),"undefined"==typeof a&&(a=""),a=a.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,function(a,b,c,d){var f=d;return f=f.replace(/^([ \t]*)/g,""),f=f.replace(/[ \t]*$/g,""),f=e.subParser("encodeCode")(f),b+""+f+""}),a=c.converter._dispatch("codeSpans.after",a,b,c)}),e.subParser("detab",function(a){"use strict";return a=a.replace(/\t(?=\t)/g," "),a=a.replace(/\t/g,"¨A¨B"),a=a.replace(/¨B(.+?)¨A/g,function(a,b){for(var c=b,d=4-c.length%4,e=0;d>e;e++)c+=" ";return c}),a=a.replace(/¨A/g," "),a=a.replace(/¨B/g,"")}),e.subParser("encodeAmpsAndAngles",function(a){"use strict";return a=a.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g,"&"),a=a.replace(/<(?![a-z\/?\$!])/gi,"<")}),e.subParser("encodeBackslashEscapes",function(a){"use strict";return a=a.replace(/\\(\\)/g,e.helper.escapeCharactersCallback),a=a.replace(/\\([`*_{}\[\]()>#+-.!~])/g,e.helper.escapeCharactersCallback)}),e.subParser("encodeCode",function(a){"use strict";return a=a.replace(/&/g,"&").replace(//g,">").replace(/([*_{}\[\]\\])/g,e.helper.escapeCharactersCallback)}),e.subParser("escapeSpecialCharsWithinTagAttributes",function(a){"use strict";var b=/(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|)/gi;return a=a.replace(b,function(a){return a.replace(/(.)<\/?code>(?=.)/g,"$1`").replace(/([\\`*_ ~=])/g,e.helper.escapeCharactersCallback)})}),e.subParser("githubCodeBlocks",function(a,b,c){"use strict";return b.ghCodeBlocks?(a=c.converter._dispatch("githubCodeBlocks.before",a,b,c),a+="¨0",a=a.replace(/(?:^|\n)```(.*)\n([\s\S]*?)\n```/g,function(a,d,f){var g=b.omitExtraWLInCodeBlocks?"":"\n";return f=e.subParser("encodeCode")(f),f=e.subParser("detab")(f),f=f.replace(/^\n+/g,""),f=f.replace(/\n+$/g,""),f="
"+f+g+"
",f=e.subParser("hashBlock")(f,b,c),"\n\n¨G"+(c.ghCodeBlocks.push({text:a,codeblock:f})-1)+"G\n\n"}),a=a.replace(/¨0/,""),c.converter._dispatch("githubCodeBlocks.after",a,b,c)):a}),e.subParser("hashBlock",function(a,b,c){"use strict";return a=a.replace(/(^\n+|\n+$)/g,""),"\n\n¨K"+(c.gHtmlBlocks.push(a)-1)+"K\n\n"}),e.subParser("hashElement",function(a,b,c){"use strict";return function(a,b){var d=b;return d=d.replace(/\n\n/g,"\n"),d=d.replace(/^\n/,""),d=d.replace(/\n+$/g,""),d="\n\n¨K"+(c.gHtmlBlocks.push(d)-1)+"K\n\n"}}),e.subParser("hashHTMLBlocks",function(a,b,c){"use strict";for(var d=["pre","div","h1","h2","h3","h4","h5","h6","blockquote","table","dl","ol","ul","script","noscript","form","fieldset","iframe","math","style","section","header","footer","nav","article","aside","address","audio","canvas","figure","hgroup","output","video","p"],f=function(a,b,d,e){var f=a;return-1!==d.search(/\bmarkdown\b/)&&(f=d+c.converter.makeHtml(b)+e),"\n\n¨K"+(c.gHtmlBlocks.push(f)-1)+"K\n\n"},g=0;g]*>","","gim");return a=a.replace(/(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,e.subParser("hashElement")(a,b,c)),a=e.helper.replaceRecursiveRegExp(a,function(a){return"\n\n¨K"+(c.gHtmlBlocks.push(a)-1)+"K\n\n"},"^ {0,3}","gm"),a=a.replace(/(?:\n\n)( {0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,e.subParser("hashElement")(a,b,c))}),e.subParser("hashHTMLSpans",function(a,b,c){"use strict";for(var d=e.helper.matchRecursiveRegExp(a,"]*>","","gi"),f=0;f]*>\\s*]*>","^ {0,3}\\s*
","gim")}),e.subParser("headers",function(a,b,c){"use strict";function d(a){var b,d;return d=h?a.replace(/ /g,"-").replace(/&/g,"").replace(/¨T/g,"").replace(/¨D/g,"").replace(/[&+$,\/:;=?@"#{}|^¨~\[\]`\\*)(%.!'<>]/g,"").toLowerCase():a.replace(/[^\w]/g,"").toLowerCase(),c.hashLinkCounts[d]?b=d+"-"+c.hashLinkCounts[d]++:(b=d,c.hashLinkCounts[d]=1),f===!0&&(f="section"),e.helper.isString(f)?f+b:b}a=c.converter._dispatch("headers.before",a,b,c);var f=b.prefixHeaderId,g=isNaN(parseInt(b.headerLevelStart))?1:parseInt(b.headerLevelStart),h=b.ghCompatibleHeaderId,i=b.smoothLivePreview?/^(.+)[ \t]*\n={2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n=+[ \t]*\n+/gm,j=b.smoothLivePreview?/^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n-+[ \t]*\n+/gm;a=a.replace(i,function(a,f){var h=e.subParser("spanGamut")(f,b,c),i=b.noHeaderId?"":' id="'+d(f)+'"',j=g,k=""+h+"";return e.subParser("hashBlock")(k,b,c)}),a=a.replace(j,function(a,f){var h=e.subParser("spanGamut")(f,b,c),i=b.noHeaderId?"":' id="'+d(f)+'"',j=g+1,k=""+h+"";return e.subParser("hashBlock")(k,b,c)});var k=b.requireSpaceBeforeHeadingText?/^(#{1,6})[ \t]+(.+?)[ \t]*#*\n+/gm:/^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm;return a=a.replace(k,function(a,f,h){var i=e.subParser("spanGamut")(h,b,c),j=b.noHeaderId?"":' id="'+d(h)+'"',k=g-1+f.length,l=""+i+"";return e.subParser("hashBlock")(l,b,c)}),a=c.converter._dispatch("headers.after",a,b,c)}),e.subParser("horizontalRule",function(a,b,c){"use strict";a=c.converter._dispatch("horizontalRule.before",a,b,c);var d=e.subParser("hashBlock")("
",b,c);return a=a.replace(/^ {0,2}( ?-){3,}[ \t]*$/gm,d),a=a.replace(/^ {0,2}( ?\*){3,}[ \t]*$/gm,d),a=a.replace(/^ {0,2}( ?_){3,}[ \t]*$/gm,d),a=c.converter._dispatch("horizontalRule.after",a,b,c)}),e.subParser("images",function(a,b,c){"use strict";function d(a,b,d,f,g,h,i,j){var k=c.gUrls,l=c.gTitles,m=c.gDimensions;if(d=d.toLowerCase(),j||(j=""),""===f||null===f){if((""===d||null===d)&&(d=b.toLowerCase().replace(/ ?\n/g," ")),f="#"+d,e.helper.isUndefined(k[d]))return a;f=k[d],e.helper.isUndefined(l[d])||(j=l[d]),e.helper.isUndefined(m[d])||(g=m[d].width,h=m[d].height)}b=b.replace(/"/g,""").replace(e.helper.regexes.asteriskAndDash,e.helper.escapeCharactersCallback),f=f.replace(e.helper.regexes.asteriskAndDash,e.helper.escapeCharactersCallback);var n=''+b+'?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(['"])(.*?)\6[ \t]*)?\)/g,g=/!\[([^\]]*?)] ?(?:\n *)?\[(.*?)]()()()()()/g;return a=a.replace(g,d),a=a.replace(f,d),a=c.converter._dispatch("images.after",a,b,c)}),e.subParser("italicsAndBold",function(a,b,c){"use strict";return a=c.converter._dispatch("italicsAndBold.before",a,b,c),b.literalMidWordUnderscores?(a=a.replace(/(^|\s|>|\b)__(?=\S)([\s\S]+?)__(?=\b|<|\s|$)/gm,"$1$2"),a=a.replace(/(^|\s|>|\b)_(?=\S)([\s\S]+?)_(?=\b|<|\s|$)/gm,"$1$2"),a=a.replace(/(\*\*)(?=\S)([^\r]*?\S[*]*)\1/g,"$2"),a=a.replace(/(\*)(?=\S)([^\r]*?\S)\1/g,"$2")):(a=a.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g,"$2"),a=a.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g,"$2")),a=c.converter._dispatch("italicsAndBold.after",a,b,c)}),e.subParser("lists",function(a,b,c){"use strict";function d(a,d){c.gListLevel++,a=a.replace(/\n{2,}$/,"\n"),a+="¨0";var f=/(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0| {0,3}([*+-]|\d+[.])[ \t]+))/gm,g=/\n[ \t]*\n(?!¨0)/.test(a);return b.disableForced4SpacesIndentedSublists&&(f=/(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm),a=a.replace(f,function(a,d,f,h,i,j,k){k=k&&""!==k.trim();var l=e.subParser("outdent")(i,b,c),m="";return j&&b.tasklists&&(m=' class="task-list-item" style="list-style-type: none;"',l=l.replace(/^[ \t]*\[(x|X| )?]/m,function(){var a='-1?(l=e.subParser("githubCodeBlocks")(l,b,c),l=e.subParser("blockGamut")(l,b,c)):(l=e.subParser("lists")(l,b,c),l=l.replace(/\n$/,""),l=e.subParser("hashHTMLBlocks")(l,b,c),l=l.replace(/\n\n+/g,"\n\n"),l=l.replace(/\n\n/g,"¨B"),l=g?e.subParser("paragraphs")(l,b,c):e.subParser("spanGamut")(l,b,c),l=l.replace(/¨B/g,"\n\n")),l=l.replace("¨A",""),l=""+l+"\n"}),a=a.replace(/¨0/g,""),c.gListLevel--,d&&(a=a.replace(/\s+$/,"")),a}function f(a,c,e){var f=b.disableForced4SpacesIndentedSublists?/^ ?\d+\.[ \t]/gm:/^ {0,3}\d+\.[ \t]/gm,g=b.disableForced4SpacesIndentedSublists?/^ ?[*+-][ \t]/gm:/^ {0,3}[*+-][ \t]/gm,h="ul"===c?f:g,i="";return-1!==a.search(h)?!function j(a){var b=a.search(h);-1!==b?(i+="\n<"+c+">\n"+d(a.slice(0,b),!!e)+"\n",c="ul"===c?"ol":"ul",h="ul"===c?f:g,j(a.slice(b))):i+="\n<"+c+">\n"+d(a,!!e)+"\n"}(a):i="\n<"+c+">\n"+d(a,!!e)+"\n",i}return a=c.converter._dispatch("lists.before",a,b,c),a+="¨0",a=c.gListLevel?a.replace(/^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm,function(a,b,c){var d=c.search(/[*+-]/g)>-1?"ul":"ol";return f(b,d,!0)}):a.replace(/(\n\n|^\n?)(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm,function(a,b,c,d){var e=d.search(/[*+-]/g)>-1?"ul":"ol";return f(c,e,!1)}),a=a.replace(/¨0/,""),a=c.converter._dispatch("lists.after",a,b,c)}),e.subParser("outdent",function(a){"use strict";return a=a.replace(/^(\t|[ ]{1,4})/gm,"¨0"),a=a.replace(/¨0/g,"")}),e.subParser("paragraphs",function(a,b,c){"use strict";a=c.converter._dispatch("paragraphs.before",a,b,c),a=a.replace(/^\n+/g,""),a=a.replace(/\n+$/g,"");for(var d=a.split(/\n{2,}/g),f=[],g=d.length,h=0;g>h;h++){var i=d[h];i.search(/¨(K|G)(\d+)\1/g)>=0?f.push(i):(i=e.subParser("spanGamut")(i,b,c),i=i.replace(/^([ \t]*)/g,"

"),i+="

",f.push(i))}for(g=f.length,h=0;g>h;h++){for(var j="",k=f[h],l=!1;k.search(/¨(K|G)(\d+)\1/)>=0;){var m=RegExp.$1,n=RegExp.$2;j="K"===m?c.gHtmlBlocks[n]:l?e.subParser("encodeCode")(c.ghCodeBlocks[n].text):c.ghCodeBlocks[n].codeblock,j=j.replace(/\$/g,"$$$$"),k=k.replace(/(\n\n)?¨(K|G)\d+\2(\n\n)?/,j),/^]*>\s*]*>/.test(k)&&(l=!0)}f[h]=k}return a=f.join("\n"),a=a.replace(/^\n+/g,""),a=a.replace(/\n+$/g,""),c.converter._dispatch("paragraphs.after",a,b,c)}),e.subParser("runExtension",function(a,b,c,d){"use strict";if(a.filter)b=a.filter(b,d.converter,c);else if(a.regex){var e=a.regex;!e instanceof RegExp&&(e=new RegExp(e,"g")),b=b.replace(e,a.replace)}return b}),e.subParser("spanGamut",function(a,b,c){"use strict";return a=c.converter._dispatch("spanGamut.before",a,b,c),a=e.subParser("codeSpans")(a,b,c),a=e.subParser("escapeSpecialCharsWithinTagAttributes")(a,b,c),a=e.subParser("encodeBackslashEscapes")(a,b,c),a=e.subParser("images")(a,b,c),a=e.subParser("anchors")(a,b,c),a=e.subParser("autoLinks")(a,b,c),a=e.subParser("encodeAmpsAndAngles")(a,b,c),a=e.subParser("italicsAndBold")(a,b,c),a=e.subParser("strikethrough")(a,b,c),a=b.simpleLineBreaks?a.replace(/\n/g,"
\n"):a.replace(/ +\n/g,"
\n"),a=c.converter._dispatch("spanGamut.after",a,b,c)}),e.subParser("strikethrough",function(a,b,c){"use strict";return b.strikethrough&&(a=c.converter._dispatch("strikethrough.before",a,b,c),a=a.replace(/(?:~){2}([\s\S]+?)(?:~){2}/g,"$1"),a=c.converter._dispatch("strikethrough.after",a,b,c)),a}),e.subParser("stripBlankLines",function(a){"use strict";return a.replace(/^[ \t]+$/gm,"")}),e.subParser("stripLinkDefinitions",function(a,b,c){"use strict";var d=/^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=¨0))/gm;return a+="¨0",a=a.replace(d,function(a,d,f,g,h,i,j){return d=d.toLowerCase(),c.gUrls[d]=e.subParser("encodeAmpsAndAngles")(f),i?i+j:(j&&(c.gTitles[d]=j.replace(/"|'/g,""")),b.parseImgDimensions&&g&&h&&(c.gDimensions[d]={width:g,height:h}),"")}),a=a.replace(/¨0/,"")}),e.subParser("tables",function(a,b,c){"use strict";function d(a){return/^:[ \t]*--*$/.test(a)?' style="text-align:left;"':/^--*[ \t]*:[ \t]*$/.test(a)?' style="text-align:right;"':/^:[ \t]*--*[ \t]*:$/.test(a)?' style="text-align:center;"':""}function f(a,d){var f="";return a=a.trim(),b.tableHeaderId&&(f=' id="'+a.replace(/ /g,"_").toLowerCase()+'"'),a=e.subParser("spanGamut")(a,b,c),""+a+"\n"}function g(a,d){var f=e.subParser("spanGamut")(a,b,c);return""+f+"\n"}function h(a,b){for(var c="\n\n\n",d=a.length,e=0;d>e;++e)c+=a[e];for(c+="\n\n\n",e=0;e\n";for(var f=0;d>f;++f)c+=b[e][f];c+="\n"}return c+="\n
\n"}if(!b.tables)return a;var i=/^ {0,3}\|?.+\|.+\n[ \t]{0,3}\|?[ \t]*:?[ \t]*(?:-|=){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:-|=){2,}[\s\S]+?(?:\n\n|¨0)/gm;return a=c.converter._dispatch("tables.before",a,b,c),a=a.replace(i,function(a){var b,c=a.split("\n");for(b=0;b